summaryrefslogtreecommitdiff
path: root/src/map/magic-interpreter-base.c
diff options
context:
space:
mode:
authorJared Adams <jaxad0127@gmail.com>2008-10-26 20:40:30 +0000
committerJared Adams <jaxad0127@gmail.com>2008-10-26 20:40:30 +0000
commit90735f447e12393f3d89b8c053bd4d8c8a707fa2 (patch)
treedc6757d0b88d3f7ba9f7f545aba437983bc0255b /src/map/magic-interpreter-base.c
parent7f21ec064e78bf8d06ae341d1d61e12516970719 (diff)
downloadtmwa-90735f447e12393f3d89b8c053bd4d8c8a707fa2.tar.gz
tmwa-90735f447e12393f3d89b8c053bd4d8c8a707fa2.tar.bz2
tmwa-90735f447e12393f3d89b8c053bd4d8c8a707fa2.tar.xz
tmwa-90735f447e12393f3d89b8c053bd4d8c8a707fa2.zip
Commit Mantis 509
Diffstat (limited to 'src/map/magic-interpreter-base.c')
-rw-r--r--src/map/magic-interpreter-base.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/map/magic-interpreter-base.c b/src/map/magic-interpreter-base.c
index 9be6f81..9338c78 100644
--- a/src/map/magic-interpreter-base.c
+++ b/src/map/magic-interpreter-base.c
@@ -288,14 +288,19 @@ consume_components(character_t *caster, component_t *component)
static int
-spellguard_can_satisfy(spellguard_check_t *check, character_t *caster, env_t *env)
+spellguard_can_satisfy(spellguard_check_t *check, character_t *caster, env_t *env, int *near_miss)
{
int tick = gettick();
- int retval = (caster->cast_tick <= tick /* Hasn't cast a spell too recently */
- && check->mana <= caster->status.sp
- && check_prerequisites(caster, check->catalysts)
- && check_prerequisites(caster, check->components));
+ int retval = check_prerequisites(caster, check->catalysts);
+
+ if (retval && near_miss)
+ *near_miss = 1; // close enough!
+
+ retval = retval
+ && caster->cast_tick <= tick /* Hasn't cast a spell too recently */
+ && check->mana <= caster->status.sp
+ && check_prerequisites(caster, check->components);
if (retval) {
int casttime = check->casttime;
@@ -313,7 +318,7 @@ spellguard_can_satisfy(spellguard_check_t *check, character_t *caster, env_t *en
}
static effect_set_t *
-spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t *caster, env_t *env)
+spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t *caster, env_t *env, int *near_miss)
{
if (guard == NULL)
return NULL;
@@ -342,13 +347,13 @@ spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t
copy_components(&altcheck.catalysts, check->catalysts);
copy_components(&altcheck.components, check->components);
- retval = spellguard_check_sub(&altcheck, guard->next, caster, env);
+ retval = spellguard_check_sub(&altcheck, guard->next, caster, env, near_miss);
free_components(&altcheck.catalysts);
free_components(&altcheck.components);
if (retval)
return retval;
else
- return spellguard_check_sub(check, guard->s.s_alt, caster, env);
+ return spellguard_check_sub(check, guard->s.s_alt, caster, env, near_miss);
}
case SPELLGUARD_MANA:
@@ -360,7 +365,7 @@ spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t
break;
case SPELLGUARD_EFFECT:
- if (spellguard_can_satisfy(check, caster, env))
+ if (spellguard_can_satisfy(check, caster, env, near_miss))
return &guard->s.s_effect;
else
return NULL;
@@ -370,11 +375,11 @@ spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t
return NULL;
}
- return spellguard_check_sub(check, guard->next, caster, env);
+ return spellguard_check_sub(check, guard->next, caster, env, near_miss);
}
static effect_set_t *
-check_spellguard(spellguard_t *guard, character_t *caster, env_t *env)
+check_spellguard(spellguard_t *guard, character_t *caster, env_t *env, int *near_miss)
{
spellguard_check_t check;
effect_set_t *retval;
@@ -382,7 +387,7 @@ check_spellguard(spellguard_t *guard, character_t *caster, env_t *env)
check.components = NULL;
check.mana = check.casttime = 0;
- retval = spellguard_check_sub(&check, guard, caster, env);
+ retval = spellguard_check_sub(&check, guard, caster, env, near_miss);
free_components(&check.catalysts);
free_components(&check.components);
@@ -396,17 +401,20 @@ check_spellguard(spellguard_t *guard, character_t *caster, env_t *env)
effect_set_t *
-spell_trigger(spell_t *spell, character_t *caster, env_t *env)
+spell_trigger(spell_t *spell, character_t *caster, env_t *env, int *near_miss)
{
int i;
spellguard_t *guard = spell->spellguard;
+ if (near_miss)
+ *near_miss = 0;
+
for (i = 0; i < spell->letdefs_nr; i++)
magic_eval(env,
&env->vars[spell->letdefs[i].id],
spell->letdefs[i].expr);
- return check_spellguard(guard, caster, env);
+ return check_spellguard(guard, caster, env, near_miss);
}
static void