summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-09-22 10:42:23 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2009-09-22 10:42:23 +0000
commit0650cb7c5d9f3538143bfdd1c4a75c27dc86e17c (patch)
tree0e570e3927d0f4a9a6c015dba864da902aaecd2c
parent040d4ec8b58e1e9f725d57fdffb5af422177c0c5 (diff)
downloadcrawl-ref-0650cb7c5d9f3538143bfdd1c4a75c27dc86e17c.tar.gz
crawl-ref-0650cb7c5d9f3538143bfdd1c4a75c27dc86e17c.zip
Add new unique Gastronok (slug wizard), via a patch by bookofjude and some
tweaks to make his speech and casting work correctly. Turns up around the same time as Erolcha and Grum. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10774 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/source/dat/database/monspeak.txt91
-rw-r--r--crawl-ref/source/dat/database/monspell.txt18
-rw-r--r--crawl-ref/source/dat/database/quotes.txt13
-rw-r--r--crawl-ref/source/dat/descript/monsters.txt6
-rw-r--r--crawl-ref/source/dungeon.cc9
-rw-r--r--crawl-ref/source/effects.cc21
-rw-r--r--crawl-ref/source/enum.h2
-rw-r--r--crawl-ref/source/makeitem.cc9
-rw-r--r--crawl-ref/source/mon-data.h35
-rw-r--r--crawl-ref/source/mon-spll.h13
-rw-r--r--crawl-ref/source/mon-util.cc18
-rw-r--r--crawl-ref/source/mstuff2.cc102
-rw-r--r--crawl-ref/source/rltiles/dc-mon.txt5
-rw-r--r--crawl-ref/source/rltiles/dc-mon/unique/gastronok.pngbin0 -> 1055 bytes
-rw-r--r--crawl-ref/source/tilepick.cc2
15 files changed, 302 insertions, 42 deletions
diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt
index c7c96a6b86..d6285ef88c 100644
--- a/crawl-ref/source/dat/database/monspeak.txt
+++ b/crawl-ref/source/dat/database/monspeak.txt
@@ -1596,6 +1596,97 @@ w:1
VISUAL:@The_monster@ polishes @possessive@ monocle.
%%%%
+############ Gastronok ### A rather hungry wizard-slug
+# Cantrip messages:
+gastronok_self_buff
+
+@_gastronok_self_buff_@
+%%%%
+gastronok_other_buff
+
+@_gastronok_other_buff_@
+%%%%
+gastronok_debuff
+
+@_gastronok_debuff_@
+%%%%
+_gastronok_self_buff_
+
+@The_monster@ bubbles merrily.
+
+@The_monster@ glows a brilliant shade of cerise.
+
+@The_monster@ wobbles crazily.
+
+@The_monster@'s eyestalks stretch out, then return to normal size.
+%%%%
+# When targeting other monsters.
+_gastronok_other_buff_
+
+@The_monster@ wobbles.
+
+@The_monster@ slows momentarily.
+
+@The_monster@ makes a slurping sound, then looks surprised.
+%%%%
+# Slugform affecting the player.
+_gastronok_debuff_
+
+w:20
+You feel sluggish.
+
+You feel an sudden, passing aversion to salt.
+
+Your skin takes on a slight green cast.
+
+# Doesn't work for Naga and transformed Merfolk.
+# There's a hack in mstuff2.cc to prevent it from being used in those cases.
+Your legs wobble like jelly.
+
+w:5
+You feel a sudden urge to swivel your nonexistent eyestalks around.
+%%%%
+# And finally, his speech.
+Gastronok
+
+@_Gastronok_common_@
+
+w:4
+@_Gastronok_rare_@
+%%%%
+_Gastronok_common_
+
+VISUAL:@The_monster@ sloshes about.
+
+@The_monster@ gurgles, "I'll eat you, I will!"
+
+@The_monster@ gurgles, "A snack! A snack!"
+
+@The_monster@ gurgles.
+
+@The_monster@ makes a strange noise.
+
+%%%%
+_Gastronok_rare_
+
+VISUAL:@The_monster@'s mouth opens, radula flailing wildly.
+
+VISUAL:@The_monster@ is buffeted by a sudden breeze.
+
+VISUAL:@The_monster@'s eyestalks wobble, almost dislodging @possessive@ wizard hat.
+
+@The_monster@ gurgles, "You're how I like my food. Fast!"
+
+@The_monster@ gurgles, "Slow down, so I can eat you."
+
+@The_monster@ gurgles, "Are you a wizard? Wizards taste nice..."
+
+@The_monster@ gurgles, "Huuuuuuuuuuungry!"
+
+@The_monster@ gurgles, "It's true, you are what you eat."
+
+@The_monster@ gurgles, "I bet you'll be tasty."
+%%%%
############ GRUM ### A war dog-breeding gnoll
Grum
diff --git a/crawl-ref/source/dat/database/monspell.txt b/crawl-ref/source/dat/database/monspell.txt
index 75b9bc8934..7da3ef67d5 100644
--- a/crawl-ref/source/dat/database/monspell.txt
+++ b/crawl-ref/source/dat/database/monspell.txt
@@ -222,6 +222,14 @@ unseen priest cast
You hear some strange, mumbled prayers to @God@.
%%%%
+gastronok cast targeted
+
+@The_monster@ looks at @target@ while chanting.
+
+@The_monster@ looks at @target@ and mumbles some strange words.
+
+@The_monster@ casts a spell at @target@.
+%%%%
wizard cast targeted
@The_monster@ gestures at @target@ while chanting.
@@ -230,6 +238,16 @@ wizard cast targeted
@The_monster@ casts a spell at @target@.
%%%%
+gastronok cast
+
+@The_monster@'s eyestalks quiver as @pronoun@ mumbles some strange words.
+
+@The_monster@ chants a spell, wobbling all the while.
+
+@The_monster@ mumbles some strange words.
+
+@The_monster@ casts a spell.
+%%%%
wizard cast
@The_monster@ gestures wildly while chanting.
diff --git a/crawl-ref/source/dat/database/quotes.txt b/crawl-ref/source/dat/database/quotes.txt
index f81db51f0f..c99dd35037 100644
--- a/crawl-ref/source/dat/database/quotes.txt
+++ b/crawl-ref/source/dat/database/quotes.txt
@@ -375,7 +375,6 @@ __cap-T_suffix
A laidly Trold has dragged it there."
-George Borrow, _Lavengro_
%%%%
-%%%%
Antaeus
"That country was then ruled by Antaeus, son of Poseidon, who used to
@@ -405,7 +404,7 @@ Dispater
%%%%
Dowan
-"Skill and grace, the twin brother and sister,
+"Skill and grace, the twin brother and sister,
are dancing playfully on your finger tips."
-Rabindranath Tagore, _Chitra, Act I, Scene IV_
%%%%
@@ -612,6 +611,16 @@ giant frog
And tell me I'm your own."
-Ida Emerson and Joseph E. Howard, "Hello My Baby!"
%%%%
+giant snail
+
+"Snail, snail, slug-slow,
+ To me thy four horns show;
+ If thou dost not show me thy four,
+ I will throw thee out of the door,
+ For the crow in the gutter,
+ To eat for bread and butter."
+ -Silesian rhyme, _Notes and Queries, Number 69_, 1851.
+%%%%
gnoll
"Then he descended softly and beckoned to Nuth. But the gnoles had
diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt
index 3fa5e74a12..8e1b566dd0 100644
--- a/crawl-ref/source/dat/descript/monsters.txt
+++ b/crawl-ref/source/dat/descript/monsters.txt
@@ -120,6 +120,10 @@ Frederick
A svelte fighter-mage, wearing a gold-rimmed monocle.
%%%%
+Gastronok
+
+A voracious and surprisingly intelligent slug, devoted to eating everything and everyone he comes across, with a pointed hat perched rakishly atop his head. He acquired the hat the same way he acquired his intelligence and his knowledge of spells: by consuming their former owner, a powerful wizard.
+%%%%
Geryon
A huge, three-headed, winged arch-demon, guardian of the gates of Hell.
@@ -1396,7 +1400,7 @@ A huge animated statue made entirely from toenail clippings. Some people just ha
%%%%
toadstool
-A short-lived species of fungus typically found on or around decaying organic matter.
+A short-lived species of fungus typically found on or around decaying organic matter.
%%%%
tormentor
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index f4f8a147bb..ae86128d50 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -3286,6 +3286,7 @@ static bool _make_room(int sx,int sy,int ex,int ey,int max_doors, int doorlevel)
// Dissolution (Slime), Murray (Hell), or Tiamat (Zot).
// NOTE: The Lernaean hydra should *never* be randomly generated.
// The Royal jelly likewise is only placed via Slime end vault.
+// Dowan is automatically placed together with Duvessa.
static monster_type _choose_unique_by_depth(int step)
{
int ret;
@@ -3303,13 +3304,13 @@ static monster_type _choose_unique_by_depth(int step)
case 2: // depth <= 9
ret = random_choose(MONS_BLORK_THE_ORC, MONS_EDMUND, MONS_PSYCHE,
MONS_EROLCHA, MONS_PRINCE_RIBBIT, MONS_GRUM,
- -1);
+ MONS_GASTRONOK, -1);
break;
case 3: // depth <= 13
ret = random_choose(MONS_PSYCHE, MONS_EROLCHA, MONS_DONALD, MONS_URUG,
- MONS_MICHAEL, MONS_EUSTACHIO, MONS_SONJA,
- MONS_JOSEPH, MONS_ERICA, MONS_JOSEPHINE, MONS_GRUM,
- MONS_HAROLD, MONS_NORBERT, MONS_JOZEF, -1);
+ MONS_MICHAEL, MONS_EUSTACHIO, MONS_SONJA, MONS_GRUM,
+ MONS_JOSEPH, MONS_ERICA, MONS_JOSEPHINE, MONS_JOZEF,
+ MONS_HAROLD, MONS_NORBERT, MONS_GASTRONOK, -1);
break;
case 4: // depth <= 16
ret = random_choose(MONS_URUG, MONS_MICHAEL, MONS_EUSTACHIO, MONS_SONJA,
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index 83a048b643..f8d9ba6a3f 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -764,6 +764,27 @@ void direct_effect(monsters *source, spell_type spell,
damage_taken = 7 + random2avg(11, 2);
break;
+ case SPELL_AIRSTRIKE:
+ if (def)
+ simple_monster_message(def, " is struck by the twisting air!");
+ else
+ mpr("The air twists around and strikes you!");
+
+ pbolt.name = "airstrike";
+ pbolt.flavour = BEAM_MISSILE;
+ pbolt.aux_source = "by the air";
+ damage_taken = 8 + random2(random2(4) + (random2(source->hit_dice*5) / 6)
+ + (random2(source->hit_dice*5) / 7));
+
+ if (defender->flight_mode() != FL_NONE)
+ {
+ damage_taken *= 3;
+ damage_taken /= 2;
+ }
+
+ damage_taken -= defender->armour_class();
+ break;
+
case SPELL_BRAIN_FEED:
if (!def)
{
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index dfb355dc91..a4d91768b2 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -2084,6 +2084,7 @@ enum monster_type // (int) menv[].type
MONS_MENKAURE,
MONS_DUVESSA,
MONS_DOWAN,
+ MONS_GASTRONOK,
// Testing monsters
MONS_TEST_SPAWNER,
@@ -2305,6 +2306,7 @@ enum mon_spellbook_type
MST_GLOORX_VLOQ,
MST_JESSICA,
MST_BERSERK_ESCAPE, // 165
+ MST_GASTRONOK,
MST_TEST_SPAWNER = 170,
NUM_MSTYPES,
diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc
index 491851efd7..047dec0917 100644
--- a/crawl-ref/source/makeitem.cc
+++ b/crawl-ref/source/makeitem.cc
@@ -3106,7 +3106,8 @@ static void _give_scroll(monsters *mon, int level)
static void _give_wand(monsters *mon, int level)
{
- if (mons_is_unique(mon->type) && one_chance_in(5))
+ if (mons_is_unique(mon->type) && mon->type != MONS_GASTRONOK
+ && one_chance_in(5))
{
const int idx = items(0, OBJ_WANDS, OBJ_RANDOM, true, level, 0);
@@ -4322,6 +4323,12 @@ void give_armour(monsters *mon, int level)
return;
break;
+ case MONS_GASTRONOK:
+ item_race = MAKE_ITEM_NO_RACE;
+ item.base_type = OBJ_ARMOUR;
+ item.sub_type = ARM_WIZARD_HAT;
+ break;
+
case MONS_DOWAN:
item_race = MAKE_ITEM_ELVEN;
case MONS_DONALD:
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 16bd3fe492..1bfb0fc92f 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -825,17 +825,6 @@ static monsterentry mondata[] = {
// slugs ('j')
{
- MONS_ELEPHANT_SLUG, 'j', LIGHTGREY, "elephant slug",
- M_NO_SKELETON,
- MR_VUL_POISON,
- 1500, 10, MONS_GIANT_SLUG, MONS_ELEPHANT_SLUG, MH_NATURAL, -3,
- { {AT_BITE, AF_PLAIN, 40}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
- { 20, 5, 3, 0 },
- 2, 1, MST_NO_SPELLS, CE_POISONOUS, Z_BIG, S_SILENT, I_INSECT,
- HT_LAND, 4, DEFAULT_ENERGY, MONUSE_NOTHING, MONEAT_NOTHING, SIZE_BIG
-},
-
-{
MONS_GIANT_SLUG, 'j', GREEN, "giant slug",
M_NO_SKELETON,
MR_NO_FLAGS,
@@ -857,6 +846,17 @@ static monsterentry mondata[] = {
HT_AMPHIBIOUS_LAND, 4, DEFAULT_ENERGY, MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
},
+{
+ MONS_ELEPHANT_SLUG, 'j', LIGHTGREY, "elephant slug",
+ M_NO_SKELETON,
+ MR_VUL_POISON,
+ 1500, 10, MONS_GIANT_SLUG, MONS_ELEPHANT_SLUG, MH_NATURAL, -3,
+ { {AT_BITE, AF_PLAIN, 40}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 20, 5, 3, 0 },
+ 2, 1, MST_NO_SPELLS, CE_POISONOUS, Z_BIG, S_SILENT, I_INSECT,
+ HT_LAND, 4, DEFAULT_ENERGY, MONUSE_NOTHING, MONEAT_NOTHING, SIZE_BIG
+},
+
// killer bees 'k'
{
MONS_KILLER_BEE, 'k', YELLOW, "killer bee",
@@ -4235,6 +4235,19 @@ static monsterentry mondata[] = {
HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
+{
+ MONS_GASTRONOK, 'j', LIGHTRED, "Gastronok",
+ M_NO_SKELETON | M_UNIQUE | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SEE_INVIS
+ | M_SPEAKS,
+ MR_RES_FIRE | MR_RES_COLD,
+ 700, 10, MONS_GIANT_SLUG, MONS_GIANT_SLUG, MH_NATURAL, -4,
+ { {AT_BITE, AF_PLAIN, 15}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 10, 0, 0, 90 },
+ 1, 2, MST_GASTRONOK, CE_POISONOUS, Z_NOZOMBIE, S_GURGLE, I_NORMAL,
+ HT_AMPHIBIOUS_LAND, 5, DEFAULT_ENERGY, MONUSE_STARTING_EQUIPMENT, MONEAT_FOOD, SIZE_LARGE
+},
+
+
// human uniques ('@')
{
MONS_TERENCE, '@', LIGHTCYAN, "Terence",
diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h
index cb44ce64c7..559d56b8da 100644
--- a/crawl-ref/source/mon-spll.h
+++ b/crawl-ref/source/mon-spll.h
@@ -1101,6 +1101,18 @@
}
},
+ { MST_GASTRONOK,
+ {
+ SPELL_AIRSTRIKE,
+ SPELL_SLOW,
+ SPELL_CANTRIP,
+ SPELL_MAGIC_DART,
+ SPELL_CANTRIP,
+ SPELL_SUMMON_SMALL_MAMMALS,
+ }
+ },
+
+ // demon lords
{ MST_GERYON,
{
SPELL_SUMMON_BEAST,
@@ -1200,6 +1212,7 @@
}
},
+ // fake spell for monsters berserking when fleeing
{ MST_BERSERK_ESCAPE,
{
SPELL_NO_SPELL,
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index a4376baa45..50ef978332 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -3215,8 +3215,11 @@ static bool _ms_los_spell( spell_type monspell )
if (SPELL_KRAKEN_TENTACLES)
return (false);
- if (monspell == SPELL_SMITING || spell_typematch(monspell, SPTYP_SUMMONING))
+ if (monspell == SPELL_SMITING || monspell == SPELL_AIRSTRIKE
+ || spell_typematch(monspell, SPTYP_SUMMONING))
+ {
return (true);
+ }
return (false);
}
@@ -3227,8 +3230,11 @@ static bool _ms_ranged_spell( spell_type monspell, bool attack_only = false,
{
// Check for Smiting specially, so it's not filtered along
// with the summon spells.
- if (attack_only && monspell == SPELL_SMITING)
+ if (attack_only
+ && (monspell == SPELL_SMITING || monspell == SPELL_AIRSTRIKE))
+ {
return (true);
+ }
// These spells are ranged, but aren't direct attack spells.
if (_ms_los_spell(monspell))
@@ -3461,7 +3467,8 @@ bool mons_has_smite_attack(const monsters *monster)
if (hspell_pass[i] == SPELL_SYMBOL_OF_TORMENT
|| hspell_pass[i] == SPELL_SMITING
|| hspell_pass[i] == SPELL_HELLFIRE_BURST
- || hspell_pass[i] == SPELL_FIRE_STORM)
+ || hspell_pass[i] == SPELL_FIRE_STORM
+ || hspell_pass[i] == SPELL_AIRSTRIKE)
{
return (true);
}
@@ -5006,6 +5013,11 @@ bool monsters::pickup_armour(item_def &item, int near, bool force)
eq = EQ_BODY_ARMOUR;
}
break;
+ case ARM_WIZARD_HAT:
+ // HACK.
+ if (this->type == MONS_GASTRONOK)
+ eq = EQ_BODY_ARMOUR;
+ break;
default:
eq = get_armour_slot(item);
}
diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc
index b80a1d0c26..b34a50be9e 100644
--- a/crawl-ref/source/mstuff2.cc
+++ b/crawl-ref/source/mstuff2.cc
@@ -128,6 +128,13 @@ static bool _los_free_spell(spell_type spell_cast)
|| spell_cast == SPELL_AIRSTRIKE);
}
+// Returns true if a message referring to the player's legs makes sense.
+static bool _legs_msg_applicable()
+{
+ return (you.species != SP_NAGA
+ && (you.species != SP_MERFOLK || !player_is_swimming()));
+}
+
void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
bool do_noise)
{
@@ -510,6 +517,9 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
}
return;
+ // TODO: Outsource the cantrip messages and allow specification of
+ // special cantrip spells per monster, like for speech, both as
+ // "self buffs" and "player enchantments".
case SPELL_CANTRIP:
{
// Monster spell of uselessness, just prints a message.
@@ -528,25 +538,78 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast,
const msg_channel_type channel = (friendly) ? MSGCH_FRIEND_ENCHANT
: MSGCH_MONSTER_ENCHANT;
- // Messages about the monster influencing itself.
- const char* buff_msgs[] = { " glows brightly for a moment.",
- " looks stronger.",
- " becomes somewhat translucent.",
- "'s eyes start to glow." };
-
- // Messages about the monster influencing you.
- const char* other_msgs[] = {
- "You feel troubled.",
- "You feel a wave of unholy energy pass over you."
- };
-
- if (buff_only || crawl_state.arena || x_chance_in_y(2,3))
- simple_monster_message(monster, RANDOM_ELEMENT(buff_msgs), channel);
- else if (friendly)
- simple_monster_message(monster, " shimmers for a moment.", channel);
- else
- mpr(RANDOM_ELEMENT(other_msgs));
+ if (monster->type == MONS_GASTRONOK)
+ {
+ bool has_mon_foe = !invalid_monster_index(monster->foe);
+ std::string slugform = "";
+ if (buff_only || crawl_state.arena && !has_mon_foe
+ || friendly && !has_mon_foe || coinflip())
+ {
+ slugform = getSpeakString("gastronok_self_buff");
+ if (!slugform.empty())
+ {
+ slugform = replace_all(slugform, "@The_monster@",
+ monster->name(DESC_CAP_THE));
+ mpr(slugform.c_str(), channel);
+ }
+ }
+ else if (!friendly && !has_mon_foe)
+ {
+ mons_cast_noise(monster, pbolt, spell_cast);
+ // "Enchant" the player.
+ slugform = getSpeakString("gastronok_debuff");
+ if (!slugform.empty()
+ && (slugform.find("legs") == std::string::npos
+ || _legs_msg_applicable()))
+ {
+ mpr(slugform.c_str());
+ }
+ }
+ else
+ {
+ // "Enchant" another monster.
+ const monsters* foe
+ = dynamic_cast<const monsters*>(monster->get_foe());
+ slugform = getSpeakString("gastronok_other_buff");
+ if (!slugform.empty())
+ {
+ slugform = replace_all(slugform, "@The_monster@",
+ foe->name(DESC_CAP_THE));
+ mpr(slugform.c_str(), MSGCH_MONSTER_ENCHANT);
+ }
+ }
+ }
+ else
+ {
+ // Messages about the monster influencing itself.
+ const char* buff_msgs[] = { " glows brightly for a moment.",
+ " looks stronger.",
+ " becomes somewhat translucent.",
+ "'s eyes start to glow." };
+
+ // Messages about the monster influencing you.
+ const char* other_msgs[] = {
+ "You feel troubled.",
+ "You feel a wave of unholy energy pass over you."
+ };
+
+ if (buff_only || crawl_state.arena || x_chance_in_y(2,3))
+ {
+ simple_monster_message(monster, RANDOM_ELEMENT(buff_msgs),
+ channel);
+ }
+ else if (friendly)
+ {
+ simple_monster_message(monster, " shimmers for a moment.",
+ channel);
+ }
+ else // "Enchant" the player.
+ {
+ mons_cast_noise(monster, pbolt, spell_cast);
+ mpr(RANDOM_ELEMENT(other_msgs));
+ }
+ }
return;
}
case SPELL_BLINK_OTHER:
@@ -988,7 +1051,7 @@ void setup_mons_cast(monsters *monster, bolt &pbolt,
if (pbolt.target.origin())
pbolt.target = monster->target;
- // set bolt type and range
+ // Set bolt type and range.
if (_los_free_spell(spell_cast))
{
pbolt.range = 0;
@@ -998,6 +1061,7 @@ void setup_mons_cast(monsters *monster, bolt &pbolt,
pbolt.type = DMNBM_BRAIN_FEED;
return;
case SPELL_SMITING:
+ case SPELL_AIRSTRIKE:
pbolt.type = DMNBM_SMITING;
return;
default:
diff --git a/crawl-ref/source/rltiles/dc-mon.txt b/crawl-ref/source/rltiles/dc-mon.txt
index 4bf32dc47a..fb3a3bdf6c 100644
--- a/crawl-ref/source/rltiles/dc-mon.txt
+++ b/crawl-ref/source/rltiles/dc-mon.txt
@@ -44,9 +44,12 @@ gila_monster MONS_GILA_MONSTER
komodo_dragon MONS_KOMODO_DRAGON
## Slugs ('j')
-elephant_slug MONS_ELEPHANT_SLUG
+%sdir dc-mon/unique
+gastronok MONS_GASTRONOK
+%sdir dc-mon/animals
giant_slug MONS_GIANT_SLUG
giant_snail MONS_GIANT_SNAIL
+elephant_slug MONS_ELEPHANT_SLUG
## Rodents ('r')
rat MONS_RAT
diff --git a/crawl-ref/source/rltiles/dc-mon/unique/gastronok.png b/crawl-ref/source/rltiles/dc-mon/unique/gastronok.png
new file mode 100644
index 0000000000..68e918e621
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-mon/unique/gastronok.png
Binary files differ
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index c401f49fde..ff0f574ebd 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -944,6 +944,8 @@ int tileidx_monster_base(const monsters *mon, bool detected)
return TILEP_MONS_ILSUIW;
case MONS_PRINCE_RIBBIT:
return TILEP_MONS_PRINCE_RIBBIT;
+ case MONS_GASTRONOK:
+ return TILEP_MONS_GASTRONOK;
case MONS_NERGALLE:
return TILEP_MONS_NERGALLE;
case MONS_SAINT_ROKA: