/* Auction.c */
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include "merc.h"
#include "recycle.h"
CH_CMD ( do_auction )
{
AUCTION_DATA *auc;
AUCTION_DATA *p;
OBJ_DATA *obj = NULL;
long minbid = 0;
int count;
char arg1[MAX_INPUT_LENGTH];
char buf1[MAX_STRING_LENGTH];
argument = one_argument ( argument, arg1 );
if ( ch == NULL || IS_NPC ( ch ) )
return;
/* Requesting info on the item */
if ( arg1[0] == '\0' || !str_cmp ( arg1, "info" ) )
{
if ( auction_list == NULL )
{
send_to_char ( "There's nothing up for auction right now.\n\r",
ch );
return;
}
obj = auction_list->item;
if ( !obj )
{
send_to_char ( "There's nothing up for auction right now.\n\r",
ch );
return;
}
if ( ch == auction_list->owner && !IS_IMMORTAL ( ch ) )
{
sprintf ( buf1, "You're auctioning %s.\n\r", obj->short_descr );
send_to_char ( buf1, ch );
return;
}
show_obj_stats ( ch, obj );
return;
} /* Aborting the auction */
else if ( !str_cmp ( arg1, "stop" ) && IS_IMMORTAL ( ch ) )
{
if ( auction_list == NULL )
{
send_to_char ( "There's nothing up for auction right now.\n\r",
ch );
return;
}
auction_channel ( "{!A God has stopped the auction!{x\n\r", FALSE );
if ( auction_list->high_bidder != NULL )
auction_list->high_bidder->gold += auction_list->gold_held;
if ( auction_list->item != NULL )
{
obj_to_char ( auction_list->item, ch );
sprintf ( buf1, "%s appears in your hands.\n\r",
auction_list->item->short_descr );
send_to_char ( buf1, ch );
}
reset_auc ( auction_list );
return;
}
else if ( !str_cmp ( arg1, "talk" ) )
{ /*
send_to_char(ch,"{YS{Wo{wr{Wr{Yy{x, this option is not currently availible.{x\n\r");
*/
return;
}
/* Listing the items for sale */
else if ( !str_cmp ( arg1, "list" ) )
{
if ( auction_list == NULL )
{
send_to_char ( "There is nothing up for auction right now!\n\r",
ch );
return;
}
if ( auction_list->next == NULL )
{
do_auction ( ch, "info" );
return;
}
for ( count = 1, auc = auction_list; auc; auc = auc->next, count++ )
{
if ( auc->item != NULL && auc->item->short_descr != NULL &&
auc->owner != NULL && auc->owner->name != NULL )
{
if ( !IS_IMMORTAL ( ch ) )
sprintf ( buf1,
"`{-({^%d{8.{x (`8Min Bid: {!%5ld{x) %s\n\r",
count, auc->min_bid, auc->item->short_descr );
else
sprintf ( buf1,
"{8-({^%d{8.{x ({#N{3ame{8: {#%-20s {8Min Bid: {!%5ld{x) %s\n\r",
count, auc->owner->name, auc->min_bid,
auc->item->short_descr );
send_to_char ( buf1, ch );
}
}
return;
} /* Bidding on an item */
else if ( !str_cmp ( arg1, "bet" ) )
{
long bid = 0;
if ( auction_list == NULL )
{
send_to_char ( "There's nothing up for auction right now.\n\r",
ch );
return;
}
obj = auction_list->item;
if ( !obj )
{
send_to_char ( "There's nothing up for auction right now.\n\r",
ch );
return;
}
if ( ch == auction_list->high_bidder )
{
send_to_char ( "You already have the highest bid!\n\r", ch );
return;
}
if ( ch == auction_list->owner )
{
send_to_char ( "You cannot bid on your own items!\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char ( "How much did you say you were bidding?\n\r", ch );
return;
}
bid = atol ( argument );
if ( bid > ( ch->gold + ( ch->platinum * 100 ) ) )
/*if ( ch->gold < bid ) */
{
send_to_char ( "You can't cover that bid.\n\r", ch );
return;
}
if ( bid < auction_list->min_bid )
{
sprintf ( buf1, "The minimum bid is %ld gold.\n\r",
auction_list->min_bid );
send_to_char ( buf1, ch );
return;
}
if ( bid <= auction_list->current_bid )
{
if ( bid < ( auction_list->current_bid + 10 ) )
{
send_to_char
( "You have to outbid the current amount by atleast 10 gold.",
ch );
return;
}
sprintf ( buf1,
"You must bid above the current bid of %ld gold.\n\r",
auction_list->current_bid );
return;
}
sprintf ( buf1, "%ld gold has been offered for %s.\n\r", bid,
auction_list->item->short_descr );
auction_channel ( buf1, FALSE );
if ( auction_list->high_bidder != NULL )
auction_list->high_bidder->gold += auction_list->gold_held;
deduct_cost ( ch, bid, VALUE_GOLD );
auction_list->gold_held = bid;
auction_list->high_bidder = ch;
auction_list->current_bid = bid;
auction_list->status = 0;
return;
}
/* Putting up an item for sale */
if ( ( obj = get_obj_carry ( ch, arg1 ) ) == NULL )
{
send_to_char ( "You aren't carrying that item.\n\r", ch );
return;
}
if ( IS_OBJ_STAT ( obj, ITEM_NODROP ) )
{
send_to_char ( "You can't let go of that item.\n\r", ch );
return;
}
if ( count_auc ( ch ) >= 3 )
{
send_to_char ( "You are only allowed to auction 3 items a time!\n\r",
ch );
return;
}
if ( argument[0] != '\0' )
minbid = atol ( argument );
if ( minbid > 10000 )
minbid = 10000;
if ( auction_list == NULL )
{
auc = new_auction ( );
auction_list = auc;
auction_list->next = NULL;
}
else
{
auc = new_auction ( );
for ( p = auction_list; p; p = p->next )
{
if ( p->next == NULL )
p->next = auc;
auc->next = NULL;
}
}
auc->owner = ch;
auc->item = obj;
auc->current_bid = 0;
auc->status = -1;
if ( minbid > 0 )
auc->min_bid = minbid;
else
auc->min_bid = 0;
if ( auc == auction_list )
update_auc ( );
obj_from_char ( obj );
return;
}
void update_auc ( void )
{
char buf1[MAX_STRING_LENGTH];
char temp[MAX_STRING_LENGTH];
if ( auction_list != NULL && auction_list->item != NULL )
{
auction_list->status++;
if ( auction_list->current_bid == 0 )
{
if ( auction_list->status == 0 )
{
sprintf ( buf1, "Now taking bids on %s%s",
auction_list->item->short_descr,
auction_list->min_bid > 0 ? "" : ".\n\r" );
if ( auction_list->min_bid > 0 )
{
sprintf ( temp, " ({8Min Bid {!%ld{x)\n\r",
auction_list->min_bid );
strcat ( buf1, temp );
}
auction_channel ( buf1, FALSE );
}
if ( auction_list->status == AUCTION_LENGTH )
{
sprintf ( buf1, "No bids on %s - item removed.\n\r",
auction_list->item->short_descr );
auction_channel ( buf1, FALSE );
obj_to_char ( auction_list->item, auction_list->owner );
sprintf ( buf1, "%s is returned to you.\n\r",
capitalize ( auction_list->item->short_descr ) );
send_to_char ( buf1, auction_list->owner );
reset_auc ( auction_list );
if ( auction_list != NULL )
update_auc ( );
return;
}
if ( auction_list->status == AUCTION_LENGTH - 1 )
{
sprintf ( buf1,
"%s - going twice ({8No Bids Received{x).\n\r",
capitalize ( auction_list->item->short_descr ) );
auction_channel ( buf1, FALSE );
return;
}
if ( auction_list->status == AUCTION_LENGTH - 2 )
{
sprintf ( buf1, "%s - going once ({8No Bids Received{x).\n\r",
capitalize ( auction_list->item->short_descr ) );
auction_channel ( buf1, FALSE );
return;
}
}
else
{
if ( auction_list->status == AUCTION_LENGTH )
{
sprintf ( buf1, "%s sold to %s for %ld gold.\n\r",
capitalize ( auction_list->item->short_descr ),
auction_list->high_bidder->name,
auction_list->current_bid );
auction_channel ( buf1, FALSE );
auction_list->owner->gold +=
( auction_list->gold_held * 9 ) / 10;
sprintf ( temp, "You recieve %ld goldcoin%s.\n\r",
( ( auction_list->gold_held * 9 ) / 10 ) >
0 ? ( auction_list->gold_held * 9 ) / 10 : 0,
( ( auction_list->gold_held * 9 ) / 10 ) !=
1 ? "s" : "" );
send_to_char ( buf1, auction_list->owner );
obj_to_char ( auction_list->item, auction_list->high_bidder );
sprintf ( buf1, "%s appears in your hands.\n\r",
capitalize ( auction_list->item->short_descr ) );
send_to_char ( buf1, auction_list->high_bidder );
reset_auc ( auction_list );
if ( auction_list != NULL )
update_auc ( );
return;
}
if ( auction_list->status == AUCTION_LENGTH - 1 )
{
sprintf ( buf1, "%s - going twice at %ld gold.\n\r",
capitalize ( auction_list->item->short_descr ),
auction_list->current_bid );
auction_channel ( buf1, FALSE );
return;
}
if ( auction_list->status == AUCTION_LENGTH - 2 )
{
sprintf ( buf1, "%s - going once at %ld gold.\n\r",
capitalize ( auction_list->item->short_descr ),
auction_list->current_bid );
auction_channel ( buf1, FALSE );
return;
}
}
}
return;
}
void auction_channel ( char *msg, bool iauc )
{
char buf1[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
sprintf ( buf1, "\n\r%s %s", iauc ? "{8({!I{1mmauctio{!n{8){x" : "{8({7Au{&cti{7on{8){x", msg ); /* Add
color if you wish */
for ( d = descriptor_list; d != NULL; d = d->next )
{
CHAR_DATA *victim;
victim = d->original ? d->original : d->character;
if ( d->connected == CON_PLAYING &&
!IS_SET ( victim->comm, COMM_NOAUCTION ) &&
!IS_SET ( victim->comm, COMM_QUIET ) )
{
send_to_char ( buf1, victim );
}
}
return;
}
void reset_auc ( AUCTION_DATA * auc )
{
if ( !IS_VALID ( auc ) )
return;
auc->current_bid = 0;
auc->gold_held = 0;
auc->high_bidder = NULL;
auc->item = NULL;
auc->min_bid = 0;
auc->owner = NULL;
auc->status = 0;
if ( auc == auction_list )
{
if ( auc->next != NULL )
auction_list = auc->next;
else
auction_list = NULL;
free_auction ( auc );
return;
}
free_auction ( auc );
return;
}
int count_auc ( CHAR_DATA * ch )
{
AUCTION_DATA *q;
int count;
q = auction_list;
if ( !q )
return 0;
for ( count = 0; q; q = q->next )
{
if ( q->owner == ch )
count++;
}
return count;
}
void show_obj_stats ( CHAR_DATA * ch, OBJ_DATA * obj )
{
char buf1[MAX_STRING_LENGTH];
AFFECT_DATA *paf;
sprintf ( buf1,
"{^O{6bject {!%s{6 is type {^%s{6, extra flags {^%s{6.{x\n\r{^W{6eight is {^%d{6, value is {^%d{6, level is {#%d{6.{x\n\r",
obj->name, item_name ( obj->item_type ),
extra_bit_name ( obj->extra_flags ), obj->weight / 10,
obj->cost, obj->level );
send_to_char ( buf1, ch );
switch ( obj->item_type )
{
case ITEM_SCROLL:
case ITEM_POTION:
case ITEM_PILL:
sprintf ( buf1, "{^L{6evel {#%ld {6spells of:", obj->value[0] );
send_to_char ( buf1, ch );
if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL )
{
send_to_char ( " {6", ch );
send_to_char ( skill_table[obj->value[1]].name, ch );
send_to_char ( "{6{x", ch );
}
if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL )
{
send_to_char ( " {6{^", ch );
send_to_char ( skill_table[obj->value[2]].name, ch );
send_to_char ( "{6{x", ch );
}
if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
{
send_to_char ( " {6{^", ch );
send_to_char ( skill_table[obj->value[3]].name, ch );
send_to_char ( "{6{x", ch );
}
if ( obj->value[4] >= 0 && obj->value[4] < MAX_SKILL )
{
send_to_char ( " {6{^", ch );
send_to_char ( skill_table[obj->value[4]].name, ch );
send_to_char ( "{6{x", ch );
}
send_to_char ( "{x.\n\r", ch );
break;
case ITEM_WAND:
case ITEM_STAFF:
sprintf ( buf1, "{^H{6as {#%ld {6charges of level {^%ld{x",
obj->value[2], obj->value[0] );
send_to_char ( buf1, ch );
if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL )
{
send_to_char ( " {6{^", ch );
send_to_char ( skill_table[obj->value[3]].name, ch );
send_to_char ( "{6{x", ch );
}
send_to_char ( "{x.\n\r", ch );
break;
case ITEM_DRINK_CON:
sprintf ( buf1, "{^I{6t holds %s{6-colored {^%s{x.\n\r",
liq_table[obj->value[2]].liq_color,
liq_table[obj->value[2]].liq_name );
send_to_char ( buf1, ch );
break;
case ITEM_CONTAINER:
sprintf ( buf1,
"{^C{6apacity: {^%ld{6# Maximum weight: {^%ld{6# flags: {^%s{x\n\r",
obj->value[0], obj->value[3],
cont_bit_name ( obj->value[1] ) );
send_to_char ( buf1, ch );
if ( obj->value[4] != 100 )
{
sprintf ( buf1, "{^W{6eight multiplier: {#%ld{x%%\n\r",
obj->value[4] );
send_to_char ( buf1, ch );
}
break;
case ITEM_WEAPON:
send_to_char ( "{^W{6eapon type is ", ch );
switch ( obj->value[0] )
{
case ( WEAPON_EXOTIC ):
send_to_char ( "{^exotic{6.{x\n\r", ch );
break;
case ( WEAPON_SWORD ):
send_to_char ( "{^sword{6.{x\n\r", ch );
break;
case ( WEAPON_DAGGER ):
send_to_char ( "{^dagger{6.{x\n\r", ch );
break;
case ( WEAPON_SPEAR ):
send_to_char ( "{^spear{/{^staff{6.{x\n\r", ch );
break;
case ( WEAPON_MACE ):
send_to_char ( "{^mace{/{^club6.{x\n\r", ch );
break;
case ( WEAPON_AXE ):
send_to_char ( "{^axe{6.{x\n\r", ch );
break;
case ( WEAPON_FLAIL ):
send_to_char ( "{^flail{6.{x\n\r", ch );
break;
case ( WEAPON_WHIP ):
send_to_char ( "{^whip{6.{x\n\r", ch );
break;
case ( WEAPON_POLEARM ):
send_to_char ( "{^polearm{x6.{x\n\r", ch );
break;
default:
send_to_char ( "{!unknown{6.{x\n\r", ch );
break;
}
if ( obj->pIndexData->new_format )
sprintf ( buf1,
"{^D{6amage is {!%ld{6d{!%ld {6({8average {#%ld{6).{x\n\r",
obj->value[1], obj->value[2],
( 1 + obj->value[2] ) * obj->value[1] / 2 );
else
sprintf ( buf1,
"{^D{6amage is {!%ld {6to {!%ld {6({8average {#%ld{6).{x\n\r",
obj->value[1], obj->value[2],
( obj->value[1] + obj->value[2] ) / 2 );
send_to_char ( buf1, ch );
if ( obj->value[4] ) /* weapon flags */
{
sprintf ( buf1, "{^W{6eapons flags: {^%s{x\n\r",
weapon_bit_name ( obj->value[4] ) );
send_to_char ( buf1, ch );
}
break;
case ITEM_ARMOR:
sprintf ( buf1,
"{^A{6rmor class is {#%ld {8p{7i{&er{7c{8e{6, {#%ld {8b{7a{&s{8h{6, {#%ld {8s{7l{&a{7s{8h{6, and {#%ld {6vs. {4m{+a{4gi{+c{6.{x\n\r",
obj->value[0], obj->value[1], obj->value[2],
obj->value[3] );
send_to_char ( buf1, ch );
break;
}
if ( !obj->enchanted )
for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
{
if ( paf->location != APPLY_NONE && paf->modifier != 0 )
{
sprintf ( buf1, "{^A{6ffects {^%s {6by {#%d{6.{x\n\r",
affect_loc_name ( paf->location ), paf->modifier );
send_to_char ( buf1, ch );
if ( paf->bitvector )
{
switch ( paf->where )
{
case TO_AFFECTS:
sprintf ( buf1, "{^A{6dds {!%s {6affect.{x\n\r",
affect_bit_name ( paf->bitvector ) );
break;
case TO_OBJECT:
sprintf ( buf1,
"{^A{6dds {!%s {6object flag.{x\n\r",
extra_bit_name ( paf->bitvector ) );
break;
case TO_IMMUNE:
sprintf ( buf1,
"{^A{6dds {8i{7m{&muni{7t{8y{6 to {!%s{6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
case TO_RESIST:
sprintf ( buf1,
"{^A{6dds {!r{1e{8s{7i{&st{7a{8n{1c{!e {6to {!%s{6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
case TO_VULN:
sprintf ( buf1,
"{^A{6dds {@v{2u{8l{7n{&erabi{7l{8i{2t{@y {6to {!%s{6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
default:
sprintf ( buf1,
"{!U{6nknown bit {#%d{1: {!%ld{1.{x\n\r",
paf->where, paf->bitvector );
break;
}
send_to_char ( buf1, ch );
}
}
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
if ( paf->location != APPLY_NONE && paf->modifier != 0 )
{
sprintf ( buf1, "{^A{6ffects {^%s {6by {#%d{x",
affect_loc_name ( paf->location ), paf->modifier );
send_to_char ( buf1, ch );
if ( paf->duration > -1 )
sprintf ( buf1, ", {!%d {6hours.{x\n\r", paf->duration );
else
sprintf ( buf1, "{6.{x\n\r" );
send_to_char ( buf1, ch );
if ( paf->bitvector )
{
switch ( paf->where )
{
case TO_AFFECTS:
sprintf ( buf1, "{^A{6dds {!%s {6affect.{x\n\r",
affect_bit_name ( paf->bitvector ) );
break;
case TO_OBJECT:
sprintf ( buf1, "{^A{6dds {!%s {6object flag.{x\n\r",
extra_bit_name ( paf->bitvector ) );
break;
case TO_WEAPON:
sprintf ( buf1, "{^A{6dds {!%s {6weapon flags.{x\n\r",
weapon_bit_name ( paf->bitvector ) );
break;
case TO_IMMUNE:
sprintf ( buf1,
"{^A{6dds {8i{7m{&muni{7t{8y {6to {!%s{6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
case TO_RESIST:
sprintf ( buf1,
"{^A{6dds {!r{1e{8s{7i{&st{7a{8n{1c{!e {6to {!%s{x6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
case TO_VULN:
sprintf ( buf1,
"{^A{6dds {@v{2u{8l{7n{&erabi{7l{8i{2t{@y {6to {!%s{6.{x\n\r",
imm_bit_name ( paf->bitvector ) );
break;
default:
sprintf ( buf1,
"{!U{1nknown bit {#%d{1: {!%ld{1.{x\n\r",
paf->where, paf->bitvector );
break;
}
send_to_char ( buf1, ch );
}
}
}
return;
}