Partially refactor _get_possible_sacrifices()
[crawl.git] / crawl-ref / source / religion.cc
1 /**
2  * @file
3  * @brief Misc religion related functions.
4 **/
5
6 #include "AppHdr.h"
7
8 #include "religion.h"
9
10 #include <algorithm>
11 #include <cmath>
12 #include <cstdio>
13 #include <cstdlib>
14 #include <cstring>
15 #include <functional>
16 #include <sstream>
17
18 #include "ability.h"
19 #include "acquire.h"
20 #include "act-iter.h"
21 #include "areas.h"
22 #include "attitude-change.h"
23 #include "branch.h"
24 #include "chardump.h"
25 #include "coordit.h"
26 #include "dactions.h"
27 #include "database.h"
28 #include "decks.h"
29 #include "delay.h"
30 #include "describe-god.h"
31 #include "dgnevent.h"
32 #include "dlua.h"
33 #include "english.h"
34 #include "env.h"
35 #include "exercise.h"
36 #include "godabil.h"
37 #include "godcompanions.h"
38 #include "goditem.h"
39 #include "godpassive.h"
40 #include "godprayer.h"
41 #include "godwrath.h"
42 #include "hints.h"
43 #include "hiscores.h"
44 #include "invent.h"
45 #include "itemprop.h"
46 #include "items.h"
47 #include "libutil.h"
48 #include "makeitem.h"
49 #include "message.h"
50 #include "misc.h"
51 #include "mon-place.h"
52 #include "mutation.h"
53 #include "notes.h"
54 #include "output.h"
55 #include "player-stats.h"
56 #include "prompt.h"
57 #include "skills.h"
58 #include "spl-book.h"
59 #include "spl-miscast.h"
60 #include "sprint.h"
61 #include "state.h"
62 #include "stringutil.h"
63 #include "terrain.h"
64 #include "transform.h"
65 #include "view.h"
66
67 #ifdef DEBUG_RELIGION
68 #    define DEBUG_DIAGNOSTICS
69 #    define DEBUG_GIFTS
70 #    define DEBUG_SACRIFICE
71 #    define DEBUG_PIETY
72 #endif
73
74 #define PIETY_HYSTERESIS_LIMIT 1
75
76 // Item offering messages for the gods:
77 // & is replaced by "is" or "are" as appropriate for the item.
78 // % is replaced by "s" or "" as appropriate.
79 // Text between [] only appears if the item already glows.
80 // First message is if there's no piety gain; second is if piety gain is
81 // one; third is if piety gain is more than one.
82 static const char *_Sacrifice_Messages[NUM_GODS][NUM_PIETY_GAIN] =
83 {
84     // No god
85     {
86         " & eaten by a bored swarm of bugs.",
87         " & eaten by a swarm of bugs.",
88         " & eaten by a ravening swarm of bugs."
89     },
90     // Zin
91     {
92         " barely glow% and disappear%.",
93         " glow% silver and disappear%.",
94         " glow% blindingly silver and disappear%.",
95     },
96     // TSO
97     {
98         " glow% a dingy golden colour and disappear%.",
99         " glow% a golden colour and disappear%.",
100         " glow% a brilliant golden colour and disappear%.",
101     },
102     // Kikubaaqudgha
103     {
104         " convulse% and rot% away.",
105         " convulse% madly and rot% away.",
106         " convulse% furiously and rot% away.",
107     },
108     // Yredelemnul
109     {
110         " slowly crumble% to dust.",
111         " crumble% to dust.",
112         " turn% to dust in an instant.",
113     },
114     // Xom (no sacrifices)
115     {
116         " & eaten by a bored bug.",
117         " & eaten by a bug.",
118         " & eaten by a greedy bug.",
119     },
120     // Vehumet
121     {
122         " fade% into nothingness.",
123         " burn% into nothingness.",
124         " explode% into nothingness.",
125     },
126     // Okawaru
127     {
128         " slowly burn% to ash.",
129         " & consumed by flame.",
130         " & consumed in a burst of flame.",
131     },
132     // Makhleb
133     {
134         " disappear% without a sign.",
135         " flare% red and disappear%.",
136         " flare% blood-red and disappear%.",
137     },
138     // Sif Muna
139     {
140         " & gone without a[dditional] glow.",
141         " glow% slightly [brighter ]for a moment, and & gone.",
142         " glow% [brighter ]for a moment, and & gone.",
143     },
144     // Trog
145     {
146         " & slowly consumed by flames.",
147         " & consumed in a column of flame.",
148         " & consumed in a roaring column of flame.",
149     },
150     // Nemelex (no sacrifices)
151     {
152         " & eaten by a bored swarm of bugs.",
153         " & eaten by a swarm of bugs.",
154         " & eaten by a ravening swarm of bugs."
155     },
156     // Elyvilon
157     {
158         " barely shimmer% and break% into pieces.",
159         " shimmer% and break% into pieces.",
160         " shimmer% wildly and break% into pieces.",
161     },
162     // Lugonu
163     {
164         " disappear% into the void.",
165         " & consumed by the void.",
166         " & voraciously consumed by the void.",
167     },
168     // Beogh
169     {
170         " slowly crumble% into the ground.",
171         " crumble% into the ground.",
172         " disintegrate% into the ground.",
173     },
174     // Jiyva
175     {
176         " slowly dissolve% into ooze.",
177         " dissolve% into ooze.",
178         " disappear% with a satisfied slurp.",
179     },
180     // Fedhas
181     {
182         " & slowly absorbed by the ecosystem.",
183         " & absorbed by the ecosystem.",
184         " & instantly absorbed by the ecosystem.",
185     },
186     // Cheibriados (slow god, so better sacrifices are slower)
187     {
188         " freeze% in place and instantly disappear%.",
189         " freeze% in place and disappear%.",
190         " freeze% in place and slowly fade%.",
191     },
192     // Ashenzari
193     {
194         " flicker% black.",
195         " pulsate% black.",          // unused
196         " strongly pulsate% black.", // unused
197     },
198     // Dithmenos
199     {
200         " slowly dissolves into the shadows.",
201         " dissolves into the shadows.",
202         " rapidly dissolves into the shadows.",
203     },
204     // Gozag
205     {
206         " softly glitters and disappears.",
207         " glitters and disappears.",
208         " brightly glitters and disappears.",
209     },
210     // Qazlal
211     {
212         " slowly dissolves into the earth.",
213         " is consumed by the earth.",
214         " is consumed by a violent tear in the earth.",
215     },
216     // Ru
217     {
218         " disappears in a small burst of power.",
219         " disappears in a burst of power",
220         " disappears in an immense burst of power",
221     },
222 };
223
224 /**
225  * This corresponds with ::god_abilities, as well as with ::god_lose_power_messages.
226  */
227 const char* god_gain_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
228 {
229     // no god
230     { "", "", "", "", "" },
231     // Zin
232     { "recite Zin's Axioms of Law",
233       "call upon Zin for vitalisation",
234       "call upon Zin to imprison the lawless",
235       "",
236       "call upon Zin to create a sanctuary" },
237     // TSO
238     { "You and your allies can gain power from killing the unholy and evil.",
239       "call upon the Shining One for a divine shield",
240       "",
241       "channel blasts of cleansing flame",
242       "summon a divine warrior" },
243     // Kikubaaqudgha
244     { "receive cadavers from Kikubaaqudgha",
245       "Kikubaaqudgha is protecting you from necromantic miscasts and death curses.",
246       "",
247       "Kikubaaqudgha is protecting you from unholy torment.",
248       "invoke torment by sacrificing a corpse" },
249     // Yredelemnul
250     { "animate {yred_dead}",
251       "recall your undead slaves and mirror injuries on your foes",
252       "[animate {yred_dead}]",
253       "drain ambient lifeforce",
254       "enslave living souls" },
255     // Xom
256     { "", "", "", "", "" },
257     // Vehumet
258     { "gain magical power from killing",
259       "",
260       "Vehumet is aiding your destructive magics.",
261       "Vehumet is extending the range of your destructive magics.",
262       "" },
263     // Okawaru
264     { "gain great but temporary skills",
265       "",
266       "",
267       "",
268       "speed up your combat" },
269     // Makhleb
270     { "gain health from killing",
271       "harness Makhleb's destructive might",
272       "summon a lesser servant of Makhleb",
273       "hurl Makhleb's greater destruction",
274       "summon a greater servant of Makhleb" },
275     // Sif Muna
276     { "tap ambient magical fields",
277       "freely open your mind to new spells",
278       "",
279       "Sif Muna is protecting you from the effects of miscast magic.",
280       "" },
281     // Trog
282     { "go berserk at will",
283       "regenerate and be protected from hostile enchantments",
284       "",
285       "call in reinforcements",
286       "" },
287     // Nemelex
288     { "",
289       "",
290       "choose one out of three cards",
291       "deal four cards at a time",
292       "order the top five cards of a deck, losing the rest" },
293     // Elyvilon
294     { "provide lesser healing for yourself",
295       "purify yourself",
296       "provide greater healing for yourself and others",
297       "",
298       "call upon Elyvilon for divine vigour" },
299     // Lugonu
300     { "depart the Abyss",
301       "bend space around yourself",
302       "banish your foes",
303       "corrupt the fabric of space",
304       "gate yourself to the Abyss" },
305     // Beogh
306     { "Beogh aids your use of armour.",
307       "smite your foes",
308       "gain orcish followers",
309       "recall your orcish followers",
310       "walk on water and give items to your followers" },
311     // Jiyva
312     { "request a jelly",
313       "temporarily halt your jellies' item consumption",
314       "",
315       "turn your foes to slime",
316       "call upon Jiyva to remove your harmful mutations"
317     },
318     // Fedhas
319     { "induce evolution",
320       "call sunshine",
321       "cause a ring of plants to grow",
322       "spawn explosive spores",
323       "control the weather"
324     },
325     // Cheibriados
326     { "",
327       "",
328       "warp the flow of time around you",
329       "inflict damage on those overly hasty",
330       "step out of the time flow"
331     },
332     // Ashenzari
333     { "",
334       "The more cursed you are, the more Ashenzari supports your skills.",
335       "Ashenzari keeps your vision and mind clear.",
336       "scry through walls",
337       "Ashenzari helps you to reconsider your skills."
338     },
339     // Dithmenos
340     { "",
341       "step into the shadows of nearby creatures",
342       "You now sometimes bleed smoke when heavily injured by enemies.",
343       "Your shadow now sometimes tangibly mimics your actions.",
344       "transform into a swirling mass of shadows"
345     },
346     // Gozag
347     { "petition Gozag for potion effects",
348       "fund merchants seeking to open stores in the dungeon",
349       "bribe branches to halt enemies' attacks and recruit allies",
350       "",
351       ""
352     },
353     // Qazlal
354     { "You are surrounded by a storm.",
355       "call upon nature to destroy your foes",
356       "give life to nearby clouds",
357       "You adapt resistances upon receiving elemental damage.",
358       "call upon nature's wrath in a wide area around you"
359     },
360     //Ru
361     { "You exude an aura of power that intimidates your foes.",
362       "Your aura of power can strike those that harm you.",
363       "heal your body and restore your magic",
364       "gather your power into a mighty leap",
365       "wreak a terrible wrath on your foes"
366     },
367 };
368
369 /**
370  * This corresponds with ::god_abilities, as well as with ::god_gain_power_messages.
371  */
372 const char* god_lose_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
373 {
374     // no god
375     { "", "", "", "", "" },
376     // Zin
377     { "recite Zin's Axioms of Law",
378       "call upon Zin for vitalisation",
379       "call upon Zin to imprison the lawless",
380       "",
381       "call upon Zin to create a sanctuary" },
382     // TSO
383     { "You and your allies can no longer gain power from killing the unholy and evil.",
384       "call upon the Shining One for a divine shield",
385       "",
386       "channel blasts of cleansing flame",
387       "summon a divine warrior" },
388     // Kikubaaqudgha
389     { "receive cadavers from Kikubaaqudgha",
390       "Kikubaaqudgha no longer protects you from necromantic miscasts or death curses.",
391       "",
392       "Kikubaaqudgha will no longer protect you from unholy torment.",
393       "invoke torment by sacrificing a corpse" },
394     // Yredelemnul
395     { "animate {yred_dead}",
396       "recall your undead slaves and mirror injuries on your foes",
397       "[animate {yred_dead}]",
398       "drain ambient lifeforce",
399       "enslave living souls" },
400     // Xom
401     { "", "", "", "", "" },
402     // Vehumet
403     { "gain magical power from killing",
404       "",
405       "Vehumet will no longer aid your destructive magics.",
406       "Vehumet will no longer extend the range of your destructive magics.",
407       "" },
408     // Okawaru
409     { "gain great but temporary skills",
410       "",
411       "",
412       "",
413       "speed up your combat" },
414     // Makhleb
415     { "gain health from killing",
416       "harness Makhleb's destructive might",
417       "summon a lesser servant of Makhleb",
418       "hurl Makhleb's greater destruction",
419       "summon a greater servant of Makhleb" },
420     // Sif Muna
421     { "tap ambient magical fields",
422       "forget spells at will",
423       "",
424       "Sif Muna no longer protects you from the effects of miscast magic.",
425       "" },
426     // Trog
427     { "go berserk at will",
428       "call upon Trog for regeneration and protection from hostile enchantments",
429       "",
430       "call in reinforcements",
431       "" },
432     // Nemelex
433     { "",
434       "",
435       "choose one out of three cards",
436       "deal four cards at a time",
437       "stack decks" },
438     // Elyvilon
439     { "provide lesser healing for yourself",
440       "purify yourself",
441       "provide greater healing",
442       "",
443       "call upon Elyvilon for divine vigour" },
444     // Lugonu
445     { "depart the Abyss at will",
446       "bend space around yourself",
447       "banish your foes",
448       "corrupt the fabric of space",
449       "gate yourself to the Abyss" },
450     // Beogh
451     { "Beogh no longer aids your use of armour.",
452       "smite your foes",
453       "gain orcish followers",
454       "recall your orcish followers",
455       "walk on water or give items to your followers" },
456     // Jiyva
457     { "request a jelly",
458       "temporarily halt your jellies' item consumption",
459       "",
460       "turn your foes to slime",
461       "call upon Jiyva to remove your harmful mutations"
462     },
463     // Fedhas
464     { "induce evolution",
465       "call sunshine",
466       "cause a ring of plants to grow",
467       "spawn explosive spores",
468       "control the weather"
469     },
470     // Cheibriados
471     { "bend time to slow others",
472       "",
473       "warp the flow of time around you",
474       "inflict damage on those overly hasty",
475       "step out of the time flow"
476     },
477     // Ashenzari
478     { "",
479       "Ashenzari no longer supports your skills.",
480       "Ashenzari no longer keeps your vision and mind clear.",
481       "scry through walls",
482       "Ashenzari no longer helps you to reconsider your skills."
483     },
484     // Dithmenos
485     { "",
486       "step into the shadows of nearby creatures",
487       "You no longer bleed smoke.",
488       "Your shadow no longer tangibly mimics your actions.",
489       "transform into a swirling mass of shadows"
490     },
491     // Gozag
492     { "petition Gozag for potion effects",
493       "fund merchants seeking to open stores in the dungeon",
494       "bribe branches to halt enemies' attacks and recruit followers",
495       "",
496       ""
497     },
498     // Qazlal
499     { "Your storm dissipates completely.",
500       "call upon nature to destroy your foes",
501       "give life to nearby clouds",
502       "You no longer adapt resistances upon receiving elemental damage.",
503       "call upon nature's wrath in a wide area around you"
504     },
505     //Ru
506     { "You no longer exude an aura of power that intimidates your foes.",
507       "Your aura of power no longer strikes those that harm you.",
508       "use your power to heal your body and restore your magic",
509       "gather your power into a mighty leap",
510       "wreak a terrible wrath on all visible foes"
511     },
512 };
513
514 static void _place_delayed_monsters();
515
516 bool is_evil_god(god_type god)
517 {
518     return god == GOD_KIKUBAAQUDGHA
519            || god == GOD_MAKHLEB
520            || god == GOD_YREDELEMNUL
521            || god == GOD_BEOGH
522            || god == GOD_LUGONU;
523 }
524
525 bool is_good_god(god_type god)
526 {
527     return god == GOD_ZIN
528            || god == GOD_SHINING_ONE
529            || god == GOD_ELYVILON;
530 }
531
532 bool is_chaotic_god(god_type god)
533 {
534     return god == GOD_XOM
535            || god == GOD_MAKHLEB
536            || god == GOD_LUGONU
537            || god == GOD_JIYVA;
538 }
539
540 bool is_unknown_god(god_type god)
541 {
542     return god == GOD_NAMELESS;
543 }
544
545 bool is_unavailable_god(god_type god)
546 {
547     if (god == GOD_JIYVA && jiyva_is_dead())
548         return true;
549
550     // Don't allow Fedhas in ZotDef, as his invocations are duplicated, and
551     // passives thoroughly overpowered.  Protection for plants, speed-up of
552     // oklobs, etc...
553     // Basically, ZotDef is Fedhas.
554
555     // No Ashenzari/Nemelex, too -- nothing to explore, can't use
556     // their abilities.
557     // We could give some piety for every wave, but there's little point.
558     if (crawl_state.game_is_zotdef() && (god == GOD_FEDHAS
559                                          || god == GOD_ASHENZARI
560                                          || god == GOD_NEMELEX_XOBEH))
561     {
562         return true;
563     }
564
565     return false;
566 }
567
568 god_type random_god(bool available)
569 {
570     god_type god;
571
572     do
573     {
574         god = static_cast<god_type>(random2(NUM_GODS - 1) + 1);
575     }
576     while (available && is_unavailable_god(god));
577
578     return god;
579 }
580
581 string get_god_powers(god_type which_god)
582 {
583     // Return early for the special cases.
584     if (which_god == GOD_NO_GOD)
585         return "";
586
587     string result = getLongDescription(god_name(which_god) + " powers");
588     return result;
589 }
590
591 string get_god_likes(god_type which_god, bool verbose)
592 {
593     if (which_god == GOD_NO_GOD || which_god == GOD_XOM)
594         return "";
595
596     string text = uppercase_first(god_name(which_god));
597     vector<string> likes;
598     vector<string> really_likes;
599
600     // Unique/unusual piety gain methods first.
601     switch (which_god)
602     {
603     case GOD_SIF_MUNA:
604         likes.emplace_back("you train your various spell casting skills");
605         break;
606
607     case GOD_FEDHAS:
608         snprintf(info, INFO_SIZE, "you promote the decay of nearby "
609                                   "corpses%s",
610                  verbose ? " by <w>p</w>raying" : "");
611         likes.emplace_back(info);
612         break;
613
614     case GOD_TROG:
615         snprintf(info, INFO_SIZE, "you destroy spellbooks%s",
616                  verbose ? " via the <w>a</w> command" : "");
617         likes.emplace_back(info);
618         break;
619
620     case GOD_ELYVILON:
621         snprintf(info, INFO_SIZE, "you destroy weapons (especially unholy and "
622                                   "evil ones)%s",
623                  verbose ? " via the <w>p</w> command (inscribe items with "
624                            "<w>!p</w> to prevent their accidental destruction)"
625                          : "");
626         likes.emplace_back(info);
627         likes.emplace_back("you calm hostilities by healing your foes");
628         break;
629
630     case GOD_JIYVA:
631         snprintf(info, INFO_SIZE, "you sacrifice items%s",
632                  verbose ? " by allowing slimes to consume them" : "");
633         likes.emplace_back(info);
634         break;
635
636     case GOD_CHEIBRIADOS:
637         snprintf(info, INFO_SIZE, "you kill fast things%s",
638                  verbose ? ", relative to your speed"
639                          : "");
640         likes.emplace_back(info);
641         break;
642
643     case GOD_ASHENZARI:
644         likes.emplace_back("you explore the world (preferably while bound by "
645                            "curses)");
646         break;
647
648     case GOD_SHINING_ONE:
649         likes.emplace_back("you meet creatures to determine whether they need "
650                            "to be eradicated");
651         break;
652
653     case GOD_LUGONU:
654         likes.emplace_back("you banish creatures to the Abyss");
655         break;
656
657     case GOD_GOZAG:
658         likes.emplace_back("you collect gold");
659         break;
660
661     case GOD_RU:
662       likes.emplace_back("you make personal sacrifices");
663       break;
664
665     default:
666         break;
667     }
668
669     switch (which_god)
670     {
671     case GOD_ZIN:
672         snprintf(info, INFO_SIZE, "you donate money%s",
673                  verbose ? " (by <w>p</w>raying at an altar)" : "");
674         likes.emplace_back(info);
675         break;
676
677     case GOD_BEOGH:
678         snprintf(info, INFO_SIZE, "you bless dead orcs%s",
679                  verbose ? " (by standing over their remains and <w>p</w>raying)" : "");
680
681         likes.emplace_back(info);
682         break;
683
684     case GOD_NEMELEX_XOBEH:
685         snprintf(info, INFO_SIZE, "you explore the world");
686         likes.emplace_back(info);
687         break;
688
689     default:
690         break;
691     }
692
693     if (god_likes_fresh_corpses(which_god))
694     {
695         snprintf(info, INFO_SIZE, "you sacrifice fresh corpses%s",
696                  verbose ? " (by standing over them and <w>p</w>raying)" : "");
697
698         likes.emplace_back(info);
699     }
700
701     switch (which_god)
702     {
703     case GOD_MAKHLEB:
704     case GOD_LUGONU:
705     case GOD_QAZLAL:
706         likes.emplace_back("you or your allies kill living beings");
707         break;
708
709     case GOD_TROG:
710         likes.emplace_back("you or your god-given allies kill living beings");
711         break;
712
713     case GOD_YREDELEMNUL:
714     case GOD_KIKUBAAQUDGHA:
715         likes.emplace_back("you or your undead slaves kill living beings");
716         break;
717
718     case GOD_BEOGH:
719         likes.emplace_back("you or your allied orcs kill living beings");
720         break;
721
722     case GOD_OKAWARU:
723     case GOD_VEHUMET:
724     case GOD_DITHMENOS:
725         likes.emplace_back("you kill living beings");
726         break;
727
728     default:
729         break;
730     }
731
732     switch (which_god)
733     {
734     case GOD_ZIN:
735         likes.emplace_back("you or your allies kill unclean or chaotic beings");
736         break;
737
738     case GOD_SHINING_ONE:
739         likes.emplace_back("you or your allies kill living unholy or evil beings");
740         break;
741
742     default:
743         break;
744     }
745
746     switch (which_god)
747     {
748     case GOD_SHINING_ONE:
749     case GOD_MAKHLEB:
750     case GOD_LUGONU:
751     case GOD_QAZLAL:
752         likes.emplace_back("you or your allies kill the undead");
753         break;
754
755     case GOD_BEOGH:
756         likes.emplace_back("you or your allied orcs kill the undead");
757         break;
758
759     case GOD_OKAWARU:
760     case GOD_VEHUMET:
761     case GOD_DITHMENOS:
762         likes.emplace_back("you kill the undead");
763         break;
764
765     default:
766         break;
767     }
768
769     switch (which_god)
770     {
771     case GOD_SHINING_ONE:
772     case GOD_MAKHLEB:
773     case GOD_LUGONU:
774     case GOD_QAZLAL:
775         likes.emplace_back("you or your allies kill demons");
776         break;
777
778     case GOD_TROG:
779         likes.emplace_back("you or your god-given allies kill demons");
780         break;
781
782     case GOD_KIKUBAAQUDGHA:
783         likes.emplace_back("you or your undead slaves kill demons");
784         break;
785
786     case GOD_BEOGH:
787         likes.emplace_back("you or your allied orcs kill demons");
788         break;
789
790     case GOD_OKAWARU:
791     case GOD_VEHUMET:
792     case GOD_DITHMENOS:
793         likes.emplace_back("you kill demons");
794         break;
795
796     default:
797         break;
798     }
799
800     switch (which_god)
801     {
802     case GOD_YREDELEMNUL:
803         likes.emplace_back("you or your undead slaves kill artificial beings");
804         break;
805
806     default:
807         break;
808     }
809
810     switch (which_god)
811     {
812     case GOD_MAKHLEB:
813     case GOD_LUGONU:
814     case GOD_QAZLAL:
815         likes.emplace_back("you or your allies kill holy beings");
816         break;
817
818     case GOD_TROG:
819         likes.emplace_back("you or your god-given allies kill holy beings");
820         break;
821
822     case GOD_YREDELEMNUL:
823         likes.emplace_back("your undead slaves kill holy beings");
824         break;
825
826     case GOD_KIKUBAAQUDGHA:
827         likes.emplace_back("you or your undead slaves kill holy beings");
828         break;
829
830     case GOD_BEOGH:
831         likes.emplace_back("you or your allied orcs kill holy beings");
832         break;
833
834     case GOD_OKAWARU:
835     case GOD_VEHUMET:
836     case GOD_DITHMENOS:
837         likes.emplace_back("you kill holy beings");
838         break;
839
840     default:
841         break;
842     }
843
844     // Especially appreciated kills.
845     switch (which_god)
846     {
847     case GOD_YREDELEMNUL:
848         really_likes.emplace_back("you kill holy beings");
849         break;
850
851     case GOD_BEOGH:
852         really_likes.emplace_back("you kill the priests of other religions");
853         break;
854
855     case GOD_TROG:
856         really_likes.emplace_back("you kill wizards and other users of magic");
857         break;
858
859     case GOD_DITHMENOS:
860         really_likes.emplace_back("you kill beings that bring fire to the "
861                                   "dungeon");
862         break;
863     default:
864         break;
865     }
866
867     if (likes.empty() && really_likes.empty())
868         text += " doesn't like anything? This is a bug; please report it.";
869     else
870     {
871         text += " likes it when ";
872         text += comma_separated_line(likes.begin(), likes.end());
873         text += ".";
874
875         if (!really_likes.empty())
876         {
877             text += " ";
878             text += uppercase_first(god_name(which_god));
879
880             text += " especially likes it when ";
881             text += comma_separated_line(really_likes.begin(),
882                                          really_likes.end());
883             text += ".";
884         }
885     }
886
887     return text;
888 }
889
890 string get_god_dislikes(god_type which_god, bool /*verbose*/)
891 {
892     // Return early for the special cases.
893     if (which_god == GOD_NO_GOD || which_god == GOD_XOM)
894         return "";
895
896     string text;
897     vector<string> dislikes;        // Piety loss
898     vector<string> really_dislikes; // Penance
899
900     if (god_hates_cannibalism(which_god))
901         really_dislikes.emplace_back("you perform cannibalism");
902
903     if (is_good_god(which_god))
904     {
905         really_dislikes.emplace_back("you desecrate holy remains");
906
907         if (which_god == GOD_SHINING_ONE)
908             really_dislikes.emplace_back("you drink blood");
909         else
910             dislikes.emplace_back("you drink blood");
911
912         really_dislikes.emplace_back("you use necromancy");
913         really_dislikes.emplace_back("you use unholy magic or items");
914         really_dislikes.emplace_back("you attack non-hostile holy beings");
915         really_dislikes.emplace_back("you or your allies kill non-hostile holy beings");
916
917         if (which_god == GOD_ZIN)
918             dislikes.emplace_back("you attack neutral beings");
919         else
920             really_dislikes.emplace_back("you attack neutral beings");
921     }
922
923     switch (which_god)
924     {
925     case GOD_ZIN:     case GOD_SHINING_ONE:  case GOD_ELYVILON:
926     case GOD_OKAWARU:
927         really_dislikes.emplace_back("you attack allies");
928         break;
929
930     case GOD_BEOGH:
931         really_dislikes.emplace_back("you attack allied orcs");
932         break;
933
934     case GOD_JIYVA:
935         really_dislikes.emplace_back("you attack fellow slimes");
936         break;
937
938     case GOD_FEDHAS:
939         dislikes.emplace_back("you or your allies destroy plants");
940         dislikes.emplace_back("allied flora die");
941         really_dislikes.emplace_back("you use necromancy on corpses, chunks or skeletons");
942         break;
943
944     case GOD_SIF_MUNA:
945         really_dislikes.emplace_back("you destroy spellbooks");
946         break;
947
948     case GOD_DITHMENOS:
949         dislikes.emplace_back("you use fiery magic or items");
950         break;
951
952     default:
953         break;
954     }
955
956     switch (which_god)
957     {
958     case GOD_ELYVILON:
959         dislikes.emplace_back("you allow allies to die");
960         break;
961
962     default:
963         break;
964     }
965
966     switch (which_god)
967     {
968     case GOD_ZIN:
969         dislikes.emplace_back("you deliberately mutate yourself");
970         really_dislikes.emplace_back("you transform yourself");
971         really_dislikes.emplace_back("you polymorph monsters");
972         really_dislikes.emplace_back("you use unclean or chaotic magic or items");
973         really_dislikes.emplace_back("you butcher sentient beings");
974         dislikes.emplace_back("you or your allies attack monsters in a "
975                               "sanctuary");
976         break;
977
978     case GOD_SHINING_ONE:
979         really_dislikes.emplace_back("you poison monsters");
980         really_dislikes.emplace_back("you attack intelligent monsters in an "
981                                      "unchivalric manner");
982         break;
983
984     case GOD_ELYVILON:
985         really_dislikes.emplace_back("you kill living things while asking for "
986                                      "your life to be spared");
987         break;
988
989     case GOD_YREDELEMNUL:
990         really_dislikes.emplace_back("you use holy magic or items");
991         break;
992
993     case GOD_TROG:
994         really_dislikes.emplace_back("you memorise spells");
995         really_dislikes.emplace_back("you attempt to cast spells");
996         really_dislikes.emplace_back("you train magic skills");
997         break;
998
999     case GOD_BEOGH:
1000         really_dislikes.emplace_back("you desecrate orcish remains");
1001         really_dislikes.emplace_back("you destroy orcish idols");
1002         break;
1003
1004     case GOD_JIYVA:
1005         really_dislikes.emplace_back("you kill slimes");
1006         break;
1007
1008     case GOD_CHEIBRIADOS:
1009         really_dislikes.emplace_back("you hasten yourself or others");
1010         really_dislikes.emplace_back("use unnaturally quick items");
1011         break;
1012
1013     default:
1014         break;
1015     }
1016
1017     if (dislikes.empty() && really_dislikes.empty())
1018         return "";
1019
1020     if (!dislikes.empty())
1021     {
1022         text += uppercase_first(god_name(which_god));
1023         text += " dislikes it when ";
1024         text += comma_separated_line(dislikes.begin(), dislikes.end(),
1025                                      " or ", ", ");
1026         text += ".";
1027
1028         if (!really_dislikes.empty())
1029             text += " ";
1030     }
1031
1032     if (!really_dislikes.empty())
1033     {
1034         text += uppercase_first(god_name(which_god));
1035         text += " strongly dislikes it when ";
1036         text += comma_separated_line(really_dislikes.begin(),
1037                                      really_dislikes.end(),
1038                                      " or ", ", ");
1039         text += ".";
1040     }
1041
1042     return text;
1043 }
1044
1045 bool active_penance(god_type god)
1046 {
1047     // Ashenzari's penance isn't active; Nemelex's penance is only active
1048     // when the penance counter is above 100; good gods only have active
1049     // wrath when they hate your current god.
1050     return player_under_penance(god)
1051            && !is_unavailable_god(god)
1052            && god != GOD_ASHENZARI
1053            && god != GOD_GOZAG
1054            && god != GOD_RU
1055            && (god != GOD_NEMELEX_XOBEH || you.penance[god] > 100)
1056            && (god == you.religion && !is_good_god(god)
1057                || god_hates_your_god(god, you.religion));
1058 }
1059
1060 void dec_penance(god_type god, int val)
1061 {
1062     if (val <= 0 || you.penance[god] <= 0)
1063         return;
1064
1065 #ifdef DEBUG_PIETY
1066     mprf(MSGCH_DIAGNOSTICS, "Decreasing penance by %d", val);
1067 #endif
1068     if (you.penance[god] <= val)
1069     {
1070         you.penance[god] = 0;
1071
1072         mark_milestone("god.mollify",
1073                        "mollified " + god_name(god) + ".");
1074
1075         const bool dead_jiyva = (god == GOD_JIYVA && jiyva_is_dead());
1076
1077         simple_god_message(
1078             make_stringf(" seems mollified%s.",
1079                          dead_jiyva ? ", and vanishes" : "").c_str(),
1080             god);
1081
1082         if (dead_jiyva)
1083             add_daction(DACT_REMOVE_JIYVA_ALTARS);
1084
1085         take_note(Note(NOTE_MOLLIFY_GOD, god));
1086
1087         if (you_worship(god))
1088         {
1089             // Redraw piety display and, in case the best skill is Invocations,
1090             // redraw the god title.
1091             you.redraw_title = true;
1092         }
1093
1094         if (you_worship(god))
1095         {
1096             // Orcish bonuses are now once more effective.
1097             if (god == GOD_BEOGH)
1098                  you.redraw_armour_class = true;
1099             // TSO's halo is once more available.
1100             else if (god == GOD_SHINING_ONE
1101                      && you.piety >= piety_breakpoint(0))
1102             {
1103                 mprf(MSGCH_GOD, "Your divine halo returns!");
1104                 invalidate_agrid(true);
1105             }
1106             else if (god == GOD_ASHENZARI
1107                      && you.piety >= piety_breakpoint(2))
1108             {
1109                 mprf(MSGCH_GOD, "Your vision regains its divine sight.");
1110                 autotoggle_autopickup(false);
1111             }
1112             else if (god == GOD_CHEIBRIADOS)
1113             {
1114                 simple_god_message(" restores the support of your attributes.");
1115                 redraw_screen();
1116                 notify_stat_change();
1117             }
1118             // Likewise Dithmenos's umbra.
1119             else if (god == GOD_DITHMENOS
1120                      && you.piety >= piety_breakpoint(0))
1121             {
1122                 mprf(MSGCH_GOD, "Your aura of darkness returns!");
1123                 invalidate_agrid(true);
1124             }
1125             else if (god == GOD_QAZLAL
1126                      && you.piety >= piety_breakpoint(0))
1127             {
1128                 mprf(MSGCH_GOD, "A storm instantly forms around you!");
1129                 you.redraw_armour_class = true; // also handles shields
1130             }
1131             // When you've worked through all your penance, you get
1132             // another chance to make hostile slimes strict neutral.
1133             else if (god == GOD_JIYVA)
1134                 add_daction(DACT_SLIME_NEW_ATTEMPT);
1135         }
1136     }
1137     else if (god == GOD_NEMELEX_XOBEH && you.penance[god] > 100)
1138     { // Nemelex's penance works actively only until 100
1139         if ((you.penance[god] -= val) > 100)
1140             return;
1141         mark_milestone("god.mollify",
1142                        "partially mollified " + god_name(god) + ".");
1143         simple_god_message(" seems mollified... mostly.", god);
1144         take_note(Note(NOTE_MOLLIFY_GOD, god));
1145     }
1146     else
1147     {
1148         you.penance[god] -= val;
1149         return;
1150     }
1151
1152     // We only get this far if we just mollified a god.
1153     // If we just mollified a god, see if we have any angry gods left.
1154     // If we don't, clear the stored wrath / XP counter.
1155     int i = GOD_NO_GOD;
1156     for (; i < NUM_GODS; ++i)
1157     {
1158         if (active_penance((god_type) i))
1159             break;
1160     }
1161
1162     if (i != NUM_GODS)
1163         return;
1164
1165     you.attribute[ATTR_GOD_WRATH_COUNT] = 0;
1166     you.attribute[ATTR_GOD_WRATH_XP] = 0;
1167 }
1168
1169 void dec_penance(int val)
1170 {
1171     dec_penance(you.religion, val);
1172 }
1173
1174 static bool _need_water_walking()
1175 {
1176     return you.ground_level() && you.species != SP_MERFOLK
1177            && grd(you.pos()) == DNGN_DEEP_WATER;
1178 }
1179
1180 bool jiyva_is_dead()
1181 {
1182     return you.royal_jelly_dead
1183            && !you_worship(GOD_JIYVA) && !you.penance[GOD_JIYVA];
1184 }
1185
1186 void set_penance_xp_timeout()
1187 {
1188     if (you.attribute[ATTR_GOD_WRATH_XP] > 0)
1189         return;
1190
1191     // TODO: make this more random?
1192     you.attribute[ATTR_GOD_WRATH_XP] +=
1193         max(div_rand_round(exp_needed(you.experience_level + 1)
1194                           - exp_needed(you.experience_level),
1195                           200),
1196             1);
1197 }
1198
1199 static void _inc_penance(god_type god, int val)
1200 {
1201     if (val <= 0)
1202         return;
1203
1204     if (!player_under_penance(god))
1205     {
1206         god_acting gdact(god, true);
1207
1208         take_note(Note(NOTE_PENANCE, god));
1209
1210         you.penance[god] += val;
1211         you.penance[god] = min((uint8_t)MAX_PENANCE, you.penance[god]);
1212
1213         // Orcish bonuses don't apply under penance.
1214         if (god == GOD_BEOGH)
1215         {
1216             you.redraw_armour_class = true;
1217
1218             if (_need_water_walking() && !beogh_water_walk())
1219                 fall_into_a_pool(grd(you.pos()));
1220         }
1221         // Neither does Trog's regeneration or magic resistance.
1222         else if (god == GOD_TROG)
1223         {
1224             if (you.duration[DUR_TROGS_HAND])
1225                 trog_remove_trogs_hand();
1226
1227             make_god_gifts_disappear(); // only on level
1228         }
1229         // Neither does Zin's divine stamina.
1230         else if (god == GOD_ZIN)
1231         {
1232             if (you.duration[DUR_DIVINE_STAMINA])
1233                 zin_remove_divine_stamina();
1234         }
1235         // Neither does TSO's halo or divine shield.
1236         else if (god == GOD_SHINING_ONE)
1237         {
1238             if (you.haloed())
1239                 mprf(MSGCH_GOD, god, "Your divine halo fades away.");
1240
1241             if (you.duration[DUR_DIVINE_SHIELD])
1242                 tso_remove_divine_shield();
1243
1244             make_god_gifts_disappear(); // only on level
1245             invalidate_agrid();
1246         }
1247         // Neither does Ely's divine vigour.
1248         else if (god == GOD_ELYVILON)
1249         {
1250             if (you.duration[DUR_DIVINE_VIGOUR])
1251                 elyvilon_remove_divine_vigour();
1252         }
1253         else if (god == GOD_JIYVA)
1254         {
1255             if (you.duration[DUR_SLIMIFY])
1256                 you.duration[DUR_SLIMIFY] = 0;
1257         }
1258         else if (god == GOD_CHEIBRIADOS)
1259         {
1260             redraw_screen();
1261             notify_stat_change();
1262         }
1263         else if (god == GOD_DITHMENOS)
1264         {
1265             if (you.umbraed())
1266                 mprf(MSGCH_GOD, god, "Your aura of darkness fades away.");
1267             invalidate_agrid();
1268         }
1269         else if (god == GOD_QAZLAL)
1270         {
1271             if (you.piety >= piety_breakpoint(0))
1272             {
1273                 mprf(MSGCH_GOD, god, "The storm surrounding you dissipates.");
1274                 you.redraw_armour_class = true;
1275             }
1276             if (you.duration[DUR_QAZLAL_FIRE_RES])
1277             {
1278                 mprf(MSGCH_DURATION, "Your resistance to fire fades away.");
1279                 you.duration[DUR_QAZLAL_FIRE_RES] = 0;
1280             }
1281             if (you.duration[DUR_QAZLAL_COLD_RES])
1282             {
1283                 mprf(MSGCH_DURATION, "Your resistance to cold fades away.");
1284                 you.duration[DUR_QAZLAL_COLD_RES] = 0;
1285             }
1286             if (you.duration[DUR_QAZLAL_ELEC_RES])
1287             {
1288                 mprf(MSGCH_DURATION,
1289                      "Your resistance to electricity fades away.");
1290                 you.duration[DUR_QAZLAL_ELEC_RES] = 0;
1291             }
1292             if (you.duration[DUR_QAZLAL_AC])
1293             {
1294                 mprf(MSGCH_DURATION,
1295                      "Your resistance to physical damage fades away.");
1296                 you.duration[DUR_QAZLAL_AC] = 0;
1297                 you.redraw_armour_class = true;
1298             }
1299         }
1300
1301         if (you_worship(god))
1302         {
1303             // Redraw piety display and, in case the best skill is Invocations,
1304             // redraw the god title.
1305             you.redraw_title = true;
1306         }
1307     }
1308     else
1309     {
1310         you.penance[god] += val;
1311         you.penance[god] = min((uint8_t)MAX_PENANCE, you.penance[god]);
1312     }
1313
1314     set_penance_xp_timeout();
1315 }
1316
1317 static void _inc_penance(int val)
1318 {
1319     _inc_penance(you.religion, val);
1320 }
1321
1322 static void _set_penance(god_type god, int val)
1323 {
1324     you.penance[god] = val;
1325 }
1326
1327 static void _inc_gift_timeout(int val)
1328 {
1329     if (200 - you.gift_timeout < val)
1330         you.gift_timeout = 200;
1331     else
1332         you.gift_timeout += val;
1333 }
1334
1335 // These are sorted in order of power.
1336 static monster_type _yred_servants[] =
1337 {
1338     MONS_MUMMY, MONS_WIGHT, MONS_FLYING_SKULL, MONS_WRAITH,
1339     MONS_VAMPIRE, MONS_PHANTASMAL_WARRIOR, MONS_SKELETAL_WARRIOR,
1340     MONS_FLAYED_GHOST, MONS_DEATH_COB, MONS_GHOUL, MONS_BONE_DRAGON,
1341     MONS_PROFANE_SERVITOR
1342 };
1343
1344 #define MIN_YRED_SERVANT_THRESHOLD 3
1345 #define MAX_YRED_SERVANT_THRESHOLD ARRAYSZ(_yred_servants)
1346
1347 static bool _yred_high_level_servant(monster_type type)
1348 {
1349     return type == MONS_BONE_DRAGON
1350            || type == MONS_PROFANE_SERVITOR;
1351 }
1352
1353 int yred_random_servants(unsigned int threshold, bool force_hostile)
1354 {
1355     if (threshold == 0)
1356     {
1357         if (force_hostile)
1358         {
1359             // This implies wrath - scale the threshold with XL.
1360             threshold =
1361                 MIN_YRED_SERVANT_THRESHOLD
1362                 + (MAX_YRED_SERVANT_THRESHOLD - MIN_YRED_SERVANT_THRESHOLD)
1363                   * you.experience_level / 27;
1364         }
1365         else
1366             threshold = ARRAYSZ(_yred_servants);
1367     }
1368     else
1369     {
1370         threshold = min(static_cast<unsigned int>(ARRAYSZ(_yred_servants)),
1371                         threshold);
1372     }
1373
1374     const unsigned int servant = random2(threshold);
1375
1376     // Skip some of the weakest servants, once the threshold is high.
1377     if ((servant + 2) * 2 < threshold)
1378         return -1;
1379
1380     monster_type mon_type = _yred_servants[servant];
1381
1382     // Cap some of the strongest servants.
1383     if (!force_hostile && _yred_high_level_servant(mon_type))
1384     {
1385         int current_high_level = 0;
1386         for (auto &entry : companion_list)
1387         {
1388             monster* mons = monster_by_mid(entry.first);
1389             if (!mons)
1390                 mons = &entry.second.mons.mons;
1391             if (_yred_high_level_servant(mons->type))
1392                 current_high_level++;
1393         }
1394
1395         if (current_high_level >= 3)
1396             return -1;
1397     }
1398
1399     int how_many = (mon_type == MONS_FLYING_SKULL) ? 2 + random2(4)
1400                                                    : 1;
1401
1402     mgen_data mg(mon_type, !force_hostile ? BEH_FRIENDLY : BEH_HOSTILE,
1403                  !force_hostile ? &you : 0, 0, 0, you.pos(), MHITYOU, 0,
1404                  GOD_YREDELEMNUL);
1405
1406     if (force_hostile)
1407         mg.non_actor_summoner = "the anger of Yredelemnul";
1408
1409     int created = 0;
1410     if (force_hostile)
1411     {
1412         mg.extra_flags |= (MF_NO_REWARD | MF_HARD_RESET);
1413
1414         for (; how_many > 0; --how_many)
1415         {
1416             if (create_monster(mg))
1417                 created++;
1418         }
1419     }
1420     else
1421     {
1422         for (; how_many > 0; --how_many)
1423             delayed_monster(mg);
1424     }
1425
1426     return created;
1427 }
1428
1429 static bool _need_missile_gift(bool forced)
1430 {
1431     skill_type sk = best_skill(SK_SLINGS, SK_THROWING);
1432     // Default to throwing if all missile skills are at zero.
1433     if (you.skills[sk] == 0)
1434         sk = SK_THROWING;
1435     return forced
1436            || (you.piety >= piety_breakpoint(2)
1437                && random2(you.piety) > 70
1438                && one_chance_in(8)
1439                && x_chance_in_y(1 + you.skills[sk], 12));
1440 }
1441
1442 static bool _give_nemelex_gift(bool forced = false)
1443 {
1444     // But only if you're not flying over deep water.
1445     if (!(feat_has_solid_floor(grd(you.pos()))
1446           || feat_is_watery(grd(you.pos())) && species_likes_water(you.species)))
1447     {
1448         return false;
1449     }
1450
1451     // Nemelex will give at least one gift early.
1452     if (forced
1453         || !you.num_total_gifts[GOD_NEMELEX_XOBEH]
1454            && x_chance_in_y(you.piety + 1, piety_breakpoint(1))
1455         || one_chance_in(3) && x_chance_in_y(you.piety + 1, MAX_PIETY))
1456     {
1457
1458         misc_item_type gift_type = random_choose_weighted(
1459                                         4, MISC_DECK_OF_WAR,
1460                                         4, MISC_DECK_OF_DESTRUCTION,
1461                                         2, MISC_DECK_OF_ESCAPE,
1462                                         0);
1463
1464         int thing_created = items(true, OBJ_MISCELLANY, gift_type, 1, 0,
1465                                   GOD_NEMELEX_XOBEH);
1466
1467         move_item_to_grid(&thing_created, you.pos(), true);
1468
1469         if (thing_created != NON_ITEM)
1470         {
1471             // Piety|Common  | Rare  |Legendary
1472             // --------------------------------
1473             //     0:  95.00%,  5.00%,  0.00%
1474             //    20:  86.00%, 10.50%,  3.50%
1475             //    40:  77.00%, 16.00%,  7.00%
1476             //    60:  68.00%, 21.50%, 10.50%
1477             //    80:  59.00%, 27.00%, 14.00%
1478             //   100:  50.00%, 32.50%, 17.50%
1479             //   120:  41.00%, 38.00%, 21.00%
1480             //   140:  32.00%, 43.50%, 24.50%
1481             //   160:  23.00%, 49.00%, 28.00%
1482             //   180:  14.00%, 54.50%, 31.50%
1483             //   200:   5.00%, 60.00%, 35.00%
1484             const int common_weight = 95 - (90 * you.piety / MAX_PIETY);
1485             const int rare_weight   = 5  + (55 * you.piety / MAX_PIETY);
1486             const int legend_weight = 0  + (35 * you.piety / MAX_PIETY);
1487
1488             const deck_rarity_type rarity = random_choose_weighted(
1489                 common_weight, DECK_RARITY_COMMON,
1490                 rare_weight,   DECK_RARITY_RARE,
1491                 legend_weight, DECK_RARITY_LEGENDARY,
1492                 0);
1493
1494             item_def &deck(mitm[thing_created]);
1495
1496             deck.deck_rarity = rarity;
1497             deck.flags |= ISFLAG_KNOW_TYPE;
1498
1499             simple_god_message(" grants you a gift!");
1500             more();
1501             canned_msg(MSG_SOMETHING_APPEARS);
1502
1503             _inc_gift_timeout(5 + random2avg(9, 2));
1504             you.num_current_gifts[you.religion]++;
1505             you.num_total_gifts[you.religion]++;
1506             take_note(Note(NOTE_GOD_GIFT, you.religion));
1507         }
1508         return true;
1509     }
1510
1511     return false;
1512 }
1513
1514 void mons_make_god_gift(monster* mon, god_type god)
1515 {
1516     const god_type acting_god =
1517         (crawl_state.is_god_acting()) ? crawl_state.which_god_acting()
1518                                       : GOD_NO_GOD;
1519
1520     if (god == GOD_NO_GOD && acting_god == GOD_NO_GOD)
1521         return;
1522
1523     if (god == GOD_NO_GOD)
1524         god = acting_god;
1525
1526     if (mon->flags & MF_GOD_GIFT)
1527     {
1528         dprf("Monster '%s' was already a gift of god '%s', now god '%s'.",
1529              mon->name(DESC_PLAIN, true).c_str(),
1530              god_name(mon->god).c_str(),
1531              god_name(god).c_str());
1532     }
1533
1534     mon->god = god;
1535     mon->flags |= MF_GOD_GIFT;
1536 }
1537
1538 bool mons_is_god_gift(const monster* mon, god_type god)
1539 {
1540     return (mon->flags & MF_GOD_GIFT) && mon->god == god;
1541 }
1542
1543 bool is_yred_undead_slave(const monster* mon)
1544 {
1545     return mon->alive() && mon->holiness() == MH_UNDEAD
1546            && mon->attitude == ATT_FRIENDLY
1547            && mons_is_god_gift(mon, GOD_YREDELEMNUL);
1548 }
1549
1550 bool is_orcish_follower(const monster* mon)
1551 {
1552     return mon->alive() && mons_genus(mon->type) == MONS_ORC
1553            && mon->attitude == ATT_FRIENDLY
1554            && mons_is_god_gift(mon, GOD_BEOGH);
1555 }
1556
1557 bool is_fellow_slime(const monster* mon)
1558 {
1559     return mon->alive() && mons_is_slime(mon)
1560            && mon->attitude == ATT_STRICT_NEUTRAL
1561            && mons_is_god_gift(mon, GOD_JIYVA);
1562 }
1563
1564 static bool _is_plant_follower(const monster* mon)
1565 {
1566     return mon->alive() && mons_is_plant(mon)
1567            && mon->attitude == ATT_FRIENDLY;
1568 }
1569
1570 static bool _has_jelly()
1571 {
1572     ASSERT(you_worship(GOD_JIYVA));
1573
1574     for (monster_iterator mi; mi; ++mi)
1575         if (mons_is_god_gift(*mi, GOD_JIYVA))
1576             return true;
1577     return false;
1578 }
1579
1580 bool is_follower(const monster* mon)
1581 {
1582     if (you_worship(GOD_YREDELEMNUL))
1583         return is_yred_undead_slave(mon);
1584     else if (you_worship(GOD_BEOGH))
1585         return is_orcish_follower(mon);
1586     else if (you_worship(GOD_JIYVA))
1587         return is_fellow_slime(mon);
1588     else if (you_worship(GOD_FEDHAS))
1589         return _is_plant_follower(mon);
1590     else
1591         return mon->alive() && mon->friendly();
1592 }
1593
1594
1595 static void _delayed_gift_callback(const mgen_data &mg, monster *&mon,
1596                                    int placed)
1597 {
1598     if (placed <= 0)
1599         return;
1600
1601     // Make sure monsters are shown.
1602     viewwindow();
1603     more();
1604     _inc_gift_timeout(4 + random2avg(7, 2));
1605     you.num_current_gifts[you.religion]++;
1606     you.num_total_gifts[you.religion]++;
1607     take_note(Note(NOTE_GOD_GIFT, you.religion));
1608 }
1609
1610 static bool _jiyva_mutate()
1611 {
1612     simple_god_message(" alters your body.");
1613
1614     const int rand = random2(100);
1615
1616     if (rand < 5)
1617         return delete_mutation(RANDOM_SLIME_MUTATION, "Jiyva's grace", true, false, true);
1618     else if (rand < 30)
1619         return delete_mutation(RANDOM_NON_SLIME_MUTATION, "Jiyva's grace", true, false, true);
1620     else if (rand < 55)
1621         return mutate(RANDOM_MUTATION, "Jiyva's grace", true, false, true);
1622     else if (rand < 75)
1623         return mutate(RANDOM_SLIME_MUTATION, "Jiyva's grace", true, false, true);
1624     else
1625         return mutate(RANDOM_GOOD_MUTATION, "Jiyva's grace", true, false, true);
1626 }
1627
1628 bool vehumet_is_offering(spell_type spell)
1629 {
1630     return you.vehumet_gifts.count(spell);
1631 }
1632
1633 void vehumet_accept_gift(spell_type spell)
1634 {
1635     if (vehumet_is_offering(spell))
1636     {
1637         you.vehumet_gifts.erase(spell);
1638         you.seen_spell.set(spell);
1639         you.duration[DUR_VEHUMET_GIFT] = 0;
1640     }
1641 }
1642
1643 static void _add_to_old_gifts(spell_type spell)
1644 {
1645     you.old_vehumet_gifts.insert(spell);
1646 }
1647
1648 static bool _is_old_gift(spell_type spell)
1649 {
1650     return you.old_vehumet_gifts.count(spell);
1651 }
1652
1653 static set<spell_type> _vehumet_eligible_gift_spells(set<spell_type> excluded_spells)
1654 {
1655     set<spell_type> eligible_spells;
1656
1657     const int gifts = you.num_total_gifts[you.religion];
1658     if (gifts >= NUM_VEHUMET_GIFTS)
1659         return eligible_spells;
1660
1661     const int min_lev[] = {1,1,2,3,3,4,4,5,5,6,6,6,8};
1662     const int max_lev[] = {1,2,3,4,5,7,7,7,7,7,7,7,9};
1663     COMPILE_CHECK(ARRAYSZ(min_lev) == NUM_VEHUMET_GIFTS);
1664     COMPILE_CHECK(ARRAYSZ(max_lev) == NUM_VEHUMET_GIFTS);
1665     int min_level = min_lev[gifts];
1666     int max_level = max_lev[gifts];
1667
1668     if (min_level > you.experience_level)
1669         return eligible_spells;
1670
1671     set<spell_type> backup_spells;
1672     for (int i = 0; i < NUM_SPELLS; ++i)
1673     {
1674         spell_type spell = static_cast<spell_type>(i);
1675         if (!is_valid_spell(spell))
1676             continue;
1677
1678         if (excluded_spells.count(spell))
1679             continue;
1680
1681         if (vehumet_supports_spell(spell)
1682             && !you.has_spell(spell)
1683             && is_player_spell(spell)
1684             && spell_difficulty(spell) <= max_level
1685             && spell_difficulty(spell) >= min_level)
1686         {
1687             if (!you.seen_spell[spell] && !_is_old_gift(spell))
1688                 eligible_spells.insert(spell);
1689             else
1690                 backup_spells.insert(spell);
1691         }
1692     }
1693     // Don't get stuck just because all spells have been seen/offered.
1694     if (eligible_spells.empty())
1695     {
1696         if (backup_spells.empty())
1697         {
1698             // This is quite improbable to happen, but in this case just
1699             // skip the gift and increment the gift counter.
1700             if (gifts <= 12)
1701             {
1702                 you.num_current_gifts[you.religion]++;
1703                 you.num_total_gifts[you.religion]++;
1704             }
1705         }
1706         return backup_spells;
1707     }
1708     return eligible_spells;
1709 }
1710
1711 static int _vehumet_weighting(spell_type spell)
1712 {
1713     int bias = 100 + elemental_preference(spell, 10);
1714     bias = min(max(bias, 10), 190);
1715     return bias;
1716 }
1717
1718 static spell_type _vehumet_find_spell_gift(set<spell_type> excluded_spells)
1719 {
1720     set<spell_type> eligible_spells = _vehumet_eligible_gift_spells(excluded_spells);
1721     spell_type spell = SPELL_NO_SPELL;
1722     int total_weight = 0;
1723     int this_weight = 0;
1724     for (auto elig : eligible_spells)
1725     {
1726         this_weight = _vehumet_weighting(elig);
1727         total_weight += this_weight;
1728         if (x_chance_in_y(this_weight, total_weight))
1729             spell = elig;
1730     }
1731     return spell;
1732 }
1733
1734 static set<spell_type> _vehumet_get_spell_gifts()
1735 {
1736     set<spell_type> offers;
1737     unsigned int num_offers = you.num_total_gifts[you.religion] == 12 ? 3 : 1;
1738     while (offers.size() < num_offers)
1739     {
1740         spell_type offer = _vehumet_find_spell_gift(offers);
1741         if (offer == SPELL_NO_SPELL)
1742             break;
1743         offers.insert(offer);
1744     }
1745     return offers;
1746 }
1747
1748 ///////////////////////////////
1749 bool do_god_gift(bool forced)
1750 {
1751     ASSERT(!you_worship(GOD_NO_GOD));
1752
1753     god_acting gdact;
1754
1755 #if defined(DEBUG_DIAGNOSTICS) || defined(DEBUG_GIFTS)
1756     int old_num_current_gifts = you.num_current_gifts[you.religion];
1757     int old_num_total_gifts = you.num_total_gifts[you.religion];
1758 #endif
1759
1760     bool success = false;
1761
1762     // Consider a gift if we don't have a timeout and weren't already
1763     // praying when we prayed.
1764     if (forced || !player_under_penance() && !you.gift_timeout)
1765     {
1766         // Remember to check for water/lava.
1767         switch (you.religion)
1768         {
1769         default:
1770             break;
1771
1772         case GOD_NEMELEX_XOBEH:
1773             success = _give_nemelex_gift(forced);
1774             break;
1775
1776         case GOD_OKAWARU:
1777         case GOD_TROG:
1778         {
1779             // Break early if giving a gift now means it would be lost.
1780             if (!(feat_has_solid_floor(grd(you.pos()))
1781                 || feat_is_watery(grd(you.pos())) && species_likes_water(you.species)))
1782             {
1783                 break;
1784             }
1785
1786             // Should gift catnip instead.
1787             if (you.species == SP_FELID)
1788                 break;
1789
1790             const bool need_missiles = _need_missile_gift(forced);
1791             object_class_type gift_type;
1792
1793             if (forced && coinflip()
1794                 || (!forced && you.piety >= piety_breakpoint(4)
1795                     && random2(you.piety) > 120
1796                     && one_chance_in(4)))
1797             {
1798                 if (you_worship(GOD_TROG)
1799                     || (you_worship(GOD_OKAWARU) && coinflip()))
1800                 {
1801                     gift_type = OBJ_WEAPONS;
1802                 }
1803                 else
1804                     gift_type = OBJ_ARMOUR;
1805             }
1806             else if (need_missiles)
1807                 gift_type = OBJ_MISSILES;
1808             else
1809                 break;
1810
1811             success = acquirement(gift_type, you.religion);
1812             if (success)
1813             {
1814                 simple_god_message(" grants you a gift!");
1815                 more();
1816
1817                 if (gift_type == OBJ_MISSILES)
1818                     _inc_gift_timeout(4 + roll_dice(2, 4));
1819                 else
1820                 {
1821                     // Okawaru charges extra for armour acquirements.
1822                     if (you_worship(GOD_OKAWARU) && gift_type == OBJ_ARMOUR)
1823                         _inc_gift_timeout(30 + random2avg(15, 2));
1824
1825                     _inc_gift_timeout(30 + random2avg(19, 2));
1826                 }
1827                 you.num_current_gifts[you.religion]++;
1828                 you.num_total_gifts[you.religion]++;
1829                 take_note(Note(NOTE_GOD_GIFT, you.religion));
1830             }
1831             break;
1832         }
1833
1834         case GOD_YREDELEMNUL:
1835             if (forced
1836                 || (random2(you.piety) >= piety_breakpoint(2)
1837                     && one_chance_in(4)))
1838             {
1839                 unsigned int threshold = MIN_YRED_SERVANT_THRESHOLD
1840                                          + you.num_current_gifts[you.religion] / 2;
1841                 threshold = max(threshold,
1842                     static_cast<unsigned int>(MIN_YRED_SERVANT_THRESHOLD));
1843                 threshold = min(threshold,
1844                     static_cast<unsigned int>(MAX_YRED_SERVANT_THRESHOLD));
1845
1846                 if (yred_random_servants(threshold) != -1)
1847                 {
1848                     delayed_monster_done(" grants you @an@ undead servant@s@!",
1849                                           "", _delayed_gift_callback);
1850                     success = true;
1851                 }
1852             }
1853             break;
1854
1855         case GOD_JIYVA:
1856             if (forced || you.piety >= piety_breakpoint(2)
1857                           && random2(you.piety) > 50
1858                           && one_chance_in(4) && !you.gift_timeout
1859                           && you.can_safely_mutate())
1860             {
1861                 if (_jiyva_mutate())
1862                 {
1863                     _inc_gift_timeout(15 + roll_dice(2, 4));
1864                     you.num_current_gifts[you.religion]++;
1865                     you.num_total_gifts[you.religion]++;
1866                 }
1867                 else
1868                     mpr("You feel as though nothing has changed.");
1869             }
1870             break;
1871
1872         case GOD_KIKUBAAQUDGHA:
1873         case GOD_SIF_MUNA:
1874             int gift;
1875             gift = NUM_BOOKS;
1876             // Break early if giving a gift now means it would be lost.
1877             if (!feat_has_solid_floor(grd(you.pos())))
1878                 break;
1879
1880             // Kikubaaqudgha gives the lesser Necromancy books in a quick
1881             // succession.
1882             if (you_worship(GOD_KIKUBAAQUDGHA))
1883             {
1884                 if (you.piety >= piety_breakpoint(0)
1885                     && you.num_total_gifts[you.religion] == 0)
1886                 {
1887                     gift = BOOK_NECROMANCY;
1888                 }
1889                 else if (you.piety >= piety_breakpoint(2)
1890                          && you.num_total_gifts[you.religion] == 1)
1891                 {
1892                     gift = BOOK_DEATH;
1893                 }
1894             }
1895             else if (forced || you.piety >= piety_breakpoint(5)
1896                                && random2(you.piety) > 100)
1897             {
1898                 if (you_worship(GOD_SIF_MUNA))
1899                     gift = OBJ_RANDOM;
1900             }
1901
1902             if (gift != NUM_BOOKS)
1903             {
1904                 if (gift == OBJ_RANDOM)
1905                 {
1906                     // Sif Muna special: Keep quiet if acquirement fails
1907                     // because the player already has seen all spells.
1908                     success = acquirement(OBJ_BOOKS, you.religion, true);
1909                 }
1910                 else
1911                 {
1912                     int thing_created = items(true, OBJ_BOOKS, gift, 1, 0,
1913                                               you.religion);
1914                     // Replace a Kiku gift by a custom-random book.
1915                     if (you_worship(GOD_KIKUBAAQUDGHA))
1916                     {
1917                         make_book_Kiku_gift(mitm[thing_created],
1918                                             gift == BOOK_NECROMANCY);
1919                     }
1920                     if (thing_created == NON_ITEM)
1921                         return false;
1922
1923                     // Mark the book type as known to avoid duplicate
1924                     // gifts if players don't read their gifts for some
1925                     // reason.
1926                     mark_had_book(gift);
1927
1928                     move_item_to_grid(&thing_created, you.pos(), true);
1929
1930                     if (thing_created != NON_ITEM)
1931                         success = true;
1932                 }
1933
1934                 if (success)
1935                 {
1936                     simple_god_message(" grants you a gift!");
1937                     more();
1938
1939                     you.num_current_gifts[you.religion]++;
1940                     you.num_total_gifts[you.religion]++;
1941                     // Timeouts are meaningless for Kiku.
1942                     if (!you_worship(GOD_KIKUBAAQUDGHA))
1943                         _inc_gift_timeout(40 + random2avg(19, 2));
1944                     take_note(Note(NOTE_GOD_GIFT, you.religion));
1945                 }
1946             }                   // End of giving books.
1947             break;              // End of book gods.
1948
1949         case GOD_VEHUMET:
1950             const int gifts = you.num_total_gifts[you.religion];
1951             if (forced || !you.duration[DUR_VEHUMET_GIFT]
1952                           && (you.piety >= piety_breakpoint(0) && gifts == 0
1953                               || you.piety >= piety_breakpoint(0) + random2(6) + 18 * gifts && gifts <= 5
1954                               || you.piety >= piety_breakpoint(4) && gifts <= 11 && one_chance_in(20)
1955                               || you.piety >= piety_breakpoint(5) && gifts <= 12 && one_chance_in(20)))
1956             {
1957                 set<spell_type> offers = _vehumet_get_spell_gifts();
1958                 if (!offers.empty())
1959                 {
1960                     you.vehumet_gifts = offers;
1961                     string prompt = " offers you knowledge of ";
1962                     for (auto it = offers.begin(); it != offers.end(); ++it)
1963                     {
1964                         if (it != offers.begin())
1965                         {
1966                             if (offers.size() > 2)
1967                                 prompt += ",";
1968                             prompt += " ";
1969                             auto next = it;
1970                             next++;
1971                             if (next == offers.end())
1972                                 prompt += "and ";
1973                         }
1974                         prompt += spell_title(*it);
1975                         _add_to_old_gifts(*it);
1976                         take_note(Note(NOTE_OFFERED_SPELL, *it));
1977                     }
1978                     prompt += ".";
1979                     if (gifts >= NUM_VEHUMET_GIFTS - 1)
1980                     {
1981                         prompt += " These spells will remain available"
1982                                   " as long as you worship Vehumet.";
1983                     }
1984
1985                     you.duration[DUR_VEHUMET_GIFT] = (100 + random2avg(100, 2)) * BASELINE_DELAY;
1986                     if (gifts >= 5)
1987                         _inc_gift_timeout(30 + random2avg(30, 2));
1988                     you.num_current_gifts[you.religion]++;
1989                     you.num_total_gifts[you.religion]++;
1990
1991                     simple_god_message(prompt.c_str());
1992                     more();
1993
1994                     success = true;
1995                 }
1996                 else
1997                     success = false;
1998             }
1999             break;
2000         }                       // switch (you.religion)
2001     }                           // End of gift giving.
2002
2003     if (success)
2004         you.running.stop();
2005
2006 #if defined(DEBUG_DIAGNOSTICS) || defined(DEBUG_GIFTS)
2007     if (old_num_current_gifts < you.num_current_gifts[you.religion])
2008     {
2009         mprf(MSGCH_DIAGNOSTICS, "Current number of gifts from this god: %d",
2010              you.num_current_gifts[you.religion]);
2011     }
2012     if (old_num_total_gifts < you.num_total_gifts[you.religion])
2013     {
2014         mprf(MSGCH_DIAGNOSTICS, "Total number of gifts from this god: %d",
2015              you.num_total_gifts[you.religion]);
2016     }
2017 #endif
2018     return success;
2019 }
2020
2021 string god_name(god_type which_god, bool long_name)
2022 {
2023     if (which_god == GOD_JIYVA)
2024     {
2025         return god_name_jiyva(long_name) +
2026                (long_name? " the Shapeless" : "");
2027     }
2028
2029     if (long_name)
2030     {
2031         const string shortname = god_name(which_god, false);
2032         const string longname = getMiscString(shortname + " lastname");
2033         return longname.empty()? shortname : longname;
2034     }
2035
2036     switch (which_god)
2037     {
2038     case GOD_NO_GOD:        return "No God";
2039     case GOD_RANDOM:        return "random";
2040     case GOD_NAMELESS:      return "nameless";
2041     case GOD_VIABLE:        return "viable";
2042     case GOD_ZIN:           return "Zin";
2043     case GOD_SHINING_ONE:   return "the Shining One";
2044     case GOD_KIKUBAAQUDGHA: return "Kikubaaqudgha";
2045     case GOD_YREDELEMNUL:   return "Yredelemnul";
2046     case GOD_VEHUMET:       return "Vehumet";
2047     case GOD_OKAWARU:       return "Okawaru";
2048     case GOD_MAKHLEB:       return "Makhleb";
2049     case GOD_SIF_MUNA:      return "Sif Muna";
2050     case GOD_TROG:          return "Trog";
2051     case GOD_NEMELEX_XOBEH: return "Nemelex Xobeh";
2052     case GOD_ELYVILON:      return "Elyvilon";
2053     case GOD_LUGONU:        return "Lugonu";
2054     case GOD_BEOGH:         return "Beogh";
2055     case GOD_FEDHAS:        return "Fedhas";
2056     case GOD_CHEIBRIADOS:   return "Cheibriados";
2057     case GOD_XOM:           return "Xom";
2058     case GOD_ASHENZARI:     return "Ashenzari";
2059     case GOD_DITHMENOS:     return "Dithmenos";
2060     case GOD_GOZAG:         return "Gozag";
2061     case GOD_QAZLAL:        return "Qazlal";
2062     case GOD_RU:        return "Ru";
2063     case GOD_JIYVA: // This is handled at the beginning of the function
2064     case NUM_GODS:          return "Buggy";
2065     }
2066     return "";
2067 }
2068
2069 string god_name_jiyva(bool second_name)
2070 {
2071     string name = "Jiyva";
2072     if (second_name)
2073         name += " " + you.jiyva_second_name;
2074
2075     return name;
2076 }
2077
2078 god_type str_to_god(const string &_name, bool exact)
2079 {
2080     string target(_name);
2081     trim_string(target);
2082     lowercase(target);
2083
2084     if (target.empty())
2085         return GOD_NO_GOD;
2086
2087     int      num_partials = 0;
2088     god_type partial      = GOD_NO_GOD;
2089     for (int i = 0; i < NUM_GODS; ++i)
2090     {
2091         god_type    god  = static_cast<god_type>(i);
2092         string name = lowercase_string(god_name(god, false));
2093
2094         if (name == target)
2095             return god;
2096
2097         if (!exact && name.find(target) != string::npos)
2098         {
2099             // Return nothing for ambiguous partial names.
2100             num_partials++;
2101             if (num_partials > 1)
2102                 return GOD_NO_GOD;
2103             partial = god;
2104         }
2105     }
2106
2107     if (!exact && num_partials == 1)
2108         return partial;
2109
2110     return GOD_NO_GOD;
2111 }
2112
2113 void god_speaks(god_type god, const char *mesg)
2114 {
2115     ASSERT(!crawl_state.game_is_arena());
2116
2117     int orig_mon = mgrd(you.pos());
2118
2119     monster fake_mon;
2120     fake_mon.type       = MONS_PROGRAM_BUG;
2121     fake_mon.hit_points = 1;
2122     fake_mon.god        = god;
2123     fake_mon.set_position(you.pos());
2124     fake_mon.foe        = MHITYOU;
2125     fake_mon.mname      = "FAKE GOD MONSTER";
2126
2127     mprf(MSGCH_GOD, god, "%s", do_mon_str_replacements(mesg, &fake_mon).c_str());
2128
2129     fake_mon.reset();
2130     mgrd(you.pos()) = orig_mon;
2131 }
2132
2133 void religion_turn_start()
2134 {
2135     if (you.turn_is_over)
2136         religion_turn_end();
2137
2138     crawl_state.clear_god_acting();
2139 }
2140
2141 void religion_turn_end()
2142 {
2143     ASSERT(you.turn_is_over);
2144     _place_delayed_monsters();
2145 }
2146
2147 static void _replace(string& s, const string &find, const string &repl)
2148 {
2149     string::size_type start = 0;
2150     string::size_type found;
2151
2152     while ((found = s.find(find, start)) != string::npos)
2153     {
2154         s.replace(found, find.length(), repl);
2155         start = found + repl.length();
2156     }
2157 }
2158
2159 static void _erase_between(string& s, const string &left, const string &right)
2160 {
2161     string::size_type left_pos;
2162     string::size_type right_pos;
2163
2164     while ((left_pos = s.find(left)) != string::npos
2165            && (right_pos = s.find(right, left_pos + left.size())) != string::npos)
2166     {
2167         s.erase(s.begin() + left_pos, s.begin() + right_pos + right.size());
2168     }
2169 }
2170
2171 string adjust_abil_message(const char *pmsg, bool allow_upgrades)
2172 {
2173     if (brdepth[BRANCH_ABYSS] == -1 && strstr(pmsg, "Abyss"))
2174         return "";
2175     if ((you.species == SP_FORMICID
2176 #if TAG_MAJOR_VERSION == 34
2177                 || you.species == SP_DJINNI
2178 #endif
2179          || you.species == SP_MUMMY || you.species == SP_GHOUL)
2180         && strstr(pmsg, "berserk"))
2181     {
2182         return "";
2183     }
2184     if (you.species == SP_FORMICID && strstr(pmsg, "speed up your combat"))
2185         return "";
2186
2187     string pm = pmsg;
2188
2189     // Message portions in [] sections are ability upgrades.
2190     if (allow_upgrades)
2191     {
2192         _replace(pm, "[", "");
2193         _replace(pm, "]", "");
2194     }
2195     else
2196         _erase_between(pm, "[", "]");
2197
2198     int pos;
2199
2200     if ((pos = pm.find("{yred_dead}")) != -1)
2201     {
2202         if (yred_can_animate_dead())
2203             pm.replace(pos, 11, "legions of the dead");
2204         else
2205             pm.replace(pos, 11, "remains");
2206     }
2207
2208     return pm;
2209 }
2210
2211 static bool _abil_chg_message(const char *pmsg, const char *youcanmsg,
2212                               int breakpoint)
2213 {
2214     if (!*pmsg)
2215         return false;
2216
2217     // Set piety to the passed-in piety breakpoint value when getting
2218     // the ability message.  If we have an ability upgrade, which will
2219     // change description based on current piety, and current piety has
2220     // gone up more than one breakpoint, this will ensure that all
2221     // ability upgrade descriptions display in the proper sequence.
2222     int old_piety = you.piety;
2223     you.piety = piety_breakpoint(breakpoint);
2224
2225     string pm = adjust_abil_message(pmsg);
2226     if (pm.empty())
2227         return false;
2228
2229     you.piety = old_piety;
2230
2231     if (isupper(pmsg[0]))
2232         god_speaks(you.religion, pm.c_str());
2233     else
2234     {
2235         god_speaks(you.religion,
2236                    make_stringf(youcanmsg, pm.c_str()).c_str());
2237     }
2238
2239     return true;
2240 }
2241
2242 /** Punish the character for some divine transgression.
2243  *
2244  * @param piety_loss The amount of penance imposed; may be scaled.
2245  * @param penance The amount of penance imposed; may be scaled.
2246  */
2247 void dock_piety(int piety_loss, int penance)
2248 {
2249     static int last_piety_lecture   = -1;
2250     static int last_penance_lecture = -1;
2251
2252     if (piety_loss <= 0 && penance <= 0)
2253         return;
2254
2255     piety_loss = piety_scale(piety_loss);
2256     penance    = piety_scale(penance);
2257
2258     if (piety_loss)
2259     {
2260         if (last_piety_lecture != you.num_turns)
2261         {
2262             // output guilt message:
2263             mprf("You feel%sguilty.",
2264                  (piety_loss == 1) ? " a little " :
2265                  (piety_loss <  5) ? " " :
2266                  (piety_loss < 10) ? " very "
2267                                    : " extremely ");
2268         }
2269
2270         last_piety_lecture = you.num_turns;
2271         lose_piety(piety_loss);
2272     }
2273
2274     if (you.piety < 1)
2275         excommunication();
2276     else if (penance)       // only if still in religion
2277     {
2278         if (last_penance_lecture != you.num_turns)
2279         {
2280             god_speaks(you.religion,
2281                        "\"You will pay for your transgression, mortal!\"");
2282         }
2283         last_penance_lecture = you.num_turns;
2284         _inc_penance(penance);
2285     }
2286 }
2287
2288 // Scales a piety number, applying modifiers (faith, forlorn).
2289 int piety_scale(int piety)
2290 {
2291     return piety + (you.faith() * div_rand_round(piety, 3));
2292 }
2293
2294 /** Gain or lose piety to reach a certain value.
2295  *
2296  * If the player cannot gain piety (because they worship Xom, Gozag, or
2297  * no god), their piety will be unchanged.
2298  *
2299  * @param piety The new piety value.
2300  * @pre piety is between 0 and MAX_PIETY, inclusive.
2301  */
2302 void set_piety(int piety)
2303 {
2304     ASSERT(piety >= 0);
2305     ASSERT(piety <= MAX_PIETY);
2306
2307     // Ru max piety is 6*
2308     if (you_worship(GOD_RU) && piety > piety_breakpoint(5))
2309         piety = piety_breakpoint(5);
2310
2311     // We have to set the exact piety value this way, because diff may
2312     // be decreased to account for things like penance and gift timeout.
2313     int diff;
2314     do
2315     {
2316         diff = piety - you.piety;
2317         if (diff > 0)
2318         {
2319             if (!gain_piety(diff, 1, false))
2320                 break;
2321         }
2322         else if (diff < 0)
2323             lose_piety(-diff);
2324     }
2325     while (diff != 0);
2326 }
2327
2328 static void _gain_piety_point()
2329 {
2330     // check to see if we owe anything first
2331     if (player_under_penance(you.religion))
2332     {
2333         dec_penance(1);
2334         return;
2335     }
2336     else if (you.gift_timeout > 0)
2337     {
2338         you.gift_timeout--;
2339
2340         // Slow down piety gain to account for the fact that gifts
2341         // no longer have a piety cost for getting them.
2342         // Jiyva is an exception because there's usually a time-out and
2343         // the gifts aren't that precious.
2344         if (!one_chance_in(4) && !you_worship(GOD_JIYVA)
2345             && !you_worship(GOD_NEMELEX_XOBEH))
2346         {
2347 #ifdef DEBUG_PIETY
2348             mprf(MSGCH_DIAGNOSTICS, "Piety slowdown due to gift timeout.");
2349 #endif
2350             return;
2351         }
2352     }
2353
2354     // slow down gain at upper levels of piety
2355     if (!you_worship(GOD_SIF_MUNA) && !you_worship(GOD_RU))
2356     {
2357         if (you.piety >= MAX_PIETY
2358             || you.piety >= piety_breakpoint(5) && one_chance_in(3)
2359             || you.piety >= piety_breakpoint(3) && one_chance_in(3))
2360         {
2361             do_god_gift();
2362             return;
2363         }
2364     }
2365     else if (you_worship(GOD_SIF_MUNA))
2366     {
2367         // Sif Muna has a gentler taper off because training becomes
2368         // naturally slower as the player gains in spell skills.
2369         if (you.piety >= MAX_PIETY
2370             || you.piety >= piety_breakpoint(5) && one_chance_in(5))
2371         {
2372             do_god_gift();
2373             return;
2374         }
2375     }
2376     else
2377     {
2378       // Ru piety doesn't modulate or taper and Ru doesn't give gifts.
2379       // Ru max piety is 160 (6*)
2380       if (you.piety >= piety_breakpoint(5))
2381           return;
2382     }
2383
2384     int old_piety = you.piety;
2385     // Apply hysteresis.
2386     // piety_hysteresis is the amount of _loss_ stored up, so this
2387     // may look backwards.
2388     if (you.piety_hysteresis)
2389         you.piety_hysteresis--;
2390     else if (you.piety < MAX_PIETY)
2391         you.piety++;
2392
2393     for (int i = 0; i < MAX_GOD_ABILITIES; ++i)
2394     {
2395         if (you.piety >= piety_breakpoint(i)
2396             && old_piety < piety_breakpoint(i))
2397         {
2398             take_note(Note(NOTE_GOD_POWER, you.religion, i));
2399
2400             // Redraw piety display and, in case the best skill is Invocations,
2401             // redraw the god title.
2402             you.redraw_title = true;
2403
2404             if (_abil_chg_message(god_gain_power_messages[you.religion][i],
2405                                   "You can now %s.", i))
2406             {
2407 #ifdef USE_TILE_LOCAL
2408                 tiles.layout_statcol();
2409                 redraw_screen();
2410 #endif
2411                 learned_something_new(HINT_NEW_ABILITY_GOD);
2412             }
2413
2414             if (you_worship(GOD_SHINING_ONE) && i == 0)
2415                 mprf(MSGCH_GOD, "A divine halo surrounds you!");
2416
2417             if (you_worship(GOD_ASHENZARI))
2418             {
2419                 if (i == 2)
2420                 {
2421                     autotoggle_autopickup(false);
2422                     // Inconsistent with donning amulets, but matches the
2423                     // message better and is not abusable.
2424                     you.duration[DUR_CONF] = 0;
2425                 }
2426
2427                 auto_id_inventory();
2428             }
2429
2430             if (you_worship(GOD_DITHMENOS) && i == 0)
2431                 mprf(MSGCH_GOD, "You are shrouded in an aura of darkness!");
2432
2433             if (you_worship(GOD_QAZLAL) && i == 3)
2434             {
2435                 mprf(MSGCH_GOD, "The storm surrounding you grows powerful "
2436                                 "enough to repel missiles.");
2437             }
2438         }
2439     }
2440
2441     if (you_worship(GOD_BEOGH))
2442     {
2443         // Every piety level change also affects AC from orcish gear.
2444         you.redraw_armour_class = true;
2445         // The player's symbol depends on Beogh piety.
2446         update_player_symbol();
2447     }
2448
2449     if (you_worship(GOD_CHEIBRIADOS)
2450         && chei_stat_boost(old_piety) < chei_stat_boost())
2451     {
2452         simple_god_message(" raises the support of your attributes as your movement slows.");
2453         notify_stat_change();
2454     }
2455
2456     if (you_worship(GOD_QAZLAL)
2457         && qazlal_sh_boost(old_piety) != qazlal_sh_boost())
2458     {
2459         you.redraw_armour_class = true;
2460     }
2461
2462     if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENOS))
2463     {
2464         // Piety change affects halo / umbra radius.
2465         invalidate_agrid(true);
2466     }
2467
2468     if (you.piety >= piety_breakpoint(5) && old_piety < piety_breakpoint(5))
2469     {
2470         // Redraw piety display and, in case the best skill is Invocations,
2471         // redraw the god title.
2472         you.redraw_title = true;
2473
2474         if (!you.one_time_ability_used[you.religion])
2475         {
2476             switch (you.religion)
2477             {
2478                 case GOD_ZIN:
2479                     simple_god_message(" will now cure all your mutations... once.");
2480                     break;
2481                 case GOD_SHINING_ONE:
2482                     if (you.species == SP_FELID)
2483                         break;
2484                     simple_god_message(" will now bless your weapon at an altar... once.");
2485                     break;
2486                 case GOD_KIKUBAAQUDGHA:
2487                     simple_god_message(" will now enhance your necromancy at an altar... once.");
2488                     break;
2489                 case GOD_LUGONU:
2490                     if (you.species == SP_FELID)
2491                         break;
2492                     simple_god_message(" will now corrupt your weapon at an altar... once.");
2493                     break;
2494                 case GOD_JIYVA:
2495                     simple_god_message(" will now unseal the treasures of the Slime Pits.");
2496                     dlua.callfn("dgn_set_persistent_var", "sb", "fix_slime_vaults", true);
2497                     // If we're on Slime:6, pretend we just entered the level
2498                     // in order to bring down the vault walls.
2499                     if (level_id::current() == level_id(BRANCH_SLIME, 6))
2500                         dungeon_events.fire_event(DET_ENTERED_LEVEL);
2501
2502                     you.one_time_ability_used.set(you.religion);
2503                     break;
2504                 default:
2505                     break;
2506             }
2507         }
2508     }
2509
2510     do_god_gift();
2511 }
2512
2513 /**
2514  * Gain an amount of piety.
2515  *
2516  * @param original_gain The numerator of the nominal piety gain.
2517  * @param denominator The denominator of the nominal piety gain.
2518  * @param should_scale_piety Should the piety gain be scaled by faith,
2519  *   forlorn, and Sprint?
2520  * @return True if something happened, or if another call with the same
2521  *   arguments might cause something to happen (because of random number
2522  *   rolls).
2523  */
2524 bool gain_piety(int original_gain, int denominator, bool should_scale_piety)
2525 {
2526     if (original_gain <= 0)
2527         return false;
2528
2529     // Xom uses piety differently; Gozag doesn't at all.
2530     if (you_worship(GOD_NO_GOD)
2531         || you_worship(GOD_XOM)
2532         || you_worship(GOD_GOZAG))
2533     {
2534         return false;
2535     }
2536
2537     int pgn = should_scale_piety? piety_scale(original_gain) : original_gain;
2538
2539     if (crawl_state.game_is_sprint() && should_scale_piety)
2540         pgn = sprint_modify_piety(pgn);
2541
2542     pgn = div_rand_round(pgn, denominator);
2543     while (pgn-- > 0)
2544         _gain_piety_point();
2545     if (you.piety > you.piety_max[you.religion])
2546     {
2547         if (you.piety >= piety_breakpoint(5)
2548             && you.piety_max[you.religion] < piety_breakpoint(5))
2549         {
2550             mark_milestone("god.maxpiety", "became the Champion of "
2551                            + god_name(you.religion) + ".");
2552         }
2553         you.piety_max[you.religion] = you.piety;
2554     }
2555     return true;
2556 }
2557
2558 /** Reduce piety and handle side-effects.
2559  *
2560  * Appropriate for cases where the player has not sinned, but must lose piety
2561  * anyway, such as costs for abilities.
2562  *
2563  * @param pgn The precise amount of piety lost.
2564  */
2565 void lose_piety(int pgn)
2566 {
2567     if (pgn <= 0)
2568         return;
2569
2570     const int old_piety = you.piety;
2571
2572     // Apply hysteresis.
2573     const int old_hysteresis = you.piety_hysteresis;
2574     you.piety_hysteresis = min<int>(PIETY_HYSTERESIS_LIMIT,
2575                                     you.piety_hysteresis + pgn);
2576     const int pgn_borrowed = (you.piety_hysteresis - old_hysteresis);
2577     pgn -= pgn_borrowed;
2578 #ifdef DEBUG_PIETY
2579     mprf(MSGCH_DIAGNOSTICS,
2580          "Piety decreasing by %d (and %d added to hysteresis)",
2581          pgn, pgn_borrowed);
2582 #endif
2583
2584     if (you.piety - pgn < 0)
2585         you.piety = 0;
2586     else
2587         you.piety -= pgn;
2588
2589     // Don't bother printing out these messages if you're under
2590     // penance, you wouldn't notice since all these abilities
2591     // are withheld.
2592     if (!player_under_penance() && you.piety != old_piety)
2593     {
2594         if (you.piety < piety_breakpoint(5)
2595             && old_piety >= piety_breakpoint(5))
2596         {
2597             // Redraw piety display and, in case the best skill is Invocations,
2598             // redraw the god title.
2599             you.redraw_title = true;
2600
2601             if (!you.one_time_ability_used[you.religion])
2602             {
2603                 if (you_worship(GOD_ZIN))
2604                 {
2605                     simple_god_message(
2606                         " is no longer ready to cure all your mutations.");
2607                 }
2608                 else if (you_worship(GOD_SHINING_ONE) && you.species != SP_FELID)
2609                 {
2610                     simple_god_message(
2611                         " is no longer ready to bless your weapon.");
2612                 }
2613                 else if (you_worship(GOD_KIKUBAAQUDGHA))
2614                 {
2615                     simple_god_message(
2616                         " is no longer ready to enhance your necromancy.");
2617                 }
2618                 else if (you_worship(GOD_LUGONU) && you.species != SP_FELID)
2619                 {
2620                     simple_god_message(
2621                         " is no longer ready to corrupt your weapon.");
2622                 }
2623             }
2624         }
2625
2626         for (int i = 0; i < MAX_GOD_ABILITIES; ++i)
2627         {
2628             if (you.piety < piety_breakpoint(i)
2629                 && old_piety >= piety_breakpoint(i))
2630             {
2631                 // Redraw piety display and, in case the best skill is
2632                 // Invocations, redraw the god title.
2633                 you.redraw_title = true;
2634
2635                 _abil_chg_message(god_lose_power_messages[you.religion][i],
2636                                   "You can no longer %s.", i);
2637
2638                 if (_need_water_walking() && !beogh_water_walk())
2639                     fall_into_a_pool(grd(you.pos()));
2640
2641                 if (you_worship(GOD_QAZLAL) && i == 3)
2642                 {
2643                     mprf(MSGCH_GOD, "The storm surrounding you is now too weak "
2644                                     "to repel missiles.");
2645                 }
2646             }
2647         }
2648
2649 #ifdef USE_TILE_LOCAL
2650         if (you.redraw_title)
2651         {
2652             tiles.layout_statcol();
2653             redraw_screen();
2654         }
2655 #endif
2656     }
2657
2658     if (you.piety > 0 && you.piety <= 5)
2659         learned_something_new(HINT_GOD_DISPLEASED);
2660
2661     if (you_worship(GOD_BEOGH))
2662     {
2663         // Every piety level change also affects AC from orcish gear.
2664         you.redraw_armour_class = true;
2665     }
2666
2667     if (you_worship(GOD_CHEIBRIADOS)
2668         && chei_stat_boost(old_piety) > chei_stat_boost())
2669     {
2670         simple_god_message(" reduces the support of your attributes as your movement quickens.");
2671         notify_stat_change();
2672     }
2673
2674     if (you_worship(GOD_QAZLAL)
2675         && qazlal_sh_boost(old_piety) != qazlal_sh_boost())
2676     {
2677         you.redraw_armour_class = true;
2678     }
2679
2680     if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENOS))
2681     {
2682         // Piety change affects halo / umbra radius.
2683         invalidate_agrid(true);
2684     }
2685 }
2686
2687 // Fedhas worshipers are on the hook for most plants and fungi
2688 //
2689 // If fedhas worshipers kill a protected monster they lose piety,
2690 // if they attack a friendly one they get penance,
2691 // if a friendly one dies they lose piety.
2692 static bool _fedhas_protects_species(monster_type mc)
2693 {
2694     return mons_class_is_plant(mc)
2695            && mons_class_holiness(mc) == MH_PLANT
2696            && mc != MONS_GIANT_SPORE
2697            && mc != MONS_SNAPLASHER_VINE
2698            && mc != MONS_SNAPLASHER_VINE_SEGMENT;
2699 }
2700
2701 bool fedhas_protects(const monster* target)
2702 {
2703     return target && _fedhas_protects_species(mons_base_type(target));
2704 }
2705
2706 // Fedhas neutralises most plants and fungi
2707 bool fedhas_neutralises(const monster* target)
2708 {
2709     return target && mons_is_plant(target)
2710            && target->holiness() == MH_PLANT
2711            && target->type != MONS_SNAPLASHER_VINE
2712            && target->type != MONS_SNAPLASHER_VINE_SEGMENT;
2713 }
2714
2715 static string _god_hates_your_god_reaction(god_type god, god_type your_god)
2716 {
2717     if (god_hates_your_god(god, your_god))
2718     {
2719         // Non-good gods always hate your current god.
2720         if (!is_good_god(god))
2721             return "";
2722
2723         // Zin hates chaotic gods.
2724         if (god == GOD_ZIN && is_chaotic_god(your_god))
2725             return " for chaos";
2726
2727         if (is_evil_god(your_god))
2728             return " for evil";
2729     }
2730
2731     return "";
2732 }
2733
2734 void excommunication(god_type new_god, bool immediate)
2735 {
2736     const god_type old_god = you.religion;
2737     ASSERT(old_god != new_god);
2738     ASSERT(old_god != GOD_NO_GOD);
2739
2740     const bool was_haloed  = you.haloed();
2741     const bool was_umbraed = you.umbraed();
2742     const int  old_piety   = you.piety;
2743
2744     god_acting gdact(old_god, true);
2745
2746     take_note(Note(NOTE_LOSE_GOD, old_god));
2747
2748     you.duration[DUR_PIETY_POOL] = 0; // your loss
2749     you.duration[DUR_RECITE] = 0;
2750     you.piety = 0;
2751     you.piety_hysteresis = 0;
2752     if (old_god == GOD_ASHENZARI)
2753         ash_init_bondage(&you);
2754
2755     you.num_current_gifts[old_god] = 0;
2756
2757     you.religion = GOD_NO_GOD;
2758
2759     you.redraw_title = true;
2760
2761     // Renouncing may have changed the conducts on our wielded or
2762     // quivered weapons, so refresh the display.
2763     you.wield_change = true;
2764     you.redraw_quiver = true;
2765
2766     mpr("You have lost your religion!");
2767     if (!immediate)
2768         more();
2769
2770     if (old_god == GOD_BEOGH)
2771     {
2772         // The player's symbol depends on Beogh worship.
2773         update_player_symbol();
2774     }
2775
2776     mark_milestone("god.renounce", "abandoned " + god_name(old_god) + ".");
2777 #ifdef DGL_WHEREIS
2778     whereis_record();
2779 #endif
2780
2781     if (god_hates_your_god(old_god, new_god))
2782     {
2783         simple_god_message(
2784             make_stringf(" does not appreciate desertion%s!",
2785                          _god_hates_your_god_reaction(old_god, new_god).c_str()).c_str(),
2786             old_god);
2787     }
2788
2789     switch (old_god)
2790     {
2791     case GOD_XOM:
2792         _set_penance(old_god, 50);
2793         break;
2794
2795     case GOD_KIKUBAAQUDGHA:
2796         mprf(MSGCH_GOD, old_god, "You sense decay."); // in the state of Denmark
2797         add_daction(DACT_ROT_CORPSES);
2798         _set_penance(old_god, 30);
2799         break;
2800
2801     case GOD_YREDELEMNUL:
2802         you.duration[DUR_MIRROR_DAMAGE] = 0;
2803         if (query_daction_counter(DACT_ALLY_YRED_SLAVE))
2804         {
2805             simple_god_message(" reclaims all of your granted undead slaves!",
2806                                GOD_YREDELEMNUL);
2807             add_daction(DACT_ALLY_YRED_SLAVE);
2808             remove_all_companions(GOD_YREDELEMNUL);
2809         }
2810         _set_penance(old_god, 30);
2811         break;
2812
2813     case GOD_VEHUMET:
2814         you.vehumet_gifts.clear();
2815         you.duration[DUR_VEHUMET_GIFT] = 0;
2816         _set_penance(old_god, 25);
2817         break;
2818
2819     case GOD_MAKHLEB:
2820         _set_penance(old_god, 25);
2821         add_daction(DACT_ALLY_MAKHLEB);
2822         break;
2823
2824     case GOD_TROG:
2825         if (you.duration[DUR_TROGS_HAND])
2826             trog_remove_trogs_hand();
2827
2828         add_daction(DACT_ALLY_TROG);
2829
2830         _set_penance(old_god, 50);
2831         break;
2832
2833     case GOD_BEOGH:
2834         // You might have lost water walking at a bad time...
2835         if (_need_water_walking())
2836             fall_into_a_pool(grd(you.pos()));
2837
2838         if (query_daction_counter(DACT_ALLY_BEOGH))
2839         {
2840             simple_god_message("'s voice booms out, \"Who do you think you "
2841                                "are?\"", GOD_BEOGH);
2842             mprf(MSGCH_MONSTER_ENCHANT, "All of your followers decide to abandon you.");
2843             add_daction(DACT_ALLY_BEOGH);
2844             remove_all_companions(GOD_BEOGH);
2845         }
2846
2847         env.level_state |= LSTATE_BEOGH;
2848
2849         _set_penance(old_god, 50);
2850         break;
2851
2852     case GOD_SIF_MUNA:
2853         _set_penance(old_god, 50);
2854         break;
2855
2856     case GOD_NEMELEX_XOBEH:
2857         nemelex_shuffle_decks();
2858         _set_penance(old_god, 150); // Nemelex penance is special
2859         break;
2860
2861     case GOD_LUGONU:
2862         _set_penance(old_god, 50);
2863         break;
2864
2865     case GOD_SHINING_ONE:
2866         if (was_haloed)
2867         {
2868             mprf(MSGCH_GOD, old_god, "Your divine halo fades away.");
2869             invalidate_agrid(true);
2870         }
2871
2872         if (you.duration[DUR_DIVINE_SHIELD])
2873             tso_remove_divine_shield();
2874
2875         // Leaving TSO for a non-good god will make all your followers
2876         // abandon you.  Leaving him for a good god will make your holy
2877         // followers (daeva and angel servants) indifferent.
2878         if (!is_good_god(new_god))
2879             add_daction(DACT_ALLY_HOLY);
2880         else
2881             add_daction(DACT_HOLY_PETS_GO_NEUTRAL);
2882
2883         _set_penance(old_god, 30);
2884         break;
2885
2886     case GOD_ZIN:
2887         if (you.duration[DUR_DIVINE_STAMINA])
2888             zin_remove_divine_stamina();
2889
2890         if (env.sanctuary_time)
2891             remove_sanctuary();
2892
2893         // Leaving Zin for a non-good god will make neutral holies
2894         // (originally from TSO) abandon you.
2895         if (!is_good_god(new_god))
2896             add_daction(DACT_ALLY_HOLY);
2897
2898         _set_penance(old_god, 25);
2899         break;
2900
2901     case GOD_ELYVILON:
2902         you.duration[DUR_LIFESAVING] = 0;
2903         if (you.duration[DUR_DIVINE_VIGOUR])
2904             elyvilon_remove_divine_vigour();
2905
2906         // Leaving Elyvilon for a non-good god will make neutral holies
2907         // (originally from TSO) abandon you.
2908         if (!is_good_god(new_god))
2909             add_daction(DACT_ALLY_HOLY);
2910
2911         _set_penance(old_god, 30);
2912         break;
2913
2914     case GOD_JIYVA:
2915         if (you.duration[DUR_SLIMIFY])
2916             you.duration[DUR_SLIMIFY] = 0;
2917
2918         if (query_daction_counter(DACT_ALLY_SLIME))
2919         {
2920             mprf(MSGCH_MONSTER_ENCHANT, "All of your fellow slimes turn on you.");
2921             add_daction(DACT_ALLY_SLIME);
2922         }
2923
2924         _set_penance(old_god, 30);
2925         break;
2926
2927     case GOD_FEDHAS:
2928         if (query_daction_counter(DACT_ALLY_PLANT))
2929         {
2930             mprf(MSGCH_MONSTER_ENCHANT, "The plants of the dungeon turn on you.");
2931             add_daction(DACT_ALLY_PLANT);
2932         }
2933         _set_penance(old_god, 30);
2934         break;
2935
2936     case GOD_ASHENZARI:
2937         if (you.transfer_skill_points > 0)
2938             ashenzari_end_transfer(false, true);
2939         you.duration[DUR_SCRYING] = 0;
2940         you.exp_docked = exp_needed(min<int>(you.max_level, 27)  + 1)
2941                        - exp_needed(min<int>(you.max_level, 27));
2942         you.exp_docked_total = you.exp_docked;
2943         _set_penance(old_god, 50);
2944         break;
2945
2946     case GOD_DITHMENOS:
2947         if (was_umbraed)
2948         {
2949             mprf(MSGCH_GOD, old_god, "Your aura of darkness fades away.");
2950             invalidate_agrid(true);
2951         }
2952         _set_penance(old_god, 25);
2953         break;
2954
2955     case GOD_GOZAG:
2956         if (you.attribute[ATTR_GOZAG_SHOPS_CURRENT])
2957         {
2958             mprf(MSGCH_GOD, old_god, "Your funded stores close, unable to pay "
2959                                      "their debts without your funds.");
2960             you.attribute[ATTR_GOZAG_SHOPS_CURRENT] = 0;
2961         }
2962         invalidate_agrid(true); // gold auras
2963         for (branch_iterator it; it; ++it)
2964             branch_bribe[it->id] = 0;
2965         add_daction(DACT_BRIBE_TIMEOUT);
2966         add_daction(DACT_REMOVE_GOZAG_SHOPS);
2967         _set_penance(old_god, 25);
2968         break;
2969
2970     case GOD_QAZLAL:
2971         if (old_piety >= piety_breakpoint(0))
2972         {
2973             mprf(MSGCH_GOD, old_god, "Your storm instantly dissipates.");
2974             you.redraw_armour_class = true;
2975         }
2976         if (you.duration[DUR_QAZLAL_FIRE_RES])
2977         {
2978             mprf(MSGCH_DURATION, "Your resistance to fire fades away.");
2979             you.duration[DUR_QAZLAL_FIRE_RES] = 0;
2980         }
2981         if (you.duration[DUR_QAZLAL_COLD_RES])
2982         {
2983             mprf(MSGCH_DURATION, "Your resistance to cold fades away.");
2984             you.duration[DUR_QAZLAL_COLD_RES] = 0;
2985         }
2986         if (you.duration[DUR_QAZLAL_ELEC_RES])
2987         {
2988             mprf(MSGCH_DURATION,
2989                  "Your resistance to electricity fades away.");
2990             you.duration[DUR_QAZLAL_ELEC_RES] = 0;
2991         }
2992         if (you.duration[DUR_QAZLAL_AC])
2993         {
2994             mprf(MSGCH_DURATION,
2995                  "Your resistance to physical damage fades away.");
2996             you.duration[DUR_QAZLAL_AC] = 0;
2997             you.redraw_armour_class = true;
2998         }
2999         _set_penance(old_god, 25);
3000         break;
3001
3002     case GOD_CHEIBRIADOS:
3003     default:
3004         _set_penance(old_god, 25);
3005         break;
3006     }
3007
3008     // When you start worshipping a non-good god, or no god, you make
3009     // all non-hostile holy beings that worship a good god hostile.
3010     if (!is_good_god(new_god) && query_daction_counter(DACT_ALLY_HOLY))
3011     {
3012         mprf(MSGCH_MONSTER_ENCHANT, "The divine host forsakes you.");
3013         add_daction(DACT_ALLY_HOLY);
3014     }
3015
3016 #ifdef USE_TILE_LOCAL
3017     tiles.layout_statcol();
3018     redraw_screen();
3019 #endif
3020
3021     // Evil hack.
3022     learned_something_new(HINT_EXCOMMUNICATE,
3023                           coord_def((int)new_god, old_piety));
3024
3025     for (ability_type abil : get_god_abilities(true, true))
3026         you.stop_train.insert(abil_skill(abil));
3027
3028     update_can_train();
3029
3030     // Perhaps we abandoned Trog with everything but Spellcasting maxed out.
3031     check_selected_skills();
3032 }
3033
3034 static string _sacrifice_message(string msg, const string& itname, bool glowing,
3035                                  bool plural, piety_gain_t piety_gain)
3036 {
3037     if (glowing)
3038     {
3039         _replace(msg, "[", "");
3040         _replace(msg, "]", "");
3041     }
3042     else
3043         _erase_between(msg, "[", "]");
3044     _replace(msg, "%", (plural ? "" : "s"));
3045     _replace(msg, "&", conjugate_verb("be", plural));
3046
3047     const char *tag_start, *tag_end;
3048     switch (piety_gain)
3049     {
3050     case PIETY_NONE:
3051         tag_start = "<lightgrey>";
3052         tag_end = "</lightgrey>";
3053         break;
3054     default:
3055     case PIETY_SOME:
3056         tag_start = tag_end = "";
3057         break;
3058     case PIETY_LOTS:
3059         tag_start = "<white>";
3060         tag_end = "</white>";
3061         break;
3062     }
3063
3064     msg.insert(0, itname);
3065     msg = tag_start + msg + tag_end;
3066
3067     return msg;
3068 }
3069
3070 void print_sacrifice_message(god_type god, const item_def &item,
3071                              piety_gain_t piety_gain, bool your)
3072 {
3073     if (god == GOD_ELYVILON && get_weapon_brand(item) == SPWPN_HOLY_WRATH)
3074     {
3075         // Weapons blessed by TSO don't get destroyed but are instead
3076         // returned whence they came. (jpeg)
3077         simple_god_message(
3078             make_stringf(" %sreclaims %s.",
3079                          piety_gain ? "gladly " : "",
3080                          item.name(DESC_THE).c_str()).c_str(),
3081             GOD_SHINING_ONE);
3082         return;
3083     }
3084     const string itname = item.name(your ? DESC_YOUR : DESC_THE);
3085     mprf(MSGCH_GOD, god, "%s",
3086          _sacrifice_message(_Sacrifice_Messages[god][piety_gain], itname,
3087                            itname.find("glowing") != string::npos,
3088                            item.quantity > 1,
3089                            piety_gain).c_str());
3090 }
3091
3092 static string nemelex_death_glow_message(int piety_gain)
3093 {
3094     static const char *messages[NUM_PIETY_GAIN] =
3095     {
3096         " disappear% without a[dditional] glow.",
3097         " glow% slightly [brighter ]and disappear%.",
3098         " glow% with a rainbow of weird colours and disappear%.",
3099     };
3100
3101     return messages[piety_gain];
3102 }
3103
3104 void nemelex_death_message()
3105 {
3106     const piety_gain_t piety_gain = static_cast<piety_gain_t>
3107             (min(random2(you.piety) / 30, (int)PIETY_LOTS));
3108
3109     mpr(_sacrifice_message(nemelex_death_glow_message(piety_gain),
3110                            "Your body", you.backlit(), false, piety_gain));
3111 }
3112
3113 bool god_hates_attacking_friend(god_type god, const monster *fr)
3114 {
3115     if (!fr || fr->kill_alignment() != KC_FRIENDLY)
3116         return false;
3117
3118     monster_type species = fr->mons_species();
3119
3120     if (mons_is_object(species))
3121         return false;
3122     switch (god)
3123     {
3124         case GOD_ZIN:
3125         case GOD_SHINING_ONE:
3126         case GOD_ELYVILON:
3127         case GOD_OKAWARU:
3128             return true;
3129         case GOD_BEOGH: // added penance to avoid killings for loot
3130             return mons_genus(species) == MONS_ORC;
3131         case GOD_JIYVA:
3132             return mons_class_is_slime(species);
3133         case GOD_FEDHAS:
3134             return _fedhas_protects_species(species);
3135         default:
3136             return false;
3137     }
3138 }
3139
3140 /**
3141  * Does this god accept items for sacrifice?
3142  *
3143  * @param god The god.
3144  * @param greedy_explore If true, the return value is based on whether
3145  *                       we should make explore greedy for items under
3146  *                       this god.
3147  * @return  True if the god accepts items for sacrifice, false otherwise.
3148 */
3149 bool god_likes_items(god_type god, bool greedy_explore)
3150 {
3151     if (greedy_explore && (!(Options.explore_stop & ES_GREEDY_SACRIFICEABLE)
3152                            || you_worship(GOD_ASHENZARI)))
3153         // Ash's sacrifice isn't trading items for piety so it shouldn't make
3154         // explore greedy for ?RC
3155     {
3156         return false;
3157     }
3158
3159     if (god_likes_fresh_corpses(god))
3160         return true;
3161
3162     switch (god)
3163     {
3164     case GOD_BEOGH:
3165     case GOD_ASHENZARI:
3166     case GOD_ELYVILON:
3167         return true;
3168
3169     case NUM_GODS: case GOD_RANDOM: case GOD_NAMELESS:
3170         die("Bad god for item sacrifice check: %d", static_cast<int>(god));
3171
3172     default:
3173         return false;
3174     }
3175 }
3176
3177 /**
3178  * Does a god like a particular item for sacrifice?
3179  *
3180  * @param god The god.
3181  * @param item The item.
3182  * @return  True if the god likes the item, false otherwise.
3183 */
3184 bool god_likes_item(god_type god, const item_def& item)
3185 {
3186     if (!god_likes_items(god))
3187         return false;
3188
3189     if (god_likes_fresh_corpses(god))
3190     {
3191         return item.base_type == OBJ_CORPSES
3192                && item.sub_type == CORPSE_BODY;
3193     }
3194
3195     switch (god)
3196     {
3197     case GOD_ELYVILON:
3198         if (item_is_stationary_net(item)) // Held in a net?
3199             return false;
3200         return (item.base_type == OBJ_WEAPONS
3201                 || item.base_type == OBJ_STAVES
3202                 || item.base_type == OBJ_RODS
3203                 || item.base_type == OBJ_MISSILES)
3204                // Once you've reached *** once, don't accept mundane weapon
3205                // sacrifices ever again just because of value.
3206                && (is_unholy_item(item) || is_evil_item(item)
3207                    || you.piety_max[GOD_ELYVILON] < piety_breakpoint(2));
3208
3209     case GOD_BEOGH:
3210         return item.base_type == OBJ_CORPSES
3211                && mons_genus(item.mon_type) == MONS_ORC;
3212
3213     case GOD_ASHENZARI:
3214         return item.base_type == OBJ_SCROLLS
3215                && item.sub_type == SCR_REMOVE_CURSE;
3216
3217     default:
3218         return false;
3219     }
3220 }
3221
3222 static bool _transformed_player_can_join_god(god_type which_god)
3223 {
3224     if ((is_good_god(which_god) || which_god == GOD_FEDHAS)
3225         && you.form == TRAN_LICH)
3226     {
3227         return false;
3228     }
3229
3230     if (is_good_god(which_god) && you.form == TRAN_SHADOW)
3231         return false;
3232
3233     if (which_god == GOD_ZIN && you.form != TRAN_NONE)
3234         return false;
3235
3236     if (which_god == GOD_YREDELEMNUL
3237         && (you.form == TRAN_STATUE || you.petrified()))
3238     {   // it's rather hard to pray while petrified, though
3239         return false;
3240     }
3241
3242     return true;
3243 }
3244
3245 int gozag_service_fee()
3246 {
3247     if (you.char_class == JOB_MONK && had_gods() == 0)
3248         return 0;
3249
3250     const int gold = you.attribute[ATTR_GOLD_GENERATED];
3251     int fee = 50 + (int)(gold - gold / log10(gold + 10.0))/2;
3252
3253     dprf("found %d gold, fee %d", gold, fee);
3254     return fee;
3255 }
3256
3257 bool player_can_join_god(god_type which_god)
3258 {
3259     if (you.species == SP_DEMIGOD)
3260         return false;
3261
3262     if (is_good_god(which_god) && you.undead_or_demonic())
3263         return false;
3264
3265     if (which_god == GOD_YREDELEMNUL && you.is_artificial())
3266         return false;
3267
3268     if (which_god == GOD_BEOGH && !player_genus(GENPC_ORCISH))
3269         return false;
3270
3271     // Fedhas hates undead, but will accept demonspawn.
3272     if (which_god == GOD_FEDHAS && you.holiness() == MH_UNDEAD)
3273         return false;
3274
3275     if (which_god == GOD_SIF_MUNA && !you.spell_no)
3276         return false;
3277
3278 #if TAG_MAJOR_VERSION == 34
3279     // Dithmenos hates fiery species.
3280     if (which_god == GOD_DITHMENOS
3281         && (you.species == SP_DJINNI
3282             || you.species == SP_LAVA_ORC))
3283     {
3284         return false;
3285     }
3286 #endif
3287
3288     if (which_god == GOD_GOZAG && you.gold < gozag_service_fee())
3289         return false;
3290
3291     return _transformed_player_can_join_god(which_god);
3292 }
3293
3294 // Handle messaging and identification for items/equipment on conversion.
3295 static void _god_welcome_handle_gear()
3296 {
3297     // Check for amulets of faith.
3298     item_def *amulet = you.slot_item(EQ_AMULET, false);
3299     if (amulet && amulet->sub_type == AMU_FAITH)
3300     {
3301         mprf(MSGCH_GOD, "Your amulet flashes!");
3302         flash_view_delay(UA_PLAYER, god_colour(you.religion), 300);
3303     }
3304
3305     if (you_worship(GOD_ASHENZARI))
3306     {
3307         // Seemingly redundant with auto_id_inventory(), but we don't want to
3308         // announce items where the only new information is their cursedness.
3309         for (int i = 0; i < ENDOFPACK; i++)
3310             if (you.inv[i].defined())
3311                 you.inv[i].flags |= ISFLAG_KNOW_CURSE;
3312
3313         set_ident_type(OBJ_SCROLLS, SCR_REMOVE_CURSE, ID_KNOWN_TYPE);
3314         auto_id_inventory();
3315         ash_detect_portals(true);
3316     }
3317
3318     // detect evil weapons
3319     if (you_worship(GOD_ELYVILON))
3320         auto_id_inventory();
3321
3322     // Give a reminder to remove any disallowed equipment.
3323     for (int i = EQ_MIN_ARMOUR; i < EQ_MAX_ARMOUR; i++)
3324     {
3325         if (!player_wearing_slot(i))
3326             continue;
3327
3328         const item_def& item = you.inv[you.equip[i]];
3329         if (god_hates_item(item))
3330         {
3331             mprf(MSGCH_GOD, "%s warns you to remove %s.",
3332                  uppercase_first(god_name(you.religion)).c_str(),
3333                  item.name(DESC_YOUR, false, false, false).c_str());
3334         }
3335     }
3336 }
3337
3338 /* Make a CrawlStoreValue an empty vector with the requested item type.
3339  * It is an error if the value already had a different type.
3340  */
3341 static void _make_empty_vec(CrawlStoreValue &v, store_val_type vectype)
3342 {
3343     const store_val_type currtype = v.get_type();
3344     ASSERT(currtype == SV_NONE || currtype == SV_VEC);
3345
3346     if (currtype == SV_NONE)
3347         v.new_vector(vectype);
3348     else
3349     {
3350         CrawlVector &vec = v.get_vector();
3351         const store_val_type old_vectype = vec.get_type();
3352         ASSERT(old_vectype == SV_NONE || old_vectype == vectype);
3353         vec.clear();
3354     }
3355 }
3356
3357 void join_religion(god_type which_god, bool immediate)
3358 {
3359     ASSERT(which_god != GOD_NO_GOD);
3360
3361     redraw_screen();
3362
3363     const god_type old_god = you.religion;
3364     const int old_piety = you.piety;
3365     const int fee = (which_god == GOD_GOZAG) ? gozag_service_fee() : 0;
3366
3367     // Leave your prior religion first.
3368     if (!you_worship(GOD_NO_GOD))
3369         excommunication(which_god, immediate);
3370
3371     // Welcome to the fold!
3372     you.religion = static_cast<god_type>(which_god);
3373
3374     if (you_worship(GOD_XOM))
3375     {
3376         // Xom uses piety and gift_timeout differently.
3377         you.piety = HALF_MAX_PIETY;
3378         you.gift_timeout = random2(40) + random2(40);
3379     }
3380     else if (you_worship(GOD_RU))
3381     {
3382         you.piety = 10; // one moderate sacrifice should get you to *.
3383         you.piety_hysteresis = 0;
3384         you.gift_timeout = 0;
3385         _make_empty_vec(you.props["available_sacrifices"], SV_INT);
3386         _make_empty_vec(you.props[HEALTH_SAC_KEY], SV_INT);
3387         _make_empty_vec(you.props[ESSENCE_SAC_KEY], SV_INT);
3388         _make_empty_vec(you.props[PURITY_SAC_KEY], SV_INT);
3389         _make_empty_vec(you.props[ARCANA_SAC_KEY], SV_INT);
3390         you.props["ru_progress_to_next_sacrifice"] = 0;
3391         // offer the first sacrifice faster than normal;
3392         int delay = 50;
3393         if (crawl_state.game_is_sprint())
3394           delay /= SPRINT_MULTIPLIER;
3395         you.props["ru_sacrifice_delay"] = delay;
3396     }
3397     else
3398     {
3399         you.piety = 15; // to prevent near instant excommunication
3400         if (you.piety_max[you.religion] < 15)
3401             you.piety_max[you.religion] = 15;
3402         you.piety_hysteresis = 0;
3403         you.gift_timeout = 0;
3404     }
3405
3406     set_god_ability_slots();    // remove old god's slots, reserve new god's
3407 #ifdef DGL_WHEREIS
3408     whereis_record();
3409 #endif
3410
3411     mark_milestone("god.worship", "became a worshipper of "
3412                    + god_name(you.religion) + ".");
3413
3414     simple_god_message(
3415         make_stringf(" welcomes you%s!",
3416                      you.worshipped[which_god] ? " back" : "").c_str());
3417     if (!immediate)
3418         more();
3419     if (crawl_state.game_is_tutorial())
3420     {
3421         // Tutorial needs berserk usable.
3422         gain_piety(30, 1, false);
3423     }
3424
3425     if (you_worship(GOD_BEOGH))
3426     {
3427         // The player's symbol depends on Beogh worship.
3428         update_player_symbol();
3429     }
3430
3431     _god_welcome_handle_gear();
3432     ash_check_bondage();
3433
3434     // Chei worshippers start their stat gain immediately.
3435     if (you_worship(GOD_CHEIBRIADOS))
3436     {
3437         simple_god_message(" begins to support your attributes as your "
3438                            "movement slows.");
3439         notify_stat_change();
3440         mprf(MSGCH_GOD, "You can now bend time to slow others.");
3441     }
3442
3443     // We disable all magical skills to avoid accidentally angering Trog.
3444     if (you_worship(GOD_TROG))
3445     {
3446         for (int sk = SK_SPELLCASTING; sk <= SK_LAST_MAGIC; ++sk)
3447             if (you.skills[sk])
3448                 you.train[sk] = 0;
3449     }
3450
3451     // Move gold to top of piles with Gozag.
3452     if (you_worship(GOD_GOZAG))
3453         add_daction(DACT_GOLD_ON_TOP);
3454
3455     // Mention cloud immunity with Qazlal.
3456     if (you_worship(GOD_QAZLAL))
3457         simple_god_message(" will now protect you from your own clouds.");
3458
3459     // Allow training all divine ability skills immediately.
3460     vector<ability_type> abilities = get_god_abilities(true, true);
3461     for (ability_type abil : abilities)
3462         you.start_train.insert(abil_skill(abil));
3463     update_can_train();
3464
3465     // When you start worshipping a good god, you make all non-hostile
3466     // unholy and evil beings hostile; when you start worshipping Zin,
3467     // you make all non-hostile unclean and chaotic beings hostile; and
3468     // when you start worshipping Trog, you make all non-hostile magic
3469     // users hostile.
3470     if (is_good_god(you.religion)
3471         && query_daction_counter(DACT_ALLY_UNHOLY_EVIL))
3472     {
3473         add_daction(DACT_ALLY_UNHOLY_EVIL);
3474         mprf(MSGCH_MONSTER_ENCHANT, "Your unholy and evil allies forsake you.");
3475     }
3476
3477     if (you_worship(GOD_ZIN)
3478         && query_daction_counter(DACT_ALLY_UNCLEAN_CHAOTIC))
3479     {
3480         add_daction(DACT_ALLY_UNCLEAN_CHAOTIC);
3481         mprf(MSGCH_MONSTER_ENCHANT, "Your unclean and chaotic allies forsake you.");
3482     }
3483     else if (you_worship(GOD_TROG)
3484              && query_daction_counter(DACT_ALLY_SPELLCASTER))
3485     {
3486         add_daction(DACT_ALLY_SPELLCASTER);
3487         mprf(MSGCH_MONSTER_ENCHANT, "Your magic-using allies forsake you.");
3488     }
3489
3490     if (you_worship(GOD_ELYVILON))
3491     {
3492         mprf(MSGCH_GOD, "You can now call upon Elyvilon to destroy weapons "
3493                         "lying on the ground.");
3494         mprf(MSGCH_GOD, "You can now provide lesser healing for others.");
3495     }
3496     else if (you_worship(GOD_TROG))
3497     {
3498         mprf(MSGCH_GOD, "You can now call upon Trog to burn spellbooks in your "
3499             "surroundings.");
3500     }
3501     else if (you_worship(GOD_FEDHAS))
3502     {
3503         mprf(MSGCH_GOD, "You can now call upon Fedhas to speed up the decay of corpses.");
3504         mprf(MSGCH_MONSTER_ENCHANT, "The plants of the dungeon cease their hostilities.");
3505         if (env.forest_awoken_until)
3506             for (monster_iterator mi; mi; ++mi)
3507                 mi->del_ench(ENCH_AWAKEN_FOREST);
3508     }
3509
3510     if (you.worshipped[you.religion] < 100)