parent $user object $builder var $root child_index 0 var $root owners [$builder] var $root fertile 0 var $has_commands commands [["@par?ents *", 'parents_cmd], ["@dest?roy *", 'destroy_cmd], ["@child?ren|@kids *", 'children_cmd], ["@build *", 'build_cmd]] var $has_commands shortcuts [] var $has_verbs verbs #[] var $location contents [] var $located location $nowhere var $user password "*" var $user connected_at 0 var $user last_command_at 0 var $user connections [] var $root inited 1 var $root owned [$builder] var $command_aliases command_aliases [] var $user modes #[] var $gendered gender $gender_neuter var $located obvious 1 var $described prose #[] var $user prompt "" var $root manager $builder var $root writable [$builder] var $root readable ['parameters, 'methods, 'code] var $user parsers [$command_parser, $verb_parser] var $user tell_traceback ['brief, 0] var $user context #[] var $root quota 75000 var $root dbref 'builder var $named name ['uniq, "Generic Builder"] var $named name_aliases [] var $user_data user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] method dig_cmd arg com, exitname, prep, roomname; var egoing, ecoming, exits, here, there; here = .location(); there = $nowhere; if (roomname && ((roomname[1]) == "$")) { // later check the $room_db setup there = (| $object.to_dbref(roomname) |); if (!there) $parse.tell_error(("No room found by the name \"" + roomname) + "\"."); } else { there = ($room_utils.default_type()).spawn(); there.set_name(roomname); .tell(("Created new room \"" + (there.namef('ref))) + "\"."); } // exits = explode(exitname, "|"); if (listlen(exits) == 0) $parse.tell_error("No exits specified!"); if (listlen(exits) > 1) { if (listlen(exits) > 2) $parse.tell_error("Invalid format, too many exits specified"); ecoming = $exit.spawn(); ecoming.set_name(exits[2]); catch any { ecoming.attach(there); ecoming.link(here); .tell(((("Linked " + (here.namef('ref))) + " to ") + (there.namef('ref))) + "."); } with handler { ecoming.destroy(); .tell("Could not make exit from there to here: " + ((traceback()[1])[2])); } } egoing = $exit.spawn(); egoing.set_name(exits[1]); catch any { egoing.attach(here); egoing.link(there); .tell(((("Linked " + (there.namef('ref))) + " to ") + (here.namef('ref))) + "."); } with handler { egoing.destroy(); .tell("Couldn't make exit from here to there: " + ((traceback()[1])[2])); return; } .tell("Place successfully Created and Linked."); . method children_cmd arg verb, what; var line, kid, colx, col, kids, x; what = .match_env_nice(what); kids = what.children(); if (!kids) { .tell(("Children of " + (what.namef('xref))) + ": ** None **"); } else { col = (.linelen()) / 8; colx = col * 3; line = (listlen(kids) > 1) ? "Children" | "Child"; .tell(((line + " of ") + (what.namef('ref))) + ":"); line = pad(" Name", colx + 2) + pad(" Perms", col - 2); .tell((line + pad("Size ", -col)) + "Manager"); for kid in (kids) { line = " " + (kid.namef('xref)); line = pad(line, colx + 2); line = line + pad(" " + ($object.see_perms(kid)), col - 2); line = line + pad(tostr(kid.size()) + " ", -col); line = line + pad($object.get_name(kid.manager(), 'namef, ['xref]), colx); .tell(line); } } . method parents_cmd arg verb, what; var line, par, colx, col, parents, x; what = .match_env_nice(what); parents = what.parents(); col = (.linelen()) / 8; colx = col * 3; line = "Parent" + ((listlen(parents) > 1) ? "s" | ""); .tell(((line + " of ") + (what.namef('ref))) + ":"); line = pad(" Name", colx + 2) + pad(" Perms", col - 2); .tell((line + pad("Size ", -col)) + "Manager"); for par in (parents) { line = " " + (par.namef('xref)); line = pad(line, colx + 2); line = line + pad(" " + ($object.see_perms(par)), col - 2); line = line + pad(tostr(par.size()) + " ", -col); line = line + pad($object.get_name(par.manager(), 'namef, ['xref]), colx); .tell(line); } . method destroy_cmd arg destroy, what; var syntax; if (sender() != this()) throw(~perm, "Sender not this."); syntax = "@destroy <object>"; what = .match_env_nice(what, syntax); catch any { what.destroy(); .tell("Destroyed."); } with handler { $parse.tell_error((traceback()[1])[2], syntax); } . method _build_ask_roomname arg name, there; var x, exit; .perms(sender(), 'this); name = (| $code.parse_name(@name) |); if (!name) { .tell("Invalid room name."); $builder._build_destroy_stuff(there, []); } else { there = ['new, ($places.place('default_new)).spawn()]; (there[2]).set_name(name[1]); for x in (name[2]) (there[2]).add_name_alias(x); .tell((" Created place " + ((there[2]).namef('ref))) + "."); .prompt("Exit name: ", '_build_ask_exitname, there, []); } . method build_cmd arg cmd, str; var there, exit, x; .perms(sender(), 'this); if (!str) { .prompt("Name of new room: ", '_build_ask_roomname, []); } else if ("-aliases" in str) { .tell("Radial/Azimuth Coordinate shortcuts:"); .tell(" Shortcut Radial Azimuth"); for x in ($places.coordinate_shortcuts()) .tell(((" " + pad(x[1], 20)) + pad(tostr((x[2])[1]), 7)) + tostr((x[2])[2])); } else { str = explode(str); there = .match_env_nice(str[listlen(str)]); catch any { $places.is_place(there); } with handler { return .tell((traceback()[1])[2]); } .prompt("Exit Name: ", '_build_ask_exitname, ['old, there], []); } . method _build_destroy_stuff arg there, exits; var success, x; .perms(sender(), 'this); if (there && ((there[1]) == 'new)) { success = (| (there[2]).destroy() |); if (success) .tell("Destination room sucessfully destroyed."); else .tell("Unable to destroy destination room: " + ($data.unparse(there[2]))); } for x in [1 .. listlen(exits)] { success = (| (exits[x]).destroy() |); if (success) .tell(("Exit " + tostr(x)) + " sucessfully destroyed."); else .tell("Unable to destroy exit: " + ($data.unparse(exits[x]))); } . method _build_ask_exitname arg name, there, exits; var x, y; name = (| $code.parse_name(@name) |); if ((!name) && (!exits)) { .tell("Invalid exit name."); ._build_destroy_stuff(there, exits); return; } else if (name) { exits = [@exits, $exit.spawn()]; y = listlen(exits); (exits[y]).set_name(name[1]); for x in (name[2]) (exits[y]).set_name_alias(x); .tell((" Created exit " + ((exits[y]).namef('ref))) + "."); if (y < 2) .prompt("Returning exit name: ", '_build_ask_exitname, there, exits); else .prompt("Coordinates (radial,azimuth): ", '_build_ask_coordinates, there, exits); } else { .prompt("Coordinates (radial,azimuth): ", '_build_ask_coordinates, there, exits); } . method _build_ask_coordinates arg coord, there, exits; var err, radial, azimuth; .perms(sender(), 'this); err = "Invalid coordinates. You must use either radial/azimuth coordinates or use coordinate aliases (use @build -aliases to get a listing of aliases)."; coord = coord[1]; if (!coord) { .tell(err); ._build_destroy_stuff(there, exits); return; } else { catch ~coordnf, ~invcoord { if ($string.is_numeric(coord)) { coord = explode(coord, ","); if (listlen(coord) != 2) { .tell(err + " Seperate actual radial/azimuth coordinates by a comma."); ._build_destroy_stuff(there, exits); return; } radial = toint(coord[1]); azimuth = toint(coord[2]); } else { coord = $places.coordinates(coord); radial = coord[1]; azimuth = coord[2]; } $places.valid_coordinates(radial, azimuth); } with handler { .tell((traceback()[1])[2]); ._build_destroy_stuff(there, exits); return; } .tell((((" Using coordinates: Radial: " + tostr(radial)) + " Azimuth: ") + tostr(azimuth)) + "."); } ._build_done(there, exits, [radial, azimuth]); . method _build_done arg there, exits, coord; var here, x; .perms(sender(), 'this); here = .location(); catch any { (exits[1]).attach(here, there[2], @coord); } with handler { .tell("Unable to attach exit because: "); .tell((traceback()[1])[2]); ._build_destroy_stuff(there, exits); } // second exit if (listlen(exits) == 2) { catch any { (exits[2]).attach(there[2], here, @$places.invert_coordinates(@coord)); } with handler { .tell("Unable to attach return exit because: "); .tell((traceback()[1])[2]); ._build_destroy_stuff([], [exits[2]]); } } .tell("Finished building extension."); .tell("Use `@prose` to set long and short prose descriptions."); .