summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/religion.cc
diff options
context:
space:
mode:
authordolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-06 19:58:34 +0000
committerdolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2009-02-06 19:58:34 +0000
commit41db1a9a17d3d5e1c15c24ba0580e0ed26c6c283 (patch)
tree920b916595a2d2db422d6f31ffd1dc65a8ead320 /crawl-ref/source/religion.cc
parent4e0f792aff22b971d1e35064926f173e48683bc3 (diff)
downloadcrawl-ref-41db1a9a17d3d5e1c15c24ba0580e0ed26c6c283.tar.gz
crawl-ref-41db1a9a17d3d5e1c15c24ba0580e0ed26c6c283.zip
Allow Beoghites to gain piety by sacrificing fresh orc corpses. The
odds of piety gain are currently the same as those of butchering corpses for gods that take them. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8934 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/religion.cc')
-rw-r--r--crawl-ref/source/religion.cc122
1 files changed, 79 insertions, 43 deletions
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index b7302bfe20..e570ed41f9 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -376,6 +376,7 @@ static bool _beogh_idol_revenge();
static void _tso_blasts_cleansing_flame(const char *message = NULL);
static bool _tso_holy_revenge();
static void _altar_prayer();
+static bool _god_likes_item(god_type god, const item_def& item);
static void _dock_piety(int piety_loss, int penance);
static bool _make_god_gifts_disappear(bool level_only = true);
static bool _make_holy_god_gifts_good_neutral(bool level_only = true);
@@ -512,6 +513,13 @@ std::string get_god_likes(god_type which_god, bool verbose)
switch (which_god)
{
+ case GOD_ZIN:
+ snprintf(info, INFO_SIZE, "you donate money%s",
+ verbose ? " (by praying at an altar)" : "");
+
+ likes.push_back(info);
+ break;
+
case GOD_SHINING_ONE:
snprintf(info, INFO_SIZE, "you sacrifice evil items%s",
verbose ? " (by dropping them on an altar and praying)" : "");
@@ -519,16 +527,16 @@ std::string get_god_likes(god_type which_god, bool verbose)
likes.push_back(info);
break;
- case GOD_NEMELEX_XOBEH:
- snprintf(info, INFO_SIZE, "you sacrifice items%s",
+ case GOD_BEOGH:
+ snprintf(info, INFO_SIZE, "you sacrifice fresh orc corpses%s",
verbose ? " (by standing over them and <w>p</w>raying)" : "");
+
likes.push_back(info);
break;
- case GOD_ZIN:
- snprintf(info, INFO_SIZE, "you donate money%s",
- verbose ? " (by praying at an altar)" : "");
-
+ case GOD_NEMELEX_XOBEH:
+ snprintf(info, INFO_SIZE, "you sacrifice items%s",
+ verbose ? " (by standing over them and <w>p</w>raying)" : "");
likes.push_back(info);
break;
@@ -2049,7 +2057,7 @@ static bool _is_risky_sacrifice(const item_def& item)
return item.base_type == OBJ_ORBS || is_rune(item);
}
-static bool _confirm_pray_sacrifice()
+static bool _confirm_pray_sacrifice(god_type god)
{
if (Options.stash_tracking == STM_EXPLICIT && is_stash(you.pos()))
{
@@ -2057,18 +2065,21 @@ static bool _confirm_pray_sacrifice()
return (false);
}
- for ( stack_iterator si(you.pos()); si; ++si )
+ for (stack_iterator si(you.pos()); si; ++si)
{
- if ( _is_risky_sacrifice(*si)
- || has_warning_inscription(*si, OPER_PRAY) )
+ if (_god_likes_item(god, *si)
+ && (_is_risky_sacrifice(*si)
+ || has_warning_inscription(*si, OPER_PRAY)))
{
std::string prompt = "Really sacrifice stack with ";
prompt += si->name(DESC_NOCAP_A);
prompt += " in it?";
- if ( !yesno(prompt.c_str(), false, 'n') )
+
+ if (!yesno(prompt.c_str(), false, 'n'))
return (false);
}
}
+
return (true);
}
@@ -2079,7 +2090,6 @@ std::string god_prayer_reaction()
result += " was ";
else
result += " is ";
-
result +=
(you.piety > 130) ? "exalted by your worship" :
(you.piety > 100) ? "extremely pleased with you" :
@@ -2088,9 +2098,9 @@ std::string god_prayer_reaction()
(you.piety > 20) ? "pleased with you" :
(you.piety > 5) ? "noncommittal"
: "displeased";
-
result += ".";
- return result;
+
+ return (result);
}
static bool _god_accepts_prayer(god_type god)
@@ -2114,6 +2124,7 @@ static bool _god_accepts_prayer(god_type god)
case GOD_YREDELEMNUL:
return (yred_injury_mirror(false));
+ case GOD_BEOGH:
case GOD_NEMELEX_XOBEH:
return (true);
@@ -2159,7 +2170,8 @@ void pray()
mpr("Sorry, a being of your status cannot worship here.");
return;
}
- god_pitch( grid_altar_god(grd(you.pos())) );
+
+ god_pitch(grid_altar_god(grd(you.pos())));
return;
}
}
@@ -2180,10 +2192,11 @@ void pray()
return;
}
- // Nemelexites can abort out now instead of offering something
- // they don't want to lose.
- if (you.religion == GOD_NEMELEX_XOBEH && altar_god == GOD_NO_GOD
- && !_confirm_pray_sacrifice())
+ // Beoghites and Nemelexites can abort out now instead of offering
+ // something they don't want to lose.
+ if (altar_god == GOD_NO_GOD
+ && (you.religion == GOD_BEOGH || you.religion == GOD_NEMELEX_XOBEH)
+ && !_confirm_pray_sacrifice(you.religion))
{
you.turn_is_over = false;
return;
@@ -2193,9 +2206,12 @@ void pray()
was_praying ? "renew your" : "offer a",
god_name(you.religion).c_str());
- // ...otherwise, they offer what they're standing on
- if (you.religion == GOD_NEMELEX_XOBEH && altar_god == GOD_NO_GOD)
+ // Beoghites and Nemelexites offer the items they're standing on.
+ if (altar_god == GOD_NO_GOD
+ && (you.religion == GOD_BEOGH || you.religion == GOD_NEMELEX_XOBEH))
+ {
offer_items();
+ }
you.duration[DUR_PRAYER] = 9 + (random2(you.piety) / 20)
+ (random2(you.piety) / 20);
@@ -2204,7 +2220,7 @@ void pray()
simple_god_message(" demands penance!");
else
{
- mpr( god_prayer_reaction().c_str(), MSGCH_PRAY, you.religion );
+ mpr(god_prayer_reaction().c_str(), MSGCH_PRAY, you.religion);
if (you.piety > 130)
you.duration[DUR_PRAYER] *= 3;
@@ -2212,10 +2228,15 @@ void pray()
you.duration[DUR_PRAYER] *= 2;
}
- if (you.religion == GOD_ZIN || you.religion == GOD_NEMELEX_XOBEH)
+ if (you.religion == GOD_ZIN || you.religion == GOD_BEOGH
+ || you.religion == GOD_NEMELEX_XOBEH)
+ {
you.duration[DUR_PRAYER] = 1;
+ }
else if (you.religion == GOD_YREDELEMNUL || you.religion == GOD_ELYVILON)
+ {
you.duration[DUR_PRAYER] = 20;
+ }
if (!was_praying)
_do_god_gift(true);
@@ -6129,7 +6150,7 @@ bool god_likes_items(god_type god)
{
switch (god)
{
- case GOD_ZIN: case GOD_SHINING_ONE: case GOD_NEMELEX_XOBEH:
+ case GOD_ZIN: case GOD_SHINING_ONE: case GOD_BEOGH: case GOD_NEMELEX_XOBEH:
return (true);
case GOD_NO_GOD: case NUM_GODS: case GOD_RANDOM:
@@ -6146,14 +6167,20 @@ static bool _god_likes_item(god_type god, const item_def& item)
switch (god)
{
- case GOD_NEMELEX_XOBEH:
- return !is_deck(item);
+ case GOD_ZIN:
+ return (item.base_type == OBJ_GOLD);
case GOD_SHINING_ONE:
- return is_evil_item(item);
+ return (is_evil_item(item));
- case GOD_ZIN:
- return item.base_type == OBJ_GOLD;
+ case GOD_BEOGH:
+ return (item.base_type == OBJ_CORPSES
+ && item.sub_type == CORPSE_BODY
+ && mons_species(item.plus) == MONS_ORC
+ && !food_is_rotten(item));
+
+ case GOD_NEMELEX_XOBEH:
+ return !is_deck(item);
default:
return (false);
@@ -6196,6 +6223,19 @@ static piety_gain_t _sacrifice_one_item_noncount( const item_def& item)
switch (you.religion)
{
+ case GOD_SHINING_ONE:
+ gain_piety(1);
+ relative_piety_gain = PIETY_SOME;
+ break;
+
+ case GOD_BEOGH:
+ if (x_chance_in_y(7, 10))
+ {
+ gain_piety(1);
+ relative_piety_gain = PIETY_SOME;
+ }
+ break;
+
case GOD_NEMELEX_XOBEH:
if (you.attribute[ATTR_CARD_COUNTDOWN] && x_chance_in_y(value, 800))
{
@@ -6240,14 +6280,10 @@ static piety_gain_t _sacrifice_one_item_noncount( const item_def& item)
you.sacrifice_value[item.base_type] += value;
break;
- case GOD_SHINING_ONE:
- gain_piety(1);
- relative_piety_gain = PIETY_SOME;
- break;
-
default:
break;
}
+
return (relative_piety_gain);
}
@@ -6323,7 +6359,6 @@ void offer_items()
std::string result = "You feel that " + god_name(GOD_ZIN)
+ " will soon be ";
-
result +=
(estimated_piety > 130) ? "exalted by your worship" :
(estimated_piety > 100) ? "extremely pleased with you" :
@@ -6332,7 +6367,6 @@ void offer_items()
(estimated_piety > 20) ? "pleased with you" :
(estimated_piety > 5) ? "noncommittal"
: "displeased";
-
result += (donation >= 30 && you.piety <= 170) ? "!" : ".";
mpr(result.c_str());
@@ -6370,8 +6404,9 @@ void offer_items()
continue;
}
- if (_is_risky_sacrifice(item)
- || item.inscription.find("=p") != std::string::npos)
+ if (_god_likes_item(you.religion, item)
+ && (_is_risky_sacrifice(item)
+ || item.inscription.find("=p") != std::string::npos))
{
const std::string msg =
"Really sacrifice " + item.name(DESC_NOCAP_A) + "?";
@@ -6426,11 +6461,12 @@ void offer_items()
{
// Zin was handled above, and the other gods don't care about
// sacrifices.
-
- if (you.religion == GOD_NEMELEX_XOBEH)
- simple_god_message(" expects you to use your decks, not offer them!", you.religion);
- else if (you.religion == GOD_SHINING_ONE)
- simple_god_message(" only cares about evil items!", you.religion);
+ if (you.religion == GOD_SHINING_ONE)
+ simple_god_message(" only cares about evil items!");
+ else if (you.religion == GOD_BEOGH)
+ simple_god_message(" only cares for newly dead orcs!");
+ else if (you.religion == GOD_NEMELEX_XOBEH)
+ simple_god_message(" expects you to use your decks, not offer them!");
}
}