ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/gods.C
(Generate patch)

Comparing deliantra/server/server/gods.C (file contents):
Revision 1.4 by root, Sun Sep 3 00:18:42 2006 UTC vs.
Revision 1.16 by elmex, Wed Jan 3 02:30:52 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines