summaryrefslogtreecommitdiff
path: root/src/map/magic-interpreter-base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/magic-interpreter-base.cpp')
-rw-r--r--src/map/magic-interpreter-base.cpp91
1 files changed, 51 insertions, 40 deletions
diff --git a/src/map/magic-interpreter-base.cpp b/src/map/magic-interpreter-base.cpp
index f9832b5..775e7e4 100644
--- a/src/map/magic-interpreter-base.cpp
+++ b/src/map/magic-interpreter-base.cpp
@@ -29,14 +29,14 @@ static
void set_string SETTER(char *, TYPE::STRING, v_string)
static
-void set_entity(val_t *v, entity_t *e)
+void set_entity(val_t *v, dumb_ptr<block_list> e)
{
v->ty = TYPE::ENTITY;
v->v.v_int = e->bl_id;
}
static
-void set_invocation(val_t *v, invocation_t *i)
+void set_invocation(val_t *v, dumb_ptr<invocation> i)
{
v->ty = TYPE::INVOCATION;
v->v.v_int = i->bl_id;
@@ -192,7 +192,7 @@ void magic_free_env(env_t *env)
}
env_t *spell_create_env(magic_conf_t *conf, spell_t *spell,
- character_t *caster, int spellpower, char *param)
+ dumb_ptr<map_session_data> caster, int spellpower, char *param)
{
env_t *env = alloc_env(conf);
@@ -205,7 +205,7 @@ env_t *spell_create_env(magic_conf_t *conf, spell_t *spell,
case SPELLARG::PC:
{
- character_t *subject = map_nick2sd(param);
+ dumb_ptr<map_session_data> subject = map_nick2sd(param);
if (!subject)
subject = caster;
set_env_entity(spell->arg, subject);
@@ -287,7 +287,7 @@ typedef struct spellguard_check
} spellguard_check_t;
static
-int check_prerequisites(character_t *caster, component_t *component)
+int check_prerequisites(dumb_ptr<map_session_data> caster, component_t *component)
{
while (component)
{
@@ -302,7 +302,7 @@ int check_prerequisites(character_t *caster, component_t *component)
}
static
-void consume_components(character_t *caster, component_t *component)
+void consume_components(dumb_ptr<map_session_data> caster, component_t *component)
{
while (component)
{
@@ -312,7 +312,7 @@ void consume_components(character_t *caster, component_t *component)
}
static
-int spellguard_can_satisfy(spellguard_check_t *check, character_t *caster,
+int spellguard_can_satisfy(spellguard_check_t *check, dumb_ptr<map_session_data> caster,
env_t *env, int *near_miss)
{
tick_t tick = gettick();
@@ -345,7 +345,7 @@ int spellguard_can_satisfy(spellguard_check_t *check, character_t *caster,
static
effect_set_t *spellguard_check_sub(spellguard_check_t *check,
spellguard_t *guard,
- character_t *caster, env_t *env,
+ dumb_ptr<map_session_data> caster, env_t *env,
int *near_miss)
{
if (guard == NULL)
@@ -414,7 +414,7 @@ effect_set_t *spellguard_check_sub(spellguard_check_t *check,
static
effect_set_t *check_spellguard(spellguard_t *guard,
- character_t *caster, env_t *env,
+ dumb_ptr<map_session_data> caster, env_t *env,
int *near_miss)
{
spellguard_check_t check;
@@ -436,7 +436,7 @@ effect_set_t *check_spellguard(spellguard_t *guard,
/* Public API */
/* -------------------------------------------------------------------------------- */
-effect_set_t *spell_trigger(spell_t *spell, character_t *caster,
+effect_set_t *spell_trigger(spell_t *spell, dumb_ptr<map_session_data> caster,
env_t *env, int *near_miss)
{
int i;
@@ -453,7 +453,7 @@ effect_set_t *spell_trigger(spell_t *spell, character_t *caster,
}
static
-void spell_set_location(invocation_t *invocation, entity_t *entity)
+void spell_set_location(dumb_ptr<invocation> invocation, dumb_ptr<block_list> entity)
{
magic_clear_var(&invocation->env->vars[VAR_LOCATION]);
invocation->env->vars[VAR_LOCATION].ty = TYPE::LOCATION;
@@ -462,25 +462,26 @@ void spell_set_location(invocation_t *invocation, entity_t *entity)
invocation->env->vars[VAR_LOCATION].v.v_location.y = entity->bl_y;
}
-void spell_update_location(invocation_t *invocation)
+void spell_update_location(dumb_ptr<invocation> invocation)
{
if (bool(invocation->spell->flags & SPELL_FLAG::LOCAL))
return;
else
{
- character_t *owner = (character_t *) map_id2bl(invocation->subject);
- if (!owner)
+ dumb_ptr<block_list> owner_bl = map_id2bl(invocation->subject);
+ if (!owner_bl)
return;
+ dumb_ptr<map_session_data> owner = owner_bl->as_player();
- spell_set_location(invocation, (entity_t *) owner);
+ spell_set_location(invocation, owner);
}
}
-invocation_t *spell_instantiate(effect_set_t *effect_set, env_t *env)
+dumb_ptr<invocation> spell_instantiate(effect_set_t *effect_set, env_t *env)
{
- invocation_t *retval;
- CREATE(retval, invocation_t, 1);
- entity_t *caster;
+ dumb_ptr<invocation> retval;
+ retval.new_();
+ dumb_ptr<block_list> caster;
retval->env = env;
@@ -504,29 +505,39 @@ invocation_t *spell_instantiate(effect_set_t *effect_set, env_t *env)
return retval;
}
-invocation_t *spell_clone_effect(invocation_t *base)
+dumb_ptr<invocation> spell_clone_effect(dumb_ptr<invocation> base)
{
- invocation_t *retval = (invocation_t *) calloc(1, sizeof(invocation_t));
- env_t *env;
+ dumb_ptr<invocation> retval;
+ retval.new_();
- memcpy(retval, base, sizeof(invocation_t));
+ // block_list in general is not copyable
+ // since this is the only call site, it is expanded here
+ //*retval = *base;
- retval->env = clone_env(retval->env);
- env = retval->env;
- retval->current_effect = retval->trigger_effect;
retval->next_invocation = NULL;
- retval->end_effect = NULL;
- retval->script_pos = 0;
- retval->stack_size = 0;
- // retval->timer = 0;
+ retval->flags = INVOCATION_FLAG::ZERO;
+ env_t *env = retval->env = clone_env(base->env);
+ retval->spell = base->spell;
+ retval->caster = base->caster;
retval->subject = 0;
+ // retval->timer = 0;
+ retval->stack_size = 0;
+ // retval->stack = undef;
+ retval->script_pos = 0;
+ // huh?
+ retval->current_effect = base->trigger_effect;
+ retval->trigger_effect = base->trigger_effect;
+ retval->end_effect = NULL;
retval->status_change_refs_nr = 0;
retval->status_change_refs = NULL;
- retval->flags = INVOCATION_FLAG::ZERO;
retval->bl_id = 0;
retval->bl_prev = NULL;
retval->bl_next = NULL;
+ retval->bl_m = base->bl_m;
+ retval->bl_x = base->bl_x;
+ retval->bl_y = base->bl_y;
+ retval->bl_type = base->bl_type;
retval->bl_id = map_addobject(retval);
set_env_invocation(VAR_INVOCATION, retval);
@@ -534,7 +545,7 @@ invocation_t *spell_clone_effect(invocation_t *base)
return retval;
}
-void spell_bind(character_t *subject, invocation_t *invocation)
+void spell_bind(dumb_ptr<map_session_data> subject, dumb_ptr<invocation> invocation)
{
/* Only bind nonlocal spells */
@@ -557,22 +568,22 @@ void spell_bind(character_t *subject, invocation_t *invocation)
invocation->subject = subject->bl_id;
}
- spell_set_location(invocation, (entity_t *) subject);
+ spell_set_location(invocation, (dumb_ptr<block_list> ) subject);
}
-int spell_unbind(character_t *subject, invocation_t *invocation)
+int spell_unbind(dumb_ptr<map_session_data> subject, dumb_ptr<invocation> invocation_)
{
- invocation_t **seeker = &subject->active_spells;
+ dumb_ptr<invocation> *seeker = &subject->active_spells;
while (*seeker)
{
- if (*seeker == invocation)
+ if (*seeker == invocation_)
{
- *seeker = invocation->next_invocation;
+ *seeker = invocation_->next_invocation;
- invocation->flags &= ~INVOCATION_FLAG::BOUND;
- invocation->next_invocation = NULL;
- invocation->subject = 0;
+ invocation_->flags &= ~INVOCATION_FLAG::BOUND;
+ invocation_->next_invocation = NULL;
+ invocation_->subject = 0;
return 0;
}