Mercurial > mm7
annotate UiGame.cpp @ 949:c0d0656aa662
Awards
author | Nomad |
---|---|
date | Wed, 01 May 2013 20:04:24 +0200 |
parents | 5a2dbb00c399 |
children | 9a5db2cf999a |
rev | line source |
---|---|
706 | 1 #include <assert.h> |
2 | |
3 #include "MM7.h" | |
4 | |
5 #include "MapInfo.h" | |
6 #include "Game.h" | |
7 #include "GUIWindow.h" | |
8 #include "GUIFont.h" | |
9 #include "GUIProgressBar.h" | |
10 #include "Party.h" | |
11 #include "AudioPlayer.h" | |
12 #include "Outdoor.h" | |
13 #include "IndoorCamera.h" | |
14 #include "Overlays.h" | |
15 #include "Monsters.h" | |
16 #include "Arcomage.h" | |
17 #include "LOD.h" | |
18 #include "Actor.h" | |
19 #include "Allocator.h" | |
20 #include "Events.h" | |
21 #include "Viewport.h" | |
22 #include "FrameTableInc.h" | |
23 #include "Math.h" | |
24 #include "SpriteObject.h" | |
25 #include "ObjectList.h" | |
26 #include "Chest.h" | |
27 #include "PaletteManager.h" | |
28 #include "DecorationList.h" | |
29 #include "PlayerFrameTable.h" | |
30 #include "SaveLoad.h" | |
31 #include "stru123.h" | |
32 #include "Time.h" | |
33 #include "IconFrameTable.h" | |
34 #include "Awards.h" | |
35 #include "Autonotes.h" | |
36 #include "stru160.h" | |
37 #include "TurnEngine.h" | |
924 | 38 #include "CastSpellInfo.h" |
706 | 39 #include "Weather.h" |
40 #include "stru298.h" | |
41 #include "StorylineTextTable.h" | |
42 #include "Events2D.h" | |
43 #include "texts.h" | |
747 | 44 #include "UIHouses.h" |
706 | 45 |
46 #include "mm7_data.h" | |
47 | |
48 | |
49 | |
50 | |
51 //----- (0041AD6E) -------------------------------------------------------- | |
52 void __cdecl GameUI_DrawRightPanelItems() | |
53 { | |
54 if (GameUI_RightPanel_BookFlashTimer > pParty->uTimePlayed) | |
55 GameUI_RightPanel_BookFlashTimer = 0; | |
56 | |
57 if (pParty->uTimePlayed - GameUI_RightPanel_BookFlashTimer > 128) | |
58 { | |
59 GameUI_RightPanel_BookFlashTimer = pParty->uTimePlayed; | |
60 byte_50697C = byte_50697C == 0; | |
61 if ( byte_50697C && pCurrentScreen != SCREEN_REST ) | |
62 { | |
63 if ( bFlashQuestBook ) | |
64 pRenderer->DrawTextureTransparent(493, 355, pIcons_LOD->GetTexture(uTextureID_ib_td1_A)); | |
65 if ( bFlashAutonotesBook ) | |
66 pRenderer->DrawTextureTransparent(527, 353, pIcons_LOD->GetTexture(uTextureID_ib_td2_A)); | |
67 if ( bFlashHistoryBook ) | |
68 pRenderer->DrawTextureTransparent(600, 361, pIcons_LOD->GetTexture(uTextureID_ib_td5_A)); | |
69 } | |
70 else | |
71 { | |
72 pRenderer->DrawTextureRGB(468u, 0, pTexture_RightFrame); | |
73 DrawHiredNPCs(); | |
74 } | |
75 } | |
76 } | |
77 | |
78 //----- (0041AEBB) -------------------------------------------------------- | |
79 void __cdecl GameUI_DrawFoodAndGold() | |
80 { | |
81 int v2; // esi@2 | |
82 | |
83 if ( uGameState != GAME_STATE_FINAL_WINDOW ) | |
84 { | |
85 v2 = sub_44100D() != 0 ? 381 : 322; | |
86 sprintf(pTmpBuf, "\r087%lu", pParty->uNumFoodRations); | |
87 pPrimaryWindow->DrawText(pFontSmallnum, 0, v2, uGameUIFontMain, pTmpBuf, 0, 0, uGameUIFontShadow); | |
88 sprintf(pTmpBuf, "\r028%lu", pParty->uNumGold); | |
89 pPrimaryWindow->DrawText(pFontSmallnum, 0, v2, uGameUIFontMain, pTmpBuf, 0, 0, uGameUIFontShadow); | |
90 } | |
91 } | |
92 | |
93 //----- (0041AF52) -------------------------------------------------------- | |
94 void Actor::DrawHealthBar(Actor *a1, GUIWindow *a2) | |
95 { | |
96 unsigned int v2; // eax@1 | |
97 GUIWindow *v3; // edi@1 | |
98 unsigned int v4; // esi@1 | |
99 signed int v5; // ebx@4 | |
100 double v6; // st7@5 | |
101 unsigned int v7; // eax@6 | |
102 unsigned int v8; // ebx@10 | |
103 unsigned int v9; // [sp+14h] [bp-Ch]@4 | |
104 unsigned int v10; // [sp+1Ch] [bp-4h]@4 | |
105 | |
106 v2 = a1->pMonsterInfo.uHP; | |
107 v3 = a2; | |
108 v4 = 25; | |
109 if ( (signed int)v2 > 25 ) | |
110 { | |
111 v4 = 200; | |
112 if ( (signed int)v2 < 200 ) | |
113 v4 = a1->pMonsterInfo.uHP; | |
114 } | |
115 v5 = a1->sCurrentHP; | |
116 v10 = v4; | |
117 v9 = uTextureID_mhp_grn; | |
118 if ( v5 < (signed int)v2 ) | |
119 { | |
120 v6 = (double)(signed int)v2; | |
121 v10 = (signed __int64)((double)(signed int)v4 / (double)(signed int)v2 * (double)a1->sCurrentHP); | |
122 if ( v5 <= (signed int)(signed __int64)(0.34 * v6) ) | |
123 { | |
124 v7 = uTextureID_mhp_red; | |
125 v9 = v7; | |
126 } | |
127 else if ( v5 <= (signed int)(signed __int64)(v6 * 0.67) ) | |
128 { | |
129 v7 = uTextureID_mhp_yel; | |
130 v9 = v7; | |
131 } | |
132 } | |
133 v8 = a2->uFrameX + (signed int)(a2->uFrameWidth - v4) / 2; | |
948 | 134 |
727 | 135 pRenderer->SetTextureClipRect(v8, a2->uFrameY + 32, v8 + v4, a2->uFrameY + 52); |
948 | 136 pRenderer->DrawTextureIndexed(v8, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_bd)); |
727 | 137 pRenderer->SetTextureClipRect(v8, v3->uFrameY + 32, v8 + v10, v3->uFrameY + 52); |
948 | 138 pRenderer->DrawTextureIndexed(v8, v3->uFrameY + 34, pIcons_LOD->GetTexture(v9)); |
727 | 139 |
948 | 140 pRenderer->ResetTextureClipRect(); |
141 pRenderer->DrawTextureIndexed(v8 - 5, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capl)); | |
142 pRenderer->DrawTextureIndexed(v8 + v4, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capr)); | |
706 | 143 } |
144 | |
145 //----- (0041B0C9) -------------------------------------------------------- | |
146 void __cdecl GameUI_DrawLifeManaBars() | |
147 { | |
148 Texture *v0; // ebx@1 | |
149 Player *v1; // ecx@2 | |
150 float v2; // ST38_4@3 | |
151 double v3; // st7@3 | |
152 signed __int64 v4; // qax@6 | |
153 Player *v5; // ecx@24 | |
154 float v6; // ST30_4@25 | |
155 double v7; // st7@25 | |
156 bool v8; // ST38_4@27 | |
157 Texture *v9; // [sp-4h] [bp-30h]@10 | |
158 Texture *v10; // [sp+Ch] [bp-20h]@1 | |
159 Player *v11; // [sp+10h] [bp-1Ch]@2 | |
160 int v12; // [sp+10h] [bp-1Ch]@24 | |
161 Texture *v13; // [sp+14h] [bp-18h]@1 | |
162 Texture *v14; // [sp+18h] [bp-14h]@1 | |
163 float v15; // [sp+1Ch] [bp-10h]@1 | |
164 signed int v16; // [sp+24h] [bp-8h]@1 | |
165 signed int v17; // [sp+28h] [bp-4h]@8 | |
166 | |
948 | 167 v0 = pIcons_LOD->GetTexture(uTextureID_BarGreen); |
168 v14 = pIcons_LOD->GetTexture(uTextureID_BarYellow); | |
169 v13 = pIcons_LOD->GetTexture(uTextureID_BarRed); | |
706 | 170 v16 = 0; |
948 | 171 v10 = pIcons_LOD->GetTexture(uTextureID_BarBlue); |
172 v15 = v0->uTextureHeight; | |
706 | 173 do |
174 { | |
175 v1 = &pParty->pPlayers[v16]; | |
176 v11 = v1; | |
177 if ( v1->sHealth > 0 ) | |
178 { | |
179 v11 = &pParty->pPlayers[v16]; | |
180 v2 = (double)v1->sHealth; | |
181 v3 = v2 / (double)v1->GetMaxHealth(); | |
182 if( v3 > 0.5 ) | |
183 { | |
184 if ( v3 > 1.0 ) | |
185 v3 = 1.0; | |
186 v4 = (signed __int64)((1.0 - v3) * v15); | |
187 if ( v16 == 2 || v16 == 3 ) | |
188 v17 = 2; | |
189 else | |
190 v17 = 0; | |
727 | 191 pRenderer->SetTextureClipRect( |
706 | 192 v17 + pHealthBarPos[v16], |
193 v4 + 402, | |
194 v17 + pHealthBarPos[v16] + v0->uTextureWidth, | |
195 v0->uTextureHeight + 402); | |
196 v9 = v0; | |
197 } | |
198 else if ( v3 > 0.25 ) | |
199 { | |
200 if ( v16 == 2 || v16 == 3 ) | |
201 v17 = 2; | |
202 else | |
203 v17 = 0; | |
727 | 204 pRenderer->SetTextureClipRect( |
706 | 205 v17 + pHealthBarPos[v16], |
206 (unsigned __int64)(signed __int64)((1.0 - v3) * v15) + 402, | |
207 v17 + pHealthBarPos[v16] + v14->uTextureWidth, | |
208 v14->uTextureHeight + 402); | |
209 v9 = v14; | |
210 } | |
211 else if ( v3 > 0.0 ) | |
212 { | |
213 if ( v16 == 2 || v16 == 3 ) | |
214 v17 = 2; | |
215 else | |
216 v17 = 0; | |
727 | 217 pRenderer->SetTextureClipRect( |
706 | 218 v17 + pHealthBarPos[v16], |
219 (unsigned __int64)(signed __int64)((1.0 - v3) * v15) + 402, | |
220 v17 + pHealthBarPos[v16] + v13->uTextureWidth, | |
221 v13->uTextureHeight + 402); | |
222 v9 = v13; | |
223 } | |
224 if( v3 > 0.0 ) | |
225 { | |
226 pRenderer->DrawTextureIndexed(v17 + pHealthBarPos[v16], 0x192u, v9); | |
727 | 227 pRenderer->ResetTextureClipRect(); |
706 | 228 } |
229 } | |
230 v5 = v11; | |
231 v12 = v11->sMana; | |
232 if ( v12 > 0 ) | |
233 { | |
234 v6 = (double)v12; | |
235 v7 = v6 / (double)v5->GetMaxMana(); | |
236 if ( v7 > 1.0 ) | |
237 v7 = 1.0; | |
238 v8 = v16 == 2; | |
727 | 239 pRenderer->SetTextureClipRect( |
706 | 240 (v16 == 2) + pManaBarPos[v16], |
241 (unsigned __int64)(signed __int64)((1.0 - v7) * v15) + 402, | |
242 v8 + pManaBarPos[v16] + v10->uTextureWidth, | |
243 v10->uTextureHeight + 402); | |
244 pRenderer->DrawTextureIndexed(v8 + pManaBarPos[v16], 0x192u, v10); | |
727 | 245 pRenderer->ResetTextureClipRect(); |
706 | 246 } |
247 ++v16; | |
248 } | |
249 while ( v16 < 4 ); | |
250 } | |
251 | |
252 //----- (0041B3B6) -------------------------------------------------------- | |
253 void __cdecl draw_right_panel() | |
254 { | |
948 | 255 pRenderer->DrawTextureTransparent(pViewport->uViewportBR_X, 0, pIcons_LOD->GetTexture(uTextureID_right_panel)); |
706 | 256 } |
257 | |
258 //----- (0041B3E2) -------------------------------------------------------- | |
259 void __cdecl GameUI_DrawRightPanelFrames() | |
260 { | |
261 pRenderer->DrawTextureRGB(0, 0, pTexture_TopFrame); | |
262 pRenderer->DrawTextureRGB(0, 8u, pTexture_LeftFrame); | |
263 pRenderer->DrawTextureRGB(468u, 0, pTexture_RightFrame); | |
264 pRenderer->DrawTextureRGB(0, 352u, pTexture_BottomFrame); | |
265 GameUI_DrawFoodAndGold(); | |
266 GameUI_DrawRightPanelItems(); | |
267 } | |
268 | |
269 //----- (0041B438) -------------------------------------------------------- | |
270 GUIButton *__fastcall GUI_HandleHotkey(unsigned __int8 uHotkey) | |
271 { | |
272 char v1; // al@1 | |
273 int v2; // esi@1 | |
274 char v3; // dl@1 | |
275 GUIWindow *v4; // ecx@2 | |
276 GUIButton *result; // eax@2 | |
832 | 277 //int v6; // edx@12 |
706 | 278 |
279 v1 = toupper(uHotkey); | |
280 v2 = uNumVisibleWindows; | |
281 v3 = v1; | |
282 if ( uNumVisibleWindows >= 0 ) | |
283 { | |
284 while ( 2 ) | |
285 { | |
286 v4 = &pWindowList[pVisibleWindowsIdxs[v2] - 1]; | |
287 for ( result = v4->pControlsHead; result; result = result->pNext ) | |
288 { | |
289 if ( result->uHotkey == v3 ) | |
290 { | |
832 | 291 pMessageQueue_50CBD0->AddMessage(result->msg, result->msg_param, 0); |
706 | 292 /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) |
293 { | |
294 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)result->uControlID; | |
295 pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6; | |
296 *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; | |
297 ++pMessageQueue_50CBD0->uNumMessages; | |
298 }*/ | |
299 return result; | |
300 } | |
301 } | |
302 if ( v4->uFrameX || v4->uFrameY || !(v4->uFrameWidth == 640 & v4->uFrameHeight == 480) ) | |
303 { | |
304 --v2; | |
305 if ( v2 >= 0 ) | |
306 continue; | |
307 } | |
308 break; | |
309 } | |
310 } | |
311 return 0; | |
312 } | |
313 // 5075E0: using guessed type int pVisibleWindowsIdxs[20]; | |
314 | |
315 //----- (0041B4E1) -------------------------------------------------------- | |
316 int __fastcall GUI_ReplaceHotkey(unsigned __int8 uOldHotkey, unsigned __int8 uNewHotkey, char bFirstCall) | |
317 { | |
318 unsigned __int8 v3; // bl@1 | |
319 int result; // eax@1 | |
320 int i; // edx@2 | |
321 GUIButton *j; // ecx@3 | |
322 int k; // edx@7 | |
323 GUIButton *l; // ecx@8 | |
324 unsigned __int8 v9; // [sp+4h] [bp-8h]@1 | |
325 char v10; // [sp+8h] [bp-4h]@1 | |
326 | |
327 v3 = uNewHotkey; | |
328 v10 = toupper(uOldHotkey); | |
329 result = toupper(v3); | |
330 v9 = result; | |
331 if ( bFirstCall ) | |
332 { | |
333 for ( i = uNumVisibleWindows; i >= 0; --i ) | |
334 { | |
335 result = 84 * pVisibleWindowsIdxs[i]; | |
336 //for ( j = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); j; j = j->pNext ) | |
337 for ( j = pWindowList[pVisibleWindowsIdxs[i] - 1].pControlsHead; j; j = j->pNext ) | |
338 j->field_28 = 0; | |
339 } | |
340 } | |
341 for ( k = uNumVisibleWindows; k >= 0; --k ) | |
342 { | |
343 result = 84 * pVisibleWindowsIdxs[k]; | |
344 //for ( l = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); l; l = l->pNext ) | |
345 for ( l = pWindowList[pVisibleWindowsIdxs[k] - 1].pControlsHead; l; l = l->pNext ) | |
346 { | |
347 LOBYTE(result) = v10; | |
348 if ( l->uHotkey == v10 ) | |
349 { | |
350 if ( !l->field_28 ) | |
351 { | |
352 LOBYTE(result) = v9; | |
353 l->field_28 = 1; | |
354 l->uHotkey = v9; | |
355 } | |
356 } | |
357 } | |
358 } | |
359 return result; | |
360 } | |
361 | |
362 | |
363 | |
364 //----- (0041C047) -------------------------------------------------------- | |
783 | 365 void __cdecl GameUI_Footer_2() |
706 | 366 { |
367 unsigned int v0; // eax@1 | |
368 char *v1; // edx@2 | |
369 unsigned int v2; // ST18_4@5 | |
370 const char *v3; // ST0C_4@5 | |
371 unsigned int v4; // ST08_4@5 | |
372 int v5; // eax@5 | |
373 | |
374 pRenderer->DrawTextureRGB(0, 352u, pTexture_StatusBar); | |
783 | 375 if ( GameUI_Footer_TimeLeft ) |
706 | 376 { |
783 | 377 v1 = GameUI_Footer_TimedString; |
706 | 378 } |
379 else | |
380 { | |
783 | 381 if ( !pFooterString[0] ) |
706 | 382 return; |
783 | 383 v1 = pFooterString; |
706 | 384 } |
385 LOWORD(v0) = uGameUIFontShadow; | |
386 v2 = v0; | |
387 LOWORD(v0) = uGameUIFontMain; | |
388 v3 = v1; | |
389 v4 = v0; | |
390 v5 = pFontLucida->AlignText_Center(0x1C2u, v1); | |
391 pPrimaryWindow->DrawText(pFontLucida, v5 + 11, 357, v4, v3, 0, 0, v2); | |
392 } | |
393 | |
394 //----- (0041C0B8) -------------------------------------------------------- | |
395 void __thiscall sub_41C0B8_set_status_string(const char *pStr) | |
396 { | |
397 const char *v1; // esi@1 | |
398 int i; // eax@7 | |
399 int j; // eax@11 | |
400 | |
401 v1 = pStr; | |
783 | 402 if ( pStr && strcmp(pStr, "test") && !IsBadStringPtrA(v1, 1u) && (*v1 || GameUI_Footer_TimeLeft) ) |
706 | 403 { |
783 | 404 if ( GameUI_Footer_TimeLeft ) |
706 | 405 { |
783 | 406 for ( i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString); |
706 | 407 i > 450; |
783 | 408 i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString) ) |
409 byte_5C3427[strlen(GameUI_Footer_TimedString)] = 0; | |
706 | 410 } |
411 else | |
412 { | |
783 | 413 strcpy(pFooterString, v1); |
414 for ( j = pFontLucida->GetLineWidth(pFooterString); | |
706 | 415 j > 450; |
783 | 416 j = pFontLucida->GetLineWidth(pFooterString) ) |
417 GameUI_Footer_TimedString[strlen(pFooterString) + 199] = 0; | |
706 | 418 } |
419 } | |
420 } | |
421 | |
422 //----- (0041C179) -------------------------------------------------------- | |
783 | 423 void GameUI_Footer() |
424 { | |
706 | 425 unsigned int v0; // ebp@1 |
426 char *v1; // edi@5 | |
427 int v2; // eax@5 | |
428 unsigned int v3; // esi@5 | |
429 size_t v4; // eax@6 | |
430 GUIFont *v5; // ecx@6 | |
431 int v6; // eax@9 | |
432 size_t v7; // eax@10 | |
433 GUIFont *v8; // ecx@10 | |
434 char v9; // zf@12 | |
435 unsigned int v10; // ST08_4@13 | |
436 int v11; // eax@13 | |
437 | |
438 v0 = uGameUIFontShadow; | |
783 | 439 if ( pFooterString[0] || GameUI_Footer_TimeLeft || bForceDrawFooter ) |
706 | 440 { |
441 pRenderer->DrawTextureRGB(0, 352u, pTexture_StatusBar); | |
783 | 442 if ( GameUI_Footer_TimeLeft ) |
706 | 443 { |
783 | 444 v1 = GameUI_Footer_TimedString; |
445 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString); | |
706 | 446 v3 = 450; |
447 while ( v2 > 450 ) | |
448 { | |
783 | 449 v4 = strlen(GameUI_Footer_TimedString); |
706 | 450 v5 = pFontLucida; |
451 byte_5C3427[v4] = 0; | |
783 | 452 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString); |
706 | 453 } |
454 } | |
455 else | |
456 { | |
783 | 457 v1 = pFooterString; |
458 v6 = pFontLucida->GetLineWidth(pFooterString); | |
706 | 459 v3 = 450; |
460 while ( v6 > 450 ) | |
461 { | |
783 | 462 v7 = strlen(pFooterString); |
706 | 463 v8 = pFontLucida; |
783 | 464 GameUI_Footer_TimedString[v7 + 199] = 0; |
465 v6 = pFontLucida->GetLineWidth(pFooterString); | |
706 | 466 } |
467 } | |
468 v9 = *v1 == 0; | |
783 | 469 bForceDrawFooter = 0; |
706 | 470 if ( !v9 ) |
471 { | |
472 v10 = uGameUIFontMain; | |
473 v11 = pFontLucida->AlignText_Center(v3, v1); | |
474 pPrimaryWindow->DrawText(pFontLucida, v11 + 11, 357, v10, v1, 0, 0, v0); | |
475 } | |
476 } | |
477 } | |
783 | 478 // 5C35BC: using guessed type int bForceDrawFooter; |
706 | 479 |
480 | |
481 //----- (00420EFF) -------------------------------------------------------- | |
482 void __cdecl GameUI_WritePointedObjectStatusString() | |
483 { | |
484 int v1; // ebx@6 | |
485 GUIWindow *pWindow; // edi@7 | |
486 GUIButton *pButton; // ecx@11 | |
487 Player *pPlayer; // eax@19 | |
488 char v5; // cl@19 | |
489 unsigned int v6; // eax@19 | |
490 int v7; // ecx@19 | |
491 __int16 v8; // fps@23 | |
492 unsigned __int8 v9; // c0@23 | |
493 unsigned __int8 v10; // c3@23 | |
494 enum UIMessageType pMessageType1; // esi@24 | |
832 | 495 //int v12; // edx@25 |
706 | 496 char *v13; // ecx@28 |
497 int v14; // eax@41 | |
498 ItemGen *pItemGen; // ecx@44 | |
499 int v16; // ecx@46 | |
500 const char *v17; // eax@49 | |
501 signed int v18; // eax@55 | |
867 | 502 signed int v18b; |
706 | 503 signed int v19; // ecx@63 |
504 BLVFace *pFace; // eax@69 | |
505 __int16 v21; // ax@70 | |
506 const char *v22; // eax@72 | |
507 LevelDecoration *v23; // ecx@75 | |
508 LevelDecoration *v24; // esi@75 | |
509 __int16 v25; // ax@75 | |
510 const char *v26; // ecx@79 | |
511 Actor *pActor; // ecx@82 | |
512 char *v28; // esi@82 | |
513 int v29; // eax@82 | |
514 signed int v30; // ecx@88 | |
515 const char *v31; // eax@91 | |
516 __int16 v32; // fps@109 | |
517 //unsigned __int8 v33; // c0@109 | |
518 //unsigned __int8 v34; // c3@109 | |
519 enum UIMessageType pMessageType2; // esi@110 | |
832 | 520 //int v36; // edx@111 |
706 | 521 enum UIMessageType pMessageType3; // edx@117 |
832 | 522 //int v38; // ecx@118 |
706 | 523 const char *v39; // [sp-8h] [bp-E8h]@20 |
524 char *v40; // [sp-8h] [bp-E8h]@83 | |
525 int v41; // [sp-4h] [bp-E4h]@20 | |
526 char Str1[200]; // [sp+Ch] [bp-D4h]@129 | |
527 unsigned int pX; // [sp+D4h] [bp-Ch]@1 | |
528 unsigned int pY; // [sp+D8h] [bp-8h]@1 | |
529 unsigned int v45; // [sp+DCh] [bp-4h]@21 | |
530 | |
531 v13 = nullptr; | |
532 | |
533 pMouse->uPointingObjectID = 0; | |
534 pMouse->GetClickPos(&pX, &pY); | |
535 if ( pX < 0 || (signed int)pX > 639 || pY < 0 || (signed int)pY > 479 )//( (pX & 0x80000000u) != 0 || (signed int)pX > 639 || (pY & 0x80000000u) != 0 || (signed int)pY > 479 ) | |
536 return; | |
537 if (pCurrentScreen == SCREEN_GAME) | |
538 { | |
539 if ( (signed int)pX > 467 || (signed int)pY > 351 ) | |
540 goto _click_on_game_ui; | |
871 | 541 if ( pRenderer->pRenderD3D ) // inlined mm8::4C1E01 |
706 | 542 { |
543 v18 = pGame->pVisInstance->get_picked_object_zbuf_val(); | |
544 if ( (signed int)pX < (signed int)pViewport->uScreen_TL_X | |
545 || (signed int)pX > (signed int)pViewport->uScreen_BR_X | |
546 || (signed int)pY < (signed int)pViewport->uScreen_TL_Y | |
547 || (signed int)pY > (signed int)pViewport->uScreen_BR_Y ) | |
548 v18 = -1; | |
549 if ( v18 == -1 ) | |
550 //goto LABEL_61; | |
551 { | |
552 pMouse->uPointingObjectID = 0; | |
553 if ( pMouse->uPointingObjectID == 0 ) | |
554 { | |
555 if ( uLastPointedObjectID != 0 ) | |
556 { | |
783 | 557 pFooterString[0] = 0; |
558 bForceDrawFooter = 1; | |
706 | 559 } |
560 } | |
561 uLastPointedObjectID = pMouse->uPointingObjectID; | |
562 return; | |
563 } | |
564 } | |
565 else | |
566 { | |
567 v18 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; | |
568 } | |
569 pMouse->uPointingObjectID = (unsigned __int16)v18; | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
570 v19 = (signed)PID_ID(v18); |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
571 if (PID_TYPE(v18) == OBJECT_Item) |
706 | 572 { |
573 v30 = v19; | |
574 if ( pObjectList->pObjects[pSpriteObjects[v30].uObjectDescID].uFlags & 0x10 ) | |
575 //goto LABEL_73; | |
576 { | |
577 pMouse->uPointingObjectID = 0; | |
578 //goto LABEL_50; | |
579 uLastPointedObjectID = 1; | |
580 if ( pMouse->uPointingObjectID == 0 ) | |
581 { | |
582 if ( uLastPointedObjectID != 0 ) | |
583 { | |
783 | 584 pFooterString[0] = 0; |
585 bForceDrawFooter = 1; | |
706 | 586 } |
587 } | |
588 uLastPointedObjectID = pMouse->uPointingObjectID; | |
589 return; | |
590 } | |
591 if ( v18 >= (signed int)0x2000000u || pParty->pPickedItem.uItemID ) | |
592 { | |
593 v22 = pSpriteObjects[v30].stru_24.GetDisplayName(); | |
594 //LABEL_93: | |
595 v26 = v22; | |
596 //goto LABEL_87; | |
597 sub_41C0B8_set_status_string(v26); | |
598 if ( pMouse->uPointingObjectID == 0 ) | |
599 { | |
600 if ( uLastPointedObjectID != 0 ) | |
601 { | |
783 | 602 pFooterString[0] = 0; |
603 bForceDrawFooter = 1; | |
706 | 604 } |
605 } | |
606 uLastPointedObjectID = pMouse->uPointingObjectID; | |
607 return; | |
608 } | |
609 v31 = pSpriteObjects[v30].stru_24.GetDisplayName(); | |
610 v28 = pTmpBuf; | |
809 | 611 sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[470], v31);// "Get %s" |
706 | 612 } |
613 else | |
614 { | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
615 if (PID_TYPE(v18) != OBJECT_Actor) |
706 | 616 { |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
617 if (PID_TYPE(v18) == OBJECT_Decoration) |
706 | 618 { |
619 v23 = &pLevelDecorations[v19]; | |
620 v24 = v23; | |
621 v25 = v23->field_16_event_id; | |
622 if ( !v25 ) | |
623 { | |
624 if ( v23->IsInteractive() ) | |
625 v26 = pNPCTopics[stru_5E4C90._decor_events[v24->_idx_in_stru123 - 75] + 379].pTopic; | |
626 else | |
627 v26 = pDecorationList->pDecorations[v24->uDecorationDescID].field_20; | |
628 //goto LABEL_87; | |
629 sub_41C0B8_set_status_string(v26); | |
630 if ( pMouse->uPointingObjectID == 0 ) | |
631 { | |
632 if ( uLastPointedObjectID != 0 ) | |
633 { | |
783 | 634 pFooterString[0] = 0; |
635 bForceDrawFooter = 1; | |
706 | 636 } |
637 } | |
638 uLastPointedObjectID = pMouse->uPointingObjectID; | |
639 return; | |
640 } | |
641 v22 = GetEventHintString(v25); | |
642 if ( !v22 ) | |
643 //goto _return; | |
644 { | |
645 if ( pMouse->uPointingObjectID == 0 ) | |
646 { | |
647 if ( uLastPointedObjectID != 0 ) | |
648 { | |
783 | 649 pFooterString[0] = 0; |
650 bForceDrawFooter = 1; | |
706 | 651 } |
652 } | |
653 uLastPointedObjectID = pMouse->uPointingObjectID; | |
654 return; | |
655 } | |
656 //goto LABEL_93; | |
657 v26 = v22; | |
658 //goto LABEL_87; | |
659 sub_41C0B8_set_status_string(v26); | |
660 if ( pMouse->uPointingObjectID == 0 ) | |
661 { | |
662 if ( uLastPointedObjectID != 0 ) | |
663 { | |
783 | 664 pFooterString[0] = 0; |
665 bForceDrawFooter = 1; | |
706 | 666 } |
667 } | |
668 uLastPointedObjectID = pMouse->uPointingObjectID; | |
669 return; | |
670 } | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
671 if (PID_TYPE(v18) == OBJECT_BModel) |
706 | 672 { |
673 if ( v18 < (signed int)0x2000000u ) | |
674 { | |
675 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) | |
676 { | |
867 | 677 v18b = (signed int)(unsigned __int16)v18 >> 9; |
678 v21 = pOutdoor->pBModels[v18b].pFaces[v19 & 0x3F].sCogTriggeredID; | |
706 | 679 //goto LABEL_71; |
680 if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) | |
681 //goto LABEL_73; | |
682 { | |
683 pMouse->uPointingObjectID = 0; | |
684 //goto LABEL_50; | |
685 uLastPointedObjectID = 1; | |
686 if ( pMouse->uPointingObjectID == 0 ) | |
687 { | |
688 if ( uLastPointedObjectID != 0 ) | |
689 { | |
783 | 690 pFooterString[0] = 0; |
691 bForceDrawFooter = 1; | |
706 | 692 } |
693 } | |
694 uLastPointedObjectID = pMouse->uPointingObjectID; | |
695 return; | |
696 } | |
697 //goto LABEL_93; | |
698 v26 = v22; | |
699 //goto LABEL_87; | |
700 sub_41C0B8_set_status_string(v26); | |
701 if ( pMouse->uPointingObjectID == 0 ) | |
702 { | |
703 if ( uLastPointedObjectID != 0 ) | |
704 { | |
783 | 705 pFooterString[0] = 0; |
706 bForceDrawFooter = 1; | |
706 | 707 } |
708 } | |
709 uLastPointedObjectID = pMouse->uPointingObjectID; | |
710 return; | |
711 } | |
712 pFace = &pIndoor->pFaces[v19]; | |
713 if ( BYTE3(pFace->uAttributes) & 6 ) | |
714 { | |
715 v21 = pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID; | |
716 //LABEL_71: | |
717 if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) | |
718 //goto LABEL_73; | |
719 { | |
720 pMouse->uPointingObjectID = 0; | |
721 //goto LABEL_50; | |
722 uLastPointedObjectID = 1; | |
723 if ( pMouse->uPointingObjectID == 0 ) | |
724 { | |
725 if ( uLastPointedObjectID != 0 ) | |
726 { | |
783 | 727 pFooterString[0] = 0; |
728 bForceDrawFooter = 1; | |
706 | 729 } |
730 } | |
731 uLastPointedObjectID = pMouse->uPointingObjectID; | |
732 return; | |
733 } | |
734 //goto LABEL_93; | |
735 v26 = v22; | |
736 //goto LABEL_87; | |
737 sub_41C0B8_set_status_string(v26); | |
738 if ( pMouse->uPointingObjectID == 0 ) | |
739 { | |
740 if ( uLastPointedObjectID != 0 ) | |
741 { | |
783 | 742 pFooterString[0] = 0; |
743 bForceDrawFooter = 1; | |
706 | 744 } |
745 } | |
746 uLastPointedObjectID = pMouse->uPointingObjectID; | |
747 return; | |
748 } | |
749 } | |
750 //LABEL_73: | |
751 pMouse->uPointingObjectID = 0; | |
752 //goto LABEL_50; | |
753 uLastPointedObjectID = 1; | |
754 if ( pMouse->uPointingObjectID == 0 ) | |
755 { | |
756 if ( uLastPointedObjectID != 0 ) | |
757 { | |
783 | 758 pFooterString[0] = 0; |
759 bForceDrawFooter = 1; | |
706 | 760 } |
761 } | |
762 uLastPointedObjectID = pMouse->uPointingObjectID; | |
763 return; | |
764 } | |
765 //LABEL_61: | |
766 pMouse->uPointingObjectID = 0; | |
767 //goto _return; | |
768 if ( pMouse->uPointingObjectID == 0 ) | |
769 { | |
770 if ( uLastPointedObjectID != 0 ) | |
771 { | |
783 | 772 pFooterString[0] = 0; |
773 bForceDrawFooter = 1; | |
706 | 774 } |
775 } | |
776 uLastPointedObjectID = pMouse->uPointingObjectID; | |
777 return; | |
778 } | |
779 if ( v18 >= 335544320 ) | |
780 //goto LABEL_61; | |
781 { | |
782 pMouse->uPointingObjectID = 0; | |
783 if ( pMouse->uPointingObjectID == 0 ) | |
784 { | |
785 if ( uLastPointedObjectID != 0 ) | |
786 { | |
783 | 787 pFooterString[0] = 0; |
788 bForceDrawFooter = 1; | |
706 | 789 } |
790 } | |
791 uLastPointedObjectID = pMouse->uPointingObjectID; | |
792 return; | |
793 } | |
794 pActor = &pActors[v19]; | |
795 v28 = pTmpBuf; | |
796 v29 = pActor->dword_000334_unique_name; | |
797 if ( v29 ) | |
798 v40 = pMonsterStats->pPlaceStrings[v29]; | |
799 else | |
800 v40 = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].pName; | |
801 strncpy(pTmpBuf, v40, 0x7D0u); | |
802 } | |
803 v26 = v28; | |
804 //LABEL_87: | |
805 sub_41C0B8_set_status_string(v26); | |
806 //goto _return; | |
807 if ( pMouse->uPointingObjectID == 0 ) | |
808 { | |
809 if ( uLastPointedObjectID != 0 ) | |
810 { | |
783 | 811 pFooterString[0] = 0; |
812 bForceDrawFooter = 1; | |
706 | 813 } |
814 } | |
815 uLastPointedObjectID = pMouse->uPointingObjectID; | |
816 return; | |
817 } | |
818 v1 = uNumVisibleWindows; | |
819 if ( uNumVisibleWindows > 0 ) | |
820 { | |
821 while ( 1 ) // some other fullscreen ui | |
822 { | |
823 pWindow = &pWindowList[pVisibleWindowsIdxs[v1] - 1]; | |
824 if ( (signed int)pX >= (signed int)pWindow->uFrameX | |
825 && (signed int)pX <= (signed int)pWindow->uFrameZ | |
826 && (signed int)pY >= (signed int)pWindow->uFrameY | |
827 && (signed int)pY <= (signed int)pWindow->uFrameW ) | |
828 { | |
829 for ( pButton = pWindow->pControlsHead; ; pButton = pButton->pNext ) | |
830 { | |
831 if ( !pButton ) | |
832 break; | |
833 if ( pButton->uButtonType == 1 ) | |
834 { | |
835 if ( (signed int)pX >= (signed int)pButton->uX | |
836 && (signed int)pX <= (signed int)pButton->uZ | |
837 && (signed int)pY >= (signed int)pButton->uY | |
838 && (signed int)pY <= (signed int)pButton->uW ) | |
839 { | |
840 //LABEL_24: | |
841 pMessageType1 = (UIMessageType)pButton->field_1C; | |
842 if ( pMessageType1 ) | |
843 { | |
832 | 844 pMessageQueue_50CBD0->AddMessage(pMessageType1, pButton->msg_param, 0); |
706 | 845 } |
846 //LABEL_28: | |
847 v13 = pButton->pButtonName; | |
848 //_set_status_and_ret: | |
849 sub_41C0B8_set_status_string(v13); | |
850 //LABEL_131: | |
851 uLastPointedObjectID = 1; | |
852 return; | |
853 } | |
854 } | |
855 else | |
856 { | |
857 if ( pButton->uButtonType == 2 ) | |
858 { | |
859 v45 = pX - pButton->uX; | |
860 v45 = pY - pButton->uY; | |
861 if ( (double)(signed int)pButton->uWidth != 0.0 ) | |
862 { | |
863 if ( (double)(signed int)pButton->uHeight != 0.0 ) | |
864 { | |
865 pMessageType1 = (UIMessageType)pButton->field_1C; | |
866 if ( pMessageType1 ) | |
867 { | |
832 | 868 pMessageQueue_50CBD0->AddMessage(pMessageType1, pButton->msg_param, 0); |
706 | 869 } |
870 v13 = pButton->pButtonName; | |
871 sub_41C0B8_set_status_string(v13); | |
872 uLastPointedObjectID = 1; | |
873 return; | |
874 //} | |
875 } | |
876 } | |
877 } | |
878 else // click on skill | |
879 { | |
880 if ( pButton->uButtonType == 3 | |
881 && (signed int)pX >= (signed int)pButton->uX | |
882 && (signed int)pX <= (signed int)pButton->uZ | |
883 && (signed int)pY >= (signed int)pButton->uY | |
884 && (signed int)pY <= (signed int)pButton->uW ) | |
885 { | |
886 //LABEL_19: | |
887 pPlayer = pPlayers[uActiveCharacter]; | |
832 | 888 v5 = LOBYTE(pPlayer->pActiveSkills[pButton->msg_param]); |
706 | 889 v6 = pPlayer->uSkillPoints; |
890 v7 = (v5 & 0x3F) + 1; | |
891 if ( v6 < v7 ) | |
892 { | |
893 v41 = v7 - v6; | |
894 v39 = pGlobalTXT_LocalizationStrings[469];// "You need %d more Skill Points to advance here" | |
895 } | |
896 else | |
897 { | |
898 v41 = v7; | |
899 v39 = pGlobalTXT_LocalizationStrings[468];// "Clicking here will spend %d Skill Points" | |
900 } | |
901 sprintf(Str1, v39, v41); | |
902 v13 = Str1; | |
903 //goto _set_status_and_ret; | |
904 sub_41C0B8_set_status_string(v13); | |
905 uLastPointedObjectID = 1; | |
906 return; | |
907 } | |
908 } | |
909 } | |
910 } | |
911 } | |
912 if ( pWindow->uFrameHeight == 480 ) | |
913 break; | |
914 --v1; | |
915 if ( v1 <= 0 ) | |
916 { | |
917 break; | |
918 } | |
919 } | |
920 } | |
921 if ( uNumVisibleWindows <= 0 || (uNumVisibleWindows > 0 && pWindow->uFrameHeight != 480 && v1 <= 0)) | |
922 { | |
923 if ( pCurrentScreen == SCREEN_CHEST ) | |
924 { | |
925 sub_42038D(); | |
926 //goto _return; | |
927 if ( pMouse->uPointingObjectID == 0 ) | |
928 { | |
929 if ( uLastPointedObjectID != 0 ) | |
930 { | |
783 | 931 pFooterString[0] = 0; |
932 bForceDrawFooter = 1; | |
706 | 933 } |
934 } | |
935 uLastPointedObjectID = pMouse->uPointingObjectID; | |
936 return; | |
937 } | |
938 if ( pCurrentScreen == SCREEN_HOUSE ) | |
939 { | |
747 | 940 if ( dialog_menu_id != HOUSE_DIALOGUE_SHOP_BUY_STANDARD |
706 | 941 || (v16 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]], v16 == 0) |
942 || v16 == -65536 ) | |
943 //goto _return; | |
944 { | |
945 if ( pMouse->uPointingObjectID == 0 ) | |
946 { | |
947 if ( uLastPointedObjectID != 0 ) | |
948 { | |
783 | 949 pFooterString[0] = 0; |
950 bForceDrawFooter = 1; | |
706 | 951 } |
952 } | |
953 uLastPointedObjectID = pMouse->uPointingObjectID; | |
954 return; | |
955 } | |
956 pItemGen = (ItemGen *)((char *)&pParty->pPickedItem + 36 * (v16 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 4); | |
957 //LABEL_49: | |
958 v17 = pItemGen->GetDisplayName(); | |
959 sub_41C0B8_set_status_string(v17); | |
960 //LABEL_50: | |
961 uLastPointedObjectID = 1; | |
962 //_return: | |
963 if ( pMouse->uPointingObjectID == 0 ) | |
964 { | |
965 if ( uLastPointedObjectID != 0 ) | |
966 { | |
783 | 967 pFooterString[0] = 0; |
968 bForceDrawFooter = 1; | |
706 | 969 } |
970 } | |
971 uLastPointedObjectID = pMouse->uPointingObjectID; | |
972 return; | |
973 } | |
974 if ( (signed int)pY < 350 ) | |
975 { | |
976 v14 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; | |
977 if ( v14 == 0 || v14 == -65536 || (unsigned int)v14 >= 0x1388 ) | |
978 //goto _return; | |
979 { | |
980 if ( pMouse->uPointingObjectID == 0 ) | |
981 { | |
982 if ( uLastPointedObjectID != 0 ) | |
983 { | |
783 | 984 pFooterString[0] = 0; |
985 bForceDrawFooter = 1; | |
706 | 986 } |
987 } | |
988 uLastPointedObjectID = pMouse->uPointingObjectID; | |
989 return; | |
990 } | |
991 pItemGen = (ItemGen *)&pPlayers[uActiveCharacter]->pInventoryItems[v14-1]; | |
992 //goto LABEL_49; | |
993 v17 = pItemGen->GetDisplayName(); | |
994 sub_41C0B8_set_status_string(v17); | |
995 uLastPointedObjectID = 1; | |
996 if ( pMouse->uPointingObjectID == 0 ) | |
997 { | |
998 if ( uLastPointedObjectID != 0 ) | |
999 { | |
783 | 1000 pFooterString[0] = 0; |
1001 bForceDrawFooter = 1; | |
706 | 1002 } |
1003 } | |
1004 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1005 return; | |
1006 } | |
1007 _click_on_game_ui: | |
1008 if ( (signed int)pX >= (signed int)pWindowList[0].uFrameX | |
1009 && (signed int)pX <= (signed int)pWindowList[0].uFrameZ | |
1010 && (signed int)pY >= (signed int)pWindowList[0].uFrameY | |
1011 && (signed int)pY <= (signed int)pWindowList[0].uFrameW ) | |
1012 { | |
1013 for ( pButton = pWindowList[0].pControlsHead; pButton != (GUIButton *)0; pButton = pButton->pNext ) | |
1014 { | |
1015 if ( pButton->uButtonType == 1 ) | |
1016 { | |
1017 if ( (signed int)pX >= (signed int)pButton->uX | |
1018 && (signed int)pX <= (signed int)pButton->uZ | |
1019 && (signed int)pY >= (signed int)pButton->uY | |
1020 && (signed int)pY <= (signed int)pButton->uW ) | |
1021 { | |
1022 pMessageType3 = (UIMessageType)pButton->field_1C; | |
1023 if ( pMessageType3 == 0 ) // For books | |
1024 //goto LABEL_28; | |
1025 { | |
1026 v13 = pButton->pButtonName; | |
1027 sub_41C0B8_set_status_string(v13); | |
1028 uLastPointedObjectID = 1; | |
1029 return; | |
1030 } | |
832 | 1031 |
1032 pMessageQueue_50CBD0->AddMessage(pMessageType3, pButton->msg_param, 0); | |
706 | 1033 //goto LABEL_131; |
1034 uLastPointedObjectID = 1; | |
1035 return; | |
1036 } | |
1037 } | |
1038 else | |
1039 { | |
1040 if ( pButton->uButtonType == 2 ) | |
1041 { | |
1042 v45 = pX - pButton->uX; | |
1043 v45 = pY - pButton->uY; | |
1044 | |
1045 if (pX >= pButton->uX && pX <= pButton->uZ && | |
1046 pY >= pButton->uY && pY <= pButton->uW) | |
1047 if ( (double)(signed int)pButton->uWidth != 0.0 ) | |
1048 { | |
1049 if ( (double)(signed int)pButton->uHeight != 0.0 ) | |
1050 { | |
1051 //UNDEF(v32); | |
1052 //if ( v33 | v34 ) | |
1053 //{ | |
1054 pMessageType2 = (UIMessageType)pButton->field_1C; | |
1055 if ( pMessageType2 != 0 ) | |
832 | 1056 pMessageQueue_50CBD0->AddMessage(pMessageType2, pButton->msg_param, 0); |
1057 | |
706 | 1058 //goto LABEL_28; |
1059 v13 = pButton->pButtonName; | |
1060 sub_41C0B8_set_status_string(v13); | |
1061 uLastPointedObjectID = 1; | |
1062 return; | |
1063 //} | |
1064 } | |
1065 } | |
1066 } | |
1067 else | |
1068 { | |
1069 if ( pButton->uButtonType == 3 | |
1070 && (signed int)pX >= (signed int)pButton->uX | |
1071 && (signed int)pX <= (signed int)pButton->uZ | |
1072 && (signed int)pY >= (signed int)pButton->uY | |
1073 && (signed int)pY <= (signed int)pButton->uW ) | |
1074 //goto LABEL_19; | |
1075 { | |
1076 pPlayer = pPlayers[uActiveCharacter]; | |
832 | 1077 v5 = LOBYTE(pPlayer->pActiveSkills[pButton->msg_param]); |
706 | 1078 v6 = pPlayer->uSkillPoints; |
1079 v7 = (v5 & 0x3F) + 1; | |
1080 if ( v6 < v7 ) | |
1081 { | |
1082 v41 = v7 - v6; | |
1083 v39 = pGlobalTXT_LocalizationStrings[469];// "You need %d more Skill Points to advance here" | |
1084 } | |
1085 else | |
1086 { | |
1087 v41 = v7; | |
1088 v39 = pGlobalTXT_LocalizationStrings[468];// "Clicking here will spend %d Skill Points" | |
1089 } | |
1090 sprintf(Str1, v39, v41); | |
1091 v13 = Str1; | |
1092 //goto _set_status_and_ret; | |
1093 sub_41C0B8_set_status_string(v13); | |
1094 uLastPointedObjectID = 1; | |
1095 return; | |
1096 } | |
1097 } | |
1098 } | |
1099 } | |
1100 } | |
1101 pMouse->uPointingObjectID = sub_46A99B(); | |
1102 //goto _return; | |
1103 if ( pMouse->uPointingObjectID == 0 ) | |
1104 { | |
1105 if ( uLastPointedObjectID != 0 ) | |
1106 { | |
783 | 1107 pFooterString[0] = 0; |
1108 bForceDrawFooter = 1; | |
706 | 1109 } |
1110 } | |
1111 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1112 return; | |
1113 } | |
1114 } | |
1115 | |
1116 | |
1117 //----- (0044158F) -------------------------------------------------------- | |
1118 void __cdecl GameUI_DrawCharacterSelectionFrame() | |
920 | 1119 { |
1120 if ( uActiveCharacter ) | |
1121 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[uActiveCharacter - 1] - 9, | |
1122 380, &pIcons_LOD->pTextures[dword_50C98C]); | |
1123 } | |
706 | 1124 |
1125 //----- (004415C5) -------------------------------------------------------- | |
1126 void LoadPartyBuffIcons() | |
1127 { | |
1128 for (uint i = 0; i < 14; ++i) | |
1129 { | |
1130 char filename[200]; | |
1131 sprintf(filename, "isn-%02d", i + 1); | |
1132 pTextureIDs_PartyBuffIcons[i] = pIcons_LOD->LoadTexture(filename, TEXTURE_16BIT_PALETTE); | |
1133 } | |
1134 | |
1135 uIconIdx_FlySpell = pIconsFrameTable->FindIcon("spell21"); | |
1136 uIconIdx_WaterWalk = pIconsFrameTable->FindIcon("spell27"); | |
1137 } | |
1138 | |
1139 //----- (0044162D) -------------------------------------------------------- | |
1140 void __cdecl GameUI_DrawPartySpells() | |
1141 { | |
1142 unsigned int v0; // ebp@1 | |
1143 //signed int v1; // edi@1 | |
1144 //int v2; // eax@2 | |
1145 //int v3; // ecx@5 | |
1146 //__int16 *v4; // ebx@25 | |
1147 //Player *v5; // edi@26 | |
1148 //unsigned int v6; // [sp-4h] [bp-1Ch]@11 | |
1149 Texture *v7; // [sp-4h] [bp-1Ch]@12 | |
1150 //unsigned int v8; // [sp-4h] [bp-1Ch]@20 | |
1151 Texture *v9; // [sp-4h] [bp-1Ch]@21 | |
1152 //Player **v10; // [sp+10h] [bp-8h]@25 | |
1153 | |
1154 v0 = (signed __int64)((double)GetTickCount() * 0.050000001); | |
1155 //v1 = 0; | |
1156 for (uint i = 0; i < 14; ++i) | |
1157 { | |
1158 //v2 = byte_4E5DD8[v1]; | |
1159 if (pParty->pPartyBuffs[byte_4E5DD8[i]].uExpireTime) | |
1160 { | |
1161 auto tex = pIcons_LOD->GetTexture(pTextureIDs_PartyBuffIcons[i]); | |
1162 //v3 = pTextureIDs_PartyBuffIcons[i]; | |
1163 if (tex) | |
1164 pRenderer->_4A65CC(pPartySpellbuffsUI_XYs[i][0], | |
1165 pPartySpellbuffsUI_XYs[i][1], tex, tex, | |
1166 v0 + 20 * pPartySpellbuffsUI_smthns[i], 0, 63); | |
1167 } | |
1168 //++v1; | |
1169 } | |
1170 //while ( v1 < 14 ); | |
1171 | |
1172 if (pCurrentScreen == SCREEN_GAME || pCurrentScreen == SCREEN_NPC_DIALOGUE) | |
1173 { | |
1174 if (pParty->FlyActive()) | |
1175 { | |
1176 if ( pParty->bFlying ) | |
1177 v7 = &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(uIconIdx_FlySpell, v0)->uTextureID]; | |
1178 else | |
1179 v7 = &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(uIconIdx_FlySpell, 0)->uTextureID]; | |
1180 if ( pRenderer->pRenderD3D ) | |
1181 pRenderer->DrawTextureIndexed(8u, 8u, v7); | |
1182 else | |
1183 pRenderer->DrawTextureTransparent(8u, 8u, v7); | |
1184 } | |
1185 if (pParty->WaterWalkActive()) | |
1186 { | |
1187 if ( pParty->uFlags & PARTY_FLAGS_1_STANDING_ON_WATER) | |
1188 v9 = &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, v0)->uTextureID]; | |
1189 else | |
1190 v9 = &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, 0)->uTextureID]; | |
1191 if ( pRenderer->pRenderD3D ) | |
1192 pRenderer->DrawTextureIndexed(396u, 8u, v9); | |
1193 else | |
1194 pRenderer->DrawTextureTransparent(396u, 8u, v9); | |
1195 } | |
1196 } | |
1197 | |
1198 for (uint i = 0; i < 4; ++i) | |
1199 { | |
1200 auto player = pParty->pPlayers + i; | |
1201 | |
1202 if (player->pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].uExpireTime) | |
1203 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 427, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Hammerhands)); | |
1204 if (player->pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime) | |
1205 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 393, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Bless)); | |
1206 if (player->pPlayerBuffs[PLAYER_BUFF_PRESERVATION].uExpireTime) | |
1207 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 410, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Preservation)); | |
1208 if (player->pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].uExpireTime) | |
1209 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 444, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_PainReflection)); | |
1210 } | |
1211 } | |
1212 | |
1213 | |
1214 //----- (00421626) -------------------------------------------------------- | |
1215 GUIWindow *GameUI_InitializeCharacterWindow(unsigned int _this) | |
1216 { | |
1217 unsigned int v1; // edi@1 | |
1218 GUIWindow *pWindow; // edi@3 | |
1219 | |
1220 ++pIcons_LOD->uTexturePacksCount; | |
1221 v1 = _this; | |
1222 if ( !pIcons_LOD->uNumPrevLoadedFiles ) | |
1223 pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; | |
1224 pEventTimer->Pause(); | |
1225 pAudioPlayer->StopChannels(-1, -1); | |
1226 bRingsShownInCharScreen = 0; | |
1227 CharacterUI_LoadPaperdollTextures(); | |
1228 pCurrentScreen = v1; | |
948 | 1229 |
706 | 1230 pWindow = GUIWindow::Create(0, 0, 640, 480, WINDOW_CharacterRecord, uActiveCharacter, 0); |
1231 pCharacterScreen_StatsBtn = pWindow->CreateButton(pViewport->uViewportTL_X + 12, pViewport->uViewportTL_Y + 308, | |
948 | 1232 pIcons_LOD->GetTexture(papredoll_dbrds[9])->uTextureWidth, |
1233 pIcons_LOD->GetTexture(papredoll_dbrds[9])->uTextureHeight, | |
1234 1, 0, UIMSG_73, 0, 'S', pGlobalTXT_LocalizationStrings[216],// Stats | |
1235 pIcons_LOD->GetTexture(papredoll_dbrds[10]), | |
1236 pIcons_LOD->GetTexture(papredoll_dbrds[9]), 0); | |
706 | 1237 pCharacterScreen_SkillsBtn = pWindow->CreateButton(pViewport->uViewportTL_X + 102, pViewport->uViewportTL_Y + 308, |
948 | 1238 pIcons_LOD->GetTexture(papredoll_dbrds[7])->uTextureWidth, |
1239 pIcons_LOD->GetTexture(papredoll_dbrds[7])->uTextureHeight, | |
1240 1, 0, UIMSG_72, 0, 'K', pGlobalTXT_LocalizationStrings[205],//Skills | |
1241 pIcons_LOD->GetTexture(papredoll_dbrds[8]), | |
1242 pIcons_LOD->GetTexture(papredoll_dbrds[7]), 0); | |
706 | 1243 pCharacterScreen_InventoryBtn = pWindow->CreateButton(pViewport->uViewportTL_X + 192, pViewport->uViewportTL_Y + 308, |
948 | 1244 pIcons_LOD->GetTexture(papredoll_dbrds[5])->uTextureWidth, |
1245 pIcons_LOD->GetTexture(papredoll_dbrds[5])->uTextureHeight, | |
1246 1, 0, UIMSG_74, 0, 'I', pGlobalTXT_LocalizationStrings[120], //Inventory | |
1247 pIcons_LOD->GetTexture(papredoll_dbrds[6]), | |
1248 pIcons_LOD->GetTexture(papredoll_dbrds[5]), 0); | |
706 | 1249 pCharacterScreen_AwardsBtn = pWindow->CreateButton(pViewport->uViewportTL_X + 282, pViewport->uViewportTL_Y + 308, |
948 | 1250 pIcons_LOD->GetTexture(papredoll_dbrds[3])->uTextureWidth, |
1251 pIcons_LOD->GetTexture(papredoll_dbrds[3])->uTextureHeight, | |
1252 1, 0, UIMSG_75, 0, 'A', pGlobalTXT_LocalizationStrings[22], //Awards | |
1253 pIcons_LOD->GetTexture(papredoll_dbrds[4]), | |
1254 pIcons_LOD->GetTexture(papredoll_dbrds[3]), 0); | |
706 | 1255 pCharacterScreen_ExitBtn = pWindow->CreateButton(pViewport->uViewportTL_X + 371, pViewport->uViewportTL_Y + 308, |
948 | 1256 pIcons_LOD->GetTexture(papredoll_dbrds[1])->uTextureWidth, |
1257 pIcons_LOD->GetTexture(papredoll_dbrds[1])->uTextureHeight, | |
832 | 1258 1, 0, UIMSG_A8, 0, 0, pGlobalTXT_LocalizationStrings[79],//Exit |
948 | 1259 pIcons_LOD->GetTexture(papredoll_dbrds[2]), |
1260 pIcons_LOD->GetTexture(papredoll_dbrds[1]), 0); | |
832 | 1261 pWindow->CreateButton(0, 0, 0x1DCu, 0x159u, 1, 122, UIMSG_InventoryLeftClick, 0, 0, "", 0); |
910 | 1262 pCharacterScreen_DetalizBtn = pWindow->CreateButton(0x258u, 0x12Cu, 0x1Eu, 0x1Eu, 1, 0, UIMSG_ChangeDetaliz, 0, 0, pGlobalTXT_LocalizationStrings[64], 0); |
1263 pCharacterScreen_DollBtn = pWindow->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, 1, 0, UIMSG_ClickPaperdoll, 0, 0, "", 0); | |
948 | 1264 pWindow->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0); |
1265 pWindow->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0); | |
1266 pWindow->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0); | |
1267 pWindow->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0); | |
1268 pWindow->CreateButton(0, 0, 0, 0, 1, 0, UIMSG_CycleCharacters, 0, '\t', "", 0); | |
706 | 1269 FillAwardsData(); |
1270 return pWindow; | |
1271 } | |
1272 | |
1273 | |
1274 //----- (004921C1) -------------------------------------------------------- | |
1275 void GameUI_DrawPortraits(unsigned int _this) | |
832 | 1276 { |
706 | 1277 Texture *pFace; // eax@10 |
1278 unsigned int v7; // eax@17 | |
1279 PlayerFrame *pFrame; // eax@21 | |
1280 unsigned int v9; // eax@27 | |
1281 bool v10; // eax@33 | |
1282 bool v11; // edi@40 | |
1283 bool v12; // edx@43 | |
1284 bool v13; // ecx@46 | |
1285 int v16; // eax@57 | |
1286 int v19; // eax@62 | |
1287 Texture *pPortrait; // [sp-4h] [bp-1Ch]@27 | |
1288 unsigned int v22; // [sp+14h] [bp-4h]@1 | |
1289 | |
1290 v22 = _this; | |
1291 if ( qword_A750D8 ) | |
1292 { | |
1293 qword_A750D8 -= (signed int)pMiscTimer->uTimeElapsed; | |
1294 if ( qword_A750D8 <= 0 ) | |
1295 { | |
1296 if ( pPlayers[word_A750E2]->CanAct() ) | |
1297 pPlayers[word_A750E2]->PlaySound((PlayerSpeech)word_A750E0, 0); | |
1298 qword_A750D8 = 0i64; | |
1299 } | |
1300 } | |
1301 | |
1302 for (uint i = 0; i < 4; ++i) | |
1303 { | |
1304 auto pPlayer = pParty->pPlayers + i; | |
1305 | |
1306 if (pPlayer->Eradicated()) | |
1307 { | |
1308 pFace = pTexture_PlayerFaceEradicated; | |
1309 pPortrait = pFace; | |
1310 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
1311 if ( pParty->pPartyBuffs[11].uExpireTime ) | |
1312 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
1313 else | |
1314 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
1315 auto _v1 = 0; | |
1316 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
1317 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
1318 _v1 = 1; | |
1319 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
1320 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
1321 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
1322 if ( v13 | v12 | v11 | _v1 | v10 ) | |
1323 sub_441A4E(i); | |
1324 continue; | |
1325 } | |
1326 if (pPlayer->Dead()) | |
1327 { | |
1328 pFace = pTexture_PlayerFaceDead; | |
1329 pPortrait = pFace; | |
1330 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
1331 if ( pParty->pPartyBuffs[11].uExpireTime ) | |
1332 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
1333 else | |
1334 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
1335 auto _v1 = 0; | |
1336 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
1337 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
1338 _v1 = 1; | |
1339 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
1340 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
1341 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
1342 if ( v13 | v12 | v11 | _v1 | v10 ) | |
1343 sub_441A4E(i); | |
1344 continue; | |
1345 } | |
1346 v7 = 0; | |
1347 for (uint j = 0; j < pPlayerFrameTable->uNumFrames; ++j) | |
1348 if (pPlayerFrameTable->pFrames[j].expression == pPlayer->expression) | |
1349 { | |
1350 v7 = j; | |
1351 break; | |
1352 } | |
1353 if ( v7 == 0 ) | |
1354 v7 = 1; | |
1355 if (pPlayer->expression == CHARACTER_EXPRESSION_21) | |
1356 pFrame = pPlayerFrameTable->GetFrameBy_y(&pPlayer->_expression21_frameset, &pPlayer->_expression21_animtime, pMiscTimer->uTimeElapsed); | |
1357 else | |
1358 pFrame = pPlayerFrameTable->GetFrameBy_x(v7, pPlayer->uExpressionTimePassed); | |
1359 if (pPlayer->field_1AA2 != pFrame->uTextureID - 1 || v22 ) | |
1360 { | |
1361 pPlayer->field_1AA2 = pFrame->uTextureID - 1; | |
1362 pFace = (Texture *)pTextures_PlayerFaces[i][pPlayer->field_1AA2];//pFace = (Texture *)pTextures_PlayerFaces[i][pFrame->uTextureID]; | |
1363 pPortrait = pFace; | |
1364 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
1365 if ( pParty->pPartyBuffs[11].uExpireTime ) | |
1366 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
1367 else | |
1368 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
1369 auto _v1 = 0; | |
1370 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
1371 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
1372 _v1 = 1; | |
1373 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
1374 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
1375 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
1376 if ( v13 | v12 | v11 | _v1 | v10 ) | |
1377 sub_441A4E(i); | |
1378 continue; | |
1379 } | |
1380 } | |
1381 if ( pParty->bTurnBasedModeOn == 1 ) | |
1382 { | |
1383 if ( pTurnEngine->field_4 != 1 ) | |
1384 { | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
1385 if (PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player) |
706 | 1386 { |
1387 //v14 = 0; | |
1388 if ( pTurnEngine->uActorQueueSize > 0 ) | |
1389 { | |
1390 //v15 = (char *)pTurnEngine->pQueue; | |
1391 for (uint i = 0; i < pTurnEngine->uActorQueueSize; ++i) | |
1392 { | |
1393 auto pElem = pTurnEngine->pQueue + i; | |
1394 | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
809
diff
changeset
|
1395 if (PID_TYPE(pElem->uPackedID) != OBJECT_Player) |
706 | 1396 break; |
1397 v16 = dword_5079D0; | |
1398 if ( pParty->uFlags & 0x10 ) | |
1399 { | |
1400 v16 = dword_5079CC; | |
1401 } | |
1402 else | |
1403 { | |
1404 if ( pParty->uFlags & 0x20 ) | |
1405 v16 = dword_5079C8; | |
1406 } | |
948 | 1407 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[PID_ID(pElem->uPackedID)] - 4, 0x181u, pIcons_LOD->GetTexture(v16)); |
706 | 1408 } |
1409 } | |
1410 } | |
1411 } | |
1412 } | |
1413 else | |
1414 { | |
1415 for (uint i = 0; i < 4; ++i) | |
1416 { | |
1417 auto pPlayer = pParty->pPlayers + i; | |
1418 if (pPlayer->CanAct() && !pPlayer->uTimeToRecovery) | |
1419 { | |
1420 v19 = dword_5079D0; | |
1421 if ( pParty->uFlags & 0x10 ) | |
1422 { | |
1423 v19 = dword_5079CC; | |
1424 } | |
1425 else | |
1426 { | |
1427 if ( pParty->uFlags & 0x20 ) | |
1428 v19 = dword_5079C8; | |
1429 } | |
948 | 1430 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] - 4, 0x181u, pIcons_LOD->GetTexture(v19)); |
706 | 1431 } |
1432 } | |
1433 } | |
1434 } | |
1435 | |
709 | 1436 //----- (00441D38) -------------------------------------------------------- |
706 | 1437 void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int bRedrawOdmMinimap) |
1438 { | |
1439 int uHeight; // ebx@6 | |
1440 __int16 v11; // cx@11 | |
1441 unsigned int v14; // ebx@23 | |
1442 int v15; // eax@23 | |
1443 __int16 v17; // di@30 | |
1444 double v18; // st7@30 | |
1445 float v19; // ST38_4@30 | |
1446 double v20; // st7@30 | |
1447 double v21; // st6@30 | |
1448 double v22; // st5@33 | |
1449 signed int v27; // eax@37 | |
1450 unsigned __int16 *v28; // ecx@37 | |
1451 signed int v29; // edi@40 | |
1452 //signed int v33; // ebx@50 | |
1453 //unsigned int v34; // eax@50 | |
1454 //signed int v35; // ecx@50 | |
1455 //unsigned __int16 v36; // di@66 | |
1456 int v37; // edi@72 | |
1457 int v38; // ebx@72 | |
1458 __int16 v39; // ax@87 | |
1459 int v40; // edi@91 | |
1460 int v41; // ebx@91 | |
1461 unsigned int v42; // eax@101 | |
1462 unsigned int v43; // ebx@101 | |
1463 unsigned int v44; // ST30_4@101 | |
1464 char *v45; // ebx@106 | |
1465 int v46; // edi@108 | |
1466 int v47; // eax@108 | |
1467 unsigned int v48; // ebx@114 | |
1468 unsigned int v49; // ST64_4@114 | |
709 | 1469 //unsigned int v51; // [sp-10h] [bp-64h]@79 |
706 | 1470 unsigned int v52; // [sp-10h] [bp-64h]@100 |
709 | 1471 //unsigned int v53; // [sp-Ch] [bp-60h]@79 |
706 | 1472 unsigned int v54; // [sp-Ch] [bp-60h]@100 |
709 | 1473 //unsigned int v55; // [sp-8h] [bp-5Ch]@77 |
706 | 1474 unsigned int v56; // [sp-8h] [bp-5Ch]@100 |
1475 //signed int v57; // [sp-4h] [bp-58h]@54 | |
709 | 1476 //unsigned __int16 v58; // [sp-4h] [bp-58h]@77 |
706 | 1477 unsigned __int16 v59; // [sp-4h] [bp-58h]@100 |
1478 unsigned __int16 v60; // [sp+10h] [bp-44h]@66 | |
1479 unsigned int v61; // [sp+10h] [bp-44h]@85 | |
1480 unsigned int v63; // [sp+14h] [bp-40h]@85 | |
1481 unsigned int v65; // [sp+18h] [bp-3Ch]@85 | |
1482 unsigned int lPitch; // [sp+20h] [bp-34h]@1 | |
1483 unsigned int lPitcha; // [sp+20h] [bp-34h]@23 | |
1484 char *lPitchb; // [sp+20h] [bp-34h]@106 | |
1485 unsigned int v69; // [sp+24h] [bp-30h]@23 | |
1486 signed int v70; // [sp+24h] [bp-30h]@37 | |
1487 unsigned __int16 uBlue; // [sp+28h] [bp-2Ch]@1 | |
1488 signed int uBluea; // [sp+28h] [bp-2Ch]@37 | |
1489 int v73; // [sp+2Ch] [bp-28h]@30 | |
1490 int v76; // [sp+34h] [bp-20h]@91 | |
1491 int v77; // [sp+34h] [bp-20h]@108 | |
709 | 1492 //int v79; // [sp+38h] [bp-1Ch]@72 |
1493 //char *a2c; // [sp+40h] [bp-14h]@68 | |
706 | 1494 signed int uCenterY; // [sp+48h] [bp-Ch]@1 |
1495 signed int uCenterX; // [sp+4Ch] [bp-8h]@1 | |
1496 signed int uWidth; // [sp+5Ch] [bp+8h]@30 | |
709 | 1497 //signed int uZe; // [sp+5Ch] [bp+8h]@67 |
706 | 1498 signed int uZf; // [sp+5Ch] [bp+8h]@85 |
1499 signed int uZg; // [sp+5Ch] [bp+8h]@105 | |
1500 unsigned int uWa; // [sp+60h] [bp+Ch]@23 | |
1501 float uWb; // [sp+60h] [bp+Ch]@30 | |
1502 unsigned int uWd; // [sp+60h] [bp+Ch]@95 | |
1503 float uZooma; // [sp+64h] [bp+10h]@117 | |
1504 unsigned int flagsb; // [sp+68h] [bp+14h]@66 | |
1505 Actor *flagsc; // [sp+68h] [bp+14h]@86 | |
1506 unsigned int flagsd; // [sp+68h] [bp+14h]@105 | |
1507 | |
1508 uCenterX = (uX + uZ) / 2; | |
1509 uCenterY = (uY + uW) / 2; | |
1510 lPitch = pRenderer->uTargetSurfacePitch; | |
949 | 1511 TargetColor(0, 0, 0); |
1512 uBlue = TargetColor(0, 0, 0xFFu); | |
706 | 1513 auto bWizardEyeActive = pParty->WizardEyeActive(); |
1514 auto uWizardEyeSkillLevel = pParty->WizardEyeSkillLevel(); | |
1515 if (CheckHiredNPCSpeciality(Cartographer)) | |
1516 { | |
1517 bWizardEyeActive = true; | |
1518 uWizardEyeSkillLevel = 2; | |
1519 } | |
709 | 1520 bWizardEyeActive = true; |
1521 uWizardEyeSkillLevel = 3; | |
1522 pRenderer->SetRasterClipRect(uX, uY, uZ - 1, uW - 1); | |
706 | 1523 uHeight = uW - uY; |
1524 uWidth = uZ - uX; | |
1525 | |
1526 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) | |
1527 { | |
1528 v17 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2; | |
710 | 1529 auto pMapLod0 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pLevelOfDetail0_prolly_alpha_mask; |
706 | 1530 auto pPal = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pPalette16; |
1531 v73 = (1 << (v17 + 16)) / (signed int)uZoom; | |
1532 v18 = (double)(1 << (16 - v17)); | |
1533 v19 = v18; | |
1534 v20 = (double)(pParty->vPosition.x + 32768) / v18; | |
1535 v21 = (double)(32768 - pParty->vPosition.y) / v19; | |
1536 uWb = v21; | |
1537 switch (uZoom) | |
1538 { | |
1539 case 512: | |
1540 { | |
1541 v20 = v20 - (double)(uWidth / 2); | |
1542 v22 = (double)(uHeight / 2); | |
1543 uWb = v21 - v22; | |
1544 } | |
1545 break; | |
1546 | |
1547 case 1024: | |
1548 { | |
1549 v20 = v20 - (double)(uWidth / 4); | |
1550 v22 = (double)(uHeight / 4); | |
1551 uWb = v21 - v22; | |
1552 } | |
1553 break; | |
1554 | |
1555 case 2048: | |
1556 { | |
1557 v20 = v20 - (double)(uWidth / 8); | |
1558 v22 = (double)(uHeight / 8); | |
1559 uWb = v21 - v22; | |
1560 } | |
1561 break; | |
1562 | |
1563 default: assert(false); | |
1564 } | |
1565 assert(sizeof(pOdmMinimap) == 137 * 117 * sizeof(short)); | |
1566 | |
1567 v70 = floorf(v20 * 65536.0 + 0.5f);//LODWORD(v24); | |
1568 uBluea = floorf(uWb * 65536.0 + 0.5f);//LODWORD(v25); | |
1569 v27 = uBluea >> 16; | |
1570 v28 = &pRenderer->pTargetSurface[uX + uY * lPitch]; | |
1571 if (pMapLod0 && bRedrawOdmMinimap) | |
1572 { | |
1573 assert(uWidth == 137 && uHeight == 117); | |
1574 //auto pMinimap = (unsigned __int16 *)pOdmMinimap; | |
1575 | |
1576 auto mapWidth = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth; | |
1577 | |
1578 v29 = v70 >> 16; | |
1579 | |
1580 for (int y = 0; y < uHeight; ++y) | |
1581 { | |
1582 auto pMapLod0Line = &pMapLod0[v27 * mapWidth]; | |
1583 for (int x = 0; x < uWidth; ++x) | |
1584 { | |
1585 //*pMinimap++ = pPal[pMapLod0Line[v29]]; | |
1586 pOdmMinimap[y][x] = pPal[pMapLod0Line[v29]]; | |
1587 v29 = (v70 + x * v73) >> 16; | |
1588 } | |
1589 | |
1590 v29 = v70 >> 16; | |
1591 v28 += 137 - uWidth; | |
1592 uBluea += v73; | |
1593 v27 = uBluea >> 16; | |
1594 } | |
1595 } | |
1596 | |
1597 for (int y = 0; y < 117; ++y) | |
1598 { | |
1599 for (int x = 0; x < 137; ++x) | |
1600 { | |
1601 *v28++ = pOdmMinimap[y][x]; | |
1602 } | |
1603 v28 += lPitch - 137; | |
1604 } | |
1605 uNumBlueFacesInBLVMinimap = 0; | |
1606 } | |
1607 else | |
1608 { | |
1609 pRenderer->FillRectFast(uX, uY, uZ - uX, uHeight, 0xF); | |
1610 uNumBlueFacesInBLVMinimap = 0; | |
1611 | |
1612 for (uint i = 0; i < pIndoor->pMapOutlines->uNumOutlines; ++i) | |
1613 { | |
1614 auto pOutline = &pIndoor->pMapOutlines->pOutlines[i]; | |
1615 | |
1616 auto pFace1 = pIndoor->pFaces + pOutline->uFace1ID; | |
1617 auto pFace2 = pIndoor->pFaces + pOutline->uFace2ID; | |
1618 //v9 = pIndoor->pFaces[pMapVertex->uFace1ID].uAttributes; | |
1619 //v10 = pIndoor->pFaces[pMapVertex->uFace2ID].uAttributes; | |
1620 if (pFace1->Visible() && pFace2->Visible()) | |
1621 { | |
1622 v11 = pOutline->uFlags; | |
1623 if ( v11 & 1 ) | |
1624 goto LABEL_15; | |
1625 if (pFace1->uAttributes & 0x80 || pFace2->uAttributes & 0x80u != 0 ) | |
1626 goto LABEL_ABC; | |
1627 | |
1628 } | |
1629 continue; | |
1630 | |
1631 LABEL_ABC: | |
1632 pOutline->uFlags = v11 | 1; | |
1633 pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8); | |
1634 | |
1635 LABEL_15: | |
1636 //v12 = &pIndoor->pFaces[pOutline->uFace1ID]; | |
1637 if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 && | |
1638 (pFace1->uAttributes & 0x2000000 || pFace2->uAttributes & 0x2000000) && | |
1639 (pIndoor->pFaceExtras[pFace1->uFaceExtraID].uEventID || pIndoor->pFaceExtras[pFace2->uFaceExtraID].uEventID)) | |
1640 { | |
1641 if (uNumBlueFacesInBLVMinimap < 49) | |
1642 pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap++] = i; | |
1643 } | |
1644 else | |
1645 { | |
1646 auto _a = (uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x); | |
1647 auto _b = ((unsigned int)((unsigned __int64)_a >> 16) << 16); | |
1648 auto _c = ((signed int)(_b - uZoom * pParty->vPosition.x) >> 16); | |
1649 v69 = uCenterX + _c; | |
1650 v69 = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); | |
1651 lPitcha = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) - uZoom * pParty->vPosition.y) >> 16); | |
1652 uWa = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); | |
1653 v14 = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) - uZoom * pParty->vPosition.y) >> 16); | |
1654 v15 = abs(pOutline->sZ - pParty->vPosition.z) / 8; | |
1655 if ( v15 > 100 ) | |
1656 v15 = 100; | |
709 | 1657 pRenderer->RasterLine2D(v69, lPitcha, uWa, v14, viewparams->pPalette[-v15 + 200]); |
706 | 1658 } |
1659 } | |
1660 | |
1661 | |
1662 for (uint i = 0; i < uNumBlueFacesInBLVMinimap; ++i) | |
1663 { | |
1664 //v16 = (uint *)&pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[uZb]]; | |
1665 auto pOutline = &pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[i]]; | |
709 | 1666 pRenderer->RasterLine2D(uCenterX + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom |
706 | 1667 * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) |
1668 - uZoom * pParty->vPosition.x) >> 16), | |
1669 uCenterY | |
1670 - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
1671 * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) | |
1672 - uZoom * pParty->vPosition.y) >> 16), | |
1673 uCenterX | |
1674 + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
1675 * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) | |
1676 - uZoom * pParty->vPosition.x) >> 16), | |
1677 uCenterY | |
1678 - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
1679 * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) | |
1680 - uZoom * pParty->vPosition.y) >> 16), | |
1681 uBlue); | |
1682 } | |
1683 } | |
1684 | |
1685 | |
1686 assert(pParty->sRotationY >= 0); | |
1687 float angle = (pParty->sRotationY % 2048) / 2048.0f; | |
1688 const float two_pi = 2.0f * 3.14159f; | |
1689 | |
1690 uint arrow_idx = floorf(0.5f + 7 * angle); | |
1691 pRenderer->DrawTextureTransparent(uCenterX - 3, uCenterY - 3, pIcons_LOD->GetTexture(pTextureIDs_pMapDirs[arrow_idx])); | |
1692 | |
949 | 1693 flagsb = TargetColor(0, 0, 255); |
1694 v60 = TargetColor(255, 0, 0); | |
706 | 1695 if (bWizardEyeActive) |
1696 { | |
709 | 1697 //uZe = 0; |
1698 if (uWizardEyeSkillLevel >= 2) | |
1699 for (uint i = 0; i < uNumSpriteObjects; ++i) | |
1700 //if (uNumSpriteObjects > 0) | |
1701 { | |
1702 auto object = pSpriteObjects + i; | |
1703 | |
1704 //a2c = (char *)&pSpriteObjects[0].uObjectDescID; | |
1705 //while ( 1 ) | |
1706 //{ | |
1707 if (!object->uType || !object->uObjectDescID) | |
1708 continue; | |
1709 //if (uWizardEyeSkillLevel == 1 | |
1710 v37 = uCenterX + ((unsigned __int64)((object->vPosition.x - pParty->vPosition.x) * (signed __int64)uZoom) >> 16); | |
1711 //v79 = (unsigned __int64)((object->vPosition.y - pParty->vPosition.y) * (signed __int64)(signed int)uZoom) >> 16; | |
1712 //v38 = uCenterY - v79; | |
1713 v38 = uCenterY - ((signed __int64)((object->vPosition.y - pParty->vPosition.y) * (signed __int64)uZoom) >> 16); | |
1714 if (v37 < pRenderer->raster_clip_x || v37 > pRenderer->raster_clip_z || | |
1715 v38 < pRenderer->raster_clip_y || v38 > pRenderer->raster_clip_w) | |
1716 continue; | |
1717 | |
1718 assert(uZoom >= 512); | |
1719 if (pObjectList->pObjects[object->uObjectDescID].uFlags & OBJECT_DESC_UNPICKABLE) | |
706 | 1720 { |
709 | 1721 pRenderer->RasterLine2D(v37, v38, |
1722 v37, v38, v60); | |
1723 } | |
1724 else if (uZoom > 512) | |
1725 { | |
1726 pRenderer->RasterLine2D(v37 - 1, v38 - 1, v37 - 1, v38 + 1, flagsb); | |
1727 pRenderer->RasterLine2D(v37, v38 - 2, v37, v38 + 1, flagsb); | |
1728 pRenderer->RasterLine2D(v37 + 1, v38 - 1, v37 + 1, v38 + 1, flagsb); | |
1729 pRenderer->RasterLine2D(v37 - 2, v38, v37 - 2, v38 + 1, flagsb); | |
1730 pRenderer->RasterLine2D(v37 + 2, v38, | |
1731 v37 + 2, v38 + 1, flagsb); | |
706 | 1732 } |
709 | 1733 else |
1734 { | |
1735 pRenderer->RasterLine2D(v37 - 1, v38 - 1, | |
1736 v37 - 1, v38, flagsb); | |
1737 pRenderer->RasterLine2D(v37, v38 - 1, | |
1738 v37, v38, flagsb); | |
1739 } | |
1740 //LABEL_82: | |
1741 //LABEL_83: | |
1742 //++uZe; | |
1743 //a2c += 112; | |
1744 //if ( uZe >= (signed int)uNumSpriteObjects ) | |
1745 //{ | |
1746 //goto LABEL_85; | |
1747 //} | |
1748 //} | |
706 | 1749 } |
709 | 1750 |
1751 | |
706 | 1752 LABEL_85: |
949 | 1753 v63 = TargetColor(255, 0, 0); |
1754 v61 = TargetColor(0, 255, 0); | |
1755 v65 = TargetColor(255, 255, 0); | |
706 | 1756 uZf = 0; |
1757 if ( (signed int)uNumActors > 0 ) | |
1758 { | |
1759 flagsc = pActors;//[0].uAIState; | |
1760 do | |
1761 { | |
1762 v39 = flagsc->uAIState; | |
1763 if ( flagsc->uAIState != 11 && v39 != 19 && (v39 == 5 || BYTE1(flagsc->uAttributes) & 0x80) ) | |
1764 { | |
1765 v40 = ((unsigned __int64)(( flagsc->vPosition.x - pParty->vPosition.x) | |
1766 * (signed __int64)(signed int)uZoom) >> 16) | |
1767 + uCenterX; | |
1768 v76 = (unsigned __int64)(( flagsc->vPosition.y - pParty->vPosition.y) | |
1769 * (signed __int64)(signed int)uZoom) >> 16; | |
1770 v41 = uCenterY - v76; | |
709 | 1771 if ( v40 >= pRenderer->raster_clip_x ) |
706 | 1772 { |
709 | 1773 if ( v40 <= pRenderer->raster_clip_z && v41 >= pRenderer->raster_clip_y && v41 <= pRenderer->raster_clip_w ) |
706 | 1774 { |
1775 uWd = v61; | |
1776 if ( BYTE3(flagsc->uAttributes) & 1 ) | |
1777 uWd = v63; | |
1778 if ( flagsc->uAIState == 5 ) | |
1779 uWd = v65; | |
1780 if ( (signed int)uZoom > 1024 ) | |
1781 { | |
709 | 1782 pRenderer->RasterLine2D(v40 - 1, v41 - 2, v40 - 1, v41 + 2, uWd); |
1783 pRenderer->RasterLine2D(v40, v41 - 2, v40, v41 + 2, uWd); | |
1784 pRenderer->RasterLine2D(v40 + 1, v41 - 2, v40 + 1, v41 + 2, uWd); | |
706 | 1785 v42 = v41 + 1; |
1786 v43 = v41 - 1; | |
1787 v44 = v42; | |
709 | 1788 pRenderer->RasterLine2D(v40 - 2, v43, v40 - 2, v42, uWd); |
706 | 1789 v40 += 2; |
1790 v59 = uWd; | |
1791 v56 = v44; | |
1792 v54 = v40; | |
1793 v52 = v43; | |
1794 } | |
1795 else | |
1796 { | |
709 | 1797 pRenderer->RasterLine2D(v40 - 1, v41 - 1, v40 - 1, uCenterY - v76, uWd); |
706 | 1798 v59 = uWd; |
1799 v56 = uCenterY - v76; | |
1800 v54 = v40; | |
1801 v52 = v41 - 1; | |
1802 } | |
709 | 1803 pRenderer->RasterLine2D(v40, v52, v54, v56, v59); |
706 | 1804 } |
1805 } | |
1806 } | |
1807 ++uZf; | |
1808 ++flagsc; | |
1809 } | |
1810 while ( uZf < (signed int)uNumActors ); | |
1811 } | |
1812 } | |
709 | 1813 |
1814 | |
949 | 1815 flagsd = TargetColor(255, 255, 255); |
706 | 1816 uZg = 0; |
1817 if ( (signed int)uNumLevelDecorations > 0 ) | |
1818 { | |
1819 v45 = (char *)&pLevelDecorations[0].vPosition; | |
1820 lPitchb = (char *)&pLevelDecorations[0].vPosition; | |
1821 do | |
1822 { | |
1823 if ( *(v45 - 2) & 8 ) | |
1824 { | |
1825 v46 = ((unsigned __int64)((*(int *)v45 - pParty->vPosition.x) * (signed __int64)(signed int)uZoom) >> 16) | |
1826 + uCenterX; | |
1827 v77 = (unsigned __int64)((*((int *)v45 + 1) - pParty->vPosition.y) * (signed __int64)(signed int)uZoom) >> 16; | |
1828 v47 = uCenterY - v77; | |
709 | 1829 if ( v46 >= pRenderer->raster_clip_x ) |
706 | 1830 { |
709 | 1831 if ( v46 <= pRenderer->raster_clip_z && v47 >= pRenderer->raster_clip_y && v47 <= pRenderer->raster_clip_w ) |
706 | 1832 { |
1833 if ( (signed int)uZoom > 512 ) | |
1834 { | |
1835 v48 = v47 + 1; | |
1836 v49 = v47 - 1; | |
709 | 1837 pRenderer->RasterLine2D(v46 - 1, v47 - 1, v46 - 1, v47 + 1, flagsd); |
1838 pRenderer->RasterLine2D(v46, v49, v46, v48, flagsd); | |
1839 pRenderer->RasterLine2D(v46 + 1, v49, v46 + 1, v48, flagsd); | |
706 | 1840 v45 = lPitchb; |
1841 } | |
1842 else | |
1843 { | |
709 | 1844 pRenderer->RasterLine2D(v46, uCenterY - v77, v46, uCenterY - v77, flagsd); |
706 | 1845 } |
1846 } | |
1847 } | |
1848 } | |
1849 ++uZg; | |
1850 v45 += 32; | |
1851 lPitchb = v45; | |
1852 } | |
1853 while ( uZg < (signed int)uNumLevelDecorations ); | |
1854 } | |
948 | 1855 pRenderer->DrawTextureTransparent(0x1D4u, 0, pIcons_LOD->GetTexture(dword_5079D8)); |
706 | 1856 uZooma = (double)pParty->sRotationY * 0.1171875; |
1857 //v50 = uZooma + 6.7553994e15; | |
727 | 1858 pRenderer->SetTextureClipRect(541, 0, 567, 480); |
948 | 1859 pRenderer->DrawTextureIndexed(floorf(uZooma + 0.5f) + 285, 136, pIcons_LOD->GetTexture(dword_5079B4)); |
727 | 1860 pRenderer->ResetTextureClipRect(); |
706 | 1861 } |
1862 | |
1863 //----- (00441498) -------------------------------------------------------- | |
1864 void __cdecl GameUI_DrawTorchlightAndWizardEye() | |
1865 { | |
1866 if (pCurrentScreen == SCREEN_GAME | |
1867 || pCurrentScreen == SCREEN_MENU | |
1868 || pCurrentScreen == SCREEN_OPTIONS | |
1869 || pCurrentScreen == SCREEN_REST | |
1870 || pCurrentScreen == SCREEN_SPELL_BOOK | |
1871 || pCurrentScreen == SCREEN_CHEST | |
1872 || pCurrentScreen == SCREEN_SAVEGAME | |
1873 || pCurrentScreen == SCREEN_LOADGAME | |
1874 || pCurrentScreen == SCREEN_F | |
1875 || pCurrentScreen == SCREEN_BOOKS | |
1876 || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) | |
1877 { | |
1878 if (pParty->TorchlightActive()) | |
1879 { | |
1880 auto icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnum_Torchlight->uIconID, pEventTimer->Time()); | |
1881 pRenderer->DrawTextureTransparent(pUIAnum_Torchlight->x, pUIAnum_Torchlight->y, pIcons_LOD->GetTexture(icon->uTextureID)); | |
1882 } | |
1883 if (pParty->WizardEyeActive()) | |
1884 { | |
1885 auto icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnim_WizardEye->uIconID, pEventTimer->Time()); | |
1886 pRenderer->DrawTextureTransparent(pUIAnim_WizardEye->x, pUIAnim_WizardEye->y, pIcons_LOD->GetTexture(icon->uTextureID)); | |
1887 } | |
1888 } | |
1889 } | |
1890 // 4E28F8: using guessed type int pCurrentScreen; | |
1891 | |
1892 | |
1893 //----- (00491F87) -------------------------------------------------------- | |
1894 void __cdecl DrawHiredNPCs() | |
1895 { | |
1896 //int v6; // eax@15 | |
1897 char v7; // al@17 | |
1898 unsigned int v8; // eax@18 | |
1899 int v9; // esi@18 | |
1900 int v10; // eax@18 | |
1901 unsigned int v11; // eax@19 | |
1902 unsigned int v12; // esi@19 | |
1903 unsigned int v13; // eax@23 | |
1904 IconFrame *v14; // eax@24 | |
1905 unsigned int v15; // eax@26 | |
1906 char pContainer[20]; // [sp+Ch] [bp-30h]@18 | |
1907 unsigned int v17; // [sp+20h] [bp-1Ch]@19 | |
1908 signed int uFrameID; // [sp+24h] [bp-18h]@19 | |
1909 //int i; // [sp+28h] [bp-14h]@15 | |
1910 unsigned int v20; // [sp+2Ch] [bp-10h]@20 | |
1911 unsigned int v21; // [sp+30h] [bp-Ch]@19 | |
1912 int v22; // [sp+34h] [bp-8h]@2 | |
1913 unsigned __int8 v23; // [sp+3Bh] [bp-1h]@2 | |
1914 | |
1915 if ( bNoNPCHiring != 1 ) | |
1916 { | |
1917 v23 = 0; | |
1918 v22 = 0; | |
1919 /*for (uint i = 0; i < 2; ++i) | |
1920 { | |
1921 if (pParty->pHirelings[i].pName) | |
1922 pTmpBuf[v22++] = i; | |
1923 }*/ | |
1924 if (pParty->pHirelings[0].pName) | |
1925 pTmpBuf[v22++] = 0; | |
1926 if (pParty->pHirelings[1].pName) | |
1927 pTmpBuf[v22++] = 1; | |
1928 | |
1929 for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) | |
1930 { | |
1931 if (pNPCStats->pNewNPCData[i].uFlags & 128) | |
1932 { | |
1933 if (!pParty->pHirelings[0].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[0].pName)) | |
1934 { | |
1935 if (!pParty->pHirelings[1].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[1].pName)) | |
1936 pTmpBuf[v22++] = i + 2; | |
1937 } | |
1938 } | |
1939 } | |
1940 | |
1941 //v6 = (unsigned __int8)pParty->field_709; | |
1942 for ( int i = (unsigned __int8)pParty->field_709; i < v22 && v23 < 2; i++ ) | |
1943 { | |
1944 v7 = pTmpBuf[i]; | |
1945 if ( (unsigned __int8)v7 >= 2 ) | |
1946 { | |
1947 sprintf(pContainer, "NPC%03d", pNPCStats->pNPCData[(unsigned __int8)v7 + 499].uPortraitID); | |
1948 v15 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); | |
948 | 1949 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[v23], pHiredNPCsIconsOffsetsY[v23], pIcons_LOD->GetTexture(v15)); |
706 | 1950 } |
1951 else | |
1952 { | |
1953 sprintf(pContainer, "NPC%03d", pParty->pHirelings[(unsigned __int8)v7].uPortraitID); | |
1954 v8 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); | |
1955 v9 = v23; | |
948 | 1956 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[v9], pHiredNPCsIconsOffsetsY[v9], pIcons_LOD->GetTexture(v8)); |
706 | 1957 v10 = (unsigned __int8)pTmpBuf[i]; |
1958 if ( pParty->pHirelings[v10].evt_A == 1 ) | |
1959 { | |
1960 uFrameID = pParty->pHirelings[v10].evt_B; | |
1961 v11 = pHiredNPCsIconsOffsetsX[v9]; | |
1962 v12 = pHiredNPCsIconsOffsetsY[v9]; | |
1963 v17 = v11; | |
1964 v21 = 0; | |
1965 if ( (signed int)pIconsFrameTable->uNumIcons <= 0 ) | |
1966 { | |
1967 LABEL_23: | |
1968 v13 = 0; | |
1969 } | |
1970 else | |
1971 { | |
1972 v20 = 0; | |
1973 while ( _strcmpi("spell96", pIconsFrameTable->pIcons[v20 / 0x20].pAnimationName) ) | |
1974 { | |
1975 ++v21; | |
1976 v20 += 32; | |
1977 if ( (signed int)v21 >= (signed int)pIconsFrameTable->uNumIcons ) | |
1978 goto LABEL_23; | |
1979 } | |
1980 v13 = v21; | |
1981 } | |
1982 v14 = pIconsFrameTable->GetFrame(v13, uFrameID); | |
1983 pRenderer->DrawTextureTransparent(v17, v12, &pIcons_LOD->pTextures[v14->uTextureID]); | |
1984 } | |
1985 } | |
1986 ++v23; | |
1987 } | |
1988 } | |
1989 } | |
1990 // 6BE3C5: using guessed type char bNoNPCHiring; | |
1991 |