ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/gods.C
Revision: 1.16
Committed: Wed Jan 3 02:30:52 2007 UTC (17 years, 5 months ago) by elmex
Content type: text/plain
Branch: MAIN
Changes since 1.15: +8 -5 lines
Log Message:
implemented proper support for empty treasures, which
sadly occur in empty treasure lists. fixing treasurelists
to have no entries at all would be even more complicated,
but even when this is fixed, the current changes only make the
server more crash robust to bad treasures.
Also removed the 'NONE' specialcase for treasure lists. Developers
should use 'none' instead now.

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 root 1.8 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 elmex 1.1 */
23    
24    
25     /* Oct 3, 1995 - Code laid down for initial gods, priest alignment, and
26     * monster race initialization. b.t.
27     */
28    
29     /* Sept 1996 - moved code over to object -oriented gods -b.t. */
30    
31     #include <global.h>
32     #include <living.h>
33     #include <object.h>
34     #include <spells.h>
35     #include <sounds.h>
36 root 1.14 #include <sproto.h>
37 elmex 1.1
38     /**
39     * Returns the id of specified god.
40     */
41 root 1.6 int
42     lookup_god_by_name (const char *name)
43     {
44     int godnr = -1;
45     size_t nmlen = strlen (name);
46    
47     if (name && strcmp (name, "none"))
48     {
49     godlink *gl;
50    
51     for (gl = first_god; gl; gl = gl->next)
52     if (!strncmp (name, gl->name, MIN ((size_t) strlen (gl->name), nmlen)))
53     break;
54     if (gl)
55     godnr = gl->id;
56 elmex 1.1 }
57 root 1.6 return godnr;
58 elmex 1.1 }
59    
60     /**
61     * Returns pointer to specified god's object through pntr_to_god_obj..
62     */
63 root 1.6 object *
64     find_god (const char *name)
65     {
66     object *god = NULL;
67 elmex 1.1
68 root 1.6 if (name)
69     {
70     godlink *gl;
71 elmex 1.1
72 root 1.6 for (gl = first_god; gl; gl = gl->next)
73     if (!strcmp (name, gl->name))
74     break;
75     if (gl)
76     god = pntr_to_god_obj (gl);
77 elmex 1.1 }
78 root 1.6 return god;
79 elmex 1.1 }
80    
81     /**
82     * Determines if op worships a god.
83     * Returns the godname if they do or "none" if they have no god.
84     * In the case of an NPC, if they have no god, we try and guess
85     * who they should worship based on their race. If that fails we
86     * give them a random one.
87     */
88    
89 root 1.6 const char *
90     determine_god (object *op)
91     {
92     int godnr = -1;
93     const char *godname;
94    
95     /* spells */
96     if ((op->type == SPELL || op->type == SPELL_EFFECT) && op->title)
97     {
98     if (lookup_god_by_name (op->title) >= 0)
99     return op->title;
100     }
101    
102     if (op->type != PLAYER && QUERY_FLAG (op, FLAG_ALIVE))
103     {
104    
105     /* find a god based on race */
106     if (!op->title)
107     {
108     if (op->race != NULL)
109     {
110     godname = get_god_for_race (op->race);
111     if (godname != NULL)
112     {
113     op->title = godname;
114 root 1.3 }
115     }
116     }
117    
118 root 1.6 /* find a random god */
119     if (!op->title)
120     {
121     godlink *gl = first_god;
122    
123     godnr = rndm (1, gl->id);
124     while (gl)
125     {
126     if (gl->id == godnr)
127     break;
128     gl = gl->next;
129 root 1.3 }
130 root 1.6 op->title = gl->name;
131 root 1.3 }
132 elmex 1.1
133 root 1.6 return op->title;
134 elmex 1.1 }
135    
136    
137 root 1.6 /* The god the player worships is in the praying skill (native skill
138     * not skill tool). Since a player can only have one instance of
139     * that skill, once we find it, we can return, either with the
140     * title or "none".
141     */
142     if (op->type == PLAYER)
143     {
144     object *tmp;
145    
146     for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
147     if (tmp->type == SKILL && tmp->subtype == SK_PRAYING)
148     {
149     if (tmp->title)
150     return (tmp->title);
151     else
152     return ("none");
153     }
154 elmex 1.1 }
155 root 1.6 return ("none");
156 elmex 1.1 }
157    
158     /**
159     * Returns 1 if s1 and s2 are the same - either both NULL, or strcmp( ) == 0
160     */
161 root 1.6 static int
162     same_string (const char *s1, const char *s2)
163 elmex 1.1 {
164 root 1.6 if (s1 == NULL)
165     if (s2 == NULL)
166     return 1;
167 elmex 1.1 else
168 root 1.6 return 0;
169     else if (s2 == NULL)
170     return 0;
171     else
172     return strcmp (s1, s2) == 0;
173 elmex 1.1 }
174    
175    
176     /**
177     * Checks for any occurrence of the given 'item' in the inventory of 'op' (recursively).
178     * Any matching items in the inventory are deleted, and a
179     * message is displayed to the player.
180     */
181 root 1.6 static void
182     follower_remove_similar_item (object *op, object *item)
183 elmex 1.1 {
184 root 1.6 object *tmp, *next;
185    
186     if (op && op->type == PLAYER && op->contr)
187     {
188     /* search the inventory */
189     for (tmp = op->inv; tmp != NULL; tmp = next)
190     {
191     next = tmp->below; /* backup in case we remove tmp */
192    
193     if (tmp->type == item->type
194     && same_string (tmp->name, item->name)
195     && same_string (tmp->title, item->title) && same_string (tmp->msg, item->msg) && same_string (tmp->slaying, item->slaying))
196     {
197    
198     /* message */
199     if (tmp->nrof > 1)
200     new_draw_info_format (NDI_UNIQUE, 0, op, "The %s crumble to dust!", query_short_name (tmp));
201     else
202     new_draw_info_format (NDI_UNIQUE, 0, op, "The %s crumbles to dust!", query_short_name (tmp));
203    
204 root 1.9 tmp->remove (); /* remove obj from players inv. */
205 root 1.6 esrv_del_item (op->contr, tmp->count); /* notify client */
206 root 1.10 tmp->destroy (); /* free object */
207 root 1.3 }
208 root 1.10
209 root 1.6 if (tmp->inv)
210     follower_remove_similar_item (tmp, item);
211 root 1.3 }
212 elmex 1.1 }
213     }
214    
215     /**
216     * Checks for any occurrence of the given 'item' in the inventory of 'op' (recursively).
217     * Returns 1 if found, else 0.
218     */
219 root 1.6 static int
220     follower_has_similar_item (object *op, object *item)
221 elmex 1.1 {
222 root 1.6 object *tmp;
223 elmex 1.1
224 root 1.6 for (tmp = op->inv; tmp != NULL; tmp = tmp->below)
225     {
226     if (tmp->type == item->type
227     && same_string (tmp->name, item->name)
228     && same_string (tmp->title, item->title) && same_string (tmp->msg, item->msg) && same_string (tmp->slaying, item->slaying))
229     return 1;
230     if (tmp->inv && follower_has_similar_item (tmp, item))
231     return 1;
232 elmex 1.1 }
233 root 1.6 return 0;
234 elmex 1.1 }
235    
236     /**
237     * God gives an item to the player.
238     */
239 root 1.6 static int
240     god_gives_present (object *op, object *god, treasure *tr)
241 elmex 1.1 {
242 root 1.6 object *tmp;
243 elmex 1.1
244 elmex 1.16 if (!tr->item)
245     return 0;
246    
247 root 1.6 if (follower_has_similar_item (op, &tr->item->clone))
248     return 0;
249 elmex 1.1
250 root 1.6 tmp = arch_to_object (tr->item);
251     new_draw_info_format (NDI_UNIQUE, 0, op, "%s lets %s appear in your hands.", &god->name, query_short_name (tmp));
252     tmp = insert_ob_in_ob (tmp, op);
253     if (op->type == PLAYER)
254     esrv_send_item (op, tmp);
255 elmex 1.16
256 root 1.6 return 1;
257 elmex 1.1 }
258    
259     /**
260     * Player prays at altar.
261     * Checks for god changing, divine intervention, and so on.
262     */
263 root 1.6 void
264     pray_at_altar (object *pl, object *altar, object *skill)
265     {
266     object *pl_god = find_god (determine_god (pl));
267    
268     if (INVOKE_PLAYER (PRAY_ALTAR, pl->contr, ARG_OBJECT (altar), ARG_OBJECT (skill)))
269     return;
270 elmex 1.1
271 root 1.6 /* If non consecrate altar, don't do anything */
272     if (!altar->other_arch)
273     return;
274    
275     /* hmm. what happend depends on pl's current god, level, etc */
276     if (!pl_god)
277     { /*new convert */
278     become_follower (pl, &altar->other_arch->clone);
279 root 1.2 return;
280 elmex 1.1
281 root 1.6 }
282     else if (!strcmp (&pl_god->name, altar->other_arch->clone.name))
283     {
284     /* pray at your gods altar */
285     int bonus = (pl->stats.Wis + skill->level) / 10;
286    
287     /* we can get neg grace up faster */
288     if (pl->stats.grace < 0)
289     pl->stats.grace += (bonus > -1 * (pl->stats.grace / 10) ? bonus : -1 * (pl->stats.grace / 10));
290     /* we can super-charge grace to 2x max */
291     if (pl->stats.grace < (2 * pl->stats.maxgrace))
292     {
293     pl->stats.grace += bonus / 2;
294     }
295     if (pl->stats.grace > (2 * pl->stats.maxgrace))
296     {
297     pl->stats.grace = (2 * pl->stats.maxgrace);
298     }
299    
300     /* Every once in a while, the god decides to checkup on their
301     * follower, and may intervene to help them out.
302     */
303     bonus = MAX (1, bonus + MAX (pl->stats.luck, -3)); /* -- DAMN -- */
304    
305     if (((random_roll (0, 399, pl, PREFER_LOW)) - bonus) < 0)
306     god_intervention (pl, pl_god, skill);
307    
308     }
309     else
310     { /* praying to another god! */
311     uint64 loss = 0;
312     int angry = 1;
313    
314     /* I believe the logic for detecting opposing gods was completely
315     * broken - I think it should work now. altar->other_arch
316     * points to the god of this altar (which we have
317     * already verified is non null). pl_god->other_arch
318     * is the opposing god - we need to verify that exists before
319     * using its values.
320     */
321     if (pl_god->other_arch && (altar->other_arch->name == pl_god->other_arch->name))
322     {
323     angry = 2;
324     if (random_roll (0, skill->level + 2, pl, PREFER_LOW) - 5 > 0)
325     {
326     object *tmp;
327    
328     /* you really screwed up */
329     angry = 3;
330     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, pl, "Foul Priest! %s punishes you!", &pl_god->name);
331     tmp = get_archetype (LOOSE_MANA);
332     cast_magic_storm (pl, tmp, pl_god->level + 20);
333     }
334     else
335     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, pl, "Foolish heretic! %s is livid!", &pl_god->name);
336     }
337     else
338     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, pl, "Heretic! %s is angered!", &pl_god->name);
339 elmex 1.1
340 root 1.6 /* whether we will be successfull in defecting or not -
341     * we lose experience from the clerical experience obj
342     */
343    
344     loss = angry * (skill->stats.exp / 10);
345     if (loss)
346     change_exp (pl, -random_roll64 (0, loss, pl, PREFER_LOW), skill ? &skill->skill : "none", SK_SUBTRACT_SKILL_EXP);
347    
348     /* May switch Gods, but its random chance based on our current level
349     * note it gets harder to swap gods the higher we get
350     */
351     if ((angry == 1) && !(random_roll (0, skill->level, pl, PREFER_LOW)))
352     {
353     become_follower (pl, &altar->other_arch->clone);
354     }
355     else
356     {
357     /* toss this player off the altar. He can try again. */
358     new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, pl, "A divine force pushes you off the altar.");
359     move_player (pl, absdir (pl->facing + 4)); /* back him off the way he came. */
360     }
361 elmex 1.1 }
362     }
363    
364     /**
365     * Removes special prayers given by a god.
366     */
367 root 1.6 static void
368     check_special_prayers (object *op, object *god)
369 elmex 1.1 {
370 root 1.6 /* Ensure that 'op' doesn't know any special prayers that are not granted
371     * by 'god'.
372     */
373     treasure *tr;
374     object *tmp, *next_tmp;
375     int remove = 0;
376    
377     /* Outer loop iterates over all special prayer marks */
378     for (tmp = op->inv; tmp; tmp = next_tmp)
379     {
380     next_tmp = tmp->below;
381    
382     /* we mark special prayers with the STARTEQUIP flag, so if it isn't
383     * in that category, not something we need to worry about.
384     */
385     if (tmp->type != SPELL || !QUERY_FLAG (tmp, FLAG_STARTEQUIP))
386     continue;
387 elmex 1.1
388 root 1.6 if (god->randomitems == NULL)
389     {
390     LOG (llevError, "BUG: check_special_prayers(): god %s without randomitems\n", &god->name);
391     do_forget_spell (op, tmp->name);
392     continue;
393 root 1.3 }
394 elmex 1.1
395 root 1.6 /* Inner loop tries to find the special prayer in the god's treasure
396     * list. We default that the spell should be removed.
397     */
398     remove = 1;
399     for (tr = god->randomitems->items; tr; tr = tr->next)
400     {
401     object *item;
402    
403 elmex 1.16 if (!tr->item)
404 root 1.6 continue;
405     item = &tr->item->clone;
406 elmex 1.1
407 root 1.6 /* Basically, see if the matching spell is granted by this god. */
408 elmex 1.1
409 root 1.6 if (tr->item->clone.type == SPELL && tr->item->clone.name == tmp->name)
410     {
411     remove = 0;
412     break;
413 root 1.3 }
414     }
415 root 1.6 if (remove)
416     {
417     /* just do the work of removing the spell ourselves - we already
418     * know that the player knows the spell
419     */
420     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "You lose knowledge of %s.", &tmp->name);
421     player_unready_range_ob (op->contr, tmp);
422 root 1.10 tmp->destroy ();
423 root 1.3 }
424 elmex 1.1
425     }
426     }
427    
428     /**
429     * This function is called whenever a player has
430     * switched to a new god. It handles basically all the stat changes
431     * that happen to the player, including the removal of godgiven
432     * items (from the former cult).
433     */
434 root 1.6 void
435     become_follower (object *op, object *new_god)
436     {
437     object *old_god = NULL; /* old god */
438     treasure *tr;
439     object *item, *skop, *next;
440     int i, sk_applied, undeadified = 0; /* Turns to true if changing god can changes the undead status of the player. */
441    
442    
443     old_god = find_god (determine_god (op));
444    
445     /* take away any special god-characteristic items. */
446     for (item = op->inv; item != NULL; item = next)
447     {
448     next = item->below;
449 elmex 1.12 // remove all invisible startequip items which are not skill, exp or force
450 root 1.6 if (QUERY_FLAG (item, FLAG_STARTEQUIP) && item->invisible &&
451 elmex 1.12 (item->type != SKILL) && (item->type != FORCE))
452 root 1.6 {
453    
454     if (item->type == SPELL)
455     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "You lose knowledge of %s.", &item->name);
456 root 1.10
457 root 1.6 player_unready_range_ob (op->contr, item);
458 root 1.10 item->destroy ();
459 root 1.6 }
460     }
461    
462     /* remove any godgiven items from the old god */
463     if (old_god)
464     {
465     for (tr = old_god->randomitems->items; tr != NULL; tr = tr->next)
466     {
467     if (tr->item && QUERY_FLAG (&tr->item->clone, FLAG_STARTEQUIP))
468     follower_remove_similar_item (op, &tr->item->clone);
469     }
470     }
471    
472     if (!op || !new_god)
473     return;
474    
475     if (op->race && new_god->slaying && strstr (op->race, new_god->slaying))
476     {
477     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "Fool! %s detests your kind!", &new_god->name);
478     if (random_roll (0, op->level - 1, op, PREFER_LOW) - 5 > 0)
479     {
480     object *tmp = get_archetype (LOOSE_MANA);
481    
482     cast_magic_storm (op, tmp, new_god->level + 10);
483     }
484     return;
485     }
486    
487    
488     /* give the player any special god-characteristic-items. */
489     for (tr = new_god->randomitems->items; tr != NULL; tr = tr->next)
490     {
491     if (tr->item && tr->item->clone.invisible && tr->item->clone.type != SPELLBOOK &&
492     tr->item->clone.type != BOOK && tr->item->clone.type != SPELL)
493     god_gives_present (op, new_god, tr);
494     }
495    
496    
497     new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "You become a follower of %s!", &new_god->name);
498    
499     for (skop = op->inv; skop != NULL; skop = skop->below)
500     if (skop->type == SKILL && skop->subtype == SK_PRAYING)
501     break;
502    
503     /* Player has no skill - give them the skill */
504     if (!skop)
505     {
506     /* The arhetype should always be defined - if we crash here because it doesn't,
507     * things are really messed up anyways.
508     */
509     skop = give_skill_by_name (op, get_archetype_by_type_subtype (SKILL, SK_PRAYING)->clone.skill);
510     link_player_skills (op);
511     }
512    
513     sk_applied = QUERY_FLAG (skop, FLAG_APPLIED); /* save skill status */
514    
515     /* Clear the "undead" status. We also need to force a call to change_abil,
516     * so I set undeadified for that.
517     * - gros, 21th July 2006.
518     */
519     if ((old_god) && (QUERY_FLAG (old_god, FLAG_UNDEAD)))
520     {
521     CLEAR_FLAG (skop, FLAG_UNDEAD);
522     undeadified = 1;
523     }
524    
525     if (skop->title)
526     { /* get rid of old god */
527     new_draw_info_format (NDI_UNIQUE, 0, op, "%s's blessing is withdrawn from you.", &skop->title);
528     /* The point of this is to really show what abilities the player just lost */
529     if (sk_applied || undeadified)
530     {
531 elmex 1.1
532 root 1.6 CLEAR_FLAG (skop, FLAG_APPLIED);
533     (void) change_abil (op, skop);
534     }
535 elmex 1.1 }
536    
537 root 1.6 /* now change to the new gods attributes to exp_obj */
538     skop->title = new_god->name;
539     skop->path_attuned = new_god->path_attuned;
540     skop->path_repelled = new_god->path_repelled;
541     skop->path_denied = new_god->path_denied;
542     /* copy god's resistances */
543     memcpy (skop->resist, new_god->resist, sizeof (new_god->resist));
544    
545     /* make sure that certain immunities do NOT get passed
546     * to the follower!
547     */
548     for (i = 0; i < NROFATTACKS; i++)
549     if (skop->resist[i] > 30 && (i == ATNR_FIRE || i == ATNR_COLD || i == ATNR_ELECTRICITY || i == ATNR_POISON))
550     skop->resist[i] = 30;
551    
552     skop->stats.hp = (sint16) new_god->last_heal;
553     skop->stats.sp = (sint16) new_god->last_sp;
554     skop->stats.grace = (sint16) new_god->last_grace;
555     skop->stats.food = (sint16) new_god->last_eat;
556     skop->stats.luck = (sint8) new_god->stats.luck;
557     /* gods may pass on certain flag properties */
558     update_priest_flag (new_god, skop, FLAG_SEE_IN_DARK);
559     update_priest_flag (new_god, skop, FLAG_REFL_SPELL);
560     update_priest_flag (new_god, skop, FLAG_REFL_MISSILE);
561     update_priest_flag (new_god, skop, FLAG_STEALTH);
562     update_priest_flag (new_god, skop, FLAG_MAKE_INVIS);
563     update_priest_flag (new_god, skop, FLAG_UNDEAD);
564     update_priest_flag (new_god, skop, FLAG_BLIND);
565     update_priest_flag (new_god, skop, FLAG_XRAYS); /* better have this if blind! */
566    
567     new_draw_info_format (NDI_UNIQUE, 0, op, "You are bathed in %s's aura.", &new_god->name);
568    
569     /* Weapon/armour use are special...handle flag toggles here as this can
570     * only happen when gods are worshipped and if the new priest could
571     * have used armour/weapons in the first place.
572     *
573     * This also can happen for monks which cannot use weapons. In this case
574     * do not allow to use weapons even if the god otherwise would allow it.
575     */
576     if (!present_in_ob_by_name (FORCE, "no weapon force", op))
577     update_priest_flag (new_god, skop, FLAG_USE_WEAPON);
578     update_priest_flag (new_god, skop, FLAG_USE_ARMOUR);
579    
580     if (worship_forbids_use (op, skop, FLAG_USE_WEAPON, "weapons"))
581     stop_using_item (op, WEAPON, 2);
582    
583     if (worship_forbids_use (op, skop, FLAG_USE_ARMOUR, "armour"))
584     {
585     stop_using_item (op, ARMOUR, 1);
586     stop_using_item (op, HELMET, 1);
587     stop_using_item (op, BOOTS, 1);
588     stop_using_item (op, GLOVES, 1);
589     stop_using_item (op, SHIELD, 1);
590     }
591 elmex 1.1
592 root 1.6 SET_FLAG (skop, FLAG_APPLIED);
593     (void) change_abil (op, skop);
594 elmex 1.1
595 root 1.6 /* return to previous skill status */
596     if (!sk_applied)
597     CLEAR_FLAG (skop, FLAG_APPLIED);
598    
599     check_special_prayers (op, new_god);
600 elmex 1.1 }
601    
602     /**
603     * Forbids or let player use something item type.
604     * op is the player.
605     * exp_obj is the widsom experience.
606     * flag is the flag to check against.
607     * string is the string to print out.
608     */
609    
610 root 1.6 int
611     worship_forbids_use (object *op, object *exp_obj, uint32 flag, const char *string)
612     {
613 elmex 1.1
614 root 1.6 if (QUERY_FLAG (&op->arch->clone, flag))
615     if (QUERY_FLAG (op, flag) != QUERY_FLAG (exp_obj, flag))
616     {
617     update_priest_flag (exp_obj, op, flag);
618     if (QUERY_FLAG (op, flag))
619     new_draw_info_format (NDI_UNIQUE, 0, op, "You may use %s again.", string);
620     else
621     {
622     new_draw_info_format (NDI_UNIQUE, 0, op, "You are forbidden to use %s.", string);
623     return 1;
624     }
625 elmex 1.1 }
626     return 0;
627     }
628    
629     /**
630     * Unapplies up to number worth of items of type
631     */
632 root 1.6 void
633     stop_using_item (object *op, int type, int number)
634     {
635 elmex 1.1 object *tmp;
636    
637 root 1.6 for (tmp = op->inv; tmp && number; tmp = tmp->below)
638     if (tmp->type == type && QUERY_FLAG (tmp, FLAG_APPLIED))
639     {
640 elmex 1.1 apply_special (op, tmp, AP_UNAPPLY | AP_IGNORE_CURSE);
641 root 1.3 number--;
642 root 1.6 }
643 elmex 1.1 }
644    
645     /**
646     * If the god does/doesnt have this flag, we
647     * give/remove it from the experience object if it doesnt/does
648     * already exist. For players only!
649     */
650    
651 root 1.6 void
652     update_priest_flag (object *god, object *exp_ob, uint32 flag)
653     {
654     if (QUERY_FLAG (god, flag) && !QUERY_FLAG (exp_ob, flag))
655     SET_FLAG (exp_ob, flag);
656     else if (QUERY_FLAG (exp_ob, flag) && !QUERY_FLAG (god, flag))
657     {
658     /* When this is called with the exp_ob set to the player,
659     * this check is broken, because most all players arch
660     * allow use of weapons. I'm not actually sure why this
661     * check is here - I guess if you had a case where the
662     * value in the archetype (wisdom) should over ride the restrictions
663     * the god places on it, this may make sense. But I don't think
664     * there is any case like that.
665     */
666    
667 elmex 1.1 /* if (!(QUERY_FLAG(&(exp_ob->arch->clone),flag)))*/
668 root 1.6 CLEAR_FLAG (exp_ob, flag);
669     };
670 elmex 1.1 }
671    
672    
673    
674 root 1.6 archetype *
675     determine_holy_arch (object *god, const char *type)
676 elmex 1.1 {
677 root 1.6 treasure *tr;
678 elmex 1.1
679 root 1.6 if (!god || !god->randomitems)
680     {
681     LOG (llevError, "BUG: determine_holy_arch(): no god or god without " "randomitems\n");
682     return NULL;
683 elmex 1.1 }
684    
685 root 1.6 for (tr = god->randomitems->items; tr != NULL; tr = tr->next)
686     {
687     object *item;
688 elmex 1.1
689 root 1.6 if (!tr->item)
690     continue;
691 elmex 1.16
692 root 1.6 item = &tr->item->clone;
693 elmex 1.1
694 root 1.6 if (item->type == BOOK && item->invisible && strcmp (item->name, type) == 0)
695     return item->other_arch;
696 elmex 1.1 }
697 root 1.6 return NULL;
698 elmex 1.1 }
699    
700     /**
701     * God helps player by removing curse and/or damnation.
702     */
703 root 1.6 static int
704     god_removes_curse (object *op, int remove_damnation)
705 elmex 1.1 {
706 root 1.6 object *tmp;
707     int success = 0;
708 elmex 1.1
709 root 1.6 for (tmp = op->inv; tmp; tmp = tmp->below)
710     {
711     if (tmp->invisible)
712     continue;
713     if (QUERY_FLAG (tmp, FLAG_DAMNED) && !remove_damnation)
714     continue;
715     if (QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))
716     {
717     success = 1;
718     CLEAR_FLAG (tmp, FLAG_DAMNED);
719     CLEAR_FLAG (tmp, FLAG_CURSED);
720     CLEAR_FLAG (tmp, FLAG_KNOWN_CURSED);
721     if (op->type == PLAYER)
722     esrv_send_item (op, tmp);
723 elmex 1.1 }
724     }
725    
726 root 1.6 if (success)
727     new_draw_info (NDI_UNIQUE, 0, op, "You feel like someone is helping you.");
728     return success;
729 elmex 1.1 }
730    
731 root 1.6 static int
732     follower_level_to_enchantments (int level, int difficulty)
733 elmex 1.1 {
734 root 1.6 if (difficulty < 1)
735     {
736     LOG (llevError, "follower_level_to_enchantments(): " "difficulty %d is invalid\n", difficulty);
737     return 0;
738 elmex 1.1 }
739    
740 root 1.6 if (level <= 20)
741     return level / difficulty;
742     if (level <= 40)
743     return (20 + (level - 20) / 2) / difficulty;
744     return (30 + (level - 40) / 4) / difficulty;
745 elmex 1.1 }
746    
747     /**
748     * God wants to enchant weapon.
749     * Affected weapon is the applied one (weapon or bow). It's checked to make sure
750     * it isn't a weapon for another god. If all is all right, update weapon with
751     * attacktype, slaying and such.
752     */
753 root 1.6 static int
754     god_enchants_weapon (object *op, object *god, object *tr, object *skill)
755 elmex 1.1 {
756 root 1.6 char buf[MAX_BUF];
757     object *weapon;
758     uint32 attacktype;
759     int tmp;
760    
761     for (weapon = op->inv; weapon; weapon = weapon->below)
762     if ((weapon->type == WEAPON || weapon->type == BOW) && QUERY_FLAG (weapon, FLAG_APPLIED))
763     break;
764     if (weapon == NULL || god_examines_item (god, weapon) <= 0)
765     return 0;
766    
767     /* First give it a title, so other gods won't touch it */
768     if (!weapon->title)
769     {
770     sprintf (buf, "of %s", &god->name);
771     weapon->title = buf;
772     if (op->type == PLAYER)
773     esrv_update_item (UPD_NAME, op, weapon);
774     new_draw_info (NDI_UNIQUE, 0, op, "Your weapon quivers as if struck!");
775     }
776    
777     /* Allow the weapon to slay enemies */
778     if (!weapon->slaying && god->slaying)
779     {
780     weapon->slaying = god->slaying;
781     new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s now hungers to slay enemies of your god!", &weapon->name);
782     return 1;
783 elmex 1.1 }
784    
785 root 1.6 /* Add the gods attacktype */
786     attacktype = (weapon->attacktype == 0) ? AT_PHYSICAL : weapon->attacktype;
787     if ((attacktype & god->attacktype) != god->attacktype)
788     {
789     new_draw_info (NDI_UNIQUE, 0, op, "Your weapon suddenly glows!");
790     weapon->attacktype = attacktype | god->attacktype;
791     return 1;
792 elmex 1.1 }
793    
794 root 1.6 /* Higher magic value */
795     tmp = follower_level_to_enchantments (skill->level, tr->level);
796     if (weapon->magic < tmp)
797     {
798     new_draw_info (NDI_UNIQUE, 0, op, "A phosphorescent glow envelops your weapon!");
799     weapon->magic++;
800     if (op->type == PLAYER)
801     esrv_update_item (UPD_NAME, op, weapon);
802     return 1;
803 elmex 1.1 }
804    
805 root 1.6 return 0;
806 elmex 1.1 }
807    
808    
809     /**
810     * Every once in a while the god will intervene to help the worshiper.
811     * Later, this fctn can be used to supply quests, etc for the
812     * priest. -b.t.
813     * called from pray_at_altar() currently.
814     */
815    
816 root 1.6 void
817     god_intervention (object *op, object *god, object *skill)
818 elmex 1.1 {
819 root 1.6 treasure *tr;
820 elmex 1.1
821 root 1.6 if (!god || !god->randomitems)
822     {
823     LOG (llevError, "BUG: god_intervention(): no god or god without randomitems\n");
824     return;
825 elmex 1.1 }
826    
827 root 1.6 check_special_prayers (op, god);
828 elmex 1.1
829 root 1.6 /* lets do some checks of whether we are kosher with our god */
830     if (god_examines_priest (op, god) < 0)
831     return;
832 elmex 1.1
833 root 1.6 new_draw_info (NDI_UNIQUE, 0, op, "You feel a holy presence!");
834 elmex 1.1
835 root 1.6 for (tr = god->randomitems->items; tr != NULL; tr = tr->next)
836     {
837     object *item;
838    
839     if (tr->chance <= random_roll (0, 99, op, PREFER_HIGH))
840     continue;
841 elmex 1.1
842 root 1.6 /* Treasurelist - generate some treasure for the follower */
843     if (tr->name)
844     {
845     treasurelist *tl = find_treasurelist (tr->name);
846    
847     if (tl == NULL)
848 elmex 1.1 continue;
849    
850 root 1.6 new_draw_info (NDI_UNIQUE, 0, op, "Something appears before your " "eyes. You catch it before it falls to the ground.");
851 elmex 1.1
852 root 1.6 create_treasure (tl, op, GT_STARTEQUIP | GT_ONLY_GOOD | GT_UPDATE_INV, skill->level, 0);
853     return;
854 elmex 1.1 }
855    
856 root 1.6 if (!tr->item)
857 elmex 1.16 continue;
858    
859 root 1.6 item = &tr->item->clone;
860 elmex 1.1
861 root 1.6 /* Grace limit */
862     if (item->type == BOOK && item->invisible && strcmp (item->name, "grace limit") == 0)
863     {
864     if (op->stats.grace < item->stats.grace || op->stats.grace < op->stats.maxgrace)
865     {
866     object *tmp;
867    
868     /* Follower lacks the required grace for the following
869     * treasure list items. */
870    
871     tmp = get_archetype (HOLY_POSSESSION);
872     cast_change_ability (op, op, tmp, 0, 1);
873 root 1.10 tmp->destroy ();
874 root 1.6 return;
875 elmex 1.1 }
876 root 1.6 continue;
877 elmex 1.1 }
878    
879 root 1.6 /* Restore grace */
880     if (item->type == BOOK && item->invisible && strcmp (item->name, "restore grace") == 0)
881     {
882     if (op->stats.grace >= 0)
883     continue;
884     op->stats.grace = random_roll (0, 9, op, PREFER_HIGH);
885     new_draw_info (NDI_UNIQUE, 0, op, "You are returned to a state of grace.");
886     return;
887 elmex 1.1 }
888    
889 root 1.6 /* Heal damage */
890     if (item->type == BOOK && item->invisible && strcmp (item->name, "restore hitpoints") == 0)
891     {
892     if (op->stats.hp >= op->stats.maxhp)
893     continue;
894     new_draw_info (NDI_UNIQUE, 0, op, "A white light surrounds and heals you!");
895     op->stats.hp = op->stats.maxhp;
896     return;
897 elmex 1.1 }
898    
899 root 1.6 /* Restore spellpoints */
900     if (item->type == BOOK && item->invisible && strcmp (item->name, "restore spellpoints") == 0)
901 elmex 1.1 {
902 root 1.6 int max = (int) (op->stats.maxsp * (item->stats.maxsp / 100.0));
903    
904     /* Restore to 50 .. 100%, if sp < 50% */
905     int new_sp = (int) (random_roll (1000, 1999, op, PREFER_HIGH) / 2000.0 * max);
906    
907     if (op->stats.sp >= max / 2)
908     continue;
909     new_draw_info (NDI_UNIQUE, 0, op, "A blue lightning strikes " "your head but doesn't hurt you!");
910     op->stats.sp = new_sp;
911 elmex 1.1 }
912    
913 root 1.6 /* Various heal spells */
914     if (item->type == BOOK && item->invisible && strcmp (item->name, "heal spell") == 0)
915 elmex 1.1 {
916 root 1.6 object *tmp;
917     int success;
918 elmex 1.1
919 root 1.6 tmp = get_archetype_by_object_name (item->slaying);
920 elmex 1.1
921 root 1.6 success = cast_heal (op, op, tmp, 0);
922 root 1.10 tmp->destroy ();
923 root 1.6 if (success)
924     return;
925     else
926     continue;
927 elmex 1.1 }
928    
929 root 1.6 /* Remove curse */
930     if (item->type == BOOK && item->invisible && strcmp (item->name, "remove curse") == 0)
931 elmex 1.1 {
932 root 1.6 if (god_removes_curse (op, 0))
933     return;
934     else
935     continue;
936 elmex 1.1 }
937    
938 root 1.6 /* Remove damnation */
939     if (item->type == BOOK && item->invisible && strcmp (item->name, "remove damnation") == 0)
940 elmex 1.1 {
941 root 1.6 if (god_removes_curse (op, 1))
942     return;
943     else
944     continue;
945 elmex 1.1 }
946    
947 root 1.6 /* Heal depletion */
948     if (item->type == BOOK && item->invisible && strcmp (item->name, "heal depletion") == 0)
949 elmex 1.1 {
950 root 1.6 object *depl;
951     archetype *at;
952     int i;
953    
954 root 1.7 if ((at = archetype::find (ARCH_DEPLETION)) == NULL)
955 root 1.6 {
956     LOG (llevError, "Could not find archetype depletion.\n");
957     continue;
958 elmex 1.1 }
959 root 1.6 depl = present_arch_in_ob (at, op);
960 root 1.10
961 root 1.6 if (depl == NULL)
962     continue;
963 root 1.10
964 root 1.6 new_draw_info (NDI_UNIQUE, 0, op, "Shimmering light surrounds and restores you!");
965 root 1.10
966 root 1.6 for (i = 0; i < NUM_STATS; i++)
967     if (get_attr_value (&depl->stats, i))
968     new_draw_info (NDI_UNIQUE, 0, op, restore_msg[i]);
969 root 1.10
970     depl->destroy ();
971 root 1.13 op->update_stats ();
972 root 1.6 return;
973 elmex 1.1 }
974 root 1.6
975     /* Voices */
976     if (item->type == BOOK && item->invisible && strcmp (item->name, "voice_behind") == 0)
977     {
978     new_draw_info (NDI_UNIQUE, 0, op, "You hear a voice from behind you, but you don't dare to " "turn around:");
979     new_draw_info (NDI_WHITE, 0, op, item->msg);
980     return;
981 elmex 1.1 }
982    
983 root 1.6 /* Messages */
984     if (item->type == BOOK && item->invisible && strcmp (item->name, "message") == 0)
985 elmex 1.1 {
986 root 1.6 new_draw_info (NDI_UNIQUE, 0, op, item->msg);
987     return;
988 elmex 1.1 }
989    
990 root 1.6 /* Enchant weapon */
991     if (item->type == BOOK && item->invisible && strcmp (item->name, "enchant weapon") == 0)
992 elmex 1.1 {
993 root 1.6 if (god_enchants_weapon (op, god, item, skill))
994     return;
995     else
996     continue;
997 elmex 1.1 }
998    
999 root 1.6 /* Spellbooks - works correctly only for prayers */
1000     if (item->type == SPELL)
1001 elmex 1.1 {
1002 root 1.6 if (check_spell_known (op, item->name))
1003     continue;
1004     if (item->level > skill->level)
1005     continue;
1006 elmex 1.1
1007 root 1.6 new_draw_info_format (NDI_UNIQUE, 0, op, "%s grants you use of a special prayer!", &god->name);
1008     do_learn_spell (op, item, 1);
1009     return;
1010 elmex 1.1
1011 root 1.3 }
1012 elmex 1.1
1013 root 1.6 /* Other gifts */
1014     if (!item->invisible)
1015     {
1016     if (god_gives_present (op, god, tr))
1017     return;
1018     else
1019     continue;
1020 elmex 1.1 }
1021 root 1.6 /* else ignore it */
1022 elmex 1.1 }
1023    
1024 root 1.6 new_draw_info (NDI_UNIQUE, 0, op, "You feel rapture.");
1025 elmex 1.1 }
1026    
1027     /**
1028     * Checks and maybe punishes someone praying.
1029     * All applied items are examined, if player is using more items of other gods,
1030     * s/he loses experience in praying or general experience if no praying.
1031     */
1032 root 1.6 int
1033     god_examines_priest (object *op, object *god)
1034     {
1035     int reaction = 1;
1036     object *item = NULL, *skop;
1037 elmex 1.1
1038 root 1.6 for (item = op->inv; item; item = item->below)
1039     {
1040     if (QUERY_FLAG (item, FLAG_APPLIED))
1041     {
1042     reaction += god_examines_item (god, item) * (item->magic ? abs (item->magic) : 1);
1043 root 1.3 }
1044 elmex 1.1 }
1045    
1046 root 1.6 /* well, well. Looks like we screwed up. Time for god's revenge */
1047     if (reaction < 0)
1048     {
1049     int loss = 10000000;
1050     int angry = abs (reaction);
1051 elmex 1.1
1052 root 1.6 for (skop = op->inv; skop != NULL; skop = skop->below)
1053     if (skop->type == SKILL && skop->subtype == SK_PRAYING)
1054     break;
1055    
1056     if (skop)
1057     loss = (int) (0.05 * (float) skop->stats.exp);
1058     change_exp (op, -random_roll (0, loss * angry - 1, op, PREFER_LOW), skop ? &skop->skill : "none", SK_SUBTRACT_SKILL_EXP);
1059     if (random_roll (0, angry, op, PREFER_LOW))
1060     {
1061     object *tmp = get_archetype (LOOSE_MANA);
1062 elmex 1.1
1063 root 1.6 cast_magic_storm (op, tmp, op->level + (angry * 3));
1064 root 1.3 }
1065 root 1.6 new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "%s becomes angry and punishes you!", &god->name);
1066 elmex 1.1 }
1067 root 1.6 return reaction;
1068 elmex 1.1 }
1069    
1070     /**
1071     * God checks item the player is using.
1072     * Return either -1 (bad), 0 (neutral) or
1073     * 1 (item is ok). If you are using the item of an enemy
1074     * god, it can be bad...-b.t.
1075     */
1076    
1077 root 1.6 int
1078     god_examines_item (object *god, object *item)
1079     {
1080 elmex 1.1 char buf[MAX_BUF];
1081    
1082 root 1.6 if (!god || !item)
1083     return 0;
1084 elmex 1.1
1085 root 1.6 if (!item->title)
1086     return 1; /* unclaimed item are ok */
1087 elmex 1.1
1088 root 1.6 sprintf (buf, "of %s", &god->name);
1089     if (!strcmp (item->title, buf))
1090     return 1; /* belongs to that God */
1091    
1092     if (god->title)
1093     { /* check if we have any enemy blessed item */
1094     sprintf (buf, "of %s", &god->title);
1095     if (!strcmp (item->title, buf))
1096     {
1097     if (item->env)
1098     {
1099     char buf[MAX_BUF];
1100 elmex 1.1
1101 root 1.6 sprintf (buf, "Heretic! You are using %s!", query_name (item));
1102     new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, item->env, buf);
1103     }
1104     return -1;
1105     }
1106 elmex 1.1 }
1107    
1108 root 1.6 return 0; /* item is sacred to a non-enemy god/or is otherwise magical */
1109 elmex 1.1 }
1110    
1111     /**
1112     * Returns priest's god's id.
1113     * Straight calls lookup_god_by_name
1114     */
1115    
1116 root 1.6 int
1117     get_god (object *priest)
1118     {
1119     int godnr = lookup_god_by_name (determine_god (priest));
1120 elmex 1.1
1121     return godnr;
1122     }
1123    
1124     /**
1125     * Returns a string that is the name of the god that should be natively worshipped by a
1126     * creature of who has race *race
1127     * if we can't find a god that is appropriate, we return NULL
1128     */
1129 root 1.6 const char *
1130     get_god_for_race (const char *race)
1131     {
1132     godlink *gl = first_god;
1133     const char *godname = NULL;
1134    
1135     if (race == NULL)
1136     return NULL;
1137     while (gl)
1138     {
1139     if (!strcasecmp (gl->arch->clone.race, race))
1140     {
1141     godname = gl->name;
1142     break;
1143 root 1.3 }
1144 root 1.6 gl = gl->next;
1145 elmex 1.1 }
1146 root 1.6 return godname;
1147 elmex 1.1 }
1148 root 1.6
1149 elmex 1.1 /**
1150     * Changes the attributes of cone, smite, and ball spells as needed by the code.
1151     * Returns false if there was no race to assign to the slaying field of the spell, but
1152     * the spell attacktype contains AT_HOLYWORD. -b.t.
1153     */
1154 root 1.6 int
1155     tailor_god_spell (object *spellop, object *caster)
1156     {
1157     object *god = find_god (determine_god (caster));
1158     int caster_is_spell = 0;
1159    
1160     if (caster->type == SPELL_EFFECT || caster->type == SPELL)
1161     caster_is_spell = 1;
1162    
1163     /* if caster is a rune or the like, it doesn't worship anything. However,
1164     * if this object is owned by someone, then the god that they worship
1165     * is relevant, so use that.
1166     */
1167 root 1.11 if (!god && caster->owner)
1168     god = find_god (determine_god (caster->owner));
1169 root 1.6
1170     if (!god || (spellop->attacktype & AT_HOLYWORD && !god->race))
1171     {
1172     if (!caster_is_spell)
1173     new_draw_info (NDI_UNIQUE, 0, caster, "This prayer is useless unless you worship an appropriate god");
1174     else
1175     LOG (llevError, "BUG: tailor_god_spell(): no god\n");
1176 root 1.10
1177     spellop->destroy ();
1178 root 1.6 return 0;
1179 elmex 1.1 }
1180    
1181 root 1.6 /* either holy word or godpower attacks will set the slaying field */
1182     if (spellop->attacktype & AT_HOLYWORD || spellop->attacktype & AT_GODPOWER)
1183     {
1184     if (spellop->slaying)
1185     spellop->slaying = NULL;
1186 root 1.4
1187 root 1.6 if (!caster_is_spell)
1188     spellop->slaying = god->slaying;
1189     else if (caster->slaying)
1190     spellop->slaying = caster->slaying;
1191 elmex 1.1 }
1192    
1193 root 1.6 /* only the godpower attacktype adds the god's attack onto the spell */
1194     if (spellop->attacktype & AT_GODPOWER)
1195     spellop->attacktype = spellop->attacktype | god->attacktype;
1196 elmex 1.1
1197 root 1.6 /* tack on the god's name to the spell */
1198     if (spellop->attacktype & AT_HOLYWORD || spellop->attacktype & AT_GODPOWER)
1199     {
1200     spellop->title = god->name;
1201     if (spellop->title)
1202     {
1203     char buf[MAX_BUF];
1204    
1205     sprintf (buf, "%s of %s", &spellop->name, &spellop->title);
1206     spellop->name = spellop->name_pl = buf;
1207 root 1.3 }
1208 root 1.6 }
1209 elmex 1.1
1210 root 1.6 return 1;
1211 elmex 1.1 }