#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(); }