diff options
author | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-01-07 15:47:02 +0000 |
---|---|---|
committer | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2009-01-07 15:47:02 +0000 |
commit | b12dd9a0fe5c15ff1f655252ef07e03fdf0d4943 (patch) | |
tree | 0b3a28070cabb5735c47b7656b748bfda6dc5ca1 /crawl-ref/source | |
parent | 289e5541661b8bc7a6fa955356357655b7e5146a (diff) | |
download | crawl-ref-b12dd9a0fe5c15ff1f655252ef07e03fdf0d4943.tar.gz crawl-ref-b12dd9a0fe5c15ff1f655252ef07e03fdf0d4943.zip |
Add two more uniques: Nessos and the Lernaean hydra, also implemented by
castamir.
Nessos still needs to be buffed (he's a normal centaur with fixed
equipment) and is also in need of speech.
The Lernaean hydra shouldn't be generated randomly but instead be placed
via vaults (which will favour spoiled players, but you can't have
everything).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8307 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r-- | crawl-ref/source/dat/database/monspeak.txt | 5 | ||||
-rw-r--r-- | crawl-ref/source/dat/descript/monsters.txt | 11 | ||||
-rw-r--r-- | crawl-ref/source/dungeon.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 4 | ||||
-rw-r--r-- | crawl-ref/source/fight.cc | 6 | ||||
-rw-r--r-- | crawl-ref/source/makeitem.cc | 19 | ||||
-rw-r--r-- | crawl-ref/source/mon-data.h | 35 | ||||
-rw-r--r-- | crawl-ref/source/mon-util.cc | 26 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 6 | ||||
-rw-r--r-- | crawl-ref/source/rltiles/UNUSED/other/txt1.png | bin | 364 -> 0 bytes | |||
-rw-r--r-- | crawl-ref/source/rltiles/UNUSED/other/txt2.png | bin | 352 -> 0 bytes | |||
-rw-r--r-- | crawl-ref/source/rltiles/UNUSED/other/txt3.png | bin | 225 -> 0 bytes | |||
-rw-r--r-- | crawl-ref/source/rltiles/UNUSED/other/txt4.png | bin | 211 -> 0 bytes | |||
-rw-r--r-- | crawl-ref/source/rltiles/dc-mon.txt | 4 | ||||
-rw-r--r-- | crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.png | bin | 0 -> 929 bytes | |||
-rw-r--r-- | crawl-ref/source/rltiles/dc-mon/unique/nessos.png (renamed from crawl-ref/source/rltiles/UNUSED/other/centaur_warrior.png) | bin | 1283 -> 1283 bytes | |||
-rw-r--r-- | crawl-ref/source/tilepick.cc | 4 |
17 files changed, 108 insertions, 15 deletions
diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt index c50ebf6742..ae80083a7a 100644 --- a/crawl-ref/source/dat/database/monspeak.txt +++ b/crawl-ref/source/dat/database/monspeak.txt @@ -1982,6 +1982,11 @@ _Nergalle_rare_ @The_monster@ blows @possessive@ nose. ## END Nergalle ## %%%% +# evil centaur, needs speech! +Nessos + +__NONE +%%%% # A skilled warrior looking for some fame. More kills = more fame. Norbert diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt index 53c49d68f4..94810628c7 100644 --- a/crawl-ref/source/dat/descript/monsters.txt +++ b/crawl-ref/source/dat/descript/monsters.txt @@ -185,6 +185,13 @@ Louise An unusually heavily armoured spellcaster. %%%% +Lernaean hydra + +An ancient nameless serpent-like water beast that possesses numerous heads. +The poets mention more heads than vase-painters can paint, poisonous venom +coming out of its eyes, and that this hydra is a guardian of an entrance to +the Underworld. What of this is true, you do not know. +%%%% Margery A lithe spellcaster. @@ -209,6 +216,10 @@ Nergalle A withered sorceress, exceptionally ugly even by orc standards. %%%% +Nessos + +A Black Centaur with a malicious look in the eyes. +%%%% Norbert A skilled warrior. diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc index 622fddf085..5a587c2a45 100644 --- a/crawl-ref/source/dungeon.cc +++ b/crawl-ref/source/dungeon.cc @@ -3226,6 +3226,7 @@ static bool _make_room(int sx,int sy,int ex,int ey,int max_doors, int doorlevel) // Doesn't include Polyphemus or Ilsuiw (only appear in the Shoals), // Murray (Hell), or Tiamat (Zot). +// NOTE: The Lernaean hydra should *never* be randomly generated. static monster_type _choose_unique_by_depth(int step) { int ret; @@ -3241,7 +3242,7 @@ static monster_type _choose_unique_by_depth(int step) break; case 2: // depth <= 9 ret = random_choose(MONS_BLORK_THE_ORC, MONS_EDMUND, MONS_PSYCHE, - MONS_EROLCHA, MONS_PRINCE_RIBBIT, -1); + MONS_EROLCHA, MONS_PRINCE_RIBBIT, MONS_NESSOS, -1); break; case 3: // depth <= 13 ret = random_choose(MONS_PSYCHE, MONS_EROLCHA, MONS_DONALD, MONS_URUG, diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index 478ee41c13..b8ae8f80f4 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -2001,9 +2001,11 @@ enum monster_type // (int) menv[].type MONS_PRINCE_RIBBIT, // 455 MONS_NERGALLE, MONS_SAINT_ROKA, + MONS_NESSOS, + MONS_LERNAEAN_HYDRA, // Testing monsters - MONS_TEST_SPAWNER, + MONS_TEST_SPAWNER, // 460 NUM_MONSTERS, // used for polymorph RANDOM_MONSTER = 1000, // used to distinguish between a random monster and using program bugs for error trapping {dlb} diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index 583e73d2d2..04e985a1b1 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -3076,12 +3076,16 @@ bool melee_attack::chop_hydra_head( int dam, // Only living hydras get to regenerate heads. if (defender->holiness() == MH_NATURAL) { + unsigned int limit = 20; + if (def->type == MONS_LERNAEAN_HYDRA) + limit = 27; + if (wpn_brand == SPWPN_FLAMING) { if (defender_visible) mpr( "The flame cauterises the wound!" ); } - else if (def->number < 19) + else if (def->number < limit - 1) { simple_monster_message( def, " grows two more!" ); def->number += 2; diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc index 8653d13870..1eb28357fd 100644 --- a/crawl-ref/source/makeitem.cc +++ b/crawl-ref/source/makeitem.cc @@ -3427,6 +3427,16 @@ static item_make_species_type _give_weapon(monsters *mon, int level, item.sub_type = WPN_LONGBOW; break; + case MONS_NESSOS: + item_race = MAKE_ITEM_NO_RACE; + item.base_type = OBJ_WEAPONS; + item.sub_type = WPN_LONGBOW; + item.colour = DARKGREY; + force_item = true; + item.plus += 1 + random2(3); + item.plus2 += 1 + random2(3); + break; + case MONS_YAKTAUR: case MONS_YAKTAUR_CAPTAIN: item_race = MAKE_ITEM_NO_RACE; @@ -3752,6 +3762,8 @@ static void _give_ammo(monsters *mon, int level, // Master archers get double ammo - archery is their only attack. if (mon->type == MONS_DEEP_ELF_MASTER_ARCHER) mitm[thing_created].quantity *= 2; + else if (mon->type == MONS_NESSOS) + mitm[thing_created].special = SPMSL_POISONED; _give_monster_item(mon, thing_created); } @@ -4187,6 +4199,13 @@ void give_armour(monsters *mon, int level) item.sub_type = ARM_LEATHER_ARMOUR; break; + case MONS_NESSOS: + item_race = MAKE_ITEM_NO_RACE; + mitm[bp].base_type = OBJ_ARMOUR; + mitm[bp].sub_type = ARM_CENTAUR_BARDING; + force_colour = DARKGRAY; + break; + default: return; } diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h index c56e60d103..b283fb25e1 100644 --- a/crawl-ref/source/mon-data.h +++ b/crawl-ref/source/mon-data.h @@ -3878,14 +3878,14 @@ static monsterentry mondata[] = { // non-human uniques { - MONS_IJYB, 'g', BLUE, "Ijyb", - M_UNIQUE | M_WARM_BLOOD | M_SPEAKS, + MONS_NESSOS, 'c', DARKGREY, "Nessos", + M_UNIQUE | M_WARM_BLOOD | M_EVIL | M_SPEAKS, MR_NO_FLAGS, - 400, 5, MONS_GOBLIN, MONS_GOBLIN, MH_NATURAL, -3, - { {AT_HIT, AF_PLAIN, 4}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 3, 0, 0, 28 }, - 2, 12, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL, - HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_SMALL + 1500, 10, MONS_CENTAUR, MONS_CENTAUR, MH_NATURAL, -3, + { {AT_HIT, AF_PLAIN, 10}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, + { 4, 3, 5, 0 }, + 3, 7, MST_NO_SPELLS, CE_CLEAN, Z_BIG, S_SHOUT, I_NORMAL, + HT_LAND, 15, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_BIG }, { @@ -3936,6 +3936,16 @@ static monsterentry mondata[] = { HT_LAND, 10, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_HUGE }, +{ + MONS_LERNAEAN_HYDRA, 'D', YELLOW, "the Lernaean hydra", + M_UNIQUE | M_COLD_BLOOD, + MR_RES_POISON, + 1800, 11, MONS_HYDRA, MONS_HYDRA, MH_NATURAL, -3, + { {AT_BITE, AF_PLAIN, 18}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, + { 30, 3, 2, 0 }, + 0, 5, MST_NO_SPELLS, CE_POISONOUS, Z_NOZOMBIE, S_ROAR, I_INSECT, + HT_AMPHIBIOUS_LAND, 10, DEFAULT_ENERGY, MONUSE_NOTHING, SIZE_BIG +}, { MONS_AZRAEL, 'E', LIGHTRED, "Azrael", @@ -3960,6 +3970,17 @@ static monsterentry mondata[] = { }, { + MONS_IJYB, 'g', BLUE, "Ijyb", + M_UNIQUE | M_WARM_BLOOD | M_SPEAKS, + MR_NO_FLAGS, + 400, 5, MONS_GOBLIN, MONS_GOBLIN, MH_NATURAL, -3, + { {AT_HIT, AF_PLAIN, 4}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, + { 3, 0, 0, 28 }, + 2, 12, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_SMALL +}, + +{ MONS_SONJA, 'K', RED, "Sonja", M_UNIQUE | M_WARM_BLOOD | M_SPEAKS | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS, diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc index 943257f676..c7c01fa6ad 100644 --- a/crawl-ref/source/mon-util.cc +++ b/crawl-ref/source/mon-util.cc @@ -1763,6 +1763,10 @@ void define_monster(monsters &mons) monnumber = random_range(4, 8); break; + case MONS_LERNAEAN_HYDRA: + monnumber = 27; + break; + case MONS_DEEP_ELF_FIGHTER: case MONS_DEEP_ELF_KNIGHT: case MONS_DEEP_ELF_SOLDIER: @@ -2058,9 +2062,12 @@ static std::string _str_monam(const monsters& mon, description_level_type desc, } // Done here to cover cases of undead versions of hydras. - if (nametype == MONS_HYDRA + if (mons_species(nametype) == MONS_HYDRA && mon.number > 0 && desc != DESC_DBNAME) { + if (nametype == MONS_LERNAEAN_HYDRA) + result += "the "; + if (mon.number < 11) { result += (mon.number == 1) ? "one" : @@ -2083,8 +2090,13 @@ static std::string _str_monam(const monsters& mon, description_level_type desc, result += "-headed "; } - // Add the base name. - result += get_monster_data(nametype)->name; + if (nametype == MONS_LERNAEAN_HYDRA) + result += "Lernaean hydra"; + else + { + // Add the base name. + result += get_monster_data(nametype)->name; + } // Add suffixes. switch (mon.type) @@ -3144,8 +3156,11 @@ const char *mons_pronoun(monster_type mon_type, pronoun_type variant, { gender_type gender = GENDER_NEUTER; - if (mons_genus(mon_type) == MONS_MERMAID || mon_type == MONS_HARPY) + if (mons_genus(mon_type) == MONS_MERMAID || mon_type == MONS_HARPY + || mon_type == MONS_SPHINX) + { gender = GENDER_FEMALE; + } else if (mons_is_unique(mon_type) && mon_type != MONS_PLAYER_GHOST) { switch (mon_type) @@ -3169,6 +3184,7 @@ const char *mons_pronoun(monster_type mon_type, pronoun_type variant, gender = GENDER_FEMALE; break; case MONS_ROYAL_JELLY: + case MONS_LERNAEAN_HYDRA: gender = GENDER_NEUTER; break; default: @@ -6025,7 +6041,7 @@ void monsters::load_spells(mon_spellbook_type book) bool monsters::has_hydra_multi_attack() const { - return (type == MONS_HYDRA + return (mons_species() == MONS_HYDRA || mons_is_zombified(this) && base_monster == MONS_HYDRA); } diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 633e517986..8355f48cab 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -1948,6 +1948,11 @@ bool monster_polymorph(monsters *monster, monster_type targetc, name = "shaped Royal Jelly"; flags |= MF_NAME_SUFFIX; } + else if (monster->type == MONS_LERNAEAN_HYDRA) + { + name = "shaped Lernaean hydra"; + flags |= MF_NAME_SUFFIX; + } // "Blork the orc" and similar. const size_t the_pos = name.find(" the "); @@ -8464,6 +8469,7 @@ bool monster_descriptor(int which_class, unsigned char which_descriptor) case MONS_TROLL: case MONS_HYDRA: case MONS_KILLER_KLOWN: + case MONS_LERNAEAN_HYDRA: return (true); default: return (false); diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt1.png b/crawl-ref/source/rltiles/UNUSED/other/txt1.png Binary files differdeleted file mode 100644 index 15d5df0ace..0000000000 --- a/crawl-ref/source/rltiles/UNUSED/other/txt1.png +++ /dev/null diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt2.png b/crawl-ref/source/rltiles/UNUSED/other/txt2.png Binary files differdeleted file mode 100644 index 98c21cea6f..0000000000 --- a/crawl-ref/source/rltiles/UNUSED/other/txt2.png +++ /dev/null diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt3.png b/crawl-ref/source/rltiles/UNUSED/other/txt3.png Binary files differdeleted file mode 100644 index a1adf3cc36..0000000000 --- a/crawl-ref/source/rltiles/UNUSED/other/txt3.png +++ /dev/null diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt4.png b/crawl-ref/source/rltiles/UNUSED/other/txt4.png Binary files differdeleted file mode 100644 index fa9800869a..0000000000 --- a/crawl-ref/source/rltiles/UNUSED/other/txt4.png +++ /dev/null diff --git a/crawl-ref/source/rltiles/dc-mon.txt b/crawl-ref/source/rltiles/dc-mon.txt index 488fc8728b..87b74c43ba 100644 --- a/crawl-ref/source/rltiles/dc-mon.txt +++ b/crawl-ref/source/rltiles/dc-mon.txt @@ -321,6 +321,7 @@ death_drake MONS_DEATH_DRAKE ## Dragons ('D')
%sdir dc-mon/unique
xtahua MONS_XTAHUA
+lernaean_hydra MONS_LERNAEAN_HYDRA
%sdir dc-mon
wyvern MONS_WYVERN
dragon MONS_DRAGON
@@ -443,6 +444,9 @@ skeleton_large MONS_SKELETON_LARGE simulacrum_large MONS_SIMULACRUM_LARGE
## Centaurs ('c')
+%sdir dc-mon/unique
+nessos MONS_NESSOS
+%sdir dc-mon
centaur MONS_CENTAUR
centaur-melee MONS_CENTAUR_MELEE
centaur_warrior MONS_CENTAUR_WARRIOR
diff --git a/crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.png b/crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.png Binary files differnew file mode 100644 index 0000000000..3d3421bbc6 --- /dev/null +++ b/crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.png diff --git a/crawl-ref/source/rltiles/UNUSED/other/centaur_warrior.png b/crawl-ref/source/rltiles/dc-mon/unique/nessos.png Binary files differindex 0c40b60623..0c40b60623 100644 --- a/crawl-ref/source/rltiles/UNUSED/other/centaur_warrior.png +++ b/crawl-ref/source/rltiles/dc-mon/unique/nessos.png diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc index b46e34f225..cb18fe701d 100644 --- a/crawl-ref/source/tilepick.cc +++ b/crawl-ref/source/tilepick.cc @@ -932,6 +932,10 @@ static int _tileidx_monster_base(const monsters *mon, bool detected) return TILEP_MONS_ORC_SORCERER; // TODO enne case MONS_SAINT_ROKA: return TILEP_MONS_ORC_WARLORD; // TODO enne + case MONS_NESSOS: + return TILEP_MONS_NESSOS; + case MONS_LERNAEAN_HYDRA: + return TILEP_MONS_LERNAEAN_HYDRA; // human uniques ('@') case MONS_TERENCE: |