Revert "Track who destroys an item; incur Nemelex penance for deck destruction."
[crawl.git] / crawl-ref / source / godprayer.cc
1 #include "AppHdr.h"
2
3 #include "godprayer.h"
4
5 #include <cmath>
6
7 #include "areas.h"
8 #include "artefact.h"
9 #include "coordit.h"
10 #include "database.h"
11 #include "effects.h"
12 #include "env.h"
13 #include "fprop.h"
14 #include "godabil.h"
15 #include "goditem.h"
16 #include "godpassive.h"
17 #include "invent.h"
18 #include "itemprop.h"
19 #include "items.h"
20 #include "item_use.h"
21 #include "libutil.h"
22 #include "player.h"
23 #include "makeitem.h"
24 #include "message.h"
25 #include "misc.h"
26 #include "monster.h"
27 #include "notes.h"
28 #include "options.h"
29 #include "random.h"
30 #include "religion.h"
31 #include "skills2.h"
32 #include "stash.h"
33 #include "state.h"
34 #include "stuff.h"
35 #include "terrain.h"
36 #include "view.h"
37
38 static bool _offer_items();
39 static bool _zin_donate_gold();
40
41 static bool _confirm_pray_sacrifice(god_type god)
42 {
43     for (stack_iterator si(you.pos(), true); si; ++si)
44     {
45         if (god_likes_item(god, *si)
46             && needs_handle_warning(*si, OPER_PRAY))
47         {
48             string prompt = "Really sacrifice stack with ";
49             prompt += si->name(DESC_A);
50             prompt += " in it?";
51
52             if (!yesno(prompt.c_str(), false, 'n'))
53             {
54                 canned_msg(MSG_OK);
55                 return false;
56             }
57         }
58     }
59
60     return true;
61 }
62
63 string god_prayer_reaction()
64 {
65     string result = god_name(you.religion);
66     if (crawl_state.player_is_dead())
67         result += " was ";
68     else
69         result += " is ";
70     result +=
71         (you.piety > 130) ? "exalted by your worship" :
72         (you.piety > 100) ? "extremely pleased with you" :
73         (you.piety >  70) ? "greatly pleased with you" :
74         (you.piety >  40) ? "most pleased with you" :
75         (you.piety >  20) ? "pleased with you" :
76         (you.piety >   5) ? "noncommittal"
77                           : "displeased";
78     result += ".";
79
80     return result;
81 }
82
83 static bool _bless_weapon(god_type god, brand_type brand, int colour)
84 {
85     item_def& wpn = *you.weapon();
86
87     if (wpn.base_type != OBJ_WEAPONS
88         || (is_range_weapon(wpn)
89             && (brand != SPWPN_HOLY_WRATH || wpn.sub_type == WPN_BLOWGUN))
90         || is_artefact(wpn))
91     {
92         return false;
93     }
94
95     string prompt = "Do you wish to have " + wpn.name(DESC_YOUR)
96                        + " ";
97     if (brand == SPWPN_PAIN)
98         prompt += "bloodied with pain";
99     else if (brand == SPWPN_DISTORTION)
100         prompt += "corrupted";
101     else
102         prompt += "blessed";
103     prompt += "?";
104
105     if (!yesno(prompt.c_str(), true, 'n'))
106     {
107         canned_msg(MSG_OK);
108         return false;
109     }
110
111     you.duration[DUR_WEAPON_BRAND] = 0;     // just in case
112
113     string old_name = wpn.name(DESC_A);
114     set_equip_desc(wpn, ISFLAG_GLOWING);
115     set_item_ego_type(wpn, OBJ_WEAPONS, brand);
116     wpn.colour = colour;
117
118     const bool is_cursed = wpn.cursed();
119
120     enchant_weapon(wpn, 1 + random2(2), 1 + random2(2), 0);
121
122     if (is_cursed)
123         do_uncurse_item(wpn, false);
124
125     if (god == GOD_SHINING_ONE)
126     {
127         convert2good(wpn);
128
129         if (is_blessed_convertible(wpn))
130         {
131             origin_acquired(wpn, GOD_SHINING_ONE);
132             wpn.flags |= ISFLAG_BLESSED_WEAPON;
133         }
134
135         burden_change();
136     }
137     else if (is_evil_god(god))
138     {
139         convert2bad(wpn);
140
141         wpn.flags &= ~ISFLAG_BLESSED_WEAPON;
142
143         burden_change();
144     }
145
146     you.wield_change = true;
147     you.one_time_ability_used.set(god);
148     calc_mp(); // in case the old brand was antimagic
149     string desc  = old_name + " ";
150             desc += (god == GOD_SHINING_ONE   ? "blessed by the Shining One" :
151                      god == GOD_LUGONU        ? "corrupted by Lugonu" :
152                      god == GOD_KIKUBAAQUDGHA ? "bloodied by Kikubaaqudgha"
153                                               : "touched by the gods");
154
155     take_note(Note(NOTE_ID_ITEM, 0, 0,
156               wpn.name(DESC_A).c_str(), desc.c_str()));
157     wpn.flags |= ISFLAG_NOTED_ID;
158
159     mpr("Your weapon shines brightly!", MSGCH_GOD);
160
161     flash_view(colour);
162
163     simple_god_message(" booms: Use this gift wisely!");
164
165     if (god == GOD_SHINING_ONE)
166     {
167         holy_word(100, HOLY_WORD_TSO, you.pos(), true);
168
169         // Un-bloodify surrounding squares.
170         for (radius_iterator ri(you.pos(), 3, true, true); ri; ++ri)
171             if (is_bloodcovered(*ri))
172                 env.pgrid(*ri) &= ~(FPROP_BLOODY);
173     }
174
175     if (god == GOD_KIKUBAAQUDGHA)
176     {
177         you.gift_timeout = 1; // no protection during pain branding weapon
178
179         torment(&you, TORMENT_KIKUBAAQUDGHA, you.pos());
180
181         you.gift_timeout = 0; // protection after pain branding weapon
182
183         // Bloodify surrounding squares (75% chance).
184         for (radius_iterator ri(you.pos(), 2, true, true); ri; ++ri)
185             if (!one_chance_in(4))
186                 maybe_bloodify_square(*ri);
187     }
188
189 #ifndef USE_TILE_LOCAL
190     // Allow extra time for the flash to linger.
191     delay(1000);
192 #endif
193
194     return true;
195 }
196
197 // Prayer at your god's altar.
198 static bool _altar_prayer()
199 {
200     // Different message from when first joining a religion.
201     mpr("You prostrate yourself in front of the altar and pray.");
202
203     god_acting gdact;
204
205     bool did_something = false;
206
207     // donate gold to gain piety distributed over time
208     if (you.religion == GOD_ZIN)
209         did_something = _zin_donate_gold();
210
211     // TSO blesses weapons with holy wrath, and long blades and demon
212     // whips specially.
213     if (you.religion == GOD_SHINING_ONE
214         && !you.one_time_ability_used[GOD_SHINING_ONE]
215         && !player_under_penance()
216         && you.piety > 160)
217     {
218         item_def *wpn = you.weapon();
219
220         if (wpn
221             && (get_weapon_brand(*wpn) != SPWPN_HOLY_WRATH
222                 || is_blessed_convertible(*wpn)))
223         {
224             did_something = _bless_weapon(GOD_SHINING_ONE, SPWPN_HOLY_WRATH,
225                                           YELLOW);
226         }
227     }
228
229     // Lugonu blesses weapons with distortion.
230     if (you.religion == GOD_LUGONU
231         && !you.one_time_ability_used[GOD_LUGONU]
232         && !player_under_penance()
233         && you.piety > 160)
234     {
235         item_def *wpn = you.weapon();
236
237         if (wpn && get_weapon_brand(*wpn) != SPWPN_DISTORTION)
238             did_something = _bless_weapon(GOD_LUGONU, SPWPN_DISTORTION, MAGENTA);
239     }
240
241     // Kikubaaqudgha blesses weapons with pain, or gives you a Necronomicon.
242     if (you.religion == GOD_KIKUBAAQUDGHA
243         && !you.one_time_ability_used[GOD_KIKUBAAQUDGHA]
244         && !player_under_penance()
245         && you.piety > 160)
246     {
247         if (you.species != SP_FELID)
248         {
249             simple_god_message(
250                 " will bloody your weapon with pain or grant you the Necronomicon.");
251
252             item_def *wpn = you.weapon();
253
254             // Does the player want a pain branding?
255             if (wpn && get_weapon_brand(*wpn) != SPWPN_PAIN)
256             {
257                 if (_bless_weapon(GOD_KIKUBAAQUDGHA, SPWPN_PAIN, RED))
258                     return true;
259             }
260             else
261                 mpr("You have no weapon to bloody with pain.");
262
263             // If not, ask if the player wants a Necronomicon.
264             if (!yesno("Do you wish to receive the Necronomicon?", true, 'n'))
265             {
266                 canned_msg(MSG_OK);
267                 return false;
268             }
269         }
270
271         int thing_created = items(1, OBJ_BOOKS, BOOK_NECRONOMICON, true, 1,
272                                   MAKE_ITEM_RANDOM_RACE,
273                                   0, 0, you.religion);
274
275         if (thing_created == NON_ITEM)
276             return false;
277
278         move_item_to_grid(&thing_created, you.pos());
279
280         if (thing_created != NON_ITEM)
281         {
282             simple_god_message(" grants you a gift!");
283             more();
284
285             you.one_time_ability_used.set(you.religion);
286             did_something = true;
287             take_note(Note(NOTE_GOD_GIFT, you.religion));
288         }
289
290         // Return early so we don't offer our Necronomicon to Kiku.
291         return true;
292     }
293
294     return did_something;
295 }
296
297 void pray()
298 {
299     if (you.cannot_speak())
300     {
301         mpr("You are unable to make a sound!");
302         return;
303     }
304
305     // only successful prayer takes time
306     you.turn_is_over = false;
307
308     bool something_happened = false;
309     const god_type altar_god = feat_altar_god(grd(you.pos()));
310     if (altar_god != GOD_NO_GOD)
311     {
312         if (you.religion != GOD_NO_GOD && altar_god == you.religion)
313             something_happened = _altar_prayer();
314         else if (altar_god != GOD_NO_GOD)
315         {
316             if (you.species == SP_DEMIGOD)
317             {
318                 mpr("A being of your status worships no god.");
319                 return;
320             }
321
322             you.turn_is_over = true;
323             // But if we don't convert then god_pitch
324             // makes it not take a turn after all.
325             god_pitch(feat_altar_god(grd(you.pos())));
326             return;
327         }
328     }
329
330     if (you.religion == GOD_NO_GOD)
331     {
332         const mon_holy_type holi = you.holiness();
333
334         mprf(MSGCH_PRAY,
335              "You spend a moment contemplating the meaning of %s.",
336              holi == MH_NONLIVING || holi == MH_UNDEAD ? "existence" : "life");
337
338         // Zen meditation is timeless.
339         return;
340     }
341
342     mprf(MSGCH_PRAY, "You offer a prayer to %s.",
343          god_name(you.religion).c_str());
344
345     if (you.religion == GOD_FEDHAS && fedhas_fungal_bloom())
346         something_happened = true;
347
348     // All sacrifices affect items you're standing on.
349     something_happened |= _offer_items();
350
351     if (you.religion == GOD_XOM)
352         mpr(getSpeakString("Xom prayer"), MSGCH_GOD);
353     else if (player_under_penance())
354         simple_god_message(" demands penance!");
355     else
356         mpr(god_prayer_reaction().c_str(), MSGCH_PRAY, you.religion);
357
358     if (something_happened)
359         you.turn_is_over = true;
360     dprf("piety: %d (-%d)", you.piety, you.piety_hysteresis);
361 }
362
363 int zin_tithe(item_def& item, int quant, bool quiet, bool converting)
364 {
365     int taken = 0;
366     int due = quant += you.attribute[ATTR_TITHE_BASE];
367     if (due > 0)
368     {
369         int tithe = due / 10;
370         due -= tithe * 10;
371         // Those high enough in the hierarchy get to reap the benefits.
372         // You're never big enough to be paid, the top is not having to pay
373         // (and even that at 200 piety, for a brief moment until it decays).
374         tithe = min(tithe,
375                     (you.penance[GOD_ZIN] + MAX_PIETY - you.piety) * 2 / 3);
376         if (tithe <= 0)
377         {
378             // update the remainder anyway
379             you.attribute[ATTR_TITHE_BASE] = due;
380             return 0;
381         }
382         taken = tithe;
383         you.attribute[ATTR_DONATIONS] += tithe;
384         mprf("You pay a tithe of %d gold.", tithe);
385
386         if (item.plus == 1) // seen before worshipping Zin
387         {
388             tithe = 0;
389             simple_god_message(" is a bit unhappy you did not bring this "
390                                "gold earlier.");
391         }
392         // A single scroll can give you more than D:1-18, Lair and Orc
393         // together, limit the gains.  You're still required to pay from
394         // your sudden fortune, yet it's considered your duty to the Church
395         // so piety is capped.  If you want more piety, donate more!
396         //
397         // Note that the stepdown is not applied to other gains: it would
398         // be simpler, yet when a monster combines a number of gold piles
399         // you shouldn't be penalized.
400         int denom = 2;
401         if (item.props.exists("acquired")) // including "acquire any" in vaults
402         {
403             tithe = stepdown_value(tithe, 10, 10, 50, 50);
404             dprf("Gold was acquired, reducing gains to %d.", tithe);
405         }
406         else
407         {
408             if (player_in_branch(BRANCH_ORCISH_MINES) && !converting)
409             {
410                 // Another special case: Orc gives simply too much compared to
411                 // other branches.
412                 denom *= 2;
413             }
414             // Avg gold pile value: 10 + depth/2.
415             tithe *= 47;
416             denom *= 20 + env.absdepth0;
417         }
418         gain_piety(tithe * 3, denom);
419     }
420     you.attribute[ATTR_TITHE_BASE] = due;
421     return taken;
422 }
423
424 static int _gold_to_donation(int gold)
425 {
426     return static_cast<int>((gold * log((float)gold)) / MAX_PIETY);
427 }
428
429 static bool _zin_donate_gold()
430 {
431     if (you.gold == 0)
432     {
433         mpr("You don't have anything to sacrifice.");
434         return false;
435     }
436
437     if (!yesno("Do you wish to donate half of your money?", true, 'n'))
438     {
439         canned_msg(MSG_OK);
440         return false;
441     }
442
443     const int donation_cost = (you.gold / 2) + 1;
444     const int donation = _gold_to_donation(donation_cost);
445
446 #if defined(DEBUG_DIAGNOSTICS) || defined(DEBUG_SACRIFICE) || defined(DEBUG_PIETY)
447     mprf(MSGCH_DIAGNOSTICS, "A donation of $%d amounts to an "
448          "increase of piety by %d.", donation_cost, donation);
449 #endif
450     // Take a note of the donation.
451     take_note(Note(NOTE_DONATE_MONEY, donation_cost));
452
453     you.attribute[ATTR_DONATIONS] += donation_cost;
454
455     you.del_gold(donation_cost);
456
457     if (donation < 1)
458     {
459         simple_god_message(" finds your generosity lacking.");
460         return false;
461     }
462
463     you.duration[DUR_PIETY_POOL] += donation;
464     if (you.duration[DUR_PIETY_POOL] > 30000)
465         you.duration[DUR_PIETY_POOL] = 30000;
466
467     const int estimated_piety =
468         min(MAX_PENANCE + MAX_PIETY, you.piety + you.duration[DUR_PIETY_POOL]);
469
470     if (player_under_penance())
471     {
472         if (estimated_piety >= you.penance[GOD_ZIN])
473             mpr("You feel that you will soon be absolved of all your sins.");
474         else
475             mpr("You feel that your burden of sins will soon be lighter.");
476     }
477     else
478     {
479         string result = "You feel that " + god_name(GOD_ZIN) + " will soon be ";
480         result +=
481             (estimated_piety > 130) ? "exalted by your worship" :
482             (estimated_piety > 100) ? "extremely pleased with you" :
483             (estimated_piety >  70) ? "greatly pleased with you" :
484             (estimated_piety >  40) ? "most pleased with you" :
485             (estimated_piety >  20) ? "pleased with you" :
486             (estimated_piety >   5) ? "noncommittal"
487                                     : "displeased";
488         result += (donation >= 30 && you.piety <= 170) ? "!" : ".";
489
490         mpr(result.c_str());
491     }
492
493     return true;
494 }
495
496 static int _leading_sacrifice_group()
497 {
498     int weights[5];
499     get_pure_deck_weights(weights);
500     int best_i = -1, maxweight = -1;
501     for (int i = 0; i < 5; ++i)
502     {
503         if (best_i == -1 || weights[i] > maxweight)
504         {
505             maxweight = weights[i];
506             best_i = i;
507         }
508     }
509     return best_i;
510 }
511
512 static void _give_sac_group_feedback(int which)
513 {
514     ASSERT_RANGE(which, 0, 5);
515     const char* names[] = {
516         "Escape", "Destruction", "Dungeons", "Summoning", "Wonder"
517     };
518     mprf(MSGCH_GOD, "A symbol of %s coalesces before you, then vanishes.",
519          names[which]);
520 }
521
522 static void _ashenzari_sac_scroll(const item_def& item)
523 {
524     int scr = SCR_CURSE_JEWELLERY;
525     if (you.species != SP_FELID
526         && (you.species != SP_OCTOPODE || one_chance_in(4)))
527     {
528         scr = random_choose(SCR_CURSE_WEAPON, SCR_CURSE_ARMOUR,
529                             SCR_CURSE_JEWELLERY, -1);
530     }
531     int it = items(0, OBJ_SCROLLS, scr, true, 0, MAKE_ITEM_NO_RACE,
532                    0, 0, GOD_ASHENZARI);
533     if (it == NON_ITEM)
534     {
535         mpr("You feel the world is against you.");
536         return;
537     }
538
539     mitm[it].quantity = 1;
540     if (!move_item_to_grid(&it, you.pos(), true))
541         destroy_item(it, true); // can't happen
542 }
543
544 // Is the destroyed weapon valuable enough to gain piety by doing so?
545 // Unholy and evil weapons are handled specially.
546 static bool _destroyed_valuable_weapon(int value, int type)
547 {
548     // value/500 chance of piety normally
549     if (value > random2(500))
550         return true;
551
552     // But all non-missiles are acceptable if you've never reached *.
553     if (you.piety_max[GOD_ELYVILON] < piety_breakpoint(0)
554         && type != OBJ_MISSILES)
555     {
556         return true;
557     }
558
559     return false;
560 }
561
562 static piety_gain_t _sac_corpse(const item_def& item)
563 {
564     if (you.religion == GOD_OKAWARU)
565     {
566         monster dummy;
567         dummy.type = (monster_type)(item.orig_monnum ? item.orig_monnum
568                                                      : item.plus);
569         if (item.props.exists(MONSTER_NUMBER))
570             dummy.number   = item.props[MONSTER_NUMBER].get_short();
571         define_monster(&dummy);
572
573         // Hit dice are overridden by define_monster, so only set them now.
574         if (item.props.exists(MONSTER_HIT_DICE))
575         {
576             int hd = item.props[MONSTER_HIT_DICE].get_short();
577             const monsterentry *m = get_monster_data(dummy.type);
578             int hp = hit_points(hd, m->hpdice[1], m->hpdice[2]) + m->hpdice[3];
579
580             dummy.hit_dice = hd;
581             dummy.max_hit_points = hp;
582         }
583         int gain = get_fuzzied_monster_difficulty(&dummy);
584         dprf("fuzzied corpse difficulty: %4.2f", gain*0.01);
585
586         // Shouldn't be needed, but just in case an XL:1 spriggan diver walks
587         // into a minotaur corpses vault on D:10 ...
588         if (item.props.exists("cap_sacrifice"))
589             gain = min(gain, 700 * 3);
590
591         gain_piety(gain, 700);
592         gain = div_rand_round(gain, 700);
593         return (gain <= 0) ? PIETY_NONE : (gain < 4) ? PIETY_SOME : PIETY_LOTS;
594     }
595
596     gain_piety(13, 19);
597
598     // The feedback is not accurate any longer on purpose; it only reveals
599     // the rate you get piety at.
600     return x_chance_in_y(13, 19) ? PIETY_SOME : PIETY_NONE;
601 }
602
603 // God effects of sacrificing one item from a stack (e.g., a weapon, one
604 // out of 20 arrows, etc.).  Does not modify the actual item in any way.
605 static piety_gain_t _sacrifice_one_item_noncount(const item_def& item,
606        int *js, bool first)
607 {
608     // XXX: this assumes that there's no overlap between
609     //      item-accepting gods and corpse-accepting gods.
610     if (god_likes_fresh_corpses(you.religion))
611         return _sac_corpse(item);
612
613     // item_value() multiplies by quantity.
614     const int shop_value = item_value(item, true) / item.quantity;
615     // Since the god is taking the items as a sacrifice, they must have at
616     // least minimal value, otherwise they wouldn't be taken.
617     const int value = (item.base_type == OBJ_CORPSES ?
618                           50 * stepdown_value(max(1,
619                           get_max_corpse_chunks(item.mon_type)), 4, 4, 12, 12) :
620                       (is_worthless_consumable(item) ? 1 : shop_value));
621
622 #if defined(DEBUG_DIAGNOSTICS) || defined(DEBUG_SACRIFICE)
623         mprf(MSGCH_DIAGNOSTICS, "Sacrifice item value: %d", value);
624 #endif
625
626     piety_gain_t relative_piety_gain = PIETY_NONE;
627     switch (you.religion)
628     {
629     case GOD_ELYVILON:
630     {
631         const bool valuable_weapon =
632             _destroyed_valuable_weapon(value, item.base_type);
633         const bool unholy_weapon = is_unholy_item(item);
634         const bool evil_weapon = is_evil_item(item);
635
636         if (valuable_weapon || unholy_weapon || evil_weapon)
637         {
638             if (unholy_weapon || evil_weapon)
639             {
640                 const char *desc_weapon = evil_weapon ? "evil" : "unholy";
641
642                 // Print this in addition to the above!
643                 if (first)
644                 {
645                     simple_god_message(make_stringf(
646                              " welcomes the destruction of %s %s weapon%s.",
647                              item.quantity == 1 ? "this" : "these",
648                              desc_weapon,
649                              item.quantity == 1 ? ""     : "s").c_str(),
650                              GOD_ELYVILON);
651                 }
652             }
653
654             gain_piety(1);
655             relative_piety_gain = PIETY_SOME;
656         }
657         break;
658     }
659
660     case GOD_BEOGH:
661     {
662         const int item_orig = item.orig_monnum;
663
664         int chance = 4;
665
666         if (item_orig == MONS_SAINT_ROKA)
667             chance += 12;
668         else if (item_orig == MONS_ORC_HIGH_PRIEST)
669             chance += 8;
670         else if (item_orig == MONS_ORC_PRIEST)
671             chance += 4;
672
673         if (food_is_rotten(item))
674             chance--;
675         else if (item.sub_type == CORPSE_SKELETON)
676             chance -= 2;
677
678         gain_piety(chance, 20);
679         if (x_chance_in_y(chance, 20))
680             relative_piety_gain = PIETY_SOME;
681         break;
682     }
683
684     case GOD_NEMELEX_XOBEH:
685     {
686         if (you.attribute[ATTR_CARD_COUNTDOWN] && x_chance_in_y(value, 800))
687         {
688             you.attribute[ATTR_CARD_COUNTDOWN]--;
689 #if defined(DEBUG_DIAGNOSTICS) || defined(DEBUG_CARDS) || defined(DEBUG_SACRIFICE)
690             mprf(MSGCH_DIAGNOSTICS, "Countdown down to %d",
691                  you.attribute[ATTR_CARD_COUNTDOWN]);
692 #endif
693         }
694         // Nemelex piety gain is fairly fast... at least when you
695         // have low piety.
696         int piety_change = value/2 + 1;
697         if (is_artefact(item))
698             piety_change *= 2;
699         int piety_denom = 30 + you.piety/2;
700
701         gain_piety(piety_change, piety_denom);
702
703         // Preserving the old behaviour of giving the big message for
704         // artefacts and artefacts only.
705         relative_piety_gain = x_chance_in_y(piety_change, piety_denom) ?
706                                 is_artefact(item) ?
707                                   PIETY_LOTS : PIETY_SOME : PIETY_NONE;
708
709         if (item.base_type == OBJ_FOOD && item.sub_type == FOOD_CHUNK
710             || is_blood_potion(item))
711         {
712             // Count chunks and blood potions towards decks of
713             // Summoning.
714             you.sacrifice_value[OBJ_CORPSES] += value;
715         }
716         else
717             you.sacrifice_value[item.base_type] += value;
718         break;
719     }
720
721     case GOD_JIYVA:
722     {
723         // compress into range 0..250
724         const int stepped = stepdown_value(value, 50, 50, 200, 250);
725         gain_piety(stepped, 50);
726         relative_piety_gain = (piety_gain_t)min(2, div_rand_round(stepped, 50));
727         jiyva_slurp_bonus(div_rand_round(stepped, 50), js);
728         break;
729     }
730
731     case GOD_ASHENZARI:
732         _ashenzari_sac_scroll(item);
733         break;
734
735     default:
736         break;
737     }
738
739     return relative_piety_gain;
740 }
741
742 piety_gain_t sacrifice_item_stack(const item_def& item, int *js, int quantity)
743 {
744     if (quantity <= 0)
745         quantity = item.quantity;
746     piety_gain_t relative_gain = PIETY_NONE;
747     for (int j = 0; j < quantity; ++j)
748     {
749         const piety_gain_t gain = _sacrifice_one_item_noncount(item, js, !j);
750
751         // Update piety gain if necessary.
752         if (gain != PIETY_NONE)
753         {
754             if (relative_gain == PIETY_NONE)
755                 relative_gain = gain;
756             else            // some + some = lots
757                 relative_gain = PIETY_LOTS;
758         }
759     }
760     return relative_gain;
761 }
762
763 bool check_nemelex_sacrificing_item_type(const item_def& item)
764 {
765     switch (item.base_type)
766     {
767     case OBJ_ARMOUR:
768         return you.nemelex_sacrificing[NEM_GIFT_ESCAPE];
769
770     case OBJ_WEAPONS:
771     case OBJ_STAVES:
772     case OBJ_RODS:
773     case OBJ_MISSILES:
774         return you.nemelex_sacrificing[NEM_GIFT_DESTRUCTION];
775
776     case OBJ_CORPSES:
777         return you.nemelex_sacrificing[NEM_GIFT_SUMMONING];
778
779     case OBJ_POTIONS:
780         if (is_blood_potion(item))
781             return you.nemelex_sacrificing[NEM_GIFT_SUMMONING];
782         return you.nemelex_sacrificing[NEM_GIFT_WONDERS];
783
784     case OBJ_FOOD:
785         if (item.sub_type == FOOD_CHUNK)
786             return you.nemelex_sacrificing[NEM_GIFT_SUMMONING];
787     // else fall through
788     case OBJ_WANDS:
789     case OBJ_SCROLLS:
790         return you.nemelex_sacrificing[NEM_GIFT_WONDERS];
791
792     case OBJ_JEWELLERY:
793     case OBJ_BOOKS:
794     case OBJ_MISCELLANY:
795         return you.nemelex_sacrificing[NEM_GIFT_DUNGEONS];
796
797     default:
798         return false;
799     }
800 }
801
802 static bool _offer_items()
803 {
804     if (!god_likes_items(you.religion))
805         return false;
806
807     if (!_confirm_pray_sacrifice(you.religion))
808         return false;
809
810     int i = you.visible_igrd(you.pos());
811
812     god_acting gdact;
813
814     int num_sacced = 0;
815     int num_disliked = 0;
816     item_def *disliked_item = 0;
817
818     const int old_leading = _leading_sacrifice_group();
819
820     while (i != NON_ITEM)
821     {
822         item_def &item(mitm[i]);
823         const int next = item.link;  // in case we can't get it later.
824         const bool disliked = !god_likes_item(you.religion, item);
825
826         if (item_is_stationary(item) || disliked)
827         {
828             i = next;
829             if (disliked)
830             {
831                 num_disliked++;
832                 disliked_item = &item;
833             }
834             continue;
835         }
836
837         // Skip items you don't want to sacrifice right now.
838         if (you.religion == GOD_NEMELEX_XOBEH
839             && !check_nemelex_sacrificing_item_type(item))
840         {
841             i = next;
842             continue;
843         }
844
845         // Ignore {!D} inscribed items.
846         if (!check_warning_inscriptions(item, OPER_DESTROY))
847         {
848             mpr("Won't sacrifice {!D} inscribed item.");
849             i = next;
850             continue;
851         }
852
853         if (god_likes_item(you.religion, item)
854             && (item.inscription.find("=p") != string::npos))
855         {
856             const string msg = "Really sacrifice " + item.name(DESC_A) + "?";
857
858             if (!yesno(msg.c_str(), false, 'n'))
859             {
860                 i = next;
861                 continue;
862             }
863         }
864
865
866         piety_gain_t relative_gain = sacrifice_item_stack(item);
867         print_sacrifice_message(you.religion, mitm[i], relative_gain);
868         item_was_destroyed(mitm[i]);
869         destroy_item(i);
870         i = next;
871         num_sacced++;
872     }
873
874     if (num_sacced > 0 && you.religion == GOD_NEMELEX_XOBEH)
875     {
876         const int new_leading = _leading_sacrifice_group();
877         if (old_leading != new_leading || one_chance_in(50))
878             _give_sac_group_feedback(new_leading);
879
880 #if defined(DEBUG_GIFTS) || defined(DEBUG_CARDS) || defined(DEBUG_SACRIFICE)
881         _show_pure_deck_chances();
882 #endif
883     }
884     // Explanatory messages if nothing the god likes is sacrificed.
885     else if (num_sacced == 0 && num_disliked > 0)
886     {
887         ASSERT(disliked_item);
888
889         if (item_is_orb(*disliked_item))
890             simple_god_message(" wants the Orb's power used on the surface!");
891         else if (item_is_rune(*disliked_item))
892             simple_god_message(" wants the runes to be proudly displayed.");
893         else if (item_is_horn_of_geryon(*disliked_item))
894             simple_god_message(" doesn't want your path blocked.");
895         // Zin was handled above, and the other gods don't care about
896         // sacrifices.
897         else if (god_likes_fresh_corpses(you.religion))
898             simple_god_message(" only cares about fresh corpses!");
899         else if (you.religion == GOD_BEOGH)
900             simple_god_message(" only cares about orcish remains!");
901         else if (you.religion == GOD_NEMELEX_XOBEH)
902             if (disliked_item->base_type == OBJ_GOLD)
903                 simple_god_message(" does not care about gold!");
904             else
905                 simple_god_message(" expects you to use your decks, not offer them!");
906         else if (you.religion == GOD_ASHENZARI)
907             simple_god_message(" can corrupt only scrolls of remove curse.");
908     }
909     if (num_sacced == 0 && you.religion == GOD_ELYVILON)
910     {
911         mprf("There are no %sweapons here to destroy!",
912              you.piety_max[GOD_ELYVILON] < piety_breakpoint(2) ? "" : "unholy or evil ");
913     }
914
915     return (num_sacced > 0);
916 }