Mercurial > mm7
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 { |