summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-02-25 14:12:07 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-02-25 14:12:07 +0000
commitecf486f921ceaa06af4252191b97f3017057f74a (patch)
tree4b0aec9c68ef4e2eb60e23d03a342d430bce0f1f
parent9f2bdcc6b1bc5a5ddc6a60b5edd16b22122d5901 (diff)
downloadcrawl-ref-ecf486f921ceaa06af4252191b97f3017057f74a.tar.gz
crawl-ref-ecf486f921ceaa06af4252191b97f3017057f74a.zip
Apply patch 1901117: vitrification effect for Xom (and Xom cleanup)
This needs flavour messages, and looks odd for large power because the undiggable stone of the level also gets turned into glass possibly resulting in huge areas of glass tiles. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3464 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/source/decks.cc27
-rw-r--r--crawl-ref/source/effects.cc20
-rw-r--r--crawl-ref/source/effects.h2
-rw-r--r--crawl-ref/source/stuff.cc25
-rw-r--r--crawl-ref/source/stuff.h1
-rw-r--r--crawl-ref/source/xom.cc288
6 files changed, 174 insertions, 189 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index 8e1e5eacec..a060dbed1d 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -2071,31 +2071,8 @@ static void sage_card(int power, deck_rarity_type rarity)
static void glass_card(int power, deck_rarity_type rarity)
{
const int power_level = get_power_level(power, rarity);
- int radius2;
- if ( power_level == 2 )
- radius2 = 1000000;
- else
- {
- radius2 = random2(power/40) + 2;
- radius2 *= radius2;
- }
-
- for ( int x = X_BOUND_1; x <= X_BOUND_2; ++x )
- {
- for ( int y = Y_BOUND_1; y <= Y_BOUND_2; ++y )
- {
- if ( distance(x,y,you.x_pos,you.y_pos) < radius2 )
- {
- if ( grd[x][y] == DNGN_ROCK_WALL )
- grd[x][y] = DNGN_CLEAR_ROCK_WALL;
- else if ( grd[x][y] == DNGN_STONE_WALL )
- grd[x][y] = DNGN_CLEAR_STONE_WALL;
- else if ( grd[x][y] == DNGN_PERMAROCK_WALL )
- grd[x][y] = DNGN_CLEAR_PERMAROCK_WALL;
- }
- }
- }
-
+ const int radius = ( power_level == 2 ) ? 1000 : random2(power/40) + 2;
+ vitrify_area(radius);
}
static void dowsing_card(int power, deck_rarity_type rarity)
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index 722161f8e5..d70a41fc14 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -1982,6 +1982,26 @@ bool forget_inventory(bool quiet)
return (items_forgotten > 0);
}
+void vitrify_area(int radius)
+{
+ const int radius2 = radius * radius;
+ for ( int x = X_BOUND_1; x <= X_BOUND_2; ++x )
+ {
+ for ( int y = Y_BOUND_1; y <= Y_BOUND_2; ++y )
+ {
+ if ( distance(x,y,you.x_pos,you.y_pos) < radius2 )
+ {
+ if ( grd[x][y] == DNGN_ROCK_WALL )
+ grd[x][y] = DNGN_CLEAR_ROCK_WALL;
+ else if ( grd[x][y] == DNGN_STONE_WALL )
+ grd[x][y] = DNGN_CLEAR_STONE_WALL;
+ else if ( grd[x][y] == DNGN_PERMAROCK_WALL )
+ grd[x][y] = DNGN_CLEAR_PERMAROCK_WALL;
+ }
+ }
+ }
+}
+
///////////////////////////////////////////////////////////////////////
static void hell_effects()
diff --git a/crawl-ref/source/effects.h b/crawl-ref/source/effects.h
index 768637bb9c..36d6537fc3 100644
--- a/crawl-ref/source/effects.h
+++ b/crawl-ref/source/effects.h
@@ -113,7 +113,7 @@ void torment( int caster, int tx, int ty );
int torment_monsters(int x, int y, int pow, int caster);
bool forget_inventory(bool quiet = false);
-
+void vitrify_area(int radius);
void update_corpses(double elapsedTime);
void update_level(double elapsedTime);
void handle_time( long time_delta );
diff --git a/crawl-ref/source/stuff.cc b/crawl-ref/source/stuff.cc
index b1d8952fa9..1f4956c8fa 100644
--- a/crawl-ref/source/stuff.cc
+++ b/crawl-ref/source/stuff.cc
@@ -297,6 +297,31 @@ int random_choose(int first, ...)
return (chosen);
}
+// Chooses one of the strings passed in at random. The list of strings
+// must be terminated with NULL.
+const char* random_choose_string(const char* first, ...)
+{
+ va_list args;
+ va_start(args, first);
+
+ const char* chosen = first;
+ int count = 1, nargs = 100;
+
+ while (nargs-- > 0)
+ {
+ char* pick = va_arg(args, char*);
+ if (pick == NULL)
+ break;
+ if (one_chance_in(++count))
+ chosen = pick;
+ }
+
+ ASSERT(nargs > 0);
+
+ va_end(args);
+ return (chosen);
+}
+
int random_choose_weighted(int weight, int first, ...)
{
va_list args;
diff --git a/crawl-ref/source/stuff.h b/crawl-ref/source/stuff.h
index 0ff8ba7d91..720899788b 100644
--- a/crawl-ref/source/stuff.h
+++ b/crawl-ref/source/stuff.h
@@ -37,6 +37,7 @@ bool one_chance_in(int a_million);
int random2(int randmax);
int random_range(int low, int high);
int random_range(int low, int high, int nrolls);
+const char* random_choose_string(const char* first, ...);
int random_choose(int first, ...);
int random_choose_weighted(int weight, int first, ...);
unsigned long random_int();
diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc
index 2d84382575..e6aa796b0b 100644
--- a/crawl-ref/source/xom.cc
+++ b/crawl-ref/source/xom.cc
@@ -485,59 +485,32 @@ static monster_type xom_random_punishment_demon(int sever)
return (demon);
}
+// The nicer stuff (note: these things are not necessarily nice)
static bool xom_is_good(int sever)
{
- // niceness = false - bad, true - nice
- int temp_rand; // probability determination {dlb}
bool done = false;
-
- bolt beam;
-
- // Okay, now for the nicer stuff (note: these things are not
- // necessarily nice):
god_acting gdact(GOD_XOM);
+
+ // This series of random calls produces a poisson-looking distribution:
+ // initial hump, plus a long-ish tail.
+
if (random2(sever) <= 1)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Go forth and destroy!\"" :
- (temp_rand == 1) ? "\"Go forth and cause havoc, mortal!\"" :
- (temp_rand == 2) ? "Xom grants you a minor favour."
- : "Xom smiles on you.");
-
- switch (random2(7))
- {
- case 0:
- potion_effect(POT_HEALING, 150);
- break;
- case 1:
- potion_effect(POT_HEAL_WOUNDS, 150);
- break;
- case 2:
- potion_effect(POT_SPEED, 150);
- break;
- case 3:
- potion_effect(POT_MIGHT, 150);
- break;
- case 4:
- potion_effect(POT_INVISIBILITY, 150);
- break;
- case 5:
- if (one_chance_in(6))
- potion_effect(POT_EXPERIENCE, 150);
- else
- {
- you.berserk_penalty = NO_BERSERK_PENALTY;
- potion_effect(POT_BERSERK_RAGE, 150);
- }
- break;
- case 6:
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"Go forth and destroy!\"",
+ "\"Go forth and cause havoc, mortal!\"",
+ "Xom grants you a minor favour.",
+ "Xom smiles on you.", NULL));
+
+ potion_type type = (potion_type)random_choose(
+ POT_HEALING, POT_HEAL_WOUNDS, POT_SPEED, POT_MIGHT,
+ POT_INVISIBILITY, POT_BERSERK_RAGE, POT_EXPERIENCE, -1);
+ // downplay this one a bit
+ if (type == POT_EXPERIENCE && !one_chance_in(6))
+ type = POT_BERSERK_RAGE;
+ if (type == POT_BERSERK_RAGE)
you.berserk_penalty = NO_BERSERK_PENALTY;
- potion_effect(POT_BERSERK_RAGE, 150);
- break;
- }
-
+ potion_effect(type, 150);
done = true;
}
else if (random2(sever) <= 2)
@@ -547,13 +520,10 @@ static bool xom_is_good(int sever)
}
else if (random2(sever) <= 3)
{
- temp_rand = random2(3);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Serve the mortal, my children!\"" :
- (temp_rand == 1) ? "Xom grants you some temporary aid."
- : "Xom momentarily opens a gate.");
-
+ 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);
for (int i = 0; i < numdemons; i++)
{
@@ -561,43 +531,48 @@ static bool xom_is_good(int sever)
you.x_pos, you.y_pos, you.pet_target,
MONS_PROGRAM_BUG);
}
-
done = true;
}
else if (random2(sever) <= 4)
{
- xom_gives_item(sever);
+ const int radius = random2avg(sever/2, 3);
+ god_speaks(GOD_XOM, random_choose_string(
+ // XXX need some more creative flavor text
+ "Xom alters the dungeon around you.", NULL));
+ vitrify_area(radius);
done = true;
}
else if (random2(sever) <= 5)
{
+ xom_gives_item(sever);
+ done = true;
+ }
+ 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)
{
- temp_rand = random2(3);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Serve the mortal, my child!\"" :
- (temp_rand == 1) ? "\"Serve the toy, my child!\"" :
- "Xom opens a gate.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"Serve the mortal, my child!\"",
+ "\"Serve the toy, my child!\"",
+ "Xom opens a gate.", NULL));
done = true;
}
}
- else if ((random2(sever) <= 6) && there_are_monsters_nearby())
+ else if (random2(sever) <= 7)
{
+ if (! there_are_monsters_nearby())
+ goto try_again;
+
monsters* mon = get_random_nearby_monster();
if (mon && mon->holiness() == MH_NATURAL)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"This might be better!\"" :
- (temp_rand == 1) ? "\"Hum-dee-hum-dee-hum...\"" :
- (temp_rand == 2) ?
- "Xom's power touches on a nearby monster."
- : "You hear Xom's avuncular chuckle.");
-
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"This might be better!\"",
+ "\"Hum-dee-hum-dee-hum...\"",
+ "Xom's power touches on a nearby monster.",
+ "You hear Xom's avuncular chuckle.", NULL));
if (mons_friendly(mon))
monster_polymorph(mon, RANDOM_MONSTER, PPT_MORE);
else
@@ -605,19 +580,21 @@ static bool xom_is_good(int sever)
done = true;
}
}
- else if (random2(sever) <= 7)
+ else if (random2(sever) <= 8)
{
xom_gives_item(sever);
done = true;
}
- else if (!you.is_undead && random2(sever) <= 8)
+ else if (random2(sever) <= 9)
{
- temp_rand = random2(4);
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"You need some minor adjustments, mortal!\"" :
- (temp_rand == 1) ? "\"Let me alter your pitiful body.\"" :
- (temp_rand == 2) ? "Xom's power touches on you for a moment."
- : "You hear Xom's maniacal cackling.");
+ if (you.is_undead)
+ goto try_again;
+
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"You need some minor adjustments, mortal!\"",
+ "\"Let me alter your pitiful body.\"",
+ "Xom's power touches on you for a moment.",
+ "You hear Xom's maniacal cackling.", NULL));
mpr("Your body is suffused with distortional energy.");
set_hp(1 + random2(you.hp), false);
@@ -632,28 +609,29 @@ static bool xom_is_good(int sever)
failMsg = false;
}
}
- else if (random2(sever) <= 9)
+ else if (random2(sever) <= 10)
{
if (create_monster( xom_random_demon(sever, one_chance_in(8)),
0, BEH_GOD_GIFT,
you.x_pos, you.y_pos, you.pet_target,
MONS_PROGRAM_BUG ) != -1)
{
- temp_rand = random2(3);
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "Xom grants you a demonic assistant."
- : (temp_rand == 1) ? "Xom grants you a demonic servitor."
- : "Xom opens a gate.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "Xom grants you a demonic assistant.",
+ "Xom grants you a demonic servitor.",
+ "Xom opens a gate.", NULL));
done = true;
}
}
- else if ((random2(sever) <= 10) && player_in_a_dangerous_place())
+ else if (random2(sever) <= 11)
{
+ if (player_in_a_dangerous_place())
if (you.hp <= random2(201))
you.attribute[ATTR_DIVINE_LIGHTNING_PROTECTION] = 1;
mpr("The area is suffused with divine lightning!");
+ bolt beam;
beam.beam_source = NON_MONSTER;
beam.type = dchar_glyph(DCHAR_FIRED_BURST);
beam.damage = dice_def( 3, 30 );
@@ -678,31 +656,24 @@ static bool xom_is_good(int sever)
done = true;
}
+try_again:
return (done);
}
static bool xom_is_bad(int sever)
{
- // niceness = false - bad, true - nice
- int temp_rand; // probability determination {dlb}
bool done = false;
-
- bolt beam;
-
god_acting gdact(GOD_XOM);
- // begin "Bad Things"
while (!done)
{
if (random2(sever) <= 2)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "Xom almost notices you." :
- (temp_rand == 1) ? "Xom's attention almost turns to you for a moment.":
- (temp_rand == 2) ? "Xom's power almost touches on you for a moment."
- : "You almost hear Xom's maniacal laughter.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "Xom almost notices you.",
+ "Xom's attention almost turns to you for a moment.",
+ "Xom's power almost touches on you for a moment.",
+ "You almost hear Xom's maniacal laughter.", NULL));
miscast_effect( SPTYP_RANDOM, 0, 0, 0, "the mischief of Xom" );
@@ -710,13 +681,11 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 3)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "Xom notices you." :
- (temp_rand == 1) ? "Xom's attention turns to you for a moment.":
- (temp_rand == 2) ? "Xom's power touches on you for a moment."
- : "You hear Xom's maniacal laughter.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "Xom notices you.",
+ "Xom's attention turns to you for a moment.",
+ "Xom's power touches on you for a moment.",
+ "You hear Xom's maniacal laughter.", NULL));
miscast_effect( SPTYP_RANDOM, 0, 0, random2(2),
"the capriciousness of Xom" );
@@ -725,13 +694,11 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 4)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Suffer!\"" :
- (temp_rand == 1) ? "Xom's malign attention turns to you for a moment." :
- (temp_rand == 2) ? "Xom's power touches on you for a moment."
- : "You hear Xom's maniacal laughter.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"Suffer!\"",
+ "Xom's malign attention turns to you for a moment.",
+ "Xom's power touches on you for a moment.",
+ "You hear Xom's maniacal laughter.", NULL));
lose_stat(STAT_RANDOM, 1 + random2(3), true,
"the capriciousness of Xom" );
@@ -740,27 +707,26 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 5)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "Xom notices you." :
- (temp_rand == 1) ? "Xom's attention turns to you for a moment.":
- (temp_rand == 2) ? "Xom's power touches on you for a moment."
- : "You hear Xom's maniacal laughter.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "Xom notices you.",
+ "Xom's attention turns to you for a moment.",
+ "Xom's power touches on you for a moment.",
+ "You hear Xom's maniacal laughter.", NULL));
miscast_effect( SPTYP_RANDOM, 0, 0, random2(3),
"the capriciousness of Xom" );
done = true;
}
- else if (!you.is_undead && random2(sever) <= 6)
+ else if (random2(sever) <= 6)
{
- temp_rand = random2(4);
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"You need some minor improvements, mortal!\"" :
- (temp_rand == 1) ? "\"Let me alter your body.\"" :
- (temp_rand == 2) ? "Xom's power brushes against you for a moment."
- : "You hear Xom's avuncular chuckle.");
+ if (you.is_undead)
+ goto try_again;
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"You need some minor improvements, mortal!\"",
+ "\"Let me alter your body.\"",
+ "Xom's power brushes against you for a moment.",
+ "You hear Xom's avuncular chuckle.", NULL));
mpr("Your body is suffused with distortional energy.");
set_hp(1 + random2(you.hp), false);
@@ -775,19 +741,20 @@ static bool xom_is_bad(int sever)
failMsg = false;
}
}
- else if ((random2(sever) <= 7) && there_are_monsters_nearby())
+ else if (random2(sever) <= 7)
{
+ if (! there_are_monsters_nearby())
+ goto try_again;
+
monsters* mon = get_random_nearby_monster();
ASSERT (mon != NULL);
if ( mon->holiness() == MH_NATURAL )
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"This might be better!\"" :
- (temp_rand == 1) ? "\"Hum-dee-hum-dee-hum...\"" :
- (temp_rand == 2) ? "Xom's power touches on a nearby monster."
- : "You hear Xom's avuncular chuckle.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"This might be better!\"",
+ "\"Hum-dee-hum-dee-hum...\"",
+ "Xom's power touches on a nearby monster.",
+ "You hear Xom's avuncular chuckle.", NULL));
if (mons_friendly(mon))
monster_polymorph(mon, RANDOM_MONSTER, PPT_LESS);
@@ -796,15 +763,15 @@ static bool xom_is_bad(int sever)
done = true;
}
}
- else if (!you.is_undead && random2(sever) <= 8)
+ else if (random2(sever) <= 8)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"You have displeased me, mortal.\"" :
- (temp_rand == 1) ? "\"You have grown too confident for your meagre worth.\"" :
- (temp_rand == 2) ? "Xom's power touches on you for a moment."
- : "You hear Xom's maniacal laughter.");
+ if (you.is_undead)
+ goto try_again;
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"You have displeased me, mortal.\"",
+ "\"You have grown too confident for your meagre worth.\"",
+ "Xom's power touches on you for a moment.",
+ "You hear Xom's maniacal laughter.", NULL));
if (one_chance_in(4))
{
@@ -824,13 +791,11 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 9)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Time to have some fun!\"" :
- (temp_rand == 1) ? "\"Fight to survive, mortal.\"" :
- (temp_rand == 2) ? "\"Let's see if it's strong enough to survive yet.\""
- : "You hear Xom's maniacal laughter.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"Time to have some fun!\"",
+ "\"Fight to survive, mortal.\"",
+ "\"Let's see if it's strong enough to survive yet.\"",
+ "You hear Xom's maniacal laughter.", NULL));
if (one_chance_in(4))
dancing_weapon(100, true); // nasty, but fun
@@ -851,13 +816,11 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 10)
{
- temp_rand = random2(4);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"Try this!\"" :
- (temp_rand == 1) ? "Xom's attention turns to you.":
- (temp_rand == 2) ? "Xom's power touches on you."
- : "Xom giggles.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"Try this!\"",
+ "Xom's attention turns to you.",
+ "Xom's power touches on you.",
+ "Xom giggles.", NULL));
miscast_effect( SPTYP_RANDOM, 0, 0, random2(4),
"the severe capriciousness of Xom" );
@@ -866,12 +829,10 @@ static bool xom_is_bad(int sever)
}
else if (one_chance_in(sever) && (you.level_type != LEVEL_ABYSS))
{
- temp_rand = random2(3);
-
- god_speaks(GOD_XOM,
- (temp_rand == 0) ? "\"You have grown too comfortable in your little world, mortal!\"" :
- (temp_rand == 1) ? "Xom casts you into the Abyss!"
- : "The world seems to spin as Xom's maniacal laughter rings in your ears.");
+ god_speaks(GOD_XOM, random_choose_string(
+ "\"You have grown too comfortable in your little world, mortal!\"",
+ "Xom casts you into the Abyss!",
+ "The world seems to spin as Xom's maniacal laughter rings in your ears.", NULL));
banished(DNGN_ENTER_ABYSS, "Xom");
@@ -879,6 +840,7 @@ static bool xom_is_bad(int sever)
}
}
+try_again:
return (done);
}