annotate Engine/Objects/NPC.cpp @ 2541:a902abdfc7f2

1. Renamed class Game to class Engine. 2. Separated game logic as state of FSM from game logic as engine. 3. Found out that many UI screen initializers were optimized away, intially they all returned newly created window as separate object like it is done in CharacterUI_Initialize.
author a.parshin
date Sun, 10 May 2015 01:29:11 +0200
parents 1bcadc6dd203
children c674d547cc7c
rev   line source
2498
Ritor1
parents:
diff changeset
1 #define _CRTDBG_MAP_ALLOC
Ritor1
parents:
diff changeset
2 #include <stdlib.h>
Ritor1
parents:
diff changeset
3 #include <crtdbg.h>
Ritor1
parents:
diff changeset
4
Ritor1
parents:
diff changeset
5 #define _CRT_SECURE_NO_WARNINGS
2499
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
6 #include "../texts.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
7 #include "../LOD.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
8 #include "../Autonotes.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
9 #include "../Awards.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
10 #include "../Party.h"
2498
Ritor1
parents:
diff changeset
11 #include "NPC.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2501
diff changeset
12 #include "GUI/GUIWindow.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
13 #include "../Events.h"
2501
0ff6a9e9bf7f GUI folger
Ritor1
parents: 2499
diff changeset
14 #include "..\..\GUI\UI\UIHouses.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
15 #include "../Graphics/Indoor.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
16 #include "../MapInfo.h"
2498
Ritor1
parents:
diff changeset
17 #include "Actor.h"
2502
a77c34acdbc9 Media folder
Ritor1
parents: 2501
diff changeset
18 #include "Media/Audio/AudioPlayer.h"
2499
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
19 #include "../Spells/CastSpellInfo.h"
68cdef6879a0 engine folder
Ritor1
parents: 2498
diff changeset
20 #include "../Graphics/Overlays.h"
2498
Ritor1
parents:
diff changeset
21
Ritor1
parents:
diff changeset
22 int pDialogueNPCCount;
Ritor1
parents:
diff changeset
23 std::array<struct Texture *, 6> pDialogueNPCPortraits;
Ritor1
parents:
diff changeset
24 int uNumDialogueNPCPortraits; // weak
Ritor1
parents:
diff changeset
25 struct NPCStats *pNPCStats = nullptr;
Ritor1
parents:
diff changeset
26
Ritor1
parents:
diff changeset
27 int NPCStats::dword_AE336C_LastMispronouncedNameFirstLetter = -1;
Ritor1
parents:
diff changeset
28 int NPCStats::dword_AE3370_LastMispronouncedNameResult = -1;
Ritor1
parents:
diff changeset
29
Ritor1
parents:
diff changeset
30 void InitializeAwards();
Ritor1
parents:
diff changeset
31 void InitializeScrolls();
Ritor1
parents:
diff changeset
32 void InitializeMerchants();
Ritor1
parents:
diff changeset
33 void InitializeTransitions();
Ritor1
parents:
diff changeset
34 void InitializeAutonotes();
Ritor1
parents:
diff changeset
35 void InitializeQuests();
Ritor1
parents:
diff changeset
36 bool CheckPortretAgainstSex(int portret_num, int sex);
Ritor1
parents:
diff changeset
37
Ritor1
parents:
diff changeset
38 //----- (004459F9) --------------------------------------------------------
Ritor1
parents:
diff changeset
39 NPCData *__fastcall GetNPCData(signed int npcid)
Ritor1
parents:
diff changeset
40 {
Ritor1
parents:
diff changeset
41 unsigned int v1; // esi@1
Ritor1
parents:
diff changeset
42 NPCData *result; // eax@5
Ritor1
parents:
diff changeset
43 int v3; // esi@9
Ritor1
parents:
diff changeset
44 int v4; // ecx@9
Ritor1
parents:
diff changeset
45 //int v5; // edx@9
Ritor1
parents:
diff changeset
46 //NPCData *v6; // eax@9
Ritor1
parents:
diff changeset
47 // char *v7; // ebx@14
Ritor1
parents:
diff changeset
48 // NPCData *v8; // edi@14
Ritor1
parents:
diff changeset
49 char v9; // al@22
Ritor1
parents:
diff changeset
50 // char v10;
Ritor1
parents:
diff changeset
51 //std::string v10; // [sp-18h] [bp-2Ch]@4
Ritor1
parents:
diff changeset
52 // int v11;
Ritor1
parents:
diff changeset
53 //const char *v11; // [sp-8h] [bp-1Ch]@4
Ritor1
parents:
diff changeset
54 // int v12; // [sp-4h] [bp-18h]@4
Ritor1
parents:
diff changeset
55 // int v13;
Ritor1
parents:
diff changeset
56 // char *v14;
Ritor1
parents:
diff changeset
57 //std::string *v13; // [sp+Ch] [bp-8h]@4
Ritor1
parents:
diff changeset
58 // int a3; // [sp+13h] [bp-1h]@4
Ritor1
parents:
diff changeset
59 int i;
Ritor1
parents:
diff changeset
60
Ritor1
parents:
diff changeset
61 /*v1 = npcid;
Ritor1
parents:
diff changeset
62 if ( (npcid & 0x80000000u) == 0 )
Ritor1
parents:
diff changeset
63 {
Ritor1
parents:
diff changeset
64 if ( (signed int)npcid < 5000 )
Ritor1
parents:
diff changeset
65 {
Ritor1
parents:
diff changeset
66 if ( (signed int)npcid >= 501 )
Ritor1
parents:
diff changeset
67 {
Ritor1
parents:
diff changeset
68 MessageBoxW(nullptr, L"NPC id exceeds MAX_DATA!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Events.cpp:1984", 0);
Ritor1
parents:
diff changeset
69 }
Ritor1
parents:
diff changeset
70 return &pNPCStats->pNewNPCData[v1];
Ritor1
parents:
diff changeset
71 }
Ritor1
parents:
diff changeset
72 return &pNPCStats->array_13EF4[npcid - 5000];
Ritor1
parents:
diff changeset
73 }
Ritor1
parents:
diff changeset
74 if ( (signed int)npcid >= 5000 )
Ritor1
parents:
diff changeset
75 return &pNPCStats->array_13EF4[npcid - 5000];
Ritor1
parents:
diff changeset
76 if ( (sDialogue_SpeakingActorNPC_ID & 0x80000000u) == 0 )
Ritor1
parents:
diff changeset
77 {
Ritor1
parents:
diff changeset
78 result = 0;
Ritor1
parents:
diff changeset
79 }
Ritor1
parents:
diff changeset
80 else
Ritor1
parents:
diff changeset
81 {
Ritor1
parents:
diff changeset
82 v3 = abs((int)sDialogue_SpeakingActorNPC_ID) - 1;
Ritor1
parents:
diff changeset
83 v4 = 0;
Ritor1
parents:
diff changeset
84 v5 = 0;
Ritor1
parents:
diff changeset
85 v6 = pParty->pHirelings;
Ritor1
parents:
diff changeset
86 do
Ritor1
parents:
diff changeset
87 {
Ritor1
parents:
diff changeset
88 if ( v6->pName )
Ritor1
parents:
diff changeset
89 pTmpBuf[v4++] = v5;
Ritor1
parents:
diff changeset
90 ++v6;
Ritor1
parents:
diff changeset
91 ++v5;
Ritor1
parents:
diff changeset
92 }
Ritor1
parents:
diff changeset
93 while ( (signed int)v6 < (signed int)&pParty->pPickedItem );
Ritor1
parents:
diff changeset
94 v13 = 0;
Ritor1
parents:
diff changeset
95 if ( (signed int)pNPCStats->uNumNewNPCs > 0 )
Ritor1
parents:
diff changeset
96 {
Ritor1
parents:
diff changeset
97 v7 = &pTmpBuf[v4];
Ritor1
parents:
diff changeset
98 v8 = pNPCStats->pNewNPCData;
Ritor1
parents:
diff changeset
99 do
Ritor1
parents:
diff changeset
100 {
Ritor1
parents:
diff changeset
101 if ( v8->uFlags & 0x80
Ritor1
parents:
diff changeset
102 && (!pParty->pHirelings[0].pName || strcmp(v8->pName, pParty->pHirelings[0].pName))
Ritor1
parents:
diff changeset
103 && (!pParty->pHirelings[1].pName || strcmp(v8->pName, pParty->pHirelings[1].pName)) )
Ritor1
parents:
diff changeset
104 *v7++ = (char)v13 + 2;
Ritor1
parents:
diff changeset
105 v13 = (std::string *)((char *)v13 + 1);
Ritor1
parents:
diff changeset
106 ++v8;
Ritor1
parents:
diff changeset
107 }
Ritor1
parents:
diff changeset
108 while ( (signed int)v13 < (signed int)pNPCStats->uNumNewNPCs );
Ritor1
parents:
diff changeset
109 }
Ritor1
parents:
diff changeset
110 v9 = pTmpBuf[v3];
Ritor1
parents:
diff changeset
111 if ( (unsigned __int8)v9 >= 2u )
Ritor1
parents:
diff changeset
112 result = &pNPCStats->pNPCData[(unsigned __int8)v9 + 499];
Ritor1
parents:
diff changeset
113 else
Ritor1
parents:
diff changeset
114 result = &pParty->pHirelings[(unsigned __int8)v9];
Ritor1
parents:
diff changeset
115 }
Ritor1
parents:
diff changeset
116 return result;*/
Ritor1
parents:
diff changeset
117 v1 = npcid;
Ritor1
parents:
diff changeset
118 if ( npcid >= 0 )
Ritor1
parents:
diff changeset
119 {
Ritor1
parents:
diff changeset
120 if ( npcid < 5000 )
Ritor1
parents:
diff changeset
121 {
Ritor1
parents:
diff changeset
122 if ( npcid >= 501 )
Ritor1
parents:
diff changeset
123 {
Ritor1
parents:
diff changeset
124 MessageBoxW(nullptr, L"NPC id exceeds MAX_DATA!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Events.cpp:1984", 0);
Ritor1
parents:
diff changeset
125 }
Ritor1
parents:
diff changeset
126 return &pNPCStats->pNewNPCData[v1];// - 1];
Ritor1
parents:
diff changeset
127 }
Ritor1
parents:
diff changeset
128 return &pNPCStats->pAdditionalNPC[npcid - 5000];
Ritor1
parents:
diff changeset
129 }
Ritor1
parents:
diff changeset
130
Ritor1
parents:
diff changeset
131
Ritor1
parents:
diff changeset
132 if ( npcid >= 5000 )
Ritor1
parents:
diff changeset
133 return &pNPCStats->pAdditionalNPC[npcid - 5000];
Ritor1
parents:
diff changeset
134 if (sDialogue_SpeakingActorNPC_ID >= 0)
Ritor1
parents:
diff changeset
135 {
Ritor1
parents:
diff changeset
136 result = 0;
Ritor1
parents:
diff changeset
137 }
Ritor1
parents:
diff changeset
138 else
Ritor1
parents:
diff changeset
139 {
Ritor1
parents:
diff changeset
140 v3 = abs(sDialogue_SpeakingActorNPC_ID) - 1;
Ritor1
parents:
diff changeset
141 v4 = 0;
Ritor1
parents:
diff changeset
142
Ritor1
parents:
diff changeset
143 for (i = 0; i < 2; ++i)
Ritor1
parents:
diff changeset
144 {
Ritor1
parents:
diff changeset
145 if (pParty->pHirelings[i].pName)
Ritor1
parents:
diff changeset
146 pTmpBuf[v4++] = i;
Ritor1
parents:
diff changeset
147 }
Ritor1
parents:
diff changeset
148
Ritor1
parents:
diff changeset
149 if (pNPCStats->uNumNewNPCs > 0)
Ritor1
parents:
diff changeset
150 {
Ritor1
parents:
diff changeset
151 for (i = 0; i < pNPCStats->uNumNewNPCs; ++i)
Ritor1
parents:
diff changeset
152 {
Ritor1
parents:
diff changeset
153 if (pNPCStats->pNewNPCData[i].Hired())
Ritor1
parents:
diff changeset
154 {
Ritor1
parents:
diff changeset
155 if (!pParty->pHirelings[0].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[0].pName))
Ritor1
parents:
diff changeset
156 {
Ritor1
parents:
diff changeset
157 if (!pParty->pHirelings[1].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[1].pName))
Ritor1
parents:
diff changeset
158 pTmpBuf[v4++] = i + 2;
Ritor1
parents:
diff changeset
159 }
Ritor1
parents:
diff changeset
160 }
Ritor1
parents:
diff changeset
161 }
Ritor1
parents:
diff changeset
162 }
Ritor1
parents:
diff changeset
163
Ritor1
parents:
diff changeset
164 v9 = pTmpBuf[v3];
Ritor1
parents:
diff changeset
165 if ( v9 >= 2 )
Ritor1
parents:
diff changeset
166 result = &pNPCStats->pNPCData[499 + v9];
Ritor1
parents:
diff changeset
167 else
Ritor1
parents:
diff changeset
168 result = &pParty->pHirelings[v9];
Ritor1
parents:
diff changeset
169 }
Ritor1
parents:
diff changeset
170 return result;
Ritor1
parents:
diff changeset
171 }
Ritor1
parents:
diff changeset
172
Ritor1
parents:
diff changeset
173 //----- (00445B2C) --------------------------------------------------------
Ritor1
parents:
diff changeset
174 struct NPCData * GetNewNPCData( signed int npcid, int* npc_indx )
Ritor1
parents:
diff changeset
175 {
Ritor1
parents:
diff changeset
176
Ritor1
parents:
diff changeset
177 int* v3; // edi@1
Ritor1
parents:
diff changeset
178 NPCData *result; // eax@5
Ritor1
parents:
diff changeset
179 int v5; // esi@9
Ritor1
parents:
diff changeset
180 int v6; // ecx@9
Ritor1
parents:
diff changeset
181 char v11; // al@23
Ritor1
parents:
diff changeset
182
Ritor1
parents:
diff changeset
183 v3 = npc_indx;
Ritor1
parents:
diff changeset
184 if ( npcid >= 0 )
Ritor1
parents:
diff changeset
185 {
Ritor1
parents:
diff changeset
186 if ( npcid < 5000 )
Ritor1
parents:
diff changeset
187 {
Ritor1
parents:
diff changeset
188 if ( npcid >= 501 )
Ritor1
parents:
diff changeset
189 {
Ritor1
parents:
diff changeset
190 MessageBoxW(nullptr, L"NPC id exceeds MAX_DATA!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Events.cpp:2040", 0);
Ritor1
parents:
diff changeset
191 }
Ritor1
parents:
diff changeset
192 *v3 = npcid;
Ritor1
parents:
diff changeset
193 return &pNPCStats->pNewNPCData[npcid];
Ritor1
parents:
diff changeset
194 }
Ritor1
parents:
diff changeset
195 *npc_indx = npcid - 5000;
Ritor1
parents:
diff changeset
196 return &pNPCStats->pAdditionalNPC[npcid - 5000];
Ritor1
parents:
diff changeset
197 }
Ritor1
parents:
diff changeset
198 if ( npcid >= 5000 )
Ritor1
parents:
diff changeset
199 {
Ritor1
parents:
diff changeset
200 *npc_indx = npcid - 5000;
Ritor1
parents:
diff changeset
201 return &pNPCStats->pAdditionalNPC[npcid - 5000];
Ritor1
parents:
diff changeset
202 }
Ritor1
parents:
diff changeset
203 if ( sDialogue_SpeakingActorNPC_ID >= 0 )
Ritor1
parents:
diff changeset
204 {
Ritor1
parents:
diff changeset
205 *npc_indx = 0;
Ritor1
parents:
diff changeset
206 result = nullptr;
Ritor1
parents:
diff changeset
207 }
Ritor1
parents:
diff changeset
208 else
Ritor1
parents:
diff changeset
209 {
Ritor1
parents:
diff changeset
210 v5 = abs(sDialogue_SpeakingActorNPC_ID) - 1;
Ritor1
parents:
diff changeset
211 v6 = 0;
Ritor1
parents:
diff changeset
212 for (int i=0; i<2; ++i)
Ritor1
parents:
diff changeset
213 {
Ritor1
parents:
diff changeset
214 if ( pParty->pHirelings[i].pName )
Ritor1
parents:
diff changeset
215 pTmpBuf[v6++] = i;
Ritor1
parents:
diff changeset
216
Ritor1
parents:
diff changeset
217 }
Ritor1
parents:
diff changeset
218 for (int i=0; i< pNPCStats->uNumNewNPCs; ++i)
Ritor1
parents:
diff changeset
219 {
Ritor1
parents:
diff changeset
220 if ( pNPCStats->pNewNPCData[i].Hired()
Ritor1
parents:
diff changeset
221 && (!pParty->pHirelings[0].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[0].pName))
Ritor1
parents:
diff changeset
222 && (!pParty->pHirelings[1].pName || strcmp(pNPCStats->pNewNPCData[i].pName, pParty->pHirelings[1].pName)) )
Ritor1
parents:
diff changeset
223 {
Ritor1
parents:
diff changeset
224 pTmpBuf[v6++]=i+2;
Ritor1
parents:
diff changeset
225 }
Ritor1
parents:
diff changeset
226 }
Ritor1
parents:
diff changeset
227 v11 = pTmpBuf[v5];
Ritor1
parents:
diff changeset
228
Ritor1
parents:
diff changeset
229 if ( v11 >= 2u )
Ritor1
parents:
diff changeset
230 {
Ritor1
parents:
diff changeset
231 *v3 = v11 - 2;
Ritor1
parents:
diff changeset
232 result = &pNPCStats->pNewNPCData[v11 - 2];
Ritor1
parents:
diff changeset
233 }
Ritor1
parents:
diff changeset
234 else
Ritor1
parents:
diff changeset
235 {
Ritor1
parents:
diff changeset
236 *v3 = v11;
Ritor1
parents:
diff changeset
237 result = &pParty->pHirelings[v11];
Ritor1
parents:
diff changeset
238 }
Ritor1
parents:
diff changeset
239 }
Ritor1
parents:
diff changeset
240 return result;
Ritor1
parents:
diff changeset
241 }
Ritor1
parents:
diff changeset
242
Ritor1
parents:
diff changeset
243 //----- (00476977) --------------------------------------------------------
Ritor1
parents:
diff changeset
244 void NPCStats::InitializeNPCText()
Ritor1
parents:
diff changeset
245 {
Ritor1
parents:
diff changeset
246 int i;
Ritor1
parents:
diff changeset
247 char* test_string;
Ritor1
parents:
diff changeset
248 unsigned char c;
Ritor1
parents:
diff changeset
249 bool break_loop;
Ritor1
parents:
diff changeset
250 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
251 char* tmp_pos;
Ritor1
parents:
diff changeset
252 int decode_step;
Ritor1
parents:
diff changeset
253
Ritor1
parents:
diff changeset
254 free(pNPCTextTXT_Raw);
Ritor1
parents:
diff changeset
255 pNPCTextTXT_Raw = (char *)pEvents_LOD->LoadRaw("npctext.txt", 0);
Ritor1
parents:
diff changeset
256 strtok(pNPCTextTXT_Raw, "\r");
Ritor1
parents:
diff changeset
257
Ritor1
parents:
diff changeset
258 for (i=0; i<789; ++i)
Ritor1
parents:
diff changeset
259 {
Ritor1
parents:
diff changeset
260 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
261 break_loop = false;
Ritor1
parents:
diff changeset
262 decode_step=0;
Ritor1
parents:
diff changeset
263 do
Ritor1
parents:
diff changeset
264 {
Ritor1
parents:
diff changeset
265 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
266 temp_str_len = 0;
Ritor1
parents:
diff changeset
267 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
268 {
Ritor1
parents:
diff changeset
269 ++temp_str_len;
Ritor1
parents:
diff changeset
270 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
271 }
Ritor1
parents:
diff changeset
272 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
273 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
274 break_loop = true;
Ritor1
parents:
diff changeset
275 *tmp_pos = 0;
Ritor1
parents:
diff changeset
276 if (temp_str_len)
Ritor1
parents:
diff changeset
277 {
Ritor1
parents:
diff changeset
278 if ( decode_step == 1)
Ritor1
parents:
diff changeset
279 pNPCTopics[i].pText =RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
280 }
Ritor1
parents:
diff changeset
281 else
Ritor1
parents:
diff changeset
282 {
Ritor1
parents:
diff changeset
283 break_loop = true;
Ritor1
parents:
diff changeset
284 }
Ritor1
parents:
diff changeset
285 ++decode_step;
Ritor1
parents:
diff changeset
286 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
287 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
288 }
Ritor1
parents:
diff changeset
289 free(pNPCTopicTXT_Raw);
Ritor1
parents:
diff changeset
290 pNPCTopicTXT_Raw = (char *)pEvents_LOD->LoadRaw("npctopic.txt", 0);
Ritor1
parents:
diff changeset
291 strtok(pNPCTopicTXT_Raw, "\r");
Ritor1
parents:
diff changeset
292
Ritor1
parents:
diff changeset
293 for ( i = 1; i <= 579; ++i )//NPC topics count limit
Ritor1
parents:
diff changeset
294 {
Ritor1
parents:
diff changeset
295 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
296 break_loop = false;
Ritor1
parents:
diff changeset
297 decode_step=0;
Ritor1
parents:
diff changeset
298 do
Ritor1
parents:
diff changeset
299 {
Ritor1
parents:
diff changeset
300 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
301 temp_str_len = 0;
Ritor1
parents:
diff changeset
302 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
303 {
Ritor1
parents:
diff changeset
304 ++temp_str_len;
Ritor1
parents:
diff changeset
305 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
306 }
Ritor1
parents:
diff changeset
307 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
308 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
309 break_loop = true;
Ritor1
parents:
diff changeset
310 *tmp_pos = 0;
Ritor1
parents:
diff changeset
311 if (temp_str_len)
Ritor1
parents:
diff changeset
312 {
Ritor1
parents:
diff changeset
313 if ( decode_step == 1)
Ritor1
parents:
diff changeset
314 pNPCTopics[i].pTopic = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
315 }
Ritor1
parents:
diff changeset
316 else
Ritor1
parents:
diff changeset
317 {
Ritor1
parents:
diff changeset
318 break_loop = true;
Ritor1
parents:
diff changeset
319 }
Ritor1
parents:
diff changeset
320 ++decode_step;
Ritor1
parents:
diff changeset
321 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
322 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
323 }
Ritor1
parents:
diff changeset
324
Ritor1
parents:
diff changeset
325 free(pNPCDistTXT_Raw);
Ritor1
parents:
diff changeset
326 pNPCDistTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcdist.txt", 0);
Ritor1
parents:
diff changeset
327 strtok(pNPCDistTXT_Raw, "\r");
Ritor1
parents:
diff changeset
328 strtok(NULL, "\r");
Ritor1
parents:
diff changeset
329
Ritor1
parents:
diff changeset
330 for (i=1; i<59; ++i)
Ritor1
parents:
diff changeset
331 {
Ritor1
parents:
diff changeset
332 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
333 break_loop = false;
Ritor1
parents:
diff changeset
334 decode_step=0;
Ritor1
parents:
diff changeset
335 do
Ritor1
parents:
diff changeset
336 {
Ritor1
parents:
diff changeset
337 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
338 temp_str_len = 0;
Ritor1
parents:
diff changeset
339 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
340 {
Ritor1
parents:
diff changeset
341 ++temp_str_len;
Ritor1
parents:
diff changeset
342 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
343 }
Ritor1
parents:
diff changeset
344 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
345 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
346 break_loop = true;
Ritor1
parents:
diff changeset
347 *tmp_pos = 0;
Ritor1
parents:
diff changeset
348 if (temp_str_len)
Ritor1
parents:
diff changeset
349 {
Ritor1
parents:
diff changeset
350 if ((decode_step>0)&&(decode_step<77))
Ritor1
parents:
diff changeset
351 {
Ritor1
parents:
diff changeset
352 pProfessionChance[decode_step].professionChancePerArea[i]=atoi(test_string);
Ritor1
parents:
diff changeset
353 }
Ritor1
parents:
diff changeset
354 else if (decode_step==0)
Ritor1
parents:
diff changeset
355 {
Ritor1
parents:
diff changeset
356 pProfessionChance[0].professionChancePerArea[i]=10;
Ritor1
parents:
diff changeset
357 }
Ritor1
parents:
diff changeset
358 }
Ritor1
parents:
diff changeset
359 else
Ritor1
parents:
diff changeset
360 {
Ritor1
parents:
diff changeset
361 break_loop = true;
Ritor1
parents:
diff changeset
362 }
Ritor1
parents:
diff changeset
363 ++decode_step;
Ritor1
parents:
diff changeset
364 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
365 } while ((decode_step<78)&&!break_loop);
Ritor1
parents:
diff changeset
366 }
Ritor1
parents:
diff changeset
367
Ritor1
parents:
diff changeset
368 for ( i = 0; i < 77; ++i )
Ritor1
parents:
diff changeset
369 {
Ritor1
parents:
diff changeset
370 pProfessionChance[i].uTotalprofChance=0;
Ritor1
parents:
diff changeset
371 for ( int ii = 1; ii < 59; ++ii )
Ritor1
parents:
diff changeset
372 {
Ritor1
parents:
diff changeset
373 pProfessionChance[i].uTotalprofChance+=pProfessionChance[i].professionChancePerArea[ii];
Ritor1
parents:
diff changeset
374 }
Ritor1
parents:
diff changeset
375 pProfessionChance[i].professionChancePerArea[0]=0;
Ritor1
parents:
diff changeset
376 pProfessionChance[i].professionChancePerArea[59]=0;
Ritor1
parents:
diff changeset
377 }
Ritor1
parents:
diff changeset
378
Ritor1
parents:
diff changeset
379 free(pNPCDistTXT_Raw);
Ritor1
parents:
diff changeset
380 pNPCDistTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
381 }
Ritor1
parents:
diff changeset
382
Ritor1
parents:
diff changeset
383 //----- (00476C60) --------------------------------------------------------
Ritor1
parents:
diff changeset
384 void NPCStats::_476C60()
Ritor1
parents:
diff changeset
385 {
Ritor1
parents:
diff changeset
386 for (unsigned int i = 1; i < uNumNewNPCs; ++i)
Ritor1
parents:
diff changeset
387 pNewNPCData[i].pName = pNPCUnicNames[i - 1];
Ritor1
parents:
diff changeset
388
Ritor1
parents:
diff changeset
389 if (pParty->pHirelings[0].pName)
Ritor1
parents:
diff changeset
390 pParty->pHirelings[0].pName = pParty->pHireling1Name;
Ritor1
parents:
diff changeset
391 if (pParty->pHirelings[1].pName)
Ritor1
parents:
diff changeset
392 pParty->pHirelings[1].pName = pParty->pHireling2Name;
Ritor1
parents:
diff changeset
393 }
Ritor1
parents:
diff changeset
394
Ritor1
parents:
diff changeset
395 //----- (00476CB5) --------------------------------------------------------
Ritor1
parents:
diff changeset
396 void NPCStats::InitializeNPCData()
Ritor1
parents:
diff changeset
397 {
Ritor1
parents:
diff changeset
398 int i;
Ritor1
parents:
diff changeset
399 char* test_string;
Ritor1
parents:
diff changeset
400 unsigned char c;
Ritor1
parents:
diff changeset
401 bool break_loop;
Ritor1
parents:
diff changeset
402 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
403 char* tmp_pos;
Ritor1
parents:
diff changeset
404 int decode_step;
Ritor1
parents:
diff changeset
405
Ritor1
parents:
diff changeset
406 pNPCDataTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcdata.txt", 0);
Ritor1
parents:
diff changeset
407 strtok(pNPCDataTXT_Raw, "\r");
Ritor1
parents:
diff changeset
408 strtok(NULL, "\r");
Ritor1
parents:
diff changeset
409
Ritor1
parents:
diff changeset
410 for (i=0; i<500; ++i)
Ritor1
parents:
diff changeset
411 {
Ritor1
parents:
diff changeset
412 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
413 break_loop = false;
Ritor1
parents:
diff changeset
414 decode_step=0;
Ritor1
parents:
diff changeset
415 do
Ritor1
parents:
diff changeset
416 {
Ritor1
parents:
diff changeset
417 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
418 temp_str_len = 0;
Ritor1
parents:
diff changeset
419 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
420 {
Ritor1
parents:
diff changeset
421 ++temp_str_len;
Ritor1
parents:
diff changeset
422 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
423 }
Ritor1
parents:
diff changeset
424 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
425 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
426 break_loop = true;
Ritor1
parents:
diff changeset
427 *tmp_pos = 0;
Ritor1
parents:
diff changeset
428 if (temp_str_len)
Ritor1
parents:
diff changeset
429 { //i+1
Ritor1
parents:
diff changeset
430 switch (decode_step)
Ritor1
parents:
diff changeset
431 {
Ritor1
parents:
diff changeset
432 case 1:
Ritor1
parents:
diff changeset
433 pNPCUnicNames[i] = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
434 pNPCData[i+1].pName=pNPCUnicNames[i];
Ritor1
parents:
diff changeset
435 break;
Ritor1
parents:
diff changeset
436 case 2:
Ritor1
parents:
diff changeset
437 pNPCData[i+1].uPortraitID = atoi(test_string);
Ritor1
parents:
diff changeset
438 break;
Ritor1
parents:
diff changeset
439 case 6:
Ritor1
parents:
diff changeset
440 pNPCData[i+1].Location2D = atoi(test_string);
Ritor1
parents:
diff changeset
441 break;
Ritor1
parents:
diff changeset
442 case 7:
Ritor1
parents:
diff changeset
443 pNPCData[i+1].uProfession = atoi(test_string);
Ritor1
parents:
diff changeset
444 break;
Ritor1
parents:
diff changeset
445 case 8:
Ritor1
parents:
diff changeset
446 pNPCData[i+1].greet = atoi(test_string);
Ritor1
parents:
diff changeset
447 break;
Ritor1
parents:
diff changeset
448 case 9:
Ritor1
parents:
diff changeset
449 pNPCData[i+1].joins = (*test_string == 'y')?1:0;
Ritor1
parents:
diff changeset
450 break;
Ritor1
parents:
diff changeset
451 case 10:
Ritor1
parents:
diff changeset
452 pNPCData[i+1].evt_A = atoi(test_string);
Ritor1
parents:
diff changeset
453 break;
Ritor1
parents:
diff changeset
454 case 11:
Ritor1
parents:
diff changeset
455 pNPCData[i+1].evt_B = atoi(test_string);
Ritor1
parents:
diff changeset
456 break;
Ritor1
parents:
diff changeset
457 case 12:
Ritor1
parents:
diff changeset
458 pNPCData[i+1].evt_C = atoi(test_string);
Ritor1
parents:
diff changeset
459 break;
Ritor1
parents:
diff changeset
460 case 13:
Ritor1
parents:
diff changeset
461 pNPCData[i+1].evt_D = atoi(test_string);
Ritor1
parents:
diff changeset
462 break;
Ritor1
parents:
diff changeset
463 case 14:
Ritor1
parents:
diff changeset
464 pNPCData[i+1].evt_E = atoi(test_string);
Ritor1
parents:
diff changeset
465 break;
Ritor1
parents:
diff changeset
466 case 15:
Ritor1
parents:
diff changeset
467 pNPCData[i+1].evt_F = atoi(test_string);
Ritor1
parents:
diff changeset
468 break;
Ritor1
parents:
diff changeset
469 }
Ritor1
parents:
diff changeset
470 }
Ritor1
parents:
diff changeset
471 ++decode_step;
Ritor1
parents:
diff changeset
472 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
473 } while ((decode_step<16)&&!break_loop);
Ritor1
parents:
diff changeset
474 }
Ritor1
parents:
diff changeset
475 uNumNewNPCs = 501;
Ritor1
parents:
diff changeset
476 pNPCGreetTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcgreet.txt", 0);
Ritor1
parents:
diff changeset
477 strtok(pNPCGreetTXT_Raw, "\r");
Ritor1
parents:
diff changeset
478 for ( i = 1; i <= 205; ++i )
Ritor1
parents:
diff changeset
479 {
Ritor1
parents:
diff changeset
480 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
481 break_loop = false;
Ritor1
parents:
diff changeset
482 decode_step=0;
Ritor1
parents:
diff changeset
483 do
Ritor1
parents:
diff changeset
484 {
Ritor1
parents:
diff changeset
485 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
486 temp_str_len = 0;
Ritor1
parents:
diff changeset
487 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
488 {
Ritor1
parents:
diff changeset
489 ++temp_str_len;
Ritor1
parents:
diff changeset
490 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
491 }
Ritor1
parents:
diff changeset
492 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
493 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
494 break_loop = true;
Ritor1
parents:
diff changeset
495 *tmp_pos = 0;
Ritor1
parents:
diff changeset
496 if (temp_str_len)
Ritor1
parents:
diff changeset
497 { //i+1
Ritor1
parents:
diff changeset
498 switch (decode_step)
Ritor1
parents:
diff changeset
499 {
Ritor1
parents:
diff changeset
500 case 1:
Ritor1
parents:
diff changeset
501 pNPCGreetings[i].pGreetings[0] = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
502 break;
Ritor1
parents:
diff changeset
503 case 2:
Ritor1
parents:
diff changeset
504 pNPCGreetings[i].pGreetings[1] = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
505 break;
Ritor1
parents:
diff changeset
506 }
Ritor1
parents:
diff changeset
507 }
Ritor1
parents:
diff changeset
508 ++decode_step;
Ritor1
parents:
diff changeset
509 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
510 } while ((decode_step<3)&&!break_loop);
Ritor1
parents:
diff changeset
511 }
Ritor1
parents:
diff changeset
512
Ritor1
parents:
diff changeset
513 pNCPGroupTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcgroup.txt", 0);
Ritor1
parents:
diff changeset
514 strtok(pNCPGroupTXT_Raw, "\r");
Ritor1
parents:
diff changeset
515
Ritor1
parents:
diff changeset
516 for (i=0; i<51; ++i)
Ritor1
parents:
diff changeset
517 {
Ritor1
parents:
diff changeset
518 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
519 break_loop = false;
Ritor1
parents:
diff changeset
520 decode_step=0;
Ritor1
parents:
diff changeset
521 do
Ritor1
parents:
diff changeset
522 {
Ritor1
parents:
diff changeset
523 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
524 temp_str_len = 0;
Ritor1
parents:
diff changeset
525 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
526 {
Ritor1
parents:
diff changeset
527 ++temp_str_len;
Ritor1
parents:
diff changeset
528 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
529 }
Ritor1
parents:
diff changeset
530 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
531 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
532 break_loop = true;
Ritor1
parents:
diff changeset
533 *tmp_pos = 0;
Ritor1
parents:
diff changeset
534 if (temp_str_len)
Ritor1
parents:
diff changeset
535 { //i+1
Ritor1
parents:
diff changeset
536 if (decode_step==1)
Ritor1
parents:
diff changeset
537 {
Ritor1
parents:
diff changeset
538 pGroups[i] = atoi(test_string);
Ritor1
parents:
diff changeset
539 }
Ritor1
parents:
diff changeset
540 }
Ritor1
parents:
diff changeset
541 ++decode_step;
Ritor1
parents:
diff changeset
542 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
543 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
544 }
Ritor1
parents:
diff changeset
545
Ritor1
parents:
diff changeset
546 pNPCNewsTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcnews.txt", 0);
Ritor1
parents:
diff changeset
547 strtok(pNPCNewsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
548
Ritor1
parents:
diff changeset
549
Ritor1
parents:
diff changeset
550 for (i=0; i<51; ++i)
Ritor1
parents:
diff changeset
551 {
Ritor1
parents:
diff changeset
552 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
553 break_loop = false;
Ritor1
parents:
diff changeset
554 decode_step=0;
Ritor1
parents:
diff changeset
555 do
Ritor1
parents:
diff changeset
556 {
Ritor1
parents:
diff changeset
557 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
558 temp_str_len = 0;
Ritor1
parents:
diff changeset
559 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
560 {
Ritor1
parents:
diff changeset
561 ++temp_str_len;
Ritor1
parents:
diff changeset
562 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
563 }
Ritor1
parents:
diff changeset
564 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
565 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
566 break_loop = true;
Ritor1
parents:
diff changeset
567 *tmp_pos = 0;
Ritor1
parents:
diff changeset
568 if (temp_str_len)
Ritor1
parents:
diff changeset
569 { //i+1
Ritor1
parents:
diff changeset
570 if (decode_step==1)
Ritor1
parents:
diff changeset
571 pCatchPhrases[i] = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
572 }
Ritor1
parents:
diff changeset
573 ++decode_step;
Ritor1
parents:
diff changeset
574 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
575 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
576 }
Ritor1
parents:
diff changeset
577 }
Ritor1
parents:
diff changeset
578
Ritor1
parents:
diff changeset
579 //----- (0047702F) --------------------------------------------------------
Ritor1
parents:
diff changeset
580 void NPCStats::Initialize()
Ritor1
parents:
diff changeset
581 {
Ritor1
parents:
diff changeset
582 int i;
Ritor1
parents:
diff changeset
583 char* test_string;
Ritor1
parents:
diff changeset
584 unsigned char c;
Ritor1
parents:
diff changeset
585 bool break_loop;
Ritor1
parents:
diff changeset
586 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
587 char* tmp_pos;
Ritor1
parents:
diff changeset
588 int decode_step;
Ritor1
parents:
diff changeset
589
Ritor1
parents:
diff changeset
590 InitializeNPCData();
Ritor1
parents:
diff changeset
591 InitializeNPCText();
Ritor1
parents:
diff changeset
592 InitializeQuests();
Ritor1
parents:
diff changeset
593 InitializeAutonotes();
Ritor1
parents:
diff changeset
594 InitializeAwards();
Ritor1
parents:
diff changeset
595 InitializeTransitions();
Ritor1
parents:
diff changeset
596 InitializeMerchants();
Ritor1
parents:
diff changeset
597 InitializeScrolls();
Ritor1
parents:
diff changeset
598
Ritor1
parents:
diff changeset
599 pNPCNamesTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0);
Ritor1
parents:
diff changeset
600 strtok(pNPCNamesTXT_Raw, "\r");
Ritor1
parents:
diff changeset
601
Ritor1
parents:
diff changeset
602 uNewlNPCBufPos = 0;
Ritor1
parents:
diff changeset
603
Ritor1
parents:
diff changeset
604 for (i=0; i<540; ++i)
Ritor1
parents:
diff changeset
605 {
Ritor1
parents:
diff changeset
606 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
607 break_loop = false;
Ritor1
parents:
diff changeset
608 decode_step=0;
Ritor1
parents:
diff changeset
609 do
Ritor1
parents:
diff changeset
610 {
Ritor1
parents:
diff changeset
611 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
612 temp_str_len = 0;
Ritor1
parents:
diff changeset
613 if (c=='\t')
Ritor1
parents:
diff changeset
614 {
Ritor1
parents:
diff changeset
615 if ( (decode_step == 1)&&(!uNumNPCNames[1]))
Ritor1
parents:
diff changeset
616 uNumNPCNames[1]=i;
Ritor1
parents:
diff changeset
617 }
Ritor1
parents:
diff changeset
618 else
Ritor1
parents:
diff changeset
619 {
Ritor1
parents:
diff changeset
620 while((c!='\n')&&(c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
621 {
Ritor1
parents:
diff changeset
622 ++temp_str_len;
Ritor1
parents:
diff changeset
623 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
624 }
Ritor1
parents:
diff changeset
625 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
626 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
627 break_loop = true;
Ritor1
parents:
diff changeset
628
Ritor1
parents:
diff changeset
629 if (temp_str_len)
Ritor1
parents:
diff changeset
630 {
Ritor1
parents:
diff changeset
631 *tmp_pos = 0;
Ritor1
parents:
diff changeset
632 if ( decode_step == 0)
Ritor1
parents:
diff changeset
633 pNPCNames[i][0] =RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
634 else if ( decode_step == 1)
Ritor1
parents:
diff changeset
635 pNPCNames[i][1] =RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
636 }
Ritor1
parents:
diff changeset
637 else
Ritor1
parents:
diff changeset
638 {
Ritor1
parents:
diff changeset
639 if ( (decode_step == 1)&&(!uNumNPCNames[1]))
Ritor1
parents:
diff changeset
640 uNumNPCNames[1]=i;
Ritor1
parents:
diff changeset
641 }
Ritor1
parents:
diff changeset
642 }
Ritor1
parents:
diff changeset
643 ++decode_step;
Ritor1
parents:
diff changeset
644 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
645 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
646 }
Ritor1
parents:
diff changeset
647 uNumNPCNames[0] = i;
Ritor1
parents:
diff changeset
648
Ritor1
parents:
diff changeset
649 pNPCProfTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0);
Ritor1
parents:
diff changeset
650 strtok(pNPCProfTXT_Raw, "\r");
Ritor1
parents:
diff changeset
651 strtok(NULL, "\r");
Ritor1
parents:
diff changeset
652 strtok(NULL, "\r");
Ritor1
parents:
diff changeset
653 strtok(NULL, "\r");
Ritor1
parents:
diff changeset
654
Ritor1
parents:
diff changeset
655 for (i=1; i<59; ++i)
Ritor1
parents:
diff changeset
656 {
Ritor1
parents:
diff changeset
657 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
658 break_loop = false;
Ritor1
parents:
diff changeset
659 decode_step=0;
Ritor1
parents:
diff changeset
660 do
Ritor1
parents:
diff changeset
661 {
Ritor1
parents:
diff changeset
662 //while (*test_string == '\t') // some steps are separated by multiple \t's
Ritor1
parents:
diff changeset
663 //++test_string;
Ritor1
parents:
diff changeset
664
Ritor1
parents:
diff changeset
665 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
666 temp_str_len = 0;
Ritor1
parents:
diff changeset
667 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
668 {
Ritor1
parents:
diff changeset
669 ++temp_str_len;
Ritor1
parents:
diff changeset
670 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
671 }
Ritor1
parents:
diff changeset
672 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
673 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
674 break_loop = true;
Ritor1
parents:
diff changeset
675 *tmp_pos = 0;
Ritor1
parents:
diff changeset
676 if (temp_str_len)
Ritor1
parents:
diff changeset
677 {
Ritor1
parents:
diff changeset
678 switch(decode_step)
Ritor1
parents:
diff changeset
679 {
Ritor1
parents:
diff changeset
680 case 2:
Ritor1
parents:
diff changeset
681 pProfessions[i].uHirePrice = atoi(test_string);
Ritor1
parents:
diff changeset
682 break;
Ritor1
parents:
diff changeset
683 case 3:
Ritor1
parents:
diff changeset
684 pProfessions[i].pActionText = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
685 break;
Ritor1
parents:
diff changeset
686 case 4:
Ritor1
parents:
diff changeset
687 pProfessions[i].pBenefits= RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
688 break;
Ritor1
parents:
diff changeset
689 case 5:
Ritor1
parents:
diff changeset
690 pProfessions[i].pJoinText = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
691 break;
Ritor1
parents:
diff changeset
692 case 6:
Ritor1
parents:
diff changeset
693 pProfessions[i].pDismissText = RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
694 }
Ritor1
parents:
diff changeset
695 }
Ritor1
parents:
diff changeset
696 else
Ritor1
parents:
diff changeset
697 {
Ritor1
parents:
diff changeset
698 if (!decode_step)
Ritor1
parents:
diff changeset
699 break_loop = true;
Ritor1
parents:
diff changeset
700 }
Ritor1
parents:
diff changeset
701 ++decode_step;
Ritor1
parents:
diff changeset
702 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
703 } while ((decode_step<7)&&!break_loop);
Ritor1
parents:
diff changeset
704 }
Ritor1
parents:
diff changeset
705 uNumNPCProfessions = 59;
Ritor1
parents:
diff changeset
706 }
Ritor1
parents:
diff changeset
707
Ritor1
parents:
diff changeset
708 //----- (00477266) --------------------------------------------------------
Ritor1
parents:
diff changeset
709 void NPCStats::Release()
Ritor1
parents:
diff changeset
710 {
Ritor1
parents:
diff changeset
711 free(pNPCTopicTXT_Raw);
Ritor1
parents:
diff changeset
712 pNPCTopicTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
713 free(pNPCTextTXT_Raw);
Ritor1
parents:
diff changeset
714 pNPCTextTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
715 free(pNPCNewsTXT_Raw);
Ritor1
parents:
diff changeset
716 pNPCNewsTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
717 free(pNPCProfTXT_Raw);
Ritor1
parents:
diff changeset
718 pNPCProfTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
719 free(pNPCNamesTXT_Raw);
Ritor1
parents:
diff changeset
720 pNPCNamesTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
721 free(pNPCDataTXT_Raw);
Ritor1
parents:
diff changeset
722 pNPCDataTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
723 free(pNPCDistTXT_Raw);
Ritor1
parents:
diff changeset
724 pNPCDistTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
725 free(pNPCGreetTXT_Raw);
Ritor1
parents:
diff changeset
726 pNPCGreetTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
727 free(pNCPGroupTXT_Raw);
Ritor1
parents:
diff changeset
728 pNCPGroupTXT_Raw = nullptr;
Ritor1
parents:
diff changeset
729 }
Ritor1
parents:
diff changeset
730
Ritor1
parents:
diff changeset
731 //----- (0047730C) --------------------------------------------------------
Ritor1
parents:
diff changeset
732 bool CheckPortretAgainstSex(int a1, int)
Ritor1
parents:
diff changeset
733 {
Ritor1
parents:
diff changeset
734 return true;
Ritor1
parents:
diff changeset
735 }
Ritor1
parents:
diff changeset
736 // 47730C: using guessed type int __stdcall const_1(int);
Ritor1
parents:
diff changeset
737
Ritor1
parents:
diff changeset
738 //----- (0047732C) --------------------------------------------------------
Ritor1
parents:
diff changeset
739 void NPCStats::InitializeAdditionalNPCs(NPCData *pNPCDataBuff, int npc_uid, int uLocation2D, int uMapId)
Ritor1
parents:
diff changeset
740 {
Ritor1
parents:
diff changeset
741 int rep_gen;
Ritor1
parents:
diff changeset
742 int uNPCSex; // esi@1
Ritor1
parents:
diff changeset
743 int uGeneratedPortret; // ecx@23
Ritor1
parents:
diff changeset
744 int test_prof_summ; // ecx@37
Ritor1
parents:
diff changeset
745 int gen_profession; // eax@37
Ritor1
parents:
diff changeset
746 int max_prof_cap; // edx@37
Ritor1
parents:
diff changeset
747 // signed int result; // eax@39
Ritor1
parents:
diff changeset
748 int uRace; // [sp+Ch] [bp-Ch]@1
Ritor1
parents:
diff changeset
749 bool break_gen; // [sp+10h] [bp-8h]@1
Ritor1
parents:
diff changeset
750 signed int gen_attempts; // [sp+14h] [bp-4h]@1
Ritor1
parents:
diff changeset
751 int uPortretMin; // [sp+24h] [bp+Ch]@1
Ritor1
parents:
diff changeset
752 int uPortretMax;
Ritor1
parents:
diff changeset
753
Ritor1
parents:
diff changeset
754 static const unsigned __int8 NPCSexGenTable[86] ={
Ritor1
parents:
diff changeset
755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
756 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
757 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
Ritor1
parents:
diff changeset
758 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
759 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
Ritor1
parents:
diff changeset
760 static const unsigned __int8 NPCRaceGenTable[86] ={
Ritor1
parents:
diff changeset
761 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 1,
Ritor1
parents:
diff changeset
762 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
763 0, 0, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
764 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Ritor1
parents:
diff changeset
765 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0};
Ritor1
parents:
diff changeset
766
Ritor1
parents:
diff changeset
767 unsigned __int8 seed = (unsigned __int8)((double)(npc_uid - 1)/3.0);
Ritor1
parents:
diff changeset
768 uNPCSex = NPCSexGenTable[seed];
Ritor1
parents:
diff changeset
769 uRace = NPCRaceGenTable[seed];
Ritor1
parents:
diff changeset
770 pNPCDataBuff->uSex = uNPCSex;
Ritor1
parents:
diff changeset
771 pNPCDataBuff->pName = pNPCNames[rand() % uNumNPCNames[uNPCSex]][uNPCSex];
Ritor1
parents:
diff changeset
772
Ritor1
parents:
diff changeset
773 gen_attempts = 0;
Ritor1
parents:
diff changeset
774 break_gen = false;
Ritor1
parents:
diff changeset
775
Ritor1
parents:
diff changeset
776 do
Ritor1
parents:
diff changeset
777 {
Ritor1
parents:
diff changeset
778 switch ( uRace )
Ritor1
parents:
diff changeset
779 {
Ritor1
parents:
diff changeset
780 case 0:
Ritor1
parents:
diff changeset
781 if ( uNPCSex == 0 )
Ritor1
parents:
diff changeset
782 {
Ritor1
parents:
diff changeset
783 uPortretMin = 2;
Ritor1
parents:
diff changeset
784 uPortretMax = 100;
Ritor1
parents:
diff changeset
785 }
Ritor1
parents:
diff changeset
786 else
Ritor1
parents:
diff changeset
787 {
Ritor1
parents:
diff changeset
788 uPortretMin = 201;
Ritor1
parents:
diff changeset
789 uPortretMax = 250;
Ritor1
parents:
diff changeset
790 }
Ritor1
parents:
diff changeset
791 case 1:
Ritor1
parents:
diff changeset
792 if ( uNPCSex == 0 )
Ritor1
parents:
diff changeset
793 {
Ritor1
parents:
diff changeset
794 uPortretMin = 400;
Ritor1
parents:
diff changeset
795 uPortretMax = 430;
Ritor1
parents:
diff changeset
796 }
Ritor1
parents:
diff changeset
797 else
Ritor1
parents:
diff changeset
798 {
Ritor1
parents:
diff changeset
799 uPortretMin = 460;
Ritor1
parents:
diff changeset
800 uPortretMax = 490;
Ritor1
parents:
diff changeset
801 }
Ritor1
parents:
diff changeset
802 break;
Ritor1
parents:
diff changeset
803 case 2:
Ritor1
parents:
diff changeset
804 if ( uNPCSex == 0 )
Ritor1
parents:
diff changeset
805 {
Ritor1
parents:
diff changeset
806 uPortretMin = 500;
Ritor1
parents:
diff changeset
807 uPortretMax = 520;
Ritor1
parents:
diff changeset
808 }
Ritor1
parents:
diff changeset
809 else
Ritor1
parents:
diff changeset
810 {
Ritor1
parents:
diff changeset
811 uPortretMin = 530;
Ritor1
parents:
diff changeset
812 uPortretMax = 550;
Ritor1
parents:
diff changeset
813 }
Ritor1
parents:
diff changeset
814 break;
Ritor1
parents:
diff changeset
815 case 3:
Ritor1
parents:
diff changeset
816 if ( uNPCSex == 0 )
Ritor1
parents:
diff changeset
817 {
Ritor1
parents:
diff changeset
818 uPortretMin = 300;
Ritor1
parents:
diff changeset
819 uPortretMax = 330;
Ritor1
parents:
diff changeset
820 }
Ritor1
parents:
diff changeset
821 else
Ritor1
parents:
diff changeset
822 {
Ritor1
parents:
diff changeset
823 uPortretMin = 360;
Ritor1
parents:
diff changeset
824 uPortretMax = 387;
Ritor1
parents:
diff changeset
825 }
Ritor1
parents:
diff changeset
826
Ritor1
parents:
diff changeset
827 break;
Ritor1
parents:
diff changeset
828 }
Ritor1
parents:
diff changeset
829
Ritor1
parents:
diff changeset
830 uGeneratedPortret = uPortretMin + rand() % (uPortretMax - uPortretMin + 1);
Ritor1
parents:
diff changeset
831 if ( CheckPortretAgainstSex(uGeneratedPortret, uNPCSex))
Ritor1
parents:
diff changeset
832 break_gen = true;
Ritor1
parents:
diff changeset
833 ++gen_attempts;
Ritor1
parents:
diff changeset
834 if ( gen_attempts >= 4 )
Ritor1
parents:
diff changeset
835 {
Ritor1
parents:
diff changeset
836 uGeneratedPortret = uPortretMin;
Ritor1
parents:
diff changeset
837 break_gen = true;
Ritor1
parents:
diff changeset
838 }
Ritor1
parents:
diff changeset
839 }
Ritor1
parents:
diff changeset
840 while(!break_gen);
Ritor1
parents:
diff changeset
841
Ritor1
parents:
diff changeset
842 pNPCDataBuff->uPortraitID = uGeneratedPortret;
Ritor1
parents:
diff changeset
843 pNPCDataBuff->uFlags = 0;
Ritor1
parents:
diff changeset
844 pNPCDataBuff->fame = 0;
Ritor1
parents:
diff changeset
845 //generate reputation
Ritor1
parents:
diff changeset
846 rep_gen = rand() % 100 + 1;
Ritor1
parents:
diff changeset
847
Ritor1
parents:
diff changeset
848 if ( rep_gen >= 60 )
Ritor1
parents:
diff changeset
849 {
Ritor1
parents:
diff changeset
850 if ( rep_gen >= 90 )
Ritor1
parents:
diff changeset
851 {
Ritor1
parents:
diff changeset
852 if ( rep_gen >= 95 )
Ritor1
parents:
diff changeset
853 {
Ritor1
parents:
diff changeset
854 if ( rep_gen >= 98 )
Ritor1
parents:
diff changeset
855 pNPCDataBuff->rep = -600;
Ritor1
parents:
diff changeset
856 else
Ritor1
parents:
diff changeset
857 pNPCDataBuff->rep = 400;
Ritor1
parents:
diff changeset
858 }
Ritor1
parents:
diff changeset
859 else
Ritor1
parents:
diff changeset
860 pNPCDataBuff->rep = -300;
Ritor1
parents:
diff changeset
861 }
Ritor1
parents:
diff changeset
862 else
Ritor1
parents:
diff changeset
863 pNPCDataBuff->rep = 200;
Ritor1
parents:
diff changeset
864 }
Ritor1
parents:
diff changeset
865 else
Ritor1
parents:
diff changeset
866 pNPCDataBuff->rep = 0;
Ritor1
parents:
diff changeset
867
Ritor1
parents:
diff changeset
868 max_prof_cap = rand() % pProfessionChance[uMapId].uTotalprofChance+1;
Ritor1
parents:
diff changeset
869 test_prof_summ = 0;
Ritor1
parents:
diff changeset
870 gen_profession = 0;
Ritor1
parents:
diff changeset
871
Ritor1
parents:
diff changeset
872 if ( max_prof_cap > 0 )
Ritor1
parents:
diff changeset
873 {
Ritor1
parents:
diff changeset
874 do
Ritor1
parents:
diff changeset
875 test_prof_summ += pProfessionChance[uMapId].professionChancePerArea[gen_profession++];
Ritor1
parents:
diff changeset
876 while ( test_prof_summ < max_prof_cap );
Ritor1
parents:
diff changeset
877 }
Ritor1
parents:
diff changeset
878 pNPCDataBuff->uProfession = gen_profession - 1;
Ritor1
parents:
diff changeset
879 pNPCDataBuff->Location2D = uLocation2D;
Ritor1
parents:
diff changeset
880 pNPCDataBuff->field_24 = 1;
Ritor1
parents:
diff changeset
881 pNPCDataBuff->joins = 1;
Ritor1
parents:
diff changeset
882 pNPCDataBuff->evt_A = 0;
Ritor1
parents:
diff changeset
883 pNPCDataBuff->evt_B = 0;
Ritor1
parents:
diff changeset
884 pNPCDataBuff->evt_C = 0;
Ritor1
parents:
diff changeset
885 pNPCDataBuff->evt_D = 0;
Ritor1
parents:
diff changeset
886 pNPCDataBuff->evt_E = 0;
Ritor1
parents:
diff changeset
887 pNPCDataBuff->evt_F = 0;
Ritor1
parents:
diff changeset
888 }
Ritor1
parents:
diff changeset
889
Ritor1
parents:
diff changeset
890
Ritor1
parents:
diff changeset
891 //----- (00495366) --------------------------------------------------------
Ritor1
parents:
diff changeset
892 char *NPCStats::sub_495366_MispronounceName(unsigned __int8 firstLetter, unsigned __int8 genderId)
Ritor1
parents:
diff changeset
893 {
Ritor1
parents:
diff changeset
894 int pickedName; // edx@2
Ritor1
parents:
diff changeset
895
Ritor1
parents:
diff changeset
896 if ( firstLetter == dword_AE336C_LastMispronouncedNameFirstLetter)
Ritor1
parents:
diff changeset
897 pickedName = dword_AE3370_LastMispronouncedNameResult;
Ritor1
parents:
diff changeset
898 else
Ritor1
parents:
diff changeset
899 {
Ritor1
parents:
diff changeset
900 dword_AE336C_LastMispronouncedNameFirstLetter = firstLetter;
Ritor1
parents:
diff changeset
901 if ( this->uNumNPCNames[genderId] == 0 )
Ritor1
parents:
diff changeset
902 pickedName = rand() % this->uNumNPCNames[(genderId + 1) % 2]; //originally without " + 1) % 2", but that would yield a div by zero
Ritor1
parents:
diff changeset
903 else
Ritor1
parents:
diff changeset
904 {
Ritor1
parents:
diff changeset
905 int rangeBottom = 0;
Ritor1
parents:
diff changeset
906 int rangeTop = 0;
Ritor1
parents:
diff changeset
907 for ( uint i = 0; i < this->uNumNPCNames[genderId]; ++i )
Ritor1
parents:
diff changeset
908 {
Ritor1
parents:
diff changeset
909 if (tolower(this->pNPCNames[i][genderId][0]))
Ritor1
parents:
diff changeset
910 {
Ritor1
parents:
diff changeset
911 if ( rangeBottom )
Ritor1
parents:
diff changeset
912 rangeTop = i;
Ritor1
parents:
diff changeset
913 else
Ritor1
parents:
diff changeset
914 rangeBottom = i;
Ritor1
parents:
diff changeset
915 }
Ritor1
parents:
diff changeset
916 }
Ritor1
parents:
diff changeset
917 if ( rangeTop != 0 )
Ritor1
parents:
diff changeset
918 pickedName = rangeBottom + rand() % (rangeTop - rangeBottom);
Ritor1
parents:
diff changeset
919 else
Ritor1
parents:
diff changeset
920 pickedName = rand() % this->uNumNPCNames[genderId];
Ritor1
parents:
diff changeset
921 }
Ritor1
parents:
diff changeset
922 }
Ritor1
parents:
diff changeset
923 dword_AE3370_LastMispronouncedNameResult = pickedName;
Ritor1
parents:
diff changeset
924 return this->pNPCNames[pickedName][genderId];
Ritor1
parents:
diff changeset
925 }
Ritor1
parents:
diff changeset
926
Ritor1
parents:
diff changeset
927 //----- (00476387) --------------------------------------------------------
Ritor1
parents:
diff changeset
928 bool PartyHasDragon()
Ritor1
parents:
diff changeset
929 {
Ritor1
parents:
diff changeset
930 return pNPCStats->pNewNPCData[57].Hired();
Ritor1
parents:
diff changeset
931 }
Ritor1
parents:
diff changeset
932
Ritor1
parents:
diff changeset
933 //----- (00476395) --------------------------------------------------------
Ritor1
parents:
diff changeset
934 //0x26 Wizard eye at skill level 2
Ritor1
parents:
diff changeset
935 bool CheckHiredNPCSpeciality(unsigned int uProfession)
Ritor1
parents:
diff changeset
936 {
Ritor1
parents:
diff changeset
937
Ritor1
parents:
diff changeset
938 if ( bNoNPCHiring == 1 )
Ritor1
parents:
diff changeset
939 return 0;
Ritor1
parents:
diff changeset
940
Ritor1
parents:
diff changeset
941 for (uint i=0; i<pNPCStats->uNumNewNPCs; ++i )
Ritor1
parents:
diff changeset
942 {
Ritor1
parents:
diff changeset
943 if ( pNPCStats->pNewNPCData[i].uProfession == uProfession &&
Ritor1
parents:
diff changeset
944 (pNPCStats->pNewNPCData[i].uFlags & 0x80) )//Uninitialized memory access
Ritor1
parents:
diff changeset
945 return true;
Ritor1
parents:
diff changeset
946 }
Ritor1
parents:
diff changeset
947 if ( pParty->pHirelings[0].uProfession == uProfession ||
Ritor1
parents:
diff changeset
948 pParty->pHirelings[1].uProfession == uProfession)
Ritor1
parents:
diff changeset
949 return true;
Ritor1
parents:
diff changeset
950 else
Ritor1
parents:
diff changeset
951 return false;
Ritor1
parents:
diff changeset
952
Ritor1
parents:
diff changeset
953 }
Ritor1
parents:
diff changeset
954
Ritor1
parents:
diff changeset
955 //----- (004763E0) --------------------------------------------------------
Ritor1
parents:
diff changeset
956 void InitializeAwards()
Ritor1
parents:
diff changeset
957 {
Ritor1
parents:
diff changeset
958 int i;
Ritor1
parents:
diff changeset
959 char* test_string;
Ritor1
parents:
diff changeset
960 unsigned char c;
Ritor1
parents:
diff changeset
961 bool break_loop;
Ritor1
parents:
diff changeset
962 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
963 char* tmp_pos;
Ritor1
parents:
diff changeset
964 int decode_step;
Ritor1
parents:
diff changeset
965
Ritor1
parents:
diff changeset
966 free(pAwardsTXT_Raw);
Ritor1
parents:
diff changeset
967 pAwardsTXT_Raw = (char *)pEvents_LOD->LoadRaw("awards.txt", 0);
Ritor1
parents:
diff changeset
968 strtok(pAwardsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
969
Ritor1
parents:
diff changeset
970 for (i=1; i<105; ++i)
Ritor1
parents:
diff changeset
971 {
Ritor1
parents:
diff changeset
972 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
973 break_loop = false;
Ritor1
parents:
diff changeset
974 decode_step=0;
Ritor1
parents:
diff changeset
975 do
Ritor1
parents:
diff changeset
976 {
Ritor1
parents:
diff changeset
977 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
978 temp_str_len = 0;
Ritor1
parents:
diff changeset
979 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
980 {
Ritor1
parents:
diff changeset
981 ++temp_str_len;
Ritor1
parents:
diff changeset
982 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
983 }
Ritor1
parents:
diff changeset
984 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
985 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
986 break_loop = true;
Ritor1
parents:
diff changeset
987 *tmp_pos = 0;
Ritor1
parents:
diff changeset
988 if (temp_str_len)
Ritor1
parents:
diff changeset
989 {
Ritor1
parents:
diff changeset
990 if (decode_step==1)
Ritor1
parents:
diff changeset
991 pAwards[i].pText=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
992 else if (decode_step==2)
Ritor1
parents:
diff changeset
993 pAwards[i].uPriority = atoi(test_string);
Ritor1
parents:
diff changeset
994 }
Ritor1
parents:
diff changeset
995 else
Ritor1
parents:
diff changeset
996 {
Ritor1
parents:
diff changeset
997 break_loop = true;
Ritor1
parents:
diff changeset
998 }
Ritor1
parents:
diff changeset
999 ++decode_step;
Ritor1
parents:
diff changeset
1000 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1001 } while ((decode_step<3)&&!break_loop);
Ritor1
parents:
diff changeset
1002 }
Ritor1
parents:
diff changeset
1003 }
Ritor1
parents:
diff changeset
1004 // 7241C8: using guessed type int dword_7241C8;
Ritor1
parents:
diff changeset
1005
Ritor1
parents:
diff changeset
1006 //----- (004764C2) --------------------------------------------------------
Ritor1
parents:
diff changeset
1007 void InitializeScrolls()
Ritor1
parents:
diff changeset
1008 {
Ritor1
parents:
diff changeset
1009
Ritor1
parents:
diff changeset
1010 int i;
Ritor1
parents:
diff changeset
1011 char* test_string;
Ritor1
parents:
diff changeset
1012 unsigned char c;
Ritor1
parents:
diff changeset
1013 bool break_loop;
Ritor1
parents:
diff changeset
1014 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
1015 char* tmp_pos;
Ritor1
parents:
diff changeset
1016 int decode_step;
Ritor1
parents:
diff changeset
1017
Ritor1
parents:
diff changeset
1018 free(pScrollsTXT_Raw);
Ritor1
parents:
diff changeset
1019 pScrollsTXT_Raw = (char *)pEvents_LOD->LoadRaw("scroll.txt", 0);
Ritor1
parents:
diff changeset
1020 strtok(pScrollsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
1021 for (i=0; i<82; ++i)
Ritor1
parents:
diff changeset
1022 {
Ritor1
parents:
diff changeset
1023 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
1024 break_loop = false;
Ritor1
parents:
diff changeset
1025 decode_step=0;
Ritor1
parents:
diff changeset
1026 do
Ritor1
parents:
diff changeset
1027 {
Ritor1
parents:
diff changeset
1028 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
1029 temp_str_len = 0;
Ritor1
parents:
diff changeset
1030 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
1031 {
Ritor1
parents:
diff changeset
1032 ++temp_str_len;
Ritor1
parents:
diff changeset
1033 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
1034 }
Ritor1
parents:
diff changeset
1035 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
1036 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
1037 break_loop = true;
Ritor1
parents:
diff changeset
1038 *tmp_pos = 0;
Ritor1
parents:
diff changeset
1039 if (temp_str_len)
Ritor1
parents:
diff changeset
1040 {
Ritor1
parents:
diff changeset
1041 if ( decode_step == 1)
Ritor1
parents:
diff changeset
1042 pScrolls[i]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1043 }
Ritor1
parents:
diff changeset
1044 else
Ritor1
parents:
diff changeset
1045 {
Ritor1
parents:
diff changeset
1046 break_loop = true;
Ritor1
parents:
diff changeset
1047 }
Ritor1
parents:
diff changeset
1048 ++decode_step;
Ritor1
parents:
diff changeset
1049 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1050 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
1051 }
Ritor1
parents:
diff changeset
1052 }
Ritor1
parents:
diff changeset
1053
Ritor1
parents:
diff changeset
1054 //----- (00476590) --------------------------------------------------------
Ritor1
parents:
diff changeset
1055 void InitializeMerchants()
Ritor1
parents:
diff changeset
1056 {
Ritor1
parents:
diff changeset
1057 int i;
Ritor1
parents:
diff changeset
1058 char* test_string;
Ritor1
parents:
diff changeset
1059 unsigned char c;
Ritor1
parents:
diff changeset
1060 bool break_loop;
Ritor1
parents:
diff changeset
1061 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
1062 char* tmp_pos;
Ritor1
parents:
diff changeset
1063 int decode_step;
Ritor1
parents:
diff changeset
1064
Ritor1
parents:
diff changeset
1065 free(pMerchantsTXT_Raw);
Ritor1
parents:
diff changeset
1066 pMerchantsTXT_Raw = (char *)pEvents_LOD->LoadRaw("merchant.txt", 0);
Ritor1
parents:
diff changeset
1067 strtok(pMerchantsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
1068
Ritor1
parents:
diff changeset
1069 for (i=0; i<7; ++i)
Ritor1
parents:
diff changeset
1070 {
Ritor1
parents:
diff changeset
1071 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
1072 break_loop = false;
Ritor1
parents:
diff changeset
1073 decode_step=0;
Ritor1
parents:
diff changeset
1074 do
Ritor1
parents:
diff changeset
1075 {
Ritor1
parents:
diff changeset
1076 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
1077 temp_str_len = 0;
Ritor1
parents:
diff changeset
1078 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
1079 {
Ritor1
parents:
diff changeset
1080 ++temp_str_len;
Ritor1
parents:
diff changeset
1081 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
1082 }
Ritor1
parents:
diff changeset
1083 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
1084 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
1085 break_loop = true;
Ritor1
parents:
diff changeset
1086 *tmp_pos = 0;
Ritor1
parents:
diff changeset
1087 if (temp_str_len)
Ritor1
parents:
diff changeset
1088 {
Ritor1
parents:
diff changeset
1089 switch (decode_step)
Ritor1
parents:
diff changeset
1090 {
Ritor1
parents:
diff changeset
1091 case 1:
Ritor1
parents:
diff changeset
1092 pMerchantsBuyPhrases[i]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1093 break;
Ritor1
parents:
diff changeset
1094 case 2:
Ritor1
parents:
diff changeset
1095 pMerchantsSellPhrases[i]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1096 break;
Ritor1
parents:
diff changeset
1097 case 3:
Ritor1
parents:
diff changeset
1098 pMerchantsRepairPhrases[i]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1099 break;
Ritor1
parents:
diff changeset
1100 case 4:
Ritor1
parents:
diff changeset
1101 pMerchantsIdentifyPhrases[i]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1102 break;
Ritor1
parents:
diff changeset
1103 }
Ritor1
parents:
diff changeset
1104 }
Ritor1
parents:
diff changeset
1105 else
Ritor1
parents:
diff changeset
1106 {
Ritor1
parents:
diff changeset
1107 break_loop = true;
Ritor1
parents:
diff changeset
1108 }
Ritor1
parents:
diff changeset
1109 ++decode_step;
Ritor1
parents:
diff changeset
1110 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1111 } while ((decode_step<5)&&!break_loop);
Ritor1
parents:
diff changeset
1112 }
Ritor1
parents:
diff changeset
1113
Ritor1
parents:
diff changeset
1114 }
Ritor1
parents:
diff changeset
1115
Ritor1
parents:
diff changeset
1116 //----- (00476682) --------------------------------------------------------
Ritor1
parents:
diff changeset
1117 void InitializeTransitions()
Ritor1
parents:
diff changeset
1118 {
Ritor1
parents:
diff changeset
1119 int i;
Ritor1
parents:
diff changeset
1120 char* test_string;
Ritor1
parents:
diff changeset
1121 unsigned char c;
Ritor1
parents:
diff changeset
1122 bool break_loop;
Ritor1
parents:
diff changeset
1123 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
1124 char* tmp_pos;
Ritor1
parents:
diff changeset
1125 int decode_step;
Ritor1
parents:
diff changeset
1126
Ritor1
parents:
diff changeset
1127 free(pTransitionsTXT_Raw);
Ritor1
parents:
diff changeset
1128 pTransitionsTXT_Raw = (char *)pEvents_LOD->LoadRaw("trans.txt", 0);
Ritor1
parents:
diff changeset
1129 strtok(pTransitionsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
1130
Ritor1
parents:
diff changeset
1131 for (i=0; i<464; ++i)
Ritor1
parents:
diff changeset
1132 {
Ritor1
parents:
diff changeset
1133 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
1134 break_loop = false;
Ritor1
parents:
diff changeset
1135 decode_step=0;
Ritor1
parents:
diff changeset
1136 do
Ritor1
parents:
diff changeset
1137 {
Ritor1
parents:
diff changeset
1138 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
1139 temp_str_len = 0;
Ritor1
parents:
diff changeset
1140 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
1141 {
Ritor1
parents:
diff changeset
1142 ++temp_str_len;
Ritor1
parents:
diff changeset
1143 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
1144 }
Ritor1
parents:
diff changeset
1145 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
1146 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
1147 break_loop = true;
Ritor1
parents:
diff changeset
1148 *tmp_pos = 0;
Ritor1
parents:
diff changeset
1149 if (temp_str_len)
Ritor1
parents:
diff changeset
1150 {
Ritor1
parents:
diff changeset
1151 if ( decode_step == 1)
Ritor1
parents:
diff changeset
1152 pTransitionStrings[i + 1]=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1153 }
Ritor1
parents:
diff changeset
1154 else
Ritor1
parents:
diff changeset
1155 {
Ritor1
parents:
diff changeset
1156 break_loop = true;
Ritor1
parents:
diff changeset
1157 }
Ritor1
parents:
diff changeset
1158 ++decode_step;
Ritor1
parents:
diff changeset
1159 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1160 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
1161 }
Ritor1
parents:
diff changeset
1162 }
Ritor1
parents:
diff changeset
1163
Ritor1
parents:
diff changeset
1164 //----- (00476750) --------------------------------------------------------
Ritor1
parents:
diff changeset
1165 void InitializeAutonotes()
Ritor1
parents:
diff changeset
1166 {
Ritor1
parents:
diff changeset
1167 int i;
Ritor1
parents:
diff changeset
1168 char* test_string;
Ritor1
parents:
diff changeset
1169 unsigned char c;
Ritor1
parents:
diff changeset
1170 bool break_loop;
Ritor1
parents:
diff changeset
1171 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
1172 char* tmp_pos;
Ritor1
parents:
diff changeset
1173 int decode_step;
Ritor1
parents:
diff changeset
1174
Ritor1
parents:
diff changeset
1175 free(pAutonoteTXT_Raw);
Ritor1
parents:
diff changeset
1176 pAutonoteTXT_Raw = (char *)pEvents_LOD->LoadRaw("autonote.txt", 0);
Ritor1
parents:
diff changeset
1177 strtok(pAutonoteTXT_Raw, "\r");
Ritor1
parents:
diff changeset
1178
Ritor1
parents:
diff changeset
1179 for (i=0; i<195; ++i)
Ritor1
parents:
diff changeset
1180 {
Ritor1
parents:
diff changeset
1181 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
1182 break_loop = false;
Ritor1
parents:
diff changeset
1183 decode_step=0;
Ritor1
parents:
diff changeset
1184 do
Ritor1
parents:
diff changeset
1185 {
Ritor1
parents:
diff changeset
1186 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
1187 temp_str_len = 0;
Ritor1
parents:
diff changeset
1188 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
1189 {
Ritor1
parents:
diff changeset
1190 ++temp_str_len;
Ritor1
parents:
diff changeset
1191 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
1192 }
Ritor1
parents:
diff changeset
1193 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
1194 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
1195 break_loop = true;
Ritor1
parents:
diff changeset
1196 *tmp_pos = 0;
Ritor1
parents:
diff changeset
1197 if (temp_str_len)
Ritor1
parents:
diff changeset
1198 {
Ritor1
parents:
diff changeset
1199 switch (decode_step)
Ritor1
parents:
diff changeset
1200 {
Ritor1
parents:
diff changeset
1201 case 1:
Ritor1
parents:
diff changeset
1202 pAutonoteTxt[i+1].pText=RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1203 break;
Ritor1
parents:
diff changeset
1204 case 2:
Ritor1
parents:
diff changeset
1205 {
Ritor1
parents:
diff changeset
1206 if ( !_stricmp(test_string, "potion"))
Ritor1
parents:
diff changeset
1207 {
Ritor1
parents:
diff changeset
1208 pAutonoteTxt[i+1].eType = AUTONOTE_POTION_RECEPIE;
Ritor1
parents:
diff changeset
1209 break;
Ritor1
parents:
diff changeset
1210 }
Ritor1
parents:
diff changeset
1211 if ( !_stricmp(test_string, "stat") )
Ritor1
parents:
diff changeset
1212 {
Ritor1
parents:
diff changeset
1213 pAutonoteTxt[i+1].eType = AUTONOTE_STAT_HINT;
Ritor1
parents:
diff changeset
1214 break;
Ritor1
parents:
diff changeset
1215 }
Ritor1
parents:
diff changeset
1216 if ( !_stricmp(test_string, "seer") )
Ritor1
parents:
diff changeset
1217 {
Ritor1
parents:
diff changeset
1218 pAutonoteTxt[i+1].eType = AUTONOTE_SEER;
Ritor1
parents:
diff changeset
1219 break;
Ritor1
parents:
diff changeset
1220 }
Ritor1
parents:
diff changeset
1221 if ( !_stricmp(test_string, "obelisk") )
Ritor1
parents:
diff changeset
1222 {
Ritor1
parents:
diff changeset
1223 pAutonoteTxt[i+1].eType = AUTONOTE_OBELISK;
Ritor1
parents:
diff changeset
1224 break;
Ritor1
parents:
diff changeset
1225 }
Ritor1
parents:
diff changeset
1226 if ( !_stricmp(test_string, "teacher") )
Ritor1
parents:
diff changeset
1227 {
Ritor1
parents:
diff changeset
1228 pAutonoteTxt[i+1].eType = AUTONOTE_TEACHER;
Ritor1
parents:
diff changeset
1229 break;
Ritor1
parents:
diff changeset
1230 }
Ritor1
parents:
diff changeset
1231 pAutonoteTxt[i+1].eType =AUTONOTE_MISC;
Ritor1
parents:
diff changeset
1232 break;
Ritor1
parents:
diff changeset
1233 }
Ritor1
parents:
diff changeset
1234 }
Ritor1
parents:
diff changeset
1235 }
Ritor1
parents:
diff changeset
1236 else
Ritor1
parents:
diff changeset
1237 {
Ritor1
parents:
diff changeset
1238 break_loop = true;
Ritor1
parents:
diff changeset
1239 }
Ritor1
parents:
diff changeset
1240 ++decode_step;
Ritor1
parents:
diff changeset
1241 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1242 } while ((decode_step<3)&&!break_loop);
Ritor1
parents:
diff changeset
1243 }
Ritor1
parents:
diff changeset
1244 }
Ritor1
parents:
diff changeset
1245
Ritor1
parents:
diff changeset
1246
Ritor1
parents:
diff changeset
1247 //----- (004768A9) --------------------------------------------------------
Ritor1
parents:
diff changeset
1248 void InitializeQuests()
Ritor1
parents:
diff changeset
1249 {
Ritor1
parents:
diff changeset
1250 int i;
Ritor1
parents:
diff changeset
1251 char* test_string;
Ritor1
parents:
diff changeset
1252 unsigned char c;
Ritor1
parents:
diff changeset
1253 bool break_loop;
Ritor1
parents:
diff changeset
1254 unsigned int temp_str_len;
Ritor1
parents:
diff changeset
1255 char* tmp_pos;
Ritor1
parents:
diff changeset
1256 int decode_step;
Ritor1
parents:
diff changeset
1257
Ritor1
parents:
diff changeset
1258 free(pQuestsTXT_Raw);
Ritor1
parents:
diff changeset
1259 pQuestsTXT_Raw = (char *)pEvents_LOD->LoadRaw("quests.txt", 0);
Ritor1
parents:
diff changeset
1260 strtok(pQuestsTXT_Raw, "\r");
Ritor1
parents:
diff changeset
1261 memset(pQuestTable.data(),0, sizeof(pQuestTable));
Ritor1
parents:
diff changeset
1262 for (i=0; i<512; ++i)
Ritor1
parents:
diff changeset
1263 {
Ritor1
parents:
diff changeset
1264 test_string = strtok(NULL, "\r") + 1;
Ritor1
parents:
diff changeset
1265 break_loop = false;
Ritor1
parents:
diff changeset
1266 decode_step=0;
Ritor1
parents:
diff changeset
1267 do
Ritor1
parents:
diff changeset
1268 {
Ritor1
parents:
diff changeset
1269 c = *(unsigned char*)test_string;
Ritor1
parents:
diff changeset
1270 temp_str_len = 0;
Ritor1
parents:
diff changeset
1271 while((c!='\t')&&(c>0))
Ritor1
parents:
diff changeset
1272 {
Ritor1
parents:
diff changeset
1273 ++temp_str_len;
Ritor1
parents:
diff changeset
1274 c=test_string[temp_str_len];
Ritor1
parents:
diff changeset
1275 }
Ritor1
parents:
diff changeset
1276 tmp_pos=test_string+temp_str_len;
Ritor1
parents:
diff changeset
1277 if (*tmp_pos == 0)
Ritor1
parents:
diff changeset
1278 break_loop = true;
Ritor1
parents:
diff changeset
1279 *tmp_pos = 0;
Ritor1
parents:
diff changeset
1280 if (temp_str_len)
Ritor1
parents:
diff changeset
1281 {
Ritor1
parents:
diff changeset
1282 if ( decode_step == 1)
Ritor1
parents:
diff changeset
1283 pQuestTable[i+1] =RemoveQuotes(test_string);
Ritor1
parents:
diff changeset
1284 }
Ritor1
parents:
diff changeset
1285 else
Ritor1
parents:
diff changeset
1286 {
Ritor1
parents:
diff changeset
1287 break_loop = true;
Ritor1
parents:
diff changeset
1288 }
Ritor1
parents:
diff changeset
1289 ++decode_step;
Ritor1
parents:
diff changeset
1290 test_string=tmp_pos+1;
Ritor1
parents:
diff changeset
1291 } while ((decode_step<2)&&!break_loop);
Ritor1
parents:
diff changeset
1292 }
Ritor1
parents:
diff changeset
1293 }
Ritor1
parents:
diff changeset
1294
Ritor1
parents:
diff changeset
1295 //----- (004B29F2) --------------------------------------------------------
Ritor1
parents:
diff changeset
1296 const char * ContractSelectText( int pEventCode )
Ritor1
parents:
diff changeset
1297 {
Ritor1
parents:
diff changeset
1298 static const int dialogue_base=110;
Ritor1
parents:
diff changeset
1299 contract_approved = 0;
Ritor1
parents:
diff changeset
1300 dword_F8B1AC_award_bit_number = pEventCode + 50;
Ritor1
parents:
diff changeset
1301 gold_transaction_amount = price_for_membership[pEventCode];
Ritor1
parents:
diff changeset
1302 if ( pPlayers[uActiveCharacter]->CanAct() )
Ritor1
parents:
diff changeset
1303 {
Ritor1
parents:
diff changeset
1304 if ( (unsigned __int16)_449B57_test_bit((unsigned __int8 *)pPlayers[uActiveCharacter]->_achieved_awards_bits, dword_F8B1AC_award_bit_number) )
Ritor1
parents:
diff changeset
1305 return pNPCTopics[dialogue_base+13].pText;
Ritor1
parents:
diff changeset
1306 else
Ritor1
parents:
diff changeset
1307 {
Ritor1
parents:
diff changeset
1308 if ( (unsigned int)gold_transaction_amount <= pParty->uNumGold )
Ritor1
parents:
diff changeset
1309 {
Ritor1
parents:
diff changeset
1310 contract_approved = 1;
Ritor1
parents:
diff changeset
1311 return pNPCTopics[pEventCode + dialogue_base].pText;
Ritor1
parents:
diff changeset
1312 }
Ritor1
parents:
diff changeset
1313 else
Ritor1
parents:
diff changeset
1314 return pNPCTopics[dialogue_base+14].pText;
Ritor1
parents:
diff changeset
1315 }
Ritor1
parents:
diff changeset
1316 }
Ritor1
parents:
diff changeset
1317 else
Ritor1
parents:
diff changeset
1318 return pNPCTopics[dialogue_base+12].pText;
Ritor1
parents:
diff changeset
1319 }
Ritor1
parents:
diff changeset
1320 //----- (004B40E6) --------------------------------------------------------
Ritor1
parents:
diff changeset
1321 void NPCHireableDialogPrepare()
Ritor1
parents:
diff changeset
1322 {
Ritor1
parents:
diff changeset
1323 signed int v0; // ebx@1
Ritor1
parents:
diff changeset
1324 NPCData *v1; // edi@1
Ritor1
parents:
diff changeset
1325
Ritor1
parents:
diff changeset
1326 v0 = 0;
Ritor1
parents:
diff changeset
1327 v1 = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) )];//- 1
Ritor1
parents:
diff changeset
1328 pDialogueWindow->Release();
Ritor1
parents:
diff changeset
1329 pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), 350, WINDOW_MainMenu, 0, 0);
Ritor1
parents:
diff changeset
1330 pBtn_ExitCancel = pDialogueWindow->CreateButton( 471, 0x1BDu, 0xA9u, 0x23u, 1, 0, UIMSG_Escape, 0, 0,
Ritor1
parents:
diff changeset
1331 pGlobalTXT_LocalizationStrings[34], //"Cancel"
Ritor1
parents:
diff changeset
1332 pIcons_LOD->GetTexture(uExitCancelTextureId),
Ritor1
parents:
diff changeset
1333 0);
Ritor1
parents:
diff changeset
1334 pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", 0);
Ritor1
parents:
diff changeset
1335 if ( pNPCStats->pProfessions[v1->uProfession].pBenefits)//*(&pNPCStats->field_13A5C + 5 * v1->uProfession) )
Ritor1
parents:
diff changeset
1336 {
Ritor1
parents:
diff changeset
1337 pDialogueWindow->CreateButton( 480, 0xA0u, 0x8Cu, 0x1Eu, 1, 0, UIMSG_ClickNPCTopic, 0x4Du, 0,
Ritor1
parents:
diff changeset
1338 pGlobalTXT_LocalizationStrings[407], 0);//"More Information"
Ritor1
parents:
diff changeset
1339 v0 = 1;
Ritor1
parents:
diff changeset
1340 }
Ritor1
parents:
diff changeset
1341 pDialogueWindow->CreateButton( 0x1E0u, 30 * v0 + 160, 0x8Cu, 0x1Eu, 1, 0, UIMSG_ClickNPCTopic, 0x4Cu, 0,
Ritor1
parents:
diff changeset
1342 pGlobalTXT_LocalizationStrings[406], 0); //"Hire"
Ritor1
parents:
diff changeset
1343 pDialogueWindow->_41D08F_set_keyboard_control_group(v0 + 1, 1, 0, 2);
Ritor1
parents:
diff changeset
1344 dialog_menu_id = HOUSE_DIALOGUE_OTHER;
Ritor1
parents:
diff changeset
1345 }
Ritor1
parents:
diff changeset
1346
Ritor1
parents:
diff changeset
1347 //----- (004B4224) --------------------------------------------------------
Ritor1
parents:
diff changeset
1348 void _4B4224_UpdateNPCTopics( int _this )
Ritor1
parents:
diff changeset
1349 {
Ritor1
parents:
diff changeset
1350 int num_menu_buttons; // ebx@1
Ritor1
parents:
diff changeset
1351 int i; // ebp@5
Ritor1
parents:
diff changeset
1352 // signed int v4; // ebp@9
Ritor1
parents:
diff changeset
1353 int v6; // eax@16
Ritor1
parents:
diff changeset
1354 int v8; // eax@21
Ritor1
parents:
diff changeset
1355 int v10; // eax@26
Ritor1
parents:
diff changeset
1356 int v12; // eax@31
Ritor1
parents:
diff changeset
1357 int v14; // eax@36
Ritor1
parents:
diff changeset
1358 int v16; // eax@41
Ritor1
parents:
diff changeset
1359 NPCData *v17; // [sp+10h] [bp-4h]@4
Ritor1
parents:
diff changeset
1360
Ritor1
parents:
diff changeset
1361 num_menu_buttons = 0;
Ritor1
parents:
diff changeset
1362 pDialogueNPCCount = (_this + 1);
Ritor1
parents:
diff changeset
1363 if ( _this + 1 == uNumDialogueNPCPortraits && uHouse_ExitPic )
Ritor1
parents:
diff changeset
1364 {
Ritor1
parents:
diff changeset
1365 pDialogueWindow->Release();
Ritor1
parents:
diff changeset
1366 pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0);
Ritor1
parents:
diff changeset
1367 sprintfex(sHouseName.data(), pGlobalTXT_LocalizationStrings[LOCSTR_ENTER_S], pMapStats->pInfos[uHouse_ExitPic].pName);
Ritor1
parents:
diff changeset
1368 pBtn_ExitCancel = pDialogueWindow->CreateButton(566, 445, 75, 33, 1, 0, UIMSG_Escape, 0, 'N', pGlobalTXT_LocalizationStrings[34], pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0);// "Cancel"
Ritor1
parents:
diff changeset
1369 pBtn_YES = pDialogueWindow->CreateButton(486, 445, 75, 33, 1, 0, UIMSG_BF, 1, 'Y', sHouseName.data(), pIcons_LOD->GetTexture(uTextureID_BUTTYES2), 0);
Ritor1
parents:
diff changeset
1370 pDialogueWindow->CreateButton( pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], 63u, 73u, 1, 0, UIMSG_BF, 1u, 0x20u, sHouseName.data(), 0);
Ritor1
parents:
diff changeset
1371 pDialogueWindow->CreateButton(8, 8, 460, 344, 1, 0, UIMSG_BF, 1, 0x59u, sHouseName.data(), 0);
Ritor1
parents:
diff changeset
1372 }
Ritor1
parents:
diff changeset
1373 else
Ritor1
parents:
diff changeset
1374 {
Ritor1
parents:
diff changeset
1375 v17 = HouseNPCData[_this + 1 - ((dword_591080 != 0)?1:0 )];//+ 1
Ritor1
parents:
diff changeset
1376 if ( dialog_menu_id == HOUSE_DIALOGUE_OTHER )
Ritor1
parents:
diff changeset
1377 {
Ritor1
parents:
diff changeset
1378 pDialogueWindow->Release();
Ritor1
parents:
diff changeset
1379 }
Ritor1
parents:
diff changeset
1380 else
Ritor1
parents:
diff changeset
1381 {
Ritor1
parents:
diff changeset
1382 for ( i = 0; i < uNumDialogueNPCPortraits; ++i )
Ritor1
parents:
diff changeset
1383 HouseNPCPortraitsButtonsList[i]->Release();
Ritor1
parents:
diff changeset
1384 }
Ritor1
parents:
diff changeset
1385 pDialogueWindow = GUIWindow::Create(0, 0, window->GetWidth(), 345, WINDOW_MainMenu, 0, 0);
Ritor1
parents:
diff changeset
1386 pBtn_ExitCancel = pDialogueWindow->CreateButton( 471, 445, 169, 35, 1, 0, UIMSG_Escape, 0, 0,
Ritor1
parents:
diff changeset
1387 pGlobalTXT_LocalizationStrings[74],// "End Conversation"
Ritor1
parents:
diff changeset
1388 pIcons_LOD->GetTexture(uExitCancelTextureId), 0);
Ritor1
parents:
diff changeset
1389 pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, UIMSG_BuyInShop_Identify_Repair, 0, 0, "", 0);
Ritor1
parents:
diff changeset
1390 if ( pDialogueNPCCount == 1 && dword_591080 )
Ritor1
parents:
diff changeset
1391 {
Ritor1
parents:
diff changeset
1392 InitializaDialogueOptions(in_current_building_type);
Ritor1
parents:
diff changeset
1393 }
Ritor1
parents:
diff changeset
1394 else
Ritor1
parents:
diff changeset
1395 {
Ritor1
parents:
diff changeset
1396 if ( v17->joins )
Ritor1
parents:
diff changeset
1397 {
Ritor1
parents:
diff changeset
1398 num_menu_buttons = 1;
Ritor1
parents:
diff changeset
1399 pDialogueWindow->CreateButton(480u, 160u, 140u, 30, 1, 0, UIMSG_ClickNPCTopic, 0xDu, 0, "", 0);
Ritor1
parents:
diff changeset
1400 }
Ritor1
parents:
diff changeset
1401 if ( v17->evt_A)
Ritor1
parents:
diff changeset
1402 {
Ritor1
parents:
diff changeset
1403 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1404 {
Ritor1
parents:
diff changeset
1405 v6 = NPC_EventProcessor(v17->evt_A);
Ritor1
parents:
diff changeset
1406 if ( v6 == 1 || v6 == 2 )
Ritor1
parents:
diff changeset
1407 pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, UIMSG_ClickNPCTopic, 0x13u, 0, "", 0);
Ritor1
parents:
diff changeset
1408 }
Ritor1
parents:
diff changeset
1409 }
Ritor1
parents:
diff changeset
1410 if ( v17->evt_B )
Ritor1
parents:
diff changeset
1411 {
Ritor1
parents:
diff changeset
1412 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1413 {
Ritor1
parents:
diff changeset
1414 v8 = NPC_EventProcessor(v17->evt_B);
Ritor1
parents:
diff changeset
1415 if ( v8 == 1 || v8 == 2 )
Ritor1
parents:
diff changeset
1416 pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, UIMSG_ClickNPCTopic, 0x14u, 0, "", 0);
Ritor1
parents:
diff changeset
1417 }
Ritor1
parents:
diff changeset
1418 }
Ritor1
parents:
diff changeset
1419 if ( v17->evt_C )
Ritor1
parents:
diff changeset
1420 {
Ritor1
parents:
diff changeset
1421 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1422 {
Ritor1
parents:
diff changeset
1423 v10 = NPC_EventProcessor(v17->evt_C);
Ritor1
parents:
diff changeset
1424 if ( v10 == 1 || v10 == 2 )
Ritor1
parents:
diff changeset
1425 pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, UIMSG_ClickNPCTopic, 0x15u, 0, "", 0);
Ritor1
parents:
diff changeset
1426 }
Ritor1
parents:
diff changeset
1427 }
Ritor1
parents:
diff changeset
1428
Ritor1
parents:
diff changeset
1429 if ( v17->evt_D )
Ritor1
parents:
diff changeset
1430 {
Ritor1
parents:
diff changeset
1431 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1432 {
Ritor1
parents:
diff changeset
1433 v12 = NPC_EventProcessor(v17->evt_D);
Ritor1
parents:
diff changeset
1434 if ( v12 == 1 || v12 == 2 )
Ritor1
parents:
diff changeset
1435 pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, UIMSG_ClickNPCTopic, 0x16u, 0, "", 0);
Ritor1
parents:
diff changeset
1436 }
Ritor1
parents:
diff changeset
1437 }
Ritor1
parents:
diff changeset
1438 if ( v17->evt_E )
Ritor1
parents:
diff changeset
1439 {
Ritor1
parents:
diff changeset
1440 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1441 {
Ritor1
parents:
diff changeset
1442 v14 = NPC_EventProcessor(v17->evt_E);
Ritor1
parents:
diff changeset
1443 if ( v14 == 1 || v14 == 2 )
Ritor1
parents:
diff changeset
1444 pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, UIMSG_ClickNPCTopic, 0x17u, 0, "", 0);
Ritor1
parents:
diff changeset
1445 }
Ritor1
parents:
diff changeset
1446 }
Ritor1
parents:
diff changeset
1447 if ( v17->evt_F )
Ritor1
parents:
diff changeset
1448 {
Ritor1
parents:
diff changeset
1449 if ( num_menu_buttons < 4 )
Ritor1
parents:
diff changeset
1450 {
Ritor1
parents:
diff changeset
1451 v16 = NPC_EventProcessor(v17->evt_F);
Ritor1
parents:
diff changeset
1452 if ( v16 == 1 || v16 == 2 )
Ritor1
parents:
diff changeset
1453 pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, UIMSG_ClickNPCTopic, 0x18u, 0, "", 0);
Ritor1
parents:
diff changeset
1454 }
Ritor1
parents:
diff changeset
1455 }
Ritor1
parents:
diff changeset
1456 pDialogueWindow->_41D08F_set_keyboard_control_group(num_menu_buttons, 1, 0, 2);
Ritor1
parents:
diff changeset
1457 dword_F8B1E0 = pDialogueWindow->pNumPresenceButton;
Ritor1
parents:
diff changeset
1458 }
Ritor1
parents:
diff changeset
1459 dialog_menu_id = HOUSE_DIALOGUE_MAIN;
Ritor1
parents:
diff changeset
1460 }
Ritor1
parents:
diff changeset
1461
Ritor1
parents:
diff changeset
1462 }
Ritor1
parents:
diff changeset
1463 //----- (004466C4) --------------------------------------------------------
Ritor1
parents:
diff changeset
1464 int NPC_EventProcessor(int npc_event_id, int entry_line)
Ritor1
parents:
diff changeset
1465 {
Ritor1
parents:
diff changeset
1466 signed int event_index; // ebp@1
Ritor1
parents:
diff changeset
1467 int evt_seq_num; // esi@3
Ritor1
parents:
diff changeset
1468 bool ready_to_exit; // [sp+Ch] [bp-Ch]@3
Ritor1
parents:
diff changeset
1469 signed int npc_activity; // [sp+10h] [bp-8h]@3
Ritor1
parents:
diff changeset
1470 int result;
Ritor1
parents:
diff changeset
1471
Ritor1
parents:
diff changeset
1472 event_index = 0;
Ritor1
parents:
diff changeset
1473 if ( !npc_event_id )
Ritor1
parents:
diff changeset
1474 return 0;
Ritor1
parents:
diff changeset
1475 evt_seq_num = entry_line;
Ritor1
parents:
diff changeset
1476 pSomeOtherEVT = pGlobalEVT.data();
Ritor1
parents:
diff changeset
1477 uSomeOtherEVT_NumEvents = uGlobalEVT_NumEvents;
Ritor1
parents:
diff changeset
1478 memcpy(pSomeOtherEVT_Events.data(), pGlobalEVT_Index.data(), sizeof(EventIndex)*4400);
Ritor1
parents:
diff changeset
1479 npc_activity = 1;
Ritor1
parents:
diff changeset
1480 ready_to_exit = false;
Ritor1
parents:
diff changeset
1481 if ( uSomeOtherEVT_NumEvents <= 0 )
Ritor1
parents:
diff changeset
1482 return 2;
Ritor1
parents:
diff changeset
1483 do
Ritor1
parents:
diff changeset
1484 {
Ritor1
parents:
diff changeset
1485 if ( (pSomeOtherEVT_Events[event_index].uEventID == npc_event_id) && (pSomeOtherEVT_Events[event_index].event_sequence_num == evt_seq_num) )
Ritor1
parents:
diff changeset
1486 {
Ritor1
parents:
diff changeset
1487 _evt_raw *_evt = (_evt_raw *)&pSomeOtherEVT[pSomeOtherEVT_Events[event_index].uEventOffsetInEVT];
Ritor1
parents:
diff changeset
1488 switch(_evt->_e_type)
Ritor1
parents:
diff changeset
1489 {
Ritor1
parents:
diff changeset
1490 case EVENT_Exit:
Ritor1
parents:
diff changeset
1491 //exit
Ritor1
parents:
diff changeset
1492 if ( ready_to_exit )
Ritor1
parents:
diff changeset
1493 result = npc_activity != 0;
Ritor1
parents:
diff changeset
1494 else
Ritor1
parents:
diff changeset
1495 result = 2;
Ritor1
parents:
diff changeset
1496 return result;
Ritor1
parents:
diff changeset
1497 break;
Ritor1
parents:
diff changeset
1498 case EVENT_OnCanShowDialogItemCmp:
Ritor1
parents:
diff changeset
1499 ready_to_exit = true;
Ritor1
parents:
diff changeset
1500 //v8 = (unsigned __int8)v7[7] + (((unsigned __int8)v7[8] + (((unsigned __int8)v7[9] + ((unsigned __int8)v7[10] << 8)) << 8)) << 8);
Ritor1
parents:
diff changeset
1501 for(int i=0; i<4; ++i)
Ritor1
parents:
diff changeset
1502 {
Ritor1
parents:
diff changeset
1503 // if (pParty->pPlayers[i].CompareVariable((enum VariableType)((unsigned __int8)pSomeOtherEVT[v6 + 5] + ((unsigned __int8)pSomeOtherEVT[v6 + 6] << 8)),
Ritor1
parents:
diff changeset
1504 // v8))
Ritor1
parents:
diff changeset
1505 if (pParty->pPlayers[i].CompareVariable((enum VariableType)EVT_WORD(_evt->v5), EVT_DWORD(_evt->v7)))
Ritor1
parents:
diff changeset
1506 {
Ritor1
parents:
diff changeset
1507 event_index = -1;
Ritor1
parents:
diff changeset
1508 evt_seq_num = EVT_BYTE(_evt->v11)-1;//(unsigned __int8)pSomeOtherEVT[v6 + 11] - 1;
Ritor1
parents:
diff changeset
1509 break;
Ritor1
parents:
diff changeset
1510 }
Ritor1
parents:
diff changeset
1511 }
Ritor1
parents:
diff changeset
1512 break;
Ritor1
parents:
diff changeset
1513 case EVENT_EndCanShowDialogItem :
Ritor1
parents:
diff changeset
1514 if ( ready_to_exit )
Ritor1
parents:
diff changeset
1515 result = npc_activity != 0;
Ritor1
parents:
diff changeset
1516 else
Ritor1
parents:
diff changeset
1517 result = 2;
Ritor1
parents:
diff changeset
1518 return result;
Ritor1
parents:
diff changeset
1519 break;
Ritor1
parents:
diff changeset
1520 case EVENT_SetCanShowDialogItem :
Ritor1
parents:
diff changeset
1521 ready_to_exit = true;
Ritor1
parents:
diff changeset
1522 npc_activity = EVT_BYTE(_evt->v5); //(unsigned __int8)v7[5];
Ritor1
parents:
diff changeset
1523 break;
Ritor1
parents:
diff changeset
1524 case EVENT_IsActorAssasinated :
Ritor1
parents:
diff changeset
1525 // if (IsActorAlive( (unsigned __int8)v7[5],
Ritor1
parents:
diff changeset
1526 // (unsigned __int8)v7[6] + (((unsigned __int8)v7[7] + (((unsigned __int8)v7[8] + ((unsigned __int8)v7[9] << 8)) << 8)) << 8),
Ritor1
parents:
diff changeset
1527 // (unsigned __int8)v7[10]) )
Ritor1
parents:
diff changeset
1528 if (IsActorAlive( EVT_BYTE(_evt->v5), EVT_DWORD(_evt->v6), EVT_BYTE(_evt->v10)))
Ritor1
parents:
diff changeset
1529 { // drop linear sequense, going to new seq
Ritor1
parents:
diff changeset
1530 event_index = -1;
Ritor1
parents:
diff changeset
1531 evt_seq_num = EVT_BYTE(_evt->v11)-1;//(unsigned __int8)pSomeOtherEVT[v6 + 11] - 1;
Ritor1
parents:
diff changeset
1532 }
Ritor1
parents:
diff changeset
1533 break;
Ritor1
parents:
diff changeset
1534 }
Ritor1
parents:
diff changeset
1535 ++evt_seq_num;
Ritor1
parents:
diff changeset
1536 }
Ritor1
parents:
diff changeset
1537 ++event_index;
Ritor1
parents:
diff changeset
1538 }
Ritor1
parents:
diff changeset
1539 while ( event_index < uSomeOtherEVT_NumEvents );
Ritor1
parents:
diff changeset
1540 if ( ready_to_exit )
Ritor1
parents:
diff changeset
1541 result = npc_activity != 0;
Ritor1
parents:
diff changeset
1542 else
Ritor1
parents:
diff changeset
1543 result = 2;
Ritor1
parents:
diff changeset
1544 return result;
Ritor1
parents:
diff changeset
1545 }
Ritor1
parents:
diff changeset
1546 //----- (00445C8B) --------------------------------------------------------
Ritor1
parents:
diff changeset
1547 int __fastcall GetGreetType(signed int SpeakingNPC_ID)
Ritor1
parents:
diff changeset
1548 {
Ritor1
parents:
diff changeset
1549 signed int v1; // ebx@1
Ritor1
parents:
diff changeset
1550 int v3; // edi@6
Ritor1
parents:
diff changeset
1551 int v4; // ecx@6
Ritor1
parents:
diff changeset
1552 int v5; // edx@6
Ritor1
parents:
diff changeset
1553 NPCData *v6; // eax@6
Ritor1
parents:
diff changeset
1554 char *v7; // ebp@11
Ritor1
parents:
diff changeset
1555 NPCData *v8; // esi@11
Ritor1
parents:
diff changeset
1556
Ritor1
parents:
diff changeset
1557 v1 = 0;
Ritor1
parents:
diff changeset
1558 if ( SpeakingNPC_ID >= 0 )
Ritor1
parents:
diff changeset
1559 {
Ritor1
parents:
diff changeset
1560 if ( SpeakingNPC_ID < 5000 )
Ritor1
parents:
diff changeset
1561 return 1;//QuestNPC_greet
Ritor1
parents:
diff changeset
1562 return 2;//HiredNPC_greet
Ritor1
parents:
diff changeset
1563 }
Ritor1
parents:
diff changeset
1564 if ( SpeakingNPC_ID >= 5000 )
Ritor1
parents:
diff changeset
1565 return 2;
Ritor1
parents:
diff changeset
1566 v3 = abs((int)sDialogue_SpeakingActorNPC_ID) - 1;
Ritor1
parents:
diff changeset
1567 v4 = 0;
Ritor1
parents:
diff changeset
1568 v5 = 0;
Ritor1
parents:
diff changeset
1569 v6 = pParty->pHirelings.data();
Ritor1
parents:
diff changeset
1570 do
Ritor1
parents:
diff changeset
1571 {
Ritor1
parents:
diff changeset
1572 if ( v6->pName )
Ritor1
parents:
diff changeset
1573 pTmpBuf[v4++] = v5;
Ritor1
parents:
diff changeset
1574 ++v6;
Ritor1
parents:
diff changeset
1575 ++v5;
Ritor1
parents:
diff changeset
1576 }
Ritor1
parents:
diff changeset
1577 while ( (signed int)v6 < (signed int)&pParty->pPickedItem );
Ritor1
parents:
diff changeset
1578 if ( (signed int)pNPCStats->uNumNewNPCs > 0 )
Ritor1
parents:
diff changeset
1579 {
Ritor1
parents:
diff changeset
1580 v7 = &pTmpBuf[v4];
Ritor1
parents:
diff changeset
1581 v8 = pNPCStats->pNewNPCData;
Ritor1
parents:
diff changeset
1582 do
Ritor1
parents:
diff changeset
1583 {
Ritor1
parents:
diff changeset
1584 if (v8->Hired() && (!pParty->pHirelings[0].pName || strcmp(v8->pName, pParty->pHirelings[0].pName)) )
Ritor1
parents:
diff changeset
1585 {
Ritor1
parents:
diff changeset
1586 if ( !pParty->pHirelings[1].pName || strcmp(v8->pName, pParty->pHirelings[1].pName) )
Ritor1
parents:
diff changeset
1587 *v7++ = v1 + 2;
Ritor1
parents:
diff changeset
1588 }
Ritor1
parents:
diff changeset
1589 ++v1;
Ritor1
parents:
diff changeset
1590 ++v8;
Ritor1
parents:
diff changeset
1591 }
Ritor1
parents:
diff changeset
1592 while ( v1 < (signed int)pNPCStats->uNumNewNPCs );
Ritor1
parents:
diff changeset
1593 }
Ritor1
parents:
diff changeset
1594 return ((unsigned __int8)pTmpBuf[v3] < 2) + 1;
Ritor1
parents:
diff changeset
1595 }
Ritor1
parents:
diff changeset
1596 //----- (00445308) --------------------------------------------------------
Ritor1
parents:
diff changeset
1597 const char *GetProfessionActionText(int a1)
Ritor1
parents:
diff changeset
1598 {
Ritor1
parents:
diff changeset
1599 if ( a1 == 10
Ritor1
parents:
diff changeset
1600 || a1 == 11
Ritor1
parents:
diff changeset
1601 || a1 == 12
Ritor1
parents:
diff changeset
1602 || a1 == 33
Ritor1
parents:
diff changeset
1603 || a1 == 34
Ritor1
parents:
diff changeset
1604 || a1 == 39
Ritor1
parents:
diff changeset
1605 || a1 == 40
Ritor1
parents:
diff changeset
1606 || a1 == 41
Ritor1
parents:
diff changeset
1607 || a1 == 42
Ritor1
parents:
diff changeset
1608 || a1 == 43
Ritor1
parents:
diff changeset
1609 || a1 == 52 )
Ritor1
parents:
diff changeset
1610 return pNPCStats->pProfessions[a1 - 1].pActionText;
Ritor1
parents:
diff changeset
1611 else
Ritor1
parents:
diff changeset
1612 return pNPCTopics[407].pTopic;
Ritor1
parents:
diff changeset
1613 }
Ritor1
parents:
diff changeset
1614
Ritor1
parents:
diff changeset
1615 //----- (004BB756) --------------------------------------------------------
Ritor1
parents:
diff changeset
1616 int UseNPCSkill(NPCProf profession)
Ritor1
parents:
diff changeset
1617 {
Ritor1
parents:
diff changeset
1618 switch (profession)
Ritor1
parents:
diff changeset
1619 {
Ritor1
parents:
diff changeset
1620 case Healer:
Ritor1
parents:
diff changeset
1621 {
Ritor1
parents:
diff changeset
1622 for (int i = 0; i < 4; ++i)
Ritor1
parents:
diff changeset
1623 pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
Ritor1
parents:
diff changeset
1624 }
Ritor1
parents:
diff changeset
1625 break;
Ritor1
parents:
diff changeset
1626
Ritor1
parents:
diff changeset
1627 case ExpertHealer:
Ritor1
parents:
diff changeset
1628 {
Ritor1
parents:
diff changeset
1629 for (int i = 0; i < 4; ++i)
Ritor1
parents:
diff changeset
1630 {
Ritor1
parents:
diff changeset
1631 __debugbreak();
Ritor1
parents:
diff changeset
1632 pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
Ritor1
parents:
diff changeset
1633
Ritor1
parents:
diff changeset
1634 for (int j = 0; j < 14; ++j)
Ritor1
parents:
diff changeset
1635 pParty->pPlayers[i].pConditions[j] = 0;
Ritor1
parents:
diff changeset
1636 pParty->pPlayers[i].pConditions[Condition_Good] = 0;
Ritor1
parents:
diff changeset
1637 }
Ritor1
parents:
diff changeset
1638 }
Ritor1
parents:
diff changeset
1639 break;
Ritor1
parents:
diff changeset
1640
Ritor1
parents:
diff changeset
1641 case MasterHealer:
Ritor1
parents:
diff changeset
1642 {
Ritor1
parents:
diff changeset
1643 for (int i = 0; i < 4; ++i)
Ritor1
parents:
diff changeset
1644 {
Ritor1
parents:
diff changeset
1645 __debugbreak(); //Ritor1:needed cleaned(Необходимо почистить)
Ritor1
parents:
diff changeset
1646 Player* player = &pParty->pPlayers[i];
Ritor1
parents:
diff changeset
1647 pParty->pPlayers[i].sHealth = pParty->pPlayers[i].GetMaxHealth();
Ritor1
parents:
diff changeset
1648
Ritor1
parents:
diff changeset
1649 int v5 = LODWORD(player->pConditions[19]);//*((int *)v4 - 32);
Ritor1
parents:
diff changeset
1650 int v6 = HIDWORD(player->pConditions[19]);//*((int *)v4 - 31);
Ritor1
parents:
diff changeset
1651 memset(&pParty->pPlayers[i].pConditions, 0, sizeof(pParty->pPlayers[i].pConditions));
Ritor1
parents:
diff changeset
1652
Ritor1
parents:
diff changeset
1653 *(int *)&player->pActiveSkills[PLAYER_SKILL_SHIELD] = v5;
Ritor1
parents:
diff changeset
1654 *(int *)&player->pActiveSkills[PLAYER_SKILL_CHAIN] = v6;
Ritor1
parents:
diff changeset
1655 }
Ritor1
parents:
diff changeset
1656 }
Ritor1
parents:
diff changeset
1657 break;
Ritor1
parents:
diff changeset
1658
Ritor1
parents:
diff changeset
1659 case Cook://Повар
Ritor1
parents:
diff changeset
1660 {
Ritor1
parents:
diff changeset
1661 if (pParty->uNumFoodRations >= 13)
Ritor1
parents:
diff changeset
1662 return 1;
Ritor1
parents:
diff changeset
1663
Ritor1
parents:
diff changeset
1664 Party::GiveFood(1);
Ritor1
parents:
diff changeset
1665 }
Ritor1
parents:
diff changeset
1666 break;
Ritor1
parents:
diff changeset
1667
Ritor1
parents:
diff changeset
1668 case Chef:
Ritor1
parents:
diff changeset
1669 {
Ritor1
parents:
diff changeset
1670 if (pParty->uNumFoodRations >= 13)
Ritor1
parents:
diff changeset
1671 return 1;
Ritor1
parents:
diff changeset
1672
Ritor1
parents:
diff changeset
1673 if (pParty->uNumFoodRations == 13)
Ritor1
parents:
diff changeset
1674 Party::GiveFood(1);
Ritor1
parents:
diff changeset
1675 else
Ritor1
parents:
diff changeset
1676 Party::GiveFood(2);
Ritor1
parents:
diff changeset
1677 }
Ritor1
parents:
diff changeset
1678 break;
Ritor1
parents:
diff changeset
1679
Ritor1
parents:
diff changeset
1680 case WindMaster:
Ritor1
parents:
diff changeset
1681 {
Ritor1
parents:
diff changeset
1682 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
Ritor1
parents:
diff changeset
1683 {
Ritor1
parents:
diff changeset
1684 ShowStatusBarString(pGlobalTXT_LocalizationStrings[494], 2);//Нельзя применить знание Полет в помещении!
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1685 pAudioPlayer->PlaySound(SOUND_fizzle, 0, 0, -1, 0, 0, 0, 0);
2498
Ritor1
parents:
diff changeset
1686 }
Ritor1
parents:
diff changeset
1687 else
Ritor1
parents:
diff changeset
1688 {
Ritor1
parents:
diff changeset
1689 int v19 = pOtherOverlayList->_4418B1(10008, 203, 0, 65536);
Ritor1
parents:
diff changeset
1690 pParty->pPartyBuffs[PARTY_BUFF_FLY].Apply(pParty->uTimePlayed + 60 * (256 * 2), 3, 1, v19, 0);
Ritor1
parents:
diff changeset
1691 pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags |= 1;
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1692 pAudioPlayer->PlaySound(SOUND_21fly03, 0, 0, -1, 0, 0, 0, 0);
2498
Ritor1
parents:
diff changeset
1693 }
Ritor1
parents:
diff changeset
1694 }
Ritor1
parents:
diff changeset
1695 break;
Ritor1
parents:
diff changeset
1696
Ritor1
parents:
diff changeset
1697 case WaterMaster:
Ritor1
parents:
diff changeset
1698 {
Ritor1
parents:
diff changeset
1699 int v20 = pOtherOverlayList->_4418B1(10005, 201, 0, 65536);
Ritor1
parents:
diff changeset
1700 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].Apply(pParty->uTimePlayed + 60 * (256 * (2 + 1)), 3, 0, v20, 0);
Ritor1
parents:
diff changeset
1701 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags |= 1;
2534
1bcadc6dd203 enum SOUND_
Ritor1
parents: 2502
diff changeset
1702 pAudioPlayer->PlaySound(SOUND_WaterWalk, 0, 0, -1, 0, 0, 0, 0);
2498
Ritor1
parents:
diff changeset
1703 }
Ritor1
parents:
diff changeset
1704 break;
Ritor1
parents:
diff changeset
1705
Ritor1
parents:
diff changeset
1706 case GateMaster:
Ritor1
parents:
diff changeset
1707 {
Ritor1
parents:
diff changeset
1708 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0);
Ritor1
parents:
diff changeset
1709 dword_50C9DC = 195;
Ritor1
parents:
diff changeset
1710 ptr_50C9E0 = GetNPCData(sDialogue_SpeakingActorNPC_ID);
Ritor1
parents:
diff changeset
1711 }
Ritor1
parents:
diff changeset
1712 break;
Ritor1
parents:
diff changeset
1713
Ritor1
parents:
diff changeset
1714 case Acolyte: _42777D_CastSpell_UseWand_ShootArrow(46, 0, 133, 0, 0); break;
Ritor1
parents:
diff changeset
1715 case Piper: _42777D_CastSpell_UseWand_ShootArrow(51, 0, 133, 0, 0); break;
Ritor1
parents:
diff changeset
1716 case FallenWizard: _42777D_CastSpell_UseWand_ShootArrow(86, 0, 133, 0, 0); break;
Ritor1
parents:
diff changeset
1717
Ritor1
parents:
diff changeset
1718 case Teacher:
Ritor1
parents:
diff changeset
1719 case Instructor:
Ritor1
parents:
diff changeset
1720 case Armsmaster:
Ritor1
parents:
diff changeset
1721 case Weaponsmaster:
Ritor1
parents:
diff changeset
1722 case Apprentice:
Ritor1
parents:
diff changeset
1723 case Mystic:
Ritor1
parents:
diff changeset
1724 case Spellmaster:
Ritor1
parents:
diff changeset
1725 case Trader:
Ritor1
parents:
diff changeset
1726 case Merchant:
Ritor1
parents:
diff changeset
1727 case Scout:
Ritor1
parents:
diff changeset
1728 case Herbalist:
Ritor1
parents:
diff changeset
1729 case Apothecary:
Ritor1
parents:
diff changeset
1730 case Tinker:
Ritor1
parents:
diff changeset
1731 case Locksmith:
Ritor1
parents:
diff changeset
1732 case Fool:
Ritor1
parents:
diff changeset
1733 case ChimneySweep:
Ritor1
parents:
diff changeset
1734 case Porter:
Ritor1
parents:
diff changeset
1735 case QuarterMaster:
Ritor1
parents:
diff changeset
1736 case Factor:
Ritor1
parents:
diff changeset
1737 case Banker:
Ritor1
parents:
diff changeset
1738 case Horseman:
Ritor1
parents:
diff changeset
1739 case Bard:
Ritor1
parents:
diff changeset
1740 case Enchanter:
Ritor1
parents:
diff changeset
1741 case Cartographer:
Ritor1
parents:
diff changeset
1742 case Explorer:
Ritor1
parents:
diff changeset
1743 case Pirate:
Ritor1
parents:
diff changeset
1744 case Squire:
Ritor1
parents:
diff changeset
1745 case Psychic:
Ritor1
parents:
diff changeset
1746 case Gypsy:
Ritor1
parents:
diff changeset
1747 case Diplomat:
Ritor1
parents:
diff changeset
1748 case Duper:
Ritor1
parents:
diff changeset
1749 case Burglar:
Ritor1
parents:
diff changeset
1750 case Acolyte2:
Ritor1
parents:
diff changeset
1751 case Initiate:
Ritor1
parents:
diff changeset
1752 case Prelate:
Ritor1
parents:
diff changeset
1753 case Monk:
Ritor1
parents:
diff changeset
1754 case Sage:
Ritor1
parents:
diff changeset
1755 case Hunter:
Ritor1
parents:
diff changeset
1756 break;
Ritor1
parents:
diff changeset
1757
Ritor1
parents:
diff changeset
1758 default:
Ritor1
parents:
diff changeset
1759 assert(false && "Invalid enum value");
Ritor1
parents:
diff changeset
1760 }
Ritor1
parents:
diff changeset
1761 return 0;
Ritor1
parents:
diff changeset
1762 }