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