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.2 by root, Fri Aug 25 17:11:53 2006 UTC vs.
Revision 1.17 by pippijn, Sat Jan 6 14:42:30 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines