#define MONSTER "obj/monster"
#define ARMOURY "obj/handlers/armoury"
#define HOSPITAL "/d/fr/wm_forest"
inherit "std/room";
int *forest_chance, forest_tot_chance;
string *forest_monsters;
object get_monster(string type)
{
object ob, ob2;
int temp, rand, loop;
if(!forest_monsters)
{
forest_monsters =
({
"badger", "hornet", "kenku", "snake", "owlbear",
"bugbear", "beetle", "hunter", "centipede", "bear",
"kobold", "animal", "hermit", "spider","stirge"
});
}
if(!forest_chance)
{
forest_chance =
({
10, 5, 10, 10, 5,
5, 5, 5, 10, 5,
10, 10, 5, 2, 3
});
forest_tot_chance = 100;
}
switch(type)
{
case "forest":
rand = random(forest_tot_chance - forest_chance[sizeof(forest_chance) - 1]);
temp = 0;
loop = 0;
while(rand > temp)
temp += forest_chance[loop++];
ob2 = get_monster(forest_monsters[loop]);
ob2->add_move_zone("forest");
ob2->add_property("monster_type", type);
return ob2;
case "beetle":
ob = clone_object(MONSTER);
ob->set_name("beetle");
ob->add_alias("beetle");
ob->add_adjective("stag");
ob->add_adjective("large");
ob->add_property("no_undead",1); set_short("a large stag beetle");
ob->set_main_plural("stag beetles");
ob->set_race("beetle");
ob->set_level(10+random(10));
ob->set_wimpy(0);
ob->set_long("This is a large stag beetle.\n");
ob->load_chat(2,
({
1, ":crawls away from you.\n",
1, ":lowers its horn and crawls fast towards you.\n",
1, ":moves a boulder twice its size.\n",
}));
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->add_property("monster_type", type);
return ob;
case "centipede":
ob = clone_object(MONSTER);
ob->set_name("centipede");
ob->add_property("no_undead",1); set_short("giant centipede");
ob->add_adjective("giant");
ob->add_adjective("black");
ob->set_main_plural("centipedes");
ob->add_move_zone("swamp");
ob->set_long("A giant black centipede.\n");
ob->set_aggressive(1);
ob->join_fights("A centipede gleefully crawls into combat.\n");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->set_race("snake");
ob->set_level(5+random(10));
ob->set_wimpy(0);
ob->add_property("monster_type", type);
return ob;
case "bear":
ob = clone_object(MONSTER);
ob->set_name("bear");
ob->set_al(-30);
ob->add_property("no_undead",1); set_short("black bear");
ob->add_alias("bear");
ob->add_adjective("black");
ob->set_main_plural("black bears");
ob->set_long("It's one of those black bears that are so common.\n");
ob->join_fights("A bear bounces into the combat fray.\n");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->set_race("bear");
ob->set_level(10+random(5));
ob->set_wimpy(0);
ob->add_property("monster_type", type);
return ob;
case "badger":
ob = clone_object(MONSTER);
ob->set_name("badger");
ob->add_property("no_undead",1); set_short("badger");
ob->set_race("badger");
ob->set_class("badger");
ob->set_level(4);
ob->add_alias("kenku");
ob->set_long("A badger is a canivorous burrowing animal.\n");
ob->add_property("monster_type", type);
return ob;
case "kobold":
ob = clone_object(MONSTER);
ob->set_name("kobold");
ob->add_adjective("ugly");
ob->set_race("kobold");
ob->set_al(-60);
ob->set_aggressive(1);
ob->set_level(random(4));
ob->set_wimpy(0);
ob->add_property("no_undead",1); set_short("ugly kobold");
ob->set_main_plural("ugly kobolds");
ob->add_plural("ugly kobolds");
ob->join_fights("An ugly kobold joins the fight.\n");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->set_long("The kobold is a cowardly, sadistic and ugly dog-like humanoid.\n");
ob->load_a_chat(10,
({
1, "@kick $hcname$"
}));
ob->add_property("monster_type", type);
return ob;
case "hornet":
ob = clone_object(MONSTER);
ob->set_name("hornet");
ob->add_adjective("black");
ob->set_race("monster");
ob->add_property("no_undead",1); set_short("black hornet");
ob->set_level(16+random(10));
ob->set_long("The black hornet is a fantastically large wasp.\n");
ob->add_property("monster_type", type);
return ob;
case "kenku":
ob = clone_object(MONSTER);
ob->set_name("kenku");
ob->add_property("no_undead",1); set_short("kenku");
ob->set_race("kenku");
ob->set_level(10+random(10));
ob->set_wimpy(0);
ob->add_attack("beak", 0, 20, 90, 0, 0, "magic");
ob->add_attack("beak", 0, 30, 90, 0, 0, "sharp-beak");
ob->set_long("The kenku is a bipedal, humanoid bird.\n");
ob->load_chat(5,({1, ":looks eagerly at your purse.\n"}));
ob->add_property("monster_type", type);
return ob;
case "snake":
ob = clone_object(MONSTER);
ob->set_name("snake");
ob->add_property("no_undead",1); set_short("snake");
ob->set_al(-30);
ob->set_main_plural("snakes");
ob->add_alias("worm");
ob->set_race("snake");
ob->set_level(5+random(3));
ob->set_wimpy(0);
set_long("This is an agressive large snake.\n");
ob->set_aggressive(1);
ob->join_fights("A snake slithers into the fight.\n");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->add_triggered_action("regen", "death", HOSPITAL, "regen_after_death");
ob->add_property("monster_type", type);
return ob;
case "owlbear":
ob = clone_object(MONSTER);
ob->set_name("owlbear");
ob->add_alias("owl");
ob->add_adjective("feroscious");
ob->set_al(-80);
ob->set_race("monster");
ob->set_level(20+random(11));
ob->set_wimpy(0);
ob->add_property("no_undead",1); set_short("owlbear");
ob->set_plural("owlbears");
ob->add_attack("beak", 0, 30, 160, 0, 0, "sharp-beak");
set_long("This is ferocious owlbear. It seems to be a crossbreed "
"between an owl and a bear.\n");
ob->load_a_chat(20,
({
1, ":roars loudly.",
1, ":tries to bite you with its beak.",
}));
ob->add_property("monster_type", type);
return ob;
case "bugbear":
ob = clone_object(MONSTER);
ob->set_name("bugbear");
ob->add_adjective("large");
ob->set_race("bugbear");
ob->set_level(8+random(4));
ob->set_wimpy(0);
ob->set_al(-50);
ob->set_aggressive(1);
ob->set_long("The bugbear is a large muscular humanoid.\n");
ob->set_main_plural("bugbears");
ob->add_property("no_undead",1); set_short("bugbear");
ob->load_a_chat(20,
({
1, "'Grrrk ackrrr!\n",
1, "'Grrrckkarr!\n",
1, "@growl menacingly $hcname$",
}));
ob->add_move_zone("barracks");
ob->add_property("monster_type", type);
ARMOURY->request_weapon("axe",50+random(70))->move(ob);
ob->join_fights("A bugbear exclaims: Rakk!.\n");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->init_equip();
return ob;
case "hunter":
ob = clone_object(MONSTER);
ob->set_name("hunter");
ob->add_property("no_undead",1); set_short("hunter");
ob->add_adjective("forest");
ob->set_main_plural("hunters");
ob->set_long("Just a forest hunter.\n");
ob->set_race("half-orc");
ob->set_class("fighter");
ob->set_level(random(30));
ob->set_wimpy(0);
ob->set_al(-100+random(201));
ob->adjust_money(random(70), "copper");
ob->load_chat(5,
({
1, "@search",
1, "@grunt",
1, "'These forests are MY hunting grounds!",
1, "'I hope you haven't come for a deer-hunt.",
1, "'What are you doing here ?"
}));
ob->load_a_chat(30,
({
1, "'Get outta here!",
1, "@spit $lname$",
1, "'Ughh!",
1, "@drool"
}));
if(random(2))
ARMOURY->request_armour("leather",40+random(40))->move(ob);
if(random(4))
ARMOURY->request_armour("soft leather cap", 70+random(30))->move(ob);
if(random(2))
ARMOURY->request_weapon("short sword", 70+random(30))->move(ob);
ob->add_property("monster_type", type);
ob->init_equip();
return ob;
case "animal":
ob = clone_object(MONSTER);
ob->set_race("monster");
ob->set_long("It's just an animal.\n");
switch(random(6))
{
case 0:
ob->set_name("dog");
ob->add_property("no_undead",1); set_short("forest dog");
ob->add_adjective("forest");
ob->set_main_plural("dogs");
ob->set_gender(0);
ob->set_level(-1+random(5));
break;
case 1:
ob->set_name("boar");
ob->add_property("no_undead",1); set_short("wild boar");
ob->add_adjective("wild");
ob->set_main_plural("boars");
ob->set_gender(0);
ob->set_level(3+random(6));
break;
case 2:
ob->set_name("deer");
ob->add_property("no_undead",1); set_short("deer");
ob->set_main_plural("deer");
ob->set_gender(0);
ob->set_level(-1+random(3));
break;
case 3:
ob->set_name("crawler");
ob->add_property("no_undead",1); set_short("carrion crawler");
ob->add_adjective("carrion");
ob->set_main_plural("carrion crawlers");
ob->set_gender(0);
ob->set_level(random(7));
break;
case 4:
ob->set_name("skunk");
ob->add_property("no_undead",1); set_short("skunk");
ob->set_long("It looks very cute with its black'n white pelt.\n");
ob->add_adjective("cute");
ob->set_main_plural("skunks");
ob->set_gender(0);
ob->set_level(3);
break;
case 5:
ob->set_name("stag");
ob->add_property("no_undead",1); set_short("mighty stag");
ob->add_adjective("mighty");
ob->set_main_plural("mighty stags");
ob->set_gender(1);
ob->set_level(10+random(10));
break;
}
ob->add_property("monster_type", type);
ob->set_wimpy(0);
return ob;
case "hermit":
ob = clone_object(MONSTER);
ob->set_name("hermit");
ob->set_race("human");
ob->set_level(1+random(22));
ob->add_alias("man");
ob->set_al(10);
ob->set_wimpy(10);
ob->adjust_money(random(100),"copper");
ob->add_property("no_undead",1); set_short("hermit");
ob->set_long("This is one of the loners who wander the forests of the "
"Forgotten Realms.\n");
ob->add_property("monster_type", type);
return ob;
case "spider":
ob = clone_object(MONSTER);
ob->set_name("spider");
ob->add_adjective("huge");
ob->set_race("spider");
ob->set_level(5+random(5));
ob->add_property("no_undead",1); set_short("a huge spider");
ob->set_main_plural("spiders");
ob->add_triggered_action("bing2", "event_death", HOSPITAL, "death");
ob->set_long("This is a huge spider. Wonder if it's poisonous.\n");
ob->add_property("monster_type", type);
return ob;
case "stirge":
ob = clone_object(MONSTER);
ob->set_name("stirge");
ob->add_adjective("fast");
ob->set_race("stirge");
ob->set_al(-20);
ob->add_property("no_undead",1); set_short("a stirge");
ob->set_level(2);
ob->set_long("The stirge is a mosquito-like bird.\n");
ob->add_property("monster_type", type);
return ob;
default:
ob = clone_object(MONSTER);
ob->set_name("failure");
ob->add_property("no_undead",1); set_short("failure");
ob->set_long(file_name(previous_object()));
ob->set_level(1);
return ob;
}
}
void regen_after_death()
{
object ob, dest;
string nam;
nam = (string)previous_object()->query_property("monster_type");
dest = (object)previous_object()->query_property("start location");
if (!dest)
return ;
ob = get_monster(nam);
dest->add_monster(previous_object(), ob);
call_out("do_move", 10, ({ ob, dest }) );
}
void do_move(mixed *junk)
{
if(junk[0])
junk[0]->move(junk[1]);
}
void death()
{
call_out("do_pick_up", 0, previous_object());
}
void do_pick_up(object ob)
{
ob->init_command(":loots the corpse.\n");
ob->init_command("get all from corpses");
ob->run_away();
}