comparison Items.cpp @ 385:b509ef97807a

additional dmg
author Gloval
date Sat, 23 Feb 2013 01:50:18 +0400
parents 243418228760
children 4a42c2f97aa2
comparison
equal deleted inserted replaced
383:c3a0d94c07a5 385:b509ef97807a
24 24
25 25
26 26
27 27
28 //----- (00439DF3) -------------------------------------------------------- 28 //----- (00439DF3) --------------------------------------------------------
29 int ItemGen::_439DF3_get_additional_damage(int *a2, int *a3) 29 int ItemGen::_439DF3_get_additional_damage(int *damage_type, bool *draintargetHP)
30 { 30 {
31 int *v3; // edi@1 31 *damage_type = 0;
32 ItemGen *v4; // ebx@1 32 if ( !uItemID )
33 signed int v5; // esi@1 33 return 0;
34 unsigned int v7; // ecx@5 34 UpdateTempBonus(pParty->uTimePlayed);
35 signed int v8; // ebx@7 35 if (uItemID == 501 ) //Iron Feather -sword
36 int v9; // edx@22 36 {
37 int v10; // eax@24 37 *damage_type = 1;
38 int v11; // edx@25 38 return rand() % 10 + 6;
39 int v12; // ebx@28 39 }
40 int v13; // ebx@29 40 if (uItemID == 507 ) //Ghoulsbane -axe
41 int v14; // ebx@30 41 {
42 int v15; // ebx@31 42 *damage_type = 0;
43 int v16; // ebx@32 43 return rand() % 16 + 3;
44 signed int v17; // [sp-4h] [bp-10h]@24 44 }
45 45 if ( uItemID == 510 ) //Ullyses -bow
46 auto a1 = this; 46 {
47 v3 = a2; 47 *damage_type = 2;
48 v4 = a1; 48 return rand() % 4 + 9;
49 v5 = 0; 49 }
50 *a2 = 0; 50 if ( uItemID == 517 ) //Old Nick -dagger
51 if ( !a1->uItemID ) 51 {
52 return 0; 52 *damage_type = 8;
53 UpdateTempBonus(pParty->uTimePlayed); 53 return 8;
54 if ( v4->uItemID == 501 ) 54 }
55 { 55
56 *v3 = 1; 56 switch (uSpecEnchantmentType)
57 v10 = rand(); 57 {
58 v17 = 10; 58 case 4: //Adds 3-4 points of Cold damage.
59 return v10 % v17 + 6; 59 *damage_type = 2;
60 } 60 return rand() % 2 + 3;
61 if ( v4->uItemID == 507 ) 61 break;
62 { 62 case 5: //Adds 6-8 points of Cold damage.
63 *v3 = 0; 63 *damage_type = 2;
64 v11 = rand() % 16; 64 return rand() % 3 + 6;
65 return v11 + 3; 65 break;
66 } 66 case 6: //Adds 9-12 points of Cold damage.
67 v7 = 3; 67 *damage_type = 2;
68 if ( v4->uItemID == 510 ) 68 return rand() % 4 + 9;
69 { 69 break;
70 *v3 = 2; 70 case 7: //Adds 2-5 points of Electrical damage.
71 v9 = rand() % 4; 71 *damage_type = 1;
72 return v9 + 9; 72 return rand() % 4 + 2;
73 } 73 break;
74 if ( v4->uItemID == 517 ) 74 case 8: //Adds 4-10 points of Electrical damage.
75 { 75 *damage_type = 1;
76 v5 = 8; 76 return rand() % 7 + 4;
77 *v3 = v5; 77 break;
78 return v5; 78 case 9: //Adds 6-15 points of Electrical damage.
79 } 79 *damage_type = 1;
80 v8 = v4->uSpecEnchantmentType; 80 return rand() % 10 + 6;
81 if ( v8 > 46 ) 81 break;
82 { 82 case 10: //Adds 1-6 points of Fire damage.
83 v5 = 0; 83 *damage_type = 0;
84 *v3 = v5; 84 return GetDiceResult(1, 6);
85 return v5; 85 break;
86 } 86 case 11: //Adds 2-12 points of Fire damage.
87 if ( v8 == 46 ) 87 *damage_type = 0;
88 { 88 return GetDiceResult(2, 6);
89 *v3 = 0; 89 break;
90 return rand() % 11 + 10; 90 case 12: //Adds 3-18 points of Fire damage.
91 } 91 *damage_type = 0;
92 if ( v8 > 11 ) 92 return GetDiceResult(3, 6);
93 { 93 break;
94 v12 = v8 - 12; 94 case 13: //Adds 5 points of Body damage.
95 if ( !v12 ) 95 *damage_type = 8;
96 { 96 return 5;
97 *v3 = 0; 97 break;
98 return GetDiceResult(v7, 6u); 98 case 14: //Adds 8 points of Body damage.
99 } 99 *damage_type = 8;
100 v13 = v12 - 1; 100 return 8;
101 if ( !v13 ) 101 break;
102 { 102 case 15: //Adds 12 points of Body damage.
103 *v3 = 8; 103 *damage_type = 8;
104 return 5; 104 return 12;
105 } 105 break;
106 v14 = v13 - 1; 106 case 16: //Drain Hit Points from target.
107 if ( v14 ) 107 case 41: //Drain Hit Points from target and Increased Weapon speed.
108 { 108 *damage_type = 10;
109 v15 = v14 - 1; 109 *draintargetHP = true;
110 if ( v15 ) 110 return 0;
111 { 111 break;
112 v16 = v15 - 1; 112 case 46: //Adds 10-20 points of Fire damage and +25 Might.
113 if ( !v16 || v16 == 25 ) 113 *damage_type = 0;
114 { 114 return rand() % 11 + 10;
115 *v3 = 10; 115 break;
116 *a3 = 1; 116 default:
117 return v5; 117 *damage_type = 0;
118 } 118 return 0;
119 v5 = 0; 119
120 *v3 = v5; 120 }
121 return v5; 121
122 } 122 }
123 *v3 = 2;
124 return 12;
125 }
126 v5 = 8;
127 *v3 = v5;
128 return v5;
129 }
130 if ( v8 == 11 )
131 {
132 *v3 = 0;
133 v7 = 2;
134 return GetDiceResult(v7, 6u);
135 }
136 if ( v8 == 4 )
137 {
138 *v3 = 2;
139 v11 = rand() % 2;
140 return v11 + 3;
141 }
142 if ( v8 == 5 )
143 {
144 *v3 = 2;
145 v10 = rand();
146 v17 = 3;
147 return v10 % v17 + 6;
148 }
149 if ( v8 == 6 )
150 {
151 *v3 = 2;
152 v9 = rand() % 4;
153 return v9 + 9;
154 }
155 if ( v8 == 7 )
156 {
157 *v3 = 1;
158 return rand() % 4 + 2;
159 }
160 if ( v8 == 8 )
161 {
162 *v3 = 1;
163 return rand() % 7 + 4;
164 }
165 if ( v8 == 9 )
166 {
167 *v3 = 1;
168 v10 = rand();
169 v17 = 10;
170 return v10 % v17 + 6;
171 }
172 if ( v8 != 10 )
173 {
174 v5 = 0;
175 *v3 = v5;
176 return v5;
177 }
178 *v3 = 0;
179 v7 = 1;
180 return GetDiceResult(v7, 6u);
181 }
182 123
183 124
184 //----- (00402F07) -------------------------------------------------------- 125 //----- (00402F07) --------------------------------------------------------
185 void ItemGen::Reset() 126 void ItemGen::Reset()
186 { 127 {
657 if ( !_strcmpi(test_string, "club") ) 598 if ( !_strcmpi(test_string, "club") )
658 { 599 {
659 pItems[item_counter].uSkillType = PLAYER_SKILL_CLUB; 600 pItems[item_counter].uSkillType = PLAYER_SKILL_CLUB;
660 break; 601 break;
661 } 602 }
662 pItems[item_counter].uSkillType = PLAYER_SKILL_ANY; 603 pItems[item_counter].uSkillType = PLAYER_SKILL_MISC;
663 break; 604 break;
664 } 605 }
665 case 6: //Mod1 606 case 6: //Mod1
666 { 607 {
667 int ii; 608 int ii;
1185 } 1126 }
1186 1127
1187 //----- (00456D17) -------------------------------------------------------- 1128 //----- (00456D17) --------------------------------------------------------
1188 void ItemsTable::SetSpecialBonus(ItemGen *pItem) 1129 void ItemsTable::SetSpecialBonus(ItemGen *pItem)
1189 { 1130 {
1190 ItemDesc *v2; // eax@1 1131 if ( pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL )
1191
1192 v2 = &this->pItems[pItem->uItemID];
1193 if ( v2->uMaterial == 3 )
1194 { 1132 {
1195 pItem->uEncantmentType = v2->_bonus_type; 1133 pItem->uEncantmentType = pItems[pItem->uItemID]._bonus_type;
1196 pItem->uSpecEnchantmentType = v2->_additional_value; 1134 pItem->uSpecEnchantmentType = pItems[pItem->uItemID]._additional_value;
1197 pItem->_bonus_strength = v2->_bonus_strength; 1135 pItem->_bonus_strength = pItems[pItem->uItemID]._bonus_strength;
1198 } 1136 }
1199 } 1137 }
1200 1138
1201 //----- (00456D43) -------------------------------------------------------- 1139 //----- (00456D43) --------------------------------------------------------
1202 bool ItemsTable::IsMaterialSpecial(ItemGen *pItem) 1140 bool ItemsTable::IsMaterialSpecial(ItemGen *pItem)
1205 } 1143 }
1206 1144
1207 //----- (00456D5E) -------------------------------------------------------- 1145 //----- (00456D5E) --------------------------------------------------------
1208 bool ItemsTable::IsMaterialNonCommon(ItemGen *pItem) 1146 bool ItemsTable::IsMaterialNonCommon(ItemGen *pItem)
1209 { 1147 {
1210 unsigned __int8 v2; // al@1 1148 return pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL ||
1211 1149 pItems[pItem->uItemID].uMaterial == MATERIAL_RELIC ||
1212 v2 = this->pItems[pItem->uItemID].uMaterial; 1150 pItems[pItem->uItemID].uMaterial == MATERIAL_ARTEFACT;
1213 return v2 == MATERIAL_SPECIAL || v2 == MATERIAL_RELIC || v2 == MATERIAL_ARTEFACT;
1214 } 1151 }
1215 1152
1216 1153
1217 //----- (00453B3C) -------------------------------------------------------- 1154 //----- (00453B3C) --------------------------------------------------------
1218 void ItemsTable::LoadPotions() 1155 void ItemsTable::LoadPotions()
1484 return item__getname_buffer; 1421 return item__getname_buffer;
1485 } 1422 }
1486 1423
1487 1424
1488 //----- (00456620) -------------------------------------------------------- 1425 //----- (00456620) --------------------------------------------------------
1489 void ItemsTable::GenerateItem(int treasure_level, int a3, ItemGen *out_item) 1426 void ItemsTable::GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *out_item)
1490 { 1427 {
1491 1428
1492 ItemGen *v4; // esi@1 1429 ItemGen *v4; // esi@1
1493 ItemsTable *v5; // edi@1 1430 ItemsTable *v5; // edi@1
1494 int v6; // ebx@3 1431 int v6; // ebx@3
1555 out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen"); 1492 out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen");
1556 memset(out_item, 0, sizeof(*out_item)); 1493 memset(out_item, 0, sizeof(*out_item));
1557 1494
1558 v4 = out_item; 1495 v4 = out_item;
1559 v6 = treasure_level - 1; 1496 v6 = treasure_level - 1;
1560 //v54 = treasure_level - 1; 1497 v54 = treasure_level - 1;
1561 if ( a3 ) 1498 if ( uTreasureType ) //generate known treasure type
1562 { 1499 {
1563 ITEM_EQUIP_TYPE requested_equip; 1500 ITEM_EQUIP_TYPE requested_equip;
1564 PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID; 1501 PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID;
1565 switch (a3) 1502 switch (uTreasureType)
1566 { 1503 {
1567 case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break; 1504 case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break;
1568 case 21: requested_equip = EQUIP_ARMOUR; break; 1505 case 21: requested_equip = EQUIP_ARMOUR; break;
1569 case 22: requested_skill = (PLAYER_SKILL_TYPE)38; __debugbreak();/*check this skill*/ break; 1506 case 22: requested_skill = PLAYER_SKILL_MISC; break;
1570 case 23: requested_skill = PLAYER_SKILL_SWORD; break; 1507 case 23: requested_skill = PLAYER_SKILL_SWORD; break;
1571 case 24: requested_skill = PLAYER_SKILL_DAGGER; break; 1508 case 24: requested_skill = PLAYER_SKILL_DAGGER; break;
1572 case 25: requested_skill = PLAYER_SKILL_AXE; break; 1509 case 25: requested_skill = PLAYER_SKILL_AXE; break;
1573 case 26: requested_skill = PLAYER_SKILL_SPEAR; break; 1510 case 26: requested_skill = PLAYER_SKILL_SPEAR; break;
1574 case 27: requested_skill = PLAYER_SKILL_BOW; break; 1511 case 27: requested_skill = PLAYER_SKILL_BOW; break;
1575 case 28: requested_skill = PLAYER_SKILL_MACE; break; 1512 case 28: requested_skill = PLAYER_SKILL_MACE; break;
1576 case 29: requested_skill = (PLAYER_SKILL_TYPE)37; __debugbreak();/*check this skill*/break; 1513 case 29: requested_skill = PLAYER_SKILL_CLUB; break;
1577 case 30: requested_skill = PLAYER_SKILL_STAFF; break; 1514 case 30: requested_skill = PLAYER_SKILL_STAFF; break;
1578 case 31: requested_skill = PLAYER_SKILL_LEATHER; break; 1515 case 31: requested_skill = PLAYER_SKILL_LEATHER; break;
1579 case 32: requested_skill = PLAYER_SKILL_CHAIN; break; 1516 case 32: requested_skill = PLAYER_SKILL_CHAIN; break;
1580 case 33: requested_skill = PLAYER_SKILL_PLATE; break; 1517 case 33: requested_skill = PLAYER_SKILL_PLATE; break;
1581 case 34: requested_equip = EQUIP_SHIELD; break; 1518 case 34: requested_equip = EQUIP_SHIELD; break;
1591 case 44: requested_equip = EQUIP_POTION; break; 1528 case 44: requested_equip = EQUIP_POTION; break;
1592 case 45: requested_equip = EQUIP_REAGENT; break; 1529 case 45: requested_equip = EQUIP_REAGENT; break;
1593 case 46: requested_equip = EQUIP_GEM; break; 1530 case 46: requested_equip = EQUIP_GEM; break;
1594 default: 1531 default:
1595 __debugbreak(); // check this condition 1532 __debugbreak(); // check this condition
1596 requested_equip = (ITEM_EQUIP_TYPE)(a3 - 1); 1533 requested_equip = (ITEM_EQUIP_TYPE)(uTreasureType - 1);
1597 break; 1534 break;
1598 } 1535 }
1599 memset(Dst, 0, sizeof(Dst)); 1536 memset(Dst, 0, sizeof(Dst));
1600 v52 = 0; 1537 v52 = 0;
1601 v7 = Dst; 1538 v7 = Dst;
1602 //a2a = 1; 1539 //a2a = 1;
1603 if (requested_skill == PLAYER_SKILL_INVALID) 1540 if (requested_skill == PLAYER_SKILL_INVALID) // no skill for this item needed
1604 { 1541 {
1605 for (uint i = 1; i < 500; ++i) 1542 for (uint i = 1; i < 500; ++i)
1606 { 1543 {
1607 if (pItems[i].uEquipType == requested_equip) 1544 if (pItems[i].uEquipType == requested_equip)
1608 { 1545 {
1609 *v7++ = i; 1546 *v7++ = i;
1610 v52 += pItems[i].uChanceByTreasureLvl[v6]; 1547 v52 += pItems[i].uChanceByTreasureLvl[v6];
1611 } 1548 }
1612 } 1549 }
1613 } 1550 }
1614 else 1551 else //have needed skill
1615 { 1552 {
1616 for (uint i = 1; i < 500; ++i) 1553 for (uint i = 1; i < 500; ++i)
1617 { 1554 {
1618 if (pItems[i].uSkillType == requested_skill) 1555 if (pItems[i].uSkillType == requested_skill)
1619 { 1556 {
1625 1562
1626 v10 = 0; 1563 v10 = 0;
1627 if ( v52 ) 1564 if ( v52 )
1628 v10 = rand() % v52; 1565 v10 = rand() % v52;
1629 1566
1630 v4->uItemID = *Dst; 1567 out_item->uItemID = *Dst;
1631 if (!v4->uItemID) 1568 if (!out_item->uItemID)
1632 v4->uItemID = 1; 1569 out_item->uItemID = 1;
1633 1570
1634 v11 = pItems[v4->uItemID].uChanceByTreasureLvl[v6]; 1571 v11 = pItems[out_item->uItemID].uChanceByTreasureLvl[v6];
1635 if ( v11 < v10 ) 1572 if ( v11 < v10 )
1636 { 1573 {
1637 v12 = (uint *)Dst; 1574 v12 = (uint *)Dst;
1638 do 1575 do
1639 { 1576 {
1640 ++v12; 1577 ++v12;
1641 v13 = *v12; 1578 v13 = *v12;
1642 v4->uItemID = *v12; 1579 out_item->uItemID = *v12;
1643 v11 += pItems[v13].uChanceByTreasureLvl[v6]; 1580 v11 += pItems[v13].uChanceByTreasureLvl[v6];
1644 } 1581 }
1645 while ( v11 < v10 ); 1582 while ( v11 < v10 );
1646 } 1583 }
1647 if (pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE ) 1584
1648 { 1585 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE )
1649 v4->uEncantmentType = 0; 1586 {// if it potion set potion spec
1650 v14 = 2; 1587 out_item->uEncantmentType = 0;
1651 do 1588 for (int i=0; i<2; ++i)
1652 { 1589 out_item->uEncantmentType += rand() % 4 + 1;
1653 v4->uEncantmentType += rand() % 4 + 1; 1590 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1654 v15 = v4->uEncantmentType;
1655 --v14;
1656 }
1657 while ( v14 );
1658 v4->uEncantmentType = v15 * treasure_level;
1659 } 1591 }
1660 } 1592 }
1661 else 1593 else
1662 { 1594 {
1663 v16 = 0; 1595 v16 = 0;
1664 v56 = 0; 1596 v56 = 0;
1665 do 1597 do
1666 v56 += pParty->field_7BA[v16++]; 1598 v56 += pParty->field_7BA[v16++];
1667 while ( v16 < 29 ); 1599 while ( v16 < 29 );
1668 v17 = rand() % 29; 1600 v17 = rand() % 29;
1601
1669 if ( v6 == 5 && rand() % 100 < 5 && !pParty->field_7BA[v17] && v56 < 13 ) 1602 if ( v6 == 5 && rand() % 100 < 5 && !pParty->field_7BA[v17] && v56 < 13 )
1670 { 1603 {
1671 pParty->field_7BA[v17] = 1; 1604 pParty->field_7BA[v17] = 1;
1672 v4->uAttributes = 0; 1605 out_item->uAttributes = 0;
1673 v4->uItemID = v17 + 500; 1606 out_item->uItemID = v17 + 500;
1674 SetSpecialBonus(v4); 1607 SetSpecialBonus(out_item);
1675 return; 1608 return;
1676 } 1609 }
1610
1677 v57 = 0; 1611 v57 = 0;
1678 v18 = rand() % v5->uChanceByTreasureLvlSumm[v54];// v5->field_11684[v54]; 1612 v18 = rand() % v5->uChanceByTreasureLvlSumm[v54];// v5->field_11684[v54];
1679 v4->uItemID = 0; 1613 out_item->uItemID = 0;
1680 if ( v18 > 0 ) 1614 if ( v18 > 0 )
1681 { 1615 {
1682 do 1616 do
1683 v57 += pItems[v4->uItemID++ + 1].uChanceByTreasureLvl[v6]; 1617 v57 += pItems[out_item->uItemID++ + 1].uChanceByTreasureLvl[v6];
1684 while ( v57 < v18 ); 1618 while ( v57 < v18 );
1685 } 1619 }
1620
1686 if ( !v18 ) 1621 if ( !v18 )
1687 v4->uItemID = 1; 1622 out_item->uItemID = 1;
1688 if ( !v4->uItemID ) 1623 if ( !out_item->uItemID )
1689 v4->uItemID = 1; 1624 out_item->uItemID = 1;
1690 if (pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE) 1625 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE )
1691 { 1626 {// if it potion set potion spec
1692 v4->uEncantmentType = 0; 1627 out_item->uEncantmentType = 0;
1693 v19 = 2; 1628 for (int i=0; i<2; ++i)
1694 do 1629 out_item->uEncantmentType += rand() % 4 + 1;
1695 { 1630 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1696 v4->uEncantmentType += rand() % 4 + 1; 1631 }
1697 v15 = v4->uEncantmentType; 1632 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1698 --v19;
1699 }
1700 while ( v19 );
1701 v4->uEncantmentType = v15 * treasure_level;
1702 }
1703 } 1633 }
1704 if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION 1634 if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION
1705 && !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, 239) ) 1635 && !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, 239) )
1706 v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST; 1636 v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST;
1707 if ( pItemsTable->pItems[v4->uItemID + 1].uItemID_Rep_St ) 1637 if ( pItemsTable->pItems[v4->uItemID + 1].uItemID_Rep_St )
1708 v4->uAttributes = 0; 1638 v4->uAttributes = 0;
1709 else 1639 else
1710 v4->uAttributes = 1; 1640 v4->uAttributes = 1;
1711 if ( pItems[v4->uItemID].uEquipType != EQUIP_POTION ) 1641 if ( pItems[out_item->uItemID].uEquipType != EQUIP_POTION )
1712 { 1642 {
1713 v4->uSpecEnchantmentType = 0; 1643 out_item->uSpecEnchantmentType = 0;
1714 v4->uEncantmentType = 0; 1644 out_item->uEncantmentType = 0;
1715 } 1645 }
1716 v20 = pItems[v4->uItemID].uEquipType; 1646 v20 = pItems[out_item->uItemID].uEquipType;
1717 if ( v20 <= EQUIP_BOW ) 1647 if ( v20 <= EQUIP_BOW )
1718 { 1648 {
1719 v37 = v5->uBonusChanceWpSpecial[v54]; 1649 v37 = v5->uBonusChanceWpSpecial[v54];
1720 if ( !*(unsigned int *)v37 ) 1650 if ( !*(unsigned int *)v37 )
1721 return; 1651 return;
1728 if ( v20 > EQUIP_AMULET ) 1658 if ( v20 > EQUIP_AMULET )
1729 { 1659 {
1730 if ( v20 == EQUIP_WAND ) 1660 if ( v20 == EQUIP_WAND )
1731 { 1661 {
1732 v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1; 1662 v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1;
1733 v4->uNumCharges = v21; 1663 out_item->uNumCharges = v21;
1734 v4->uMaxCharges = v21; 1664 out_item->uMaxCharges = v21;
1735 } 1665 }
1736 return; 1666 return;
1737 } 1667 }
1738 v22 = (int)&uBonusChanceStandart[v6]; 1668 v22 = (int)&uBonusChanceStandart[v6];
1739 if ( !*(unsigned int *)v22 ) 1669 if ( !*(unsigned int *)v22 )
1740 return; 1670 return;
1741 v23 = rand();
1742 v24 = *(unsigned int *)v22; 1671 v24 = *(unsigned int *)v22;
1743 v25 = v23 % 100; 1672 v25 = rand() % 100;
1744 if ( !uBonusChanceSpecial[v6] && !(v23 % 100 < v24)) 1673 if ( !uBonusChanceSpecial[v6] && !(v25 < v24))
1745 return; 1674 return;
1746 if ( v25 < v24 || v23 % 100 < v24) 1675 if ( v25 < v24 || v25 < v24)
1747 { 1676 {
1748 v26 = rand() % 10;//v5->field_116D8[v5->pItems[v4->uItemID].uEquipType]; 1677 v26 = rand() % v5->uBonusChanceWpSpecial[v5->pItems[v4->uItemID].uEquipType + 3];
1749 v27 = v4->uItemID; 1678 v27 = v4->uItemID;
1750 v4->uEncantmentType = 0; 1679 v4->uEncantmentType = 0;
1751 for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1]; 1680 for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1];
1752 i < v26; 1681 i < v26;
1753 i += pEnchantments[v4->uEncantmentType].to_item[pItems[v29].uEquipType + 1] ) 1682 i += pEnchantments[v4->uEncantmentType].to_item[pItems[v29].uEquipType + 1] )
1887 { 1816 {
1888 ItemGen *v1; // edi@1 1817 ItemGen *v1; // edi@1
1889 signed int uNumArtifactsNotFound; // esi@1 1818 signed int uNumArtifactsNotFound; // esi@1
1890 int v3; // eax@1 1819 int v3; // eax@1
1891 bool result; // eax@6 1820 bool result; // eax@6
1892 int v5[32]; // [sp+8h] [bp-A0h]@3 1821 int artifacts_list[32]; // [sp+8h] [bp-A0h]@3
1893 char Dst[32]; // [sp+88h] [bp-20h]@1 1822 char Dst[32]; // [sp+88h] [bp-20h]@1
1894 1823
1895 auto a2 = this; 1824 auto a2 = this;
1896 v1 = a2; 1825 v1 = a2;
1897 memset(Dst, 0, 0x20u); 1826 memset(artifacts_list, 0,sizeof(artifacts_list));
1898 uNumArtifactsNotFound = 0; 1827 uNumArtifactsNotFound = 0;
1899 v3 = 500; 1828
1900 do 1829 for (int i=500;i<529;++i)
1901 { 1830 if ( !pParty->field_3C.pIsArtifactFound[i] )
1902 if ( !pParty->field_3C.pIsArtifactFound[v3] ) 1831 artifacts_list[uNumArtifactsNotFound++] = i;
1903 v5[uNumArtifactsNotFound++] = v3; 1832
1904 ++v3; 1833 Reset();
1905 }
1906 while ( v3 < 529 );
1907 v1->Reset();
1908 if ( uNumArtifactsNotFound ) 1834 if ( uNumArtifactsNotFound )
1909 { 1835 {
1910 v1->uItemID = v5[rand() % uNumArtifactsNotFound]; 1836 uItemID = artifacts_list[rand() % uNumArtifactsNotFound];
1911 pItemsTable->SetSpecialBonus(v1); 1837 pItemsTable->SetSpecialBonus(this);
1912 result = 1; 1838 return true;
1913 } 1839 }
1914 else 1840 else
1915 { 1841 return false;
1916 result = 0; 1842
1917 }
1918 return result;
1919 } 1843 }
1920 // 4505CC: using guessed type int var_A0[32]; 1844 // 4505CC: using guessed type int var_A0[32];