/* Do not remove the headers from this file! see /USAGE for more info. */ /* ** wearable.c ** ** Mixed in to create a wearable item. The client should also ** mix in M_GETTABLE. ** ** 07-Sep-94. Created. Rust/Belboz. ** 12-Nov-94. Updated for "modules" approach. Deathblade. ** 970421, Deathblade: switched to flags to pick up attributes ** 25 March, 1998: Iizuka made major changes to support the new adversary code. */ #include <flags.h> void hook_state(string, mixed, int); string worn_extra_short(); int test_flag(int); void assign_flag(int, int); void add_save( string array ); private string wearmsg = "$N $vwear a $o."; private nosave string slot; private nosave string array also_covering; void mudlib_setup() { add_save( ({ "persist_flags" }) ); } mixed ob_state() { if(!test_flag(F_WORN)) return 0; return slot; } //:FUNCTION set_wearmsg //Set the message used when an object is worn. void set_wearmsg(string s) { wearmsg = s; } //:FUNCTION query_wearmsg //Return the message given when an object is used. string query_wearmsg() { return wearmsg; } //:FUNCTION set_slot //Set the bodyslot that the wearable object takes up. void set_slot(string which) { slot = which; } //FUNCTION query_slot //Return the bodyslot the wearable object takes up. string query_slot() { return slot; } string array also_covers() { return also_covering; } void set_also_covers(string array s...) { also_covering = s; } string worn_attributes() { string array all = ({ slot }); if(also_covers()) all += also_covers(); if(sizeof(all) > 1) return "worn over " + implode(all[0..(sizeof(all) - 2)], ", ") + ", and " + all[sizeof(all) - 1]; else return "worn over " + all[0]; } //:FUNCTION set_worn //set_worn(1) causes an object to become worn. set_worn(0) removes it. void set_worn(int g) { assign_flag(F_WORN, g); hook_state("prevent_drop", "You'll have to take it off first.\n", g); } void remove() { object env = environment(); if(!slot || !env) return 0; set_worn(0); env->remove_item(this_object(), slot); } void do_wear() { if(!slot) return; if(!environment()->wear_item(this_object(), slot)) { environment()->simple_action("$N $vdiscover $ns cannot wear the $o.", this_object()); return; } set_worn(1); environment()->simple_action(query_wearmsg(), this_object()); } void do_remove() { if(!slot) return 0; environment()->remove_item(this_object(), slot); set_worn(0); this_body()->simple_action("$N $vremove $p $o.", this_object()); } mixed direct_wear_obj() { object who = owner(this_object()); if(who != this_body()) return 0; if(!this_body()->has_body_slot(slot)) return "You can't seem to find anywhere to put it on!\n"; if(test_flag(F_WORN)) return "But you're already wearing it!\n"; return 1; } mixed direct_remove_obj() { object who = owner(this_object()); if(who != this_body()) return 0; if(environment() != this_body() || !test_flag(F_WORN)) return "But you aren't wearing it!\n"; return 1; } mapping lpscript_attributes() { return ([ "bodyslot" : ({ LPSCRIPT_STRING, "setup", "set_slot" }), "wearmsg" : ({ LPSCRIPT_STRING, "setup", "set_wearmsg" }), ]); }