/* /lib/touch.c * from the Dead Souls Object Library * for touching things * created by Descartes of Borg 951008 * Version: @(#) touch.c 1.8@(#) * Last modified: 96/12/31 */ #include <function.h> static private mixed Touch = 0; static private mapping Touches = ([]); // abstract methods string GetShort(); // end abstract methods varargs string GetTouch(string str, object who) { mixed val; if( !str || str == "default" ) { val = Touch; } else { val = Touches[str]; } if( !val ) { return 0; } if( functionp(val) ) { if( functionp(val) & FP_OWNER_DESTED ) { return "An error occured in a function pointer."; } return evaluate(val, who, str); } else if( arrayp(val) ) { return val[query_night()]; } else return val; } string array GetTouches() { return keys(Touches); } mapping RemoveTouch(string item) { if( !item || item == "default" ) { Touch = 0; } else { map_delete(Touches, item); } return Touches; } varargs mixed SetTouch(mixed array args...) { if( sizeof(args) == 1 ) { if( mapp(args[0]) ) { if( args[0]["default"] ) { Touch = args[0]["default"]; map_delete(args[0], "default"); } return (Touches = expand_keys(args[0])); } else { Touch = args[0]; } return args[0]; } else if( sizeof(args) == 2 ) { if( !args[1] ) { return SetTouch(args[0]); } else if( arrayp(args[0]) ) { foreach(string item in args[0]) { SetTouch(item, args[1]); } return args[1]; } else { if( !args[0] || args[0] == "default" ) { Touch = args[1]; return Touch; } else { Touches[args[0]] = args[1]; return Touches[args[0]]; } } } else { error("Wrong number of arguments to SetTouch():\n\t" "Expected 1 or 2, got " + sizeof(args) + "\n"); } } varargs mixed eventTouch(object who, string str) { str = GetTouch(str, who); if( !str ) { who->eventPrint("There is nothing to touch."); return 1; } environment(who)->eventPrint(who->GetName() + " touches " + GetShort() + ".", who); who->eventPrint(str); return 1; } static void create() { Touches = ([]); } mixed direct_touch_obj() { if( !Touch ) { return 0; } else { return 1; } } mixed direct_touch_str_word_obj(string str) { str = remove_article(lower_case(str)); if( !Touches[str] ) { return 0; } else { return 1; } }