Method code for $builder.dig_cmd()

[Turn on line numbering]
arg cmdstr, cmd, args;
var m, syn, dest, dnew, name, dname, arrive, lname, rname, exit1, exit2, loc;

(> .perms(caller(), 'command) <);
syn = ["Syntax: `@dig <new place>` OR", "        `@dig <leaving exit>[;<arriving exit>] to <objref or new place>`", "You may also want to try @build."];
if (!args)
    return syn;
loc = .location();

// are they essentially just @spawn'ing?
if (!(m = match_template(args, "* to *"))) {
    if (match_regexp(args, "^\$[a-z0-9_]+$"))
        return syn;
    dest = (> ._build__create_place(name) <);
    return;
}

// can we extend from this room?
if (!(| loc.will_attach('source) |))
    return "This room is not publicly extendable.";

// do some basic parsing before we needlessly create anything
[args, m, name] = m;

// leave, return
[lname, (rname ?= "")] = split(args, " *[|;] *");
if (!lname || !name)
    return syn;

// create or parse the destination first
name = name.trim();
if (match_regexp(name, "^\$[a-z0-9_]+$")) {
    if (!(dest = (| lookup(tosym(substr(name, 2))) |)))
        return "Invalid object name.";
    if (!dest.is($place))
        return "Destination " + dest.namef('ref) + " is not a place.";
} else {
    dest = (> ._build__create_place(name) <);
    dnew = 1;
}

// now parse and attach the exits
// first the exit to that location
if (!(name = (| $code_lib.parse_name(lname) |)))
    return "Invalid exit name '" + lname + "'";
rname = rname.trim();

// try to pick a return-exit name
if (!rname) {
    if (!(dname = $place_lib.opposite_direction(lname)))
        dname = lname;
    arrive = (> .prompt("Specify return exit, or 'none' for no return exit [" + dname + "] ").trim() <);
    if (!arrive)
        rname = dname;
    else if (arrive != "none")
        rname = strsub(arrive, "|", ",");
}

// if so, create it
if (rname) {
    if (!(name = (| $code_lib.parse_name(rname) |)))
        return "Invalid exit name '" + rname + "'";
    rname = name;
}
catch ~stop {
    exit1 = (> ._build__generate_exit(loc, dest, name) <);
    if (rname)
        exit2 = (> ._build__generate_exit(dest, loc, rname) <);
} with {
    .tell(traceback()[1][2]);
    return ._build__cleanup([dest, dnew], [exit1, 1], [exit2, exit2]);
}

// $#Edited: 13 Sep 97 15:11 $brandon
// $#Edited: 17 Feb 98 19:19 $user_tangent
// $#Edited: 20 Apr 04 22:00 $brandon
// $#Edited: 20 Apr 04 23:33 $lynx
// $#Edited: 19 Aug 04 21:03 $brandon

["// Created 26-Mar-1995 as a part of ColdCore, see: @help Credit"]

the Cold Dark