From d422ae61dd61bdaad0189331cad2c04e493c656d Mon Sep 17 00:00:00 2001 From: Dustin Date: Sat, 10 May 2025 23:47:51 -0700 Subject: [PATCH] Multiple Movement Modifier --- lib/classes/movement_parameters.gd | 6 +++--- lib/classes/movement_state_receiver.gd | 4 ++-- lib/classes/state_machine.gd | 9 +++++++-- lib/classes/state_modifier.gd | 5 +++++ lib/classes/state_modifier_movement.gd | 10 ++++++++++ 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/classes/movement_parameters.gd b/lib/classes/movement_parameters.gd index 171749a..96a8685 100644 --- a/lib/classes/movement_parameters.gd +++ b/lib/classes/movement_parameters.gd @@ -27,12 +27,12 @@ export var debug_name :String func modify(_movement_parameters :MovementParameters): pass -func apply_multiple_modifiers( _modifiers: Array): +func apply_multiple_modifiers( _modifiers: Array, _movement_direction :Vector2): for m in _modifiers: if m is StateModifierMovement: - apply_state_modifier(m) + apply_state_modifier(m, _movement_direction) -func apply_state_modifier(_modifier :StateModifierMovement): +func apply_state_modifier(_modifier :StateModifierMovement, _movement_direction :Vector2): #_modifier.direction == _modifier.APPLIED_DIRECTIONS.LEFT_OR_UP match _modifier.modifier_type: StateModifierMovement.SUB_TYPE.NEGATIVE_CONSTRAINT: diff --git a/lib/classes/movement_state_receiver.gd b/lib/classes/movement_state_receiver.gd index 096a0c3..7295aca 100644 --- a/lib/classes/movement_state_receiver.gd +++ b/lib/classes/movement_state_receiver.gd @@ -153,9 +153,9 @@ func apply_state_modifier(movement_parameters :MovementParameters) -> MovementPa # movement_parameters.apply_state_modifier(modifier) var active_mods :bool= true - var mods :Array = get_state_machine_modifiers.call_func('StateModifierMovement', active_mods) + var mods :Array = get_state_machine_modifiers.call_func('StateModifierMovement', active_mods, current_state.is_grounded) if (mods.size() > 0): - movement_parameters.apply_multiple_modifiers(mods) + movement_parameters.apply_multiple_modifiers(mods, Vector2(0,0)) return movement_parameters diff --git a/lib/classes/state_machine.gd b/lib/classes/state_machine.gd index f8ff14a..d88a06b 100644 --- a/lib/classes/state_machine.gd +++ b/lib/classes/state_machine.gd @@ -77,12 +77,17 @@ func merge_modifiers(): this_mod_type.merge(m) ## When trying to get multiple modifiers -func get_modifiers_of_type(_modifier_type :String, _only_active: bool = false) -> Array: +func get_modifiers_of_type(_modifier_type :String, + _only_active: bool = false, + _first_condition :bool = true, + _second_condition :bool = true) -> Array: var mod_array :Array = [] for m in state_modifiers: if m.to_string() == _modifier_type: if (_only_active and m.is_active) or _only_active == false: - mod_array.append(m) + ## invoke additional status checks if they're implemented for this modifier + if m.status_check_1(_first_condition) and m.status_check_2(_first_condition): + mod_array.append(m) return mod_array # Change to the new state by first calling any exit logic on the current state. diff --git a/lib/classes/state_modifier.gd b/lib/classes/state_modifier.gd index 6e15950..c337950 100644 --- a/lib/classes/state_modifier.gd +++ b/lib/classes/state_modifier.gd @@ -114,6 +114,11 @@ func copy(_copy_state: StateModifier): name = _copy_state.name modifier_type = _copy_state.modifier_type +func status_check_1(condition :bool) -> bool: + return true + +func status_check_2(condition :bool) -> bool: + return true func merge(_merge_from_modifier: StateModifier): pass diff --git a/lib/classes/state_modifier_movement.gd b/lib/classes/state_modifier_movement.gd index 3fc2e72..0aba87d 100644 --- a/lib/classes/state_modifier_movement.gd +++ b/lib/classes/state_modifier_movement.gd @@ -59,6 +59,16 @@ func copy(_copy_state: StateModifier): _copy_state.horizontal_speed = horizontal_speed _copy_state.horizontal_acceleration = horizontal_acceleration +## Overrident to check whether this state is a grounded and this modifier +## should only apply while in the air. +func status_check_1(condition :bool) -> bool: + var is_grounded :bool = condition + if only_grounded == true and is_grounded == false: + return false + else: + return true + + func merge(_merge_from_modifier: StateModifier): .merge(_merge_from_modifier) is_active = _merge_from_modifier.is_active