Mercurial > mm7
annotate UI/UiGame.cpp @ 1477:7ef4b64f6329
* LODFile::LoadBitmaps & LODFile::LoadIconsOrEvents are merged into LODFile::Load
Added support for most of mm6 resources, placeholders for mm8 resources.
Fixed few C4258
author | Nomad |
---|---|
date | Wed, 28 Aug 2013 18:43:07 +0200 |
parents | c987b5ed09af |
children | cb396f55671e 6306a33af531 |
rev | line source |
---|---|
1298 | 1 #ifdef _MSC_VER |
2 #define _CRT_SECURE_NO_WARNINGS | |
3 #endif | |
4 | |
5 #include <assert.h> | |
6 | |
1299 | 7 #include "..\Texture.h" |
8 #include "..\MM7.h" | |
1298 | 9 |
1299 | 10 #include "..\Mouse.h" |
11 #include "..\Keyboard.h" | |
12 #include "..\mm7_data.h" | |
1298 | 13 |
1299 | 14 #include "..\Vis.h" |
15 #include "..\MapInfo.h" | |
16 #include "..\Game.h" | |
17 #include "..\GUIWindow.h" | |
18 #include "..\GUIFont.h" | |
19 #include "..\Party.h" | |
20 #include "..\AudioPlayer.h" | |
21 #include "..\Outdoor.h" | |
22 #include "..\LOD.h" | |
23 #include "..\Actor.h" | |
24 #include "..\Viewport.h" | |
25 #include "..\SpriteObject.h" | |
26 #include "..\ObjectList.h" | |
27 #include "..\DecorationList.h" | |
28 #include "..\PlayerFrameTable.h" | |
29 #include "..\stru123.h" | |
30 #include "..\Time.h" | |
31 #include "..\IconFrameTable.h" | |
32 #include "..\TurnEngine.h" | |
33 #include "..\texts.h" | |
1298 | 34 #include "UIHouses.h" |
1299 | 35 #include "..\BSPModel.h" |
1298 | 36 |
37 | |
38 | |
39 | |
40 | |
41 int uTextureID_GameUI_CharSelectionFrame; // 50C98C | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 //----- (00421D00) -------------------------------------------------------- | |
48 void __fastcall GameUI_OnPlayerPortraitLeftClick(unsigned int uPlayerID) | |
49 { | |
50 //unsigned int v1; // esi@1 | |
51 //int v2; // eax@2 | |
52 //Player *v3; // ecx@2 | |
53 //Player *v4; // ecx@5 | |
54 unsigned int v5; // [sp-4h] [bp-10h]@21 | |
55 | |
56 //v1 = uPlayerID; | |
57 auto player = &pParty->pPlayers[uPlayerID - 1]; | |
58 if (pParty->pPickedItem.uItemID) | |
59 { | |
60 //v3 = player; | |
61 if (auto slot = player->AddItem(-1, pParty->pPickedItem.uItemID)) | |
62 { | |
1384
b51332ab228f
changed a few member variables in Player to slightly less confusing names
Grumpy7
parents:
1362
diff
changeset
|
63 memcpy(&player->pInventoryItemList[slot-1], &pParty->pPickedItem, 0x24u); |
1298 | 64 viewparams->bRedrawGameUI = true; |
65 pMouse->RemoveHoldingItem(); | |
66 return; | |
67 } | |
68 | |
69 if (!player->CanAct()) | |
70 { | |
71 player = pPlayers[uActiveCharacter]; | |
72 } | |
73 if(player->CanAct() || !pPlayers[uActiveCharacter]->CanAct()) | |
74 player->PlaySound(SPEECH_NoRoom, 0); | |
75 } | |
76 | |
77 //LABEL_9: | |
78 if (pCurrentScreen == SCREEN_GAME) | |
79 { | |
80 viewparams->bRedrawGameUI = true; | |
81 if ( uActiveCharacter != uPlayerID ) | |
82 //goto LABEL_27; | |
83 { | |
84 if ( pPlayers[uPlayerID]->uTimeToRecovery ) | |
85 return; | |
86 | |
87 uActiveCharacter = uPlayerID; | |
88 return; | |
89 } | |
90 v5 = 7; | |
91 //LABEL_22: | |
92 pGUIWindow_CurrentMenu = CharacterUI_Initialize(v5); | |
93 return; | |
94 } | |
95 if ( pCurrentScreen == SCREEN_SPELL_BOOK ) | |
96 return; | |
97 if ( pCurrentScreen == SCREEN_CHEST ) | |
98 { | |
99 //LABEL_23: | |
100 viewparams->bRedrawGameUI = true; | |
101 if ( uActiveCharacter == uPlayerID ) | |
102 { | |
103 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; | |
104 pCurrentScreen = SCREEN_CHEST_INVENTORY; | |
105 //goto LABEL_28; | |
106 uActiveCharacter = uPlayerID; | |
107 return; | |
108 } | |
109 //LABEL_27: | |
110 if ( pPlayers[uPlayerID]->uTimeToRecovery ) | |
111 return; | |
112 //goto LABEL_28; | |
113 uActiveCharacter = uPlayerID; | |
114 return; | |
115 } | |
116 if ( pCurrentScreen != SCREEN_HOUSE ) | |
117 { | |
118 if ( pCurrentScreen == SCREEN_E ) | |
119 { | |
120 //LABEL_28: | |
121 uActiveCharacter = uPlayerID; | |
122 return; | |
123 } | |
124 if ( pCurrentScreen != SCREEN_CHEST_INVENTORY ) | |
125 { | |
126 viewparams->bRedrawGameUI = true; | |
127 uActiveCharacter = uPlayerID; | |
128 if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 102 ) | |
129 FillAwardsData(); | |
130 return; | |
131 } | |
132 //goto LABEL_23; | |
133 viewparams->bRedrawGameUI = true; | |
134 if ( uActiveCharacter == uPlayerID ) | |
135 { | |
136 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; | |
137 pCurrentScreen = SCREEN_CHEST_INVENTORY; | |
138 //goto LABEL_28; | |
139 uActiveCharacter = uPlayerID; | |
140 return; | |
141 } | |
142 //LABEL_27: | |
143 if ( pPlayers[uPlayerID]->uTimeToRecovery ) | |
144 return; | |
145 //goto LABEL_28; | |
146 uActiveCharacter = uPlayerID; | |
147 return; | |
148 } | |
149 if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS) | |
150 return; | |
151 viewparams->bRedrawGameUI = true; | |
152 if ( uActiveCharacter != uPlayerID ) | |
153 //goto LABEL_28; | |
154 uActiveCharacter = uPlayerID; | |
155 return; | |
156 if (dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD || dialog_menu_id == HOUSE_DIALOGUE_SHOP_6) | |
157 { | |
158 __debugbreak(); // fix indexing | |
159 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; | |
160 v5 = 14; | |
161 //goto LABEL_22; | |
162 pGUIWindow_CurrentMenu = CharacterUI_Initialize(v5); | |
163 return; | |
164 } | |
165 } | |
166 // 4E28F8: using guessed type int pCurrentScreen; | |
167 // F8B19C: using guessed type int dword_F8B19C; | |
168 | |
169 //----- (00416B01) -------------------------------------------------------- | |
170 void GameUI_DrawNPCPopup(void *_this)//PopupWindowForBenefitAndJoinText | |
171 { | |
172 int v1; // edi@2 | |
173 int v2; // ecx@2 | |
174 NPCData *v3; // eax@2 | |
175 NPCData *v4; // esi@7 | |
176 NPCData *v5; // eax@16 | |
177 NPCData *v6; // esi@16 | |
178 const CHAR *v7; // eax@18 | |
179 unsigned int v8; // eax@25 | |
180 unsigned int v9; // eax@25 | |
181 const char *v10; // ST14_4@26 | |
182 char *v11; // esi@26 | |
183 const char *v12; // ST18_4@27 | |
184 unsigned __int16 v13; // ax@28 | |
185 char *v14; // eax@28 | |
186 GUIWindow a1; // [sp+Ch] [bp-60h]@23 | |
187 int a2; // [sp+60h] [bp-Ch]@16 | |
188 void *v17; // [sp+64h] [bp-8h]@1 | |
189 LPCSTR lpsz; // [sp+68h] [bp-4h]@6 | |
190 | |
191 v17 = _this; | |
192 if ( bNoNPCHiring != 1 ) | |
193 { | |
194 v1 = 0; | |
195 v2 = 0; | |
196 v3 = pParty->pHirelings; | |
197 /*do | |
198 { | |
199 if ( v3->pName ) | |
200 pTmpBuf[v1++] = v2; | |
201 ++v3; | |
202 ++v2; | |
203 } | |
204 while ( (signed int)v3 < (signed int)&pParty->pPickedItem );*/ | |
205 for (int i = 0; i < 2; ++i) | |
206 { | |
207 if (pParty->pHirelings[i].pName) | |
208 pTmpBuf[v1++] = i; | |
209 } | |
210 lpsz = 0; | |
211 if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) | |
212 { | |
213 /*v4 = pNPCStats->pNewNPCData; | |
214 do | |
215 { | |
216 if ( v4->uFlags & 0x80 | |
217 && (!pParty->pHirelings[0].pName || strcmp(v4->pName, pParty->pHirelings[0].pName)) | |
218 && (!pParty->pHirelings[1].pName || strcmp(v4->pName, pParty->pHirelings[1].pName)) ) | |
219 pTmpBuf[v1++] = (char)lpsz + 2; | |
220 ++lpsz; | |
221 ++v4; | |
222 } | |
223 while ( (signed int)lpsz < (signed int)pNPCStats->uNumNewNPCs );*/ | |
224 for (int i = 0; i < pNPCStats->uNumNewNPCs; ++i) | |
225 { | |
226 if (pNPCStats->pNewNPCData[i].Hired()) | |
227 { | |
228 if (!pParty->pHirelings[0].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[0].pName)) | |
229 { | |
230 if (!pParty->pHirelings[1].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[1].pName)) | |
231 pTmpBuf[v1++] = i + 2; | |
232 } | |
233 } | |
234 } | |
235 } | |
236 if ( (signed int)((char *)v17 + (unsigned __int8)pParty->field_709) < v1 ) | |
237 { | |
238 sDialogue_SpeakingActorNPC_ID = -1 - (unsigned __int8)pParty->field_709 - (int)v17; | |
239 v5 = GetNewNPCData(sDialogue_SpeakingActorNPC_ID, &a2); | |
240 v6 = v5; | |
241 if ( v5 ) | |
242 { | |
243 if ( a2 == 57 ) | |
244 v7 = pNPCTopics[512].pText; // Baby dragon | |
245 else | |
246 v7 = (const CHAR *)pNPCStats->pProfessions[v5->uProfession].pBenefits; | |
247 lpsz = v7; | |
248 if ( !v7 ) | |
249 { | |
250 lpsz = (LPCSTR)pNPCStats->pProfessions[v5->uProfession].pJoinText; | |
251 if ( !lpsz ) | |
252 lpsz = ""; | |
253 } | |
254 a1.Hint = 0; | |
255 a1.uFrameX = 38; | |
256 a1.uFrameY = 60; | |
257 a1.uFrameWidth = 276; | |
258 a1.uFrameZ = 313; | |
259 a1.uFrameHeight = pFontArrus->CalcTextHeight(lpsz, &a1, 0, 0) | |
260 + 2 * LOBYTE(pFontArrus->uFontHeight) | |
261 + 24; | |
262 if ( (signed int)a1.uFrameHeight < 130 ) | |
263 a1.uFrameHeight = 130; | |
264 a1.uFrameWidth = 400; | |
265 a1.uFrameZ = a1.uFrameX + 399; | |
266 a1.DrawMessageBox(0); | |
267 sprintfex(pTmpBuf2.data(), "NPC%03d", v6->uPortraitID); | |
268 v8 = pIcons_LOD->LoadTexture(pTmpBuf2.data(), TEXTURE_16BIT_PALETTE); | |
269 pRenderer->DrawTextureIndexed( | |
270 a1.uFrameX + 22, | |
271 a1.uFrameY + 36, | |
272 (Texture *)(v8 != -1 ? &pIcons_LOD->pTextures[v8] : 0)); | |
273 v9 = v6->uProfession; | |
274 if ( v9 ) | |
275 { | |
276 v10 = v6->pName; | |
277 v11 = pTmpBuf.data(); | |
278 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], v10, aNPCProfessionNames[v9]); | |
279 } | |
280 else | |
281 { | |
282 v12 = v6->pName; | |
283 v11 = pTmpBuf.data(); | |
284 strcpy(pTmpBuf.data(), v12); | |
285 } | |
286 v13 = TargetColor(0xFFu, 0xFFu, 0x9Bu); | |
287 a1.DrawTitleText(pFontArrus, 0, 0xCu, v13, v11, 3u); | |
288 a1.uFrameWidth -= 24; | |
289 a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1; | |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
290 v14 = BuildDialogueString((char *)lpsz, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 291 a1.DrawText(pFontArrus, 100, 36, 0, v14, 0, 0, 0); |
292 } | |
293 } | |
294 } | |
295 } | |
296 | |
297 | |
298 | |
299 //----- (00445D4A) -------------------------------------------------------- | |
300 void GameUI_InitializeDialogue(Actor *actor, int bPlayerSaysHello) | |
301 { | |
302 NPCData *pNPCInfo; // ebp@1 | |
303 int v9; // esi@8 | |
304 int pNumberContacts; // eax@11 | |
305 char pContainer[32]; // [sp+14h] [bp-28h]@3 | |
306 | |
307 dword_A74CDC = -1; | |
308 dword_AE336C = -1; | |
309 pEventTimer->Pause(); | |
310 pMiscTimer->Pause(); | |
311 pAudioPlayer->StopChannels(-1, -1); | |
312 uDialogueType = 0; | |
313 sDialogue_SpeakingActorNPC_ID = actor->sNPC_ID; | |
314 pDialogue_SpeakingActor = actor; | |
315 pNPCInfo = GetNPCData(actor->sNPC_ID); | |
316 if ( (pNPCInfo->uFlags & 3) != 2 ) | |
317 pNPCInfo->uFlags = pNPCInfo->uFlags + 1; | |
318 | |
319 switch (pParty->alignment) | |
320 { | |
321 case PartyAlignment_Good: sprintfex(pContainer, "evt%02d-b", const_2()); break; | |
322 case PartyAlignment_Neutral: sprintfex(pContainer, "evt%02d", const_2()); break; | |
323 case PartyAlignment_Evil: sprintfex(pContainer, "evt%02d-c", const_2()); break; | |
324 } | |
325 | |
326 pDialogueNPCCount = 0; | |
327 uNumDialogueNPCPortraits = 1; | |
328 pTexture_Dialogue_Background = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE); | |
329 sprintfex(pContainer, "npc%03u", pNPCInfo->uPortraitID); | |
330 v9 = 0; | |
331 pDialogueNPCPortraits[0] = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE); | |
332 dword_591084 = areWeLoadingTexture; | |
333 uTextureID_right_panel_loop = uTextureID_right_panel; | |
334 if ( !pNPCInfo->Hired() && pNPCInfo->Location2D >= 0 ) | |
335 { | |
336 if ( (signed int)pParty->GetPartyFame() <= pNPCInfo->fame | |
337 || (pNumberContacts = pNPCInfo->uFlags & 0xFFFFFF7F, (pNumberContacts & 0x80000000u) != 0) ) | |
338 { | |
339 v9 = 1; | |
340 } | |
341 else | |
342 { | |
343 if ( pNumberContacts > 1 ) | |
344 { | |
345 if ( pNumberContacts == 2 ) | |
346 { | |
347 v9 = 3; | |
348 } | |
349 else | |
350 { | |
351 if ( pNumberContacts != 3 ) | |
352 { | |
353 if ( pNumberContacts != 4 ) | |
354 v9 = 1; | |
355 } | |
356 else | |
357 { | |
358 v9 = 2; | |
359 } | |
360 } | |
361 } | |
362 else if ( pNPCInfo->rep ) | |
363 { | |
364 v9 = 2; | |
365 } | |
366 } | |
367 } | |
368 if (sDialogue_SpeakingActorNPC_ID < 0) | |
369 v9 = 4; | |
370 pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, WINDOW_Dialogue, v9, 0);//pNumberContacts = 1, v9 = 0; pNumberContacts = 2, v9 = 3; | |
371 if (pNPCInfo->Hired()) | |
372 { | |
373 if ( !pNPCInfo->bHasUsedTheAbility ) | |
374 { | |
375 if ( pNPCInfo->uProfession >= 10 ) | |
376 { | |
377 if ( pNPCInfo->uProfession <= 12 || pNPCInfo->uProfession > 32 && (pNPCInfo->uProfession <= 34 | |
378 || pNPCInfo->uProfession > 38 && (pNPCInfo->uProfession <= 43 || pNPCInfo->uProfession == 52)) ) | |
379 { | |
380 pDialogueWindow->CreateButton(480, 250, 140, LOBYTE(pFontArrus->uFontHeight) - 3, 1, 0, UIMSG_SelectNPCDialogueOption, 9, 0, "", 0); | |
381 pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 1); | |
382 } | |
383 } | |
384 } | |
385 } | |
386 | |
387 pDialogueWindow->CreateButton( 61, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0); | |
388 pDialogueWindow->CreateButton(177, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0); | |
389 pDialogueWindow->CreateButton(292, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0); | |
390 pDialogueWindow->CreateButton(407, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0); | |
391 | |
392 if (bPlayerSaysHello && uActiveCharacter && !pNPCInfo->Hired()) | |
393 { | |
394 if (pParty->uCurrentHour < 5 || pParty->uCurrentHour > 21) | |
395 pPlayers[uActiveCharacter]->PlaySound(SPEECH_GoodEvening, 0); | |
396 else | |
397 pPlayers[uActiveCharacter]->PlaySound(SPEECH_GoodDay, 0); | |
398 } | |
399 } | |
400 | |
401 //----- (00445350) -------------------------------------------------------- | |
402 void GameUI_DrawDialogue() | |
403 { | |
404 NPCData *pNPC; // ebx@2 | |
405 int pGreetType; // eax@2 | |
1393 | 406 //unsigned __int16 v2; // di@2 |
1298 | 407 //unsigned int v3; // eax@2 |
408 char *v4; // esi@3 | |
409 //int v5; // eax@11 | |
410 //char *v6; // ecx@13 | |
411 //char *v7; // eax@16 | |
412 //unsigned int v8; // edi@19 | |
413 //char *v9; // ecx@27 | |
414 char *v10; // eax@29 | |
415 //int v11; // eax@30 | |
416 int v12; // esi@39 | |
417 char *v13; // eax@41 | |
418 GUIButton *v14; // eax@43 | |
419 //GUIButton *v15; // edi@43 | |
420 signed int v16; // eax@44 | |
421 //unsigned int v23; // eax@53 | |
422 //const char *v24; // eax@59 | |
423 //unsigned __int16 v30; // cx@83 | |
424 int v31; // ecx@86 | |
425 int v32; // ebx@93 | |
1393 | 426 //unsigned int v33; // eax@93 |
1298 | 427 GUIWindow *v34; // ecx@93 |
428 int v35; // esi@93 | |
429 int i; // eax@93 | |
430 GUIButton *v37; // eax@94 | |
431 int v38; // eax@95 | |
432 signed int v39; // esi@99 | |
433 signed int v40; // eax@102 | |
434 unsigned int v41; // ebx@102 | |
435 int v42; // edi@102 | |
436 GUIButton *v43; // esi@103 | |
437 int v44; // eax@104 | |
438 unsigned int v45; // ecx@104 | |
439 unsigned __int16 *v46; // edx@104 | |
440 unsigned __int16 v47; // ax@104 | |
441 GUIWindow pWindow; // [sp+4h] [bp-110h]@39 | |
442 int v49; // [sp+Ch] [bp-108h]@39 | |
443 int v50; // [sp+14h] [bp-100h]@39 | |
444 GUIWindow v51; // [sp+58h] [bp-BCh]@2 | |
445 GUIWindow v52; // [sp+ACh] [bp-68h]@42 | |
446 char *Str; // [sp+100h] [bp-14h]@104 | |
447 //int v54; // [sp+104h] [bp-10h]@2 | |
448 //unsigned __int16 *v55; // [sp+108h] [bp-Ch]@82 | |
449 GUIFont *pOutString; // [sp+10Ch] [bp-8h]@39 | |
450 char *pInString=NULL; // [sp+110h] [bp-4h]@32 | |
451 | |
452 if ( !pDialogueWindow ) | |
453 return; | |
454 | |
455 memcpy(&v51, pDialogueWindow, sizeof(v51)); | |
456 pNPC = GetNPCData(sDialogue_SpeakingActorNPC_ID); | |
457 pGreetType = GetGreetType(sDialogue_SpeakingActorNPC_ID); | |
458 v51.uFrameWidth -= 10; | |
459 v51.uFrameZ -= 10; | |
460 //v54 = v1; | |
1393 | 461 //TargetColor(0xFFu, 0xFFu, 0xFFu); |
462 //TargetColor(0xE1u, 0xCDu, 0x23u); | |
463 //v2 = TargetColor(0x15u, 0x99u, 0xE9u); | |
1298 | 464 pRenderer->DrawTextureIndexed(477, 0, pTexture_Dialogue_Background); |
465 pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_right_panel_loop != -1 ? &pIcons_LOD->pTextures[uTextureID_right_panel_loop] : 0)); | |
466 pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0] - 4, pNPCPortraits_y[0][0] - 4, (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0)); | |
467 pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pDialogueNPCPortraits[0]); | |
468 | |
469 if (pNPC->uProfession) | |
470 { | |
471 assert(pNPC->uProfession < sizeof(aNPCProfessionNames) / sizeof(*aNPCProfessionNames.data())); // sometimes buffer overflows; errors emerge both here and in dialogue text | |
472 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], pNPC->pName, aNPCProfessionNames[pNPC->uProfession]);//^Pi[%s] %s | |
473 } | |
474 else | |
475 strcpy(pTmpBuf.data(), pNPC->pName); | |
476 | |
1393 | 477 v51.DrawTitleText(pFontArrus, 483, 112, ui_game_dialogue_npc_name_color, pTmpBuf.data(), 3); |
1298 | 478 pParty->GetPartyFame(); |
479 | |
480 pInString = nullptr; | |
481 switch (uDialogueType) | |
482 { | |
483 case DIALOGUE_13: | |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
484 pInString = BuildDialogueString(pNPCStats->pProfessions[pNPC->uProfession - 1].pJoinText, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 485 break; |
486 | |
487 case DIALOGUE_PROFESSION_DETAILS: | |
488 { | |
489 auto prof = pNPCStats->pProfessions + pNPC->uProfession - 1; | |
490 | |
491 if (dialogue_show_profession_details) | |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
492 pInString = BuildDialogueString(prof->pBenefits, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 493 else if (pNPC->Hired()) |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
494 pInString = BuildDialogueString(prof->pDismissText, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 495 else |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
496 pInString = BuildDialogueString(prof->pJoinText, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 497 } |
498 break; | |
499 | |
500 | |
501 case DIALOGUE_ARENA_WELCOME: | |
502 pInString = pGlobalTXT_LocalizationStrings[574]; // "Welcome to the Arena of Life and Death. Remember, you are only allowed one arena combat per visit. To fight an arena battle, select the option that best describes your abilities and return to me- if you survive:" | |
503 break; | |
504 | |
505 case DIALOGUE_ARENA_FIGHT_NOT_OVER_YET: | |
506 pInString = pGlobalTXT_LocalizationStrings[577]; //"Get back in there you wimps:" | |
507 break; | |
508 | |
509 case DIALOGUE_ARENA_REWARD: | |
510 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[576], gold_transaction_amount);// "Congratulations on your win: here's your stuff: %u gold." | |
511 pInString = pTmpBuf.data(); | |
512 break; | |
513 | |
514 case DIALOGUE_ARENA_ALREADY_WON: | |
515 pInString = pGlobalTXT_LocalizationStrings[582]; // "You already won this trip to the Arena:" | |
516 break; | |
517 | |
518 default: | |
519 if (uDialogueType > DIALOGUE_18 && uDialogueType < DIALOGUE_23 && !byte_5B0938[0]) | |
520 { | |
521 pInString = (char *)current_npc_text; | |
522 } | |
523 else if (pGreetType == 1)//QuestNPC_greet | |
524 { | |
525 if (pNPC->greet) | |
526 { | |
527 if ((pNPC->uFlags & 3) == 2) | |
528 pInString = pNPCStats->pNPCGreetings[pNPC->greet - 1].pGreeting2; | |
529 else | |
530 pInString = pNPCStats->pNPCGreetings[pNPC->greet - 1].pGreeting1; | |
531 } | |
532 } | |
533 else if (pGreetType == 2)//HiredNPC_greet | |
534 { | |
535 auto prof = pNPCStats->pProfessions + pNPC->uProfession - 1; | |
536 | |
537 if (pNPC->Hired()) | |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
538 pInString = BuildDialogueString(prof->pDismissText, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 539 else |
1410
38df78aba732
deleted stru220.h and stru220 (bezier terrain stuff)
Nomad
parents:
1407
diff
changeset
|
540 pInString = BuildDialogueString(prof->pJoinText, uActiveCharacter - 1, 0, 0, 0, 0); |
1298 | 541 } |
542 break; | |
543 } | |
544 | |
545 if (pInString) | |
546 { | |
547 pWindow.uFrameWidth = game_viewport_width; | |
548 pWindow.uFrameZ = 452; | |
549 auto font = pFontArrus; | |
550 v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, 0) + 7; | |
551 if ( 352 - v12 < 8 ) | |
552 { | |
553 font = pFontCreate; | |
554 v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, 0) + 7; | |
555 } | |
556 if (uTextureID_Leather != -1) | |
557 pRenderer->_4A6A68(8, 352 - v12, &pIcons_LOD->pTextures[uTextureID_Leather], pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight - v12); | |
558 pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); | |
559 v13 = FitTextInAWindow(pInString, font, &pWindow, 0xDu, 0); | |
560 pDialogueWindow->DrawText(font, 13, 354 - v12, 0, v13, 0, 0, 0); | |
561 } | |
562 | |
563 | |
564 memcpy(&v52, pDialogueWindow, sizeof(v52)); | |
565 v52.uFrameX = 483; | |
566 v52.uFrameWidth = 148; | |
567 v52.uFrameZ = 334; | |
568 for (int i = v52.pStartingPosActiveItem; | |
569 i < v52.pStartingPosActiveItem + v52.pNumPresenceButton; ++i) | |
570 { | |
571 v14 = v52.GetControl(i); | |
572 //v15 = v14; | |
573 if ( !v14 ) | |
574 break; | |
575 v16 = v14->msg_param; | |
576 | |
577 if ( v16 > 88 ) | |
578 v14->pButtonName[0] = 0; | |
579 else if (v16 == 88) | |
580 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[581]); // Lord | |
581 else if (v16 == 87) | |
582 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[580]); // Knight | |
583 else if (v16 == 86) | |
584 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[579]); // Squire | |
585 else if (v16 == 85) | |
586 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[578]); // Page | |
587 else if (v16 == 77) | |
588 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[407]); // Details | |
589 else if (v16 == 76) | |
590 { | |
591 if (pNPC->Hired()) | |
592 sprintf(v14->pButtonName, (const char*)pGlobalTXT_LocalizationStrings[408], pNPC->pName); // Release %s | |
593 else | |
594 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[406]); // Hire | |
595 } | |
596 else if (v16 == 24) | |
597 { | |
598 __debugbreak(); // learn conditions of this event | |
599 auto topic = pNPCTopics[pNPC->evt_F - 1].pTopic;//(&dword_721660)[8 * v23]; | |
600 if (!topic) | |
601 { | |
602 v14->pButtonName[0] = 0; | |
603 v14->msg_param = 0; | |
604 } | |
605 else | |
606 strcpy(v14->pButtonName, topic); | |
607 } | |
608 else if (v16 == 9) | |
609 strcpy(v14->pButtonName, GetProfessionActionText(pNPC->uProfession)); | |
610 else if (v16 == 19) | |
611 { | |
612 // __debugbreak(); // learn conditions of this event Scavenger Hunt | |
613 auto topic = pNPCTopics[pNPC->evt_A - 1].pTopic;//(&dword_721660)[8 * v23]; | |
614 if (!topic) | |
615 { | |
616 v14->pButtonName[0] = 0; | |
617 v14->msg_param = 0; | |
618 } | |
619 else strcpy(v14->pButtonName, topic); | |
620 } | |
621 else if (v16 == 20) | |
622 { | |
623 //__debugbreak(); // learn conditions of this event instruments | |
624 auto topic = pNPCTopics[pNPC->evt_B - 1].pTopic;//(&dword_721660)[8 * v23]; | |
625 if (!topic) | |
626 { | |
627 v14->pButtonName[0] = 0; | |
628 v14->msg_param = 0; | |
629 } | |
630 else strcpy(v14->pButtonName, topic); | |
631 } | |
632 else if (v16 == 21) | |
633 { | |
634 //__debugbreak(); // learn conditions of this event | |
635 auto topic = pNPCTopics[pNPC->evt_C - 1].pTopic;//(&dword_721660)[8 * v23]; | |
636 if (!topic) | |
637 { | |
638 v14->pButtonName[0] = 0; | |
639 v14->msg_param = 0; | |
640 } | |
641 else strcpy(v14->pButtonName, topic); | |
642 } | |
643 else if (v16 == 22) | |
644 { | |
645 //__debugbreak(); // learn conditions of this event | |
646 auto topic = pNPCTopics[pNPC->evt_D - 1].pTopic;//(&dword_721660)[8 * v23]; | |
647 if (!topic) | |
648 { | |
649 v14->pButtonName[0] = 0; | |
650 v14->msg_param = 0; | |
651 } | |
652 else strcpy(v14->pButtonName, topic); | |
653 } | |
654 else if (v16 == 23) | |
655 { | |
656 //__debugbreak(); // learn conditions of this event | |
657 auto topic = pNPCTopics[pNPC->evt_E - 1].pTopic;//(&dword_721660)[8 * v23]; | |
658 if (!topic) | |
659 { | |
660 v14->pButtonName[0] = 0; | |
661 v14->msg_param = 0; | |
662 } | |
663 else strcpy(v14->pButtonName, topic); | |
664 } | |
665 else if (v16 == 13) | |
666 { | |
667 if (pNPC->Hired()) | |
668 sprintf(v14->pButtonName, pGlobalTXT_LocalizationStrings[408], pNPC->pName); // Release %s | |
669 else | |
670 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[122]); // Join | |
671 } | |
672 else | |
673 v14->pButtonName[0] = 0; | |
674 | |
675 | |
676 if (pParty->field_7B5_in_arena_quest && pParty->field_7B5_in_arena_quest != -1) | |
677 { | |
678 int num_dead_actors = 0; | |
679 pInString = 0; | |
680 for (uint i = 0; i < uNumActors; ++i) | |
681 { | |
682 if (pActors[i].uAIState == Dead || pActors[i].uAIState == Removed || | |
683 pActors[i].uAIState == Disabled) | |
684 ++num_dead_actors; | |
685 else | |
686 { | |
687 int sumonner_type = PID_TYPE(pActors[i].uSummonerID); | |
688 if (sumonner_type == OBJECT_Player) | |
689 ++num_dead_actors; | |
690 } | |
691 } | |
692 if (num_dead_actors == uNumActors) | |
693 strcpy(v14->pButtonName, pGlobalTXT_LocalizationStrings[658]); // Collect Prize | |
694 } | |
695 } | |
696 | |
697 | |
698 v32 = 0; | |
699 v34 = pDialogueWindow; | |
700 //v54 = v33; | |
701 v35 = pDialogueWindow->pStartingPosActiveItem; | |
702 for ( i = v35 + pDialogueWindow->pNumPresenceButton; v35 < i; i = pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ) | |
703 { | |
704 v37 = v34->GetControl(v35); | |
705 if ( !v37 ) | |
706 { | |
707 v34 = pDialogueWindow; | |
708 break; | |
709 } | |
710 v38 = pFontArrus->CalcTextHeight(v37->pButtonName, &v52, 0, 0); | |
711 v34 = pDialogueWindow; | |
712 v32 += v38; | |
713 ++v35; | |
714 } | |
715 v39 = v34->pNumPresenceButton; | |
716 if ( v39 ) | |
717 { | |
718 pOutString = (GUIFont *)((174 - v32) / v39); | |
719 if ( (174 - v32) / v39 > 32 ) | |
720 pOutString = (GUIFont *)32; | |
721 int v55 = 1; | |
722 v40 = 174 - (int)pOutString * v39 - v32; | |
723 v41 = v34->pStartingPosActiveItem; | |
724 v42 = v40 / 2 - (signed int)pOutString / 2 + 138; | |
725 if ( (signed int)v41 < (signed int)(v41 + v39) ) | |
726 { | |
727 do | |
728 { | |
729 v43 = v34->GetControl(v41); | |
730 if ( !v43 ) | |
731 break; | |
732 v43->uY = (unsigned int)((char *)pOutString + v42); | |
733 Str = v43->pButtonName; | |
734 v44 = pFontArrus->CalcTextHeight(v43->pButtonName, &v52, 0, 0); | |
735 v45 = v43->uY; | |
736 v46 = (unsigned short *)v55; | |
737 v43->uHeight = v44; | |
738 v42 = v45 + v44 - 1; | |
739 v43->uW = v42; | |
1393 | 740 v47 = ui_game_dialogue_option_highlight_color; |
1298 | 741 if ( (unsigned __int16 *)pDialogueWindow->pCurrentPosActiveItem != v46 ) |
1393 | 742 v47 = ui_game_dialogue_option_normal_color; |
1298 | 743 v52.DrawTitleText(pFontArrus, 0, v45, v47, Str, 3u); |
744 v34 = pDialogueWindow; | |
745 ++v55; | |
746 ++v41; | |
747 } | |
748 while ( (signed int)v41 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ); | |
749 } | |
750 } | |
751 pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId)); | |
752 } | |
753 | |
754 | |
755 | |
756 //----- (00444FBE) -------------------------------------------------------- | |
757 void GameUI_DrawBranchlessDialogue() | |
758 { | |
759 //GUIFont *v0; // esi@1 | |
760 int v1; // esi@4 | |
761 char *v2; // eax@6 | |
762 int v3; // edi@12 | |
763 char Str[200]; // [sp+Ch] [bp-120h]@12 | |
764 GUIWindow v5; // [sp+D4h] [bp-58h]@4 | |
765 GUIFont *pFont; // [sp+128h] [bp-4h]@1 | |
766 | |
767 pFont = pFontArrus; | |
768 if ( current_npc_text && !byte_5B0938[0] ) | |
769 strcpy(byte_5B0938.data(), current_npc_text); | |
770 v5.uFrameWidth = game_viewport_width; | |
771 v5.uFrameZ = 452; | |
772 v1 = pFontArrus->CalcTextHeight(byte_5B0938.data(), &v5, 12, 0) + 7; | |
773 if ( 352 - v1 < 8 ) | |
774 { | |
775 pFont = pFontCreate; | |
776 v1 = pFontCreate->CalcTextHeight(byte_5B0938.data(), &v5, 12, 0) + 7; | |
777 } | |
778 pRenderer->_4A6A68(8, 352 - v1, | |
779 pIcons_LOD->GetTexture(uTextureID_Leather), | |
780 pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - v1); | |
781 pRenderer->DrawTextureIndexed(8, 347 - v1, pTexture_591428); | |
782 v2 = FitTextInAWindow(byte_5B0938.data(), pFont, &v5, 0xCu, 0); | |
783 pGUIWindow2->DrawText(pFont, 12, 354 - v1, 0, v2, 0, 0, 0); | |
784 pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar); | |
785 if ( pGUIWindow2->receives_keyboard_input_2 != WINDOW_INPUT_IN_PROGRESS) | |
786 { | |
787 if ( pGUIWindow2->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED) | |
788 { | |
789 pGUIWindow2->receives_keyboard_input_2 = WINDOW_INPUT_NONE; | |
790 strcpy(GameUI_Footer_TimedString.data(), (const char *)pKeyActionMap->pPressedKeysBuffer); | |
791 LABEL_16: | |
792 sub_4452BB(); | |
793 return; | |
794 } | |
795 if ( pGUIWindow2->receives_keyboard_input_2 != WINDOW_INPUT_CANCELLED) | |
796 return; | |
797 pGUIWindow2->receives_keyboard_input_2 = WINDOW_INPUT_NONE; | |
798 LABEL_15: | |
799 memset(GameUI_Footer_TimedString.data(), 0, 0xC8u); | |
800 goto LABEL_16; | |
801 } | |
802 if ( pGUIWindow2->ptr_1C == (void *)26 ) | |
803 { | |
804 sprintf(Str, "%s %s", GameUI_Footer_TimedString, pKeyActionMap->pPressedKeysBuffer); | |
805 v3 = pFontLucida->GetLineWidth(Str); | |
806 pGUIWindow2->DrawText(pFontLucida, 13, 357, 0, Str, 0, 0, 0); | |
807 pGUIWindow2->DrawFlashingInputCursor(v3 + 13, 357, pFontLucida); | |
808 return; | |
809 } | |
810 if ( pKeyActionMap->pPressedKeysBuffer[0] ) | |
811 { | |
1459 | 812 pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE); |
1298 | 813 goto LABEL_15; |
814 } | |
815 } | |
816 | |
817 | |
818 //----- (004443D5) -------------------------------------------------------- | |
819 const char *GameUI_GetMinimapHintText() | |
820 { | |
821 int v0; // ST20_4@1 | |
822 unsigned int v1; // esi@1 | |
823 signed int v2; // ebx@1 | |
824 double v3; // st7@1 | |
825 int v4; // esi@3 | |
826 int v5; // edi@4 | |
827 int v6; // eax@4 | |
828 int v7; // eax@4 | |
829 BSPModel *v8; // ecx@4 | |
830 unsigned __int8 v9; // zf@5 | |
831 char v10; // sf@5 | |
832 unsigned __int8 v11; // of@5 | |
833 ODMFace *v12; // eax@6 | |
834 __int16 v13; // cx@6 | |
835 const char *v14; // eax@8 | |
836 const char *v15; // edi@8 | |
837 char *result; // eax@12 | |
838 unsigned int v17; // eax@14 | |
839 unsigned int v18; // [sp+Ch] [bp-20h]@1 | |
840 int v19; // [sp+10h] [bp-1Ch]@1 | |
841 int v20; // [sp+14h] [bp-18h]@1 | |
842 char *v21; // [sp+18h] [bp-14h]@1 | |
843 unsigned int pY; // [sp+1Ch] [bp-10h]@1 | |
844 int v23; // [sp+20h] [bp-Ch]@1 | |
845 int v24; // [sp+24h] [bp-8h]@1 | |
846 int pX; // [sp+28h] [bp-4h]@1 | |
847 | |
848 v24 = pParty->vPosition.x; | |
849 v0 = pParty->vPosition.y; | |
850 v1 = pOutdoor->uNumBModels; | |
851 *(float *)&v23 = (double)(signed int)viewparams->uMinimapZoom * 0.000015258789; | |
852 v2 = 0; | |
853 v18 = pOutdoor->uNumBModels; | |
854 v21 = 0; | |
855 pMouse->GetClickPos((unsigned int *)&pX, &pY); | |
856 v3 = 1.0 / *(float *)&v23; | |
857 v23 = pX - 557; | |
858 v19 = (signed __int64)((double)(pX - 557) * v3 + (double)v24); | |
859 v20 = (signed __int64)((double)v0 - (double)(signed int)(pY - 74) * v3); | |
860 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor || (*(float *)&v23 = 0.0, (signed int)v1 <= 0) ) | |
861 { | |
862 LABEL_14: | |
1477
7ef4b64f6329
* LODFile::LoadBitmaps & LODFile::LoadIconsOrEvents are merged into LODFile::Load
Nomad
parents:
1470
diff
changeset
|
863 v17 = pMapStats->GetMapInfo(pCurrentMapName); |
1298 | 864 if ( v17 == v2 ) |
865 result = "No Maze Info for this maze on file!"; | |
866 else | |
867 result = pMapStats->pInfos[v17].pName; | |
868 } | |
869 else | |
870 { | |
871 v4 = 0; | |
872 while ( 1 ) | |
873 { | |
874 pX = pOutdoor->pBModels[v4].vBoundingCenter.x - v19; | |
875 pY = pOutdoor->pBModels[v4].vBoundingCenter.y - v20; | |
876 v5 = abs((signed)pY); | |
877 v6 = abs((signed)pX); | |
878 v7 = int_get_vector_length(v6, v5, v2); | |
879 v8 = &pOutdoor->pBModels[0]; | |
880 if ( v7 < 2 * pOutdoor->pBModels[v4].sBoundingRadius ) | |
881 { | |
882 v11 = __OFSUB__(pOutdoor->pBModels[v4].uNumFaces, v2); | |
883 v9 = pOutdoor->pBModels[v4].uNumFaces == v2; | |
884 v10 = ((pOutdoor->pBModels[v4].uNumFaces - v2) & 0x80000000u) != 0; | |
885 v24 = v2; | |
886 if ( !((unsigned __int8)(v10 ^ v11) | v9) ) | |
887 { | |
888 do | |
889 { | |
890 v12 = &v8[v4].pFaces[v2 / 0x134u]; | |
891 v13 = v12->sCogTriggeredID; | |
892 if ( v13 ) | |
893 { | |
894 if ( !(BYTE2(v12->uAttributes) & 0x10) ) | |
895 { | |
896 v14 = GetEventHintString(v13); | |
897 v15 = v14; | |
898 if ( v14 ) | |
899 { | |
900 if ( _stricmp(v14, "") ) | |
901 v21 = (char *)v15; | |
902 } | |
903 } | |
904 } | |
905 ++v24; | |
906 v8 = pOutdoor->pBModels; | |
907 v2 += 308; | |
908 } | |
909 while ( v24 < (signed int)pOutdoor->pBModels[v4].uNumFaces ); | |
910 } | |
911 result = v21; | |
912 v2 = 0; | |
913 if ( v21 ) | |
914 break; | |
915 } | |
916 ++v23; | |
917 ++v4; | |
918 if ( v23 >= (signed int)v18 ) | |
919 goto LABEL_14; | |
920 } | |
921 } | |
922 return result; | |
923 } | |
924 | |
925 | |
926 | |
927 | |
928 | |
929 //----- (0041D3B7) -------------------------------------------------------- | |
930 void GameUI_CharacterQuickRecord_Draw(GUIWindow *window, Player *player) | |
931 { | |
932 //Player *pPlayer; // esi@1 | |
933 int v6; // eax@5 | |
934 int v7; // ebx@5 | |
935 //unsigned int v8; // ecx@5 | |
936 int v9; // ebx@5 | |
937 //unsigned int v10; // eax@5 | |
938 //int v11; // eax@5 | |
939 //unsigned int v12; // ecx@5 | |
940 Texture *v13; // eax@6 | |
941 unsigned int v14; // eax@12 | |
942 PlayerFrame *v15; // eax@12 | |
943 //unsigned int v16; // eax@15 | |
944 unsigned int v20; // eax@15 | |
945 unsigned int v24; // eax@15 | |
946 unsigned int v25; // eax@15 | |
947 unsigned __int8 v28; // al@15 | |
948 char *v29; // eax@16 | |
949 __int64 v35; // ST38_8@22 | |
950 int v36; // esi@22 | |
951 unsigned int v38; // eax@22 | |
952 char *v39; // eax@24 | |
953 signed int uFramesetID; // [sp+20h] [bp-8h]@9 | |
954 int uFramesetIDa; // [sp+20h] [bp-8h]@18 | |
955 | |
956 uint numActivePlayerBuffs = 0; | |
957 for (uint i = 0; i < 24; ++i) | |
958 if (player->pPlayerBuffs[i].uExpireTime > 0) | |
959 ++numActivePlayerBuffs; | |
960 | |
961 v6 = pFontArrus->uFontHeight + 162; | |
962 v7 = (numActivePlayerBuffs - 1) * pFontArrus->uFontHeight; | |
963 v9 = v6 + v7; | |
964 window->uFrameHeight = v9; | |
965 window->uFrameZ = window->uFrameWidth + window->uFrameX - 1; | |
966 window->uFrameW = v9 + window->uFrameY - 1; | |
967 window->DrawMessageBox(0); | |
968 | |
1362
d6cf8ead9242
Condition checking functions slightly renamed, some final changes in Player::SetCondition
Grumpy7
parents:
1340
diff
changeset
|
969 if (player->IsEradicated()) |
1298 | 970 v13 = pTexture_PlayerFaceEradicated; |
1362
d6cf8ead9242
Condition checking functions slightly renamed, some final changes in Player::SetCondition
Grumpy7
parents:
1340
diff
changeset
|
971 else if (player->IsDead()) |
1298 | 972 v13 = pTexture_PlayerFaceDead; |
973 else | |
974 { | |
975 uFramesetID = pPlayerFrameTable->GetFrameIdByExpression(player->expression); | |
976 if ( !uFramesetID ) | |
977 uFramesetID = 1; | |
978 if ( player->expression == CHARACTER_EXPRESSION_21) | |
979 { | |
980 v15 = pPlayerFrameTable->GetFrameBy_y(&player->_expression21_frameset, &player->_expression21_animtime, pMiscTimer->uTimeElapsed); | |
981 } | |
982 else | |
983 { | |
984 v14 = pMiscTimer->Time(); | |
985 v15 = pPlayerFrameTable->GetFrameBy_x(uFramesetID, v14); | |
986 } | |
987 player->field_1AA2 = v15->uTextureID - 1; | |
988 v13 = pTextures_PlayerFaces[(unsigned int)window->ptr_1C][v15->uTextureID - 1]; | |
989 } | |
990 | |
991 pRenderer->DrawTextureTransparent(window->uFrameX + 24, window->uFrameY + 24, v13); | |
992 | |
993 sprintfex(pTmpBuf.data(), "\f%05d", ui_character_header_text_color); | |
994 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[429], player->pName, pClassNames[player->classType]); // "%s the %s" | |
995 strcat(pTmpBuf.data(), pTmpBuf2.data()); | |
996 strcat(pTmpBuf.data(), "\f00000\n"); | |
997 | |
998 v20 = UI_GetHealthManaStringColor(player->sHealth, player->GetMaxHealth()); | |
1393 | 999 sprintfex(pTmpBuf2.data(), "%s : \f%05u%d\f00000 / %d\n", |
1000 pGlobalTXT_LocalizationStrings[108], // "Hit Points" | |
1001 v20, player->sHealth, player->GetMaxHealth()); | |
1298 | 1002 strcat(pTmpBuf.data(), pTmpBuf2.data()); |
1003 | |
1004 v24 = UI_GetHealthManaStringColor(player->sMana, player->GetMaxMana()); | |
1393 | 1005 sprintfex(pTmpBuf2.data(), "%s : \f%05u%d\f00000 / %d\n", |
1006 pGlobalTXT_LocalizationStrings[212], // "Spell Points" | |
1007 v24, player->sMana, player->GetMaxMana()); | |
1298 | 1008 strcat(pTmpBuf.data(), pTmpBuf2.data()); |
1009 | |
1010 v25 = player->GetMajorConditionIdx(); | |
1393 | 1011 sprintfex(pTmpBuf2.data(), "%s: \f%05d%s\f00000\n", |
1012 pGlobalTXT_LocalizationStrings[47], // "Condition | |
1013 GetConditionDrawColor(v25), aCharacterConditionNames[v25]); | |
1298 | 1014 strcat(pTmpBuf.data(), pTmpBuf2.data()); |
1015 | |
1016 v28 = player->uQuickSpell; | |
1017 if ( v28 ) | |
1018 v29 = pSpellStats->pInfos[v28].pShortName; | |
1019 else | |
1020 v29 = pGlobalTXT_LocalizationStrings[153]; | |
1021 sprintfex(pTmpBuf2.data(), "%s: %s", pGlobalTXT_LocalizationStrings[172], v29); // "Quick Spell" | |
1022 strcat(pTmpBuf.data(), pTmpBuf2.data()); | |
1023 | |
1024 window->DrawText(pFontArrus, 120, 22, 0, pTmpBuf.data(), 0, 0, 0); | |
1025 | |
1026 uFramesetIDa = 0; | |
1027 for (uint i = 0; i < 24; ++i) | |
1028 { | |
1029 auto buff = player->pPlayerBuffs + i; | |
1030 if (buff->uExpireTime > 0) | |
1031 { | |
1032 v35 = buff->uExpireTime - pParty->uTimePlayed; | |
1033 v36 = uFramesetIDa++ * pFontComic->uFontHeight + 134; | |
1034 v38 = ui_game_character_record_playerbuff_colors[i]; | |
1035 window->DrawText(pFontComic, 52, v36, v38, aSpellNames[20 + i], 0, 0, 0); | |
1036 sub_41D20D_buff_remaining_time_string(v36, window, v35, pFontComic); | |
1037 } | |
1038 } | |
1039 | |
1040 v39 = ""; | |
1041 if ( uFramesetIDa == 0 ) | |
1042 v39 = pGlobalTXT_LocalizationStrings[153]; // "None" | |
1393 | 1043 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[450], v39); // "Active Spells: %s" |
1298 | 1044 window->DrawText(pFontArrus, 14, 114, 0, pTmpBuf.data(), 0, 0, 0); |
1045 } | |
1046 | |
1047 | |
1048 | |
1049 //----- (0041A57E) -------------------------------------------------------- | |
1050 void GameUI_QuickRef_Draw() | |
1051 { | |
1052 //unsigned int v0; // ebx@1 | |
1053 //unsigned int v1; // eax@1 | |
1054 //Player *pPlayer; // ebp@2 | |
1055 //int v3; // eax@6 | |
1056 //int v4; // edi@6 | |
1057 unsigned int v5; // eax@7 | |
1058 unsigned int v6; // edi@9 | |
1059 unsigned int v7; // edi@11 | |
1060 //signed int v8; // eax@13 | |
1061 unsigned int v9; // eax@13 | |
1062 unsigned int v10; // edi@13 | |
1063 //int v11; // eax@15 | |
1064 unsigned int v12; // eax@15 | |
1065 unsigned int v13; // edi@15 | |
1066 //int v14; // eax@17 | |
1067 //int v15; // ST18_4@17 | |
1068 //int v16; // ebx@17 | |
1069 //int v17; // eax@17 | |
1070 unsigned int v18; // eax@17 | |
1071 unsigned int v19; // edi@17 | |
1072 //int v20; // eax@19 | |
1073 unsigned int v21; // edi@19 | |
1074 char *v22; // eax@21 | |
1075 unsigned int v23; // edi@21 | |
1076 //int v24; // eax@23 | |
1077 unsigned int v25; // edi@23 | |
1078 char *v26; // eax@25 | |
1079 unsigned int v27; // edi@25 | |
1080 int v28; // ecx@27 | |
1081 char *v29; // eax@27 | |
1082 signed int v30; // edx@27 | |
1083 unsigned int v31; // edi@31 | |
1084 unsigned int v32; // edi@33 | |
1085 const char *v33; // ST10_4@35 | |
1086 unsigned int v34; // eax@35 | |
1087 unsigned int v35; // edi@35 | |
1088 //unsigned __int8 v36; // al@37 | |
1089 char *v37; // eax@38 | |
1090 int v38; // eax@41 | |
1091 signed int v39; // edi@42 | |
1092 //char *v40; // eax@45 | |
1093 //unsigned int v41; // eax@45 | |
1094 signed int v43; // [sp+10h] [bp-1Ch]@1 | |
1095 unsigned int v44; // [sp+14h] [bp-18h]@2 | |
1096 int v45; // [sp+18h] [bp-14h]@1 | |
1097 //unsigned int v46; // [sp+1Ch] [bp-10h]@1 | |
1098 //unsigned int v47; // [sp+20h] [bp-Ch]@1 | |
1099 unsigned int v48; // [sp+24h] [bp-8h]@33 | |
1100 //unsigned int v49; // [sp+28h] [bp-4h]@1 | |
1101 | |
1102 //v0 = 0; | |
1103 //v47 = TargetColor(0xFFu, 0xFFu, 0x9Bu); | |
1104 //v49 = TargetColor(0xFFu, 0, 0); | |
1105 //v46 = TargetColor(0, 0xFFu, 0); | |
1106 //v1 = pIcons_LOD->LoadTexture("quikref", TEXTURE_16BIT_PALETTE); | |
1107 pRenderer->DrawTextureIndexed(8, 8, pIcons_LOD->LoadTexturePtr("quikref", TEXTURE_16BIT_PALETTE)); | |
1108 v43 = 0; | |
1109 v45 = LOBYTE(pFontArrus->uFontHeight) + 1; | |
1110 do | |
1111 { | |
1112 auto player = &pParty->pPlayers[v43]; | |
1113 v44 = 94 * v43 + 89; | |
1114 if ( v43 == 0 ) | |
1115 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, 0x12u, 0, pGlobalTXT_LocalizationStrings[149], 60, 0);//Name | |
1116 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 94 * v43 + 89, 0x12u, ui_character_header_text_color, player->pName, 84, 0); | |
1117 if ( v43 == 0 ) | |
1118 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, 0x2Fu, 0, pGlobalTXT_LocalizationStrings[131], 60, 0); //Óðîâ. | |
1119 sprintf(pTmpBuf.data(), "%lu", player->GetActualLevel()); | |
1120 if ( player->GetActualLevel() <= player->GetBaseLevel()) | |
1121 v5 = player->GetExperienceDisplayColor(); | |
1122 else | |
1123 v5 = ui_character_bonus_text_color; | |
1124 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, 0x2Fu, v5, pTmpBuf.data(), 84, 0); | |
1125 v6 = v45 + 47; | |
1126 if ( v43 == 0 ) | |
1127 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v45 + 47, 0, pGlobalTXT_LocalizationStrings[41], 60, 0);//Êëàññ | |
1128 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v6, 0, pClassNames[player->classType], 84, 0); | |
1129 v7 = v45 + v6; | |
1130 if ( v43 == 0 ) | |
1131 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v7, 0, pGlobalTXT_LocalizationStrings[107], 60, 0);//Çäîð. | |
1132 sprintf(pTmpBuf.data(), "%d", player->sHealth); | |
1133 v9 = UI_GetHealthManaStringColor(player->sHealth, player->GetMaxHealth()); | |
1134 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v7, v9, pTmpBuf.data(), 84, 0); | |
1135 v10 = v45 + v7; | |
1136 if ( v43 == 0 ) | |
1137 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v10, 0, pGlobalTXT_LocalizationStrings[209], 60, 0);//Ìàíà | |
1138 sprintf(pTmpBuf.data(), "%d", player->sMana); | |
1139 v12 = UI_GetHealthManaStringColor(player->sMana, player->GetMaxMana()); | |
1140 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v10, v12, pTmpBuf.data(), 84, 0); | |
1141 v13 = v45 + v10; | |
1142 if ( v43 == 0 ) | |
1143 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v13, 0, pGlobalTXT_LocalizationStrings[0], 60, 0);//Êëàññ áðîíè | |
1144 sprintf(pTmpBuf.data(), "%d", player->GetActualAC()); | |
1145 v18 = UI_GetHealthManaStringColor(player->GetActualAC(), player->GetBaseAC()); | |
1146 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v13, v18, pTmpBuf.data(), 84, 0); | |
1147 v19 = v45 + v13; | |
1148 if ( !v43 ) | |
1149 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v19, 0, pGlobalTXT_LocalizationStrings[18], 60, 0);//Àòàêà | |
1150 sprintf(pTmpBuf.data(), "%+d", player->GetActualAttack(0)); | |
1151 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v19, 0, pTmpBuf.data(), 84, 0); | |
1152 v21 = v45 + v19; | |
1153 if ( !v43 ) | |
1154 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v21, 0, pGlobalTXT_LocalizationStrings[66], 60, 0);//Ïîâð. | |
1155 v22 = player->GetMeleeDamageString(); | |
1156 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v21, 0, v22, 84, 0); | |
1157 v23 = v45 + v21; | |
1158 if ( !v43 ) | |
1159 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v23, 0, pGlobalTXT_LocalizationStrings[203], 60, 0);// Ñòðåëÿòü | |
1160 sprintf(pTmpBuf.data(), "%+d", player->GetRangedAttack()); | |
1161 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v23, 0, pTmpBuf.data(), 84, 0); | |
1162 v25 = v45 + v23; | |
1163 if ( !v43 ) | |
1164 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v25, 0, pGlobalTXT_LocalizationStrings[66], 60, 0);//Ïîâð. | |
1165 v26 = player->GetRangedDamageString(); | |
1166 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v25, 0, v26, 84, 0); | |
1167 v27 = v45 + v25; | |
1168 if ( !v43 ) | |
1169 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v27, 0, pGlobalTXT_LocalizationStrings[205], 60, 0);//Íàâûêè | |
1170 v28 = 0; | |
1171 v29 = (char *)player->pActiveSkills; | |
1172 v30 = 36; | |
1173 do | |
1174 { | |
1175 if ( *(short *)v29 ) | |
1176 ++v28; | |
1177 v29 += 2; | |
1178 --v30; | |
1179 } | |
1180 while ( v30 ); | |
1181 sprintf(pTmpBuf.data(), "%lu", v28); | |
1182 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v27, 0, pTmpBuf.data(), 84, 0); | |
1183 v31 = v45 + v27; | |
1184 if ( !v43 ) | |
1185 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v31, 0, pGlobalTXT_LocalizationStrings[168], 60, 0);//Î÷êè | |
1186 sprintf(pTmpBuf.data(), "%lu", player->uSkillPoints); | |
1187 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v31, player->uSkillPoints ? ui_character_bonus_text_color : ui_character_default_text_color, pTmpBuf.data(), 84, 0); | |
1188 v32 = v45 + v31; | |
1189 v48 = player->GetMajorConditionIdx(); | |
1190 if ( !v43 ) | |
1191 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v32, 0, pGlobalTXT_LocalizationStrings[45], 60, 0);//Ñîñò. | |
1192 v33 = aCharacterConditionNames[v48]; | |
1193 v34 = GetConditionDrawColor(v48); | |
1194 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v32, v34, v33, 84, 0); | |
1195 v35 = v45 + v32; | |
1196 if ( !v43 ) | |
1197 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x16u, v35, 0, pGlobalTXT_LocalizationStrings[170], 60, 0);//Á.Ïðèì. | |
1198 if (player->uQuickSpell) | |
1199 v37 = pSpellStats->pInfos[player->uQuickSpell].pShortName; | |
1200 else | |
1201 v37 = pGlobalTXT_LocalizationStrings[153];//Íåò | |
1202 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v35, 0, v37, 84, 0); | |
1203 ++v43; | |
1204 } | |
1205 while ( v43 < 4 ); | |
1206 | |
1207 v38 = GetPartyReputation(); | |
1208 if ( v38 >= 0 ) | |
1209 { | |
1210 if ( v38 <= 5 ) | |
1211 v39 = ui_character_default_text_color; | |
1212 else | |
1213 v39 = ui_character_bonus_text_color_neg; | |
1214 } | |
1215 else | |
1216 v39 = ui_character_bonus_text_color; | |
1217 | |
1218 sprintf(pTmpBuf.data(), "%s: \f%05d%s\f00000", pGlobalTXT_LocalizationStrings[180], v39, GetReputationString(v38));//Reputation | |
1219 pGUIWindow_CurrentMenu->DrawText(pFontArrus, 22, 323, 0, pTmpBuf.data(), 0, 0, 0); | |
1220 | |
1221 sprintf(pTmpBuf.data(), "\r261%s: %d", pGlobalTXT_LocalizationStrings[84], pParty->GetPartyFame());// Fame Ñëàâà | |
1222 pGUIWindow_CurrentMenu->DrawText(pFontArrus, 0, 323, 0, pTmpBuf.data(), 0, 0, 0); | |
1223 } | |
1224 | |
1225 | |
1226 | |
1227 //----- (0041AD6E) -------------------------------------------------------- | |
1228 void GameUI_DrawRightPanelItems() | |
1229 { | |
1230 if (GameUI_RightPanel_BookFlashTimer > pParty->uTimePlayed) | |
1231 GameUI_RightPanel_BookFlashTimer = 0; | |
1232 | |
1233 if (pParty->uTimePlayed - GameUI_RightPanel_BookFlashTimer > 128) | |
1234 { | |
1235 GameUI_RightPanel_BookFlashTimer = pParty->uTimePlayed; | |
1236 | |
1237 static bool byte_50697C = false; // 50697C | |
1238 byte_50697C = !byte_50697C; | |
1239 if ( byte_50697C && pCurrentScreen != SCREEN_REST ) | |
1240 { | |
1241 if (bFlashQuestBook) pRenderer->DrawTextureTransparent(493, 355, pIcons_LOD->GetTexture(uTextureID_ib_td1_A)); | |
1242 if (bFlashAutonotesBook) pRenderer->DrawTextureTransparent(527, 353, pIcons_LOD->GetTexture(uTextureID_ib_td2_A)); | |
1243 if (bFlashHistoryBook) pRenderer->DrawTextureTransparent(600, 361, pIcons_LOD->GetTexture(uTextureID_ib_td5_A)); | |
1244 } | |
1245 else | |
1246 { | |
1247 pRenderer->DrawTextureRGB(468, 0, pTexture_RightFrame); | |
1248 GameUI_DrawHiredNPCs(); | |
1249 } | |
1250 } | |
1251 } | |
1252 | |
1253 //----- (0041AEBB) -------------------------------------------------------- | |
1254 void GameUI_DrawFoodAndGold() | |
1255 { | |
1256 int v2; // esi@2 | |
1257 | |
1258 if ( uGameState != GAME_STATE_FINAL_WINDOW ) | |
1259 { | |
1260 v2 = sub_44100D() != 0 ? 381 : 322; | |
1261 sprintf(pTmpBuf.data(), "\r087%lu", pParty->uNumFoodRations); | |
1262 pPrimaryWindow->DrawText(pFontSmallnum, 0, v2, uGameUIFontMain, pTmpBuf.data(), 0, 0, uGameUIFontShadow); | |
1263 sprintf(pTmpBuf.data(), "\r028%lu", pParty->uNumGold); | |
1264 pPrimaryWindow->DrawText(pFontSmallnum, 0, v2, uGameUIFontMain, pTmpBuf.data(), 0, 0, uGameUIFontShadow); | |
1265 } | |
1266 } | |
1267 | |
1268 | |
1269 //----- (0041B0C9) -------------------------------------------------------- | |
1270 void GameUI_DrawLifeManaBars() | |
1271 { | |
1272 double v3; // st7@3 | |
1273 double v7; // st7@25 | |
1274 Texture *v9; // [sp-4h] [bp-30h]@10 | |
1275 Texture *v10; // [sp+Ch] [bp-20h]@1 | |
1276 | |
1277 | |
1278 v10 = pIcons_LOD->GetTexture(uTextureID_BarBlue); | |
1279 | |
1280 for (uint i = 0; i < 4; ++i) | |
1281 { | |
1282 auto player = pParty->pPlayers + i; | |
1283 | |
1284 if (player->sHealth > 0) | |
1285 { | |
1286 int v17 = 0; | |
1287 if (i == 2 || i == 3) | |
1288 v17 = 2; | |
1289 | |
1290 v3 = (double)player->sHealth / (double)player->GetMaxHealth(); | |
1291 if( v3 > 0.5 ) | |
1292 { | |
1293 if ( v3 > 1.0 ) | |
1294 v3 = 1.0; | |
1295 v9 = pIcons_LOD->GetTexture(uTextureID_BarGreen); | |
1296 } | |
1297 else if ( v3 > 0.25 ) | |
1298 v9 = pIcons_LOD->GetTexture(uTextureID_BarYellow); | |
1299 else if ( v3 > 0.0 ) | |
1300 v9 = pIcons_LOD->GetTexture(uTextureID_BarRed); | |
1301 | |
1302 | |
1303 if( v3 > 0.0 ) | |
1304 { | |
1305 pRenderer->SetTextureClipRect(v17 + pHealthBarPos[i], | |
1306 (signed __int64)((1.0 - v3) * v9->uTextureHeight) + 402, | |
1307 v17 + pHealthBarPos[i] + v9->uTextureWidth, | |
1308 v9->uTextureHeight + 402); | |
1309 | |
1310 pRenderer->DrawTextureIndexed(v17 + pHealthBarPos[i], 402, v9); | |
1311 pRenderer->ResetTextureClipRect(); | |
1312 } | |
1313 } | |
1314 | |
1315 | |
1316 if (player->sMana > 0) | |
1317 { | |
1318 v7 = player->sMana / (double)player->GetMaxMana(); | |
1319 if ( v7 > 1.0 ) | |
1320 v7 = 1.0; | |
1321 | |
1322 int v17 = 0; | |
1323 if (i == 2) | |
1324 v17 = 1; | |
1325 | |
1326 pRenderer->SetTextureClipRect(v17 + pManaBarPos[i], | |
1327 (signed __int64)((1.0 - v7) * v10->uTextureHeight) + 402, | |
1328 v17 + pManaBarPos[i] + v10->uTextureWidth, | |
1329 v10->uTextureHeight + 402); | |
1330 pRenderer->DrawTextureIndexed(v17 + pManaBarPos[i], 402, v10); | |
1331 pRenderer->ResetTextureClipRect(); | |
1332 } | |
1333 } | |
1334 } | |
1335 | |
1336 //----- (0041B3B6) -------------------------------------------------------- | |
1337 void GameUI_DrawRightPanel() | |
1338 { | |
1339 pRenderer->DrawTextureTransparent(pViewport->uViewportBR_X, 0, | |
1340 pIcons_LOD->GetTexture(uTextureID_right_panel)); | |
1341 } | |
1342 | |
1343 //----- (0041B3E2) -------------------------------------------------------- | |
1344 void GameUI_DrawRightPanelFrames() | |
1345 { | |
1346 pRenderer->DrawTextureRGB(0, 0, pTexture_TopFrame); | |
1347 pRenderer->DrawTextureRGB(0, 8, pTexture_LeftFrame); | |
1348 pRenderer->DrawTextureRGB(468, 0, pTexture_RightFrame); | |
1349 pRenderer->DrawTextureRGB(0, 352, pTexture_BottomFrame); | |
1350 GameUI_DrawFoodAndGold(); | |
1351 GameUI_DrawRightPanelItems(); | |
1352 } | |
1353 | |
1354 | |
1355 //----- (0041C047) -------------------------------------------------------- | |
1356 void GameUI_Footer_2() | |
1357 { | |
1358 char *v1; // edx@2 | |
1359 int v5; // eax@5 | |
1360 | |
1361 pRenderer->DrawTextureRGB(0, 352, pTexture_StatusBar); | |
1362 if (GameUI_Footer_TimeLeft) | |
1363 v1 = GameUI_Footer_TimedString.data(); | |
1364 else | |
1365 { | |
1366 if (!pFooterString[0]) | |
1367 return; | |
1368 v1 = pFooterString.data(); | |
1369 } | |
1370 | |
1371 v5 = pFontLucida->AlignText_Center(450, v1); | |
1372 pPrimaryWindow->DrawText(pFontLucida, v5 + 11, 357, uGameUIFontMain, v1, 0, 0, uGameUIFontShadow); | |
1373 } | |
1374 | |
1375 //----- (0041C0B8) -------------------------------------------------------- | |
1376 void GameUI_SetFooterString(const char *pStr) | |
1377 { | |
1378 const char *v1; // esi@1 | |
1379 int i; // eax@7 | |
1380 int j; // eax@11 | |
1381 | |
1382 v1 = pStr; | |
1383 if ( pStr && strcmp(pStr, "test") && !IsBadStringPtrA(v1, 1) && (*v1 || GameUI_Footer_TimeLeft) ) | |
1384 { | |
1385 if ( GameUI_Footer_TimeLeft ) | |
1386 { | |
1387 for ( i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()); | |
1388 i > 450; | |
1389 i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()) ) | |
1470 | 1390 GameUI_Footer_TimedString[strlen(GameUI_Footer_TimedString.data()) - 1] = 0; |
1298 | 1391 } |
1392 else | |
1393 { | |
1394 strcpy(pFooterString.data(), v1); | |
1395 for ( j = pFontLucida->GetLineWidth(pFooterString.data()); | |
1396 j > 450; | |
1397 j = pFontLucida->GetLineWidth(pFooterString.data()) ) | |
1470 | 1398 pFooterString[strlen(pFooterString.data()) - 1] = 0; |
1298 | 1399 } |
1400 } | |
1401 } | |
1402 | |
1403 //----- (0041C179) -------------------------------------------------------- | |
1404 void GameUI_Footer() | |
1405 { | |
1406 //unsigned int v0; // ebp@1 | |
1407 char *v1; // edi@5 | |
1408 int v2; // eax@5 | |
1409 unsigned int v3; // esi@5 | |
1410 size_t v4; // eax@6 | |
1411 GUIFont *v5; // ecx@6 | |
1412 int v6; // eax@9 | |
1413 size_t v7; // eax@10 | |
1414 GUIFont *v8; // ecx@10 | |
1415 char v9; // zf@12 | |
1416 //unsigned int v10; // ST08_4@13 | |
1417 int v11; // eax@13 | |
1418 | |
1419 if ( pFooterString[0] || GameUI_Footer_TimeLeft || bForceDrawFooter ) | |
1420 { | |
1421 pRenderer->DrawTextureRGB(0, 352u, pTexture_StatusBar); | |
1422 if ( GameUI_Footer_TimeLeft ) | |
1423 { | |
1424 v1 = GameUI_Footer_TimedString.data(); | |
1425 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()); | |
1426 v3 = 450; | |
1427 while ( v2 > 450 ) | |
1428 { | |
1429 v4 = strlen(GameUI_Footer_TimedString.data()); | |
1430 v5 = pFontLucida; | |
1470 | 1431 GameUI_Footer_TimedString[v4 - 1] = 0; |
1298 | 1432 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()); |
1433 } | |
1434 } | |
1435 else | |
1436 { | |
1437 v1 = pFooterString.data(); | |
1438 v6 = pFontLucida->GetLineWidth(pFooterString.data()); | |
1439 v3 = 450; | |
1440 while ( v6 > 450 ) | |
1441 { | |
1442 v7 = strlen(pFooterString.data()); | |
1443 v8 = pFontLucida; | |
1470 | 1444 pFooterString[v7 - 1] = 0; |
1298 | 1445 v6 = pFontLucida->GetLineWidth(pFooterString.data()); |
1446 } | |
1447 } | |
1448 v9 = *v1 == 0; | |
1449 bForceDrawFooter = 0; | |
1450 if ( !v9 ) | |
1451 { | |
1452 v11 = pFontLucida->AlignText_Center(v3, v1); | |
1453 pPrimaryWindow->DrawText(pFontLucida, v11 + 11, 357, uGameUIFontMain, v1, 0, 0, uGameUIFontShadow); | |
1454 } | |
1455 } | |
1456 } | |
1457 // 5C35BC: using guessed type int bForceDrawFooter; | |
1458 | |
1459 | |
1460 //----- (00420EFF) -------------------------------------------------------- | |
1458 | 1461 void GameUI_WritePointedObjectStatusString() |
1298 | 1462 { |
1463 int v1; // ebx@6 | |
1464 GUIWindow *pWindow; // edi@7 | |
1465 GUIButton *pButton; // ecx@11 | |
1466 Player *pPlayer; // eax@19 | |
1467 char v5; // cl@19 | |
1468 unsigned int v6; // eax@19 | |
1469 int v7; // ecx@19 | |
1470 __int16 v8; // fps@23 | |
1471 unsigned __int8 v9; // c0@23 | |
1472 unsigned __int8 v10; // c3@23 | |
1473 enum UIMessageType pMessageType1; // esi@24 | |
1474 //int v12; // edx@25 | |
1475 char *v13; // ecx@28 | |
1476 int v14; // eax@41 | |
1477 ItemGen *pItemGen; // ecx@44 | |
1478 int v16; // ecx@46 | |
1479 const char *v17; // eax@49 | |
1480 signed int v18; // eax@55 | |
1481 signed int v18b; | |
1482 signed int v19; // ecx@63 | |
1483 BLVFace *pFace; // eax@69 | |
1484 __int16 v21; // ax@70 | |
1485 const char *v22; // eax@72 | |
1486 LevelDecoration *v23; // ecx@75 | |
1487 LevelDecoration *v24; // esi@75 | |
1488 __int16 v25; // ax@75 | |
1489 const char *v26; // ecx@79 | |
1490 Actor *pActor; // ecx@82 | |
1491 char *v28; // esi@82 | |
1492 int v29; // eax@82 | |
1493 signed int v30; // ecx@88 | |
1494 const char *v31; // eax@91 | |
1495 __int16 v32; // fps@109 | |
1496 //unsigned __int8 v33; // c0@109 | |
1497 //unsigned __int8 v34; // c3@109 | |
1498 enum UIMessageType pMessageType2; // esi@110 | |
1499 //int v36; // edx@111 | |
1500 enum UIMessageType pMessageType3; // edx@117 | |
1501 //int v38; // ecx@118 | |
1502 const char *v39; // [sp-8h] [bp-E8h]@20 | |
1503 char *v40; // [sp-8h] [bp-E8h]@83 | |
1504 int v41; // [sp-4h] [bp-E4h]@20 | |
1505 char Str1[200]; // [sp+Ch] [bp-D4h]@129 | |
1506 unsigned int pX; // [sp+D4h] [bp-Ch]@1 | |
1507 unsigned int pY; // [sp+D8h] [bp-8h]@1 | |
1508 unsigned int v45; // [sp+DCh] [bp-4h]@21 | |
1509 | |
1510 v13 = nullptr; | |
1511 | |
1512 pMouse->uPointingObjectID = 0; | |
1513 pMouse->GetClickPos(&pX, &pY); | |
1514 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 ) | |
1515 return; | |
1516 if (pCurrentScreen == SCREEN_GAME) | |
1517 { | |
1518 if ( (signed int)pX > 467 || (signed int)pY > 351 ) | |
1519 goto _click_on_game_ui; | |
1520 if ( pRenderer->pRenderD3D ) // inlined mm8::4C1E01 | |
1521 { | |
1522 v18 = pGame->pVisInstance->get_picked_object_zbuf_val(); | |
1523 if ( (signed int)pX < (signed int)pViewport->uScreen_TL_X | |
1524 || (signed int)pX > (signed int)pViewport->uScreen_BR_X | |
1525 || (signed int)pY < (signed int)pViewport->uScreen_TL_Y | |
1526 || (signed int)pY > (signed int)pViewport->uScreen_BR_Y ) | |
1527 v18 = -1; | |
1528 if ( v18 == -1 ) | |
1529 //goto LABEL_61; | |
1530 { | |
1531 pMouse->uPointingObjectID = 0; | |
1532 if ( pMouse->uPointingObjectID == 0 ) | |
1533 { | |
1534 if ( uLastPointedObjectID != 0 ) | |
1535 { | |
1536 pFooterString[0] = 0; | |
1537 bForceDrawFooter = 1; | |
1538 } | |
1539 } | |
1540 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1541 return; | |
1542 } | |
1543 } | |
1544 else | |
1545 { | |
1546 v18 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; | |
1547 } | |
1548 pMouse->uPointingObjectID = (unsigned __int16)v18; | |
1549 v19 = (signed)PID_ID(v18); | |
1550 if (PID_TYPE(v18) == OBJECT_Item) | |
1551 { | |
1552 v30 = v19; | |
1553 if ( pObjectList->pObjects[pSpriteObjects[v30].uObjectDescID].uFlags & 0x10 ) | |
1554 //goto LABEL_73; | |
1555 { | |
1556 pMouse->uPointingObjectID = 0; | |
1557 //goto LABEL_50; | |
1558 uLastPointedObjectID = 1; | |
1559 if ( pMouse->uPointingObjectID == 0 ) | |
1560 { | |
1561 if ( uLastPointedObjectID != 0 ) | |
1562 { | |
1563 pFooterString[0] = 0; | |
1564 bForceDrawFooter = 1; | |
1565 } | |
1566 } | |
1567 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1568 return; | |
1569 } | |
1570 if ( v18 >= (signed int)0x2000000u || pParty->pPickedItem.uItemID ) | |
1571 { | |
1572 v22 = pSpriteObjects[v30].stru_24.GetDisplayName(); | |
1573 //LABEL_93: | |
1574 v26 = v22; | |
1575 //goto LABEL_87; | |
1576 GameUI_SetFooterString(v26); | |
1577 if ( pMouse->uPointingObjectID == 0 ) | |
1578 { | |
1579 if ( uLastPointedObjectID != 0 ) | |
1580 { | |
1581 pFooterString[0] = 0; | |
1582 bForceDrawFooter = 1; | |
1583 } | |
1584 } | |
1585 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1586 return; | |
1587 } | |
1588 v31 = pSpriteObjects[v30].stru_24.GetDisplayName(); | |
1589 v28 = pTmpBuf.data(); | |
1590 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[470], v31);// "Get %s" | |
1591 } | |
1592 else | |
1593 { | |
1594 if (PID_TYPE(v18) != OBJECT_Actor) | |
1595 { | |
1596 if (PID_TYPE(v18) == OBJECT_Decoration) | |
1597 { | |
1598 v23 = &pLevelDecorations[v19]; | |
1599 v24 = v23; | |
1600 v25 = v23->field_16_event_id; | |
1601 if ( !v25 ) | |
1602 { | |
1603 if ( v23->IsInteractive() ) | |
1604 v26 = pNPCTopics[stru_5E4C90._decor_events[v24->_idx_in_stru123 - 75] + 379].pTopic; | |
1605 else | |
1606 v26 = pDecorationList->pDecorations[v24->uDecorationDescID].field_20; | |
1607 //goto LABEL_87; | |
1608 GameUI_SetFooterString(v26); | |
1609 if ( pMouse->uPointingObjectID == 0 ) | |
1610 { | |
1611 if ( uLastPointedObjectID != 0 ) | |
1612 { | |
1613 pFooterString[0] = 0; | |
1614 bForceDrawFooter = 1; | |
1615 } | |
1616 } | |
1617 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1618 return; | |
1619 } | |
1620 v22 = GetEventHintString(v25); | |
1621 if ( !v22 ) | |
1622 //goto _return; | |
1623 { | |
1624 if ( pMouse->uPointingObjectID == 0 ) | |
1625 { | |
1626 if ( uLastPointedObjectID != 0 ) | |
1627 { | |
1628 pFooterString[0] = 0; | |
1629 bForceDrawFooter = 1; | |
1630 } | |
1631 } | |
1632 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1633 return; | |
1634 } | |
1635 //goto LABEL_93; | |
1636 v26 = v22; | |
1637 //goto LABEL_87; | |
1638 GameUI_SetFooterString(v26); | |
1639 if ( pMouse->uPointingObjectID == 0 ) | |
1640 { | |
1641 if ( uLastPointedObjectID != 0 ) | |
1642 { | |
1643 pFooterString[0] = 0; | |
1644 bForceDrawFooter = 1; | |
1645 } | |
1646 } | |
1647 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1648 return; | |
1649 } | |
1650 if (PID_TYPE(v18) == OBJECT_BModel) | |
1651 { | |
1652 if ( HIWORD(v18) < 512) | |
1653 { | |
1654 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) | |
1655 { | |
1656 v18b = (signed int)(unsigned __int16)v18 >> 9; | |
1657 v21 = pOutdoor->pBModels[v18b].pFaces[v19 & 0x3F].sCogTriggeredID; | |
1658 //goto LABEL_71; | |
1659 if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) | |
1660 //goto LABEL_73; | |
1661 { | |
1662 pMouse->uPointingObjectID = 0; | |
1663 //goto LABEL_50; | |
1664 uLastPointedObjectID = 1; | |
1665 if ( pMouse->uPointingObjectID == 0 ) | |
1666 { | |
1667 if ( uLastPointedObjectID != 0 ) | |
1668 { | |
1669 pFooterString[0] = 0; | |
1670 bForceDrawFooter = 1; | |
1671 } | |
1672 } | |
1673 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1674 return; | |
1675 } | |
1676 //goto LABEL_93; | |
1677 v26 = v22; | |
1678 //goto LABEL_87; | |
1679 GameUI_SetFooterString(v26); | |
1680 if ( pMouse->uPointingObjectID == 0 ) | |
1681 { | |
1682 if ( uLastPointedObjectID != 0 ) | |
1683 { | |
1684 pFooterString[0] = 0; | |
1685 bForceDrawFooter = 1; | |
1686 } | |
1687 } | |
1688 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1689 return; | |
1690 } | |
1691 pFace = &pIndoor->pFaces[v19]; | |
1692 if ( BYTE3(pFace->uAttributes) & 6 ) | |
1693 { | |
1694 v21 = pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID; | |
1695 //LABEL_71: | |
1696 if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) | |
1697 //goto LABEL_73; | |
1698 { | |
1699 pMouse->uPointingObjectID = 0; | |
1700 //goto LABEL_50; | |
1701 uLastPointedObjectID = 1; | |
1702 if ( pMouse->uPointingObjectID == 0 ) | |
1703 { | |
1704 if ( uLastPointedObjectID != 0 ) | |
1705 { | |
1706 pFooterString[0] = 0; | |
1707 bForceDrawFooter = 1; | |
1708 } | |
1709 } | |
1710 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1711 return; | |
1712 } | |
1713 //goto LABEL_93; | |
1714 v26 = v22; | |
1715 //goto LABEL_87; | |
1716 GameUI_SetFooterString(v26); | |
1717 if ( pMouse->uPointingObjectID == 0 ) | |
1718 { | |
1719 if ( uLastPointedObjectID != 0 ) | |
1720 { | |
1721 pFooterString[0] = 0; | |
1722 bForceDrawFooter = 1; | |
1723 } | |
1724 } | |
1725 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1726 return; | |
1727 } | |
1728 } | |
1729 //LABEL_73: | |
1730 pMouse->uPointingObjectID = 0; | |
1731 //goto LABEL_50; | |
1732 uLastPointedObjectID = 1; | |
1733 if ( pMouse->uPointingObjectID == 0 ) | |
1734 { | |
1735 if ( uLastPointedObjectID != 0 ) | |
1736 { | |
1737 pFooterString[0] = 0; | |
1738 bForceDrawFooter = 1; | |
1739 } | |
1740 } | |
1741 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1742 return; | |
1743 } | |
1744 //LABEL_61: | |
1745 pMouse->uPointingObjectID = 0; | |
1746 //goto _return; | |
1747 if ( pMouse->uPointingObjectID == 0 ) | |
1748 { | |
1749 if ( uLastPointedObjectID != 0 ) | |
1750 { | |
1751 pFooterString[0] = 0; | |
1752 bForceDrawFooter = 1; | |
1753 } | |
1754 } | |
1755 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1756 return; | |
1757 } | |
1758 if ( v18 >= 335544320 ) | |
1759 //goto LABEL_61; | |
1760 { | |
1761 pMouse->uPointingObjectID = 0; | |
1762 if ( pMouse->uPointingObjectID == 0 ) | |
1763 { | |
1764 if ( uLastPointedObjectID != 0 ) | |
1765 { | |
1766 pFooterString[0] = 0; | |
1767 bForceDrawFooter = 1; | |
1768 } | |
1769 } | |
1770 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1771 return; | |
1772 } | |
1773 pActor = &pActors[v19]; | |
1774 v28 = pTmpBuf.data(); | |
1775 v29 = pActor->dword_000334_unique_name; | |
1776 if ( v29 ) | |
1777 v40 = pMonsterStats->pPlaceStrings[v29]; | |
1778 else | |
1779 v40 = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].pName; | |
1780 strncpy(pTmpBuf.data(), v40, 0x7D0u); | |
1781 } | |
1782 v26 = v28; | |
1783 //LABEL_87: | |
1784 GameUI_SetFooterString(v26); | |
1785 //goto _return; | |
1786 if ( pMouse->uPointingObjectID == 0 ) | |
1787 { | |
1788 if ( uLastPointedObjectID != 0 ) | |
1789 { | |
1790 pFooterString[0] = 0; | |
1791 bForceDrawFooter = 1; | |
1792 } | |
1793 } | |
1794 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1795 return; | |
1796 } | |
1797 v1 = uNumVisibleWindows; | |
1798 if ( uNumVisibleWindows > 0 ) | |
1799 { | |
1800 while ( 1 ) // some other fullscreen ui | |
1801 { | |
1802 pWindow = &pWindowList[pVisibleWindowsIdxs[v1] - 1]; | |
1803 if ( (signed int)pX >= (signed int)pWindow->uFrameX | |
1804 && (signed int)pX <= (signed int)pWindow->uFrameZ | |
1805 && (signed int)pY >= (signed int)pWindow->uFrameY | |
1806 && (signed int)pY <= (signed int)pWindow->uFrameW ) | |
1807 { | |
1808 for ( pButton = pWindow->pControlsHead; ; pButton = pButton->pNext ) | |
1809 { | |
1810 if ( !pButton ) | |
1811 break; | |
1812 if ( pButton->uButtonType == 1 ) | |
1813 { | |
1814 if ( (signed int)pX >= (signed int)pButton->uX | |
1815 && (signed int)pX <= (signed int)pButton->uZ | |
1816 && (signed int)pY >= (signed int)pButton->uY | |
1817 && (signed int)pY <= (signed int)pButton->uW ) | |
1818 { | |
1819 //LABEL_24: | |
1820 pMessageType1 = (UIMessageType)pButton->field_1C; | |
1821 if ( pMessageType1 ) | |
1822 { | |
1823 pMessageQueue_50CBD0->AddMessage(pMessageType1, pButton->msg_param, 0); | |
1824 } | |
1825 //LABEL_28: | |
1826 v13 = pButton->pButtonName; | |
1827 //_set_status_and_ret: | |
1828 GameUI_SetFooterString(v13); | |
1829 //LABEL_131: | |
1830 uLastPointedObjectID = 1; | |
1831 return; | |
1832 } | |
1833 } | |
1834 else | |
1835 { | |
1836 if ( pButton->uButtonType == 2 ) | |
1837 { | |
1838 v45 = pX - pButton->uX; | |
1839 v45 = pY - pButton->uY; | |
1840 if ( (double)(signed int)pButton->uWidth != 0.0 ) | |
1841 { | |
1842 if ( (double)(signed int)pButton->uHeight != 0.0 ) | |
1843 { | |
1844 pMessageType1 = (UIMessageType)pButton->field_1C; | |
1845 if ( pMessageType1 ) | |
1846 { | |
1847 pMessageQueue_50CBD0->AddMessage(pMessageType1, pButton->msg_param, 0); | |
1848 } | |
1849 v13 = pButton->pButtonName; | |
1850 GameUI_SetFooterString(v13); | |
1851 uLastPointedObjectID = 1; | |
1852 return; | |
1853 //} | |
1854 } | |
1855 } | |
1856 } | |
1857 else // click on skill | |
1858 { | |
1859 if ( pButton->uButtonType == 3 | |
1860 && (signed int)pX >= (signed int)pButton->uX | |
1861 && (signed int)pX <= (signed int)pButton->uZ | |
1862 && (signed int)pY >= (signed int)pButton->uY | |
1863 && (signed int)pY <= (signed int)pButton->uW ) | |
1864 { | |
1865 //LABEL_19: | |
1866 pPlayer = pPlayers[uActiveCharacter]; | |
1867 v5 = LOBYTE(pPlayer->pActiveSkills[pButton->msg_param]); | |
1868 v6 = pPlayer->uSkillPoints; | |
1869 v7 = (v5 & 0x3F) + 1; | |
1870 if ( v6 < v7 ) | |
1871 { | |
1872 v41 = v7 - v6; | |
1873 v39 = pGlobalTXT_LocalizationStrings[469];// "You need %d more Skill Points to advance here" | |
1874 } | |
1875 else | |
1876 { | |
1877 v41 = v7; | |
1878 v39 = pGlobalTXT_LocalizationStrings[468];// "Clicking here will spend %d Skill Points" | |
1879 } | |
1880 sprintf(Str1, v39, v41); | |
1881 v13 = Str1; | |
1882 //goto _set_status_and_ret; | |
1883 GameUI_SetFooterString(v13); | |
1884 uLastPointedObjectID = 1; | |
1885 return; | |
1886 } | |
1887 } | |
1888 } | |
1889 } | |
1890 } | |
1891 if ( pWindow->uFrameHeight == 480 ) | |
1892 break; | |
1893 --v1; | |
1894 if ( v1 <= 0 ) | |
1895 { | |
1896 break; | |
1897 } | |
1898 } | |
1899 } | |
1900 if ( uNumVisibleWindows <= 0 || (uNumVisibleWindows > 0 && pWindow->uFrameHeight != 480 && v1 <= 0)) | |
1901 { | |
1902 if ( pCurrentScreen == SCREEN_CHEST ) | |
1903 { | |
1414 | 1904 ChestUI_WritePointedObjectStatusString(); |
1298 | 1905 //goto _return; |
1906 if ( pMouse->uPointingObjectID == 0 ) | |
1907 { | |
1908 if ( uLastPointedObjectID != 0 ) | |
1909 { | |
1910 pFooterString[0] = 0; | |
1911 bForceDrawFooter = 1; | |
1912 } | |
1913 } | |
1914 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1915 return; | |
1916 } | |
1917 if ( pCurrentScreen == SCREEN_HOUSE ) | |
1918 { | |
1919 if ( dialog_menu_id != HOUSE_DIALOGUE_SHOP_BUY_STANDARD | |
1920 || (v16 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]], v16 == 0) | |
1921 || v16 == -65536 ) | |
1922 //goto _return; | |
1923 { | |
1924 if ( pMouse->uPointingObjectID == 0 ) | |
1925 { | |
1926 if ( uLastPointedObjectID != 0 ) | |
1927 { | |
1928 pFooterString[0] = 0; | |
1929 bForceDrawFooter = 1; | |
1930 } | |
1931 } | |
1932 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1933 return; | |
1934 } | |
1935 pItemGen = (ItemGen *)((char *)&pParty->pPickedItem + 36 * (v16 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 4); | |
1936 //LABEL_49: | |
1937 v17 = pItemGen->GetDisplayName(); | |
1938 GameUI_SetFooterString(v17); | |
1939 //LABEL_50: | |
1940 uLastPointedObjectID = 1; | |
1941 //_return: | |
1942 if ( pMouse->uPointingObjectID == 0 ) | |
1943 { | |
1944 if ( uLastPointedObjectID != 0 ) | |
1945 { | |
1946 pFooterString[0] = 0; | |
1947 bForceDrawFooter = 1; | |
1948 } | |
1949 } | |
1950 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1951 return; | |
1952 } | |
1953 if ( (signed int)pY < 350 ) | |
1954 { | |
1955 v14 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; | |
1956 if ( v14 == 0 || v14 == -65536 || (unsigned int)v14 >= 0x1388 ) | |
1957 //goto _return; | |
1958 { | |
1959 if ( pMouse->uPointingObjectID == 0 ) | |
1960 { | |
1961 if ( uLastPointedObjectID != 0 ) | |
1962 { | |
1963 pFooterString[0] = 0; | |
1964 bForceDrawFooter = 1; | |
1965 } | |
1966 } | |
1967 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1968 return; | |
1969 } | |
1384
b51332ab228f
changed a few member variables in Player to slightly less confusing names
Grumpy7
parents:
1362
diff
changeset
|
1970 pItemGen = (ItemGen *)&pPlayers[uActiveCharacter]->pInventoryItemList[v14-1]; |
1298 | 1971 //goto LABEL_49; |
1972 v17 = pItemGen->GetDisplayName(); | |
1973 GameUI_SetFooterString(v17); | |
1974 uLastPointedObjectID = 1; | |
1975 if ( pMouse->uPointingObjectID == 0 ) | |
1976 { | |
1977 if ( uLastPointedObjectID != 0 ) | |
1978 { | |
1979 pFooterString[0] = 0; | |
1980 bForceDrawFooter = 1; | |
1981 } | |
1982 } | |
1983 uLastPointedObjectID = pMouse->uPointingObjectID; | |
1984 return; | |
1985 } | |
1986 _click_on_game_ui: | |
1987 if ( (signed int)pX >= (signed int)pWindowList[0].uFrameX | |
1988 && (signed int)pX <= (signed int)pWindowList[0].uFrameZ | |
1989 && (signed int)pY >= (signed int)pWindowList[0].uFrameY | |
1990 && (signed int)pY <= (signed int)pWindowList[0].uFrameW ) | |
1991 { | |
1992 for ( pButton = pWindowList[0].pControlsHead; pButton != (GUIButton *)0; pButton = pButton->pNext ) | |
1993 { | |
1994 if ( pButton->uButtonType == 1 ) | |
1995 { | |
1996 if ( (signed int)pX >= (signed int)pButton->uX | |
1997 && (signed int)pX <= (signed int)pButton->uZ | |
1998 && (signed int)pY >= (signed int)pButton->uY | |
1999 && (signed int)pY <= (signed int)pButton->uW ) | |
2000 { | |
2001 pMessageType3 = (UIMessageType)pButton->field_1C; | |
2002 if ( pMessageType3 == 0 ) // For books | |
2003 //goto LABEL_28; | |
2004 { | |
2005 v13 = pButton->pButtonName; | |
2006 GameUI_SetFooterString(v13); | |
2007 uLastPointedObjectID = 1; | |
2008 return; | |
2009 } | |
2010 | |
2011 pMessageQueue_50CBD0->AddMessage(pMessageType3, pButton->msg_param, 0); | |
2012 //goto LABEL_131; | |
2013 uLastPointedObjectID = 1; | |
2014 return; | |
2015 } | |
2016 } | |
2017 else | |
2018 { | |
2019 if ( pButton->uButtonType == 2 ) | |
2020 { | |
2021 v45 = pX - pButton->uX; | |
2022 v45 = pY - pButton->uY; | |
2023 | |
2024 if (pX >= pButton->uX && pX <= pButton->uZ && | |
2025 pY >= pButton->uY && pY <= pButton->uW) | |
2026 if ( (double)(signed int)pButton->uWidth != 0.0 ) | |
2027 { | |
2028 if ( (double)(signed int)pButton->uHeight != 0.0 ) | |
2029 { | |
2030 //UNDEF(v32); | |
2031 //if ( v33 | v34 ) | |
2032 //{ | |
2033 pMessageType2 = (UIMessageType)pButton->field_1C; | |
2034 if ( pMessageType2 != 0 ) | |
2035 pMessageQueue_50CBD0->AddMessage(pMessageType2, pButton->msg_param, 0); | |
2036 | |
2037 //goto LABEL_28; | |
2038 v13 = pButton->pButtonName; | |
2039 GameUI_SetFooterString(v13); | |
2040 uLastPointedObjectID = 1; | |
2041 return; | |
2042 //} | |
2043 } | |
2044 } | |
2045 } | |
2046 else | |
2047 { | |
2048 if ( pButton->uButtonType == 3 | |
2049 && (signed int)pX >= (signed int)pButton->uX | |
2050 && (signed int)pX <= (signed int)pButton->uZ | |
2051 && (signed int)pY >= (signed int)pButton->uY | |
2052 && (signed int)pY <= (signed int)pButton->uW ) | |
2053 //goto LABEL_19; | |
2054 { | |
2055 pPlayer = pPlayers[uActiveCharacter]; | |
2056 v5 = LOBYTE(pPlayer->pActiveSkills[pButton->msg_param]); | |
2057 v6 = pPlayer->uSkillPoints; | |
2058 v7 = (v5 & 0x3F) + 1; | |
2059 if ( v6 < v7 ) | |
2060 { | |
2061 v41 = v7 - v6; | |
2062 v39 = pGlobalTXT_LocalizationStrings[469];// "You need %d more Skill Points to advance here" | |
2063 } | |
2064 else | |
2065 { | |
2066 v41 = v7; | |
2067 v39 = pGlobalTXT_LocalizationStrings[468];// "Clicking here will spend %d Skill Points" | |
2068 } | |
2069 sprintf(Str1, v39, v41); | |
2070 v13 = Str1; | |
2071 //goto _set_status_and_ret; | |
2072 GameUI_SetFooterString(v13); | |
2073 uLastPointedObjectID = 1; | |
2074 return; | |
2075 } | |
2076 } | |
2077 } | |
2078 } | |
2079 } | |
2080 pMouse->uPointingObjectID = sub_46A99B(); | |
2081 //goto _return; | |
2082 if ( pMouse->uPointingObjectID == 0 ) | |
2083 { | |
2084 if ( uLastPointedObjectID != 0 ) | |
2085 { | |
2086 pFooterString[0] = 0; | |
2087 bForceDrawFooter = 1; | |
2088 } | |
2089 } | |
2090 uLastPointedObjectID = pMouse->uPointingObjectID; | |
2091 return; | |
2092 } | |
2093 } | |
2094 | |
2095 | |
2096 //----- (0044158F) -------------------------------------------------------- | |
2097 void GameUI_DrawCharacterSelectionFrame() | |
2098 { | |
2099 if ( uActiveCharacter ) | |
2100 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[uActiveCharacter - 1] - 9, 380, | |
2101 pIcons_LOD->GetTexture(uTextureID_GameUI_CharSelectionFrame)); | |
2102 } | |
2103 | |
2104 | |
2105 | |
2106 //----- (0044162D) -------------------------------------------------------- | |
2107 void GameUI_DrawPartySpells() | |
2108 { | |
2109 unsigned int v0; // ebp@1 | |
2110 //signed int v1; // edi@1 | |
2111 //int v2; // eax@2 | |
2112 //int v3; // ecx@5 | |
2113 //__int16 *v4; // ebx@25 | |
2114 //Player *v5; // edi@26 | |
2115 //unsigned int v6; // [sp-4h] [bp-1Ch]@11 | |
2116 Texture *v7; // [sp-4h] [bp-1Ch]@12 | |
2117 //unsigned int v8; // [sp-4h] [bp-1Ch]@20 | |
2118 Texture *v9; // [sp-4h] [bp-1Ch]@21 | |
2119 //Player **v10; // [sp+10h] [bp-8h]@25 | |
2120 | |
2121 v0 = (signed __int64)((double)GetTickCount() * 0.050000001); | |
2122 //v1 = 0; | |
2123 for (uint i = 0; i < 14; ++i) | |
2124 { | |
2125 //v2 = byte_4E5DD8[v1]; | |
2126 if (pParty->pPartyBuffs[byte_4E5DD8[i]].uExpireTime) | |
2127 { | |
2128 auto tex = pIcons_LOD->GetTexture(pTextureIDs_PartyBuffIcons[i]); | |
2129 //v3 = pTextureIDs_PartyBuffIcons[i]; | |
2130 pRenderer->_4A65CC(pPartySpellbuffsUI_XYs[i][0], | |
2131 pPartySpellbuffsUI_XYs[i][1], tex, tex, | |
2132 v0 + 20 * pPartySpellbuffsUI_smthns[i], 0, 63); | |
2133 } | |
2134 //++v1; | |
2135 } | |
2136 //while ( v1 < 14 ); | |
2137 | |
2138 if (pCurrentScreen == SCREEN_GAME || pCurrentScreen == SCREEN_NPC_DIALOGUE) | |
2139 { | |
2140 if (pParty->FlyActive()) | |
2141 { | |
2142 if ( pParty->bFlying ) | |
2143 v7 = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_FlySpell, v0)->uTextureID); | |
2144 else | |
2145 v7 = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_FlySpell, 0)->uTextureID); | |
2146 if ( pRenderer->pRenderD3D ) | |
2147 pRenderer->DrawTextureIndexed(8, 8, v7); | |
2148 else | |
2149 pRenderer->DrawTextureTransparent(8, 8, v7); | |
2150 } | |
2151 if (pParty->WaterWalkActive()) | |
2152 { | |
2153 if ( pParty->uFlags & PARTY_FLAGS_1_STANDING_ON_WATER) | |
2154 v9 = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, v0)->uTextureID); | |
2155 else | |
2156 v9 = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, 0)->uTextureID); | |
2157 if ( pRenderer->pRenderD3D ) | |
2158 pRenderer->DrawTextureIndexed(396u, 8u, v9); | |
2159 else | |
2160 pRenderer->DrawTextureTransparent(396u, 8u, v9); | |
2161 } | |
2162 } | |
2163 | |
2164 for (uint i = 0; i < 4; ++i) | |
2165 { | |
2166 auto player = pParty->pPlayers + i; | |
2167 | |
2168 if (player->pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].uExpireTime) | |
2169 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 427, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Hammerhands)); | |
2170 if (player->pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime) | |
2171 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 393, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Bless)); | |
2172 if (player->pPlayerBuffs[PLAYER_BUFF_PRESERVATION].uExpireTime) | |
2173 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 410, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Preservation)); | |
2174 if (player->pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].uExpireTime) | |
2175 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 444, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_PainReflection)); | |
2176 } | |
2177 } | |
2178 | |
2179 | |
2180 | |
2181 //----- (004921C1) -------------------------------------------------------- | |
2182 void GameUI_DrawPortraits(unsigned int _this) | |
2183 { | |
2184 Texture *pFace; // eax@10 | |
2185 unsigned int v7; // eax@17 | |
2186 PlayerFrame *pFrame; // eax@21 | |
2187 unsigned int v9; // eax@27 | |
2188 bool v10; // eax@33 | |
2189 bool v11; // edi@40 | |
2190 bool v12; // edx@43 | |
2191 bool v13; // ecx@46 | |
2192 int v16; // eax@57 | |
2193 int v19; // eax@62 | |
2194 Texture *pPortrait; // [sp-4h] [bp-1Ch]@27 | |
1407 | 2195 //unsigned int v22; // [sp+14h] [bp-4h]@1 |
1298 | 2196 |
1407 | 2197 //v22 = _this; |
1298 | 2198 if ( qword_A750D8 ) |
2199 { | |
2200 qword_A750D8 -= (signed int)pMiscTimer->uTimeElapsed; | |
2201 if ( qword_A750D8 <= 0 ) | |
2202 { | |
1407 | 2203 if ( pPlayers[uSpeakingCharacter]->CanAct() ) |
2204 pPlayers[uSpeakingCharacter]->PlaySound(PlayerSpeechID, 0); | |
1298 | 2205 qword_A750D8 = 0i64; |
2206 } | |
2207 } | |
2208 | |
2209 for (uint i = 0; i < 4; ++i) | |
2210 { | |
1407 | 2211 Player* pPlayer = &pParty->pPlayers[i]; |
1298 | 2212 |
1362
d6cf8ead9242
Condition checking functions slightly renamed, some final changes in Player::SetCondition
Grumpy7
parents:
1340
diff
changeset
|
2213 if (pPlayer->IsEradicated()) |
1298 | 2214 { |
2215 pFace = pTexture_PlayerFaceEradicated; | |
2216 pPortrait = pFace; | |
2217 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
2218 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime ) | |
2219 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
2220 else | |
2221 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
2222 auto _v1 = 0; | |
2223 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
2224 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
2225 _v1 = 1; | |
2226 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
2227 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
2228 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
2229 if ( v13 | v12 | v11 | _v1 | v10 ) | |
2230 sub_441A4E(i); | |
2231 continue; | |
2232 } | |
1362
d6cf8ead9242
Condition checking functions slightly renamed, some final changes in Player::SetCondition
Grumpy7
parents:
1340
diff
changeset
|
2233 if (pPlayer->IsDead()) |
1298 | 2234 { |
2235 pFace = pTexture_PlayerFaceDead; | |
2236 pPortrait = pFace; | |
2237 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
2238 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime ) | |
2239 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
2240 else | |
2241 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
2242 auto _v1 = 0; | |
2243 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
2244 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
2245 _v1 = 1; | |
2246 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
2247 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
2248 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
2249 if ( v13 | v12 | v11 | _v1 | v10 ) | |
2250 sub_441A4E(i); | |
2251 continue; | |
2252 } | |
2253 v7 = 0; | |
2254 for (uint j = 0; j < pPlayerFrameTable->uNumFrames; ++j) | |
2255 if (pPlayerFrameTable->pFrames[j].expression == pPlayer->expression) | |
2256 { | |
2257 v7 = j; | |
2258 break; | |
2259 } | |
2260 if ( v7 == 0 ) | |
2261 v7 = 1; | |
2262 if (pPlayer->expression == CHARACTER_EXPRESSION_21) | |
2263 pFrame = pPlayerFrameTable->GetFrameBy_y(&pPlayer->_expression21_frameset, &pPlayer->_expression21_animtime, pMiscTimer->uTimeElapsed); | |
2264 else | |
2265 pFrame = pPlayerFrameTable->GetFrameBy_x(v7, pPlayer->uExpressionTimePassed); | |
1407 | 2266 if (pPlayer->field_1AA2 != pFrame->uTextureID - 1 || _this ) |
1298 | 2267 { |
2268 pPlayer->field_1AA2 = pFrame->uTextureID - 1; | |
2269 pFace = (Texture *)pTextures_PlayerFaces[i][pPlayer->field_1AA2];//pFace = (Texture *)pTextures_PlayerFaces[i][pFrame->uTextureID]; | |
2270 pPortrait = pFace; | |
2271 v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i]; | |
2272 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime ) | |
2273 pRenderer->_4A6E7E(v9, 0x183u, pPortrait); | |
2274 else | |
2275 pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, pPortrait); | |
2276 auto _v1 = 0; | |
2277 v10 = pPlayer->pPlayerBuffs[14].uExpireTime > 0; | |
2278 if (pPlayer->pPlayerBuffs[1].uExpireTime > 0) | |
2279 _v1 = 1; | |
2280 v11 = pPlayer->pPlayerBuffs[8].uExpireTime > 0; | |
2281 v12 = pPlayer->pPlayerBuffs[7].uExpireTime > 0; | |
2282 v13 = pPlayer->pPlayerBuffs[13].uExpireTime > 0; | |
2283 if ( v13 | v12 | v11 | _v1 | v10 ) | |
2284 sub_441A4E(i); | |
2285 continue; | |
2286 } | |
2287 } | |
2288 if ( pParty->bTurnBasedModeOn == 1 ) | |
2289 { | |
1340 | 2290 if ( pTurnEngine->turn_stage != 1 ) |
1298 | 2291 { |
2292 if (PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player) | |
2293 { | |
2294 //v14 = 0; | |
2295 if ( pTurnEngine->uActorQueueSize > 0 ) | |
2296 { | |
2297 //v15 = (char *)pTurnEngine->pQueue; | |
2298 for (uint i = 0; i < pTurnEngine->uActorQueueSize; ++i) | |
2299 { | |
2300 auto pElem = pTurnEngine->pQueue + i; | |
2301 | |
2302 if (PID_TYPE(pElem->uPackedID) != OBJECT_Player) | |
2303 break; | |
2304 v16 = dword_5079D0; | |
2305 if ( pParty->uFlags & 0x10 ) | |
2306 { | |
2307 v16 = dword_5079CC; | |
2308 } | |
2309 else | |
2310 { | |
2311 if ( pParty->uFlags & 0x20 ) | |
2312 v16 = dword_5079C8; | |
2313 } | |
2314 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[PID_ID(pElem->uPackedID)] - 4, 0x181u, pIcons_LOD->GetTexture(v16)); | |
2315 } | |
2316 } | |
2317 } | |
2318 } | |
2319 } | |
2320 else | |
2321 { | |
2322 for (uint i = 0; i < 4; ++i) | |
2323 { | |
2324 auto pPlayer = pParty->pPlayers + i; | |
2325 if (pPlayer->CanAct() && !pPlayer->uTimeToRecovery) | |
2326 { | |
2327 v19 = dword_5079D0; | |
2328 if ( pParty->uFlags & 0x10 ) | |
2329 { | |
2330 v19 = dword_5079CC; | |
2331 } | |
2332 else | |
2333 { | |
2334 if ( pParty->uFlags & 0x20 ) | |
2335 v19 = dword_5079C8; | |
2336 } | |
2337 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] - 4, 0x181u, pIcons_LOD->GetTexture(v19)); | |
2338 } | |
2339 } | |
2340 } | |
2341 } | |
2342 | |
2343 //----- (00441D38) -------------------------------------------------------- | |
2344 void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int bRedrawOdmMinimap) | |
2345 { | |
2346 int uHeight; // ebx@6 | |
2347 __int16 v11; // cx@11 | |
2348 unsigned int v14; // ebx@23 | |
2349 int v15; // eax@23 | |
2350 __int16 v17; // di@30 | |
2351 double v18; // st7@30 | |
2352 float v19; // ST38_4@30 | |
2353 double v20; // st7@30 | |
2354 double v21; // st6@30 | |
2355 double v22; // st5@33 | |
2356 signed int v27; // eax@37 | |
2357 unsigned __int16 *v28; // ecx@37 | |
2358 signed int v29; // edi@40 | |
2359 //signed int v33; // ebx@50 | |
2360 //unsigned int v34; // eax@50 | |
2361 //signed int v35; // ecx@50 | |
2362 //unsigned __int16 v36; // di@66 | |
2363 int v37; // edi@72 | |
2364 int v38; // ebx@72 | |
2365 __int16 v39; // ax@87 | |
2366 int v40; // edi@91 | |
2367 int v41; // ebx@91 | |
2368 unsigned int v42; // eax@101 | |
2369 unsigned int v43; // ebx@101 | |
2370 unsigned int v44; // ST30_4@101 | |
2371 char *v45; // ebx@106 | |
2372 int v46; // edi@108 | |
2373 int v47; // eax@108 | |
2374 unsigned int v48; // ebx@114 | |
2375 unsigned int v49; // ST64_4@114 | |
2376 //unsigned int v51; // [sp-10h] [bp-64h]@79 | |
2377 unsigned int v52; // [sp-10h] [bp-64h]@100 | |
2378 //unsigned int v53; // [sp-Ch] [bp-60h]@79 | |
2379 unsigned int v54; // [sp-Ch] [bp-60h]@100 | |
2380 //unsigned int v55; // [sp-8h] [bp-5Ch]@77 | |
2381 unsigned int v56; // [sp-8h] [bp-5Ch]@100 | |
2382 //signed int v57; // [sp-4h] [bp-58h]@54 | |
2383 //unsigned __int16 v58; // [sp-4h] [bp-58h]@77 | |
2384 unsigned __int16 v59; // [sp-4h] [bp-58h]@100 | |
2385 //unsigned __int16 v60; // [sp+10h] [bp-44h]@66 | |
2386 //unsigned int v61; // [sp+10h] [bp-44h]@85 | |
2387 //unsigned int v63; // [sp+14h] [bp-40h]@85 | |
2388 //unsigned int v65; // [sp+18h] [bp-3Ch]@85 | |
2389 unsigned int lPitch; // [sp+20h] [bp-34h]@1 | |
2390 unsigned int lPitcha; // [sp+20h] [bp-34h]@23 | |
2391 char *lPitchb; // [sp+20h] [bp-34h]@106 | |
2392 unsigned int v69; // [sp+24h] [bp-30h]@23 | |
2393 signed int v70; // [sp+24h] [bp-30h]@37 | |
2394 //unsigned __int16 uBlue; // [sp+28h] [bp-2Ch]@1 | |
2395 signed int uBluea; // [sp+28h] [bp-2Ch]@37 | |
2396 int v73; // [sp+2Ch] [bp-28h]@30 | |
2397 int v76; // [sp+34h] [bp-20h]@91 | |
2398 int v77; // [sp+34h] [bp-20h]@108 | |
2399 //int v79; // [sp+38h] [bp-1Ch]@72 | |
2400 //char *a2c; // [sp+40h] [bp-14h]@68 | |
2401 signed int uCenterY; // [sp+48h] [bp-Ch]@1 | |
2402 signed int uCenterX; // [sp+4Ch] [bp-8h]@1 | |
2403 signed int uWidth; // [sp+5Ch] [bp+8h]@30 | |
2404 //signed int uZe; // [sp+5Ch] [bp+8h]@67 | |
2405 signed int uZf; // [sp+5Ch] [bp+8h]@85 | |
2406 signed int uZg; // [sp+5Ch] [bp+8h]@105 | |
2407 unsigned int uWa; // [sp+60h] [bp+Ch]@23 | |
2408 float uWb; // [sp+60h] [bp+Ch]@30 | |
2409 unsigned int uWd; // [sp+60h] [bp+Ch]@95 | |
2410 float uZooma; // [sp+64h] [bp+10h]@117 | |
2411 //unsigned int flagsb; // [sp+68h] [bp+14h]@66 | |
2412 Actor *flagsc; // [sp+68h] [bp+14h]@86 | |
2413 //unsigned int flagsd; // [sp+68h] [bp+14h]@105 | |
2414 | |
2415 uCenterX = (uX + uZ) / 2; | |
2416 uCenterY = (uY + uW) / 2; | |
2417 lPitch = pRenderer->uTargetSurfacePitch; | |
2418 //TargetColor(0, 0, 0); | |
2419 //uBlue = TargetColor(0, 0, 0xFFu); | |
2420 auto bWizardEyeActive = pParty->WizardEyeActive(); | |
2421 auto uWizardEyeSkillLevel = pParty->WizardEyeSkillLevel(); | |
2422 if (CheckHiredNPCSpeciality(Cartographer)) | |
2423 { | |
2424 bWizardEyeActive = true; | |
2425 uWizardEyeSkillLevel = 2; | |
2426 } | |
2427 bWizardEyeActive = true; | |
2428 uWizardEyeSkillLevel = 3; | |
2429 pRenderer->SetRasterClipRect(uX, uY, uZ - 1, uW - 1); | |
2430 uHeight = uW - uY; | |
2431 uWidth = uZ - uX; | |
2432 | |
2433 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) | |
2434 { | |
2435 v17 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2; | |
2436 auto pMapLod0 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pLevelOfDetail0_prolly_alpha_mask; | |
2437 auto pPal = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pPalette16; | |
2438 v73 = (1 << (v17 + 16)) / (signed int)uZoom; | |
2439 v18 = (double)(1 << (16 - v17)); | |
2440 v19 = v18; | |
2441 v20 = (double)(pParty->vPosition.x + 32768) / v18; | |
2442 v21 = (double)(32768 - pParty->vPosition.y) / v19; | |
2443 uWb = v21; | |
2444 switch (uZoom) | |
2445 { | |
2446 case 512: | |
2447 { | |
2448 v20 = v20 - (double)(uWidth / 2); | |
2449 v22 = (double)(uHeight / 2); | |
2450 uWb = v21 - v22; | |
2451 } | |
2452 break; | |
2453 | |
2454 case 1024: | |
2455 { | |
2456 v20 = v20 - (double)(uWidth / 4); | |
2457 v22 = (double)(uHeight / 4); | |
2458 uWb = v21 - v22; | |
2459 } | |
2460 break; | |
2461 | |
2462 case 2048: | |
2463 { | |
2464 v20 = v20 - (double)(uWidth / 8); | |
2465 v22 = (double)(uHeight / 8); | |
2466 uWb = v21 - v22; | |
2467 } | |
2468 break; | |
2469 | |
2470 default: assert(false); | |
2471 } | |
2472 assert(sizeof(pOdmMinimap) == 137 * 117 * sizeof(short)); | |
2473 | |
2474 v70 = floorf(v20 * 65536.0 + 0.5f);//LODWORD(v24); | |
2475 uBluea = floorf(uWb * 65536.0 + 0.5f);//LODWORD(v25); | |
2476 v27 = uBluea >> 16; | |
2477 v28 = &pRenderer->pTargetSurface[uX + uY * lPitch]; | |
2478 if (pMapLod0 && bRedrawOdmMinimap) | |
2479 { | |
2480 assert(uWidth == 137 && uHeight == 117); | |
2481 //auto pMinimap = (unsigned __int16 *)pOdmMinimap; | |
2482 | |
2483 auto mapWidth = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth; | |
2484 | |
2485 v29 = v70 >> 16; | |
2486 | |
2487 for (int y = 0; y < uHeight; ++y) | |
2488 { | |
2489 auto pMapLod0Line = &pMapLod0[v27 * mapWidth]; | |
2490 for (int x = 0; x < uWidth; ++x) | |
2491 { | |
2492 //*pMinimap++ = pPal[pMapLod0Line[v29]]; | |
2493 pOdmMinimap[y][x] = pPal[pMapLod0Line[v29]]; | |
2494 v29 = (v70 + x * v73) >> 16; | |
2495 } | |
2496 | |
2497 v29 = v70 >> 16; | |
2498 v28 += 137 - uWidth; | |
2499 uBluea += v73; | |
2500 v27 = uBluea >> 16; | |
2501 } | |
2502 } | |
2503 | |
2504 for (int y = 0; y < 117; ++y) | |
2505 { | |
2506 for (int x = 0; x < 137; ++x) | |
2507 { | |
2508 *v28++ = pOdmMinimap[y][x]; | |
2509 } | |
2510 v28 += lPitch - 137; | |
2511 } | |
2512 uNumBlueFacesInBLVMinimap = 0; | |
2513 } | |
2514 else | |
2515 { | |
2516 pRenderer->FillRectFast(uX, uY, uZ - uX, uHeight, 0xF); | |
2517 uNumBlueFacesInBLVMinimap = 0; | |
2518 | |
2519 for (uint i = 0; i < pIndoor->pMapOutlines->uNumOutlines; ++i) | |
2520 { | |
2521 auto pOutline = &pIndoor->pMapOutlines->pOutlines[i]; | |
2522 | |
2523 auto pFace1 = pIndoor->pFaces + pOutline->uFace1ID; | |
2524 auto pFace2 = pIndoor->pFaces + pOutline->uFace2ID; | |
2525 //v9 = pIndoor->pFaces[pMapVertex->uFace1ID].uAttributes; | |
2526 //v10 = pIndoor->pFaces[pMapVertex->uFace2ID].uAttributes; | |
2527 if (pFace1->Visible() && pFace2->Visible()) | |
2528 { | |
2529 v11 = pOutline->uFlags; | |
2530 if ( v11 & 1 ) | |
2531 goto LABEL_15; | |
2532 if (pFace1->uAttributes & 0x80 || pFace2->uAttributes & 0x80) | |
2533 goto LABEL_ABC; | |
2534 | |
2535 } | |
2536 continue; | |
2537 | |
2538 LABEL_ABC: | |
2539 pOutline->uFlags = v11 | 1; | |
2540 pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8); | |
2541 | |
2542 LABEL_15: | |
2543 //v12 = &pIndoor->pFaces[pOutline->uFace1ID]; | |
2544 if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 && | |
2545 (pFace1->uAttributes & 0x2000 || pFace2->uAttributes & 0x2000) && | |
2546 (pIndoor->pFaceExtras[pFace1->uFaceExtraID].uEventID || pIndoor->pFaceExtras[pFace2->uFaceExtraID].uEventID)) | |
2547 { | |
2548 if (uNumBlueFacesInBLVMinimap < 49) | |
2549 pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap++] = i; | |
2550 } | |
2551 else | |
2552 { | |
2553 auto _a = (uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x); | |
2554 auto _b = ((unsigned int)((unsigned __int64)_a >> 16) << 16); | |
2555 auto _c = ((signed int)(_b - uZoom * pParty->vPosition.x) >> 16); | |
2556 v69 = uCenterX + _c; | |
2557 v69 = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); | |
2558 lPitcha = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) - uZoom * pParty->vPosition.y) >> 16); | |
2559 uWa = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); | |
2560 v14 = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) - uZoom * pParty->vPosition.y) >> 16); | |
2561 v15 = abs(pOutline->sZ - pParty->vPosition.z) / 8; | |
2562 if ( v15 > 100 ) | |
2563 v15 = 100; | |
2564 pRenderer->RasterLine2D(v69, lPitcha, uWa, v14, viewparams->pPalette[-v15 + 200]); | |
2565 } | |
2566 } | |
2567 | |
2568 | |
2569 for (uint i = 0; i < uNumBlueFacesInBLVMinimap; ++i) | |
2570 { | |
2571 //v16 = (uint *)&pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[uZb]]; | |
2572 auto pOutline = &pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[i]]; | |
2573 pRenderer->RasterLine2D(uCenterX + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
2574 * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) | |
2575 - uZoom * pParty->vPosition.x) >> 16), | |
2576 uCenterY | |
2577 - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
2578 * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) | |
2579 - uZoom * pParty->vPosition.y) >> 16), | |
2580 uCenterX | |
2581 + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
2582 * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) | |
2583 - uZoom * pParty->vPosition.x) >> 16), | |
2584 uCenterY | |
2585 - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom | |
2586 * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) | |
2587 - uZoom * pParty->vPosition.y) >> 16), | |
2588 ui_game_minimap_outline_color); | |
2589 } | |
2590 } | |
2591 | |
2592 | |
2593 assert(pParty->sRotationY >= 0); | |
2594 float angle = (pParty->sRotationY % 2048) / 2048.0f; | |
2595 const float two_pi = 2.0f * 3.14159f; | |
2596 | |
2597 uint arrow_idx = floorf(0.5f + 7 * angle); | |
2598 pRenderer->DrawTextureTransparent(uCenterX - 3, uCenterY - 3, pIcons_LOD->GetTexture(pTextureIDs_pMapDirs[arrow_idx])); | |
2599 | |
2600 //flagsb = TargetColor(0, 0, 255); | |
2601 //v60 = TargetColor(255, 0, 0); | |
2602 if (bWizardEyeActive) | |
2603 { | |
2604 //uZe = 0; | |
2605 if (uWizardEyeSkillLevel >= 2) | |
2606 for (uint i = 0; i < uNumSpriteObjects; ++i) | |
2607 //if (uNumSpriteObjects > 0) | |
2608 { | |
2609 auto object = &pSpriteObjects[i]; | |
2610 | |
2611 //a2c = (char *)&pSpriteObjects[0].uObjectDescID; | |
2612 //while ( 1 ) | |
2613 //{ | |
2614 if (!object->uType || !object->uObjectDescID) | |
2615 continue; | |
2616 //if (uWizardEyeSkillLevel == 1 | |
2617 v37 = uCenterX + ((unsigned __int64)((object->vPosition.x - pParty->vPosition.x) * (signed __int64)uZoom) >> 16); | |
2618 //v79 = (unsigned __int64)((object->vPosition.y - pParty->vPosition.y) * (signed __int64)(signed int)uZoom) >> 16; | |
2619 //v38 = uCenterY - v79; | |
2620 v38 = uCenterY - ((signed __int64)((object->vPosition.y - pParty->vPosition.y) * (signed __int64)uZoom) >> 16); | |
2621 if (v37 < pRenderer->raster_clip_x || v37 > pRenderer->raster_clip_z || | |
2622 v38 < pRenderer->raster_clip_y || v38 > pRenderer->raster_clip_w) | |
2623 continue; | |
2624 | |
2625 assert(uZoom >= 512); | |
2626 if (pObjectList->pObjects[object->uObjectDescID].uFlags & OBJECT_DESC_UNPICKABLE) | |
2627 { | |
2628 pRenderer->RasterLine2D(v37, v38, v37, v38, ui_game_minimap_projectile_color); | |
2629 } | |
2630 else if (uZoom > 512) | |
2631 { | |
2632 pRenderer->RasterLine2D(v37 - 1, v38 - 1, v37 - 1, v38 + 1, ui_game_minimap_treasure_color); | |
2633 pRenderer->RasterLine2D(v37, v38 - 2, v37, v38 + 1, ui_game_minimap_treasure_color); | |
2634 pRenderer->RasterLine2D(v37 + 1, v38 - 1, v37 + 1, v38 + 1, ui_game_minimap_treasure_color); | |
2635 pRenderer->RasterLine2D(v37 - 2, v38, v37 - 2, v38 + 1, ui_game_minimap_treasure_color); | |
2636 pRenderer->RasterLine2D(v37 + 2, v38, | |
2637 v37 + 2, v38 + 1, ui_game_minimap_treasure_color); | |
2638 } | |
2639 else | |
2640 { | |
2641 pRenderer->RasterLine2D(v37 - 1, v38 - 1, | |
2642 v37 - 1, v38, ui_game_minimap_treasure_color); | |
2643 pRenderer->RasterLine2D(v37, v38 - 1, | |
2644 v37, v38, ui_game_minimap_treasure_color); | |
2645 } | |
2646 //LABEL_82: | |
2647 //LABEL_83: | |
2648 //++uZe; | |
2649 //a2c += 112; | |
2650 //if ( uZe >= (signed int)uNumSpriteObjects ) | |
2651 //{ | |
2652 //goto LABEL_85; | |
2653 //} | |
2654 //} | |
2655 } | |
2656 | |
2657 | |
2658 LABEL_85: | |
2659 //v63 = TargetColor(255, 0, 0); | |
2660 //v61 = TargetColor(0, 255, 0); | |
2661 //v65 = TargetColor(255, 255, 0); | |
2662 uZf = 0; | |
2663 if ( (signed int)uNumActors > 0 ) | |
2664 { | |
2665 flagsc = pActors.data();//[0].uAIState; | |
2666 do | |
2667 { | |
2668 v39 = flagsc->uAIState; | |
2669 if ( flagsc->uAIState != 11 && v39 != 19 && (v39 == 5 || BYTE1(flagsc->uAttributes) & 0x80) ) | |
2670 { | |
2671 v40 = ((unsigned __int64)(( flagsc->vPosition.x - pParty->vPosition.x) | |
2672 * (signed __int64)(signed int)uZoom) >> 16) | |
2673 + uCenterX; | |
2674 v76 = (unsigned __int64)(( flagsc->vPosition.y - pParty->vPosition.y) | |
2675 * (signed __int64)(signed int)uZoom) >> 16; | |
2676 v41 = uCenterY - v76; | |
2677 if ( v40 >= pRenderer->raster_clip_x ) | |
2678 { | |
2679 if ( v40 <= pRenderer->raster_clip_z && v41 >= pRenderer->raster_clip_y && v41 <= pRenderer->raster_clip_w ) | |
2680 { | |
2681 uWd = ui_game_minimap_actor_friendly_color; | |
2682 if ( BYTE3(flagsc->uAttributes) & 1 ) | |
2683 uWd = ui_game_minimap_actor_hostile_color; | |
2684 if ( flagsc->uAIState == Dead) | |
2685 uWd = ui_game_minimap_actor_corpse_color; | |
2686 if ( (signed int)uZoom > 1024 ) | |
2687 { | |
2688 pRenderer->RasterLine2D(v40 - 1, v41 - 2, v40 - 1, v41 + 2, uWd); | |
2689 pRenderer->RasterLine2D(v40, v41 - 2, v40, v41 + 2, uWd); | |
2690 pRenderer->RasterLine2D(v40 + 1, v41 - 2, v40 + 1, v41 + 2, uWd); | |
2691 v42 = v41 + 1; | |
2692 v43 = v41 - 1; | |
2693 v44 = v42; | |
2694 pRenderer->RasterLine2D(v40 - 2, v43, v40 - 2, v42, uWd); | |
2695 v40 += 2; | |
2696 v59 = uWd; | |
2697 v56 = v44; | |
2698 v54 = v40; | |
2699 v52 = v43; | |
2700 } | |
2701 else | |
2702 { | |
2703 pRenderer->RasterLine2D(v40 - 1, v41 - 1, v40 - 1, uCenterY - v76, uWd); | |
2704 v59 = uWd; | |
2705 v56 = uCenterY - v76; | |
2706 v54 = v40; | |
2707 v52 = v41 - 1; | |
2708 } | |
2709 pRenderer->RasterLine2D(v40, v52, v54, v56, v59); | |
2710 } | |
2711 } | |
2712 } | |
2713 ++uZf; | |
2714 ++flagsc; | |
2715 } | |
2716 while ( uZf < (signed int)uNumActors ); | |
2717 } | |
2718 } | |
2719 | |
2720 | |
2721 //flagsd = TargetColor(255, 255, 255); | |
2722 uZg = 0; | |
2723 if ( (signed int)uNumLevelDecorations > 0 ) | |
2724 { | |
2725 v45 = (char *)&pLevelDecorations[0].vPosition; | |
2726 lPitchb = (char *)&pLevelDecorations[0].vPosition; | |
2727 do | |
2728 { | |
2729 if ( *(v45 - 2) & 8 ) | |
2730 { | |
2731 v46 = ((unsigned __int64)((*(int *)v45 - pParty->vPosition.x) * (signed __int64)(signed int)uZoom) >> 16) | |
2732 + uCenterX; | |
2733 v77 = (unsigned __int64)((*((int *)v45 + 1) - pParty->vPosition.y) * (signed __int64)(signed int)uZoom) >> 16; | |
2734 v47 = uCenterY - v77; | |
2735 if ( v46 >= pRenderer->raster_clip_x ) | |
2736 { | |
2737 if ( v46 <= pRenderer->raster_clip_z && v47 >= pRenderer->raster_clip_y && v47 <= pRenderer->raster_clip_w ) | |
2738 { | |
2739 if ( (signed int)uZoom > 512 ) | |
2740 { | |
2741 v48 = v47 + 1; | |
2742 v49 = v47 - 1; | |
2743 pRenderer->RasterLine2D(v46 - 1, v47 - 1, v46 - 1, v47 + 1, ui_game_minimap_decoration_color_1); | |
2744 pRenderer->RasterLine2D(v46, v49, v46, v48, ui_game_minimap_decoration_color_1); | |
2745 pRenderer->RasterLine2D(v46 + 1, v49, v46 + 1, v48, ui_game_minimap_decoration_color_1); | |
2746 v45 = lPitchb; | |
2747 } | |
2748 else | |
2749 { | |
2750 pRenderer->RasterLine2D(v46, uCenterY - v77, v46, uCenterY - v77, ui_game_minimap_decoration_color_1); | |
2751 } | |
2752 } | |
2753 } | |
2754 } | |
2755 ++uZg; | |
2756 v45 += 32; | |
2757 lPitchb = v45; | |
2758 } | |
2759 while ( uZg < (signed int)uNumLevelDecorations ); | |
2760 } | |
2761 pRenderer->DrawTextureTransparent(0x1D4u, 0, pIcons_LOD->GetTexture(dword_5079D8)); | |
2762 uZooma = (double)pParty->sRotationY * 0.1171875; | |
2763 //v50 = uZooma + 6.7553994e15; | |
2764 pRenderer->SetTextureClipRect(541, 0, 567, 480); | |
2765 pRenderer->DrawTextureIndexed(floorf(uZooma + 0.5f) + 285, 136, pIcons_LOD->GetTexture(dword_5079B4)); | |
2766 pRenderer->ResetTextureClipRect(); | |
2767 } | |
2768 | |
2769 //----- (00441498) -------------------------------------------------------- | |
1458 | 2770 void GameUI_DrawTorchlightAndWizardEye() |
1298 | 2771 { |
2772 if (pCurrentScreen == SCREEN_GAME | |
2773 || pCurrentScreen == SCREEN_MENU | |
2774 || pCurrentScreen == SCREEN_OPTIONS | |
2775 || pCurrentScreen == SCREEN_REST | |
2776 || pCurrentScreen == SCREEN_SPELL_BOOK | |
2777 || pCurrentScreen == SCREEN_CHEST | |
2778 || pCurrentScreen == SCREEN_SAVEGAME | |
2779 || pCurrentScreen == SCREEN_LOADGAME | |
2780 || pCurrentScreen == SCREEN_CHEST_INVENTORY | |
2781 || pCurrentScreen == SCREEN_BOOKS | |
2782 || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG ) | |
2783 { | |
2784 if (pParty->TorchlightActive()) | |
2785 { | |
2786 auto icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnum_Torchlight->uIconID, pEventTimer->Time()); | |
2787 pRenderer->DrawTextureTransparent(pUIAnum_Torchlight->x, pUIAnum_Torchlight->y, pIcons_LOD->GetTexture(icon->uTextureID)); | |
2788 } | |
2789 if (pParty->WizardEyeActive()) | |
2790 { | |
2791 auto icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnim_WizardEye->uIconID, pEventTimer->Time()); | |
2792 pRenderer->DrawTextureTransparent(pUIAnim_WizardEye->x, pUIAnim_WizardEye->y, pIcons_LOD->GetTexture(icon->uTextureID)); | |
2793 } | |
2794 } | |
2795 } | |
2796 // 4E28F8: using guessed type int pCurrentScreen; | |
2797 | |
2798 | |
2799 //----- (00491F87) -------------------------------------------------------- | |
2800 void GameUI_DrawHiredNPCs() | |
2801 { | |
2802 //int v6; // eax@15 | |
2803 char v7; // al@17 | |
2804 unsigned int v8; // eax@18 | |
2805 int v9; // esi@18 | |
2806 int v10; // eax@18 | |
2807 unsigned int v11; // eax@19 | |
2808 unsigned int v12; // esi@19 | |
2809 unsigned int v13; // eax@23 | |
2810 IconFrame *v14; // eax@24 | |
2811 unsigned int v15; // eax@26 | |
2812 char pContainer[20]; // [sp+Ch] [bp-30h]@18 | |
2813 unsigned int v17; // [sp+20h] [bp-1Ch]@19 | |
2814 signed int uFrameID; // [sp+24h] [bp-18h]@19 | |
2815 //int i; // [sp+28h] [bp-14h]@15 | |
2816 unsigned int v20; // [sp+2Ch] [bp-10h]@20 | |
2817 unsigned int v21; // [sp+30h] [bp-Ch]@19 | |
2818 int v22; // [sp+34h] [bp-8h]@2 | |
2819 unsigned __int8 v23; // [sp+3Bh] [bp-1h]@2 | |
2820 | |
2821 if ( bNoNPCHiring != 1 ) | |
2822 { | |
2823 v23 = 0; | |
2824 v22 = 0; | |
2825 /*for (uint i = 0; i < 2; ++i) | |
2826 { | |
2827 if (pParty->pHirelings[i].pName) | |
2828 pTmpBuf[v22++] = i; | |
2829 }*/ | |
2830 if (pParty->pHirelings[0].pName) | |
2831 pTmpBuf[v22++] = 0; | |
2832 if (pParty->pHirelings[1].pName) | |
2833 pTmpBuf[v22++] = 1; | |
2834 | |
2835 for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) | |
2836 { | |
2837 if (pNPCStats->pNewNPCData[i].uFlags & 128) | |
2838 { | |
2839 if (!pParty->pHirelings[0].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[0].pName)) | |
2840 { | |
2841 if (!pParty->pHirelings[1].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[1].pName)) | |
2842 pTmpBuf[v22++] = i + 2; | |
2843 } | |
2844 } | |
2845 } | |
2846 | |
2847 //v6 = (unsigned __int8)pParty->field_709; | |
2848 for ( int i = (unsigned __int8)pParty->field_709; i < v22 && v23 < 2; i++ ) | |
2849 { | |
2850 v7 = pTmpBuf[i]; | |
2851 if ( (unsigned __int8)v7 >= 2 ) | |
2852 { | |
2853 sprintf(pContainer, "NPC%03d", pNPCStats->pNPCData[(unsigned __int8)v7 + 499].uPortraitID); | |
2854 v15 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); | |
2855 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[v23], pHiredNPCsIconsOffsetsY[v23], pIcons_LOD->GetTexture(v15)); | |
2856 } | |
2857 else | |
2858 { | |
2859 sprintf(pContainer, "NPC%03d", pParty->pHirelings[(unsigned __int8)v7].uPortraitID); | |
2860 v8 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); | |
2861 v9 = v23; | |
2862 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[v9], pHiredNPCsIconsOffsetsY[v9], pIcons_LOD->GetTexture(v8)); | |
2863 v10 = (unsigned __int8)pTmpBuf[i]; | |
2864 if ( pParty->pHirelings[v10].evt_A == 1 ) | |
2865 { | |
2866 uFrameID = pParty->pHirelings[v10].evt_B; | |
2867 v11 = pHiredNPCsIconsOffsetsX[v9]; | |
2868 v12 = pHiredNPCsIconsOffsetsY[v9]; | |
2869 v17 = v11; | |
2870 v21 = 0; | |
2871 if ( (signed int)pIconsFrameTable->uNumIcons <= 0 ) | |
2872 { | |
2873 LABEL_23: | |
2874 v13 = 0; | |
2875 } | |
2876 else | |
2877 { | |
2878 v20 = 0; | |
2879 while ( _stricmp("spell96", pIconsFrameTable->pIcons[v20 / 0x20].pAnimationName) ) | |
2880 { | |
2881 ++v21; | |
2882 v20 += 32; | |
2883 if ( (signed int)v21 >= (signed int)pIconsFrameTable->uNumIcons ) | |
2884 goto LABEL_23; | |
2885 } | |
2886 v13 = v21; | |
2887 } | |
2888 v14 = pIconsFrameTable->GetFrame(v13, uFrameID); | |
2889 pRenderer->DrawTextureTransparent(v17, v12, &pIcons_LOD->pTextures[v14->uTextureID]); | |
2890 } | |
2891 } | |
2892 ++v23; | |
2893 } | |
2894 } | |
2895 } | |
2896 // 6BE3C5: using guessed type char bNoNPCHiring; | |
2897 | |
2898 //----- (004178FE) -------------------------------------------------------- | |
2899 unsigned int __fastcall UI_GetHealthManaStringColor(signed int a1, signed int a2) | |
2900 { | |
2901 unsigned __int16 v2; // dx@2 | |
2902 unsigned __int16 v3; // cx@2 | |
2903 int v5; // eax@5 | |
2904 unsigned __int16 v6; // [sp-4h] [bp-8h]@2 | |
2905 | |
2906 if ( a1 <= a2 ) | |
2907 { | |
2908 if ( a1 == a2 ) | |
2909 return 0; | |
2910 v5 = 100 * a1 / a2; | |
2911 v3 = 255; | |
2912 if ( v5 >= 25 ) | |
2913 { | |
2914 v6 = 100; | |
2915 v2 = 255; | |
2916 } | |
2917 else | |
2918 { | |
2919 v6 = 0; | |
2920 v2 = 0; | |
2921 } | |
2922 } | |
2923 else | |
2924 { | |
2925 v6 = 0; | |
2926 v2 = 255; | |
2927 v3 = 0; | |
2928 } | |
2929 return TargetColor(v3, v2, v6); | |
2930 } | |
2931 | |
2932 //----- (00417939) -------------------------------------------------------- | |
1458 | 2933 int GetConditionDrawColor(unsigned int uConditionIdx) |
1298 | 2934 { |
1458 | 2935 switch (uConditionIdx) |
1298 | 2936 { |
1458 | 2937 case Condition_Zombie: |
2938 case Condition_Good: | |
2939 return ui_character_condition_normal_color; | |
2940 | |
2941 case Condition_Cursed: | |
2942 case Condition_Weak: | |
2943 case Condition_Fear: | |
2944 case Condition_Drunk: | |
2945 case Condition_Insane: | |
2946 case Condition_Poison1: | |
2947 case Condition_Disease1: | |
2948 return ui_character_condition_light_color; | |
2949 | |
2950 case Condition_Sleep: | |
2951 case Condition_Poison2: | |
2952 case Condition_Disease2: | |
2953 case Condition_Paralyzed: | |
2954 case Condition_Unconcious: | |
2955 return ui_character_condition_moderate_color; | |
2956 | |
2957 case Condition_Poison3: | |
2958 case Condition_Disease3: | |
2959 case Condition_Dead: | |
2960 case Condition_Pertified: | |
2961 case Condition_Eradicated: | |
2962 return ui_character_condition_severe_color; | |
1298 | 2963 } |
1458 | 2964 assert(false && "Invalid condition"); |
1298 | 2965 } |