//By xkilla.
#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"
void auction_channel( char * msg );
void do_auction( CHAR_DATA *ch, char * argument )
{
long questpoints =0;
OBJ_DATA * obj;
char arg1[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
if ( ch == NULL || IS_NPC(ch) )
return;
if ( arg1[0] == '\0')
{
if ( IS_SET(ch->deaf,COMM_NOAUCTION) )
{
REMOVE_BIT(ch->deaf,COMM_NOAUCTION );
send_to_char("Auction channel is now ON.\n\r",ch);
return;
}
SET_BIT(ch->deaf,COMM_NOAUCTION);
send_to_char("Auction channel is now OFF.\n\r",ch);
return;
}
if ( !str_cmp( arg1, "bid" ) )
{
long bid;
obj = auction_info.item;
if ( !obj )
{
send_to_char("#PT#phere is nothing up for auction right now.\n\r",ch);
return;
}
if ( argument[0] == '\0' )
{
send_to_char("#PY#pou must enter an amount to bid.\n\r",ch);
return;
}
bid = atol( argument );
if ( bid <= auction_info.current_bid )
{
sprintf(buf, "#PY#pou must bid above the current bid of %ld qps.\n\r",
auction_info.current_bid );
return;
}
if ( bid < MINIMUM_BID )
{
sprintf( buf, "#PT#phe minimum bid is #3%d #pqps.\n\r",MINIMUM_BID);
send_to_char(buf,ch);
return;
}
if ( (ch->pcdata->quest) < bid )
{
send_to_char("You can't cover that bid.\n\r",ch);
return;
}
sprintf(buf, "%ld qps has been offered for %s.\n\r",
bid, auction_info.item->short_descr);
auction_channel( buf );
if ( auction_info.high_bidder != NULL )
{
auction_info.high_bidder->pcdata->quest += auction_info.qps_held;
}
questpoints = UMIN( ch->pcdata->quest, bid );
if ( questpoints < bid )
{
questpoints = bid;
}
ch->pcdata->quest -= questpoints;
auction_info.qps_held = questpoints;
auction_info.high_bidder = ch;
auction_info.current_bid = bid;
auction_info.status = 0;
return;
}
if ( !str_cmp( arg1, "info" ) )
{
obj = auction_info.item;
if ( !obj )
{
send_to_char("#PT#phere is nothing up for auction right now.\n\r",ch);
return;
}
else
{
sprintf(buf,"#5QOwner: (%s) #3%s #2Bid: %ld #4Status: %ld#n \n\r", obj->questowner, obj->short_descr,
auction_info.current_bid, auction_info.status );
send_to_char(buf, ch );
return;
}
return;
}
if ( auction_info.item != NULL )
{
send_to_char("There is already another item up for bid.\n\r",ch);
return;
}
if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL )
{
send_to_char( "You do not have 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;
}
auction_info.owner = ch;
auction_info.item = obj;
auction_info.current_bid = 0;
auction_info.status = 0;
sprintf(buf,"#PN#pow taking bids on #3%s.\n\r", obj->short_descr );
auction_channel( buf );
obj_from_char( obj );
return;
}
void auction_update( )
{
char buf[MAX_STRING_LENGTH], temp[MAX_STRING_LENGTH],
temp1[MAX_STRING_LENGTH];
if ( auction_info.item == NULL )
return;
auction_info.status++;
if ( auction_info.status == AUCTION_LENGTH )
{
sprintf(buf,"#3%s #PS#pOLD to #3%s #pfor #3%ld #pqps.\n\r",
capitalize(auction_info.item->short_descr),
auction_info.high_bidder->name,
auction_info.current_bid );
auction_channel( buf );
auction_info.owner->pcdata->quest += auction_info.qps_held;
sprintf(temp1, "%ld qps ", auction_info.qps_held );
sprintf(buf, "You receive %s qps.\n\r",
auction_info.qps_held > 0 ? temp1 : "",
(auction_info.qps_held > 0));
send_to_char( buf, auction_info.owner );
obj_to_char( auction_info.item, auction_info.high_bidder );
sprintf(buf, "%s appears in your hands.\n\r",
capitalize(auction_info.item->short_descr) );
send_to_char( buf, auction_info.high_bidder );
auction_info.item = NULL;
auction_info.owner = NULL;
auction_info.high_bidder = NULL;
auction_info.current_bid = 0;
auction_info.status = 0;
auction_info.qps_held = 0;
return;
}
if ( auction_info.status == AUCTION_LENGTH - 1 )
{
sprintf(buf, "#3%s #P- #pgoing twice at #3%ld #pqps.\n\r",
capitalize(auction_info.item->short_descr),
auction_info.current_bid );
auction_channel( buf );
return;
}
if ( auction_info.status == AUCTION_LENGTH - 2 )
{
if ( auction_info.current_bid == 0 )
{
sprintf(buf, "#pNo bids on #3%s#p - item removed.\n\r",
auction_info.item->short_descr);
auction_channel( buf );
obj_to_char( auction_info.item, auction_info.owner );
sprintf(buf, "#3%s #pis returned to you.\n\r",
capitalize(auction_info.item->short_descr) );
send_to_char( buf, auction_info.owner );
auction_info.item = NULL;
auction_info.owner = NULL;
auction_info.current_bid = 0;
auction_info.status = 0;
return;
}
sprintf(buf, "#3%s #P- #pgoing once at #3%ld #pqps.\n\r",
capitalize(auction_info.item->short_descr),
auction_info.current_bid );
auction_channel( buf );
return;
}
return;
}
void auction_channel( char * msg )
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
sprintf(buf, "\n\r#P[#pAUCTION#P] #3%s", 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->deaf,COMM_NOAUCTION))
{
send_to_char( buf, victim );
}
}
return;
}