asgard/
asgard/.settings/
asgard/area/
asgard/data/clans/
asgard/data/clans/history/
asgard/data/rosters/
asgard/src/notice/
/***************************************************************************
 *  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	828
#define LOWER_UNIQUE_VNUM	850
#define UPPER_UNIQUE_VNUM	903
#define MAX_PREFIX		108 // was 90
#define MAX_SUFFIX              129 //was 130
#define MAX_EXCEP_APPLY         13 //don't just blindly change this # if you don't understand it!
// Local Functions
void process_mods( OBJ_DATA * rand_obj, int mod_number, bool prefix );
OBJ_DATA * rand_obj(CHAR_DATA * ch, int mob_level );
OBJ_DATA * rand_obj2(CHAR_DATA * ch, int mob_level, char *argument );
OBJ_DATA * make_cracked(OBJ_DATA *obj);
OBJ_DATA * make_exceptional(OBJ_DATA *obj);
OBJ_DATA * make_special(OBJ_DATA *obj, int mob_level, int rand_type, char *prefix, char *suffix);
void show_randobj2_types_cmds( CHAR_DATA *ch );
bool is_prefix(char *word);
bool is_suffix(char *word);
int prefix_lookup(char *prefix);
int suffix_lookup(char *suffix);
void show_prefixes( CHAR_DATA *ch );
void show_suffixes( 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, 50 },
{ APPLY_MOVE, 1, 50 },
{ APPLY_HIT, 1, 50 },
{ APPLY_HITROLL, 1, 10 },
{ APPLY_DAMROLL, 1, 10 },
{ APPLY_SAVES, -1, -3 },
{ APPLY_AC, -1, -15 },
{ 0, 0, 0 } };

const struct prefix_data prefix_table[MAX_PREFIX + 1] =
{
/* 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", 75, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_MANA, 75, 150, APPLY_SAVES,
		-5, -2, APPLY_INT, 1, 3 },

{ "Crippling", 30, 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      */

{ "Hateful", 90, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -30, 30,
		APPLY_DAMROLL, -15, 15, APPLY_HITROLL, -15, 15 },

{ "Altruistic", 75, 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, -5, APPLY_AGE,
		-20, -3, APPLY_DAMROLL, 5, 10 },

{ "Durable", 30, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -14, -6, 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, -37, -35,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Awesome", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -40, -37, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Hellish", 90, -700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_AC, -45, -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, -45, 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", 10, -100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 3, 5,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Heavy", 20, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Vicious", 30, -150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Brutal", 45, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 9, 11,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Massive", 60, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 11, 15,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Savage", 75, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 13, 18,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Righteous", 90, 300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 15, 22,
		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", 99, -400, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 19, 27,
		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", 5, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 3, 5, APPLY_NONE, 0,
		0, APPLY_NONE, 0, 0 },

{ "Steel", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 5, 7, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Silver", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 7, 9, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Gold", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 9, 11, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Platinum", 55, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_HITROLL, 11, 15,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Mithril", 70, 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", 5, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 3, 5,
		APPLY_HITROLL, 3, 5, APPLY_NONE, 0, 0 },

{ "Soldier's", 15, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7,
		APPLY_HITROLL, 5, 7, APPLY_NONE, 0, 0 },

{ "Knight's", 25, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9,
		APPLY_HITROLL, 7, 9, APPLY_NONE, 0, 0 },

{ "Lord's", 40, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 9, 11,
		APPLY_HITROLL, 9, 11, APPLY_NONE, 0, 0 },

{ "Master's", 55, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 11, 15,
		APPLY_HITROLL, 11, 15, APPLY_NONE, 0, 0 },

{ "Champion's", 70, 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, 23,
		APPLY_HITROLL, 18, 23, APPLY_NONE, 0, 0 },

{ "King's", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 20, 27,
		APPLY_HITROLL, 20, 27, 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", 5, 150, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -2, -1, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Amber", 15, 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, -8, -7, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

/* START OF RESIST ITEMS                           */

{ "Ruby", 90, 0, NO_FLAG, RES_FIRE, NO_FLAG, APPLY_HIT, -150, 50, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Coral", 90, 0, NO_FLAG, RES_LIGHTNING, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Viridian", 90, 0, NO_FLAG, RES_POISON, NO_FLAG, APPLY_HIT, 0, 0, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Sapphire", 90, 0, NO_FLAG, RES_COLD, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Beryl", 90, 0, NO_FLAG, RES_ACID, NO_FLAG, APPLY_HIT, -150, 50, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Mirrored", 90, 0, NO_FLAG, RES_NEGATIVE, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Dark", 90, -300, NO_FLAG, RES_HOLY, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Azure", 90, 0, NO_FLAG, RES_MENTAL, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Prismatic", 90, 0, NO_FLAG, RES_SOUND, NO_FLAG, APPLY_HIT, -150, 50,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Black", 90, 0, NO_FLAG, RES_LIGHT, NO_FLAG, APPLY_HIT, -150, 50, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Lapis", 90, 0, NO_FLAG, RES_DISEASE, NO_FLAG, APPLY_HIT, 0, 0, APPLY_NONE,
		0, 0, APPLY_NONE, 0, 0 },

{ "Vibrant", 90, 0, NO_FLAG, RES_CHARM, NO_FLAG, APPLY_HIT, 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_AC, 10, 30,
		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_CON, -1, -5,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Deadened", 15, 0, AFF_WEAKEN, NO_FLAG, NO_FLAG, APPLY_STR, -1, -5,
		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 } }; // 110 items


const struct suffix_data suffix_table[MAX_SUFFIX + 1] =
{
/*  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", 15, -100, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 5, 7,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Slaying", 30, -200, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 7, 9,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Gore", 45, -300, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_DAMROLL, 10, 15,
		APPLY_NONE, 0, 0, APPLY_NONE, 0, 0 },

{ "Carnage", 65, -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, 10, 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, 6, 8, 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, 6, 8, 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, 6, 8, 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, 6, 8, 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, 6, 8,
		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 },

{ "the Sun", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_INT, 5, 6, APPLY_WIS, 5,
		6, APPLY_DEX, 5, 6 },

{ "the Earth", 80, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 5, 6, APPLY_INT, 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, 150,
		APPLY_MANA, 40, 150, APPLY_MOVE, 40, 150 },

{ "Tyr", 25, 700, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_STR, 1, 6, APPLY_HITROLL, 7,
		15, APPLY_DAMROLL, 7, 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, -45, -15 },

/* 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, 25, 35 },

{ "Grim", 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 },

{ "Nico", 101, 0, NO_FLAG, NO_FLAG, NO_FLAG, APPLY_SAVES, -7, -12, APPLY_AC,
		-30, -15, APPLY_HITROLL, 20, 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 },

{ "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 } }; // 131 (without Cheetah)

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 - 24%
	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 - 10))
		{
			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()) < 20)
		{
			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;
}