#include "boot.clh"
object PLAYER
parents LOCATED_OBJ, DESCRIBED_OBJ;
name = "Generic Player";
str password;
str gender;
num connected_at, last_cmd_at;
obj home;
list creations;
num reading; /* reading flag */
str read_input; /* input so far */
str done_reading; /* what to call when done reading */
/* nicknames */
obj nick_root = ROOT_OBJ;
obj nick_desc = DESCRIBED_OBJ;
obj nick_loc = LOCATED_OBJ;
obj nick_thing = THING;
obj nick_cont = CONTAINER;
obj nick_room = ROOM;
obj nick_exit = EXIT;
obj nick_player = PLAYER;
obj nick_builder = BUILDER;
obj nick_prog = PROGRAMMER;
obj nick_wizard = WIZARD;
/* player commands */
verb "dr*op th*row" = drop_cmd;
verb "get ta*ke" = get_cmd;
verb "help" = help_cmd;
verb "home" = gohome_cmd;
verb "i inv*entory" = inventory_cmd;
verb "l*ook" = look_cmd;
verb "news" = news_cmd;
verb "pa*ge" = page_cmd;
verb "pa*ge" : "with" = page_cmd;
verb "@password password" : "to" = password_cmd;
verb "@password password" = password_cmd;
verb "po*se" = pose_cmd;
verb "quit" = quit_cmd;
verb "rwho" = rwho_cmd;
verb "sa*y" = say_cmd;
verb "who" = who_cmd;
verb "wh*isper" : "to" = whisper_cmd;
verb "wiz*ards" = wizards_cmd;
method init
if (this == PLAYER)
this.add_owner(WIZARD);
elseif (PERMS_OK)
pass();
this.add_owner(this);
home = PLAYER_START;
this.moveto(home);
last_cmd_at = time();
else
raise E_PERM;
endif
endmethod /* init */
method destroy
var thing, tid;
ignore E_SERVERDN, E_OBJNF, E_METHODNF;
if (PERMS_OK)
for thing in (creations)
tid = thing.id;
if (tid == E_OBJNF || tid == E_SERVERDN)
continue;
endif
if (thing != this)
thing.rm_owner(this);
if (!thing.owners)
thing.destroy();
endif
endif
endfor
SYS_OBJ.rm_player(this);
pass() to LOCATED_OBJ;
else
raise E_PERM;
endif
endmethod
method id
return pass() to DESCRIBED_OBJ;
endmethod
method psub
var n, s, o, p, q, r;
n = name;
if (gender && gender[1] == "m")
s = "he"; o = "him"; p = "his"; q = "his"; r = "himself";
elseif (gender && gender[1] == "f")
s = "she"; o = "her"; p = "her"; q = "hers"; r = "herself";
else
s = "it"; o = "it"; p = "its"; q = "its"; r = "itself";
endif
return psub(args[1]);
endmethod
method moveto
var oldloc;
ignore E_METHODNF;
oldloc = location;
if (pass(args[1]))
if (lengthof(args) > 1 && args[2])
echo(args[2]);
endif
if (lengthof(args) > 2 && args[3])
oldloc.announce(this.psub(args[3]), {this, location});
endif
oldloc.announce(name + " has left.", {this, location});
this.look_around();
if (lengthof(args) > 3 && args[4])
echo(args[4]);
endif
if (lengthof(args) > 4 && args[5])
location.announce(this.psub(args[5]), {this, oldloc});
endif
location.announce(name + " has arrived.", {this, oldloc});
return 1;
else
return 0;
endif
endmethod
method drop_cmd
var thing;
ignore E_SERVERDN, E_METHODNF, E_OBJNF;
if (caller != this)
return 1;
elseif (args[2] == "all" || args[2] == "everything")
if (!contents)
echo("You are empty-handed.");
else
for thing in (contents)
if (thing.drop("all") == E_METHODNF)
echo(thing.name + ": You can't drop that.");
endif
endfor
endif
else
return 1;
endif
endmethod
method get_cmd
var cont, thing;
ignore E_SERVERDN, E_METHODNF, E_OBJNF;
if (caller != this)
return 1;
elseif (args[2] == "all" || args[2] == "everything")
cont = location.contents - this;
if (!cont)
echo("There's nothing here to get!");
else
for thing in (cont)
if (thing.get("all", "") == E_METHODNF)
echo(thing.name + ": You can't get that.");
endif
endfor
endif
else
return 1;
endif
endmethod
method input_to
if (caller != this && !(caller in SYS_OBJ.wizards))
raise(E_PERM);
endif
reading = 1;
read_input = "";
done_reading = args[1];
endmethod
method parse
var thing, cmd, r;
ignore E_SERVERDN;
if (caller != this && !(caller in SYS_OBJ.wizards))
raise(E_PERM);
endif
lock("parse");
last_cmd_at = time();
cmd = args[1];
if (reading)
if (cmd == ".")
reading = 0;
this.(done_reading)(read_input);
read_input = "";
else
read_input = read_input + cmd + "\n";
endif
return;
endif
if (!cmd)
return;
elseif (cmd[1] == "\"")
if (lengthof(cmd) > 1)
cmd = "say " + cmd[2..];
else
cmd = "say ";
endif
elseif (cmd[1] == ":")
if (lengthof(cmd) > 1)
cmd = "pose " + cmd[2..];
else
cmd = "pose ";
endif
elseif (cmd[1] == ";")
if (lengthof(cmd) > 1)
cmd = "eval " + cmd[2..];
else
cmd = "eval ";
endif
endif
if (!this.call_verb(cmd)) /* check player for cmds */
return;
endif
for thing in (contents)
if (thing.call_verb(cmd) == 0) return; endif
endfor
if (location)
if (location.call_verb(cmd) == 0) /* check room for cmds */
return;
endif
for thing in (location.contents) /* check room's inv for cmds */
if (thing != this)
if (thing.call_verb(cmd) == 0) return; endif
endif
endfor
if (location.go(cmd) == 0) return; endif
for thing in (location.exits) /* check exits for cmds */
if (thing.call_verb(cmd) == 0)
return;
endif
endfor
endif
echo("I don't understand that.");
endmethod /* parse */
method home
return home;
endmethod /* home */
method match
if (args[1] == "me" && player == this)
return 1;
else
return (pass(args[1]) to DESCRIBED_OBJ);
endif
endmethod /* match */
method match_env
var s, what, loc;
ignore E_SERVERDN, E_VARNF;
s = args[1];
if (!s)
return NOTHING;
elseif (s[1] == "#")
return toobj(s);
elseif (s == "me")
return player;
elseif (s == "here" && location)
return location;
elseif (s == "nowhere")
return NOTHING;
elseif (s[1] == "$" && lengthof(s) > 1)
what = getvar("nick_" + s[2..]);
if (what == E_VARNF || typeof(what) != OBJ)
return NOTHING;
else
return what;
endif
endif
what = this.match_contents(s);
if (what)
return what;
endif
if (location)
what = location.match_contents(s);
if (what)
return what;
endif
endif
return NOTHING;
endmethod /* match_env */
method disconnect
location.announce(name + " has disconnected.", {player});
endmethod /* disconnect */
method connect
connected_at = time();
this.look_around();
if (location)
location.announce(name + " has connected.", {player});
endif
endmethod /* connect */
method connected_at
return connected_at;
endmethod /* connected_at */
method last_cmd_at
return last_cmd_at;
endmethod /* last_cmd_at */
method tell
echo(args[1]);
endmethod /* tell */
method add_creation
creations = creations + args[1];
endmethod /* add_creation */
method rm_creation
creations = creations - args[1];
endmethod /* rm_creation */
method sdesc
return (name + " is here.");
endmethod /* sdesc */
method set_name
var existing;
/* check for duplicate player names */
existing = SYS_OBJ.find_player(args[1]);
if (existing && existing != this)
raise(E_RANGE);
elseif (" " in args[1])
raise(E_RANGE);
else
pass(args[1]) to DESCRIBED_OBJ;
endif
endmethod /* set_name */
method look
pass() to DESCRIBED_OBJ;
if (contents)
player.tell("Carrying:");
this.inv();
endif
endmethod /* look */
method help_cmd
var filename, what;
ignore E_FILE, E_METHODNF;
if (caller != this)
return 1;
endif
if(args[2])
filename = "help/" + args[2] + ".txt";
else
filename = "help/intro.txt";
endif
if (echo_file(filename) == 0)
return;
endif
what = this.match_env(args[2]);
if (what)
if (!what.help())
echo("There is no help on that object.");
endif
else
echo("There is no help on that topic.");
endif
endmethod
method inv
var thing, nm;
ignore E_SERVERDN;
for thing in (contents)
nm = thing.name;
if (nm == E_SERVERDN)
player.tell(" (Ghost of " + tostr(thing) + ")");
else
player.tell(" " + nm);
endif
endfor
endmethod /* inv */
method gohome_cmd
ignore E_SERVERDN;
if (caller != this)
return 1;
endif
this.moveto(home, "Click click click...", name + " goes home.",
"", name + " comes home.");
endmethod /* gohome_cmd */
method inventory_cmd
var item;
if (contents)
echo("You are carrying:");
this.inv();
else
echo("You are empty-handed.");
endif
endmethod /* inventory_cmd */
method look_around
ignore E_SERVERDN, E_OBJNF;
var r;
player = this;
r = location.look();
if (r == E_SERVERDN)
echo("The outlines of the room you are in have suddenly become hazy and indistinct. Going \"home\" might be useful about now.");
elseif (r == E_OBJNF)
echo("You're absolutely nowhere. Go home.");
endif
endmethod
method look_cmd /* verb, can be called by others */
if (!args[2])
this.look_around();
elseif (this.match(args[2]))
this.look();
else
return 1; /* keep looking for verb on other objects */
endif
endmethod /* look_cmd */
method news_cmd
var what;
ignore E_FILE;
if (caller != this)
return 1;
elseif (!args[2])
what = "news/intro.txt";
else
what = "news/" + args[2] + ".txt";
endif
if (echo_file(what) == E_FILE)
echo("There is no news on that topic.");
endif
endmethod
method page_cmd
var who, locname;
ignore E_SERVERDN, E_METHODNF, E_OBJNF;
if (caller != this)
return 1;
elseif (!args[2])
echo("Usage: page <player>");
echo(" page <player> with <message>");
endif
locname = location.name;
who = SYS_OBJ.find_connected_player(args[2]);
if (!who)
echo("That player is not connected.");
elseif (args[4])
who.tell(name + " pages, \"" + args[4] + "\"");
echo("Your message has been sent.");
elseif (typeof(locname) == STR)
who.tell("You sense that " + name + " is looking for you in "
+ locname + ".");
echo("Your message has been sent.");
else
who.tell("You sense that " + name + " is looking for you.");
echo("Your message has been sent.");
endif
endmethod /* page_cmd */
method password_cmd /* verb */
if (caller != this)
return 1;
elseif (!args[2] || !args[4])
echo("Usage: @password <oldpasswd> to <newpasswd>");
elseif (crypt(args[2], password[1..2]) != password)
echo("Incorrect old password.");
else
password = crypt(args[4]);
echo("Password changed.");
endif
endmethod /* password_cmd */
method pose_cmd /* verb */
if (caller != this)
return 1;
endif
location.announce(name + " " + args[2]);
endmethod /* pose_cmd */
method rwho_cmd
var sysobj, header;
ignore E_SERVERDN;
for sysobj in (servers())
header = "Server \"" + servername(sysobj) + "\": ";
if (sysobj.who(header) == E_SERVERDN)
echo(header + "Server down.");
else
echo("---");
endif
endfor
endmethod /* rwho_cmd */
method say_cmd /* verb */
if (caller != this)
return 1;
endif
echo("You say, \"" + args[2] + "\"");
location.announce(name + " says, \"" + args[2] + "\"", {player});
endmethod /* say_cmd */
method teleport_cmd /* verb */
var what, dest;
what = this.match_env(args[2]);
dest = this.match_env(args[4]);
if (!what)
echo("Teleport what?");
elseif (!dest && args[4] != "nowhere")
echo("Teleport it where?");
elseif(!what.moveto(dest, "You feel a wrenching sensation.."))
echo("You can't teleport that.");
else
echo("Teleported.");
endif
endmethod /* teleport_cmd */
method quit_cmd /* verb */
if (caller != this && !(caller in SYS_OBJ.wizards))
return 1;
endif
quit();
endmethod /* quit_cmd */
method wizards_cmd /* verb */
var wiz;
echo("Your wizards are:");
for wiz in (SYS_OBJ.wizards)
echo(" " + wiz.name);
endfor
endmethod /* wizards_cmd */
method who_cmd /* verb */
if (caller != this)
return 1;
endif
SYS_OBJ.who;
endmethod /* who_cmd */
method whisper_cmd
var who;
ignore E_METHODNF;
if (caller != this)
return 1;
endif
who = this.match_env(args[4]);
if (!who)
echo("I don't see that here.");
elseif (who.tell(name + " whispers, \"" + args[2] + "\"") == 0)
echo("You whisper, \"" + args[2] + "\" to " + who.name);
else
echo("You can't whisper to that!");
endif
endmethod /* whisper_cmd */
endobject /* PLAYER */