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

Comparing deliantra/server/server/spell_util.C (file contents):
Revision 1.62 by root, Sun Oct 21 01:35:14 2007 UTC vs.
Revision 1.67 by root, Sun Apr 20 00:44:13 2008 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software: you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 * 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
10 * the Free Software Foundation, either version 3 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * 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
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24#include <global.h> 24#include <global.h>
25#include <spells.h> 25#include <spells.h>
26#include <object.h> 26#include <object.h>
77 dest->skill = spob->skill; 77 dest->skill = spob->skill;
78 else 78 else
79 dest->skill = caster->skill; 79 dest->skill = caster->skill;
80} 80}
81 81
82/* init_spells: This should really be called check_spells, as that
83 * is what it does. It goes through the spells looking for any
84 * obvious errors. This was most useful in debugging when re-doing
85 * all the spells to catch simple errors. To use it all the time
86 * will result in it spitting out messages that aren't really errors.
87 */
88void
89init_spells (void)
90{
91#ifdef SPELL_DEBUG
92 static int init_spells_done = 0;
93 int i;
94 archetype *at;
95
96 if (init_spells_done)
97 return;
98 LOG (llevDebug, "Checking spells...\n");
99
100 for_all_archetypes (at)
101 {
102 if (at->type == SPELL)
103 {
104 if (at->skill)
105 {
106 for (i = 1; i < NUM_SKILLS; i++)
107 if (!strcmp (skill_names[i], at->skill))
108 break;
109 if (i == NUM_SKILLS)
110 {
111 LOG (llevError, "Spell %s has improper associated skill %s\n", at->name, at->skill);
112 }
113 }
114 /* other_arch is already checked for in the loader */
115 }
116 }
117
118 i = 0;
119 while (spell_mapping[i])
120 {
121 if (!archetype::find (spell_mapping[i]))
122 {
123 LOG (llevError, "Unable to find spell mapping %s (%i)\n", spell_mapping[i], i);
124 }
125 i++;
126 }
127 LOG (llevDebug, "Checking spells completed.\n");
128#endif
129}
130
131/* Dumps all the spells - now also dumps skill associated with the spell.
132 * not sure what this would be used for, as the data seems pretty
133 * minimal, but easy enough to keep around.
134 */
135void
136dump_spells ()
137{
138 for_all_archetypes (at)
139 if (at->type == SPELL)
140 fprintf (stderr, "%s:%s:%s:%s:%d\n", &at->object::name,
141 &at->archname, at->other_arch ? &at->other_arch->archname : "<nil>", &at->skill, at->level);
142}
143
144/* pretty basic function - basically just takes 82/* pretty basic function - basically just takes
145 * an object, sets the x,y, and calls insert_ob_in_map 83 * an object, sets the x,y, and calls insert_ob_in_map
146 */ 84 */
147void 85void
148spell_effect (object *spob, int x, int y, maptile *map, object *originator) 86spell_effect (object *spob, int x, int y, maptile *map, object *originator)
162 * Returns modified level. 100 * Returns modified level.
163 */ 101 */
164int 102int
165min_casting_level (object *caster, object *spell) 103min_casting_level (object *caster, object *spell)
166{ 104{
167 int new_level;
168
169 if (caster->path_denied & spell->path_attuned) 105 if (caster->path_denied & spell->path_attuned)
170 return 1; 106 return 1;
171 107
172 new_level = spell->level 108 int new_level = spell->level
173 + (caster->path_repelled & spell->path_attuned ? +2 : 0) 109 + (caster->path_repelled & spell->path_attuned ? +8 : 0)
174 + (caster->path_attuned & spell->path_attuned ? -2 : 0); 110 + (caster->path_attuned & spell->path_attuned ? -8 : 0);
175 111
176 return max (1, new_level); 112 return max (1, new_level);
177} 113}
178 114
179/* This function returns the effective level the spell 115/* This function returns the effective level the spell
185int 121int
186caster_level (object *caster, object *spell) 122caster_level (object *caster, object *spell)
187{ 123{
188 int level = caster->level; 124 int level = caster->level;
189 125
190 /* If this is a player, try to find the matching skill */ 126 /* if a rod is fired by a player, take the use_magic_item skill in consideration. */
191 if (caster->type == PLAYER && spell->skill) 127 if (caster->type == ROD && caster->env && caster->env->type == PLAYER)
128 {
129 object *skill = find_skill_by_number (caster->env, SK_USE_MAGIC_ITEM);
130 int sk_level = skill ? skill->level : 1;
131
132 level = min (level, sk_level + level / 10 + 1);
133 }
134 else if (caster->type == PLAYER && spell->skill) /* If this is a player, try to find the matching skill */
192 for (int i = 0; i < NUM_SKILLS; i++) 135 for (int i = 0; i < NUM_SKILLS; i++)
193 if (caster->contr->last_skill_ob[i] && caster->contr->last_skill_ob[i]->skill == spell->skill) 136 if (caster->contr->last_skill_ob[i] && caster->contr->last_skill_ob[i]->skill == spell->skill)
194 { 137 {
195 level = caster->contr->last_skill_ob[i]->level; 138 level = caster->contr->last_skill_ob[i]->level;
196 break; 139 break;
197 } 140 }
198 141
199 /* if a rod is fired by a player, take the use_magic_item skill in consideration. */
200 if (caster->type == ROD && caster->env && caster->env->type == PLAYER)
201 {
202 object *skill = find_skill_by_number (caster->env, SK_USE_MAGIC_ITEM);
203 int sk_level = skill ? skill->level : 1;
204
205 level = MIN (level, sk_level + level / 10 + 1);
206 }
207
208 /* Got valid caster level. Now adjust for attunement */ 142 /* Got valid caster level. Now adjust for attunement */
209 level += caster->path_repelled & spell->path_attuned ? -2 : 0; 143 level += caster->path_repelled & spell->path_attuned ? -8 : 0;
210 level += caster->path_attuned & spell->path_attuned ? +2 : 0; 144 level += caster->path_attuned & spell->path_attuned ? +8 : 0;
211 145
212 /* Always make this at least 1. If this is zero, we get divide by zero 146 /* Always make this at least 1. If this is zero, we get divide by zero
213 * errors in various places. 147 * errors in various places.
214 */ 148 */
215 return max (level, 1); 149 return max (level, 1);
259 else 193 else
260 { 194 {
261 sp = (int) (spell->stats.sp * PATH_SP_MULT (caster, spell)); 195 sp = (int) (spell->stats.sp * PATH_SP_MULT (caster, spell));
262 if (spell->stats.sp && !sp) 196 if (spell->stats.sp && !sp)
263 sp = 1; 197 sp = 1;
198
264 grace = (int) (spell->stats.grace * PATH_SP_MULT (caster, spell)); 199 grace = (int) (spell->stats.grace * PATH_SP_MULT (caster, spell));
265 if (spell->stats.grace && !grace) 200 if (spell->stats.grace && !grace)
266 grace = 1; 201 grace = 1;
267 } 202 }
268 203

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines