/*************************************************************************** * Random Object Code - Written Exclusively for Asgardian Nightmare Mud * * by Chris Langlois(tas@intrepid.inetsolve.com) and Gabe Volker * ***************************************************************************/ #include "include.h" #include "recycle.h" #define LOWER_RANDOM_VNUM 700 #define UPPER_RANDOM_VNUM 825 #define LOWER_UNIQUE_VNUM 850 #define UPPER_UNIQUE_VNUM 936 #define MAX_PREFIX 90 #define MAX_SUFFIX 130 //was 125 #define MAX_EXCEP_APPLY 14 //was 13 // Local Functions void process_mods args( ( OBJ_DATA * rand_obj, int mod_number, bool prefix ) ); OBJ_DATA * rand_obj args( (CHAR_DATA * ch, int mob_level ) ); OBJ_DATA * rand_obj2 args( (CHAR_DATA * ch, int mob_level, char *argument ) ); OBJ_DATA * make_cracked args( (OBJ_DATA *obj) ); OBJ_DATA * make_exceptional args( (OBJ_DATA *obj) ); OBJ_DATA * make_special args( (OBJ_DATA *obj, int mob_level, int rand_type, char *prefix, char *suffix) ); void show_randobj2_types_cmds args(( CHAR_DATA *ch )); bool is_prefix args((char *word)); bool is_suffix args((char *word)); int prefix_lookup args((char *prefix)); int suffix_lookup args((char *suffix)); void show_prefixes args(( CHAR_DATA *ch )); void show_suffixes args(( CHAR_DATA *ch )); struct randobj2_types { char *type; int index; char *desc; }; struct excep_apply_data { int apply_type; int min; int max; }; struct prefix_data { char *name; int level; int align; int affect; int resist; int vulner; int mod_one; int min_one; int max_one; int mod_two; int min_two; int max_two; int mod_three; int min_three; int max_three; }; struct suffix_data { char *name; int level; int align; int affect; int resist; int vulner; int mod_one; int min_one; int max_one; int mod_two; int min_two; int max_two; int mod_three; int min_three; int max_three; }; const struct randobj2_types arg_table [] = { /* { Name, Index }, */ { "unique", 0, "Loads a Unique Item" }, { "normal", 1, "Loads a Normal Item" }, { "cracked", 2, "Loads a Cracekd Item" }, { "exceptional", 3, "Loads an Exceptional Item" }, { "special", 4, "Loads a Special Item" }, { "cspecial", 5, "Loads a Cracked Special Item" }, { "especial", 6, "Loads an Exceptional Item" }, { "list", 7, "Displays this List" }, { NULL, 8, NULL} }; const struct excep_apply_data eapply_table [] = { /* { Apply_Type, Min, Max }, */ { APPLY_STR, 1, 2 }, { APPLY_INT, 1, 2 }, { APPLY_WIS, 1, 2 }, { APPLY_DEX, 1, 2 }, { APPLY_CON, 1, 2 }, { APPLY_AGE, 1, 20 }, { APPLY_MANA, 1, 35 }, { APPLY_MOVE, 1, 35 }, { APPLY_HIT, 1, 35 }, { APPLY_HITROLL, 1, 10 }, { APPLY_DAMROLL, 1, 7 }, { APPLY_SAVES, -1, -3 }, { APPLY_AC, -1, -15 }, { 0, 0, 0} }; const struct prefix_data prefix_table [] = { /* name, level, align, affect, resist, vulner, mod_one, min_one, max_one, mod_two, min_two, max_two, mod_three, min_three, max_three */ { "Arcane", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 75, 150, APPLY_SAVES, -5, -2, APPLY_INT, 1, 3 }, { "Crippling", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, -3, -3, APPLY_STR, -3, -3, APPLY_INT, 3, 5 }, /* START OF AC ITEMS WITH VARIOUS OTHER TYPES */ { "Altruistic", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -15, 15, APPLY_DAMROLL, -15, 15, APPLY_NONE, 0, 0 }, { "Elders", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 0, 5, APPLY_AGE, 0, 15, APPLY_NONE, 0, 0 }, { "Distressed", 0, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 1, 10, APPLY_DAMROLL, 2, 10, APPLY_NONE, 0, 0 }, { "Athletic", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -5, -1, APPLY_HITROLL, 2, 10, APPLY_NONE, 0, 0 }, { "Solid", 7, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -10, -6, APPLY_DAMROLL, -10, -2, APPLY_NONE, 0, 0 }, { "Rugged", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -15, -10, APPLY_HITROLL, -10, -2, APPLY_NONE, 0, 0 }, { "Energetic", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -15, -10, APPLY_AGE, -20, -3, APPLY_DAMROLL, 5, 10 }, { "Durable", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -14, -8, APPLY_HIT, 50, 75, APPLY_NONE, 0, 0 }, { "Firm", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -5, -15, APPLY_MANA, 50, 100, APPLY_NONE, 0, 0 }, { "Robust", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -12, -5, APPLY_MOVE, 25, 75, APPLY_NONE, 0, 0 }, { "Powerful", 45, 350, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -13, -10, APPLY_HIT, 15, 60, APPLY_MANA, 40, 75 }, /* START OF NEGATIVE DAMROLL ITEMS */ { "Broken", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -30, -15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Damaged", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -15, -5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF BAD AC ONLY ITEMS */ { "Vulnerable", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 10, 25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Rusted", 0, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 1, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF GOOD AC ONLY ITEMS */ { "Sturdy", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -5, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Fine", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -10, -6, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Strong", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -15, -10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Grand", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -20, -15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Valiant", 40, 100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -25, -20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Glorious", 50, 50, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -30, -25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Blessed", 60, 300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -35, -30, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Saintly", 70, 500, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -38, -33, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Awesome", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -42, -35, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Holy", 90, 700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -45, -40, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Godly", 101, 900, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -50, -42, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE DAMROLL ITEMS */ { "Useless", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -30, -15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Bent", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -15, -5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Weak", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -1, -5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE DAMROLL ITEMS */ { "Jagged", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 1, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Deadly", 20, -100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 3, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Heavy", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vicious", 50, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Brutal", 60, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 9, 11, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Massive", 70, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 11, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Savage", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 13, 18, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Ruthless", 90, -300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 15, 22, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Merciless", 101, -400, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 17, 24, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE HITROLL ITEMS */ { "Tin", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, -30, -10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Brass", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, -10, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE HITROLL ITEMS */ { "Bronze", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 1, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Iron", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 3, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Steel", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Silver", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 7, 9, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Gold", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 9, 11, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Platinum", 70, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 11, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Mithril", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 15, 20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Meteoric", 90, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 20, 25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Ethereal", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 25, 30, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE HR AND DR ITEMS */ { "Clumsy", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -10, -1, APPLY_HITROLL, -20, -10, APPLY_NONE, 0, 0 }, { "Dull", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -20, -10, APPLY_HITROLL, -10, -1, APPLY_NONE, 0, 0 }, /* START OF POSITIVE HR AND DR ITEMS */ { "Sharp", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 1, 3, APPLY_HITROLL, 1, 3, APPLY_NONE, 0, 0 }, { "Warrior's", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 3, 5, APPLY_HITROLL, 3, 5, APPLY_NONE, 0, 0 }, { "Soldier's", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7, APPLY_HITROLL, 5, 7, APPLY_NONE, 0, 0 }, { "Knight's", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9, APPLY_HITROLL, 7, 9, APPLY_NONE, 0, 0 }, { "Lord's", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 9, 11, APPLY_HITROLL, 9, 11, APPLY_NONE, 0, 0 }, { "Master's", 70, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 11, 15, APPLY_HITROLL, 11, 15, APPLY_NONE, 0, 0 }, { "Champion's", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 13, 20, APPLY_HITROLL, 13, 20, APPLY_NONE, 0, 0 }, { "Avatar's", 90, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 18, 25, APPLY_HITROLL, 18, 25, APPLY_NONE, 0, 0 }, { "King's", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 20, 26, APPLY_HITROLL, 20, 26, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE MANA ONLY ITEMS */ { "Hyena's", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, -100, -25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Frog's", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, -25, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE MANA ONLY ITEMS */ { "Lizard's", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 1, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Snake's", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 10, 20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Raven's", 20, -100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 20, 30, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Serpent's", 30, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 30, 50, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Drake's", 40, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 50, 70, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Dragon's", 50, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 70, 100, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Wyrm's", 60, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 100, 130, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Hydra's", 70, -250, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 130, 200, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF BAD SAVES ONLY ITEMS */ { "Putrid", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, 5, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vile", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, 2, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Murky", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF GOOD SAVES ONLY ITEMS */ { "White", 1, 100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -1, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Pearl", 10, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -2, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Amber", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -2, -2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Ivory", 30, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -3, -2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Topaz", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -3, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Crystal", 50, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -4, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Jade", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -4, -4, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Diamond", 70, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -5, -5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Obsidian", 80, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -7, -5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Emerald", 90, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -10, -7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF RESIST ITEMS */ { "Ruby", 90, 0, NO_FLAG, RES_FIRE, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Coral", 90, 0, NO_FLAG, RES_LIGHTNING, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Viridian", 90, 0, NO_FLAG, RES_POISON, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Sapphire", 90, 0, NO_FLAG, RES_COLD, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Beryl", 90, 0, NO_FLAG, RES_ACID, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Mirrored", 90, 0, NO_FLAG, RES_NEGATIVE, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Dark", 90, -300, NO_FLAG, RES_HOLY, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Azure", 90, 0, NO_FLAG, RES_MENTAL, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Prismatic", 90, 0, NO_FLAG, RES_SOUND, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Black", 90, 0, NO_FLAG, RES_LIGHT, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Lapis", 90, 0, NO_FLAG, RES_DISEASE, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vibrant", 90, 0, NO_FLAG, RES_CHARM, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF AFFECT ITEMS */ { "Veiled", 40, -100, AFF_BLIND, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Pink", 10, 0, AFF_FAERIE_FIRE, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Blighted", 25, -150, AFF_POISON, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Blackened", 50, -200, AFF_POISON, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Placid", 1, 0, AFF_CALM, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Infested", 30, 0, AFF_PLAGUE, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Deadened", 15, 0, AFF_WEAKEN, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Slow", 20, 0, AFF_SLOW, NO_FLAG, NO_FLAG, APPLY_DEX, -5, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { NULL, 0, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 } }; const struct suffix_data suffix_table [] = { /* name, level, align, affect, resist, vulner, mod_one, min_one, max_one, mod_two, min_two, max_two, mod_three, min_three, max_three */ { "the Wild", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_REGEN, 5, 15, APPLY_MANA_REGEN, 5, 15, APPLY_NONE, 0, 0 }, { "Rancor", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 1, 3, APPLY_DAMROLL, 20, 30, APPLY_HIT, -150, -75 }, /* START OF BAD AC ONLY RANDOMS */ { "Pain", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 10, 25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Tears", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, 1, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF GOOD AC ONLY RANDOMS */ { "Health", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -7, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Protection", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -15, -7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Absorbtion", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -20, -15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Life", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -30, -20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Osmosis", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -40, -25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE DAMROLL ONLY ITEMS */ { "Brittleness", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -30, -10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Fragility", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, -10, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE DAMROLL ONLY ITEMS */ { "Craftsmanship", 0, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 1, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Quality", 5, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 3, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSIVITE DAMROLL EVIL ALIGN ONLY ITEMS */ { "Maiming", 30, -100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Slaying", 45, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Gore", 60, -300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 10, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Carnage", 85, -400, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 15, 20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Slaughter", 101, -500, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 20, 30, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE NEGATIVE MOVE ONLY ITEMS */ { "the Meek", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, -100, -25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Lethargy", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, -25, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE MOVE ONLY ITEMS */ { "Readiness", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, 1, 20, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Alacrity", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, 20, 50, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Swiftness", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, 50, 100, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Quickness", 45, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MOVE, 100, 250, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE NEGATIVE AGE ONLY ITEMS */ { "Youth", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AGE, -10, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE AGE ONLY ITEMS */ { "Age", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AGE, 5, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Ages", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AGE, 5, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Time", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AGE, 9, 19, APPLY_STR, -3, -1, APPLY_NONE, 0, 0 }, /* START OF THE NEGATIVE DEX ONLY ITEMS */ { "Paralysis", 22, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, -12, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Atrophy", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, -3, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE DEX ONLY ITEMS */ { "Dexterity", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Skill", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 2, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Accuracy", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 4, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Precision", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Perfection", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 7, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE NEGATIVE INT ONLY ITEMS */ { "the Fool", 22, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, -15, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Dyslexia", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, -3, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE INT ONLY ITEMS */ { "Energy", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Mind", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 2, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Brilliance", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 4, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Sorcery", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Wizardry", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 7, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE NEGATIVE STR ONLY ITEMS */ { "Frailty", 22, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, -12, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Weakness", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, -3, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE STR ONLY ITEMS */ { "Strength", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Might", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 2, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Ox", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 4, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Giant", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Titan", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 7, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE CON ONLY ITEMS */ { "Illness", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, -15, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Disease", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, -3, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE CON ONLY ITEMS */ { "Vitality", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Zest", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, 2, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vim", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, 4, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vigor", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Balance", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, 7, 10, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF NEGATIVE WIS ONLY ITEMS */ { "the Idiot", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, -15, -3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Dazed", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, -3, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE POSITIVE WIS ONLY ITEMS */ { "Wisdom", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, 1, 2, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Clarity", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, 2, 3, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Elightenment", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, 4, 5, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Sage", 35, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, 5, 7, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Ancients", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_WIS, 5, 15, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF VARIOUS NEGATIVE ATTRIBUTE ITEMS */ { "Trouble", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, -10, -5, APPLY_CON, -10, -5, APPLY_DEX, -10, -5 }, { "the Pit", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_CON, -4, -1, APPLY_INT, -4, -1, APPLY_WIS, -4, -1 }, /* START OF VARIOUS POSITIVE ATTRIBUTE ITEMS */ { "the Sky", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 1, 2, APPLY_WIS, 1, 2, APPLY_CON, 1, 2 }, { "the Moon", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 2, 3, APPLY_STR, 2, 3, APPLY_CON, 2, 3 }, { "the Stars", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 3, 4, APPLY_WIS, 3, 4, APPLY_DEX, 3, 4 }, { "the Heavens", 70, 200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 4, 5, APPLY_STR, 4, 5, APPLY_WIS, 4, 5 }, { "the Zodiac", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 5, 6, APPLY_DEX, 5, 6, APPLY_CON, 5, 6 }, /* START OF NEGATIVE HP ITEMS */ { "the Vulture", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, -100, -25, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Jackal", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, -25, -1, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF POSITIVE HP ITEMS */ { "the Fox", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 25, 55, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Jaguar", 10, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 35, 55, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Eagle", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 35, 40, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Wolf" , 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 20, 30, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Tiger", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 30, 50, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Lion", 50, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 50, 70, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Mammoth", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 70, 100, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Whale", 70, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 100, 130, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Colossus", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 130, 200, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF GOD TYPE ITEMS */ { "Njord", 1, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 1, 5, APPLY_CON, 1, 5, APPLY_WIS, 1, 5 }, { "Freya", 5, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -2, -1, APPLY_MANA, 10, 50, APPLY_CON, 1, 3 }, { "Freyr", 10, 700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 1, 2, APPLY_WIS, 2, 3, APPLY_MOVE, 100, 200 }, { "Magni", 15, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 15, APPLY_MANA, 30, 50, APPLY_REGEN, 1, 10 }, { "Heimdall", 20, 500, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 40, 100, APPLY_MANA, 40, 100, APPLY_MOVE, 40, 100 }, { "Tyr", 25, 700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 1, 6, APPLY_HITROLL, 5, 15, APPLY_DAMROLL, 2, 15 }, { "Balder", 30, 500, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 60, 80, APPLY_MANA, 60, 80, APPLY_MOVE, 60, 80 }, { "Loki", 40, -300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 2, 5, APPLY_SAVES, -8, -5, APPLY_HITROLL, 20, 35 }, { "the Fenrir Wolf", 50, -700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 100, 130, APPLY_MANA, 100, 130, APPLY_DAMROLL, 1, 10 }, { "Thor", 101, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 100, 130, APPLY_HITROLL, 10, 20, APPLY_DAMROLL, 10, 20 }, { "Hel", 101, -700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 13, 15, APPLY_HITROLL, 13, 15, APPLY_SAVES, -7, 0 }, { "Midgaard Serpent", 70, -700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 150, 200, APPLY_MANA, 150, 200, APPLY_MOVE, 150, 200 }, { "Odin", 101, 200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 150, 200, APPLY_MANA, 150, 200, APPLY_AC, -50, -10 }, /* START OF IMMORTAL ITEMS */ { "Doom", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 20, 30, APPLY_MOVE, 150, 200, APPLY_AGE, 15, 30 }, { "Tas", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -10, -5, APPLY_HIT, 150, 200, APPLY_DAMROLL, 20, 32 }, { "Digaaz", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -20, -5, APPLY_HIT, 150, 200, APPLY_HITROLL, 10, 20 }, { "Fesdor", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HIT, 50, 150, APPLY_AC, -35, -30, APPLY_HITROLL, 20, 30 }, { "Gavorkian", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -8, -5, APPLY_AC, -30, -15, APPLY_HITROLL, 15, 30 }, /* START OF VULN AFFECT ITEMS */ { "Burning", 50, 0, NO_FLAG, NO_FLAG, VULN_FIRE, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Shock", 50, 0, NO_FLAG, NO_FLAG, VULN_LIGHTNING, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Poison", 10, 0, NO_FLAG, NO_FLAG, VULN_POISON, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Freeze", 40, 0, NO_FLAG, NO_FLAG, VULN_COLD, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Corrosion", 50, 0, NO_FLAG, NO_FLAG, VULN_ACID, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Disorder", 10, 0, NO_FLAG, NO_FLAG, VULN_NEGATIVE, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Disturbed", 20, -300, NO_FLAG, NO_FLAG, VULN_HOLY, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Troubled", 15, 0, NO_FLAG, NO_FLAG, VULN_SOUND, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Shrieking", 10, 0, NO_FLAG, NO_FLAG, VULN_MENTAL, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Mole", 10, -150, NO_FLAG, NO_FLAG, VULN_LIGHT, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Infestation", 15, 0, NO_FLAG, NO_FLAG, VULN_DISEASE, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Domination", 15, 0, NO_FLAG, NO_FLAG, VULN_CHARM, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* START OF THE AFFECT ITEMS */ { "the Crusader", 10, 300, AFF_DETECT_EVIL, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Detection", 40, 0, AFF_DETECT_INVIS, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Channeling", 5, 0, AFF_DETECT_MAGIC, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Perception", 40, 0, AFF_DETECT_MOTION, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Minion", 10, -300, AFF_DETECT_GOOD, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Redeye", 40, 0, AFF_INFRARED, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Vision", 30, 0, AFF_FARSIGHT, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Chameleon", 60, 0, AFF_SNEAK, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Falcon", 20, 0, AFF_FLYING, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "the Ghost", 50, 0, AFF_PASS_DOOR, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, /* { "the Cheetah", 70, 0, NO_FLAG, RES_SLOW, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, */ { "the Owl", 40, 0, AFF_DARK_VISION, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Ksavir", 1, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 1, 2, APPLY_CON, 1, 2, APPLY_WIS, 1, 2 }, { "Bree", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AGE, 15, 32, APPLY_MANA, 100, 220, APPLY_DAMROLL, 17, 30 }, { "the Gods", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DEX, 1, 5, APPLY_SAVES, -15, -1, APPLY_HITROLL, 5, 15 }, { "Rage", 30, 0, AFF_BERSERK, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Valkyrie", 45, 0, AFF_REGENERATION, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 }, { "Skyntil", 99, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_REGEN, 5, 30, APPLY_MORPH_FORM, MORPH_RED, MORPH_GOLD, APPLY_NONE, 0, 0 }, { NULL, 0, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 } }; OBJ_DATA *rand_obj(CHAR_DATA *ch, int mob_level ) { OBJ_DATA *obj; int rand_number = 0; int rand_number2 = 0; int prefix_number = 0; int suffix_number = 0; int pslevel = 0; int align = 0; bool roll = FALSE; bool add_prefix = FALSE; bool add_suffix = FALSE; char buf_name[MSL]; char buf_short[MSL]; int rand_type = 0; // cracked = 1, normal = 0, excep =2 int tolerance = 2; // 1-100 random rand_number = number_percent(); // Unique Objects - 2% if ( rand_number <= 2 && mob_level + 1 >= (number_percent()/2) + 91 ) { // Pick only objects that are at or below the level of the killed mobile rand_number = number_range(LOWER_UNIQUE_VNUM, UPPER_UNIQUE_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); // while( obj->level > ( mob_level - 20 ) ) //asdf while( obj->level > ( mob_level <= 20 ? 1 : mob_level - 20 ) ) { rand_number = number_range(LOWER_UNIQUE_VNUM, UPPER_UNIQUE_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); } // Add the word 'unique' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," unique"); } // Magical Objects - 22% else if ( rand_number <= 24 ) { pslevel = 0; // Pick only objects that are at or below the level of the killed mobile rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); // while( obj->level > ( mob_level - 20 ) ) //asdf while( obj->level > ( mob_level <= 20 ? 1 : mob_level - 20 ) ) { rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); } // Check and see if Quality Changes // Exceptional if( (rand_number2 = number_percent()) < 15 ) { rand_type = 2; obj = make_exceptional(obj); tolerance = 7; } else if (rand_number2 > 85) { rand_type = 1; obj = make_cracked(obj); tolerance = -2; } // Prefix, Suffix or Both? rand_number = dice ( 1, 3 ); if ( rand_number == 1 ) { add_prefix = TRUE; } else if ( rand_number == 2 ) { add_suffix = TRUE; } else { add_prefix = TRUE; add_suffix = TRUE; } buf_short[0] = '\0'; if(mob_level+tolerance < 1) tolerance = 1; // Pick out Prefix/Suffix and be sure that the levels of the two // combined is less than or equal to the mob's level while ((( pslevel ) > mob_level + tolerance) || roll == FALSE ) { roll = TRUE; pslevel = 0; if ( add_prefix ) { // Pick Prefix prefix_number = number_range ( 0, MAX_PREFIX-1 ); pslevel = prefix_table[prefix_number].level; } if ( add_suffix ) { // Pick Suffix suffix_number = number_range ( 0, MAX_SUFFIX-1 ); pslevel += suffix_table[suffix_number].level; } } buf_short[0]='\0'; if( rand_type == 2 ) strcat(buf_short,"Exceptional "); else if(rand_type == 1) strcat(buf_short,"Cracked "); if( add_prefix ) { // Add the Prefix strcat(buf_short, prefix_table[prefix_number].name); strcat(buf_short, " "); // Add the affects of the prefix process_mods( obj, prefix_number, TRUE ); // Compute align of object with prefix modifier align += prefix_table[prefix_number].align; } // Add obj->short_descr to the total buf_short string strcat(buf_short, obj->short_descr); if ( add_suffix ) { // Add the Suffix strcat(buf_short, " of "); strcat(buf_short, suffix_table[suffix_number].name); // Add the affects of the suffix process_mods( obj, suffix_number, FALSE ); // Compute align of object with suffix modifier align += suffix_table[suffix_number].align; } // Add alignment restrictions based on object alignment if (align >= 600) { SET_BIT(obj->extra_flags,ITEM_ANTI_EVIL); SET_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL); } else if (align >=300 && align < 600) SET_BIT(obj->extra_flags,ITEM_ANTI_EVIL); else if (align > -600 && align <= -300 ) SET_BIT(obj->extra_flags,ITEM_ANTI_GOOD); else if (align <= -600) { SET_BIT(obj->extra_flags,ITEM_ANTI_GOOD); SET_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL); } // If suffix or prefix only, increase suff or pref level to make pslevel if ((add_prefix && !add_suffix) || (add_suffix && !add_prefix)) { pslevel *= 5; pslevel /= 3; } // Set object level to combined pre/suffix level or 101.. whichever is lower obj->level = UMAX ( pslevel, obj->level ); obj->level = UMIN ( obj->level, 101 ); // Assign buf_short as the item's short description obj->short_descr = str_dup ( buf_short ); // Add the word 'special' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); if(add_suffix) { strcat(buf_name, " "); strcat(buf_name, suffix_table[suffix_number].name); } if(add_prefix) { strcat(buf_name, " "); strcat(buf_name, prefix_table[prefix_number].name); } // Add Quality identifiers if( rand_type == 2 ) strcat(buf_name," exceptional"); else if(rand_type == 1) strcat(buf_name," cracked"); strcat(buf_name," special"); } // Regular Objects - 75% else { // Pick only objects that are at or below the level of the killed mobile rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); // while( obj->level > ( mob_level - 20 ) ) //asdf while( obj->level > ( mob_level <= 20 ? 1 : mob_level - 20 ) ) { rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); } // Exceptional if( (rand_number2 = number_percent()) < 15 ) { rand_type = 2; obj = make_exceptional(obj); buf_short[0]='\0'; strcat(buf_short,"exceptional "); strcat(buf_short,obj->short_descr); obj->short_descr = str_dup(buf_short); // Add the word 'exceptional' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," exceptional"); } else if (rand_number2 > 85) { rand_type = 1; obj = make_cracked(obj); buf_short[0]='\0'; strcat(buf_short,"cracked "); strcat(buf_short,obj->short_descr); obj->short_descr = str_dup(buf_short); // Add the word 'cracked' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," cracked"); } else { // Add the word 'normal' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," normal"); } } // Add specially flagged name 'normal', 'special', or 'unique' obj->name = str_dup( buf_name ); // Object level is somewhere between the mob and object levels // Price depending on the quality if(rand_type == 1) obj->cost = ( obj->level * 500 ); else if(rand_type == 2) obj->cost = ( obj->level * 1500 ); else obj->cost = ( obj->level * 1000 ); /* obj->level = number_range( mob_level, obj->level ); */ if (obj->level > 101) obj->level = 101; // Return object return obj; } void process_mods ( OBJ_DATA *rand_obj, int mod_number, bool prefix ) { AFFECT_DATA *Af; int value = 0; if (prefix) { if ( prefix_table[mod_number].affect != NO_FLAG) { // Add Affect Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_AFFECTS; Af->type = -1; Af->duration = -1; Af->bitvector = prefix_table[mod_number].affect; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( prefix_table[mod_number].resist != NO_FLAG) { // Add Resistance Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_RESIST; Af->type = -1; Af->duration = -1; Af->bitvector = prefix_table[mod_number].resist; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( prefix_table[mod_number].vulner != NO_FLAG) { // Add Vulnerability Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_VULN; Af->type = -1; Af->duration = -1; Af->bitvector = prefix_table[mod_number].vulner; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( prefix_table[mod_number].mod_one != APPLY_NONE) { // Add First Apply value = number_range(prefix_table[mod_number].min_one, prefix_table[mod_number].max_one); Af = new_affect(); Af->location = prefix_table[mod_number].mod_one; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( prefix_table[mod_number].mod_two != APPLY_NONE) { // Add Second Apply value = number_range(prefix_table[mod_number].min_two, prefix_table[mod_number].max_two); Af = new_affect(); Af->location = prefix_table[mod_number].mod_two; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( prefix_table[mod_number].mod_three != APPLY_NONE) { // Add Third Apply value = number_range(prefix_table[mod_number].min_three, prefix_table[mod_number].max_three); Af = new_affect(); Af->location = prefix_table[mod_number].mod_three; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } } else { if ( suffix_table[mod_number].affect != NO_FLAG) { // Add Affect Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_AFFECTS; Af->type = -1; Af->duration = -1; Af->bitvector = suffix_table[mod_number].affect; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].resist != NO_FLAG) { // Add Resistance Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_RESIST; Af->type = -1; Af->duration = -1; Af->bitvector = suffix_table[mod_number].resist; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].vulner != NO_FLAG) { // Add Vulnerability Af = new_affect(); Af->location = APPLY_NONE; Af->modifier = 0; Af->where = TO_VULN; Af->type = -1; Af->duration = -1; Af->bitvector = suffix_table[mod_number].vulner; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].mod_one == APPLY_MORPH_FORM || suffix_table[mod_number].mod_two == APPLY_MORPH_FORM || suffix_table[mod_number].mod_three == APPLY_MORPH_FORM) { if ( suffix_table[mod_number].mod_one != APPLY_NONE) { // Add First Apply value = number_range(suffix_table[mod_number].min_one, suffix_table[mod_number].max_one); Af = new_affect(); Af->location = suffix_table[mod_number].mod_one; Af->modifier = value; Af->where = TO_OBJECT; Af->type = gsn_conceal; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].mod_two != APPLY_NONE) { // Add Second Apply value = number_range(suffix_table[mod_number].min_two, suffix_table[mod_number].max_two); Af = new_affect(); Af->location = suffix_table[mod_number].mod_two; Af->modifier = value; Af->where = TO_OBJECT; Af->type = gsn_conceal; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].mod_three != APPLY_NONE) { // Add Third Apply value = number_range(suffix_table[mod_number].min_three, suffix_table[mod_number].max_three); Af = new_affect(); Af->location = suffix_table[mod_number].mod_three; Af->modifier = value; Af->where = TO_OBJECT; Af->type = gsn_conceal; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } } else { if ( suffix_table[mod_number].mod_one != APPLY_NONE) { // Add First Apply value = number_range(suffix_table[mod_number].min_one, suffix_table[mod_number].max_one); Af = new_affect(); Af->location = suffix_table[mod_number].mod_one; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].mod_two != APPLY_NONE) { // Add Second Apply value = number_range(suffix_table[mod_number].min_two, suffix_table[mod_number].max_two); Af = new_affect(); Af->location = suffix_table[mod_number].mod_two; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } if ( suffix_table[mod_number].mod_three != APPLY_NONE) { // Add Third Apply value = number_range(suffix_table[mod_number].min_three, suffix_table[mod_number].max_three); Af = new_affect(); Af->location = suffix_table[mod_number].mod_three; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = rand_obj->level; Af->next = rand_obj->affected; rand_obj->affected = Af; } } } } // For Immortal Loading...SPECIFICS :) - Skyntil OBJ_DATA *rand_obj2(CHAR_DATA *ch, int mob_level, char *argument ) { OBJ_DATA *obj; char buf_name[MSL/2]; char buf_short[MSL/2]; char arg1[MSL/4]; char arg2[MSL/4]; char arg3[MSL/4]; int rand_number = 0; char *prefix = NULL; char *suffix = NULL; argument = one_argument(argument,arg1); // Type argument = one_argument(argument,arg2); // Prefix argument = one_argument(argument,arg3); // Suffix if(arg1[0] == '\0') // No Type submitted.. { send_to_char("Syntax: randobj2 <type> <prefix> <suffix>\n\r",ch); send_to_char("Type 'randobj2 list' for a list of types.\n\r",ch); send_to_char("Prefix and Suffix only accepted IF type is 4,5, or 6.\n\r",ch); send_to_char("If type is 4,5, or 6, if Pre/Suf is left blank, they will be randomly chosen.\n\r",ch); send_to_char("If you want Suf only, type 'none' in place of the prefix.\n\r",ch); return NULL; } else if(arg1[0] != '\0') // Picked a Type... { if(!str_cmp(arg1,"list")) { show_randobj2_types_cmds(ch); return NULL; } else if(!str_cmp(arg1,"unique")) { rand_number = number_range(LOWER_UNIQUE_VNUM, UPPER_UNIQUE_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); while( obj->level > ( mob_level + 1 ) ) { rand_number = number_range(LOWER_UNIQUE_VNUM, UPPER_UNIQUE_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); } // Add the word 'unique' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," unique"); obj->name = str_dup( buf_name ); obj->cost = ( obj->level * 1000 ); if (obj->level > 101) obj->level = 101; return obj; } else { rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); while( obj->level > ( mob_level + 1 ) ) { rand_number = number_range(LOWER_RANDOM_VNUM, UPPER_RANDOM_VNUM); obj = create_object( get_obj_index ( rand_number ), 0 ); } if(IS_SET(obj->extra_flags,ITEM_NOPURGE)) REMOVE_BIT(obj->extra_flags,ITEM_NOPURGE); if(IS_SET(obj->extra_flags,ITEM_NOSAC)) REMOVE_BIT(obj->extra_flags,ITEM_NOSAC); if(!str_cmp(arg1,"normal")) { // Add the word 'normal' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," normal"); obj->name = str_dup( buf_name ); obj->cost = ( obj->level * 1000 ); if (obj->level > 101) obj->level = 101; return obj; } else if(!str_cmp(arg1,"cracked")) { obj = make_cracked(obj); buf_short[0]='\0'; strcat(buf_short,"cracked "); strcat(buf_short,obj->short_descr); obj->short_descr = str_dup(buf_short); // Add the word 'cracked' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," cracked"); obj->name = str_dup( buf_name ); obj->cost = ( obj->level * 500 ); if (obj->level > 101) obj->level = 101; return obj; } else if(!str_cmp(arg1,"exceptional")) { obj = make_exceptional(obj); buf_short[0]='\0'; strcat(buf_short,"exceptional "); strcat(buf_short,obj->short_descr); obj->short_descr = str_dup(buf_short); // Add the word 'exceptional' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); strcat(buf_name," exceptional"); obj->name = str_dup( buf_name ); obj->cost = ( obj->level * 1500 ); if (obj->level > 101) obj->level = 101; return obj; } else if(!str_cmp(arg1,"special")) { if(arg2[0] == '\0') { prefix = NULL; suffix = NULL; } else if(arg2[0] != '\0') { if(!str_cmp(arg2,"none")) { prefix = NULL; } else if(!str_cmp(arg2,"list")) { show_prefixes(ch); return NULL; } else { if(is_prefix(arg2)) prefix = arg2; else { send_to_char("That is not a valid Prefix. Try 'List' for choices.\n\r",ch); return NULL; } } if(arg3[0] == '\0') suffix = NULL; else if(arg3[0] != '\0') { if(!str_cmp(arg3,"list")) { show_suffixes(ch); return NULL; } if(is_suffix(arg3)) suffix = arg3; else { send_to_char("That is not a valid Suffix. Try 'List' for choices.\n\r",ch); return NULL; } } } obj = make_special(obj, mob_level, 0, prefix, suffix); obj->cost = ( obj->level * 1000 ); if (obj->level > 101) obj->level = 101; return obj; } else if(!str_cmp(arg1,"cspecial")) { if(arg2[0] == '\0') { prefix = NULL; suffix = NULL; } else if(arg2[0] != '\0') { if(!str_cmp(arg2,"none")) { prefix = NULL; } else if(!str_cmp(arg2,"list")) { show_prefixes(ch); return NULL; } else { if(is_prefix(arg2)) prefix = arg2; else { send_to_char("That is not a valid Prefix. Try 'List' for choices.\n\r",ch); return NULL; } } if(arg3[0] == '\0') suffix = NULL; else if(arg3[0] != '\0') { if(!str_cmp(arg3,"list")) { show_suffixes(ch); return NULL; } if(is_suffix(arg3)) suffix = arg3; else { send_to_char("That is not a valid Suffix. Try 'List' for choices.\n\r",ch); return NULL; } } } obj = make_cracked(obj); obj = make_special(obj, mob_level, 1, prefix, suffix); obj->cost = ( obj->level * 500 ); if (obj->level > 101) obj->level = 101; return obj; } else if(!str_cmp(arg1,"especial")) { if(arg2[0] == '\0') { prefix = NULL; suffix = NULL; } else if(arg2[0] != '\0') { if(!str_cmp(arg2,"none")) { prefix = NULL; } else if(!str_cmp(arg2,"list")) { show_prefixes(ch); return NULL; } else { if(is_prefix(arg2)) prefix = arg2; else { send_to_char("That is not a valid Prefix. Try 'List' for choices.\n\r",ch); return NULL; } } if(arg3[0] == '\0') suffix = NULL; else if(arg3[0] != '\0') { if(!str_cmp(arg3,"list")) { show_suffixes(ch); return NULL; } if(is_suffix(arg3)) suffix = arg3; else { send_to_char("That is not a valid Suffix. Try 'List' for choices.\n\r",ch); return NULL; } } } obj = make_exceptional(obj); obj = make_special(obj, mob_level, 2, prefix, suffix); obj->cost = ( obj->level * 1500 ); if (obj->level > 101) obj->level = 101; return obj; } else { send_to_char("That is not a valid type.\n\r",ch); return NULL; } } } return NULL; } void show_randobj2_types_cmds( CHAR_DATA *ch ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; int cmd; int col; buf1[0] = '\0'; col = 0; for (cmd = 0; arg_table[cmd].type != NULL; cmd++) { sprintf( buf, "%d. %-15.15s - %s.\n\r", arg_table[cmd].index, arg_table[cmd].type, arg_table[cmd].desc ); strcat( buf1, buf ); if ( ++col % 5 == 0 ) strcat( buf1, "\n\r" ); } if ( col % 5 != 0 ) strcat( buf1, "\n\r" ); send_to_char( buf1, ch ); return; } OBJ_DATA *make_cracked(OBJ_DATA *obj) { if(obj->item_type == ITEM_WEAPON) { obj->value[1] -= number_range(0,1); obj->value[2] -= number_range(0,1); } else if(obj->item_type == ITEM_ARMOR) { obj->value[1] -= number_range(0,8); obj->value[2] -= number_range(0,8); obj->value[3] -= number_range(0,8); obj->value[4] -= number_range(0,8); } return obj; } OBJ_DATA *make_exceptional(OBJ_DATA *obj) { int rand_weapon_flag = 0; int rand_number = 0; AFFECT_DATA *Af; int value = 0; if(obj->item_type == ITEM_WEAPON) { /* Removed by Tien - No addition of dice from Tas. obj->value[1] += number_range(0,2); obj->value[2] += number_range(0,2); */ switch( dice(1, 10) ) { case 1: rand_weapon_flag = WEAPON_ACIDIC; break; case 2: rand_weapon_flag = WEAPON_SHOCKING; break; case 3: rand_weapon_flag = WEAPON_VORPAL; break; case 4: rand_weapon_flag = WEAPON_FROST; break; case 5: rand_weapon_flag = WEAPON_POISON; break; case 6: rand_weapon_flag = WEAPON_VAMPIRIC; break; case 7: rand_weapon_flag = WEAPON_FLAMING; break; /* case 8: obj->value[1] += number_range(0,1); break; case 9: obj->value[2] += number_range(0,1); break; */ default: break; } // Add the random flag if (rand_weapon_flag != 0) SET_BIT(obj->value[4], rand_weapon_flag); } else if(obj->item_type == ITEM_ARMOR) { obj->value[1] += number_range(0,10); obj->value[2] += number_range(0,10); obj->value[3] += number_range(0,10); obj->value[4] += number_range(0,10); switch( dice(1, 8) ) { case 1: rand_weapon_flag = ITEM_MAGIC; break; case 2: rand_weapon_flag = ITEM_HUM; break; case 3: rand_weapon_flag = ITEM_BLESS; break; case 4: rand_weapon_flag = ITEM_GLOW; break; case 5: rand_weapon_flag = ITEM_EVIL; break; default: break; } if (rand_weapon_flag != 0) SET_BIT(obj->value[4], rand_weapon_flag); } //Now for some random Applies.... if(number_percent() > 50) { rand_number = number_range(0, MAX_EXCEP_APPLY); if ( eapply_table[rand_number].apply_type != 0) { // Add First Apply value = number_range(eapply_table[rand_number].min, eapply_table[rand_number].max); Af = new_affect(); Af->location = eapply_table[rand_number].apply_type; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = obj->level; Af->next = obj->affected; obj->affected = Af; } } if(number_percent() < 25) { rand_number = number_range(0, MAX_EXCEP_APPLY); if ( eapply_table[rand_number].apply_type != 0) { // Add First Apply value = number_range(eapply_table[rand_number].min, eapply_table[rand_number].max); Af = new_affect(); Af->location = eapply_table[rand_number].apply_type; Af->modifier = value; Af->where = TO_OBJECT; Af->type = -1; Af->duration = -1; Af->bitvector = 0; Af->level = obj->level; Af->next = obj->affected; obj->affected = Af; } } return obj; } OBJ_DATA *make_special(OBJ_DATA *obj, int mob_level, int rand_type, char *prefix, char *suffix) { int rand_number = 0; bool add_prefix = FALSE; bool add_suffix = FALSE; char buf_short[MSL/2]; int tolerance = 2; int pslevel = 0; bool roll = FALSE; int prefix_number = 0; int suffix_number = 0; char buf_name[MSL/2]; int align = 0; //Sent Prefix if(prefix != NULL && suffix == NULL) { prefix_number = prefix_lookup(prefix); if(prefix_number == -1) prefix_number = number_range ( 0, MAX_PREFIX-1 ); add_prefix = TRUE; add_suffix = FALSE; pslevel = prefix_table[prefix_number].level; } else if(prefix == NULL && suffix != NULL) { suffix_number = suffix_lookup(suffix); if(suffix_number == -1) suffix_number = number_range ( 0, MAX_SUFFIX-1 ); add_suffix = TRUE; add_prefix = FALSE; pslevel = suffix_table[suffix_number].level; } else if(prefix != NULL && suffix != NULL) { prefix_number = prefix_lookup(prefix); if(prefix_number == -1) prefix_number = number_range ( 0, MAX_PREFIX-1 ); suffix_number = suffix_lookup(suffix); if(suffix_number == -1) suffix_number = number_range ( 0, MAX_SUFFIX-1 ); add_prefix = TRUE; add_suffix = TRUE; pslevel = prefix_table[prefix_number].level; pslevel += suffix_table[suffix_number].level; } else { // Prefix, Suffix or Both? rand_number = dice ( 1, 3 ); if ( rand_number == 1 ) { add_prefix = TRUE; } else if ( rand_number == 2 ) { add_suffix = TRUE; } else { add_prefix = TRUE; add_suffix = TRUE; } buf_short[0] = '\0'; // Pick out Prefix/Suffix and be sure that the levels of the two // combined is less than or equal to the mob's level while ((( pslevel ) > mob_level + tolerance) || roll == FALSE ) { roll = TRUE; pslevel = 0; if ( add_prefix ) { // Pick Prefix prefix_number = number_range ( 0, MAX_PREFIX-1 ); pslevel = prefix_table[prefix_number].level; } if ( add_suffix ) { // Pick Suffix suffix_number = number_range ( 0, MAX_SUFFIX-1 ); pslevel += suffix_table[suffix_number].level; } // Make suffix or prefix-only items higher level ( level * 3/2 ) if (!add_suffix || !add_prefix) { pslevel *=3; pslevel /=2; } } } buf_short[0]='\0'; if( rand_type == 2 ) strcat(buf_short,"Exceptional "); else if(rand_type == 1) strcat(buf_short,"Cracked "); if( add_prefix ) { // Add the Prefix strcat(buf_short, prefix_table[prefix_number].name); strcat(buf_short, " "); // Add the affects of the prefix process_mods( obj, prefix_number, TRUE ); // Compute align of object with prefix modifier align += prefix_table[prefix_number].align; } // Add obj->short_descr to the total buf_short string strcat(buf_short, obj->short_descr); if ( add_suffix ) { // Add the Suffix strcat(buf_short, " of "); strcat(buf_short, suffix_table[suffix_number].name); // Add the affects of the suffix process_mods( obj, suffix_number, FALSE ); // Compute align of object with suffix modifier align += suffix_table[suffix_number].align; } // Add alignment restrictions based on object alignment if (align >= 600) { SET_BIT(obj->extra_flags,ITEM_ANTI_EVIL); SET_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL); } else if (align >=300 && align < 600) SET_BIT(obj->extra_flags,ITEM_ANTI_EVIL); else if (align > -600 && align <= -300 ) SET_BIT(obj->extra_flags,ITEM_ANTI_GOOD); else if (align <= -600) { SET_BIT(obj->extra_flags,ITEM_ANTI_GOOD); SET_BIT(obj->extra_flags,ITEM_ANTI_NEUTRAL); } // Set object level to combined pre/suffix level or 101.. whichever is lower obj->level = UMIN ( pslevel, 101 ); // Assign buf_short as the item's short description obj->short_descr = str_dup ( buf_short ); // Add the word 'special' to the item name for easy location buf_name[0]='\0'; strcat(buf_name,str_dup(obj->name)); if(add_suffix) { strcat(buf_name, " "); strcat(buf_name, suffix_table[suffix_number].name); } if(add_prefix) { strcat(buf_name, " "); strcat(buf_name, prefix_table[prefix_number].name); } // Add Quality identifiers if( rand_type == 2 ) strcat(buf_name," exceptional"); else if(rand_type == 1) strcat(buf_name," cracked"); strcat(buf_name," special"); obj->name = str_dup( buf_name ); return obj; } bool is_prefix(char *word) { int pre; bool ispre = FALSE; for(pre = 0; prefix_table[pre].name != NULL; pre++) { if(!str_cmp(prefix_table[pre].name,word)) ispre = TRUE; } return ispre; } bool is_suffix(char *word) { int suf; bool issuf = FALSE; for(suf = 0; suffix_table[suf].name != NULL; suf++) { if(!str_cmp(suffix_table[suf].name,word)) issuf = TRUE; } return issuf; } void show_prefixes( CHAR_DATA *ch ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; int cmd; int col; buf1[0] = '\0'; col = 0; for (cmd = 0; prefix_table[cmd].name != NULL; cmd++) { sprintf( buf, "%-15.15s ", prefix_table[cmd].name); strcat( buf1, buf ); if ( ++col % 5 == 0 ) strcat( buf1, "\n\r" ); } if ( col % 5 != 0 ) strcat( buf1, "\n\r" ); send_to_char( buf1, ch ); return; } void show_suffixes( CHAR_DATA *ch ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; int cmd; int col; buf1[0] = '\0'; col = 0; for (cmd = 0; suffix_table[cmd].name != NULL; cmd++) { sprintf( buf, "%-15.15s ", suffix_table[cmd].name); strcat( buf1, buf ); if ( ++col % 5 == 0 ) strcat( buf1, "\n\r" ); } if ( col % 5 != 0 ) strcat( buf1, "\n\r" ); send_to_char( buf1, ch ); return; } int prefix_lookup(char *prefix) { int number; for (number = 0; prefix_table[number].name != NULL; number++) { if(!str_cmp(prefix_table[number].name,prefix)) return number; } return number; } int suffix_lookup(char *suffix) { int number; for (number = 0; suffix_table[number].name != NULL; number++) { if(!str_cmp(suffix_table[number].name,suffix)) return number; } return -1; }