2501
|
1 #define _CRTDBG_MAP_ALLOC
|
|
2 #include <stdlib.h>
|
|
3 #include <crtdbg.h>
|
|
4
|
|
5 #define _CRT_SECURE_NO_WARNINGS
|
|
6 #include "..\../Engine/Events.h"
|
|
7 #include "..\../Engine/Graphics/Texture.h"
|
|
8 #include "..\../Engine/MM7.h"
|
|
9 #include "..\../Engine/ErrorHandling.h"
|
|
10
|
2502
|
11 #include "..\../IO/Mouse.h"
|
|
12 #include "..\../IO/Keyboard.h"
|
2501
|
13 #include "..\../Engine/mm7_data.h"
|
|
14
|
|
15 #include "..\../Engine/Graphics/Vis.h"
|
|
16 #include "..\../Engine/MapInfo.h"
|
|
17 #include "..\../Engine/Game.h"
|
2502
|
18 #include "..\../GUI/GUIWindow.h"
|
|
19 #include "..\../GUI/GUIFont.h"
|
2501
|
20 #include "..\../Engine/Party.h"
|
2502
|
21 #include "..\../Media/Audio/AudioPlayer.h"
|
2501
|
22 #include "..\../Engine/Graphics/Outdoor.h"
|
|
23 #include "..\../Engine/LOD.h"
|
|
24 #include "..\../Engine/Objects/Actor.h"
|
|
25 #include "..\../Engine/Graphics/Viewport.h"
|
|
26 #include "..\../Engine/Objects/SpriteObject.h"
|
|
27 #include "..\../Engine/Objects/ObjectList.h"
|
|
28 #include "..\../Engine/Graphics/DecorationList.h"
|
|
29 #include "..\../Engine/Tables/PlayerFrameTable.h"
|
|
30 #include "..\../Engine/stru123.h"
|
|
31 #include "..\../Engine/Timer.h"
|
|
32 #include "..\../Engine/Tables/IconFrameTable.h"
|
|
33 #include "..\../Engine/TurnEngine/TurnEngine.h"
|
|
34 #include "..\../Engine/texts.h"
|
|
35 #include "UIHouses.h"
|
|
36 #include "..\../Engine/Graphics/BSPModel.h"
|
|
37 #include "..\../Engine/OurMath.h"
|
|
38 #include "..\../Engine/Graphics/Level/Decoration.h"
|
|
39 #include "..\../Engine/Objects/Chest.h"
|
|
40 #include "UIGame.h"
|
|
41
|
|
42 #include "..\../Engine/Graphics/Overlays.h"
|
|
43
|
|
44 #include "..\../Engine/Graphics/Sprites.h"
|
|
45 #include "..\../Engine/Graphics/PaletteManager.h"
|
|
46
|
|
47 int uTextureID_GameUI_CharSelectionFrame; // 50C98C
|
|
48
|
|
49 //----- (00421D00) --------------------------------------------------------
|
|
50 void __fastcall GameUI_OnPlayerPortraitLeftClick(unsigned int uPlayerID)
|
|
51 {
|
|
52 Player* player = &pParty->pPlayers[uPlayerID - 1];
|
|
53 if (pParty->pPickedItem.uItemID)
|
|
54 {
|
|
55 if (int slot = player->AddItem(-1, pParty->pPickedItem.uItemID))
|
|
56 {
|
|
57 memcpy(&player->pInventoryItemList[slot-1], &pParty->pPickedItem, 0x24u);
|
|
58 viewparams->bRedrawGameUI = true;
|
|
59 pMouse->RemoveHoldingItem();
|
|
60 return;
|
|
61 }
|
|
62
|
|
63 if (!player->CanAct())
|
|
64 {
|
|
65 player = pPlayers[uActiveCharacter];
|
|
66 }
|
|
67 if( player->CanAct() || !pPlayers[uActiveCharacter]->CanAct() )
|
|
68 player->PlaySound(SPEECH_NoRoom, 0);
|
|
69 }
|
|
70
|
|
71 if (pCurrentScreen == SCREEN_GAME)
|
|
72 {
|
|
73 viewparams->bRedrawGameUI = true;
|
|
74 if ( uActiveCharacter != uPlayerID )
|
|
75 {
|
|
76 if ( pPlayers[uPlayerID]->uTimeToRecovery )
|
|
77 return;
|
|
78
|
|
79 uActiveCharacter = uPlayerID;
|
|
80 return;
|
|
81 }
|
|
82 pGUIWindow_CurrentMenu = CharacterUI_Initialize(7);
|
|
83 return;
|
|
84 }
|
|
85 if ( pCurrentScreen == SCREEN_SPELL_BOOK )
|
|
86 return;
|
|
87 if ( pCurrentScreen == SCREEN_CHEST )
|
|
88 {
|
|
89 viewparams->bRedrawGameUI = true;
|
|
90 if ( uActiveCharacter == uPlayerID )
|
|
91 {
|
|
92 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103;
|
|
93 pCurrentScreen = SCREEN_CHEST_INVENTORY;
|
|
94 uActiveCharacter = uPlayerID;
|
|
95 return;
|
|
96 }
|
|
97 if ( pPlayers[uPlayerID]->uTimeToRecovery )
|
|
98 return;
|
|
99 uActiveCharacter = uPlayerID;
|
|
100 return;
|
|
101 }
|
|
102 if ( pCurrentScreen != SCREEN_HOUSE )
|
|
103 {
|
|
104 if ( pCurrentScreen == SCREEN_E )
|
|
105 {
|
|
106 uActiveCharacter = uPlayerID;
|
|
107 return;
|
|
108 }
|
|
109 if ( pCurrentScreen != SCREEN_CHEST_INVENTORY )
|
|
110 {
|
|
111 viewparams->bRedrawGameUI = true;
|
|
112 uActiveCharacter = uPlayerID;
|
|
113 if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 102 )
|
|
114 FillAwardsData();
|
|
115 return;
|
|
116 }
|
|
117 viewparams->bRedrawGameUI = true;
|
|
118 if ( uActiveCharacter == uPlayerID )
|
|
119 {
|
|
120 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103;
|
|
121 pCurrentScreen = SCREEN_CHEST_INVENTORY;
|
|
122 uActiveCharacter = uPlayerID;
|
|
123 return;
|
|
124 }
|
|
125 if ( pPlayers[uPlayerID]->uTimeToRecovery )
|
|
126 return;
|
|
127 uActiveCharacter = uPlayerID;
|
|
128 return;
|
|
129 }
|
|
130 if ( window_SpeakInHouse->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
|
|
131 return;
|
|
132 viewparams->bRedrawGameUI = true;
|
|
133 if ( uActiveCharacter != uPlayerID )
|
|
134 {
|
|
135 uActiveCharacter = uPlayerID;
|
|
136 return;
|
|
137 }
|
|
138 if (dialog_menu_id == HOUSE_DIALOGUE_SHOP_BUY_STANDARD || dialog_menu_id == HOUSE_DIALOGUE_SHOP_6)
|
|
139 {
|
|
140 __debugbreak(); // fix indexing
|
|
141 pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103;
|
|
142 pGUIWindow_CurrentMenu = CharacterUI_Initialize(14);
|
|
143 return;
|
|
144 }
|
|
145 }
|
|
146 // 4E28F8: using guessed type int pCurrentScreen;
|
|
147 // F8B19C: using guessed type int dword_F8B19C;
|
|
148
|
|
149 //----- (00416B01) --------------------------------------------------------
|
|
150 void GameUI_DrawNPCPopup(void *_this)//PopupWindowForBenefitAndJoinText
|
|
151 {
|
|
152 int v1; // edi@2
|
|
153 NPCData *pNPC; // eax@16
|
|
154 const CHAR *pText; // eax@18
|
|
155 char *v11; // esi@26
|
|
156 GUIWindow popup_window; // [sp+Ch] [bp-60h]@23
|
|
157 int a2; // [sp+60h] [bp-Ch]@16
|
|
158 LPCSTR lpsz; // [sp+68h] [bp-4h]@6
|
|
159
|
|
160 if ( bNoNPCHiring != 1 )
|
|
161 {
|
|
162 v1 = 0;
|
|
163 /*do
|
|
164 {
|
|
165 if ( v3->pName )
|
|
166 pTmpBuf[v1++] = v2;
|
|
167 ++v3;
|
|
168 ++v2;
|
|
169 }
|
|
170 while ( (signed int)v3 < (signed int)&pParty->pPickedItem );*/
|
|
171 for (int i = 0; i < 2; ++i)
|
|
172 {
|
|
173 if (pParty->pHirelings[i].pName)
|
|
174 pTmpBuf[v1++] = i;
|
|
175 }
|
|
176 lpsz = 0;
|
|
177 if ( (signed int)pNPCStats->uNumNewNPCs > 0 )
|
|
178 {
|
|
179 /*v4 = pNPCStats->pNewNPCData;
|
|
180 do
|
|
181 {
|
|
182 if ( v4->uFlags & 0x80
|
|
183 && (!pParty->pHirelings[0].pName || strcmp(v4->pName, pParty->pHirelings[0].pName))
|
|
184 && (!pParty->pHirelings[1].pName || strcmp(v4->pName, pParty->pHirelings[1].pName)) )
|
|
185 pTmpBuf[v1++] = (char)lpsz + 2;
|
|
186 ++lpsz;
|
|
187 ++v4;
|
|
188 }
|
|
189 while ( (signed int)lpsz < (signed int)pNPCStats->uNumNewNPCs );*/
|
|
190 for ( uint i = 0; i < pNPCStats->uNumNewNPCs; ++i )
|
|
191 {
|
|
192 if (pNPCStats->pNewNPCData[i].Hired())
|
|
193 {
|
|
194 if (!pParty->pHirelings[0].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[0].pName))
|
|
195 {
|
|
196 if (!pParty->pHirelings[1].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[1].pName))
|
|
197 pTmpBuf[v1++] = i + 2;
|
|
198 }
|
|
199 }
|
|
200 }
|
|
201 }
|
|
202 if ( (signed int)((char *)_this + pParty->hirelingScrollPosition) < v1 )
|
|
203 {
|
|
204 sDialogue_SpeakingActorNPC_ID = -1 - pParty->hirelingScrollPosition - (int)_this;
|
|
205 pNPC = GetNewNPCData(sDialogue_SpeakingActorNPC_ID, &a2);
|
|
206 if ( pNPC )
|
|
207 {
|
|
208 if ( a2 == 57 )
|
|
209 pText = pNPCTopics[512].pText; // Baby dragon
|
|
210 else
|
|
211 pText = (const CHAR *)pNPCStats->pProfessions[pNPC->uProfession].pBenefits;
|
|
212 lpsz = pText;
|
|
213 if ( !pText )
|
|
214 {
|
|
215 lpsz = (LPCSTR)pNPCStats->pProfessions[pNPC->uProfession].pJoinText;
|
|
216 if ( !lpsz )
|
|
217 lpsz = "";
|
|
218 }
|
|
219 popup_window.Hint = nullptr;
|
|
220 popup_window.uFrameX = 38;
|
|
221 popup_window.uFrameY = 60;
|
|
222 popup_window.uFrameWidth = 276;
|
|
223 popup_window.uFrameZ = 313;
|
|
224 popup_window.uFrameHeight = pFontArrus->CalcTextHeight(lpsz, &popup_window, 0, 0) + 2 * LOBYTE(pFontArrus->uFontHeight) + 24;
|
|
225 if ( (signed int)popup_window.uFrameHeight < 130 )
|
|
226 popup_window.uFrameHeight = 130;
|
|
227 popup_window.uFrameWidth = 400;
|
|
228 popup_window.uFrameZ = popup_window.uFrameX + 399;
|
|
229 popup_window.DrawMessageBox(0);
|
|
230 sprintfex(pTmpBuf2.data(), "NPC%03d", pNPC->uPortraitID);
|
|
231 pRenderer->DrawTextureIndexed(popup_window.uFrameX + 22, popup_window.uFrameY + 36,
|
|
232 (Texture *)(pIcons_LOD->LoadTexture(pTmpBuf2.data(), TEXTURE_16BIT_PALETTE) != -1
|
|
233 ? &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pTmpBuf2.data(), TEXTURE_16BIT_PALETTE)] : 0));
|
|
234 if ( pNPC->uProfession )
|
|
235 {
|
|
236 v11 = pTmpBuf.data();
|
|
237 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], pNPC->pName, aNPCProfessionNames[pNPC->uProfession]);
|
|
238 }
|
|
239 else
|
|
240 {
|
|
241 v11 = pTmpBuf.data();
|
|
242 strcpy(pTmpBuf.data(), pNPC->pName);
|
|
243 }
|
|
244 popup_window.DrawTitleText(pFontArrus, 0, 12, Color16(0xFFu, 0xFFu, 0x9Bu), v11, 3);
|
|
245 popup_window.uFrameWidth -= 24;
|
|
246 popup_window.uFrameZ = popup_window.uFrameX + popup_window.uFrameWidth - 1;
|
|
247 popup_window.DrawText(pFontArrus, 100, 36, 0, BuildDialogueString((char *)lpsz, uActiveCharacter - 1, 0, 0, 0, 0), 0, 0, 0);
|
|
248 }
|
|
249 }
|
|
250 }
|
|
251 }
|
|
252
|
|
253 //----- (00445D4A) --------------------------------------------------------
|
|
254 void GameUI_InitializeDialogue(Actor *actor, int bPlayerSaysHello)
|
|
255 {
|
|
256 NPCData *pNPCInfo; // ebp@1
|
|
257 int v9; // esi@8
|
|
258 int pNumberContacts; // eax@11
|
|
259 char pContainer[32]; // [sp+14h] [bp-28h]@3
|
|
260
|
|
261 dword_A74CDC = -1;
|
|
262 pNPCStats->dword_AE336C_LastMispronouncedNameFirstLetter = -1;
|
|
263 pEventTimer->Pause();
|
|
264 pMiscTimer->Pause();
|
|
265 pAudioPlayer->StopChannels(-1, -1);
|
|
266 uDialogueType = 0;
|
|
267 sDialogue_SpeakingActorNPC_ID = actor->sNPC_ID;
|
|
268 pDialogue_SpeakingActor = actor;
|
|
269 pNPCInfo = GetNPCData(actor->sNPC_ID);
|
|
270 if ( (pNPCInfo->uFlags & 3) != 2 )
|
|
271 pNPCInfo->uFlags = pNPCInfo->uFlags + 1;
|
|
272
|
|
273 switch (pParty->alignment)
|
|
274 {
|
|
275 case PartyAlignment_Good: sprintfex(pContainer, "evt%02d-b", const_2()); break;
|
|
276 case PartyAlignment_Neutral: sprintfex(pContainer, "evt%02d", const_2()); break;
|
|
277 case PartyAlignment_Evil: sprintfex(pContainer, "evt%02d-c", const_2()); break;
|
|
278 }
|
|
279
|
|
280 pDialogueNPCCount = 0;
|
|
281 uNumDialogueNPCPortraits = 1;
|
|
282 pTexture_Dialogue_Background = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE);
|
|
283 sprintfex(pContainer, "npc%03u", pNPCInfo->uPortraitID);
|
|
284 v9 = 0;
|
|
285 pDialogueNPCPortraits[0] = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE);
|
|
286 dword_591084 = areWeLoadingTexture;
|
|
287 uTextureID_right_panel_loop = uTextureID_right_panel;
|
|
288 if ( !pNPCInfo->Hired() && pNPCInfo->Location2D >= 0 )
|
|
289 {
|
|
290 if ( (signed int)pParty->GetPartyFame() <= pNPCInfo->fame
|
|
291 || (pNumberContacts = pNPCInfo->uFlags & 0xFFFFFF7F, (pNumberContacts & 0x80000000u) != 0) )
|
|
292 {
|
|
293 v9 = 1;
|
|
294 }
|
|
295 else
|
|
296 {
|
|
297 if ( pNumberContacts > 1 )
|
|
298 {
|
|
299 if ( pNumberContacts == 2 )
|
|
300 {
|
|
301 v9 = 3;
|
|
302 }
|
|
303 else
|
|
304 {
|
|
305 if ( pNumberContacts != 3 )
|
|
306 {
|
|
307 if ( pNumberContacts != 4 )
|
|
308 v9 = 1;
|
|
309 }
|
|
310 else
|
|
311 {
|
|
312 v9 = 2;
|
|
313 }
|
|
314 }
|
|
315 }
|
|
316 else if ( pNPCInfo->rep )
|
|
317 {
|
|
318 v9 = 2;
|
|
319 }
|
|
320 }
|
|
321 }
|
|
322 if (sDialogue_SpeakingActorNPC_ID < 0)
|
|
323 v9 = 4;
|
|
324 pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Dialogue, 3, 0);//pNumberContacts = 1, v9 = 0; pNumberContacts = 2, v9 = 3;
|
|
325 if (pNPCInfo->Hired() && !pNPCInfo->bHasUsedTheAbility)
|
|
326 {
|
|
327 if (pNPCInfo->uProfession == 10 || //Healer
|
|
328 pNPCInfo->uProfession == 11 || //Expert Healer
|
|
329 pNPCInfo->uProfession == 12 || //Master Healer
|
|
330 pNPCInfo->uProfession == 33 || //Cook
|
|
331 pNPCInfo->uProfession == 34 || //Chef
|
|
332 pNPCInfo->uProfession == 39 || //Wind Master
|
|
333 pNPCInfo->uProfession == 40 || //Water Master
|
|
334 pNPCInfo->uProfession == 41 || //Gate Master
|
|
335 pNPCInfo->uProfession == 42 || //Chaplain
|
|
336 pNPCInfo->uProfession == 43 || //Piper
|
|
337 pNPCInfo->uProfession == 52 //Fallen Wizard
|
|
338 )
|
|
339 {
|
|
340 pDialogueWindow->CreateButton(480, 250, 140, LOBYTE(pFontArrus->uFontHeight) - 3, 1, 0, UIMSG_SelectNPCDialogueOption, 9, 0, "", 0);
|
|
341 pDialogueWindow->_41D08F_set_keyboard_control_group(4, 1, 0, 1);
|
|
342 }
|
|
343 }
|
|
344
|
|
345 pDialogueWindow->CreateButton( 61, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0);
|
|
346 pDialogueWindow->CreateButton(177, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0);
|
|
347 pDialogueWindow->CreateButton(292, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0);
|
|
348 pDialogueWindow->CreateButton(407, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0);
|
|
349
|
|
350 if (bPlayerSaysHello && uActiveCharacter && !pNPCInfo->Hired())
|
|
351 {
|
|
352 if (pParty->uCurrentHour < 5 || pParty->uCurrentHour > 21)
|
|
353 pPlayers[uActiveCharacter]->PlaySound(SPEECH_GoodEvening, 0);
|
|
354 else
|
|
355 pPlayers[uActiveCharacter]->PlaySound(SPEECH_GoodDay, 0);
|
|
356 }
|
|
357 }
|
|
358
|
|
359 //----- (00445350) --------------------------------------------------------
|
|
360 void GameUI_DrawDialogue()
|
|
361 {
|
|
362 NPCData *pNPC; // ebx@2
|
|
363 int pGreetType; // eax@2
|
|
364 int pTextHeight; // esi@39
|
|
365 GUIButton *pButton; // eax@43
|
|
366 int all_text_height; // ebx@93
|
|
367 signed int index; // esi@99
|
|
368 int v42; // edi@102
|
|
369 int v45;
|
|
370 unsigned __int16 pTextColor; // ax@104
|
|
371 GUIWindow window; // [sp+ACh] [bp-68h]@42
|
|
372 // GUIFont *pOutString; // [sp+10Ch] [bp-8h]@39
|
|
373 const char *pInString=nullptr; // [sp+110h] [bp-4h]@32
|
|
374
|
|
375 if ( !pDialogueWindow )
|
|
376 return;
|
|
377
|
|
378 // Window title( )----
|
|
379 memcpy(&window, pDialogueWindow, sizeof(window));
|
|
380 pNPC = GetNPCData(sDialogue_SpeakingActorNPC_ID);
|
|
381 pGreetType = GetGreetType(sDialogue_SpeakingActorNPC_ID);
|
|
382 window.uFrameWidth -= 10;
|
|
383 window.uFrameZ -= 10;
|
|
384 pRenderer->DrawTextureIndexed(477, 0, pTexture_Dialogue_Background);
|
|
385 pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_right_panel_loop != -1 ? &pIcons_LOD->pTextures[uTextureID_right_panel_loop] : 0));
|
|
386 pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0] - 4, pNPCPortraits_y[0][0] - 4, (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0));
|
|
387 pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pDialogueNPCPortraits[0]);
|
|
388
|
|
389 if (pNPC->uProfession)
|
|
390 {
|
|
391 assert(pNPC->uProfession < sizeof(aNPCProfessionNames) / sizeof(*aNPCProfessionNames.data())); // sometimes buffer overflows; errors emerge both here and in dialogue text
|
|
392 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], pNPC->pName, aNPCProfessionNames[pNPC->uProfession]);//^Pi[%s] %s
|
|
393 }
|
|
394 else if (pNPC->pName)
|
|
395 strcpy(pTmpBuf.data(), pNPC->pName);
|
|
396
|
|
397 window.DrawTitleText(pFontArrus, 483, 112, ui_game_dialogue_npc_name_color, pTmpBuf.data(), 3);
|
|
398 pParty->GetPartyFame();
|
|
399
|
|
400 pInString = nullptr;
|
|
401 switch (uDialogueType)
|
|
402 {
|
|
403 case DIALOGUE_13:
|
|
404 pInString = BuildDialogueString(pNPCStats->pProfessions[pNPC->uProfession].pJoinText, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
405 break;
|
|
406
|
|
407 case DIALOGUE_PROFESSION_DETAILS:
|
|
408 {
|
|
409 //auto prof = pNPCStats->pProfessions[pNPC->uProfession];
|
|
410
|
|
411 if (dialogue_show_profession_details)
|
|
412 pInString = BuildDialogueString(pNPCStats->pProfessions[pNPC->uProfession].pBenefits, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
413 else if (pNPC->Hired())
|
|
414 pInString = BuildDialogueString(pNPCStats->pProfessions[pNPC->uProfession].pDismissText, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
415 else
|
|
416 pInString = BuildDialogueString(pNPCStats->pProfessions[pNPC->uProfession].pJoinText, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
417 }
|
|
418 break;
|
|
419
|
|
420
|
|
421 case DIALOGUE_ARENA_WELCOME:
|
|
422 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:"
|
|
423 break;
|
|
424
|
|
425 case DIALOGUE_ARENA_FIGHT_NOT_OVER_YET:
|
|
426 pInString = pGlobalTXT_LocalizationStrings[577]; //"Get back in there you wimps:"
|
|
427 break;
|
|
428
|
|
429 case DIALOGUE_ARENA_REWARD:
|
|
430 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[576], gold_transaction_amount);// "Congratulations on your win: here's your stuff: %u gold."
|
|
431 pInString = pTmpBuf.data();
|
|
432 break;
|
|
433
|
|
434 case DIALOGUE_ARENA_ALREADY_WON:
|
|
435 pInString = pGlobalTXT_LocalizationStrings[582]; // "You already won this trip to the Arena:"
|
|
436 break;
|
|
437
|
|
438 default:
|
|
439 if (uDialogueType > DIALOGUE_18 && uDialogueType < DIALOGUE_EVT_E && !byte_5B0938[0])
|
|
440 {
|
|
441 pInString = (char *)current_npc_text;
|
|
442 }
|
|
443 else if (pGreetType == 1)//QuestNPC_greet
|
|
444 {
|
|
445 if (pNPC->greet)
|
|
446 {
|
|
447 if ((pNPC->uFlags & 3) == 2)
|
|
448 pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting2;
|
|
449 else
|
|
450 pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting1;
|
|
451 }
|
|
452 }
|
|
453 else if (pGreetType == 2)//HiredNPC_greet
|
|
454 {
|
|
455 NPCProfession* prof = &pNPCStats->pProfessions[pNPC->uProfession];
|
|
456
|
|
457 if (pNPC->Hired())
|
|
458 pInString = BuildDialogueString(prof->pDismissText, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
459 else
|
|
460 pInString = BuildDialogueString(prof->pJoinText, uActiveCharacter - 1, 0, 0, 0, 0);
|
|
461 }
|
|
462 break;
|
|
463 }
|
|
464
|
|
465 // Message window( )----
|
|
466 if (pInString)
|
|
467 {
|
|
468 window.uFrameWidth = game_viewport_width;
|
|
469 window.uFrameZ = 452;
|
|
470 GUIFont* font = pFontArrus;
|
|
471 pTextHeight = pFontArrus->CalcTextHeight(pInString, &window, 13, 0) + 7;
|
|
472 if ( 352 - pTextHeight < 8 )
|
|
473 {
|
|
474 font = pFontCreate;
|
|
475 pTextHeight = pFontCreate->CalcTextHeight(pInString, &window, 13, 0) + 7;
|
|
476 }
|
|
477 if (uTextureID_Leather != -1)
|
|
478 pRenderer->GetLeather(8, 352 - pTextHeight, &pIcons_LOD->pTextures[uTextureID_Leather], pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight - pTextHeight);
|
|
479 pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
|
|
480 pDialogueWindow->DrawText(font, 13, 354 - pTextHeight, 0, FitTextInAWindow(pInString, font, &window, 13, 0), 0, 0, 0);
|
|
481 }
|
|
482 // Right panel( )-------
|
|
483 memcpy(&window, pDialogueWindow, sizeof(window));
|
|
484 window.uFrameX = 483;
|
|
485 window.uFrameWidth = 148;
|
|
486 window.uFrameZ = 334;
|
|
487 for (int i = window.pStartingPosActiveItem; i < window.pStartingPosActiveItem + window.pNumPresenceButton; ++i)
|
|
488 {
|
|
489 pButton = window.GetControl(i);
|
|
490 if ( !pButton )
|
|
491 break;
|
|
492
|
|
493 if ( pButton->msg_param > 88 )
|
|
494 pButton->pButtonName[0] = 0;
|
|
495 else if (pButton->msg_param == 88)
|
|
496 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[581]); // Lord
|
|
497 else if (pButton->msg_param == 87)
|
|
498 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[580]); // Knight
|
|
499 else if (pButton->msg_param == 86)
|
|
500 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[579]); // Squire
|
|
501 else if (pButton->msg_param == 85)
|
|
502 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[578]); // Page
|
|
503 else if (pButton->msg_param == 77)
|
|
504 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[407]); // Details
|
|
505 else if (pButton->msg_param == 76)
|
|
506 {
|
|
507 if (pNPC->Hired())
|
|
508 sprintf(pButton->pButtonName, (const char*)pGlobalTXT_LocalizationStrings[408], pNPC->pName); // Release %s
|
|
509 else
|
|
510 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[406]); // Hire
|
|
511 }
|
|
512 else if (pButton->msg_param == 24)
|
|
513 {
|
|
514 __debugbreak(); // learn conditions of this event
|
|
515 if (!pNPC->evt_F)
|
|
516 {
|
|
517 pButton->pButtonName[0] = 0;
|
|
518 pButton->msg_param = 0;
|
|
519 }
|
|
520 else
|
|
521 strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_F].pTopic);
|
|
522 }
|
|
523 else if (pButton->msg_param == 9)
|
|
524 strcpy(pButton->pButtonName, GetProfessionActionText(pNPC->uProfession));
|
|
525 else if (pButton->msg_param == 19) // Scavenger Hunt
|
|
526 {
|
|
527 if (!pNPC->evt_A)
|
|
528 {
|
|
529 pButton->pButtonName[0] = 0;
|
|
530 pButton->msg_param = 0;
|
|
531 }
|
|
532 else
|
|
533 strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_A].pTopic);
|
|
534 }
|
|
535 else if (pButton->msg_param == 20) // Scavenger Hunt
|
|
536 {
|
|
537 if (!pNPC->evt_B)
|
|
538 {
|
|
539 pButton->pButtonName[0] = 0;
|
|
540 pButton->msg_param = 0;
|
|
541 }
|
|
542 else strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_B].pTopic);
|
|
543 }
|
|
544 else if (pButton->msg_param == 21)
|
|
545 {
|
|
546 //__debugbreak(); // learn conditions of this event
|
|
547 if (!pNPC->evt_C)
|
|
548 {
|
|
549 pButton->pButtonName[0] = 0;
|
|
550 pButton->msg_param = 0;
|
|
551 }
|
|
552 else strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_C].pTopic);
|
|
553 }
|
|
554 else if (pButton->msg_param == 22)
|
|
555 {
|
|
556 //__debugbreak(); // learn conditions of this event
|
|
557 if (!pNPC->evt_D)
|
|
558 {
|
|
559 pButton->pButtonName[0] = 0;
|
|
560 pButton->msg_param = 0;
|
|
561 }
|
|
562 else strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_D].pTopic);
|
|
563 }
|
|
564 else if (pButton->msg_param == 23)
|
|
565 {
|
|
566 //__debugbreak(); // learn conditions of this event
|
|
567 if (!pNPC->evt_E)
|
|
568 {
|
|
569 pButton->pButtonName[0] = 0;
|
|
570 pButton->msg_param = 0;
|
|
571 }
|
|
572 else strcpy(pButton->pButtonName, pNPCTopics[pNPC->evt_E].pTopic);
|
|
573 }
|
|
574 else if (pButton->msg_param == 13)
|
|
575 {
|
|
576 if (pNPC->Hired())
|
|
577 sprintf(pButton->pButtonName, pGlobalTXT_LocalizationStrings[408], pNPC->pName); // Release %s
|
|
578 else
|
|
579 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[122]); // Join
|
|
580 }
|
|
581 else
|
|
582 pButton->pButtonName[0] = 0;
|
|
583
|
|
584 if (pParty->field_7B5_in_arena_quest && pParty->field_7B5_in_arena_quest != -1)
|
|
585 {
|
|
586 int num_dead_actors = 0;
|
|
587 pInString = nullptr;
|
|
588 for ( uint i = 0; i < uNumActors; ++i )
|
|
589 {
|
|
590 if (pActors[i].uAIState == Dead || pActors[i].uAIState == Removed || pActors[i].uAIState == Disabled)
|
|
591 ++num_dead_actors;
|
|
592 else
|
|
593 {
|
|
594 int sumonner_type = PID_TYPE(pActors[i].uSummonerID);
|
|
595 if (sumonner_type == OBJECT_Player)
|
|
596 ++num_dead_actors;
|
|
597 }
|
|
598 }
|
|
599 if (num_dead_actors == uNumActors)
|
|
600 strcpy(pButton->pButtonName, pGlobalTXT_LocalizationStrings[658]); // Collect Prize
|
|
601 }
|
|
602 }
|
|
603
|
|
604 // Install Buttons( )--------
|
|
605 index = 0;
|
|
606 all_text_height = 0;
|
|
607 for ( int i = pDialogueWindow->pStartingPosActiveItem;
|
|
608 i < pDialogueWindow->pStartingPosActiveItem + pDialogueWindow->pNumPresenceButton; ++i )
|
|
609 {
|
|
610 pButton = pDialogueWindow->GetControl(i);
|
|
611 if ( !pButton )
|
|
612 break;
|
|
613 all_text_height += pFontArrus->CalcTextHeight(pButton->pButtonName, &window, 0, 0);
|
|
614 index++;
|
|
615 }
|
|
616 if ( index )
|
|
617 {
|
|
618 v45 = (174 - all_text_height) / index;
|
|
619 if ( v45 > 32 )
|
|
620 v45 = 32;
|
|
621 v42 = (174 - v45 * index - all_text_height)/ 2 - v45 / 2 + 138;
|
|
622 for ( int i = pDialogueWindow->pStartingPosActiveItem;
|
|
623 i < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem; ++i )
|
|
624 {
|
|
625 pButton = pDialogueWindow->GetControl(i);
|
|
626 if ( !pButton )
|
|
627 break;
|
|
628 pButton->uY = (unsigned int)(v45 + v42);
|
|
629 pTextHeight = pFontArrus->CalcTextHeight(pButton->pButtonName, &window, 0, 0);
|
|
630 pButton->uHeight = pTextHeight;
|
|
631 v42 = pButton->uY + pTextHeight - 1;
|
|
632 pButton->uW = v42;
|
|
633 pTextColor = ui_game_dialogue_option_normal_color;
|
|
634 if ( pDialogueWindow->pCurrentPosActiveItem == i )
|
|
635 pTextColor = ui_game_dialogue_option_highlight_color;
|
|
636 window.DrawTitleText(pFontArrus, 0, pButton->uY, pTextColor, pButton->pButtonName, 3);
|
|
637 }
|
|
638 }
|
|
639 pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
|
|
640 }
|
|
641
|
|
642 //----- (00444FBE) --------------------------------------------------------
|
|
643 void GameUI_DrawBranchlessDialogue()
|
|
644 {
|
|
645 int pTextHeight; // esi@4
|
|
646 char Str[200]; // [sp+Ch] [bp-120h]@12
|
|
647 GUIWindow BranchlessDlg_window; // [sp+D4h] [bp-58h]@4
|
|
648 GUIFont *pFont; // [sp+128h] [bp-4h]@1
|
|
649
|
|
650 pFont = pFontArrus;
|
|
651 if ( current_npc_text && !byte_5B0938[0] )
|
|
652 strcpy(byte_5B0938.data(), current_npc_text);
|
|
653 BranchlessDlg_window.uFrameWidth = game_viewport_width;
|
|
654 BranchlessDlg_window.uFrameZ = 452;
|
|
655 pTextHeight = pFontArrus->CalcTextHeight(byte_5B0938.data(), &BranchlessDlg_window, 12, 0) + 7;
|
|
656 if ( 352 - pTextHeight < 8 )
|
|
657 {
|
|
658 pFont = pFontCreate;
|
|
659 pTextHeight = pFontCreate->CalcTextHeight(byte_5B0938.data(), &BranchlessDlg_window, 12, 0) + 7;
|
|
660 }
|
|
661 pRenderer->GetLeather(8, 352 - pTextHeight, pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight - pTextHeight);
|
|
662 pRenderer->DrawTextureIndexed(8, 347 - pTextHeight, pTexture_591428);
|
|
663 pGUIWindow2->DrawText(pFont, 12, 354 - pTextHeight, 0, FitTextInAWindow(byte_5B0938.data(), pFont, &BranchlessDlg_window, 12, 0), 0, 0, 0);
|
|
664 pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar);
|
|
665 if ( pGUIWindow2->receives_keyboard_input_2 != WINDOW_INPUT_IN_PROGRESS)
|
|
666 {
|
|
667 if ( pGUIWindow2->receives_keyboard_input_2 == WINDOW_INPUT_CONFIRMED)
|
|
668 {
|
|
669 pGUIWindow2->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
|
|
670 strcpy(GameUI_Footer_TimedString.data(), pKeyActionMap->pPressedKeysBuffer);
|
|
671 sub_4452BB();
|
|
672 return;
|
|
673 }
|
|
674 if ( pGUIWindow2->receives_keyboard_input_2 != WINDOW_INPUT_CANCELLED)
|
|
675 return;
|
|
676 pGUIWindow2->receives_keyboard_input_2 = WINDOW_INPUT_NONE;
|
|
677 memset(GameUI_Footer_TimedString.data(), 0, 0xC8u);
|
|
678 sub_4452BB();
|
|
679 return;
|
|
680 }
|
|
681 if ( pGUIWindow2->ptr_1C == (void *)26 )
|
|
682 {
|
|
683 sprintf(Str, "%s %s", GameUI_Footer_TimedString, pKeyActionMap->pPressedKeysBuffer);
|
|
684 pGUIWindow2->DrawText(pFontLucida, 13, 357, 0, Str, 0, 0, 0);
|
|
685 pGUIWindow2->DrawFlashingInputCursor(pFontLucida->GetLineWidth(Str) + 13, 357, pFontLucida);
|
|
686 return;
|
|
687 }
|
|
688 if ( pKeyActionMap->pPressedKeysBuffer[0] )
|
|
689 {
|
|
690 pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE);
|
|
691 memset(GameUI_Footer_TimedString.data(), 0, 0xC8u);
|
|
692 sub_4452BB();
|
|
693 return;
|
|
694 }
|
|
695 }
|
|
696
|
|
697 //----- (004443D5) --------------------------------------------------------
|
|
698 const char *GameUI_GetMinimapHintText()
|
|
699 {
|
|
700 double v3; // st7@1
|
|
701 int v7; // eax@4
|
|
702 const char *v14; // eax@8
|
|
703 char *result; // eax@12
|
|
704 unsigned int pMapID; // eax@14
|
|
705 int global_coord_X; // [sp+10h] [bp-1Ch]@1
|
|
706 int global_coord_Y; // [sp+14h] [bp-18h]@1
|
|
707 unsigned int pY; // [sp+1Ch] [bp-10h]@1
|
|
708 unsigned int pX; // [sp+28h] [bp-4h]@1
|
|
709
|
|
710 result = 0;
|
|
711 pMouse->GetClickPos(&pX, &pY);
|
|
712 v3 = 1.0 / (float)((signed int)viewparams->uMinimapZoom * 0.000015258789);
|
|
713 global_coord_X = (signed __int64)((double)(pX - 557) * v3 + (double)pParty->vPosition.x);
|
|
714 global_coord_Y = (signed __int64)((double)pParty->vPosition.y - (double)(pY - 74) * v3);
|
|
715 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor || pOutdoor->uNumBModels <= 0 )
|
|
716 {
|
|
717 pMapID = pMapStats->GetMapInfo(pCurrentMapName);
|
|
718 if ( pMapID == 0 )
|
|
719 result = "No Maze Info for this maze on file!";
|
|
720 else
|
|
721 result = pMapStats->pInfos[pMapID].pName;
|
|
722 }
|
|
723 else
|
|
724 {
|
|
725 for ( uint j = 0; j < (uint)pOutdoor->uNumBModels; ++j )
|
|
726 {
|
|
727 v7 = int_get_vector_length(abs((signed)pOutdoor->pBModels[j].vBoundingCenter.x - global_coord_X),
|
|
728 abs((signed)pOutdoor->pBModels[j].vBoundingCenter.y - global_coord_Y), 0);
|
|
729 if ( v7 < 2 * pOutdoor->pBModels[j].sBoundingRadius )
|
|
730 {
|
|
731 if ( pOutdoor->pBModels[j].uNumFaces )
|
|
732 {
|
|
733 for ( uint i = 0; i < (uint)pOutdoor->pBModels[j].uNumFaces; ++i )
|
|
734 {
|
|
735 if ( pOutdoor->pBModels[j].pFaces[i].sCogTriggeredID )
|
|
736 {
|
|
737 if ( !(pOutdoor->pBModels[j].pFaces[i].uAttributes & FACE_HAS_EVENT) )
|
|
738 {
|
|
739 v14 = GetEventHintString(pOutdoor->pBModels[j].pFaces[i].sCogTriggeredID);
|
|
740 if ( v14 )
|
|
741 {
|
|
742 if ( _stricmp(v14, "") )
|
|
743 result = (char *)v14;
|
|
744 }
|
|
745 }
|
|
746 }
|
|
747 }
|
|
748 }
|
|
749 if ( result )
|
|
750 return result;
|
|
751 }
|
|
752 }
|
|
753 pMapID = pMapStats->GetMapInfo(pCurrentMapName);
|
|
754 if ( pMapID == 0 )
|
|
755 result = "No Maze Info for this maze on file!";
|
|
756 else
|
|
757 result = pMapStats->pInfos[pMapID].pName;
|
|
758 return result;
|
|
759 }
|
|
760 return result;
|
|
761 }
|
|
762
|
|
763 //----- (0041D3B7) --------------------------------------------------------
|
|
764 void GameUI_CharacterQuickRecord_Draw(GUIWindow *window, Player *player)
|
|
765 {
|
|
766 Texture *v13; // eax@6
|
|
767 PlayerFrame *v15; // eax@12
|
|
768 unsigned int pTextColor; // eax@15
|
|
769 const char *v29; // eax@16
|
|
770 int v36; // esi@22
|
|
771 const char *v39; // eax@24
|
|
772 signed int uFramesetID; // [sp+20h] [bp-8h]@9
|
|
773 int uFramesetIDa; // [sp+20h] [bp-8h]@18
|
|
774
|
|
775 uint numActivePlayerBuffs = 0;
|
|
776 for (uint i = 0; i < 24; ++i)
|
|
777 if (player->pPlayerBuffs[i].uExpireTime > 0)
|
|
778 ++numActivePlayerBuffs;
|
|
779
|
|
780 window->uFrameHeight = ((pFontArrus->uFontHeight + 162) + ((numActivePlayerBuffs - 1) * pFontArrus->uFontHeight));
|
|
781 window->uFrameZ = window->uFrameWidth + window->uFrameX - 1;
|
|
782 window->uFrameW = ((pFontArrus->uFontHeight + 162) + ((numActivePlayerBuffs - 1) * pFontArrus->uFontHeight)) + window->uFrameY - 1;
|
|
783 window->DrawMessageBox(0);
|
|
784
|
|
785 if (player->IsEradicated())
|
|
786 v13 = pTexture_PlayerFaceEradicated;
|
|
787 else if (player->IsDead())
|
|
788 v13 = pTexture_PlayerFaceDead;
|
|
789 else
|
|
790 {
|
|
791 uFramesetID = pPlayerFrameTable->GetFrameIdByExpression(player->expression);
|
|
792 if ( !uFramesetID )
|
|
793 uFramesetID = 1;
|
|
794 if ( player->expression == CHARACTER_EXPRESSION_21)
|
|
795 v15 = pPlayerFrameTable->GetFrameBy_y(&player->_expression21_frameset, &player->_expression21_animtime, pMiscTimer->uTimeElapsed);
|
|
796 else
|
|
797 v15 = pPlayerFrameTable->GetFrameBy_x(uFramesetID, pMiscTimer->Time());
|
|
798 player->field_1AA2 = v15->uTextureID - 1;
|
|
799 v13 = pTextures_PlayerFaces[(unsigned int)window->ptr_1C][v15->uTextureID - 1];
|
|
800 }
|
|
801
|
|
802 pRenderer->DrawTextureTransparent(window->uFrameX + 24, window->uFrameY + 24, v13);
|
|
803
|
|
804 sprintfex(pTmpBuf.data(), "\f%05d", ui_character_header_text_color);
|
|
805 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[429], player->pName, pClassNames[player->classType]); // "%s the %s"
|
|
806 strcat(pTmpBuf.data(), pTmpBuf2.data());
|
|
807 strcat(pTmpBuf.data(), "\f00000\n");
|
|
808
|
|
809 pTextColor = UI_GetHealthManaAndOtherQualitiesStringColor(player->sHealth, player->GetMaxHealth());
|
|
810 sprintfex(pTmpBuf2.data(), "%s : \f%05u%d\f00000 / %d\n", pGlobalTXT_LocalizationStrings[108], // "Hit Points"
|
|
811 pTextColor, player->sHealth, player->GetMaxHealth());
|
|
812 strcat(pTmpBuf.data(), pTmpBuf2.data());
|
|
813
|
|
814 pTextColor = UI_GetHealthManaAndOtherQualitiesStringColor(player->sMana, player->GetMaxMana());
|
|
815 sprintfex(pTmpBuf2.data(), "%s : \f%05u%d\f00000 / %d\n", pGlobalTXT_LocalizationStrings[212], // "Spell Points"
|
|
816 pTextColor, player->sMana, player->GetMaxMana());
|
|
817 strcat(pTmpBuf.data(), pTmpBuf2.data());
|
|
818
|
|
819 pTextColor = player->GetMajorConditionIdx();
|
|
820 sprintfex(pTmpBuf2.data(), "%s: \f%05d%s\f00000\n", pGlobalTXT_LocalizationStrings[47], // "Condition
|
|
821 GetConditionDrawColor(pTextColor), aCharacterConditionNames[pTextColor]);
|
|
822 strcat(pTmpBuf.data(), pTmpBuf2.data());
|
|
823
|
|
824 if ( player->uQuickSpell )
|
|
825 v29 = pSpellStats->pInfos[player->uQuickSpell].pShortName;
|
|
826 else
|
|
827 v29 = pGlobalTXT_LocalizationStrings[153];
|
|
828 sprintfex(pTmpBuf2.data(), "%s: %s", pGlobalTXT_LocalizationStrings[172], v29); // "Quick Spell"
|
|
829 strcat(pTmpBuf.data(), pTmpBuf2.data());
|
|
830
|
|
831 window->DrawText(pFontArrus, 120, 22, 0, pTmpBuf.data(), 0, 0, 0);
|
|
832
|
|
833 uFramesetIDa = 0;
|
|
834 for (uint i = 0; i < 24; ++i)
|
|
835 {
|
|
836 SpellBuff* buff = &player->pPlayerBuffs[i];
|
|
837 if (buff->uExpireTime > 0)
|
|
838 {
|
|
839 v36 = uFramesetIDa++ * pFontComic->uFontHeight + 134;
|
|
840 window->DrawText(pFontComic, 52, v36, ui_game_character_record_playerbuff_colors[i], aSpellNames[20 + i], 0, 0, 0);
|
|
841 DrawBuff_remaining_time_string(v36, window, buff->uExpireTime - pParty->uTimePlayed, pFontComic);
|
|
842 }
|
|
843 }
|
|
844
|
|
845 v39 = "";
|
|
846 if ( uFramesetIDa == 0 )
|
|
847 v39 = pGlobalTXT_LocalizationStrings[153]; // "None"
|
|
848 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[450], v39); // "Active Spells: %s"
|
|
849 window->DrawText(pFontArrus, 14, 114, 0, pTmpBuf.data(), 0, 0, 0);
|
|
850 }
|
|
851
|
|
852 //----- (0041A57E) --------------------------------------------------------
|
|
853 void GameUI_QuickRef_Draw()
|
|
854 {
|
|
855 unsigned int pTextColor; // eax@7
|
|
856 unsigned int pX; // [sp+14h] [bp-18h]@2
|
|
857 unsigned int pY; // edi@9
|
|
858 int pSkillsCount; // ecx@27
|
|
859 const char *pText; // eax@38
|
|
860 int pFontHeight; // [sp+18h] [bp-14h]@1
|
|
861
|
|
862 pRenderer->DrawTextureIndexed(8, 8, pIcons_LOD->LoadTexturePtr("quikref", TEXTURE_16BIT_PALETTE));
|
|
863 pFontHeight = LOBYTE(pFontArrus->uFontHeight) + 1;
|
|
864 for ( uint i = 0; i < 4; ++i )
|
|
865 {
|
|
866 Player* player = &pParty->pPlayers[i];
|
|
867 pX = 94 * i + 89;
|
|
868 if ( i == 0 )
|
|
869 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, 18, 0, pGlobalTXT_LocalizationStrings[149], 60, 0);//Name
|
|
870 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 94 * i + 89, 18, ui_character_header_text_color, player->pName, 84, 0);
|
|
871 if ( i == 0 )
|
|
872 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, 47, 0, pGlobalTXT_LocalizationStrings[131], 60, 0); //.
|
|
873 sprintf(pTmpBuf.data(), "%lu", player->GetActualLevel());
|
|
874 if ( player->GetActualLevel() <= player->GetBaseLevel())
|
|
875 pTextColor = player->GetExperienceDisplayColor();
|
|
876 else
|
|
877 pTextColor = ui_character_bonus_text_color;
|
|
878 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, 47, pTextColor, pTmpBuf.data(), 84, 0);
|
|
879 pY = pFontHeight + 47;
|
|
880 if ( i == 0 )
|
|
881 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pFontHeight + 47, 0, pGlobalTXT_LocalizationStrings[41], 60, 0);//
|
|
882 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, pClassNames[player->classType], 84, 0);
|
|
883 pY = pFontHeight + pY;
|
|
884 if ( i == 0 )
|
|
885 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[107], 60, 0);//.
|
|
886 sprintf(pTmpBuf.data(), "%d", player->sHealth);
|
|
887 pTextColor = UI_GetHealthManaAndOtherQualitiesStringColor(player->sHealth, player->GetMaxHealth());
|
|
888 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, pTextColor, pTmpBuf.data(), 84, 0);
|
|
889 pY = pFontHeight + pY;
|
|
890 if ( i == 0 )
|
|
891 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[209], 60, 0);//
|
|
892 sprintf(pTmpBuf.data(), "%d", player->sMana);
|
|
893 pTextColor = UI_GetHealthManaAndOtherQualitiesStringColor(player->sMana, player->GetMaxMana());
|
|
894 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, pTextColor, pTmpBuf.data(), 84, 0);
|
|
895 pY = pFontHeight + pY;
|
|
896 if ( i == 0 )
|
|
897 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[0], 60, 0);//
|
|
898 sprintf(pTmpBuf.data(), "%d", player->GetActualAC());
|
|
899 pTextColor = UI_GetHealthManaAndOtherQualitiesStringColor(player->GetActualAC(), player->GetBaseAC());
|
|
900 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, pTextColor, pTmpBuf.data(), 84, 0);
|
|
901 pY = pFontHeight + pY;
|
|
902 if ( !i )
|
|
903 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[18], 60, 0);//
|
|
904 sprintf(pTmpBuf.data(), "%+d", player->GetActualAttack(false));
|
|
905 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, pTmpBuf.data(), 84, 0);
|
|
906 pY = pFontHeight + pY;
|
|
907 if ( !i )
|
|
908 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[66], 60, 0);//.
|
|
909 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, player->GetMeleeDamageString(), 84, 0);
|
|
910 pY = pFontHeight + pY;
|
|
911 if ( !i )
|
|
912 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[203], 60, 0);//
|
|
913 sprintf(pTmpBuf.data(), "%+d", player->GetRangedAttack());
|
|
914 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, pTmpBuf.data(), 84, 0);
|
|
915 pY = pFontHeight + pY;
|
|
916 if ( !i )
|
|
917 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[66], 60, 0);//.
|
|
918 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, player->GetRangedDamageString(), 84, 0);
|
|
919 pY = pFontHeight + pY;
|
|
920 if ( !i )
|
|
921 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[205], 60, 0);//
|
|
922 pSkillsCount = 0;
|
|
923 for ( uint j = 0; j <= 36; ++j )
|
|
924 {
|
|
925 if ( player->pActiveSkills[j] )
|
|
926 ++pSkillsCount;
|
|
927 }
|
|
928 sprintf(pTmpBuf.data(), "%lu", pSkillsCount);
|
|
929 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, pTmpBuf.data(), 84, 0);
|
|
930 pY = pFontHeight + pY;
|
|
931 if ( !i )
|
|
932 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[168], 60, 0);//
|
|
933 sprintf(pTmpBuf.data(), "%lu", player->uSkillPoints);
|
|
934 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, player->uSkillPoints ? ui_character_bonus_text_color : ui_character_default_text_color, pTmpBuf.data(), 84, 0);
|
|
935 pY = pFontHeight + pY;
|
|
936 if ( !i )
|
|
937 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[45], 60, 0);//.
|
|
938 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, pTextColor, aCharacterConditionNames[player->GetMajorConditionIdx()], 84, 0);
|
|
939 pY = pFontHeight + pY;
|
|
940 if ( !i )
|
|
941 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 22, pY, 0, pGlobalTXT_LocalizationStrings[170], 60, 0);//..
|
|
942 if (player->uQuickSpell)
|
|
943 pText = pSpellStats->pInfos[player->uQuickSpell].pShortName;
|
|
944 else
|
|
945 pText = pGlobalTXT_LocalizationStrings[153];//
|
|
946 pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, pX, pY, 0, pText, 84, 0);
|
|
947 }
|
|
948
|
|
949 if ( pParty->GetPartyReputation() >= 0 )
|
|
950 {
|
|
951 if ( pParty->GetPartyReputation() <= 5 )
|
|
952 pTextColor = ui_character_default_text_color;
|
|
953 else
|
|
954 pTextColor = ui_character_bonus_text_color_neg;
|
|
955 }
|
|
956 else
|
|
957 pTextColor = ui_character_bonus_text_color;
|
|
958
|
|
959 sprintf(pTmpBuf.data(), "%s: \f%05d%s\f00000", pGlobalTXT_LocalizationStrings[180], pTextColor, GetReputationString(pParty->GetPartyReputation()));//Reputation
|
|
960 pGUIWindow_CurrentMenu->DrawText(pFontArrus, 22, 323, 0, pTmpBuf.data(), 0, 0, 0);
|
|
961 sprintf(pTmpBuf.data(), "\r261%s: %d", pGlobalTXT_LocalizationStrings[84], pParty->GetPartyFame());// Fame
|
|
962 pGUIWindow_CurrentMenu->DrawText(pFontArrus, 0, 323, 0, pTmpBuf.data(), 0, 0, 0);
|
|
963 }
|
|
964
|
|
965 //----- (0041AD6E) --------------------------------------------------------
|
|
966 void GameUI_DrawRightPanelItems()
|
|
967 {
|
|
968 if ( (unsigned long long)GameUI_RightPanel_BookFlashTimer > pParty->uTimePlayed )
|
|
969 GameUI_RightPanel_BookFlashTimer = 0;
|
|
970
|
|
971 if ( pParty->uTimePlayed - GameUI_RightPanel_BookFlashTimer > 128 )
|
|
972 {
|
|
973 GameUI_RightPanel_BookFlashTimer = pParty->uTimePlayed;
|
|
974
|
|
975 static bool byte_50697C = false; // 50697C
|
|
976 byte_50697C = !byte_50697C;
|
|
977 if ( byte_50697C && pCurrentScreen != SCREEN_REST )
|
|
978 {
|
|
979 if (bFlashQuestBook) pRenderer->DrawTextureTransparent(493, 355, pIcons_LOD->GetTexture(uTextureID_ib_td1_A));
|
|
980 if (bFlashAutonotesBook) pRenderer->DrawTextureTransparent(527, 353, pIcons_LOD->GetTexture(uTextureID_ib_td2_A));
|
|
981 if (bFlashHistoryBook) pRenderer->DrawTextureTransparent(600, 361, pIcons_LOD->GetTexture(uTextureID_ib_td5_A));
|
|
982 }
|
|
983 else
|
|
984 {
|
|
985 pRenderer->DrawTextureRGB(468, 0, pTexture_RightFrame);
|
|
986 GameUI_DrawHiredNPCs();
|
|
987 }
|
|
988 }
|
|
989 }
|
|
990
|
|
991 //----- (0041AEBB) --------------------------------------------------------
|
|
992 void GameUI_DrawFoodAndGold()
|
|
993 {
|
|
994 int text_y; // esi@2
|
|
995
|
|
996 if ( uGameState != GAME_STATE_FINAL_WINDOW )
|
|
997 {
|
|
998 text_y = _44100D_should_alter_right_panel() != 0 ? 381 : 322;
|
|
999 sprintf(pTmpBuf.data(), "\r087%lu", pParty->uNumFoodRations);
|
|
1000 pPrimaryWindow->DrawText(pFontSmallnum, 0, text_y, uGameUIFontMain, pTmpBuf.data(), 0, 0, uGameUIFontShadow);
|
|
1001 sprintf(pTmpBuf.data(), "\r028%lu", pParty->uNumGold);
|
|
1002 pPrimaryWindow->DrawText(pFontSmallnum, 0, text_y, uGameUIFontMain, pTmpBuf.data(), 0, 0, uGameUIFontShadow);
|
|
1003 }
|
|
1004 }
|
|
1005
|
|
1006 //----- (0041B0C9) --------------------------------------------------------
|
|
1007 void GameUI_DrawLifeManaBars()
|
|
1008 {
|
|
1009 double v3; // st7@3
|
|
1010 double v7; // st7@25
|
|
1011 Texture *pTextureHealth; // [sp-4h] [bp-30h]@10
|
|
1012 Texture *pTextureMana; // [sp+Ch] [bp-20h]@1
|
|
1013
|
|
1014 pTextureMana = pIcons_LOD->GetTexture(uTextureID_BarBlue);
|
|
1015 for (uint i = 0; i < 4; ++i)
|
|
1016 {
|
|
1017 if (pParty->pPlayers[i].sHealth > 0)
|
|
1018 {
|
|
1019 int v17 = 0;
|
|
1020 if (i == 2 || i == 3)
|
|
1021 v17 = 2;
|
|
1022 v3 = (double)pParty->pPlayers[i].sHealth / (double)pParty->pPlayers[i].GetMaxHealth();
|
|
1023 if( v3 > 0.5 )
|
|
1024 {
|
|
1025 if ( v3 > 1.0 )
|
|
1026 v3 = 1.0;
|
|
1027 pTextureHealth = pIcons_LOD->GetTexture(uTextureID_BarGreen);
|
|
1028 }
|
|
1029 else if ( v3 > 0.25 )
|
|
1030 pTextureHealth = pIcons_LOD->GetTexture(uTextureID_BarYellow);
|
|
1031 else if ( v3 > 0.0 )
|
|
1032 pTextureHealth = pIcons_LOD->GetTexture(uTextureID_BarRed);
|
|
1033 if( v3 > 0.0 )
|
|
1034 {
|
|
1035 pRenderer->SetTextureClipRect(v17 + pHealthBarPos[i], (signed __int64)((1.0 - v3) * pTextureHealth->uTextureHeight) + 402,
|
|
1036 v17 + pHealthBarPos[i] + pTextureHealth->uTextureWidth, pTextureHealth->uTextureHeight + 402);
|
|
1037 pRenderer->DrawTextureIndexed(v17 + pHealthBarPos[i], 402, pTextureHealth);
|
|
1038 pRenderer->ResetTextureClipRect();
|
|
1039 }
|
|
1040 }
|
|
1041 if (pParty->pPlayers[i].sMana > 0)
|
|
1042 {
|
|
1043 v7 = pParty->pPlayers[i].sMana / (double)pParty->pPlayers[i].GetMaxMana();
|
|
1044 if ( v7 > 1.0 )
|
|
1045 v7 = 1.0;
|
|
1046 int v17 = 0;
|
|
1047 if (i == 2)
|
|
1048 v17 = 1;
|
|
1049 pRenderer->SetTextureClipRect(v17 + pManaBarPos[i], (signed __int64)((1.0 - v7) * pTextureMana->uTextureHeight) + 402,
|
|
1050 v17 + pManaBarPos[i] + pTextureMana->uTextureWidth, pTextureMana->uTextureHeight + 402);
|
|
1051 pRenderer->DrawTextureIndexed(v17 + pManaBarPos[i], 402, pTextureMana);
|
|
1052 pRenderer->ResetTextureClipRect();
|
|
1053 }
|
|
1054 }
|
|
1055 }
|
|
1056
|
|
1057 //----- (0041B3B6) --------------------------------------------------------
|
|
1058 void GameUI_DrawRightPanel()
|
|
1059 {
|
|
1060 pRenderer->DrawTextureTransparent(pViewport->uViewportBR_X, 0, pIcons_LOD->GetTexture(uTextureID_right_panel));
|
|
1061 }
|
|
1062
|
|
1063 //----- (0041B3E2) --------------------------------------------------------
|
|
1064 void GameUI_DrawRightPanelFrames()
|
|
1065 {
|
|
1066 pRenderer->DrawTextureRGB(0, 0, pTexture_TopFrame);
|
|
1067 pRenderer->DrawTextureRGB(0, 8, pTexture_LeftFrame);
|
|
1068 pRenderer->DrawTextureRGB(468, 0, pTexture_RightFrame);
|
|
1069 pRenderer->DrawTextureRGB(0, 352, pTexture_BottomFrame);
|
|
1070 GameUI_DrawFoodAndGold();
|
|
1071 GameUI_DrawRightPanelItems();
|
|
1072 }
|
|
1073
|
|
1074 //----- (0041C047) --------------------------------------------------------
|
|
1075 void GameUI_Footer_2()
|
|
1076 {
|
|
1077 char *v1; // edx@2
|
|
1078 int v5; // eax@5
|
|
1079
|
|
1080 pRenderer->DrawTextureRGB(0, 352, pTexture_StatusBar);
|
|
1081 if (GameUI_Footer_TimeLeft)
|
|
1082 v1 = GameUI_Footer_TimedString.data();
|
|
1083 else
|
|
1084 {
|
|
1085 if (!pFooterString[0])
|
|
1086 return;
|
|
1087 v1 = pFooterString.data();
|
|
1088 }
|
|
1089
|
|
1090 v5 = pFontLucida->AlignText_Center(450, v1);
|
|
1091 pPrimaryWindow->DrawText(pFontLucida, v5 + 11, 357, uGameUIFontMain, v1, 0, 0, uGameUIFontShadow);
|
|
1092 }
|
|
1093
|
|
1094 //----- (0041C0B8) --------------------------------------------------------
|
|
1095 void GameUI_SetFooterString(const char *pStr)
|
|
1096 {
|
|
1097 const char *v1; // esi@1
|
|
1098
|
|
1099 v1 = pStr;
|
|
1100 if ( pStr && strcmp(pStr, "test") && !IsBadStringPtrA(pStr, 1) && (*v1 || GameUI_Footer_TimeLeft) )
|
|
1101 {
|
|
1102 if ( GameUI_Footer_TimeLeft )
|
|
1103 {
|
|
1104 for ( int i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()); i > 450; i = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data()) )
|
|
1105 GameUI_Footer_TimedString[strlen(GameUI_Footer_TimedString.data()) - 1] = 0;
|
|
1106 }
|
|
1107 else
|
|
1108 {
|
|
1109 strcpy(pFooterString.data(), v1);
|
|
1110 for ( int j = pFontLucida->GetLineWidth(pFooterString.data()); j > 450; j = pFontLucida->GetLineWidth(pFooterString.data()) )
|
|
1111 pFooterString[strlen(pFooterString.data()) - 1] = 0;
|
|
1112 }
|
|
1113 }
|
|
1114 }
|
|
1115
|
|
1116 //----- (0041C179) --------------------------------------------------------
|
|
1117 void GameUI_Footer()
|
|
1118 {
|
|
1119 char *v1; // edi@5
|
|
1120 int v2; // eax@5
|
|
1121 int v6; // eax@9
|
|
1122 char v9; // zf@12
|
|
1123
|
|
1124 if ( pFooterString[0] || GameUI_Footer_TimeLeft || bForceDrawFooter )
|
|
1125 {
|
|
1126 pRenderer->DrawTextureRGB(0, 352, pTexture_StatusBar);
|
|
1127 if ( GameUI_Footer_TimeLeft )
|
|
1128 {
|
|
1129 v1 = GameUI_Footer_TimedString.data();
|
|
1130 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data());
|
|
1131 while ( v2 > 450 )
|
|
1132 {
|
|
1133 GameUI_Footer_TimedString[strlen(GameUI_Footer_TimedString.data()) - 1] = 0;
|
|
1134 v2 = pFontLucida->GetLineWidth(GameUI_Footer_TimedString.data());
|
|
1135 }
|
|
1136 }
|
|
1137 else
|
|
1138 {
|
|
1139 v1 = pFooterString.data();
|
|
1140 v6 = pFontLucida->GetLineWidth(pFooterString.data());
|
|
1141 while ( v6 > 450 )
|
|
1142 {
|
|
1143 pFooterString[strlen(pFooterString.data()) - 1] = 0;
|
|
1144 v6 = pFontLucida->GetLineWidth(pFooterString.data());
|
|
1145 }
|
|
1146 }
|
|
1147 v9 = *v1 == 0;
|
|
1148 bForceDrawFooter = 0;
|
|
1149 if ( !v9 )
|
|
1150 pPrimaryWindow->DrawText(pFontLucida, pFontLucida->AlignText_Center(450, v1) + 11, 357, uGameUIFontMain, v1, 0, 0, uGameUIFontShadow);
|
|
1151 }
|
|
1152 }
|
|
1153 // 5C35BC: using guessed type int bForceDrawFooter;
|
|
1154 //----- (00420EFF) --------------------------------------------------------
|
|
1155 void GameUI_WritePointedObjectStatusString()
|
|
1156 {
|
|
1157 GUIWindow *pWindow; // edi@7
|
|
1158 GUIButton *pButton; // ecx@11
|
|
1159 int requiredSkillpoints; // ecx@19
|
|
1160 enum UIMessageType pMessageType1; // esi@24
|
|
1161 int v14; // eax@41
|
|
1162 ItemGen *pItemGen; // ecx@44
|
|
1163 int v16; // ecx@46
|
|
1164 signed int pickedObjectPID; // eax@55
|
|
1165 signed int v18b;
|
|
1166 signed int pickedObjectID; // ecx@63
|
|
1167 BLVFace *pFace; // eax@69
|
|
1168 const char *pText; // ecx@79
|
|
1169 enum UIMessageType pMessageType2; // esi@110
|
|
1170 enum UIMessageType pMessageType3; // edx@117
|
|
1171 char Str1[200]; // [sp+Ch] [bp-D4h]@129
|
|
1172 unsigned int pX; // [sp+D4h] [bp-Ch]@1
|
|
1173 unsigned int pY; // [sp+D8h] [bp-8h]@1
|
|
1174
|
|
1175 pMouse->uPointingObjectID = 0;
|
|
1176 pMouse->GetClickPos(&pX, &pY);
|
|
1177 if ( pX < 0 || pX > window->GetWidth() - 1 || pY < 0 || pY > window->GetHeight() - 1 )
|
|
1178 return;
|
|
1179 if ( pCurrentScreen == SCREEN_GAME )
|
|
1180 {
|
|
1181 if ( pX <= (window->GetWidth() - 1) * 0.73125 && pY <= (window->GetHeight() - 1) * 0.73125 )
|
|
1182 {
|
|
1183 //if ( pRenderer->pRenderD3D ) // inlined mm8::4C1E01
|
|
1184 {
|
|
1185 pickedObjectPID = pGame->pVisInstance->get_picked_object_zbuf_val();
|
|
1186 if ( pX < (unsigned int)pViewport->uScreen_TL_X || pX > (unsigned int)pViewport->uScreen_BR_X
|
|
1187 || pY < (unsigned int)pViewport->uScreen_TL_Y || pY > (unsigned int)pViewport->uScreen_BR_Y )
|
|
1188 pickedObjectPID = -1;
|
|
1189 if ( pickedObjectPID == -1 )
|
|
1190 {
|
|
1191 if ( uLastPointedObjectID != 0 )
|
|
1192 {
|
|
1193 pFooterString[0] = 0;
|
|
1194 bForceDrawFooter = 1;
|
|
1195 }
|
|
1196 uLastPointedObjectID = 0;
|
|
1197 return;
|
|
1198 }
|
|
1199 }
|
|
1200 /*else
|
|
1201 {
|
|
1202 v18 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]];
|
|
1203 }*/
|
|
1204 pMouse->uPointingObjectID = (unsigned __int16)pickedObjectPID;
|
|
1205 pickedObjectID = (signed)PID_ID(pickedObjectPID);
|
|
1206 if ( PID_TYPE(pickedObjectPID) == OBJECT_Item )
|
|
1207 {
|
|
1208 if ( pObjectList->pObjects[pSpriteObjects[pickedObjectID].uObjectDescID].uFlags & 0x10 )
|
|
1209 {
|
|
1210 pMouse->uPointingObjectID = 0;
|
|
1211 pFooterString[0] = 0;
|
|
1212 bForceDrawFooter = 1;
|
|
1213 uLastPointedObjectID = 0;
|
|
1214 return;
|
|
1215 }
|
|
1216 if ( pickedObjectPID >= 0x2000000u || pParty->pPickedItem.uItemID )
|
|
1217 {
|
|
1218 GameUI_SetFooterString(pSpriteObjects[pickedObjectID].stru_24.GetDisplayName());
|
|
1219 }
|
|
1220 else
|
|
1221 {
|
|
1222 sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[470], pSpriteObjects[pickedObjectID].stru_24.GetDisplayName());// "Get %s"
|
|
1223 GameUI_SetFooterString(pTmpBuf.data());
|
|
1224 } //intentional fallthrough
|
|
1225 }
|
|
1226 else if ( PID_TYPE(pickedObjectPID) == OBJECT_Decoration )
|
|
1227 {
|
|
1228 if ( !pLevelDecorations[pickedObjectID].uEventID )
|
|
1229 {
|
|
1230 if ( pLevelDecorations[pickedObjectID].IsInteractive() )
|
|
1231 pText = pNPCTopics[stru_5E4C90_MapPersistVars._decor_events[pLevelDecorations[pickedObjectID]._idx_in_stru123 - 75] + 380].pTopic;//
|
|
1232 else
|
|
1233 pText = pDecorationList->pDecorations[pLevelDecorations[pickedObjectID].uDecorationDescID].field_20;
|
|
1234 GameUI_SetFooterString(pText);
|
|
1235 }
|
|
1236 else
|
|
1237 {
|
|
1238 char* hintString = GetEventHintString(pLevelDecorations[pickedObjectID].uEventID);
|
|
1239 if ( hintString != '\0' )
|
|
1240 {
|
|
1241 GameUI_SetFooterString(hintString);
|
|
1242 }
|
|
1243 } //intentional fallthrough
|
|
1244 }
|
|
1245 else if ( PID_TYPE(pickedObjectPID) == OBJECT_BModel )
|
|
1246 {
|
|
1247 if ( pickedObjectPID < 0x2000000u )
|
|
1248 {
|
|
1249 char* newString = nullptr;
|
|
1250 if ( uCurrentlyLoadedLevelType != LEVEL_Indoor )
|
|
1251 {
|
|
1252 v18b = (signed int)(unsigned __int16)pickedObjectPID >> 9;
|
|
1253 short triggeredId = pOutdoor->pBModels[v18b].pFaces[pickedObjectID & 0x3F].sCogTriggeredID;
|
|
1254 if (triggeredId != 0)
|
|
1255 {
|
|
1256 newString = GetEventHintString(pOutdoor->pBModels[v18b].pFaces[pickedObjectID & 0x3F].sCogTriggeredID);
|
|
1257 }
|
|
1258 }
|
|
1259 else
|
|
1260 {
|
|
1261 pFace = &pIndoor->pFaces[pickedObjectID];
|
|
1262 if ( pFace->uAttributes & FACE_INDICATE )
|
|
1263 {
|
|
1264 unsigned short eventId = pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID;
|
|
1265 if (eventId != 0)
|
|
1266 {
|
|
1267 newString = GetEventHintString(pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID);
|
|
1268 }
|
|
1269 }
|
|
1270 }
|
|
1271 if (newString)
|
|
1272 {
|
|
1273 GameUI_SetFooterString(newString);
|
|
1274 if ( pMouse->uPointingObjectID == 0 && uLastPointedObjectID != 0)
|
|
1275 {
|
|
1276 pFooterString[0] = 0;
|
|
1277 bForceDrawFooter = 1;
|
|
1278 }
|
|
1279 uLastPointedObjectID = pMouse->uPointingObjectID;
|
|
1280 return;
|
|
1281 }
|
|
1282 }
|
|
1283 pMouse->uPointingObjectID = 0;
|
|
1284 pFooterString[0] = 0;
|
|
1285 bForceDrawFooter = 1;
|
|
1286 uLastPointedObjectID = 0;
|
|
1287 return;
|
|
1288 }
|
|
1289 else if ( PID_TYPE(pickedObjectPID) == OBJECT_Actor )
|
|
1290 {
|
|
1291 if ( pickedObjectPID >= 0x2000000 )
|
|
1292 {
|
|
1293 pMouse->uPointingObjectID = 0;
|
|
1294 if ( uLastPointedObjectID != 0 )
|
|
1295 {
|
|
1296 pFooterString[0] = 0;
|
|
1297 bForceDrawFooter = 1;
|
|
1298 }
|
|
1299 uLastPointedObjectID = 0;
|
|
1300 return;
|
|
1301 }
|
|
1302 if ( pActors[pickedObjectID].dword_000334_unique_name )
|
|
1303 pText = pMonsterStats->pPlaceStrings[pActors[pickedObjectID].dword_000334_unique_name];
|
|
1304 else
|
|
1305 pText = pMonsterStats->pInfos[pActors[pickedObjectID].pMonsterInfo.uID].pName;
|
|
1306 GameUI_SetFooterString(pText); //intentional fallthrough
|
|
1307 }
|
|
1308 if ( pMouse->uPointingObjectID == 0 && uLastPointedObjectID != 0)
|
|
1309 {
|
|
1310 pFooterString[0] = 0;
|
|
1311 bForceDrawFooter = 1;
|
|
1312 }
|
|
1313 uLastPointedObjectID = pMouse->uPointingObjectID;
|
|
1314 return;
|
|
1315 }
|
|
1316 }
|
|
1317 else
|
|
1318 {
|
|
1319 for (int i = uNumVisibleWindows; i > 0; --i)
|
|
1320 {
|
|
1321 pWindow = &pWindowList[pVisibleWindowsIdxs[i] - 1];
|
|
1322 if ( (signed int)pX >= (signed int)pWindow->uFrameX && (signed int)pX <= (signed int)pWindow->uFrameZ
|
|
1323 && (signed int)pY >= (signed int)pWindow->uFrameY && (signed int)pY <= (signed int)pWindow->uFrameW )
|
|
1324 {
|
|
1325 for ( pButton = pWindow->pControlsHead; pButton != nullptr; pButton = pButton->pNext )
|
|
1326 {
|
|
1327 switch ( pButton->uButtonType )
|
|
1328 {
|
|
1329 case 1://for dialogue window
|
|
1330 if ( (signed int)pX >= (signed int)pButton->uX && (signed int)pX <= (signed int)pButton->uZ
|
|
1331 && (signed int)pY >= (signed int)pButton->uY && (signed int)pY <= (signed int)pButton->uW )
|
|
1332 {
|
|
1333 pMessageType1 = (UIMessageType)pButton->field_1C;
|
|
1334 if ( pMessageType1 )
|
|
1335 pMessageQueue_50CBD0->AddGUIMessage(pMessageType1, pButton->msg_param, 0);
|
|
1336 GameUI_SetFooterString(pButton->pButtonName);
|
|
1337 uLastPointedObjectID = 1;
|
|
1338 return;
|
|
1339 }
|
|
1340 break;
|
|
1341 case 2://hovering over portraits
|
|
1342 if (pButton->uWidth != 0 && pButton->uHeight != 0)
|
|
1343 {
|
|
1344 uint distW = pX - pButton->uX;
|
|
1345 uint distY = pY - pButton->uY;
|
|
1346
|
|
1347 double ratioX = 1.0 * (distW*distW) / (pButton->uWidth*pButton->uWidth);
|
|
1348 double ratioY = 1.0 * (distY*distY) / (pButton->uHeight*pButton->uHeight);
|
|
1349
|
|
1350 if (ratioX + ratioY < 1.0)
|
|
1351 {
|
|
1352 pMessageType2 = (UIMessageType)pButton->field_1C;
|
|
1353 if ( pMessageType2 != 0 )
|
|
1354 pMessageQueue_50CBD0->AddGUIMessage(pMessageType2, pButton->msg_param, 0);
|
|
1355 GameUI_SetFooterString(pButton->pButtonName); // for character name
|
|
1356 uLastPointedObjectID = 1;
|
|
1357 return;
|
|
1358 }
|
|
1359 }
|
|
1360 break;
|
|
1361 case 3:// click on skill
|
|
1362 if ( pX >= pButton->uX && pX <= pButton->uZ
|
|
1363 && pY >= pButton->uY && pY <= pButton->uW )
|
|
1364 {
|
|
1365 requiredSkillpoints = (LOBYTE(pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param]) & 0x3F) + 1;
|
|
1366 if ( pPlayers[uActiveCharacter]->uSkillPoints < requiredSkillpoints )
|
|
1367 sprintf(Str1, pGlobalTXT_LocalizationStrings[469], requiredSkillpoints - pPlayers[uActiveCharacter]->uSkillPoints);// "You need %d more Skill Points to advance here"
|
|
1368 else
|
|
1369 sprintf(Str1, pGlobalTXT_LocalizationStrings[468], requiredSkillpoints);// "Clicking here will spend %d Skill Points"
|
|
1370 GameUI_SetFooterString(Str1);
|
|
1371 uLastPointedObjectID = 1;
|
|
1372 return;
|
|
1373 }
|
|
1374 break;
|
|
1375 }
|
|
1376 }
|
|
1377 }
|
|
1378 if ( pWindow->uFrameHeight == 480 )
|
|
1379 {
|
|
1380 //DebugBreak(); //Why is this condition here (in the original too)? Might check fullscreen windows. Let Silvo know if you find out
|
|
1381 return;
|
|
1382 }
|
|
1383 }
|
|
1384 //The game never gets to this point even in the original. It's also bugged(neither branch displays anything).
|
|
1385 //TODO fix these and move them up before the window check loop.
|
|
1386 if ( pCurrentScreen == SCREEN_CHEST )
|
|
1387 {
|
|
1388 Chest::ChestUI_WritePointedObjectStatusString();
|
|
1389 if ( uLastPointedObjectID != 0 )
|
|
1390 {
|
|
1391 pFooterString[0] = 0;
|
|
1392 bForceDrawFooter = 1;
|
|
1393 }
|
|
1394 uLastPointedObjectID = 0;
|
|
1395 return;
|
|
1396 }
|
|
1397 else if ( pCurrentScreen == SCREEN_HOUSE )
|
|
1398 {
|
|
1399 if ( dialog_menu_id != HOUSE_DIALOGUE_SHOP_BUY_STANDARD
|
|
1400 || (v16 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]], v16 == 0)
|
|
1401 || v16 == -65536 )
|
|
1402 {
|
|
1403 if ( uLastPointedObjectID != 0 )
|
|
1404 {
|
|
1405 pFooterString[0] = 0;
|
|
1406 bForceDrawFooter = 1;
|
|
1407 }
|
|
1408 uLastPointedObjectID = 0;
|
|
1409 return;
|
|
1410 }
|
|
1411 pItemGen = (ItemGen *)((char *)&pParty->pPickedItem + 36 * (v16 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 4);
|
|
1412 GameUI_SetFooterString(pItemGen->GetDisplayName());
|
|
1413 pFooterString[0] = 0;
|
|
1414 bForceDrawFooter = 1;
|
|
1415 uLastPointedObjectID = 0;
|
|
1416 return;
|
|
1417 }
|
|
1418 if ( pY < 350 )
|
|
1419 {
|
|
1420 v14 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]];
|
|
1421 if ( v14 == 0 || v14 == -65536 || v14 >= 5000 )
|
|
1422 {
|
|
1423 if ( pMouse->uPointingObjectID == 0 )
|
|
1424 {
|
|
1425 if ( uLastPointedObjectID != 0 )
|
|
1426 {
|
|
1427 pFooterString[0] = 0;
|
|
1428 bForceDrawFooter = 1;
|
|
1429 }
|
|
1430 }
|
|
1431 uLastPointedObjectID = pMouse->uPointingObjectID;
|
|
1432 return;
|
|
1433 }
|
|
1434 pItemGen = (ItemGen *)&pPlayers[uActiveCharacter]->pInventoryItemList[v14-1];
|
|
1435 GameUI_SetFooterString(pItemGen->GetDisplayName());
|
|
1436 pFooterString[0] = 0;
|
|
1437 bForceDrawFooter = 1;
|
|
1438 uLastPointedObjectID = 0;
|
|
1439 return;
|
|
1440 }
|
|
1441 }
|
|
1442 if ( (signed int)pX >= (signed int)pWindowList[0].uFrameX && (signed int)pX <= (signed int)pWindowList[0].uFrameZ
|
|
1443 && (signed int)pY >= (signed int)pWindowList[0].uFrameY && (signed int)pY <= (signed int)pWindowList[0].uFrameW )
|
|
1444 {
|
|
1445 for ( pButton = pWindowList[0].pControlsHead; pButton != nullptr; pButton = pButton->pNext )
|
|
1446 {
|
|
1447 switch (pButton->uButtonType)
|
|
1448 {
|
|
1449 case 1:
|
|
1450 if ( (signed int)pX >= (signed int)pButton->uX && (signed int)pX <= (signed int)pButton->uZ
|
|
1451 && (signed int)pY >= (signed int)pButton->uY && (signed int)pY <= (signed int)pButton->uW )
|
|
1452 {
|
|
1453 pMessageType3 = (UIMessageType)pButton->field_1C;
|
|
1454 if ( pMessageType3 == 0 ) // For books
|
|
1455 {
|
|
1456 GameUI_SetFooterString(pButton->pButtonName);
|
|
1457 }
|
|
1458 else
|
|
1459 {
|
|
1460 pMessageQueue_50CBD0->AddGUIMessage(pMessageType3, pButton->msg_param, 0);
|
|
1461 }
|
|
1462 uLastPointedObjectID = 1;
|
|
1463 return;
|
|
1464 }
|
|
1465 break;
|
|
1466 case 2://hovering over portraits
|
|
1467 if (pButton->uWidth != 0 && pButton->uHeight != 0)
|
|
1468 {
|
|
1469 uint distW = pX - pButton->uX;
|
|
1470 uint distY = pY - pButton->uY;
|
|
1471
|
|
1472 double ratioX = 1.0 * (distW*distW) / (pButton->uWidth*pButton->uWidth);
|
|
1473 double ratioY = 1.0 * (distY*distY) / (pButton->uHeight*pButton->uHeight);
|
|
1474
|
|
1475 if (ratioX + ratioY < 1.0)
|
|
1476 {
|
|
1477 pMessageType2 = (UIMessageType)pButton->field_1C;
|
|
1478 if ( pMessageType2 != 0 )
|
|
1479 pMessageQueue_50CBD0->AddGUIMessage(pMessageType2, pButton->msg_param, 0);
|
|
1480 GameUI_SetFooterString(pButton->pButtonName); // for character name
|
|
1481 uLastPointedObjectID = 1;
|
|
1482 return;
|
|
1483 }
|
|
1484 }
|
|
1485 break;
|
|
1486 case 3:
|
|
1487 if ( pX >= pButton->uX && pX <= pButton->uZ
|
|
1488 && pY >= pButton->uY && pY <= pButton->uW )
|
|
1489 {
|
|
1490 requiredSkillpoints = (LOBYTE(pPlayers[uActiveCharacter]->pActiveSkills[pButton->msg_param]) & 0x3F) + 1;
|
|
1491 if ( pPlayers[uActiveCharacter]->uSkillPoints < requiredSkillpoints )
|
|
1492 sprintf(Str1, pGlobalTXT_LocalizationStrings[469], requiredSkillpoints - pPlayers[uActiveCharacter]->uSkillPoints);// "You need %d more Skill Points to advance here"
|
|
1493 else
|
|
1494 sprintf(Str1, pGlobalTXT_LocalizationStrings[468], requiredSkillpoints);// "Clicking here will spend %d Skill Points"
|
|
1495 GameUI_SetFooterString(Str1);
|
|
1496 uLastPointedObjectID = 1;
|
|
1497 return;
|
|
1498 }
|
|
1499 break;
|
|
1500 }
|
|
1501 }
|
|
1502 }
|
|
1503 //pMouse->uPointingObjectID = sub_46A99B(); //for software
|
|
1504 if ( uLastPointedObjectID != 0 )
|
|
1505 {
|
|
1506 pFooterString[0] = 0;
|
|
1507 bForceDrawFooter = 1;
|
|
1508 }
|
|
1509 uLastPointedObjectID = 0;
|
|
1510 return;
|
|
1511 }
|
|
1512
|
|
1513 //----- (0044158F) --------------------------------------------------------
|
|
1514 void GameUI_DrawCharacterSelectionFrame()
|
|
1515 {
|
|
1516 if ( uActiveCharacter )
|
|
1517 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[uActiveCharacter - 1] - 9, 380,
|
|
1518 pIcons_LOD->GetTexture(uTextureID_GameUI_CharSelectionFrame));
|
|
1519 }
|
|
1520
|
|
1521 //----- (0044162D) --------------------------------------------------------
|
|
1522 void GameUI_DrawPartySpells()
|
|
1523 {
|
|
1524 unsigned int v0; // ebp@1
|
|
1525 Texture *spell_texture; // [sp-4h] [bp-1Ch]@12
|
|
1526 //Texture *v9; // [sp-4h] [bp-1Ch]@21
|
|
1527
|
|
1528 v0 = (signed __int64)((double)GetTickCount() * 0.050000001);
|
|
1529 //v1 = 0;
|
|
1530 for (uint i = 0; i < 14; ++i)
|
|
1531 {
|
|
1532 //v2 = byte_4E5DD8[v1];
|
|
1533 if (pParty->pPartyBuffs[byte_4E5DD8[i]].uExpireTime)
|
|
1534 {
|
|
1535 Texture* tex = pIcons_LOD->GetTexture(pTextureIDs_PartyBuffIcons[i]);
|
|
1536 //v3 = pTextureIDs_PartyBuffIcons[i];
|
|
1537 pRenderer->_4A65CC(pPartySpellbuffsUI_XYs[i][0],
|
|
1538 pPartySpellbuffsUI_XYs[i][1], tex, tex,
|
|
1539 v0 + 20 * pPartySpellbuffsUI_smthns[i], 0, 63);
|
|
1540 }
|
|
1541 //++v1;
|
|
1542 }
|
|
1543 //while ( v1 < 14 );
|
|
1544 if (pCurrentScreen == SCREEN_GAME || pCurrentScreen == SCREEN_NPC_DIALOGUE)
|
|
1545 {
|
|
1546 if (pParty->FlyActive())
|
|
1547 {
|
|
1548 if ( pParty->bFlying )
|
|
1549 spell_texture = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_FlySpell, v0)->uTextureID);
|
|
1550 else
|
|
1551 spell_texture = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_FlySpell, 0)->uTextureID);
|
|
1552 //if ( pRenderer->pRenderD3D )
|
|
1553 pRenderer->DrawTextureIndexed(8, 8, spell_texture);
|
|
1554 /*else
|
|
1555 pRenderer->DrawTextureTransparent(8, 8, v7);*/
|
|
1556 }
|
|
1557 if ( pParty->WaterWalkActive() )
|
|
1558 {
|
|
1559 if ( pParty->uFlags & PARTY_FLAGS_1_STANDING_ON_WATER )
|
|
1560 spell_texture = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, v0)->uTextureID);
|
|
1561 else
|
|
1562 spell_texture = pIcons_LOD->GetTexture(pIconsFrameTable->GetFrame(uIconIdx_WaterWalk, 0)->uTextureID);
|
|
1563 //if ( pRenderer->pRenderD3D )
|
|
1564 pRenderer->DrawTextureIndexed(396, 8, spell_texture);
|
|
1565 /*else
|
|
1566 pRenderer->DrawTextureTransparent(396, 8, v9);*/
|
|
1567 }
|
|
1568 }
|
|
1569 for (uint i = 0; i < 4; ++i)
|
|
1570 {
|
|
1571 if ( pParty->pPlayers[i].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].uExpireTime )
|
|
1572 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 427, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Hammerhands));
|
|
1573 if ( pParty->pPlayers[i].pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime )
|
|
1574 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 393, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Bless));
|
|
1575 if ( pParty->pPlayers[i].pPlayerBuffs[PLAYER_BUFF_PRESERVATION].uExpireTime )
|
|
1576 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 410, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_Preservation));
|
|
1577 if ( pParty->pPlayers[i].pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].uExpireTime )
|
|
1578 pRenderer->DrawTextureIndexed(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 72, 444, pIcons_LOD->GetTexture(uTextureID_PlayerBuff_PainReflection));
|
|
1579 }
|
|
1580 }
|
|
1581
|
|
1582 //----- (004921C1) --------------------------------------------------------
|
|
1583 void GameUI_DrawPortraits(unsigned int _this)
|
|
1584 {
|
|
1585 unsigned int face_expression_ID; // eax@17
|
|
1586 PlayerFrame *pFrame; // eax@21
|
|
1587 int pTextureID; // eax@57
|
|
1588 Texture *pPortrait; // [sp-4h] [bp-1Ch]@27
|
|
1589
|
|
1590 if ( _A750D8_player_speech_timer )
|
|
1591 {
|
|
1592 _A750D8_player_speech_timer -= (signed int)pMiscTimer->uTimeElapsed;
|
|
1593 if ( _A750D8_player_speech_timer <= 0 )
|
|
1594 {
|
|
1595 if ( pPlayers[uSpeakingCharacter]->CanAct() )
|
|
1596 pPlayers[uSpeakingCharacter]->PlaySound(PlayerSpeechID, 0);
|
|
1597 _A750D8_player_speech_timer = 0i64;
|
|
1598 }
|
|
1599 }
|
|
1600
|
|
1601 for (uint i = 0; i < 4; ++i)
|
|
1602 {
|
|
1603 Player* pPlayer = &pParty->pPlayers[i];
|
|
1604 if ( pPlayer->IsEradicated() )
|
|
1605 {
|
|
1606 pPortrait = pTexture_PlayerFaceEradicated;
|
|
1607 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime )
|
|
1608 pRenderer->DrawTranslucent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i], 388, pPortrait);
|
|
1609 else
|
|
1610 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 1, 388, pPortrait);
|
|
1611 if ( pPlayer->pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_HASTE].uExpireTime
|
|
1612 | pPlayer->pPlayerBuffs[PLAYER_BUFF_HEROISM].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_SHIELD].uExpireTime
|
|
1613 | pPlayer->pPlayerBuffs[PLAYER_BUFF_STONESKIN].uExpireTime )
|
|
1614 sub_441A4E(i);
|
|
1615 continue;
|
|
1616 }
|
|
1617 if (pPlayer->IsDead())
|
|
1618 {
|
|
1619 pPortrait = pTexture_PlayerFaceDead;
|
|
1620 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime )
|
|
1621 pRenderer->DrawTranslucent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i], 388, pPortrait);
|
|
1622 else
|
|
1623 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 1, 388, pPortrait);
|
|
1624 if ( pPlayer->pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_HASTE].uExpireTime
|
|
1625 | pPlayer->pPlayerBuffs[PLAYER_BUFF_HEROISM].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_SHIELD].uExpireTime
|
|
1626 | pPlayer->pPlayerBuffs[PLAYER_BUFF_STONESKIN].uExpireTime )
|
|
1627 sub_441A4E(i);
|
|
1628 continue;
|
|
1629 }
|
|
1630 face_expression_ID = 0;
|
|
1631 for ( uint j = 0; j < pPlayerFrameTable->uNumFrames; ++j )
|
|
1632 if ( pPlayerFrameTable->pFrames[j].expression == pPlayer->expression )
|
|
1633 {
|
|
1634 face_expression_ID = j;
|
|
1635 break;
|
|
1636 }
|
|
1637 if ( face_expression_ID == 0 )
|
|
1638 face_expression_ID = 1;
|
|
1639 if (pPlayer->expression == CHARACTER_EXPRESSION_21)
|
|
1640 pFrame = pPlayerFrameTable->GetFrameBy_y(&pPlayer->_expression21_frameset, &pPlayer->_expression21_animtime, pMiscTimer->uTimeElapsed);
|
|
1641 else
|
|
1642 pFrame = pPlayerFrameTable->GetFrameBy_x(face_expression_ID, pPlayer->uExpressionTimePassed);
|
|
1643 if (pPlayer->field_1AA2 != pFrame->uTextureID - 1 || _this )
|
|
1644 {
|
|
1645 pPlayer->field_1AA2 = pFrame->uTextureID - 1;
|
|
1646 pPortrait = (Texture *)pTextures_PlayerFaces[i][pPlayer->field_1AA2];//pFace = (Texture *)pTextures_PlayerFaces[i][pFrame->uTextureID];
|
|
1647 if ( pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime )
|
|
1648 pRenderer->DrawTranslucent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i], 388, pPortrait);
|
|
1649 else
|
|
1650 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] + 1, 388, pPortrait);
|
|
1651 if ( pPlayer->pPlayerBuffs[PLAYER_BUFF_BLESS].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_HASTE].uExpireTime
|
|
1652 | pPlayer->pPlayerBuffs[PLAYER_BUFF_HEROISM].uExpireTime | pPlayer->pPlayerBuffs[PLAYER_BUFF_SHIELD].uExpireTime
|
|
1653 | pPlayer->pPlayerBuffs[PLAYER_BUFF_STONESKIN].uExpireTime )
|
|
1654 sub_441A4E(i);
|
|
1655 continue;
|
|
1656 }
|
|
1657 }
|
|
1658 if ( pParty->bTurnBasedModeOn == 1 )
|
|
1659 {
|
|
1660 if ( pTurnEngine->turn_stage != TE_WAIT )
|
|
1661 {
|
|
1662 if (PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player)
|
|
1663 {
|
|
1664 if ( pTurnEngine->uActorQueueSize > 0 )
|
|
1665 {
|
|
1666 for (uint i = 0; i < (uint)pTurnEngine->uActorQueueSize; ++i)
|
|
1667 {
|
|
1668 if (PID_TYPE(pTurnEngine->pQueue[i].uPackedID) != OBJECT_Player)
|
|
1669 break;
|
|
1670 pTextureID = dword_5079D0;
|
|
1671 if ( pParty->uFlags & 0x10 )
|
|
1672 pTextureID = dword_5079CC;
|
|
1673 else
|
|
1674 {
|
|
1675 if ( pParty->uFlags & 0x20 )
|
|
1676 pTextureID = dword_5079C8;
|
|
1677 }
|
|
1678 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[PID_ID(pTurnEngine->pQueue[i].uPackedID)] - 4, 385, pIcons_LOD->GetTexture(pTextureID));
|
|
1679 }
|
|
1680 }
|
|
1681 }
|
|
1682 }
|
|
1683 }
|
|
1684 else
|
|
1685 {
|
|
1686 for (uint i = 0; i < 4; ++i)
|
|
1687 {
|
|
1688 if (pParty->pPlayers[i].CanAct() && !pParty->pPlayers[i].uTimeToRecovery)
|
|
1689 {
|
|
1690 pTextureID = dword_5079D0;
|
|
1691 if ( pParty->uFlags & 0x10 )
|
|
1692 pTextureID = dword_5079CC;
|
|
1693 else
|
|
1694 {
|
|
1695 if ( pParty->uFlags & 0x20 )
|
|
1696 pTextureID = dword_5079C8;
|
|
1697 }
|
|
1698 pRenderer->DrawTextureTransparent(pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[i] - 4, 385, pIcons_LOD->GetTexture(pTextureID));
|
|
1699 }
|
|
1700 }
|
|
1701 }
|
|
1702 }
|
|
1703
|
|
1704 //----- (00441D38) --------------------------------------------------------
|
|
1705 void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int bRedrawOdmMinimap)
|
|
1706 {
|
|
1707 int uHeight; // ebx@6
|
|
1708 signed int pW; // ebx@23
|
|
1709 int v15; // eax@23
|
|
1710 double v20; // st7@30
|
|
1711 signed int v27; // eax@37
|
|
1712 //unsigned __int16 *v28; // ecx@37
|
|
1713 signed int v29; // edi@40
|
|
1714 int pPoint_X; // edi@72
|
|
1715 int pPoint_Y; // ebx@72
|
|
1716 unsigned int lPitch; // [sp+20h] [bp-34h]@1
|
|
1717 signed int pY; // [sp+20h] [bp-34h]@23
|
|
1718 signed int pX; // [sp+24h] [bp-30h]@23
|
|
1719 signed int v70; // [sp+24h] [bp-30h]@37
|
|
1720 signed int uBluea; // [sp+28h] [bp-2Ch]@37
|
|
1721 int v73; // [sp+2Ch] [bp-28h]@30
|
|
1722 signed int uCenterY; // [sp+48h] [bp-Ch]@1
|
|
1723 signed int uCenterX; // [sp+4Ch] [bp-8h]@1
|
|
1724 signed int uWidth; // [sp+5Ch] [bp+8h]@30
|
|
1725 signed int pZ; // [sp+60h] [bp+Ch]@23
|
|
1726 float uWb; // [sp+60h] [bp+Ch]@30
|
|
1727 unsigned int pColor;
|
|
1728
|
|
1729 uCenterX = (uX + uZ) / 2;
|
|
1730 uCenterY = (uY + uW) / 2;
|
|
1731 lPitch = pRenderer->uTargetSurfacePitch;
|
|
1732 bool bWizardEyeActive = pParty->WizardEyeActive();
|
|
1733 int uWizardEyeSkillLevel = pParty->WizardEyeSkillLevel();
|
|
1734 if ( CheckHiredNPCSpeciality(Cartographer) )
|
|
1735 {
|
|
1736 bWizardEyeActive = true;
|
|
1737 uWizardEyeSkillLevel = 2;
|
|
1738 }
|
|
1739
|
|
1740 if ( wizard_eye )
|
|
1741 {
|
|
1742 bWizardEyeActive = true;
|
|
1743 uWizardEyeSkillLevel = 3;
|
|
1744 }
|
|
1745 pRenderer->SetRasterClipRect(uX, uY, uZ - 1, uW - 1);
|
|
1746 uHeight = uW - uY;
|
|
1747 uWidth = uZ - uX;
|
|
1748
|
|
1749 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
|
|
1750 {
|
|
1751 uchar* pMapLod0 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pLevelOfDetail0_prolly_alpha_mask;
|
|
1752 ushort* pPal = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pPalette16;
|
|
1753 v73 = (1 << (pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2 + 16)) / (signed int)uZoom;
|
|
1754 v20 = (double)(pParty->vPosition.x + 32768) / (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
|
|
1755 uWb = (double)(32768 - pParty->vPosition.y) / (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
|
|
1756 switch (uZoom)
|
|
1757 {
|
|
1758 case 512:
|
|
1759 {
|
|
1760 v20 = v20 - (double)(uWidth / 2);
|
|
1761 uWb = uWb - (double)(uHeight / 2);
|
|
1762 }
|
|
1763 break;
|
|
1764 case 1024:
|
|
1765 {
|
|
1766 v20 = v20 - (double)(uWidth / 4);
|
|
1767 uWb = uWb - (double)(uHeight / 4);
|
|
1768 }
|
|
1769 break;
|
|
1770 case 2048:
|
|
1771 {
|
|
1772 v20 = v20 - (double)(uWidth / 8);
|
|
1773 uWb = uWb - (double)(uHeight / 8);
|
|
1774 }
|
|
1775 break;
|
|
1776 default: assert(false);
|
|
1777 }
|
|
1778
|
|
1779 static unsigned __int16 pOdmMinimap[117][137];
|
|
1780 assert(sizeof(pOdmMinimap) == 137 * 117 * sizeof(short));
|
|
1781
|
|
1782 v70 = floorf(v20 * 65536.0 + 0.5f);//LODWORD(v24);
|
|
1783 uBluea = floorf(uWb * 65536.0 + 0.5f);//LODWORD(v25);
|
|
1784 v27 = uBluea >> 16;
|
|
1785 //v28 = &pRenderer->pTargetSurface[uX + uY * lPitch];
|
|
1786
|
|
1787 if (pMapLod0 && bRedrawOdmMinimap)
|
|
1788 {
|
|
1789 assert(uWidth == 137 && uHeight == 117);
|
|
1790 //auto pMinimap = (unsigned __int16 *)pOdmMinimap;
|
|
1791
|
|
1792 ushort mapWidth = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth;
|
|
1793
|
|
1794 v29 = v70 >> 16;
|
|
1795 for (int y = 0; y < uHeight; ++y)
|
|
1796 {
|
|
1797 uchar* pMapLod0Line = &pMapLod0[v27 * mapWidth];
|
|
1798 for (int x = 0; x < uWidth; ++x)
|
|
1799 {
|
|
1800 //*pMinimap++ = pPal[pMapLod0Line[v29]];
|
|
1801 pRenderer->WritePixel16(uX + x, uY + y, pPal[pMapLod0Line[v29]]);
|
|
1802 v29 = (v70 + x * v73) >> 16;
|
|
1803 }
|
|
1804 uBluea += v73;
|
|
1805 v27 = uBluea >> 16;
|
|
1806 }
|
|
1807
|
|
1808 /*v29 = v70 >> 16;
|
|
1809 for (int y = 0; y < uHeight; ++y)
|
|
1810 {
|
|
1811 uchar* pMapLod0Line = &pMapLod0[v27 * mapWidth];
|
|
1812 for (int x = 0; x < uWidth; ++x)
|
|
1813 {
|
|
1814 //*pMinimap++ = pPal[pMapLod0Line[v29]];
|
|
1815 pOdmMinimap[y][x] = pPal[pMapLod0Line[v29]];
|
|
1816 v29 = (v70 + x * v73) >> 16;
|
|
1817 }
|
|
1818 v29 = v70 >> 16;
|
|
1819 v28 += 137 - uWidth;
|
|
1820 uBluea += v73;
|
|
1821 v27 = uBluea >> 16;
|
|
1822 }*/
|
|
1823 }
|
|
1824
|
|
1825 /*for (int y = 0; y < 117; ++y)
|
|
1826 {
|
|
1827 for (int x = 0; x < 137; ++x)
|
|
1828 {
|
|
1829 *v28++ = pOdmMinimap[y][x];
|
|
1830 }
|
|
1831 v28 += lPitch - 137;
|
|
1832 }*/
|
|
1833 uNumBlueFacesInBLVMinimap = 0;
|
|
1834 }
|
|
1835 else// uCurrentlyLoadedLevelType == LEVEL_Indoor
|
|
1836 {
|
|
1837 pRenderer->FillRectFast(uX, uY, uZ - uX, uHeight, 0xF);
|
|
1838 uNumBlueFacesInBLVMinimap = 0;
|
|
1839
|
|
1840 for (uint i = 0; i < (uint)pIndoor->pMapOutlines->uNumOutlines; ++i)
|
|
1841 {
|
|
1842 BLVMapOutline* pOutline = &pIndoor->pMapOutlines->pOutlines[i];
|
|
1843 //BLVFace* pFace1 = &pIndoor->pFaces[pOutline->uFace1ID];
|
|
1844 //BLVFace* pFace2 = &pIndoor->pFaces[pOutline->uFace2ID];
|
|
1845 if (pIndoor->pFaces[pOutline->uFace1ID].Visible() && pIndoor->pFaces[pOutline->uFace2ID].Visible())
|
|
1846 {
|
|
1847 if ( pOutline->uFlags & 1 )
|
|
1848 {
|
|
1849 if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 &&
|
|
1850 (pIndoor->pFaces[pOutline->uFace1ID].Clickable() || pIndoor->pFaces[pOutline->uFace2ID].Clickable()) &&
|
2508
|
1851 (pIndoor->pFaceExtras[pIndoor->pFaces[pOutline->uFace1ID].uFaceExtraID].uEventID
|
|
1852 || pIndoor->pFaceExtras[pIndoor->pFaces[pOutline->uFace2ID].uFaceExtraID].uEventID))
|
2501
|
1853 {
|
|
1854 if (uNumBlueFacesInBLVMinimap < 49)
|
|
1855 pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap++] = i;
|
|
1856 }
|
|
1857 else
|
|
1858 {
|
|
1859 pX = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1860 pY = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1861 pZ = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1862 pW = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1863 v15 = abs(pOutline->sZ - pParty->vPosition.z) / 8;
|
|
1864 if ( v15 > 100 )
|
|
1865 v15 = 100;
|
|
1866 pRenderer->RasterLine2D(pX, pY, pZ, pW, viewparams->pPalette[-v15 + 200]);
|
|
1867 }
|
|
1868 continue;
|
|
1869 }
|
2508
|
1870 if (pIndoor->pFaces[pOutline->uFace1ID].uAttributes & FACE_UNKNOW7
|
|
1871 || pIndoor->pFaces[pOutline->uFace2ID].uAttributes & FACE_UNKNOW7)
|
2501
|
1872 {
|
|
1873 pOutline->uFlags = pOutline->uFlags | 1;
|
|
1874 pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8);
|
|
1875 if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 &&
|
|
1876 (pIndoor->pFaces[pOutline->uFace1ID].Clickable() || pIndoor->pFaces[pOutline->uFace2ID].Clickable()) &&
|
|
1877 (pIndoor->pFaceExtras[pIndoor->pFaces[pOutline->uFace1ID].uFaceExtraID].uEventID || pIndoor->pFaceExtras[pIndoor->pFaces[pOutline->uFace2ID].uFaceExtraID].uEventID))
|
|
1878 {
|
|
1879 if (uNumBlueFacesInBLVMinimap < 49)
|
|
1880 pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap++] = i;
|
|
1881 }
|
|
1882 else
|
|
1883 {
|
|
1884 pX = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1885 pY = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1886 pZ = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1887 pW = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1888 v15 = abs(pOutline->sZ - pParty->vPosition.z) / 8;
|
|
1889 if ( v15 > 100 )
|
|
1890 v15 = 100;
|
|
1891 pRenderer->RasterLine2D(pX, pY, pZ, pW, viewparams->pPalette[-v15 + 200]);
|
|
1892 }
|
|
1893 continue;
|
|
1894 }
|
|
1895 }
|
|
1896 }
|
|
1897
|
|
1898 for (uint i = 0; i < uNumBlueFacesInBLVMinimap; ++i)
|
|
1899 {
|
|
1900 BLVMapOutline* pOutline = &pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[i]];
|
|
1901 pX = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pOutline->uVertex1ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1902 pY = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pOutline->uVertex1ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1903 pZ = uCenterX + ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pOutline->uVertex2ID].x)) << 16) - uZoom * pParty->vPosition.x) >> 16);
|
|
1904 pW = uCenterY - ((signed int)(((unsigned int)(fixpoint_mul(uZoom, pIndoor->pVertices[pOutline->uVertex2ID].y)) << 16) - uZoom * pParty->vPosition.y) >> 16);
|
|
1905 pRenderer->RasterLine2D(pX, pY, pZ, pW, ui_game_minimap_outline_color);
|
|
1906 }
|
|
1907 }
|
|
1908
|
|
1909 //draw arrow on the minimap(include. Ritor1)
|
|
1910 uint arrow_idx;
|
|
1911 unsigned int rotate = pParty->sRotationY & stru_5C6E00->uDoublePiMask;
|
|
1912 if ( (signed int)rotate <= 1920 )
|
|
1913 arrow_idx = 6;
|
2508
|
1914 else if ( (signed int)rotate < 1664 )
|
2501
|
1915 arrow_idx = 5;
|
2508
|
1916 else if ( (signed int)rotate <= 1408 )
|
2501
|
1917 arrow_idx = 4;
|
2508
|
1918 else if ( (signed int)rotate < 1152 )
|
2501
|
1919 arrow_idx = 3;
|
2508
|
1920 else if ( (signed int)rotate <= 896 )
|
2501
|
1921 arrow_idx = 2;
|
2508
|
1922 else if ( (signed int)rotate < 640 )
|
2501
|
1923 arrow_idx = 1;
|
2508
|
1924 else if ( (signed int)rotate <= 384 )
|
2501
|
1925 arrow_idx = 0;
|
2508
|
1926 else if ( (signed int)rotate < 128 || (signed int)rotate > 1920 )
|
2501
|
1927 arrow_idx = 7;
|
|
1928 pRenderer->DrawTextureTransparent(uCenterX - 3, uCenterY - 3, pIcons_LOD->GetTexture(pTextureIDs_pMapDirs[arrow_idx]));//
|
|
1929
|
|
1930 //draw objects on the minimap
|
|
1931 if ( bWizardEyeActive )
|
|
1932 {
|
|
1933 if ( uWizardEyeSkillLevel >= 2 )
|
|
1934 {
|
|
1935 for ( uint i = 0; i < uNumSpriteObjects; ++i )
|
|
1936 {
|
|
1937 if ( !pSpriteObjects[i].uType || !pSpriteObjects[i].uObjectDescID )
|
|
1938 continue;
|
|
1939 //if (uWizardEyeSkillLevel == 1
|
|
1940 pPoint_X = uCenterX + fixpoint_mul((pSpriteObjects[i].vPosition.x - pParty->vPosition.x), uZoom);
|
|
1941 pPoint_Y = uCenterY - fixpoint_mul((pSpriteObjects[i].vPosition.y - pParty->vPosition.y), uZoom);
|
|
1942 //if ( pPoint_X >= pRenderer->raster_clip_x && pPoint_X <= pRenderer->raster_clip_z &&
|
|
1943 // pPoint_Y >= pRenderer->raster_clip_y && pPoint_Y <= pRenderer->raster_clip_w)
|
|
1944 {
|
|
1945 if (pObjectList->pObjects[pSpriteObjects[i].uObjectDescID].uFlags & OBJECT_DESC_UNPICKABLE)
|
|
1946 {
|
|
1947 pRenderer->RasterLine2D(pPoint_X, pPoint_Y, pPoint_X, pPoint_Y, ui_game_minimap_projectile_color);
|
|
1948 }
|
|
1949 else if ( uZoom > 512 )
|
|
1950 {
|
|
1951 pRenderer->RasterLine2D(pPoint_X - 2, pPoint_Y, pPoint_X - 2, pPoint_Y + 1, ui_game_minimap_treasure_color);
|
|
1952 pRenderer->RasterLine2D(pPoint_X - 1, pPoint_Y - 1, pPoint_X - 1, pPoint_Y + 1, ui_game_minimap_treasure_color);
|
|
1953 pRenderer->RasterLine2D(pPoint_X, pPoint_Y - 2, pPoint_X, pPoint_Y + 1, ui_game_minimap_treasure_color);
|
|
1954 pRenderer->RasterLine2D(pPoint_X + 1, pPoint_Y - 1, pPoint_X + 1, pPoint_Y + 1, ui_game_minimap_treasure_color);
|
|
1955 pRenderer->RasterLine2D(pPoint_X + 2, pPoint_Y, pPoint_X + 2, pPoint_Y + 1, ui_game_minimap_treasure_color);
|
|
1956 }
|
|
1957 else
|
|
1958 {
|
|
1959 pRenderer->RasterLine2D(pPoint_X - 1, pPoint_Y - 1, pPoint_X - 1, pPoint_Y, ui_game_minimap_treasure_color);
|
|
1960 pRenderer->RasterLine2D(pPoint_X, pPoint_Y - 1, pPoint_X, pPoint_Y, ui_game_minimap_treasure_color);
|
|
1961 }
|
|
1962 }
|
|
1963 }
|
|
1964 }
|
|
1965 for ( uint i = 0; i < uNumActors; ++i )//draw actors( )
|
|
1966 {
|
|
1967 if ( pActors[i].uAIState != Removed && pActors[i].uAIState != Disabled
|
|
1968 && (pActors[i].uAIState == Dead || pActors[i].ActorNearby()) )
|
|
1969 {
|
|
1970 pPoint_X = uCenterX + (fixpoint_mul((pActors[i].vPosition.x - pParty->vPosition.x), uZoom));
|
|
1971 pPoint_Y = uCenterY - (fixpoint_mul((pActors[i].vPosition.y - pParty->vPosition.y), uZoom));
|
|
1972 //if ( pPoint_X >= pRenderer->raster_clip_x && pPoint_X <= pRenderer->raster_clip_z
|
|
1973 // && pPoint_Y >= pRenderer->raster_clip_y && pPoint_Y <= pRenderer->raster_clip_w )
|
|
1974 {
|
|
1975 pColor = ui_game_minimap_actor_friendly_color;
|
|
1976 if ( pActors[i].uAttributes & ACTOR_HOSTILE )
|
|
1977 pColor = ui_game_minimap_actor_hostile_color;
|
|
1978 if ( pActors[i].uAIState == Dead)
|
|
1979 pColor = ui_game_minimap_actor_corpse_color;
|
|
1980 if ( uZoom > 1024 )
|
|
1981 {
|
|
1982 pRenderer->RasterLine2D(pPoint_X - 2, pPoint_Y - 1, pPoint_X - 2, pPoint_Y + 1, pColor);
|
|
1983 pRenderer->RasterLine2D(pPoint_X - 1, pPoint_Y - 2, pPoint_X - 1, pPoint_Y + 2, pColor);
|
|
1984 pRenderer->RasterLine2D(pPoint_X, pPoint_Y - 2, pPoint_X, pPoint_Y + 2, pColor);
|
|
1985 pRenderer->RasterLine2D(pPoint_X + 1, pPoint_Y - 2, pPoint_X + 1, pPoint_Y + 2, pColor);
|
|
1986 pRenderer->RasterLine2D(pPoint_X + 2, pPoint_Y - 1, pPoint_X + 2, pPoint_Y + 1, pColor);
|
|
1987 }
|
|
1988 else
|
|
1989 {
|
|
1990 pRenderer->RasterLine2D(pPoint_X - 1, pPoint_Y - 1, pPoint_X - 1, pPoint_Y, pColor);
|
|
1991 pRenderer->RasterLine2D(pPoint_X, pPoint_Y - 1, pPoint_X, pPoint_Y, pColor);
|
|
1992 }
|
|
1993 }
|
|
1994 }
|
|
1995 }
|
|
1996 for ( uint i = 0; i < (signed int)uNumLevelDecorations; ++i )//draw items( )
|
|
1997 {
|
|
1998 if ( pLevelDecorations[i].uFlags & 8 )
|
|
1999 {
|
|
2000 pPoint_X = uCenterX + (fixpoint_mul((pLevelDecorations[i].vPosition.x - pParty->vPosition.x), uZoom));
|
|
2001 pPoint_Y = uCenterY - (fixpoint_mul((pLevelDecorations[i].vPosition.y - pParty->vPosition.y), uZoom));
|
|
2002 //if ( pPoint_X >= pRenderer->raster_clip_x && pPoint_X <= pRenderer->raster_clip_z
|
|
2003 // && pPoint_Y >= pRenderer->raster_clip_y && pPoint_Y <= pRenderer->raster_clip_w )
|
|
2004 {
|
|
2005 if ( (signed int)uZoom > 512 )
|
|
2006 {
|
|
2007 pRenderer->RasterLine2D(pPoint_X - 1, pPoint_Y - 1, pPoint_X - 1, pPoint_Y + 1, ui_game_minimap_decoration_color_1);
|
|
2008 pRenderer->RasterLine2D(pPoint_X, pPoint_Y - 1, pPoint_X, pPoint_Y + 1, ui_game_minimap_decoration_color_1);
|
|
2009 pRenderer->RasterLine2D(pPoint_X + 1, pPoint_Y - 1, pPoint_X + 1, pPoint_Y + 1, ui_game_minimap_decoration_color_1);
|
|
2010 }
|
|
2011 else
|
|
2012 pRenderer->RasterLine2D(pPoint_X, pPoint_Y, pPoint_X, pPoint_Y, ui_game_minimap_decoration_color_1);
|
|
2013 }
|
|
2014 }
|
|
2015 }
|
|
2016 }
|
|
2017 pRenderer->DrawTextureTransparent(468, 0, pIcons_LOD->GetTexture(uTextureID_Minimap_Loop));//draw minimap_loop
|
|
2018 pRenderer->SetTextureClipRect(541, 0, 567, 480);
|
|
2019 pRenderer->DrawTextureIndexed(floorf(((double)pParty->sRotationY * 0.1171875) + 0.5f) + 285, 136, pIcons_LOD->GetTexture(uTextureID_Compas));//draw compas
|
|
2020 pRenderer->ResetTextureClipRect();
|
|
2021 }
|
|
2022
|
|
2023 //----- (00441498) --------------------------------------------------------
|
|
2024 void GameUI_DrawTorchlightAndWizardEye()
|
|
2025 {
|
|
2026 if (pCurrentScreen == SCREEN_GAME
|
|
2027 || pCurrentScreen == SCREEN_MENU
|
|
2028 || pCurrentScreen == SCREEN_OPTIONS
|
|
2029 || pCurrentScreen == SCREEN_REST
|
|
2030 || pCurrentScreen == SCREEN_SPELL_BOOK
|
|
2031 || pCurrentScreen == SCREEN_CHEST
|
|
2032 || pCurrentScreen == SCREEN_SAVEGAME
|
|
2033 || pCurrentScreen == SCREEN_LOADGAME
|
|
2034 || pCurrentScreen == SCREEN_CHEST_INVENTORY
|
|
2035 || pCurrentScreen == SCREEN_BOOKS
|
|
2036 || pCurrentScreen == SCREEN_BRANCHLESS_NPC_DIALOG )
|
|
2037 {
|
|
2038 if (pParty->TorchlightActive())
|
|
2039 {
|
|
2040 IconFrame* icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnum_Torchlight->uIconID, pEventTimer->Time());
|
|
2041 pRenderer->DrawTextureTransparent(pUIAnum_Torchlight->x, pUIAnum_Torchlight->y, pIcons_LOD->GetTexture(icon->uTextureID));
|
|
2042 }
|
|
2043 if (pParty->WizardEyeActive())
|
|
2044 {
|
|
2045 IconFrame* icon = pIconsFrameTable->GetFrame((signed __int16)pUIAnim_WizardEye->uIconID, pEventTimer->Time());
|
|
2046 pRenderer->DrawTextureTransparent(pUIAnim_WizardEye->x, pUIAnim_WizardEye->y, pIcons_LOD->GetTexture(icon->uTextureID));
|
|
2047 }
|
|
2048 }
|
|
2049 }
|
|
2050 // 4E28F8: using guessed type int pCurrentScreen;
|
|
2051
|
|
2052
|
|
2053 //----- (00491F87) --------------------------------------------------------
|
|
2054 void GameUI_DrawHiredNPCs()
|
|
2055 {
|
|
2056 unsigned int v13; // eax@23
|
|
2057 char pContainer[20]; // [sp+Ch] [bp-30h]@18
|
|
2058 signed int uFrameID; // [sp+24h] [bp-18h]@19
|
|
2059 int v22; // [sp+34h] [bp-8h]@2
|
|
2060 unsigned __int8 pNPC_limit_ID; // [sp+3Bh] [bp-1h]@2
|
|
2061
|
|
2062 if ( bNoNPCHiring != 1 )
|
|
2063 {
|
|
2064 pNPC_limit_ID = 0;
|
|
2065 v22 = 0;
|
|
2066 if (pParty->pHirelings[0].pName)
|
|
2067 pTmpBuf[v22++] = 0;
|
|
2068 if (pParty->pHirelings[1].pName)
|
|
2069 pTmpBuf[v22++] = 1;
|
|
2070
|
|
2071 for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i)
|
|
2072 {
|
|
2073 if (pNPCStats->pNewNPCData[i].uFlags & 128)
|
|
2074 {
|
|
2075 if (!pParty->pHirelings[0].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[0].pName))
|
|
2076 {
|
|
2077 if (!pParty->pHirelings[1].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[1].pName))
|
|
2078 pTmpBuf[v22++] = i + 2;
|
|
2079 }
|
|
2080 }
|
|
2081 }
|
|
2082
|
|
2083 for ( int i = pParty->hirelingScrollPosition; i < v22 && pNPC_limit_ID < 2; i++ )
|
|
2084 {
|
|
2085 if ( (unsigned __int8)pTmpBuf[i] >= 2 )
|
|
2086 {
|
|
2087 sprintf(pContainer, "NPC%03d", pNPCStats->pNPCData[(unsigned __int8)pTmpBuf[i] + 499].uPortraitID);
|
|
2088 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[pNPC_limit_ID], pHiredNPCsIconsOffsetsY[pNPC_limit_ID],
|
|
2089 pIcons_LOD->GetTexture(pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE)));
|
|
2090 }
|
|
2091 else
|
|
2092 {
|
|
2093 sprintf(pContainer, "NPC%03d", pParty->pHirelings[(unsigned __int8)pTmpBuf[i]].uPortraitID);
|
|
2094 pRenderer->DrawTextureIndexed(pHiredNPCsIconsOffsetsX[pNPC_limit_ID], pHiredNPCsIconsOffsetsY[pNPC_limit_ID],
|
|
2095 pIcons_LOD->GetTexture(pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE)));
|
|
2096 if ( pParty->pHirelings[(unsigned __int8)pTmpBuf[i]].evt_A == 1 )
|
|
2097 {
|
|
2098 uFrameID = pParty->pHirelings[(unsigned __int8)pTmpBuf[i]].evt_B;
|
|
2099 v13 = 0;
|
|
2100 if (pIconsFrameTable->uNumIcons)
|
|
2101 {
|
|
2102 for ( v13 = 0; v13 < pIconsFrameTable->uNumIcons; ++v13 )
|
|
2103 {
|
|
2104 if ( !_stricmp("spell96", pIconsFrameTable->pIcons[v13].pAnimationName) )
|
|
2105 break;
|
|
2106 }
|
|
2107 }
|
|
2108 pRenderer->DrawTextureTransparent(pHiredNPCsIconsOffsetsX[pNPC_limit_ID], pHiredNPCsIconsOffsetsY[pNPC_limit_ID],
|
|
2109 &pIcons_LOD->pTextures[pIconsFrameTable->GetFrame(v13, uFrameID)->uTextureID]);
|
|
2110 }
|
|
2111 }
|
|
2112 ++pNPC_limit_ID;
|
|
2113 }
|
|
2114 }
|
|
2115 }
|
|
2116
|
|
2117 //----- (004178FE) --------------------------------------------------------
|
|
2118 unsigned int UI_GetHealthManaAndOtherQualitiesStringColor(signed int current_pos, signed int base_pos)
|
|
2119 {
|
|
2120 unsigned __int16 R, G, B;
|
|
2121
|
|
2122 if ( current_pos <= base_pos )
|
|
2123 {
|
|
2124 if ( current_pos == base_pos )//White
|
|
2125 return 0;
|
|
2126 if ( 100 * current_pos / base_pos >= 25 )//Yellow( current_pos > 1/4 )
|
|
2127 R = 255, G = 255, B = 100;
|
|
2128 else//Red( current_pos < 1/4 )
|
|
2129 R = 255, G = 0, B = 0;
|
|
2130 }
|
|
2131 else//Green
|
|
2132 R = 0, G = 255, B = 0;
|
|
2133 return Color16(R, G, B);
|
|
2134 }
|
|
2135
|
|
2136 //----- (00417939) --------------------------------------------------------
|
|
2137 int GetConditionDrawColor(unsigned int uConditionIdx)
|
|
2138 {
|
|
2139 switch (uConditionIdx)
|
|
2140 {
|
|
2141 case Condition_Zombie:
|
|
2142 case Condition_Good:
|
|
2143 return ui_character_condition_normal_color;
|
|
2144
|
|
2145 case Condition_Cursed:
|
|
2146 case Condition_Weak:
|
|
2147 case Condition_Fear:
|
|
2148 case Condition_Drunk:
|
|
2149 case Condition_Insane:
|
|
2150 case Condition_Poison_Weak:
|
|
2151 case Condition_Disease_Weak:
|
|
2152 return ui_character_condition_light_color;
|
|
2153
|
|
2154 case Condition_Sleep:
|
|
2155 case Condition_Poison_Medium:
|
|
2156 case Condition_Disease_Medium:
|
|
2157 case Condition_Paralyzed:
|
|
2158 case Condition_Unconcious:
|
|
2159 return ui_character_condition_moderate_color;
|
|
2160
|
|
2161 case Condition_Poison_Severe:
|
|
2162 case Condition_Disease_Severe:
|
|
2163 case Condition_Dead:
|
|
2164 case Condition_Pertified:
|
|
2165 case Condition_Eradicated:
|
|
2166 return ui_character_condition_severe_color;
|
|
2167 }
|
|
2168 Error("Invalid condition (%u)", uConditionIdx);
|
|
2169 }
|
|
2170
|
|
2171 //----- (00495430) --------------------------------------------------------
|
|
2172 const char * GetReputationString(signed int a1)
|
|
2173 {
|
|
2174 if (a1 >= 25)
|
|
2175 return pGlobalTXT_LocalizationStrings[379]; // Hated
|
|
2176 else if (a1 >= 6)
|
|
2177 return pGlobalTXT_LocalizationStrings[392]; // Unfriendly
|
|
2178 else if (a1 >= -5)
|
|
2179 return pGlobalTXT_LocalizationStrings[399]; // Neutral;
|
|
2180 else if (a1 >= -24)
|
|
2181 return pGlobalTXT_LocalizationStrings[402]; // Friendly
|
|
2182 else
|
|
2183 return pGlobalTXT_LocalizationStrings[434]; // Respected;
|
|
2184 }
|
|
2185
|
|
2186 //----- (00441A4E) --------------------------------------------------------
|
|
2187 __int16 __fastcall sub_441A4E(int a1)//for blessing
|
|
2188 {
|
|
2189 __int16 result; // ax@1
|
|
2190 int v2; // ebx@1
|
|
2191 // char *v3; // esi@1
|
|
2192 // int v4; // edi@4
|
|
2193 bool v5; // ecx@4
|
|
2194 SpriteFrame *pFrame; // eax@6
|
|
2195 //SpriteFrame *v7; // edi@6
|
|
2196 int v8; // eax@6
|
|
2197 // unsigned __int16 v9; // ax@6
|
|
2198 RenderBillboardTransform_local0 v10; // [sp+Ch] [bp-5Ch]@1
|
|
2199 int v11; // [sp+5Ch] [bp-Ch]@6
|
|
2200 int v12; // [sp+60h] [bp-8h]@1
|
|
2201 //int v13; // [sp+64h] [bp-4h]@6
|
|
2202
|
|
2203 v10.sParentBillboardID = -1;
|
|
2204 v10.pTarget = pRenderer->pTargetSurface;
|
|
2205 v10.pTargetZ = pRenderer->pActiveZBuffer;
|
|
2206 v10.uTargetPitch = pRenderer->GetRenderWidth();
|
|
2207 result = 0;
|
|
2208 v2 = a1;
|
|
2209 v10.uViewportX = 0;
|
|
2210 v10.uViewportY = 0;
|
|
2211 v10.uViewportZ = window->GetWidth() - 1;
|
|
2212 v10.uViewportW = window->GetHeight() - 1;
|
|
2213 v12 = 0;
|
|
2214 //v3 = (char *)&pOtherOverlayList->pOverlays[0].field_C;
|
|
2215 //do
|
|
2216 for (uint i = 0; i < 50; ++i)
|
|
2217 {
|
|
2218 if (pOtherOverlayList->pOverlays[i].field_6 > 0)
|
|
2219 {
|
|
2220 result = pOtherOverlayList->pOverlays[i].field_0;
|
|
2221 if (pOtherOverlayList->pOverlays[i].field_0 >= 300)
|
|
2222 {
|
|
2223 //v4 = result;
|
|
2224 v5 = pOtherOverlayList->pOverlays[i].field_0 == v2 + 320
|
|
2225 || pOtherOverlayList->pOverlays[i].field_0 == v2 + 330
|
|
2226 || pOtherOverlayList->pOverlays[i].field_0 == v2 + 340
|
|
2227 || pOtherOverlayList->pOverlays[i].field_0 == v2 + 350;
|
|
2228 pOtherOverlayList->pOverlays[i].field_0 = v2 + 310;
|
|
2229 if (pOtherOverlayList->pOverlays[i].field_0 == v2 + 310 || v5)
|
|
2230 {
|
|
2231 if (!pOtherOverlayList->pOverlays[i].field_0)
|
|
2232 {
|
|
2233 pFrame = pSpriteFrameTable->GetFrame(pOverlayList->pOverlays[pOtherOverlayList->pOverlays[i].field_2].uSpriteFramesetID,
|
|
2234 pOtherOverlayList->pOverlays[i].field_4);
|
|
2235 //v7 = v6;
|
|
2236 v11 = pOtherOverlayList->pOverlays[i].field_E;
|
|
2237 //v13 = pFrame->scale;
|
|
2238 //v13 = fixpoint_mul(v11, pFrame->scale);
|
|
2239 v10.uScreenSpaceX = pOtherOverlayList->pOverlays[i].field_8;
|
|
2240 v10.uScreenSpaceY = pOtherOverlayList->pOverlays[i].field_A;
|
|
2241 v10._screenspace_x_scaler_packedfloat = fixpoint_mul(v11, pFrame->scale);
|
|
2242 v10._screenspace_y_scaler_packedfloat = fixpoint_mul(v11, pFrame->scale);
|
|
2243 v10.pPalette = PaletteManager::Get_Dark_or_Red_LUT(pFrame->uPaletteIndex, 0, 1);
|
|
2244 v8 = pOtherOverlayList->pOverlays[i].field_2;
|
|
2245 v10.sZValue = 0;
|
|
2246 v10.uFlags = 0;
|
|
2247 //v9 = pOverlayList->pOverlays[v8].uOverlayType;
|
|
2248 if (!pOverlayList->pOverlays[v8].uOverlayType || pOverlayList->pOverlays[v8].uOverlayType == 2)
|
|
2249 v10.uScreenSpaceY += pSprites_LOD->pSpriteHeaders[pFrame->pHwSpriteIDs[0]].uHeight / 2;
|
|
2250 result = pSprites_LOD->pSpriteHeaders[pFrame->pHwSpriteIDs[0]]._4AD2D1(&v10, 0);
|
|
2251 ++v12;
|
|
2252 if (v12 == 5)
|
|
2253 break;
|
|
2254 }
|
|
2255 }
|
|
2256 }
|
|
2257 }
|
|
2258 //v3 += 20;
|
|
2259 }
|
|
2260 //while ( (signed int)v3 < (signed int)&pOverlayList->pOverlays );
|
|
2261 return result;
|
|
2262 }
|