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