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

# Content
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 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 */
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 #include <sproto.h>
37
38 /**
39 * Returns the id of specified god.
40 */
41 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 }
57 return godnr;
58 }
59
60 /**
61 * Returns pointer to specified god's object through pntr_to_god_obj..
62 */
63 object *
64 find_god (const char *name)
65 {
66 object *god = NULL;
67
68 if (name)
69 {
70 godlink *gl;
71
72 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 }
78 return god;
79 }
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 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 }
115 }
116 }
117
118 /* 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 }
130 op->title = gl->name;
131 }
132
133 return op->title;
134 }
135
136
137 /* 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 }
155 return ("none");
156 }
157
158 /**
159 * Returns 1 if s1 and s2 are the same - either both NULL, or strcmp( ) == 0
160 */
161 static int
162 same_string (const char *s1, const char *s2)
163 {
164 if (s1 == NULL)
165 if (s2 == NULL)
166 return 1;
167 else
168 return 0;
169 else if (s2 == NULL)
170 return 0;
171 else
172 return strcmp (s1, s2) == 0;
173 }
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 static void
182 follower_remove_similar_item (object *op, object *item)
183 {
184 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 tmp->remove (); /* remove obj from players inv. */
205 esrv_del_item (op->contr, tmp->count); /* notify client */
206 tmp->destroy (); /* free object */
207 }
208
209 if (tmp->inv)
210 follower_remove_similar_item (tmp, item);
211 }
212 }
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 static int
220 follower_has_similar_item (object *op, object *item)
221 {
222 object *tmp;
223
224 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 }
233 return 0;
234 }
235
236 /**
237 * God gives an item to the player.
238 */
239 static int
240 god_gives_present (object *op, object *god, treasure *tr)
241 {
242 object *tmp;
243
244 if (!tr->item)
245 return 0;
246
247 if (follower_has_similar_item (op, &tr->item->clone))
248 return 0;
249
250 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
256 return 1;
257 }
258
259 /**
260 * Player prays at altar.
261 * Checks for god changing, divine intervention, and so on.
262 */
263 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
271 /* 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 return;
280
281 }
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
340 /* 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 }
362 }
363
364 /**
365 * Removes special prayers given by a god.
366 */
367 static void
368 check_special_prayers (object *op, object *god)
369 {
370 /* 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
388 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 }
394
395 /* 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 if (!tr->item)
404 continue;
405 item = &tr->item->clone;
406
407 /* Basically, see if the matching spell is granted by this god. */
408
409 if (tr->item->clone.type == SPELL && tr->item->clone.name == tmp->name)
410 {
411 remove = 0;
412 break;
413 }
414 }
415 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 tmp->destroy ();
423 }
424
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 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 // remove all invisible startequip items which are not skill, exp or force
450 if (QUERY_FLAG (item, FLAG_STARTEQUIP) && item->invisible &&
451 (item->type != SKILL) && (item->type != FORCE))
452 {
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
457 player_unready_range_ob (op->contr, item);
458 item->destroy ();
459 }
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
532 CLEAR_FLAG (skop, FLAG_APPLIED);
533 (void) change_abil (op, skop);
534 }
535 }
536
537 /* 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
592 SET_FLAG (skop, FLAG_APPLIED);
593 (void) change_abil (op, skop);
594
595 /* return to previous skill status */
596 if (!sk_applied)
597 CLEAR_FLAG (skop, FLAG_APPLIED);
598
599 check_special_prayers (op, new_god);
600 }
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 int
611 worship_forbids_use (object *op, object *exp_obj, uint32 flag, const char *string)
612 {
613
614 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 }
626 return 0;
627 }
628
629 /**
630 * Unapplies up to number worth of items of type
631 */
632 void
633 stop_using_item (object *op, int type, int number)
634 {
635 object *tmp;
636
637 for (tmp = op->inv; tmp && number; tmp = tmp->below)
638 if (tmp->type == type && QUERY_FLAG (tmp, FLAG_APPLIED))
639 {
640 apply_special (op, tmp, AP_UNAPPLY | AP_IGNORE_CURSE);
641 number--;
642 }
643 }
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 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 /* if (!(QUERY_FLAG(&(exp_ob->arch->clone),flag)))*/
668 CLEAR_FLAG (exp_ob, flag);
669 };
670 }
671
672
673
674 archetype *
675 determine_holy_arch (object *god, const char *type)
676 {
677 treasure *tr;
678
679 if (!god || !god->randomitems)
680 {
681 LOG (llevError, "BUG: determine_holy_arch(): no god or god without " "randomitems\n");
682 return NULL;
683 }
684
685 for (tr = god->randomitems->items; tr != NULL; tr = tr->next)
686 {
687 object *item;
688
689 if (!tr->item)
690 continue;
691
692 item = &tr->item->clone;
693
694 if (item->type == BOOK && item->invisible && strcmp (item->name, type) == 0)
695 return item->other_arch;
696 }
697 return NULL;
698 }
699
700 /**
701 * God helps player by removing curse and/or damnation.
702 */
703 static int
704 god_removes_curse (object *op, int remove_damnation)
705 {
706 object *tmp;
707 int success = 0;
708
709 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 }
724 }
725
726 if (success)
727 new_draw_info (NDI_UNIQUE, 0, op, "You feel like someone is helping you.");
728 return success;
729 }
730
731 static int
732 follower_level_to_enchantments (int level, int difficulty)
733 {
734 if (difficulty < 1)
735 {
736 LOG (llevError, "follower_level_to_enchantments(): " "difficulty %d is invalid\n", difficulty);
737 return 0;
738 }
739
740 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 }
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 static int
754 god_enchants_weapon (object *op, object *god, object *tr, object *skill)
755 {
756 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 }
784
785 /* 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 }
793
794 /* 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 }
804
805 return 0;
806 }
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 void
817 god_intervention (object *op, object *god, object *skill)
818 {
819 treasure *tr;
820
821 if (!god || !god->randomitems)
822 {
823 LOG (llevError, "BUG: god_intervention(): no god or god without randomitems\n");
824 return;
825 }
826
827 check_special_prayers (op, god);
828
829 /* lets do some checks of whether we are kosher with our god */
830 if (god_examines_priest (op, god) < 0)
831 return;
832
833 new_draw_info (NDI_UNIQUE, 0, op, "You feel a holy presence!");
834
835 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
842 /* 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 continue;
849
850 new_draw_info (NDI_UNIQUE, 0, op, "Something appears before your " "eyes. You catch it before it falls to the ground.");
851
852 create_treasure (tl, op, GT_STARTEQUIP | GT_ONLY_GOOD | GT_UPDATE_INV, skill->level, 0);
853 return;
854 }
855
856 if (!tr->item)
857 continue;
858
859 item = &tr->item->clone;
860
861 /* 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 tmp->destroy ();
874 return;
875 }
876 continue;
877 }
878
879 /* 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 }
888
889 /* 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 }
898
899 /* Restore spellpoints */
900 if (item->type == BOOK && item->invisible && strcmp (item->name, "restore spellpoints") == 0)
901 {
902 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 }
912
913 /* Various heal spells */
914 if (item->type == BOOK && item->invisible && strcmp (item->name, "heal spell") == 0)
915 {
916 object *tmp;
917 int success;
918
919 tmp = get_archetype_by_object_name (item->slaying);
920
921 success = cast_heal (op, op, tmp, 0);
922 tmp->destroy ();
923 if (success)
924 return;
925 else
926 continue;
927 }
928
929 /* Remove curse */
930 if (item->type == BOOK && item->invisible && strcmp (item->name, "remove curse") == 0)
931 {
932 if (god_removes_curse (op, 0))
933 return;
934 else
935 continue;
936 }
937
938 /* Remove damnation */
939 if (item->type == BOOK && item->invisible && strcmp (item->name, "remove damnation") == 0)
940 {
941 if (god_removes_curse (op, 1))
942 return;
943 else
944 continue;
945 }
946
947 /* Heal depletion */
948 if (item->type == BOOK && item->invisible && strcmp (item->name, "heal depletion") == 0)
949 {
950 object *depl;
951 archetype *at;
952 int i;
953
954 if ((at = archetype::find (ARCH_DEPLETION)) == NULL)
955 {
956 LOG (llevError, "Could not find archetype depletion.\n");
957 continue;
958 }
959 depl = present_arch_in_ob (at, op);
960
961 if (depl == NULL)
962 continue;
963
964 new_draw_info (NDI_UNIQUE, 0, op, "Shimmering light surrounds and restores you!");
965
966 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
970 depl->destroy ();
971 op->update_stats ();
972 return;
973 }
974
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 }
982
983 /* Messages */
984 if (item->type == BOOK && item->invisible && strcmp (item->name, "message") == 0)
985 {
986 new_draw_info (NDI_UNIQUE, 0, op, item->msg);
987 return;
988 }
989
990 /* Enchant weapon */
991 if (item->type == BOOK && item->invisible && strcmp (item->name, "enchant weapon") == 0)
992 {
993 if (god_enchants_weapon (op, god, item, skill))
994 return;
995 else
996 continue;
997 }
998
999 /* Spellbooks - works correctly only for prayers */
1000 if (item->type == SPELL)
1001 {
1002 if (check_spell_known (op, item->name))
1003 continue;
1004 if (item->level > skill->level)
1005 continue;
1006
1007 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
1011 }
1012
1013 /* Other gifts */
1014 if (!item->invisible)
1015 {
1016 if (god_gives_present (op, god, tr))
1017 return;
1018 else
1019 continue;
1020 }
1021 /* else ignore it */
1022 }
1023
1024 new_draw_info (NDI_UNIQUE, 0, op, "You feel rapture.");
1025 }
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 int
1033 god_examines_priest (object *op, object *god)
1034 {
1035 int reaction = 1;
1036 object *item = NULL, *skop;
1037
1038 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 }
1044 }
1045
1046 /* 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
1052 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
1063 cast_magic_storm (op, tmp, op->level + (angry * 3));
1064 }
1065 new_draw_info_format (NDI_UNIQUE | NDI_NAVY, 0, op, "%s becomes angry and punishes you!", &god->name);
1066 }
1067 return reaction;
1068 }
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 int
1078 god_examines_item (object *god, object *item)
1079 {
1080 char buf[MAX_BUF];
1081
1082 if (!god || !item)
1083 return 0;
1084
1085 if (!item->title)
1086 return 1; /* unclaimed item are ok */
1087
1088 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
1101 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 }
1107
1108 return 0; /* item is sacred to a non-enemy god/or is otherwise magical */
1109 }
1110
1111 /**
1112 * Returns priest's god's id.
1113 * Straight calls lookup_god_by_name
1114 */
1115
1116 int
1117 get_god (object *priest)
1118 {
1119 int godnr = lookup_god_by_name (determine_god (priest));
1120
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 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 }
1144 gl = gl->next;
1145 }
1146 return godname;
1147 }
1148
1149 /**
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 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 if (!god && caster->owner)
1168 god = find_god (determine_god (caster->owner));
1169
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
1177 spellop->destroy ();
1178 return 0;
1179 }
1180
1181 /* 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
1187 if (!caster_is_spell)
1188 spellop->slaying = god->slaying;
1189 else if (caster->slaying)
1190 spellop->slaying = caster->slaying;
1191 }
1192
1193 /* 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
1197 /* 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 }
1208 }
1209
1210 return 1;
1211 }