#include "soul.h"
mapping soul_data;
mapping query_soul_data() { return soul_data; }
void do_save() { save_object(SAVE_FILE); }
mixed *
map(mixed *arr, string fun) {
return map_array(arr, fun, this_object());
}
void compile(string source_file) {
COMPILER->update_commands(SOUL_DEF_DIR + "/" + source_file, soul_data);
}
void create() {
int i;
string *files;
seteuid((string)"/secure/master"->creator_file(file_name(this_object())));
if (!restore_object(SAVE_FILE)) {
soul_data = ([ ]);
files = get_dir(SOUL_DEF_DIR+"/");
for (i = 0; i < sizeof(files); i ++) {
compile(files[i]);
}
}
}
/*
* The soul parsing stuff.
*/
object *match_living(string name) {
object ob, *obs;
if (!name || name == "") return ({ });
/* removing everyone...Baldrick
* if (name == "everyone") {
return (filter_array(users(), "is_vis", this_object()) -
({ this_player() }));
}
*/
if (sizeof(obs = find_match(name, environment(this_player())))) {
return (filter_array(obs,
"is_alive_and_vis", this_object()) -
({ this_player() }));
}
ob = find_living(lower_case(name));
if (ob) {
return ({ ob });
}
return ({ });
}
status is_vis(object ob) {
return (ob->short() != 0) && (environment(ob) != 0);
}
status is_alive_and_vis(object ob) { return living(ob) && is_vis(ob); }
varargs string match_adj(string scanfor, mapping data1, mapping data2) {
string foo, bar;
foo = S(data1["adverbs"]);
bar = S(data2["adverbs"]);
if (foo[0] == '#' || bar[0] == '#') {
return scanfor;
}
if (sscanf("," + foo + "," + bar + ",",
"%s," + scanfor + "%s,", foo, bar)) {
if (bar && strlen(bar)) {
return scanfor + bar;
}
return scanfor;
}
return 0;
}
string adj;
object *target;
status cmd_soul(string verb, string arg) {
mapping data, info;
string *args;
data = soul_data[verb];
if (!data) {
return 0;
}
target = ({ });
if (!arg) {
info = data["noargs"];
adj = "nothing";
args = ({ arg = "" });
}
if (!info) {
if (!args) {
args = explode(arg, " ");
}
if (data["prepositions"]) {
args = args - (string *)data["prepositions"];
}
if (sizeof(args) == 1) {
/*
* We have either a living name or an adjective.
*/
target = match_living(arg);
if (!sizeof(target)) {
info = data["undirected"];
if (!info) {
write("You must do that to somebody.\n");
return 1;
}
adj = match_adj(arg, data, info);
} else {
info = data["directed"];
if (!info) {
write ("You can't " + verb + " at someone.\n");
return 1;
}
adj = match_adj("", data, info);
}
} else {
target = match_living(args[0]);
if (sizeof(target)) {
info = data["directed"];
if (!info) {
write ("You can't " + verb + " at someone.\n");
return 1;
}
adj = match_adj(implode(args[1 .. 1000], " "), data, info);
} else {
target = match_living(args[sizeof(args) - 1]);
if (sizeof(target)) {
info = data["directed"];
if (!info) {
write ("You can't " + verb + " at someone.\n");
return 1;
}
adj = match_adj(implode(args[0 .. sizeof(args) - 2], " "),
data, info);
} else {
info = data["undirected"];
if (!info) {
write("You must do that to somebody.\n");
return 1;
}
adj = match_adj(arg, data, info);
}
}
}
}
if (!adj) {
write ("I don't know how to " + verb + " that way!\n");
return 1;
}
RELAYER->transmit(info, adj, target);
return 1;
}