/* * UNPUBLISHED -- Rights reserved under the copyright laws of the * United States. Use of a copyright notice is precautionary only and * does not imply publication or disclosure. * * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION * OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION, * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT. */ #include "../types.h" int itemactive[127]; int uitemflag; int itemavail[127]; ItemStruct curruitem; ItemGetRecordStruct itemrecord[127]; ItemStruct item[128]; char itemhold[3][3]; char byte_641234[28]; /* check if part of above */ int Item2Frm[35]; int UniqueItemFlag[128]; int numitems; int gnNumGetRecords; PLStruct PL_Prefix[84] = { { "Tin", IPL_TOHIT_CURSE, 6, 10, 3, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 1, 0, 0, 0, -3 }, { "Brass", IPL_TOHIT_CURSE, 1, 5, 1, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 1, 0, 0, 0, -2 }, { "Bronze", IPL_TOHIT, 1, 5, 1, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 1, 1, 100, 500, 2 }, { "Iron", IPL_TOHIT, 6, 10, 4, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 1, 1, 600, 1000, 3 }, { "Steel", IPL_TOHIT, 11, 15, 6, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 1, 1, 1100, 1500, 5 }, { "Silver", IPL_TOHIT, 16, 20, 9, PLT_WEAP|PLT_BOW|PLT_MISC, 16, 1, 1, 1600, 2000, 7 }, { "Gold", IPL_TOHIT, 21, 30, 12, PLT_WEAP|PLT_BOW|PLT_MISC, 16, 1, 1, 2100, 3000, 9 }, { "Platinum", IPL_TOHIT, 31, 40, 16, PLT_WEAP|PLT_BOW, 16, 1, 1, 3100, 4000, 11 }, { "Mithril", IPL_TOHIT, 41, 60, 20, PLT_WEAP|PLT_BOW, 16, 1, 1, 4100, 6000, 13 }, { "Meteoric", IPL_TOHIT, 61, 80, 23, PLT_WEAP|PLT_BOW, 0, 1, 1, 6100, 10000, 15 }, { "Weird", IPL_TOHIT, 81, 100, 35, PLT_WEAP|PLT_BOW, 0, 1, 1, 10100, 14000, 17 }, { "Strange", IPL_TOHIT, 101, 150, 60, PLT_WEAP|PLT_BOW, 0, 1, 1, 14100, 20000, 20 }, { "Useless", IPL_DAMP_CURSE, 100, 100, 5, PLT_WEAP|PLT_BOW, 0, 1, 0, 0, 0, -8 }, { "Bent", IPL_DAMP_CURSE, 50, 75, 3, PLT_WEAP|PLT_BOW, 0, 1, 0, 0, 0, -4 }, { "Weak", IPL_DAMP_CURSE, 25, 45, 1, PLT_WEAP|PLT_BOW, 0, 1, 0, 0, 0, -3 }, { "Jagged", IPL_DAMP, 20, 35, 4, PLT_WEAP|PLT_BOW, 0, 1, 1, 250, 450, 3 }, { "Deadly", IPL_DAMP, 36, 50, 6, PLT_WEAP|PLT_BOW, 0, 1, 1, 500, 700, 4 }, { "Heavy", IPL_DAMP, 51, 65, 9, PLT_WEAP|PLT_BOW, 0, 1, 1, 750, 950, 5 }, { "Vicious", IPL_DAMP, 66, 80, 12, PLT_WEAP|PLT_BOW, 1, 1, 1, 1000, 1450, 8 }, { "Brutal", IPL_DAMP, 81, 95, 16, PLT_WEAP|PLT_BOW, 0, 1, 1, 1500, 1950, 10 }, { "Massive", IPL_DAMP, 96, 110, 20, PLT_WEAP|PLT_BOW, 0, 1, 1, 2000, 2450, 13 }, { "Savage", IPL_DAMP, 111, 125, 23, PLT_WEAP|PLT_BOW, 0, 1, 1, 2500, 3000, 15 }, { "Ruthless", IPL_DAMP, 126, 150, 35, PLT_WEAP|PLT_BOW, 0, 1, 1, 10100, 15000, 17 }, { "Merciless", IPL_DAMP, 151, 175, 60, PLT_WEAP|PLT_BOW, 0, 1, 1, 15000, 20000, 20 }, { "Clumsy", IPL_TOHIT_DAMP_CURSE, 50, 75, 5, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 1, 0, 0, 0, -7 }, { "Dull", IPL_TOHIT_DAMP_CURSE, 25, 45, 1, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 1, 0, 0, 0, -5 }, { "Sharp", IPL_TOHIT_DAMP, 20, 35, 1, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 1, 0, 350, 950, 5 }, { "Fine", IPL_TOHIT_DAMP, 36, 50, 6, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 1, 1, 1100, 1700, 7 }, { "Warrior's", IPL_TOHIT_DAMP, 51, 65, 10, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 1, 1, 1850, 2450, 13 }, { "Soldier's", IPL_TOHIT_DAMP, 66, 80, 15, PLT_WEAP|PLT_STAFF, 0, 1, 1, 2600, 3950, 17 }, { "Lord's", IPL_TOHIT_DAMP, 81, 95, 19, PLT_WEAP|PLT_STAFF, 0, 1, 1, 4100, 5950, 21 }, { "Knight's", IPL_TOHIT_DAMP, 96, 110, 23, PLT_WEAP|PLT_STAFF, 0, 1, 1, 6100, 8450, 26 }, { "Master's", IPL_TOHIT_DAMP, 111, 125, 28, PLT_WEAP|PLT_STAFF, 0, 1, 1, 8600, 13000, 30 }, { "Champion's", IPL_TOHIT_DAMP, 126, 150, 40, PLT_WEAP|PLT_STAFF, 0, 1, 1, 15200, 24000, 33 }, { "King's", IPL_TOHIT_DAMP, 151, 175, 28, PLT_WEAP|PLT_STAFF, 0, 1, 1, 24100, 35000, 38 }, { "Vulnerable", IPL_ACP_CURSE, 51, 100, 3, PLT_ARMO|PLT_SHLD, 0, 1, 0, 0, 0, -3 }, { "Rusted", IPL_ACP_CURSE, 25, 50, 1, PLT_ARMO|PLT_SHLD, 0, 1, 0, 0, 0, -2 }, { "Fine", IPL_ACP, 20, 30, 1, PLT_ARMO|PLT_SHLD, 0, 1, 1, 20, 100, 2 }, { "Strong", IPL_ACP, 31, 40, 3, PLT_ARMO|PLT_SHLD, 0, 1, 1, 120, 200, 3 }, { "Grand", IPL_ACP, 41, 55, 6, PLT_ARMO|PLT_SHLD, 0, 1, 1, 220, 300, 5 }, { "Valiant", IPL_ACP, 56, 70, 10, PLT_ARMO|PLT_SHLD, 0, 1, 1, 320, 400, 7 }, { "Glorious", IPL_ACP, 71, 90, 14, PLT_ARMO|PLT_SHLD, 16, 1, 1, 420, 600, 9 }, { "Blessed", IPL_ACP, 91, 110, 19, PLT_ARMO|PLT_SHLD, 16, 1, 1, 620, 800, 11 }, { "Saintly", IPL_ACP, 111, 130, 24, PLT_ARMO|PLT_SHLD, 16, 1, 1, 820, 1200, 13 }, { "Awesome", IPL_ACP, 131, 150, 28, PLT_ARMO|PLT_SHLD, 16, 1, 1, 1220, 2000, 15 }, { "Holy", IPL_ACP, 151, 170, 35, PLT_ARMO|PLT_SHLD, 16, 1, 1, 5200, 6000, 17 }, { "Godly", IPL_ACP, 171, 200, 60, PLT_ARMO|PLT_SHLD, 16, 1, 1, 6200, 7000, 20 }, { "Red", IPL_FIRERES, 10, 20, 4, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 500, 1500, 2 }, { "Crimson", IPL_FIRERES, 21, 30, 10, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 2100, 3000, 2 }, { "Crimson", IPL_FIRERES, 31, 40, 16, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 3100, 4000, 2 }, { "Garnet", IPL_FIRERES, 41, 50, 20, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 8200, 12000, 3 }, { "Ruby", IPL_FIRERES, 51, 60, 26, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 17100, 20000, 5 }, { "Blue", IPL_LIGHTRES, 10, 20, 4, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 500, 1500, 2 }, { "Azure", IPL_LIGHTRES, 21, 30, 10, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 2100, 3000, 2 }, { "Lapis", IPL_LIGHTRES, 31, 40, 16, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 3100, 4000, 2 }, { "Cobalt", IPL_LIGHTRES, 41, 50, 20, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 8200, 12000, 3 }, { "Sapphire", IPL_LIGHTRES, 51, 60, 26, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 17100, 20000, 5 }, { "White", IPL_MAGICRES, 10, 20, 4, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 500, 1500, 2 }, { "Pearl", IPL_MAGICRES, 21, 30, 10, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 2100, 3000, 2 }, { "Ivory", IPL_MAGICRES, 31, 40, 16, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 3100, 4000, 2 }, { "Crystal", IPL_MAGICRES, 41, 50, 20, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 8200, 12000, 3 }, { "Diamond", IPL_MAGICRES, 51, 60, 26, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 17100, 20000, 5 }, { "Topaz", IPL_ALLRES, 10, 15, 8, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 2000, 5000, 3 }, { "Amber", IPL_ALLRES, 16, 20, 12, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 7400, 10000, 3 }, { "Jade", IPL_ALLRES, 21, 30, 18, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 11000, 15000, 3 }, { "Obsidian", IPL_ALLRES, 31, 40, 24, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 24000, 40000, 4 }, { "Emerald", IPL_ALLRES, 41, 50, 31, PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 0, 1, 61000, 75000, 7 }, { "Hyena's", IPL_MANA_CURSE, 11, 25, 4, PLT_STAFF|PLT_MISC, 0, 0, 0, 100, 1000, -2 }, { "Frog's", IPL_MANA_CURSE, 1, 10, 1, PLT_STAFF|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "Spider's", IPL_MANA, 10, 15, 1, PLT_STAFF|PLT_MISC, 1, 0, 1, 500, 1000, 2 }, { "Raven's", IPL_MANA, 15, 20, 5, PLT_STAFF|PLT_MISC, 0, 0, 1, 1100, 2000, 3 }, { "Snake's", IPL_MANA, 21, 30, 9, PLT_STAFF|PLT_MISC, 0, 0, 1, 2100, 4000, 5 }, { "Serpent's", IPL_MANA, 30, 40, 15, PLT_STAFF|PLT_MISC, 0, 0, 1, 4100, 6000, 7 }, { "Drake's", IPL_MANA, 41, 50, 21, PLT_STAFF|PLT_MISC, 0, 0, 1, 6100, 10000, 9 }, { "Dragon's", IPL_MANA, 51, 60, 27, PLT_STAFF|PLT_MISC, 0, 0, 1, 10100, 15000, 11 }, { "Wyrm's", IPL_MANA, 61, 80, 35, PLT_STAFF, 0, 0, 1, 15100, 19000, 12 }, { "Hydra's", IPL_MANA, 81, 100, 60, PLT_STAFF, 0, 0, 1, 19100, 30000, 13 }, { "Angel's", IPL_SPLLVLADD, 1, 1, 15, PLT_STAFF, 16, 0, 1, 25000, 25000, 2 }, { "Arch-Angel's", IPL_SPLLVLADD, 2, 2, 25, PLT_STAFF, 16, 0, 1, 50000, 50000, 3 }, { "Plentiful", IPL_CHARGES, 2, 2, 4, PLT_STAFF, 0, 0, 1, 2000, 2000, 2 }, { "Bountiful", IPL_CHARGES, 3, 3, 9, PLT_STAFF, 0, 0, 1, 3000, 3000, 3 }, { "Flaming", IPL_FIREDAM, 1, 10, 7, PLT_WEAP|PLT_STAFF, 0, 0, 1, 5000, 5000, 2 }, { "Lightning", IPL_LIGHTDAM, 2, 20, 18, PLT_WEAP|PLT_STAFF, 0, 0, 1, 10000, 10000, 2 }, { &empty_string, IPL_INVALID, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; PLStruct PL_Suffix[96] = { { "quality", IPL_DAMMOD, 1, 2, 2, PLT_WEAP|PLT_BOW, 0, 0, 1, 100, 200, 2 }, { "maiming", IPL_DAMMOD, 3, 5, 7, PLT_WEAP|PLT_BOW, 0, 0, 1, 1300, 1500, 3 }, { "slaying", IPL_DAMMOD, 6, 8, 15, PLT_WEAP, 0, 0, 1, 2600, 3000, 5 }, { "gore", IPL_DAMMOD, 9, 12, 25, PLT_WEAP, 0, 0, 1, 4100, 5000, 8 }, { "carnage", IPL_DAMMOD, 13, 16, 35, PLT_WEAP, 0, 0, 1, 5100, 10000, 10 }, { "slaughter", IPL_DAMMOD, 17, 20, 60, PLT_WEAP, 0, 0, 1, 10100, 15000, 13 }, { "pain", IPL_GETHIT, 2, 4, 4, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -4 }, // cursed { "tears", IPL_GETHIT, 1, 1, 2, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "health", IPL_GETHIT_CURSE, 1, 1, 2, PLT_ARMO|PLT_SHLD|PLT_MISC, 16, 0, 1, 200, 200, 2 }, // not cursed { "protection", IPL_GETHIT_CURSE, 2, 2, 6, PLT_ARMO|PLT_SHLD, 16, 0, 1, 400, 800, 4 }, { "absorption", IPL_GETHIT_CURSE, 3, 3, 12, PLT_ARMO|PLT_SHLD, 16, 0, 1, 1001, 2500, 10 }, { "deflection", IPL_GETHIT_CURSE, 4, 4, 20, PLT_ARMO, 16, 0, 1, 2500, 6500, 15 }, { "osmosis", IPL_GETHIT_CURSE, 5, 6, 50, PLT_ARMO, 16, 0, 1, 7500, 10000, 20 }, { "frailty", IPL_STR_CURSE, 6, 10, 3, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -3 }, { "weakness", IPL_STR_CURSE, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "strength", IPL_STR, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 200, 1000, 2 }, { "might", IPL_STR, 6, 10, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 1200, 2000, 3 }, { "power", IPL_STR, 11, 15, 11, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 2200, 3000, 4 }, { "giants", IPL_STR, 16, 20, 17, PLT_ARMO|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 3200, 5000, 7 }, { "titans", IPL_STR, 21, 30, 23, PLT_WEAP|PLT_MISC, 0, 0, 1, 5200, 10000, 10 }, { "paralysis", IPL_DEX_CURSE, 6, 10, 3, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -3 }, { "atrophy", IPL_DEX_CURSE, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "dexterity", IPL_DEX, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 200, 1000, 2 }, { "skill", IPL_DEX, 6, 10, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 1200, 2000, 3 }, { "accuracy", IPL_DEX, 11, 15, 11, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 2200, 3000, 4 }, { "precision", IPL_DEX, 16, 20, 17, PLT_ARMO|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 3200, 5000, 7 }, { "perfection", IPL_DEX, 21, 30, 23, PLT_BOW|PLT_MISC, 0, 0, 1, 5200, 10000, 10 }, { "the fool", IPL_MAG_CURSE, 6, 10, 3, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -3 }, { "dyslexia", IPL_MAG_CURSE, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "magic", IPL_MAG, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 200, 1000, 2 }, { "the mind", IPL_MAG, 6, 10, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 1200, 2000, 3 }, { "brilliance", IPL_MAG, 11, 15, 11, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 2200, 3000, 4 }, { "sorcery", IPL_MAG, 16, 20, 17, PLT_ARMO|PLT_WEAP|PLT_STAFF|PLT_BOW|PLT_MISC, 0, 0, 1, 3200, 5000, 7 }, { "wizardry", IPL_MAG, 21, 30, 23, PLT_STAFF|PLT_MISC, 0, 0, 1, 5200, 10000, 10 }, { "illness", IPL_VIT_CURSE, 6, 10, 3, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -3 }, { "disease", IPL_VIT_CURSE, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "vitality", IPL_VIT, 1, 5, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 16, 0, 1, 200, 1000, 2 }, { "zest", IPL_VIT, 6, 10, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 16, 0, 1, 1200, 2000, 3 }, { "vim", IPL_VIT, 11, 15, 11, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 16, 0, 1, 2200, 3000, 4 }, { "vigor", IPL_VIT, 16, 20, 17, PLT_ARMO|PLT_WEAP|PLT_BOW|PLT_MISC, 16, 0, 1, 3200, 5000, 7 }, { "life", IPL_VIT, 21, 30, 23, PLT_MISC, 16, 0, 1, 5200, 10000, 10 }, { "trouble", IPL_ATTRIBS_CURSE, 6, 10, 12, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -10 }, { "the pit", IPL_ATTRIBS_CURSE, 1, 5, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 1, 0, 0, 0, 0, -5 }, { "the sky", IPL_ATTRIBS, 1, 3, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 800, 4000, 5 }, { "the moon", IPL_ATTRIBS, 4, 7, 11, PLT_ARMO|PLT_SHLD|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 4800, 8000, 10 }, { "the stars", IPL_ATTRIBS, 8, 11, 17, PLT_ARMO|PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 8800, 12000, 15 }, { "the heavens", IPL_ATTRIBS, 12, 15, 25, PLT_WEAP|PLT_BOW|PLT_MISC, 0, 0, 1, 12800, 20000, 20 }, { "the zodiac", IPL_ATTRIBS, 16, 20, 30, PLT_MISC, 0, 0, 1, 20800, 40000, 30 }, { "the vulture", IPL_LIFE_CURSE, 11, 25, 4, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -4 }, { "the jackal", IPL_LIFE_CURSE, 1, 10, 1, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "the fox", IPL_LIFE, 10, 15, 1, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 100, 1000, 2 }, { "the jaguar", IPL_LIFE, 16, 20, 5, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 1100, 2000, 3 }, { "the eagle", IPL_LIFE, 21, 30, 9, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 2100, 4000, 5 }, { "the wolf", IPL_LIFE, 30, 40, 15, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 4100, 6000, 7 }, { "the tiger", IPL_LIFE, 41, 50, 21, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 6100, 10000, 9 }, { "the lion", IPL_LIFE, 51, 60, 27, PLT_ARMO|PLT_MISC, 0, 0, 1, 10100, 15000, 11 }, { "the mammoth", IPL_LIFE, 61, 80, 35, PLT_ARMO, 0, 0, 1, 15100, 19000, 12 }, { "the whale", IPL_LIFE, 81, 100, 60, PLT_ARMO, 0, 0, 1, 19100, 30000, 13 }, { "fragility", IPL_DUR_CURSE, 100, 100, 3, PLT_ARMO|PLT_SHLD|PLT_WEAP, 1, 0, 0, 0, 0, -4 }, { "brittleness", IPL_DUR_CURSE, 26, 75, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP, 1, 0, 0, 0, 0, -2 }, { "sturdiness", IPL_DUR, 26, 75, 1, PLT_ARMO|PLT_SHLD|PLT_WEAP, 0, 0, 1, 100, 100, 2 }, { "craftsmanship", IPL_DUR, 51, 100, 6, PLT_ARMO|PLT_SHLD|PLT_WEAP, 0, 0, 1, 200, 200, 2 }, { "structure", IPL_DUR, 101, 200, 12, PLT_ARMO|PLT_SHLD|PLT_WEAP, 0, 0, 1, 300, 300, 2 }, { "the ages", IPL_INDESTRUCTIBLE, 0, 0, 25, PLT_ARMO|PLT_SHLD|PLT_WEAP, 0, 0, 1, 600, 600, 5 }, { "the dark", IPL_LIGHT_CURSE, 4, 4, 6, PLT_ARMO|PLT_WEAP|PLT_MISC, 1, 0, 0, 0, 0, -3 }, { "the night", IPL_LIGHT_CURSE, 2, 2, 3, PLT_ARMO|PLT_WEAP|PLT_MISC, 1, 0, 0, 0, 0, -2 }, { "light", IPL_LIGHT, 2, 2, 4, PLT_ARMO|PLT_WEAP|PLT_MISC, 16, 0, 1, 750, 750, 2 }, { "radiance", IPL_LIGHT, 4, 4, 8, PLT_ARMO|PLT_WEAP|PLT_MISC, 16, 0, 1, 1500, 1500, 3 }, { "flame", IPL_FIRE_ARROWS, 1, 3, 1, PLT_BOW, 0, 0, 1, 2000, 2000, 2 }, { "fire", IPL_FIRE_ARROWS, 1, 6, 11, PLT_BOW, 0, 0, 1, 4000, 4000, 4 }, { "burning", IPL_FIRE_ARROWS, 1, 16, 35, PLT_BOW, 0, 0, 1, 6000, 6000, 6 }, { "shock", IPL_LIGHT_ARROWS, 1, 6, 13, PLT_BOW, 0, 0, 1, 6000, 6000, 2 }, { "lightning", IPL_LIGHT_ARROWS, 1, 10, 21, PLT_BOW, 0, 0, 1, 8000, 8000, 4 }, { "thunder", IPL_LIGHT_ARROWS, 1, 20, 60, PLT_BOW, 0, 0, 1, 12000, 12000, 6 }, { "many", IPL_DUR, 100, 100, 3, PLT_BOW, 0, 0, 1, 750, 750, 2 }, { "plenty", IPL_DUR, 200, 200, 7, PLT_BOW, 0, 0, 1, 1500, 1500, 3 }, { "thorns", IPL_THORNS, 1, 3, 1, PLT_ARMO|PLT_SHLD, 0, 0, 1, 500, 500, 2 }, { "corruption", IPL_NOMANA, 0, 0, 5, PLT_ARMO|PLT_SHLD|PLT_WEAP, 1, 0, 0, -1000, -1000, 2 }, { "thieves", IPL_ABSHALFTRAP, 0, 0, 11, PLT_ARMO|PLT_SHLD|PLT_MISC, 0, 0, 1, 1500, 1500, 2 }, { "the bear", IPL_KNOCKBACK, 0, 0, 5, PLT_WEAP|PLT_STAFF|PLT_BOW, 1, 0, 1, 750, 750, 2 }, { "the bat", IPL_STEALMANA, 3, 3, 8, PLT_WEAP, 0, 0, 1, 7500, 7500, 3 }, { "vampires", IPL_STEALMANA, 5, 5, 19, PLT_WEAP, 0, 0, 1, 15000, 15000, 3 }, { "the leech", IPL_STEALLIFE, 3, 3, 8, PLT_WEAP, 0, 0, 1, 7500, 7500, 3 }, { "blood", IPL_STEALLIFE, 5, 5, 19, PLT_WEAP, 0, 0, 1, 15000, 15000, 3 }, { "piercing", IPL_TARGAC, 2, 6, 1, PLT_WEAP|PLT_BOW, 0, 0, 1, 1000, 1000, 3 }, { "puncturing", IPL_TARGAC, 4, 12, 9, PLT_WEAP|PLT_BOW, 0, 0, 1, 2000, 2000, 6 }, { "bashing", IPL_TARGAC, 8, 24, 17, PLT_WEAP, 0, 0, 1, 4000, 4000, 12 }, { "readiness", IPL_FASTATTACK, 1, 1, 1, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 0, 1, 2000, 2000, 2 }, { "swiftness", IPL_FASTATTACK, 2, 2, 10, PLT_WEAP|PLT_STAFF|PLT_BOW, 0, 0, 1, 4000, 4000, 4 }, { "speed", IPL_FASTATTACK, 3, 3, 19, PLT_WEAP|PLT_STAFF, 0, 0, 1, 8000, 8000, 8 }, { "haste", IPL_FASTATTACK, 4, 4, 27, PLT_WEAP|PLT_STAFF, 0, 0, 1, 16000, 16000, 16 }, { "balance", IPL_FASTRECOVER, 1, 1, 1, PLT_ARMO|PLT_MISC, 0, 0, 1, 2000, 2000, 2 }, { "stability", IPL_FASTRECOVER, 2, 2, 10, PLT_ARMO|PLT_MISC, 0, 0, 1, 4000, 4000, 4 }, { "harmony", IPL_FASTRECOVER, 3, 3, 20, PLT_ARMO|PLT_MISC, 0, 0, 1, 8000, 8000, 8 }, { "blocking", IPL_FASTBLOCK, 1, 1, 5, PLT_SHLD, 0, 0, 1, 4000, 4000, 4 }, { &empty_string, IPL_INVALID, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; UItemStruct UniqueItemList[91] = { { "The Butcher's Cleaver", UITYPE_CLEAVER, 1u, 3u, 3650, IPL_STR, 10, 10, IPL_SETDAM, 4, 24, IPL_SETDUR, 10, 10, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Undead Crown", UITYPE_SKCROWN, 1u, 3u, 16650, IPL_RNDSTEALLIFE, 0, 0, IPL_SETAC, 8, 8, IPL_INVCURS, 77, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Empyrean Band", UITYPE_INFRARING, 1u, 4u, 8000, IPL_ATTRIBS, 2, 2, IPL_LIGHT, 2, 2, IPL_FASTRECOVER, 1, 1, IPL_ABSHALFTRAP, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Optic Amulet", UITYPE_OPTAMULET, 1u, 5u, 9750, IPL_LIGHT, 2, 2, IPL_LIGHTRES, 20, 20, IPL_GETHIT_CURSE, 1, 1, IPL_MAG, 5, 5, IPL_INVCURS, 44, 0, IPL_TOHIT, 0, 0 }, { "Ring of Truth", UITYPE_TRING, 1u, 4u, 9100, IPL_LIFE, 10, 10, IPL_GETHIT_CURSE, 1, 1, IPL_ALLRES, 10, 10, IPL_INVCURS, 10, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Harlequin Crest", UITYPE_HARCREST, 1u, 6u, 4000, IPL_AC_CURSE, 3, 3, IPL_GETHIT_CURSE, 1, 1, IPL_ATTRIBS, 2, 2, IPL_LIFE, 7, 7, IPL_MANA, 7, 7, IPL_INVCURS, 81, 0 }, { "Veil of Steel", UITYPE_STEELVEIL, 1u, 6u, 63800, IPL_ALLRES, 50, 50, IPL_LIGHT_CURSE, 2, 2, IPL_ACP, 60, 60, IPL_MANA_CURSE, 30, 30, IPL_STR, 15, 15, IPL_VIT, 15, 15 }, { "Arkaine's Valor", UITYPE_ARMOFVAL, 1u, 4u, 42000, IPL_SETAC, 25, 25, IPL_VIT, 10, 10, IPL_GETHIT_CURSE, 3, 3, IPL_FASTRECOVER, 3, 3, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Griswold's Edge", UITYPE_GRISWOLD, 1u, 6u, 42000, IPL_FIREDAM, 1, 10, IPL_TOHIT, 25, 25, IPL_FASTATTACK, 2, 2, IPL_KNOCKBACK, 0, 0, IPL_MANA, 20, 20, IPL_LIFE_CURSE, 20, 20 }, { "Lightforge", UITYPE_MACE, 1u, 6u, 26675, IPL_LIGHT, 4, 4, IPL_DAMP, 150, 150, IPL_TOHIT, 25, 25, IPL_FIREDAM, 10, 20, IPL_INDESTRUCTIBLE, 0, 0, IPL_ATTRIBS, 8, 8 }, { "The Rift Bow", UITYPE_SHORTBOW, 1u, 3u, 1800, IPL_RNDARROWVEL, 0, 0, IPL_DAMMOD, 2, 2, IPL_DEX_CURSE, 3, 3, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Needler", UITYPE_SHORTBOW, 2u, 4u, 8900, IPL_TOHIT, 50, 50, IPL_SETDAM, 1, 3, IPL_FASTATTACK, 2, 2, IPL_INVCURS, 158, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Celestial Bow", UITYPE_LONGBOW, 2u, 4u, 1200, IPL_NOMINSTR, 0, 0, IPL_DAMMOD, 2, 2, IPL_SETAC, 5, 5, IPL_INVCURS, 133, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Deadly Hunter", UITYPE_COMPBOW, 3u, 4u, 8750, IPL_3XDAMVDEM, 10, 10, IPL_TOHIT, 20, 20, IPL_MAG_CURSE, 5, 5, IPL_INVCURS, 108, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Bow of the Dead", UITYPE_COMPBOW, 5u, 6u, 2500, IPL_TOHIT, 10, 10, IPL_DEX, 4, 4, IPL_VIT_CURSE, 3, 3, IPL_LIGHT_CURSE, 2, 2, IPL_SETDUR, 30, 30, IPL_INVCURS, 108, 0 }, { "The Blackoak Bow", UITYPE_LONGBOW, 5u, 4u, 2500, IPL_DEX, 10, 10, IPL_VIT_CURSE, 10, 10, IPL_DAMP, 50, 50, IPL_LIGHT_CURSE, 1, 1, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Flamedart", UITYPE_HUNTBOW, 10u, 4u, 14250, IPL_FIRE_ARROWS, 0, 0, IPL_FIREDAM, 1, 6, IPL_TOHIT, 20, 20, IPL_FIRERES, 40, 40, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Fleshstinger", UITYPE_LONGBOW, 13u, 4u, 16500, IPL_DEX, 15, 15, IPL_TOHIT, 40, 40, IPL_DAMP, 80, 80, IPL_DUR, 6, 6, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Windforce", UITYPE_WARBOW, 17u, 4u, 37750, IPL_STR, 5, 5, IPL_DAMP, 200, 200, IPL_KNOCKBACK, 0, 0, IPL_INVCURS, 164, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Eaglehorn", UITYPE_BATTLEBOW, 26u, 5u, 42500, IPL_DEX, 20, 20, IPL_TOHIT, 50, 50, IPL_DAMP, 100, 100, IPL_INDESTRUCTIBLE, 0, 0, IPL_INVCURS, 108, 0, IPL_TOHIT, 0, 0 }, { "Gonnagal's Dirk", UITYPE_DAGGER, 1u, 5u, 7040, IPL_DEX_CURSE, 5, 5, IPL_DAMMOD, 4, 4, IPL_FASTATTACK, 2, 2, IPL_FIRERES, 25, 25, IPL_INVCURS, 54, 0, IPL_TOHIT, 0, 0 }, { "The Defender", UITYPE_SABRE, 1u, 3u, 2000, IPL_SETAC, 5, 5, IPL_VIT, 5, 5, IPL_TOHIT_CURSE, 5, 5, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Gryphons Claw", UITYPE_FALCHION, 1u, 4u, 1000, IPL_DAMP, 100, 100, IPL_MAG_CURSE, 2, 2, IPL_DEX_CURSE, 5, 5, IPL_INVCURS, 68, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Black Razor", UITYPE_DAGGER, 1u, 4u, 2000, IPL_DAMP, 150, 150, IPL_VIT, 2, 2, IPL_SETDUR, 5, 5, IPL_INVCURS, 53, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Gibbous Moon", UITYPE_BROADSWR, 2u, 4u, 6660, IPL_ATTRIBS, 2, 2, IPL_DAMP, 25, 25, IPL_MANA, 15, 15, IPL_LIGHT_CURSE, 3, 3, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Ice Shank", UITYPE_LONGSWR, 3u, 3u, 5250, IPL_FIRERES, 40, 40, IPL_SETDUR, 15, 15, IPL_STR, 5, 10, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Executioner's Blade", UITYPE_FALCHION, 3u, 5u, 7080, IPL_DAMP, 150, 150, IPL_LIFE_CURSE, 10, 10, IPL_LIGHT_CURSE, 1, 1, IPL_DUR, 200, 200, IPL_INVCURS, 58, 0, IPL_TOHIT, 0, 0 }, { "The Bonesaw", UITYPE_CLAYMORE, 6u, 6u, 4400, IPL_DAMMOD, 10, 10, IPL_STR, 10, 10, IPL_MAG_CURSE, 5, 5, IPL_DEX_CURSE, 5, 5, IPL_LIFE, 10, 10, IPL_MANA_CURSE, 10, 10 }, { "Shadowhawk", UITYPE_BROADSWR, 8u, 4u, 13750, IPL_LIGHT_CURSE, 2, 2, IPL_STEALLIFE, 5, 5, IPL_TOHIT, 15, 15, IPL_ALLRES, 5, 5, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Wizardspike", UITYPE_DAGGER, 11u, 5u, 12920, IPL_MAG, 15, 15, IPL_MANA, 35, 35, IPL_TOHIT, 25, 25, IPL_ALLRES, 15, 15, IPL_INVCURS, 50, 0, IPL_TOHIT, 0, 0 }, { "Lightsabre", UITYPE_SABRE, 13u, 4u, 19150, IPL_LIGHT, 2, 2, IPL_LIGHTDAM, 1, 10, IPL_TOHIT, 20, 20, IPL_LIGHTRES, 50, 50, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Falcon's Talon", UITYPE_SCIMITAR, 15u, 5u, 7867, IPL_FASTATTACK, 4, 4, IPL_TOHIT, 20, 20, IPL_DAMP_CURSE, 33, 33, IPL_DEX, 10, 10, IPL_INVCURS, 68, 0, IPL_TOHIT, 0, 0 }, { "Inferno", UITYPE_LONGSWR, 17u, 4u, 34600, IPL_FIREDAM, 2, 12, IPL_LIGHT, 3, 3, IPL_MANA, 20, 20, IPL_FIRERES, 80, 80, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Doombringer", UITYPE_BASTARDSWR, 19u, 5u, 18250, IPL_TOHIT, 25, 25, IPL_DAMP, 250, 250, IPL_ATTRIBS_CURSE, 5, 5, IPL_LIFE_CURSE, 25, 25, IPL_LIGHT_CURSE, 2, 2, IPL_TOHIT, 0, 0 }, { "The Grizzly", UITYPE_TWOHANDSWR, 23u, 6u, 50000, IPL_STR, 20, 20, IPL_VIT_CURSE, 5, 5, IPL_DAMP, 200, 200, IPL_KNOCKBACK, 0, 0, IPL_DUR, 100, 100, IPL_INVCURS, 160, 0 }, { "The Grandfather", UITYPE_GREATSWR, 27u, 6u, 119800, IPL_ONEHAND, 0, 0, IPL_ATTRIBS, 5, 5, IPL_TOHIT, 20, 20, IPL_DAMP, 70, 70, IPL_LIFE, 20, 20, IPL_INVCURS, 161, 0 }, { "The Mangler", UITYPE_LARGEAXE, 2u, 5u, 2850, IPL_DAMP, 200, 200, IPL_DEX_CURSE, 5, 5, IPL_MAG_CURSE, 5, 5, IPL_MANA_CURSE, 10, 10, IPL_INVCURS, 144, 0, IPL_TOHIT, 0, 0 }, { "Sharp Beak", UITYPE_LARGEAXE, 2u, 4u, 2850, IPL_LIFE, 20, 20, IPL_MAG_CURSE, 10, 10, IPL_MANA_CURSE, 10, 10, IPL_INVCURS, 143, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "BloodSlayer", UITYPE_BROADAXE, 3u, 5u, 2500, IPL_DAMP, 100, 100, IPL_3XDAMVDEM, 50, 50, IPL_ATTRIBS_CURSE, 5, 5, IPL_SPLLVLADD, -1, -1, IPL_INVCURS, 144, 0, IPL_TOHIT, 0, 0 }, { "The Celestial Axe", UITYPE_BATTLEAXE, 4u, 4u, 14100, IPL_NOMINSTR, 0, 0, IPL_TOHIT, 15, 15, IPL_LIFE, 15, 15, IPL_STR_CURSE, 15, 15, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Wicked Axe", UITYPE_LARGEAXE, 5u, 6u, 31150, IPL_TOHIT, 30, 30, IPL_DEX, 10, 10, IPL_VIT_CURSE, 10, 10, IPL_GETHIT_CURSE, 1, 6, IPL_INDESTRUCTIBLE, 0, 0, IPL_INVCURS, 143, 0 }, { "Stonecleaver", UITYPE_BROADAXE, 7u, 5u, 23900, IPL_LIFE, 30, 30, IPL_TOHIT, 20, 20, IPL_DAMP, 50, 50, IPL_LIGHTRES, 40, 40, IPL_INVCURS, 104, 0, IPL_TOHIT, 0, 0 }, { "Aguinara's Hatchet", UITYPE_SMALLAXE, 12u, 3u, 24800, IPL_SPLLVLADD, 1, 1, IPL_MAG, 10, 10, IPL_MAGICRES, 80, 80, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Hellslayer", UITYPE_BATTLEAXE, 15u, 5u, 26200, IPL_STR, 8, 8, IPL_VIT, 8, 8, IPL_DAMP, 100, 100, IPL_LIFE, 25, 25, IPL_MANA_CURSE, 25, 25, IPL_TOHIT, 0, 0 }, { "Messerschmidt's Reaver", UITYPE_GREATAXE, 25u, 6u, 58000, IPL_DAMP, 200, 200, IPL_DAMMOD, 15, 15, IPL_ATTRIBS, 5, 5, IPL_LIFE_CURSE, 50, 50, IPL_FIREDAM, 2, 12, IPL_INVCURS, 163, 0 }, { "Crackrust", UITYPE_MACE, 1u, 5u, 11375, IPL_ATTRIBS, 2, 2, IPL_INDESTRUCTIBLE, 0, 0, IPL_ALLRES, 15, 15, IPL_DAMP, 50, 50, IPL_SPLLVLADD, -1, -1, IPL_TOHIT, 0, 0 }, { "Hammer of Jholm", UITYPE_MAUL, 1u, 4u, 8700, IPL_DAMP, 4, 10, IPL_INDESTRUCTIBLE, 0, 0, IPL_STR, 3, 3, IPL_TOHIT, 15, 15, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Civerb's Cudgel", UITYPE_MACE, 1u, 3u, 2000, IPL_3XDAMVDEM, 35, 35, IPL_DEX_CURSE, 5, 5, IPL_MAG_CURSE, 2, 2, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Celestial Star", UITYPE_FLAIL, 2u, 5u, 7810, IPL_NOMINSTR, 0, 0, IPL_LIGHT, 2, 2, IPL_DAMMOD, 10, 10, IPL_AC_CURSE, 8, 8, IPL_INVCURS, 131, 0, IPL_TOHIT, 0, 0 }, { "Baranar's Star", UITYPE_MORNSTAR, 5u, 6u, 6850, IPL_TOHIT, 12, 12, IPL_DAMP, 80, 80, IPL_FASTATTACK, 1, 1, IPL_VIT, 4, 4, IPL_DEX_CURSE, 4, 4, IPL_SETDUR, 60, 60 }, { "Gnarled Root", UITYPE_SPIKCLUB, 9u, 6u, 9820, IPL_TOHIT, 20, 20, IPL_DAMP, 300, 300, IPL_DEX, 10, 10, IPL_MAG, 5, 5, IPL_ALLRES, 10, 10, IPL_AC_CURSE, 10, 10 }, { "The Cranium Basher", UITYPE_MAUL, 12u, 6u, 36500, IPL_DAMMOD, 20, 20, IPL_STR, 15, 15, IPL_INDESTRUCTIBLE, 0, 0, IPL_MANA_CURSE, 150, 150, IPL_ALLRES, 5, 5, IPL_INVCURS, 122, 0 }, { "Schaefer's Hammer", UITYPE_WARHAMMER, 16u, 6u, 56125, IPL_DAMP_CURSE, 100, 100, IPL_LIGHTDAM, 1, 50, IPL_LIFE, 50, 50, IPL_TOHIT, 30, 30, IPL_LIGHTRES, 80, 80, IPL_LIGHT, 1, 1 }, { "Dreamflange", UITYPE_MACE, 26u, 5u, 26450, IPL_MAG, 30, 30, IPL_MANA, 50, 50, IPL_MAGICRES, 50, 50, IPL_LIGHT, 2, 2, IPL_SPLLVLADD, 1, 1, IPL_TOHIT, 0, 0 }, { "Staff of Shadows", UITYPE_LONGSTAFF, 2u, 5u, 1250, IPL_MAG_CURSE, 10, 10, IPL_TOHIT, 10, 10, IPL_DAMP, 60, 60, IPL_LIGHT_CURSE, 2, 2, IPL_FASTATTACK, 1, 1, IPL_TOHIT, 0, 0 }, { "Immolator", UITYPE_LONGSTAFF, 4u, 4u, 3900, IPL_FIRERES, 20, 20, IPL_FIREDAM, 4, 4, IPL_MANA, 10, 10, IPL_VIT_CURSE, 5, 5, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Storm Spire", UITYPE_WARSTAFF, 8u, 4u, 22500, IPL_LIGHTRES, 50, 50, IPL_LIGHTDAM, 2, 8, IPL_STR, 10, 10, IPL_MAG_CURSE, 10, 10, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Gleamsong", UITYPE_SHORTSTAFF, 8u, 4u, 6520, IPL_MANA, 25, 25, IPL_STR_CURSE, 3, 3, IPL_VIT_CURSE, 3, 3, IPL_SPELL, 10, 76, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Thundercall", UITYPE_COMPSTAFF, 14u, 5u, 22250, IPL_TOHIT, 35, 35, IPL_LIGHTDAM, 1, 10, IPL_SPELL, 3, 76, IPL_LIGHTRES, 30, 30, IPL_LIGHT, 2, 2, IPL_TOHIT, 0, 0 }, { "The Protector", UITYPE_SHORTSTAFF, 16u, 6u, 17240, IPL_VIT, 5, 5, IPL_GETHIT_CURSE, 5, 5, IPL_SETAC, 40, 40, IPL_SPELL, 2, 86, IPL_THORNS, 1, 3, IPL_INVCURS, 162, 0 }, { "Naj's Puzzler", UITYPE_LONGSTAFF, 18u, 5u, 34000, IPL_MAG, 20, 20, IPL_DEX, 10, 10, IPL_ALLRES, 20, 20, IPL_SPELL, 23, 57, IPL_LIFE_CURSE, 25, 25, IPL_TOHIT, 0, 0 }, { "Mindcry", UITYPE_QUARSTAFF, 20u, 4u, 41500, IPL_MAG, 15, 15, IPL_SPELL, 13, 69, IPL_ALLRES, 15, 15, IPL_SPLLVLADD, 1, 1, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Rod of Onan", UITYPE_WARSTAFF, 22u, 3u, 44167, IPL_SPELL, 21, 50, IPL_DAMP, 100, 100, IPL_ATTRIBS, 5, 5, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Helm of Sprits", UITYPE_HELM, 1u, 2u, 7525, IPL_STEALLIFE, 5, 5, IPL_INVCURS, 77, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Thinking Cap", UITYPE_SKULLCAP, 6u, 5u, 2020, IPL_MANA, 30, 30, IPL_SPLLVLADD, 2, 2, IPL_ALLRES, 20, 20, IPL_SETDUR, 1, 1, IPL_INVCURS, 93, 0, IPL_TOHIT, 0, 0 }, { "OverLord's Helm", UITYPE_HELM, 7u, 6u, 12500, IPL_STR, 20, 20, IPL_DEX, 15, 15, IPL_VIT, 5, 5, IPL_MAG_CURSE, 20, 20, IPL_SETDUR, 15, 15, IPL_INVCURS, 99, 0 }, { "Fool's Crest", UITYPE_HELM, 12u, 5u, 10150, IPL_ATTRIBS_CURSE, 4, 4, IPL_LIFE, 100, 100, IPL_GETHIT, 1, 6, IPL_THORNS, 1, 3, IPL_INVCURS, 80, 0, IPL_TOHIT, 0, 0 }, { "Gotterdamerung", UITYPE_GREATHELM, 21u, 6u, 54900, IPL_ATTRIBS, 20, 20, IPL_SETAC, 60, 60, IPL_GETHIT_CURSE, 4, 4, IPL_ALLRESZERO, 0, 0, IPL_LIGHT_CURSE, 4, 4, IPL_INVCURS, 85, 0 }, { "Royal Circlet", UITYPE_CROWN, 27u, 5u, 24875, IPL_ATTRIBS, 10, 10, IPL_MANA, 40, 40, IPL_SETAC, 40, 40, IPL_LIGHT, 1, 1, IPL_INVCURS, 79, 0, IPL_TOHIT, 0, 0 }, { "Torn Flesh of Souls", UITYPE_RAGS, 2u, 5u, 4825, IPL_SETAC, 8, 8, IPL_VIT, 10, 10, IPL_GETHIT_CURSE, 1, 1, IPL_INDESTRUCTIBLE, 0, 0, IPL_INVCURS, 92, 0, IPL_TOHIT, 0, 0 }, { "The Gladiator's Bane", UITYPE_STUDARMOR, 6u, 4u, 3450, IPL_SETAC, 25, 25, IPL_GETHIT_CURSE, 2, 2, IPL_DUR, 200, 200, IPL_ATTRIBS_CURSE, 3, 3, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "The Rainbow Cloak", UITYPE_CLOAK, 2u, 6u, 4900, IPL_SETAC, 10, 10, IPL_ATTRIBS, 1, 1, IPL_ALLRES, 10, 10, IPL_LIFE, 5, 5, IPL_DUR, 50, 50, IPL_INVCURS, 138, 0 }, { "Leather of Aut", UITYPE_LEATHARMOR, 4u, 5u, 10550, IPL_SETAC, 15, 15, IPL_STR, 5, 5, IPL_MAG_CURSE, 5, 5, IPL_DEX, 5, 5, IPL_INDESTRUCTIBLE, 0, 0, IPL_TOHIT, 0, 0 }, { "Wisdom's Wrap", UITYPE_ROBE, 5u, 6u, 6200, IPL_MAG, 5, 5, IPL_MANA, 10, 10, IPL_LIGHTRES, 25, 25, IPL_SETAC, 15, 15, IPL_GETHIT_CURSE, 1, 1, IPL_INVCURS, 138, 0 }, { "Sparking Mail", UITYPE_CHAINMAIL, 9u, 2u, 15750, IPL_SETAC, 30, 30, IPL_LIGHTDAM, 1, 10, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Scavenger Carapace", UITYPE_BREASTPLATE, 13u, 4u, 14000, IPL_GETHIT_CURSE, 15, 15, IPL_AC_CURSE, 30, 30, IPL_DEX, 5, 5, IPL_LIGHTRES, 40, 40, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Nightscape", UITYPE_CAPE, 16u, 6u, 11600, IPL_FASTRECOVER, 2, 2, IPL_LIGHT_CURSE, 4, 4, IPL_SETAC, 15, 15, IPL_DEX, 3, 3, IPL_ALLRES, 20, 20, IPL_INVCURS, 138, 0 }, { "Naj's Light Plate", UITYPE_PLATEMAIL, 19u, 6u, 78700, IPL_NOMINSTR, 0, 0, IPL_MAG, 5, 5, IPL_MANA, 20, 20, IPL_ALLRES, 20, 20, IPL_SPLLVLADD, 1, 1, IPL_INVCURS, 159, 0 }, { "Demonspike Coat", UITYPE_FULLPLATE, 25u, 5u, 251175, IPL_SETAC, 100, 100, IPL_GETHIT_CURSE, 6, 6, IPL_STR, 10, 10, IPL_INDESTRUCTIBLE, 0, 0, IPL_FIRERES, 50, 50, IPL_TOHIT, 0, 0 }, { "The Deflector", UITYPE_BUCKLER, 1u, 5u, 1500, IPL_SETAC, 7, 7, IPL_ALLRES, 10, 10, IPL_DAMP_CURSE, 20, 20, IPL_TOHIT_CURSE, 5, 5, IPL_INVCURS, 83, 0, IPL_TOHIT, 0, 0 }, { "Split Skull Shield", UITYPE_BUCKLER, 1u, 6u, 2025, IPL_SETAC, 10, 10, IPL_LIFE, 10, 10, IPL_STR, 2, 2, IPL_LIGHT_CURSE, 1, 1, IPL_SETDUR, 15, 15, IPL_INVCURS, 116, 0 }, { "Dragon's Breach", UITYPE_KITESHIELD, 2u, 6u, 19200, IPL_FIRERES, 25, 25, IPL_STR, 5, 5, IPL_SETAC, 20, 20, IPL_MAG_CURSE, 5, 5, IPL_INDESTRUCTIBLE, 0, 0, IPL_INVCURS, 117, 0 }, { "Blackoak Shield", UITYPE_SMALLSHIELD, 4u, 6u, 5725, IPL_DEX, 10, 10, IPL_VIT_CURSE, 10, 10, IPL_SETAC, 18, 18, IPL_LIGHT_CURSE, 1, 1, IPL_DUR, 150, 150, IPL_INVCURS, 146, 0 }, { "Holy Defender", UITYPE_LARGESHIELD, 10u, 6u, 13800, IPL_SETAC, 15, 15, IPL_GETHIT_CURSE, 2, 2, IPL_FIRERES, 20, 20, IPL_DUR, 200, 200, IPL_FASTBLOCK, 1, 1, IPL_INVCURS, 146, 0 }, { "Stormshield", UITYPE_GOTHSHIELD, 24u, 6u, 49000, IPL_SETAC, 40, 40, IPL_GETHIT, 4, 4, IPL_STR, 10, 10, IPL_INDESTRUCTIBLE, 0, 0, IPL_FASTBLOCK, 1, 1, IPL_INVCURS, 148, 0 }, { "Bramble", UITYPE_RING, 1u, 4u, 1000, IPL_ATTRIBS_CURSE, 2, 2, IPL_DAMMOD, 3, 3, IPL_MANA, 10, 10, IPL_INVCURS, 9, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Ring of Regha", UITYPE_RING, 1u, 6u, 4175, IPL_MAG, 10, 10, IPL_MAGICRES, 10, 10, IPL_LIGHT, 1, 1, IPL_STR_CURSE, 3, 3, IPL_DEX_CURSE, 3, 3, IPL_INVCURS, 11, 0 }, { "The Bleeder", UITYPE_RING, 2u, 4u, 8500, IPL_MAGICRES, 20, 20, IPL_MANA, 30, 30, IPL_LIFE_CURSE, 10, 10, IPL_INVCURS, 8, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Constricting Ring", UITYPE_RING, 5u, 3u, 62000, IPL_ALLRES, 75, 75, IPL_DRAINLIFE, 0, 0, IPL_INVCURS, 14, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 }, { "Ring of Engagement", UITYPE_RING, 11u, 5u, 12476, IPL_GETHIT_CURSE, 1, 2, IPL_THORNS, 1, 3, IPL_SETAC, 5, 5, IPL_TARGAC, 4, 12, IPL_INVCURS, 13, 0, IPL_TOHIT, 0, 0 }, { &empty_string, UITYPE_INVALID, 0u, 0u, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0, IPL_TOHIT, 0, 0 } }; /* rdata */ ItemDataStruct AllItemsList[157] = { { IDROP_REGULAR, ICLASS_GOLD, ILOC_UNEQUIPABLE, 168, 11u, UITYPE_NONE, "Gold", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 1, 0, 0 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_ONEHAND, 64, 1u, UITYPE_NONE, "Short Sword", NULL, 2, 20, 2, 6, 0, 0, 18u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 50, 50 }, { IDROP_NEVER, ICLASS_ARMOR, ILOC_ONEHAND, 83, 5u, UITYPE_NONE, "Buckler", NULL, 2, 10, 0, 0, 3, 3, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 50, 50 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_ONEHAND, 66, 4u, UITYPE_SPIKCLUB, "Club", NULL, 1, 20, 1, 6, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 20, 20 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_TWOHAND, 118, 3u, UITYPE_NONE, "Short Bow", NULL, 1, 30, 1, 4, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 100, 100 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_TWOHAND, 109, 10u, UITYPE_NONE, "Short Staff of Charged Bolt", NULL, 1, 25, 2, 4, 0, 0, 0u, 20u, 0u, ISPL_NONE, IMISC_STAFF, SPL_CBOLT, 0, 520, 520 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_TWOHAND, 106, 2u, UITYPE_CLEAVER, "Cleaver", NULL, 10, 10, 4, 24, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 2000, 2000 }, { IDROP_NEVER, ICLASS_ARMOR, ILOC_HELM, 78, 7u, UITYPE_SKCROWN, "The Undead Crown", NULL, 0, 50, 0, 0, 15, 15, 0u, 0u, 0u, ISPL_RNDSTEALLIFE, IMISC_UNIQUE, SPL_NULL, 0, 10000, 10000 }, { IDROP_NEVER, ICLASS_MISC, ILOC_RING, 18, 12u, UITYPE_INFRARING, "Empyrean Band", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 8000, 8000 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 76, 0u, UITYPE_NONE, "Magic Rock", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_AMULET, 44, 13u, UITYPE_OPTAMULET, "Optic Amulet", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 5000, 5000 }, { IDROP_NEVER, ICLASS_MISC, ILOC_RING, 10, 12u, UITYPE_TRING, "Ring of Truth", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 1000, 1000 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 126, 0u, UITYPE_NONE, "Tavern Sign", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_ARMOR, ILOC_HELM, 93, 7u, UITYPE_HARCREST, "Harlequin Crest", NULL, 0, 15, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 15, 20 }, { IDROP_NEVER, ICLASS_ARMOR, ILOC_HELM, 85, 7u, UITYPE_STEELVEIL, "Veil of Steel", NULL, 0, 60, 0, 0, 18, 18, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 17, 0u, UITYPE_ELIXIR, "Golden Elixir", NULL, 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 140, 0u, UITYPE_NONE, "Anvil of Fury", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 89, 0u, UITYPE_NONE, "Black Mushroom", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 40, 0u, UITYPE_NONE, "Brain", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 97, 0u, UITYPE_NONE, "Fungal Tome", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 15, 0u, UITYPE_ELIXIR, "Spectral Elixir", NULL, 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SPECELIX, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 25, 0u, UITYPE_NONE, "Blood Stone", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 96, 0u, UITYPE_MAPOFDOOM, "Map of the Stars", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_MAPOFDOOM, SPL_NULL, 1, 0, 0 }, { IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, 19, 0u, UITYPE_NONE, "Heart", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_EAR, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 32, 0u, UITYPE_NONE, "Potion of Healing", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_HEAL, SPL_NULL, 1, 50, 50 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 39, 0u, UITYPE_NONE, "Potion of Mana", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_MANA, SPL_NULL, 1, 50, 50 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Identify", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_IDENTIFY, 1, 200, 200 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Town Portal", NULL, 4, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_TOWN, 1, 200, 200 }, { IDROP_NEVER, ICLASS_ARMOR, ILOC_ARMOR, 157, 8u, UITYPE_ARMOFVAL, "Arkaine's Valor", NULL, 0, 40, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 35, 0u, UITYPE_NONE, "Potion of Full Healing", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_FULLHEAL, SPL_NULL, 1, 150, 150 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 0, 0u, UITYPE_NONE, "Potion of Full Mana", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_FULLMANA, SPL_NULL, 1, 150, 150 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_ONEHAND, 61, 1u, UITYPE_GRISWOLD, "Griswold's Edge", NULL, 8, 50, 4, 12, 0, 0, 40u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 750, 750 }, { IDROP_NEVER, ICLASS_WEAPON, ILOC_ONEHAND, 59, 4u, UITYPE_LGTFORGE, "Lightforge", NULL, 2, 32, 1, 8, 0, 0, 16u, 0u, 0u, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, 0, 200, 200 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 155, 0u, UITYPE_LAZSTAFF, "Staff of Lazarus", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Resurrect", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_RESURRECT, 1, 250, 250 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_NEVER, ICLASS_NONE, ILOC_NONE, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 91, 7u, UITYPE_NONE, "Cap", "Cap", 1, 15, 0, 0, 1, 3, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 15, 20 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 90, 7u, UITYPE_SKULLCAP, "Skull Cap", "Cap", 4, 20, 0, 0, 2, 4, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 25, 30 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 82, 7u, UITYPE_HELM, "Helm", "Helm", 8, 30, 0, 0, 4, 6, 25u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 40, 70 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 75, 7u, UITYPE_NONE, "Full Helm", "Helm", 12, 35, 0, 0, 6, 8, 35u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 90, 130 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 95, 7u, UITYPE_CROWN, "Crown", "Crown", 16, 40, 0, 0, 8, 12, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 200, 300 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_HELM, 98, 7u, UITYPE_GREATHELM, "Great Helm", "Helm", 20, 60, 0, 0, 10, 15, 50u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 400, 500 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 150, 6u, UITYPE_CAPE, "Cape", "Cape", 1, 12, 0, 0, 1, 5, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 10, 50 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 128, 6u, UITYPE_RAGS, "Rags", "Rags", 1, 6, 0, 0, 2, 6, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 5, 25 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 149, 6u, UITYPE_CLOAK, "Cloak", "Cloak", 2, 18, 0, 0, 3, 7, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 40, 70 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 137, 6u, UITYPE_ROBE, "Robe", "Robe", 3, 24, 0, 0, 4, 7, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 75, 125 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 129, 6u, UITYPE_NONE, "Quilted Armor", "Armor", 4, 30, 0, 0, 7, 10, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 200, 300 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 135, 6u, UITYPE_LEATHARMOR, "Leather Armor", "Armor", 6, 35, 0, 0, 10, 13, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 300, 400 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 127, 6u, UITYPE_NONE, "Hard Leather Armor", "Armor", 7, 40, 0, 0, 11, 14, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 450, 550 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 107, 6u, UITYPE_STUDARMOR, "Studded Leather Armor", "Armor", 9, 45, 0, 0, 15, 17, 20u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 700, 800 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 154, 8u, UITYPE_NONE, "Ring Mail", "Mail", 11, 50, 0, 0, 17, 20, 25u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 900, 1100 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 111, 8u, UITYPE_CHAINMAIL, "Chain Mail", "Mail", 13, 55, 0, 0, 18, 22, 30u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1250, 1750 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 114, 8u, UITYPE_NONE, "Scale Mail", "Mail", 15, 60, 0, 0, 23, 28, 35u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 2300, 2800 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 153, 9u, UITYPE_BREASTPLATE, "Breast Plate", "Plate", 16, 80, 0, 0, 20, 24, 40u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 2800, 3200 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 136, 8u, UITYPE_NONE, "Splint Mail", "Mail", 17, 65, 0, 0, 30, 35, 40u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 3250, 3750 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 103, 9u, UITYPE_PLATEMAIL, "Plate Mail", "Plate", 19, 75, 0, 0, 42, 50, 60u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 4600, 5400 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 103, 9u, UITYPE_NONE, "Field Plate", "Plate", 21, 80, 0, 0, 40, 45, 65u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 5800, 6200 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 152, 9u, UITYPE_NONE, "Gothic Plate", "Plate", 23, 100, 0, 0, 50, 60, 80u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 8000, 10000 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ARMOR, 151, 9u, UITYPE_FULLPLATE, "Full Plate Mail", "Plate", 25, 90, 0, 0, 60, 75, 90u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 6500, 8000 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 83, 5u, UITYPE_BUCKLER, "Buckler", "Shield", 1, 16, 0, 0, 1, 5, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 30, 70 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 105, 5u, UITYPE_SMALLSHIELD, "Small Shield", "Shield", 5, 24, 0, 0, 3, 8, 25u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 90, 130 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 147, 5u, UITYPE_LARGESHIELD, "Large Shield", "Shield", 9, 32, 0, 0, 5, 10, 40u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 200, 300 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 113, 5u, UITYPE_KITESHIELD, "Kite Shield", "Shield", 14, 40, 0, 0, 8, 15, 50u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 400, 700 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 132, 5u, UITYPE_GOTHSHIELD, "Tower Shield", "Shield", 20, 50, 0, 0, 12, 20, 60u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 850, 1200 }, { IDROP_REGULAR, ICLASS_ARMOR, ILOC_ONEHAND, 148, 5u, UITYPE_GOTHSHIELD, "Gothic Shield", "Shield", 23, 60, 0, 0, 14, 18, 80u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 2300, 2700 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 32, 0u, UITYPE_NONE, "Potion of Healing", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_HEAL, SPL_NULL, 1, 50, 50 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 35, 0u, UITYPE_NONE, "Potion of Full Healing", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_FULLHEAL, SPL_NULL, 1, 150, 150 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 39, 0u, UITYPE_NONE, "Potion of Mana", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_MANA, SPL_NULL, 1, 50, 50 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 0, 0u, UITYPE_NONE, "Potion of Full Mana", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_FULLMANA, SPL_NULL, 1, 150, 150 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 37, 0u, UITYPE_NONE, "Potion of Rejuvenation", NULL, 3, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_REJUV, SPL_NULL, 1, 120, 120 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 33, 0u, UITYPE_NONE, "Potion of Full Rejuvenation", NULL, 7, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_FULLREJUV, SPL_NULL, 1, 600, 600 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 38, 0u, UITYPE_NONE, "Elixir of Strength", NULL, 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_ELIXSTR, SPL_NULL, 1, 5000, 5000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 34, 0u, UITYPE_NONE, "Elixir of Magic", NULL, 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_ELIXMAG, SPL_NULL, 1, 5000, 5000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 36, 0u, UITYPE_NONE, "Elixir of Dexterity", NULL, 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_ELIXDEX, SPL_NULL, 1, 5000, 5000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 31, 0u, UITYPE_NONE, "Elixir of Vitality", NULL, 20, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_ELIXVIT, SPL_NULL, 1, 5000, 5000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Healing", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_HEAL, 1, 50, 50 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Lightning", NULL, 4, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_LIGHTNING, 1, 150, 150 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Identify", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_IDENTIFY, 1, 100, 100 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Resurrect", NULL, 1, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_RESURRECT, 1, 250, 250 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Fire Wall", NULL, 4, 0, 0, 0, 0, 0, 0u, 17u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_FIREWALL, 1, 400, 400 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Inferno", NULL, 1, 0, 0, 0, 0, 0, 0u, 19u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_FLAME, 1, 100, 100 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Town Portal", NULL, 4, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_TOWN, 1, 200, 200 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Flash", NULL, 6, 0, 0, 0, 0, 0, 0u, 21u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_FLASH, 1, 500, 500 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Infravision", NULL, 8, 0, 0, 0, 0, 0, 0u, 23u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_INFRA, 1, 600, 600 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Phasing", NULL, 6, 0, 0, 0, 0, 0, 0u, 25u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_RNDTELEPORT, 1, 200, 200 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Mana Shield", NULL, 8, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_MANASHIELD, 1, 1200, 1200 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Flame Wave", NULL, 10, 0, 0, 0, 0, 0, 0u, 29u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_WAVE, 1, 650, 650 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Fireball", NULL, 8, 0, 0, 0, 0, 0, 0u, 31u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_FIREBALL, 1, 300, 300 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Stone Curse", NULL, 6, 0, 0, 0, 0, 0, 0u, 33u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_STONE, 1, 800, 800 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Chain Lightning", NULL, 10, 0, 0, 0, 0, 0, 0u, 35u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_CHAIN, 1, 750, 750 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Guardian", NULL, 12, 0, 0, 0, 0, 0, 0u, 47u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_GUARDIAN, 1, 950, 950 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Non Item", NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Nova", NULL, 14, 0, 0, 0, 0, 0, 0u, 57u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_NOVA, 1, 1300, 1300 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Golem", NULL, 10, 0, 0, 0, 0, 0, 0u, 51u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_GOLEM, 1, 1100, 1100 }, { IDROP_NEVER, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of None", NULL, 99, 0, 0, 0, 0, 0, 0u, 61u, 0u, ISPL_NONE, IMISC_SCROLLT, SPL_NULL, 1, 1000, 1000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Teleport", NULL, 14, 0, 0, 0, 0, 0, 0u, 81u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_TELEPORT, 1, 3000, 3000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 1, 0u, UITYPE_NONE, "Scroll of Apocalypse", NULL, 22, 0, 0, 0, 0, 0, 0u, 117u, 0u, ISPL_NONE, IMISC_SCROLL, SPL_APOCA, 1, 2000, 2000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 88, 0u, UITYPE_NONE, "Book of ", NULL, 2, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_BOOK, SPL_NULL, 1, 0, 0 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 88, 0u, UITYPE_NONE, "Book of ", NULL, 8, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_BOOK, SPL_NULL, 1, 0, 0 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 88, 0u, UITYPE_NONE, "Book of ", NULL, 14, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_BOOK, SPL_NULL, 1, 0, 0 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_UNEQUIPABLE, 88, 0u, UITYPE_NONE, "Book of ", NULL, 20, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_BOOK, SPL_NULL, 1, 0, 0 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 51, 1u, UITYPE_DAGGER, "Dagger", "Dagger", 1, 16, 1, 4, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 60, 60 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 64, 1u, UITYPE_NONE, "Short Sword", "Sword", 1, 24, 2, 6, 0, 0, 18u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 120, 120 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 62, 1u, UITYPE_FALCHION, "Falchion", "Sword", 2, 20, 4, 8, 0, 0, 30u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 250, 250 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 72, 1u, UITYPE_SCIMITAR, "Scimitar", "Sword", 4, 28, 3, 7, 0, 0, 23u, 0u, 23u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 200, 200 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 65, 1u, UITYPE_CLAYMORE, "Claymore", "Sword", 5, 36, 1, 12, 0, 0, 35u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 450, 450 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 56, 1u, UITYPE_NONE, "Blade", "Blade", 4, 30, 3, 8, 0, 0, 25u, 0u, 30u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 280, 280 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 67, 1u, UITYPE_SABRE, "Sabre", "Sabre", 1, 45, 1, 8, 0, 0, 17u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 170, 170 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 60, 1u, UITYPE_LONGSWR, "Long Sword", "Sword", 6, 40, 2, 10, 0, 0, 30u, 0u, 30u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 350, 350 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 61, 1u, UITYPE_BROADSWR, "Broad Sword", "Sword", 8, 50, 4, 12, 0, 0, 40u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 750, 750 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 57, 1u, UITYPE_BASTARDSWR, "Bastard Sword", "Sword", 10, 60, 6, 15, 0, 0, 50u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 110, 1u, UITYPE_TWOHANDSWR, "Two-Handed Sword", "Sword", 14, 75, 8, 16, 0, 0, 65u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1800, 1800 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 134, 1u, UITYPE_GREATSWR, "Great Sword", "Sword", 17, 100, 10, 20, 0, 0, 75u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 3000, 3000 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 112, 2u, UITYPE_SMALLAXE, "Small Axe", "Axe", 2, 24, 2, 10, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 150, 150 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 144, 2u, UITYPE_NONE, "Axe", "Axe", 4, 32, 4, 12, 0, 0, 22u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 450, 450 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 142, 2u, UITYPE_LARGEAXE, "Large Axe", "Axe", 6, 40, 6, 16, 0, 0, 30u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 750, 750 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 141, 2u, UITYPE_BROADAXE, "Broad Axe", "Axe", 8, 50, 8, 20, 0, 0, 50u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 101, 2u, UITYPE_BATTLEAXE, "Battle Axe", "Axe", 10, 60, 10, 25, 0, 0, 65u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1500, 1500 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 143, 2u, UITYPE_GREATAXE, "Great Axe", "Axe", 12, 75, 12, 30, 0, 0, 80u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 2500, 2500 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 59, 4u, UITYPE_MACE, "Mace", "Mace", 2, 32, 1, 8, 0, 0, 16u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 200, 200 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 63, 4u, UITYPE_MORNSTAR, "Morning Star", "Mace", 3, 40, 1, 10, 0, 0, 26u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 300, 300 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 121, 4u, UITYPE_WARHAMMER, "War Hammer", "Hammer", 5, 50, 5, 9, 0, 0, 40u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 600, 600 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 70, 4u, UITYPE_SPIKCLUB, "Spiked Club", "Club", 4, 20, 3, 6, 0, 0, 18u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 225, 225 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 66, 4u, UITYPE_SPIKCLUB, "Club", "Club", 1, 20, 1, 6, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 20, 20 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND, 131, 4u, UITYPE_FLAIL, "Flail", "Flail", 7, 36, 2, 12, 0, 0, 30u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 500, 500 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 122, 4u, UITYPE_MAUL, "Maul", "Maul", 10, 50, 6, 20, 0, 0, 55u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 900, 900 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 118, 3u, UITYPE_SHORTBOW, "Short Bow", "Bow", 1, 30, 1, 4, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 100, 100 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 102, 3u, UITYPE_HUNTBOW, "Hunter's Bow", "Bow", 3, 40, 2, 5, 0, 0, 20u, 0u, 35u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 350, 350 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 102, 3u, UITYPE_LONGBOW, "Long Bow", "Bow", 5, 35, 1, 6, 0, 0, 25u, 0u, 30u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 250, 250 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 133, 3u, UITYPE_COMPBOW, "Composite Bow", "Bow", 7, 45, 3, 6, 0, 0, 25u, 0u, 40u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 600, 600 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 167, 3u, UITYPE_NONE, "Short Battle Bow", "Bow", 9, 45, 3, 7, 0, 0, 30u, 0u, 50u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 750, 750 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 119, 3u, UITYPE_BATTLEBOW, "Long Battle Bow", "Bow", 11, 50, 1, 10, 0, 0, 30u, 0u, 60u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1000, 1000 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 165, 3u, UITYPE_NONE, "Short War Bow", "Bow", 15, 55, 4, 8, 0, 0, 35u, 0u, 70u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 1500, 1500 }, { IDROP_DOUBLE, ICLASS_WEAPON, ILOC_TWOHAND, 119, 3u, UITYPE_WARBOW, "Long War Bow", "Bow", 19, 60, 1, 14, 0, 0, 45u, 0u, 80u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 2000, 2000 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 109, 10u, UITYPE_SHORTSTAFF, "Short Staff", "Staff", 1, 25, 2, 4, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_STAFF, SPL_NULL, 0, 30, 30 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 123, 10u, UITYPE_LONGSTAFF, "Long Staff", "Staff", 4, 35, 4, 8, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_STAFF, SPL_NULL, 0, 100, 100 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 166, 10u, UITYPE_COMPSTAFF, "Composite Staff", "Staff", 6, 45, 5, 10, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_STAFF, SPL_NULL, 0, 500, 500 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 109, 10u, UITYPE_QUARSTAFF, "Quarter Staff", "Staff", 9, 55, 6, 12, 0, 0, 20u, 0u, 0u, ISPL_NONE, IMISC_STAFF, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND, 124, 10u, UITYPE_WARSTAFF, "War Staff", "Staff", 12, 75, 8, 16, 0, 0, 30u, 0u, 0u, ISPL_NONE, IMISC_STAFF, SPL_NULL, 0, 1500, 1500 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_RING, 12, 12u, UITYPE_RING, "Ring", "Ring", 5, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_RING, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_RING, 12, 12u, UITYPE_RING, "Ring", "Ring", 10, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_RING, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_RING, 12, 12u, UITYPE_RING, "Ring", "Ring", 15, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_RING, SPL_NULL, 0, 1000, 1000 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_AMULET, 45, 13u, UITYPE_AMULET, "Amulet", "Amulet", 8, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_AMULET, SPL_NULL, 0, 1200, 1200 }, { IDROP_REGULAR, ICLASS_MISC, ILOC_AMULET, 45, 13u, UITYPE_AMULET, "Amulet", "Amulet", 16, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_AMULET, SPL_NULL, 0, 1200, 1200 }, { IDROP_NEVER, ICLASS_NONE, ILOC_INVALID, 0, 0u, UITYPE_NONE, NULL, NULL, 0, 0, 0, 0, 0, 0, 0u, 0u, 0u, ISPL_NONE, IMISC_NONE, SPL_NULL, 0, 0, 0 } }; unsigned char ItemCAnimTbl[169] = { 20, 16, 16, 16, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 12, 21, 21, 25, 12, 28, 28, 28, 0, 0, 0, 32, 0, 0, 0, 24, 24, 26, 2, 25, 22, 23, 24, 25, 27, 27, 29, 0, 0, 0, 12, 12, 12, 12, 12, 0, 8, 8, 0, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 6, 8, 8, 6, 8, 8, 6, 6, 6, 8, 8, 8, 5, 9, 13, 13, 13, 5, 5, 5, 15, 5, 5, 18, 18, 18, 30, 5, 5, 14, 5, 14, 13, 16, 18, 5, 5, 7, 1, 3, 17, 1, 15, 10, 14, 3, 11, 8, 0, 1, 7, 0, 7, 15, 7, 3, 3, 3, 6, 6, 11, 11, 11, 31, 14, 14, 14, 6, 6, 7, 3, 8, 14, 0, 14, 14, 0, 33, 1, 1, 1, 1, 1, 7, 7, 7, 14, 14, 17, 17, 17, 0, 34, 1, 0, 3, 17, 8, 8, 6, 1, 3, 3, 11, 3, 4 }; char *ItemDropStrs[35] = { "Armor2", "Axe", "FBttle", "Bow", "GoldFlip", "Helmut", "Mace", "Shield", "SwrdFlip", "Rock", "Cleaver", "Staff", "Ring", "CrownF", "LArmor", "WShield", "Scroll", "FPlateAr", "FBook", "Food", "FBttleBB", "FBttleDY", "FBttleOR", "FBttleBR", "FBttleBL", "FBttleBY", "FBttleWH", "FBttleDB", "FEar", "FBrain", "FMush", "Innsign", "Bldstn", "Fanvil", "FLazStaf" }; unsigned char ItemAnimLs[35] = { 15u, 13u, 16u, 13u, 10u, 13u, 13u, 13u, 13u, 10u, 13u, 13u, 13u, 13u, 13u, 13u, 13u, 13u, 13u, 1u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 13u, 12u, 12u, 13u, 13u, 13u, 8u }; int ItemDropSnds[35] = { IS_FHARM, IS_FAXE, IS_FPOT, IS_FBOW, IS_GOLD, IS_FCAP, IS_FSWOR, IS_FSHLD, IS_FSWOR, IS_FROCK, IS_FAXE, IS_FSTAF, IS_FRING, IS_FCAP, IS_FLARM, IS_FSHLD, IS_FSCRL, IS_FHARM, IS_FBOOK, IS_FLARM, IS_FPOT, IS_FPOT, IS_FPOT, IS_FPOT, IS_FPOT, IS_FPOT, IS_FPOT, IS_FPOT, IS_FBODY, IS_FBODY, IS_FMUSH, IS_ISIGN, IS_FBLST, IS_FANVL, IS_FSTAF }; int ItemInvSnds[35] = { IS_IHARM, IS_IAXE, IS_IPOT, IS_IBOW, IS_GOLD, IS_ICAP, IS_ISWORD, IS_ISHIEL, IS_ISWORD, IS_IROCK, IS_IAXE, IS_ISTAF, IS_IRING, IS_ICAP, IS_ILARM, IS_ISHIEL, IS_ISCROL, IS_IHARM, IS_IBOOK, IS_IHARM, IS_IPOT, IS_IPOT, IS_IPOT, IS_IPOT, IS_IPOT, IS_IPOT, IS_IPOT, IS_IPOT, IS_IBODY, IS_IBODY, IS_IMUSH, IS_ISIGN, IS_IBLST, IS_IANVL, IS_ISTAF }; int idoppely = 16; // weak int premiumlvladd[6] = { -1, -1, 0, 0, 1, 2 }; //----- (0041F096) -------------------------------------------------------- void __cdecl InitItemGFX() { signed int v0; // esi char arglist[64]; // [esp+4h] [ebp-40h] v0 = 0; do { sprintf(arglist, "Items\\%s.CEL", ItemDropStrs[v0]); Item2Frm[v0] = (int)LoadFileInMem(arglist, 0); ++v0; } while ( v0 < 35 ); memset(UniqueItemFlag, 0, 0x200u); } //----- (0041F0E8) -------------------------------------------------------- bool __fastcall ItemPlace(int x, int y) { int v2; // ecx int v3; // eax bool result; // al v2 = x; v3 = v2 * 112 + y; if ( dMonster[0][v3] || dPlayer[v2][y] || dItem[v2][y] || dObject[v2][y] || dFlags[v2][y] & 8 ) result = 0; else result = nSolidTable[dPiece[0][v3]] == 0; return result; } //----- (0041F13A) -------------------------------------------------------- void __cdecl AddInitItems() { int i; // eax int ii; // ebx int xx; // esi int yy; // eax int j; // eax i = random(11, 3) + 3; if ( i > 0 ) { do { ii = itemavail[0]; itemactive[numitems] = itemavail[0]; itemavail[0] = itemavail[-numitems + 126]; do { xx = random(12, 80) + 16; yy = random(12, 80) + 16; } while ( !ItemPlace(xx, yy) ); item[ii]._ix = xx; item[ii]._iy = yy; dItem[xx][yy] = ii + 1; j = GetRndSeed(); item[ii]._iSeed = j; SetRndSeed(j); if ( random(12, 2) ) GetItemAttrs(ii, IDI_HEAL, currlevel); else GetItemAttrs(ii, IDI_MANA, currlevel); item[ii]._iCreateInfo = currlevel + -32768; SetupItem(ii); item[ii]._iAnimFlag = 0; item[ii]._iAnimFrame = item[ii]._iAnimLen; item[ii]._iSelFlag = 1; DeltaAddItem(ii); ++numitems; --i; } while ( i ); } } //----- (0041F24E) -------------------------------------------------------- void __cdecl InitItems() { int *v0; // eax int v1; // edx GetItemAttrs(0, IDI_GOLD, 1); numitems = 0; qmemcpy(&golditem, item, sizeof(golditem)); golditem._iStatFlag = 1; v0 = &item[0]._ix; do { *(v0 - 1) = 0; *v0 = 0; v0[1] = 0; v0[2] = 0; *((_BYTE *)v0 + 36) = 0; v0[11] = 0; v0[10] = 0; v0 += 92; } while ( (signed int)v0 < (signed int)&item[128]._ix ); v1 = 0; memset(itemactive, 0, sizeof(itemactive)); do { itemavail[v1] = v1; ++v1; } while ( v1 < 127 ); if ( !setlevel ) { GetRndSeed(); if ( QuestStatus(0) ) SpawnRock(); if ( QuestStatus(10) ) SpawnQuestItem(16, 2 * setpc_x + 27, 2 * setpc_y + 27, 0, 1); if ( currlevel > 0u && currlevel < 0x10u ) AddInitItems(); } uitemflag = 0; } // 5CF31D: using guessed type char setlevel; //----- (0041F320) -------------------------------------------------------- void __fastcall CalcPlrItemVals(int p, bool Loadgfx) { int v2; // eax int v3; // ecx int v4; // ebx int v5; // esi int *v6; // edi int v7; // edx int v8; // ecx int v9; // eax int v10; // edx int v11; // eax int *v12; // ecx int *v13; // eax int v14; // eax int v15; // eax signed int v16; // ecx bool v17; // zf signed int v18; // eax signed int v19; // ecx signed int v20; // ebx char v21; // dl int v22; // eax int v23; // ecx int v24; // eax int v25; // eax int v26; // edx int v27; // edx int v28; // eax int v29; // ebx int v30; // ecx int v31; // eax int v32; // eax int v33; // ecx int i; // edx int v35; // eax signed int v36; // [esp-4h] [ebp-84h] __int64 v37; // [esp+Ch] [ebp-74h] BOOL v38; // [esp+14h] [ebp-6Ch] signed int v39; // [esp+18h] [ebp-68h] int v40; // [esp+1Ch] [ebp-64h] int v41; // [esp+20h] [ebp-60h] int v42; // [esp+24h] [ebp-5Ch] int v43; // [esp+28h] [ebp-58h] int v44; // [esp+2Ch] [ebp-54h] int v45; // [esp+30h] [ebp-50h] int v46; // [esp+34h] [ebp-4Ch] signed int v47; // [esp+38h] [ebp-48h] signed int v48; // [esp+3Ch] [ebp-44h] signed int v49; // [esp+40h] [ebp-40h] int v50; // [esp+44h] [ebp-3Ch] char v51; // [esp+48h] [ebp-38h] int v52; // [esp+4Ch] [ebp-34h] int v53; // [esp+50h] [ebp-30h] int v54; // [esp+54h] [ebp-2Ch] int v55; // [esp+58h] [ebp-28h] int v56; // [esp+5Ch] [ebp-24h] int v57; // [esp+60h] [ebp-20h] int v58; // [esp+64h] [ebp-1Ch] int v59; // [esp+68h] [ebp-18h] int v60; // [esp+6Ch] [ebp-14h] int v61; // [esp+70h] [ebp-10h] int arglist; // [esp+74h] [ebp-Ch] int v63; // [esp+78h] [ebp-8h] int v64; // [esp+78h] [ebp-8h] signed int r; // [esp+7Ch] [ebp-4h] v2 = 0; arglist = p; v3 = 0; v4 = 0; v5 = arglist; v38 = Loadgfx; v58 = 0; v57 = 0; v56 = 0; v55 = 0; v59 = 0; v53 = 0; v60 = 0; v52 = 0; v61 = 0; v37 = (__int64)0; v49 = 0; v48 = 0; v47 = 0; v54 = 0; r = 10; v46 = 0; v63 = 0; v51 = 0; v50 = 0; v45 = 0; v44 = 0; v43 = 0; v42 = 0; v6 = &plr[arglist].InvBody[0]._iStatFlag; v39 = 7; do { if ( *(v6 - 87) != -1 && *v6 ) { v3 += *(v6 - 38); v58 += *(v6 - 36); v2 += *(v6 - 37); v7 = *(v6 - 33); v40 = v3; v41 = v2; if ( v7 ) v37 |= (__int64)1 << ((unsigned char)v7 - 1); if ( !*((_BYTE *)v6 - 296) || *(v6 - 75) ) { v57 += *(v6 - 28); v56 += *(v6 - 27); v8 = *(v6 - 26); if ( v8 ) { v9 = v8 * *(v6 - 36) / 100; if ( !v9 ) v9 = 1; v55 += v9; v2 = v41; } v4 += *(v6 - 16); v59 |= *(v6 - 35); v53 += *(v6 - 25); v60 += *(v6 - 24); v52 += *(v6 - 23); v61 += *(v6 - 22); v49 += *(v6 - 21); v48 += *(v6 - 20); v47 += *(v6 - 19); v54 += *(v6 - 15); r += *(v6 - 14); v46 += *(v6 - 17); v63 += *(v6 - 18); v51 += *((_BYTE *)v6 - 52); v50 += *(v6 - 7); v45 += *(v6 - 11); v44 += *(v6 - 10); v43 += *(v6 - 9); v42 += *(v6 - 8); v3 = v40; } } v6 += 92; --v39; } while ( v39 ); if ( !v3 && !v2 ) { v2 = 1; v3 = 1; if ( plr[v5].InvBody[4]._itype == ITYPE_SHIELD && plr[v5].InvBody[4]._iStatFlag ) v2 = 3; if ( plr[v5].InvBody[5]._itype == ITYPE_SHIELD && plr[v5].InvBody[5]._iStatFlag ) v2 = 3; } plr[v5]._pIMaxDam = v2; plr[v5]._pIAC = v58; plr[v5]._pIBonusDam = v57; plr[v5]._pIBonusToHit = v56; plr[v5]._pIBonusAC = v55; plr[v5]._pIFlags = v59; plr[v5]._pIGetHit = v54; plr[v5]._pIMinDam = v3; plr[v5]._pIBonusDamMod = v4; if ( r < 2 ) r = 2; if ( r > 15 ) r = 15; if ( plr[v5]._pLightRad != r && arglist == myplr ) { ChangeLightRadius(plr[v5]._plid, r); v10 = 10; if ( r >= 10 ) v10 = r; ChangeVisionRadius(plr[v5]._pvid, v10); plr[v5]._pLightRad = r; } plr[v5]._pStrength = v53 + plr[v5]._pBaseStr; v11 = myplr; v12 = &plr[myplr]._pStrength; if ( *v12 <= 0 ) *v12 = 0; plr[v5]._pMagic = v60 + plr[v5]._pBaseMag; if ( plr[v11]._pMagic <= 0 ) plr[v11]._pMagic = 0; plr[v5]._pDexterity = v52 + plr[v5]._pBaseDex; if ( plr[v11]._pDexterity <= 0 ) plr[v11]._pDexterity = 0; v13 = &plr[v11]._pVitality; plr[v5]._pVitality = v61 + plr[v5]._pBaseVit; if ( *v13 <= 0 ) *v13 = 0; v14 = plr[v5]._pLevel; if ( _LOBYTE(plr[v5]._pClass) == 1 ) { v15 = (plr[v5]._pStrength + plr[v5]._pDexterity) * v14; v16 = 200; } else { v15 = plr[v5]._pStrength * v14; v16 = 100; } v17 = _LOBYTE(plr[v5]._pRSplType) == 3; plr[v5]._pISpells[0] = v37; plr[v5]._pISpells[1] = HIDWORD(v37); plr[v5]._pDamageMod = v15 / v16; if ( v17 && !(v37 & ((__int64)1 << (_LOBYTE(plr[v5]._pRSpell) - 1))) ) { plr[v5]._pRSpell = -1; _LOBYTE(plr[v5]._pRSplType) = 4; drawpanflag = 255; } plr[v5]._pISplLvlAdd = v51; plr[v5]._pIEnAc = v50; if ( v59 >= 0 ) { v19 = v49; v20 = v48; v18 = v47; } else { v18 = 0; v19 = 0; v20 = 0; } if ( v18 > 75 ) _LOBYTE(v18) = 75; plr[v5]._pMagResist = v18; if ( v19 > 75 ) _LOBYTE(v19) = 75; plr[v5]._pFireResist = v19; if ( v20 > 75 ) _LOBYTE(v20) = 75; v21 = plr[v5]._pClass; v22 = v61; plr[v5]._pLghtResist = v20; if ( !v21 ) v22 = 2 * v61; if ( v21 == 1 ) v22 += v22 >> 1; v23 = (v22 << 6) + v46; v24 = v60; if ( v21 == 2 ) v24 = 2 * v60; if ( v21 == 1 ) v24 += v24 >> 1; v64 = (v24 << 6) + v63; v25 = v23 + plr[v5]._pHPBase; v26 = v23 + plr[v5]._pMaxHPBase; plr[v5]._pHitPoints = v25; v17 = arglist == myplr; plr[v5]._pMaxHP = v26; if ( v17 && (signed int)(v25 & 0xFFFFFFC0) <= 0 ) SetPlayerHitPoints(arglist, 0); plr[v5]._pMana = v64 + plr[v5]._pManaBase; plr[v5]._pMaxMana = v64 + plr[v5]._pMaxManaBase; plr[v5]._pIFMinDam = v45; plr[v5]._pIFMaxDam = v44; plr[v5]._pILMinDam = v43; plr[v5]._pILMaxDam = v42; if ( v59 & 1 ) plr[v5]._pInfraFlag = 1; else plr[v5]._pInfraFlag = 0; v27 = plr[v5].InvBody[4]._itype; plr[v5]._pBlockFlag = 0; v28 = 0; plr[v5]._pwtype = 0; if ( v27 != ITYPE_NONE && plr[v5].InvBody[4]._iClass == 1 && plr[v5].InvBody[4]._iStatFlag ) v28 = v27; v29 = plr[v5].InvBody[5]._itype; if ( v29 != ITYPE_NONE && plr[v5].InvBody[5]._iClass == 1 && plr[v5].InvBody[5]._iStatFlag ) v28 = plr[v5].InvBody[5]._itype; switch ( v28 ) { case ITYPE_SWORD: v36 = 2; goto LABEL_86; case ITYPE_AXE: v36 = 5; goto LABEL_86; case ITYPE_BOW: plr[v5]._pwtype = 1; v36 = 4; goto LABEL_86; case ITYPE_MACE: v36 = 6; goto LABEL_86; case ITYPE_STAFF: v36 = 8; LABEL_86: v28 = v36; break; } if ( v27 == ITYPE_SHIELD && plr[v5].InvBody[4]._iStatFlag ) { plr[v5]._pBlockFlag = 1; ++v28; } if ( v29 == ITYPE_SHIELD && plr[v5].InvBody[5]._iStatFlag ) { plr[v5]._pBlockFlag = 1; ++v28; } v30 = plr[v5].InvBody[6]._itype; if ( v30 == ITYPE_MARMOR && plr[v5].InvBody[6]._iStatFlag ) v28 += 16; if ( v30 == ITYPE_HARMOR && plr[v5].InvBody[6]._iStatFlag ) v28 += 32; if ( plr[v5]._pgfxnum != v28 && v38 ) { plr[v5]._pgfxnum = v28; plr[v5]._pGFXLoad = 0; LoadPlrGFX(arglist, 1); SetPlrAnims(arglist); v31 = plr[0]._pNAnim[plr[v5]._pdir + 5430 * arglist]; plr[v5]._pAnimFrame = 1; plr[v5]._pAnimData = v31; plr[v5]._pAnimLen = plr[v5]._pNFrames; v32 = plr[v5]._pNWidth; plr[v5]._pAnimWidth = v32; plr[v5]._pAnimCnt = 0; plr[v5]._pAnimDelay = 3; plr[v5]._pAnimWidth2 = (v32 - 64) >> 1; } else { plr[v5]._pgfxnum = v28; } v33 = nummissiles; for ( i = 0; i < v33; ++i ) { v35 = missileactive[i]; if ( missile[v35]._mitype == 13 && missile[v35]._misource == arglist ) { missile[v35]._miVar1 = plr[v5]._pHitPoints; missile[v35]._miVar2 = plr[v5]._pHPBase; } } drawmanaflag = 1; drawhpflag = 1; } // 52571C: using guessed type int drawpanflag; //----- (0041F953) -------------------------------------------------------- void __fastcall CalcPlrScrolls(int p) { int v1; // esi int v2; // eax int *v3; // edi int v4; // ebx signed __int64 v5; // rax int *v6; // edi signed int v7; // ebx signed __int64 v8; // rax __int64 v9; // rax v1 = p; v2 = plr[p]._pNumInv; plr[v1]._pScrlSpells[0] = 0; plr[v1]._pScrlSpells[1] = 0; if ( v2 > 0 ) { v3 = &plr[v1].InvList[0]._iMiscId; v4 = v2; do { if ( *(v3 - 53) != -1 && (*v3 == IMISC_SCROLL || *v3 == IMISC_SCROLLT) && v3[34] ) { v5 = (__int64)1 << (*((_BYTE *)v3 + 4) - 1); plr[v1]._pScrlSpells[0] |= v5; plr[v1]._pScrlSpells[1] |= HIDWORD(v5); } v3 += 92; --v4; } while ( v4 ); } v6 = &plr[v1].SpdList[0]._iMiscId; v7 = 8; do { if ( *(v6 - 53) != -1 && (*v6 == IMISC_SCROLL || *v6 == IMISC_SCROLLT) && v6[34] ) { v8 = (__int64)1 << (*((_BYTE *)v6 + 4) - 1); plr[v1]._pScrlSpells[0] |= v8; plr[v1]._pScrlSpells[1] |= HIDWORD(v8); } v6 += 92; --v7; } while ( v7 ); if ( _LOBYTE(plr[v1]._pRSplType) == 2 ) { v9 = 1 << (_LOBYTE(plr[v1]._pRSpell) - 1); if ( !(plr[v1]._pScrlSpells[1] & HIDWORD(v9) | plr[v1]._pScrlSpells[0] & (unsigned int)v9) ) { plr[v1]._pRSpell = -1; _LOBYTE(plr[v1]._pRSplType) = 4; drawpanflag = 255; } } } // 52571C: using guessed type int drawpanflag; //----- (0041FA4A) -------------------------------------------------------- void __fastcall CalcPlrStaff(int pnum) { int v1; // esi bool v2; // zf signed __int64 v3; // rax v1 = pnum; v2 = plr[pnum].InvBody[4]._itype == ITYPE_NONE; plr[v1]._pISpells[0] = 0; plr[v1]._pISpells[1] = 0; if ( !v2 && plr[v1].InvBody[4]._iStatFlag && plr[v1].InvBody[4]._iCharges > 0 ) { v3 = (__int64)1 << (_LOBYTE(plr[v1].InvBody[4]._iSpell) - 1); plr[v1]._pISpells[0] = v3; plr[v1]._pISpells[1] = HIDWORD(v3); } } //----- (0041FA97) -------------------------------------------------------- void __fastcall CalcSelfItems(int pnum) { PlayerStruct *v1; // ecx int v2; // edx int v3; // esi int v4; // edi int *v5; // eax signed int v6; // ebx bool v7; // zf char *v8; // eax signed int v9; // [esp+Ch] [ebp-10h] signed int v10; // [esp+10h] [ebp-Ch] int v11; // [esp+14h] [ebp-8h] signed int v12; // [esp+18h] [ebp-4h] v1 = &plr[pnum]; v2 = 0; v3 = 0; v4 = 0; v5 = &v1->InvBody[0]._iStatFlag; v6 = 7; do { if ( *(v5 - 87) != -1 ) { v7 = *(v5 - 75) == 0; *v5 = 1; if ( !v7 ) { v2 += *(v5 - 25); v3 += *(v5 - 24); v4 += *(v5 - 23); } } v5 += 92; --v6; } while ( v6 ); v11 = v4; do { v9 = 0; v8 = &v1->InvBody[0]._iMinStr; v10 = 7; do { if ( *((_DWORD *)v8 - 86) != -1 && *((_DWORD *)v8 + 1) ) { v12 = 1; if ( v2 + v1->_pBaseStr < *v8 ) v12 = 0; if ( v3 + v1->_pBaseMag < (unsigned char)v8[1] ) v12 = 0; if ( v11 + v1->_pBaseDex < v8[2] ) v12 = 0; if ( !v12 ) { v7 = *((_DWORD *)v8 - 74) == 0; v9 = 1; *((_DWORD *)v8 + 1) = 0; if ( !v7 ) { v2 -= *((_DWORD *)v8 - 24); v3 -= *((_DWORD *)v8 - 23); v11 -= *((_DWORD *)v8 - 22); } } } v8 += 368; --v10; } while ( v10 ); } while ( v9 ); } //----- (0041FB91) -------------------------------------------------------- void __fastcall CalcPlrItemMin(int pnum) { PlayerStruct *v1; // ecx PlayerStruct *v2; // esi ItemStruct *v3; // edi int v4; // ebp ItemStruct *v6; // edi signed int v7; // ebp v1 = &plr[pnum]; v2 = v1; v3 = v1->InvList; if ( v1->_pNumInv ) { v4 = v1->_pNumInv; do { v3->_iStatFlag = ItemMinStats(v2, v3); ++v3; --v4; } while ( v4 ); } v6 = v2->SpdList; v7 = 8; do { if ( v6->_itype != -1 ) { v6->_iStatFlag = ItemMinStats(v2, v6); } ++v6; --v7; } while ( v7 ); } //----- (0041FBF6) -------------------------------------------------------- bool __fastcall ItemMinStats(PlayerStruct *p, ItemStruct *x) { if ( p->_pStrength < x->_iMinStr || p->_pMagic < x->_iMinMag || p->_pDexterity < x->_iMinDex ) return 0; else return 1; } //----- (0041FC2C) -------------------------------------------------------- void __fastcall CalcPlrBookVals(int p) { int v1; // esi int v2; // ebx int *v3; // edi int v5; // esi int *v6; // edi int v7; // eax unsigned char v8; // cl unsigned char v9; // cl int v10; // eax int v12; // [esp+Ch] [ebp-Ch] int v13; // [esp+10h] [ebp-8h] unsigned char v14; // [esp+17h] [ebp-1h] v1 = p; if ( !currlevel ) { v2 = 1; if ( witchitem[1]._itype != -1 ) { v3 = &witchitem[1]._iStatFlag; do { WitchBookLevel(v2); *v3 = StoreStatOk((ItemStruct *)(v3 - 89)); v3 += 92; ++v2; } while ( *(v3 - 87) != -1 ); } } v5 = v1; v12 = 0; if ( plr[v5]._pNumInv > 0 ) { v6 = &plr[v5].InvList[0]._iSpell; do { if ( !*(v6 - 54) && *(v6 - 1) == 24 ) { v7 = *v6; v8 = spelldata[*v6].sMinInt; *((_BYTE *)v6 + 129) = v8; v13 = plr[0]._pSplLvl[v7 + v5 * 21720]; if ( plr[0]._pSplLvl[v7 + v5 * 21720] ) { do { v9 = 20 * v8 / 100 + v8; --v13; v14 = v9; v10 = v9 + 20 * v9 / 100; v8 = -1; if ( v10 <= 255 ) v8 = v14; else v13 = 0; } while ( v13 ); *((_BYTE *)v6 + 129) = v8; } v6[33] = ItemMinStats(&plr[v5], (ItemStruct *)(v6 - 56)); } ++v12; v6 += 92; } while ( v12 < plr[v5]._pNumInv ); } } //----- (0041FD3E) -------------------------------------------------------- void __fastcall CalcPlrInv(int p, bool Loadgfx) { CalcPlrItemMin(p); CalcSelfItems(p); CalcPlrItemVals(p, Loadgfx); CalcPlrItemMin(p); if ( p == myplr ) { CalcPlrBookVals(p); CalcPlrScrolls(p); CalcPlrStaff(p); if ( p == myplr && !currlevel ) RecalcStoreStats(); } } //----- (0041FD98) -------------------------------------------------------- void __fastcall SetPlrHandItem(ItemStruct *h, int idata) { ItemDataStruct *pAllItem; // edi pAllItem = &AllItemsList[idata]; memset(h, 0, 0x170u); h->_itype = pAllItem->itype; h->_iCurs = pAllItem->iCurs; strcpy(h->_iName, pAllItem->iName); strcpy(h->_iIName, pAllItem->iName); h->_iLoc = pAllItem->iLoc; h->_iClass = pAllItem->iClass; h->_iMinDam = pAllItem->iMinDam; h->_iMaxDam = pAllItem->iMaxDam; h->_iAC = pAllItem->iMinAC; h->_iMiscId = pAllItem->iMiscId; h->_iSpell = pAllItem->iSpell; if ( pAllItem->iMiscId == IMISC_STAFF ) h->_iCharges = 40; h->_iMaxCharges = h->_iCharges; h->_iDurability = pAllItem->iDurability; h->_iMaxDur = pAllItem->iDurability; h->_iMinStr = pAllItem->iMinStr; h->_iMinMag = pAllItem->iMinMag; h->_iMinDex = pAllItem->iMinDex; h->_ivalue = pAllItem->iValue; h->_iPrePower = -1; h->_iSufPower = -1; h->_iMagical = 0; h->_iIvalue = pAllItem->iValue; h->IDidx = idata; } //----- (0041FE98) -------------------------------------------------------- void __fastcall GetPlrHandSeed(ItemStruct *h) { h->_iSeed = GetRndSeed(); } //----- (0041FEA4) -------------------------------------------------------- void __fastcall GetGoldSeed(int pnum, ItemStruct *h) { int v3; // edi signed int v4; // esi int v5; // eax int i; // ecx int v7; // edx ItemStruct *v8; // ecx v3 = pnum; do { v4 = 1; v5 = GetRndSeed(); for ( i = 0; i < numitems; ++i ) { if ( item[itemactive[i]]._iSeed == v5 ) v4 = 0; } if ( v3 == myplr ) { v7 = plr[v3]._pNumInv; if ( v7 > 0 ) { v8 = plr[v3].InvList; do { if ( v8->_iSeed == v5 ) v4 = 0; ++v8; --v7; } while ( v7 ); } } } while ( !v4 ); h->_iSeed = v5; } //----- (0041FF16) -------------------------------------------------------- void __fastcall SetPlrHandSeed(ItemStruct *h, int iseed) { h->_iSeed = iseed; } //----- (0041FF19) -------------------------------------------------------- void __fastcall SetPlrHandGoldCurs(ItemStruct *h) { int v1; // eax v1 = h->_ivalue; if ( v1 < 2500 ) { if ( v1 > 1000 ) h->_iCurs = 5; else h->_iCurs = 4; } else { h->_iCurs = 6; } } //----- (0041FF4E) -------------------------------------------------------- void __fastcall CreatePlrItems(int p) { int v1; // ebx int *v2; // eax signed int v3; // ecx int *v4; // eax signed int v5; // ecx int *v6; // eax signed int v7; // ecx int player_numa; // [esp+Ch] [ebp-4h] player_numa = p; v1 = p; v2 = &plr[p].InvBody[0]._itype; v3 = 7; do { *v2 = -1; v2 += 92; --v3; } while ( v3 ); memset(plr[v1].InvGrid, 0, 0x28u); v4 = &plr[v1].InvList[0]._itype; v5 = 40; do { *v4 = -1; v4 += 92; --v5; } while ( v5 ); plr[v1]._pNumInv = 0; v6 = &plr[v1].SpdList[0]._itype; v7 = 8; do { *v6 = -1; v6 += 92; --v7; } while ( v7 ); switch ( _LOBYTE(plr[v1]._pClass) ) { case UI_WARRIOR: SetPlrHandItem(&plr[v1].InvBody[4], IDI_WARRIOR); GetPlrHandSeed(&plr[v1].InvBody[4]); SetPlrHandItem(&plr[v1].InvBody[5], IDI_WARRSHLD); GetPlrHandSeed(&plr[v1].InvBody[5]); SetPlrHandItem(&plr[v1].HoldItem, IDI_WARRCLUB); GetPlrHandSeed(&plr[v1].HoldItem); AutoPlace(player_numa, 0, 1, 3, 1); goto LABEL_13; case UI_ROGUE: SetPlrHandItem(&plr[v1].InvBody[4], IDI_ROGUE); GetPlrHandSeed(&plr[v1].InvBody[4]); LABEL_13: SetPlrHandItem(plr[v1].SpdList, IDI_HEAL); GetPlrHandSeed(plr[v1].SpdList); SetPlrHandItem(&plr[v1].SpdList[1], IDI_HEAL); goto LABEL_14; case UI_SORCERER: SetPlrHandItem(&plr[v1].InvBody[4], IDI_SORCEROR); GetPlrHandSeed(&plr[v1].InvBody[4]); SetPlrHandItem(plr[v1].SpdList, IDI_MANA); GetPlrHandSeed(plr[v1].SpdList); SetPlrHandItem(&plr[v1].SpdList[1], IDI_MANA); LABEL_14: GetPlrHandSeed(&plr[v1].SpdList[1]); break; } SetPlrHandItem(&plr[v1].HoldItem, IDI_GOLD); GetPlrHandSeed(&plr[v1].HoldItem); plr[v1].HoldItem._iCurs = 4; plr[v1].HoldItem._ivalue = 100; plr[v1]._pGold = 100; qmemcpy((char *)&plr[0].InvList[plr[v1]._pNumInv++] + v1 * 21720, &plr[v1].HoldItem, 0x170u); plr[v1].InvGrid[30] = plr[v1]._pNumInv; CalcPlrItemVals(player_numa, 0); } //----- (004200F8) -------------------------------------------------------- bool __fastcall ItemSpaceOk(int i, int j) { int v2; // eax int v3; // esi char v4; // cl int v5; // ecx char v6; // cl bool v7; // sf char v8; // cl char v9; // al if ( i < 0 ) return 0; if ( i >= 112 ) return 0; if ( j < 0 ) return 0; if ( j >= 112 ) return 0; v2 = i; v3 = 112 * i + j; if ( dMonster[0][v3] || dPlayer[v2][j] || dItem[v2][j] ) return 0; v4 = dObject[v2][j]; if ( v4 ) { v5 = v4 <= 0 ? -1 - v4 : v4 - 1; if ( object[v5]._oSolidFlag ) return 0; } v6 = dObject[v2 + 1][j + 1]; v7 = v6 < 0; if ( v6 > 0 ) { if ( _LOBYTE(object[v6-1]._oSelFlag) ) /* check */ return 0; v7 = v6 < 0; } if ( !v7 || !_LOBYTE(object[-(v6 + 1)]._oSelFlag) ) { v8 = dObject[v2 + 1][j]; if ( v8 <= 0 ) return nSolidTable[dPiece[0][v3]] == 0; v9 = dObject[v2][j + 1]; if ( v9 <= 0 || !_LOBYTE(object[v8-1]._oSelFlag) || !_LOBYTE(object[v9-1]._oSelFlag) ) return nSolidTable[dPiece[0][v3]] == 0; } return 0; } //----- (004201F2) -------------------------------------------------------- bool __fastcall GetItemSpace(int x, int y, char inum) { int v3; // eax int v4; // edx char (*v5)[3]; // edi int v6; // ebx char (*v7)[3]; // esi signed int v9; // esi char (*v10)[3]; // eax int v11; // ecx int v12; // eax int v14; // ecx int v15; // edx int v16; // eax int v17; // esi int v18; // ecx int v19; // [esp+8h] [ebp-Ch] int v20; // [esp+Ch] [ebp-8h] char (*v21)[3]; // [esp+10h] [ebp-4h] v3 = y; v19 = y; v4 = y - 1; v20 = x; v5 = itemhold; if ( v4 <= v19 + 1 ) { v21 = itemhold; do { v6 = x - 1; if ( (unsigned char)(__OFSUB__(x - 1, x + 1) ^ 1) | (x - 1 == x + 1) ) { v7 = v21; do { *(_DWORD *)v7 = ItemSpaceOk(v6, v4); v7 += 4; ++v6; } while ( v6 <= v20 + 1 ); v3 = v19; x = v20; } v21 = (char (*)[3])((char *)v21 + 4); ++v4; } while ( v4 <= v3 + 1 ); } v9 = 0; do { v10 = v5; v11 = 3; do { if ( *(_DWORD *)v10 ) v9 = 1; v10 += 4; --v11; } while ( v11 ); v5 = (char (*)[3])((char *)v5 + 4); } while ( (signed int)v5 < (signed int)&itemhold[3][0] ); _LOBYTE(v11) = 13; v12 = random(v11, 15) + 1; if ( !v9 ) return 0; v14 = 0; v15 = 0; if ( v12 > 0 ) { while ( 1 ) { if ( *(_DWORD *)&itemhold[0][4 * (v15 + 2 * v14 + v14)] ) --v12; if ( v12 <= 0 ) break; if ( ++v14 == 3 ) { v14 = 0; if ( ++v15 == 3 ) v15 = 0; } } } v16 = v14 + v20 - 1; v17 = v15 + v19 - 1; v18 = inum; item[v18]._ix = v16; dItem[v16][v17] = inum + 1; item[v18]._iy = v17; return 1; } //----- (004202E8) -------------------------------------------------------- void __fastcall GetSuperItemSpace(int x, int y, char inum) { signed int v4; // edi signed int v5; // ebx int v6; // edx int v7; // esi int v9; // eax int v10; // [esp+Ch] [ebp-10h] int v11; // [esp+10h] [ebp-Ch] signed int v12; // [esp+14h] [ebp-8h] signed int v13; // [esp+18h] [ebp-4h] v11 = y; v10 = x; if ( !GetItemSpace(x, y, inum) ) { v13 = 2; v4 = -2; do { v5 = v4; if ( v4 <= v13 ) { while ( 2 ) { v12 = v4; v6 = v5 + v11; v7 = v4 + v10; do { if ( ItemSpaceOk(v7, v6) ) { v9 = inum; item[v9]._ix = v7; item[v9]._iy = v6; dItem[v7][v6] = inum + 1; return; } ++v12; ++v7; } while ( v12 <= v13 ); if ( ++v5 <= v13 ) continue; break; } } ++v13; --v4; } while ( v4 > -50 ); } } //----- (00420376) -------------------------------------------------------- void __fastcall GetSuperItemLoc(int x, int y, int *xx, int *yy) { signed int v4; // edi signed int v5; // ebx int v6; // esi int v8; // [esp+Ch] [ebp-10h] int v9; // [esp+10h] [ebp-Ch] signed int v10; // [esp+14h] [ebp-8h] signed int v11; // [esp+18h] [ebp-4h] v9 = y; v8 = x; v11 = 1; v4 = -1; while ( 1 ) { v5 = v4; if ( v4 <= v11 ) break; LABEL_7: ++v11; if ( --v4 <= -50 ) return; } LABEL_3: v10 = v4; *yy = v5 + v9; v6 = v4 + v8; while ( 1 ) { *xx = v6; if ( ItemSpaceOk(v6, *yy) ) break; ++v10; ++v6; if ( v10 > v11 ) { if ( ++v5 <= v11 ) goto LABEL_3; goto LABEL_7; } } } //----- (004203E0) -------------------------------------------------------- void __fastcall CalcItemValue(int i) { int v1; // ecx int v2; // esi bool v3; // sf int v4; // esi v1 = i; v2 = item[v1]._iVMult1 + item[v1]._iVMult2; v3 = v2 < 0; if ( v2 > 0 ) { v2 *= item[v1]._ivalue; v3 = v2 < 0; } if ( v3 ) v2 = item[v1]._ivalue / v2; v4 = item[v1]._iVAdd1 + item[v1]._iVAdd2 + v2; if ( v4 <= 0 ) v4 = 1; item[v1]._iIvalue = v4; } //----- (0042042C) -------------------------------------------------------- void __fastcall GetBookSpell(int i, int lvl) { int v2; // edi int v3; // esi int v4; // eax int v5; // edx signed int v6; // ecx int v7; // esi const char **v8; // ebx int v9; // eax char v10; // al int v11; // [esp+8h] [ebp-4h] v2 = lvl; v3 = i; if ( !lvl ) v2 = lvl + 1; _LOBYTE(i) = 14; v4 = random(i, 37) + 1; LABEL_13: v6 = 1; while ( v4 > 0 ) { v5 = spelldata[v6].sBookLvl; if ( v5 != -1 && v2 >= v5 ) { --v4; v11 = v6; } ++v6; if ( gbMaxPlayers == 1 ) { if ( v6 == SPL_RESURRECT ) v6 = SPL_TELEKINESIS; if ( v6 == SPL_HEALOTHER ) v6 = SPL_FLARE; } if ( v6 == 37 ) goto LABEL_13; } v7 = v3; v8 = (const char **)&spelldata[v11].sNameText; strcat(item[v7]._iName, *v8); strcat(item[v7]._iIName, *v8); item[v7]._iSpell = v11; item[v7]._iMinMag = spelldata[v11].sMinInt; v9 = spelldata[v11].sBookCost; item[v7]._ivalue += v9; item[v7]._iIvalue += v9; v10 = spelldata[v11].sType; if ( v10 == STYPE_FIRE ) item[v7]._iCurs = 87; // Red Book if ( v10 == STYPE_LIGHTNING ) item[v7]._iCurs = 88; // Blue Book if ( v10 == STYPE_MAGIC ) item[v7]._iCurs = 86; // Black Book } // 679660: using guessed type char gbMaxPlayers; //----- (00420514) -------------------------------------------------------- void __fastcall GetStaffPower(int i, int lvl, int bs, unsigned char onlygood) { int v4; // esi int v5; // ebx int v6; // edx int v7; // ecx int v9; // edi int v10; // ecx int v11; // ST14_4 int v12; // esi char *v13; // edi int l[256]; // [esp+Ch] [ebp-484h] char istr[128]; // [esp+40Ch] [ebp-84h] int ia; // [esp+48Ch] [ebp-4h] char *v17; // [esp+49Ch] [ebp+Ch] v4 = lvl; ia = i; _LOBYTE(i) = 15; v5 = -1; if ( !random(i, 10) || onlygood ) { v6 = 0; v7 = 0; if ( PL_Prefix[0].PLPower != -1 ) { do { if ( PL_Prefix[v7].PLIType & 0x100 && PL_Prefix[v7].PLMinLvl <= v4 && (!onlygood || PL_Prefix[v7].PLOk) ) { l[v6++] = v7; if ( PL_Prefix[v7].PLDouble ) l[v6++] = v7; } ++v7; } while ( PL_Prefix[v7].PLPower != -1 ); if ( v6 ) { _LOBYTE(v7) = 16; v5 = l[random(v7, v6)]; v9 = ia; v17 = item[ia]._iIName; sprintf(istr, "%s %s", PL_Prefix[v5].PLName, item[ia]._iIName); strcpy(v17, istr); v10 = ia; v11 = PL_Prefix[v5].PLMultVal; item[v9]._iMagical = 1; SaveItemPower( v10, PL_Prefix[v5].PLPower, PL_Prefix[v5].PLParam1, PL_Prefix[v5].PLParam2, PL_Prefix[v5].PLMinVal, PL_Prefix[v5].PLMaxVal, v11); item[v9]._iPrePower = PL_Prefix[v5].PLPower; } } } v12 = ia; v13 = item[ia]._iIName; if ( !control_WriteStringToBuffer(item[ia]._iIName) ) { strcpy(v13, AllItemsList[item[v12].IDidx].iSName); if ( v5 != -1 ) { sprintf(istr, "%s %s", PL_Prefix[v5].PLName, v13); strcpy(v13, istr); } sprintf(istr, "%s of %s", v13, spelldata[bs].sNameText); strcpy(v13, istr); if ( !item[v12]._iMagical ) strcpy(item[v12]._iName, v13); } CalcItemValue(ia); } // 420514: using guessed type int var_484[256]; //----- (004206E5) -------------------------------------------------------- void __fastcall GetStaffSpell(int i, int lvl, unsigned char onlygood) { int l; // esi int rv; // eax int s; // ecx int minc; // ebx int maxc; // edx int v; // eax char istr[64]; // [esp+4h] [ebp-4Ch] int bs; // [esp+4Ch] [ebp-4h] if ( random(17, 4) ) { l = lvl >> 1; if ( !l ) l = 1; rv = random(18, 37) + 1; LABEL_15: s = 1; while ( rv > 0 ) { if ( spelldata[s].sStaffLvl != -1 && l >= spelldata[s].sStaffLvl ) { --rv; bs = s; } ++s; if ( gbMaxPlayers == 1 ) { if ( s == SPL_RESURRECT ) s = SPL_TELEKINESIS; if ( s == SPL_HEALOTHER ) s = SPL_FLARE; } if ( s == 37 ) goto LABEL_15; } sprintf(istr, "%s of %s", item[i]._iName, spelldata[bs].sNameText); if ( !control_WriteStringToBuffer(istr) ) sprintf(istr, "Staff of %s", spelldata[bs].sNameText); strcpy(item[i]._iName, istr); strcpy(item[i]._iIName, istr); minc = spelldata[bs].sStaffMin; maxc = spelldata[bs].sStaffMax - minc + 1; item[i]._iSpell = bs; v = random(19, maxc) + minc; item[i]._iMinMag = spelldata[bs].sMinInt; item[i]._iCharges = v; item[i]._iMaxCharges = v; v = (v * spelldata[bs].sStaffCost) / 5; item[i]._ivalue += v; item[i]._iIvalue += v; GetStaffPower(i, lvl, bs, onlygood); } else { GetItemPower(i, lvl >> 1, lvl, 256, onlygood); } } // 679660: using guessed type char gbMaxPlayers; //----- (0042084A) -------------------------------------------------------- void __fastcall GetItemAttrs(int i, int idata, int lvl) { int rndv; // eax item[i]._itype = AllItemsList[idata].itype; item[i]._iCurs = AllItemsList[idata].iCurs; strcpy(item[i]._iName, AllItemsList[idata].iName); strcpy(item[i]._iIName, AllItemsList[idata].iName); item[i]._iLoc = AllItemsList[idata].iLoc; item[i]._iClass = AllItemsList[idata].iClass; item[i]._iMinDam = AllItemsList[idata].iMinDam; item[i]._iMaxDam = AllItemsList[idata].iMaxDam; item[i]._iMiscId = AllItemsList[idata].iMiscId; item[i]._iAC = AllItemsList[idata].iMinAC + random(20, AllItemsList[idata].iMaxAC - AllItemsList[idata].iMinAC + 1); item[i]._iFlags = AllItemsList[idata].iFlags; item[i]._iSpell = AllItemsList[idata].iSpell; item[i]._ivalue = AllItemsList[idata].iValue; item[i]._iIvalue = AllItemsList[idata].iValue; item[i]._iMagical = 0; item[i]._iDurability = AllItemsList[idata].iDurability; item[i]._iMaxDur = AllItemsList[idata].iDurability; item[i]._iVAdd1 = 0; item[i]._iMinStr = AllItemsList[idata].iMinStr; item[i]._iMinMag = AllItemsList[idata].iMinMag; item[i]._iMinDex = AllItemsList[idata].iMinDex; item[i]._iVMult1 = 0; item[i]._iVAdd2 = 0; item[i]._iVMult2 = 0; item[i]._iPLDam = 0; item[i]._iPLToHit = 0; item[i]._iPLAC = 0; item[i]._iPLStr = 0; item[i]._iPLMag = 0; item[i]._iPLDex = 0; item[i]._iPLVit = 0; item[i]._iCharges = 0; item[i]._iMaxCharges = 0; item[i]._iPLFR = 0; item[i]._iPLLR = 0; item[i]._iPLMR = 0; item[i].IDidx = idata; item[i]._iPLDamMod = 0; item[i]._iPLGetHit = 0; item[i]._iPLLight = 0; item[i]._iSplLvlAdd = 0; item[i]._iPrePower = -1; item[i]._iSufPower = -1; item[i]._iRequest = 0; item[i]._iFMinDam = 0; item[i]._iFMaxDam = 0; item[i]._iLMinDam = 0; item[i]._iLMaxDam = 0; item[i]._iPLEnAc = 0; item[i]._iPLMana = 0; item[i]._iPLHP = 0; if ( AllItemsList[idata].iMiscId == IMISC_BOOK ) GetBookSpell(i, lvl); if ( item[i]._itype == ITYPE_GOLD ) { if ( gnDifficulty ) /* clean this up, NORMAL */ rndv = lvl; else rndv = 5 * currlevel + random(21, 10 * currlevel); if ( gnDifficulty == DIFF_NIGHTMARE ) rndv = 5 * (currlevel + 16) + random(21, 10 * (currlevel + 16)); if ( gnDifficulty == DIFF_HELL ) rndv = 5 * (currlevel + 32) + random(21, 10 * (currlevel + 32)); if ( leveltype == 4 ) rndv += rndv >> 3; if ( rndv > 5000 ) rndv = 5000; item[i]._ivalue = rndv; if ( rndv < 2500 ) item[i]._iCurs = (rndv > 1000) + 4; else item[i]._iCurs = 6; } } // 5BB1ED: using guessed type char leveltype; //----- (00420B17) -------------------------------------------------------- int __fastcall RndPL(int param1, int param2) { return param1 + random(22, param2 - param1 + 1); } //----- (00420B28) -------------------------------------------------------- int __fastcall PLVal(int pv, int p1, int p2, int minv, int maxv) { if ( p1 == p2 ) return minv; if ( minv == maxv ) return minv; return minv + (maxv - minv) * (100 * (pv - p1) / (p2 - p1)) / 100; } //----- (00420B68) -------------------------------------------------------- void __fastcall SaveItemPower(int i, int power, int param1, int param2, int minval, int maxval, int multval) { int v7; // edi int v8; // esi int v9; // eax int v10; // ebx int *v11; // eax int *v12; // eax int v13; // edi int v14; // eax int v15; // edi int v16; // eax int v17; // eax int v18; // ecx int v19; // edx int v20; // edi int *v21; // edx int v22; // eax int v23; // eax int v24; // eax int v25; // eax int v26; // eax int v27; // eax int v28; // ecx int *v29; // eax int v30; // ecx int *v31; // eax int v32; // ecx int v33; // eax int v34; // ST18_4 int v35; // eax int v36; // ecx int v37; // edx signed int v38; // ecx int v39; // eax int v40; // eax int v41; // ecx int *v42; // eax int v43; // esi v7 = power; v8 = i; v9 = RndPL(param1, param2); v10 = v9; switch ( v7 ) { case IPL_TOHIT: v11 = &item[v8]._iPLToHit; goto LABEL_115; case IPL_TOHIT_CURSE: v12 = &item[v8]._iPLToHit; goto LABEL_62; case IPL_DAMP: v11 = &item[v8]._iPLDam; goto LABEL_115; case IPL_DAMP_CURSE: v12 = &item[v8]._iPLDam; goto LABEL_62; case IPL_TOHIT_DAMP: v10 = RndPL(param1, param2); v13 = v8; item[v13]._iPLDam += v10; if ( param1 == 20 ) v14 = RndPL(1, 5); else v14 = param1; if ( param1 == 36 ) v14 = RndPL(6, 10); if ( param1 == 51 ) v14 = RndPL(11, 15); if ( param1 == 66 ) v14 = RndPL(16, 20); if ( param1 == 81 ) v14 = RndPL(21, 30); if ( param1 == 96 ) v14 = RndPL(31, 40); if ( param1 == 111 ) v14 = RndPL(41, 50); if ( param1 == 126 ) v14 = RndPL(51, 75); if ( param1 == 151 ) v14 = RndPL(76, 100); item[v13]._iPLToHit += v14; break; case IPL_TOHIT_DAMP_CURSE: v15 = v8; item[v15]._iPLDam -= v9; if ( param1 == 25 ) v16 = RndPL(1, 5); else v16 = param1; if ( param1 == 50 ) v16 = RndPL(6, 10); item[v15]._iPLToHit -= v16; break; case IPL_ACP: v11 = &item[v8]._iPLAC; goto LABEL_115; case IPL_ACP_CURSE: v12 = &item[v8]._iPLAC; goto LABEL_62; case IPL_FIRERES: v11 = &item[v8]._iPLFR; goto LABEL_115; case IPL_LIGHTRES: v11 = &item[v8]._iPLLR; goto LABEL_115; case IPL_MAGICRES: v11 = &item[v8]._iPLMR; goto LABEL_115; case IPL_ALLRES: v17 = v8; item[v17]._iPLFR += v10; v18 = item[v8]._iPLFR; item[v17]._iPLLR += v10; item[v17]._iPLMR += v10; v19 = item[v8]._iPLLR; v20 = item[v8]._iPLMR; if ( v18 < 0 ) item[v17]._iPLFR = 0; if ( v19 < 0 ) item[v17]._iPLLR = 0; if ( v20 < 0 ) item[v17]._iPLMR = 0; break; case IPL_SPLLVLADD: item[v8]._iSplLvlAdd = v9; break; case IPL_CHARGES: v21 = &item[v8]._iCharges; v22 = param1 * *v21; *v21 = v22; item[v8]._iMaxCharges = v22; break; case IPL_FIREDAM: v24 = v8; item[v24]._iFlags |= 0x10u; goto LABEL_77; case IPL_LIGHTDAM: v25 = v8; item[v25]._iFlags |= 0x20u; goto LABEL_79; case IPL_STR: v11 = &item[v8]._iPLStr; goto LABEL_115; case IPL_STR_CURSE: v12 = &item[v8]._iPLStr; goto LABEL_62; case IPL_MAG: v11 = &item[v8]._iPLMag; goto LABEL_115; case IPL_MAG_CURSE: v12 = &item[v8]._iPLMag; goto LABEL_62; case IPL_DEX: v11 = &item[v8]._iPLDex; goto LABEL_115; case IPL_DEX_CURSE: v12 = &item[v8]._iPLDex; goto LABEL_62; case IPL_VIT: v11 = &item[v8]._iPLVit; goto LABEL_115; case IPL_VIT_CURSE: v12 = &item[v8]._iPLVit; goto LABEL_62; case IPL_ATTRIBS: v26 = v8; item[v26]._iPLStr += v10; item[v26]._iPLMag += v10; item[v26]._iPLDex += v10; item[v26]._iPLVit += v10; break; case IPL_ATTRIBS_CURSE: v27 = v8; item[v27]._iPLStr -= v10; item[v27]._iPLMag -= v10; item[v27]._iPLDex -= v10; item[v27]._iPLVit -= v10; break; case IPL_GETHIT: v11 = &item[v8]._iPLGetHit; goto LABEL_115; case IPL_GETHIT_CURSE: v12 = &item[v8]._iPLGetHit; goto LABEL_62; case IPL_LIFE: v28 = v9 << 6; v29 = &item[v8]._iPLHP; goto LABEL_73; case IPL_LIFE_CURSE: v30 = v9 << 6; v31 = &item[v8]._iPLHP; goto LABEL_75; case IPL_MANA: item[v8]._iPLMana += v9 << 6; goto LABEL_92; case IPL_MANA_CURSE: item[v8]._iPLMana -= v9 << 6; goto LABEL_92; case IPL_DUR: v32 = v8; v33 = item[v8]._iMaxDur; v34 = v33; v35 = v10 * v33 / 100; item[v32]._iDurability += v35; item[v32]._iMaxDur = v35 + v34; break; case IPL_DUR_CURSE: v36 = v8; v37 = item[v8]._iMaxDur - v9 * item[v8]._iMaxDur / 100; item[v8]._iMaxDur = v37; if ( v37 < 1 ) item[v36]._iMaxDur = 1; item[v36]._iDurability = item[v36]._iMaxDur; break; case IPL_INDESTRUCTIBLE: v38 = 255; goto LABEL_119; case IPL_LIGHT: v28 = param1; v29 = &item[v8]._iPLLight; LABEL_73: *v29 += v28; break; case IPL_LIGHT_CURSE: v30 = param1; v31 = &item[v8]._iPLLight; LABEL_75: *v31 -= v30; break; case IPL_FIRE_ARROWS: v24 = v8; item[v24]._iFlags |= 8u; LABEL_77: item[v24]._iFMinDam = param1; item[v24]._iFMaxDam = param2; break; case IPL_LIGHT_ARROWS: v25 = v8; _HIBYTE(item[v8]._iFlags) |= 2u; LABEL_79: item[v25]._iLMinDam = param1; item[v25]._iLMaxDam = param2; break; case IPL_INVCURS: item[v8]._iCurs = param1; break; case IPL_THORNS: _HIBYTE(item[v8]._iFlags) |= 4u; break; case IPL_NOMANA: _HIBYTE(item[v8]._iFlags) |= 8u; goto LABEL_92; case IPL_NOHEALPLR: BYTE1(item[v8]._iFlags) |= 1u; break; case IPL_ABSHALFTRAP: _HIBYTE(item[v8]._iFlags) |= 0x10u; break; case IPL_KNOCKBACK: BYTE1(item[v8]._iFlags) |= 8u; break; case IPL_NOHEALMON: BYTE1(item[v8]._iFlags) |= 0x10u; break; case IPL_STEALMANA: if ( param1 == 3 ) BYTE1(item[v8]._iFlags) |= 0x20u; if ( param1 == 5 ) BYTE1(item[v8]._iFlags) |= 0x40u; LABEL_92: drawmanaflag = 1; break; case IPL_STEALLIFE: if ( param1 == 3 ) BYTE1(item[v8]._iFlags) |= 0x80u; if ( param1 == 5 ) BYTE2(item[v8]._iFlags) |= 1u; drawhpflag = 1; break; case IPL_TARGAC: v11 = &item[v8]._iPLEnAc; goto LABEL_115; case IPL_FASTATTACK: if ( param1 == 1 ) BYTE2(item[v8]._iFlags) |= 2u; if ( param1 == 2 ) BYTE2(item[v8]._iFlags) |= 4u; if ( param1 == 3 ) BYTE2(item[v8]._iFlags) |= 8u; if ( param1 == 4 ) BYTE2(item[v8]._iFlags) |= 0x10u; break; case IPL_FASTRECOVER: if ( param1 == 1 ) BYTE2(item[v8]._iFlags) |= 0x20u; if ( param1 == 2 ) BYTE2(item[v8]._iFlags) |= 0x40u; if ( param1 == 3 ) BYTE2(item[v8]._iFlags) |= 0x80u; break; case IPL_FASTBLOCK: _HIBYTE(item[v8]._iFlags) |= 1u; break; case IPL_DAMMOD: v11 = &item[v8]._iPLDamMod; LABEL_115: *v11 += v10; break; case IPL_RNDARROWVEL: item[v8]._iFlags |= 4u; break; case IPL_SETDAM: v39 = v8; item[v39]._iMinDam = param1; item[v39]._iMaxDam = param2; break; case IPL_SETDUR: v38 = param1; LABEL_119: v40 = v8; item[v40]._iDurability = v38; item[v40]._iMaxDur = v38; break; case IPL_NOMINSTR: item[v8]._iMinStr = 0; break; case IPL_SPELL: v23 = v8; item[v23]._iSpell = param1; item[v23]._iCharges = param1; item[v23]._iMaxCharges = param2; break; case IPL_FASTSWING: BYTE2(item[v8]._iFlags) |= 8u; break; case IPL_ONEHAND: item[v8]._iLoc = ILOC_ONEHAND; break; case IPL_3XDAMVDEM: _HIBYTE(item[v8]._iFlags) |= 0x40u; break; case IPL_ALLRESZERO: _HIBYTE(item[v8]._iFlags) |= 0x80u; break; case IPL_DRAINLIFE: item[v8]._iFlags |= 0x40u; break; case IPL_RNDSTEALLIFE: item[v8]._iFlags |= 2u; break; case IPL_INFRAVISION: item[v8]._iFlags |= 1u; break; case IPL_SETAC: item[v8]._iAC = v9; break; case IPL_ADDACLIFE: item[v8]._iPLHP = (plr[myplr]._pIBonusAC + plr[myplr]._pIAC + plr[myplr]._pDexterity / 5) << 6; break; case IPL_ADDMANAAC: item[v8]._iAC += (plr[myplr]._pMaxManaBase >> 6) / 10; break; case IPL_FIRERESCLVL: v41 = 30 - plr[myplr]._pLevel; v42 = &item[v8]._iPLFR; *v42 = v41; if ( v41 < 0 ) *v42 = 0; break; case IPL_AC_CURSE: v12 = &item[v8]._iAC; LABEL_62: *v12 -= v10; break; default: break; } v43 = v8; if ( item[v43]._iVAdd1 || item[v43]._iVMult1 ) { item[v43]._iVAdd2 = PLVal(v10, param1, param2, minval, maxval); item[v43]._iVMult2 = multval; } else { item[v43]._iVAdd1 = PLVal(v10, param1, param2, minval, maxval); item[v43]._iVMult1 = multval; } } //----- (004215EF) -------------------------------------------------------- void __fastcall GetItemPower(int i, int minlvl, int maxlvl, int flgs, int onlygood) { //int v6; // ecx int pre; // esi //int v9; // ecx unsigned char goe; // bl int v11; // edx int v14; // ecx int l[256]; // [esp+4h] [ebp-494h] char istr[128]; // [esp+404h] [ebp-94h] int post; // [esp+488h] [ebp-10h] int sufidx; // [esp+48Ch] [ebp-Ch] int preidx; // [esp+490h] [ebp-8h] pre = random(23, 4); post = random(23, 3); if ( pre && !post ) { if ( random(23, 2) ) post = 1; else pre = 0; } preidx = -1; sufidx = -1; goe = 0; if ( !onlygood ) { if ( random(0, 3) ) onlygood = 1; } if ( !pre ) { v11 = 0; if ( PL_Prefix[0].PLPower != -1 ) { v14 = 0; do { if ( flgs & PL_Prefix[v14].PLIType ) { if ( PL_Prefix[v14].PLMinLvl >= minlvl && PL_Prefix[v14].PLMinLvl <= maxlvl && (!onlygood || PL_Prefix[v14].PLOk) && (flgs != 256 || PL_Prefix[v14].PLPower != 15) ) { l[v11++] = v14; if ( PL_Prefix[v14].PLDouble ) l[v11++] = v14; } } v14++; } while ( PL_Prefix[v14].PLPower != -1 ); if ( v11 ) { preidx = l[random(23, v11)]; sprintf(istr, "%s %s", PL_Prefix[preidx].PLName, item[i]._iIName); strcpy(item[i]._iIName, istr); item[i]._iMagical = 1; SaveItemPower( i, PL_Prefix[preidx].PLPower, PL_Prefix[preidx].PLParam1, PL_Prefix[preidx].PLParam2, PL_Prefix[preidx].PLMinVal, PL_Prefix[preidx].PLMaxVal, PL_Prefix[preidx].PLMultVal); goe = PL_Prefix[preidx].PLGOE; item[i]._iPrePower = PL_Prefix[preidx].PLPower; } } } if ( post ) { v11 = 0; if ( PL_Suffix[0].PLPower != -1 ) { v14 = 0; do { if ( flgs & PL_Suffix[v14].PLIType ) { if ( PL_Suffix[v14].PLMinLvl >= minlvl && PL_Suffix[v14].PLMinLvl <= maxlvl && (goe | PL_Suffix[v14].PLGOE) != 0x11 && (!onlygood || PL_Suffix[v14].PLOk) ) l[v11++] = v14; } v14++; } while ( PL_Suffix[v14].PLPower != -1 ); if ( v11 ) { sufidx = l[random(23, v11)]; sprintf(istr, "%s of %s", item[i]._iIName, PL_Suffix[sufidx].PLName); strcpy(item[i]._iIName, istr); item[i]._iMagical = 1; SaveItemPower( i, PL_Suffix[sufidx].PLPower, PL_Suffix[sufidx].PLParam1, PL_Suffix[sufidx].PLParam2, PL_Suffix[sufidx].PLMinVal, PL_Suffix[sufidx].PLMaxVal, PL_Suffix[sufidx].PLMultVal); item[i]._iSufPower = PL_Suffix[sufidx].PLPower; } } } if ( !control_WriteStringToBuffer(item[i]._iIName) ) { strcpy(item[i]._iIName, AllItemsList[item[i].IDidx].iSName); if ( preidx != -1 ) { sprintf(istr, "%s %s", PL_Prefix[preidx].PLName, item[i]._iIName); strcpy(item[i]._iIName, istr); } if ( sufidx != -1 ) { sprintf(istr, "%s of %s", item[i]._iIName, PL_Suffix[sufidx].PLName); strcpy(item[i]._iIName, istr); } } if ( preidx != -1 || sufidx != -1 ) CalcItemValue(i); } // 4215EF: using guessed type int var_494[256]; //----- (0042191C) -------------------------------------------------------- void __fastcall GetItemBonus(int i, int idata, int minlvl, int maxlvl, int onlygood) { if ( item[i]._iClass != ICLASS_GOLD ) { if ( minlvl > 25 ) minlvl = 25; switch ( item[i]._itype ) { case ITYPE_SWORD: case ITYPE_AXE: case ITYPE_MACE: GetItemPower(i, minlvl, maxlvl, 0x1000, onlygood); break; case ITYPE_BOW: GetItemPower(i, minlvl, maxlvl, 0x10, onlygood); break; case ITYPE_SHIELD: GetItemPower(i, minlvl, maxlvl, 0x10000, onlygood); break; case ITYPE_LARMOR: case ITYPE_HELM: case ITYPE_MARMOR: case ITYPE_HARMOR: GetItemPower(i, minlvl, maxlvl, 0x100000, onlygood); break; case ITYPE_STAFF: GetStaffSpell(i, maxlvl, onlygood); break; case ITYPE_RING: case ITYPE_AMULET: GetItemPower(i, minlvl, maxlvl, 1, onlygood); break; default: return; } } } //----- (004219C1) -------------------------------------------------------- void __fastcall SetupItem(int i) { int it; // eax int il; // eax it = ItemCAnimTbl[item[i]._iCurs]; item[i]._iAnimWidth = 96; item[i]._iAnimWidth2 = 16; il = ItemAnimLs[it]; item[i]._iAnimData = Item2Frm[it]; item[i]._iAnimLen = il; item[i]._iIdentified = 0; item[i]._iPostDraw = 0; if ( !plr[myplr].pLvlLoad ) { item[i]._iSelFlag = 0; il = 1; item[i]._iAnimFlag = 1; } else { item[i]._iAnimFlag = 0; item[i]._iSelFlag = 1; } item[i]._iAnimFrame = il; } //----- (00421A4B) -------------------------------------------------------- int __fastcall RndItem(int m) { int ri; // esi int i; // edx int ril[512]; // [esp+4h] [ebp-800h] if ( monster[m].MData->mTreasure & 0x8000 ) return -1 - (monster[m].MData->mTreasure & 0xFFF); if ( monster[m].MData->mTreasure & 0x4000 ) return 0; if ( random(24, 100) > 40 ) return 0; if ( random(24, 100) > 25 ) return 1; ri = 0; i = 0; if ( AllItemsList[0].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd == 2 && monster[m].mLevel >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; if ( AllItemsList[i].iRnd && monster[m].mLevel >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; if ( AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1 ) --ri; if ( AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1 ) --ri; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(24, ri)] + 1; } // 679660: using guessed type char gbMaxPlayers; // 421A4B: using guessed type int var_800[512]; //----- (00421B32) -------------------------------------------------------- int __fastcall RndUItem(int m) { int ri; // edx int i; // ebp bool okflag; // edi int ril[512]; // [esp+0h] [ebp-800h] if ( m != -1 ) { if ( monster[m].MData->mTreasure < 0 && gbMaxPlayers == 1 ) return -1 - (monster[m].MData->mTreasure & 0xFFF); } ri = 0; i = 0; if ( AllItemsList[0].iLoc != -1 ) { do { okflag = 1; if ( !AllItemsList[i].iRnd ) okflag = 0; if ( m == -1 ) { if ( 2 * currlevel - AllItemsList[i].iMinMLvl < 0 ) okflag = 0; } else { if ( monster[m].mLevel - AllItemsList[i].iMinMLvl < 0 ) okflag = 0; } if ( !AllItemsList[i].itype ) okflag = 0; if ( AllItemsList[i].itype == ITYPE_GOLD ) okflag = 0; if ( AllItemsList[i].itype == ITYPE_0E ) okflag = 0; if ( AllItemsList[i].iMiscId == IMISC_BOOK ) okflag = 1; if ( AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1 ) okflag = 0; if ( AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1 ) okflag = 0; if ( okflag ) ril[ri++] = i; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(25, ri)]; } // 679660: using guessed type char gbMaxPlayers; // 421B32: using guessed type int var_800[512]; //----- (00421C2A) -------------------------------------------------------- int __cdecl RndAllItems() { int ri; // esi int i; // edi int ril[512]; // [esp+0h] [ebp-800h] if ( random(26, 100) > 25 ) return 0; ri = 0; i = 0; if ( AllItemsList[0].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd && 2 * currlevel >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; if ( AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1 ) --ri; if ( AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1 ) --ri; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(26, ri)]; } // 679660: using guessed type char gbMaxPlayers; // 421C2A: using guessed type int var_800[512]; //----- (00421CB7) -------------------------------------------------------- int __fastcall RndTypeItems(int itype, int imid) { int i; // edi bool okflag; // esi int ril[512]; // [esp+4h] [ebp-80Ch] int ri; // [esp+80Ch] [ebp-4h] ri = 0; i = 0; if ( AllItemsList[0].iLoc != -1 ) { do { okflag = 1; if ( !AllItemsList[i].iRnd ) okflag = 0; if ( 2 * currlevel < AllItemsList[i].iMinMLvl ) okflag = 0; if ( AllItemsList[i].itype != itype ) okflag = 0; if ( imid != -1 && AllItemsList[i].iMiscId != imid ) okflag = 0; if ( okflag ) ril[ri++] = i; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(27, ri)]; } // 421CB7: using guessed type int var_80C[512]; //----- (00421D41) -------------------------------------------------------- int __fastcall CheckUnique(int i, int lvl, int uper, bool recreate) { int numu; // ebx int j; // esi int idata; // eax char uok[128]; // [esp+8h] [ebp-84h] if ( random(28, 100) > uper ) return -1; numu = 0; memset(uok, 0, 0x80u); if ( UniqueItemList[0].UIItemId == -1 ) return -1; j = 0; do { if ( UniqueItemList[j].UIItemId == AllItemsList[item[i].IDidx].iItemId && lvl >= UniqueItemList[j].UIMinLvl && (recreate || !UniqueItemFlag[j] || gbMaxPlayers != 1) ) { uok[j] = 1; ++numu; } j++; } while ( UniqueItemList[j].UIItemId != -1 ); if ( !numu ) return -1; random(29, 10); idata = 0; if ( numu > 0 ) { while ( 1 ) { if ( uok[idata] ) --numu; if ( numu <= 0 ) break; if ( ++idata == 128 ) idata = 0; } } return idata; } // 679660: using guessed type char gbMaxPlayers; // 421D41: using guessed type char var_84[128]; //----- (00421E11) -------------------------------------------------------- void __fastcall GetUniqueItem(int i, int uid) { UniqueItemFlag[uid] = 1; SaveItemPower(i, UniqueItemList[uid].UIPower1, UniqueItemList[uid].UIParam1, UniqueItemList[uid].UIParam2, 0, 0, 1); if ( UniqueItemList[uid].UINumPL > 1 ) SaveItemPower(i, UniqueItemList[uid].UIPower2, UniqueItemList[uid].UIParam3, UniqueItemList[uid].UIParam4, 0, 0, 1); if ( UniqueItemList[uid].UINumPL > 2 ) SaveItemPower(i, UniqueItemList[uid].UIPower3, UniqueItemList[uid].UIParam5, UniqueItemList[uid].UIParam6, 0, 0, 1); if ( UniqueItemList[uid].UINumPL > 3 ) SaveItemPower(i, UniqueItemList[uid].UIPower4, UniqueItemList[uid].UIParam7, UniqueItemList[uid].UIParam8, 0, 0, 1); if ( UniqueItemList[uid].UINumPL > 4 ) SaveItemPower(i, UniqueItemList[uid].UIPower5, UniqueItemList[uid].UIParam9, UniqueItemList[uid].UIParam10, 0, 0, 1); if ( UniqueItemList[uid].UINumPL > 5 ) SaveItemPower(i, UniqueItemList[uid].UIPower6, UniqueItemList[uid].UIParam11, UniqueItemList[uid].UIParam12, 0, 0, 1); strcpy(item[i]._iIName, UniqueItemList[uid].UIName); item[i]._iIvalue = UniqueItemList[uid].UIValue; if ( item[i]._iMiscId == IMISC_UNIQUE ) item[i]._iSeed = uid; item[i]._iCreateInfo |= 0x0200; item[i]._iUid = uid; item[i]._iMagical = 2; } //----- (00421F5C) -------------------------------------------------------- void __fastcall SpawnUnique(int uid, int x, int y) { int ii; // esi int itype; // edx if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itype = 0; itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; if ( AllItemsList[0].iItemId != UniqueItemList[uid].UIItemId ) { while ( AllItemsList[itype].iItemId != UniqueItemList[uid].UIItemId ) { itype++; } } GetItemAttrs(ii, itype, currlevel); GetUniqueItem(ii, uid); SetupItem(ii); ++numitems; } } // 421F5C: could not find valid save-restore pair for esi //----- (00421FE6) -------------------------------------------------------- void __fastcall ItemRndDur(int ii) { if ( item[ii]._iDurability && item[ii]._iDurability != 255 ) item[ii]._iDurability = random(0, item[ii]._iMaxDur >> 1) + (item[ii]._iMaxDur >> 2) + 1; } //----- (00422024) -------------------------------------------------------- void __fastcall SetupAllItems(int ii, int idx, int iseed, int lvl, int uper, int onlygood, int recreate, int pregen) { int iblvl; // edi int uid; // eax item[ii]._iSeed = iseed; SetRndSeed(iseed); GetItemAttrs(ii, idx, lvl >> 1); item[ii]._iCreateInfo = lvl; if ( pregen ) item[ii]._iCreateInfo = lvl | 0x8000; if ( onlygood ) item[ii]._iCreateInfo |= 0x40; if ( uper == 15 ) item[ii]._iCreateInfo |= 0x80; else if ( uper == 1 ) item[ii]._iCreateInfo |= 0x0100; if ( item[ii]._iMiscId == IMISC_UNIQUE ) { if ( item[ii]._iLoc != ILOC_UNEQUIPABLE ) GetUniqueItem(ii, iseed); } else { iblvl = -1; if ( random(32, 100) > 10 && random(33, 100) > lvl || (iblvl = lvl, lvl == -1) ) { if ( item[ii]._iMiscId != IMISC_STAFF || (iblvl = lvl, lvl == -1) ) { if ( item[ii]._iMiscId != IMISC_RING || (iblvl = lvl, lvl == -1) ) { if ( item[ii]._iMiscId == IMISC_AMULET ) iblvl = lvl; } } } if ( onlygood ) iblvl = lvl; if ( uper == 15 ) iblvl = lvl + 4; if ( iblvl != -1 ) { uid = CheckUnique(ii, iblvl, uper, recreate); if ( uid == -1 ) { GetItemBonus(ii, idx, iblvl >> 1, iblvl, onlygood); } else { GetUniqueItem(ii, uid); item[ii]._iCreateInfo |= 0x0200; } } if ( item[ii]._iMagical != 2 ) ItemRndDur(ii); } SetupItem(ii); } //----- (0042217A) -------------------------------------------------------- void __fastcall SpawnItem(int m, int x, int y, unsigned char sendmsg) { int ii; // edi int onlygood; // [esp+Ch] [ebp-Ch] int idx; // [esp+14h] [ebp-4h] if ( !monster[m]._uniqtype && (monster[m].MData->mTreasure >= 0 || gbMaxPlayers == 1) ) { if ( quests[1]._qactive == 2 && quests[1]._qvar1 == 5 ) { idx = 18; // Brain quests[1]._qvar1 = 6; goto LABEL_13; } idx = RndItem(m); if ( !idx ) return; if ( idx > 0 ) { onlygood = 0; idx--; goto LABEL_13; } LABEL_10: SpawnUnique(-1 - idx, x, y); return; } idx = RndUItem(m); if ( idx < 0 ) goto LABEL_10; onlygood = 1; LABEL_13: if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; if ( !monster[m]._uniqtype ) SetupAllItems(ii, idx, GetRndSeed(), monster[m].MData->mLevel, 1, onlygood, 0, 0); else SetupAllItems(ii, idx, GetRndSeed(), monster[m].MData->mLevel, 15, onlygood, 0, 0); ++numitems; if ( sendmsg ) NetSendCmdDItem(0, ii); } } // 679660: using guessed type char gbMaxPlayers; //----- (00422290) -------------------------------------------------------- void __fastcall CreateItem(int uid, int x, int y) { int ii; // esi int idx; // edx if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); idx = 0; itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; if ( AllItemsList[0].iItemId != UniqueItemList[uid].UIItemId ) { while ( AllItemsList[idx].iItemId != UniqueItemList[uid].UIItemId ) { idx++; } } GetItemAttrs(ii, idx, currlevel); GetUniqueItem(ii, uid); SetupItem(ii); ++numitems; item[ii]._iMagical = 2; } } // 422290: could not find valid save-restore pair for esi //----- (0042232B) -------------------------------------------------------- void __fastcall CreateRndItem(int x, int y, unsigned char onlygood, unsigned char sendmsg, int delta) { int idx; // edi int ii; // esi if ( onlygood ) idx = RndUItem(-1); else idx = RndAllItems(); if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, 0, delta); if ( sendmsg ) NetSendCmdDItem(0, ii); if ( delta ) DeltaAddItem(ii); ++numitems; } } //----- (004223D0) -------------------------------------------------------- void __fastcall SetupAllUseful(int ii, int iseed, int lvl) { int idx; // esi item[ii]._iSeed = iseed; SetRndSeed(iseed); idx = 25 - (random(34, 2) != 0); if ( lvl > 1 ) { if ( !random(34, 3) ) idx = 27; // unique? } GetItemAttrs(ii, idx, lvl); item[ii]._iCreateInfo = lvl + 0x180; SetupItem(ii); } //----- (0042243D) -------------------------------------------------------- void __fastcall CreateRndUseful(int pnum, int x, int y, unsigned char sendmsg) { int ii; // esi if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; SetupAllUseful(ii, GetRndSeed(), currlevel); if ( sendmsg ) NetSendCmdDItem(0, ii); ++numitems; } } //----- (004224A6) -------------------------------------------------------- void __fastcall CreateTypeItem(int x, int y, unsigned char onlygood, int itype, int imisc, int sendmsg, int delta) { int idx; // edi int ii; // esi if ( itype == ITYPE_GOLD ) idx = 0; else idx = RndTypeItems(itype, imisc); if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, 0, delta); if ( sendmsg ) NetSendCmdDItem(0, ii); if ( delta ) DeltaAddItem(ii); ++numitems; } } //----- (0042254A) -------------------------------------------------------- void __fastcall RecreateItem(int ii, int idx, unsigned short ic, int iseed, int ivalue) { int uper; // esi int onlygood; // edx int recreate; // ebx int pregen; // edi if ( idx ) { if ( ic ) { if ( ic & 0x7C00 ) { RecreateTownItem(ii, idx, ic, iseed, ivalue); } else if ( (ic & 0x0180) == 0x0180 ) { SetupAllUseful(ii, iseed, ic & 0x3F); } else { uper = 0; onlygood = 0; recreate = 0; pregen = 0; if ( ic & 0x0100 ) uper = 1; if ( ic & 0x80 ) uper = 15; if ( ic & 0x40 ) onlygood = 1; if ( ic & 0x0200 ) recreate = 1; if ( ic & 0x8000 ) pregen = 1; SetupAllItems(ii, idx, iseed, ic & 0x3F, uper, onlygood, recreate, pregen); } } else { SetPlrHandItem(&item[ii], idx); SetPlrHandSeed(&item[ii], iseed); } } else { SetPlrHandItem(&item[ii], IDI_GOLD); item[ii]._iSeed = iseed; item[ii]._iCreateInfo = ic; item[ii]._ivalue = ivalue; if ( ivalue < 2500 ) { if ( ivalue > 1000 ) item[ii]._iCurs = 5; else item[ii]._iCurs = 4; } else { item[ii]._iCurs = 6; } } } //----- (0042265C) -------------------------------------------------------- void __fastcall RecreateEar(int ii, unsigned short ic, int iseed, unsigned char Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff) { SetPlrHandItem(&item[ii], IDI_EAR); tempstr[0] = (ic >> 8) & 0x7F; tempstr[1] = ic & 0x7F; tempstr[2] = (iseed >> 24) & 0x7F; tempstr[3] = (iseed >> 16) & 0x7F; tempstr[4] = (iseed >> 8) & 0x7F; tempstr[5] = iseed & 0x7F; tempstr[6] = Id & 0x7F; tempstr[7] = dur & 0x7F; tempstr[8] = mdur & 0x7F; tempstr[9] = ch & 0x7F; tempstr[10] = mch & 0x7F; tempstr[11] = (ivalue >> 8) & 0x7F; tempstr[12] = (ibuff >> 24) & 0x7F; tempstr[13] = (ibuff >> 16) & 0x7F; tempstr[14] = (ibuff >> 8) & 0x7F; tempstr[15] = ibuff & 0x7F; tempstr[16] = '\0'; sprintf(item[ii]._iName, "Ear of %s", tempstr); item[ii]._iCurs = ((ivalue >> 6) & 3) + 19; item[ii]._iCreateInfo = ic; item[ii]._ivalue = ivalue & 0x3F; item[ii]._iSeed = iseed; } //----- (00422795) -------------------------------------------------------- void __fastcall SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag) { int i; // ebx BOOL failed; // eax int j; // esi int v12; // ebx int v13; // esi int tries; // [esp+10h] [ebp-4h] if ( randarea ) { tries = 0; while ( 1 ) { LABEL_3: if ( ++tries > 1000 && randarea > 1 ) --randarea; x = random(0, 112); y = random(0, 112); i = 0; failed = 0; if ( randarea <= 0 ) break; while ( !failed ) { for(j = 0; j < randarea; j++) { if ( failed ) break; failed = ItemSpaceOk(i + x, j + y) == 0; } if ( ++i >= randarea ) { if ( failed ) goto LABEL_3; goto LABEL_13; } } } } LABEL_13: if ( numitems < 127 ) { v12 = itemavail[0]; v13 = itemavail[0]; item[v13]._ix = x; itemactive[numitems] = v12; item[v13]._iy = y; itemavail[0] = itemavail[-numitems + 126]; /* double check */ dItem[x][y] = v12 + 1; GetItemAttrs(v12, itemid, currlevel); SetupItem(v12); item[v13]._iPostDraw = 1; if ( selflag ) { item[v13]._iAnimFlag = 0; item[v13]._iSelFlag = selflag; item[v13]._iAnimFrame = item[v13]._iAnimLen; } ++numitems; } } //----- (004228B1) -------------------------------------------------------- void __cdecl SpawnRock() { BOOL v0; // edx int v1; // eax int v2; // ecx BOOL v3; // ebx int v4; // ebx int v5; // ecx int v6; // esi int *v7; // edx int v8; // eax int v9; // edi int v10; // ST04_4 //int v11; // [esp+8h] [ebp-4h] v0 = 0; v1 = 0; if ( nobjects > 0 ) { v2 = 0; //v11; /* chceck */ while ( !v0 ) { v2 = objectactive[v1]; v3 = object[objectactive[v1++]]._otype == OBJ_STAND; v0 = v3; if ( v1 >= nobjects ) { if ( !v3 ) return; break; } } v4 = itemavail[0]; v5 = v2; v6 = itemavail[0]; v7 = &itemavail[-numitems + 126]; itemactive[numitems] = itemavail[0]; v8 = object[v5]._ox; item[v6]._ix = v8; v9 = object[v5]._oy; itemavail[0] = *v7; dItem[v8][v9] = v4 + 1; v10 = currlevel; item[v6]._iy = v9; GetItemAttrs(v4, IDI_ROCK, v10); SetupItem(v4); ++numitems; item[v6]._iSelFlag = 2; item[v6]._iPostDraw = 1; item[v6]._iAnimFrame = 11; } } //----- (00422989) -------------------------------------------------------- void __fastcall RespawnItem(int i, bool FlipFlag) { int it; // ecx int il; // eax item[i]._iAnimWidth = 96; item[i]._iAnimWidth2 = 16; it = ItemCAnimTbl[item[i]._iCurs]; il = ItemAnimLs[it]; item[i]._iAnimLen = il; item[i]._iAnimData = Item2Frm[it]; item[i]._iPostDraw = 0; item[i]._iRequest = 0; if ( FlipFlag ) { item[i]._iSelFlag = 0; il = 1; item[i]._iAnimFlag = 1; } else { item[i]._iAnimFlag = 0; item[i]._iSelFlag = 1; } item[i]._iAnimFrame = il; if ( item[i]._iCurs == 76 ) // Magic Rock { item[i]._iSelFlag = 1; PlaySfxLoc(ItemDropSnds[it], item[i]._ix, item[i]._iy); } if ( item[i]._iCurs == 126 ) // Tavern Sign item[i]._iSelFlag = 1; if ( item[i]._iCurs == 140 ) // Anvil of Fury item[i]._iSelFlag = 1; } //----- (00422A50) -------------------------------------------------------- void __fastcall DeleteItem(int ii, int i) { int v2; // eax bool v3; // zf bool v4; // sf v2 = numitems - 1; v3 = numitems == 1; v4 = numitems - 1 < 0; itemavail[-numitems + 127] = ii; numitems = v2; if ( !v4 && !v3 && i != v2 ) itemactive[i] = itemactive[v2]; } //----- (00422A84) -------------------------------------------------------- void __cdecl ItemDoppel() { int idoppelx; // esi ItemStruct *i; // edx if ( gbMaxPlayers != 1 ) { for(idoppelx = 16; idoppelx < 96; idoppelx++) { if ( dItem[idoppelx][idoppely] ) { i = &item[dItem[idoppelx][idoppely]-1]; if ( i->_ix != idoppelx || i->_iy != idoppely ) dItem[idoppelx][idoppely] = 0; } } if ( idoppely++ == 95 ) idoppely = 16; } } // 492EAC: using guessed type int idoppely; // 679660: using guessed type char gbMaxPlayers; //----- (00422ADE) -------------------------------------------------------- void __cdecl ProcessItems() { int i; // edi int ii; // esi for ( i = 0; i < numitems; i++ ) { ii = itemactive[i]; if ( item[ii]._iAnimFlag ) { item[ii]._iAnimFrame++; if ( item[ii]._iCurs == 76 ) // Magic Rock { if ( item[ii]._iSelFlag == 1 && item[ii]._iAnimFrame == 11 ) item[ii]._iAnimFrame = 1; if ( item[ii]._iSelFlag == 2 && item[ii]._iAnimFrame == 21 ) item[ii]._iAnimFrame = 11; } else { if ( item[ii]._iAnimFrame == item[ii]._iAnimLen >> 1 ) PlaySfxLoc(ItemDropSnds[ItemCAnimTbl[item[ii]._iCurs]], item[ii]._ix, item[ii]._iy); if ( item[ii]._iAnimFrame >= item[ii]._iAnimLen ) { item[ii]._iAnimFlag = 0; item[ii]._iAnimFrame = item[ii]._iAnimLen; item[ii]._iSelFlag = 1; } } } } ItemDoppel(); } //----- (00422BB2) -------------------------------------------------------- void __cdecl FreeItemGFX() { int i; // esi void *v1; // ecx for(i = 0; i < 35; i++) { v1 = (void *)Item2Frm[i]; Item2Frm[i] = 0; mem_free_dbg(v1); } } //----- (00422BCF) -------------------------------------------------------- void __fastcall GetItemFrm(int i) { item[i]._iAnimData = Item2Frm[ItemCAnimTbl[item[i]._iCurs]]; } //----- (00422BF0) -------------------------------------------------------- void __fastcall GetItemStr(int i) { int nGold; // esi if ( item[i]._itype == ITYPE_GOLD ) { nGold = item[i]._ivalue; sprintf(infostr, "%i gold %s", nGold, get_pieces_str(nGold)); } else { if ( !item[i]._iIdentified ) strcpy(infostr, item[i]._iName); else strcpy(infostr, item[i]._iIName); if ( item[i]._iMagical == 1 ) infoclr = COL_BLUE; if ( item[i]._iMagical == 2 ) infoclr = COL_GOLD; } } // 4B883C: using guessed type int infoclr; //----- (00422C63) -------------------------------------------------------- void __fastcall CheckIdentify(int pnum, int cii) { ItemStruct *pi; // esi pi = &plr[pnum].InvBody[cii]; pi->_iIdentified = 1; CalcPlrInv(pnum, 1); if ( pnum == myplr ) SetCursor(CURSOR_HAND); } //----- (00422C9C) -------------------------------------------------------- void __fastcall DoRepair(int pnum, int cii) { PlayerStruct *p; // eax ItemStruct *pi; // esi p = &plr[pnum]; pi = &p->InvBody[cii]; PlaySfxLoc(IS_REPAIR, p->WorldX, p->WorldY); RepairItem(pi, p->_pLevel); CalcPlrInv(pnum, 1); if ( pnum == myplr ) SetCursor(CURSOR_HAND); } //----- (00422CF6) -------------------------------------------------------- void __fastcall RepairItem(ItemStruct *i, int lvl) { int rep; // edi int d; // eax if ( i->_iDurability != i->_iMaxDur ) { if ( i->_iMaxDur > 0 ) { rep = 0; while ( 1 ) { rep += lvl + random(37, lvl); d = i->_iMaxDur / (lvl + 9); if ( d < 1 ) d = 1; if ( i->_iMaxDur == d ) break; i->_iMaxDur -= d; if ( rep + i->_iDurability >= i->_iMaxDur ) { i->_iDurability += rep; if ( i->_iDurability > i->_iMaxDur ) i->_iDurability = i->_iMaxDur; return; } } } i->_itype = -1; } } //----- (00422D6C) -------------------------------------------------------- void __fastcall DoRecharge(int pnum, int cii) { PlayerStruct *p; // eax ItemStruct *pi; // esi p = &plr[pnum]; pi = &p->InvBody[cii]; if ( pi->_itype == ITYPE_STAFF && pi->_iSpell ) { RechargeItem(pi, random(38, p->_pLevel / spelldata[pi->_iSpell].sBookLvl) + 1); CalcPlrInv(pnum, 1); } if ( pnum == myplr ) SetCursor(CURSOR_HAND); } //----- (00422DDD) -------------------------------------------------------- void __fastcall RechargeItem(ItemStruct *i, int r) { if ( i->_iCharges != i->_iMaxCharges ) { while ( 1 ) { if ( i->_iMaxCharges-- == 1 ) break; i->_iCharges += r; if ( i->_iCharges >= i->_iMaxCharges ) { if ( i->_iCharges > i->_iMaxCharges ) i->_iCharges = i->_iMaxCharges; return; } } } } //----- (00422E14) -------------------------------------------------------- void __fastcall PrintItemOil(char IDidx) { switch ( IDidx ) { case IMISC_FULLHEAL: strcpy(tempstr, "fully recover life"); break; case IMISC_HEAL: strcpy(tempstr, "recover partial life"); break; case IMISC_OLDHEAL: strcpy(tempstr, "recover life"); break; case IMISC_DEADHEAL: strcpy(tempstr, "deadly heal"); break; case IMISC_MANA: strcpy(tempstr, "recover mana"); break; case IMISC_FULLMANA: strcpy(tempstr, "fully recover mana"); break; case IMISC_ELIXSTR: strcpy(tempstr, "increase strength"); break; case IMISC_ELIXMAG: strcpy(tempstr, "increase magic"); break; case IMISC_ELIXDEX: strcpy(tempstr, "increase dexterity"); break; case IMISC_ELIXVIT: strcpy(tempstr, "increase vitality"); break; case IMISC_ELIXWEAK: case IMISC_ELIXDIS: strcpy(tempstr, "decrease strength"); break; case IMISC_ELIXCLUM: strcpy(tempstr, "decrease dexterity"); break; case IMISC_ELIXSICK: strcpy(tempstr, "decrease vitality"); break; case IMISC_REJUV: strcpy(tempstr, "recover life and mana"); break; case IMISC_FULLREJUV: strcpy(tempstr, "fully recover life and mana"); break; default: return; } AddPanelString(tempstr, 1); } //----- (00422EF4) -------------------------------------------------------- void __fastcall PrintItemPower(char plidx, ItemStruct *x) { ItemStruct *v2; // esi int *v3; // esi int *v4; // esi int v5; // esi const char *v6; // [esp-4h] [ebp-Ch] const char *v7; // [esp-4h] [ebp-Ch] const char *v8; // [esp-4h] [ebp-Ch] const char *v9; // [esp-4h] [ebp-Ch] v2 = x; switch ( plidx ) { case IPL_TOHIT: case IPL_TOHIT_CURSE: sprintf(tempstr, "chance to hit : %+i%%", x->_iPLToHit); return; case IPL_DAMP: case IPL_DAMP_CURSE: sprintf(tempstr, "%+i%% damage", x->_iPLDam); return; case IPL_TOHIT_DAMP: case IPL_TOHIT_DAMP_CURSE: sprintf(tempstr, "to hit: %+i%%, %+i%% damage", x->_iPLToHit, x->_iPLDam); return; case IPL_ACP: case IPL_ACP_CURSE: sprintf(tempstr, "%+i%% armor", x->_iPLAC); return; case IPL_FIRERES: if ( x->_iPLFR < 75 ) sprintf(tempstr, "Resist Fire : %+i%%", x->_iPLFR); if ( v2->_iPLFR >= 75 ) { v6 = "Resist Fire : 75%% MAX"; goto LABEL_11; } return; case IPL_LIGHTRES: if ( x->_iPLLR < 75 ) sprintf(tempstr, "Resist Lightning : %+i%%", x->_iPLLR); if ( v2->_iPLLR >= 75 ) { v6 = "Resist Lightning : 75%% MAX"; goto LABEL_11; } return; case IPL_MAGICRES: if ( x->_iPLMR < 75 ) sprintf(tempstr, "Resist Magic : %+i%%", x->_iPLMR); if ( v2->_iPLMR >= 75 ) { v6 = "Resist Magic : 75%% MAX"; goto LABEL_11; } return; case IPL_ALLRES: if ( x->_iPLFR < 75 ) sprintf(tempstr, "Resist All : %+i%%", x->_iPLFR); if ( v2->_iPLFR >= 75 ) { v6 = "Resist All : 75%% MAX"; LABEL_11: sprintf(tempstr, v6); } return; case IPL_SPLLVLADD: if ( x->_iSplLvlAdd == 1 ) strcpy(tempstr, "spells are increased 1 level"); if ( v2->_iSplLvlAdd == 2 ) strcpy(tempstr, "spells are increased 2 levels"); if ( v2->_iSplLvlAdd < 1 ) { v7 = "spells are decreased 1 level"; goto LABEL_81; } return; case IPL_CHARGES: v8 = "Extra charges"; goto LABEL_104; case IPL_FIREDAM: sprintf(tempstr, "Fire hit damage: %i-%i", x->_iFMinDam, x->_iFMaxDam); return; case IPL_LIGHTDAM: sprintf(tempstr, "Lightning hit damage: %i-%i", x->_iLMinDam, x->_iLMaxDam); return; case IPL_STR: case IPL_STR_CURSE: sprintf(tempstr, "%+i to strength", x->_iPLStr); return; case IPL_MAG: case IPL_MAG_CURSE: sprintf(tempstr, "%+i to magic", x->_iPLMag); return; case IPL_DEX: case IPL_DEX_CURSE: sprintf(tempstr, "%+i to dexterity", x->_iPLDex); return; case IPL_VIT: case IPL_VIT_CURSE: sprintf(tempstr, "%+i to vitality", x->_iPLVit); return; case IPL_ATTRIBS: case IPL_ATTRIBS_CURSE: sprintf(tempstr, "%+i to all attributes", x->_iPLStr); return; case IPL_GETHIT: case IPL_GETHIT_CURSE: sprintf(tempstr, "%+i damage from enemies", x->_iPLGetHit); return; case IPL_LIFE: case IPL_LIFE_CURSE: sprintf(tempstr, "Hit Points : %+i", x->_iPLHP >> 6); return; case IPL_MANA: case IPL_MANA_CURSE: sprintf(tempstr, "Mana : %+i", x->_iPLMana >> 6); return; case IPL_DUR: v8 = "high durability"; goto LABEL_104; case IPL_DUR_CURSE: v8 = "decreased durability"; goto LABEL_104; case IPL_INDESTRUCTIBLE: v8 = "indestructible"; goto LABEL_104; case IPL_LIGHT: sprintf(tempstr, "+%i%% light radius", 10 * x->_iPLLight); return; case IPL_LIGHT_CURSE: sprintf(tempstr, "-%i%% light radius", -10 * x->_iPLLight); return; case IPL_FIRE_ARROWS: sprintf(tempstr, "fire arrows damage: %i-%i", x->_iFMinDam, x->_iFMaxDam); return; case IPL_LIGHT_ARROWS: sprintf(tempstr, "lightning arrows damage %i-%i", x->_iLMinDam, x->_iLMaxDam); return; case IPL_INVCURS: v8 = " "; goto LABEL_104; case IPL_THORNS: v8 = "attacker takes 1-3 damage"; goto LABEL_104; case IPL_NOMANA: v8 = "user loses all mana"; goto LABEL_104; case IPL_NOHEALPLR: v8 = "you can't heal"; goto LABEL_104; case IPL_ABSHALFTRAP: v8 = "absorbs half of trap damage"; goto LABEL_104; case IPL_KNOCKBACK: v8 = "knocks target back"; goto LABEL_104; case IPL_NOHEALMON: v8 = "hit monster doesn't heal"; goto LABEL_104; case IPL_STEALMANA: v3 = &x->_iFlags; if ( x->_iFlags & 0x2000 ) strcpy(tempstr, "hit steals 3% mana"); if ( !(*((_BYTE *)v3 + 1) & 0x40) ) return; v7 = "hit steals 5% mana"; goto LABEL_81; case IPL_STEALLIFE: v4 = &x->_iFlags; if ( (x->_iFlags & 0x8000) != 0 ) strcpy(tempstr, "hit steals 3% life"); if ( !(*((_BYTE *)v4 + 2) & 1) ) return; v7 = "hit steals 5% life"; goto LABEL_81; case IPL_TARGAC: v8 = "damages target's armor"; goto LABEL_104; case IPL_FASTATTACK: if ( x->_iFlags & 0x20000 ) strcpy(tempstr, "quick attack"); if ( v2->_iFlags & 0x40000 ) strcpy(tempstr, "fast attack"); if ( v2->_iFlags & 0x80000 ) strcpy(tempstr, "faster attack"); if ( !(v2->_iFlags & 0x100000) ) return; v7 = "fastest attack"; goto LABEL_81; case IPL_FASTRECOVER: if ( x->_iFlags & 0x200000 ) strcpy(tempstr, "fast hit recovery"); if ( v2->_iFlags & 0x400000 ) strcpy(tempstr, "faster hit recovery"); if ( (v2->_iFlags & 0x800000) != 0 ) { v7 = "fastest hit recovery"; LABEL_81: strcpy(tempstr, v7); } return; case IPL_FASTBLOCK: v8 = "fast block"; goto LABEL_104; case IPL_DAMMOD: sprintf(tempstr, "adds %i points to damage", x->_iPLDamMod); return; case IPL_RNDARROWVEL: v8 = "fires random speed arrows"; goto LABEL_104; case IPL_SETDAM: v9 = "unusual item damage"; goto LABEL_98; case IPL_SETDUR: v8 = "altered durability"; goto LABEL_104; case IPL_NOMINSTR: v8 = "no strength requirement"; goto LABEL_104; case IPL_SPELL: sprintf(tempstr, "%i %s charges", x->_iMaxCharges, spelldata[x->_iSpell].sNameText); return; case IPL_FASTSWING: v8 = "Faster attack swing"; goto LABEL_104; case IPL_ONEHAND: v8 = "one handed sword"; goto LABEL_104; case IPL_3XDAMVDEM: v8 = "+200% damage vs. demons"; goto LABEL_104; case IPL_ALLRESZERO: v8 = "All Resistance equals 0"; goto LABEL_104; case IPL_DRAINLIFE: v8 = "constantly lose hit points"; goto LABEL_104; case IPL_RNDSTEALLIFE: v8 = "life stealing"; goto LABEL_104; case IPL_INFRAVISION: v8 = "see with infravision"; goto LABEL_104; case IPL_SETAC: case IPL_AC_CURSE: sprintf(tempstr, "armor class: %i", x->_iAC); return; case IPL_ADDACLIFE: v8 = "Armor class added to life"; goto LABEL_104; case IPL_ADDMANAAC: v8 = "10% of mana added to armor"; goto LABEL_104; case IPL_FIRERESCLVL: v5 = x->_iPLFR; if ( v5 > 0 ) { if ( v5 >= 1 ) sprintf(tempstr, "Resist Fire : %+i%%", v5); } else { v9 = " "; LABEL_98: sprintf(tempstr, v9); } break; default: v8 = "Another ability (NW)"; LABEL_104: strcpy(tempstr, v8); break; } } //----- (00423530) -------------------------------------------------------- void __cdecl DrawUBack() { char *v0; // edi signed int v1; // edx signed int v2; // ecx int v3; // edi signed int v4; // ecx _BYTE *v5; // edi signed int v6; // ecx CelDecodeOnly(88, 487, pSTextBoxCels, 1, 271); v0 = &gpBuffer->row[324].pixels[27]; v1 = 148; do { v2 = 132; do { *v0 = 0; v0 += 2; --v2; } while ( v2 ); *v0 = 0; v3 = (int)(v0 - 1032); v4 = 132; do { v5 = (_BYTE *)(v3 + 1); *v5 = 0; v3 = (int)(v5 + 1); --v4; } while ( v4 ); v0 = (char *)(v3 - 1032); --v1; } while ( v1 ); v6 = 132; do { *v0 = 0; v0 += 2; --v6; } while ( v6 ); *v0 = 0; } //----- (0042358C) -------------------------------------------------------- void __fastcall PrintUString(int x, int y, int cjustflag, char *str, int col) { char *v5; // edi int v6; // ebx size_t v7; // eax int v8; // esi int v9; // ecx signed int v10; // eax int v11; // edx int v12; // eax unsigned char v13; // al int v14; // edi int v15; // [esp+Ch] [ebp-4h] int a3; // [esp+18h] [ebp+8h] v5 = str; v6 = screen_y_times_768[SStringY[y] + 204] + x + 96; v7 = strlen(str); v8 = 0; v9 = 0; v15 = v7; if ( cjustflag ) { v10 = 0; if ( v15 <= 0 ) goto LABEL_16; do { v11 = (unsigned char)str[v9++]; v10 += fontkern[fontframe[fontidx[v11]]] + 1; } while ( v9 < v15 ); if ( v10 < 257 ) LABEL_16: v8 = (257 - v10) >> 1; v6 += v8; } v12 = 0; a3 = 0; if ( v15 > 0 ) { while ( 1 ) { v13 = fontframe[fontidx[(unsigned char)v5[v12]]]; v14 = v13; v8 += fontkern[v13] + 1; if ( v13 ) { if ( v8 <= 257 ) CPrintString(v6, v13, col); } v6 += fontkern[v14] + 1; v12 = a3++ + 1; if ( a3 >= v15 ) break; v5 = str; } } } //----- (0042365B) -------------------------------------------------------- void __fastcall DrawULine(int y) { char *v1; // esi char *v2; // edi signed int v3; // edx v1 = &gpBuffer->row[25].pixels[26]; v2 = &gpBuffer->row_unused_1[0].pixels[screen_y_times_768[SStringY[y] + 198] + 26]; v3 = 3; do { qmemcpy(v2, v1, 0x10A); /* find real fix */ v1 += 264; v2 += 264; *v2 = *v1; v1 += 504; v2 += 504; --v3; } while ( v3 ); } //----- (004236A6) -------------------------------------------------------- void __cdecl DrawUniqueInfo() { int v0; // esi int v1; // esi int v2; // edi if ( !chrflag && !questlog ) { v0 = curruitem._iUid; DrawUBack(); v1 = v0; PrintUString(0, 2, 1, UniqueItemList[v1].UIName, 3); DrawULine(5); PrintItemPower(UniqueItemList[v1].UIPower1, &curruitem); v2 = 14 - (char)UniqueItemList[v1].UINumPL; PrintUString(0, v2, 1, tempstr, 0); if ( UniqueItemList[v1].UINumPL > 1 ) { PrintItemPower(UniqueItemList[v1].UIPower2, &curruitem); PrintUString(0, v2 + 2, 1, tempstr, 0); } if ( UniqueItemList[v1].UINumPL > 2 ) { PrintItemPower(UniqueItemList[v1].UIPower3, &curruitem); PrintUString(0, v2 + 4, 1, tempstr, 0); } if ( UniqueItemList[v1].UINumPL > 3 ) { PrintItemPower(UniqueItemList[v1].UIPower4, &curruitem); PrintUString(0, v2 + 6, 1, tempstr, 0); } if ( UniqueItemList[v1].UINumPL > 4 ) { PrintItemPower(UniqueItemList[v1].UIPower5, &curruitem); PrintUString(0, v2 + 8, 1, tempstr, 0); } if ( UniqueItemList[v1].UINumPL > 5 ) { PrintItemPower(UniqueItemList[v1].UIPower6, &curruitem); PrintUString(0, v2 + 10, 1, tempstr, 0); } } } // 69BD04: using guessed type int questlog; //----- (004237DC) -------------------------------------------------------- void __fastcall PrintItemMisc(ItemStruct *x) { if ( x->_iMiscId == IMISC_SCROLL ) { strcpy(tempstr, "Right-click to read"); AddPanelString(tempstr, 1); } if ( x->_iMiscId == IMISC_SCROLLT ) { strcpy(tempstr, "Right-click to read, then"); AddPanelString(tempstr, 1); strcpy(tempstr, "left-click to target"); AddPanelString(tempstr, 1); } if ( x->_iMiscId >= IMISC_USEFIRST && x->_iMiscId <= IMISC_USELAST ) { PrintItemOil(x->_iMiscId); strcpy(tempstr, "Right click to use"); AddPanelString(tempstr, 1); } if ( x->_iMiscId == IMISC_BOOK ) { strcpy(tempstr, "Right click to read"); AddPanelString(tempstr, 1); } if ( x->_iMiscId == IMISC_MAPOFDOOM ) { strcpy(tempstr, "Right click to view"); AddPanelString(tempstr, 1); } if ( x->_iMiscId == IMISC_EAR ) { sprintf(tempstr, "Level : %i", x->_ivalue); AddPanelString(tempstr, 1); } } //----- (004238D4) -------------------------------------------------------- void __fastcall PrintItemDetails(ItemStruct *x) { ItemStruct *v1; // ebp char v2; // cl char v3; // cl char v4; // al unsigned char v5; // al char v6; // al v1 = x; if ( x->_iClass == 1 ) { if ( x->_iMaxDur == 255 ) sprintf(tempstr, "damage: %i-%i Indestructible", x->_iMinDam, x->_iMaxDam); else sprintf(tempstr, "damage: %i-%i Dur: %i/%i", x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur); AddPanelString(tempstr, 1); } if ( v1->_iClass == 2 ) { if ( v1->_iMaxDur == 255 ) sprintf(tempstr, "armor: %i Indestructible", v1->_iAC); else sprintf(tempstr, "armor: %i Dur: %i/%i", v1->_iAC, v1->_iDurability, v1->_iMaxDur); AddPanelString(tempstr, 1); } if ( v1->_iMiscId == IMISC_STAFF && v1->_iMaxCharges ) { sprintf(tempstr, "dam: %i-%i Dur: %i/%i", v1->_iMinDam, v1->_iMaxDam, v1->_iDurability, v1->_iMaxDur); sprintf(tempstr, "Charges: %i/%i", v1->_iCharges, v1->_iMaxCharges); AddPanelString(tempstr, 1); } v2 = v1->_iPrePower; if ( v2 != -1 ) { PrintItemPower(v2, v1); AddPanelString(tempstr, 1); } v3 = v1->_iSufPower; if ( v3 != -1 ) { PrintItemPower(v3, v1); AddPanelString(tempstr, 1); } if ( v1->_iMagical == 2 ) { AddPanelString("unique item", 1); uitemflag = 1; qmemcpy(&curruitem, v1, sizeof(curruitem)); } PrintItemMisc(v1); if ( (unsigned char)v1->_iMinMag + v1->_iMinDex + v1->_iMinStr ) { strcpy(tempstr, "Required:"); v4 = v1->_iMinStr; if ( v4 ) sprintf(tempstr, "%s %i Str", tempstr, v4); v5 = v1->_iMinMag; if ( v5 ) sprintf(tempstr, "%s %i Mag", tempstr, v5); v6 = v1->_iMinDex; if ( v6 ) sprintf(tempstr, "%s %i Dex", tempstr, v6); AddPanelString(tempstr, 1); } pinfoflag = 1; } // 4B8824: using guessed type int pinfoflag; //----- (00423AE1) -------------------------------------------------------- void __fastcall PrintItemDur(ItemStruct *x) { ItemStruct *v1; // esi int v2; // eax char v3; // al unsigned char v4; // al char v5; // al v1 = x; if ( x->_iClass == 1 ) { if ( x->_iMaxDur == 255 ) sprintf(tempstr, "damage: %i-%i Indestructible", x->_iMinDam, x->_iMaxDam); else sprintf(tempstr, "damage: %i-%i Dur: %i/%i", x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur); AddPanelString(tempstr, 1); if ( v1->_iMiscId == IMISC_STAFF && v1->_iMaxCharges ) { sprintf(tempstr, "Charges: %i/%i", v1->_iCharges, v1->_iMaxCharges); AddPanelString(tempstr, 1); } if ( v1->_iMagical ) AddPanelString("Not Identified", 1); } if ( v1->_iClass == 2 ) { if ( v1->_iMaxDur == 255 ) sprintf(tempstr, "armor: %i Indestructible", v1->_iAC); else sprintf(tempstr, "armor: %i Dur: %i/%i", v1->_iAC, v1->_iDurability, v1->_iMaxDur); AddPanelString(tempstr, 1); if ( v1->_iMagical ) AddPanelString("Not Identified", 1); if ( v1->_iMiscId == IMISC_STAFF && v1->_iMaxCharges ) { sprintf(tempstr, "Charges: %i/%i", v1->_iCharges, v1->_iMaxCharges); AddPanelString(tempstr, 1); } } v2 = v1->_itype; if ( v2 == ITYPE_RING || v2 == ITYPE_AMULET ) AddPanelString("Not Identified", 1); PrintItemMisc(v1); if ( (unsigned char)v1->_iMinMag + v1->_iMinDex + v1->_iMinStr ) { strcpy(tempstr, "Required:"); v3 = v1->_iMinStr; if ( v3 ) sprintf(tempstr, "%s %i Str", tempstr, v3); v4 = v1->_iMinMag; if ( v4 ) sprintf(tempstr, "%s %i Mag", tempstr, v4); v5 = v1->_iMinDex; if ( v5 ) sprintf(tempstr, "%s %i Dex", tempstr, v5); AddPanelString(tempstr, 1); } pinfoflag = 1; } // 4B8824: using guessed type int pinfoflag; //----- (00423CE0) -------------------------------------------------------- void __fastcall UseItem(int p, int Mid, int spl) { int v3; // esi int v4; // edx int v5; // edx int v6; // edx int v7; // edx int v8; // edx int v9; // esi int v10; // esi int v11; // edi unsigned int v12; // edi char v13; // al int v14; // edi int v15; // ecx int *v16; // eax int *v17; // eax int v18; // esi int v19; // esi int v20; // edx int v21; // edx int v22; // edx int v23; // edx int v24; // edx int v25; // edi char *v26; // eax int v27; // edx int *v28; // ecx int v29; // eax int *v30; // ecx int v31; // edi int v32; // edi int v33; // eax int v34; // ecx int v35; // eax bool v36; // zf int v37; // ecx int v38; // eax int v39; // edx int v40; // eax int v41; // edx int v42; // esi int v43; // edi unsigned int v44; // edi char v45; // al int v46; // edi int v47; // ecx int *v48; // eax int v49; // ecx int *v50; // eax int v51; // edi int v52; // edx unsigned int v53; // edi char v54; // al int v55; // edi int v56; // ecx int *v57; // eax int *v58; // eax int v59; // esi int v60; // edx int v61; // esi int v62; // edi unsigned int v63; // edi char v64; // al int v65; // edi int v66; // ecx int *v67; // eax int *v68; // eax int v69; // esi int v70; // edx int pa; // [esp+Ch] [ebp-4h] v3 = p; pa = p; if ( Mid > 28 ) { v70 = Mid - 42; if ( !v70 ) { doom_init(); return; } if ( v70 != 2 ) return; ModifyPlrStr(p, 3); ModifyPlrMag(v3, 3); ModifyPlrDex(v3, 3); v60 = 3; LABEL_82: ModifyPlrVit(v3, v60); return; } if ( Mid == 28 ) goto LABEL_71; if ( Mid <= 12 ) { if ( Mid == 12 ) { ModifyPlrDex(p, 1); return; } v4 = Mid - 2; if ( !v4 ) { v19 = p; plr[v19]._pHitPoints = plr[v19]._pMaxHP; plr[v19]._pHPBase = plr[p]._pMaxHPBase; LABEL_25: drawhpflag = 1; return; } v5 = v4 - 1; if ( v5 ) { v6 = v5 - 3; if ( v6 ) { v7 = v6 - 1; if ( v7 ) { v8 = v7 - 3; if ( v8 ) { if ( v8 == 1 ) ModifyPlrMag(p, 1); } else { ModifyPlrStr(p, 1); } return; } v9 = p; if ( plr[p]._pIFlags & 0x8000000 ) return; plr[v9]._pMana = plr[v9]._pMaxMana; plr[v9]._pManaBase = plr[v9]._pMaxManaBase; LABEL_41: drawmanaflag = 1; return; } v10 = p; _LOBYTE(p) = 40; v11 = plr[v10]._pMaxMana >> 8; v12 = (v11 & 0xFFFFFFFE) + 2 * random(p, v11); v13 = plr[v10]._pClass; v14 = 32 * v12; if ( v13 == 2 ) v14 *= 2; if ( v13 == 1 ) v14 += v14 >> 1; if ( !(plr[v10]._pIFlags & 0x8000000) ) { v15 = plr[v10]._pMaxMana; v16 = &plr[v10]._pMana; *v16 += v14; if ( plr[v10]._pMana > v15 ) *v16 = v15; v17 = &plr[v10]._pManaBase; v18 = plr[v10]._pMaxManaBase; *v17 += v14; if ( *v17 > v18 ) *v17 = v18; goto LABEL_41; } return; } LABEL_71: v61 = p; _LOBYTE(p) = 39; v62 = plr[v61]._pMaxHP >> 8; v63 = (v62 & 0xFFFFFFFE) + 2 * random(p, v62); v64 = plr[v61]._pClass; v65 = 32 * v63; if ( !v64 ) v65 *= 2; if ( v64 == 1 ) v65 += v65 >> 1; v66 = plr[v61]._pMaxHP; v67 = &plr[v61]._pHitPoints; *v67 += v65; if ( plr[v61]._pHitPoints > v66 ) *v67 = v66; v68 = &plr[v61]._pHPBase; v69 = plr[v61]._pMaxHPBase; *v68 += v65; if ( *v68 > v69 ) *v68 = v69; goto LABEL_25; } v20 = Mid - 13; if ( !v20 ) { v60 = 1; goto LABEL_82; } v21 = v20 - 5; if ( v21 ) { v22 = v21 - 1; if ( v22 ) { v23 = v22 - 2; if ( v23 ) { v24 = v23 - 1; if ( v24 ) { if ( v24 != 2 ) return; v25 = p; *(_QWORD *)plr[p]._pMemSpells |= (__int64)1 << ((unsigned char)spl - 1); v26 = &plr[p]._pSplLvl[spl]; if ( *v26 < 15 ) ++*v26; v27 = plr[v25]._pMaxMana; v28 = &plr[v25]._pMana; v29 = spelldata[spl].sManaCost << 6; *v28 += v29; if ( plr[v25]._pMana > v27 ) *v28 = v27; v30 = &plr[v25]._pManaBase; v31 = plr[v25]._pMaxManaBase; *v30 += v29; if ( *v30 > v31 ) *v30 = v31; if ( pa == myplr ) CalcPlrBookVals(pa); goto LABEL_41; } v32 = spl; if ( !spelldata[spl].sTargeted ) { ClrPlrPath(p); v33 = v3; plr[v33].destParam1 = cursmx; v34 = cursmy; plr[v33]._pSpell = spl; plr[v33]._pSplType = 4; plr[v33]._pSplFrom = 3; plr[v33].destAction = 12; plr[v33].destParam2 = v34; return; } } else { v32 = spl; if ( !spelldata[spl].sTargeted ) { ClrPlrPath(p); v37 = cursmx; v38 = v3; v39 = cursmy; v36 = v3 == myplr; plr[v38]._pSpell = spl; plr[v38]._pSplType = 4; plr[v38]._pSplFrom = 3; plr[v38].destAction = 12; plr[v38].destParam1 = v37; plr[v38].destParam2 = v39; if ( v36 && spl == SPL_NOVA ) NetSendCmdLoc(1u, CMD_NOVA, v37, v39); return; } } v35 = p; v36 = p == myplr; plr[v35]._pTSpell = v32; _LOBYTE(plr[v35]._pTSplType) = 4; if ( v36 ) SetCursor(CURSOR_TELEPORT); return; } v40 = p; plr[v40]._pHitPoints = plr[p]._pMaxHP; plr[v40]._pHPBase = plr[p]._pMaxHPBase; v36 = (plr[p]._pIFlags & 0x8000000) == 0; drawhpflag = 1; if ( v36 ) { v41 = plr[v40]._pMaxMana; drawmanaflag = 1; plr[v40]._pMana = v41; plr[v40]._pManaBase = plr[v40]._pMaxManaBase; } } else { v42 = p; _LOBYTE(p) = 39; v43 = plr[v42]._pMaxHP >> 8; v44 = (v43 & 0xFFFFFFFE) + 2 * random(p, v43); v45 = plr[v42]._pClass; v46 = 32 * v44; if ( !v45 ) v46 *= 2; if ( v45 == 1 ) v46 += v46 >> 1; v47 = plr[v42]._pMaxHP; v48 = &plr[v42]._pHitPoints; *v48 += v46; if ( plr[v42]._pHitPoints > v47 ) *v48 = v47; v49 = plr[v42]._pMaxHPBase; v50 = &plr[v42]._pHPBase; *v50 += v46; if ( plr[v42]._pHPBase > v49 ) *v50 = v49; v51 = plr[v42]._pMaxMana >> 8; v52 = plr[v42]._pMaxMana >> 8; _LOBYTE(v49) = 40; drawhpflag = 1; v53 = (v51 & 0xFFFFFFFE) + 2 * random(v49, v52); v54 = plr[v42]._pClass; v55 = 32 * v53; if ( v54 == 2 ) v55 *= 2; if ( v54 == 1 ) v55 += v55 >> 1; if ( !(plr[v42]._pIFlags & 0x8000000) ) { v56 = plr[v42]._pMaxMana; v57 = &plr[v42]._pMana; *v57 += v55; if ( plr[v42]._pMana > v56 ) *v57 = v56; v58 = &plr[v42]._pManaBase; v59 = plr[v42]._pMaxManaBase; *v58 += v55; if ( *v58 > v59 ) *v58 = v59; drawmanaflag = 1; } } } //----- (004241D7) -------------------------------------------------------- bool __fastcall StoreStatOk(ItemStruct *h) { bool sf; // al sf = 1; if ( plr[myplr]._pStrength < h->_iMinStr || plr[myplr]._pMagic < h->_iMinMag || plr[myplr]._pDexterity < h->_iMinDex ) sf = 0; return sf; } //----- (0042421C) -------------------------------------------------------- bool __fastcall SmithItemOk(int i) { unsigned char v1; // cl bool rv; // eax v1 = AllItemsList[i].itype; rv = 1; if ( !v1 || v1 == ITYPE_GOLD || v1 == ITYPE_0E || v1 == ITYPE_STAFF || v1 == ITYPE_RING || v1 == ITYPE_AMULET ) rv = 0; return rv; } //----- (00424252) -------------------------------------------------------- int __fastcall RndSmithItem(int lvl) { int ri; // edx int i; // edi int ril[512]; // [esp+4h] [ebp-804h] ri = 0; i = 1; if ( AllItemsList[1].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd && SmithItemOk(i) && lvl >= AllItemsList[i].iMinMLvl ) { ril[ri++] = i; if ( AllItemsList[i].iRnd == 2 ) ril[ri++] = i; } ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(50, ri)] + 1; } // 424252: using guessed type int var_804[512]; //----- (004242C1) -------------------------------------------------------- void __fastcall BubbleSwapItem(ItemStruct *a, ItemStruct *b) { ItemStruct h; // [esp+8h] [ebp-170h] qmemcpy(&h, a, sizeof(h)); qmemcpy(a, b, sizeof(ItemStruct)); qmemcpy(b, &h, sizeof(ItemStruct)); } //----- (004242F5) -------------------------------------------------------- void __cdecl SortSmith() { int v0; // esi int *v1; // eax signed int v2; // ecx int *v3; // eax int v4; // ebx int v5; // edi v0 = 0; if ( smithitem[1]._itype != -1 ) { v1 = &smithitem[1]._itype; do { v1 += 92; ++v0; } while ( *v1 != -1 ); } v2 = 0; while ( v0 > 0 && !v2 ) { v2 = 1; if ( v0 > 0 ) { v3 = &smithitem[0].IDidx; v4 = v0; do { v5 = (int)(v3 + 92); if ( *v3 > v3[92] ) { BubbleSwapItem((ItemStruct *)(v3 - 90), (ItemStruct *)(v3 + 2)); v2 = 0; } --v4; v3 = (int *)v5; } while ( v4 ); } --v0; } } //----- (00424351) -------------------------------------------------------- void __fastcall SpawnSmith(int lvl) { int v3; // ebp ItemStruct *v4; // ebx int v9; // [esp+Ch] [ebp-8h] v3 = random(50, 10) + 10; if ( v3 > 0 ) { v4 = smithitem; v9 = v3; while ( 1 ) { do { item[0]._iSeed = GetRndSeed(); SetRndSeed(item[0]._iSeed); GetItemAttrs(0, RndSmithItem(lvl) - 1, lvl); } while ( item[0]._iIvalue > 140000 ); qmemcpy(v4, item, sizeof(ItemStruct)); v4->_iCreateInfo = lvl | 0x400; v4->_iIdentified = 1; v4->_iStatFlag = StoreStatOk(v4); ++v4; if ( !--v9 ) break; } } if ( v3 < 20 ) { do { smithitem[v3]._itype = -1; v3++; } while ( v3 < 20 ); } SortSmith(); } //----- (00424420) -------------------------------------------------------- bool __fastcall PremiumItemOk(int i) { unsigned char v1; // cl bool rv; // eax v1 = AllItemsList[i].itype; rv = 1; if ( !v1 || v1 == ITYPE_GOLD || v1 == ITYPE_0E || v1 == ITYPE_STAFF ) rv = 0; if ( gbMaxPlayers != 1 && ( v1 == ITYPE_RING || v1 == ITYPE_AMULET ) ) { rv = 0; } return rv; } // 679660: using guessed type char gbMaxPlayers; //----- (0042445F) -------------------------------------------------------- int __fastcall RndPremiumItem(int minlvl, int maxlvl) { int ri; // edx int i; // edi int ril[512]; // [esp+8h] [ebp-804h] ri = 0; i = 1; if ( AllItemsList[1].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd ) { if ( PremiumItemOk(i) ) { if ( AllItemsList[i].iMinMLvl >= minlvl && AllItemsList[i].iMinMLvl <= maxlvl ) ril[ri++] = i; } } ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(50, ri)] + 1; } // 42445F: using guessed type int ril[512]; //----- (004244C6) -------------------------------------------------------- void __fastcall SpawnOnePremium(int i, int plvl) { int itype; // esi ItemStruct holditem; // [esp+Ch] [ebp-178h] qmemcpy(&holditem, item, sizeof(ItemStruct)); if ( plvl > 30 ) plvl = 30; if ( plvl < 1 ) plvl = 1; do { item[0]._iSeed = GetRndSeed(); SetRndSeed(item[0]._iSeed); itype = RndPremiumItem(plvl >> 2, plvl) - 1; GetItemAttrs(0, itype, plvl); GetItemBonus(0, itype, plvl >> 1, plvl, 1); } while ( item[0]._iIvalue > 140000 ); qmemcpy(&premiumitem[i], item, sizeof(ItemStruct)); premiumitem[i]._iCreateInfo = plvl | 0x800; premiumitem[i]._iIdentified = 1; premiumitem[i]._iStatFlag = StoreStatOk(&premiumitem[i]); qmemcpy(item, &holditem, sizeof(ItemStruct)); } //----- (004245A0) -------------------------------------------------------- void __fastcall SpawnPremium(int lvl) { int i; // eax if ( numpremium < 6 ) { for(i = 0; i < 6; i++) { if ( premiumitem[i]._itype == -1 ) SpawnOnePremium(i, premiumlevel + premiumlvladd[i]); } numpremium = 6; } for ( i = premiumlevel; premiumlevel < lvl; i = premiumlevel ) { qmemcpy(premiumitem, &premiumitem[2], sizeof(ItemStruct)); qmemcpy(&premiumitem[1], &premiumitem[3], sizeof(ItemStruct)); qmemcpy(&premiumitem[2], &premiumitem[4], sizeof(ItemStruct)); premiumlevel = i + 1; SpawnOnePremium(3, premiumlvladd[3] + i + 1); qmemcpy(&premiumitem[4], &premiumitem[5], sizeof(ItemStruct)); SpawnOnePremium(5, premiumlvladd[5] + premiumlevel); } } // 69FB38: using guessed type int talker; //----- (0042466C) -------------------------------------------------------- bool __fastcall WitchItemOk(int i) { bool rv; // eax unsigned char v3; // dl int v4; // edx int v5; // ecx rv = 0; v3 = AllItemsList[i].itype; if ( !v3 ) rv = 1; if ( v3 == ITYPE_STAFF ) rv = 1; v4 = AllItemsList[i].iMiscId; if ( v4 == IMISC_MANA ) rv = 0; if ( v4 == IMISC_FULLMANA ) rv = 0; if ( v4 == IMISC_FULLHEAL ) rv = 0; if ( v4 == IMISC_HEAL ) rv = 0; v5 = AllItemsList[i].iSpell; if ( v5 == SPL_TOWN ) rv = 0; if ( v5 == SPL_RESURRECT && gbMaxPlayers == 1 ) rv = 0; if ( v5 == SPL_HEALOTHER && gbMaxPlayers == 1 ) rv = 0; return rv; } // 679660: using guessed type char gbMaxPlayers; //----- (004246D2) -------------------------------------------------------- int __fastcall RndWitchItem(int lvl) { int ri; // ebx int i; // edi int ril[512]; // [esp+8h] [ebp-804h] ri = 0; i = 1; if ( AllItemsList[1].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd && WitchItemOk(i) && lvl >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(51, ri)] + 1; } // 4246D2: using guessed type int var_804[512]; //----- (00424735) -------------------------------------------------------- void __cdecl SortWitch() { signed int v0; // esi int *v1; // eax signed int v2; // ecx int *v3; // eax int v4; // ebx int v5; // edi v0 = 3; if ( witchitem[4]._itype != -1 ) { v1 = &witchitem[4]._itype; do { v1 += 92; ++v0; } while ( *v1 != -1 ); } v2 = 0; while ( v0 > 3 && !v2 ) { v2 = 1; if ( v0 > 3 ) { v3 = &witchitem[3].IDidx; v4 = v0 - 3; do { v5 = (int)(v3 + 92); if ( *v3 > v3[92] ) { BubbleSwapItem((ItemStruct *)(v3 - 90), (ItemStruct *)(v3 + 2)); v2 = 0; } --v4; v3 = (int *)v5; } while ( v4 ); } --v0; } } //----- (00424795) -------------------------------------------------------- void __fastcall WitchBookLevel(int ii) { int slvl; // edi if ( witchitem[ii]._iMiscId == IMISC_BOOK ) { witchitem[ii]._iMinMag = spelldata[witchitem[ii]._iSpell].sMinInt; slvl = plr[myplr]._pSplLvl[witchitem[ii]._iSpell]; if ( slvl ) { do { witchitem[ii]._iMinMag += 20 * witchitem[ii]._iMinMag / 100; --slvl; if ( witchitem[ii]._iMinMag > 255 ) { witchitem[ii]._iMinMag = -1; slvl = 0; } } while ( slvl ); } } } //----- (00424815) -------------------------------------------------------- void __fastcall SpawnWitch(int lvl) { int v2; // ebp int itype; // esi int iblvl; // eax signed int ii; // [esp+10h] [ebp-8h] ItemStruct *itm; // [esp+14h] [ebp-4h] GetItemAttrs(0, IDI_MANA, 1); qmemcpy(witchitem, item, sizeof(ItemStruct)); witchitem[0]._iCreateInfo = lvl; witchitem[0]._iStatFlag = 1; GetItemAttrs(0, IDI_FULLMANA, 1); qmemcpy(&witchitem[1], item, sizeof(ItemStruct)); witchitem[1]._iCreateInfo = lvl; witchitem[1]._iStatFlag = 1; GetItemAttrs(0, IDI_PORTAL, 1); qmemcpy(&witchitem[2], item, sizeof(ItemStruct)); witchitem[2]._iCreateInfo = lvl; witchitem[2]._iStatFlag = 1; v2 = random(51, 8) + 10; ii = 3; if ( v2 > 3 ) { itm = &witchitem[3]; while ( 1 ) { item[0]._iSeed = GetRndSeed(); SetRndSeed(item[0]._iSeed); itype = RndWitchItem(lvl) - 1; GetItemAttrs(0, itype, lvl); if ( random(51, 100) > 5 || (iblvl = 2 * lvl, iblvl == -1) ) { if ( item[0]._iMiscId != IMISC_STAFF ) continue; iblvl = 2 * lvl; if ( iblvl == -1 ) continue; } GetItemBonus(0, itype, iblvl >> 1, iblvl, 1); if ( item[0]._iIvalue <= 140000 ) { qmemcpy(itm, item, sizeof(ItemStruct)); itm->_iIdentified = 1; itm->_iCreateInfo = lvl | 0x2000; WitchBookLevel(ii); ++ii; itm->_iStatFlag = StoreStatOk(itm); ++itm; if ( ii >= v2 ) break; } } } if ( v2 < 20 ) { do { witchitem[v2]._itype = -1; v2++; } while ( v2 < 20 ); } SortWitch(); } //----- (004249A4) -------------------------------------------------------- int __fastcall RndBoyItem(int lvl) { int ri; // edx int i; // edi int ril[512]; // [esp+8h] [ebp-800h] ri = 0; i = 1; if ( AllItemsList[1].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd && PremiumItemOk(i) && lvl >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(49, ri)] + 1; } // 4249A4: using guessed type int var_800[512]; //----- (00424A03) -------------------------------------------------------- void __fastcall SpawnBoy(int lvl) { int itype; // esi if ( boylevel < lvl >> 1 || boyitem._itype == -1 ) { do { item[0]._iSeed = GetRndSeed(); SetRndSeed(item[0]._iSeed); itype = RndBoyItem(lvl) - 1; GetItemAttrs(0, itype, lvl); GetItemBonus(0, itype, lvl, 2 * lvl, 1); } while ( item[0]._iIvalue > 90000 ); qmemcpy(&boyitem, item, sizeof(boyitem)); boyitem._iCreateInfo = lvl | 0x10; boyitem._iIdentified = 1; boyitem._iStatFlag = StoreStatOk(&boyitem); boylevel = lvl >> 1; } } // 6A8A3C: using guessed type int boylevel; //----- (00424A9B) -------------------------------------------------------- bool __fastcall HealerItemOk(int i) { int v1; // ecx bool result; // eax int v3; // esi v1 = i; result = 0; if ( AllItemsList[v1].itype ) return 0; v3 = AllItemsList[v1].iMiscId; if ( v3 == IMISC_SCROLL && AllItemsList[v1].iSpell == SPL_HEAL ) result = 1; if ( v3 != IMISC_SCROLLT ) goto LABEL_12; if ( AllItemsList[v1].iSpell == SPL_RESURRECT && gbMaxPlayers != 1 ) result = 0; if ( AllItemsList[v1].iSpell != SPL_HEALOTHER ) { LABEL_12: if ( gbMaxPlayers != 1 ) goto LABEL_21; goto LABEL_13; } if ( gbMaxPlayers != 1 ) { result = 1; goto LABEL_12; } LABEL_13: if ( v3 == IMISC_ELIXSTR ) result = 1; if ( v3 == IMISC_ELIXMAG ) result = 1; if ( v3 == IMISC_ELIXDEX ) result = 1; if ( v3 == IMISC_ELIXVIT ) result = 1; LABEL_21: if ( v3 == IMISC_FULLHEAL ) result = 1; if ( v3 == IMISC_REJUV ) result = 1; if ( v3 == IMISC_FULLREJUV ) result = 1; if ( v3 == IMISC_HEAL ) result = 0; if ( v3 == IMISC_FULLHEAL ) result = 0; if ( v3 == IMISC_MANA ) result = 0; if ( v3 == IMISC_FULLMANA ) return 0; return result; } // 679660: using guessed type char gbMaxPlayers; //----- (00424B49) -------------------------------------------------------- int __fastcall RndHealerItem(int lvl) { int ri; // ebx int i; // edi int ril[512]; // [esp+8h] [ebp-804h] ri = 0; i = 1; if ( AllItemsList[1].iLoc != -1 ) { do { if ( AllItemsList[i].iRnd && HealerItemOk(i) && lvl >= AllItemsList[i].iMinMLvl ) ril[ri++] = i; ++i; } while ( AllItemsList[i].iLoc != -1 ); } return ril[random(50, ri)] + 1; } // 424B49: using guessed type int var_804[512]; //----- (00424BAC) -------------------------------------------------------- void __cdecl SortHealer() { signed int v0; // esi int *v1; // eax signed int v2; // ecx int *v3; // eax int v4; // ebx int v5; // edi v0 = 2; if ( healitem[3]._itype != -1 ) { v1 = &healitem[3]._itype; do { v1 += 92; ++v0; } while ( *v1 != -1 ); } v2 = 0; while ( v0 > 2 && !v2 ) { v2 = 1; if ( v0 > 2 ) { v3 = &healitem[2].IDidx; v4 = v0 - 2; do { v5 = (int)(v3 + 92); if ( *v3 > v3[92] ) { BubbleSwapItem((ItemStruct *)(v3 - 90), (ItemStruct *)(v3 + 2)); v2 = 0; } --v4; v3 = (int *)v5; } while ( v4 ); } --v0; } } //----- (00424C0C) -------------------------------------------------------- void __fastcall SpawnHealer(int lvl) { int v3; // eax ItemStruct *v4; // ebp signed int v8; // [esp-4h] [ebp-20h] int v10; // [esp+14h] [ebp-8h] GetItemAttrs(0, IDI_HEAL, 1); qmemcpy(healitem, item, sizeof(ItemStruct)); healitem[0]._iCreateInfo = lvl; healitem[0]._iStatFlag = 1; GetItemAttrs(0, IDI_FULLHEAL, 1); qmemcpy(&healitem[1], item, sizeof(ItemStruct)); healitem[1]._iCreateInfo = lvl; healitem[1]._iStatFlag = 1; if ( gbMaxPlayers == 1 ) { v8 = 2; } else { GetItemAttrs(0, IDI_RESURRECT, 1); qmemcpy(&healitem[2], item, sizeof(ItemStruct)); healitem[2]._iCreateInfo = lvl; healitem[2]._iStatFlag = 1; v8 = 3; } v3 = random(50, 8) + 10; if ( v8 < v3 ) { v4 = &healitem[v8]; v10 = v3 - v8; do { item[0]._iSeed = GetRndSeed(); SetRndSeed(item[0]._iSeed); GetItemAttrs(0, RndHealerItem(lvl) - 1, lvl); qmemcpy(v4, item, sizeof(ItemStruct)); v4->_iCreateInfo = lvl | 0x4000; v4->_iIdentified = 1; v4->_iStatFlag = StoreStatOk(v4); ++v4; --v10; } while ( v10 ); } if ( v3 < 20 ) { do { healitem[v3]._itype = -1; v3++; } while ( v3 < 20 ); } SortHealer(); } // 679660: using guessed type char gbMaxPlayers; //----- (00424D57) -------------------------------------------------------- void __cdecl SpawnStoreGold() { GetItemAttrs(0, IDI_GOLD, 1); qmemcpy(&golditem, item, sizeof(golditem)); golditem._iStatFlag = 1; } //----- (00424D80) -------------------------------------------------------- void __fastcall RecreateSmithItem(int ii, int idx, int plvl, int iseed) { SetRndSeed(iseed); GetItemAttrs(ii, RndSmithItem(plvl) - 1, plvl); item[ii]._iSeed = iseed; item[ii]._iCreateInfo = plvl | 0x400; item[ii]._iIdentified = 1; } //----- (00424DD1) -------------------------------------------------------- void __fastcall RecreatePremiumItem(int ii, int idx, int lvl, int iseed) { int itype; // edi SetRndSeed(iseed); itype = RndPremiumItem(lvl >> 2, lvl) - 1; GetItemAttrs(ii, itype, lvl); GetItemBonus(ii, itype, lvl >> 1, lvl, 1); item[ii]._iCreateInfo = lvl | 0x800; item[ii]._iSeed = iseed; item[ii]._iIdentified = 1; } //----- (00424E3C) -------------------------------------------------------- void __fastcall RecreateBoyItem(int ii, int idx, int lvl, int iseed) { int itype; // edi SetRndSeed(iseed); itype = RndBoyItem(lvl) - 1; GetItemAttrs(ii, itype, lvl); GetItemBonus(ii, itype, lvl, 2 * lvl, 1); item[ii]._iCreateInfo = lvl | 0x1000; item[ii]._iSeed = iseed; item[ii]._iIdentified = 1; } //----- (00424EA1) -------------------------------------------------------- void __fastcall RecreateWitchItem(int ii, int idx, int lvl, int iseed) { int itype; // edi int iblvl; // eax if ( idx == IDI_MANA || idx == IDI_FULLMANA || idx == IDI_PORTAL ) { GetItemAttrs(ii, idx, lvl); } else { SetRndSeed(iseed); itype = RndWitchItem(lvl) - 1; GetItemAttrs(ii, itype, lvl); iblvl = 2 * lvl; if ( iblvl != -1 && (random(51, 100) <= 5 || item[ii]._iMiscId == IMISC_STAFF) ) { GetItemBonus(ii, itype, iblvl >> 1, iblvl, 1); } } item[ii]._iCreateInfo = lvl | 0x2000; item[ii]._iSeed = iseed; item[ii]._iIdentified = 1; } //----- (00424F52) -------------------------------------------------------- void __fastcall RecreateHealerItem(int ii, int idx, int lvl, int iseed) { if ( idx != IDI_HEAL && idx != IDI_FULLHEAL && idx != IDI_RESURRECT ) { SetRndSeed(iseed); idx = RndHealerItem(lvl) - 1; } GetItemAttrs(ii, idx, lvl); item[ii]._iCreateInfo = lvl | 0x4000; item[ii]._iSeed = iseed; item[ii]._iIdentified = 1; } //----- (00424FB8) -------------------------------------------------------- void __fastcall RecreateTownItem(int ii, int idx, unsigned short icreateinfo, int iseed, int ivalue) { if ( icreateinfo & 0x400 ) RecreateSmithItem(ii, idx, icreateinfo & 0x3F, iseed); else if ( icreateinfo & 0x800 ) RecreatePremiumItem(ii, idx, icreateinfo & 0x3F, iseed); else if ( icreateinfo & 0x1000 ) RecreateBoyItem(ii, idx, icreateinfo & 0x3F, iseed); else if ( icreateinfo & 0x2000 ) RecreateWitchItem(ii, idx, icreateinfo & 0x3F, iseed); else if ( icreateinfo & 0x4000 ) RecreateHealerItem(ii, idx, icreateinfo & 0x3F, iseed); } //----- (0042501F) -------------------------------------------------------- void __cdecl RecalcStoreStats() { int i; for(i = 0; i < 20; i++) { if ( smithitem[i]._itype != -1 ) smithitem[i]._iStatFlag = StoreStatOk(&smithitem[i]); if ( witchitem[i]._itype != -1 ) witchitem[i]._iStatFlag = StoreStatOk(&witchitem[i]); if ( healitem[i]._itype != -1 ) healitem[i]._iStatFlag = StoreStatOk(&healitem[i]); } for(i = 0; i < 6; i++) { if ( premiumitem[i]._itype != -1 ) premiumitem[i]._iStatFlag = StoreStatOk(&premiumitem[i]); } boyitem._iStatFlag = StoreStatOk(&boyitem); } // 6A6BB8: using guessed type int stextscrl; // 6AA700: using guessed type int stextdown; //----- (004250C0) -------------------------------------------------------- int __cdecl ItemNoFlippy() { int r; // ecx r = itemactive[numitems-1]; item[r]._iAnimFlag = 0; item[r]._iAnimFrame = item[r]._iAnimLen; item[r]._iSelFlag = 1; return r; } //----- (004250EF) -------------------------------------------------------- void __fastcall CreateSpellBook(int x, int y, int ispell, bool sendmsg, int delta) { int ii; // edi int idx; // [esp+8h] [ebp-8h] bool done; // [esp+Ch] [ebp-4h] done = 0; idx = RndTypeItems(0, 24); if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; do { SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, 1, 0, delta); if ( item[ii]._iMiscId == IMISC_BOOK && item[ii]._iSpell == ispell ) done = 1; } while ( !done ); if ( sendmsg ) NetSendCmdDItem(0, ii); if ( delta ) DeltaAddItem(ii); ++numitems; } } //----- (004251B8) -------------------------------------------------------- void __fastcall CreateMagicItem(int x, int y, int imisc, int icurs, int sendmsg, int delta) { int ii; // esi int idx; // ebx bool done; // [esp+Ch] [ebp-4h] done = 0; idx = RndTypeItems(imisc, 0); if ( numitems < 127 ) { ii = itemavail[0]; GetSuperItemSpace(x, y, itemavail[0]); itemactive[numitems] = ii; itemavail[0] = itemavail[-numitems + 126]; do { SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, 1, 0, delta); if ( item[ii]._iCurs == icurs ) done = 1; } while ( !done ); if ( sendmsg ) NetSendCmdDItem(0, ii); if ( delta ) DeltaAddItem(ii); ++numitems; } } //----- (0042526E) -------------------------------------------------------- bool __fastcall GetItemRecord(int dwSeed, int CI, int indx) { int v3; // edi int *v4; // ebx int v6; // [esp+Ch] [ebp-18h] DWORD v7; // [esp+10h] [ebp-14h] int *v8; // [esp+14h] [ebp-10h] unsigned short *v9; // [esp+18h] [ebp-Ch] ItemGetRecordStruct *v10; // [esp+1Ch] [ebp-8h] short v11; // [esp+20h] [ebp-4h] v11 = CI; v6 = dwSeed; v3 = 0; v7 = GetTickCount(); if ( gnNumGetRecords <= 0 ) return 1; v8 = &itemrecord[0].nIndex; v9 = &itemrecord[0].wCI; v10 = itemrecord; v4 = &itemrecord[0].dwTimestamp; while ( v7 - *v4 > 6000 ) { NextItemRecord(v3); --v10; v9 -= 8; --v3; v4 -= 4; v8 -= 4; LABEL_8: ++v10; v9 += 8; v8 += 4; ++v3; v4 += 4; if ( v3 >= gnNumGetRecords ) return 1; } if ( v6 != v10->nSeed || v11 != *v9 || indx != *v8 ) goto LABEL_8; return 0; } //----- (00425311) -------------------------------------------------------- void __fastcall NextItemRecord(int i) { int v1; // eax v1 = gnNumGetRecords-- - 1; if ( gnNumGetRecords ) { itemrecord[i].nIndex = itemrecord[v1].nIndex; itemrecord[i].nSeed = itemrecord[v1].nSeed; itemrecord[i].wCI = itemrecord[v1].wCI; itemrecord[i].dwTimestamp = itemrecord[v1].dwTimestamp; } } //----- (00425357) -------------------------------------------------------- void __fastcall SetItemRecord(int dwSeed, int CI, int indx) { int i; // ecx if ( gnNumGetRecords != 127 ) { i = gnNumGetRecords++; itemrecord[i].dwTimestamp = GetTickCount(); itemrecord[i].nSeed = dwSeed; itemrecord[i].wCI = CI; itemrecord[i].nIndex = indx; } } //----- (0042539E) -------------------------------------------------------- void __fastcall PutItemRecord(int seed, int ci, int index) { int v3; // edi int *v4; // ebx int v5; // [esp+Ch] [ebp-18h] DWORD v6; // [esp+10h] [ebp-14h] int *v7; // [esp+14h] [ebp-10h] unsigned short *v8; // [esp+18h] [ebp-Ch] ItemGetRecordStruct *v9; // [esp+1Ch] [ebp-8h] short v10; // [esp+20h] [ebp-4h] v10 = ci; v5 = seed; v3 = 0; v6 = GetTickCount(); if ( gnNumGetRecords > 0 ) { v7 = &itemrecord[0].nIndex; v8 = &itemrecord[0].wCI; v9 = itemrecord; v4 = &itemrecord[0].dwTimestamp; do { if ( v6 - *v4 <= 6000 ) { if ( v5 == v9->nSeed && v10 == *v8 && index == *v7 ) { NextItemRecord(v3); return; } } else { NextItemRecord(v3); --v9; v8 -= 8; --v3; v4 -= 4; v7 -= 4; } ++v9; v8 += 8; v7 += 4; ++v3; v4 += 4; } while ( v3 < gnNumGetRecords ); } }