#include <kernel/kernel.h> #include <phantasmal/log.h> #include <phantasmal/lpc_names.h> #include <type.h> inherit unq DTD_UNQABLE; /* Prototypes */ void upgraded(varargs int clone); /* Constants */ #define SOULD_ARRAY_SIZE 5 /* Offsets into arrays */ #define SOULD_SELF_ONLY 0 #define SOULD_SELF_TARGET 1 #define SOULD_TARGET 2 #define SOULD_OTHER_ONLY 3 #define SOULD_OTHER_TARGET 4 /* Data from SoulD file*/ mapping sould_strings; int num_soc; static void create(varargs int clone) { if(clone) { error("Can't clone CONFIGD!"); } unq::create(clone); upgraded(); } void upgraded(varargs int clone) { if(!SYSTEM() && !COMMON()) return; set_dtd_file(SOULD_DTD); unq::upgraded(); } mixed* to_dtd_unq(void) { error("Not implemented yet"); } /* Access protection for from_unq and from_unq_text */ void from_unq_text(string unq_text) { if(!SYSTEM() && !COMMON() && !GAME()) return; unq::from_unq_text(unq_text); } void from_unq(mixed *unq) { if(!SYSTEM() && !COMMON() && !GAME()) return; unq::from_unq(unq); } void from_dtd_unq(mixed* unq) { if(!SYSTEM() && !COMMON() && !GAME()) return; /* Clear out Soul array before reloading */ sould_strings = ([ ]); while(sizeof(unq) > 0) { if(unq[0] == "social") { mixed* entry, *soc_unq; entry = allocate(SOULD_ARRAY_SIZE); soc_unq = unq[1]; while(sizeof(soc_unq) > 0) { if(soc_unq[0][0] == "verb") { sould_strings[soc_unq[0][1]] = entry; } else if (soc_unq[0][0] == "self-only") { entry[SOULD_SELF_ONLY] = soc_unq[0][1]; } else if (soc_unq[0][0] == "self-target") { entry[SOULD_SELF_TARGET] = soc_unq[0][1]; } else if (soc_unq[0][0] == "target") { entry[SOULD_TARGET] = soc_unq[0][1]; } else if (soc_unq[0][0] == "other-only") { entry[SOULD_OTHER_ONLY] = soc_unq[0][1]; } else if (soc_unq[0][0] == "other-target") { entry[SOULD_OTHER_TARGET] = soc_unq[0][1]; } else { error("Unrecognized tag '" + STRINGD->mixed_sprint(soc_unq[0]) + "' in social entry parsing SoulD file!"); } soc_unq = soc_unq[1..]; } } unq = unq[2..]; } num_soc = map_sizeof(sould_strings); } int is_social_verb(string verb) { if(SYSTEM() || COMMON() || GAME()) return !!sould_strings[verb]; return -1; } int num_socials(void) { if(SYSTEM() || COMMON() || GAME()) return num_soc; return -1; } string* all_socials(void) { mixed* keys; if(!SYSTEM() && !COMMON() && !GAME()) return nil; keys = map_indices(sould_strings); return keys[..]; } string get_social_string(object user, object body, object target_body, string verb) { mixed *entry, *unq; string result; object phr; if(!SYSTEM() && !COMMON() && !GAME()) return nil; entry = sould_strings[verb]; if(!entry) return nil; /* Check for reflexive */ if(target_body == body) { /* A nil target means it's done to yourself */ target_body = nil; } if(user->get_body() == body) { /* Looks like this is done by us... */ if(target_body) { unq = entry[SOULD_SELF_TARGET]; } else { unq = entry[SOULD_SELF_ONLY]; } } else if (user->get_body() == target_body) { /* Looks like this is done *to* us */ unq = entry[SOULD_TARGET]; } else { if(target_body) { unq = entry[SOULD_OTHER_TARGET]; } else { unq = entry[SOULD_OTHER_ONLY]; } } if(!unq) error("Can't resolve UNQ for social verb '" + verb + "'!"); /* Go through and replace tags */ result = ""; while(unq && sizeof(unq)) { if(!unq[0] || unq[0] == "") { result += unq[1]; } else if (unq[0] == "target") { phr = target_body->get_brief(); result += phr->to_string(user); } else if (unq[0] == "actor") { phr = body->get_brief(); result += phr->to_string(user); } else { error("Unrecognized tag " + STRINGD->mixed_sprint(unq[0]) + "/" + STRINGD->mixed_sprint(unq[1]) + " in string substitution for social verb '" + verb + "'"); } unq = unq[2..]; } return result; }