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.63 by root, Thu Nov 8 19:43:29 2007 UTC vs.
Revision 1.67 by root, Sun Apr 20 00:44:13 2008 UTC

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