Jam10/Scripts/Units/Player.gd

93 lines
2.4 KiB
GDScript3
Raw Normal View History

2023-01-26 18:25:40 +00:00
extends Unit
# Player-specific code
class_name Player
const RECOIL_PUSHBACK = 15
func _init():
pos = Vector2(position.x / Constants.GRID_SIZE, -1 * position.y / Constants.GRID_SIZE)
position.x = position.x * Constants.SCALE_FACTOR
position.y = position.y * Constants.SCALE_FACTOR
func execute_actions(delta):
.execute_actions(delta)
for action_num in Constants.UNIT_TYPE_ACTIONS[Constants.UnitType.PLAYER]:
if !actions[action_num]:
continue
match action_num:
# handle custom actions
Constants.ActionType.RECOIL:
recoil()
_:
pass
func recoil():
if is_current_action_timer_done(Constants.UnitCurrentAction.RECOILING):
set_current_action(Constants.UnitCurrentAction.IDLE)
else:
set_current_action(Constants.UnitCurrentAction.RECOILING)
set_sprite(Constants.SpriteClass.RECOIL)
func handle_input(delta):
scene.handle_player_input()
func _on_Player_area_entered(area: Area2D) -> void:
if get_condition(Constants.UnitCondition.IS_INVINCIBLE, false):
return
if area is Unit:
hit_from_area(area)
func hit_from_area(other_area : Area2D):
var collision_dir : int
if other_area.position > position:
collision_dir = Constants.Direction.RIGHT
else:
collision_dir = Constants.Direction.LEFT
hit(collision_dir)
func hit(dir : int):
.hit(dir)
set_unit_condition_with_timer(Constants.UnitCondition.IS_INVINCIBLE)
start_flash()
set_action(Constants.ActionType.RECOIL)
set_current_action(Constants.UnitCurrentAction.RECOILING)
set_unit_condition(Constants.UnitCondition.MOVING_STATUS, Constants.UnitMovingStatus.IDLE)
func invincibility_ended():
is_flash = false
if get_overlapping_areas().size() > 0:
if get_overlapping_areas()[0] is Unit:
hit_from_area(get_overlapping_areas()[0])
func handle_recoil():
if not hit_queued:
return
hit_queued = false
if get_condition(Constants.UnitCondition.IS_ON_GROUND, true):
if h_speed > 0:
if hit_dir == Constants.Direction.LEFT:
v_speed -= RECOIL_PUSHBACK
else:
v_speed += RECOIL_PUSHBACK
elif h_speed < 0:
if hit_dir == Constants.Direction.LEFT:
v_speed += RECOIL_PUSHBACK
else:
v_speed -= RECOIL_PUSHBACK
else:
v_speed = -RECOIL_PUSHBACK
if hit_dir == Constants.Direction.LEFT:
h_speed = Constants.QUANTUM_DIST
else:
h_speed = -Constants.QUANTUM_DIST
if v_speed > 0:
h_speed *= -1
v_speed = -v_speed
else:
if hit_dir == Constants.Direction.LEFT:
h_speed += RECOIL_PUSHBACK
else:
h_speed -= RECOIL_PUSHBACK
facing = hit_dir