summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source')
-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,