mud/lib/domains/cave/etc/cave_orc.c
2020-09-06 05:43:07 -07:00

99 lines
3.3 KiB
C

#include <vision.h>
#include ROOMS_H
#include <lib.h>
inherit LIB_SENTIENT;
static private string *exempted = ({ "orc","half-orc","rodent","bear" });
int GetEnemyChaser() { return 1; }
int CheckOrc(mixed val){
if(!val) return 0;
if(!objectp(val)) return 0;
if(creatorp(val)) return 0;
if(member_array(val->GetRace(),exempted) != -1) return 0;
eventForce("growl at "+val->GetKeyName());
if( this_object()->GetEnemyChaser() &&
!this_object()->GetLeader() && sizeof(filter(val->GetFollowers(),
(: base_name($1) == base_name(this_object()) :))) < 1){
eventForce("follow "+val->GetKeyName());
SetWanderSpeed(1);
}
return 1;
}
// The following function simply makes an orc light a torch
// with a match if it's dark. It looks complicated because there
// will be a bunch of orcs, and a bunch of torches, and a bunch
// of matches. This function makes sure that THIS orc lights
// THIS torch with THIS match, thereby avoiding a cave choked to
// the gills with matches, torches, and blind orcs.
int torch_action(){
object torch, match;
object *tmp, *tmp2;
int x, y;
if(this_object()->GetEffectiveVision() < VISION_CLEAR){
tmp = filter(all_inventory(this_object()), (: answers_to("match",
$1) && $1->GetLit() :) );
tmp2 = filter(all_inventory(this_object()), (: answers_to("torch",
$1) && $1->GetFuelAmount() :) );
if(sizeof(tmp)) match = tmp[0];
if(sizeof(tmp2)) torch = tmp2[0];
if(!torch){
tmp2 = filter(all_inventory(this_object()),
(: answers_to("torch", $1) :) );
if(sizeof(tmp2)) tmp2->eventMove(ROOM_FURNACE);
torch = new("/domains/cave/obj/torch");
torch->eventMove(this_object());
}
if(!match){
tmp = filter(all_inventory(this_object()),
(: answers_to("match", $1) :) );
if(sizeof(tmp)) tmp->eventMove(ROOM_FURNACE);
match = new("/domains/cave/obj/everstrike_match");
match->eventMove(this_object());
}
if(torch && match){
x = (environment(torch) && environment(torch) == this_object());
y = (environment(match) && environment(match) == this_object());
if(x && y){
string torchname = torch->GetUniqueId();
string matchname = match->GetUniqueId();
if(!match->GetLit()){
this_object()->eventForce("strike my match");
}
this_object()->eventForce("light "+torchname+" with "+
matchname );
}
}
}
if(torch && torch->GetLit()){
this_object()->eventForce("drop my match");
}
return 1;
}
void init(){
object env = environment();
::init();
if(env && base_name(env) == "/domains/cave/room/cave"){
eventForce("go east");
}
}
void heart_beat(){
object env = environment();
if(!clonep()) return;
::heart_beat();
if(this_object()->GetEffectiveVision() < VISION_CLEAR){
torch_action();
}
if(env && base_name(env) == "/domains/cave/room/cave"){
eventForce("go east");
}
}
varargs mixed SetGuard(mixed what, mixed action, int howlong){
return ::SetGuard(what, action, howlong);
}