Allan M. Grant wrote: > Yeah Chris. > There is a autoauctioning code on the CircleMUD ftp site. > ftp.circlemud.org somewhere in pub/submissions/code > I couldn't get it to work yet though. Working on it right now. If you > ever get it to work tell me. > > Hope that helped, I return the favour... here is my 'working' improved? version! Thanks, Chris /* 'Fixed' and 'Improved?' by Chris Warren * Item now taken from seller when put up for auction (returned if not sold * and money taken from bidder when a bid is made (returned if a higher bid is * made) In SPANKING_TECNOCOLOUR (tm) * * I can think of many more improvements but this will do for me! (for now at least) */ /* Auction code by George Greer, dragon.ham.muohio.edu 5000 * greerga@dragon.ham.muohio.edu, questions, comments, suggestions accepted * If you like the code, just mention me somewhere, doesn't have to be the * titlescreen like some people want, hidden away in credits is fine by me :) */ /* Instructions: (bpl11) * This file can be readily saved as a separate .c file in the circlemud * source directory (I have the section marked auction.h as a separate * file but that was due to previous things I changed, it no longer needs to * be removed). The only lines that need to be added to the basic circle code * are: * * INTERPRETER.C commands * You forgot to mention: * ACMD(do_auction); * ACMD(do_bid); * * Remove the old "auction" or comment it * { "auction", PLR_SLEEPING, do_auction, <lvl of auction>, 0 }, * { "bid" , PLR_SLEEPING, do_bid , <lvl of auction>, 0 }, * * COMM.C heartbeat() * if (!(pulse % (15 * PASSES_PER_SEC))) <--- 15 seconds * auction_update(); <--- Don't forget to prototype - void auction_update(void); * * DB.C boot_db() * log("Auction system reset."); * auction_reset(); <--- And prototype - void auction_reset(void); * * That's it...pretty simple. Known bugs, which I'll leave to the reader * to fix are : * 1) I've removed the item check, put in your own variety. * 2) If a character logs out, the pointers will be in nowhere memory. * 3) Uses send_to_all for output, actually my version uses a do_gen_comm * call but since it's another function to figure out how to actually * get a mob pointer without a character (non-stock function too), and * the fact people will probably figure out a better way, I removed * the mob auctioner feature, Shyra on DS. * 4) Not really a bug, but people can log on as another character and * purchase something their first character auctioned (even if you * don't let them log out, a lot of people can multisession, and * therefore a descriptor check won't work, two connections) */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "screen.h" /* *** Beginning of what is my auction.h file *** */ struct auction_data { struct char_data *seller; struct char_data *bidder; struct obj_data *obj; long bid; int ticks; }; struct auction_data auction; #define AUC_NONE -1 #define AUC_NEW 0 #define AUC_BID 1 #define AUC_ONCE 2 #define AUC_TWICE 3 #define AUC_SOLD 4 #define AUC_OUT(txt) \ for (d = descriptor_list; d; d = d->next) \ if (!d->connected && d->character && \ !PLR_FLAGGED(d->character, PLR_WRITING) && \ !PRF_FLAGGED(d->character, PRF_NOAUCT) && \ !ROOM_FLAGGED(d->character->in_room, ROOM_SOUNDPROOF)) \ {sprintf(buf, "%s[%sAUCTION:%s %s%s]%s\r\n",CCMAG(d->character,C_NRM),CCCYNB(d->character,C_NRM),CCNRM(d->character,C_NRM), txt, CCMAG(d->character,C_NRM),CCNRM(d->character,C_NRM)); \ send_to_char(buf, d->character);} extern struct descriptor_data *descriptor_list; extern struct room_data *world; struct descriptor_data *d; void auction_reset(void); void auction_update(void) { if (auction.ticks == AUC_NONE) /* No auction */ return; if (auction.ticks >= AUC_BID && auction.ticks <= AUC_SOLD) { if ((auction.bidder) && (auction.ticks < AUC_SOLD)) { sprintf(buf2, "\x1B[1;37m%s\x1B[35m is going\x1B[1;37m%s%s%s\x1B[35m to \x1B[1;37m%s\x1B[35m for \x1B[1;37m%ld\x1B[35m coin%s.", auction.obj->short_description, auction.ticks == AUC_BID ? " once" : "", auction.ticks == AUC_ONCE ? " twice" : "", auction.ticks == AUC_TWICE ? " for the last call" : "", auction.bidder->player.name, auction.bid, auction.bid != 1 ? "s" : " "); AUC_OUT(buf2); auction.ticks++; return; } if ((!auction.bidder) && (auction.ticks == AUC_SOLD)) { sprintf(buf2, "\x1B[1;37m%s\x1B[35m is \x1B[1;37mSOLD\x1B[35m to \x1B[1;37mNoone\x1B[35m for \x1B[1;37m%ld\x1B[35m coin%s.", auction.obj->short_description, auction.bid, auction.bid != 1 ? "s" : " "); AUC_OUT(buf2); /* Give the poor fellow his unsold goods back */ obj_to_char(auction.obj, auction.seller); auction_reset(); // auction.ticks--; return; } if((!auction.bidder) && (auction.ticks < AUC_SOLD)) { sprintf(buf2, "\x1B[1;37m%s\x1B[35m is going\x1B[1;37m%s%s%s\x1B[35m to \x1B[1;37mNoone\x1B[35m for \x1B[1;37m%ld\x1B[35m coin%s.", auction.obj->short_description, auction.ticks == AUC_BID ? " once" : "", auction.ticks == AUC_ONCE ? " twice" : "", auction.ticks == AUC_TWICE ? " for the last call" : "", auction.bid, auction.bid != 1 ? "s" : ""); AUC_OUT(buf2); auction.ticks++; return; } if ((auction.bidder) && (auction.ticks >= AUC_SOLD)) { /* Sold */ sprintf(buf2, "\x1B[1;37m%s\x1B[35m is \x1B[1;37mSOLD\x1B[35m to \x1B[1;37m%s\x1B[35m for \x1B[1;37m%ld\x1B[35m coin%s.", auction.obj->short_description, auction.bidder->player.name, auction.bid, auction.bid != 1 ? "s" : ""); AUC_OUT(buf2); GET_GOLD(auction.seller) += auction.bid; act("Congrats! You have sold $p!", FALSE, auction.seller, auction.obj, 0, TO_CHAR); obj_to_char(auction.obj, auction.bidder); act("Congrats! You now have $p!", FALSE, auction.bidder, auction.obj, 0, TO_CHAR); auction_reset(); return; } } return; } ACMD(do_bid) { long bid; if (auction.ticks == AUC_NONE) { send_to_char("Nothing is up for sale.\r\n", ch); return; } one_argument(argument, buf); bid = atoi(buf); if (!*buf) { sprintf(buf2, "Current bid: %ld coin%s\r\n", auction.bid, auction.bid != 1 ? "s." : "."); send_to_char(buf2, ch); } else if (ch == auction.bidder) send_to_char("You're trying to outbid yourself.\r\n", ch); else if (ch == auction.seller) send_to_char("You can't bid on your own item.\r\n", ch); else if ((bid < auction.bid) && !auction.bidder) { sprintf(buf2, "The minimum is currently %ld coins.\r\n", auction.bid); send_to_char(buf2, ch); } else if ((bid < (auction.bid * 1.05) && auction.bidder) || bid == 0) { sprintf(buf2, "Try bidding at least 5%% over the current bid of %ld. (%.0f coins).\r\n", auction.bid, auction.bid * 1.05 + 1); send_to_char(buf2, ch); } else if (GET_GOLD(ch) < bid) { sprintf(buf2, "You have only %d coins on hand.\r\n", GET_GOLD(ch)); send_to_char(buf2, ch); }else { /* Give last bidder money back! */ if(auction.bidder){GET_GOLD(auction.bidder) += auction.bid;} auction.bid = bid; auction.bidder = ch; auction.ticks = AUC_BID; /* Get money from new bidder. */ GET_GOLD(auction.bidder) -= auction.bid; sprintf(buf2, "\x1B[1;37m%s\x1B[35m bids \x1B[1;37m%ld\x1B[35m coin%s on \x1B[1;37m%s\x1B[35m.", auction.bidder->player.name, auction.bid, auction.bid!=1 ? "s" :"", auction.obj->short_description); AUC_OUT(buf2); } } ACMD(do_auction) { struct obj_data *obj; two_arguments(argument, buf1, buf2); if (!*buf1) send_to_char("Auction what for what minimum?\r\n", ch); else if (auction.ticks != AUC_NONE) { sprintf(buf2, "%s is currently auctioning %s for %ld coins.\r\n", auction.seller->player.name, auction.obj->short_description, auction.bid); send_to_char(buf2, ch); } else if ((obj = get_obj_in_list_vis(ch, buf1, ch->carrying)) == NULL) send_to_char("You don't seem to have that to sell.\r\n", ch); else { auction.ticks = AUC_BID; auction.seller = ch; auction.bid = (atoi(buf2) != 0 ? atoi(buf2) : 1); auction.obj = obj; /* Get the object from the character, so they cannot drop it! */ obj_from_char(auction.obj); sprintf(buf2, "\x1B[1;37m%s\x1B[35m puts \x1B[1;37m%s\x1B[35m up for sale, minimum bid \x1B[1;37m%ld\x1B[35m coin%s",auction.seller->player.name, auction.obj->short_description, auction.bid, auction.bid != 1 ? "s." : "."); AUC_OUT(buf2); } } void auction_reset(void) { auction.bidder = NULL; auction.seller = NULL; auction.obj = NULL; auction.ticks = AUC_NONE; auction.bid = 0; } /* If you want to do object sanity checking at time of sale, here's what you * can do, or at least one way. Make a function that returns an object * pointer when given someone and something about the object. Loop through * his inventory, comparing the passed argument to the appropriate place * in every inventory object, this results in a more accurate match, then * return that object, otherwise null. I removed this due to the fact that * A) some people would rather throw checks all over the place to simply * prevent the object from moving and B) it'd make it too easy ;) */ /* what are you doing down here? the code's over, go home, nothing to see ;) */ +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST