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.1 by elmex, Sun Aug 13 17:16:04 2006 UTC vs.
Revision 1.12 by elmex, Wed Dec 20 10:31:00 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines