Mercurial > mm7
annotate Items.cpp @ 545:dde1083df4b7
SubtractVariables
author | Ritor1 |
---|---|
date | Sun, 03 Mar 2013 18:39:21 +0600 |
parents | 214d9d47cf1f |
children | 09108e73f2f4 |
rev | line source |
---|---|
0 | 1 #include <stdlib.h> |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
2 #include <assert.h> |
0 | 3 |
4 #include "Items.h" | |
5 #include "MapInfo.h" | |
6 #include "FrameTableInc.h" | |
7 #include "Allocator.h" | |
461 | 8 #include "GUIWindow.h" |
9 #include "Events2D.h" | |
10 #include "Chest.h" | |
0 | 11 #include "LOD.h" |
12 #include "Monsters.h" | |
13 #include "Party.h" | |
14 #include "FactionTable.h" | |
15 #include "StorylineTextTable.h" | |
189 | 16 #include "texts.h" |
0 | 17 #include "mm7_data.h" |
18 | |
19 | |
20 | |
463 | 21 struct ITEM_VARIATION |
22 { | |
23 unsigned __int16 treasure_level; | |
24 unsigned __int16 item_class[4]; | |
25 }; | |
26 | |
27 | |
526 | 28 const char uItemsAmountPerShopType[5]={ 0, 6, 8, 12, 12}; |
463 | 29 |
526 | 30 const ITEM_VARIATION shopWeap_variation_ord[15] ={ |
463 | 31 { 0, { 0, 0, 0, 0 }}, |
32 { 1, { 23, 27, 20, 20 }}, | |
33 { 1, { 23, 24, 28, 20 }}, | |
34 { 2, { 23, 24, 25, 20 }}, | |
35 { 2, { 27, 27, 26, 26 }}, | |
36 { 4, { 24, 30, 25, 27 }}, | |
37 { 4, { 24, 30, 25, 27 }}, | |
38 { 3, { 30, 24, 20, 20 }}, | |
39 { 2, { 20, 20, 20, 20 }}, | |
40 { 3, { 27, 27, 26, 26 }}, | |
41 { 3, { 28, 28, 25, 25 }}, | |
42 { 2, { 23, 23, 24, 24 }}, | |
43 { 3, { 23, 23, 26, 26 }}, | |
44 { 2, { 30, 26, 26, 26 }}, | |
45 { 2, { 28, 25, 28, 29 }}}; | |
46 | |
526 | 47 const ITEM_VARIATION shopArmr_variation_ord[28] ={ |
463 | 48 { 1, { 35, 35, 38, 38 }}, |
49 { 1, { 31, 31, 31, 34 }}, | |
50 { 1, { 35, 35, 38, 38 }}, | |
51 { 1, { 31, 31, 32, 34 }}, | |
52 { 2, { 35, 35, 38, 38 }}, | |
53 { 2, { 31, 32, 32, 33 }}, | |
54 { 2, { 35, 35, 38, 38 }}, | |
55 { 2, { 31, 31, 32, 32 }}, | |
56 { 4, { 35, 35, 38, 38 }}, | |
57 { 4, { 31, 32, 33, 34 }}, | |
58 { 4, { 35, 35, 38, 38 }}, | |
59 { 4, { 31, 32, 33, 34 }}, | |
60 { 3, { 35, 35, 38, 38 }}, | |
61 { 3, { 31, 31, 31, 31 }}, | |
62 { 2, { 35, 35, 38, 38 }}, | |
63 { 2, { 31, 32, 34, 34 }}, | |
64 { 3, { 35, 35, 38, 38 }}, | |
65 { 3, { 31, 31, 32, 32 }}, | |
66 { 3, { 35, 35, 38, 38 }}, | |
67 { 3, { 32, 32, 32, 33 }}, | |
68 { 3, { 35, 35, 38, 38 }}, | |
69 { 3, { 31, 31, 31, 32 }}, | |
70 { 3, { 35, 35, 38, 38 }}, | |
71 { 3, { 33, 31, 32, 34 }}, | |
72 { 3, { 35, 35, 38, 38 }}, | |
73 { 3, { 33, 31, 32, 34 }}, | |
74 { 4, { 35, 35, 38, 38 }}, | |
75 { 4, { 33, 31, 32, 34 }}}; | |
76 | |
77 | |
78 | |
526 | 79 const unsigned __int16 shopMagic_treasure_lvl[14]= {0, 1, 1, 2, 2, 4, 4, 3, 2, 2, 2, 2, 2, 2}; |
80 const unsigned __int16 shopAlch_treasure_lvl[13] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 2, 2, 2, 2}; | |
463 | 81 |
526 | 82 const ITEM_VARIATION shopWeap_variation_spc[15]={ |
463 | 83 { 0, { 0, 0, 0, 0 }}, |
470 | 84 { 2, { 25, 30, 20, 20}}, |
85 { 2, { 23, 24, 28, 20}}, | |
86 { 3, { 23, 24, 25, 20}}, | |
87 { 3, { 27, 27, 26, 26}}, | |
88 { 5, { 23, 26, 28, 27}}, | |
89 { 5, { 23, 26, 28, 27}}, | |
90 { 4, { 30, 24, 20, 20}}, | |
91 { 3, { 20, 20, 20, 20}}, | |
92 { 4, { 27, 27, 26, 26}}, | |
93 { 4, { 28, 28, 25, 25}}, | |
94 { 4, { 23, 23, 24, 24}}, | |
95 { 4, { 24, 24, 27, 20}}, | |
96 { 4, { 30, 26, 26, 26}}, | |
97 { 4, { 28, 25, 28, 29}}}; | |
463 | 98 |
526 | 99 const ITEM_VARIATION shopArmr_variation_spc[28]={ |
470 | 100 { 2, { 35, 35, 38, 38 }}, |
101 { 2, { 31, 31, 31, 34 }}, | |
102 { 2, { 35, 35, 38, 38 }}, | |
103 { 2, { 31, 31, 32, 34 }}, | |
104 { 3, { 35, 35, 38, 38 }}, | |
105 { 3, { 31, 32, 32, 33 }}, | |
106 { 3, { 35, 35, 38, 38 }}, | |
107 { 3, { 31, 31, 32, 32 }}, | |
108 { 5, { 35, 35, 38, 38 }}, | |
109 { 5, { 31, 32, 33, 34 }}, | |
110 { 5, { 35, 35, 38, 38 }}, | |
111 { 5, { 31, 32, 33, 34 }}, | |
112 { 4, { 35, 35, 38, 38 }}, | |
113 { 4, { 31, 31, 31, 31 }}, | |
114 { 3, { 35, 35, 38, 38 }}, | |
115 { 3, { 31, 32, 34, 34 }}, | |
116 { 4, { 35, 35, 38, 38 }}, | |
117 { 4, { 31, 31, 32, 33 }}, | |
118 { 4, { 35, 35, 38, 38 }}, | |
119 { 4, { 32, 32, 33, 34 }}, | |
120 { 4, { 35, 35, 38, 38 }}, | |
121 { 4, { 31, 31, 31, 32 }}, | |
122 { 4, { 35, 35, 38, 38 }}, | |
123 { 4, { 32, 32, 32, 32 }}, | |
124 { 4, { 35, 35, 38, 38 }}, | |
125 { 4, { 34, 34, 34, 34 }}, | |
126 { 5, { 35, 35, 38, 38 }}, | |
127 { 5, { 33, 33, 33, 33 }} | |
128 }; | |
463 | 129 |
526 | 130 const unsigned __int16 shopMagicSpc_treasure_lvl[14] = {0, 2, 2, 3, 3, 5, 5, 4, 3, 3, 3, 3, 3, 3}; |
131 const unsigned __int16 shopAlchSpc_treasure_lvl[13] = {0, 2, 2, 3, 3, 4, 4, 5, 5, 3, 2, 2, 2}; | |
132 | |
133 | |
134 char byte_4E8168[7][14]={ //byte_4E8178 | |
135 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, | |
136 { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, | |
137 { 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}, | |
138 { 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4}, | |
139 { 2, 2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}, | |
140 { 2, 2, 2, 2, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6}, | |
141 { 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}}; | |
0 | 142 |
475 | 143 int sub_4BE571(int a1, int *a2, int a3, int a4); |
0 | 144 |
145 ItemGen *ptr_50C9A4; | |
146 | |
315 | 147 struct ItemsTable *pItemsTable; // 005D29E0 |
0 | 148 |
149 | |
150 | |
151 | |
152 | |
153 //----- (00439DF3) -------------------------------------------------------- | |
385 | 154 int ItemGen::_439DF3_get_additional_damage(int *damage_type, bool *draintargetHP) |
155 { | |
156 *damage_type = 0; | |
157 if ( !uItemID ) | |
158 return 0; | |
159 UpdateTempBonus(pParty->uTimePlayed); | |
160 if (uItemID == 501 ) //Iron Feather -sword | |
161 { | |
162 *damage_type = 1; | |
163 return rand() % 10 + 6; | |
164 } | |
165 if (uItemID == 507 ) //Ghoulsbane -axe | |
166 { | |
167 *damage_type = 0; | |
168 return rand() % 16 + 3; | |
169 } | |
170 if ( uItemID == 510 ) //Ullyses -bow | |
171 { | |
172 *damage_type = 2; | |
173 return rand() % 4 + 9; | |
174 } | |
175 if ( uItemID == 517 ) //Old Nick -dagger | |
176 { | |
177 *damage_type = 8; | |
178 return 8; | |
179 } | |
0 | 180 |
385 | 181 switch (uSpecEnchantmentType) |
182 { | |
183 case 4: //Adds 3-4 points of Cold damage. | |
184 *damage_type = 2; | |
185 return rand() % 2 + 3; | |
186 break; | |
187 case 5: //Adds 6-8 points of Cold damage. | |
188 *damage_type = 2; | |
189 return rand() % 3 + 6; | |
190 break; | |
191 case 6: //Adds 9-12 points of Cold damage. | |
192 *damage_type = 2; | |
193 return rand() % 4 + 9; | |
194 break; | |
195 case 7: //Adds 2-5 points of Electrical damage. | |
196 *damage_type = 1; | |
197 return rand() % 4 + 2; | |
198 break; | |
199 case 8: //Adds 4-10 points of Electrical damage. | |
200 *damage_type = 1; | |
201 return rand() % 7 + 4; | |
202 break; | |
203 case 9: //Adds 6-15 points of Electrical damage. | |
204 *damage_type = 1; | |
205 return rand() % 10 + 6; | |
206 break; | |
207 case 10: //Adds 1-6 points of Fire damage. | |
208 *damage_type = 0; | |
209 return GetDiceResult(1, 6); | |
210 break; | |
211 case 11: //Adds 2-12 points of Fire damage. | |
212 *damage_type = 0; | |
213 return GetDiceResult(2, 6); | |
214 break; | |
215 case 12: //Adds 3-18 points of Fire damage. | |
216 *damage_type = 0; | |
217 return GetDiceResult(3, 6); | |
218 break; | |
219 case 13: //Adds 5 points of Body damage. | |
220 *damage_type = 8; | |
221 return 5; | |
222 break; | |
223 case 14: //Adds 8 points of Body damage. | |
224 *damage_type = 8; | |
225 return 8; | |
226 break; | |
227 case 15: //Adds 12 points of Body damage. | |
228 *damage_type = 8; | |
229 return 12; | |
230 break; | |
231 case 16: //Drain Hit Points from target. | |
232 case 41: //Drain Hit Points from target and Increased Weapon speed. | |
233 *damage_type = 10; | |
234 *draintargetHP = true; | |
235 return 0; | |
236 break; | |
237 case 46: //Adds 10-20 points of Fire damage and +25 Might. | |
238 *damage_type = 0; | |
239 return rand() % 11 + 10; | |
240 break; | |
241 default: | |
242 *damage_type = 0; | |
243 return 0; | |
244 | |
245 } | |
246 | |
247 } | |
0 | 248 |
249 | |
250 //----- (00402F07) -------------------------------------------------------- | |
251 void ItemGen::Reset() | |
252 { | |
377 | 253 this->uHolderPlayer = 0; |
0 | 254 this->uAttributes = 0; |
255 this->uNumCharges = 0; | |
377 | 256 this->uSpecEnchantmentType = 0; |
0 | 257 this->_bonus_strength = 0; |
377 | 258 this->uEncantmentType = 0; |
0 | 259 this->uItemID = 0; |
260 this->uBodyAnchor = 0; | |
261 this->uExpireTime = 0i64; | |
262 } | |
263 | |
264 //----- (00458260) -------------------------------------------------------- | |
265 void ItemGen::UpdateTempBonus(__int64 uTimePlayed) | |
266 { | |
463 | 267 if ( this->uAttributes & ITEM_TEMP_BONUS ) |
0 | 268 { |
269 if ( uTimePlayed > (signed __int64)this->uExpireTime ) | |
270 { | |
377 | 271 this->uEncantmentType = 0; |
272 this->uSpecEnchantmentType = 0; | |
463 | 273 this->uAttributes = this->uAttributes&(~ITEM_TEMP_BONUS); |
0 | 274 } |
275 } | |
276 } | |
277 | |
278 //----- (0045814E) -------------------------------------------------------- | |
374 | 279 void ItemsTable::Release() |
0 | 280 { |
281 if ( pMonstersTXT_Raw ) | |
282 pAllocator->FreeChunk(pMonstersTXT_Raw); | |
283 if ( pMonsterPlacementTXT_Raw ) | |
284 pAllocator->FreeChunk(pMonsterPlacementTXT_Raw); | |
285 if ( pSkillDescTXT_Raw ) | |
286 pAllocator->FreeChunk(pSkillDescTXT_Raw); | |
374 | 287 if (pSpcItemsTXT_Raw ) |
288 pAllocator->FreeChunk(pSpcItemsTXT_Raw); | |
289 if ( pStdItemsTXT_Raw ) | |
290 pAllocator->FreeChunk(pStdItemsTXT_Raw); | |
291 if ( pRndItemsTXT_Raw ) | |
292 pAllocator->FreeChunk(pRndItemsTXT_Raw); | |
293 if ( pItemsTXT_Raw ) | |
294 pAllocator->FreeChunk(pItemsTXT_Raw); | |
0 | 295 if ( pHostileTXT_Raw ) |
296 pAllocator->FreeChunk(pHostileTXT_Raw); | |
297 if ( pHistoryTXT_Raw ) | |
298 pAllocator->FreeChunk(pHistoryTXT_Raw); | |
299 if ( pPotionsTXT_Raw ) | |
300 pAllocator->FreeChunk(pPotionsTXT_Raw); | |
301 if ( pPotionNotesTXT_Raw ) | |
302 pAllocator->FreeChunk(pPotionNotesTXT_Raw); | |
374 | 303 pSpcItemsTXT_Raw = NULL; |
304 pSkillDescTXT_Raw = NULL; | |
305 pStdItemsTXT_Raw = NULL; | |
306 pRndItemsTXT_Raw = NULL; | |
307 pItemsTXT_Raw = NULL; | |
308 | |
0 | 309 } |
310 | |
311 | |
312 //----- (00456D84) -------------------------------------------------------- | |
313 void ItemsTable::Initialize() | |
224 | 314 { |
315 int i,j; | |
316 char* test_string; | |
229 | 317 unsigned char c; |
224 | 318 bool break_loop; |
319 unsigned int temp_str_len; | |
320 char* tmp_pos; | |
321 int decode_step; | |
322 int item_counter; | |
323 | |
324 pMapStats = new MapStats; | |
325 pMapStats->Initialize(); | |
326 | |
327 pMonsterStats = new MonsterStats; | |
328 pMonsterStats->Initialize(); | |
329 pMonsterStats->InitializePlacements(); | |
330 | |
331 pSpellStats = new SpellStats; | |
332 pSpellStats->Initialize(); | |
333 | |
334 LoadPotions(); | |
335 LoadPotionNotes(); | |
336 | |
337 pFactionTable = new FactionTable; | |
338 pFactionTable->Initialize(); | |
339 | |
340 pStorylineText = new StorylineText; | |
341 pStorylineText->Initialize(); | |
0 | 342 |
224 | 343 pStdItemsTXT_Raw = NULL; |
344 pStdItemsTXT_Raw = (char *)pEvents_LOD->LoadRaw("stditems.txt", 0); | |
345 strtok(pStdItemsTXT_Raw, "\r"); | |
346 strtok(NULL, "\r"); | |
347 strtok(NULL, "\r"); | |
348 strtok(NULL, "\r"); | |
349 //Standard Bonuses by Group | |
350 for (i=0;i<24;++i) | |
351 { | |
352 test_string = strtok(NULL, "\r") + 1; | |
353 break_loop = false; | |
354 decode_step=0; | |
355 do | |
356 { | |
357 c = *(unsigned char*)test_string; | |
358 temp_str_len = 0; | |
359 while((c!='\t')&&(c>0)) | |
360 { | |
361 ++temp_str_len; | |
362 c=test_string[temp_str_len]; | |
363 } | |
364 tmp_pos=test_string+temp_str_len; | |
365 if (*tmp_pos == 0) | |
366 break_loop = true; | |
367 *tmp_pos = 0; | |
368 if (temp_str_len) | |
369 { | |
370 switch (decode_step) | |
371 { | |
372 case 0: | |
373 pEnchantments[i].pBonusStat=RemoveQuotes(test_string); | |
374 break; | |
375 case 1: | |
376 pEnchantments[i].pOfName= RemoveQuotes(test_string); | |
377 break; | |
378 default: | |
379 pEnchantments[i].to_item[decode_step-2]=atoi(test_string); | |
380 } | |
381 } | |
382 else | |
383 { | |
384 if (!decode_step) | |
385 break_loop = true; | |
386 } | |
387 ++decode_step; | |
388 test_string=tmp_pos+1; | |
389 } while ((decode_step<11)&&!break_loop); | |
390 } | |
0 | 391 |
224 | 392 memset(&pEnchantmentsSumm, 0, 36); |
393 for(i=0;i<9;++i) | |
394 { | |
395 for (j=0;j<24;++j) | |
396 pEnchantmentsSumm[i]+=pEnchantments[j].to_item[i]; | |
397 } | |
0 | 398 |
224 | 399 //Bonus range for Standard by Level |
400 strtok(NULL, "\r"); | |
401 strtok(NULL, "\r"); | |
402 strtok(NULL, "\r"); | |
403 strtok(NULL, "\r"); | |
404 strtok(NULL, "\r"); | |
405 for(i=0;i<6;++i) //counted from 1 | |
406 { | |
407 test_string = strtok(NULL, "\r") + 1; | |
408 break_loop = false; | |
409 decode_step=0; | |
410 do | |
411 { | |
412 c = *(unsigned char*)test_string; | |
413 temp_str_len = 0; | |
414 while((c!='\t')&&(c>0)) | |
415 { | |
416 ++temp_str_len; | |
417 c=test_string[temp_str_len]; | |
418 } | |
419 tmp_pos=test_string+temp_str_len; | |
420 if (*tmp_pos == 0) | |
421 break_loop = true; | |
422 *tmp_pos = 0; | |
423 if (decode_step==2) | |
424 bonus_ranges[i].minR = atoi(test_string); | |
425 else if (decode_step==3) | |
426 bonus_ranges[i].maxR =atoi(test_string); | |
427 ++decode_step; | |
428 test_string=tmp_pos+1; | |
429 } while ((decode_step<4)&&!break_loop); | |
430 } | |
431 | |
222 | 432 |
224 | 433 pSpcItemsTXT_Raw = 0; |
434 pSpcItemsTXT_Raw = (char *)pEvents_LOD->LoadRaw("spcitems.txt", 0); | |
435 strtok(pSpcItemsTXT_Raw, "\r"); | |
436 strtok(NULL, "\r"); | |
437 strtok(NULL, "\r"); | |
438 strtok(NULL, "\r"); | |
439 for (i=0;i<72;++i) | |
440 { | |
441 test_string = strtok(NULL, "\r") + 1; | |
442 break_loop = false; | |
443 decode_step=0; | |
444 do | |
445 { | |
446 c = *(unsigned char*)test_string; | |
447 temp_str_len = 0; | |
448 while((c!='\t')&&(c>0)) | |
449 { | |
450 ++temp_str_len; | |
451 c=test_string[temp_str_len]; | |
452 } | |
453 tmp_pos=test_string+temp_str_len; | |
454 if (*tmp_pos == 0) | |
455 break_loop = true; | |
456 *tmp_pos = 0; | |
457 if (temp_str_len) | |
458 { | |
459 switch (decode_step) | |
460 { | |
461 case 0: | |
462 pSpecialEnchantments[i].pBonusStatement=RemoveQuotes(test_string); | |
463 break; | |
464 case 1: | |
465 pSpecialEnchantments[i].pNameAdd= RemoveQuotes(test_string); | |
466 break; | |
467 case 14: | |
468 int res; | |
469 res=atoi(test_string); | |
470 if(!res) | |
471 { | |
472 ++test_string; | |
473 while (*test_string==' ')//fix X 2 case | |
474 ++test_string; | |
222 | 475 res=atoi(test_string); |
224 | 476 } |
477 pSpecialEnchantments[i].iValue=res; | |
478 break; | |
479 case 15: | |
480 pSpecialEnchantments[i].iTreasureLevel= tolower(*test_string) - 97;; | |
481 break; | |
482 default: | |
483 pSpecialEnchantments[i].to_item_apply[decode_step-2]=atoi(test_string); | |
484 } | |
485 } | |
486 else | |
487 { | |
488 if (!decode_step) | |
489 break_loop = true; | |
490 } | |
491 ++decode_step; | |
492 test_string=tmp_pos+1; | |
493 } while ((decode_step<16)&&!break_loop); | |
494 } | |
495 | |
496 pSpecialEnchantments_count = 71; | |
497 memset(&pSpecialEnchantmentsSumm, 0, 96); | |
498 for(i=0;i<12;++i) | |
499 { | |
500 for (j=0;j<pSpecialEnchantments_count;++j) | |
501 pSpecialEnchantmentsSumm[i]+=pSpecialEnchantments[j].to_item_apply[i]; | |
502 } | |
222 | 503 |
224 | 504 Initialize2DA(); |
222 | 505 |
224 | 506 pItemsTXT_Raw = NULL; |
507 pItemsTXT_Raw = (char*) pEvents_LOD->LoadRaw("items.txt", 0); | |
508 strtok(pItemsTXT_Raw, "\r"); | |
509 strtok(NULL, "\r"); | |
510 uAllItemsCount = 0; | |
511 item_counter = 0; | |
222 | 512 while (true) |
513 { | |
514 test_string = strtok(NULL, "\r") + 1; | |
515 break_loop = false; | |
516 decode_step=0; | |
517 do | |
518 { | |
519 c = *(unsigned char*)test_string; | |
520 temp_str_len = 0; | |
521 while((c!='\t')&&(c>0)) | |
522 { | |
523 ++temp_str_len; | |
524 c=test_string[temp_str_len]; | |
525 } | |
526 tmp_pos=test_string+temp_str_len; | |
527 if (*tmp_pos == 0) | |
528 break_loop = true; | |
529 *tmp_pos = 0; | |
530 if (temp_str_len) | |
531 { | |
532 switch (decode_step) | |
533 { | |
534 case 0: //Item # | |
535 item_counter=atoi(test_string); | |
536 uAllItemsCount=item_counter; | |
537 break; | |
538 case 1: //Pic File | |
539 pItems[item_counter].pIconName = RemoveQuotes(test_string); | |
540 break; | |
541 case 2: //Name | |
542 pItems[item_counter].pName = RemoveQuotes(test_string); | |
543 break; | |
544 case 3: //Value | |
545 pItems[item_counter].uValue=atoi(test_string); | |
546 break; | |
547 case 4: //Equip Stat | |
548 { | |
549 if ( !_strcmpi(test_string, "weapon") ) | |
550 { | |
365 | 551 pItems[item_counter].uEquipType = EQUIP_ONE_OR_TWO_HANDS; |
222 | 552 break; |
553 } | |
554 if ( !_strcmpi(test_string, "weapon2") ) | |
555 { | |
365 | 556 pItems[item_counter].uEquipType = EQUIP_TWO_HANDED; |
222 | 557 break; |
558 } | |
559 if ( !_strcmpi(test_string, "weapon1or2") ) | |
560 { | |
365 | 561 pItems[item_counter].uEquipType = EQUIP_ONE_OR_TWO_HANDS; |
222 | 562 break; |
563 } | |
564 if ( !(_strcmpi(test_string, "missile")&&_strcmpi(test_string, "bow"))) | |
565 { | |
365 | 566 pItems[item_counter].uEquipType = EQUIP_BOW; |
222 | 567 break; |
568 } | |
569 if ( !_strcmpi(test_string, "armor") ) | |
570 { | |
365 | 571 pItems[item_counter].uEquipType = EQUIP_ARMOUR; |
222 | 572 break; |
573 } | |
574 if ( !_strcmpi(test_string, "shield") ) | |
575 { | |
365 | 576 pItems[item_counter].uEquipType = EQUIP_SHIELD; |
222 | 577 break; |
578 } | |
579 if ( !_strcmpi(test_string, "helm") ) | |
580 { | |
365 | 581 pItems[item_counter].uEquipType = EQUIP_HELMET; |
222 | 582 break; |
583 } | |
584 if ( !_strcmpi(test_string, "belt") ) | |
585 { | |
365 | 586 pItems[item_counter].uEquipType = EQUIP_BELT; |
222 | 587 break; |
588 } | |
589 if ( !_strcmpi(test_string, "cloak") ) | |
590 { | |
365 | 591 pItems[item_counter].uEquipType = EQUIP_CLOAK; |
222 | 592 break; |
593 } | |
594 if ( !_strcmpi(test_string, "gauntlets") ) | |
595 { | |
365 | 596 pItems[item_counter].uEquipType = EQUIP_GAUNTLETS; |
222 | 597 break; |
598 } | |
599 if ( !_strcmpi(test_string, "boots") ) | |
600 { | |
365 | 601 pItems[item_counter].uEquipType = EQUIP_BOOTS; |
222 | 602 break; |
603 } | |
604 if ( !_strcmpi(test_string, "ring") ) | |
605 { | |
365 | 606 pItems[item_counter].uEquipType = EQUIP_RING; |
222 | 607 break; |
608 } | |
609 if ( !_strcmpi(test_string, "amulet") ) | |
610 { | |
365 | 611 pItems[item_counter].uEquipType = EQUIP_AMULET; |
222 | 612 break; |
613 } | |
614 if ( !_strcmpi(test_string, "weaponw") ) | |
615 { | |
365 | 616 pItems[item_counter].uEquipType = EQUIP_WAND; |
222 | 617 break; |
618 } | |
619 if ( !(_strcmpi(test_string, "herb")&&_strcmpi(test_string, "reagent"))) | |
620 { | |
365 | 621 pItems[item_counter].uEquipType = EQUIP_REAGENT; |
222 | 622 break; |
623 } | |
624 if ( !_strcmpi(test_string, "bottle") ) | |
625 { | |
365 | 626 pItems[item_counter].uEquipType = EQUIP_POTION; |
222 | 627 break; |
628 } | |
629 if ( !_strcmpi(test_string, "sscroll") ) | |
630 { | |
374 | 631 pItems[item_counter].uEquipType = EQUIP_SPELL_SCROLL; |
222 | 632 break; |
633 } | |
634 if ( !_strcmpi(test_string, "book") ) | |
635 { | |
365 | 636 pItems[item_counter].uEquipType = EQUIP_BOOK; |
222 | 637 break; |
638 } | |
639 if ( !_strcmpi(test_string, "mscroll") ) | |
640 { | |
374 | 641 pItems[item_counter].uEquipType = EQUIP_MESSAGE_SCROLL; |
222 | 642 break; |
643 } | |
644 if ( !_strcmpi(test_string, "gold") ) | |
645 { | |
365 | 646 pItems[item_counter].uEquipType = EQUIP_GOLD; |
222 | 647 break; |
648 } | |
649 if ( !_strcmpi(test_string, "gem") ) | |
650 { | |
365 | 651 pItems[item_counter].uEquipType = EQUIP_GEM; |
222 | 652 break; |
653 } | |
365 | 654 pItems[item_counter].uEquipType = EQUIP_NONE; |
222 | 655 break; |
656 } | |
657 case 5: //Skill Group | |
658 { | |
659 if ( !_strcmpi(test_string, "staff") ) | |
660 { | |
374 | 661 pItems[item_counter].uSkillType = PLAYER_SKILL_STAFF; |
222 | 662 break; |
663 } | |
664 if ( !_strcmpi(test_string, "sword") ) | |
665 { | |
374 | 666 pItems[item_counter].uSkillType = PLAYER_SKILL_SWORD; |
222 | 667 break; |
668 } | |
669 if ( !_strcmpi(test_string, "dagger") ) | |
670 { | |
374 | 671 pItems[item_counter].uSkillType = PLAYER_SKILL_DAGGER; |
222 | 672 break; |
673 } | |
674 if ( !_strcmpi(test_string, "axe") ) | |
675 { | |
374 | 676 pItems[item_counter].uSkillType = PLAYER_SKILL_AXE; |
222 | 677 break; |
678 } | |
679 if ( !_strcmpi(test_string, "spear") ) | |
680 { | |
374 | 681 pItems[item_counter].uSkillType = PLAYER_SKILL_SPEAR; |
222 | 682 break; |
683 } | |
684 if ( !_strcmpi(test_string, "bow") ) | |
685 { | |
374 | 686 pItems[item_counter].uSkillType = PLAYER_SKILL_BOW; |
222 | 687 break; |
688 } | |
689 if ( !_strcmpi(test_string, "mace") ) | |
690 { | |
374 | 691 pItems[item_counter].uSkillType = PLAYER_SKILL_MACE; |
222 | 692 break; |
693 } | |
694 if ( !_strcmpi(test_string, "blaster") ) | |
695 { | |
374 | 696 pItems[item_counter].uSkillType = PLAYER_SKILL_BLASTER; |
222 | 697 break; |
698 } | |
699 if ( !_strcmpi(test_string, "shield") ) | |
700 { | |
374 | 701 pItems[item_counter].uSkillType = PLAYER_SKILL_SHIELD; |
222 | 702 break; |
703 } | |
704 if ( !_strcmpi(test_string, "leather") ) | |
705 { | |
374 | 706 pItems[item_counter].uSkillType = PLAYER_SKILL_LEATHER; |
222 | 707 break; |
708 } | |
709 if ( !_strcmpi(test_string, "chain") ) | |
710 { | |
374 | 711 pItems[item_counter].uSkillType = PLAYER_SKILL_CHAIN; |
222 | 712 break; |
713 } | |
714 if ( !_strcmpi(test_string, "plate") ) | |
715 { | |
374 | 716 pItems[item_counter].uSkillType = PLAYER_SKILL_PLATE; |
222 | 717 break; |
718 } | |
719 if ( !_strcmpi(test_string, "club") ) | |
720 { | |
374 | 721 pItems[item_counter].uSkillType = PLAYER_SKILL_CLUB; |
222 | 722 break; |
723 } | |
385 | 724 pItems[item_counter].uSkillType = PLAYER_SKILL_MISC; |
222 | 725 break; |
726 } | |
727 case 6: //Mod1 | |
728 { | |
729 int ii; | |
730 char* test_char; | |
731 int tst_len; | |
732 tst_len=strlen(test_string); | |
733 pItems[item_counter].uDamageDice=0; | |
734 pItems[item_counter].uDamageRoll=0; | |
735 test_char=test_string; | |
736 for (ii=0; ii<tst_len; ++ii) | |
737 { | |
738 if (tolower(*test_char)=='d') | |
739 { | |
740 *test_char=0; | |
741 pItems[item_counter].uDamageDice=atoi(test_string); | |
742 pItems[item_counter].uDamageRoll=atoi(test_char+1); | |
743 *test_char='d'; | |
744 break; | |
745 } | |
746 ++test_char; | |
747 } | |
748 test_char=test_string; | |
749 if ((ii==tst_len)&&(tolower(*test_char)=='s')) | |
750 { | |
751 pItems[item_counter].uDamageDice=atoi(test_char+1); | |
752 pItems[item_counter].uDamageRoll=1; | |
753 } | |
754 break; | |
755 } | |
756 case 7: //Mod2 | |
757 pItems[item_counter].uDamageMod=atoi(test_string); | |
758 break; | |
759 case 8: //material | |
760 { | |
761 if ( !_strcmpi(test_string, "artifact") ) | |
762 { | |
377 | 763 pItems[item_counter].uMaterial = MATERIAL_ARTEFACT; |
222 | 764 break; |
765 } | |
766 if ( !_strcmpi(test_string, "relic") ) | |
767 { | |
377 | 768 pItems[item_counter].uMaterial = MATERIAL_RELIC; |
222 | 769 break; |
770 } | |
771 if ( !_strcmpi(test_string, "special") ) | |
772 { | |
377 | 773 pItems[item_counter].uMaterial = MATERIAL_SPECIAL; |
222 | 774 break; |
775 } | |
377 | 776 pItems[item_counter].uMaterial = MATERIAL_COMMON; |
222 | 777 break;} |
778 case 9: //ID/Rep/St | |
779 pItems[item_counter].uItemID_Rep_St=atoi(test_string); | |
780 break; | |
781 case 10: //Not identified name | |
782 pItems[item_counter].pUnidentifiedName = RemoveQuotes(test_string); | |
783 break; | |
784 case 11: //Sprite Index | |
785 pItems[item_counter].uSpriteID=atoi(test_string); | |
786 break; | |
787 case 12: //VarA | |
224 | 788 { |
222 | 789 pItems[item_counter]._additional_value=0; |
790 pItems[item_counter]._bonus_type=0; | |
377 | 791 if (pItems[item_counter].uMaterial==MATERIAL_SPECIAL) |
222 | 792 { |
224 | 793 for(int ii=0; ii<24; ++ii) |
794 { | |
795 if (stricmp(test_string,pEnchantments[ii].pBonusStat)) | |
796 { | |
797 pItems[item_counter]._bonus_type=ii+1; | |
222 | 798 break; |
224 | 799 } |
800 } | |
801 if (!pItems[item_counter]._bonus_type) | |
802 { | |
803 for(int ii=0; ii<72; ++ii) | |
804 { | |
805 if (stricmp(test_string,pSpecialEnchantments[ii].pBonusStatement)) | |
222 | 806 { |
224 | 807 pItems[item_counter]._additional_value=ii+1; |
222 | 808 } |
224 | 809 } |
810 } | |
222 | 811 } |
224 | 812 |
222 | 813 break; |
224 | 814 } |
222 | 815 case 13: //VarB |
377 | 816 if ((pItems[item_counter].uMaterial==MATERIAL_SPECIAL)&&(pItems[item_counter]._bonus_type)) |
222 | 817 { |
818 char b_s=atoi(test_string); | |
819 if (b_s) | |
820 pItems[item_counter]._bonus_strength=b_s; | |
821 else | |
822 pItems[item_counter]._bonus_strength=1; | |
823 } | |
824 else | |
825 pItems[item_counter]._bonus_strength=0; | |
826 break; | |
827 case 14: //Equip X | |
828 pItems[item_counter].uEquipX=atoi(test_string); | |
829 break; | |
830 case 15: //Equip Y | |
831 pItems[item_counter].uEquipY=atoi(test_string); | |
832 break; | |
833 case 16: //Notes | |
834 pItems[item_counter].pDescription = RemoveQuotes(test_string); | |
835 break; | |
224 | 836 |
222 | 837 } |
838 } | |
839 else | |
840 { | |
841 if (!decode_step) | |
842 break_loop = true; | |
843 } | |
844 ++decode_step; | |
845 test_string=tmp_pos+1; | |
846 } while ((decode_step<17)&&!break_loop); | |
847 ++item_counter; | |
848 if (item_counter>799) | |
849 break; | |
850 } | |
851 | |
224 | 852 |
853 pRndItemsTXT_Raw = NULL; | |
854 uAllItemsCount = item_counter; | |
855 pRndItemsTXT_Raw = (char *)pEvents_LOD->LoadRaw("rnditems.txt", 0); | |
856 strtok(pRndItemsTXT_Raw, "\r"); | |
857 strtok(NULL, "\r"); | |
858 strtok(NULL, "\r"); | |
859 strtok(NULL, "\r"); | |
860 item_counter = 0; | |
861 while (true) | |
862 { | |
863 test_string = strtok(NULL, "\r") + 1; | |
864 break_loop = false; | |
865 decode_step=0; | |
866 do | |
867 { | |
868 c = *(unsigned char*)test_string; | |
869 temp_str_len = 0; | |
870 while((c!='\t')&&(c>0)) | |
871 { | |
872 ++temp_str_len; | |
873 c=test_string[temp_str_len]; | |
874 } | |
875 tmp_pos=test_string+temp_str_len; | |
876 if (*tmp_pos == 0) | |
877 break_loop = true; | |
878 *tmp_pos = 0; | |
879 if (temp_str_len) | |
880 { | |
881 switch (decode_step) | |
882 { | |
883 case 0: | |
884 item_counter=atoi(test_string); | |
885 break; | |
886 case 2: | |
887 pItems[item_counter].uChanceByTreasureLvl1=atoi(test_string); | |
888 break; | |
889 case 3: | |
890 pItems[item_counter].uChanceByTreasureLvl2=atoi(test_string); | |
891 break; | |
892 case 4: | |
893 pItems[item_counter].uChanceByTreasureLvl3=atoi(test_string); | |
894 break; | |
895 case 5: | |
896 pItems[item_counter].uChanceByTreasureLvl4=atoi(test_string); | |
897 break; | |
898 case 6: | |
899 pItems[item_counter].uChanceByTreasureLvl5=atoi(test_string); | |
900 break; | |
901 case 7: | |
902 pItems[item_counter].uChanceByTreasureLvl6=atoi(test_string); | |
903 break; | |
904 } | |
905 } | |
906 else | |
907 { | |
908 if (!decode_step) | |
909 break_loop = true; | |
910 } | |
911 ++decode_step; | |
912 test_string=tmp_pos+1; | |
913 } while ((decode_step<8)&&!break_loop); | |
914 ++item_counter; | |
915 if (item_counter>618) | |
916 break; | |
917 } | |
918 | |
919 if ( pRndItemsTXT_Raw ) | |
920 { | |
921 pAllocator->FreeChunk(pRndItemsTXT_Raw); | |
922 pRndItemsTXT_Raw = NULL; | |
923 } | |
924 //ChanceByTreasureLvl Summ - anti cheating? | |
925 memset(&uChanceByTreasureLvlSumm, 0, 24); | |
926 for(i=0;i<6;++i) | |
927 { | |
928 for (j=0;j<800;++j) | |
929 uChanceByTreasureLvlSumm[i]+=pItems[j].uChanceByTreasureLvl[i]; | |
930 } | |
222 | 931 |
224 | 932 strtok(NULL, "\r"); |
933 strtok(NULL, "\r"); | |
934 strtok(NULL, "\r"); | |
935 strtok(NULL, "\r"); | |
936 strtok(NULL, "\r"); | |
937 for (i=0;i<3;++i) | |
938 { | |
939 test_string = strtok(NULL, "\r") + 1; | |
940 break_loop = false; | |
941 decode_step=0; | |
942 do | |
943 { | |
944 c = *(unsigned char*)test_string; | |
945 temp_str_len = 0; | |
946 while((c!='\t')&&(c>0)) | |
947 { | |
948 ++temp_str_len; | |
949 c=test_string[temp_str_len]; | |
950 } | |
951 tmp_pos=test_string+temp_str_len; | |
952 if (*tmp_pos == 0) | |
953 break_loop = true; | |
954 *tmp_pos = 0; | |
955 if (temp_str_len) | |
956 { | |
957 switch (decode_step) | |
958 { | |
959 case 2: | |
960 switch (i) | |
961 { | |
962 case 0: | |
963 uBonusChanceStandart[0]=atoi(test_string); | |
964 break; | |
965 case 1: | |
966 uBonusChanceSpecial[0]=atoi(test_string); | |
967 break; | |
968 case 2: | |
969 uBonusChanceWpSpecial[0]=atoi(test_string); | |
970 break; | |
971 } | |
972 break; | |
973 case 3: | |
974 switch (i) | |
975 { | |
976 case 0: | |
977 uBonusChanceStandart[1]=atoi(test_string); | |
978 break; | |
979 case 1: | |
980 uBonusChanceSpecial[1]=atoi(test_string); | |
981 break; | |
982 case 2: | |
983 uBonusChanceWpSpecial[1]=atoi(test_string); | |
984 break; | |
985 } | |
986 break; | |
987 case 4: | |
988 switch (i) | |
989 { | |
990 case 0: | |
991 uBonusChanceStandart[2]=atoi(test_string); | |
992 break; | |
993 case 1: | |
994 uBonusChanceSpecial[2]=atoi(test_string); | |
995 break; | |
996 case 2: | |
997 uBonusChanceWpSpecial[2]=atoi(test_string); | |
998 break; | |
999 } | |
1000 break; | |
1001 case 5: | |
1002 switch (i) | |
1003 { | |
1004 case 0: | |
1005 uBonusChanceStandart[3]=atoi(test_string); | |
1006 break; | |
1007 case 1: | |
1008 uBonusChanceSpecial[3]=atoi(test_string); | |
1009 break; | |
1010 case 2: | |
1011 uBonusChanceWpSpecial[3]=atoi(test_string); | |
1012 break; | |
1013 } | |
1014 break; | |
1015 case 6: | |
1016 switch (i) | |
1017 { | |
1018 case 0: | |
1019 uBonusChanceStandart[4]=atoi(test_string); | |
1020 break; | |
1021 case 1: | |
1022 uBonusChanceSpecial[4]=atoi(test_string); | |
1023 break; | |
1024 case 2: | |
1025 uBonusChanceWpSpecial[4]=atoi(test_string); | |
1026 break; | |
1027 } | |
1028 break; | |
1029 case 7: | |
1030 switch (i) | |
1031 { | |
1032 case 0: | |
1033 uBonusChanceStandart[5]=atoi(test_string); | |
1034 break; | |
1035 case 1: | |
1036 uBonusChanceSpecial[5]=atoi(test_string); | |
1037 break; | |
1038 case 2: | |
1039 uBonusChanceWpSpecial[5]=atoi(test_string); | |
1040 break; | |
1041 } | |
1042 break; | |
1043 } | |
1044 } | |
1045 else | |
1046 { | |
1047 if (!decode_step) | |
1048 break_loop = true; | |
1049 } | |
1050 ++decode_step; | |
1051 test_string=tmp_pos+1; | |
1052 } while ((decode_step<8)&&!break_loop); | |
1053 } | |
222 | 1054 |
224 | 1055 pSkillDescTXT_Raw = NULL; |
1056 pSkillDescTXT_Raw = (char *)pEvents_LOD->LoadRaw("skilldes.txt", 0); | |
1057 strtok(pSkillDescTXT_Raw, "\r"); | |
1058 for (i=0; i<37; ++i) | |
1059 { | |
1060 test_string = strtok(NULL, "\r") + 1; | |
1061 break_loop = false; | |
1062 decode_step=0; | |
1063 do | |
1064 { | |
1065 c = *(unsigned char*)test_string; | |
1066 temp_str_len = 0; | |
1067 while((c!='\t')&&(c>0)) | |
1068 { | |
1069 ++temp_str_len; | |
1070 c=test_string[temp_str_len]; | |
1071 } | |
1072 tmp_pos=test_string+temp_str_len; | |
1073 if (*tmp_pos == 0) | |
1074 break_loop = true; | |
1075 *tmp_pos = 0; | |
1076 if (temp_str_len) | |
1077 { | |
1078 switch (decode_step) | |
1079 { | |
1080 case 1: | |
1081 pSkillDesc[i] = RemoveQuotes(test_string); | |
1082 break; | |
1083 case 2: | |
1084 pNormalSkillDesc[i] = RemoveQuotes(test_string); | |
1085 break; | |
1086 case 3: | |
1087 pExpertSkillDesc[i] = RemoveQuotes(test_string); | |
1088 break; | |
1089 case 4: | |
1090 pMasterSkillDesc[i] = RemoveQuotes(test_string); | |
1091 break; | |
1092 case 5: | |
1093 pGrandSkillDesc[i] = RemoveQuotes(test_string); | |
1094 break; | |
1095 } | |
1096 } | |
1097 else | |
1098 { | |
1099 if (!decode_step) | |
1100 break_loop = true; | |
1101 } | |
1102 ++decode_step; | |
1103 test_string=tmp_pos+1; | |
1104 } while ((decode_step<6)&&!break_loop); | |
1105 } | |
1106 | |
1107 pStatsTXT_Raw = 0; | |
1108 pStatsTXT_Raw = (char *)pEvents_LOD->LoadRaw("stats.txt", 0); | |
1109 strtok(pStatsTXT_Raw, "\r"); | |
1110 for (i=0; i<26; ++i) | |
1111 { | |
1112 test_string = strtok(NULL, "\r") + 1; | |
1113 break_loop = false; | |
1114 decode_step=0; | |
1115 do | |
1116 { | |
1117 c = *(unsigned char*)test_string; | |
1118 temp_str_len = 0; | |
1119 while((c!='\t')&&(c>0)) | |
1120 { | |
1121 ++temp_str_len; | |
1122 c=test_string[temp_str_len]; | |
1123 } | |
1124 tmp_pos=test_string+temp_str_len; | |
1125 if (*tmp_pos == 0) | |
1126 break_loop = true; | |
1127 *tmp_pos = 0; | |
1128 if (temp_str_len) | |
1129 { | |
1130 switch (i) | |
1131 { | |
1132 case 0: | |
1133 case 1: | |
1134 case 2: | |
1135 case 3: | |
1136 case 4: | |
1137 case 5: | |
1138 case 6: | |
1139 pAttributeDescriptions[i] = RemoveQuotes(test_string); | |
1140 break; | |
1141 case 7: | |
1142 pHealthPointsAttributeDescription = RemoveQuotes(test_string); | |
1143 break; | |
1144 case 8: | |
1145 pArmourClassAttributeDescription = RemoveQuotes(test_string); | |
1146 break; | |
1147 case 9: | |
1148 pSpellPointsAttributeDescription = RemoveQuotes(test_string); | |
1149 break; | |
1150 case 10: | |
1151 pPlayerConditionAttributeDescription = RemoveQuotes(test_string); | |
1152 break; | |
1153 case 11: | |
1154 pFastSpellAttributeDescription = RemoveQuotes(test_string); | |
1155 break; | |
1156 case 12: | |
1157 pPlayerAgeAttributeDescription = RemoveQuotes(test_string); | |
1158 break; | |
1159 case 13: | |
1160 pPlayerLevelAttributeDescription = RemoveQuotes(test_string); | |
1161 break; | |
1162 case 14: | |
1163 pPlayerExperienceAttributeDescription = RemoveQuotes(test_string); | |
1164 break; | |
1165 case 15: | |
1166 pAttackBonusAttributeDescription = RemoveQuotes(test_string); | |
1167 break; | |
1168 case 16: | |
1169 pAttackDamageAttributeDescription = RemoveQuotes(test_string); | |
1170 break; | |
1171 case 17: | |
1172 pMissleBonusAttributeDescription = RemoveQuotes(test_string); | |
1173 break; | |
1174 case 18: | |
1175 pMissleDamageAttributeDescription = RemoveQuotes(test_string); | |
1176 break; | |
1177 case 19: | |
1178 pFireResistanceAttributeDescription = RemoveQuotes(test_string); | |
1179 break; | |
1180 case 20: | |
1181 pAirResistanceAttributeDescription = RemoveQuotes(test_string); | |
1182 break; | |
1183 case 21: | |
1184 pWaterResistanceAttributeDescription = RemoveQuotes(test_string); | |
1185 break; | |
1186 case 22: | |
1187 pEarthResistanceAttributeDescription = RemoveQuotes(test_string); | |
1188 break; | |
1189 case 23: | |
1190 pMindResistanceAttributeDescription = RemoveQuotes(test_string); | |
1191 break; | |
1192 case 24: | |
1193 pBodyResistanceAttributeDescription = RemoveQuotes(test_string); | |
1194 break; | |
1195 case 25: | |
1196 pSkillPointsAttributeDescription = RemoveQuotes(test_string); | |
1197 break; | |
1198 } | |
1199 } | |
1200 else | |
1201 { | |
1202 if (!decode_step) | |
1203 break_loop = true; | |
1204 } | |
1205 ++decode_step; | |
1206 test_string=tmp_pos+1; | |
1207 } while ((decode_step<2)&&!break_loop); | |
1208 } | |
222 | 1209 |
1210 | |
224 | 1211 pClassTXT_Raw = 0; |
1212 pClassTXT_Raw = (char *)pEvents_LOD->LoadRaw("class.txt", 0); | |
1213 strtok(pClassTXT_Raw, "\r"); | |
1214 for (i=0; i<36; ++i) | |
1215 { | |
1216 test_string = strtok(NULL, "\r") + 1; | |
1217 break_loop = false; | |
1218 decode_step=0; | |
1219 do | |
1220 { | |
1221 c = *(unsigned char*)test_string; | |
1222 temp_str_len = 0; | |
1223 while((c!='\t')&&(c>0)) | |
1224 { | |
1225 ++temp_str_len; | |
1226 c=test_string[temp_str_len]; | |
1227 } | |
1228 tmp_pos=test_string+temp_str_len; | |
1229 if (*tmp_pos == 0) | |
1230 break_loop = true; | |
1231 *tmp_pos = 0; | |
1232 if (temp_str_len) | |
1233 { | |
229 | 1234 //if(i) |
224 | 1235 pClassDescriptions[i]=RemoveQuotes(test_string); |
1236 } | |
1237 else | |
1238 { | |
1239 if (!decode_step) | |
1240 break_loop = true; | |
1241 } | |
1242 ++decode_step; | |
1243 test_string=tmp_pos+1; | |
1244 } while ((decode_step<2)&&!break_loop); | |
1245 } | |
222 | 1246 |
224 | 1247 } |
0 | 1248 |
1249 //----- (00456D17) -------------------------------------------------------- | |
1250 void ItemsTable::SetSpecialBonus(ItemGen *pItem) | |
1251 { | |
385 | 1252 if ( pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL ) |
0 | 1253 { |
385 | 1254 pItem->uEncantmentType = pItems[pItem->uItemID]._bonus_type; |
1255 pItem->uSpecEnchantmentType = pItems[pItem->uItemID]._additional_value; | |
1256 pItem->_bonus_strength = pItems[pItem->uItemID]._bonus_strength; | |
0 | 1257 } |
1258 } | |
1259 | |
1260 //----- (00456D43) -------------------------------------------------------- | |
377 | 1261 bool ItemsTable::IsMaterialSpecial(ItemGen *pItem) |
0 | 1262 { |
377 | 1263 return this->pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL; |
0 | 1264 } |
1265 | |
1266 //----- (00456D5E) -------------------------------------------------------- | |
377 | 1267 bool ItemsTable::IsMaterialNonCommon(ItemGen *pItem) |
0 | 1268 { |
385 | 1269 return pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL || |
1270 pItems[pItem->uItemID].uMaterial == MATERIAL_RELIC || | |
1271 pItems[pItem->uItemID].uMaterial == MATERIAL_ARTEFACT; | |
0 | 1272 } |
1273 | |
1274 | |
1275 //----- (00453B3C) -------------------------------------------------------- | |
1276 void ItemsTable::LoadPotions() | |
222 | 1277 { |
0 | 1278 |
222 | 1279 CHAR Text[90]; // [sp+Ch] [bp-6Ch]@26 |
1280 char* test_string; | |
1281 unsigned int uRow; | |
1282 unsigned int uColumn; | |
1283 unsigned __int8 potion_value; | |
1284 | |
1285 if ( pPotionsTXT_Raw ) | |
1286 pAllocator->FreeChunk(pPotionsTXT_Raw); | |
1287 pPotionsTXT_Raw = NULL; | |
1288 pPotionsTXT_Raw = (char *)pEvents_LOD->LoadRaw("potion.txt", 0); | |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1289 test_string = strtok(pPotionsTXT_Raw,"\t\r\n"); |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1290 while ( 1 ) |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1291 { |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1292 if ( !test_string ) |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1293 { |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1294 MessageBoxA(0, "Error Pre-Parsing Potion Table", "Load Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1295 return; |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1296 } |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1297 if ( !strcmp(test_string, "222") ) |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1298 break; |
222 | 1299 |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1300 test_string = strtok(NULL, "\t\r\n"); |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1301 } |
222 | 1302 while ( 1 ) |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1303 { |
222 | 1304 test_string = strtok(NULL, "\t\r\n"); |
1305 | |
1306 if ( !test_string ) | |
1307 { | |
1308 MessageBoxA(0, "Error Pre-Parsing Potion Table", "Load Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); | |
1309 return; | |
1310 } | |
1311 if ( !strcmp(test_string, "222") ) | |
1312 break; | |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1313 } |
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1314 |
222 | 1315 for (uRow = 0;uRow < 50; ++uRow) |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1316 { |
222 | 1317 int skip_count; |
1318 for (skip_count = 0;skip_count < 6; ++skip_count) | |
1319 { | |
1320 if ( !strtok(NULL, "\r\t\n") ) | |
1321 break; | |
1322 } | |
1323 if ( skip_count != 6 ) | |
1324 break; | |
1325 for (uColumn = 0; uColumn < 50; ++uColumn) | |
1326 { | |
1327 test_string = strtok(NULL, "\r\t\n"); | |
1328 if ( !test_string ) | |
1329 break; | |
1330 potion_value = atoi(test_string); | |
233 | 1331 unsigned char c=*test_string; |
222 | 1332 if ( !potion_value ) |
1333 { | |
1334 if ( tolower(c) == 'e' ) | |
1335 potion_value = atoi(test_string + 1); | |
1336 else | |
1337 potion_value = 0; | |
1338 } | |
1339 this->potion_data[uRow][uColumn]=potion_value; | |
1340 } | |
1341 if ( uColumn != 50 ) | |
1342 break; | |
1343 strtok(NULL, "\r\t\n"); | |
1344 } | |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
189
diff
changeset
|
1345 |
222 | 1346 if ( uRow != 50 ) |
1347 { | |
1348 wsprintfA(Text, "Error Parsing Potion Table at Row: %d Column: %d", uRow, uColumn); | |
1349 MessageBoxA(0, Text, "Parsing Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); | |
1350 } | |
1351 if ( pPotionsTXT_Raw ) | |
1352 { | |
1353 pAllocator->FreeChunk(pPotionsTXT_Raw); | |
1354 pPotionsTXT_Raw = 0; | |
1355 } | |
1356 } | |
0 | 1357 |
1358 //----- (00453CE5) -------------------------------------------------------- | |
1359 void ItemsTable::LoadPotionNotes() | |
222 | 1360 { |
1361 | |
1362 CHAR Text[90]; | |
1363 char* test_string; | |
1364 unsigned int uRow; | |
1365 unsigned int uColumn; | |
1366 unsigned __int8 potion_note; | |
1367 | |
1368 if ( pPotionNotesTXT_Raw ) | |
1369 pAllocator->FreeChunk(pPotionNotesTXT_Raw); | |
1370 pPotionNotesTXT_Raw = NULL; | |
1371 pPotionNotesTXT_Raw = (char *)pEvents_LOD->LoadRaw("potnotes.txt", 0); | |
1372 test_string = strtok(pPotionNotesTXT_Raw ,"\t\r\n"); | |
1373 while ( 1 ) | |
1374 { | |
1375 if ( !test_string ) | |
1376 { | |
1377 MessageBoxA(0, "Error Pre-Parsing Potion Table", "Load Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); | |
1378 return; | |
1379 } | |
1380 if ( !strcmp(test_string, "222") ) | |
1381 break; | |
1382 test_string = strtok(NULL, "\t\r\n"); | |
1383 } | |
1384 while ( 1 ) | |
1385 { | |
1386 test_string = strtok(NULL, "\t\r\n"); | |
1387 | |
1388 if ( !test_string ) | |
1389 { | |
1390 MessageBoxA(0, "Error Pre-Parsing Potion Table", "Load Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); | |
1391 return; | |
1392 } | |
1393 if ( !strcmp(test_string, "222") ) | |
1394 break; | |
1395 } | |
0 | 1396 |
222 | 1397 for (uRow = 0;uRow < 50; ++uRow) |
1398 { | |
1399 int skip_count; | |
1400 for (skip_count = 0;skip_count < 6; ++skip_count) | |
1401 { | |
1402 if ( !strtok(NULL, "\r\t\n") ) | |
1403 break; | |
1404 } | |
1405 if ( skip_count != 6 ) | |
1406 break; | |
1407 for (uColumn = 0; uColumn < 50; ++uColumn) | |
1408 { | |
1409 test_string = strtok(NULL, "\r\t\n"); | |
1410 if ( !test_string ) | |
1411 break; | |
1412 potion_note = atoi(test_string); | |
233 | 1413 unsigned char c=*test_string; |
222 | 1414 if ( !potion_note ) |
1415 { | |
1416 if ( tolower(c) == 'e' ) | |
1417 potion_note = atoi(test_string + 1); | |
1418 else | |
1419 potion_note = 0; | |
1420 } | |
1421 this->potion_note[uRow][uColumn]=potion_note; | |
1422 } | |
1423 if ( uColumn != 50 ) | |
1424 break; | |
1425 strtok(NULL, "\r\t\n"); | |
1426 } | |
1427 if ( uRow != 50 ) | |
1428 { | |
1429 wsprintfA(Text, "Error Parsing Potion Table at Row: %d Column: %d", uRow, uColumn); | |
1430 MessageBoxA(0, Text, "Parsing Error", MB_ICONHAND|MB_CANCELTRYCONTINUE); | |
1431 } | |
1432 } | |
0 | 1433 |
1434 | |
1435 //----- (00456442) -------------------------------------------------------- | |
1436 unsigned int ItemGen::GetValue() | |
463 | 1437 { |
1438 unsigned int uBaseValue; // edi@1 | |
1439 unsigned int bonus; | |
0 | 1440 |
463 | 1441 uBaseValue = pItemsTable->pItems[this->uItemID].uValue; |
1442 if ( this->uAttributes & ITEM_TEMP_BONUS || pItemsTable->IsMaterialNonCommon(this) ) | |
1443 return uBaseValue; | |
1444 if (uEncantmentType ) | |
1445 return uBaseValue + 100 * _bonus_strength;; | |
1446 if (uSpecEnchantmentType ) | |
1447 { | |
1448 bonus = pItemsTable->pSpecialEnchantments[uSpecEnchantmentType].iTreasureLevel; | |
1449 if ( bonus > 10 ) | |
1450 return uBaseValue + bonus; | |
1451 else | |
1452 return uBaseValue * bonus; | |
1453 } | |
1454 return uBaseValue; | |
1455 } | |
0 | 1456 |
1457 //----- (00456499) -------------------------------------------------------- | |
1458 const char *ItemGen::GetDisplayName() | |
1459 { | |
366 | 1460 if (Identified()) |
1461 return GetIdentifiedName(); | |
0 | 1462 else |
366 | 1463 return pItemsTable->pItems[uItemID].pUnidentifiedName; |
0 | 1464 } |
1465 | |
1466 //----- (004564B3) -------------------------------------------------------- | |
1467 const char *ItemGen::GetIdentifiedName() | |
1468 { | |
377 | 1469 unsigned __int8 equip_type; |
1470 const char *player_name; | |
1471 const char *nameModificator; | |
1472 const char *format_str; | |
0 | 1473 |
377 | 1474 equip_type = pItemsTable->pItems[uItemID].uEquipType; |
1475 if ( (equip_type == EQUIP_REAGENT) || (equip_type == EQUIP_POTION) || (equip_type == EQUIP_GOLD) ) | |
0 | 1476 { |
377 | 1477 sprintf(item__getname_buffer, "%s", pItemsTable->pItems[uItemID].pName); |
1478 return item__getname_buffer; | |
0 | 1479 } |
377 | 1480 sprintf(item__getname_buffer, "%s", pItemsTable->pItems[uItemID].pName); |
1481 if ( uItemID == ITEM_LICH_JAR ) //Lich Jar | |
0 | 1482 { |
377 | 1483 if ( (uHolderPlayer >0 )&& (uHolderPlayer <= 4) ) |
0 | 1484 { |
377 | 1485 player_name = pPlayers[uHolderPlayer]->pName; |
1486 strlen(player_name); | |
1487 if ( player_name[strlen(player_name) - 1] == 's' ) | |
1488 format_str = pGlobalTXT_LocalizationStrings[655]; //"%s' Jar" | |
0 | 1489 else |
377 | 1490 format_str = pGlobalTXT_LocalizationStrings[654]; //"%s's Jar" |
1491 sprintf(item__getname_buffer, format_str, pPlayers[uHolderPlayer]->pName); | |
1492 return item__getname_buffer; | |
0 | 1493 } |
1494 } | |
377 | 1495 if ( !pItemsTable->IsMaterialNonCommon(this) ) |
0 | 1496 { |
377 | 1497 if ( uEncantmentType ) |
0 | 1498 { |
1499 strcat(item__getname_buffer, " "); | |
377 | 1500 nameModificator = pItemsTable->pEnchantments[uEncantmentType-1].pOfName; |
0 | 1501 } |
1502 else | |
1503 { | |
377 | 1504 if ( !uSpecEnchantmentType ) |
1505 return item__getname_buffer; | |
1506 if ( uSpecEnchantmentType == 16 //Drain Hit Points from target. | |
1507 || uSpecEnchantmentType == 39 //Double damage vs Demons. | |
1508 || uSpecEnchantmentType == 40 //Double damage vs Dragons | |
1509 || uSpecEnchantmentType == 45 //+5 Speed and Accuracy | |
1510 || uSpecEnchantmentType == 56 //+5 Might and Endurance. | |
1511 || uSpecEnchantmentType == 57 //+5 Intellect and Personality. | |
1512 || uSpecEnchantmentType == 58 //Increased Value. | |
1513 || uSpecEnchantmentType == 60 //+3 Unarmed and Dodging skills | |
1514 || uSpecEnchantmentType == 61 //+3 Stealing and Disarm skills. | |
1515 || uSpecEnchantmentType == 59 //Increased Weapon speed. | |
1516 || uSpecEnchantmentType == 63 //Double Damage vs. Elves. | |
1517 || uSpecEnchantmentType == 64 //Double Damage vs. Undead. | |
1518 || uSpecEnchantmentType == 67 //Adds 5 points of Body damage and +2 Disarm skill. | |
1519 || uSpecEnchantmentType == 68 ) //Adds 6-8 points of Cold damage and +5 Armor Class. | |
1520 { //enchantment and name positions inverted! | |
1521 sprintf( item__getname_buffer, "%s %s", | |
1522 pItemsTable->pSpecialEnchantments[uSpecEnchantmentType-1].pNameAdd, | |
1523 pItemsTable->pItems[uItemID].pName); | |
1524 return item__getname_buffer; | |
0 | 1525 } |
1526 strcat(item__getname_buffer, " "); | |
377 | 1527 nameModificator = pItemsTable->pSpecialEnchantments[uSpecEnchantmentType-1].pNameAdd; |
0 | 1528 } |
377 | 1529 strcat(item__getname_buffer, nameModificator); |
0 | 1530 } |
377 | 1531 return item__getname_buffer; |
0 | 1532 } |
1533 | |
1534 | |
1535 //----- (00456620) -------------------------------------------------------- | |
385 | 1536 void ItemsTable::GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *out_item) |
0 | 1537 { |
294 | 1538 |
1539 ItemGen *v4; // esi@1 | |
1540 ItemsTable *v5; // edi@1 | |
0 | 1541 int v6; // ebx@3 |
1542 int *v7; // ecx@33 | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1543 //int v8; // eax@34 |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1544 //int v9; // eax@39 |
0 | 1545 int v10; // ebx@43 |
1546 int v11; // ecx@47 | |
1547 unsigned int *v12; // edx@48 | |
1548 unsigned int v13; // eax@49 | |
1549 signed int v14; // ebx@52 | |
1550 int v15; // eax@53 | |
1551 signed int v16; // eax@55 | |
1552 int v17; // ebx@57 | |
1553 int v18; // edx@62 | |
1554 signed int v19; // ebx@70 | |
1555 unsigned __int8 v20; // al@81 | |
1556 int v21; // eax@84 | |
1557 int v22; // ebx@85 | |
1558 int v23; // eax@86 | |
1559 int v24; // ebx@86 | |
1560 int v25; // edx@86 | |
1561 int v26; // edx@89 | |
1562 unsigned int v27; // eax@89 | |
1563 int i; // ebx@89 | |
1564 unsigned int v29; // ecx@90 | |
1565 int v30; // ebx@91 | |
1566 int v31; // eax@91 | |
1567 int v32; // ecx@91 | |
1568 int v33; // eax@91 | |
1569 int v34; // eax@97 | |
1570 unsigned __int8 v35; // sf@97 | |
1571 unsigned __int8 v36; // of@97 | |
1572 int v37; // ebx@98 | |
1573 int v38; // edx@99 | |
1574 signed int v39; // ebx@101 | |
1575 int v40; // ecx@102 | |
1576 char v41; // zf@107 | |
1577 char v42; // al@108 | |
1578 char v43; // al@111 | |
1579 int *v44; // edx@118 | |
1580 int v45; // eax@120 | |
1581 int v46; // edx@120 | |
1582 int *j; // eax@121 | |
1583 unsigned int v48; // ecx@123 | |
1584 int v49; // eax@123 | |
1585 int v50; // eax@123 | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1586 int Dst[800]; // [sp+Ch] [bp-C88h]@33 |
0 | 1587 int v52; // [sp+C8Ch] [bp-8h]@33 |
294 | 1588 int v53; // [sp+C90h] [bp-4h]@1 |
1589 int v54; // [sp+C9Ch] [bp+8h]@3 | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1590 //int v55; // [sp+CA0h] [bp+Ch]@34 |
0 | 1591 signed int v56; // [sp+CA0h] [bp+Ch]@55 |
1592 int v57; // [sp+CA0h] [bp+Ch]@62 | |
1593 int *v58; // [sp+CA0h] [bp+Ch]@102 | |
1594 int v59; // [sp+CA0h] [bp+Ch]@123 | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1595 //signed int a2a; // [sp+CA4h] [bp+10h]@33 |
0 | 1596 int a2b; // [sp+CA4h] [bp+10h]@101 |
1597 int a2c; // [sp+CA4h] [bp+10h]@120 | |
1598 | |
294 | 1599 v53 = -1; |
1600 v5 = this; | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1601 if (!out_item) |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1602 out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen"); |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1603 memset(out_item, 0, sizeof(*out_item)); |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1604 |
294 | 1605 v4 = out_item; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1606 v6 = treasure_level - 1; |
385 | 1607 v54 = treasure_level - 1; |
1608 if ( uTreasureType ) //generate known treasure type | |
0 | 1609 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1610 ITEM_EQUIP_TYPE requested_equip; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1611 PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID; |
385 | 1612 switch (uTreasureType) |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1613 { |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1614 case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1615 case 21: requested_equip = EQUIP_ARMOUR; break; |
385 | 1616 case 22: requested_skill = PLAYER_SKILL_MISC; break; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1617 case 23: requested_skill = PLAYER_SKILL_SWORD; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1618 case 24: requested_skill = PLAYER_SKILL_DAGGER; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1619 case 25: requested_skill = PLAYER_SKILL_AXE; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1620 case 26: requested_skill = PLAYER_SKILL_SPEAR; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1621 case 27: requested_skill = PLAYER_SKILL_BOW; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1622 case 28: requested_skill = PLAYER_SKILL_MACE; break; |
385 | 1623 case 29: requested_skill = PLAYER_SKILL_CLUB; break; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1624 case 30: requested_skill = PLAYER_SKILL_STAFF; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1625 case 31: requested_skill = PLAYER_SKILL_LEATHER; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1626 case 32: requested_skill = PLAYER_SKILL_CHAIN; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1627 case 33: requested_skill = PLAYER_SKILL_PLATE; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1628 case 34: requested_equip = EQUIP_SHIELD; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1629 case 35: requested_equip = EQUIP_HELMET; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1630 case 36: requested_equip = EQUIP_BELT; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1631 case 37: requested_equip = EQUIP_CLOAK; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1632 case 38: requested_equip = EQUIP_GAUNTLETS; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1633 case 39: requested_equip = EQUIP_BOOTS; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1634 case 40: requested_equip = EQUIP_RING; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1635 case 41: requested_equip = EQUIP_AMULET; break; |
295 | 1636 case 42: requested_equip = EQUIP_WAND; break; |
374 | 1637 case 43: requested_equip = EQUIP_SPELL_SCROLL; break; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1638 case 44: requested_equip = EQUIP_POTION; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1639 case 45: requested_equip = EQUIP_REAGENT; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1640 case 46: requested_equip = EQUIP_GEM; break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1641 default: |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1642 __debugbreak(); // check this condition |
385 | 1643 requested_equip = (ITEM_EQUIP_TYPE)(uTreasureType - 1); |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1644 break; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1645 } |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1646 memset(Dst, 0, sizeof(Dst)); |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1647 v52 = 0; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1648 v7 = Dst; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1649 //a2a = 1; |
385 | 1650 if (requested_skill == PLAYER_SKILL_INVALID) // no skill for this item needed |
0 | 1651 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1652 for (uint i = 1; i < 500; ++i) |
0 | 1653 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1654 if (pItems[i].uEquipType == requested_equip) |
0 | 1655 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1656 *v7++ = i; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1657 v52 += pItems[i].uChanceByTreasureLvl[v6]; |
0 | 1658 } |
1659 } | |
1660 } | |
385 | 1661 else //have needed skill |
0 | 1662 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1663 for (uint i = 1; i < 500; ++i) |
0 | 1664 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1665 if (pItems[i].uSkillType == requested_skill) |
0 | 1666 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1667 *v7++ = i; |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1668 v52 += pItems[i].uChanceByTreasureLvl[v6]; |
0 | 1669 } |
1670 } | |
1671 } | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1672 |
0 | 1673 v10 = 0; |
1674 if ( v52 ) | |
1675 v10 = rand() % v52; | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1676 |
385 | 1677 out_item->uItemID = *Dst; |
1678 if (!out_item->uItemID) | |
1679 out_item->uItemID = 1; | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1680 |
385 | 1681 v11 = pItems[out_item->uItemID].uChanceByTreasureLvl[v6]; |
0 | 1682 if ( v11 < v10 ) |
1683 { | |
1684 v12 = (uint *)Dst; | |
1685 do | |
1686 { | |
1687 ++v12; | |
1688 v13 = *v12; | |
385 | 1689 out_item->uItemID = *v12; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1690 v11 += pItems[v13].uChanceByTreasureLvl[v6]; |
0 | 1691 } |
1692 while ( v11 < v10 ); | |
1693 } | |
385 | 1694 |
1695 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) | |
1696 {// if it potion set potion spec | |
1697 out_item->uEncantmentType = 0; | |
1698 for (int i=0; i<2; ++i) | |
1699 out_item->uEncantmentType += rand() % 4 + 1; | |
1700 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; | |
0 | 1701 } |
1702 } | |
1703 else | |
1704 { | |
1705 v16 = 0; | |
1706 v56 = 0; | |
1707 do | |
484 | 1708 v56 += pParty->pIsArtifactFound[v16++]; |
0 | 1709 while ( v16 < 29 ); |
1710 v17 = rand() % 29; | |
385 | 1711 |
484 | 1712 if ( v6 == 5 && rand() % 100 < 5 && !pParty->pIsArtifactFound[v17] && v56 < 13 ) |
0 | 1713 { |
484 | 1714 pParty->pIsArtifactFound[v17] = 1; |
385 | 1715 out_item->uAttributes = 0; |
1716 out_item->uItemID = v17 + 500; | |
1717 SetSpecialBonus(out_item); | |
0 | 1718 return; |
1719 } | |
385 | 1720 |
0 | 1721 v57 = 0; |
294 | 1722 v18 = rand() % v5->uChanceByTreasureLvlSumm[v54];// v5->field_11684[v54]; |
385 | 1723 out_item->uItemID = 0; |
0 | 1724 if ( v18 > 0 ) |
1725 { | |
1726 do | |
385 | 1727 v57 += pItems[out_item->uItemID++ + 1].uChanceByTreasureLvl[v6]; |
0 | 1728 while ( v57 < v18 ); |
1729 } | |
385 | 1730 |
0 | 1731 if ( !v18 ) |
385 | 1732 out_item->uItemID = 1; |
1733 if ( !out_item->uItemID ) | |
1734 out_item->uItemID = 1; | |
1735 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) | |
1736 {// if it potion set potion spec | |
1737 out_item->uEncantmentType = 0; | |
1738 for (int i=0; i<2; ++i) | |
1739 out_item->uEncantmentType += rand() % 4 + 1; | |
1740 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; | |
1741 } | |
1742 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; | |
0 | 1743 } |
1744 if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION | |
484 | 1745 && !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, 239) ) |
0 | 1746 v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST; |
222 | 1747 if ( pItemsTable->pItems[v4->uItemID + 1].uItemID_Rep_St ) |
0 | 1748 v4->uAttributes = 0; |
1749 else | |
1750 v4->uAttributes = 1; | |
385 | 1751 if ( pItems[out_item->uItemID].uEquipType != EQUIP_POTION ) |
0 | 1752 { |
385 | 1753 out_item->uSpecEnchantmentType = 0; |
1754 out_item->uEncantmentType = 0; | |
0 | 1755 } |
385 | 1756 v20 = pItems[out_item->uItemID].uEquipType; |
0 | 1757 if ( v20 <= EQUIP_BOW ) |
1758 { | |
294 | 1759 v37 = v5->uBonusChanceWpSpecial[v54]; |
436 | 1760 if ( !v37 ) |
0 | 1761 return; |
1762 v38 = rand() % 100; | |
436 | 1763 v36 = __OFSUB__(v38, v37); |
1764 v35 = v38 - v37 < 0; | |
0 | 1765 } |
1766 else | |
1767 { | |
1768 if ( v20 > EQUIP_AMULET ) | |
1769 { | |
295 | 1770 if ( v20 == EQUIP_WAND ) |
0 | 1771 { |
1772 v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1; | |
385 | 1773 out_item->uNumCharges = v21; |
1774 out_item->uMaxCharges = v21; | |
0 | 1775 } |
1776 return; | |
1777 } | |
436 | 1778 v22 = uBonusChanceStandart[v6]; |
1779 if ( !v22 ) | |
0 | 1780 return; |
436 | 1781 v24 = v22; |
385 | 1782 v25 = rand() % 100; |
1783 if ( !uBonusChanceSpecial[v6] && !(v25 < v24)) | |
224 | 1784 return; |
385 | 1785 if ( v25 < v24 || v25 < v24) |
0 | 1786 { |
385 | 1787 v26 = rand() % v5->uBonusChanceWpSpecial[v5->pItems[v4->uItemID].uEquipType + 3]; |
0 | 1788 v27 = v4->uItemID; |
377 | 1789 v4->uEncantmentType = 0; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1790 for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1]; |
0 | 1791 i < v26; |
377 | 1792 i += pEnchantments[v4->uEncantmentType].to_item[pItems[v29].uEquipType + 1] ) |
0 | 1793 { |
1794 v29 = v4->uItemID; | |
377 | 1795 ++v4->uEncantmentType; |
0 | 1796 } |
377 | 1797 ++v4->uEncantmentType; |
224 | 1798 v30 = 10;// v5->field_116D8[2 * v54 + 12]; |
0 | 1799 v31 = rand(); |
377 | 1800 v32 = v4->uEncantmentType - 1; |
224 | 1801 v33 = v31 % 10;//(v5->field_116D8[2 * v54 + 13] - v30 + 1) + v30; |
0 | 1802 v4->_bonus_strength = v33; |
1803 if ( v32 == 21 || v32 == 22 || v32 == 23 ) | |
1804 v4->_bonus_strength = v33 >> 1; | |
1805 if ( v4->_bonus_strength <= 0 ) | |
1806 v4->_bonus_strength = 1; | |
1807 return; | |
1808 } | |
224 | 1809 v34 = v24 + 10;//*(unsigned int *)&v5->field_1169C[4 * v54 + 24]; |
0 | 1810 v36 = __OFSUB__(v25, v34); |
1811 v35 = v25 - v34 < 0; | |
1812 } | |
1813 if ( !(v35 ^ v36) ) | |
1814 return; | |
1815 memset(&Dst, 0, 0xC80u); | |
1816 v39 = 0; | |
1817 a2b = 0; | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1818 if ( pSpecialEnchantments_count > 0 ) |
0 | 1819 { |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1820 v52 = -16 - (uint)this; |
0 | 1821 v58 = (int *)&Dst; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1822 v40 = (int)&pSpecialEnchantments[1]; |
0 | 1823 do |
1824 { | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1825 switch ( v6 ) |
0 | 1826 { |
1827 case 2: | |
1828 if ( !*(unsigned char *)v40 ) | |
245 | 1829 { |
1830 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType); | |
1831 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) ) | |
1832 { | |
1833 v44 = v58; | |
1834 ++v58; | |
1835 *v44 = a2b; | |
1836 } | |
1837 ++a2b; | |
1838 v40 += 28; | |
1839 continue; | |
1840 } | |
0 | 1841 v41 = *(unsigned char *)v40 == 1; |
1842 break; | |
1843 case 3: | |
1844 v43 = *(unsigned char *)v40; | |
1845 if ( !*(unsigned char *)v40 || v43 == 1 ) | |
1846 { | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1847 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType); |
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1848 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) ) |
0 | 1849 { |
1850 v44 = v58; | |
1851 ++v58; | |
1852 *v44 = a2b; | |
1853 } | |
245 | 1854 ++a2b; |
1855 v40 += 28; | |
1856 continue; | |
0 | 1857 } |
1858 v41 = v43 == 2; | |
1859 break; | |
1860 case 4: | |
1861 v42 = *(unsigned char *)v40; | |
1862 if ( *(unsigned char *)v40 == 1 || v42 == 2 ) | |
245 | 1863 { |
1864 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType); | |
1865 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) ) | |
1866 { | |
1867 v44 = v58; | |
1868 ++v58; | |
1869 *v44 = a2b; | |
1870 } | |
1871 ++a2b; | |
1872 v40 += 28; | |
1873 continue; | |
1874 } | |
0 | 1875 v41 = v42 == 3; |
1876 break; | |
1877 default: | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1878 if ( v6 != 5 ) |
245 | 1879 { |
1880 ++a2b; | |
1881 v40 += 28; | |
1882 continue; | |
1883 } | |
0 | 1884 v41 = *(unsigned char *)v40 == 3; |
1885 break; | |
1886 } | |
1887 if ( v41 ) | |
245 | 1888 { |
1889 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType); | |
1890 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) ) | |
1891 { | |
1892 v44 = v58; | |
1893 ++v58; | |
1894 *v44 = a2b; | |
1895 } | |
1896 } | |
0 | 1897 LABEL_119: |
1898 ++a2b; | |
1899 v40 += 28; | |
1900 } | |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1901 while ( a2b < pSpecialEnchantments_count ); |
0 | 1902 } |
1903 v45 = rand(); | |
377 | 1904 v4->uSpecEnchantmentType = *(uint *)Dst; |
0 | 1905 v46 = v45 % v39 + 1; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1906 a2c = *((unsigned char *)&uAllItemsCount + 28 * (*(uint *)Dst + 1389) + pItems[v4->uItemID].uEquipType); |
0 | 1907 if ( a2c < v46 ) |
1908 { | |
1909 for ( j = (int *)&Dst; ; j = (int *)v59 ) | |
1910 { | |
1911 v48 = v4->uItemID; | |
1912 v49 = (int)(j + 1); | |
1913 v59 = v49; | |
1914 v50 = *(unsigned int *)v49; | |
377 | 1915 v4->uSpecEnchantmentType = v50; |
228
46ae2602aceb
Item generation doesn't crash (thou still generates weird stuff)
Nomad
parents:
224
diff
changeset
|
1916 a2c += *((unsigned char *)&uAllItemsCount + 28 * (v50 + 1389) + pItems[v48].uEquipType); |
0 | 1917 if ( a2c >= v46 ) |
1918 break; | |
1919 } | |
1920 } | |
377 | 1921 ++v4->uSpecEnchantmentType; |
0 | 1922 } |
1923 | |
1924 //----- (004505CC) -------------------------------------------------------- | |
1925 bool ItemGen::GenerateArtifact() | |
1926 { | |
1927 signed int uNumArtifactsNotFound; // esi@1 | |
463 | 1928 int artifacts_list[32]; |
0 | 1929 |
385 | 1930 memset(artifacts_list, 0,sizeof(artifacts_list)); |
0 | 1931 uNumArtifactsNotFound = 0; |
385 | 1932 |
1933 for (int i=500;i<529;++i) | |
484 | 1934 if ( !pParty->pIsArtifactFound[i-500] ) |
385 | 1935 artifacts_list[uNumArtifactsNotFound++] = i; |
1936 | |
1937 Reset(); | |
0 | 1938 if ( uNumArtifactsNotFound ) |
1939 { | |
385 | 1940 uItemID = artifacts_list[rand() % uNumArtifactsNotFound]; |
1941 pItemsTable->SetSpecialBonus(this); | |
1942 return true; | |
0 | 1943 } |
1944 else | |
385 | 1945 return false; |
1946 | |
0 | 1947 } |
461 | 1948 //----- (004B8E3D) -------------------------------------------------------- |
463 | 1949 void GenerateStandartShopItems() |
1950 { | |
1951 signed int item_count; | |
1952 signed int shop_index; | |
1953 int treasure_lvl; | |
1954 int item_class; | |
1955 int mdf; | |
1956 | |
1957 shop_index = (signed int)window_SpeakInHouse->ptr_1C; | |
1958 if ( uItemsAmountPerShopType[p2DEvents[shop_index - 1].uType] ) | |
1959 { | |
1960 for (item_count=0; item_count<=uItemsAmountPerShopType[p2DEvents[shop_index - 1].uType]; ++item_count ) | |
1961 { | |
1962 if (shop_index<=14) //weapon shop | |
1963 { | |
1964 treasure_lvl = shopWeap_variation_ord[shop_index].treasure_level; | |
1965 item_class =shopWeap_variation_ord[shop_index].item_class[rand() % 4]; | |
1966 } | |
1967 else if (shop_index<=28) //armor shop | |
1968 { | |
1969 mdf =0; | |
1970 if (item_count > 3) | |
1971 ++mdf;// rechek offsets | |
1972 treasure_lvl = shopArmr_variation_ord[2*(shop_index-15)+mdf].treasure_level; | |
1973 item_class =shopArmr_variation_ord[2*(shop_index-15)+mdf].item_class[rand() % 4]; | |
1974 } | |
1975 else if (shop_index<=41) //magic shop | |
1976 { | |
1977 treasure_lvl = shopMagic_treasure_lvl[shop_index-28]; | |
1978 item_class = 22; //misc | |
1979 } | |
1980 else if (shop_index<=53) //alchemist shop | |
1981 { | |
1982 if (item_count<6) | |
1983 { | |
1984 pParty->StandartItemsInShops[shop_index][item_count].Reset(); | |
1985 pParty->StandartItemsInShops[shop_index][item_count].uItemID = 220; //potion bottle | |
1986 continue; | |
1987 } | |
1988 else | |
1989 { | |
1990 treasure_lvl = shopAlch_treasure_lvl[shop_index-41]; | |
1991 item_class = 45; //reagent | |
1992 } | |
1993 } | |
1994 pItemsTable->GenerateItem(treasure_lvl, item_class, &pParty->StandartItemsInShops[shop_index][item_count]); | |
1995 pParty->StandartItemsInShops[shop_index][item_count].SetIdentified(); //identified | |
1996 } | |
1997 } | |
1998 pParty->InTheShopFlags[shop_index] = 0; | |
1999 } | |
2000 | |
2001 //----- (004B8F94) -------------------------------------------------------- | |
2002 void GenerateSpecialShopItems() | |
461 | 2003 { |
463 | 2004 signed int item_count; |
2005 signed int shop_index; | |
2006 int treasure_lvl; | |
2007 int item_class; | |
2008 int mdf; | |
2009 | |
2010 shop_index = (signed int)window_SpeakInHouse->ptr_1C; | |
2011 if ( uItemsAmountPerShopType[p2DEvents[shop_index - 1].uType] ) | |
2012 { | |
2013 for (item_count=0; item_count<=uItemsAmountPerShopType[p2DEvents[shop_index - 1].uType]; ++item_count ) | |
2014 { | |
2015 if (shop_index<=14) //weapon shop | |
2016 { | |
2017 treasure_lvl = shopWeap_variation_spc[shop_index].treasure_level; | |
2018 item_class = shopWeap_variation_spc[shop_index].item_class[rand() % 4]; | |
2019 } | |
2020 else if (shop_index<=28) //armor shop | |
2021 { | |
2022 mdf =0; | |
2023 if (item_count > 3) | |
2024 ++mdf; | |
470 | 2025 treasure_lvl = shopArmr_variation_spc[2*(shop_index-15)+mdf].treasure_level; |
2026 item_class =shopArmr_variation_spc[2*(shop_index-15)+mdf].item_class[rand() % 4]; | |
463 | 2027 } |
2028 else if (shop_index<=41) //magic shop | |
2029 { | |
2030 treasure_lvl = shopMagicSpc_treasure_lvl[shop_index-28]; | |
2031 item_class = 22; //misc | |
2032 } | |
2033 else if (shop_index<=53) //alchemist shop | |
2034 { | |
2035 if (item_count<6) | |
2036 { | |
470 | 2037 pParty->SpecialItemsInShops[shop_index][item_count].Reset(); |
2038 pParty->SpecialItemsInShops[shop_index][item_count].uItemID = rand() % 32 + 740; //mscrool | |
463 | 2039 continue; |
2040 } | |
2041 else | |
2042 { | |
470 | 2043 treasure_lvl = shopAlchSpc_treasure_lvl[shop_index-41]; |
463 | 2044 item_class = 44; //potion |
2045 } | |
2046 } | |
470 | 2047 pItemsTable->GenerateItem(treasure_lvl, item_class, &pParty->SpecialItemsInShops[shop_index][item_count]); |
2048 pParty->SpecialItemsInShops[shop_index][item_count].SetIdentified(); //identified | |
463 | 2049 } |
2050 } | |
2051 pParty->InTheShopFlags[shop_index] = 0; | |
461 | 2052 } |
2053 | |
2054 | |
463 | 2055 //----- (00450218) -------------------------------------------------------- |
526 | 2056 void sub_450218_prolly_generate_chests_loot() |
2057 { | |
463 | 2058 unsigned int v0; // eax@1 |
2059 Chest *v1; // ebx@1 | |
2060 MapInfo *v2; // esi@1 | |
2061 ItemGen *v3; // ebx@2 | |
2062 int v4; // ebp@4 | |
2063 int v5; // edi@4 | |
2064 int v6; // esi@4 | |
2065 int v7; // eax@4 | |
2066 signed int v8; // esi@4 | |
2067 int v9; // edx@4 | |
2068 int v10; // esi@8 | |
2069 int v11; // ebp@25 | |
2070 int v12; // esi@25 | |
2071 signed int v13; // ebp@27 | |
2072 ItemGen *v14; // edi@28 | |
2073 signed int v15; // edx@32 | |
2074 signed __int64 v16; // qtt@32 | |
2075 int v17; // esi@34 | |
2076 signed int v18; // [sp+10h] [bp-18h]@1 | |
2077 int v19; // [sp+14h] [bp-14h]@4 | |
2078 MapInfo *v20; // [sp+18h] [bp-10h]@1 | |
2079 Chest *v21; // [sp+1Ch] [bp-Ch]@1 | |
2080 int v22; // [sp+20h] [bp-8h]@26 | |
2081 signed int v23; // [sp+24h] [bp-4h]@2 | |
461 | 2082 |
463 | 2083 v18 = rand() % 100; |
2084 v0 = pMapStats->GetMapInfo(pCurrentMapName); | |
2085 v1 = pChests; | |
2086 v2 = &pMapStats->pInfos[v0]; | |
2087 v21 = pChests; | |
2088 v20 = &pMapStats->pInfos[v0]; | |
526 | 2089 for(int i=0; i<20;++i) |
461 | 2090 { |
526 | 2091 for(int j=0; j<140;++j) |
461 | 2092 { |
526 | 2093 v3 = &pChests[i].igChestItems[j]; |
2094 if ( v3->uItemID < 0 ) | |
2095 { | |
463 | 2096 v4 = rand() % 5 + 1; |
2097 v5 = (unsigned __int8)byte_4E8168[abs((int)v3->uItemID)-1][2*v2->Treasure_prob];//[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 2]; | |
2098 v6 = (unsigned __int8)byte_4E8168[abs((int)v3->uItemID)-1][2*v2->Treasure_prob+1];//[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 3]; | |
2099 v7 = rand(); | |
2100 v8 = v6 - v5 + 1; | |
2101 v9 = v5 + v7 % v8; | |
2102 v19 = v5 + v7 % v8; | |
526 | 2103 /* switch (v9) |
2104 { | |
2105 default: | |
2106 | |
2107 }*/ | |
2108 | |
2109 | |
463 | 2110 if ( v9 < 7 ) |
461 | 2111 { |
463 | 2112 if ( v18 < 20 ) |
2113 { | |
2114 v3->Reset(); | |
2115 goto LABEL_25; | |
2116 } | |
2117 if ( v18 < 60 ) | |
461 | 2118 { |
463 | 2119 v10 = 0; |
2120 v3->Reset(); | |
2121 if ( v19 == 1 ) | |
461 | 2122 { |
463 | 2123 v10 = rand() % 51 + 50; |
461 | 2124 } |
463 | 2125 else |
461 | 2126 { |
463 | 2127 if ( v19 != 2 ) |
461 | 2128 { |
463 | 2129 if ( v19 == 3 ) |
461 | 2130 { |
463 | 2131 v10 = rand() % 301 + 200; |
2132 } | |
2133 else | |
2134 { | |
2135 if ( v19 != 4 ) | |
461 | 2136 { |
463 | 2137 if ( v19 == 5 ) |
2138 { | |
2139 v10 = rand() % 1001 + 1000; | |
2140 LABEL_15: | |
2141 v3->uItemID = 199; | |
2142 } | |
2143 else | |
2144 { | |
2145 if ( v19 == 6 ) | |
2146 { | |
2147 v10 = rand() % 3001 + 2000; | |
2148 goto LABEL_15; | |
2149 } | |
2150 } | |
2151 LABEL_23: | |
2152 v3->SetIdentified(); | |
2153 v3->uSpecEnchantmentType = v10; | |
2154 LABEL_25: | |
2155 v11 = v4 - 1; | |
2156 v12 = 0; | |
2157 if ( v11 > 0 ) | |
461 | 2158 { |
463 | 2159 v22 = v11; |
2160 while ( 1 ) | |
461 | 2161 { |
463 | 2162 v13 = v12; |
2163 if ( v12 >= 140 ) | |
2164 goto LABEL_52; | |
526 | 2165 v14 = &v21->igChestItems[v12]; |
463 | 2166 while ( v14->uItemID ) |
2167 { | |
2168 ++v13; | |
2169 ++v14; | |
2170 if ( v13 >= 140 ) | |
2171 goto LABEL_52; | |
2172 } | |
2173 v16 = rand(); | |
2174 v15 = v16 % 100; | |
2175 v18 = v16 % 100; | |
2176 if ( v15 < 20 ) | |
2177 goto LABEL_52; | |
2178 if ( v15 >= 60 ) | |
2179 { | |
2180 pItemsTable->GenerateItem(v19, 0, v14); | |
2181 goto LABEL_51; | |
2182 } | |
2183 v17 = 0; | |
2184 v14->Reset(); | |
2185 if ( v19 == 1 ) | |
2186 { | |
2187 v17 = rand() % 51 + 50; | |
2188 goto LABEL_48; | |
2189 } | |
2190 if ( v19 == 2 ) | |
2191 { | |
2192 v17 = rand() % 101 + 100; | |
2193 LABEL_48: | |
2194 v14->uItemID = 197; | |
2195 goto LABEL_49; | |
2196 } | |
2197 if ( v19 == 3 ) | |
2198 { | |
2199 v17 = rand() % 301 + 200; | |
2200 goto LABEL_44; | |
2201 } | |
2202 if ( v19 == 4 ) | |
2203 { | |
2204 v17 = rand() % 501 + 500; | |
2205 LABEL_44: | |
2206 v14->uItemID = 198; | |
2207 goto LABEL_49; | |
2208 } | |
2209 if ( v19 == 5 ) | |
2210 break; | |
461 | 2211 if ( v19 == 6 ) |
2212 { | |
463 | 2213 v17 = rand() % 3001 + 2000; |
2214 LABEL_41: | |
2215 v14->uItemID = 199; | |
461 | 2216 } |
463 | 2217 LABEL_49: |
2218 v14->uSpecEnchantmentType = v17; | |
2219 LABEL_51: | |
2220 v12 = v13 + 1; | |
2221 LABEL_52: | |
2222 --v22; | |
2223 if ( !v22 ) | |
2224 goto LABEL_55; | |
461 | 2225 } |
463 | 2226 v17 = rand() % 1001 + 1000; |
2227 goto LABEL_41; | |
461 | 2228 } |
463 | 2229 goto LABEL_55; |
461 | 2230 } |
463 | 2231 v10 = rand() % 501 + 500; |
461 | 2232 } |
463 | 2233 v3->uItemID = 198; |
2234 goto LABEL_23; | |
461 | 2235 } |
463 | 2236 v10 = rand() % 101 + 100; |
461 | 2237 } |
463 | 2238 v3->uItemID = 197; |
2239 goto LABEL_23; | |
461 | 2240 } |
463 | 2241 pItemsTable->GenerateItem(v9, 0, v3); |
2242 goto LABEL_25; | |
461 | 2243 } |
463 | 2244 v3->GenerateArtifact(); |
526 | 2245 |
463 | 2246 LABEL_55: |
2247 v2 = v20; | |
526 | 2248 LABEL_56: ; |
2249 } | |
2250 } | |
461 | 2251 } |
526 | 2252 |
463 | 2253 } |
461 | 2254 |
2255 | |
2256 | |
2257 | |
463 | 2258 // 4505CC: using guessed type int var_A0[32]; |
2259 //----- (004B3703) -------------------------------------------------------- | |
473 | 2260 void FillAviableSkillsToTeach( int _this ) |
2261 { | |
2262 char *v30; // ecx@65 | |
2263 unsigned int v29; // edx@56 | |
2264 int v15; // ecx@19 | |
2265 int v33; // [sp-4h] [bp-2Ch]@23 | |
2266 int v34; // [sp-4h] [bp-2Ch]@43 | |
2267 int v21; // ecx@34 | |
2268 int v35[5]; // [sp+Ch] [bp-1Ch]@8 | |
2269 int v37=0; // [sp+24h] [bp-4h]@1* | |
2270 int i=0; | |
2271 | |
2272 dword_F8B1DC = 0; | |
2273 | |
2274 switch (_this) | |
463 | 2275 { |
473 | 2276 case 1: //shop weapon |
2277 for (int i=0; i<2; ++i) | |
2278 { | |
2279 for (int j=0; j<4; ++j) | |
2280 { | |
2281 if ( i ) | |
2282 v21 = shopWeap_variation_spc[(unsigned int)window_SpeakInHouse->ptr_1C].item_class[j]; | |
2283 else | |
2284 v21 = shopWeap_variation_ord[(unsigned int)window_SpeakInHouse->ptr_1C].item_class[j]; | |
463 | 2285 |
473 | 2286 switch (v21) |
463 | 2287 { |
473 | 2288 case 23: v34 = 37; break; |
2289 case 24: v34 = 38; break; | |
2290 case 25: v34 = 39; break; | |
2291 case 26: v34 = 40; break; | |
2292 case 27: v34 = 41; break; | |
2293 case 28: v34 = 42; break; | |
2294 case 30: v34 = 36; break; | |
2295 default: | |
2296 continue; | |
2297 } | |
2298 v37 = sub_4BE571(v34, v35, v37, 5); | |
463 | 2299 } |
2300 } | |
473 | 2301 break; |
2302 case 2: //shop armor | |
2303 | |
2304 for (int i=0; i<2; ++i) | |
463 | 2305 { |
473 | 2306 for (int j=0; j<2; ++j) |
463 | 2307 { |
473 | 2308 for (int k=0; k<4; ++k) |
463 | 2309 { |
473 | 2310 if ( i ) |
2311 v15 = shopArmr_variation_spc[(unsigned int)window_SpeakInHouse->ptr_1C-15+j].item_class[k]; | |
2312 else | |
2313 v15 = shopArmr_variation_ord[(unsigned int)window_SpeakInHouse->ptr_1C-15+j].item_class[k]; | |
2314 switch (v15) | |
463 | 2315 { |
473 | 2316 case 31: v33 = 45; break; |
2317 case 32: v33 = 46; break; | |
2318 case 33: v33 = 47; break; | |
2319 case 34: v33 = 44; break; | |
2320 default: | |
2321 continue; | |
463 | 2322 } |
473 | 2323 v37 = sub_4BE571(v33, v35, v37, 5); |
463 | 2324 } |
2325 } | |
2326 } | |
473 | 2327 break; |
2328 case 3: //shop magic | |
2329 v37 = 2; | |
2330 v35[0] = 57; | |
2331 v35[1] = 59; | |
2332 break; | |
2333 case 4: //shop alchemist | |
2334 v37 = 2; | |
2335 v35[0] = 71; | |
2336 v35[1] = 68; | |
2337 break; | |
2338 case 21: //tavern | |
2339 v37 = 3; | |
2340 v35[0] = 70; | |
2341 v35[1] = 65; | |
2342 v35[2] = 62; | |
2343 break; | |
2344 case 23: //temple | |
2345 v37 = 3; | |
2346 v35[0] = 67; | |
2347 v35[1] = 66; | |
2348 v35[2] = 58; | |
2349 break; | |
2350 case 30: ///trainig | |
2351 v37 = 2; | |
2352 v35[0] = 69; | |
2353 v35[1] = 60; | |
2354 break; | |
2355 } | |
2356 for(i=0;i<v37;++i) | |
2357 { | |
2358 v29=v35[i]; | |
2359 switch(v29) | |
463 | 2360 { |
473 | 2361 case 40 :v30 = pSkillNames[4]; break; |
2362 case 5 : v30 = pSkillNames[23]; break; | |
2363 case 36 :v30 = pSkillNames[0]; break; | |
2364 case 37 :v30 = pSkillNames[1]; break; | |
2365 case 38 :v30 = pSkillNames[2]; break; | |
2366 case 39 :v30 = pSkillNames[3]; break; | |
2367 case 41 :v30 = pSkillNames[5]; break; | |
2368 case 42 :v30 = pSkillNames[6]; break; | |
2369 case 44 :v30 = pSkillNames[8]; break; | |
2370 case 45 :v30 = pSkillNames[9]; break; | |
2371 case 46 :v30 = pSkillNames[10]; break; | |
2372 case 47 :v30 = pSkillNames[11]; break; | |
2373 case 66 :v30 = pSkillNames[30]; break; | |
2374 case 57 :v30 = pSkillNames[21]; break; | |
2375 case 58 :v30 = pSkillNames[22]; break; | |
2376 case 60 :v30 = pSkillNames[24]; break; | |
2377 case 62 :v30 = pSkillNames[26]; break; | |
2378 case 65 :v30 = pSkillNames[29]; break; | |
2379 case 67:v30 = pSkillNames[31]; break; | |
2380 case 68:v30 = pSkillNames[32]; break; | |
2381 case 69:v30 = pSkillNames[33]; break; | |
2382 case 70:v30 = pSkillNames[34]; break; | |
2383 case 71:v30 = pSkillNames[35]; break; | |
2384 default: | |
463 | 2385 v30 = pGlobalTXT_LocalizationStrings[127]; //"No Text!" |
2386 } | |
473 | 2387 pShopOptions[dword_F8B1DC] = v30; |
2388 ++dword_F8B1DC; | |
2389 CreateButtonInColumn(i+1, v29); | |
463 | 2390 } |
473 | 2391 pDialogueWindow->_41D08F(i, 1, 0, 2); |
2392 dword_F8B1E0 = pDialogueWindow->pNumPresenceButton; | |
2393 } | |
475 | 2394 |
2395 //----- (004BE571) -------------------------------------------------------- | |
2396 int sub_4BE571(int a1, int *a2, int a3, int a4) | |
2397 { | |
2398 int result; // eax@1 | |
2399 int i; // esi@3 | |
2400 | |
2401 result = a3; | |
2402 if ( a3 < a4 ) | |
2403 { | |
2404 for ( i = 0; i < a3; ++i ) | |
2405 { | |
2406 if ( a1 == a2[i] ) | |
2407 break; | |
2408 } | |
2409 if ( i == a3 ) | |
2410 { | |
2411 a2[a3] = a1; | |
2412 result = a3 + 1; | |
2413 } | |
2414 return result; | |
2415 } | |
2416 else | |
2417 { | |
2418 return a4; | |
2419 } | |
2420 } | |
2421 | |
2422 |