… | |
… | |
183 | int |
183 | int |
184 | caster_level (object *caster, object *spell) |
184 | caster_level (object *caster, object *spell) |
185 | { |
185 | { |
186 | int level = caster->level; |
186 | int level = caster->level; |
187 | |
187 | |
188 | /* If this is a player, try to find the matching skill */ |
188 | /* if a rod is fired by a player, take the use_magic_item skill in consideration. */ |
189 | if (caster->type == PLAYER && spell->skill) |
189 | if (caster->type == ROD && caster->env && caster->env->type == PLAYER) |
|
|
190 | { |
|
|
191 | object *skill = find_skill_by_number (caster->env, SK_USE_MAGIC_ITEM); |
|
|
192 | int sk_level = skill ? skill->level : 1; |
|
|
193 | |
|
|
194 | level = MIN (level, sk_level + level / 10 + 1); |
|
|
195 | } |
|
|
196 | else if (caster->type == PLAYER && spell->skill) /* If this is a player, try to find the matching skill */ |
190 | for (int i = 0; i < NUM_SKILLS; i++) |
197 | for (int i = 0; i < NUM_SKILLS; i++) |
191 | if (caster->contr->last_skill_ob[i] && caster->contr->last_skill_ob[i]->skill == spell->skill) |
198 | if (caster->contr->last_skill_ob[i] && caster->contr->last_skill_ob[i]->skill == spell->skill) |
192 | { |
199 | { |
193 | level = caster->contr->last_skill_ob[i]->level; |
200 | level = caster->contr->last_skill_ob[i]->level; |
194 | break; |
201 | break; |
195 | } |
202 | } |
196 | |
|
|
197 | /* if a rod is fired by a player, take the use_magic_item skill in consideration. */ |
|
|
198 | if (caster->type == ROD && caster->env && caster->env->type == PLAYER) |
|
|
199 | { |
|
|
200 | object *skill = find_skill_by_number (caster->env, SK_USE_MAGIC_ITEM); |
|
|
201 | int sk_level = skill ? skill->level : 1; |
|
|
202 | |
|
|
203 | level = MIN (level, sk_level + level / 10 + 1); |
|
|
204 | } |
|
|
205 | |
203 | |
206 | /* Got valid caster level. Now adjust for attunement */ |
204 | /* Got valid caster level. Now adjust for attunement */ |
207 | level += caster->path_repelled & spell->path_attuned ? -8 : 0; |
205 | level += caster->path_repelled & spell->path_attuned ? -8 : 0; |
208 | level += caster->path_attuned & spell->path_attuned ? +8 : 0; |
206 | level += caster->path_attuned & spell->path_attuned ? +8 : 0; |
209 | |
207 | |
… | |
… | |
257 | else |
255 | else |
258 | { |
256 | { |
259 | sp = (int) (spell->stats.sp * PATH_SP_MULT (caster, spell)); |
257 | sp = (int) (spell->stats.sp * PATH_SP_MULT (caster, spell)); |
260 | if (spell->stats.sp && !sp) |
258 | if (spell->stats.sp && !sp) |
261 | sp = 1; |
259 | sp = 1; |
|
|
260 | |
262 | grace = (int) (spell->stats.grace * PATH_SP_MULT (caster, spell)); |
261 | grace = (int) (spell->stats.grace * PATH_SP_MULT (caster, spell)); |
263 | if (spell->stats.grace && !grace) |
262 | if (spell->stats.grace && !grace) |
264 | grace = 1; |
263 | grace = 1; |
265 | } |
264 | } |
266 | |
265 | |