#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
/* I stole this idea from someplace like aardwolf or something...
it's my code but I am sure this is close to how they did it. */
void
do_bid (CHAR_DATA * ch, char *argy)
{
char general_use[STD_LENGTH*3];
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
AUCTION *auct;
int auct_number;
long bid;
long prevbids;
DEFINE_COMMAND ("bid", do_bid, POSITION_SLEEPING, 0, LOG_NORMAL, "This command allows you to bid on an auction.")
if (IS_MOB (ch))
return;
if (LEVEL (ch) > IMM_LEVEL && LEVEL (ch) < MAX_LEVEL)
{
send_to_char ("You can't bid! You're an immortal.\n\r", ch);
return;
}
if (ch->in_room->vnum < 1000)
{
send_to_char("No auction for you Portalwhore!!!!\n\r", ch);
return;
}
if (IS_SET(ch->act, PLR_NOAUCTION))
{
send_to_char("Due to your abuse of the auction command, you cannot use it anymore. There is no imm command to undo this status.\n\r", ch);
return;
}
if (argy[0] == '\0')
{
bool found = FALSE;
for (auct = auction_list; auct != NULL; auct =auct->next)
{
if (auct->bychar && !DIFF_ALIGN(auct->bychar, ch))
{
found = TRUE;
sprintf(general_use, "\x1b[1;34m#\x1b[1;32m[\x1b[1;33m%d\x1b[1;32m]\x1b[0;37m: %s\x1b[0;37m by %s, Bid: %ld, Minbid: %ld\n\r",
auct->number, auct->item_name, NAME(auct->bychar), auct->bid, auct->minbid);
send_to_char (general_use, ch);
}
}
if (!found)
{
send_to_char("There is currently nothing up for auction.\n\r", ch);
return;
}
else
{
send_to_char("Type bid <amount> <auction number> to bid on an item.\n\r", ch);
return;
}
}
argy = one_argy(argy, arg1);
argy = one_argy(argy, arg2);
if (!is_number(arg1) || !is_number(arg2))
{
send_to_char("Syntax: bid <amount> <auction number>\n\r", ch);
return;
}
bid = atoi(arg1);
auct_number = atoi(arg2);
REMOVE_BIT(ch->pcdata->deaf, CHANNEL_AUCTION);
prevbids = 0;
for (auct = auction_list; auct != NULL; auct = auct->next)
{
if (auct->tochar == ch)
prevbids += auct->bid;
}
for (auct = auction_list; auct != NULL; auct = auct->next)
{
if (auct->number == auct_number)
{
if (LEVEL(ch) < MAX_LEVEL && DIFF_ALIGN(ch, auct->bychar))
{
send_to_char("There is no auction of that number going on.\n\r", ch);
return;
}
if (ch == auct->bychar)
{
send_to_char("You cannot bid on your own item!\n\r", ch);
return;
}
if (ch == auct->tochar)
{
send_to_char("You already have the highest bid on that item.\n\r", ch);
return;
}
if (bid < auct->minbid || bid < auct->bid + 100 || ch->pcdata->bank < bid + prevbids)
{
sprintf(general_use,"You must beat the current bid of %ld by at least 100 coins, the current minbid of %ld, and you must have the money in the bank to cover this bid and all other current bids!\n\r", auct->bid, auct->minbid);
send_to_char(general_use, ch);
return;
}
auct->going = 0;
auct->tochar = ch;
auct->bid = bid;
sprintf (general_use, "I'll pay %ld coins for \x1B[1;37m%s\x1B[1;34m!\x1b[0;37m", bid, auct->item_name);
do_auction(ch, general_use, auct->number);
return;
}
}
send_to_char("There is no auction of that number going on.\n\r", ch);
return;
}
void clear_auction(AUCTION *auct)
{
AUCTION *prev;
if(auct->item && auct->bychar)
obj_to(auct->item, auct->bychar);
auct->item = NULL;
auct->tochar = NULL;
auct->number = 0;
auct->minbid = 0;
auct->bid = 0;
auct->item_name[0] = '\0';
auct->bychar = NULL;
if (auct == auction_list)
{
auction_list = auct->next;
auct->next = NULL;
free_m(auct);
return;
}
for (prev = auction_list; prev != NULL; prev = prev->next)
if (prev->next == auct)
break;
if (prev == NULL)
{
fprintf(stderr, "BUG: Tried to remove null member from auction list!\n");
return;
}
else
{
prev->next = auct->next;
auct->next = NULL;
free_m(auct);
}
return;
}
AUCTION *
new_auction (void)
{
AUCTION *auc;
auc = mem_alloc (sizeof (*auc));
auc->bychar = NULL;
auc->tochar = NULL;
auc->minbid = 100;
auc->bid = 0;
auc->item = NULL;
auc->item_name[0] = '\0';
auc->number = 0;
auc->going = 0;
auc->next = auction_list;
auction_list = auc;
return auc;
}
void
do_tauction (CHAR_DATA * ch, char *argy) /*By Owen Emlen */
{
SINGLE_OBJECT *tobj;
char buff[1024];
char arg1[SML_LENGTH];
char arg2[SML_LENGTH];
int ocost;
AUCTION *auct_new = NULL;
DEFINE_COMMAND ("auction", do_tauction, POSITION_SLEEPING, 0, LOG_NORMAL, "This command allows you to auction a piece of equipment.")
if (IS_MOB (ch))
return;
if (IS_SET (ch->pcdata->deaf, CHANNEL_AUCTION))
{
send_to_char ("But you aren't even listening to the auction channel!\n\r", ch);
return;
}
if (pow.auction_lag && ch->pcdata->no_quit_pk > 0)
{
send_to_char("You must wait for your PKill no-quit timer to run out before you auction.\n\r",ch);
return;
}
if (FIGHTING (ch))
{
send_to_char ("You cannot auction while fighting.\n\r", ch);
return;
}
if (LEVEL (ch) > 99 && LEVEL(ch) < MAX_LEVEL)
{
send_to_char ("You cannot auction items as an immortal!\n\r", ch);
return;
}
if (IS_SET(ch->act, PLR_NOAUCTION))
{
send_to_char("Due to your abuse of the auction command, you cannot use it anymore. There is no imm command to undo this status.\n\r", ch);
return;
}
if (ch->in_room->vnum < 1000)
{
send_to_char("No auction for you Portalwhore!!!!\n\r", ch);
return;
}
if (argy[0] == '\0')
{
send_to_char ("Syntax: Auction <item> <min-bid> <y/n>\n\r", ch);
send_to_char ("Or : Auction halt\n\r", ch);
send_to_char ("Note : Min-bid is in # of COPPER coins\n\r", ch);
send_to_char (" : <y/n> is autotransfer (exclude y/n to see cost)\n\r", ch);
return;
}
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
if (!str_cmp (arg1, "halt"))
{
int halt_number = atoi(arg2);
AUCTION *auct = NULL;
AUCTION *auctn = NULL;
AUCTION *prev = NULL;
if (!is_number(arg2) || halt_number < 0)
{
send_to_char("Auction halt <auction_number>.\n\r", ch);
return;
}
for (auct = auction_list; auct != NULL; auct = auctn)
{
auctn = auct->next;
if (auct->bychar == ch && auct->number == halt_number)
{
if (auct->going > 1)
{
send_to_char("You cannot withdraw this late into the auction!\n\r", ch);
return;
}
sprintf(buff, "Auction of %s halted.\n\r", auct->item_name);
do_auction(ch, buff, auct->number);
clear_auction(auct);
ch->pcdata->auction_count += 50;
if (ch->pcdata->auction_count > 400)
{
send_to_char("Due to abuse of auction, you cannot use it anymore. There is no imm command to undo this status.\n\r", ch);
SET_BIT(ch->act, PLR_NOAUCTION);
}
return;
}
}
send_to_char("You are not selling anything!\n\r", ch);
return;
}
for (auct_new = auction_list; auct_new != NULL; auct_new = auct_new->next)
{
if (auct_new->bychar == ch)
{
send_to_char("You are already auctioning something.\n\r", ch);
return;
}
}
if ((tobj = get_obj_inv (ch, arg1)) == NULL)
{
send_to_char ("You do not have that item!\n\r", ch);
return;
}
if (tobj->wear_loc != -1 || tobj->in_obj != NULL)
{
send_to_char ("The object must be in your inventory!\n\r", ch);
return;
}
if (!is_number (arg2))
{
send_to_char ("Syntax: Auction <item> <min bid # of coins> <y/n>\n\r", ch);
send_to_char ("Or : Auction halt\n\r", ch);
send_to_char ("Note : Min-bid is in # of COPPER coins\n\r", ch);
send_to_char (" : <y/n> is autotransfer (exclude y/n to see cost)\n\r", ch);
return;
}
ocost = atoi (arg2);
if (ocost > 200000000)
{
send_to_char ("The maximum auction price is 200000000 coins.\n\r", ch);
return;
}
if (ocost < 100 || tobj->cost < 10)
{
send_to_char ("Why bother selling something that cheap anyways!\n\r", ch);
return;
}
if (ch->pcdata->bank < tobj->cost/7)
{
send_to_char ("You don't have enough money in the bank to autotransfer.\n\r", ch);
return;
}
ch->pcdata->bank -= tobj->cost/7;
obj_from (tobj);
auct_new = new_auction();
auct_new->bychar = ch;
auct_new->item = tobj;
auct_new->minbid = ocost + (tobj->cost/7);
strcpy(auct_new->item_name, OOSTR(tobj, short_descr));
auct_new->bid = 0;
auct_new->number = ++auction_number;
sprintf (buff, "<\x1B[1;37m%s\x1B[1;34m> MinBid: %d.",auct_new->item_name, auct_new->minbid);
do_auction (ch, buff, auct_new->number);
if (tobj->pIndexData->item_type == ITEM_WEAPON || tobj->pIndexData->item_type == ITEM_ARMOR)
{
get_condition (tobj);
sprintf (buff, "Condition [%s]. Type BID to list all current auctions.",
condition_var);
do_auction (ch, buff, auct_new->number);
}
ch->pcdata->listen_auction = TRUE;
ch->pcdata->auction_count += 50;
if (ch->pcdata->auction_count > 400)
{
send_to_char("Due to abuse of auction, you cannot use it anymore. There is no imm command to undo this status.\n\r", ch);
SET_BIT(ch->act, PLR_NOAUCTION);
}
return;
}
void
do_auction (CHAR_DATA * ch, char *argy, int number)
{
char temp[STD_LENGTH];
DESCRIPTOR_DATA *dd;
sprintf (temp, "\x1B[1;32m<A> \x1b[1;34m#\x1b[1;32m[\x1b[1;33m%d\x1b[1;32m]\x1b[0;37m\x1B[34m[\x1B[1;37m%s\x1B[1;34m] %s\x1B[0;37m\n\r", number, NAME (ch), argy);
for (dd = descriptor_list; dd != NULL; dd = dd->next)
{
if (!dd->character || dd->connected != CON_PLAYING)
continue;
if (DIFF_ALIGN(dd->character, ch))
continue;
if (IS_SET (dd->character->pcdata->deaf, CHANNEL_AUCTION))
continue;
send_to_char (temp, dd->character);
}
return;
}
void
auction_update ()
{
char general_use[STD_LENGTH];
AUCTION *auct;
AUCTION *auctn;
AUCTION *prev;
for (auct = auction_list; auct != NULL; auct = auctn)
{
auctn = auct->next;
if (auct->bid == 0)
{
if (++auct->going > 2)
{
sprintf (general_use, "Due to lack of interest, \x1B[1;37m%s\x1B[1;34m is no longer for sale.", auct->item_name);
do_auction (auct->bychar, general_use, auct->number);
clear_auction(auct);
continue;
}
entlab = 610;
sprintf (general_use, "Anyone? \x1B[1;37m%s\x1B[1;34m for %d coins?", auct->item_name, auct->minbid);
do_auction (auct->bychar, general_use, auct->number);
continue;
}
if (++auct->going < 3)
{
entlab = 620;
if (auct->going == 1)
{
sprintf (general_use, "\x1B[1;37m%s\x1B[1;34m is going once to %s for %d coins.", capitalize (auct->item_name), NAME (auct->tochar), auct->bid);
do_auction (auct->bychar, general_use, auct->number);
continue;
}
if (auct->going == 2)
{
sprintf (general_use, "\x1B[1;37m%s\x1B[1;34m is going TWICE to %s for %d coins.", capitalize (auct->item_name), NAME (auct->tochar), auct->bid);
do_auction (auct->bychar, general_use, auct->number);
continue;
}
}
if (auct->going >= 3)
{
sprintf (general_use, "\x1B[1;37m%s\x1B[1;34m has been SOLD to %s for %d coins.", auct->item_name, NAME (auct->tochar), auct->bid);
do_auction (auct->bychar, general_use, auct->number);
sprintf (general_use, "You won the auction!\n\rITEM: <%s> with your bid of %d coins.\n\r", auct->item_name, auct->bid);
send_to_char (general_use, auct->tochar);
send_to_char ("Item and money have been auto transferred.\n\r", auct->bychar);
auct->bychar->pcdata->bank += auct->bid;
auct->tochar->pcdata->bank -= auct->bid;
if(auct->item && auct->tochar)
obj_to (auct->item, auct->tochar);
auct->item = NULL;
clear_auction(auct);
continue;
}
}
return;
}