diff options
Diffstat (limited to 'crawl-ref/source/religion.cc')
-rw-r--r-- | crawl-ref/source/religion.cc | 655 |
1 files changed, 166 insertions, 489 deletions
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index ca4453b50e..37e25dee7f 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -74,111 +74,87 @@ #include "terrain.h" #include "tutorial.h" #include "view.h" -#include "xom.h" - -#if DEBUG_RELIGION -# define DEBUG_DIAGNOSTICS 1 -# define DEBUG_GIFTS 1 -# define DEBUG_SACRIFICE 1 -# define DEBUG_PIETY 1 -#endif // Item offer messages for the gods: // & is replaced by "is" or "are" as appropriate for the item. // % is replaced by "s" or "" as appropriate. -// First message is if there's no piety gain, second is if piety gain -// is one, third message is for piety gain > 1 (currently unused). -const char *sacrifice[NUM_GODS][3] = +// First message is if there's no piety gain, second is if there is. +const char *sacrifice[NUM_GODS][2] = { // No god { " & eaten by a bored swarm of bugs.", - " & eaten by a swarm of bugs.", " & eaten by a ravening swarm of bugs." }, // Zin { - " barely glow% and disappear%.", - " glow% silver and disappear%.", - " glow% blindingly silver and disappear%.", + " faintly glow% silver and disappear%.", + " glow% silver and disappear%.", }, // TSO { - " faintly glow% and disappear%.", - " glow% a golden colour and disappear%.", - " glow% a brilliant golden colour and disappear%.", + " glow% a golden colour and disappear%.", + " glow% a brilliant golden colour and disappear%.", }, // Kikubaaqudgha { - " slowly rot% away.", - " rot% away.", - " rot% away in an instant.", + " slowly rot% away.", + " rot% away in an instant.", }, // Yredelemnul { " slowly crumble% to dust.", " crumble% to dust.", - " turn% to dust in an instant.", }, // Xom (no sacrifices) { " & eaten by a bored bug.", " & eaten by a bug.", - " & eaten by a greedy bug.", }, // Vehumet { - " fade% into nothingness.", - " burn% into nothingness.", - " explode% into nothingness.", + " burn% into nothingness.", + " explode% into nothingness.", }, // Okawaru { - " slowly burn% to ash.", - " & consumed by flame.", - " & consumed in a burst of flame.", + " & consumed by flame.", + " & consumed in a burst of flame.", }, // Makhleb { - " disappear% without a sign.", - " flare% red and disappear%.", - " flare% blood-red and disappear%.", + " flare% red and disappear%.", + " flare% blood-red and disappear%.", }, // Sif Muna { - " & gone without a glow.", - " glow% faintly for a moment, and & gone.", - " glow% for a moment, and & gone.", + " glow% very faintly for a moment, and & gone.", + " glow% faintly for a moment, and & gone.", }, // Trog { - " & slowly consumed by flames.", - " & consumed in a column of flame.", - " & consumed in a roaring column of flame.", + " & consumed in a column of flame.", + " & consumed in a roaring column of flame.", }, // Nemelex { - " disappear% without a glow.", - " glow% slightly and disappear%.", - " glow% with a rainbow of weird colours and disappear%.", + " glow% slightly and disappear%.", + " glow% with a rainbow of weird colours and disappear%.", }, // Elyvilon { - " slowly evaporate%.", - " evaporate%.", - " glow% and evaporate%.", + " slowly evaporate%.", + " evaporate%.", }, // Lugonu { - " & disappears into the void.", - " & consumed by the void.", - " & voraciously consumed by the void.", + " & disappears into the void.", + " & consumed by the void.", }, // Beogh { - " slowly crumble% into the ground.", - " crumble% into the ground.", - " disintegrate% into the ground.", + " slowly crumble% into the ground.", + " crumble% into the ground.", } }; @@ -242,10 +218,10 @@ const char* god_gain_power_messages[NUM_GODS][MAX_GOD_ABILITIES] = "call in reinforcement", "" }, // Nemelex - { "peek at three random cards from a deck", + { "peek at the first card of a deck", "draw cards from decks in your inventory", "choose one out of three cards", - "mark decks", + "", "order the the top five cards of a deck, forfeiting the rest" }, // Elyvilon { "call upon Elyvilon for minor healing", @@ -328,10 +304,10 @@ const char* god_lose_power_messages[NUM_GODS][MAX_GOD_ABILITIES] = "call in reinforcement", "" }, // Nemelex - { "peek at three random cards from a deck", + { "peek at the first card of a deck", "draw cards from decks in your inventory", "choose one out of three cards", - "mark decks", + "", "order decks" }, // Elyvilon { "call upon Elyvilon for minor healing", @@ -360,7 +336,7 @@ void inc_penance(int god, int val); void inc_penance(int val); static bool followers_abandon_you(void); // Beogh -bool is_evil_god(god_type god) +static bool is_evil_god(god_type god) { return god == GOD_KIKUBAAQUDGHA || @@ -371,7 +347,7 @@ bool is_evil_god(god_type god) god == GOD_LUGONU; } -bool is_good_god(god_type god) +static bool is_good_god(god_type god) { return god == GOD_SHINING_ONE || @@ -396,9 +372,6 @@ void dec_penance(god_type god, int val) { if (you.penance[god] > 0) { -#if DEBUG_PIETY - mprf(MSGCH_DIAGNOSTICS, "Decreasing penance by %d", val); -#endif if (you.penance[god] <= val) { simple_god_message(" seems mollified.", god); @@ -449,45 +422,20 @@ static void inc_gift_timeout(int val) you.gift_timeout += val; } // end inc_gift_timeout() -// Only Yredelemnul and Okawaru use this for now -static monster_type random_servant(god_type god) +static monster_type random_undead_servant(int religion /* unused */) { // error trapping {dlb} monster_type thing_called = MONS_PROGRAM_BUG; int temp_rand = random2(100); - - switch (god) - { - case GOD_YREDELEMNUL: - // undead - thing_called = ((temp_rand > 66) ? MONS_WRAITH : // 33% - (temp_rand > 52) ? MONS_WIGHT : // 12% - (temp_rand > 40) ? MONS_SPECTRAL_WARRIOR : // 16% - (temp_rand > 31) ? MONS_ROTTING_HULK : // 9% - (temp_rand > 23) ? MONS_SKELETAL_WARRIOR : // 8% - (temp_rand > 16) ? MONS_VAMPIRE : // 7% - (temp_rand > 10) ? MONS_GHOUL : // 6% - (temp_rand > 4) ? MONS_MUMMY // 6% - : MONS_FLAYED_GHOST); // 5% - break; - case GOD_OKAWARU: - // warriors - thing_called = ((temp_rand > 84) ? MONS_ORC_WARRIOR : - (temp_rand > 69) ? MONS_ORC_KNIGHT : - (temp_rand > 59) ? MONS_NAGA_WARRIOR : - (temp_rand > 49) ? MONS_CENTAUR_WARRIOR : - (temp_rand > 39) ? MONS_STONE_GIANT : - (temp_rand > 29) ? MONS_FIRE_GIANT : - (temp_rand > 19) ? MONS_FROST_GIANT : - (temp_rand > 9) ? MONS_CYCLOPS : - (temp_rand > 4) ? MONS_HILL_GIANT - : MONS_TITAN); - - break; - default: - break; - } - + thing_called = ((temp_rand > 66) ? MONS_WRAITH : // 33% + (temp_rand > 52) ? MONS_WIGHT : // 12% + (temp_rand > 40) ? MONS_SPECTRAL_WARRIOR : // 16% + (temp_rand > 31) ? MONS_ROTTING_HULK : // 9% + (temp_rand > 23) ? MONS_SKELETAL_WARRIOR : // 8% + (temp_rand > 16) ? MONS_VAMPIRE : // 7% + (temp_rand > 10) ? MONS_GHOUL : // 6% + (temp_rand > 4) ? MONS_MUMMY // 6% + : MONS_FLAYED_GHOST); // 5% return (thing_called); } @@ -539,193 +487,11 @@ static bool need_missile_gift() && ammo_count(launcher) < 20 + random2(35)); } -static void get_pure_deck_weights(int weights[]) -{ - weights[0] = you.sacrifice_value[OBJ_ARMOUR] + 1; - weights[1] = you.sacrifice_value[OBJ_WEAPONS] + - you.sacrifice_value[OBJ_STAVES] + - you.sacrifice_value[OBJ_MISSILES] + 1; - weights[2] = you.sacrifice_value[OBJ_MISCELLANY] + - you.sacrifice_value[OBJ_JEWELLERY] + - you.sacrifice_value[OBJ_BOOKS] + - you.sacrifice_value[OBJ_GOLD]; - weights[3] = you.sacrifice_value[OBJ_CORPSES] / 2; - weights[4] = you.sacrifice_value[OBJ_POTIONS] + - you.sacrifice_value[OBJ_SCROLLS] + - you.sacrifice_value[OBJ_WANDS] + - you.sacrifice_value[OBJ_FOOD]; -} - -static void update_sacrifice_weights(int which) -{ - switch ( which ) - { - case 0: - you.sacrifice_value[OBJ_ARMOUR] /= 5; - you.sacrifice_value[OBJ_ARMOUR] *= 4; - break; - case 1: - you.sacrifice_value[OBJ_WEAPONS] /= 5; - you.sacrifice_value[OBJ_STAVES] /= 5; - you.sacrifice_value[OBJ_MISSILES] /= 5; - you.sacrifice_value[OBJ_WEAPONS] *= 4; - you.sacrifice_value[OBJ_STAVES] *= 4; - you.sacrifice_value[OBJ_MISSILES] *= 4; - break; - case 2: - you.sacrifice_value[OBJ_MISCELLANY] /= 5; - you.sacrifice_value[OBJ_JEWELLERY] /= 5; - you.sacrifice_value[OBJ_BOOKS] /= 5; - you.sacrifice_value[OBJ_GOLD] /= 5; - you.sacrifice_value[OBJ_MISCELLANY] *= 4; - you.sacrifice_value[OBJ_JEWELLERY] *= 4; - you.sacrifice_value[OBJ_BOOKS] *= 4; - you.sacrifice_value[OBJ_GOLD] *= 4; - case 3: - you.sacrifice_value[OBJ_CORPSES] /= 5; - you.sacrifice_value[OBJ_CORPSES] *= 4; - break; - case 4: - you.sacrifice_value[OBJ_POTIONS] /= 5; - you.sacrifice_value[OBJ_SCROLLS] /= 5; - you.sacrifice_value[OBJ_WANDS] /= 5; - you.sacrifice_value[OBJ_FOOD] /= 5; - you.sacrifice_value[OBJ_POTIONS] *= 4; - you.sacrifice_value[OBJ_SCROLLS] *= 4; - you.sacrifice_value[OBJ_WANDS] *= 4; - you.sacrifice_value[OBJ_FOOD] *= 4; - break; - } -} - -#if DEBUG_GIFTS || DEBUG_CARDS -static void show_pure_deck_chances() -{ - int weights[5]; - - get_pure_deck_weights(weights); - - float total = (float) (weights[0] + weights[1] + weights[2] + weights[3] + - weights[4]); - - mprf(MSGCH_DIAGNOSTICS, "Pure cards chances: " - "escape %0.2f%%, destruction %0.2f%%, dungeons %0.2f%%," - "summoning %0.2f%%, wonders %0.2f%%", - (float)weights[0] / total * 100.0, - (float)weights[1] / total * 100.0, - (float)weights[2] / total * 100.0, - (float)weights[3] / total * 100.0, - (float)weights[4] / total * 100.0); -} -#endif - -static void give_nemelex_gift() -{ - if ( grid_destroys_items(grd[you.x_pos][you.y_pos]) ) - return; - - // Nemelex will give at least one gift early. - if ((you.num_gifts[GOD_NEMELEX_XOBEH] == 0 - && random2(piety_breakpoint(1)) < you.piety) || - (random2(MAX_PIETY) <= you.piety - && one_chance_in(3) - && !you.attribute[ATTR_CARD_COUNTDOWN])) - { - misc_item_type gift_type; - if ( random2(MAX_PIETY) <= you.piety ) - { - // make a pure deck - const misc_item_type pure_decks[] = { - MISC_DECK_OF_ESCAPE, - MISC_DECK_OF_DESTRUCTION, - MISC_DECK_OF_DUNGEONS, - MISC_DECK_OF_SUMMONING, - MISC_DECK_OF_WONDERS - }; - int weights[5]; - get_pure_deck_weights(weights); - const int choice = choose_random_weighted(weights, weights+5); - gift_type = pure_decks[choice]; -#if DEBUG_GIFTS || DEBUG_CARDS - show_pure_deck_chances(); -#endif - update_sacrifice_weights(choice); - } - else - { - // make a mixed deck - const misc_item_type mixed_decks[] = { - MISC_DECK_OF_WAR, - MISC_DECK_OF_CHANGES, - MISC_DECK_OF_DEFENSE - }; - gift_type = RANDOM_ELEMENT(mixed_decks); - } - - int thing_created = items( 1, OBJ_MISCELLANY, gift_type, - true, 1, MAKE_ITEM_RANDOM_RACE ); - - if (thing_created != NON_ITEM) - { - // Piety|Common | Rare |Legendary - // -------------------------------- - // 0: 95.00%, 5.00%, 0.00% - // 20: 86.00%, 10.50%, 3.50% - // 40: 77.00%, 16.00%, 7.00% - // 60: 68.00%, 21.50%, 10.50% - // 80: 59.00%, 27.00%, 14.00% - // 100: 50.00%, 32.50%, 17.50% - // 120: 41.00%, 38.00%, 21.00% - // 140: 32.00%, 43.50%, 24.50% - // 160: 23.00%, 49.00%, 28.00% - // 180: 14.00%, 54.50%, 31.50% - // 200: 5.00%, 60.00%, 35.00% - int common_weight = 95 - (90 * you.piety / MAX_PIETY); - int rare_weight = 5 + (55 * you.piety / MAX_PIETY); - int legend_weight = 0 + (35 * you.piety / MAX_PIETY); - - deck_rarity_type rarity = static_cast<deck_rarity_type>( - random_choose_weighted(common_weight, - DECK_RARITY_COMMON, - rare_weight, - DECK_RARITY_RARE, - legend_weight, - DECK_RARITY_LEGENDARY, - 0)); - - item_def &deck(mitm[thing_created]); - - deck.special = rarity; - deck.colour = deck_rarity_to_color(rarity); - - move_item_to_grid( &thing_created, you.x_pos, you.y_pos ); - origin_acquired(deck, you.religion); - - simple_god_message(" grants you a gift!"); - more(); - canned_msg(MSG_SOMETHING_APPEARS); - - you.attribute[ATTR_CARD_COUNTDOWN] = 10; - inc_gift_timeout(5 + random2avg(9, 2)); - you.num_gifts[you.religion]++; - take_note(Note(NOTE_GOD_GIFT, you.religion)); - } - } -} - static void do_god_gift(bool prayed_for) { - ASSERT(you.religion != GOD_NO_GOD); - // Zin worshippers are the only ones that can pray to ask Zin for stuff. if (prayed_for != (you.religion == GOD_ZIN)) return; - - god_acting gdact; - -#if DEBUG_DIAGNOSTICS || DEBUG_GIFTS - int old_gifts = you.num_gifts[ you.religion ]; -#endif // Consider a gift if we don't have a timeout and weren't // already praying when we prayed. @@ -753,7 +519,66 @@ static void do_god_gift(bool prayed_for) break; case GOD_NEMELEX_XOBEH: - give_nemelex_gift(); + if (random2(200) <= you.piety + && one_chance_in(3) + && !you.attribute[ATTR_CARD_COUNTDOWN] + && !grid_destroys_items(grd[you.x_pos][you.y_pos])) + { + misc_item_type gift_type; + if ( random2(200) <= you.piety ) + { + // make a pure deck + const misc_item_type pure_decks[] = { + MISC_DECK_OF_ESCAPE, + MISC_DECK_OF_DESTRUCTION, + MISC_DECK_OF_DUNGEONS, + MISC_DECK_OF_SUMMONING, + MISC_DECK_OF_WONDERS + }; + int weights[5]; + // FIXME do something with OBJ_FOOD, + // OBJ_WANDS, OBJ_JEWELLERY, OBJ_BOOKS + // (and maybe OBJ_ORBS...) + weights[0] = you.sacrifice_value[OBJ_SCROLLS] + + you.sacrifice_value[OBJ_ARMOUR] + 1; + weights[1] = you.sacrifice_value[OBJ_WEAPONS] + + you.sacrifice_value[OBJ_STAVES] + + you.sacrifice_value[OBJ_MISSILES] + 1; + weights[2] = you.sacrifice_value[OBJ_MISCELLANY]; + weights[3] = you.sacrifice_value[OBJ_CORPSES] * 100; + weights[4] = you.sacrifice_value[OBJ_POTIONS]; + gift_type = pure_decks[choose_random_weighted(weights, + weights+5)]; + } + else + { + // make a mixed deck + const misc_item_type mixed_decks[] = { + MISC_DECK_OF_WAR, + MISC_DECK_OF_CHANGES, + MISC_DECK_OF_DEFENSE + }; + gift_type = RANDOM_ELEMENT(mixed_decks); + } + + int thing_created = items( 1, OBJ_MISCELLANY, gift_type, + true, 1, MAKE_ITEM_RANDOM_RACE ); + + if (thing_created != NON_ITEM) + { + move_item_to_grid( &thing_created, you.x_pos, you.y_pos ); + origin_acquired(mitm[thing_created], you.religion); + + simple_god_message(" grants you a gift!"); + more(); + canned_msg(MSG_SOMETHING_APPEARS); + + you.attribute[ATTR_CARD_COUNTDOWN] = 10; + inc_gift_timeout(5 + random2avg(9, 2)); + you.num_gifts[you.religion]++; + take_note(Note(NOTE_GOD_GIFT, you.religion)); + } + } break; case GOD_OKAWARU: @@ -807,12 +632,13 @@ static void do_god_gift(bool prayed_for) case GOD_YREDELEMNUL: if (random2(you.piety) > 80 && one_chance_in(5)) { - monster_type thing_called = - random_servant(GOD_YREDELEMNUL); + monster_type thing_called = + random_undead_servant(GOD_YREDELEMNUL); - if (create_monster(thing_called, 0, BEH_FRIENDLY, - you.x_pos, you.y_pos, you.pet_target, - MAKE_ITEM_RANDOM_RACE) != -1) + if (create_monster( thing_called, 0, BEH_FRIENDLY, + you.x_pos, you.y_pos, + you.pet_target, MAKE_ITEM_RANDOM_RACE ) + != -1) { simple_god_message(" grants you an undead servant!"); more(); @@ -911,12 +737,6 @@ static void do_god_gift(bool prayed_for) break; } } // end of gift giving - -#if DEBUG_DIAGNOSTICS || DEBUG_GIFTS - if (old_gifts < you.num_gifts[ you.religion ]) - mprf(MSGCH_DIAGNOSTICS, "Total number of gifts from this god: %d", - you.num_gifts[ you.religion ] ); -#endif } static bool is_risky_sacrifice(const item_def& item) @@ -1234,8 +1054,7 @@ void god_speaks( god_type god, const char *mesg ) // This function is the merger of done_good() and naughty(). // Returns true if god was interested (good or bad) in conduct. -bool did_god_conduct( conduct_type thing_done, int level, bool known, - const actor *victim ) +bool did_god_conduct( conduct_type thing_done, int level, const actor *victim ) { bool ret = false; int piety_change = 0; @@ -1244,44 +1063,16 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, if (you.religion == GOD_NO_GOD || you.religion == GOD_XOM) return (false); - god_acting gdact; - switch (thing_done) { case DID_DRINK_BLOOD: switch (you.religion) { - case GOD_SHINING_ONE: - if (!known) - { - simple_god_message(" did not appreciate that!"); - break; - } - penance = level; - // deliberate fall-through - case GOD_ZIN: - case GOD_ELYVILON: - if (!known) - { - simple_god_message(" did not appreciate that!"); - break; - } - piety_change = -2*level; - ret = true; - break; - default: - break; - } - break; - - case DID_CANNIBALISM: - switch (you.religion) - { case GOD_ZIN: case GOD_SHINING_ONE: case GOD_ELYVILON: - piety_change = -level; - penance = level; + // no penance as this can happen accidentally + piety_change = -2*level; ret = true; break; default: @@ -1289,7 +1080,7 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, } break; - // If you make some god like these acts, modify did_god_conduct call + // If you make some god like these acts, modify did_god_conduct call // in beam.cc with god_likes_necromancy check or something similar case DID_NECROMANCY: case DID_UNHOLY: @@ -1299,14 +1090,8 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, case GOD_ZIN: case GOD_SHINING_ONE: case GOD_ELYVILON: - if (!known && thing_done != DID_ATTACK_HOLY) - { - simple_god_message(" did not appreciate that!"); - break; - } piety_change = -level; - if (known) - penance = level * ((you.religion == GOD_SHINING_ONE) ? 2 : 1); + penance = level * ((you.religion == GOD_ZIN) ? 2 : 1); ret = true; break; default: @@ -1337,8 +1122,7 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, (victim && mons_species(victim->id()) == MONS_ORC)) { piety_change = -level; - if (known) - penance = level * 3; + penance = level * 3; ret = true; } break; @@ -1643,31 +1427,6 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, { piety_change = level; ret = true; - - // For a stacked deck, 0% chance of card countdown decrement - // drawing a card which doesn't use up the deck, and 40% - // on a card which does. For a non-stacked deck, an - // average 50% of decrement for drawing a card which doesn't - // use up the deck, and 80% on a card which does use up the - // deck. - int chance = 0; - switch(level) - { - case 0: chance = 0; break; - case 1: chance = 40; break; - case 2: chance = 70; break; - default: - case 3: chance = 100; break; - } - - if (random2(100) < chance && you.attribute[ATTR_CARD_COUNTDOWN]) - { - you.attribute[ATTR_CARD_COUNTDOWN]--; -#if DEBUG_DIAGNOSTICS || DEBUG_CARDS || DEBUG_GIFTS - mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d", - you.attribute[ATTR_CARD_COUNTDOWN]); -#endif - } } break; @@ -1719,12 +1478,13 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, "Necromancy", "Unholy", "Attack Holy", "Attack Friend", "Friend Died", "Stab", "Poison", "Field Sacrifice", "Kill Living", "Kill Undead", "Kill Demon", "Kill Natural Evil", - "Kill Wizard", "Kill Priest", "Kill Angel", "Undead Slave Kill Living", - "Servant Kill Living", "Servant Kill Undead", "Servant Kill Demon", - "Servant Kill Natural Evil", "Servant Kill Angel", + "Kill Wizard", + "Kill Priest", "Kill Angel", "Undead Slave Kill Living", + "Servant Kill Living", "Servant Kill Undead", + "Servant Kill Demon", "Servant Kill Natural Evil", + "Servant Kill Angel", "Spell Memorise", "Spell Cast", "Spell Practise", "Spell Nonutility", - "Cards", "Stimulants", "Drink Blood", "Cannibalism", "Eat Meat", - "Create Life" + "Cards", "Stimulants", "Drink Blood", "Eat Meat", "Create Life" }; ASSERT(ARRAYSIZE(conducts) == NUM_CONDUCTS); @@ -1742,7 +1502,7 @@ bool did_god_conduct( conduct_type thing_done, int level, bool known, void gain_piety(int pgn) { // Xom uses piety differently... - if (you.religion == GOD_XOM || you.religion == GOD_NO_GOD) + if (you.religion == GOD_XOM) return; // check to see if we owe anything first @@ -1761,22 +1521,13 @@ void gain_piety(int pgn) // Slow down piety gain to account for the fact that gifts // no longer have a piety cost for getting them if (!one_chance_in(4)) - { -#if DEBUG_PIETY - mprf(MSGCH_DIAGNOSTICS, "Piety slowdown due to gift timeout."); -#endif return; - } } -#if DEBUG_PIETY - mprf(MSGCH_DIAGNOSTICS, "Piety increasing by %d", pgn); -#endif - // slow down gain at upper levels of piety if (you.religion != GOD_SIF_MUNA) { - if (you.piety >= MAX_PIETY + if (you.piety > 199 || (you.piety > 150 && one_chance_in(3)) || (you.piety > 100 && one_chance_in(3))) { @@ -1788,7 +1539,7 @@ void gain_piety(int pgn) { // Sif Muna has a gentler taper off because training becomes // naturally slower as the player gains in spell skills. - if ((you.piety >= MAX_PIETY) || + if ((you.piety > 199) || (you.piety > 150 && one_chance_in(5))) { do_god_gift(false); @@ -1799,8 +1550,6 @@ void gain_piety(int pgn) int old_piety = you.piety; you.piety += pgn; - if (you.piety > MAX_PIETY) - you.piety = MAX_PIETY; for ( int i = 0; i < MAX_GOD_ABILITIES; ++i ) { @@ -1853,24 +1602,11 @@ static bool need_water_walking() grd[you.x_pos][you.y_pos] == DNGN_DEEP_WATER; } -static bool is_evil_weapon(item_def weap) -{ - if (weap.base_type != OBJ_WEAPONS) - return false; - - return (is_demonic(weap) - || weap.special == SPWPN_VAMPIRICISM - || weap.special == SPWPN_PAIN - || weap.special == SPWPN_DRAINING); -} - bool ely_destroy_weapons() { if (you.religion != GOD_ELYVILON) return false; - - god_acting gdact; - + bool success = false; int i = igrd[you.x_pos][you.y_pos]; while (i != NON_ITEM) @@ -1891,8 +1627,7 @@ bool ely_destroy_weapons() #endif bool pgain = false; - if (is_evil_weapon(mitm[i]) - || random2(value) >= random2(250) // artefacts (incl. most randarts) + if (random2(value) >= random2(250) // artefacts (incl. most randarts) || random2(value) >= random2(100) && one_chance_in(1 + you.piety/50) || (mitm[i].base_type == OBJ_WEAPONS && (you.piety < 30 || player_under_penance()))) @@ -1900,18 +1635,7 @@ bool ely_destroy_weapons() pgain = true; gain_piety(1); } - - std::ostream& strm = msg::streams(MSGCH_GOD); - strm << mitm[i].name(DESC_CAP_THE); - - if (!pgain) - strm << " barely"; - - if ( mitm[i].quantity == 1 ) - strm << " shimmers and breaks into pieces." << std::endl; - else - strm << " shimmer and break into pieces." << std::endl; - + std::ostream& strm = msg::streams(MSGCH_GOD); strm << mitm[i].name(DESC_CAP_THE); @@ -1932,6 +1656,7 @@ bool ely_destroy_weapons() { mpr("There are no weapons here to destroy!"); } + return success; } @@ -1941,8 +1666,6 @@ bool trog_burn_books() if (you.religion != GOD_TROG) return (false); - god_acting gdact; - int i = igrd[you.x_pos][you.y_pos]; while (i != NON_ITEM) { @@ -2047,6 +1770,7 @@ bool trog_burn_books() simple_god_message(" is delighted!", GOD_TROG); gain_piety(totalpiety); } + return (true); } @@ -2054,10 +1778,6 @@ void lose_piety(int pgn) { const int old_piety = you.piety; -#if DEBUG_PIETY - mprf(MSGCH_DIAGNOSTICS, "Piety decreasing by %d", pgn); -#endif - if (you.piety - pgn < 0) you.piety = 0; else @@ -2165,10 +1885,9 @@ static bool zin_retribution() if (!is_evil_god(you.religion)) return false; - bool success = false; - if (random2(you.experience_level) > 7 && !one_chance_in(5)) { + bool success = false; const int how_many = 1 + (you.experience_level / 10) + random2(3); for (int i = 0; i < how_many; i++) @@ -2185,11 +1904,8 @@ static bool zin_retribution() else { // god_gift == false gives unfriendly - success = summon_swarm( you.experience_level * 20, true, false ); - simple_god_message(success ? - " sends a plague down upon you!" : - "'s plague fails to arrive.", - god); + summon_swarm( you.experience_level * 20, true, false ); + simple_god_message(" sends a plague down upon you!", god); } return false; @@ -2273,11 +1989,13 @@ static bool yredelemnul_retribution() for (int i = 0; i < how_many; i++) { - monster_type punisher = random_servant(GOD_YREDELEMNUL); + monster_type punisher = + random_undead_servant(GOD_YREDELEMNUL); - if (create_monster(punisher, 0, BEH_HOSTILE, - you.x_pos, you.y_pos, MHITYOU, 250) != -1) + if (create_monster( punisher, 0, BEH_HOSTILE, + you.x_pos, you.y_pos, MHITYOU, 250 ) != -1) count++; + } simple_god_message(count > 1? " sends servants to punish you." : @@ -2303,7 +2021,7 @@ static bool trog_retribution() { // Would be better if berserking monsters were available, // we just send some big bruisers for now. - int count = 0; + bool success = false; int points = 3 + you.experience_level * 3; while (points > 0) @@ -2333,12 +2051,13 @@ static bool trog_retribution() if (create_monster(punisher, 0, BEH_HOSTILE, you.x_pos, you.y_pos, MHITYOU, 250) != -1) - count++; + success = true; } - - simple_god_message(count > 1 ? " sends monsters to punish you." : - count > 0 ? " sends a monster to punish you." : - " has no time to punish you...now.", god); + + simple_god_message(success ? + " sends monsters to punish you." : + " has no time to punish you...now.", + god); } else if ( !one_chance_in(3) ) { @@ -2356,8 +2075,7 @@ static bool trog_retribution() case 1: case 2: - lose_stat(STAT_STRENGTH, 1 + random2(you.strength / 5), true, - "divine retribution from Trog"); + lose_stat(STAT_STRENGTH, 1 + random2(you.strength / 5), true); break; case 3: @@ -2526,7 +2244,18 @@ static bool okawaru_retribution() for (int i = 0; i < how_many; i++) { - monster_type punisher = random_servant(GOD_OKAWARU); + const int temp_rand = random2(100); + + monster_type punisher = ((temp_rand > 84) ? MONS_ORC_WARRIOR : + (temp_rand > 69) ? MONS_ORC_KNIGHT : + (temp_rand > 59) ? MONS_NAGA_WARRIOR : + (temp_rand > 49) ? MONS_CENTAUR_WARRIOR : + (temp_rand > 39) ? MONS_STONE_GIANT : + (temp_rand > 29) ? MONS_FIRE_GIANT : + (temp_rand > 19) ? MONS_FROST_GIANT : + (temp_rand > 9) ? MONS_CYCLOPS : + (temp_rand > 4) ? MONS_HILL_GIANT + : MONS_TITAN); if (create_monster(punisher, 0, BEH_HOSTILE, you.x_pos, you.y_pos, MHITYOU, 250) != -1) @@ -2553,8 +2282,7 @@ static bool sif_muna_retribution() { case 0: case 1: - lose_stat(STAT_INTELLIGENCE, 1 + random2( you.intel / 5 ), true, - "divine retribution from Sif Muna"); + lose_stat(STAT_INTELLIGENCE, 1 + random2( you.intel / 5 ), true); break; case 2: @@ -2680,8 +2408,6 @@ void divine_retribution( god_type god ) if (god == you.religion && is_good_god(god) ) return; - god_acting gdact(god, true); - bool do_more = true; switch (god) { @@ -2751,7 +2477,7 @@ bool followers_abandon_you() { for ( int x = xstart; x < xend; ++x ) { - const unsigned short targ_monst = mgrd[x][y]; + const unsigned char targ_monst = mgrd[x][y]; if ( targ_monst != NON_MONSTER ) { monsters *monster = &menv[targ_monst]; @@ -2821,8 +2547,6 @@ bool followers_abandon_you() // Destroying orcish idols (a.k.a. idols of Beogh) may anger Beogh void beogh_idol_revenge() { - god_acting gdact(GOD_BEOGH, true); - // Beogh watches his charges closely, but for others doesn't always notice if (you.religion == GOD_BEOGH || (you.species == SP_HILL_ORC && coinflip()) @@ -2981,7 +2705,6 @@ void beogh_convert_orc(monsters *orc, bool emergency) void excommunication(void) { const god_type old_god = you.religion; - god_acting gdact(old_god, true); take_note(Note(NOTE_LOSE_GOD, old_god)); @@ -3137,8 +2860,6 @@ void altar_prayer(void) if (you.religion == GOD_XOM) return; - god_acting gdact; - // TSO blesses long swords with holy wrath if (you.religion == GOD_SHINING_ONE && !you.num_gifts[GOD_SHINING_ONE] @@ -3237,10 +2958,7 @@ void offer_items() if (you.religion == GOD_NO_GOD || !god_likes_items(you.religion)) return; - god_acting gdact; - - int num_sacced = 0; - int i = igrd[you.x_pos][you.y_pos]; + int i = igrd[you.x_pos][you.y_pos]; while (i != NON_ITEM) { item_def &item(mitm[i]); @@ -3248,7 +2966,7 @@ void offer_items() const int value = item_value( item, true ); - if (item_is_stationary(item) || !god_likes_item(you.religion, item)) + if (item_is_stationary(item) || !god_likes_item(you.religion, mitm[i])) { i = next; continue; @@ -3256,7 +2974,7 @@ void offer_items() bool gained_piety = false; -#if DEBUG_DIAGNOSTICS || DEBUG_SACRIFICE +#ifdef DEBUG_DIAGNOSTICS mprf(MSGCH_DIAGNOSTICS, "Sacrifice item value: %d", value); #endif @@ -3277,49 +2995,22 @@ void offer_items() } } + you.sacrifice_value[mitm[i].base_type] += value; if (you.attribute[ATTR_CARD_COUNTDOWN] && random2(800) < value) { you.attribute[ATTR_CARD_COUNTDOWN]--; -#if DEBUG_DIAGNOSTICS || DEBUG_CARDS || DEBUG_SACRIFICE +#ifdef DEBUG_DIAGNOSTICS mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d", you.attribute[ATTR_CARD_COUNTDOWN]); #endif } - // Aproximate piety gain chance. - // Value: % - // --------- - // 10: 9.0% - // 20: 17.5% - // 30: 25.5% - // 40: 34.0% - // 50: 42.5% - // 60: 50.0% - // 70: 58.0% - // 80: 63.0% - if ((item.base_type == OBJ_CORPSES && - one_chance_in(2+you.piety/50)) - // Nemelex piety gain is fairly fast...at least - // when you have low piety. - || value/2 >= random2(30 + you.piety/2)) + if ((mitm[i].base_type == OBJ_CORPSES && coinflip()) + // Nemelex piety gain is fairly fast. + || random2(value) >= random2(60)) { gain_piety(1); gained_piety = true; } - - if (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK) - // No sacrifice value for chunks of flesh, since food - // value goes towards decks of wonder. - ; - else if (item.base_type == OBJ_CORPSES) - { -#if DEBUG_GIFTS || DEBUG_CARDS || DEBUG_SACRIFICE - mprf(MSGCH_DIAGNOSTICS, "Corpse mass is %d", - item_mass(item)); -#endif - you.sacrifice_value[item.base_type] += item_mass(item); - } - else - you.sacrifice_value[item.base_type] += value; break; case GOD_ZIN: @@ -3356,16 +3047,9 @@ void offer_items() << sacrifice_message(you.religion, mitm[i], gained_piety) << std::endl; - item_was_destroyed(mitm[i]); destroy_item(i); i = next; - num_sacced++; } - -#if DEBUG_GIFTS || DEBUG_CARDS || DEBUG_SACRIFICE - if (num_sacced > 0 && you.religion == GOD_NEMELEX_XOBEH) - show_pure_deck_chances(); -#endif } void god_pitch(god_type which_god) @@ -3392,7 +3076,6 @@ void god_pitch(god_type which_god) if (which_god == GOD_LUGONU && you.penance[GOD_LUGONU]) { simple_god_message(" is most displeased with you!", which_god); - god_acting gdact(GOD_LUGONU, true); lugonu_retribution(); return; } @@ -3491,12 +3174,6 @@ bool god_hates_butchery(god_type god) return (god == GOD_ELYVILON); } -bool god_protects_from_harm(god_type god) -{ - return (god == GOD_ZIN || god == GOD_SHINING_ONE || - god == GOD_ELYVILON || god == GOD_YREDELEMNUL); -} - void offer_corpse(int corpse) { // We always give the "good" (piety-gain) message when doing |