/* Do not remove the headers from this file! see /USAGE for more info. */ inherit ROOM; mapping dests = ([]); mapping distances = ([]); int default_distance = 6; string where; string travelling_to; function in_progress; int progress_delay; int query_distance(string destination) { return distances[where + ":" + destination] || default_distance; } int query_in_motion() { return !!travelling_to; } string query_where() { return where; } string query_location() { return dests[where]; } void arrive() { where = travelling_to; travelling_to = 0; remove_call_out("do_progress"); dests[where]->arrived(this_object()); } void do_progress() { evaluate(in_progress); call_out("do_progress", progress_delay); } void move_to(string dest) { int dist; if (!dests[dest]) error("Invalid destination.\n"); if (travelling_to) error("In motion.\n"); if (where) { dests[where]->departed(this_object()); dist = query_distance(dest); travelling_to = dest; where = 0; call_out( (: arrive :), dist); if (progress_delay) call_out("do_progress", progress_delay); } else { /* initial move */ where = dest; } } void set_destinations(mapping m) { dests = m; } void set_default_distance(int x) { default_distance = x; } void set_distance(string d1, string d2, int dist) { distances[d1 + ":" + d2] = dist; distances[d2 + ":" + d1] = dist; } void set_in_progress(function f, int delay) { in_progress = f; progress_delay = delay; } mapping lpscript_attributes() { return ([ "destinations" : ({ LPSCRIPT_MAPPING, "setup", "set_destinations" }) ]); }