/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
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) |);
};