summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/xom.cc
diff options
context:
space:
mode:
authordolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2008-03-18 00:18:35 +0000
committerdolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2008-03-18 00:18:35 +0000
commitf670880706d44d955f0d5fa571d86d3ee0d801ba (patch)
tree16a42b504fe0a358a482828b3d7d79a2383bcf4b /crawl-ref/source/xom.cc
parentcd1d40cfd788e60fc2b1e8b743d80985225f8d21 (diff)
downloadcrawl-ref-f670880706d44d955f0d5fa571d86d3ee0d801ba.tar.gz
crawl-ref-f670880706d44d955f0d5fa571d86d3ee0d801ba.zip
Various Xom neutrality adjustments:
* Allow him to randomly summon angels or daevas (on the grounds that they're misguided, curious, exiled from their usual god, etc.), with the same rarity as greater demons. Add appropriate introductory messages for this (from both me and dploog). * Remove "Xom the Psychopath" from his list of titles, and replace it with the older "Xom the Begetter of Discontinuities" for now. * Remove "Call Imp" from his list of spells that he can randomly make you cast, as he seems to summon enough minor demons through other means, which makes it an overlap (as the Summon Guardian and Summon Daeva "spells" would also be). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3696 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/xom.cc')
-rw-r--r--crawl-ref/source/xom.cc111
1 files changed, 89 insertions, 22 deletions
diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc
index 28fad1e284..7f00b5d3ba 100644
--- a/crawl-ref/source/xom.cc
+++ b/crawl-ref/source/xom.cc
@@ -45,10 +45,7 @@
// Which spell? First I copied all spells from you_spells(), then I
// filtered some out (especially conjurations). Then I sorted them in
-// roughly ascending order of power. ([ds] Removed SUMMON_GUARDIAN and
-// SUMMON_DAEVA which are inappropriate for a god of chaos; need to
-// investigate substitutes).
-//
+// roughly ascending order of power.
static const spell_type xom_spells[] =
{
SPELL_BLINK, SPELL_CONFUSING_TOUCH, SPELL_MAGIC_MAPPING,
@@ -58,14 +55,59 @@ static const spell_type xom_spells[] =
SPELL_TUKIMAS_VORPAL_BLADE, SPELL_FIRE_BRAND, SPELL_FREEZING_AURA,
SPELL_POISON_WEAPON, SPELL_STONEMAIL, SPELL_WARP_BRAND, SPELL_ALTER_SELF,
SPELL_TUKIMAS_DANCE, SPELL_SUMMON_BUTTERFLIES, SPELL_SUMMON_SMALL_MAMMAL,
- SPELL_CALL_IMP, SPELL_SUMMON_SCORPIONS, SPELL_FLY, SPELL_SPIDER_FORM,
- SPELL_STATUE_FORM, SPELL_ICE_FORM, SPELL_DRAGON_FORM, SPELL_SWARM,
- SPELL_SUMMON_WRAITHS, SPELL_SHADOW_CREATURES, SPELL_SUMMON_ELEMENTAL,
+ SPELL_SUMMON_SCORPIONS, SPELL_FLY, SPELL_SPIDER_FORM, SPELL_STATUE_FORM,
+ SPELL_ICE_FORM, SPELL_DRAGON_FORM, SPELL_SWARM, SPELL_SUMMON_WRAITHS,
+ SPELL_SHADOW_CREATURES, SPELL_SUMMON_ELEMENTAL,
SPELL_SUMMON_HORRIBLE_THINGS, SPELL_SUMMON_LARGE_MAMMAL,
SPELL_CONJURE_BALL_LIGHTNING, SPELL_SUMMON_DRAGON, SPELL_DEATH_CHANNEL,
SPELL_NECROMUTATION
};
+static const char *xom_single_summons[] =
+{
+ "\"Serve the mortal, my child!\"",
+ "\"Serve the toy, my child!\"",
+ "Xom opens a gate."
+};
+
+static const char *xom_single_diff_summons[] =
+{
+ "\"Serve the mortal, my confused child!\"",
+ "\"Serve the toy, my child of exile!\"",
+ "Xom calls in a curious servant of another god.",
+ "Xom lures something onto this plane.",
+ "\"A toy for the toy!\"",
+ "\"I wonder which toy lasts longer.\"",
+ "Xom opens a gate."
+};
+
+static const char *xom_multiple_summons[] =
+{
+ "\"Serve the mortal, my children!\"",
+ "Xom grants you some temporary aid.",
+ "Xom momentarily opens a gate."
+};
+
+static const char *xom_multiple_some_diff_summons[] =
+{
+ "Xom calls in some mixed company.",
+ "\"Serve the toy, my motley children!\"",
+ "Xom sends help from the ranks of the outcast.",
+ "\"Oh, what a happy playground.\"",
+ "Xom manages to trick several beings into existence.",
+ "Xom snickers at the variety.",
+ "Xom momentarily opens several gates."
+};
+
+static const char *xom_multiple_all_diff_summons[] =
+{
+ "Xom stirs up dislodged servants of other gods.",
+ "Xom summons wayward servants of other gods.",
+ "Xom tricks other gods for their servants.",
+ "\"Different god, different toy.\"",
+ "Xom momentarily opens a gate."
+};
+
static const char *xom_try_this[] =
{
"\"Perhaps you should try this instead.\"",
@@ -467,6 +509,11 @@ static monster_type xom_random_demon(int sever, bool use_greater_demons = true)
roll >= 850 ? DEMON_GREATER :
roll >= 340 ? DEMON_COMMON :
DEMON_LESSER;
+
+ // Sometimes, send an angel or daeva instead.
+ if (dct == DEMON_GREATER && coinflip())
+ return (coinflip() ? MONS_ANGEL : MONS_DAEVA);
+
const monster_type demontype =
summon_any_demon(
use_greater_demons || dct != DEMON_GREATER ? dct : DEMON_COMMON);
@@ -526,18 +573,29 @@ static bool xom_is_good(int sever)
}
else if (random2(sever) <= 3)
{
- god_speaks(GOD_XOM, random_choose_string(
- "\"Serve the mortal, my children!\"",
- "Xom grants you some temporary aid.",
- "Xom momentarily opens a gate.", NULL));
-
int numdemons = std::min(random2(random2(random2(sever+1)+1)+1)+2, 16);
+ int numdifferent = 0;
+
for (int i = 0; i < numdemons; i++)
{
- create_monster(xom_random_demon(sever), 3, BEH_GOD_GIFT,
- you.x_pos, you.y_pos, you.pet_target,
- MONS_PROGRAM_BUG);
+ monster_type mon = xom_random_demon(sever);
+
+ // If it's not a demon, Xom got it someplace else, so we use
+ // different messages below.
+ if (!mons_is_demon(mon))
+ numdifferent++;
+
+ create_monster(mon, 3, BEH_GOD_GIFT, you.x_pos, you.y_pos,
+ you.pet_target, MONS_PROGRAM_BUG);
}
+
+ if (numdifferent == numdemons)
+ god_speaks(GOD_XOM, RANDOM_ELEMENT(xom_multiple_all_diff_summons));
+ else if (numdifferent > 0)
+ god_speaks(GOD_XOM, RANDOM_ELEMENT(xom_multiple_some_diff_summons));
+ else
+ god_speaks(GOD_XOM, RANDOM_ELEMENT(xom_multiple_summons));
+
done = true;
}
else if (random2(sever) <= 4)
@@ -560,14 +618,23 @@ static bool xom_is_good(int sever)
}
else if (random2(sever) <= 6)
{
- if (create_monster(xom_random_demon(sever), 6, BEH_GOD_GIFT,
- you.x_pos, you.y_pos, you.pet_target,
- MONS_PROGRAM_BUG) != -1)
+ bool different = false;
+
+ monster_type mon = xom_random_demon(sever);
+
+ // If it's not a demon, Xom got it someplace else, so we use
+ // different messages below.
+ if (!mons_is_demon(mon))
+ different = true;
+
+ if (create_monster(mon, 6, BEH_GOD_GIFT, you.x_pos, you.y_pos,
+ you.pet_target, MONS_PROGRAM_BUG) != -1)
{
- god_speaks(GOD_XOM, random_choose_string(
- "\"Serve the mortal, my child!\"",
- "\"Serve the toy, my child!\"",
- "Xom opens a gate.", NULL));
+ if (different)
+ god_speaks(GOD_XOM, RANDOM_ELEMENT(xom_single_diff_summons));
+ else
+ god_speaks(GOD_XOM, RANDOM_ELEMENT(xom_single_summons));
+
done = true;
}
}