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