// File: /cmds/std/_drop.c
// based on TMI-2 version
// completely rewritten...cleaned up...modified
// by Zeus, 13-03-1993
// Fixed dropping nothing (no objs or no droppable objs)
// Leto 26/5/95
#include <mudlib.h>
#include <money.h>
#include <move.h>
#define CAP_NAME this_player()->query("cap_name")
inherit DAEMON;
string help();
int cmd_drop(string str) {
mapping coins;
object *inv, ob, env;
int res, amount, capac, i, money, dropped;
string short, *types, type, word, tmp;
if(!str) return write(help());
if (!(env = environment(this_player()))) {
notify_fail("You can't drop anything in the void!\n");
return 0;
}
this_player()->block_attack(2);
if(sscanf(str, "%d %s %s", amount, type, tmp) == 3 ||
sscanf(str, "%d %s", amount, type) == 2) {
money = this_player()->query("wealth/"+type);
if (amount<1) {
notify_fail ("You can't do that.\n") ;
return 0 ;
}
if(money < amount) {
notify_fail("You don't have that much "+type+".\n");
return 0;
}
this_player()->set("wealth/"+type, money-amount);
capac = this_player()->query("capacity");
this_player()->set("capacity", capac+amount);
ob = clone_object(COINS);
ob->set_type(type);
ob->set_number(amount);
res = ob->move(environment(this_player()));
if(res != MOVE_OK) {
this_player()->set("wealth/"+type, money);
this_player()->set("capacity", capac);
ob->remove();
notify_fail("You can't drop that.\n");
return 0;
}
if(amount == 1) word = "coin"; else word = "coins";
write("You drop "+amount+" "+type+" "+word+".\n");
say(CAP_NAME+" drops some "+type+" "+word+".\n");
return 1;
}
if(str == "all") {
inv = all_inventory(this_player());
//if(!pointerp(inv) && sizeof(inv) < 1) {
if(sizeof(inv) < 1) {
notify_fail("You are not carrying anything.\n");
return 0;
}
for(i = 0; i < sizeof(inv); i++) {
if(!inv[i] || inv[i]->query("prevent_drop")) continue;
res = inv[i]->move(environment(this_player()));
if(res != MOVE_OK) continue;
if(inv[i])
short = (string)inv[i]->query("short");
if(!short) short = "something";
say(CAP_NAME+" drops "+short+".\n");
dropped++;
}
if(dropped)
{
write("You drop your whole inventory on the ground.\n");
return 1;
}
else notify_fail("You are not carrying anything you wish to part with.\n");
return 0;
}
if(str == "all coins") {
coins = this_player()->query("wealth");
if(!mapp(coins) || sizeof(coins) == 0) {
notify_fail("You have no coins in your purse.\n");
return 0;
}
types = keys(coins);
if(!pointerp(types) || sizeof(types) == 0) {
notify_fail("You have no coins in your purse.\n");
return 0;
}
for(i = 0; i < sizeof(types); i++) {
if(coins[types[i]] == 0) continue;
this_player()->set("wealth/"+types[i], 0);
capac = this_player()->query("capacity");
this_player()->set("capacity", capac+coins[types[i]]);
ob = clone_object(COINS);
ob->set_type(types[i]);
ob->set_number(coins[types[i]]);
res = ob->move(environment(this_player()));
if(res != MOVE_OK) {
this_player()->set("wealth/"+types[i], coins[types[i]]);
this_player()->set("capacity", capac);
ob->remove();
continue;
}
if(coins[types[i]] == 1) word = "coin"; else word = "coins";
write("You drop "+coins[types[i]]+" "+types[i]+" "+word+".\n");
say(CAP_NAME+" drops some "+types[i]+" "+word+".\n");
}
return 1;
}
if(sscanf(str, "all %s", type) == 1) {
money = this_player()->query("wealth/"+type);
if(!money) {
notify_fail("You don't have any "+type+".\n");
return 0;
}
this_player()->set("wealth/"+type, 0);
capac = this_player()->query("capacity");
this_player()->set("capacity", capac+money);
ob = clone_object(COINS);
ob->set_type(type);
ob->set_number(money);
res = ob->move(environment(this_player()));
if(res != MOVE_OK) {
this_player()->set("wealth/"+type, money);
this_player()->set("capacity", capac);
ob->remove();
notify_fail("You can't drop that.\n");
return 0;
}
write("You drop all your "+type+" coins.\n");
say(CAP_NAME+" drops some "+type+" coins.\n");
return 1;
}
ob = present(str, this_player());
if(!ob) {
notify_fail("You don't have that on you.\n");
return 0;
}
if(ob->query("prevent_drop")) {
notify_fail("You can't drop that object.\n");
return 0; }
res = ob->move(environment(this_player()));
if(res != MOVE_OK) {
notify_fail("You can't drop that.\n");
return 0;
}
short = (string)ob->query("short") ;
if(!short) short = "something";
write("You drop "+short+".\n");
say(CAP_NAME+" drops "+short+".\n");
return 1;
}
string help() {
return("Syntax: drop <item | all>\n\n"+
"This makes your character try to drop the specified\n"+
"item. If all is used then your character drops all\n"+
"items carried. If you type \"drop all gold\" or other\n"+
"type, then all of your coins of that type are dropped.\n"+
"\"Drop all coins\" drops all your money.\n"+
"\nSee also: get, put\n");
}