wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 3.0 ** 				    *
 *--------------------------------------------------------------------------*
 *               WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse		    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *                           Scryn, Thoric, Justice, Tricops and Brogar.    *
 *--------------------------------------------------------------------------*
 *  Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider		    *
 *  SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, *
 *		       Swordbearer, Gorog, Grishnakh and Tricops.           *
 *--------------------------------------------------------------------------*
 *  Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain,      *
 *  Michael Quan, and Michael Tse. 					    *
 *  Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, *
 *  Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. 		    *
 *--------------------------------------------------------------------------*
 *   		     Glory Point Prize Administration Module		    *
 *--------------------------------------------------------------------------*/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"

CHAR_DATA *find_glory_salesman( ROOM_INDEX_DATA *room );
bool limit_check( int prize_number, CHAR_DATA *ch );
OBJ_DATA *get_pin( CHAR_DATA *victim );
OBJ_DATA *make_pin( CHAR_DATA *ch );
sh_int find_affect_bivector( char *name, sh_int type );
void affect_obj_perm( OBJ_DATA *pin, CHAR_DATA *ch, CHAR_DATA *salesman, sh_int biv, sh_int type );
void lower_obj_weight( CHAR_DATA *ch, CHAR_DATA *salesman,char *name );
void rename_obj( CHAR_DATA *ch, char *name, CHAR_DATA *salesman, char *new_name );
void affect_armor_class( OBJ_DATA *pin, CHAR_DATA *ch, CHAR_DATA *salesman, sh_int ac );
void affect_con( CHAR_DATA *ch, CHAR_DATA *salesman, sh_int con );
void set_obj_bit( char *name, CHAR_DATA *ch, CHAR_DATA *salesman, char *bit );
void skill_to_100( CHAR_DATA *ch, CHAR_DATA *salesman, char *skill );
OBJ_DATA *find_obj_by_name( char *name, CHAR_DATA *ch );
bool cost_check( CHAR_DATA *ch, sh_int prize_num );
void charge_glory( CHAR_DATA *ch, sh_int prize_num );

/*
 * Some prelimnary stuff, Defining prizes prices etc.. --GW
 */

/* Vnum of the Prize Pin */
#define PRIZE_PIN_VNUM	63

/* Prize Types */
#define PRIZE_MINOR_AFFECT		0
#define PRIZE_MAJOR_AFFECT		1
#define PRIZE_RENAME			2
#define PRIZE_10_AC			3
#define PRIZE_1_CON			4
#define PRIZE_INDESTRUCTABLE_ITEM	5
#define PRIZE_MINOR_RESIST		6
#define PRIZE_MAJOR_RESIST		7
#define PRIZE_SKILL_100			8
#define PRIZE_LOWERED_WEIGHT		9

/* Reward Types */
#define MINOR_AFF	1
#define MAJOR_AFF	2
#define MINOR_RES	3
#define MAJOR_RES	4

/* Bivector Numbers */
#define BIV_AQUA_BREATH		1
#define BIV_DETECT_INVIS	2
#define BIV_DETECT_HIDDEN	3
#define BIV_DETECT_EVIL		4
#define BIV_FLOAT		5
#define BIV_PROTECTION		6
#define BIV_SCRYING		7
#define BIV_INVIS		8
#define BIV_HIDE		9
#define BIV_SNEAK		10
#define BIV_TRUE_SIGHT		11
#define BIV_SANCTUARY		12
#define BIV_FIRESHIELD		13
#define BIV_ICESHIELD		14
#define BIV_SHOCKSHIELD		15
#define BIV_PASS_DOOR		16
#define BIV_FLYING		17
#define BIV_FIRE		18
#define BIV_COLD		19
#define BIV_ELECTRICITY		20
#define BIV_ACID		21
#define BIV_POISON		22
#define BIV_SLEEP		23
#define BIV_NONMAGIC		24
#define BIV_MAGIC		25
#define BIV_ENERGY		26

/*
 * Glory Status Settings -- For Restringing --GW
 */
#define GLORY_STATUS_NONE		0
#define GLORY_STATUS_KEYWORD		1
#define GLORY_STATUS_KEYWORD_CONFIRM	2
#define GLORY_STATUS_SHORT_DESC		3
#define GLORY_STATUS_SHORT_DESC_CONFIRM	4
#define GLORY_STATUS_LONG_DESC		5
#define GLORY_STATUS_LONG_DESC_CONFIRM	6

/* Base Structure for glory_table */
struct glory_prize_data
{
char *name;
long price;
bool gold;
char *details;
char *comments;
};

/* Defines for glory_table */
const struct glory_prize_data glory_table[] =
{
{ "Minor Affect", 500, FALSE,
  "AquaBreath, DetectInvis, DetectHidden, DetectEvil, Float, Protection",NULL },
{ "Major Affect", 3000, FALSE,
  "Scrying, Invis, Hide, Sneak, TrueSight, Sanctuary, FireShield, IceShield\n\r, ShockShield, PassDoor, Fly",
  "4 Affects Maximum, Minor or Major" },
{ "Rename", 200, FALSE, NULL, "Curse Words WILL CAUSE A CHARACTER PURGE!" },
{ "-10 AC", 300, FALSE, NULL, NULL },
{ "1 Con Point", 30000000, TRUE, NULL, NULL },
{ "Indestructable Item", 2000, FALSE, NULL, NULL },
{ "Minor Resist", 500, FALSE, 
  "Fire, Cold, Electricity, Acid, Poison, Sleep" },
{ "Major Resist", 3000, FALSE,
  "NonMagic, Magic, Energy", "4 Maximum, Minor or Major" },
{ "Skill to 100%",1000, FALSE, NULL, "5 Maximum" },
{ "Lowered Weight",50, FALSE, "No less then 1 Pound" },
{ NULL, 0, FALSE, NULL, NULL }
};


/*
 * Main Input Handler -- Lets a player pick what they want --GW
 * Format: prize <list/buy> <prize #> <obj name> <value/desc>
 */
void do_prize( CHAR_DATA *ch, char *argument )
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
int prize_num=0;
CHAR_DATA *salesman;
OBJ_DATA *pin;
sh_int bivector=0;

argument = one_argument( argument, arg1 ); /* List/Buy */
argument = one_argument( argument, arg2 ); /* Prize # */
argument = one_argument( argument, arg3 ); /* obj_name */

if ( arg1[0] == '\0' )
{
send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
return;
}

if ( !( salesman = find_glory_salesman( ch->in_room ) ) )
{
send_to_char("I see no Glory Salesman here....\n\r",ch);
return;
}

/* Prize List */
if ( !str_cmp( arg1, "list" ) )
{

send_to_char("The Glory Store -- Price List\n\r",ch);
send_to_char("=============================\n\r\n\r",ch);

for( prize_num=0; glory_table[prize_num].name != NULL; prize_num++ )
{
ch_printf(ch, "Prize Number: [%d]\n\r", prize_num+1 );
ch_printf(ch, "Name:    [%s]\n\r", glory_table[prize_num].name );
ch_printf(ch, "Price:   [%ld %s]\n\r", glory_table[prize_num].price,
	glory_table[prize_num].gold ? "Gold Coins" : "Glory Points" );
ch_printf(ch, "Details:\n\r%s\n\r",glory_table[prize_num].details ? 
	glory_table[prize_num].details : "None." );
ch_printf(ch, "Comments:%s\n\r", glory_table[prize_num].comments ?
	glory_table[prize_num].comments : "None." );
send_to_char("---------------------------------------------------------------------\n\r",ch);
}

return;
}

/* Buy Prize */
if ( !str_cmp( arg1, "buy" ) )
{

if ( arg2[0] == '\0' || !is_number(arg2) )
{
send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
return;
}

prize_num = atoi(arg2);

if ( !cost_check( ch, prize_num-1 ) )
{
   do_say(salesman, "But, you don't have enough Glory!");
   return;
}

switch( prize_num-1 )
{
	/* Minor Affects */
	/* Arg3: Affect Name */
	case PRIZE_MINOR_AFFECT:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	pin=get_pin(ch);
	if ( !pin )
	{
	   do_say(salesman, "Oh, I see you have no prize Pin!");
	   do_say(salesman, "Now your wearing one!.");
	   do_say(salesman, "Remember: It is KEYED to your character, it cannot be transfered!");
	   pin=make_pin(ch);
	}
	if ( limit_check(prize_num-1,ch) == TRUE )
	{
	   do_say(salesman, "Sorry, You have to many of those already.");
	   break;
	}
	bivector = find_affect_bivector( arg3, MINOR_AFF );
	affect_obj_perm( pin, ch, salesman, bivector, MINOR_AFF );
	break;

	/* Major Affects */
	/* Arg3: affect name */
	case PRIZE_MAJOR_AFFECT:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	pin=get_pin(ch);
	if ( !pin )
	{
	   do_say(salesman, "Oh, I see you have no prize Pin!");
	   do_say(salesman, "There is now one in your inventory.");
	   do_say(salesman, "Remember: It is KEYED to your character, it cannot be transfered!");
	   pin=make_pin(ch);
	}
	if ( limit_check(prize_num-1,ch) == TRUE )
	{
	   do_say(salesman, "Sorry, You have to many of those already.");
	   break;
	}
	bivector = find_affect_bivector( arg3, MAJOR_AFF );
	affect_obj_perm( pin, ch, salesman, bivector, MAJOR_AFF );
	break;

	/* Rename */
	/* Arg3: orig obj name */
  	/* Argument: new obj name */
	case PRIZE_RENAME:
	if ( arg3[0] == '\0' || !argument  )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	rename_obj( ch, arg3, salesman, argument );
	break;

	/* -10 AC */
	/* No Arguments */
	case PRIZE_10_AC:
	pin=get_pin(ch);
	if ( !pin )
	{
	   do_say(salesman, "Oh, I see you have no prize Pin!");
	   do_say(salesman, "There is now one in your inventory.");
	   do_say(salesman, "Remember: It is KEYED to your character, it cannot be transfered!");
	   pin=make_pin(ch);
	}
	affect_armor_class( pin, ch, salesman, 10 );
	break;

	/* 1 Con Point */
	/* No Arguments */
	case PRIZE_1_CON:
	affect_con( ch, salesman, 1 );
	break;

	/* Indestructable Item */
	/* Arg3: object name */
	case PRIZE_INDESTRUCTABLE_ITEM:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	set_obj_bit( arg3, ch, salesman, "no_scrap" );
	break;

	/* Minor Resist */
	/* Arg3: resist name */
	case PRIZE_MINOR_RESIST:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	pin=get_pin(ch);
	if ( !pin )
	{
	   do_say(salesman, "Oh, I see you have no prize Pin!");
	   do_say(salesman, "There is now one in your inventory.");
	   do_say(salesman, "Remember: It is KEYED to your character, it cannot be transfered!");
	   pin=make_pin(ch);
	}
	if ( limit_check(prize_num-1,ch) == TRUE )
	{
	   do_say(salesman, "Sorry, You have to many of those already.");
	   break;
	}
	bivector = find_affect_bivector( arg3, MINOR_RES );
	affect_obj_perm( pin, ch, salesman, bivector, MINOR_RES );
	break;

	/* Major Resist */
	/* Arg3: resist name */
	case PRIZE_MAJOR_RESIST:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	pin=get_pin(ch);
	if ( !pin )
	{
	   do_say(salesman, "Oh, I see you have no prize Pin!");
	   do_say(salesman, "There is now one in your inventory.");
	   do_say(salesman, "Remember: It is KEYED to your character, it cannot be transfered!");
	   pin=make_pin(ch);
	}
	if ( limit_check(prize_num-1,ch) == TRUE )
	{
	   do_say(salesman, "Sorry, You have to many of those already.");
	   break;
	}
	bivector = find_affect_bivector( arg3, MAJOR_RES );
	affect_obj_perm( pin, ch, salesman, bivector, MAJOR_RES );
	break;

	/* Skill to 100% */
	/* arg3: skill name */
	case PRIZE_SKILL_100:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	if ( limit_check(prize_num-1,ch) == TRUE )
	{
	   do_say(salesman, "Sorry, You have to many of those already.");
	   break;
	}
	skill_to_100( ch, salesman, arg3 );
	break;

	/* Lowered Weight */
	/* arg3: obj name */
	case PRIZE_LOWERED_WEIGHT:
	if ( arg3[0] == '\0' )
	{
	   send_to_char("Format: prize <list/buy> <prize #> <obj name/argument> <value/desc>\n\r",ch);
	   return;
	}
	lower_obj_weight( ch, salesman, arg3 );
	break;

	/* Wrong #....Dail again..*/
	default:
	send_to_char("Invalid Prize Number, type: prize list\n\r",ch);
	break;
}

return;
}

send_to_char("Format: prize <list/buy> <prize #> <obj name> <value/desc>\n\r",ch);
return;
}

/*
 * Find the Salesman in the room --GW
 */
CHAR_DATA *find_glory_salesman( ROOM_INDEX_DATA *room )
{
CHAR_DATA *man, *man_next;
bool found=FALSE;

for ( man = room->first_person; man; man = man_next )
{
    man_next = man->next_in_room;

    if ( !IS_NPC(man) )
	continue;

    if ( man->spec_fun == spec_lookup( "spec_glory_salesman" ) ) 
    { 
	found = TRUE;
	break;
    }
}

if( found )
return man;

return NULL;
}

/*
 * Make Sure the Character is UNDER Limit for the Prize
 * Returns:
 * TRUE : OVER or AT Limit
 * FALSE : UNDER limit
 * --Greywolf
 */
bool limit_check( int prize_number, CHAR_DATA *ch )
{

/* Major and Minor Affects */
if ( prize_number == PRIZE_MINOR_AFFECT || prize_number == PRIZE_MAJOR_AFFECT )
{
	if ( ( ch->pcdata->minoraffects + ch->pcdata->majoraffects )+1 > 4 )
	return TRUE;
}

/* Major and Minor Resists */
if ( prize_number == PRIZE_MINOR_RESIST || prize_number == PRIZE_MAJOR_RESIST )
{
	if ( ( ch->pcdata->minorresist + ch->pcdata->majorresist)+1 > 4 )
	return TRUE;
}

/* Spells to 100 */
if ( prize_number == PRIZE_SKILL_100 )
{
	if ( (ch->pcdata->skill100s+1) > 5 )
	return TRUE;
}


return FALSE;
}

/*
 * Get data for the Pin off the character --GW
 * Null if none found
 */
OBJ_DATA *get_pin( CHAR_DATA *victim )
{
OBJ_DATA *obj;

   if ( ( obj = get_obj_carry( victim, "prizepin" ) ) == NULL )
    {
        if ( ( obj = get_obj_wear( victim, "prizepin" ) ) == NULL )
        {
        return NULL;
        }
    }

return obj;
}

/*
 * Create the Pin, and put it on the character --GW 
 */
OBJ_DATA *make_pin( CHAR_DATA *ch )
{
OBJ_DATA *pin;
OBJ_DATA *old_pin;
ZONE_DATA *zone;

zone = find_zone(1);

if ( !( pin = create_object( get_obj_index( PRIZE_PIN_VNUM,1), 1, zone ) ) )
{
bug("Glory_Store: Make Pin: Unable to Create Prize Pin!");
return NULL;
}

obj_to_char( pin, ch );

old_pin = get_eq_char( ch, WEAR_INSIG );

if ( old_pin )
unequip_char( ch, old_pin );

equip_char( ch, pin, WEAR_INSIG );
return pin;
}

sh_int find_affect_bivector( char *name, sh_int type )
{
int biv=0;

switch( type )
{
 case MINOR_AFF:
 if ( !str_cmp( name, "aquabreath" ) ) { biv=BIV_AQUA_BREATH; break; }
 else if ( !str_cmp( name, "detectinvis" ) ) { biv=BIV_DETECT_INVIS; break; }
 else if ( !str_cmp( name, "detecthidden" ) ) { biv=BIV_DETECT_HIDDEN; break; }
 else if ( !str_cmp( name, "detectevil" ) ) { biv=BIV_DETECT_EVIL; break; }
 else if ( !str_cmp( name, "float" ) ) { biv=BIV_FLOAT; break; }
 else if ( !str_cmp( name, "protection" ) ) { biv=BIV_PROTECTION; break; }
 biv=-1;
 break;

 case MAJOR_AFF:
 if ( !str_cmp( name, "scrying" ) ) { biv=BIV_SCRYING; break; }
 else if ( !str_cmp( name, "invisable" ) ) { biv=BIV_INVIS; break; }
 else if ( !str_cmp( name, "hide" ) ) { biv=BIV_HIDE; break; }
 else if ( !str_cmp( name, "sneak" ) ) { biv=BIV_SNEAK; break; }
 else if ( !str_cmp( name, "truesight" ) ) { biv=BIV_TRUE_SIGHT; break; }
 else if ( !str_cmp( name, "sanctuary" ) ) { biv=BIV_SANCTUARY; break; }
 else if ( !str_cmp( name, "fireshield" ) ) {biv=BIV_FIRESHIELD; break; }
 else if ( !str_cmp( name, "iceshield" ) ) { biv=BIV_ICESHIELD; break; }
 else if ( !str_cmp( name, "shockshield" ) ) { biv=BIV_SHOCKSHIELD; break; }
 else if ( !str_cmp( name, "passdoor" ) ) { biv=BIV_PASS_DOOR; break; }
 else if ( !str_cmp( name, "flying" ) ) { biv=BIV_FLYING; break; }
 biv=-1;
 break;
 
 case MINOR_RES:
 if ( !str_cmp( name, "fire" ) ) { biv=BIV_FIRE; break; }
 else if ( !str_cmp( name, "cold" ) ) { biv=BIV_COLD; break; }
 else if ( !str_cmp( name, "electricity" ) ) { biv=BIV_ELECTRICITY; break; }
 else if ( !str_cmp( name, "acid" ) ) { biv=BIV_ACID; break; }
 else if ( !str_cmp( name, "poison" ) ) { biv=BIV_POISON; break; }
 else if ( !str_cmp( name, "sleep" ) ) { biv=BIV_SLEEP; break; }
 biv=-1;
 break;

 case MAJOR_RES:
 if ( !str_cmp( name, "nonmagic" ) ) { biv=BIV_NONMAGIC; break; }
 else if ( !str_cmp( name, "magic" ) ) { biv=BIV_MAGIC; break; }
 else if ( !str_cmp( name, "energy" ) ) { biv=BIV_ENERGY; break; }
 biv=-1;
 break;

 default:
 bug("Glory_Store: Bad Type!");
 break;

}

return biv;
}

void affect_obj_perm( OBJ_DATA *pin, CHAR_DATA *ch, CHAR_DATA *salesman, sh_int biv, sh_int type )
{
int value=-1,bitv=0;
char buf[MSL];
sh_int loc;
AFFECT_DATA *paf=NULL;
extern int  top_affect;
bool res=FALSE;
bool aff=FALSE;

if ( biv == -1 )
{
  do_say(salesman,"I know no such Affect, or Resistance!");
  return;
}

switch( type )
{
  case MINOR_AFF:
    switch( biv )
    {
      case BIV_AQUA_BREATH:
      strcpy(buf,"aqua_breath");
      break;
      case BIV_DETECT_INVIS:
      strcpy(buf,"detect_invis");
      break;
      case BIV_DETECT_HIDDEN:
      strcpy(buf,"detect_hidden");
      break;
      case BIV_DETECT_EVIL:
      strcpy(buf,"detect_evil");
      break;
      case BIV_FLOAT:
      strcpy(buf,"floating");
      break;
      case BIV_PROTECTION:
      strcpy(buf,"protect");
      break;
      default:
      bug("Glory_Store: Affect_Char_Perm: BAD BiV!");
      break;
    }
  break;
  case MAJOR_AFF:
    switch( biv )
    {
      case BIV_SCRYING:
      strcpy(buf,"scrying");
      break;
      case BIV_INVIS:
      strcpy(buf,"invisible");
      break;
      case BIV_HIDE:
      strcpy(buf,"hide");
      break;
      case BIV_SNEAK:
      strcpy(buf,"sneak");
      break;
      case BIV_TRUE_SIGHT:
      strcpy(buf,"truesight");
      break;
      case BIV_SANCTUARY:
      strcpy(buf,"sanctuary");
      break;
      case BIV_FIRESHIELD:
      strcpy(buf,"fireshield");
      break;
      case BIV_ICESHIELD:
      strcpy(buf,"iceshield");
      break;
      case BIV_SHOCKSHIELD:
      strcpy(buf,"shockshield");
      break;
      case BIV_PASS_DOOR:
      strcpy(buf,"pass_door");
      break;
      case BIV_FLYING:
      strcpy(buf,"flying");
      break;
      default:
      bug("Glory_Store: Affect_Char_Perm: BAD BiV!");
      break;
    }
  break;
  case MINOR_RES:
    switch( biv )
    {
      case BIV_FIRE:
      strcpy( buf, "fire" );
      break;
      case BIV_COLD:
      strcpy( buf, "cold" );
      break;
      case BIV_ELECTRICITY:
      strcpy( buf, "electricity" );
      break;
      case BIV_ACID:
      strcpy( buf, "acid" );
      break;
      case BIV_POISON:
      strcpy( buf, "poison" );
      break;
      case BIV_SLEEP:      
      strcpy( buf, "sleep" );
      break;
      default:
      bug("Glory_Store: Affect_Char_Perm: BAD BiV!");
      break;
    }
  break;
  case MAJOR_RES:
    switch( biv )
    {
      case BIV_NONMAGIC:
      strcpy( buf, "nonmagic" );
      break;
      case BIV_MAGIC:
      strcpy( buf, "magic" );
      break;
      case BIV_ENERGY:
      strcpy( buf, "energy" );
      break;
      default:
      bug("Glory_Store: Affect_Char_Perm: BAD BiV!");
      break;
    }
  break;
  default:
  bug("Glory_Store: Affect_char_perm: Bad type!(%d)",type);
  break;
}

if ( type == MINOR_AFF || type == MAJOR_AFF )
{
loc = get_atype( "affected" );
value = get_aflag(buf);
aff=TRUE;
}
else
{
value = get_risflag( buf );
loc = get_atype( "resistant" );
res=TRUE;
}

if ( value > -1 )
{

if ( ( type == MINOR_AFF || type == MAJOR_AFF ) &&
       xIS_SET(ch->affected_by, value ) )
{
do_say(salesman,"But you already have that affect on you!");
do_say(salesman,"Try Dispeling first."); 
return;
}

if ( ( type == MINOR_RES || type == MAJOR_RES ) &&
       IS_SET(ch->resistant, value ) )
{
do_say(salesman,"But you already have that resist on you!");
do_say(salesman,"Try Dispeling first"); 
return;
}
}

SET_BIT( bitv, 1 << value );
value = bitv;

if ( value==-1 || !bitv )
{
bug("Glory_Store: INVALID BITVECTOR!",0);
do_say(salesman, "An Error has Occured, please contact Greywolf with complete Details on what you did.");
return;
}

CREATE( paf, AFFECT_DATA, 1 );
paf->type 	= -1;
paf->duration	= -1;
paf->location	= loc;
paf->modifier   = value;
xCLEAR_BITS(paf->bitvector);
paf->next	= NULL;
LINK( paf, pin->first_affect, pin->last_affect, next, prev );
++top_affect;

switch( type )
{
  case MINOR_AFF:
  ch->pcdata->minoraffects++;
  do_say(salesman,"Minor Affect Added =)" );
  charge_glory( ch, PRIZE_MINOR_AFFECT );
  break;
  case MAJOR_AFF:
  ch->pcdata->majoraffects++;
  do_say(salesman,"Major Affect Added =)" );
  charge_glory( ch, PRIZE_MAJOR_AFFECT );
  break;
  case MINOR_RES:
  ch->pcdata->minorresist++;
  do_say(salesman,"Minor Resist Added =)" );
  charge_glory( ch, PRIZE_MINOR_RESIST );
  break;
  case MAJOR_RES:
  ch->pcdata->majorresist++;
  do_say(salesman,"Major Resist Added =)" );
  charge_glory( ch, PRIZE_MAJOR_RESIST );
  break;
  default:
  bug("Glory_Store: affect_obj_perm: BAD TYPE!", 0);
  break;
}

save_char_obj(ch);
return;
}

/* 
 * Lower the Weight of an object --GW
 */
void lower_obj_weight( CHAR_DATA *ch, CHAR_DATA *salesman,char *name )
{
OBJ_DATA *obj;

if ( !( obj=find_obj_by_name( name, ch ) ) )
{
do_say(salesman, "You don't seem to have an object like that!" );
return;
}

if ( obj->weight-1 < 1 )
{
do_say(salesman, "That object cannot get any lighter!\n\r");
return;
}

obj->weight--;
do_say(salesman, "The object's weight has been altered.");
charge_glory( ch, PRIZE_LOWERED_WEIGHT );
return;
}

/*
 * Restring an Object --GW
 */
void rename_obj( CHAR_DATA *ch, char *name, CHAR_DATA *salesman, char *new_name )
{
OBJ_DATA *obj;
char say_buf[MSL];

if ( !( obj=find_obj_by_name( name, ch ) ) )
{
do_say(salesman, "You don't seem to have an object like that!" );
return;
}

separate_obj(obj);

if ( IS_SET( obj->pIndexData->extra_flags, ITEM_NO_RESTRING ) )
{
do_say(salesman, "You Cannot Restring that! The Gods Forbid it!" );
return;
}

switch( ch->pcdata->glory_status )
{
    /* Start the process, take the glory off the top */
    case GLORY_STATUS_NONE:
	charge_glory( ch, PRIZE_RENAME );
	do_say(salesman,"We will now set the KEYWORDS For your Object.");
	sprintf(say_buf,"%s, %s", capitalize(ch->name),
		"Please Type: prize buy 3 <obj name> <keywords>");
	do_say(salesman,say_buf);
	do_say(salesman,"Seperate the words with 1 space!");
	ch->pcdata->glory_status = GLORY_STATUS_KEYWORD;
	break;
    /* Set the Keywords, and send the confirm */
    case GLORY_STATUS_KEYWORD:
	obj->name = STRALLOC(new_name);
	sprintf(say_buf,"Object Keywords: %s",obj->name);
	do_say(salesman, say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_KEYWORD_CONFIRM;
	break;
    /* Confirm the Keywords, reset them if they are not correct */
    case GLORY_STATUS_KEYWORD_CONFIRM:
	if ( !str_cmp( new_name, "yes" ) )
	{
	   do_say(salesman,"Keywords Confirmed, Continuing.");
	   do_say(salesman,"We will now Change the Short Description of the Object.");
	   do_say(salesman,"This is the name you see when it is Worn, or in your Inventory.");
	   do_say(salesman,"Please Type: prize buy 3 <objname> <desc>");
	   ch->pcdata->glory_status = GLORY_STATUS_SHORT_DESC;
	   break;
	}
	obj->name = STRALLOC(new_name);
	sprintf(say_buf,"Object Keywords: %s",obj->name);
	do_say(salesman,say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_KEYWORD_CONFIRM;
	break;
    /* Set the Short Desc, send to Confirm */
    case GLORY_STATUS_SHORT_DESC:	
	obj->short_descr = STRALLOC(new_name);
	sprintf(say_buf,"Object Short Desc: %s",obj->short_descr);
	do_say(salesman,say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_SHORT_DESC_CONFIRM;
	break;
    /* Confirm the Short Desc */
    case GLORY_STATUS_SHORT_DESC_CONFIRM:	
	if ( !str_cmp( new_name, "yes" ) )
	{
	   do_say(salesman,"Short Desc Confirmed, Continuing.");
	   do_say(salesman,"We will now Change the Long Description of the Object.");
	   do_say(salesman,"This is the name you see when it is on the ground.");
	   do_say(salesman,"Please Type: prize buy 3 <objname> <desc>");
	   ch->pcdata->glory_status = GLORY_STATUS_LONG_DESC;
	   break;
	}
	obj->short_descr = STRALLOC(new_name);
	sprintf(say_buf,"Object Short Desc: %s",obj->short_descr);
	do_say(salesman,say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_SHORT_DESC_CONFIRM;
	break;
    /* Set the Long Desc, send to Confirm */
    case GLORY_STATUS_LONG_DESC:	
	obj->description = STRALLOC(new_name);
	sprintf(say_buf,"Object Long Desc: %s",obj->description);
	do_say(salesman,say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_LONG_DESC_CONFIRM;
	break;
    /* Confirm the Long Desc */
    case GLORY_STATUS_LONG_DESC_CONFIRM:	
	if ( !str_cmp( new_name, "yes" ) )
	{
	   do_say(salesman,"Long Desc Confirmed.");
	   do_say(salesman,"Object Rename Complete.");
	   ch->pcdata->glory_status = GLORY_STATUS_NONE;
	   save_char_obj(ch);
	   break;
	}
	obj->description = STRALLOC(new_name);
	sprintf(say_buf,"Object Long Desc: %s",obj->description);
	do_say(salesman,say_buf);
	do_say(salesman,"If this is Correct, type:");
	do_say(salesman,"prize buy 3 <objname> yes");
	do_say(salesman,"If it is wrong, start at this step again");
	ch->pcdata->glory_status = GLORY_STATUS_LONG_DESC_CONFIRM;
	break;
}

return;
}

/*
 * Add a Armor Class Affect to an Object --GW
 */
void affect_armor_class( OBJ_DATA *pin, CHAR_DATA *ch, CHAR_DATA *salesman, sh_int ac )
{

if ( pin->value[0]+ac >= 30000 )
{
do_say(salesman, "I'm sorry, I cannot modify your ac any further");
return;
}

pin->value[0] += ac;

/*
AFFECT_DATA *paf;
extern int top_affect;

CREATE( paf, AFFECT_DATA, 1 );
paf->type               = -1;
paf->duration           = -1;
paf->location           = APPLY_AC;
paf->modifier           = ac;
paf->bitvector          = 0;
paf->next               = NULL;

LINK( paf, pin->first_affect, pin->last_affect, next, prev );
++top_affect;
*/

do_say(salesman, "A -10 AC Affect has been added to your Prize Pin!" );
unequip_char( ch, pin );
equip_char( ch, pin, WEAR_INSIG );
charge_glory( ch, PRIZE_10_AC );
save_char_obj(ch);
return;
}

/*
 * Set a Players Constitution --GW
 */
void affect_con( CHAR_DATA *ch, CHAR_DATA *salesman, sh_int con )
{

if ( ch->perm_con+1 >= 25 )
{
do_say( salesman, "Your Constitution is already at Maximum!" );
return;
}

ch->perm_con++;
do_say(salesman,"Your constitution has been modified." );
charge_glory( ch, PRIZE_1_CON );
return;
}

/*
 * Set a Bit on an Object --GW
 */
void set_obj_bit( char *name, CHAR_DATA *ch, CHAR_DATA *salesman, char* bit )
{
OBJ_DATA *obj;
bool FOUND;

if ( !( obj=find_obj_by_name( name, ch ) ) )
{
do_say(salesman, "You don't seem to have an object like that!" );
return;
}

FOUND = FALSE;

if ( !str_cmp( bit, "no_scrap" ) )
{
SET_BIT( obj->second_flags, ITEM2_NO_SCRAP );
FOUND = TRUE;
}

if ( FOUND )
do_say( salesman, "That object is now Indestructable!" );
else
do_say( salesman, "An Error has occured, contact Greywolf with Details!");

save_char_obj(ch);
charge_glory( ch, PRIZE_INDESTRUCTABLE_ITEM );
return;
}

/*
 * set a skill to 100% --GW
 */
void skill_to_100( CHAR_DATA *ch, CHAR_DATA *salesman, char *skill )
{
int sn=0;

sn = skill_lookup(skill);

if ( sn <= 0 )
{
do_say( salesman, "There is no such skill known to me." );
return;
}

/* Make sure they HAVE the skill first --GW */
if ( !CAN_USE_SK(ch, skill_table[sn]) && !CAN_USE_RACE_SK(ch, skill_table[sn] ) )
{
  do_say(salesman, "You don't know that Skill!" );
  return;
}

ch->pcdata->learned[sn] = 100;
ch->pcdata->skill100s++;
do_say( salesman, "Skill/Spell set to 100%");
charge_glory( ch, PRIZE_SKILL_100 );
return;
}

/*
 * Grab the data for an object specified by name off a character --GW
 */
OBJ_DATA *find_obj_by_name( char *name, CHAR_DATA *ch )
{
OBJ_DATA *obj;

   if ( ( obj = get_obj_carry( ch, name ) ) == NULL )
   {
        if ( ( obj = get_obj_wear( ch, name ) ) == NULL )
        {
        return NULL;
        }
   }

return obj;
}

/*
 * Checks if they have enuf glory --GW
 * True if they do
 */
bool cost_check( CHAR_DATA *ch, sh_int prize_num )
{

if ( glory_table[prize_num].gold == FALSE )
{
  if ( ch->pcdata->quest_curr < glory_table[prize_num].price )
  return FALSE;
}

if ( glory_table[prize_num].gold == TRUE )
{
  if ( ch->gold < glory_table[prize_num].price )
  return FALSE;
}
    
return TRUE;
}

void charge_glory( CHAR_DATA *ch, sh_int prize_num )
{
if ( glory_table[prize_num].gold == FALSE )
ch->pcdata->quest_curr -= glory_table[prize_num].price;
else
ch->gold -= glory_table[prize_num].price;
return;
}