You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5683 lines
169 KiB
5683 lines
169 KiB
//HEADER_GOES_HERE |
|
|
|
#include "../types.h" |
|
|
|
int itemactive[MAXITEMS]; |
|
int uitemflag; |
|
int itemavail[MAXITEMS]; |
|
ItemStruct curruitem; |
|
ItemGetRecordStruct itemrecord[MAXITEMS]; |
|
ItemStruct item[MAXITEMS+1]; |
|
char itemhold[3][3]; |
|
char byte_641234[28]; /* check if part of above */ |
|
unsigned char *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_CURSE, 2, 4, 4, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -4 }, |
|
{ "tears", IPL_GETHIT_CURSE, 1, 1, 2, PLT_ARMO|PLT_SHLD|PLT_MISC, 1, 0, 0, 0, 0, -2 }, |
|
{ "health", IPL_GETHIT, 1, 1, 2, PLT_ARMO|PLT_SHLD|PLT_MISC, 16, 0, 1, 200, 200, 2 }, |
|
{ "protection", IPL_GETHIT, 2, 2, 6, PLT_ARMO|PLT_SHLD, 16, 0, 1, 400, 800, 4 }, |
|
{ "absorption", IPL_GETHIT, 3, 3, 12, PLT_ARMO|PLT_SHLD, 16, 0, 1, 1001, 2500, 10 }, |
|
{ "deflection", IPL_GETHIT, 4, 4, 20, PLT_ARMO, 16, 0, 1, 2500, 6500, 15 }, |
|
{ "osmosis", IPL_GETHIT, 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, 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, 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, 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, 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, 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, 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_CURSE, 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, 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, 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, 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, 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, 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, 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, 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_CURSE, 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, 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 }; |
|
|
|
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] = LoadFileInMem(arglist, 0); |
|
++v0; |
|
} |
|
while ( v0 < 35 ); |
|
memset(UniqueItemFlag, 0, 0x200u); |
|
} |
|
|
|
bool __fastcall ItemPlace(int xp, int yp) |
|
{ |
|
int v2; // ecx |
|
int v3; // eax |
|
bool result; // al |
|
|
|
v2 = xp; |
|
v3 = v2 * 112 + yp; |
|
if ( dMonster[0][v3] || dPlayer[v2][yp] || dItem[v2][yp] || dObject[v2][yp] || dFlags[v2][yp] & 8 ) |
|
result = 0; |
|
else |
|
result = nSolidTable[dPiece[0][v3]] == 0; |
|
return result; |
|
} |
|
|
|
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 ); |
|
} |
|
} |
|
|
|
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[MAXITEMS+1]._ix ); |
|
v1 = 0; |
|
memset(itemactive, 0, sizeof(itemactive)); |
|
do |
|
{ |
|
itemavail[v1] = v1; |
|
++v1; |
|
} |
|
while ( v1 < MAXITEMS ); |
|
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; |
|
|
|
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 |
|
unsigned char *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; |
|
|
|
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; |
|
|
|
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); |
|
} |
|
} |
|
|
|
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 ); |
|
} |
|
|
|
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 ); |
|
} |
|
|
|
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; |
|
} |
|
|
|
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 ); |
|
} |
|
} |
|
|
|
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(); |
|
} |
|
} |
|
|
|
void __fastcall SetPlrHandItem(ItemStruct *h, int idata) |
|
{ |
|
ItemDataStruct *pAllItem; |
|
|
|
pAllItem = &AllItemsList[idata]; |
|
|
|
// zero-initialize struct |
|
memset(h, 0, sizeof(*h)); |
|
|
|
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->_iIvalue = pAllItem->iValue; |
|
h->_iPrePower = -1; |
|
h->_iSufPower = -1; |
|
h->_iMagical = 0; |
|
h->IDidx = idata; |
|
} |
|
|
|
void __fastcall GetPlrHandSeed(ItemStruct *h) |
|
{ |
|
h->_iSeed = GetRndSeed(); |
|
} |
|
|
|
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; |
|
} |
|
|
|
void __fastcall SetPlrHandSeed(ItemStruct *h, int iseed) |
|
{ |
|
h->_iSeed = iseed; |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
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); |
|
} |
|
|
|
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 ( object[v6-1]._oSelFlag ) /* check */ |
|
return 0; |
|
v7 = v6 < 0; |
|
} |
|
if ( !v7 || !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 || !object[v8-1]._oSelFlag || !object[v9-1]._oSelFlag ) |
|
return nSolidTable[dPiece[0][v3]] == 0; |
|
} |
|
return 0; |
|
} |
|
|
|
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] ); |
|
v12 = random(13, 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; |
|
} |
|
|
|
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 ); |
|
} |
|
} |
|
|
|
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; |
|
} |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
v4 = random(14, 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; |
|
|
|
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; |
|
v5 = -1; |
|
if ( !random(15, 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 ) |
|
{ |
|
v5 = l[random(16, 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]; |
|
|
|
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; |
|
|
|
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 == DTYPE_HELL ) |
|
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; |
|
|
|
int __fastcall RndPL(int param1, int param2) |
|
{ |
|
return param1 + random(22, param2 - param1 + 1); |
|
} |
|
|
|
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; |
|
} |
|
|
|
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_CURSE: |
|
v11 = &item[v8]._iPLGetHit; |
|
goto LABEL_115; |
|
case IPL_GETHIT: |
|
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; |
|
} |
|
} |
|
|
|
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]; |
|
|
|
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; |
|
} |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
int __fastcall RndItem(int m) |
|
{ |
|
int ri; // esi |
|
int i; // edx |
|
int ril[512]; // [esp+4h] [ebp-800h] |
|
|
|
if ( (monster[m].MData->mTreasure & 0x8000) != 0 ) |
|
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]; |
|
|
|
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 & 0x8000) != 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]; |
|
|
|
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]; |
|
|
|
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]; |
|
|
|
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]; |
|
|
|
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; |
|
} |
|
|
|
void __fastcall SpawnUnique(int uid, int x, int y) |
|
{ |
|
int ii; // esi |
|
int itype; // edx |
|
|
|
if ( numitems < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itype = 0; |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
|
|
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 |
|
|
|
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; |
|
} |
|
|
|
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); |
|
} |
|
|
|
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 & 0x8000) == 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 < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
|
|
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; |
|
|
|
void __fastcall CreateItem(int uid, int x, int y) |
|
{ |
|
int ii; // esi |
|
int idx; // edx |
|
|
|
if ( numitems < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
idx = 0; |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
|
|
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 |
|
|
|
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 < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, 0, delta); |
|
|
|
if ( sendmsg ) |
|
NetSendCmdDItem(0, ii); |
|
if ( delta ) |
|
DeltaAddItem(ii); |
|
|
|
++numitems; |
|
} |
|
} |
|
|
|
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); |
|
} |
|
|
|
void __fastcall CreateRndUseful(int pnum, int x, int y, unsigned char sendmsg) |
|
{ |
|
int ii; // esi |
|
|
|
if ( numitems < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
SetupAllUseful(ii, GetRndSeed(), currlevel); |
|
|
|
if ( sendmsg ) |
|
NetSendCmdDItem(0, ii); |
|
|
|
++numitems; |
|
} |
|
} |
|
|
|
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 < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, 0, delta); |
|
|
|
if ( sendmsg ) |
|
NetSendCmdDItem(0, ii); |
|
if ( delta ) |
|
DeltaAddItem(ii); |
|
|
|
++numitems; |
|
} |
|
} |
|
|
|
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; |
|
} |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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 < MAXITEMS ) |
|
{ |
|
v12 = itemavail[0]; |
|
v13 = itemavail[0]; |
|
item[v13]._ix = x; |
|
itemactive[numitems] = v12; |
|
item[v13]._iy = y; |
|
itemavail[0] = itemavail[-numitems + 126]; /* double check, MAXITEMS */ |
|
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; |
|
} |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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 + MAXITEMS] = ii; |
|
numitems = v2; |
|
if ( !v4 && !v3 && i != v2 ) |
|
itemactive[i] = itemactive[v2]; |
|
} |
|
|
|
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; |
|
|
|
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(); |
|
} |
|
|
|
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); |
|
} |
|
} |
|
|
|
void __fastcall GetItemFrm(int i) |
|
{ |
|
item[i]._iAnimData = Item2Frm[ItemCAnimTbl[item[i]._iCurs]]; |
|
} |
|
|
|
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; |
|
|
|
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); |
|
} |
|
|
|
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); |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
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); |
|
} |
|
|
|
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; |
|
} |
|
} |
|
} |
|
} |
|
|
|
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); |
|
} |
|
|
|
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_CURSE: |
|
case IPL_GETHIT: |
|
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; |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
} |
|
} |
|
|
|
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 ); |
|
} |
|
|
|
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; |
|
|
|
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); |
|
} |
|
} |
|
|
|
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; |
|
|
|
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; |
|
|
|
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; |
|
v11 = plr[v10]._pMaxMana >> 8; |
|
v12 = (v11 & 0xFFFFFFFE) + 2 * random(40, 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; |
|
v62 = plr[v61]._pMaxHP >> 8; |
|
v63 = (v62 & 0xFFFFFFFE) + 2 * random(39, 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; |
|
v43 = plr[v42]._pMaxHP >> 8; |
|
v44 = (v43 & 0xFFFFFFFE) + 2 * random(39, 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; |
|
drawhpflag = 1; |
|
v53 = (v51 & 0xFFFFFFFE) + 2 * random(40, 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; |
|
} |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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]; |
|
|
|
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)); |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
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(); |
|
} |
|
|
|
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; |
|
|
|
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]; |
|
|
|
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)); |
|
} |
|
|
|
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; |
|
|
|
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; |
|
|
|
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]; |
|
|
|
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; |
|
} |
|
} |
|
|
|
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 ); |
|
} |
|
} |
|
} |
|
|
|
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(); |
|
} |
|
|
|
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]; |
|
|
|
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; |
|
|
|
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; |
|
|
|
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]; |
|
|
|
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; |
|
} |
|
} |
|
|
|
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; |
|
|
|
void __cdecl SpawnStoreGold() |
|
{ |
|
GetItemAttrs(0, IDI_GOLD, 1); |
|
qmemcpy(&golditem, item, sizeof(golditem)); |
|
golditem._iStatFlag = 1; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
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); |
|
} |
|
|
|
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; |
|
|
|
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; |
|
} |
|
|
|
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 < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
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; |
|
} |
|
} |
|
|
|
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; |
|
if ( numitems < MAXITEMS ) |
|
{ |
|
ii = itemavail[0]; |
|
GetSuperItemSpace(x, y, itemavail[0]); |
|
itemactive[numitems] = ii; |
|
itemavail[0] = itemavail[-numitems + 126]; /* MAXITEMS */ |
|
idx = RndTypeItems(imisc, 0); |
|
do |
|
{ |
|
SetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, 1, 0, delta); |
|
if ( item[ii]._iCurs == icurs ) |
|
done = 1; |
|
else |
|
idx = RndTypeItems(imisc, 0); |
|
} |
|
while ( !done ); |
|
if ( sendmsg ) |
|
NetSendCmdDItem(0, ii); |
|
if ( delta ) |
|
DeltaAddItem(ii); |
|
++numitems; |
|
} |
|
} |
|
|
|
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; |
|
} |
|
|
|
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; |
|
} |
|
} |
|
|
|
void __fastcall SetItemRecord(int dwSeed, int CI, int indx) |
|
{ |
|
int i; // ecx |
|
|
|
if ( gnNumGetRecords != MAXITEMS ) |
|
{ |
|
i = gnNumGetRecords++; |
|
itemrecord[i].dwTimestamp = GetTickCount(); |
|
itemrecord[i].nSeed = dwSeed; |
|
itemrecord[i].wCI = CI; |
|
itemrecord[i].nIndex = indx; |
|
} |
|
} |
|
|
|
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 ); |
|
} |
|
}
|
|
|