summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorDavid Lawrence Ramsey <dolorous@users.sourceforge.net>2009-10-11 16:04:45 -0500
committerDavid Lawrence Ramsey <dolorous@users.sourceforge.net>2009-10-11 16:04:45 -0500
commit7d6de33069c359f758c866bb2d6a94521b1a4ad5 (patch)
tree76bffc4c406f8bded1520d45c1fe8a74ba7d12f8 /crawl-ref/source
parentf5441fc9dd70ad0d0bca04e0bbf6838b97dcb24e (diff)
downloadcrawl-ref-7d6de33069c359f758c866bb2d6a94521b1a4ad5.tar.gz
crawl-ref-7d6de33069c359f758c866bb2d6a94521b1a4ad5.zip
Make gods that take corpse offerings do so without the butchery step,
i.e., allow merely praying over said corpses. Now, the only gods that pay attention to butchery are Kikubaaqudgha and Elyvilon. Also, add several miscellaneous fixes.
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/abl-show.cc10
-rw-r--r--crawl-ref/source/clua.cc38
-rw-r--r--crawl-ref/source/delay.cc86
-rw-r--r--crawl-ref/source/describe.cc15
-rw-r--r--crawl-ref/source/enum.h3
-rw-r--r--crawl-ref/source/food.cc36
-rw-r--r--crawl-ref/source/initfile.cc1
-rw-r--r--crawl-ref/source/religion.cc209
-rw-r--r--crawl-ref/source/religion.h3
-rw-r--r--crawl-ref/source/spells3.cc3
10 files changed, 201 insertions, 203 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc
index c656794bdd..005e83db52 100644
--- a/crawl-ref/source/abl-show.cc
+++ b/crawl-ref/source/abl-show.cc
@@ -105,8 +105,8 @@ ability_type god_abilities[MAX_NUM_GODS][MAX_GOD_ABILITIES] =
{ ABIL_NON_ABILITY, ABIL_TSO_DIVINE_SHIELD, ABIL_NON_ABILITY,
ABIL_TSO_CLEANSING_FLAME, ABIL_TSO_SUMMON_DIVINE_WARRIOR },
// Kikubaaqudgha
- { ABIL_KIKU_RECEIVE_CORPSE, ABIL_NON_ABILITY,
- ABIL_NON_ABILITY, ABIL_NON_ABILITY, ABIL_NON_ABILITY },
+ { ABIL_KIKU_RECEIVE_CORPSES, ABIL_NON_ABILITY, ABIL_NON_ABILITY,
+ ABIL_NON_ABILITY, ABIL_NON_ABILITY },
// Yredelemnul
{ ABIL_YRED_ANIMATE_REMAINS, ABIL_YRED_RECALL_UNDEAD_SLAVES,
ABIL_YRED_ANIMATE_DEAD, ABIL_YRED_DRAIN_LIFE, ABIL_YRED_ENSLAVE_SOUL },
@@ -240,7 +240,7 @@ static const ability_def Ability_List[] =
8, 0, 150, 4, ABFLAG_NONE },
// Kikubaaqudgha
- { ABIL_KIKU_RECEIVE_CORPSE, "Recieve Corpses", 5, 0, 1000, 2, ABFLAG_NONE },
+ { ABIL_KIKU_RECEIVE_CORPSES, "Receive Corpses", 5, 0, 1000, 2, ABFLAG_NONE },
// Yredelemnul
{ ABIL_YRED_INJURY_MIRROR, "Injury Mirror", 0, 0, 0, 0, ABFLAG_PIETY },
@@ -728,7 +728,7 @@ static talent _get_talent(ability_type ability, bool check_confused)
case ABIL_BEOGH_SMITING:
case ABIL_MAKHLEB_MINOR_DESTRUCTION:
case ABIL_SIF_MUNA_FORGET_SPELL:
- case ABIL_KIKU_RECEIVE_CORPSE:
+ case ABIL_KIKU_RECEIVE_CORPSES:
case ABIL_YRED_ANIMATE_DEAD:
case ABIL_MAKHLEB_LESSER_SERVANT_OF_MAKHLEB:
case ABIL_ELYVILON_GREATER_HEALING_SELF:
@@ -1626,7 +1626,7 @@ static bool _do_ability(const ability_def& abil)
exercise(SK_INVOCATIONS, 8 + random2(10));
break;
- case ABIL_KIKU_RECEIVE_CORPSE:
+ case ABIL_KIKU_RECEIVE_CORPSES:
receive_corpses(you.skills[SK_INVOCATIONS] * 4, you.pos());
exercise(SK_INVOCATIONS, (coinflip() ? 3 : 2));
break;
diff --git a/crawl-ref/source/clua.cc b/crawl-ref/source/clua.cc
index 8a9c7bc5b9..11ac031f5d 100644
--- a/crawl-ref/source/clua.cc
+++ b/crawl-ref/source/clua.cc
@@ -767,6 +767,10 @@ LUARET1(you_good_god, boolean,
LUARET1(you_evil_god, boolean,
lua_isstring(ls, 1) ? is_evil_god(str_to_god(lua_tostring(ls, 1)))
: is_evil_god(you.religion))
+LUARET1(you_god_likes_fresh_corpses, boolean,
+ lua_isstring(ls, 1) ?
+ god_likes_fresh_corpses(str_to_god(lua_tostring(ls, 1))) :
+ god_likes_fresh_corpses(you.religion))
LUARET1(you_god_likes_butchery, boolean,
lua_isstring(ls, 1) ?
god_likes_butchery(str_to_god(lua_tostring(ls, 1))) :
@@ -907,8 +911,9 @@ static const struct luaL_reg you_lib[] =
{ "flying", you_flying },
{ "transform", you_transform },
- { "god_likes_butchery", you_god_likes_butchery },
- { "can_consume_corpses", you_can_consume_corpses },
+ { "god_likes_fresh_corpses", you_god_likes_fresh_corpses },
+ { "god_likes_butchery", you_god_likes_butchery },
+ { "can_consume_corpses", you_can_consume_corpses },
{ "stop_activity", you_stop_activity },
{ "taking_stairs", you_taking_stairs },
@@ -2525,14 +2530,14 @@ MDEF(hd)
static const char *_monuse_names[] =
{
- "nothing", "open_doors", "starting_equipment",
- "weapons_armour", "magic_items"
+ "nothing", "open_doors", "starting_equipment", "weapons_armour",
+ "magic_items"
};
-static const char *_monuse_to_str(mon_itemuse_type ityp)
+static const char *_monuse_to_str(mon_itemuse_type utyp)
{
COMPILE_CHECK(ARRAYSZ(_monuse_names) == NUM_MONUSE, c1);
- return _monuse_names[ityp];
+ return _monuse_names[utyp];
}
MDEF(muse)
@@ -2544,6 +2549,26 @@ MDEF(muse)
return (0);
}
+static const char *_moneat_names[] =
+{
+ "nothing", "items", "corpses", "food"
+};
+
+static const char *_moneat_to_str(mon_itemeat_type etyp)
+{
+ COMPILE_CHECK(ARRAYSZ(_moneat_names) == NUM_MONEAT, c1);
+ return _moneat_names[etyp];
+}
+
+MDEF(meat)
+{
+ if (const monsterentry *me = mons->find_monsterentry())
+ {
+ PLUARET(string, _moneat_to_str(me->gmon_eat));
+ }
+ return (0);
+}
+
static int l_mons_do_dismiss(lua_State *ls)
{
// dismiss is only callable from dlua, not from managed VMs (i.e.
@@ -2580,6 +2605,7 @@ static MonsAccessor mons_attrs[] =
{ "y" , l_mons_y },
{ "hd" , l_mons_hd },
{ "muse", l_mons_muse },
+ { "meat", l_mons_meat },
{ "dismiss", l_mons_dismiss },
{ "experience", l_mons_experience },
};
diff --git a/crawl-ref/source/delay.cc b/crawl-ref/source/delay.cc
index 87cea6699b..81f53d1f2c 100644
--- a/crawl-ref/source/delay.cc
+++ b/crawl-ref/source/delay.cc
@@ -82,7 +82,6 @@ static bool _recite_mons_useless(const monsters *mon)
// Power is maximum 50.
static int _recite_to_monsters(coord_def where, int pow, int, actor *)
{
-
monsters *mons = monster_at(where);
if (mons == NULL)
@@ -354,9 +353,8 @@ void stop_delay( bool stop_stair_travel )
{
case DELAY_BUTCHER:
case DELAY_BOTTLE_BLOOD:
- case DELAY_OFFER_CORPSE:
{
- // Corpse keeps track of work in plus2 field, see handle_delay(). -- bwr
+ // Corpse keeps track of work in plus2 field, see handle_delay(). - bwr
bool multiple_corpses = false;
bool butcher_swap_setup = false;
int butcher_swap_weapon = 0;
@@ -364,8 +362,7 @@ void stop_delay( bool stop_stair_travel )
for (unsigned int i = 1; i < you.delay_queue.size(); ++i)
{
if (you.delay_queue[i].type == DELAY_BUTCHER
- || you.delay_queue[i].type == DELAY_BOTTLE_BLOOD
- || you.delay_queue[i].type == DELAY_OFFER_CORPSE)
+ || you.delay_queue[i].type == DELAY_BOTTLE_BLOOD)
{
multiple_corpses = true;
}
@@ -538,8 +535,7 @@ void stop_delay( bool stop_stair_travel )
static bool _is_butcher_delay(int delay)
{
- return (delay == DELAY_BUTCHER || delay == DELAY_BOTTLE_BLOOD
- || delay == DELAY_OFFER_CORPSE);
+ return (delay == DELAY_BUTCHER || delay == DELAY_BOTTLE_BLOOD);
}
void stop_butcher_delay()
@@ -665,8 +661,7 @@ bool is_being_butchered(const item_def &item, bool just_first)
for (unsigned int i = 0; i < you.delay_queue.size(); ++i)
{
if (you.delay_queue[i].type == DELAY_BUTCHER
- || you.delay_queue[i].type == DELAY_BOTTLE_BLOOD
- || you.delay_queue[i].type == DELAY_OFFER_CORPSE)
+ || you.delay_queue[i].type == DELAY_BOTTLE_BLOOD)
{
const item_def &corpse = mitm[ you.delay_queue[i].parm1 ];
if (&corpse == &item)
@@ -788,31 +783,34 @@ void handle_delay()
case DELAY_ARMOUR_ON:
mpr("You start putting on your armour.", MSGCH_MULTITURN_ACTION);
break;
+
case DELAY_ARMOUR_OFF:
mpr("You start removing your armour.", MSGCH_MULTITURN_ACTION);
break;
+
case DELAY_BUTCHER:
case DELAY_BOTTLE_BLOOD:
if (!is_valid_item(mitm[delay.parm1]))
break;
+
mprf(MSGCH_MULTITURN_ACTION, "You start %s the %s.",
(delay.type == DELAY_BOTTLE_BLOOD ? "bottling blood from"
: "butchering"),
mitm[delay.parm1].name(DESC_PLAIN).c_str());
// Also for bottling blood - just in case.
- if (you.duration[DUR_PRAYER]
- && god_hates_butchery(you.religion))
- {
+ if (you.duration[DUR_PRAYER])
did_god_conduct(DID_DEDICATED_BUTCHERY, 10);
- }
break;
+
case DELAY_MEMORISE:
mpr("You start memorising the spell.", MSGCH_MULTITURN_ACTION);
break;
+
case DELAY_PASSWALL:
mpr("You begin to meditate on the wall.", MSGCH_MULTITURN_ACTION);
break;
+
case DELAY_RECITE:
mprf(MSGCH_PLAIN, "You %s",
_get_recite_speech("start", you.num_turns + delay.duration).c_str());
@@ -820,9 +818,11 @@ void handle_delay()
if (apply_area_visible(_recite_to_monsters, delay.parm1))
viewwindow(true, false);
break;
+
default:
break;
}
+
delay.started = true;
}
@@ -858,8 +858,7 @@ void handle_delay()
return;
}
}
- else if (delay.type == DELAY_BUTCHER || delay.type == DELAY_BOTTLE_BLOOD
- || delay.type == DELAY_OFFER_CORPSE)
+ else if (delay.type == DELAY_BUTCHER || delay.type == DELAY_BOTTLE_BLOOD)
{
if (delay.type == DELAY_BOTTLE_BLOOD && you.experience_level < 6)
{
@@ -915,16 +914,6 @@ void handle_delay()
}
}
- if (delay.type == DELAY_OFFER_CORPSE)
- {
- // Don't attempt to offer a rotten corpse.
- _pop_delay();
-
- // Chain onto the next delay.
- handle_delay();
- return;
- }
-
delay.parm2 = 99; // Don't give the message twice.
// Vampires won't continue bottling rotting corpses.
@@ -942,18 +931,6 @@ void handle_delay()
mitm[ delay.parm1 ].plus2++;
}
}
- else if (delay.type == DELAY_OFFER_CORPSE)
- {
-#ifdef DEBUG_DIAGNOSTICS
- mprf("Corpse %d no longer valid!", delay.parm1);
-#endif
- // Don't attempt to offer an invalid item.
- _pop_delay();
-
- // Chain onto the next delay.
- handle_delay();
- return;
- }
else
{
// Corpse is no longer valid! End the butchering normally
@@ -1349,37 +1326,6 @@ static void _finish_delay(const delay_queue_item &delay)
break;
}
- case DELAY_OFFER_CORPSE:
- {
- if (!you.duration[DUR_PRAYER])
- {
- stop_delay();
- return;
- }
-
- if (food_is_rotten(mitm[delay.parm1]))
- {
- simple_god_message(coinflip() ? " refuses to accept that"
- " mouldy sacrifice!"
- : " demands fresh blood!",
- you.religion);
- _pop_delay();
- // Chain onto the next delay.
- handle_delay();
- }
- else
- {
- offer_corpse(delay.parm1);
- StashTrack.update_stash(); // Don't stash-track this corpse anymore.
- }
- // If we were interrupted while butchering (by poisoning, for
- // example) then resumed butchering and finished, swap back from
- // butchering tool if appropriate.
- if (you.delay_queue.size() == 1)
- handle_interrupted_swap(true);
- break;
- }
-
case DELAY_DROP_ITEM:
// Note: checking if item is droppable is assumed to
// be done before setting up this delay... this includes
@@ -2111,8 +2057,8 @@ activity_interrupt_type get_activity_interrupt(const std::string &name)
static const char *delay_names[] =
{
"not_delayed", "eat", "vampire_feed", "armour_on", "armour_off",
- "jewellery_on", "memorise", "butcher", "bottle_blood", "offer_corpse",
- "weapon_swap", "passwall", "drop_item", "multidrop", "ascending_stairs",
+ "jewellery_on", "memorise", "butcher", "bottle_blood", "weapon_swap",
+ "passwall", "drop_item", "multidrop", "ascending_stairs",
"descending_stairs", "recite", "run", "rest", "travel", "macro",
"macro_process_key", "interruptible", "uninterruptible"
};
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc
index 3644ad37f2..462320deee 100644
--- a/crawl-ref/source/describe.cc
+++ b/crawl-ref/source/describe.cc
@@ -3127,7 +3127,7 @@ std::string describe_favour(god_type which_god)
: _describe_favour_generic(which_god);
}
-static std::string _religion_help( god_type god )
+static std::string _religion_help(god_type god)
{
std::string result = "";
@@ -3182,6 +3182,12 @@ static std::string _religion_help( god_type god )
}
break;
+ case GOD_BEOGH:
+ result += "You can pray to sacrifice all orcish remains on your "
+ "square. Inscribe orcish remains with !p, !* or =p to avoid "
+ "sacrificing them accidentally.";
+ break;
+
case GOD_NEMELEX_XOBEH:
result += "You can pray to sacrifice all items on your square. "
"Inscribe items with !p, !* or =p to avoid sacrificing "
@@ -3200,13 +3206,14 @@ static std::string _religion_help( god_type god )
break;
}
- if (god_likes_butchery(god))
+ if (god_likes_fresh_corpses(god))
{
if (!result.empty())
result += " ";
- result += "You can sacrifice corpses by dissecting"
- " them during prayer.";
+ result += "You can pray to sacrifice all fresh corpses on your "
+ "square. Inscribe fresh corpses with !p, !* or =p to avoid "
+ "sacrificing them accidentally.";
}
return result;
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 7a18318241..6a602a2c8f 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -58,7 +58,7 @@ enum ability_type
ABIL_TSO_DIVINE_SHIELD = 120, // 120
ABIL_TSO_CLEANSING_FLAME,
ABIL_TSO_SUMMON_DIVINE_WARRIOR,
- ABIL_KIKU_RECEIVE_CORPSE = 130, // 130
+ ABIL_KIKU_RECEIVE_CORPSES = 130, // 130
ABIL_YRED_INJURY_MIRROR = 139,
ABIL_YRED_ANIMATE_REMAINS, // 140
ABIL_YRED_RECALL_UNDEAD_SLAVES,
@@ -834,7 +834,6 @@ enum delay_type
DELAY_MEMORISE,
DELAY_BUTCHER,
DELAY_BOTTLE_BLOOD,
- DELAY_OFFER_CORPSE,
DELAY_WEAPON_SWAP, // for easy_butcher
DELAY_PASSWALL,
DELAY_DROP_ITEM,
diff --git a/crawl-ref/source/food.cc b/crawl-ref/source/food.cc
index b2e3ac2299..56d3e95e57 100644
--- a/crawl-ref/source/food.cc
+++ b/crawl-ref/source/food.cc
@@ -357,36 +357,32 @@ static bool _butcher_corpse(int corpse_id, bool first_corpse = true,
const bool can_sac = you.duration[DUR_PRAYER]
&& god_likes_butchery(you.religion);
- if (can_sac && !rotten)
+ if (can_sac)
{
- start_delay(DELAY_OFFER_CORPSE, 0, corpse_id);
-
- // Kiku torments if you butcher a corpse while praying.
- if (you.religion == GOD_KIKUBAAQUDGHA
- && you.piety >= piety_breakpoint(4))
+ if (!rotten)
{
- simple_god_message(" inflicts torment against the living!");
- torment(TORMENT_KIKUBAAQUDGHA, you.pos());
- you.piety -= 8 + random2(4); // 8 to 12
+ offer_and_butcher_corpse(corpse_id);
+
+ // Kikubaaqudgha torments if you butcher a fresh corpse
+ // while praying.
+ if (you.religion == GOD_KIKUBAAQUDGHA
+ && you.piety >= piety_breakpoint(4))
+ {
+ simple_god_message(" inflicts torment against the living!");
+ torment(TORMENT_KIKUBAAQUDGHA, you.pos());
+ you.piety -= 8 + random2(4); // 8 to 12
+ }
}
+ else
+ simple_god_message(" refuses to accept that mouldy sacrifice!");
}
else
{
- if (can_sac && rotten)
- {
- simple_god_message(coinflip() ? " refuses to accept that"
- " mouldy sacrifice!"
- : " demands fresh blood!",
- you.religion);
- }
-
// Start work on the first corpse we butcher.
if (first_corpse)
mitm[corpse_id].plus2++;
- int work_req = 4 - mitm[corpse_id].plus2;
- if (work_req < 0)
- work_req = 0;
+ int work_req = std::max(0, 4 - mitm[corpse_id].plus2);
delay_type dtype = DELAY_BUTCHER;
if (!force_butcher && !rotten
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index ae9f7ca281..cf175bc4db 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -537,7 +537,6 @@ void game_options::set_default_activity_interrupts()
"interrupt_memorise = interrupt_armour_on, stat",
"interrupt_butcher = interrupt_armour_on, teleport, stat",
"interrupt_bottle_blood = interrupt_butcher",
- "interrupt_offer_corpse = interrupt_butcher, hungry",
"interrupt_vampire_feed = interrupt_butcher",
"interrupt_passwall = interrupt_butcher",
"interrupt_multidrop = interrupt_butcher",
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 71a236bde8..b03e5fd0a2 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -595,10 +595,10 @@ std::string get_god_likes(god_type which_god, bool verbose)
break;
}
- if (god_likes_butchery(which_god))
+ if (god_likes_fresh_corpses(which_god))
{
- snprintf(info, INFO_SIZE, "you butcher corpses while praying%s",
- verbose ? " (press <w>pc</w> to do so)" : "");
+ snprintf(info, INFO_SIZE, "you sacrifice fresh corpses%s",
+ verbose ? " (by standing over them and <w>p</w>raying)" : "");
likes.push_back(info);
}
@@ -1390,7 +1390,7 @@ static void _give_nemelex_gift()
deck.colour = deck_rarity_to_color(rarity);
deck.inscription = "god gift";
- move_item_to_grid( &thing_created, you.pos() );
+ move_item_to_grid(&thing_created, you.pos());
simple_god_message(" grants you a gift!");
more();
@@ -2387,7 +2387,7 @@ static bool _god_accepts_prayer(god_type god)
return (true);
}
- if (god_likes_butchery(god))
+ if (god_likes_fresh_corpses(god) || god_likes_butchery(god))
return (true);
switch (god)
@@ -2519,9 +2519,11 @@ void pray()
else if (you.religion == GOD_YREDELEMNUL || you.religion == GOD_ELYVILON)
you.duration[DUR_PRAYER] = 20;
- // Beoghites and Nemelexites offer the items they're standing on.
+ // Gods that like fresh corpses, 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))
+ && (god_likes_fresh_corpses(you.religion)
+ || you.religion == GOD_BEOGH || you.religion == GOD_NEMELEX_XOBEH))
{
offer_items();
}
@@ -2938,25 +2940,15 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
}
break;
- case DID_DEDICATED_BUTCHERY: // a.k.a. field sacrifice
+ case DID_DEDICATED_BUTCHERY:
switch (you.religion)
{
case GOD_ELYVILON:
simple_god_message(" does not appreciate your butchering the "
"dead during prayer!");
retval = true;
- piety_change = -10;
- penance = 10;
- break;
-
- case GOD_OKAWARU:
- case GOD_MAKHLEB:
- case GOD_TROG:
- case GOD_LUGONU:
- simple_god_message(" accepts your offering.");
- retval = true;
- if (random2(level + 10) > 5)
- piety_change = 1;
+ piety_change = -level;
+ penance = level;
break;
default:
@@ -2968,7 +2960,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
switch (you.religion)
{
case GOD_ELYVILON:
- // killing only disapproved during prayer
+ // Killing is only disapproved of during prayer.
if (you.duration[DUR_PRAYER])
{
simple_god_message(" does not appreciate your shedding "
@@ -3015,7 +3007,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
simple_god_message(" accepts your kill.");
retval = true;
- // Holy gods are easier to please this way
+ // Holy gods are easier to please this way.
if (random2(level + 18 - (is_good_god(you.religion) ? 0 :
you.experience_level / 2)) > 4)
piety_change = 1;
@@ -3039,7 +3031,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
simple_god_message(" accepts your kill.");
retval = true;
- // Holy gods are easier to please this way
+ // Holy gods are easier to please this way.
if (random2(level + 18 - (is_good_god(you.religion) ? 0 :
you.experience_level / 2)) > 3)
{
@@ -7160,6 +7152,9 @@ bool god_hates_attacking_friend(god_type god, int species)
bool god_likes_items(god_type god)
{
+ if (god_likes_fresh_corpses(god))
+ return (true);
+
switch (god)
{
case GOD_ZIN: case GOD_SHINING_ONE: case GOD_BEOGH: case GOD_NEMELEX_XOBEH:
@@ -7167,6 +7162,7 @@ bool god_likes_items(god_type god)
case GOD_NO_GOD: case NUM_GODS: case GOD_RANDOM: case GOD_NAMELESS:
mprf(MSGCH_ERROR, "Bad god, no biscuit! %d", static_cast<int>(god) );
+
default:
return (false);
}
@@ -7177,6 +7173,13 @@ static bool _god_likes_item(god_type god, const item_def& item)
if (!god_likes_items(god))
return (false);
+ if (god_likes_fresh_corpses(god))
+ {
+ return (item.base_type == OBJ_CORPSES
+ && item.sub_type == CORPSE_BODY
+ && !food_is_rotten(item));
+ }
+
switch (god)
{
case GOD_ZIN:
@@ -7224,93 +7227,107 @@ static void _give_sac_group_feedback(int which)
}
// God effects of sacrificing one item from a stack (e.g., a weapon, one
-// out of 20 arrows, etc.) Does not modify the actual item in any way.
+// out of 20 arrows, etc.). Does not modify the actual item in any way.
static piety_gain_t _sacrifice_one_item_noncount(const item_def& item)
{
piety_gain_t relative_piety_gain = PIETY_NONE;
- // item_value() multiplies by quantity.
- const int value = item_value(item) / item.quantity;
-
- switch (you.religion)
- {
- case GOD_SHINING_ONE:
- gain_piety(1);
- relative_piety_gain = PIETY_SOME;
- break;
-
- case GOD_BEOGH:
+ if (god_likes_fresh_corpses(you.religion))
{
- const int item_orig = item.orig_monnum - 1;
-
- int chance = 4;
-
- if (item_orig == MONS_SAINT_ROKA)
- chance += 12;
- else if (item_orig == MONS_ORC_HIGH_PRIEST)
- chance += 8;
- else if (item_orig == MONS_ORC_PRIEST)
- chance += 4;
-
- if (food_is_rotten(item))
- chance--;
- else if (item.sub_type == CORPSE_SKELETON)
- chance -= 2;
-
- if (x_chance_in_y(chance, 20))
+ if (x_chance_in_y(13, 19))
{
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))
+ else
+ {
+ switch (you.religion)
{
- you.attribute[ATTR_CARD_COUNTDOWN]--;
-#if DEBUG_DIAGNOSTICS || DEBUG_CARDS || DEBUG_SACRIFICE
- mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d",
- you.attribute[ATTR_CARD_COUNTDOWN]);
-#endif
- }
- // Nemelex piety gain is fairly fast... at least
- // when you have low piety.
- if (item.base_type == OBJ_CORPSES && one_chance_in(2 + you.piety/50)
- || x_chance_in_y(value/2 + 1, 30 + you.piety/2))
+ case GOD_SHINING_ONE:
+ gain_piety(1);
+ relative_piety_gain = PIETY_SOME;
+ break;
+
+ case GOD_BEOGH:
{
- if (is_artefact(item))
- {
- gain_piety(2);
- relative_piety_gain = PIETY_LOTS;
- }
- else
+ const int item_orig = item.orig_monnum - 1;
+
+ int chance = 4;
+
+ if (item_orig == MONS_SAINT_ROKA)
+ chance += 12;
+ else if (item_orig == MONS_ORC_HIGH_PRIEST)
+ chance += 8;
+ else if (item_orig == MONS_ORC_PRIEST)
+ chance += 4;
+
+ if (food_is_rotten(item))
+ chance--;
+ else if (item.sub_type == CORPSE_SKELETON)
+ chance -= 2;
+
+ if (x_chance_in_y(chance, 20))
{
gain_piety(1);
relative_piety_gain = PIETY_SOME;
}
+ break;
}
- if (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK
- || is_blood_potion(item))
- {
- // Count chunks and blood potions towards decks of Summoning.
- you.sacrifice_value[OBJ_CORPSES] += value;
- }
- else if (item.base_type == OBJ_CORPSES)
+ case GOD_NEMELEX_XOBEH:
{
+ // item_value() multiplies by quantity.
+ const int value = item_value(item) / item.quantity;
+
+ if (you.attribute[ATTR_CARD_COUNTDOWN] && x_chance_in_y(value, 800))
+ {
+ you.attribute[ATTR_CARD_COUNTDOWN]--;
+#if DEBUG_DIAGNOSTICS || DEBUG_CARDS || DEBUG_SACRIFICE
+ mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d",
+ you.attribute[ATTR_CARD_COUNTDOWN]);
+#endif
+ }
+ // Nemelex piety gain is fairly fast... at least when you
+ // have low piety.
+ if (item.base_type == OBJ_CORPSES && one_chance_in(2 + you.piety/50)
+ || x_chance_in_y(value/2 + 1, 30 + you.piety/2))
+ {
+ if (is_artefact(item))
+ {
+ gain_piety(2);
+ relative_piety_gain = PIETY_LOTS;
+ }
+ else
+ {
+ gain_piety(1);
+ relative_piety_gain = PIETY_SOME;
+ }
+ }
+
+ if (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK
+ || is_blood_potion(item))
+ {
+ // Count chunks and blood potions towards decks of
+ // Summoning.
+ you.sacrifice_value[OBJ_CORPSES] += value;
+ }
+ else if (item.base_type == OBJ_CORPSES)
+ {
#if DEBUG_GIFTS || DEBUG_CARDS || DEBUG_SACRIFICE
- mprf(MSGCH_DIAGNOSTICS, "Corpse mass is %d",
- item_mass(item));
+ mprf(MSGCH_DIAGNOSTICS, "Corpse mass is %d",
+ item_mass(item));
#endif
- you.sacrifice_value[item.base_type] += item_mass(item);
+ you.sacrifice_value[item.base_type] += item_mass(item);
+ }
+ else
+ you.sacrifice_value[item.base_type] += value;
+ break;
}
- else
- you.sacrifice_value[item.base_type] += value;
- break;
- default:
- break;
+ default:
+ break;
+ }
}
return (relative_piety_gain);
@@ -7490,7 +7507,9 @@ void offer_items()
{
// Zin was handled above, and the other gods don't care about
// sacrifices.
- if (you.religion == GOD_SHINING_ONE)
+ if (god_likes_fresh_corpses(you.religion))
+ simple_god_message(" only cares about fresh corpses!");
+ else 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 about orcish remains!");
@@ -7746,13 +7765,17 @@ bool god_hates_killing(god_type god, const monsters* mon)
return (retval);
}
-bool god_likes_butchery(god_type god)
+bool god_likes_fresh_corpses(god_type god)
{
return (god == GOD_OKAWARU
|| god == GOD_MAKHLEB
|| god == GOD_TROG
- || god == GOD_LUGONU
- || (god == GOD_KIKUBAAQUDGHA && you.piety >= piety_breakpoint(4)));
+ || god == GOD_LUGONU);
+}
+
+bool god_likes_butchery(god_type god)
+{
+ return (god == GOD_KIKUBAAQUDGHA && you.piety >= piety_breakpoint(4));
}
bool god_hates_butchery(god_type god)
@@ -7850,10 +7873,10 @@ static void _god_smites_you(god_type god, const char *message,
}
}
-void offer_corpse(int corpse)
+void offer_and_butcher_corpse(int corpse)
{
// We always give the "good" (piety-gain) message when doing
- // dedicated butchery. Uh, call it a feature.
+ // dedicated butchery. Uh, call it a feature.
_print_sacrifice_message(you.religion, mitm[corpse], PIETY_SOME);
did_god_conduct(DID_DEDICATED_BUTCHERY, 10);
diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h
index 9aabab95a1..4583ac2095 100644
--- a/crawl-ref/source/religion.h
+++ b/crawl-ref/source/religion.h
@@ -77,7 +77,7 @@ void excommunication(god_type new_god = GOD_NO_GOD);
void gain_piety(int pgn);
void god_speaks(god_type god, const char *mesg);
void lose_piety(int pgn);
-void offer_corpse(int corpse);
+void offer_and_butcher_corpse(int corpse);
std::string god_prayer_reaction();
void pray();
void end_prayer();
@@ -93,6 +93,7 @@ std::string god_hates_your_god_reaction(god_type god,
god_type your_god = you.religion);
bool god_hates_cannibalism(god_type god);
bool god_hates_killing(god_type god, const monsters* mon);
+bool god_likes_fresh_corpses(god_type god);
bool god_likes_butchery(god_type god);
bool god_hates_butchery(god_type god);
harm_protection_type god_protects_from_harm(god_type god, bool actual = true);
diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc
index 55a96db776..0e552a2355 100644
--- a/crawl-ref/source/spells3.cc
+++ b/crawl-ref/source/spells3.cc
@@ -728,7 +728,8 @@ bool receive_corpses(int pow, coord_def where)
if (corpses_generated)
{
- simple_god_message(" delivers you corpses!");
+ simple_god_message(corpses_generated > 1 ? " delivers you corpses!"
+ : " delivers you a corpse!");
maybe_update_stashes();
return (true);
}