summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2009-10-04 22:27:27 +0200
committerAdam Borowski <kilobyte@angband.pl>2009-10-06 15:04:22 +0200
commitc591003b88f95795178a2de89ec9cb0845f84a0a (patch)
tree774dcbd98e25fe353aa17692aac08a18ffbcd2c4 /crawl-ref
parent9970d458692f69d2eff5b8b4dd2550923a436e4f (diff)
downloadcrawl-ref-c591003b88f95795178a2de89ec9cb0845f84a0a.tar.gz
crawl-ref-c591003b88f95795178a2de89ec9cb0845f84a0a.zip
Khufu, the mummy emperor. Uses Tomb of Doroklohe as an escape spell.
He will blink and teleport away any allies, and resort to blinking himself only if there's something else blocking the tomb. The tomb is dropped when he emerges from it, as teleporting out could leave the player stranded and having unlimited means of digging shouldn't be mandatory.
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/acr.cc2
-rw-r--r--crawl-ref/source/dat/database/monspeak.txt24
-rw-r--r--crawl-ref/source/dat/descript/monsters.txt4
-rw-r--r--crawl-ref/source/enum.h7
-rw-r--r--crawl-ref/source/mon-data.h11
-rw-r--r--crawl-ref/source/mon-spll.h11
-rw-r--r--crawl-ref/source/mon-util.cc5
-rw-r--r--crawl-ref/source/monstuff.cc28
-rw-r--r--crawl-ref/source/mstuff2.cc48
-rw-r--r--crawl-ref/source/spl-data.h13
10 files changed, 150 insertions, 3 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 5655ee09b6..34923a7184 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -4273,7 +4273,7 @@ static void _compile_time_asserts()
COMPILE_CHECK(SP_VAMPIRE == 31 , c3);
COMPILE_CHECK(SPELL_DEBUGGING_RAY == 103 , c4);
COMPILE_CHECK(SPELL_PETRIFY == 156 , c5);
- COMPILE_CHECK(NUM_SPELLS == 200 , c6);
+ COMPILE_CHECK(NUM_SPELLS == 201 , c6);
//jmf: NEW ASSERTS: we ought to do a *lot* of these
COMPILE_CHECK(NUM_JOBS < JOB_UNKNOWN , c7);
diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt
index 9056c2d759..8611f974b0 100644
--- a/crawl-ref/source/dat/database/monspeak.txt
+++ b/crawl-ref/source/dat/database/monspeak.txt
@@ -1986,6 +1986,30 @@ _Jozef_rare_
@The_monster@ screams @at_foe@, "Die! I've got more contracts today."
## END Jozef ##
%%%%
+############ KHUFU ### mummy emperor with delusions of godhood
+Khufu
+
+@The_monster@ booms, "Everyone will worship Khufu but you!"
+
+SPELL:@The_monster@ smites.
+
+@The_monster@ declares, "When I'm finished with you, I will take on the gods!"
+
+@The_monster@ queries, "My people built me a pyramid -- what did your people build for you?"
+
+@The_monster@ says, "This hit and run is way beneath me."
+
+@The_monster@ says, "I am transcendence, you are transpiration."
+
+@The_monster@ says @to_foe@, "Your corpse would blemish any mausoleum."
+
+@The_monster@ says @to_foe@, "You'll be the most ugly mummy ever seen."
+
+@The_monster@ says, "I follow the Polar star."
+
+@The_monster@ yells @to_foe@, "Into the Nile with you!"
+## END Khufu ##
+%%%%
############ KIRKE ### an enchantress, lover of Odysseus
Kirke
diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt
index 8407bdc585..0908bacdc5 100644
--- a/crawl-ref/source/dat/descript/monsters.txt
+++ b/crawl-ref/source/dat/descript/monsters.txt
@@ -188,6 +188,10 @@ Killer Klown
A comical figure full of life and laughter. It looks very happy to see you... but is there a slightly malicious cast to its features? Is that red face paint or something altogether less pleasant?
%%%%
+Khufu
+
+An incredibly powerful emperor on the way to godhood.
+%%%%
Kirke
A beautiful enchantress.
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index c90063eb76..a586496844 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -2082,6 +2082,7 @@ enum monster_type // (int) menv[].type
MONS_DOWAN,
MONS_GASTRONOK,
MONS_MAURICE,
+ MONS_KHUFU,
// Testing monsters
MONS_TEST_SPAWNER,
@@ -2292,7 +2293,7 @@ enum mon_spellbook_type
MST_KIRKE,
MST_MENKAURE,
MST_DOWAN,
- MST_GERYON = 150,
+ MST_GERYON,
MST_DISPATER,
MST_ASMODEUS,
MST_ERESHKIGAL,
@@ -2305,6 +2306,7 @@ enum mon_spellbook_type
MST_BERSERK_ESCAPE, // 165
MST_GASTRONOK,
MST_MAURICE,
+ MST_KHUFU,
MST_TEST_SPAWNER = 170,
NUM_MSTYPES,
@@ -2885,8 +2887,9 @@ enum spell_type
SPELL_WATER_ELEMENTALS,
SPELL_PORKALATOR, // 198
SPELL_KRAKEN_TENTACLES,
+ SPELL_TOMB_OF_DOROKLOHE,
- NUM_SPELLS // 200
+ NUM_SPELLS // 201
};
enum slot_select_mode
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index f209135099..d5f4fb026e 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -4246,6 +4246,17 @@ static monsterentry mondata[] = {
HT_AMPHIBIOUS_LAND, 5, DEFAULT_ENERGY, MONUSE_STARTING_EQUIPMENT, MONEAT_FOOD, SIZE_LARGE
},
+{
+ MONS_KHUFU, 'M', LIGHTRED, "Khufu",
+ M_SPELLCASTER | M_ACTUAL_SPELLS | M_SEE_INVIS | M_EVIL | M_SPEAKS
+ | M_UNIQUE,
+ MR_RES_POISON | MR_RES_COLD | MR_RES_ELEC,
+ 0, 20, MONS_MUMMY, MONS_MUMMY, MH_UNDEAD, MAG_IMMUNE,
+ { {AT_HIT, AF_PLAIN, 35}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 18, 5, 3, 100 },
+ 10, 6, MST_KHUFU, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT, I_HIGH,
+ HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
+},
// human uniques ('@')
{
diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h
index 66f3814597..0d4cb0a883 100644
--- a/crawl-ref/source/mon-spll.h
+++ b/crawl-ref/source/mon-spll.h
@@ -1232,6 +1232,17 @@
}
},
+ { MST_KHUFU,
+ {
+ SPELL_SUMMON_DEMON,
+ SPELL_SMITING,
+ SPELL_SMITING,
+ SPELL_SYMBOL_OF_TORMENT,
+ SPELL_SUMMON_UNDEAD,
+ SPELL_TOMB_OF_DOROKLOHE
+ }
+ },
+
{ MST_TEST_SPAWNER,
{
SPELL_SHADOW_CREATURES,
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 163d61c77c..65c840a0b1 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -1712,6 +1712,7 @@ int exper_value(const monsters *monster)
case SPELL_BOLT_OF_IRON:
case SPELL_TELEPORT_SELF:
case SPELL_TELEPORT_OTHER:
+ case SPELL_PORKALATOR:
diff += 10;
break;
@@ -2976,6 +2977,10 @@ bool ms_low_hitpoint_cast( const monsters *mon, spell_type monspell )
ret = true;
break;
+ case SPELL_TOMB_OF_DOROKLOHE:
+ ret = true;
+ break;
+
case SPELL_NO_SPELL:
ret = false;
break;
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 34cab9f2fd..a33935676a 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -965,6 +965,7 @@ static void _mummy_curse(monsters* monster, killer_type killer, int index)
case MONS_GUARDIAN_MUMMY: pow = 3; break;
case MONS_MUMMY_PRIEST: pow = 8; break;
case MONS_GREATER_MUMMY: pow = 11; break;
+ case MONS_KHUFU: pow = 15; break;
default:
mpr("Unknown mummy type.", MSGCH_DIAGNOSTICS);
@@ -6794,6 +6795,7 @@ static bool _handle_spell(monsters *monster, bolt &beem)
spell_type spell_cast = SPELL_NO_SPELL;
monster_spells hspell_pass(monster->spells);
+ // 1KB: the following code is never used for unfriendlies!
if (!mon_enemies_around(monster))
{
// Force the casting of dig when the player is not visible -
@@ -7406,6 +7408,28 @@ static void _swim_or_move_energy(monsters *mon)
: EUT_MOVE );
}
+static void _khufu_drop_tomb(monsters *monster)
+{
+ int count = 0;
+
+ monster->behaviour = BEH_SEEK; // don't wander on duty!
+ for(adjacent_iterator ai(monster->pos()); ai; ++ai)
+ {
+ if (grd(*ai) == DNGN_ROCK_WALL)
+ {
+ grd(*ai) = DNGN_FLOOR;
+ count++;
+ }
+ }
+ if (count)
+ if (mons_near(monster))
+ mpr("The walls disappear!");
+ else
+ mpr("You hear a deep rumble.");
+ monster->number = 0;
+ monster->lose_energy(EUT_SPELL);
+}
+
#if DEBUG
# define DEBUG_ENERGY_USE(problem) \
if (monster->speed_increment == old_energy && monster->alive()) \
@@ -7725,6 +7749,10 @@ static void _handle_monster_move(monsters *monster)
}
_handle_nearby_ability(monster);
+ if (monster->type == MONS_KHUFU && monster->number
+ && monster->hit_points==monster->max_hit_points)
+ _khufu_drop_tomb(monster);
+
if (!mons_is_sleeping(monster) && !mons_is_wandering(monster)
// Berserking monsters are limited to running up and
// hitting their foes.
diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc
index 1785f05a11..4ab60f55ee 100644
--- a/crawl-ref/source/mstuff2.cc
+++ b/crawl-ref/source/mstuff2.cc
@@ -621,6 +621,53 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
mons_speaks_msg(monster, msg, MSGCH_TALK,
silenced(you.pos()) || silenced(monster->pos()));
}
+ break;
+ }
+ case SPELL_TOMB_OF_DOROKLOHE:
+ {
+ sumcount = 0;
+ for(adjacent_iterator ai(monster->pos()); ai; ++ai)
+ {
+ // we can blink away the crowd, but only our allies
+ if (mgrd(*ai) != NON_MONSTER
+ && monster_at(*ai)->attitude != monster->attitude)
+ sumcount++;
+ if (grd(*ai) != DNGN_FLOOR && grd(*ai) > DNGN_MAX_NONREACH
+ && !grid_is_trap(grd(*ai)))
+ sumcount++;
+ }
+ if (abs(you.pos().x-monster->pos().x)<=1 &&
+ abs(you.pos().y-monster->pos().y)<=1)
+ sumcount++;
+ if (sumcount)
+ {
+ monster->blink();
+ return;
+ }
+
+ sumcount = 0;
+ for(adjacent_iterator ai(monster->pos()); ai; ++ai)
+ {
+ if (mgrd(*ai) != NON_MONSTER && monster_at(*ai) != monster)
+ {
+ monster_at(*ai)->blink();
+ if (mgrd(*ai) != NON_MONSTER)
+ {
+ monster_at(*ai)->teleport(true);
+ if (mgrd(*ai) != NON_MONSTER)
+ continue;
+ }
+ }
+ if (grd(*ai) == DNGN_FLOOR || grid_is_trap(grd(*ai)))
+ {
+ grd(*ai) = DNGN_ROCK_WALL;
+ sumcount++;
+ }
+ }
+ if (sumcount)
+ mpr("Walls emerge from the floor!");
+ monster->number = 1; // mark Khufu as entombed
+ return;
}
}
@@ -1100,6 +1147,7 @@ void setup_mons_cast(monsters *monster, bolt &pbolt,
case SPELL_KRAKEN_TENTACLES:
case SPELL_BLINK:
case SPELL_CONTROLLED_BLINK:
+ case SPELL_TOMB_OF_DOROKLOHE:
return;
default:
break;
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index e2602af78d..cdfc92696b 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -2484,6 +2484,19 @@
},
{
+ SPELL_TOMB_OF_DOROKLOHE, "Tomb of Doroklohe",
+ SPTYP_EARTH,
+ SPFLAG_MONSTER,
+ 5,
+ 0,
+ -1, -1,
+ 0,
+ NULL,
+ false,
+ false
+},
+
+{
SPELL_NO_SPELL, "nonexistent spell",
0,
SPFLAG_TESTING,