Mercurial > mm7
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]; |