summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-01-07 15:47:02 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-01-07 15:47:02 +0000
commitb12dd9a0fe5c15ff1f655252ef07e03fdf0d4943 (patch)
tree0b3a28070cabb5735c47b7656b748bfda6dc5ca1 /crawl-ref
parent289e5541661b8bc7a6fa955356357655b7e5146a (diff)
downloadcrawl-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')
-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: