/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** pet.c
**
** Written by Beek, during a dangerous attack of chrome and cheeze.
*/
/*
.petrc documentation:
legal fields: name, gender, proper_name, in_room_desc, ids, adjs, long,
command illegal action
each line should be field:value
use quotes to force something to be taken as a string; this is useful if
it can be mistaken for a number or an array
use commas for arrays (arrays are always arrays of strings)
The defaults correspond to the following file (as an example):
---
name:Foo's pet
gender:0
proper_name:Foo's pet
in_room_desc:Foo's pet
ids:pet
adjs:foos
long:"It doesn't have a description, unfortunately."
command illegal_cmd:growl
---
*/
inherit LIVING;
inherit M_ACTIONS;
inherit M_TRIGGERS;
object master;
mapping commands = ([]);
void do_command(string who, string str) {
mixed comms;
if (str[<1] == '.')
str = str[0..<2];
if (lower_case(who) != master->query_name()) {
comms = commands["illegal_cmd"] || "growl";
} else
if (!(comms = commands[str])) {
comms = str;
}
if (arrayp(comms))
comms = choice(comms);
respond(comms);
}
mapping parse_file(string file) {
string line;
mapping ret = ([]);
foreach (line in explode(file, "\n")) {
mixed key, value;
mixed tmp;
if (sscanf(line, "%s:%s", key, value) != 2) {
write(".petrc: Syntax error\n");
} else {
if (value[0] == '"' && value[<1] == '"')
value = value[1..<2];
else
if (to_int(value) || value == "0")
value = to_int(value);
else
if (sizeof(tmp = explode(value, ",")) > 1) {
value = tmp;
}
if (key[0..7] == "command ")
commands[key[8..]] = value;
else
ret[key] = value;
}
}
return ret;
}
void setup() {
string file;
mapping m;
string name;
master = this_body();
if (file = read_file("/wiz/" + master->query_name() + "/.petrc"))
m = parse_file(file);
else
m = ([]);
this_body()->add_hook("move", (: move(environment(master->query_body())) :));
name = m["name"] || capitalize(master->query_name()) + "'s Pet";
set_name(name);
set_gender(m["gender"]);
set_proper_name(m["proper_name"] || name);
set_in_room_desc(m["in_room_desc"] || name);
if (!m["ids"]) m["ids"] = "pet";
if (stringp(m["ids"]))
add_id(m["ids"]);
else
add_id(m["ids"]...);
if (!m["adjs"]) m["adjs"] = master->query_name() + "s";
if (stringp(m["adjs"]))
add_id(m["adjs"]);
else
add_id(m["adjs"]...);
set_long(m["long"] || "It doesn't have a description, unfortunately.");
add_pattern("%s says: " + name + ", %s", (: do_command :));
}