new object $coord_exit: $exit; var $coord_exit coordinates = 0; var $described prose = []; var $exit dest = $nowhere; var $exit lock = <$true_lock_frob, []>; var $exit source = $nowhere; var $has_commands local = #[]; var $has_commands remote = #[]; var $has_commands shortcuts = #[]; var $root created_on = 848977724; var $root flags = ['variables, 'methods, 'code, 'core]; var $root inited = 1; var $root managed = [$coord_exit]; var $root manager = $coord_exit; public method .configure() { arg set; var s, radial, azimuth, distance, ans, c, dist, m; set = (> pass(set) <); if (set.contains('exit_coordinates)) return set; s = sender(); if (!(| s.get_setting("experienced", $user) |)) s.tell($place_lib.build_hint(5)); while (1) { ans = s.prompt(((("Exit coordinates for " + (.name())) + " (to ") + ((.dest()).name())) + ") "); if (ans == "@abort") throw(~abort, "Abort"); if (ans == "@skip") return set; if (ans == "@shortcuts") { s.tell(["-- Coordinate Shortcuts:", map c in ($place_lib.coordinate_shortcuts()) to (strfmt(" %20l %7l %s", c[1], @c[2]))]); continue; } if (!ans) { s.tell("Invalid Coordinates."); continue; } catch ~coordnf, ~invcoord { if (ans.is_numeric()) { ans = ans.explode_english_list(); if ((ans.length()) != 2) { s.tell("Seperate coordinates with a comma."); continue; } if ((!((ans[1]).is_numeric())) || (!((ans[2]).is_numeric()))) { s.tell("Invalid coordinates."); continue; } if ((!((ans[1]).is_numeric())) || (!((ans[2]).is_numeric()))) { s.tell("Invalid coordinates."); continue; } radial = toint(ans[1]); azimuth = toint(ans[2]); } else { ans = $place_lib.coordinates(ans); radial = ans[1]; azimuth = ans[2]; } (> $place_lib.valid_coordinates(radial, azimuth) <); } with { s.tell((traceback()[1])[2]); continue; } } while (!dist) { ans = s.prompt(("Distance from center of room (metric) [" + ($place_lib.get_default('distance))) + "] "); if (!ans) dist = $place_lib.get_default('distance); else if (ans == "@skip") return set; else if ((m = match_regexp(ans, "^ *([0-9]+) *M *$"))) dist = toint(m[1]) * 100; else if ((m = match_regexp(ans, "^ *([0-9]+) *C?M? *$"))) dist = toint(m[1]); else s.tell("Distance must be either centimeters (cm) or meters (m)."); } coordinates = [radial, azimuth, dist]; return set.add('exit_coordinates); }; public method .coordinates() { return coordinates || [0, 0, 0]; }; public method .uninit_coord_exit() { (| clear_var('coordinates) |); };