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.3 by root, Tue Aug 29 08:01:37 2006 UTC vs.
Revision 1.14 by root, Tue Dec 26 08:54:59 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines