#include <mudlib.h>
#define AMT_MONEY (int)this_object()->query_money()
#define NAME (string)this_object()->query_name()
#define LEVEL (int)this_player()->query_level()
/**********************************************************************/
/* generic moving fn */
void move_ob(object *items, object to, string verb) {
string item_name, item, container;
int i, size, abort;
int wt;
object from;
status flag;
for(i = 0, size = sizeof(items); i < size; i++) {
if(items[i] == to) continue; /* can't move items into self */
if(!objectp(items[i]) || living(items[i])) continue; /* no move living */
if(!(item_name = (string)items[i]->short())) continue; /* no move invis*/
flag = 1;
if(++abort > 30) {
tell_object(this_object(),"*** "+capitalize(verb)+" Truncated ***\n");
return;
}
item_name = ((item = (string)items[i]->query_name())) ? item : item_name;
from = environment(items[i]);
if(items[i]->drop()) {
if(living(from)) {
tell_object(this_object(),"You cannot "+verb+" "+item_name+".\n");
continue;
}
}
if(!items[i]) continue; /* some things destruct on drop */
if(items[i]->query_money() && to == this_object()) {
this_object()->add_money((int)items[i]->query_money() );
if(MONEY < 0) this_object()->set_money(0);
this_object()->save_me(1);
destruct(items[i]);
continue;
}
if(from != environment() && from != this_object()) { /* from container */
container = (from->query_name())
? " from "+(string)from->query_name()
: " from "+(string)from->short();
}
else if(to != environment() && to != this_object()) { /* to container */
container = (living(to)) ? " to " : " in ";
container += (to->query_name())
? (string)to->query_name()
: (string)to->short();
if(!living(to)) {
if(!to->can_put_and_get(0)) {
tell_object(this_object(),"You cannot do that!\n");
return;
}
if(items[i]->prevent_insert()) continue;
}
}
if(!container) container = "";
if(from != this_object() && !items[i]->get()) {
write("You cannot "+ verb +" " + item_name + container +".\n");
continue;
}
wt = (int)items[i]->query_weight();
if(to != environment() && !to->add_weight(wt)) {
tell_object(to,"You do not have the strength to carry the "
+ item_name +".\n");
if(to != this_object()) {
tell_object(this_object(),
"You are unable to "+ verb +" " + item_name + container +".\n"+
"It seems to have a weight problem.\n");
/*
((living(to))
? capitalize((string)to->query_possessive())
: ((container != "") ? "The "+container : "It"))+
" cannot carry "+ item_name +".\n");
*/
}
continue;
}
from->add_weight(-wt);
#ifdef NATIVE_MODE
items[i]->move(to);
#else
move_object(items[i], to);
#endif /* NATIVE_MODE */
write("You "+verb+" the "+ item_name + container +".\n");
say(NAME+" "+verb+"s the "+ item_name + container + ".\n");
}
if(!flag) tell_object(this_object(),"You have nothing to "+verb+".\n");
this_object()->recalc_carry();
}
/**************************************************************************/
/* put */
status put(string item) {
int wt;
object *items;
string container;
object ob, to;
if(this_object()->query_ghost()) {
tell_object(this_object(),"It passes straight through your hands...\n");
return 1;
}
if((int)this_object()->query_real_light() < 1) {
tell_object(this_object(), "It's too dark to do that.\n");
return 1;
}
if(!item) {
tell_object(this_object(),"Usage: put <item> in <container>\n");
return 1;
}
sscanf(item, "%s in %s", item, container);
sscanf(item, "%s on %s", item, container);
if(!container) return put(0);
container = lower_case(container);
if(!(to = present(container, this_object()))) {
if(!(to = present(container, environment()))) {
tell_object(this_object(),"There are no " + container + "s here!\n");
return 1;
}
if(living(to)) {
tell_object(this_object(),"You cannot do that!\n");
return 1;
}
}
if(item == "all") {
items = all_inventory();
}
else if(!(ob = present(item, this_object()))) {
tell_object(this_object(),"You do not have "+ item +".\n");
return 1;
}
if(ob) items = ({ ob, });
move_ob(items, to, query_verb());
return 1;
}
/***************************************************************************/
/* get */
status pick_up(string item) {
string container;
object from;
object *items, ob;
if(this_object()->query_ghost()) {
tell_object(this_object(),"It passes straight through your hands...\n");
return 1;
}
if((int)this_object()->query_real_light() < 1) {
tell_object(this_object(), "It's too dark to do that.\n");
return 1;
}
if(!item) {
tell_object(this_object(),"Usage: get <item|all>\n"+
" get <item|all> from <container>\n");
return 1;
}
sscanf(item, "%s from %s", item, container);
if(container) {
container = lower_case(container);
if(!(from = present(container, this_object()))) {
if(!(from = present(container, environment()))) {
write("There is no " + container + " here.\n");
return 1;
}
}
if(living(from)) {
tell_object(this_object(),"You cannot do that!\n");
return 1;
}
}
else {
from = environment();
}
if(item == "all") {
items = all_inventory(from);
}
else if(!(ob = present(item, from))) {
tell_object(this_object(),"There is no "+ item +" in the "+
((container) ? container : "room") +".\n");
return 1;
}
if(ob) items = ({ ob, });
move_ob(items, this_object(), query_verb());
return 1;
}
/***************************************************************************/
/* give */
status give_object(string item) {
string who;
object *items;
object ob, dest_ob;
int amt;
if(this_object()->query_ghost()) {
write("It passes straight through your hands...\n");
return 1;
}
if((int)this_object()->query_real_light() < 1) {
tell_object(this_object(), "It's too dark to do that.\n");
return 1;
}
if(!item) {
write("Usage: give <item|all> to <who>\n"+
" give <amount> coins to <who>\n");
return 1;
}
sscanf(item, "%s to %s", item, who);
sscanf(item, "%d coins to %s", amt, who);
sscanf(item, "%d coin to %s", amt, who);
if(!who) return give_object(0);
if(!(dest_ob = present(who, environment()))) {
write(capitalize(who)+" is not here.\n");
return 1;
}
if(!living(dest_ob)) {
write("Thats not giving it away, its throwing it away.\n");
return 1;
}
if(amt) {
if(amt < 1) {
write("Are you looking for a loan?\n");
return 1;
}
if(LEVEL < 2) {
write("Your level is not high enough to be a money lender.\n");
return 1;
}
if(amt > AMT_MONEY) amt = AMT_MONEY;
this_object()->add_money(-amt);
this_object()->save_me(1);
dest_ob->add_money(amt);
dest_ob->save_character();
write("You give "+capitalize(who)+" "+amt+
" copper coin"+((amt == 1) ? "" : "s")+".\n");
say(NAME+" gives "+capitalize(who)+" "+amt+
" copper coin"+((amt == 1) ? "" : "s")+".\n", dest_ob);
tell_object(dest_ob,NAME+" gives you "+amt+
" copper coin"+((amt == 1) ? "" : "s")+".\n");
return 1;
}
if(item == "all") {
items = all_inventory();
}
else if(!(ob = present(item, this_object()))) {
if(!(ob = present(item, environment()))) {
tell_object(this_object(),"You do not have "+ item +".\n");
return 1;
}
}
if(ob) items = ({ ob, });
move_ob(items, dest_ob, query_verb());
return 1;
}
/***********************************************************************/
/* drop */
status drop_thing(string item) {
string container;
object ob, to;
object *items;
int amt;
if(!item) {
write("Usage: drop <item|all>\n"+
" drop <item|all> in <container>\n"+
" drop <amount> coins\n");
return 1;
}
sscanf(item, "%d coins", amt);
sscanf(item, "%d coin", amt);
sscanf(item, "%s in %s", item, container);
if(amt) {
if(amt < 1) {
write("Are you looking for a loan?\n");
return 1;
}
if(LEVEL < 2) {
write("Something prevents you.\n");
return 1;
}
if(amt > AMT_MONEY) amt = AMT_MONEY;
this_object()->add_money(-amt);
this_object()->save_me(1);
ob = clone_object(MONEY);
ob->set_money(amt);
#ifdef NATIVE_MODE
ob->move(environment());
#else
move_object(ob, environment());
#endif /* NATIVE_MODE */
write("You drop "+amt+" copper coin"+((amt == 1) ? "" : "s")+".\n");
say(NAME+" drops "+amt+" copper coin"+((amt == 1) ? "" : "s")+".\n");
return 1;
}
if(container) {
container = lower_case(container);
if(!(to = present(container, this_object()))) {
if(!(to = present(container, environment()))) {
write("There is no " + container + " here.\n");
return 1;
}
}
if(living(to)) {
write("You can't do that!\n");
return 1;
}
}
else {
to = environment();
}
if(item == "all") {
items = all_inventory();
}
else if(!(ob = present(item, this_object()))) {
tell_object(this_object(),"You do not have "+ item +".\n");
return 1;
}
if(ob) items = ({ ob, });
move_ob(items, to, query_verb());
return 1;
}