diff options
-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: |