asgard/
asgard/.settings/
asgard/area/
asgard/data/clans/
asgard/data/clans/history/
asgard/data/rosters/
asgard/src/notice/
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"

#define AUCTION_LENGTH	5

char *flag_string( const struct flag_type *flag_table, long bits);
BUFFER *show_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing );
extern const struct l_form look_form[];

AUCTION_DATA *auction_free;

AUCTION_DATA *new_auction(void)
{
	AUCTION_DATA *auction;

	if (auction_free == NULL)
		auction = alloc_perm(sizeof(*auction));
	else
	{
		auction = auction_free;
		auction_free = auction_free->next;
	}

	auction->next = NULL;
	auction->item = NULL;
	auction->owner = NULL;
	auction->high_bidder = NULL;
	auction->status = 0;
	auction->slot = 0;
	auction->bid_type = VALUE_GOLD;
	auction->bid_amount = 0;

	return auction;
}

void free_auction(AUCTION_DATA *auction)
{
	if (auction == auction_list)
		auction_list = auction_list->next;
	else
	{
		AUCTION_DATA *auc;

		for (auc = auction_list; auc != NULL; auc = auc->next)
		{
			if (auc->next == auction)
			{
				auc->next = auction->next;
				break;
			}
		}
	}

	auction->next = auction_free;
	auction_free = auction;

	if (auction_list == NULL)
		auction_ticket = 0;
}

BUFFER * display_stats(OBJ_DATA *obj, CHAR_DATA *ch, bool contents)
{
	BUFFER *output = new_buf();
	AFFECT_DATA *paf;
	char buf[MAX_STRING_LENGTH], final[MAX_STRING_LENGTH];
	bool place = FALSE;
	sh_int pos;

	sprintf(buf, "( {w%s {B)", obj->short_descr);
	str_replace(buf, "{x", "{w");
	str_replace(buf, "{0", "{w");

	while (strlen_color(buf) < 77)
	{
		if (place)
			strcat(buf, "=");
		else
		{
			sprintf(final, "=%s", buf);
			strcpy(buf, final);
		}
		place = !place;
	}

	sprintf(final, "{B %s\n\r", buf);
	add_buf(output, final);

	if (IS_IMMORTAL( ch ))
	{
		OBJ_DATA *in_obj;
		/*
		 if ( IS_TRUSTED( ch, MAX_LEVEL ) )
		 {
		 if ( obj->loader != NULL )
		 {
		 sprintf( buf, "Loaded String: {w%s", obj->loader );
		 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
		 add_buf( output, final );
		 }

		 if ( obj->disarmed_from != NULL )
		 {
		 sprintf( buf, "Disarmed From: {w%s",
		 obj->disarmed_from->name );
		 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
		 add_buf( output, final );
		 }

		 if ( obj->multi_data != NULL )
		 {
		 OBJ_MULTI_DATA *obj_mult;

		 for ( obj_mult = obj->multi_data; obj_mult != NULL; obj_mult = obj_mult->next )
		 {
		 sprintf( buf, "Dropped by: {w%s{y@{w%s{y: {w%d",
		 obj_mult->dropper, obj_mult->socket, obj_mult->drop_timer );
		 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
		 add_buf( output, final );
		 }
		 }
		 }
		 */
		sprintf(buf,
				"Vnum: {w%-5d       {yTimer: {w%-5d      {yResets: {w%-5d",
				obj->pIndexData->vnum, obj->timer, obj->pIndexData->reset_num);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(
				buf,
				"{yValue[{w0{y]: {w%-7d {yValue[{w1{y]: {w%-7d {yValue[{w2{y]: {w%-7d",
				obj->value[0], obj->value[1], obj->value[2]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(
				buf,
				"{yValue[{w3{y]: {w%-7d {yValue[{w4{y]: {w%-7d {yWeight: {w%d{y/{w%d{y/{w%d {y(10th pounds)",
				obj->value[3], obj->value[4], obj->weight, get_obj_weight(obj),
				get_true_weight(obj));
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "{yMade by: {w%-26.26s {yOwner: {w%s",
				obj->maker == NULL ? "(none)" : obj->maker,
				obj->owner == NULL ? "(none)" : obj->owner);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		for (in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj)
			;

		sprintf(buf, "In Room: {w%-5d    {yIn Object: {w%s", in_obj->in_room
				!= NULL ? in_obj->in_room->vnum
				: in_obj->carried_by == NULL ? 0 : in_obj->carried_by->in_room
						!= NULL ? in_obj->carried_by->in_room->vnum : 0,
				obj->in_obj == NULL ? "(none)" : obj->in_obj->short_descr);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Wear Loc: {w%-3d     {yCarried by: {w%s", obj->wear_loc,
				in_obj->carried_by == NULL ? "(none)"
						: PERS( in_obj->carried_by, ch ) );
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		if (obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL)
		{
			EXTRA_DESCR_DATA *ed;

			sprintf(buf, "Extra Description Keywords: '{w");

			for (ed = obj->extra_descr; ed != NULL; ed = ed->next)
			{
				strcat(buf, ed->keyword);
				if (ed->next != NULL)
					strcat(buf, " ");
			}

			for (ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next)
			{
				strcat(buf, ed->keyword);
				if (ed->next != NULL)
					strcat(buf, " ");
			}

			strcat(buf, "{y'");
			sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
			add_buf(output, final);
		}

		add_buf(
				output,
				" =============================================================================\n\r");

	}
	/*
	 if ( obj->pIndexData->history != NULL
	 &&   obj->pIndexData->history[0] != '\0' )
	 {
	 char *rdesc;

	 buf[0] = '\0';
	 final[0] = '\0';

	 for ( rdesc = obj->pIndexData->history; *rdesc; rdesc++ )
	 {
	 if ( *rdesc != '{' && *rdesc != '\n' )
	 {
	 sprintf( buf, "%c", rdesc[0] );
	 strcat( final, buf );
	 }

	 else if ( *rdesc != '\n' )
	 {
	 sprintf( buf,"%c%c", rdesc[0], rdesc[1] );
	 strcat( final, buf );
	 rdesc++;
	 }

	 if ( *rdesc == '\n' && *(rdesc + 1) )
	 {
	 sprintf( buf,"| {y%s {B|\n\r",
	 end_string( final, 75 ) );
	 add_buf( output, buf );

	 buf[0] = '\0';
	 final[0] = '\0';
	 rdesc++;
	 }
	 }
	 }
	 */
	sprintf(buf, "Keywords: {w%s", obj->name);
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);

	sprintf(buf, "Long: {w%s", obj->description);
	str_replace(buf, "{x", "{w");
	str_replace(buf, "{0", "{w");
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);

	sprintf(buf, "Type: {w%s", flag_string(type_flags, obj->item_type));
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);

	sprintf(buf, "Flags: {w%s", flag_string(extra_flags, obj->extra_flags));
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);

	sprintf(buf, "Location: {w%s", flag_string(wear_flags, obj->wear_flags));
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);
	/*
	 sprintf( buf, "Size: {w%d {y[{w%s{y]",
	 obj->size, flag_string( size_flags, obj->size ) );
	 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
	 add_buf( output, final );
	 */
	sprintf(buf, "Weight: {w%d{y, Value: {w%d{y, Level: {w%d{y, Level Bonus: {w%d", obj->weight,
			obj->cost, obj->level, obj->tier_level);
	sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
	add_buf(output, final);
	/*
	 place = FALSE;
	 sprintf( buf, "Class Restrict: {w" );
	 for ( pos = 0; pos < MAX_CLASS && class_table[pos].name != NULL; pos++ )
	 {
	 if ( !obj->pIndexData->class_can_use[pos] )
	 {
	 strcat( buf, class_table[pos].name );
	 strcat( buf, ", " );
	 place = TRUE;
	 }
	 }

	 if ( place )
	 {
	 buf[strlen( buf ) -2] = '\0';
	 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
	 add_buf( output, final );
	 }
	 */
	switch (obj->item_type)
	{
	case ITEM_SCROLL:
	case ITEM_POTION:
	case ITEM_PILL:
		sprintf(buf, "Contains level {w%d {yspells of:", obj->value[0]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		buf[0] = '\0';

		for (pos = 1; pos <= 4; pos++)
		{
			if (obj->value[pos] >= 0 && obj->value[pos] < MAX_SKILL)
			{
				strcat(buf, " {y'{w");
				strcat(buf, skill_table[obj->value[pos]].name);
				strcat(buf, "{y'");
			}
		}

		strcat(buf, ".");
		sprintf(final, "| %s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;

	case ITEM_FURNITURE:
		sprintf(buf, "Flags: {w%s", flag_string(furniture_flags, obj->value[2]));
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Maximum People: {w%d", obj->value[0]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Maximum Weight: {w%d", obj->value[1]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Healing rates {w-- {yHp: {w%d{y, Mana: {w%d",
				obj->value[3], obj->value[4]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;

	case ITEM_WAND:
	case ITEM_STAFF:
		sprintf(buf, "Charges: {w%d{y, Charge level: {w%d{y, Spell: ",
				obj->value[2], obj->value[0]);

		if (obj->value[3] >= 0 && obj->value[3] < MAX_SKILL)
		{
			strcat(buf, "'{w");
			strcat(buf, skill_table[obj->value[3]].name);
			strcat(buf, "{y'");
		}

		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;

	case ITEM_DRINK_CON:
		sprintf(buf, "It holds {w%s{y-colored {w%s{y.",
				liq_table[obj->value[2]].liq_color,
				liq_table[obj->value[2]].liq_name);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;

	case ITEM_CONTAINER:
	case ITEM_PIT:
		sprintf(buf, "Capacity: {w%d#{y, Maximum Weight: {w%d#", obj->value[0],
				obj->value[3]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		if (obj->value[4] != 100)
		{
			sprintf(buf, "Weight Multiplier: {w%d%%", obj->value[4]);
			sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
			add_buf(output, final);
		}

		sprintf(buf, "Flags: {w%s", flag_string(container_flags, obj->value[1]));
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;

	case ITEM_WEAPON:
		sprintf(buf, "Weapon type is %s.", flag_string(weapon_class,
				obj->value[0]));
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Damage is {w%d {yd {w%d {y(average {w%d{y).",
				obj->value[1], obj->value[2], (1 + obj->value[2])
						* obj->value[1] / 2);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		sprintf(buf, "Damage message: {w%s", attack_table[obj->value[3]].noun);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);

		if (obj->value[4])
		{
			sprintf(buf, "Flags: {w%s",
					flag_string(weapon_type2, obj->value[4]));
			sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
			add_buf(output, final);
		}
		break;

	case ITEM_ARMOR:
		sprintf(
				buf,
				"Armor Values: Pierce: {w%d{y, Bash: {w%d{y, Slash: {w%d{y, Magic: {w%d",
				obj->value[0], obj->value[1], obj->value[2], obj->value[3]);
		sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
		add_buf(output, final);
		break;
	}

	if (!obj->enchanted)
	{
		for (paf = obj->pIndexData->affected; paf != NULL; paf = paf->next)
		{
//			if (IS_IMMORTAL( ch ) || (paf->location != APPLY_NONE
//					&& paf->modifier != 0))
			{
				/*		if ( paf->where == TO_DAM_MODS )
				 {
				 sprintf( buf, "Modifies damage from {w%s {yby {w%d{y%%",
				 paf->location == DAM_ALL ? "all" :
				 damage_mod_table[paf->location].name, paf->modifier );
				 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
				 add_buf( output, final );
				 } else { */
				sprintf(buf, "Affects {w%s {yby {w%d{y", flag_string(
						apply_flags, paf->location), paf->modifier);
				if (paf->location == APPLY_MORPH_FORM && paf->modifier >= 0) {
					strcat(buf, " ({w");
					strcat(buf, look_form[paf->modifier].short_descr);
					strcat(buf, "{y)");
				}

				if (paf->bitvector)
				{
					switch (paf->where)
					{
					case TO_AFFECTS:
						sprintf(final, " with {w%s {yaffect.", flag_string(
								affect_flags, paf->bitvector));
						break;

					case TO_OBJECT:
						sprintf(final, " with {w%s {yobject flag.",
								flag_string(extra_flags, paf->bitvector));
						break;

					case TO_SHIELDS:
						sprintf(final, " with {w%s {yshield.", flag_string(
								shield_flags, paf->bitvector));
						break;

					case TO_RESIST:
						sprintf(final, " with {w%s {yresistance.",
								flag_string(res_flags, paf->bitvector));
						break;

					case TO_IMMUNE:
						sprintf(final, " with {w%s {yimmunity.",
								flag_string(imm_flags, paf->bitvector));
						break;

					case TO_VULN:
						sprintf(final, " with {w%s {yvulnerability.",
								flag_string(vuln_flags, paf->bitvector));
						break;

					default:
						sprintf(final, " with unknown bit {w%d{y: %d\n\r",
								paf->where, paf->bitvector);
						break;
					}
				}

				else
					sprintf(final, ".");

				strcat(buf, final);
				sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
				add_buf(output, final);

				//		}
			}
		}
	}

	for (paf = obj->affected; paf != NULL; paf = paf->next)
	{
//		if (IS_IMMORTAL( ch ) || (paf->location != APPLY_NONE && paf->modifier
//				!= 0))
		{
			/*	    if ( paf->where == TO_DAM_MODS )
			 {
			 sprintf( buf, "Modifies damage from {w%s {yby {w%d{y%%",
			 paf->location == DAM_ALL ? "all" :
			 damage_mod_table[paf->location].name, paf->modifier );
			 sprintf( final, "| {y%s {B|\n\r", end_string( buf, 75 ) );
			 add_buf( output, final );
			 } else { */
			sprintf(buf, "Affects {w%s {yby {w%d{y", flag_string(apply_flags,
					paf->location), paf->modifier);
			if (paf->location == APPLY_MORPH_FORM && paf->modifier >= 0) {
				strcat(buf, " ({w");
				strcat(buf, look_form[paf->modifier].short_descr);
				strcat(buf, "{y)");
			}

			if (paf->bitvector)
			{
				switch (paf->where)
				{
				case TO_AFFECTS:
					sprintf(final, " with {w%s {yaffect", flag_string(
							affect_flags, paf->bitvector));
					break;

				case TO_OBJECT:
					sprintf(final, " with {w%s {yobject flag", flag_string(
							extra_flags, paf->bitvector));
					break;

				case TO_WEAPON:
					sprintf(final, " with {w%s {yweapon flag", flag_string(
							weapon_type2, paf->bitvector));
					break;

				case TO_SHIELDS:
					sprintf(final, " with {w%s {yshield", flag_string(
							shield_flags, paf->bitvector));
					break;

				case TO_RESIST:
					sprintf(final, " with {w%s {yresistance",
							flag_string(res_flags, paf->bitvector));
					break;

				case TO_IMMUNE:
					sprintf(final, " with {w%s {yimmunity",
							flag_string(imm_flags, paf->bitvector));
					break;

				case TO_VULN:
					sprintf(final, " with {w%s {yvulnerability",
							flag_string(vuln_flags, paf->bitvector));
					break;

				default:
					sprintf(final, " with unknown bit {w%d{y: %d", paf->where,
							paf->bitvector);
					break;
				}

				strcat(buf, final);
			}

			if (paf->duration > -1)
				sprintf(final, " for {w%d {yhours.", paf->duration);
			else
				sprintf(final, ".");
			strcat(buf, final);

			sprintf(final, "| {y%s {B|\n\r", end_string(buf, 75));
			add_buf(output, final);
			//	    }
		}
	}

	sprintf(buf, "( {x%s {B)", obj->short_descr);
	str_replace(buf, "{x", "{w");
	str_replace(buf, "{0", "{w");

	place = FALSE;
	while (strlen_color(buf) < 77)
	{
		if (place)
			strcat(buf, "=");
		else
		{
			sprintf(final, "=%s", buf);
			strcpy(buf, final);
		}
		place = !place;
	}

	sprintf(final, "{B %s{x\n\r", buf);
	add_buf(output, final);

	if (contents)
	{
		if (obj->item_type == ITEM_CONTAINER
				&& IS_SET( obj->value[1], CONT_CLOSED ))
		{
			sprintf(buf, "\n\r{x%s {+appears to be closed.\n\r",
					obj->short_descr);
			add_buf(output, buf);
		}

		if ((obj->item_type == ITEM_CONTAINER
				&& !IS_SET( obj->value[1], CONT_CLOSED )) || obj->item_type
				== ITEM_CORPSE_NPC || obj->item_type == ITEM_CORPSE_PC)
		{
			BUFFER *stats = show_list_to_char(obj->contains, ch, TRUE, TRUE );

			sprintf(buf, "\n\r{x%s {+holds{w:{x\n\r", obj->short_descr);
			add_buf(output, buf);

			add_buf(output, stats->string);
			free_buf(stats);
		}
	}

	return output;
}

const char * cost_string[MAX_AUCTION_PAYMENT] =
{ "silver", "gold", "platinum", "quest points" };

sh_int cost_lookup(char *argument)
{
	sh_int stat;

	for (stat = 0; stat < MAX_AUCTION_PAYMENT; stat++)
	{
		if (!str_prefix(argument, cost_string[stat]))
			return stat;
	}

	return -1;
}

bool can_cover_bid(CHAR_DATA *ch, int type, int amount)
{
	switch (type)
	{
	case VALUE_SILVER:
		if (ch->silver + (100 * ch->gold) + (10000 * ch->platinum) < amount)
			return FALSE;
		break;

	case VALUE_GOLD:
		if (ch->gold + (100 * ch->platinum) < amount)
			return FALSE;
		break;

	case VALUE_PLATINUM:
		if (ch->platinum < amount)
			return FALSE;
		break;

	case VALUE_QUEST_POINT:
		if ( ch->questpoints < amount )
			return FALSE;
		break;
	default:
		printf_debug("can_cover_bid: invalid bid type.");
		return FALSE;
	}

	return TRUE;
}

AUCTION_DATA * auction_lookup(int ticket)
{
	AUCTION_DATA *auction;

	for (auction = auction_list; auction != NULL; auction = auction->next)
	{
		if (auction->slot == ticket)
			return auction;
	}

	return NULL;
}

void auction_channel(CHAR_DATA *ch, OBJ_DATA *obj, char *msg)
{
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;

	sprintf(buf, "{+<{WAUCTION{+> %s{x", msg);

	for (d = descriptor_list; d != NULL; d = d->next)
	{
		CHAR_DATA *victim;

		victim = d->original ? d->original : d->character;

		if (d->connected == CON_PLAYING && victim
				&& !IS_SET(victim->comm,COMM_NOAUCTION)
				&& !IS_SET(victim->comm,COMM_QUIET))
			act_new(buf, victim, obj, ch, TO_CHAR, POS_DEAD );
	}
}

void do_auction(CHAR_DATA *ch, char * argument)
{
	AUCTION_DATA *auc, *pos_auc;
	OBJ_DATA *obj;
	char arg1[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
	char arg2[MAX_INPUT_LENGTH];
	sh_int found = 0;

	if (ch == NULL || IS_NPC( ch ))
		return;

	argument = one_argument(argument, arg1);
	argument = one_argument(argument, arg2);

	if (arg1[0] == '\0')
	{
		if (IS_SET( ch->comm, COMM_NOAUCTION ))
			send_to_char("Auction channel enabled.\n\r", ch);
		else
			send_to_char("Auction channel disabled.\n\r", ch);

		ch->comm ^= COMM_NOAUCTION;
		return;
	}

	if (IS_SET(ch->comm, COMM_NOAUCTION) || IS_SET(ch->comm, COMM_QUIET))
	{
		send_to_char(
				"You can't use the auction command with quiet or noauction set.\n\r",
				ch);
		return;
	}

	if (!str_prefix(arg1, "info") || !str_prefix(arg1, "show") || !str_prefix(
			arg1, "list") || !str_prefix(arg1, "items"))
	{
		BUFFER *final, *stats;
		char seller[MAX_INPUT_LENGTH];

		if (arg2[0] == '\0')
		{
			if (auction_list == NULL)
			{
				send_to_char("There is currently nothing up for auction.\n\r",
						ch);
				return;
			}

			final = new_buf();

			add_buf(
					final,
					"{C -{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{r( {RAUCTION {r){C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C- \n\r"
						"{C| {c*************************************************************************** {C|\n\r"
						"{C| {c* {wNu {c*   {wSeller   {c*            {wItem            {c*{wMn/Cr Bid{c*   {wBidder   {c* {wT {c* {C|\n\r"
						"{C| {c*************************************************************************** {C|\n\r");

			for (auc = auction_list; auc != NULL; auc = auc->next)
			{
				strcpy(seller, begin_string(PERS(auc->owner,ch), 10));

				sprintf(
						buf,
						"{C| {c* {w%2d {c* {w%s {c* {w%s {c*{w%7d {R%c{c* {w%s {c* {w%d {c* {C|\n\r",
						auc->slot, seller,
						can_see_obj(ch, auc->item) ? end_string(
								auc->item->short_descr, 26)
								: "Something                 ",
						auc->bid_amount, UPPER( *cost_string[auc->bid_type] ),
						auc->high_bidder == NULL ? "----------" : begin_string(
								PERS(auc->high_bidder,ch), 10),
						(AUCTION_LENGTH - auc->status));
				add_buf(final, buf);
			}

			add_buf(
					final,
					"{C| {c*************************************************************************** {C|\n\r"
						"{C -{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{r( {RAUCTION {r){C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{c={C-{x \n\r");

			page_to_char(final->string, ch);
			free_buf(final);
			return;
		}

		if (!is_number(arg2))
		{
			send_to_char("Syntax: auction info <ticket>.\n\r", ch);
			return;
		}

		if ((auc = auction_lookup(atoi(arg2))) == NULL)
		{
			send_to_char("Invalid auction ticket.\n\r", ch);
			return;
		}

		if (!auc->item)
		{
			send_to_char("Error, NULL object.\n\r", ch);
			return;
		}

		else
		{
			final = new_buf();

			if (!can_see_obj(ch, auc->item) || (!IS_IMMORTAL( ch ) && ch
					== auc->owner))
			{
				sprintf(buf,
						"{+The current bid is {Y%d {+%s by %s{+.{x\n\r\n\r",
						auc->bid_amount, cost_string[auc->bid_type],
						auc->high_bidder == NULL ? "no one"
								: PERS(auc->high_bidder,ch) );
				add_buf(final, buf);
			}
			else
			{
				sprintf(buf,
						"{+The current bid is {Y%d {+%s by %s{+.{x\n\r\n\r",
						auc->bid_amount, cost_string[auc->bid_type],
						auc->high_bidder == NULL ? "no one"
								: PERS(auc->high_bidder,ch) );
				add_buf(final, buf);

				stats = display_stats(auc->item, ch, TRUE );
				add_buf(final, stats->string);
				free_buf(stats);
			}

			page_to_char(final->string, ch);
			free_buf(final);
		}
		return;
	}

	if (!str_cmp(arg1, "stop"))
	{
		if (arg2[0] == '\0' || !is_number(arg2))
		{
			if (!str_cmp(arg2, "all"))
			{
				for (auc = auction_list; auc != NULL; auc = pos_auc)
				{
					pos_auc = auc->next;

					sprintf(buf, "stop %d", auc->slot);
					do_auction(ch, buf);
				}

				return;
			}

			send_to_char("Syntax: auction stop <[ticket #] / all>.\n\r", ch);
			return;
		}

		if ((auc = auction_lookup(atoi(arg2))) == NULL)
		{
			send_to_char("That is not a valid auction ticket number.\n\r", ch);
			return;
		}

		if (!IS_IMMORTAL( ch ) && auc->owner != ch)
		{
			send_to_char("You may only stop your own auctions.\n\r", ch);
			return;
		}

		sprintf(buf, "{+Ticket [{Y%d{+], {x$p{+, has been stopped by $N.{x",
				auc->slot);
		auction_channel(ch, auc->item, buf);

		act_new("You stop the auction of $p.", ch, auc->item, NULL, TO_CHAR,
				POS_DEAD);
		obj_to_char(auc->item, ch);

		if (auc->high_bidder != NULL)
		{
			add_cost(auc->high_bidder, auc->bid_amount, auc->bid_type);
			send_to_char("Your bid has been returned to you.\n\r",
					auc->high_bidder);
		}

		free_auction(auc);

		return;
	}

	if (IS_SET(ch->in_room->room_flags, ROOM_ARENA))
	{
		send_to_char(
				"You do not have access to this from within a bloody cell.\n\r",
				ch);
		return;
	}

	if (!str_prefix(arg1, "bid"))
	{
		int bid;

		if (arg2[0] == '\0' || !is_number(arg2) || argument[0] == '\0'
				|| !is_number(argument))
		{
			send_to_char("Syntax: auction bid <ticket> <amount>.\n\r", ch);
			return;
		}

		if ((auc = auction_lookup(atoi(arg2))) == NULL)
		{
			send_to_char("Invalid auction ticket.\n\r", ch);
			return;
		}

		if (auc->item == NULL)
		{
			send_to_char("Error, NULL Object!\n\r", ch);
			return;
		}

		if (!can_see_obj(ch, auc->item))
		{
			send_to_char("{+You can't see that item.{x\n\r", ch);
			return;
		}

		if (ch == auc->high_bidder)
		{
			send_to_char("{+You already have the highest bid.{x\n\r", ch);
			return;
		}

		if (ch == auc->owner)
		{
			send_to_char("{+Why bid on something you auctioned?{x\n\r", ch);
			return;
		}
		/*
		 if ( !str_cmp( ch->pcdata->socket, auc->owner->pcdata->socket ) )
		 {
		 send_to_char("{+You can not bid on your own auctions with your own characters.{x\n\r", ch );
		 return;
		 }
		 */
		bid = atoi(argument);

		if (bid < auc->bid_amount || bid <= 0 || (auc->high_bidder != NULL
				&& bid == auc->bid_amount))
		{
			sprintf(buf,
					"{+You must bid above the current bid of {Y%d {+%s.{x\n\r",
					auc->bid_amount, cost_string[auc->bid_type]);
			send_to_char(buf, ch);
			return;
		}

		if (!can_cover_bid(ch, auc->bid_type, bid))
		{
			send_to_char("{+You can not cover that bid.{x\n\r", ch);
			return;
		}

		if (ch->carry_number + get_obj_number(auc->item) > can_carry_n(ch))
		{
			send_to_char("You can't carry that many items.\n\r", ch);
			return;
		}

		if (get_carry_weight(ch) + get_obj_weight(auc->item) > can_carry_w(ch))
		{
			send_to_char("You can't carry that much weight.\n\r", ch);
			return;
		}

		sprintf(buf, "{+$N {+bids {Y%d {+%s for ticket [{Y%d{+], {x$p{+.{x",
				bid, cost_string[auc->bid_type], auc->slot);
		auction_channel(ch, auc->item, buf);

		if (auc->high_bidder != NULL)
			add_cost(auc->high_bidder, auc->bid_amount, auc->bid_type);

		deduct_cost(ch, bid, auc->bid_type);

		auc->high_bidder = ch;
		auc->bid_amount = bid;
		auc->status = 0;
		return;
	}

	if ((obj = get_obj_carry(ch, arg1)) == NULL)
	{
		send_to_char("{+You aren't carrying that item.{x\n\r", ch);
		return;
	}

	if (!can_drop_obj(ch, obj))
	{
		send_to_char("{+You can't let go of that item.{x\n\r", ch);
		return;
	}

	if (atoi(arg2) < 0)
	{
		send_to_char("{+Set the minimum just a little higher.{x\n\r", ch);
		return;
	}

	switch (obj->item_type)
	{
	default:
		break;

	case ITEM_CORPSE_PC:
	case ITEM_CORPSE_NPC:
		send_to_char("You can not auction that!\n\r", ch);
		return;
	}

	if (!IS_IMMORTAL( ch ))
	{
		for (auc = auction_list; auc != NULL; auc = auc->next)
		{
			if (auc->owner == ch)
			{
				if (++found >= 5)
				{
					send_to_char("Max auctions per person reached.\n\r", ch);
					return;
				}
			}
		}
	}

	if (argument[0] != '\0')
	{
		if ((found = cost_lookup(argument)) == -1)
		{
			send_to_char(
					"Minbid must be one of: silver, gold, platinum or iquest point.\n\r",
					ch);
			return;
		}
	}
	else
		found = VALUE_GOLD;

	auction_ticket++;

	auc = new_auction();

	if (arg2[0] == '\0')
		auc->bid_amount = 0;
	else
		auc->bid_amount = atoi(arg2);

	auc->owner = ch;
	auc->item = obj;
	auc->slot = auction_ticket;
	auc->bid_type = found;

	sprintf(buf,
			"{+[{Y%d{+] $N {+is now taking bids on{x $p{+. < {Y%d{+ %s >{x",
			auc->slot, auc->bid_amount, cost_string[auc->bid_type]);
	auction_channel(ch, auc->item, buf);

	obj_from_char(obj);

	if (auction_list == NULL)
		auction_list = auc;
	else
	{
		for (pos_auc = auction_list; pos_auc != NULL; pos_auc = pos_auc->next)
		{
			if (pos_auc->next == NULL)
			{
				pos_auc->next = auc;
				break;
			}
		}
	}
}

void auction_update()
{
	AUCTION_DATA *auc, *auc_next;
	char buf[MAX_STRING_LENGTH];

	for (auc = auction_list; auc != NULL; auc = auc_next)
	{
		auc_next = auc->next;

		if (auc->item == NULL)
			continue;

		if (++auc->status == AUCTION_LENGTH)
		{
			if (auc->high_bidder == NULL)
			{
				auction_channel(auc->owner, auc->item,
						"{+No bids on{x $p {+- item removed.{x");
				obj_to_char(auc->item, auc->owner);

				free_auction(auc);
			}
			else
			{
				sprintf(buf, "{x$p {+SOLD to $N {+for {Y%d {+%s.{x",
						auc->bid_amount, cost_string[auc->bid_type]);
				auction_channel(auc->high_bidder, auc->item, buf);

				add_cost(auc->owner, auc->bid_amount, auc->bid_type);

				sprintf(buf, "You sell $p for %d %s.", auc->bid_amount,
						cost_string[auc->bid_type]);
				act_new(buf, auc->owner, auc->item, NULL, TO_CHAR, POS_DEAD );

				obj_to_char(auc->item, auc->high_bidder);

				act_new("{x$p {+appears in your hands.{x", auc->high_bidder,
						auc->item, NULL, TO_CHAR, POS_DEAD );

				free_auction(auc);
			}
		}
		else
		{
			if (auc->high_bidder == NULL)
			{
				if (auc->status == AUCTION_LENGTH - 1)
					auction_channel(auc->owner, auc->item,
							"{+No bids on{x $p {+- item going twice.{x");

				else if (auc->status == AUCTION_LENGTH - 2)
					auction_channel(auc->owner, auc->item,
							"{+No bids on{x $p {+- item going once.{x");
			}
			else
			{
				if (auc->status == AUCTION_LENGTH - 1)
				{
					sprintf(buf,
							"{x$p {+- going twice at {Y%d {+%s to $N{+.{x",
							auc->bid_amount, cost_string[auc->bid_type]);
					auction_channel(auc->high_bidder, auc->item, buf);
				}
				else if (auc->status == AUCTION_LENGTH - 2)
				{
					sprintf(buf, "{x$p {+- going once at {Y%d {+%s to $N{+.{x",
							auc->bid_amount, cost_string[auc->bid_type]);
					auction_channel(auc->high_bidder, auc->item, buf);
				}
			}
		}
	}
}