diff --git a/lib/classes/movement_parameters.gd b/lib/classes/movement_parameters.gd index 239aab3..e4565f4 100644 --- a/lib/classes/movement_parameters.gd +++ b/lib/classes/movement_parameters.gd @@ -56,6 +56,9 @@ func modify(_movement_parameters :MovementParameters): func apply_multiple_modifiers( _modifiers: Array, _movement_direction :Vector2): for m in _modifiers: if m is StateModifierMovement: + ##TODO: Check sign of direction here or maybe further down? + # if m.direction != sign(_movement_direction): + # pass apply_state_modifier(m, _movement_direction) func apply_state_modifier(_modifier :StateModifierMovement, _movement_direction :Vector2): diff --git a/lib/classes/movement_state_receiver.gd b/lib/classes/movement_state_receiver.gd index 7295aca..53552e6 100644 --- a/lib/classes/movement_state_receiver.gd +++ b/lib/classes/movement_state_receiver.gd @@ -155,7 +155,8 @@ func apply_state_modifier(movement_parameters :MovementParameters) -> MovementPa var active_mods :bool= true 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, Vector2(0,0)) + ## Process mods and supply current velocity for single directions + movement_parameters.apply_multiple_modifiers(mods, velocity_controller.velocity) return movement_parameters diff --git a/lib/classes/state_modifier_movement.gd b/lib/classes/state_modifier_movement.gd index a7e7746..c92d85e 100644 --- a/lib/classes/state_modifier_movement.gd +++ b/lib/classes/state_modifier_movement.gd @@ -36,6 +36,10 @@ export(Vector2) var acceleration export var gravity: int = 0 export var only_grounded :bool = false +## Properties of modifier only take place when velocity is moving in this direction +## Honestly I'm not sure when this would come up so it's maybe not worth building for. +## A speed boost that only works in one direction? Why? +#export var only_apply_in_single_direction :bool = false ## Ways to determine how modifiers are applied to movement parameters enum SUB_TYPE { diff --git a/src/classes/velocity_controller.gd b/src/classes/velocity_controller.gd index f42dcee..52be417 100644 --- a/src/classes/velocity_controller.gd +++ b/src/classes/velocity_controller.gd @@ -80,12 +80,12 @@ func calculate_velocity(_delta :float, #var h_speed = resolve_h_speed(movement_parameters) var start_speed :float = ( (movement_parameters.get_speed_start(RELATIVE_DIRECTION).x * move_direction.x) + - (movement_parameters.get_speed_start(POSITIVE_DIRECTION).x * POSITIVE_DIRECTION) - + (movement_parameters.get_speed_start(POSITIVE_DIRECTION).x * POSITIVE_DIRECTION) + (movement_parameters.get_speed_start(NEGATIVE_DIRECTION).x * NEGATIVE_DIRECTION) ) var end_speed :float = ( (movement_parameters.get_speed_end(RELATIVE_DIRECTION).x * move_direction.x) + - (movement_parameters.get_speed_end(POSITIVE_DIRECTION).x * POSITIVE_DIRECTION) - + (movement_parameters.get_speed_end(POSITIVE_DIRECTION).x * POSITIVE_DIRECTION) + (movement_parameters.get_speed_end(NEGATIVE_DIRECTION).x * NEGATIVE_DIRECTION) ) @@ -118,11 +118,22 @@ func calculate_velocity(_delta :float, print("resetting V impulse") _v_impulse_applied = false - ## Acceleration is always postive because we use the - # move toward functions. + ## Acceleration is always postive because we use the current inertia + ## placement to the movement range to determine direction of movement. #calc_acceleration.x = abs(resolve_h_acceleration(movement_parameters, move_direction.x)) if sign(move_direction.x) != 0: - calc_acceleration.x = abs(movement_parameters.get_acceleration(0).x) + #calc_acceleration.x = abs(movement_parameters.get_acceleration(0).x) + calc_acceleration.x = ( + movement_parameters.get_acceleration(RELATIVE_DIRECTION).x + + movement_parameters.get_acceleration(POSITIVE_DIRECTION).x + + movement_parameters.get_acceleration(NEGATIVE_DIRECTION).x + ) + if calc_acceleration.x < 0: + push_warning("Negative Acceleration shouln't happen") + calc_acceleration.x = abs(calc_acceleration.x) + + + if sign(move_direction.y) != 0: calc_acceleration.y = abs(movement_parameters.get_acceleration(0).y)