Mercurial > mm7
comparison Engine/Graphics/Viewport.cpp @ 2496:5abd8fc8f1c6
for ITEM_ARTIFACT_LADYS_ESCORT
author | Ritor1 |
---|---|
date | Thu, 18 Sep 2014 17:38:54 +0600 |
parents | |
children | 68cdef6879a0 |
comparison
equal
deleted
inserted
replaced
2495:7b076fe64f23 | 2496:5abd8fc8f1c6 |
---|---|
1 #define _CRTDBG_MAP_ALLOC | |
2 #include <stdlib.h> | |
3 #include <crtdbg.h> | |
4 | |
5 #define _CRT_SECURE_NO_WARNINGS | |
6 #include "Viewport.h" | |
7 | |
8 | |
9 #include "Party.h" | |
10 #include "OurMath.h" | |
11 #include "Actor.h" | |
12 #include "Outdoor.h" | |
13 #include "Events.h" | |
14 #include "Mouse.h" | |
15 #include "SpriteObject.h" | |
16 #include "ObjectList.h" | |
17 #include "DecorationList.h" | |
18 #include "texts.h" | |
19 #include "Game.h" | |
20 #include "Vis.h" | |
21 #include "LOD.h" | |
22 #include "GUIWindow.h" | |
23 #include "TurnEngine.h" | |
24 #include "stru123.h" | |
25 #include "MM7.h" | |
26 #include "Engine/Graphics/Level/Decoration.h" | |
27 | |
28 | |
29 //----- (004C0262) -------------------------------------------------------- | |
30 void Viewport::SetScreen( signed int sTL_X, signed int sTL_Y, signed int sBR_X, signed int sBR_Y ) | |
31 { | |
32 unsigned int tl_x; // edx@1 | |
33 unsigned int br_x; // esi@1 | |
34 unsigned int tl_y; // edi@3 | |
35 unsigned int br_y; // eax@3 | |
36 | |
37 tl_x = sTL_X; | |
38 br_x = sBR_X; | |
39 if ( sTL_X > sBR_X ) | |
40 { | |
41 br_x = sTL_X; // swap x's | |
42 tl_x = sBR_X; | |
43 } | |
44 tl_y = sTL_Y; | |
45 br_y = sBR_Y; | |
46 if ( sTL_Y > sBR_Y ) | |
47 { | |
48 br_y = sTL_Y; // swap y's | |
49 tl_y = sBR_Y; | |
50 } | |
51 this->uScreen_TL_X = tl_x; | |
52 this->uScreen_TL_Y = tl_y; | |
53 this->uScreen_BR_X = br_x; | |
54 this->uScreen_BR_Y = br_y; | |
55 this->uScreenWidth = br_x - tl_x + 1; | |
56 this->uScreenHeight = br_y - tl_y + 1; | |
57 this->uScreenCenterX = (signed int)(br_x + tl_x) /2; | |
58 //if ( pRenderer->pRenderD3D == 0 ) | |
59 // this->uScreenCenterY = this->uScreen_BR_Y - fixpoint_mul(field_30, uScreenHeight); | |
60 //else | |
61 this->uScreenCenterY = (br_y + tl_y)/2; | |
62 SetViewport(this->uScreen_TL_X, this->uScreen_TL_Y, this->uScreen_BR_X, this->uScreen_BR_Y); | |
63 } | |
64 | |
65 //----- (004C02F8) -------------------------------------------------------- | |
66 void Viewport::SetFOV(int field_of_view) | |
67 { | |
68 this->field_of_view = field_of_view; | |
69 SetScreen(uScreen_TL_X, uScreen_TL_Y, uScreen_BR_X, uScreen_BR_Y); | |
70 } | |
71 | |
72 //----- (004C0312) -------------------------------------------------------- | |
73 void Viewport::SetViewport( signed int sTL_X, signed int sTL_Y, signed int sBR_X, signed int sBR_Y ) | |
74 { | |
75 signed int tl_x; // ebx@1 | |
76 signed int tl_y; // edi@3 | |
77 signed int br_x; // edx@5 | |
78 signed int br_y; // eax@7 | |
79 | |
80 tl_x = sTL_X; | |
81 if ( sTL_X < this->uScreen_TL_X ) | |
82 tl_x = this->uScreen_TL_X; | |
83 tl_y = sTL_Y; | |
84 if ( sTL_Y < this->uScreen_TL_Y ) | |
85 tl_y = this->uScreen_TL_Y; | |
86 br_x = sBR_X; | |
87 if ( sBR_X > this->uScreen_BR_X ) | |
88 br_x = this->uScreen_BR_X; | |
89 br_y = sBR_Y; | |
90 if ( sBR_Y > this->uScreen_BR_Y ) | |
91 br_y = this->uScreen_BR_Y; | |
92 this->uViewportTL_Y = tl_y; | |
93 this->uViewportTL_X = tl_x; | |
94 this->uViewportBR_X = br_x; | |
95 this->uViewportBR_Y = br_y; | |
96 } | |
97 | |
98 //----- (00443219) -------------------------------------------------------- | |
99 void ViewingParams::_443219() | |
100 { | |
101 this->sViewCenterY += 512; | |
102 | |
103 AdjustPosition(); | |
104 } | |
105 | |
106 //----- (00443225) -------------------------------------------------------- | |
107 void ViewingParams::_443225() | |
108 { | |
109 this->sViewCenterX -= 512; | |
110 | |
111 AdjustPosition(); | |
112 } | |
113 | |
114 //----- (00443231) -------------------------------------------------------- | |
115 void ViewingParams::_443231() | |
116 { | |
117 this->sViewCenterY -= 512; | |
118 | |
119 AdjustPosition(); | |
120 } | |
121 | |
122 //----- (0044323D) -------------------------------------------------------- | |
123 void ViewingParams::_44323D() | |
124 { | |
125 this->sViewCenterX += 512; | |
126 | |
127 AdjustPosition(); | |
128 } | |
129 | |
130 //----- (00443249) -------------------------------------------------------- | |
131 void ViewingParams::CenterOnParty() | |
132 { | |
133 this->uMapBookMapZoom = fixpoint_mul(0x8000, this->uMapBookMapZoom); | |
134 if (this->uMapBookMapZoom < 384) | |
135 this->uMapBookMapZoom = 384; | |
136 | |
137 this->sViewCenterX = pParty->vPosition.x; | |
138 this->sViewCenterY = pParty->vPosition.y; | |
139 | |
140 AdjustPosition(); | |
141 } | |
142 | |
143 //----- (00443291) -------------------------------------------------------- | |
144 void ViewingParams::CenterOnParty2() | |
145 { | |
146 int v2; // eax@1 | |
147 | |
148 if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) | |
149 v2 = 1536; | |
150 else if (uCurrentlyLoadedLevelType == LEVEL_Indoor) | |
151 v2 = 3072; | |
152 else assert(false); | |
153 | |
154 this->uMapBookMapZoom *= 2; | |
155 if (this->uMapBookMapZoom > v2 ) | |
156 this->uMapBookMapZoom = v2; | |
157 | |
158 this->sViewCenterX = pParty->vPosition.x; | |
159 this->sViewCenterY = pParty->vPosition.y; | |
160 AdjustPosition(); | |
161 } | |
162 | |
163 //----- (004432E7) -------------------------------------------------------- | |
164 void ViewingParams::AdjustPosition() | |
165 { | |
166 ViewingParams *v1; // esi@1 | |
167 int v2; // ebx@1 | |
168 signed int v3; // edx@1 | |
169 int v4; // ecx@1 | |
170 int v5; // edi@3 | |
171 int v6; // eax@3 | |
172 int v7; // eax@5 | |
173 | |
174 | |
175 v1 = this; | |
176 v2 = this->indoor_center_y; | |
177 v3 = 88 >> (this->uMapBookMapZoom / 384); | |
178 v4 = (44 - v3) << 9; | |
179 if ( v1->sViewCenterY > v2 + v4 ) | |
180 v1->sViewCenterY = v2 + v4; | |
181 | |
182 v5 = v1->indoor_center_x; | |
183 v6 = (v3 - 44) << 9; | |
184 if ( v1->sViewCenterX < v5 + v6 ) | |
185 v1->sViewCenterX = v5 + v6; | |
186 | |
187 v7 = v2 + v6; | |
188 if ( v1->sViewCenterY < v7 ) | |
189 v1->sViewCenterY = v7; | |
190 | |
191 if ( v1->sViewCenterX > v5 + v4 ) | |
192 v1->sViewCenterX = v5 + v4; | |
193 } | |
194 | |
195 //----- (00443343) -------------------------------------------------------- | |
196 void ViewingParams::InitGrayPalette() | |
197 { | |
198 for (unsigned short i=0; i<256; ++i) | |
199 pPalette[i]=Color16(i, i, i); | |
200 } | |
201 | |
202 //----- (00443365) -------------------------------------------------------- | |
203 void ViewingParams::_443365() | |
204 { | |
205 Vec3_short_ *v3; // eax@4 | |
206 Vec3_short_ *v6; // eax@12 | |
207 int minimum_y; // [sp+10h] [bp-10h]@2 | |
208 int maximum_y; // [sp+14h] [bp-Ch]@2 | |
209 int minimum_x; // [sp+18h] [bp-8h]@2 | |
210 int maximum_x; // [sp+1Ch] [bp-4h]@2 | |
211 | |
212 InitGrayPalette(); | |
213 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) | |
214 { | |
215 minimum_x = 0x40000000; | |
216 minimum_y = 0x40000000; | |
217 | |
218 maximum_x = -0x40000000; | |
219 maximum_y = -0x40000000; | |
220 for (int i=0; i<pIndoor->pMapOutlines->uNumOutlines; ++i) | |
221 { | |
222 v3 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace1ID]; | |
223 | |
224 if ( v3->x < minimum_x ) | |
225 minimum_x = v3->x; | |
226 if ( v3->x > maximum_x ) | |
227 maximum_x = v3->x; | |
228 if ( v3->y < minimum_y ) | |
229 minimum_y = v3->x; | |
230 if ( v3->y > maximum_y ) | |
231 maximum_y = v3->x; | |
232 | |
233 v6 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace2ID]; | |
234 | |
235 if ( v6->x < minimum_x ) | |
236 minimum_x = v3->x; | |
237 if ( v6->x > maximum_x ) | |
238 maximum_x = v3->x; | |
239 | |
240 if ( v6->y < minimum_y ) | |
241 minimum_y = v3->y; | |
242 if ( v6->y > maximum_y ) | |
243 maximum_y = v3->y; | |
244 } | |
245 | |
246 uMinimapZoom = 1024; | |
247 indoor_center_x = (signed int)(minimum_x + maximum_x) / 2; | |
248 field_28 = 10; | |
249 indoor_center_y = (signed int)(minimum_y + maximum_y) / 2; | |
250 } | |
251 else | |
252 { | |
253 indoor_center_x = 0; | |
254 indoor_center_y = 0; | |
255 uMinimapZoom = _576E2C_current_minimap_zoom; | |
256 field_28 = dword_576E28; | |
257 } | |
258 uMapBookMapZoom = 384; | |
259 } | |
260 //----- (0042213C) -------------------------------------------------------- | |
261 void OnGameViewportClick() | |
262 { | |
263 signed int v0; // ebx@2 | |
264 POINT *v1; // esi@3 | |
265 signed int v6; // eax@14 | |
266 char *v7; // esi@15 | |
267 int v9; // eax@19 | |
268 unsigned int pTextureID; // eax@19 | |
269 int pEventID; // ecx@21 | |
270 int v15; // ecx@29 | |
271 // signed int v16; // edx@30 | |
272 // int v18; // ebx@47 | |
273 // signed int v21; // eax@58 | |
274 SpriteObject a1; // [sp+Ch] [bp-80h]@1 | |
275 POINT a2; // [sp+84h] [bp-8h]@3 | |
276 | |
277 int clickable_distance = 512; | |
278 | |
279 v1 = pMouse->GetCursorPos(&a2); | |
280 //if ( pRenderer->pRenderD3D ) | |
281 v0 = pGame->pVisInstance->get_picked_object_zbuf_val(); | |
282 //else | |
283 // v0 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[v1->y]]; | |
284 | |
285 if ( PID_TYPE(v0) == OBJECT_Item) | |
286 { | |
287 int item_id = PID_ID(v0); | |
288 //v21 = (signed int)(unsigned __int16)v0 >> 3; | |
289 if ( !(pObjectList->pObjects[pSpriteObjects[item_id].uObjectDescID].uFlags & 0x10) && item_id < 1000 && pSpriteObjects[item_id].uObjectDescID | |
290 && (unsigned int)v0 < 0x2000000 ) | |
291 { | |
292 if ( pSpriteObjects[item_id].stru_24.GetItemEquipType() == 18 ) | |
293 { | |
294 pParty->PartyFindsGold(pSpriteObjects[item_id].stru_24.uSpecEnchantmentType, 0); | |
295 viewparams->bRedrawGameUI = 1; | |
296 } | |
297 else | |
298 { | |
299 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[pSpriteObjects[item_id].stru_24.uItemID].pUnidentifiedName);//You found an item (%s)! | |
300 ShowStatusBarString(pTmpBuf2.data(), 2); | |
301 if ( pSpriteObjects[item_id].stru_24.uItemID == ITEM_ARTIFACT_SPLITTER ) | |
302 _449B7E_toggle_bit(pParty->_quest_bits, 184, 1); | |
303 if ( pSpriteObjects[item_id].stru_24.uItemID == 455 ) | |
304 _449B7E_toggle_bit(pParty->_quest_bits, 185, 1); | |
305 if ( !pParty->AddItemToParty(&pSpriteObjects[item_id].stru_24) ) | |
306 pParty->SetHoldingItem(&pSpriteObjects[item_id].stru_24); | |
307 } | |
308 SpriteObject::OnInteraction(item_id); | |
309 return; | |
310 } | |
311 if ( !pParty->pPickedItem.uItemID ) | |
312 return; | |
313 __debugbreak();//no checker | |
314 v6 = 0; | |
315 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
316 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
317 LOWORD(v6) = 0; | |
318 else | |
319 { | |
320 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
321 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
322 { | |
323 ++v6; | |
324 v7 += 56; | |
325 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
326 { | |
327 LOWORD(v6) = 0; | |
328 break; | |
329 } | |
330 } | |
331 } | |
332 a1.uObjectDescID = v6; | |
333 a1.vPosition.y = pParty->vPosition.y; | |
334 a1.spell_caster_pid = OBJECT_Player; | |
335 a1.vPosition.x = pParty->vPosition.x; | |
336 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
337 a1.uSoundID = 0; | |
338 a1.uFacing = 0; | |
339 a1.uAttributes = 8; | |
340 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
341 a1.uSpriteFrameID = 0; | |
342 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
343 | |
344 extern int UnprojectX(int); | |
345 //v9 = UnprojectX(v1->x); | |
346 a1.Create(pParty->sRotationY + UnprojectX(v1->x), 184, 200, 0); | |
347 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
348 if (pTextureID != -1) | |
349 pIcons_LOD->pTextures[pTextureID].Release(); | |
350 pMouse->RemoveHoldingItem(); | |
351 pIcons_LOD->SyncLoadedFilesCount(); | |
352 return; | |
353 } | |
354 if ( PID_TYPE(v0) == OBJECT_Actor) | |
355 { | |
356 int mon_id = PID_ID(v0); | |
357 //a2.y = v16; | |
358 if ( pActors[mon_id].uAIState == Dead ) | |
359 { | |
360 if ( (unsigned int)v0 < 0x2000000 )//distance limit for loot monster | |
361 { | |
362 pActors[mon_id].LootActor(); | |
363 return; | |
364 } | |
365 if ( !pParty->pPickedItem.uItemID ) | |
366 return; | |
367 __debugbreak();//no checker | |
368 v6 = 0; | |
369 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
370 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
371 LOWORD(v6) = 0; | |
372 else | |
373 { | |
374 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
375 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
376 { | |
377 ++v6; | |
378 v7 += 56; | |
379 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
380 { | |
381 LOWORD(v6) = 0; | |
382 break; | |
383 } | |
384 } | |
385 } | |
386 a1.uObjectDescID = v6; | |
387 a1.vPosition.y = pParty->vPosition.y; | |
388 a1.spell_caster_pid = OBJECT_Player; | |
389 a1.vPosition.x = pParty->vPosition.x; | |
390 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
391 a1.uSoundID = 0; | |
392 a1.uFacing = 0; | |
393 a1.uAttributes = 8; | |
394 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
395 a1.uSpriteFrameID = 0; | |
396 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
397 | |
398 extern int UnprojectX(int); | |
399 //v9 = UnprojectX(v1->x); | |
400 a1.Create(pParty->sRotationY + UnprojectX(v1->x), 184, 200, 0); | |
401 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
402 if (pTextureID != -1) | |
403 pIcons_LOD->pTextures[pTextureID].Release(); | |
404 pMouse->RemoveHoldingItem(); | |
405 pIcons_LOD->SyncLoadedFilesCount(); | |
406 return; | |
407 } | |
408 if ( GetAsyncKeyState(VK_SHIFT) >= 0 ) | |
409 { | |
410 if ( !pActors[mon_id].GetActorsRelation(0) && pActors[mon_id].ActorFriend() ) | |
411 { | |
412 if ( HIWORD(v0) >= clickable_distance) | |
413 { | |
414 if ( !pParty->pPickedItem.uItemID ) | |
415 return; | |
416 __debugbreak();//no checker | |
417 v6 = 0; | |
418 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
419 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
420 LOWORD(v6) = 0; | |
421 else | |
422 { | |
423 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
424 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
425 { | |
426 ++v6; | |
427 v7 += 56; | |
428 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
429 { | |
430 LOWORD(v6) = 0; | |
431 break; | |
432 } | |
433 } | |
434 } | |
435 a1.uObjectDescID = v6; | |
436 a1.vPosition.y = pParty->vPosition.y; | |
437 a1.spell_caster_pid = OBJECT_Player; | |
438 a1.vPosition.x = pParty->vPosition.x; | |
439 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
440 a1.uSoundID = 0; | |
441 a1.uFacing = 0; | |
442 a1.uAttributes = 8; | |
443 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
444 a1.uSpriteFrameID = 0; | |
445 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
446 | |
447 extern int UnprojectX(int); | |
448 //v9 = UnprojectX(v1->x); | |
449 a1.Create(pParty->sRotationY + UnprojectX(v1->x), 184, 200, 0); | |
450 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
451 if (pTextureID != -1) | |
452 pIcons_LOD->pTextures[pTextureID].Release(); | |
453 pMouse->RemoveHoldingItem(); | |
454 pIcons_LOD->SyncLoadedFilesCount(); | |
455 return; | |
456 } | |
457 if ( !pActors[mon_id].CanAct() ) | |
458 return; | |
459 //v18 = mon_id; | |
460 Actor::AI_FaceObject(mon_id, 4, 0, 0); | |
461 if ( !pActors[mon_id].sNPC_ID ) | |
462 { | |
463 if ( pNPCStats->pGroups_copy[pActors[mon_id].uGroup] ) | |
464 { | |
465 if ( pNPCStats->pCatchPhrases[pNPCStats->pGroups_copy[pActors[mon_id].uGroup]] ) | |
466 { | |
467 pParty->uFlags |= 2; | |
468 strcpy(byte_5B0938.data(), pNPCStats->pCatchPhrases[pNPCStats->pGroups_copy[pActors[mon_id].uGroup]]); | |
469 sub_4451A8_press_any_key(0, 0, 0); | |
470 } | |
471 } | |
472 return; | |
473 } | |
474 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_StartNPCDialogue, mon_id, 0); | |
475 return; | |
476 } | |
477 if ( pParty->bTurnBasedModeOn == true && pTurnEngine->turn_stage == TE_MOVEMENT ) | |
478 { | |
479 pTurnEngine->field_18 |= TE_FLAG_8; | |
480 return; | |
481 } | |
482 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Attack, 0, 0); | |
483 } | |
484 else | |
485 { | |
486 if ( pParty->bTurnBasedModeOn == true && pTurnEngine->turn_stage == TE_MOVEMENT ) | |
487 { | |
488 pParty->uFlags |= PARTY_FLAGS_1_FALLING; | |
489 return; | |
490 } | |
491 if ( uActiveCharacter && sub_427769_isSpellQuickCastableOnShiftClick(pPlayers[uActiveCharacter]->uQuickSpell)) | |
492 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_CastQuickSpell, 0, 0); | |
493 } | |
494 return; | |
495 } | |
496 if ( PID_TYPE(v0) == OBJECT_Decoration) | |
497 { | |
498 if ( (signed int)(((unsigned int)v0 >> 16) - pDecorationList->pDecorations[pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3].uDecorationDescID].uRadius) >= clickable_distance ) | |
499 { | |
500 if ( !pParty->pPickedItem.uItemID ) | |
501 return; | |
502 __debugbreak();//no checker | |
503 v6 = 0; | |
504 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
505 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
506 LOWORD(v6) = 0; | |
507 else | |
508 { | |
509 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
510 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
511 { | |
512 ++v6; | |
513 v7 += 56; | |
514 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
515 { | |
516 LOWORD(v6) = 0; | |
517 break; | |
518 } | |
519 } | |
520 } | |
521 a1.uObjectDescID = v6; | |
522 a1.vPosition.y = pParty->vPosition.y; | |
523 a1.spell_caster_pid = OBJECT_Player; | |
524 a1.vPosition.x = pParty->vPosition.x; | |
525 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
526 a1.uSoundID = 0; | |
527 a1.uFacing = 0; | |
528 a1.uAttributes = 8; | |
529 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
530 a1.uSpriteFrameID = 0; | |
531 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
532 | |
533 extern int UnprojectX(int); | |
534 //v9 = UnprojectX(v1->x); | |
535 a1.Create(pParty->sRotationY + UnprojectX(v1->x), 184, 200, 0); | |
536 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
537 if (pTextureID != -1) | |
538 pIcons_LOD->pTextures[pTextureID].Release(); | |
539 pMouse->RemoveHoldingItem(); | |
540 pIcons_LOD->SyncLoadedFilesCount(); | |
541 return; | |
542 } | |
543 if ( !pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3].uEventID ) | |
544 { | |
545 if ( pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3].IsInteractive() ) | |
546 { | |
547 v15 = stru_5E4C90_MapPersistVars._decor_events[pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]._idx_in_stru123 - 75] + 380; | |
548 activeLevelDecoration = &pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]; | |
549 EventProcessor(v15, 0, 1); | |
550 activeLevelDecoration = nullptr; | |
551 } | |
552 return; | |
553 } | |
554 pEventID = pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3].uEventID; | |
555 EventProcessor(pEventID, (unsigned __int16)v0, 1); | |
556 return; | |
557 } | |
558 if ( PID_TYPE(v0) == OBJECT_BModel && HIWORD(v0) < clickable_distance) | |
559 { | |
560 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) | |
561 { | |
562 if ( !pIndoor->pFaces[PID_ID(v0)].Clickable() ) | |
563 { | |
564 if ( !pParty->pPickedItem.uItemID ) | |
565 { | |
566 ShowNothingHereStatus(); | |
567 if ( !pParty->pPickedItem.uItemID ) | |
568 return; | |
569 } | |
570 __debugbreak();//no checker | |
571 v6 = 0; | |
572 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
573 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
574 LOWORD(v6) = 0; | |
575 else | |
576 { | |
577 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
578 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
579 { | |
580 ++v6; | |
581 v7 += 56; | |
582 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
583 { | |
584 LOWORD(v6) = 0; | |
585 break; | |
586 } | |
587 } | |
588 } | |
589 a1.uObjectDescID = v6; | |
590 a1.vPosition.y = pParty->vPosition.y; | |
591 a1.spell_caster_pid = OBJECT_Player; | |
592 a1.vPosition.x = pParty->vPosition.x; | |
593 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
594 a1.uSoundID = 0; | |
595 a1.uFacing = 0; | |
596 a1.uAttributes = 8; | |
597 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
598 a1.uSpriteFrameID = 0; | |
599 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
600 | |
601 extern int UnprojectX(int); | |
602 v9 = UnprojectX(v1->x); | |
603 a1.Create(pParty->sRotationY + v9, 184, 200, 0); | |
604 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
605 if (pTextureID != -1) | |
606 pIcons_LOD->pTextures[pTextureID].Release(); | |
607 pMouse->RemoveHoldingItem(); | |
608 pIcons_LOD->SyncLoadedFilesCount(); | |
609 return; | |
610 } | |
611 pEventID = pIndoor->pFaceExtras[pIndoor->pFaces[PID_ID(v0)].uFaceExtraID].uEventID; | |
612 } | |
613 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) | |
614 { | |
615 if ( !pOutdoor->pBModels[(signed int)(v0 & 0xFFFF) >> 9].pFaces[PID_ID(v0) & 0x3F].Clickable()) | |
616 { | |
617 if ( !pParty->pPickedItem.uItemID ) | |
618 { | |
619 ShowNothingHereStatus(); | |
620 if ( !pParty->pPickedItem.uItemID ) | |
621 return; | |
622 } | |
623 __debugbreak();//no checker | |
624 v6 = 0; | |
625 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
626 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
627 LOWORD(v6) = 0; | |
628 else | |
629 { | |
630 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
631 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
632 { | |
633 ++v6; | |
634 v7 += 56; | |
635 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
636 { | |
637 LOWORD(v6) = 0; | |
638 break; | |
639 } | |
640 } | |
641 } | |
642 a1.uObjectDescID = v6; | |
643 a1.vPosition.y = pParty->vPosition.y; | |
644 a1.spell_caster_pid = OBJECT_Player; | |
645 a1.vPosition.x = pParty->vPosition.x; | |
646 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
647 a1.uSoundID = 0; | |
648 a1.uFacing = 0; | |
649 a1.uAttributes = 8; | |
650 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
651 a1.uSpriteFrameID = 0; | |
652 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
653 | |
654 extern int UnprojectX(int); | |
655 v9 = UnprojectX(v1->x); | |
656 a1.Create(pParty->sRotationY + v9, 184, 200, 0); | |
657 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
658 if (pTextureID != -1) | |
659 pIcons_LOD->pTextures[pTextureID].Release(); | |
660 pMouse->RemoveHoldingItem(); | |
661 pIcons_LOD->SyncLoadedFilesCount(); | |
662 return; | |
663 } | |
664 pEventID = pOutdoor->pBModels[(signed int)(v0 & 0xFFFF) >> 9].pFaces[PID_ID(v0) & 0x3F].sCogTriggeredID; | |
665 } | |
666 EventProcessor(pEventID, (unsigned __int16)v0, 1); | |
667 return; | |
668 } | |
669 if ( PID_TYPE(v0) != OBJECT_BModel || HIWORD(v0) >= clickable_distance ) | |
670 { | |
671 if ( !pParty->pPickedItem.uItemID ) | |
672 return; | |
673 //__debugbreak();//no checker | |
674 v6 = 0; | |
675 a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; | |
676 if ( (signed int)pObjectList->uNumObjects <= 0 ) | |
677 LOWORD(v6) = 0; | |
678 else | |
679 { | |
680 v7 = (char *)&pObjectList->pObjects->uObjectID; | |
681 while ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID != *(short *)v7 ) | |
682 { | |
683 ++v6; | |
684 v7 += 56; | |
685 if ( v6 >= (signed int)pObjectList->uNumObjects ) | |
686 { | |
687 LOWORD(v6) = 0; | |
688 break; | |
689 } | |
690 } | |
691 } | |
692 a1.uObjectDescID = v6; | |
693 a1.vPosition.y = pParty->vPosition.y; | |
694 a1.spell_caster_pid = OBJECT_Player; | |
695 a1.vPosition.x = pParty->vPosition.x; | |
696 a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.z; | |
697 a1.uSoundID = 0; | |
698 a1.uFacing = 0; | |
699 a1.uAttributes = 8; | |
700 a1.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); | |
701 a1.uSpriteFrameID = 0; | |
702 memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); | |
703 | |
704 extern int UnprojectX(int); | |
705 //v9 = UnprojectX(v1->x); | |
706 a1.Create(pParty->sRotationY + UnprojectX(v1->x), 184, 200, 0); | |
707 pTextureID = pIcons_LOD->LoadTexture(pParty->pPickedItem.GetIconName(), TEXTURE_16BIT_PALETTE); | |
708 if (pTextureID != -1) | |
709 pIcons_LOD->pTextures[pTextureID].Release(); | |
710 pMouse->RemoveHoldingItem(); | |
711 pIcons_LOD->SyncLoadedFilesCount(); | |
712 return; | |
713 } | |
714 } |