legend/
legend/area/
legend/player/
/*** ITEMS.C - Randomly Generated Items ***/


#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"


#define OBJMOD_MAX	54	// Number of Mods in the Table
#define OBJMOD_ALL	0	// Can Modify Any Item
#define OBJMOD_WEAPON	1	// Only Modifies Weapons
#define OBJMOD_ARMOR	2	// Only Modifies Armor


// Modifier List

// +Hitroll
#define OMOD_BRONZE	101
#define OMOD_GOLD	102
#define OMOD_VISIONARY	103

// +% Dam (WEAPON)
#define OMOD_VICIOUS	201
#define OMOD_BRUTAL	202
#define OMOD_MERCILESS	203
#define OMOD_CRUEL	204

// +% AC (ARMOR)
#define OMOD_STURDY	301
#define OMOD_BLESSED	302
#define OMOD_SAINTLY	303
#define OMOD_GODLY	304

// +Mana
#define OMOD_LIZARDS	401
#define OMOD_SERPENTS	402
#define OMOD_WYRMS	403

// +Move
#define OMOD_RUGGED	501
#define OMOD_TIRELESS	502

// +Str
#define OMOD_OX		601
#define OMOD_ATLAS	602

// +Dex
#define OMOD_ACCURACY	701
#define OMOD_PRECISION	702

// +Damroll
#define OMOD_MAIMING	801
#define OMOD_GORE	802
#define OMOD_BUTCHERING	803

// +HP
#define OMOD_JACKAL	901
#define OMOD_MAMMOTH	902
#define OMOD_WHALE	903

// +Wis/Int
#define OMOD_MIND	1001
#define OMOD_BRILLIANCE	1002
#define OMOD_WIZARDRY	1003

// Item Spells (ARMOR)
#define OMOD_GARNET	1101	// FireShield
#define OMOD_COBALT	1102	// IceShield
#define OMOD_CORAL	1103	// ShockShield
#define OMOD_JADE	1104	// AcidShield
#define OMOD_RAINBOW	1105	// ChaosShield
#define OMOD_SWIFTNESS	1106	// Speed
#define OMOD_REGROWTH	1107	// Regenerate
#define OMOD_ABSORPTION	1108	// Sanctuary
#define OMOD_LIGHT	1109	// Infravision
#define OMOD_RADIANCE	1110	// DetectInvis
#define OMOD_SHADOW	1111	// Sneak
#define OMOD_SENSEI	1112	// Flying
#define OMOD_TRANSPORT	1113	// PassDoor

// -Saves
#define OMOD_WARDING	1201
#define OMOD_NEGATION	1202	

// Weapon Spells (WEAPON)
#define OMOD_PIERCING	1301	// Vorpal
#define OMOD_WINTER	1302	// FrostBreath
#define OMOD_FLAME	1303	// Fireball
#define OMOD_SHOCK	1304	// LightningBolt
#define OMOD_VENOM	1305	// Poison
#define OMOD_LOCUST	1306	// EnergyDrain

// -AC
#define OMOD_FAITHFUL	1401

// +Hitroll & +Damroll
#define OMOD_KNIGHTS	1501
#define OMOD_LORDS	1502
#define OMOD_KINGS	1503



struct objmod_type
{
	int	mod_num;	// OMOD_??? Number
	int	mod_type;	// OBJMOD_ALL | OBJMOD_WEAPON | OBJMOD_ARMOR
	int	level;		// Level Required for Mob to pop Mod
	char magic_fmt[100];	// Format used for Magic Creation
	char rare_adj[50];	// Adjective Used for Rare Creation
};

const struct objmod_type	obj_mod[OBJMOD_MAX] =
{
	{ OMOD_BRONZE,		OBJMOD_ALL,	 0,	"#oBronze#n %s",		"#oHawkeye#n"	},
	{ OMOD_GOLD,		OBJMOD_ALL,	25,	"#yGold#n %s",			"#oHawkeye#n"	},
	{ OMOD_VISIONARY,	OBJMOD_ALL,	50,	"#wVisionary#n %s",		"#oHawkeye#n"	},

	{ OMOD_VICIOUS,		OBJMOD_WEAPON,	15,	"#rVicious#n %s",		"#rSavage#n"	},
	{ OMOD_BRUTAL,		OBJMOD_WEAPON,	25,	"#rBrutal#n %s",		"#rSavage#n"	},
	{ OMOD_MERCILESS,	OBJMOD_WEAPON,	50,	"#rMerciless#n %s",		"#rSavage#n"	},
	{ OMOD_CRUEL,		OBJMOD_WEAPON,	75,	"#RCruel#n %s",			"#rSavage#n"	},

	{ OMOD_STURDY,		OBJMOD_ARMOR,	10,	"#cSturdy#n %s",		"#wHoly#n"	},
	{ OMOD_BLESSED,		OBJMOD_ARMOR,	20,	"#CBlessed#n %s",		"#wHoly#n"	},
	{ OMOD_SAINTLY,		OBJMOD_ARMOR,	30,	"#wSaintly#n %s",		"#wHoly#n"	},
	{ OMOD_GODLY,		OBJMOD_ARMOR,	50,	"#wGodly#n %s",			"#wHoly#n"	},

	{ OMOD_LIZARDS,		OBJMOD_ALL,	 0,	"#gLizard's#n %s",		"#gDragon#n"	},
	{ OMOD_SERPENTS,	OBJMOD_ALL,	15,	"#gSerpent's#n %s",		"#gDragon#n"	},
	{ OMOD_WYRMS,		OBJMOD_ALL,	30,	"#gWyrm's#n %s",		"#gDragon#n"	},

	{ OMOD_RUGGED,		OBJMOD_ALL,	 0,	"#oRugged#n %s",		"#cVigor#n"	},
	{ OMOD_TIRELESS,	OBJMOD_ALL,	20,	"#cTireless#n %s",		"#cVigor#n"	},

	{ OMOD_OX,		OBJMOD_ALL,	 0,	"%s of the #wOx#n",		"#oTitan#n"	},
	{ OMOD_ATLAS,		OBJMOD_ALL,	25,	"%s of #oAtlas#n",		"#oTitan#n"	},

	{ OMOD_ACCURACY,	OBJMOD_ALL,	 0,	"%s of #CAccuracy#n",		"#CNirvana#n"	},
	{ OMOD_PRECISION,	OBJMOD_ALL,	25,	"%s of #CPrecision#n",		"#CNirvana#n"	},

	{ OMOD_MAIMING,		OBJMOD_ALL,	 0,	"%s of #rMaiming#n",		"#rCarnage#n"	},
	{ OMOD_GORE,		OBJMOD_ALL,	25,	"%s of #rGore#n",		"#rCarnage#n"	},
	{ OMOD_BUTCHERING,	OBJMOD_ALL,	50,	"%s of #rButchering#n",		"#rCarnage#n"	},

	{ OMOD_JACKAL,		OBJMOD_ALL,	 0,	"%s of the #oJackal#n",		"#oTiger#n"	},
	{ OMOD_MAMMOTH,		OBJMOD_ALL,	15,	"%s of the #rMammoth#n",	"#oTiger#n"	},
	{ OMOD_WHALE,		OBJMOD_ALL,	30,	"%s of the #bWhale#n",		"#oTiger#n"	},

	{ OMOD_MIND,		OBJMOD_ALL,	 0,	"%s of the #BMind#n",		"#BSorcery#n"	},
	{ OMOD_BRILLIANCE,	OBJMOD_ALL,	10,	"%s of #BBrilliance#n",		"#BSorcery#n"	},
	{ OMOD_WIZARDRY,	OBJMOD_ALL,	30,	"%s of #BWizardry#n",		"#BSorcery#n"	},

	{ OMOD_GARNET,		OBJMOD_ARMOR,	25,	"#rGarnet#n %s",		"#rGarnet#n"	},
	{ OMOD_COBALT,		OBJMOD_ARMOR,	25,	"#CCobalt#n %s",		"#CCobalt#n"	},
	{ OMOD_CORAL,		OBJMOD_ARMOR,	25,	"#oCoral#n %s",			"#yCoral#n"	},
	{ OMOD_JADE,		OBJMOD_ARMOR,	25,	"#gJade#n %s",			"#gJade#n"	},
	{ OMOD_RAINBOW,		OBJMOD_ARMOR,	75,	"#PRainbow#n %s",		"#PRainbow#n"	},
	{ OMOD_SWIFTNESS,	OBJMOD_ARMOR,	75,	"%s of #wSwiftness#n",		"#wSwift#n"	},
	{ OMOD_REGROWTH,	OBJMOD_ARMOR,	50,	"%s of #GRegrowth#n",		"#GRegrowth#n"	},
	{ OMOD_ABSORPTION,	OBJMOD_ARMOR,	25,	"%s of #wAbsorption#n",		"#wAbsorb#n"	},
	{ OMOD_LIGHT,		OBJMOD_ARMOR,	10,	"%s of #wLight#n",		"#ySun#n"	},
	{ OMOD_RADIANCE,	OBJMOD_ARMOR,	25,	"%s of #yRadiance#n",		"#ySun#n"	},
	{ OMOD_SHADOW,		OBJMOD_ARMOR,	20,	"#eShadow#n %s",		"#eShadow#n"	},
	{ OMOD_SENSEI,		OBJMOD_ARMOR,	15,	"#cSensei#n %s",		"#cSensei#n"	},
	{ OMOD_TRANSPORT,	OBJMOD_ARMOR,	20,	"%s of #CTransportation#n",	"#CTransport#n"	},
	
	{ OMOD_WARDING,		OBJMOD_ALL,	15,	"%s of #bWarding#n",		"#wSentinel#n"	},
	{ OMOD_NEGATION,	OBJMOD_ALL,	40,	"%s of #bNegation#n",		"#wSentinel#n"	},

	{ OMOD_PIERCING,	OBJMOD_WEAPON,	90,	"%s of #RPiercing#n",		"#RVorpal#n"	},
	{ OMOD_WINTER,		OBJMOD_WEAPON,	50,	"%s of #CWinter#n",		"#CWinter#n"	},
	{ OMOD_FLAME,		OBJMOD_WEAPON,	35,	"%s of #rFlame#n",		"#rFlame#n"	},
	{ OMOD_SHOCK,		OBJMOD_WEAPON,	30,	"%s of #yShock#n",		"#yShock#n"	},
        { OMOD_VENOM,           OBJMOD_WEAPON,  20,     "%s of #gVenom#n",              "#gVenom#n"     },
	{ OMOD_LOCUST,		OBJMOD_WEAPON,	40,	"%s of the #bLocust#n",		"#bLocust#n"	},

	{ OMOD_FAITHFUL,	OBJMOD_ALL,	25,	"#wFaithful#n %s",		"#wFaithful#n"	},

	{ OMOD_KNIGHTS,		OBJMOD_ALL,	25,	"#pKnight's#n %s",		"#pFine#n"	},
	{ OMOD_LORDS,		OBJMOD_ALL,	50,	"#pLord's#n %s",		"#pFine#n"	},
	{ OMOD_KINGS,		OBJMOD_ALL,	75,	"#pKing's#n %s",		"#pFine#n"	}

};

OBJ_DATA *add_oaff(OBJ_DATA *obj, int aff, int mod)
{
	AFFECT_DATA *paf;
	

	if ( affect_free == NULL )
	{
        	paf = alloc_perm( sizeof(*paf) );
	}
	else
	{
		paf = affect_free;
		affect_free = affect_free->next;
	}
        
	paf->type           = -1;
	paf->duration       = -1;
	paf->location       = aff;
	paf->modifier       = mod;
	paf->bitvector      = 0;
	paf->next           = obj->affected;
	obj->affected       = paf;

	return obj;
}

OBJ_DATA *add_omod(OBJ_DATA *obj, int omod)
{
	// The World's Biggest Switch Statement

	switch (omod)
	{
	case OMOD_BRONZE:
		add_oaff(obj,APPLY_HITROLL,10);
		break;
	case OMOD_GOLD:
		add_oaff(obj,APPLY_HITROLL,20);
		break;
	case OMOD_VISIONARY:
		add_oaff(obj,APPLY_HITROLL,30);
		break;

	case OMOD_VICIOUS:
                obj->value[1] *= 1.2;
                obj->value[2] *= 1.2;
		break;
	case OMOD_BRUTAL:
                obj->value[1] *= 1.4;
                obj->value[2] *= 1.4;
		break;
	case OMOD_MERCILESS:
                obj->value[1] *= 1.6;
                obj->value[2] *= 1.6;
		break;
	case OMOD_CRUEL:
                obj->value[1] *= 1.8;
                obj->value[2] *= 1.8;
                break;

	case OMOD_STURDY:
		obj->value[0] *= 1.5;
		break;
	case OMOD_BLESSED:
		obj->value[0] *= 1.6;
		break;
	case OMOD_SAINTLY:
		obj->value[0] *= 1.7;
		break;
	case OMOD_GODLY:
		obj->value[0] *= 1.8;
		break;

	case OMOD_LIZARDS:
		add_oaff(obj,APPLY_MANA,500);
		break;
	case OMOD_SERPENTS:
		add_oaff(obj,APPLY_MANA,750);
		break;
	case OMOD_WYRMS:
		add_oaff(obj,APPLY_MANA,1000);
		break;

	case OMOD_RUGGED:
		add_oaff(obj,APPLY_MOVE,200);
		break;
	case OMOD_TIRELESS:
		add_oaff(obj,APPLY_MOVE,600);
		break;

	case OMOD_OX:
		add_oaff(obj,APPLY_STR,5);
		break;
	case OMOD_ATLAS:
		add_oaff(obj,APPLY_STR,10);
		break;

	case OMOD_ACCURACY:
		add_oaff(obj,APPLY_DEX,5);
		break;
	case OMOD_PRECISION:
		add_oaff(obj,APPLY_DEX,10);
		break;

	case OMOD_MAIMING:
		add_oaff(obj,APPLY_DAMROLL,10);
		break;
	case OMOD_GORE:
		add_oaff(obj,APPLY_DAMROLL,20);
		break;
	case OMOD_BUTCHERING:
		add_oaff(obj,APPLY_DAMROLL,30);
		break;
	
	case OMOD_JACKAL:
		add_oaff(obj,APPLY_HIT,500);
		break;
	case OMOD_MAMMOTH:
		add_oaff(obj,APPLY_HIT,750);
		break;
	case OMOD_WHALE:
		add_oaff(obj,APPLY_HIT,1000);
		break;

	case OMOD_MIND:
		add_oaff(obj,APPLY_WIS,5);
		add_oaff(obj,APPLY_INT,5);
		break;
	case OMOD_BRILLIANCE:
		add_oaff(obj,APPLY_WIS,5);
		add_oaff(obj,APPLY_INT,5);
		break;
	case OMOD_WIZARDRY:
		add_oaff(obj,APPLY_WIS,5);
		add_oaff(obj,APPLY_INT,5);
		break;

	case OMOD_GARNET:
		obj->value[3] = 11;
		break;
	case OMOD_COBALT:
		obj->value[3] = 12;
		break;
	case OMOD_CORAL:
		obj->value[3] = 10;
		break;
	case OMOD_JADE:
		obj->value[3] = 13;
		break;
	case OMOD_RAINBOW:
		obj->value[3] = 15;
		break;
	case OMOD_SWIFTNESS:
		obj->value[3] = 17;
		break;
	case OMOD_REGROWTH:
		obj->value[3] = 16;
		break;
	case OMOD_ABSORPTION:
		obj->value[3] = 57;
		break;
	case OMOD_LIGHT:
		obj->value[3] = 1;
		break;
	case OMOD_RADIANCE:
		obj->value[3] = 2;
		break;
	case OMOD_SHADOW:
		obj->value[3] = 9;
		break;
	case OMOD_SENSEI:
		obj->value[3] = 3;
		break;
	case OMOD_TRANSPORT:
		obj->value[3] = 6;
		break;

	case OMOD_WARDING:
		add_oaff(obj,APPLY_SAVING_SPELL,-1);
		break;
	case OMOD_NEGATION:
		add_oaff(obj,APPLY_SAVING_SPELL,-3);
		break;

	case OMOD_PIERCING:
		obj->value[0] += 18000;
		break;
	case OMOD_WINTER:
		obj->value[0] += 69;
		obj->level = 50;
		break;
	case OMOD_FLAME:
		obj->value[0] += 37;
		obj->level = 50;
		break;
	case OMOD_SHOCK:
		obj->value[0] += 48;
		obj->level = 50;
		break;
	case OMOD_VENOM:
		obj->value[0] += 53;
		obj->level = 50;
		break;
	case OMOD_LOCUST:
		obj->value[0] += 34;
		obj->level = 50;
		break;

	case OMOD_FAITHFUL:
		add_oaff(obj,APPLY_AC,-10);
		break;

	case OMOD_KNIGHTS:
		add_oaff(obj,APPLY_HITROLL,5);
		add_oaff(obj,APPLY_DAMROLL,5);
		break;
	case OMOD_LORDS:
		add_oaff(obj,APPLY_HITROLL,10);
		add_oaff(obj,APPLY_DAMROLL,10);
		break;
	case OMOD_KINGS:
		add_oaff(obj,APPLY_HITROLL,15);
		add_oaff(obj,APPLY_DAMROLL,15);
		break;

	
	default:
		perror("add_omod: invalid omod");
	}

	return obj;
}


// CREATE_MAGIC() - makes an object magical
OBJ_DATA *create_magic(OBJ_DATA *obj, int level)
{
	char buf[MAX_STRING_LENGTH];
        char proper[MAX_STRING_LENGTH];
	int mod = -1;
        int num = (obj->pIndexData->vnum - 26000);

	obj->item_ver = IV_MAGIC;

	// Fetch a Mod
	while (mod < 0)
	{
		mod = number_range(0,OBJMOD_MAX-1);
		if (obj_mod[mod].mod_type == OBJMOD_WEAPON && obj->item_type != ITEM_WEAPON)
			mod = -1;
		if (obj_mod[mod].mod_type == OBJMOD_ARMOR && obj->item_type != ITEM_ARMOR)
			mod = -1;		
		if (obj_mod[mod].level > level)		// Mod Too High
			mod = -1;
	}
	
	// Cost Up if Mod Level > Obj Level
	if (obj_mod[mod].level > obj->cost)
		obj->cost = obj_mod[mod].level;

	// Generate Description
        sprintf(buf, obj_mod[mod].magic_fmt, obj->name);
        free_string(obj->name);
        obj->name = str_dup(bash_color(buf));

        sprintf(proper, obj_mod[mod].magic_fmt, obj->short_descr);
	free_string(obj->short_descr);
        obj->short_descr = str_dup(proper);

        switch (num)
        {
           default: sprintf(buf, "A "); break;
           case 1: sprintf(buf, "An "); break;
           case 4:
           case 5:
           case 6:
           case 7: sprintf(buf, "Some "); break;
        }
        strcat(buf, proper);
        switch (num)
        {
           default: strcat(buf, "#0 is lying here.#n"); break;
           case 4:
           case 6: strcat(buf, "#0 are lying here.#n"); break;
           case 5:
           case 7: strcat(buf, "#0 lie here.#n"); break;
           case 9: strcat(buf, "#0 lies here.#n"); break;
           case 10: strcat(buf, "#0 is discarded on the ground.#n"); break;
           case 12: strcat(buf, "#0 is lying on the ground.#n"); break;
           case 16: strcat(buf, "#0 is sitting on the ground.#n"); break;
        }
        free_string(obj->description);
        obj->description = str_dup(buf);

	free_string(obj->questmaker);
	obj->questmaker = str_dup("The Magic Moogle");

	// Add the Mod
	obj = add_omod(obj,obj_mod[mod].mod_num);

	return obj;

}


// CREATE_RARE() - makes an object rare
OBJ_DATA *create_rare(OBJ_DATA *obj, int level)
{
	char buf[MAX_STRING_LENGTH];
        char proper[MAX_STRING_LENGTH];
        int num = (obj->pIndexData->vnum - 26000);

	int mods[3] = {-1, -1, -1};

	obj->item_ver = IV_RARE;

	// Fetch Mods
	while (mods[0] < 0)
	{
		mods[0] = number_range(0,OBJMOD_MAX-1);		
		if (obj_mod[mods[0]].mod_type == OBJMOD_WEAPON && obj->item_type != ITEM_WEAPON)
			mods[0] = -1;
		else if (obj_mod[mods[0]].mod_type == OBJMOD_ARMOR && obj->item_type != ITEM_ARMOR)
			mods[0] = -1;		
		else if (obj_mod[mods[0]].level > level)		// Mod Too High
			mods[0] = -1;

	}

	// Cost Up if ModLevel > ObjLevel
	if (obj_mod[mods[0]].level > obj->cost)
		obj->cost = obj_mod[mods[0]].level;

	// Fetch Mods
	while (mods[1] < 0)
	{
		mods[1] = number_range(0,OBJMOD_MAX-1);		
		if (obj_mod[mods[1]].mod_num/100 == obj_mod[mods[0]].mod_num/100)
			mods[1] = -1;
		else if (obj_mod[mods[1]].mod_type == OBJMOD_WEAPON && obj->item_type != ITEM_WEAPON)
			mods[1] = -1;
		else if (obj_mod[mods[1]].mod_type == OBJMOD_ARMOR && obj->item_type != ITEM_ARMOR)
			mods[1] = -1;		
		else if (obj_mod[mods[1]].level > level)		// Mod Too High
			mods[1] = -1;

	}

	// Cost Up if ModLevel > ObjLevel
	if (obj_mod[mods[1]].level > obj->cost)
		obj->cost = obj_mod[mods[1]].level;

	// Fetch Mods
	while (mods[2] < 0)
	{
		mods[2] = number_range(0,OBJMOD_MAX-1);
		if (obj_mod[mods[2]].mod_num/100 == obj_mod[mods[0]].mod_num/100)
			mods[2] = -1;		
		else if (obj_mod[mods[2]].mod_num/100 == obj_mod[mods[1]].mod_num/100)
			mods[2] = -1;		
		else if (obj_mod[mods[2]].mod_type == OBJMOD_WEAPON && obj->item_type != ITEM_WEAPON)
			mods[2] = -1;
		else if (obj_mod[mods[2]].mod_type == OBJMOD_ARMOR && obj->item_type != ITEM_ARMOR)
			mods[2] = -1;		
		else if (obj_mod[mods[2]].level > level)		// Mod Too High
			mods[2] = -1;

	}

	// Cost Up if ModLevel > ObjLevel
	if (obj_mod[mods[2]].level > obj->cost)
		obj->cost = obj_mod[mods[2]].level;

        // No breaking...
        SET_BIT (obj->quest2, QUEST2_INDEST);

	// Generate Description
        sprintf(buf,"%s %s %s", obj_mod[mods[1]].rare_adj, obj_mod[mods[2]].rare_adj, obj->name);
        free_string(obj->name);
        obj->name = str_dup(bash_color(buf));

        sprintf(proper,"%s %s %s", obj_mod[mods[1]].rare_adj, obj_mod[mods[2]].rare_adj, obj->short_descr);
	free_string(obj->short_descr);
        obj->short_descr = str_dup(proper);

        switch (num)
        {
           default: sprintf(buf, "A "); break;
           case 1: sprintf(buf, "An "); break;
           case 4:
           case 5:
           case 6:
           case 7: sprintf(buf, "Some "); break;
        }
        strcat(buf, proper);
        switch (num)
        {
           default: strcat(buf, "#0 is lying here.#n"); break;
           case 4:
           case 6: strcat(buf, "#0 are lying here.#n"); break;
           case 5:
           case 7: strcat(buf, "#0 lie here.#n"); break;
           case 9: strcat(buf, "#0 lies here.#n"); break;
           case 10: strcat(buf, "#0 is discarded on the ground.#n"); break;
           case 12: strcat(buf, "#0 is lying on the ground.#n"); break;
           case 16: strcat(buf, "#0 is sitting on the ground.#n"); break;
        }
        free_string(obj->description);
        obj->description = str_dup(buf);

	free_string(obj->questmaker);
	obj->questmaker = str_dup("The Rare Fairy");

	// Add Mods
	obj = add_omod(obj,obj_mod[mods[0]].mod_num);
	obj = add_omod(obj,obj_mod[mods[1]].mod_num);
	obj = add_omod(obj,obj_mod[mods[2]].mod_num);
        obj->condition = 100;
        obj->toughness = 100;
        obj->resistance = 1; 
	return obj;

}


// CREATE_NORMAL() - makes a normal object
OBJ_DATA *create_normal(OBJ_DATA *obj, int level)
{
	char buf[MAX_STRING_LENGTH];

	obj->item_ver = IV_NORMAL;

        sprintf(buf,"%s", bash_color(obj->short_descr));
	free_string(obj->short_descr);
	obj->short_descr = str_dup(buf);
	free_string(obj->questmaker);
	obj->questmaker = str_dup("The BlackSmith");

	return obj;

}


// POP_ITEM() - creates an item
OBJ_DATA *pop_item(int level)
{

	OBJ_DATA *obj;
	int ver = number_range(1, 1000);
	int mod = 0;

	if (level < 0)
		level = 0;

	level = number_range(level * 0.8, level * 1.0);
	
	if (ver  == 1 )		// POP RARE! (1% chance)
		ver = IV_RARE;
	else if (ver < 5 )	// POP MAGIC! (3% chance)
		ver = IV_MAGIC;
        else if (ver < 20 )     // POP NORMAL! (15% chance)
		ver = IV_NORMAL;
	else			// NO POP :(
		return NULL;


	if ((obj = create_object(get_obj_index(number_range(MIN_OBJ_VNUM, MAX_OBJ_VNUM)), 0)) == NULL)
	{
		perror("pop_item: invalid item");
		return NULL;
	}
	
	// Item Too Good!
	if (obj->cost > level)
	{
		extract_obj(obj);
		return NULL;
	}

	// Added this to change armor/avg dam instead of diff objs
	if (obj->item_type == ITEM_ARMOR)
	{
		mod = number_range(10,level);
		obj->value[0] *= mod/10;
		if (mod > obj->cost)
			obj->cost = mod;
	}
	else if (obj->item_type == ITEM_WEAPON)
	{
		mod = number_range(10,level);
		obj->value[1] *= mod/10;
		obj->value[2] *= mod/10;
		if (mod > obj->cost)
			obj->cost = mod;
	}


	switch (ver)
	{
	case IV_NORMAL:
		return create_normal(obj,level);
		break;

	case IV_MAGIC:
		return create_magic(obj,level);
		break;

	case IV_RARE:
		return create_rare(obj,level);
		break;

	default:
		perror("pop_item: invalid version");
		return NULL;

	}
	
	
	return NULL;
}

// Test Function to generate items on command
void do_popitem(CHAR_DATA *ch, char *argument)
{
	OBJ_DATA *obj;
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
	int level;

	if (IS_NPC(ch)) return;

	argument = one_argument(argument,arg);
	level = atoi(arg);

//        if (arg[0] == '\0' || level < 0 || level > 99)
        if (arg[0] == '\0' || level < 0)
		level = 99;

	obj = pop_item(level);

	if (obj == NULL)
	{
		send_to_char("You didn't pop anything!\n\r", ch);
		return;
	}

	sprintf(buf,"You just popped %s!!!\n\r", obj->short_descr);
	send_to_char(buf,ch);
	obj_to_char(obj,ch);

	return;
}