diff options
Diffstat (limited to 'stone_soup/crawl-ref/source/religion.cc')
-rw-r--r-- | stone_soup/crawl-ref/source/religion.cc | 2762 |
1 files changed, 0 insertions, 2762 deletions
diff --git a/stone_soup/crawl-ref/source/religion.cc b/stone_soup/crawl-ref/source/religion.cc deleted file mode 100644 index 964840f972..0000000000 --- a/stone_soup/crawl-ref/source/religion.cc +++ /dev/null @@ -1,2762 +0,0 @@ -/* - * File: religion.cc - * Summary: Misc religion related functions. - * Written by: Linley Henzell - * - * Modified for Crawl Reference by $Author$ on $Date$ - * - * Change History (most recent first): - * - * - * <7> 11jan2001 gdl added M. Valvoda's changes to - * god_colour() and god_name() - * <6> 06-Mar-2000 bwr added penance, gift_timeout, - * divine_retribution(), god_speaks() - * <5> 11/15/99 cdl Fixed Daniel's yellow Xom patch :) - * Xom will sometimes answer prayers - * <4> 10/11/99 BCR Added Daniel's yellow Xom patch - * <3> 6/13/99 BWR Vehumet book giving code. - * <2> 5/20/99 BWR Added screen redraws - * <1> -/--/-- LRH Created - */ - -#include "AppHdr.h" -#include "religion.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#include "externs.h" - -#include "abl-show.h" -#include "beam.h" -#include "debug.h" -#include "decks.h" -#include "describe.h" -#include "dungeon.h" -#include "effects.h" -#include "food.h" -#include "it_use2.h" -#include "itemname.h" -#include "itemprop.h" -#include "item_use.h" -#include "items.h" -#include "misc.h" -#include "monplace.h" -#include "mutation.h" -#include "newgame.h" -#include "ouch.h" -#include "player.h" -#include "randart.h" -#include "shopping.h" -#include "skills2.h" -#include "spells1.h" -#include "spells2.h" -#include "spells3.h" -#include "spl-cast.h" -#include "stuff.h" -#include "wpn-misc.h" - -const char *sacrifice[] = { - " glows silver and disappears.", - " glows a brilliant golden colour and disappears.", - " rots away in an instant.", - " crumbles to dust.", - " is eaten by a bug.", /* Xom - no sacrifices */ - " explodes into nothingness.", - " is consumed in a burst of flame.", - " is consumed in a roaring column of flame.", - " glows faintly for a moment, then is gone.", - " is consumed in a roaring column of flame.", - " glows with a rainbow of weird colours and disappears.", - " evaporates." -}; - -void altar_prayer(void); -void dec_penance(int god, int val); -void divine_retribution(int god); -void inc_penance(int god, int val); -void inc_penance(int val); - -void dec_penance(int god, int val) -{ - if (you.penance[god] > 0) - { - if (you.penance[god] <= val) - { - simple_god_message(" seems mollified.", god); - you.penance[god] = 0; - } - else - you.penance[god] -= val; - } -} // end dec_penance() - -void dec_penance(int val) -{ - dec_penance(you.religion, val); -} // end dec_penance() - -void inc_penance(int god, int val) -{ - if ((int) you.penance[god] + val > 200) - you.penance[god] = 200; - else - you.penance[god] += val; -} // end inc_penance() - -void inc_penance(int val) -{ - inc_penance(you.religion, val); -} // end inc_penance() - -static void inc_gift_timeout(int val) -{ - if ((int) you.gift_timeout + val > 200) - you.gift_timeout = 200; - else - you.gift_timeout += val; -} // end inc_gift_timeout() - -static int random_undead_servant(int religion) -{ - // error trapping {dlb} - int thing_called = MONS_PROGRAM_BUG; - int temp_rand = random2(100); - 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); -} - -void pray(void) -{ - unsigned char was_praying = you.duration[DUR_PRAYER]; - bool success = false; - - if (silenced(you.x_pos, you.y_pos)) - { - mpr("You are unable to make a sound!"); - return; - } - - // all prayers take time - you.turn_is_over = 1; - - if (you.religion != GOD_NO_GOD - && grd[you.x_pos][you.y_pos] == 179 + you.religion) - { - altar_prayer(); - } - else if (grd[you.x_pos][you.y_pos] >= 180 - && grd[you.x_pos][you.y_pos] <= 199) - { - if (you.species == SP_DEMIGOD) - { - mpr("Sorry, a being of your status cannot worship here."); - return; - } - god_pitch(grd[you.x_pos][you.y_pos] - 179); - return; - } - - if (you.religion == GOD_NO_GOD) - { - strcpy(info, "You spend a moment contemplating the meaning of "); - - if (you.is_undead) - strcat(info, "un"); - - strcat(info, "life."); - mpr(info); - return; - } - else if (you.religion == GOD_XOM) - { - if (one_chance_in(100)) - { - // Every now and then, Xom listens - // This is for flavour, not effect, so praying should not be - // encouraged. - - // Xom is nicer to experienced players - bool nice = (27 <= random2( 27 + you.experience_level )); - - // and he's not very nice even then - int sever = (nice) ? random2( random2( you.experience_level ) ) - : you.experience_level; - - // bad results are enforced, good are not - bool force = !nice; - - Xom_acts( nice, 1 + sever, force ); - } - else - mpr("Xom ignores you."); - - return; - } - - strcpy( info, "You offer a prayer to " ); - strcat( info, god_name( you.religion ) ); - strcat( info, "." ); - mpr(info); - - you.duration[DUR_PRAYER] = 9 + (random2(you.piety) / 20) - + (random2(you.piety) / 20); - - if (player_under_penance()) - simple_god_message(" demands penance!"); - else - { - strcpy(info, god_name(you.religion)); - strcat(info, " is "); - - strcat(info, (you.piety > 130) ? "exalted by your worship" : - (you.piety > 100) ? "extremely pleased with you" : - (you.piety > 70) ? "greatly pleased with you" : - (you.piety > 40) ? "most pleased with you" : - (you.piety > 20) ? "pleased with you" : - (you.piety > 5) ? "noncommittal" - : "displeased"); - - strcat(info, "."); - god_speaks(you.religion, info); - - if (you.piety > 130) - you.duration[DUR_PRAYER] *= 3; - else if (you.piety > 70) - you.duration[DUR_PRAYER] *= 2; - } - -#if DEBUG_DIAGNOSTICS - snprintf( info, INFO_SIZE, "piety: %d", you.piety ); - mpr( info, MSGCH_DIAGNOSTICS ); -#endif - - // Consider a gift if we don't have a timeout and weren't - // already praying when we prayed. - if (!you.penance[you.religion] && !you.gift_timeout && !was_praying) - { - // Remember to check for water/lava - switch (you.religion) - { - default: - break; - - case GOD_ZIN: - //jmf: "good" god will sometimes feed you (a la Nethack) - if (you.hunger_state == HS_STARVING - && random2(250) <= you.piety) - { - god_speaks(you.religion, "Your stomach feels content."); - set_hunger(6000, true); - lose_piety(5 + random2avg(10, 2)); - inc_gift_timeout(30 + random2avg(10, 2)); - } - break; - - case GOD_NEMELEX_XOBEH: - if (random2(200) <= you.piety - && (!you.attribute[ATTR_CARD_TABLE] || one_chance_in(3)) - && !you.attribute[ATTR_CARD_COUNTDOWN] - && !grid_destroys_items(grd[you.x_pos][you.y_pos])) - { - int thing_created = NON_ITEM; - unsigned char gift_type = MISC_DECK_OF_TRICKS; - - if (!you.attribute[ATTR_CARD_TABLE]) - { - thing_created = items( 1, OBJ_MISCELLANY, - MISC_PORTABLE_ALTAR_OF_NEMELEX, - true, 1, 250 ); - - if (thing_created != NON_ITEM) - you.attribute[ATTR_CARD_TABLE] = 1; - } - else - { - if (random2(200) <= you.piety && one_chance_in(4)) - gift_type = MISC_DECK_OF_SUMMONINGS; - if (random2(200) <= you.piety && coinflip()) - gift_type = MISC_DECK_OF_WONDERS; - if (random2(200) <= you.piety && one_chance_in(4)) - gift_type = MISC_DECK_OF_POWER; - - thing_created = items( 1, OBJ_MISCELLANY, gift_type, - true, 1, 250 ); - } - - 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]++; - } - } - break; - - case GOD_OKAWARU: - if (you.piety > 80 - && random2( you.piety ) > 70 - && !grid_destroys_items( grd[you.x_pos][you.y_pos] ) - && one_chance_in(4) - && you.skills[ best_skill(SK_SLINGS, SK_RANGED_COMBAT) ] >= 3) - { - success = acquirement( OBJ_MISSILES, you.religion ); - if (success) - { - simple_god_message( " has granted you a gift!" ); - more(); - - inc_gift_timeout( 4 + roll_dice(2,4) ); - you.num_gifts[ you.religion ]++; - } - break; - } - // intentional fall through - - case GOD_TROG: - if (you.piety > 130 - && random2(you.piety) > 120 - && !grid_destroys_items(grd[you.x_pos][you.y_pos]) - && one_chance_in(4)) - { - if (you.religion == GOD_TROG - || (you.religion == GOD_OKAWARU && coinflip())) - { - success = acquirement(OBJ_WEAPONS, you.religion); - } - else - { - success = acquirement(OBJ_ARMOUR, you.religion); - } - - if (success) - { - simple_god_message(" has granted you a gift!"); - more(); - - inc_gift_timeout(30 + random2avg(19, 2)); - you.num_gifts[ you.religion ]++; - } - } - break; - - case GOD_YREDELEMNUL: - if (random2(you.piety) > 80 && one_chance_in(5)) - { - int thing_called = random_undead_servant(GOD_YREDELEMNUL); - if (create_monster( thing_called, 0, BEH_FRIENDLY, - you.x_pos, you.y_pos, - you.pet_target, 250 ) != -1) - { - simple_god_message(" grants you an undead servant!"); - more(); - inc_gift_timeout(4 + random2avg(7, 2)); - you.num_gifts[you.religion]++; - } - } - break; - - case GOD_KIKUBAAQUDGHA: - case GOD_SIF_MUNA: - case GOD_VEHUMET: - if (you.piety > 160 && random2(you.piety) > 100) - { - unsigned int gift = NUM_BOOKS; - - switch (you.religion) - { - case GOD_KIKUBAAQUDGHA: // gives death books - if (!you.had_book[BOOK_NECROMANCY]) - gift = BOOK_NECROMANCY; - else if (!you.had_book[BOOK_DEATH]) - gift = BOOK_DEATH; - else if (!you.had_book[BOOK_UNLIFE]) - gift = BOOK_UNLIFE; - else if (!you.had_book[BOOK_NECRONOMICON]) - gift = BOOK_NECRONOMICON; - break; - - case GOD_SIF_MUNA: - gift = OBJ_RANDOM; // Sif Muna - gives any - break; - - // Vehumet - gives conj/summ. books (higher skill first) - case GOD_VEHUMET: - if (!you.had_book[BOOK_CONJURATIONS_I]) - gift = give_first_conjuration_book(); - else if (!you.had_book[BOOK_POWER]) - gift = BOOK_POWER; - else if (!you.had_book[BOOK_ANNIHILATIONS]) - gift = BOOK_ANNIHILATIONS; // conj books - - if (you.skills[SK_CONJURATIONS] < - you.skills[SK_SUMMONINGS] - || gift == NUM_BOOKS) - { - if (!you.had_book[BOOK_CALLINGS]) - gift = BOOK_CALLINGS; - else if (!you.had_book[BOOK_SUMMONINGS]) - gift = BOOK_SUMMONINGS; - else if (!you.had_book[BOOK_DEMONOLOGY]) - gift = BOOK_DEMONOLOGY; // summoning bks - } - break; - } - - if (gift != NUM_BOOKS - && (grd[you.x_pos][you.y_pos] != DNGN_LAVA - && grd[you.x_pos][you.y_pos] != DNGN_DEEP_WATER)) - { - if (gift == OBJ_RANDOM) - success = acquirement(OBJ_BOOKS, you.religion); - else - { - int thing_created = items(1, OBJ_BOOKS, gift, true, 1, 250); - if (thing_created == NON_ITEM) - return; - - move_item_to_grid( &thing_created, you.x_pos, you.y_pos ); - - if (thing_created != NON_ITEM) - { - success = true; - origin_acquired(mitm[thing_created], you.religion); - } - } - - if (success) - { - simple_god_message(" has granted you a gift!"); - more(); - - inc_gift_timeout(40 + random2avg(19, 2)); - you.num_gifts[ you.religion ]++; - } - - // Vehumet gives books less readily - if (you.religion == GOD_VEHUMET && success) - inc_gift_timeout(10 + random2(10)); - } // end of giving book - } // end of book gods - break; - } - } // end of gift giving -} // end pray() - -char *god_name( int which_god, bool long_name ) // mv - rewritten -{ - static char godname_buff[80]; - - switch (which_god) - { - case GOD_NO_GOD: - sprintf(godname_buff, "No God"); - break; - case GOD_ZIN: - sprintf(godname_buff, "Zin%s", long_name ? " the Law-Giver" : ""); - break; - case GOD_SHINING_ONE: - sprintf(godname_buff, "The Shining One"); - break; - case GOD_KIKUBAAQUDGHA: - strcpy(godname_buff, "Kikubaaqudgha"); - break; - case GOD_YREDELEMNUL: - sprintf(godname_buff, "Yredelemnul%s", long_name ? " the Dark" : ""); - break; - case GOD_XOM: - strcpy(godname_buff, "Xom"); - if (long_name) - { - strcat(godname_buff, " "); - switch(random2(1000)) - { - default: - strcat(godname_buff, "of Chaos"); - break; - case 1: - strcat(godname_buff, "the Random"); - if (coinflip()) - strcat(godname_buff, coinflip()?"master":" Number God"); - break; - case 2: - strcat(godname_buff, "the Tricky"); - break; - case 3: - sprintf( godname_buff, "Xom the %sredictible", coinflip() ? "Less-P" - : "Unp" ); - break; - case 4: - strcat(godname_buff, "of Many Doors"); - break; - case 5: - strcat(godname_buff, "the Capricious"); - break; - case 6: - strcat(godname_buff, "of "); - strcat(godname_buff, coinflip() ? "Bloodstained" : "Enforced"); - strcat(godname_buff, " Whimsey"); - break; - case 7: - strcat(godname_buff, "\"What was your username?\" *clickity-click*"); - break; - case 8: - strcat(godname_buff, "of Bone-Dry Humour"); - break; - case 9: - strcat(godname_buff, "of "); - strcat(godname_buff, coinflip() ? "Malevolent" : "Malicious"); - strcat(godname_buff, " Giggling"); - break; - case 10: - strcat(godname_buff, "the Psycho"); - strcat(godname_buff, coinflip() ? "tic" : "path"); - break; - case 11: - strcat(godname_buff, "of "); - switch(random2(5)) - { - case 0: strcat(godname_buff, "Gnomic"); break; - case 1: strcat(godname_buff, "Ineffable"); break; - case 2: strcat(godname_buff, "Fickle"); break; - case 3: strcat(godname_buff, "Swiftly Tilting"); break; - case 4: strcat(godname_buff, "Unknown"); break; - } - strcat(godname_buff, " Intent"); - if (coinflip()) - strcat(godname_buff, "ion"); - break; - case 12: - sprintf(godname_buff, "The Xom-Meister"); - if (coinflip()) - strcat(godname_buff, ", Xom-a-lom-a-ding-dong"); - else if (coinflip()) - strcat(godname_buff, ", Xom-o-Rama"); - else if (coinflip()) - strcat(godname_buff, ", Xom-Xom-bo-Bom, Banana-Fana-fo-Fom"); - break; - case 13: - strcat(godname_buff, "the Begetter of "); - strcat(godname_buff, coinflip() ? "Turbulence" : "Discontinuities"); - break; - } - } - break; - case GOD_VEHUMET: - strcpy(godname_buff, "Vehumet"); - break; - case GOD_OKAWARU: - sprintf(godname_buff, "%sOkawaru", long_name ? "Warmaster " : ""); - break; - case GOD_MAKHLEB: - sprintf(godname_buff, "Makhleb%s", long_name ? " the Destroyer" : ""); - break; - case GOD_SIF_MUNA: - sprintf(godname_buff, "Sif Muna%s", long_name ? " the Loreminder" : ""); - break; - case GOD_TROG: - sprintf(godname_buff, "Trog%s", long_name ? " the Wrathful" : ""); - break; - case GOD_NEMELEX_XOBEH: - strcpy(godname_buff, "Nemelex Xobeh"); - break; - case GOD_ELYVILON: - sprintf(godname_buff, "Elyvilon%s", long_name ? " the Healer" : ""); - break; - default: - sprintf(godname_buff, "The Buggy One (%d)", which_god); - } - - return (godname_buff); -} // end god_name() - -void god_speaks( int god, const char *mesg ) -{ - mpr( mesg, MSGCH_GOD, god ); -} // end god_speaks() - -void Xom_acts(bool niceness, int sever, bool force_sever) -{ - // niceness = false - bad, true - nice - int temp_rand; // probability determination {dlb} - bool done_bad = false; // flag to clarify logic {dlb} - bool done_good = false; // flag to clarify logic {dlb} - - struct bolt beam; - - if (sever < 1) - sever = 1; - - if (!force_sever) - sever = random2(sever); - - if (sever == 0) - return; - - okay_try_again: - - if (!niceness || one_chance_in(3)) - { - // begin "Bad Things" - done_bad = false; - - // this should always be first - it will often be called - // deliberately, with a low sever value - if (random2(sever) <= 2) - { - 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."); - - miscast_effect( SPTYP_RANDOM, 5 + random2(10), random2(100), 0, - "the capriciousness of Xom" ); - - done_bad = true; - } - else if (random2(sever) <= 2) - { - 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."); - - lose_stat(STAT_RANDOM, 1 + random2(3), true); - - done_bad = true; - } - else if (random2(sever) <= 2) - { - 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."); - - miscast_effect( SPTYP_RANDOM, 5 + random2(15), random2(250), 0, - "the capriciousness of Xom" ); - - done_bad = true; - } - else if (!you.is_undead && random2(sever) <= 3) - { - 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 laughter."); - - mpr("Your body is suffused with distortional energy."); - - set_hp(1 + random2(you.hp), false); - deflate_hp(you.hp_max / 2, true); - - bool failMsg = true; - for (int i = 0; i < 4; i++) - { - if (!mutate(100, failMsg)) - failMsg = false; - } - - done_bad = true; - } - else if (!you.is_undead && random2(sever) <= 3) - { - 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 (one_chance_in(4)) - { - drain_exp(); - if (random2(sever) > 3) - drain_exp(); - if (random2(sever) > 3) - drain_exp(); - } - else - { - mpr("A wave of agony tears through your body!"); - set_hp(1 + (you.hp / 2), false); - } - - done_bad = true; - } - else if (random2(sever) <= 3) - { - 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."); - - if (one_chance_in(4)) - dancing_weapon(100, true); // nasty, but fun - else - { - create_monster(MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_HOSTILE, you.x_pos, you.y_pos, MHITNOT, 250); - - if (one_chance_in(3)) - create_monster(MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_HOSTILE, you.x_pos, you.y_pos, MHITNOT, 250); - - if (one_chance_in(4)) - create_monster(MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_HOSTILE, you.x_pos, you.y_pos, MHITNOT, 250); - - if (one_chance_in(3)) - create_monster(MONS_HELLION + random2(10), ENCH_ABJ_III, - BEH_HOSTILE, you.x_pos, you.y_pos, MHITNOT, 250); - - if (one_chance_in(4)) - create_monster(MONS_HELLION + random2(10), ENCH_ABJ_III, - BEH_HOSTILE, you.x_pos, you.y_pos, MHITNOT, 250); - } - - done_bad = true; - } - else if (you.your_level == 0) - { - // this should remain the last possible outcome {dlb} - 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."); - - banished(DNGN_ENTER_ABYSS); - - done_bad = true; - } - } // end "Bad Things" - else - { - // begin "Good Things" - done_good = false; - -// Okay, now for the nicer stuff (note: these things are not necessarily nice): - if (random2(sever) <= 2) - { - temp_rand = random2(4); - - god_speaks(GOD_XOM, - (temp_rand == 0) ? "\"Go forth and destroy!\"" : - (temp_rand == 1) ? "\"Go forth and destroy, 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: - you.berserk_penalty = NO_BERSERK_PENALTY; - potion_effect(POT_BERSERK_RAGE, 150); - break; - } - - done_good = true; - } - else if (random2(sever) <= 4) - { - 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 opens a gate."); - - create_monster( MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ); - - create_monster( MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ); - - if (random2( you.experience_level ) >= 8) - { - create_monster( MONS_NEQOXEC + random2(5), ENCH_ABJ_III, - BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ); - } - - if (random2( you.experience_level ) >= 8) - { - create_monster( MONS_HELLION + random2(10), ENCH_ABJ_III, - BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ); - } - - if (random2( you.experience_level ) >= 8) - { - create_monster( MONS_HELLION + random2(10), ENCH_ABJ_III, - BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ); - } - - done_good = true; - } - else if (random2(sever) <= 3) - { - temp_rand = random2(3); - - god_speaks(GOD_XOM, - (temp_rand == 0) ? "\"Take this token of my esteem.\"" : - (temp_rand == 1) ? "Xom grants you a gift!" - : "Xom's generous nature manifests itself."); - - if (grd[you.x_pos][you.y_pos] == DNGN_LAVA - || grd[you.x_pos][you.y_pos] == DNGN_DEEP_WATER) - { - // How unfortunate. I'll bet Xom feels sorry for you. - mpr("You hear a splash."); - } - else - { - int thing_created = items(1, OBJ_RANDOM, OBJ_RANDOM, true, - you.experience_level * 3, 250); - - move_item_to_grid( &thing_created, you.x_pos, you.y_pos ); - - if (thing_created != NON_ITEM) - { - origin_acquired(mitm[thing_created], GOD_XOM); - canned_msg(MSG_SOMETHING_APPEARS); - more(); - } - } - - done_good = true; - } - else if (random2(sever) <= 4) - { - const int demon = (random2(you.experience_level) < 6) - ? MONS_WHITE_IMP + random2(5) - : MONS_NEQOXEC + random2(5); - - if (create_monster( demon, 0, BEH_FRIENDLY, you.x_pos, you.y_pos, - you.pet_target, 250 ) != -1) - { - temp_rand = random2(3); - - god_speaks(GOD_XOM, - (temp_rand == 0) ? "\"Serve the mortal, my child!\"" : - (temp_rand == 1) ? "Xom grants you a demonic servitor." - : "Xom opens a gate."); - } - - done_good = true; // well, for Xom, trying == doing {dlb} - } - else if (random2(sever) <= 4) - { - temp_rand = random2(4); - - god_speaks(GOD_XOM, - (temp_rand == 0) ? "\"Take this instrument of destruction!\"" : - (temp_rand == 1) ? "\"You have earned yourself a gift.\"" : - (temp_rand == 2) ? "Xom grants you an implement of death." - : "Xom smiles on you."); - - if (acquirement(OBJ_WEAPONS, GOD_XOM)) - more(); - - done_good = true; - } - else if (!you.is_undead && random2(sever) <= 5) - { - 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 chuckling."); - - mpr("Your body is suffused with distortional energy."); - - set_hp(1 + random2(you.hp), false); - deflate_hp(you.hp_max / 2, true); - - if (coinflip() || !give_cosmetic_mutation()) - give_good_mutation(); - - done_good = true; - } - else if (random2(sever) <= 2) - { - // this should remain the last possible outcome {dlb} - if (!one_chance_in(8)) - you.attribute[ATTR_DIVINE_LIGHTNING_PROTECTION] = 1; - - god_speaks(GOD_XOM, "The area is suffused with divine lightning!"); - - beam.beam_source = NON_MONSTER; - beam.type = SYM_BURST; - beam.damage = dice_def( 3, 30 ); - beam.flavour = BEAM_ELECTRICITY; - beam.target_x = you.x_pos; - beam.target_y = you.y_pos; - strcpy(beam.beam_name, "blast of lightning"); - beam.colour = LIGHTCYAN; - beam.thrower = KILL_MISC; - beam.aux_source = "Xom's lightning strike"; - beam.ex_size = 2; - beam.is_tracer = false; - beam.is_explosion = true; - - explosion(beam); - - if (you.attribute[ATTR_DIVINE_LIGHTNING_PROTECTION] == 1) - { - mpr("Your divine protection wanes."); - you.attribute[ATTR_DIVINE_LIGHTNING_PROTECTION] = 0; - } - - done_good = true; - } - } // end "Good Things" - - if (done_bad || done_good || one_chance_in(4)) - return; - else - goto okay_try_again; -} // end Xom_acts() - -// 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( int thing_done, int level ) -{ - bool ret = false; - int piety_change = 0; - int penance = 0; - - if (you.religion == GOD_NO_GOD || you.religion == GOD_XOM) - return (false); - - switch (thing_done) - { - case DID_NECROMANCY: - case DID_UNHOLY: - case DID_ATTACK_HOLY: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_ELYVILON: - piety_change = -level; - penance = level * ((you.religion == GOD_ZIN) ? 2 : 1); - ret = true; - break; - } - break; - - case DID_STABBING: - case DID_POISON: - if (you.religion == GOD_SHINING_ONE) - { - ret = true; - piety_change = -level; - penance = level * 2; - } - break; - - case DID_ATTACK_FRIEND: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_ELYVILON: - case GOD_OKAWARU: - piety_change = -level; - penance = level * 3; - ret = true; - break; - } - break; - - case DID_FRIEND_DIES: - switch (you.religion) - { - case GOD_ELYVILON: - penance = level; // healer god cares more about this - // fall through - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_OKAWARU: - piety_change = -level; - ret = true; - break; - } - break; - - case DID_DEDICATED_BUTCHERY: // aka field sacrifice - switch (you.religion) - { - case GOD_ELYVILON: - simple_god_message(" did not appreciate that!"); - ret = true; - piety_change = -10; - penance = 10; - break; - - case GOD_OKAWARU: - case GOD_MAKHLEB: - case GOD_TROG: - simple_god_message(" accepts your offering."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - break; - } - break; - - case DID_DEDICATED_KILL_LIVING: - switch (you.religion) - { - case GOD_ELYVILON: - simple_god_message(" did not appreciate that!"); - ret = true; - piety_change = -level; - penance = level * 2; - break; - - case GOD_KIKUBAAQUDGHA: - case GOD_YREDELEMNUL: - case GOD_OKAWARU: - case GOD_VEHUMET: - case GOD_MAKHLEB: - case GOD_TROG: - simple_god_message(" accepts your kill."); - ret = true; - if (random2(level + 18) > 5) - piety_change = 1; - break; - } - break; - - case DID_DEDICATED_KILL_UNDEAD: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_OKAWARU: - case GOD_VEHUMET: - case GOD_MAKHLEB: - simple_god_message(" accepts your kill."); - ret = true; - if (random2(level + 18) > 4) - piety_change = 1; - break; - } - break; - - case DID_DEDICATED_KILL_DEMON: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_OKAWARU: - simple_god_message(" accepts your kill."); - ret = true; - if (random2(level + 18) > 3) - piety_change = 1; - break; - } - break; - - case DID_DEDICATED_KILL_WIZARD: - if (you.religion == GOD_TROG) - { - // hooking this up, but is it too good? - // enjoy it while you can -- bwr - simple_god_message(" appreciates your killing of a magic user."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - } - break; - - // Note that Angel deaths are special, they are always noticed... - // if you or any friendly kills one you'll get the credit or the blame. - case DID_ANGEL_KILLED_BY_SERVANT: - case DID_KILL_ANGEL: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_ELYVILON: - level *= 3; - piety_change = -level; - penance = level * ((you.religion == GOD_ZIN) ? 2 : 1); - ret = true; - break; - - case GOD_KIKUBAAQUDGHA: - case GOD_YREDELEMNUL: - case GOD_MAKHLEB: - snprintf( info, INFO_SIZE, " accepts your %skill.", - (thing_done == DID_KILL_ANGEL) ? "" : "collateral " ); - - simple_god_message( info ); - - ret = true; - if (random2(level + 18) > 2) - piety_change = 1; - break; - } - break; - - // Undead slave is any friendly undead... Kiku and Yred pay attention - // to the undead and both like the death of living things. - case DID_LIVING_KILLED_BY_UNDEAD_SLAVE: - switch (you.religion) - { - case GOD_KIKUBAAQUDGHA: - case GOD_YREDELEMNUL: - simple_god_message(" accepts your slave's kill."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - break; - } - break; - - // Servants are currently any friendly monster under Vehumet, or - // any god given pet for everyone else (excluding undead which are - // handled above). - case DID_LIVING_KILLED_BY_SERVANT: - switch (you.religion) - { - case GOD_KIKUBAAQUDGHA: // note: reapers aren't undead - case GOD_VEHUMET: - case GOD_MAKHLEB: - simple_god_message(" accepts your collateral kill."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - break; - } - break; - - case DID_UNDEAD_KILLED_BY_SERVANT: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - case GOD_VEHUMET: - case GOD_MAKHLEB: - simple_god_message(" accepts your collateral kill."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - break; - } - break; - - case DID_DEMON_KILLED_BY_SERVANT: - switch (you.religion) - { - case GOD_ZIN: - case GOD_SHINING_ONE: - simple_god_message(" accepts your collateral kill."); - ret = true; - if (random2(level + 10) > 5) - piety_change = 1; - break; - } - break; - - case DID_SPELL_MEMORISE: - if (you.religion == GOD_TROG) - { - penance = level * 10; - piety_change = -penance; - ret = true; - } - break; - - case DID_SPELL_CASTING: - if (you.religion == GOD_TROG) - { - piety_change = -level; - penance = level * 5; - ret = true; - } - break; - - case DID_SPELL_PRACTISE: - // Like CAST, but for skill advancement. - // Level is number of skill points gained... typically 10 * exerise, - // but may be more/less if the skill is at 0 (INT adjustment), or - // if the PC's pool is low and makes change. - if (you.religion == GOD_SIF_MUNA) - { - // Old curve: random2(12) <= spell-level, this is similar, - // but faster at low levels (to help ease things for low level - // Power averages about (level * 20 / 3) + 10 / 3 now. Also - // note that spell skill practise comes just after XP gain, so - // magical kills tend to do both at the same time (unlike melee). - // This means high level spells probably work pretty much like - // they used to (use spell, get piety). - piety_change = div_rand_round( level + 10, 90 ); - ret = true; - } - break; - - case DID_CARDS: - if (you.religion == GOD_NEMELEX_XOBEH) - { - piety_change = level; - ret = true; - } - break; - - case DID_STIMULANTS: // unused - case DID_EAT_MEAT: // unused - case DID_CREATED_LIFE: // unused - case DID_DEDICATED_KILL_NATURAL_EVIL: // unused - case DID_NATURAL_EVIL_KILLED_BY_SERVANT: // unused - case DID_SPELL_NONUTILITY: // unused - default: - break; - } - - if (piety_change > 0) - { - // positive conduct only interesting out in the real world - if (!player_in_branch( BRANCH_ECUMENICAL_TEMPLE )) - gain_piety( piety_change ); - else if (one_chance_in(10)) - { - simple_god_message( " says: \"Go forth into the world to show your devotion to me!\"" ); - } - } - else - { - const int piety_loss = -piety_change; - - if (piety_loss) - { - // output guilt message: - mprf( "You feel%sguilty.", - (piety_loss == 1) ? " a little " : - (piety_loss < 5) ? " " : - (piety_loss < 10) ? " very " - : " extremely " ); - - lose_piety( piety_loss ); - } - - if (you.piety < 1) - excommunication(); - else if (penance) // only if still in religion - { - god_speaks( you.religion, - "\"You will pay for your transgression, mortal!\"" ); - - inc_penance( penance ); - } - } - -#if DEBUG_DIAGNOSTICS - if (ret) - { - static const char *conducts[] = - { - "", - "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", - "Spell Memorise", "Spell Cast", "Spell Practise", "Spell Nonutility", - "Cards", "Stimulants", "Eat Meat", "Create Life" - }; - - mprf( MSGCH_DIAGNOSTICS, - "conduct: %s; piety: %d (%+d); penance: %d (%+d)", - conducts[thing_done], - you.piety, piety_change, you.penance[you.religion], penance ); - - } -#endif - - return (ret); -} - -void gain_piety(char pgn) -{ - // check to see if we owe anything first - if (you.penance[you.religion] > 0) - { - dec_penance(pgn); - return; - } - else if (you.gift_timeout > 0) - { - if (you.gift_timeout > pgn) - you.gift_timeout -= pgn; - else - you.gift_timeout = 0; - - // Slow down piety gain to account for the fact that gifts - // no longer have a piety cost for getting them - if (!one_chance_in(8)) - return; - } - - // slow down gain at upper levels of piety - if (you.piety > 199 - || (you.piety > 150 && one_chance_in(3)) - || (you.piety > 100 && one_chance_in(3))) - return; - - int old_piety = you.piety; - - you.piety += pgn; - - if (you.piety >= 30 && old_piety < 30) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - case GOD_SIF_MUNA: - break; - default: - strcpy(info, "You can now "); - strcat(info, - (you.religion == GOD_ZIN || you.religion == GOD_SHINING_ONE) - ? "repel the undead" : - - (you.religion == GOD_KIKUBAAQUDGHA) - ? "recall your undead slaves" : - (you.religion == GOD_YREDELEMNUL) - ? "animate corpses" : - (you.religion == GOD_VEHUMET) - ? "gain power from killing in Vehumet's name" : - (you.religion == GOD_MAKHLEB) - ? "gain power from killing in Makhleb's name" : - (you.religion == GOD_OKAWARU) - ? "give your body great, but temporary strength" : - (you.religion == GOD_TROG) - ? "go berserk at will" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for minor healing" - // Unknown god - : "endure this program bug @30"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety >= 50 && old_piety < 50) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - break; - case GOD_KIKUBAAQUDGHA: - simple_god_message(" is protecting you from some side-effects of death magic."); - break; - - case GOD_VEHUMET: - god_speaks(you.religion, "You can call upon Vehumet to aid your destructive magics with prayer."); - break; - - default: - strcpy(info, "You can now "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "call upon Zin for minor healing" : - (you.religion == GOD_SHINING_ONE) - ? "smite your foes" : - (you.religion == GOD_YREDELEMNUL) - ? "recall your undead slaves" : - (you.religion == GOD_OKAWARU) - ? "call upon Okawaru for minor healing" : - (you.religion == GOD_MAKHLEB) - ? "harness Makhleb's destructive might" : - (you.religion == GOD_SIF_MUNA) - ? "freely open your mind to new spells" : - (you.religion == GOD_TROG) - ? "give your body great, but temporary, strength" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for purification" - // Unknown god - : "endure this program bug @50"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety >= 75 && old_piety < 75) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_OKAWARU: - case GOD_NEMELEX_XOBEH: - case GOD_SIF_MUNA: - case GOD_TROG: - break; - case GOD_VEHUMET: - god_speaks(you.religion,"During prayer you have some protection from summoned creatures."); - break; - - default: - strcpy(info, "You can now "); - strcat(info, - (you.religion == GOD_ZIN) - ? "call down a plague" : - (you.religion == GOD_SHINING_ONE) - ? "dispel the undead" : - (you.religion == GOD_KIKUBAAQUDGHA) - ? "permanently enslave the undead" : - (you.religion == GOD_YREDELEMNUL) - ? "animate legions of the dead" : - (you.religion == GOD_MAKHLEB) - ? "summon a lesser servant of Makhleb" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for moderate healing" - // Unknown god - : "endure this program bug @75"); - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety >= 100 && old_piety < 100) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_OKAWARU: - case GOD_NEMELEX_XOBEH: - case GOD_KIKUBAAQUDGHA: - break; - case GOD_SIF_MUNA: - simple_god_message - (" is protecting you from some side-effects of spellcasting."); - break; - - default: - strcpy(info, "You can now "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "utter a Holy Word" : - (you.religion == GOD_SHINING_ONE) - ? "hurl bolts of divine anger" : - (you.religion == GOD_YREDELEMNUL) - ? "drain ambient lifeforce" : - (you.religion == GOD_VEHUMET) - ? "tap ambient magical fields" : - (you.religion == GOD_MAKHLEB) - ? "hurl Makhleb's greater destruction" : - (you.religion == GOD_TROG) - ? "haste yourself" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon to restore your abilities" - // Unknown god - : "endure this program bug @100"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety >= 120 && old_piety < 120) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - case GOD_VEHUMET: - case GOD_SIF_MUNA: - case GOD_TROG: - break; - default: - strcpy(info, "You can now "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "summon a guardian angel" : - (you.religion == GOD_SHINING_ONE) - ? "summon a divine warrior" : - (you.religion == GOD_KIKUBAAQUDGHA) - ? "summon an emissary of Death" : - (you.religion == GOD_YREDELEMNUL) - ? "control the undead" : - (you.religion == GOD_OKAWARU) - ? "haste yourself" : - (you.religion == GOD_MAKHLEB) - ? "summon a greater servant of Makhleb" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for incredible healing" - // Unknown god - : "endure this program bug @120"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } -} // end gain_piety() - -void lose_piety(char pgn) -{ - int old_piety = you.piety; - - if (you.piety - pgn < 0) - you.piety = 0; - else - you.piety -= pgn; - - // Don't bother printing out these messages if you're under - // penance, you wouldn't notice since all these abilities - // are withheld. - if (!player_under_penance() && you.piety != old_piety) - { - if (you.piety < 120 && old_piety >= 120) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - case GOD_VEHUMET: - case GOD_SIF_MUNA: - case GOD_TROG: - break; - default: - strcpy(info, "You can no longer "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "summon guardian angels" : - (you.religion == GOD_SHINING_ONE) - ? "summon divine warriors" : - (you.religion == GOD_KIKUBAAQUDGHA) - ? "summon Death's emissaries" : - (you.religion == GOD_YREDELEMNUL) - ? "control undead beings" : - (you.religion == GOD_OKAWARU) - ? "haste yourself" : - (you.religion == GOD_MAKHLEB) - ? "summon a greater servant of Makhleb" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for incredible healing" - // Unknown god - : "endure this program bug @120"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety < 100 && old_piety >= 100) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_OKAWARU: - case GOD_NEMELEX_XOBEH: - case GOD_KIKUBAAQUDGHA: - break; - case GOD_SIF_MUNA: - god_speaks(you.religion,"Sif Muna is no longer protecting you from miscast magic."); - break; - default: - strcpy(info, "You can no longer "); - strcat(info, - (you.religion == GOD_ZIN) - ? "utter a Holy Word" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon to restore your abilities" : - (you.religion == GOD_SHINING_ONE) - ? "hurl bolts of divine anger" : - (you.religion == GOD_YREDELEMNUL) - ? "drain ambient life force" : - (you.religion == GOD_VEHUMET) - ? "tap ambient magical fields" : - (you.religion == GOD_MAKHLEB) - ? "direct Makhleb's greater destructive powers" : - (you.religion == GOD_TROG) - ? "haste yourself" - // Unknown god - : "endure this program bug @100"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety < 75 && old_piety >= 75) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_OKAWARU: - case GOD_NEMELEX_XOBEH: - case GOD_SIF_MUNA: - case GOD_TROG: - break; - case GOD_VEHUMET: - simple_god_message(" will no longer shield you from summoned creatures."); - break; - default: - strcpy(info, "You can no longer "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "call down a plague" : - (you.religion == GOD_SHINING_ONE) - ? "dispel undead" : - (you.religion == GOD_KIKUBAAQUDGHA) - ? "enslave undead" : - (you.religion == GOD_YREDELEMNUL) - ? "animate legions of the dead" : - (you.religion == GOD_MAKHLEB) - ? "summon a servant of Makhleb" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for moderate healing" - // Unknown god - : "endure this program bug @75"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety < 50 && old_piety >= 50) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - break; - case GOD_KIKUBAAQUDGHA: - simple_god_message(" is no longer shielding you from miscast death magic."); - break; - case GOD_VEHUMET: - simple_god_message(" will no longer aid your destructive magics."); - break; - - default: - strcpy(info, "You can no longer "); - - strcat(info, - (you.religion == GOD_ZIN) - ? "call upon Zin for minor healing" : - (you.religion == GOD_SHINING_ONE) - ? "smite your foes" : - (you.religion == GOD_YREDELEMNUL) - ? "recall your undead slaves" : - (you.religion == GOD_OKAWARU) - ? "call upon Okawaru for minor healing" : - (you.religion == GOD_MAKHLEB) - ? "hurl Makhleb's destruction" : - (you.religion == GOD_SIF_MUNA) - ? "forget spells at will" : - (you.religion == GOD_TROG) - ? "give your body great, but temporary, strength" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for Purification" - // Unknown god - : "endure this program bug @50"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - - if (you.piety < 30 && old_piety >= 30) - { - switch (you.religion) - { - case GOD_NO_GOD: - case GOD_XOM: - case GOD_NEMELEX_XOBEH: - case GOD_SIF_MUNA: - break; - default: - strcpy(info, "You can no longer "); - - strcat(info, - (you.religion == GOD_ZIN || you.religion == GOD_SHINING_ONE) - ? "repel the undead" : - (you.religion == GOD_KIKUBAAQUDGHA) - ? "recall your undead slaves" : - (you.religion == GOD_YREDELEMNUL) - ? "animate corpses" : - (you.religion == GOD_VEHUMET) - ? "gain power from killing in Vehumet's name" : - (you.religion == GOD_MAKHLEB) - ? "gain power from killing in Makhleb's name" : - (you.religion == GOD_OKAWARU) - ? "give your body great, but temporary, strength" : - (you.religion == GOD_TROG) - ? "go berserk at will" : - (you.religion == GOD_ELYVILON) - ? "call upon Elyvilon for minor healing." - // Unknown god - : "endure this program bug @30"); - - strcat(info, "."); - god_speaks(you.religion, info); - break; - } - } - } -} // end lose_piety() - -void divine_retribution( int god ) -{ - ASSERT(god != GOD_NO_GOD); - - int loopy = 0; // general purpose loop variable {dlb} - int temp_rand = 0; // probability determination {dlb} - int punisher = MONS_PROGRAM_BUG; - bool success = false; - int how_many = 0; - int divine_hurt = 0; - - // Good gods don't use divine retribution on their followers, they - // will consider it for those who have gone astray however. - if (god == you.religion) - { - if (god == GOD_SHINING_ONE || god == GOD_ZIN || god == GOD_ELYVILON) - return; - } - - // Just the thought of retribution (getting this far) mollifies the - // god by a point... the punishment might reduce penance further. - dec_penance( god, 1 + random2(3) ); - - switch (god) - { - case GOD_XOM: - { - // One in ten chance that Xom might do something good... - // but that isn't forced, bad things are though - bool nice = one_chance_in(10); - bool force = !nice; - - Xom_acts(nice, you.experience_level, force); - } - break; - - case GOD_SHINING_ONE: - // daeva/smiting theme - // Doesn't care unless you've gone over to evil/destructive gods - if (you.religion == GOD_KIKUBAAQUDGHA || you.religion == GOD_MAKHLEB - || you.religion == GOD_YREDELEMNUL || you.religion == GOD_VEHUMET) - { - if (coinflip()) - { - success = false; - how_many = 1 + random2(you.experience_level / 5) + random2(3); - - for (loopy = 0; loopy < how_many; loopy++) - { - if (create_monster( MONS_DAEVA, 0, BEH_HOSTILE, - you.x_pos, you.y_pos, MHITYOU, 250) != -1) - { - success = true; - } - } - - if (success) - { - simple_god_message( " sends the divine host to punish you for your evil ways!", god ); - } - } - else - { - divine_hurt = 10 + random2(10); - - for (loopy = 0; loopy < 5; loopy++) - divine_hurt += random2( you.experience_level ); - - if (!player_under_penance() && you.piety > random2(400)) - { - strcpy(info, "Mortal, I have averted the wrath of " - "the Shining One... this time."); - god_speaks(you.religion, info); - } - else - { - simple_god_message( " smites you!", god ); - ouch( divine_hurt, 0, KILLED_BY_TSO_SMITING ); - dec_penance( GOD_SHINING_ONE, 1 ); - } - } - break; - } - return; - - case GOD_ZIN: - // angels/creeping doom theme: - // Doesn't care unless you've gone over to evil - if (you.religion == GOD_KIKUBAAQUDGHA || you.religion == GOD_MAKHLEB - || you.religion == GOD_YREDELEMNUL || you.religion == GOD_VEHUMET) - { - if (random2(you.experience_level) > 7 && !one_chance_in(5)) - { - success = false; - how_many = 1 + (you.experience_level / 10) + random2(3); - - for (loopy = 0; loopy < how_many; loopy++) - { - if (create_monster(MONS_ANGEL, 0, BEH_HOSTILE, - you.x_pos, you.y_pos, MHITYOU, 250) != -1) - { - success = true; - } - } - - if (success) - { - simple_god_message(" sends the divine host to punish you for your evil ways!", god); - } - } - else - { - // god_gift == false gives unfriendly - summon_swarm( you.experience_level * 20, true, false ); - simple_god_message(" sends a plague down upon you!", god); - } - break; - } - return; - - case GOD_MAKHLEB: - // demonic servant theme - if (random2(you.experience_level) > 7 && !one_chance_in(5)) - { - if (create_monster(MONS_EXECUTIONER + random2(5), 0, - BEH_HOSTILE, you.x_pos, you.y_pos, - MHITYOU, 250) != -1) - { - simple_god_message(" sends a greater servant after you!", - god); - } - } - else - { - success = false; - how_many = 1 + (you.experience_level / 7); - - for (loopy = 0; loopy < how_many; loopy++) - { - if (create_monster(MONS_NEQOXEC + random2(5), 0, BEH_HOSTILE, - you.x_pos, you.y_pos, MHITYOU, 250) != -1) - { - success = true; - } - } - - if (success) - simple_god_message(" sends minions to punish you.", god); - } - break; - - case GOD_KIKUBAAQUDGHA: - // death/necromancy theme - if (random2(you.experience_level) > 7 && !one_chance_in(5)) - { - success = false; - how_many = 1 + (you.experience_level / 5) + random2(3); - - for (loopy = 0; loopy < how_many; loopy++) - { - if (create_monster(MONS_REAPER, 0, BEH_HOSTILE, you.x_pos, - you.y_pos, MHITYOU, 250) != -1) - { - success = true; - } - } - - if (success) - simple_god_message(" unleashes Death upon you!", god); - } - else - { - god_speaks(god, (coinflip()) ? "You hear Kikubaaqudgha cackling." - : "Kikubaaqudgha's malice focuses upon you."); - - miscast_effect( SPTYP_NECROMANCY, 5 + you.experience_level, - random2avg(88, 3), 100, "the malice of Kikubaaqudgha" ); - } - break; - - case GOD_YREDELEMNUL: - // undead theme - if (random2(you.experience_level) > 4) - { - success = false; - how_many = 1 + random2(1 + (you.experience_level / 5)); - - for (loopy = 0; loopy < how_many; loopy++) - { - temp_rand = random2(100); - - punisher = ((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% - - if (create_monster( punisher, 0, BEH_HOSTILE, - you.x_pos, you.y_pos, MHITYOU, 250 ) != -1) - { - success = true; - } - } - - if (success) - simple_god_message(" sends a servant to punish you.", god); - } - else - { - simple_god_message("'s anger turns toward you for a moment.", - god); - - miscast_effect( SPTYP_NECROMANCY, 5 + you.experience_level, - random2avg(88, 3), 100, "the anger of Yredelemnul" ); - } - break; - - case GOD_TROG: - // physical/berserk theme - switch (random2(6)) - { - case 0: - case 1: - case 2: - { - // Would be better if berserking monsters were available, - // we just send some big bruisers for now. - success = false; - - int points = 3 + you.experience_level * 3; - - while (points > 0) - { - if (points > 20 && coinflip()) - { - // quick reduction for large values - punisher = MONS_DEEP_TROLL; - points -= 15; - break; - } - else - { - switch (random2(10)) - { - case 0: - punisher = MONS_IRON_TROLL; - points -= 10; - break; - - case 1: - punisher = MONS_ROCK_TROLL; - points -= 10; - break; - - case 2: - punisher = MONS_TROLL; - points -= 6; - break; - - case 3: - case 4: - punisher = MONS_MINOTAUR; - points -= 3; - break; - - case 5: - case 6: - punisher = MONS_TWO_HEADED_OGRE; - points -= 4; - break; - - case 7: - case 8: - case 9: - default: - punisher = MONS_OGRE; - points -= 3; - } - } - - if (create_monster(punisher, 0, BEH_HOSTILE, you.x_pos, - you.y_pos, MHITYOU, 250) != -1) - { - success = true; - } - } - - if (success) - simple_god_message(" sends monsters to punish you.", god); - } - break; - - case 3: - case 4: - simple_god_message("'s voice booms out, \"Feel my wrath!\"", god ); - - // A collection of physical effects that might be better - // suited to Trog than wild fire magic... messages could - // be better here... something more along the lines of apathy - // or loss of rage to go with the anti-berzerk effect-- bwr - switch (random2(6)) - { - case 0: - potion_effect( POT_DECAY, 100 ); - break; - - case 1: - case 2: - lose_stat(STAT_STRENGTH, 1 + random2(you.strength / 5), true); - break; - - case 3: - if (!you.paralysis) - { - dec_penance(GOD_TROG, 3); - mpr( "You suddenly pass out!", MSGCH_WARN ); - you.paralysis = 2 + random2(6); - } - break; - - case 4: - case 5: - if (you.slow < 90) - { - dec_penance( GOD_TROG, 1 ); - mpr( "You suddenly feel exhausted!", MSGCH_WARN ); - you.exhausted = 100; - slow_player( 100 ); - } - break; - }; - break; - //jmf: returned Trog's old Fire damage - // -- actually, this function partially exists to remove that, - // we'll leave this effect in, but we'll remove the wild - // fire magic. -- bwr - case 5: - dec_penance(GOD_TROG, 2); - mpr( "You feel Trog's fiery rage upon you!", MSGCH_WARN ); - miscast_effect( SPTYP_FIRE, 8 + you.experience_level, - random2avg(98, 3), 100, "the fiery rage of Trog" ); - break; - } - break; - - case GOD_OKAWARU: - { - // warrior theme: - success = false; - how_many = 1 + (you.experience_level / 5); - - for (loopy = 0; loopy < how_many; loopy++) - { - temp_rand = random2(100); - - 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) - { - success = true; - } - } - - if (success) - simple_god_message(" sends forces against you!", god); - } - break; - - case GOD_VEHUMET: - // conjuration and summoning theme - simple_god_message("'s vengence finds you.", god); - miscast_effect( coinflip() ? SPTYP_CONJURATION : SPTYP_SUMMONING, - 8 + you.experience_level, random2avg(98, 3), 100, - "the wrath of Vehumet" ); - break; - - case GOD_NEMELEX_XOBEH: - // like Xom, this might actually help the player -- bwr` - simple_god_message(" makes you to draw from the Deck of Punishment.", - god); - deck_of_cards(DECK_OF_PUNISHMENT); - break; - - case GOD_SIF_MUNA: - simple_god_message("'s wrath finds you.", god); - dec_penance(GOD_SIF_MUNA, 1); - - // magic and intelligence theme: - switch (random2(10)) - { - case 0: - case 1: - lose_stat(STAT_INTELLIGENCE, 1 + random2( you.intel / 5 ), true); - break; - - case 2: - case 3: - case 4: - confuse_player( 3 + random2(10), false ); - break; - - case 5: - case 6: - miscast_effect(SK_DIVINATIONS, 9, 90, 100, "the will of Sif Muna"); - break; - - case 7: - case 8: - if (you.magic_points) - { - dec_mp( 100 ); // this should zero it. - mpr( "You suddenly feel drained of magical energy!", - MSGCH_WARN ); - } - break; - - case 9: - // This will set all the extendable duration spells to - // a duration of one round, thus potentially exposing - // the player to real danger. - antimagic(); - mpr( "You sense a dampening of magic.", MSGCH_WARN ); - break; - } - break; - - case GOD_ELYVILON: // Elyvilon doesn't seek revenge - default: - return; - } - - // Sometimes divine experiences are overwelming... - if (one_chance_in(5) && you.experience_level < random2(37)) - { - if (coinflip()) - confuse_player( 3 + random2(10) ); - else - { - if (you.slow < 90) - { - mpr( "The divine experience leaves you feeling exhausted!", - MSGCH_WARN ); - - slow_player( random2(20) ); - } - } - } - - return; -} // end divine_retribution() - -void excommunication(void) -{ - const int old_god = you.religion; - - you.duration[DUR_PRAYER] = 0; - you.religion = GOD_NO_GOD; - you.piety = 0; - redraw_skill( you.your_name, player_title() ); - - mpr("You have lost your religion!"); - more(); - - switch (old_god) - { - case GOD_XOM: - Xom_acts( false, (you.experience_level * 2), true ); - inc_penance( old_god, 50 ); - break; - - case GOD_KIKUBAAQUDGHA: - simple_god_message( " does not appreciate desertion!", old_god ); - miscast_effect( SPTYP_NECROMANCY, 5 + you.experience_level, - random2avg(88, 3), 100, "the malice of Kikubaaqudgha" ); - inc_penance( old_god, 30 ); - break; - - case GOD_YREDELEMNUL: - simple_god_message( " does not appreciate desertion!", old_god ); - miscast_effect( SPTYP_NECROMANCY, 5 + you.experience_level, - random2avg(88, 3), 100, "the anger of Yredelemnul" ); - inc_penance( old_god, 30 ); - break; - - case GOD_VEHUMET: - simple_god_message( " does not appreciate desertion!", old_god ); - miscast_effect( (coinflip() ? SPTYP_CONJURATION : SPTYP_SUMMONING), - 8 + you.experience_level, random2avg(98, 3), 100, - "the wrath of Vehumet" ); - inc_penance( old_god, 25 ); - break; - - case GOD_MAKHLEB: - simple_god_message( " does not appreciate desertion!", old_god ); - miscast_effect( (coinflip() ? SPTYP_CONJURATION : SPTYP_SUMMONING), - 8 + you.experience_level, random2avg(98, 3), 100, - "the fury of Makhleb" ); - inc_penance( old_god, 25 ); - break; - - case GOD_TROG: - simple_god_message( " does not appreciate desertion!", old_god ); - - // Penence has to come before retribution to prevent "mollify" - inc_penance( old_god, 50 ); - divine_retribution( old_god ); - break; - - // these like to haunt players for a bit more than the standard - case GOD_NEMELEX_XOBEH: - case GOD_SIF_MUNA: - inc_penance( old_god, 50 ); - break; - - default: - inc_penance( old_god, 25 ); - break; - - case GOD_ELYVILON: // never seeks revenge - break; - } -} // end excommunication() - -static bool bless_weapon( int god, int brand, int colour ) -{ - const int wpn = get_player_wielded_weapon(); - - // Assuming the type of weapon is correct, we only need to check - // to see if it's an artefact we can successfully clobber: - if (!is_fixed_artefact( you.inv[wpn] ) - && !is_random_artefact( you.inv[wpn] )) - { - you.duration[DUR_WEAPON_BRAND] = 0; // just in case - - set_equip_desc( you.inv[wpn], ISFLAG_GLOWING ); - set_item_ego_type( you.inv[wpn], OBJ_WEAPONS, brand ); - you.inv[wpn].colour = colour; - - do_uncurse_item( you.inv[wpn] ); - enchant_weapon( ENCHANT_TO_HIT, true ); - enchant_weapon( ENCHANT_TO_DAM, true ); - - you.wield_change = true; - you.num_gifts[god]++; - - you.flash_colour = colour; - viewwindow( true, false ); - - mprf( MSGCH_GOD, "Your weapon shines brightly!" ); - simple_god_message( " booms: Use this gift wisely!" ); - - // as currently only Zin and TSO do this is our permabrand effect: - holy_word( 100, true ); - delay(500); - - return (true); - } - - return (false); -} - -void altar_prayer(void) -{ - int i, j, next; - char subst_id[4][50]; - char str_pass[ ITEMNAME_SIZE ]; - - for (i = 0; i < 4; i++) - { - for (j = 0; j < 50; j++) - { - subst_id[i][j] = 1; - } - } - - mpr( "You kneel at the altar and pray." ); - - if (you.religion == GOD_XOM) - return; - - // TSO blesses long swords with holy wrath - if (you.religion == GOD_SHINING_ONE - && !you.num_gifts[GOD_SHINING_ONE] - && !player_under_penance() - && you.piety > 160) - { - const int wpn = get_player_wielded_weapon(); - - if (wpn != -1 - && weapon_skill( you.inv[wpn] ) == SK_LONG_SWORDS - && get_weapon_brand( you.inv[wpn] ) != SPWPN_HOLY_WRATH) - { - if (bless_weapon( GOD_SHINING_ONE, SPWPN_HOLY_WRATH, YELLOW )) - { - // convert those demon blades if blessed: - if (you.inv[wpn].sub_type == WPN_DEMON_BLADE) - you.inv[wpn].sub_type = WPN_BLESSED_BLADE; - } - } - } - - // Zin blesses maces with disruption - if (you.religion == GOD_ZIN - && !you.num_gifts[GOD_ZIN] - && !player_under_penance() - && you.piety > 160) - { - const int wpn = get_player_wielded_weapon(); - - if (wpn != -1 - && (you.inv[wpn].base_type == OBJ_WEAPONS - && (you.inv[wpn].sub_type == WPN_MACE - || you.inv[wpn].sub_type == WPN_GREAT_MACE)) - && get_weapon_brand( you.inv[wpn] ) != SPWPN_DISRUPTION) - { - bless_weapon( GOD_ZIN, SPWPN_DISRUPTION, WHITE ); - } - } - - i = igrd[you.x_pos][you.y_pos]; - while (i != NON_ITEM) - { - if (one_chance_in(1000)) - break; - - next = mitm[i].link; // in case we can't get it later. - - const int value = item_value( mitm[i], subst_id, true ); - - switch (you.religion) - { - case GOD_ZIN: - case GOD_OKAWARU: - case GOD_MAKHLEB: - case GOD_NEMELEX_XOBEH: - it_name(i, DESC_CAP_THE, str_pass); - strcpy(info, str_pass); - strcat(info, sacrifice[you.religion - 1]); - mpr(info); - - if (mitm[i].base_type == OBJ_CORPSES - || random2(value) >= 50 - || player_under_penance()) - { - gain_piety(1); - } - - destroy_item(i); - break; - - case GOD_SIF_MUNA: - it_name(i, DESC_CAP_THE, str_pass); - strcpy(info, str_pass); - strcat(info, sacrifice[you.religion - 1]); - mpr(info); - - if (value >= 150) - gain_piety(1 + random2(3)); - - destroy_item(i); - break; - - case GOD_KIKUBAAQUDGHA: - case GOD_TROG: - if (mitm[i].base_type != OBJ_CORPSES) - break; - - it_name(i, DESC_CAP_THE, str_pass); - strcpy(info, str_pass); - strcat(info, sacrifice[you.religion - 1]); - mpr(info); - - gain_piety(1); - destroy_item(i); - break; - - case GOD_ELYVILON: - if (mitm[i].base_type != OBJ_WEAPONS - && mitm[i].base_type != OBJ_MISSILES) - { - break; - } - - it_name(i, DESC_CAP_THE, str_pass); - strcpy(info, str_pass); - strcat(info, sacrifice[you.religion - 1]); - mpr(info); - - if (random2(value) >= random2(50) - || (mitm[i].base_type == OBJ_WEAPONS - && (you.piety < 30 || player_under_penance()))) - { - gain_piety(1); - } - - destroy_item(i); - break; - - default: - break; - } - - i = next; - } -} // end altar_prayer() - -void god_pitch(unsigned char which_god) -{ - strcpy(info, "You kneel at the altar of "); - strcat(info, god_name(which_god)); - strcat(info, "."); - mpr(info); - - more(); - - // Note: using worship we could make some gods not allow followers to - // return, or not allow worshippers from other religions. -- bwr - - if ((you.is_undead || you.species == SP_DEMONSPAWN) - && (which_god == GOD_ZIN || which_god == GOD_SHINING_ONE - || which_god == GOD_ELYVILON)) - { - simple_god_message(" does not accept worship from those such as you!", - which_god); - return; - } - - describe_god( which_god, false ); - - snprintf( info, INFO_SIZE, "Do you wish to %sjoin this religion?", - (you.worshipped[which_god]) ? "re" : "" ); - - if (!yesno( info )) - { - redraw_screen(); - return; - } - - if (!yesno("Are you sure?")) - { - redraw_screen(); - return; - } - - redraw_screen(); - if (you.religion != GOD_NO_GOD) - excommunication(); - - you.religion = which_god; //jmf: moved up so god_speaks gives right colour - you.piety = 15; // to prevent near instant excommunication - you.gift_timeout = 0; - set_god_ability_slots(); // remove old god's slots, reserve new god's - - snprintf( info, INFO_SIZE, " welcomes you%s!", - (you.worshipped[which_god]) ? " back" : "" ); - - simple_god_message( info ); - more(); - - if (you.worshipped[you.religion] < 100) - you.worshipped[you.religion]++; - - // Currently penance is just zeroed, this could be much more interesting. - you.penance[you.religion] = 0; - - if (you.religion == GOD_KIKUBAAQUDGHA || you.religion == GOD_YREDELEMNUL - || you.religion == GOD_VEHUMET || you.religion == GOD_MAKHLEB) - { - // Note: Using worshipped[] we could make this sort of grudge - // permanent instead of based off of penance. -- bwr - if (you.penance[GOD_SHINING_ONE] > 0) - { - inc_penance(GOD_SHINING_ONE, 30); - god_speaks(GOD_SHINING_ONE, "\"You will pay for your evil ways, mortal!\""); - } - } - redraw_skill( you.your_name, player_title() ); -} // end god_pitch() - -void offer_corpse(int corpse) -{ - char str_pass[ ITEMNAME_SIZE ]; - it_name(corpse, DESC_CAP_THE, str_pass); - strcpy(info, str_pass); - strcat(info, sacrifice[you.religion - 1]); - mpr(info); - - did_god_conduct(DID_DEDICATED_BUTCHERY, 10); -} // end offer_corpse() - -//jmf: moved stuff from items::handle_time() -void handle_god_time(void) -{ - if (one_chance_in(100)) - { - // Choose a god randomly from those to whom we owe penance. - // - // Proof: (By induction) - // - // 1) n = 1, probability of choosing god is one_chance_in(1) - // 2) Asuume true for n = k (ie. prob = 1 / n for all n) - // 3) For n = k + 1, - // - // P:new-found-god = 1 / n (see algorithm) - // P:other-gods = (1 - P:new-found-god) * P:god-at-n=k - // 1 1 - // = (1 - -------) * --- - // k + 1 k - // - // k 1 - // = ----------- * --- - // k + 1 k - // - // 1 1 - // = ----- = --- - // k + 1 n - // - // Therefore, by induction the probability is uniform. As for - // why we do it this way... it requires only one pass and doesn't - // require an array. - - int which_god = GOD_NO_GOD; - unsigned int count = 0; - - for (int i = GOD_NO_GOD; i < NUM_GODS; i++) - { - if (you.penance[i]) - { - count++; - if (one_chance_in(count)) - which_god = i; - } - } - - if (which_god != GOD_NO_GOD) - divine_retribution(which_god); - } - - // Update the god's opinion of the player - if (you.religion != GOD_NO_GOD) - { - switch (you.religion) - { - case GOD_XOM: - if (one_chance_in(75)) - Xom_acts(true, you.experience_level + random2(15), true); - break; - - case GOD_ZIN: // These gods like long-standing worshippers - case GOD_ELYVILON: - if (you.piety < 150 && one_chance_in(20)) - gain_piety(1); - break; - - case GOD_SHINING_ONE: - if (you.piety < 150 && one_chance_in(15)) - gain_piety(1); - break; - - case GOD_YREDELEMNUL: - case GOD_KIKUBAAQUDGHA: - case GOD_VEHUMET: - if (one_chance_in(17)) - lose_piety(1); - if (you.piety < 1) - excommunication(); - break; - - case GOD_OKAWARU: // These gods accept corpses, so they time-out faster - case GOD_TROG: - if (one_chance_in(14)) - lose_piety(1); - if (you.piety < 1) - excommunication(); - break; - - case GOD_MAKHLEB: - if (one_chance_in(16)) - lose_piety(1); - if (you.piety < 1) - excommunication(); - break; - - case GOD_SIF_MUNA: - // [dshaligram] Sif Muna is now very patient - has to be - // to make up for the new spell training requirements, else - // it's practically impossible to get Master of Arcane status. - if (one_chance_in(60)) - lose_piety(1); - if (you.piety < 1) - excommunication(); - break; - - case GOD_NEMELEX_XOBEH: // relatively patient - if (one_chance_in(35)) - lose_piety(1); - if (you.attribute[ATTR_CARD_COUNTDOWN] > 0 && coinflip()) - you.attribute[ATTR_CARD_COUNTDOWN]--; - if (you.piety < 1) - excommunication(); - break; - - default: - DEBUGSTR("Bad god, no bishop!"); - } - } -} // end handle_god_time() - -// yet another wrapper for mpr() {dlb}: -void simple_god_message(const char *event, int which_deity) -{ - char buff[ INFO_SIZE ]; - - if (which_deity == GOD_NO_GOD) - which_deity = you.religion; - - snprintf( buff, sizeof(buff), "%s%s", god_name( which_deity ), event ); - - god_speaks( which_deity, buff ); -} - -char god_colour( char god ) //mv - added -{ - switch (god) - { - case GOD_SHINING_ONE: - case GOD_ZIN: - case GOD_ELYVILON: - case GOD_OKAWARU: - return(CYAN); - - case GOD_YREDELEMNUL: - case GOD_KIKUBAAQUDGHA: - case GOD_MAKHLEB: - case GOD_VEHUMET: - case GOD_TROG: - return(LIGHTRED); - - case GOD_XOM: - return(YELLOW); - - case GOD_NEMELEX_XOBEH: - return(LIGHTMAGENTA); - - case GOD_SIF_MUNA: - return(LIGHTBLUE); - - case GOD_NO_GOD: - default: - break; - } - - return(YELLOW); -} |