summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/dat/database/monspeak.txt5
-rw-r--r--crawl-ref/source/dat/descript/monsters.txt11
-rw-r--r--crawl-ref/source/dungeon.cc3
-rw-r--r--crawl-ref/source/enum.h4
-rw-r--r--crawl-ref/source/fight.cc6
-rw-r--r--crawl-ref/source/makeitem.cc19
-rw-r--r--crawl-ref/source/mon-data.h35
-rw-r--r--crawl-ref/source/mon-util.cc26
-rw-r--r--crawl-ref/source/monstuff.cc6
-rw-r--r--crawl-ref/source/rltiles/UNUSED/other/txt1.pngbin364 -> 0 bytes
-rw-r--r--crawl-ref/source/rltiles/UNUSED/other/txt2.pngbin352 -> 0 bytes
-rw-r--r--crawl-ref/source/rltiles/UNUSED/other/txt3.pngbin225 -> 0 bytes
-rw-r--r--crawl-ref/source/rltiles/UNUSED/other/txt4.pngbin211 -> 0 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-mon.txt4
-rw-r--r--crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.pngbin0 -> 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)bin1283 -> 1283 bytes
-rw-r--r--crawl-ref/source/tilepick.cc4
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
deleted file mode 100644
index 15d5df0ace..0000000000
--- a/crawl-ref/source/rltiles/UNUSED/other/txt1.png
+++ /dev/null
Binary files differ
diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt2.png b/crawl-ref/source/rltiles/UNUSED/other/txt2.png
deleted file mode 100644
index 98c21cea6f..0000000000
--- a/crawl-ref/source/rltiles/UNUSED/other/txt2.png
+++ /dev/null
Binary files differ
diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt3.png b/crawl-ref/source/rltiles/UNUSED/other/txt3.png
deleted file mode 100644
index a1adf3cc36..0000000000
--- a/crawl-ref/source/rltiles/UNUSED/other/txt3.png
+++ /dev/null
Binary files differ
diff --git a/crawl-ref/source/rltiles/UNUSED/other/txt4.png b/crawl-ref/source/rltiles/UNUSED/other/txt4.png
deleted file mode 100644
index fa9800869a..0000000000
--- a/crawl-ref/source/rltiles/UNUSED/other/txt4.png
+++ /dev/null
Binary files differ
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
new file mode 100644
index 0000000000..3d3421bbc6
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-mon/unique/lernaean_hydra.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/UNUSED/other/centaur_warrior.png b/crawl-ref/source/rltiles/dc-mon/unique/nessos.png
index 0c40b60623..0c40b60623 100644
--- a/crawl-ref/source/rltiles/UNUSED/other/centaur_warrior.png
+++ b/crawl-ref/source/rltiles/dc-mon/unique/nessos.png
Binary files differ
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: