#include <kernel/kernel.h>
#include <phantasmal/timed.h>
#include <phantasmal/log.h>
#include <phantasmal/lpc_names.h>
inherit MOBILE;
/* Member variables */
private int registered;
/* Inherited mobile data */
static int aggression;
/* prototypes */
void upgraded(varargs int clone);
static void create(varargs int clone) {
::create(clone);
upgraded(clone);
}
void upgraded(varargs int clone) {
if(clone && !registered) {
LOGD->write_syslog("Setting up heart_beat in wander mobile",
LOG_VERBOSE);
TIMED->set_heart_beat(TIMED_HALF_MINUTE, "__vol_hook");
registered = 1;
}
if(clone) {
/* This is mainly just an example at this point */
aggression = 0;
}
}
string get_type(void) {
return "animal";
}
void __vol_hook(void) {
int num_ex, ctr;
object exit, dest;
string reason;
if(previous_program() != TIMED) {
error("animal_mobile::__vol_hook should only be called by TIMED!");
}
if(random(100) < 70) {
/* Do nothing for the moment */
if(aggression && (random(100) < 25)) {
social("growl", nil);
}
return;
}
num_ex = location->num_exits();
if(num_ex > 0) {
int dir;
ctr = random(num_ex);
exit = location->get_exit_num(ctr);
if(!exit)
error("Internal error! Can't get exit!");
dir = exit->get_direction();
dest = exit->get_destination();
reason = this_object()->move(dir);
if(reason) {
this_object()->say("I'm blocked! I can't move there!");
return;
}
}
}
static mixed *animal_from_dtd_unq(mixed* unq) {
mixed *ret, *ctr;
int bodynum, aggr;
ret = ({ });
ctr = unq;
while(sizeof(ctr) > 0) {
if(!STRINGD->stricmp(ctr[0][0], "aggression")) {
if(sscanf(ctr[0][1], "%*d %*s") != 2
&& sscanf(ctr[0][1], "%d", aggr) == 1) {
aggression = aggr;
}
} else {
ret += ({ ctr[0] });
}
ctr = ctr[1..];
}
return ret;
}
void from_dtd_unq(mixed* unq) {
/* Set the body, location and number fields */
unq = mobile_from_dtd_unq(unq);
/* Now parse the data section */
unq = animal_from_dtd_unq(unq);
/* Now signal error if there's anything funky in the data
section that we don't recognize. */
if(sizeof(unq) > 0) {
LOGD->write_syslog("Extra fields: " + STRINGD->mixed_sprint(unq),
LOG_ERROR);
error("Unrecognized UNQ content in animal mobile data section!");
}
}
string mobile_unq_fields(void) {
return " ~aggression{" + aggression + "}\n";
}