SnowState icon indicating copy to clipboard operation
SnowState copied to clipboard

inherit() does not support parameters

Open nullbunny opened this issue 9 months ago • 2 comments

Inherit() doesn't support support passing parameters when changing states like this: fsm.change("some_state", some_data)

nullbunny avatar Sep 27 '23 09:09 nullbunny

Please provide a simple example to replicate this issue.

sohomsahaun avatar Sep 27 '23 10:09 sohomsahaun

Sure!

Here's a state I have for handling an enemy's knockback:

.add("knockback", {
	enter: function(_data) {
		change_sprite(array_shuffle(knockback_sprites)[0]);
		
		if(is_flyer) {
			hspeed = knockback_hspd * _data.hspd_mod;
			vspeed = knockback_vspd * _data.vspd_mod;
		} else {
			if(vspd<0) on_ground = false;
		
			hspd = knockback_hspd * _data.hspd_mod;
			hspd_frac = 0;
			vspd = knockback_vspd * _data.vspd_mod;
			vspd_frac = 0;
		}
		
		if(fsm.get_previous_state() != knockback_state) {
			_recover_state = knockback_recover_state;
			
			if(_recover_state == "") {
				_recover_state = fsm.get_previous_state();
			}
		}
	}

Now, for a certain enemy I want to create a child state that is mostly the same except for one detail:

fsm.add_child("knockback", "knockback_once", {
	enter: function(_data) {
		fsm.inherit();
		can_knockback = false;
	}
})

When I run the game and get to that point, I get the following error:

___________________________________________
############################################################################################
ERROR in
action number 1
of  Step Eventobj_player_hurtbox
for object obj_enemy:

Variable <unknown_object>.hspd_mod(101561, -2147483648) cannot be resolved.
 at gml_Script_anon____struct___368_gml_Object_obj_enemy_Create_0_1648____struct___368_gml_Object_obj_enemy_Create_0 (line 84) -                      hspd = knockback_hspd * _data.hspd_mod;
############################################################################################
gml_Script_anon____struct___368_gml_Object_obj_enemy_Create_0_1648____struct___368_gml_Object_obj_enemy_Create_0 (line 84)
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_9532_SnowState_gml_GlobalScript_SnowState (line 339) -               if (_args == undefined) return _func();
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_8968_SnowState_gml_GlobalScript_SnowState (line 330) -               with (__owner) _pyramid(_func, _args);
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_23750_SnowState_gml_GlobalScript_SnowState (line 799) -               __execute(__currEvent);
gml_Script_anon____struct___317_gml_Object_obj_tiger_Create_0_76____struct___317_gml_Object_obj_tiger_Create_0 (line 5) -               fsm.inherit();
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_9532_SnowState_gml_GlobalScript_SnowState (line 340) -               if (!is_array(_args)) return _func(_args);
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_8968_SnowState_gml_GlobalScript_SnowState (line 330) -               with (__owner) _pyramid(_func, _args);
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_26346_SnowState_gml_GlobalScript_SnowState (line 858) -               __execute("enter", undefined, _data);
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_7164_SnowState_gml_GlobalScript_SnowState (line 270) -               enter(_data);
gml_Script_anon_SnowState_gml_GlobalScript_SnowState_19208_SnowState_gml_GlobalScript_SnowState (line 629) -               __change(_state, _leave, _enter, _data);
gml_Script_deal_damage (line 26) -                             if(can_knockback) fsm.change(knockback_state, undefined, undefined, {
gml_Object_obj_enemy_Collision_obj_player_hurtbox (line 4) - deal_damage(id, other.damage, other.knockback_hspd_mod*sign(other.image_xscale), other.knockback_vspd_mod);

I use child states elsewhere in my game so I figured it has to do with parameters not being supported for overridden events.

nullbunny avatar Sep 27 '23 13:09 nullbunny