comparison Items.cpp @ 559:09108e73f2f4

item gen fixes (not full)
author Gloval
date Tue, 05 Mar 2013 01:08:01 +0400
parents 214d9d47cf1f
children f54481c85df8
comparison
equal deleted inserted replaced
550:c314e671d29c 559:09108e73f2f4
744 break; 744 break;
745 } 745 }
746 ++test_char; 746 ++test_char;
747 } 747 }
748 test_char=test_string; 748 test_char=test_string;
749 if ((ii==tst_len)&&(tolower(*test_char)=='s')) 749 if ((ii==tst_len)&&(tolower(*test_char)!='s'))
750 { 750 {
751 pItems[item_counter].uDamageDice=atoi(test_char+1); 751 pItems[item_counter].uDamageDice=atoi(test_char);
752 pItems[item_counter].uDamageRoll=1; 752 pItems[item_counter].uDamageRoll=1;
753 } 753 }
754 break; 754 break;
755 } 755 }
756 case 7: //Mod2 756 case 7: //Mod2
1532 } 1532 }
1533 1533
1534 1534
1535 //----- (00456620) -------------------------------------------------------- 1535 //----- (00456620) --------------------------------------------------------
1536 void ItemsTable::GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *out_item) 1536 void ItemsTable::GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *out_item)
1537 {
1538
1539 ItemGen *v4; // esi@1
1540 ItemsTable *v5; // edi@1
1541 int v6; // ebx@3
1542 int *v7; // ecx@33
1543 //int v8; // eax@34
1544 //int v9; // eax@39
1545 int v10; // ebx@43
1546 int v11; // ecx@47
1547 unsigned int *v12; // edx@48
1548 unsigned int v13; // eax@49
1549 signed int v14; // ebx@52
1550 int v15; // eax@53
1551 signed int v16; // eax@55
1552 int v17; // ebx@57
1553 int v18; // edx@62
1554 signed int v19; // ebx@70
1555 unsigned __int8 v20; // al@81
1556 int v21; // eax@84
1557 int v22; // ebx@85
1558 int v23; // eax@86
1559 int v24; // ebx@86
1560 int v25; // edx@86
1561 int v26; // edx@89
1562 unsigned int v27; // eax@89
1563 int i; // ebx@89
1564 unsigned int v29; // ecx@90
1565 int v30; // ebx@91
1566 int v31; // eax@91
1567 int v32; // ecx@91
1568 int v33; // eax@91
1569 int v34; // eax@97
1570 unsigned __int8 v35; // sf@97
1571 unsigned __int8 v36; // of@97
1572 int v37; // ebx@98
1573 int v38; // edx@99
1574 signed int v39; // ebx@101
1575 int v40; // ecx@102
1576 char v41; // zf@107
1577 char v42; // al@108
1578 char v43; // al@111
1579 int *v44; // edx@118
1580 int v45; // eax@120
1581 int v46; // edx@120
1582 int *j; // eax@121
1583 unsigned int v48; // ecx@123
1584 int v49; // eax@123
1585 int v50; // eax@123
1586 int Dst[800]; // [sp+Ch] [bp-C88h]@33
1587 int v52; // [sp+C8Ch] [bp-8h]@33
1588 int v53; // [sp+C90h] [bp-4h]@1
1589 int v54; // [sp+C9Ch] [bp+8h]@3
1590 //int v55; // [sp+CA0h] [bp+Ch]@34
1591 signed int v56; // [sp+CA0h] [bp+Ch]@55
1592 int v57; // [sp+CA0h] [bp+Ch]@62
1593 int *v58; // [sp+CA0h] [bp+Ch]@102
1594 int v59; // [sp+CA0h] [bp+Ch]@123
1595 //signed int a2a; // [sp+CA4h] [bp+10h]@33
1596 int a2b; // [sp+CA4h] [bp+10h]@101
1597 int a2c; // [sp+CA4h] [bp+10h]@120
1598
1599 v53 = -1;
1600 v5 = this;
1601 if (!out_item)
1602 out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen");
1603 memset(out_item, 0, sizeof(*out_item));
1604
1605 v4 = out_item;
1606 v6 = treasure_level - 1;
1607 v54 = treasure_level - 1;
1608 if ( uTreasureType ) //generate known treasure type
1609 {
1610 ITEM_EQUIP_TYPE requested_equip;
1611 PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID;
1612 switch (uTreasureType)
1613 {
1614 case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break;
1615 case 21: requested_equip = EQUIP_ARMOUR; break;
1616 case 22: requested_skill = PLAYER_SKILL_MISC; break;
1617 case 23: requested_skill = PLAYER_SKILL_SWORD; break;
1618 case 24: requested_skill = PLAYER_SKILL_DAGGER; break;
1619 case 25: requested_skill = PLAYER_SKILL_AXE; break;
1620 case 26: requested_skill = PLAYER_SKILL_SPEAR; break;
1621 case 27: requested_skill = PLAYER_SKILL_BOW; break;
1622 case 28: requested_skill = PLAYER_SKILL_MACE; break;
1623 case 29: requested_skill = PLAYER_SKILL_CLUB; break;
1624 case 30: requested_skill = PLAYER_SKILL_STAFF; break;
1625 case 31: requested_skill = PLAYER_SKILL_LEATHER; break;
1626 case 32: requested_skill = PLAYER_SKILL_CHAIN; break;
1627 case 33: requested_skill = PLAYER_SKILL_PLATE; break;
1628 case 34: requested_equip = EQUIP_SHIELD; break;
1629 case 35: requested_equip = EQUIP_HELMET; break;
1630 case 36: requested_equip = EQUIP_BELT; break;
1631 case 37: requested_equip = EQUIP_CLOAK; break;
1632 case 38: requested_equip = EQUIP_GAUNTLETS; break;
1633 case 39: requested_equip = EQUIP_BOOTS; break;
1634 case 40: requested_equip = EQUIP_RING; break;
1635 case 41: requested_equip = EQUIP_AMULET; break;
1636 case 42: requested_equip = EQUIP_WAND; break;
1637 case 43: requested_equip = EQUIP_SPELL_SCROLL; break;
1638 case 44: requested_equip = EQUIP_POTION; break;
1639 case 45: requested_equip = EQUIP_REAGENT; break;
1640 case 46: requested_equip = EQUIP_GEM; break;
1641 default:
1642 __debugbreak(); // check this condition
1643 requested_equip = (ITEM_EQUIP_TYPE)(uTreasureType - 1);
1644 break;
1645 }
1646 memset(Dst, 0, sizeof(Dst));
1647 v52 = 0;
1648 v7 = Dst;
1649 //a2a = 1;
1650 if (requested_skill == PLAYER_SKILL_INVALID) // no skill for this item needed
1651 { 1537 {
1652 for (uint i = 1; i < 500; ++i) 1538
1653 { 1539 ItemsTable *v5; // edi@1
1654 if (pItems[i].uEquipType == requested_equip) 1540 int v6; // ebx@3
1541 int *v7; // ecx@33
1542 //int v8; // eax@34
1543 //int v9; // eax@39
1544 int current_chance; // ebx@43
1545 int tmp_chance; // ecx@47
1546 unsigned int *v12; // edx@48
1547 unsigned int v13; // eax@49
1548 signed int v14; // ebx@52
1549 int v15; // eax@53
1550 signed int v16; // eax@55
1551 int v17; // ebx@57
1552 int v18; // edx@62
1553 signed int v19; // ebx@70
1554 unsigned __int8 v20; // al@81
1555 int v21; // eax@84
1556 int v22; // ebx@85
1557 int v23; // eax@86
1558 int v24; // ebx@86
1559 int special_chance; // edx@86
1560 int v26; // edx@89
1561 unsigned int v27; // eax@89
1562 int i; // ebx@89
1563 unsigned int v29; // ecx@90
1564 int v30; // ebx@91
1565 int v31; // eax@91
1566 int v32; // ecx@91
1567 int v33; // eax@91
1568 int v34; // eax@97
1569 unsigned __int8 v35; // sf@97
1570 unsigned __int8 v36; // of@97
1571 int v37; // ebx@98
1572 int v38; // edx@99
1573 signed int v39; // ebx@101
1574 int v40; // ecx@102
1575 char v41; // zf@107
1576 char v42; // al@108
1577 char v43; // al@111
1578 int *v44; // edx@118
1579 int v45; // eax@120
1580 int v46; // edx@120
1581 int j; // eax@121
1582 unsigned int v48; // ecx@123
1583 int v49; // eax@123
1584 int v50; // eax@123
1585 int val_list[800]; // [sp+Ch] [bp-C88h]@33
1586 int total_chance; // [sp+C8Ch] [bp-8h]@33
1587 int v53; // [sp+C90h] [bp-4h]@1
1588 int v54; // [sp+C9Ch] [bp+8h]@3
1589 //int v55; // [sp+CA0h] [bp+Ch]@34
1590 signed int v56; // [sp+CA0h] [bp+Ch]@55
1591 int v57; // [sp+CA0h] [bp+Ch]@62
1592 int *v58; // [sp+CA0h] [bp+Ch]@102
1593 int v59; // [sp+CA0h] [bp+Ch]@123
1594 //signed int a2a; // [sp+CA4h] [bp+10h]@33
1595 int a2b; // [sp+CA4h] [bp+10h]@101
1596 int a2c; // [sp+CA4h] [bp+10h]@120
1597
1598 v5 = this;
1599 if (!out_item)
1600 out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen");
1601 memset(out_item, 0, sizeof(*out_item));
1602
1603
1604 v6 = treasure_level - 1;
1605 v54 = treasure_level - 1;
1606 if ( uTreasureType ) //generate known treasure type
1655 { 1607 {
1656 *v7++ = i; 1608 ITEM_EQUIP_TYPE requested_equip;
1657 v52 += pItems[i].uChanceByTreasureLvl[v6]; 1609 PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID;
1610 switch (uTreasureType)
1611 {
1612 case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break;
1613 case 21: requested_equip = EQUIP_ARMOUR; break;
1614 case 22: requested_skill = PLAYER_SKILL_MISC; break;
1615 case 23: requested_skill = PLAYER_SKILL_SWORD; break;
1616 case 24: requested_skill = PLAYER_SKILL_DAGGER; break;
1617 case 25: requested_skill = PLAYER_SKILL_AXE; break;
1618 case 26: requested_skill = PLAYER_SKILL_SPEAR; break;
1619 case 27: requested_skill = PLAYER_SKILL_BOW; break;
1620 case 28: requested_skill = PLAYER_SKILL_MACE; break;
1621 case 29: requested_skill = PLAYER_SKILL_CLUB; break;
1622 case 30: requested_skill = PLAYER_SKILL_STAFF; break;
1623 case 31: requested_skill = PLAYER_SKILL_LEATHER; break;
1624 case 32: requested_skill = PLAYER_SKILL_CHAIN; break;
1625 case 33: requested_skill = PLAYER_SKILL_PLATE; break;
1626 case 34: requested_equip = EQUIP_SHIELD; break;
1627 case 35: requested_equip = EQUIP_HELMET; break;
1628 case 36: requested_equip = EQUIP_BELT; break;
1629 case 37: requested_equip = EQUIP_CLOAK; break;
1630 case 38: requested_equip = EQUIP_GAUNTLETS; break;
1631 case 39: requested_equip = EQUIP_BOOTS; break;
1632 case 40: requested_equip = EQUIP_RING; break;
1633 case 41: requested_equip = EQUIP_AMULET; break;
1634 case 42: requested_equip = EQUIP_WAND; break;
1635 case 43: requested_equip = EQUIP_SPELL_SCROLL; break;
1636 case 44: requested_equip = EQUIP_POTION; break;
1637 case 45: requested_equip = EQUIP_REAGENT; break;
1638 case 46: requested_equip = EQUIP_GEM; break;
1639 default:
1640 __debugbreak(); // check this condition
1641 requested_equip = (ITEM_EQUIP_TYPE)(uTreasureType - 1);
1642 break;
1643 }
1644 memset(val_list, 0, sizeof(val_list));
1645 total_chance = 0;
1646 j=0;
1647 //a2a = 1;
1648 if (requested_skill == PLAYER_SKILL_INVALID) // no skill for this item needed
1649 {
1650 for (uint i = 1; i < 500; ++i)
1651 {
1652 if (pItems[i].uEquipType == requested_equip)
1653 {
1654 val_list[j] = i;
1655 ++j;
1656 total_chance += pItems[i].uChanceByTreasureLvl[treasure_level - 1];
1657 }
1658 }
1659 }
1660 else //have needed skill
1661 {
1662 for (uint i = 1; i < 500; ++i)
1663 {
1664 if (pItems[i].uSkillType == requested_skill)
1665 {
1666 val_list[j] = i;
1667 ++j;
1668 total_chance += pItems[i].uChanceByTreasureLvl[treasure_level - 1];
1669 }
1670 }
1671 }
1672
1673 current_chance = 0;
1674 if ( total_chance )
1675 current_chance = rand() % total_chance;
1676
1677 out_item->uItemID = val_list[0];
1678 if (!out_item->uItemID)
1679 out_item->uItemID = 1;
1680
1681 if ( pItems[out_item->uItemID].uChanceByTreasureLvl[treasure_level - 1] < current_chance )
1682 {
1683 j=0;
1684 tmp_chance=pItems[out_item->uItemID].uChanceByTreasureLvl[treasure_level - 1];
1685 do
1686 {
1687 ++j;
1688 out_item->uItemID = val_list[j];
1689 tmp_chance += pItems[val_list[j]].uChanceByTreasureLvl[treasure_level - 1];
1690 }
1691 while ( tmp_chance < current_chance );
1692 }
1693
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 }
1658 } 1701 }
1659 } 1702 else
1660 }
1661 else //have needed skill
1662 {
1663 for (uint i = 1; i < 500; ++i)
1664 {
1665 if (pItems[i].uSkillType == requested_skill)
1666 { 1703 {
1667 *v7++ = i; 1704 //artifact
1668 v52 += pItems[i].uChanceByTreasureLvl[v6]; 1705 v56 = 0;
1706 for(int i=0; i<29; ++i)
1707 v56 += pParty->pIsArtifactFound[i];
1708
1709 v17 = rand() % 29;
1710
1711 if ( v6 == 5 && (rand() % 100 < 5) && !pParty->pIsArtifactFound[v17] && v56 < 13 )
1712 {
1713 pParty->pIsArtifactFound[v17] = 1;
1714 out_item->uAttributes = 0;
1715 out_item->uItemID = v17 + 500;
1716 SetSpecialBonus(out_item);
1717 return;
1718 }
1719
1720 v57 = 0;
1721 v18 = rand() % v5->uChanceByTreasureLvlSumm[treasure_level - 1];
1722 out_item->uItemID = 0;
1723 if ( v18 > 0 )
1724 {
1725 do
1726 v57 += pItems[out_item->uItemID++ + 1].uChanceByTreasureLvl[v6];
1727 while ( v57 < v18 );
1728 }
1729
1730 if ( !v18 )
1731 out_item->uItemID = 1;
1732 if ( !out_item->uItemID )
1733 out_item->uItemID = 1;
1734 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE )
1735 {// if it potion set potion spec
1736 out_item->uEncantmentType = 0;
1737 for (int i=0; i<2; ++i)
1738 out_item->uEncantmentType += rand() % 4 + 1;
1739 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1740 }
1741 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1669 } 1742 }
1670 } 1743
1671 } 1744 if ( out_item->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION
1672 1745 && !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, 239) )
1673 v10 = 0; 1746 out_item->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST;
1674 if ( v52 ) 1747 if ( pItemsTable->pItems[out_item->uItemID + 1].uItemID_Rep_St )
1675 v10 = rand() % v52; 1748 out_item->uAttributes = 0;
1676 1749 else
1677 out_item->uItemID = *Dst; 1750 out_item->uAttributes = 1;
1678 if (!out_item->uItemID) 1751
1679 out_item->uItemID = 1; 1752 if ( pItems[out_item->uItemID].uEquipType != EQUIP_POTION )
1680 1753 {
1681 v11 = pItems[out_item->uItemID].uChanceByTreasureLvl[v6]; 1754 out_item->uSpecEnchantmentType = 0;
1682 if ( v11 < v10 ) 1755 out_item->uEncantmentType = 0;
1683 { 1756 }
1684 v12 = (uint *)Dst; 1757 //try get special enhansment
1685 do 1758 switch (pItems[out_item->uItemID].uEquipType)
1686 { 1759 {
1687 ++v12; 1760 case EQUIP_ONE_OR_TWO_HANDS:
1688 v13 = *v12; 1761 case EQUIP_TWO_HANDED :
1689 out_item->uItemID = *v12; 1762 case EQUIP_BOW :
1690 v11 += pItems[v13].uChanceByTreasureLvl[v6]; 1763 if ( !uBonusChanceWpSpecial[v6] )
1691 } 1764 return;
1692 while ( v11 < v10 ); 1765 if ((rand() % 100)>=uBonusChanceWpSpecial[v6])
1693 } 1766 return;
1694 1767 break;
1695 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) 1768 case EQUIP_ARMOUR :
1696 {// if it potion set potion spec 1769 case EQUIP_SHIELD :
1697 out_item->uEncantmentType = 0; 1770 case EQUIP_HELMET :
1698 for (int i=0; i<2; ++i) 1771 case EQUIP_BELT :
1699 out_item->uEncantmentType += rand() % 4 + 1; 1772 case EQUIP_CLOAK :
1700 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; 1773 case EQUIP_GAUNTLETS :
1701 } 1774 case EQUIP_BOOTS :
1702 } 1775 case EQUIP_RING :
1703 else 1776 v22 = uBonusChanceStandart[v6];
1704 { 1777 if ( !uBonusChanceStandart[v6] )
1705 v16 = 0; 1778 return;
1706 v56 = 0; 1779 v24 = v22;
1707 do 1780 special_chance = rand() % 100;
1708 v56 += pParty->pIsArtifactFound[v16++]; 1781 if ( !uBonusChanceSpecial[v6] && !(special_chance < uBonusChanceStandart[v6]))
1709 while ( v16 < 29 ); 1782 return;
1710 v17 = rand() % 29; 1783 if ( special_chance < uBonusChanceStandart[v6])
1711 1784 {
1712 if ( v6 == 5 && rand() % 100 < 5 && !pParty->pIsArtifactFound[v17] && v56 < 13 ) 1785 v26 = rand() % v5->uBonusChanceWpSpecial[v5->pItems[out_item->uItemID].uEquipType + 3];
1713 { 1786 v27 = out_item->uItemID;
1714 pParty->pIsArtifactFound[v17] = 1; 1787 out_item->uEncantmentType = 0;
1715 out_item->uAttributes = 0; 1788 for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1];
1716 out_item->uItemID = v17 + 500; 1789 i < v26;
1717 SetSpecialBonus(out_item); 1790 i += pEnchantments[out_item->uEncantmentType].to_item[pItems[v29].uEquipType + 1] )
1718 return; 1791 {
1719 } 1792 v29 = out_item->uItemID;
1720 1793 ++out_item->uEncantmentType;
1721 v57 = 0; 1794 }
1722 v18 = rand() % v5->uChanceByTreasureLvlSumm[v54];// v5->field_11684[v54]; 1795 ++out_item->uEncantmentType;
1723 out_item->uItemID = 0; 1796 v30 = bonus_ranges[v6].minR;
1724 if ( v18 > 0 ) 1797 v32 = out_item->uEncantmentType - 1;
1725 { 1798 v33 = rand() % (bonus_ranges[v6].maxR - v30 + 1) + v30;
1726 do 1799 out_item->_bonus_strength = v33;
1727 v57 += pItems[out_item->uItemID++ + 1].uChanceByTreasureLvl[v6]; 1800 if ( v32 == 21 || v32 == 22 || v32 == 23 )
1728 while ( v57 < v18 ); 1801 out_item->_bonus_strength = v33 >> 1;
1729 } 1802 if ( out_item->_bonus_strength <= 0 )
1730 1803 out_item->_bonus_strength = 1;
1731 if ( !v18 ) 1804 return;
1732 out_item->uItemID = 1; 1805
1733 if ( !out_item->uItemID ) 1806 }
1734 out_item->uItemID = 1; 1807 v34 = uBonusChanceStandart[v6] + uBonusChanceSpecial[v6];
1735 if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) 1808 if ( special_chance<v34 )
1736 {// if it potion set potion spec 1809 return;
1737 out_item->uEncantmentType = 0; 1810 break;
1738 for (int i=0; i<2; ++i) 1811 case EQUIP_WAND:
1739 out_item->uEncantmentType += rand() % 4 + 1; 1812 out_item->uNumCharges = rand() % 6 + pItemsTable->pItems[out_item->uItemID].uDamageMod + 1;
1740 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; 1813 out_item->uMaxCharges = out_item->uNumCharges;
1741 } 1814 default:
1742 out_item->uEncantmentType = out_item->uEncantmentType * treasure_level;
1743 }
1744 if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION
1745 && !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, 239) )
1746 v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST;
1747 if ( pItemsTable->pItems[v4->uItemID + 1].uItemID_Rep_St )
1748 v4->uAttributes = 0;
1749 else
1750 v4->uAttributes = 1;
1751 if ( pItems[out_item->uItemID].uEquipType != EQUIP_POTION )
1752 {
1753 out_item->uSpecEnchantmentType = 0;
1754 out_item->uEncantmentType = 0;
1755 }
1756 v20 = pItems[out_item->uItemID].uEquipType;
1757 if ( v20 <= EQUIP_BOW )
1758 {
1759 v37 = v5->uBonusChanceWpSpecial[v54];
1760 if ( !v37 )
1761 return;
1762 v38 = rand() % 100;
1763 v36 = __OFSUB__(v38, v37);
1764 v35 = v38 - v37 < 0;
1765 }
1766 else
1767 {
1768 if ( v20 > EQUIP_AMULET )
1769 {
1770 if ( v20 == EQUIP_WAND )
1771 {
1772 v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1;
1773 out_item->uNumCharges = v21;
1774 out_item->uMaxCharges = v21;
1775 }
1776 return;
1777 }
1778 v22 = uBonusChanceStandart[v6];
1779 if ( !v22 )
1780 return;
1781 v24 = v22;
1782 v25 = rand() % 100;
1783 if ( !uBonusChanceSpecial[v6] && !(v25 < v24))
1784 return; 1815 return;
1785 if ( v25 < v24 || v25 < v24) 1816 }
1786 { 1817
1787 v26 = rand() % v5->uBonusChanceWpSpecial[v5->pItems[v4->uItemID].uEquipType + 3]; 1818 j=0;
1788 v27 = v4->uItemID; 1819 int spc_sum=0;
1789 v4->uEncantmentType = 0; 1820 int spc;
1790 for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1]; 1821 memset(&val_list, 0, 3200);
1791 i < v26; 1822 for (int i=0; i<pSpecialEnchantments_count;++i)
1792 i += pEnchantments[v4->uEncantmentType].to_item[pItems[v29].uEquipType + 1] ) 1823 {
1793 { 1824 int tr_lv= pSpecialEnchantments[i].iTreasureLevel;
1794 v29 = v4->uItemID; 1825 switch ( treasure_level - 1 )
1795 ++v4->uEncantmentType; 1826 {
1796 }
1797 ++v4->uEncantmentType;
1798 v30 = 10;// v5->field_116D8[2 * v54 + 12];
1799 v31 = rand();
1800 v32 = v4->uEncantmentType - 1;
1801 v33 = v31 % 10;//(v5->field_116D8[2 * v54 + 13] - v30 + 1) + v30;
1802 v4->_bonus_strength = v33;
1803 if ( v32 == 21 || v32 == 22 || v32 == 23 )
1804 v4->_bonus_strength = v33 >> 1;
1805 if ( v4->_bonus_strength <= 0 )
1806 v4->_bonus_strength = 1;
1807 return;
1808 }
1809 v34 = v24 + 10;//*(unsigned int *)&v5->field_1169C[4 * v54 + 24];
1810 v36 = __OFSUB__(v25, v34);
1811 v35 = v25 - v34 < 0;
1812 }
1813 if ( !(v35 ^ v36) )
1814 return;
1815 memset(&Dst, 0, 0xC80u);
1816 v39 = 0;
1817 a2b = 0;
1818 if ( pSpecialEnchantments_count > 0 )
1819 {
1820 v52 = -16 - (uint)this;
1821 v58 = (int *)&Dst;
1822 v40 = (int)&pSpecialEnchantments[1];
1823 do
1824 {
1825 switch ( v6 )
1826 {
1827 case 2: 1827 case 2:
1828 if ( !*(unsigned char *)v40 ) 1828 if ((tr_lv==1)||(tr_lv==0))
1829 { 1829 {
1830 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType); 1830 spc=pSpecialEnchantments[i].to_item_apply[pItems[out_item->uItemID].uEquipType];
1831 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) ) 1831 spc_sum+=spc;
1832 if(spc)
1833 {
1834 val_list[j++]=i;
1835 }
1836 }
1837 break;
1838 case 3:
1839 if ((tr_lv==2)||(tr_lv==1)||(tr_lv==0))
1840 {
1841 spc=pSpecialEnchantments[i].to_item_apply[pItems[out_item->uItemID].uEquipType];
1842 spc_sum+=spc;
1843 if(spc)
1844 {
1845 val_list[j++]=i;
1846 }
1847 }
1848 break;
1849 case 4:
1850 if ((tr_lv==3)||(tr_lv==2)||(tr_lv==1))
1851 {
1852 spc=pSpecialEnchantments[i].to_item_apply[pItems[out_item->uItemID].uEquipType];
1853 spc_sum+=spc;
1854 if(spc)
1855 {
1856 val_list[j++]=i;
1857 }
1858 }
1859 break;
1860 case 5:
1861 if (tr_lv==3)
1862 {
1863 spc=pSpecialEnchantments[i].to_item_apply[pItems[out_item->uItemID].uEquipType];
1864 spc_sum+=spc;
1865 if(spc)
1866 {
1867 val_list[j++]=i;
1868 }
1869 }
1870 break;
1871 }
1872 }
1873
1874 v46 = rand()%spc_sum+1;
1875 j=0;
1876 out_item->uSpecEnchantmentType =val_list[j];
1877 v45=pSpecialEnchantments[val_list[j]].to_item_apply[pItems[out_item->uItemID].uEquipType];
1878 if (v45<v46)
1879 {
1880 do
1832 { 1881 {
1833 v44 = v58; 1882 ++j;
1834 ++v58; 1883 out_item->uSpecEnchantmentType=val_list[j];
1835 *v44 = a2b; 1884 v45+=pSpecialEnchantments[val_list[j]].to_item_apply[pItems[out_item->uItemID].uEquipType];
1836 } 1885 } while (v45<v46);
1837 ++a2b; 1886 }
1838 v40 += 28; 1887 ++out_item->uSpecEnchantmentType;
1839 continue;
1840 }
1841 v41 = *(unsigned char *)v40 == 1;
1842 break;
1843 case 3:
1844 v43 = *(unsigned char *)v40;
1845 if ( !*(unsigned char *)v40 || v43 == 1 )
1846 {
1847 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType);
1848 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) )
1849 {
1850 v44 = v58;
1851 ++v58;
1852 *v44 = a2b;
1853 }
1854 ++a2b;
1855 v40 += 28;
1856 continue;
1857 }
1858 v41 = v43 == 2;
1859 break;
1860 case 4:
1861 v42 = *(unsigned char *)v40;
1862 if ( *(unsigned char *)v40 == 1 || v42 == 2 )
1863 {
1864 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType);
1865 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) )
1866 {
1867 v44 = v58;
1868 ++v58;
1869 *v44 = a2b;
1870 }
1871 ++a2b;
1872 v40 += 28;
1873 continue;
1874 }
1875 v41 = v42 == 3;
1876 break;
1877 default:
1878 if ( v6 != 5 )
1879 {
1880 ++a2b;
1881 v40 += 28;
1882 continue;
1883 }
1884 v41 = *(unsigned char *)v40 == 3;
1885 break;
1886 }
1887 if ( v41 )
1888 {
1889 v39 += *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType);
1890 if ( *((unsigned char *)&uAllItemsCount + v40 + v52 + pItems[v4->uItemID].uEquipType) )
1891 {
1892 v44 = v58;
1893 ++v58;
1894 *v44 = a2b;
1895 }
1896 }
1897 LABEL_119:
1898 ++a2b;
1899 v40 += 28;
1900 }
1901 while ( a2b < pSpecialEnchantments_count );
1902 }
1903 v45 = rand();
1904 v4->uSpecEnchantmentType = *(uint *)Dst;
1905 v46 = v45 % v39 + 1;
1906 a2c = *((unsigned char *)&uAllItemsCount + 28 * (*(uint *)Dst + 1389) + pItems[v4->uItemID].uEquipType);
1907 if ( a2c < v46 )
1908 {
1909 for ( j = (int *)&Dst; ; j = (int *)v59 )
1910 {
1911 v48 = v4->uItemID;
1912 v49 = (int)(j + 1);
1913 v59 = v49;
1914 v50 = *(unsigned int *)v49;
1915 v4->uSpecEnchantmentType = v50;
1916 a2c += *((unsigned char *)&uAllItemsCount + 28 * (v50 + 1389) + pItems[v48].uEquipType);
1917 if ( a2c >= v46 )
1918 break;
1919 }
1920 }
1921 ++v4->uSpecEnchantmentType;
1922 } 1888 }
1923 1889
1924 //----- (004505CC) -------------------------------------------------------- 1890 //----- (004505CC) --------------------------------------------------------
1925 bool ItemGen::GenerateArtifact() 1891 bool ItemGen::GenerateArtifact()
1926 { 1892 {