/*************************************************************************** * This file contains auction code developed by Brian Babey, and any * * communication regarding it should be sent to [bbabey@iname.com] * * Web Address: http://www.erols.com/bribe/ * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ #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" DECLARE_DO_FUN( do_auction ); void show_obj_stats( CHAR_DATA *ch, OBJ_DATA *obj ); void auction_channel( char * msg ); void do_auction( CHAR_DATA *ch, char * argument ) { long platinum=0, gold=0; OBJ_DATA * obj; char arg1[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; int i; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if ( ch == NULL || IS_NPC(ch) ) return; if ( arg1[0] == '\0') { if ( IS_SET(ch->comm,COMM_NOAUCTION) ) { REMOVE_BIT(ch->comm,COMM_NOAUCTION ); send_to_char("Auction channel is now ON.\n\r",ch); return; } SET_BIT(ch->comm,COMM_NOAUCTION); send_to_char("Auction channel is now OFF.\n\r",ch); return; } if ( !str_cmp( arg1, "list" ) ) { if ( !auction_number ) { send_to_char("There is nothing up for auction right now.\n\r",ch); return; } send_to_char("{CT{cicke{Ct B{cidde{Cr B{ci{Cd I{cte{Cm{x\n\r",ch); for(i=0;i<MAX_AUCTION;i++) { if(auction_info[i].item!=NULL) { sprintf(buf,"{D#%5d {c%-15s{D %-12ld {x%s{x\n\r", auction_info[i].ticket, (auction_info[i].high_bidder!=NULL? auction_info[i].high_bidder->name:"None"), auction_info[i].current_bid, auction_info[i].item->short_descr); send_to_char(buf,ch); } } return; } if ( !str_cmp( arg1, "bid" ) ) { long bid; sh_int ticket; int index; if ( !auction_number ) { send_to_char("There is nothing up for auction right now.\n\r",ch); return; } if ( arg2[0] == '\0' ) { send_to_char("You must enter a ticket number.\n\r",ch); return; } if ( arg3[0] == '\0' ) { send_to_char("You must enter an amount to bid.\n\r",ch); return; } ticket = atoi( arg2 ); bid = atol( arg3 ); index = -1; for(i=0;i<MAX_AUCTION;i++) if(auction_info[i].ticket==ticket) { index = i; break; } if((index==-1) || (ticket==0)) { send_to_char("No such ticket.\n\r",ch); return; } if(bid<0) { send_to_char("Only positive bids are possible.\n\r",ch); return; } if(auction_info[i].high_bidder==NULL) { if( bid < auction_info[index].current_bid) { sprintf(buf,"You must bid at least %ld gold.\n\r", auction_info[index].current_bid); send_to_char(buf,ch); } } else if ( bid <= auction_info[index].current_bid ) { sprintf(buf, "You must bid above the current bid of %ld gold.\n\r", auction_info[index].current_bid ); send_to_char(buf,ch); return; } if(auction_info[i].high_bidder==NULL) { if(bid < MINIMUM_BID) { sprintf(buf,"The minimum bid is %d gold.\n\r",MINIMUM_BID); send_to_char(buf,ch); return; } } else if ( bid < (MINIMUM_BID + auction_info[index].current_bid)) { sprintf( buf, "The minimum bid is %ld gold.\n\r",MINIMUM_BID +auction_info[index].current_bid); send_to_char(buf,ch); return; } if ( (ch->gold + 100 * ch->platinum) < bid ) { send_to_char("You can't cover that bid.\n\r",ch); return; } sprintf(buf, "{cTicket {D%d{c: {D%ld{c gold has been offered for {x%s{c.\n\r", ticket,bid, auction_info[index].item->short_descr); auction_channel( buf ); if ( auction_info[index].high_bidder != NULL ) { auction_info[index].high_bidder->platinum += auction_info[index].platinum_held; auction_info[index].high_bidder->gold += auction_info[index].gold_held; } gold = UMIN( ch->gold, bid ); if ( gold < bid ) { platinum = ((bid - gold + 99 ) / 100 ); gold = bid - 100* platinum; } ch->platinum -= platinum; ch->gold -= gold; auction_info[index].gold_held = gold; auction_info[index].platinum_held = platinum; auction_info[index].high_bidder = ch; auction_info[index].current_bid = bid; auction_info[index].status = 0; return; } if ( !strcmp(arg1,"submit" )) { long bid; int index; if(auction_number+1>=MAX_AUCTION) { sprintf(buf,"Please wait, not more then %d items can be auctioned simultaneously.\n\r",MAX_AUCTION); send_to_char(buf,ch); return; } if(arg2[0]=='\0') { send_to_char("What do you want to auction?\n\r",ch); return; } if(arg3[0]=='\0') { bid=100; } else { bid = atol( arg3 ); if(bid<MINIMUM_BID) { sprintf(buf,"Starting bid has to be higher than minimum bid (%d gold).\n\r",MINIMUM_BID); send_to_char(buf,ch); return; } } if ( (obj = get_obj_carry( ch, arg2 )) == NULL ) { send_to_char("You aren't carrying that item.\n\r",ch); return; } if ( (obj->cost<=0)) { send_to_char("You can't auction trash.\n\r",ch); return; } index=-1; for(i=0;i<MAX_AUCTION;i++) if(auction_info[i].item==NULL) { index = i; break; } if(index==-1) { send_to_char("Error: No free auction slot.\n\r",ch); bug("auction submit: no free slot",0); return; } auction_number++; if(auction_ticket == MAX_TICKET) auction_ticket = 0; else auction_ticket++; auction_info[index].owner = ch; auction_info[index].item = obj; auction_info[index].current_bid = bid; auction_info[index].status = 0; auction_info[index].ticket = auction_ticket; sprintf(buf,"{cTicket {D%d{c: {cNow taking bids on {x%s{c for {D%ld{c gold.\n\r", auction_ticket, obj->short_descr,bid ); auction_channel( buf ); obj_from_char( obj ); return; } if(!strcmp(arg1,"info")) { int ticket; int index; if(arg2[0]=='\0') { send_to_char("You need to supply a ticket number.\n\r",ch); return; } ticket = atoi( arg2 ); index = -1; for(i=0;i<MAX_AUCTION;i++) if(auction_info[i].ticket == ticket) { index = i; break; } if((index==-1) || (ticket==0)) { send_to_char("Invalid ticket number.\n\r",ch); return; } show_obj_stats(ch,auction_info[index].item); return; } do_help(ch,"auction"); return; } void auction_update( ) { char buf[MAX_STRING_LENGTH], temp[MAX_STRING_LENGTH], temp1[MAX_STRING_LENGTH]; int i; if ( !auction_number ) return; for(i=0;i<MAX_AUCTION;i++) { if(auction_info[i].item==NULL) continue; auction_info[i].status++; if ( auction_info[i].status == AUCTION_LENGTH ) { sprintf(buf,"{cTicket {D%d{c: {x%s {RS{rOL{RD{c to {c%s{c for {D%ld{c gold.\n\r", auction_info[i].ticket, auction_info[i].item->short_descr, auction_info[i].high_bidder->name, auction_info[i].current_bid ); auction_channel( buf ); auction_info[i].owner->platinum += auction_info[i].platinum_held; auction_info[i].owner->gold += auction_info[i].gold_held; sprintf(temp1, "%ld platinum ", auction_info[i].platinum_held ); sprintf(temp, "%ld gold ", auction_info[i].gold_held ); sprintf(buf, "You receive %s%s%scoins.\n\r", auction_info[i].platinum_held > 0 ? temp1 : "", ((auction_info[i].platinum_held > 0) && (auction_info[i].gold_held > 0)) ? "and " : "", auction_info[i].gold_held > 0 ? temp : "" ); send_to_char( buf, auction_info[i].owner ); obj_to_char( auction_info[i].item, auction_info[i].high_bidder ); sprintf(buf, "%s{x appears in your hands.\n\r", auction_info[i].item->short_descr ); send_to_char( buf, auction_info[i].high_bidder ); auction_info[i].item = NULL; auction_info[i].owner = NULL; auction_info[i].high_bidder = NULL; auction_info[i].current_bid = 0; auction_info[i].status = 0; auction_info[i].gold_held = 0; auction_info[i].platinum_held = 0; auction_info[i].ticket = 0; auction_number--; continue; } if ( auction_info[i].status == AUCTION_LENGTH - 1 ) { sprintf(buf, "{cTicket {D%d{c: {x%s{c - going twice at {D%ld{c gold.\n\r", auction_info[i].ticket, auction_info[i].item->short_descr, auction_info[i].current_bid ); auction_channel( buf ); continue; } if ( auction_info[i].status == AUCTION_LENGTH - 2 ) { if ( auction_info[i].high_bidder == NULL ) { sprintf(buf, "{cTicket {D%d{c: {cNo bids on {x%s{c - item removed.\n\r", auction_info[i].ticket, auction_info[i].item->short_descr); auction_channel( buf ); obj_to_char( auction_info[i].item, auction_info[i].owner ); sprintf(buf, "{x%s{x is returned to you.\n\r", auction_info[i].item->short_descr ); send_to_char( buf, auction_info[i].owner ); auction_info[i].item = NULL; auction_info[i].owner = NULL; auction_info[i].current_bid = 0; auction_info[i].status = 0; auction_info[i].ticket = 0; auction_number--; continue; } sprintf(buf, "{cTicket {D%d{c: {x%s{c - going once at {D%ld{c gold.\n\r", auction_info[i].ticket, auction_info[i].item->short_descr, auction_info[i].current_bid ); auction_channel( buf ); continue; } } return; } void auction_channel( char * msg ) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; sprintf(buf, "\n\r{D[{CA{cUCTIO{CN{D]{W %s{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( buf, victim ); } } return; } void show_obj_stats( CHAR_DATA *ch, OBJ_DATA *obj ) { BUFFER *outlist; (*skill_table[skill_lookup("identify")].spell_fun) (skill_lookup("identify"),101,ch,(void*)obj,TAR_IGNORE); if(obj->item_type==ITEM_CONTAINER) { act("$p holds:",ch,obj,NULL,TO_CHAR); outlist=show_list_to_char(obj->contains,ch,TRUE,TRUE); page_to_char(buf_string(outlist),ch); free_buf(outlist); } return; }