/* -*- LPC -*- */ /* * $Locker: $ * $Id: give.c,v 1.22 2002/02/22 01:14:48 ceres Exp $ */ #include <move_failures.h> #include <player.h> inherit "cmds/base"; #define TP this_player() #define SUPPRESS_MESS "suppress give messages" mixed cmd(mixed *indir, string *indir_match) { string sh; string s1; string failmess; int tot; int max; int ok; object *per; object *ret; object *fail; object pobj; object ob; object *obs; object *succ; object *keep; per = indir[1]; succ = ({ }); keep = ({ }); failmess = ""; foreach(pobj in per) { obs = indir[0]; obs -= per; if (pobj->query_property("player") && !interactive(pobj)) { failmess = pobj->the_short()+" seems too chalky to accept your " "gift.\n"; continue; } if (pobj == TP) { failmess = "You nag yourself for a while, but can't convince " "yourself to accept things from yourself.\n"; continue; } if (!sizeof(obs)) { failmess = "Nothing to give to "+ pobj->short() +".\n"; continue; } ret = ({ }); fail = ({ }); foreach(ob in obs) { if ( member_array( ob, succ ) > -1 ) { continue; } if (ob->query_keep()) { keep += ({ ob }); continue; } if (function_exists("do_give", ob) || function_exists("command_control", ob)) { if (function_exists("do_give", ob)) { max = call_other(ob, "do_give", pobj, indir_match[0], indir_match[1], ({ indir_match[0], indir_match[1] }), "<direct:object:me> to <indirect:living>"); } else { max = ob->command_control("give", pobj, indir_match[0], indir_match[1], ({ indir_match[0], indir_match[1] }), "<direct:object:me> to <indirect:living>"); } if (max == 0) { fail += ({ ob }); continue; } } #ifndef __DISTRIBUTION_LIB__ // this_player() drops the object PLAYER_MULTIPLAYER_HANDLER->record_object("give", TP, ob); // pobj picks it up again. if(pobj->query_property("player") && interactive(TP) && "/obj/handlers/multiplayer"->check_multiplayers("give", pobj, ob)) { fail += ({ ob }); } else #endif if (pobj->query_closed() || ob->move(pobj) != MOVE_OK) { fail += ({ ob }); } else { ret += ({ ob }); tot += ob->query_weight(); } } if (sizeof(ret)) { ok = 1; succ += ret; if (pobj->query_clothing()) { s1 = pobj->query_pocket_mess(); } else { s1 = "$ob_short$"; } sh = query_multiple_short(ret); if ( interactive( pobj ) || !pobj->query_property( SUPPRESS_MESS ) ) { tell_object(TP, "You give "+ sh +" to "+ replace_string(s1, "$ob_short$", pobj->one_short())+ ".\n"); tell_room(environment(TP), TP->one_short() + " gives " + sh + " to " + replace_string(s1, "$ob_short$", pobj->one_short()) + ".\n", ({ TP, pobj })); tell_object(pobj, capitalize(TP->one_short() ) + " gives "+ sh + " to you.\n" ); } if (living(pobj) && (max = pobj->query_max_weight())) if ((max = tot*100/max) > 25) if (max >= 95) { tell_room(environment(TP), pobj->the_short()+" staggers under a weight "+ pobj->query_pronoun()+" can only just carry.\n", ({ pobj }) ); pobj->event_say(TP, "You stagger under a weight you can only " "just carry.\n"); } else { tell_room(environment(TP), pobj->the_short()+ ({ " is only mildly discomforted by the additional weight.\n", " braces "+pobj->query_objective()+"self to take the load.\n", " stumbles as "+pobj->query_pronoun()+" takes the load.\n" })[(max/25)-1], ({ pobj }) ); pobj->event_say(TP, "You"+ ({ " are only mildly discomforted by the additional weight.\n", " brace yourself under the load.\n", " stumble as you take the load.\n" })[(max/25)-1]); } } if (sizeof(fail)) { failmess += "You cannot give "+query_multiple_short(fail)+ " to "+ pobj->one_short() +".\n"; } } if (!ok) { add_failed_mess(failmess); if (sizeof(keep)) { add_failed_mess("You have $I set to be kept.\n", keep); } } return ok; } mixed *query_patterns() { return ({ "<indirect:object:me> to <indirect:living>", (: cmd($1, $3) :) }); }