/** * This method will buy the objects from the specified player. * @author Pinkfish * @started Mon Aug 17 07:45:07 EDT 1998 */ #include <cmds/offer.h> #include <money.h> #include <move_failures.h> inherit COMMAND_BASE; int is_in(object ob, object source); int do_buy(object *people) { object person; int ret; class offer_sale wombat; object *obs; object *moved; mixed *payment; object ob; int i; foreach (person in people) { wombat = this_player()->query_respond_command("sell", person); if (wombat) { // Check to make sure the objects are still in their inventory. obs = filter(wombat->sell_obs, (: is_in($1, $2) :), wombat->seller); if (sizeof(obs) != sizeof(wombat->sell_obs)) { add_failed_mess("$I no longer has " + query_multiple_short(wombat->sell_obs - obs) + " to buy.\n", ({ person }) ); } else if (this_player()->query_value_in(wombat->place) < wombat->value) { add_failed_mess("You no longer have enough money to buy " + query_multiple_short(wombat->sell_obs) + " from $I.\n", ({ person })); } else { // Get money (hopefully) from the nice array of money // the other person has. payment = MONEY_HAND->query_person_payments(wombat->value, wombat->place, this_player(), person); if (!payment) { add_failed_mess("You no longer have the correct change " "to pay for $I.\n", ({ person }) ); } else { // Lets see if we can move stuff first. moved = ({ }); foreach (ob in wombat->sell_obs) { if (ob->move(this_player()) == MOVE_OK) { moved += ({ ob }); } } // Check to see if all the objects were moved. if (sizeof(moved) != sizeof(wombat->sell_obs)) { moved->move(person); tell_object(person, "Unable to move " + query_multiple_short(wombat->sell_obs - moved) + " out of your inventory, cancelling " "the sale.\n"); add_failed_mess("Unable to move some objects out " "of the inventory of $I, canceling sale.\n", ({ person }) ); } else { if (sizeof(payment[MONEY_PAY_CHANGE])) { tell_object(person, "You accept " + MONEY_HAND->money_string(payment[MONEY_PAY_RETURN], wombat->place)+ " from " + this_player()->the_short() + " and give back " + MONEY_HAND->money_string(payment[MONEY_PAY_CHANGE], wombat->place) + " in change.\n"); tell_object(this_player(), "You give " + MONEY_HAND->money_string(payment[MONEY_PAY_RETURN], wombat->place)+ " to " + person->the_short() + " and receive back " + MONEY_HAND->money_string(payment[MONEY_PAY_CHANGE], wombat->place) + " in change.\n"); } else { tell_object(person, "You accept " + MONEY_HAND->money_string(payment[MONEY_PAY_RETURN], wombat->place) + " from " + this_player()->the_short() +".\n"); tell_object(this_player(), "You give " + MONEY_HAND->money_string(payment[MONEY_PAY_RETURN], wombat->place) + " to " + person->the_short() + ".\n"); } for (i = 0; i < sizeof(payment[MONEY_PAY_RETURN]); i += 2) { this_player()->adjust_money(-payment[MONEY_PAY_RETURN][i+1], payment[MONEY_PAY_RETURN][i]); person->adjust_money(payment[MONEY_PAY_RETURN][i+1], payment[MONEY_PAY_RETURN][i]); } for (i = 0; i < sizeof(payment[MONEY_PAY_CHANGE]); i += 2) { person->adjust_money(-payment[MONEY_PAY_CHANGE][i+1], payment[MONEY_PAY_CHANGE][i]); this_player()->adjust_money(payment[MONEY_PAY_CHANGE][i+1], payment[MONEY_PAY_CHANGE][i]); } add_succeeded_mess("$N buy$s " + query_multiple_short(wombat->sell_obs) + " from $I.\n", ({ person }) ); ret++; } } } this_player()->remove_respond_command("sell", person); } else { add_failed_mess("Sorry, $I has not offered to sell you anything.\n", ({ person }) ); } } return ret; } /* do_buy() */ /** * This method checks to make sure that ob is contained somewhere in the * source. */ int is_in(object ob, object source) { object env; env = ob; do { env = environment(env); if (env == source) { return 1; } } while (env); return 0; } /* is_in() */ mixed *query_patterns() { return ({ "offer from <indirect:living'person'>", (: do_buy($1) :) }); } /* query_patterns() */ /* This is needed to so we can move stuff out of the players inventory. */ int query_theft_command() { return 1; } /* query_theft_command() */