summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-03-21 17:49:24 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-03-21 17:49:24 +0000
commit0a930fa79787f0e7f4b4ab2f4e223b58b58690c7 (patch)
tree7f8b16f8378873a9564c98a8e8e1104923aed5cd
parenta8a6b89f6b751da432faa31b9be145ec8532294f (diff)
downloadcrawl-ref-0a930fa79787f0e7f4b4ab2f4e223b58b58690c7.tar.gz
crawl-ref-0a930fa79787f0e7f4b4ab2f4e223b58b58690c7.zip
Make Zin dislike when the player takes an action that makes an already
existing mutagenic glow stronger (piety loss, no penalty). At the same time go easier on the "eat souled being" misbehaviour: increased piety loss, but give penance only for eating very intelligent monsters, so that eating goblins and the like is an option again. (Cannibalism is checked first, and has worse effects.) Also fix restriction for items offered for ?recharging. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3789 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/source/abl-show.cc2
-rw-r--r--crawl-ref/source/beam.cc13
-rw-r--r--crawl-ref/source/effects.cc6
-rw-r--r--crawl-ref/source/enum.h5
-rw-r--r--crawl-ref/source/invent.cc2
-rw-r--r--crawl-ref/source/it_use2.cc4
-rw-r--r--crawl-ref/source/itemprop.cc1
-rw-r--r--crawl-ref/source/output.cc4
-rw-r--r--crawl-ref/source/player.cc96
-rw-r--r--crawl-ref/source/player.h3
-rw-r--r--crawl-ref/source/religion.cc24
-rw-r--r--crawl-ref/source/spells1.cc4
-rw-r--r--crawl-ref/source/spells3.cc2
-rw-r--r--crawl-ref/source/spl-cast.cc1
14 files changed, 112 insertions, 55 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc
index 4a1ffa74ca..8fe6a359c1 100644
--- a/crawl-ref/source/abl-show.cc
+++ b/crawl-ref/source/abl-show.cc
@@ -1295,7 +1295,7 @@ static bool do_ability(const ability_def& abil)
}
potion_effect( POT_INVISIBILITY, 2 * you.skills[SK_EVOCATIONS] + 5 );
- contaminate_player( 1 + random2(3) );
+ contaminate_player( 1 + random2(3), true );
exercise( SK_EVOCATIONS, 1 );
break;
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index be7e5602c4..7e637a96cf 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -3325,7 +3325,7 @@ static int affect_player( bolt &beam )
case BEAM_HASTE:
potion_effect( POT_SPEED, beam.ench_power );
- contaminate_player( 1 );
+ contaminate_player( 1, beam.effect_known );
beam.obvious_effect = true;
nasty = false;
nice = true;
@@ -3350,7 +3350,7 @@ static int affect_player( bolt &beam )
case BEAM_INVISIBILITY:
potion_effect( POT_INVISIBILITY, beam.ench_power );
- contaminate_player( 1 + random2(2) );
+ contaminate_player( 1 + random2(2), beam.effect_known );
beam.obvious_effect = true;
nasty = false;
nice = true;
@@ -3932,8 +3932,8 @@ static int affect_monster(bolt &beam, monsters *mon)
if (YOU_KILL(beam.thrower) && hurt_final > 0)
{
const bool okay =
- beam.aux_source == "reading a scroll of immolation"
- && !beam.effect_known;
+ (beam.aux_source == "reading a scroll of immolation"
+ && !beam.effect_known);
if (is_sanctuary(mon->x, mon->y)
|| is_sanctuary(you.x_pos, you.y_pos))
@@ -4164,7 +4164,10 @@ static int affect_monster_enchantment(bolt &beam, monsters *mon)
beam.obvious_effect = true;
if (YOU_KILL(beam.thrower))
- did_god_conduct(DID_DELIBERATE_MUTATING, 2 + random2(3), beam.effect_known);
+ {
+ did_god_conduct(DID_DELIBERATE_MUTATING, 2 + random2(3),
+ beam.effect_known);
+ }
return (MON_AFFECTED);
}
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index 12ad68cb6e..fddc3d2efd 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -2437,6 +2437,7 @@ void handle_time( long time_delta )
added_contamination++;
}
+ bool mutagenic_randart = false;
if (const int randart_glow = scan_randarts(RAP_MUTAGENIC))
{
// Reduced randart glow. Note that one randart will contribute
@@ -2448,13 +2449,16 @@ void handle_time( long time_delta )
const int mean_glow = 500 + randart_glow * 40;
const int actual_glow = mean_glow / 2 + random2(mean_glow);
added_contamination += div_rand_round(actual_glow, 1000);
+ mutagenic_randart = true;
}
// we take off about .5 points per turn
if (!you.duration[DUR_INVIS] && !you.duration[DUR_HASTE] && coinflip())
added_contamination -= 1;
- contaminate_player( added_contamination );
+ // only punish if contamination caused by mutagenic randarts
+ // (haste and invisibility already penalized earlier)
+ contaminate_player( added_contamination, mutagenic_randart );
// only check for badness once every other turn
if (coinflip())
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 0eb5b861c6..59cfb51ef9 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -657,9 +657,10 @@ enum conduct_type
DID_DRINK_BLOOD,
DID_CANNIBALISM,
DID_EAT_MEAT, // unused
- DID_EAT_SOULED_BEING, // Zin
+ DID_EAT_SOULED_BEING, // Zin
+ DID_DELIBERATE_MUTATING, // Zin
+ DID_CAUSE_GLOWING, // Zin
DID_CREATED_LIFE, // unused
- DID_DELIBERATE_MUTATING,
NUM_CONDUCTS
};
diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc
index f8c932dc69..bee34b1cb7 100644
--- a/crawl-ref/source/invent.cc
+++ b/crawl-ref/source/invent.cc
@@ -765,7 +765,7 @@ static bool item_class_selected(const item_def &i, int selector)
case OBJ_SCROLLS:
return (itype == OBJ_SCROLLS || itype == OBJ_BOOKS);
case OSEL_RECHARGE:
- return (item_is_rechargable(i), true);
+ return (item_is_rechargable(i, true));
case OSEL_ENCH_ARM:
return (is_enchantable_armour(i, true));
case OSEL_VAMP_EAT:
diff --git a/crawl-ref/source/it_use2.cc b/crawl-ref/source/it_use2.cc
index 07d652883f..07d4e55fca 100644
--- a/crawl-ref/source/it_use2.cc
+++ b/crawl-ref/source/it_use2.cc
@@ -145,7 +145,7 @@ bool potion_effect( potion_type pot_eff, int pow )
were_mighty ? "mightier" : "very mighty");
if ( were_mighty )
- contaminate_player(1);
+ contaminate_player(1, was_known);
else
modify_stat(STAT_STRENGTH, 5, true, "");
@@ -360,7 +360,7 @@ bool potion_effect( potion_type pot_eff, int pow )
// Just one point of contamination. These potions are really rare,
// and contamination is nastier.
- contaminate_player(1);
+ contaminate_player(1, was_known);
break;
case NUM_POTIONS:
diff --git a/crawl-ref/source/itemprop.cc b/crawl-ref/source/itemprop.cc
index dac38ae016..9db56d82d7 100644
--- a/crawl-ref/source/itemprop.cc
+++ b/crawl-ref/source/itemprop.cc
@@ -1276,6 +1276,7 @@ bool check_armour_shape( const item_def &item, bool quiet )
return (true);
}
+// if known is true, only returns true for *known* weapons of electrocution
bool item_is_rechargable(const item_def &it, bool known)
{
// These are obvious
diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc
index 23ddcba5da..eda654bffe 100644
--- a/crawl-ref/source/output.cc
+++ b/crawl-ref/source/output.cc
@@ -747,8 +747,8 @@ void print_stats(void)
if (you.backlit())
{
textcolor(
- you.magic_contamination >= 5?
- bad_ench_colour( you.magic_contamination, 15, 25 )
+ you.magic_contamination > 5 ?
+ bad_ench_colour( you.magic_contamination, 15, 25 )
: LIGHTBLUE );
cprintf( "Glow " );
}
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index a1318308c9..21f3fc2ec3 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -3566,6 +3566,23 @@ static void ability_increase()
}
} // end ability_increase()
+static const char * _get_rotting_how()
+{
+ ASSERT(you.rotting > 0 || you.species == SP_GHOUL);
+
+ if (you.rotting > 15)
+ return (" before your eyes");
+ if (you.rotting > 8)
+ return (" away quickly");
+ if (you.rotting > 4)
+ return (" badly");
+
+ if (you.species == SP_GHOUL)
+ return (" faster than usual");
+
+ return("");
+}
+
void display_char_status()
{
if (you.species == SP_VAMPIRE && you.hunger_state == HS_ENGORGED)
@@ -3799,19 +3816,10 @@ void display_char_status()
}
if (you.rotting || you.species == SP_GHOUL)
- {
- // I apologize in advance for the horrendous ugliness about to
- // transpire. Avert your eyes!
- mprf("Your flesh is rotting%s",
- (you.rotting > 15) ? " before your eyes." :
- (you.rotting > 8) ? " away quickly." :
- (you.rotting > 4) ? " badly." :
- ((you.species == SP_GHOUL && you.rotting) ?
- " faster than usual." : ".") );
- }
+ mprf("Your flesh is rotting%s.", _get_rotting_how());
// prints a contamination message
- contaminate_player( 0, true );
+ contaminate_player( 0, false, true );
if (you.duration[DUR_CONFUSING_TOUCH])
{
@@ -4757,12 +4765,32 @@ void set_mp(int new_amount, bool max_too)
return;
} // end set_mp()
-void contaminate_player(int change, bool statusOnly)
+static int _get_contamination_level()
{
- // get current contamination level
- int old_level;
- int new_level;
+ const int glow = you.magic_contamination;
+ if (glow > 60)
+ return (glow / 20 + 2);
+ if (glow > 40)
+ return 4;
+ if (glow > 25)
+ return 3;
+ if (glow > 15)
+ return 2;
+ if (glow > 5)
+ return 1;
+
+ return 0;
+}
+
+// controlled is true if the player actively did something to cause
+// contamination (such as drink a known potion of resistance),
+// status_only is true only for the status output
+void contaminate_player(int change, bool controlled, bool status_only)
+{
+ // get current contamination level
+ int old_level = _get_contamination_level();
+ int new_level = 0;
#if DEBUG_DIAGNOSTICS
if (change > 0 || (change < 0 && you.magic_contamination))
@@ -4772,12 +4800,6 @@ void contaminate_player(int change, bool statusOnly)
}
#endif
- old_level = (you.magic_contamination > 60)?(you.magic_contamination / 20 + 2) :
- (you.magic_contamination > 40)?4 :
- (you.magic_contamination > 25)?3 :
- (you.magic_contamination > 15)?2 :
- (you.magic_contamination > 5)?1 : 0;
-
// make the change
if (change + you.magic_contamination < 0)
you.magic_contamination = 0;
@@ -4790,13 +4812,9 @@ void contaminate_player(int change, bool statusOnly)
}
// figure out new level
- new_level = (you.magic_contamination > 60)?(you.magic_contamination / 20 + 2) :
- (you.magic_contamination > 40)?4 :
- (you.magic_contamination > 25)?3 :
- (you.magic_contamination > 15)?2 :
- (you.magic_contamination > 5)?1 : 0;
+ new_level = _get_contamination_level();
- if (statusOnly)
+ if (status_only)
{
if (new_level > 0)
{
@@ -4818,12 +4836,24 @@ void contaminate_player(int change, bool statusOnly)
return;
}
- if (new_level == old_level)
- return;
+ if (new_level != old_level)
+ {
+ mprf((change > 0) ? MSGCH_WARN : MSGCH_RECOVERY,
+ "You feel %s contaminated with magical energies.",
+ (change > 0) ? "more" : "less" );
+ }
- mprf((change > 0) ? MSGCH_WARN : MSGCH_RECOVERY,
- "You feel %s contaminated with magical energies.",
- (change > 0) ? "more" : "less" );
+ // Zin doesn't like mutations or mutagenic radiation.
+ if (you.religion == GOD_ZIN)
+ {
+ // Whenever the glow status is first reached, give a warning message.
+ if (old_level < 1 && new_level >= 1)
+ did_god_conduct(DID_CAUSE_GLOWING, 0, false);
+ // If the player actively did something to increase glowing,
+ // Zin is displeased.
+ else if (controlled && change > 0 && old_level > 0)
+ did_god_conduct(DID_CAUSE_GLOWING, 1 + new_level, true);
+ }
}
bool poison_player( int amount, bool force )
@@ -4979,7 +5009,7 @@ void haste_player( int amount )
else
{
mpr( "You feel as though your hastened speed will last longer." );
- contaminate_player(1);
+ contaminate_player(1, true); // always deliberate
}
you.duration[DUR_HASTE] += amount;
diff --git a/crawl-ref/source/player.h b/crawl-ref/source/player.h
index 11840c558d..9ea9964557 100644
--- a/crawl-ref/source/player.h
+++ b/crawl-ref/source/player.h
@@ -400,7 +400,8 @@ void set_mp(int new_amount, bool max_too);
/* ***********************************************************************
* called from:
* *********************************************************************** */
-void contaminate_player(int change, bool statusOnly = false);
+void contaminate_player(int change, bool controlled = false,
+ bool status_only = false);
/* @return true iff they were poisoned (false if they are immune) */
bool poison_player( int amount, bool force = false );
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index b3cd603876..7cff471e50 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -1720,10 +1720,23 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known,
}
break;
+ case DID_CAUSE_GLOWING:
case DID_DELIBERATE_MUTATING:
if (you.religion == GOD_ZIN)
{
- if (!known)
+ if (thing_done == DID_CAUSE_GLOWING)
+ {
+ static long last_glowing_lecture = -1L;
+ if (last_glowing_lecture != you.num_turns)
+ {
+ simple_god_message(" does not appreciate the mutagenic glow "
+ "surrounding you!");
+ last_glowing_lecture = you.num_turns;
+ }
+ if (!known)
+ break;
+ }
+ else if (!known)
{
simple_god_message(" did not appreciate that!");
break;
@@ -1733,11 +1746,14 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known,
}
break;
+ // level depends on intelligence: normal -> 1, high -> 2
+ // cannibalism is still worse
case DID_EAT_SOULED_BEING:
if (you.religion == GOD_ZIN)
{
- piety_change = -level;
- penance = level * 5;
+ piety_change = -level * 5;
+ if (level > 1)
+ penance = 5;
ret = true;
}
break;
@@ -1788,7 +1804,7 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known,
static void dock_piety(int piety_loss, int penance)
{
- static long last_piety_lecture = -1L;
+ static long last_piety_lecture = -1L;
static long last_penance_lecture = -1L;
if (piety_loss <= 0 && penance <= 0)
diff --git a/crawl-ref/source/spells1.cc b/crawl-ref/source/spells1.cc
index e3dce0e5d1..8b65313412 100644
--- a/crawl-ref/source/spells1.cc
+++ b/crawl-ref/source/spells1.cc
@@ -161,7 +161,7 @@ int blink(int pow, bool high_level_controlled_blink, bool wizard_blink)
// controlling teleport contaminates the player -- bwr
if (!wizard_blink)
- contaminate_player( 1 );
+ contaminate_player( 1, true );
}
if (you.duration[DUR_CONDENSATION_SHIELD] > 0 && !wizard_blink)
@@ -911,7 +911,7 @@ void extension(int pow)
cast_condensation_shield(pow);
if (contamination)
- contaminate_player( contamination );
+ contaminate_player( contamination, true );
} // end extension()
void ice_armour(int pow, bool extending)
diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc
index 698f2e7e3d..ead8d5698e 100644
--- a/crawl-ref/source/spells3.cc
+++ b/crawl-ref/source/spells3.cc
@@ -637,7 +637,7 @@ static bool teleport_player( bool allow_control, bool new_abyss_area )
else
{
// controlling teleport contaminates the player -- bwr
- contaminate_player(1);
+ contaminate_player(1, true);
}
}
} // end "if is_controlled"
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 062bc0fced..f9e3deb738 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1001,6 +1001,7 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
const int cont_points = div_rand_round(nastiness, 500);
+ // miscasts are uncontrolled
contaminate_player( cont_points );
miscast_effect( sptype, spell_mana(spell),