a game about throwing hammers made for the github game off
Diffstat (limited to 'player/player.gd')
-rw-r--r--player/player.gd343
1 files changed, 172 insertions, 171 deletions
diff --git a/player/player.gd b/player/player.gd
index 7c4a90f..8e2618b 100644
--- a/player/player.gd
+++ b/player/player.gd
@@ -26,8 +26,8 @@ signal hp_changed(health: int)
## Friction
@export var frict := 0.25
-## How much less movement control to have in the air
-@export var air_movement_modifier := 0.95
+## How much movement control to have in the air
+@export var air_movement_modifier := 1.2
## Max hp
@export var max_health := 10
@@ -43,10 +43,10 @@ signal hp_changed(health: int)
@onready var GRAVITY: float = ProjectSettings.get_setting(&"physics/2d/default_gravity")
func _init() -> void:
- Globals.player = self
+ Globals.player = self
func _exit_tree() -> void:
- Globals.player = null
+ Globals.player = null
## State enum.
enum State { MOVE, WALL_SLIDE, STOP }
@@ -70,244 +70,245 @@ var current_hammer: Hammer = null
var last_highlit: Hammer = null
var health := max_health:
- set(hp):
- health = hp
- hp_changed.emit(hp)
- if hp == 0:
- queue_free()
+ set(hp):
+ health = hp
+ hp_changed.emit(hp)
+ if hp == 0:
+ queue_free()
func _physics_process(delta: float) -> void:
- just_jumped = false
- match state:
- State.STOP:
- velocity = Vector2.ZERO
- play(&"idle")
- State.MOVE:
- var input := Input.get_axis(&"left", &"right")
- if aiming:
- input = 0
- apply_force(input, delta)
- apply_friction(input)
-
- jump_check()
-
- apply_gravity(delta)
-
- animate(input)
- move()
- wall_slide_check()
- State.WALL_SLIDE:
- play(&"wall_slide")
- var wall_axis := get_wall_axis()
- if wall_axis != 0:
- sprite.scale.x = wall_axis
-
- wall_slide_jump_check(wall_axis)
- wall_slide_drop(delta)
- move()
- wall_detatch(wall_axis, delta)
- check_throw()
- hammer_highlight()
- hammer_pickup()
- hammer_move()
+ just_jumped = false
+ match state:
+ State.STOP:
+ velocity = Vector2.ZERO
+ play(&"idle")
+ State.MOVE:
+ var input := Input.get_axis(&"left", &"right")
+ if aiming:
+ input = 0
+ elif not is_on_floor():
+ input *= air_movement_modifier
+ apply_force(input, delta)
+ apply_friction(input)
+
+ jump_check()
+
+ apply_gravity(delta)
+
+ animate(input)
+ move()
+ wall_slide_check()
+ State.WALL_SLIDE:
+ play(&"wall_slide")
+ var wall_axis := get_wall_axis()
+ if wall_axis != 0:
+ sprite.scale.x = wall_axis
+
+ wall_slide_jump_check(wall_axis)
+ wall_slide_drop(delta)
+ move()
+ wall_detatch(wall_axis, delta)
+ check_throw()
+ hammer_highlight()
+ hammer_pickup()
+ hammer_move()
## Creates floor dust.
func dust() -> void:
- var dust_position := global_position
- dust_position.x += randf_range(-4, 4)
- Utils.instance_scene_on_main(DustEffect, dust_position)
- # SoundFx.play("Step", -20)
+ var dust_position := global_position
+ dust_position.x += randf_range(-4, 4)
+ Utils.instance_scene_on_main(DustEffect, dust_position)
+ SoundManager.play("step", -20)
## Applys gravity.
func apply_gravity(delta: float) -> void:
- velocity.y += GRAVITY * delta
- velocity.y = minf(velocity.y, jump_force)
+ velocity.y += GRAVITY * delta
+ velocity.y = minf(velocity.y, jump_force)
## Applys force with the [param input] of the player.
func apply_force(input: float, delta: float) -> void:
- if input != 0:
- velocity.x += input * accel * delta
- velocity.x = clampf(velocity.x, -top_speed, top_speed)
- if not is_on_floor():
- velocity.x *= air_movement_modifier
+ if input != 0:
+ velocity.x += input * accel * delta
+ velocity.x = clampf(velocity.x, -top_speed, top_speed)
## Applys friction to the player.
func apply_friction(input: float) -> void:
- if input == 0 and not is_zero_approx(velocity.x) and is_on_floor():
- velocity.x = lerpf(velocity.x, 0, frict)
+ if input == 0 and not is_zero_approx(velocity.x) and is_on_floor():
+ velocity.x = lerpf(velocity.x, 0, frict)
func hammer_highlight() -> void:
- if not current_hammer:
- var hamms := pickup_area.get_overlapping_areas()
- if hamms.is_empty():
- if last_highlit:
- last_highlit.unhighlight()
- last_highlit = null
- elif not last_highlit in hamms:
- if last_highlit:
- last_highlit.unhighlight()
- last_highlit = hamms[0]
- hamms[0].highlight()
+ if not current_hammer:
+ var hamms := pickup_area.get_overlapping_areas()
+ if hamms.is_empty():
+ if last_highlit:
+ last_highlit.unhighlight()
+ last_highlit = null
+ elif not last_highlit in hamms:
+ if last_highlit:
+ last_highlit.unhighlight()
+ last_highlit = hamms[0]
+ hamms[0].highlight()
func hammer_pickup() -> void:
- if Input.is_action_just_pressed("pickup") and last_highlit and not current_hammer:
- last_highlit.unhighlight()
- current_hammer = last_highlit
- Globals.levelmanager.current_level.remove_child(current_hammer)
- current_hammer.position.y = -14
- add_child(current_hammer)
- move_child(current_hammer, 0)
+ if Input.is_action_just_pressed("pickup") and last_highlit and not current_hammer:
+ last_highlit.unhighlight()
+ current_hammer = last_highlit
+ Globals.levelmanager.current_level.remove_child(current_hammer)
+ current_hammer.position.y = -14
+ add_child(current_hammer)
+ move_child(current_hammer, 0)
func hammer_move() -> void:
- if current_hammer:
- current_hammer.position.x = 6 * sprite.scale.x
- current_hammer.rotation = 0.087 * sprite.scale.x
+ if current_hammer:
+ current_hammer.position.x = 6 * sprite.scale.x
+ current_hammer.rotation = 0.087 * sprite.scale.x
func check_throw() -> void:
- if current_hammer and Input.is_action_just_pressed("throw"):
- aim_gizmo.enabled = true
- aiming = true
- aim_gizmo.show()
+ if current_hammer and Input.is_action_just_pressed("throw"):
+ aim_gizmo.enabled = true
+ aiming = true
+ aim_gizmo.show()
## Plays animations for the move state.
func animate(input: float) -> void:
- if sign(input) != 0:
- sprite.scale.x = sign(input)
+ if sign(input) != 0:
+ sprite.scale.x = sign(input)
- if not is_on_floor():
- play(&"jump")
- return
+ if not is_on_floor():
+ play(&"jump")
+ return
- if velocity.x != 0:
- play(&"run", sign(velocity.x * sprite.scale.x))
- else:
- play(&"idle")
+ if velocity.x != 0:
+ play(&"run", sign(velocity.x * sprite.scale.x))
+ else:
+ play(&"idle")
## Plays a [param anim] with a speed of [param speed].
## If speed is negative, animation plays backwards.
func play(anim: StringName, speed: float = 1.0) -> void:
- anims.play(anim, -1, speed)
+ anims.play(anim, -1, speed)
## Checks if we should jump.
func jump_check() -> void:
- var want2jump := Input.is_action_just_pressed(&"jump")
- if want2jump and (is_on_floor() or coyote.time_left > 0):
- jump(jump_force)
- just_jumped = true
- else:
- if want2jump and velocity.y < -jump_force / 2:
- velocity.y = -jump_force / 2
-
- if want2jump and double_jump == true:
- jump(jump_force * .75)
- double_jump = false
+ var want2jump := Input.is_action_just_pressed(&"jump")
+ if want2jump and (is_on_floor() or coyote.time_left > 0):
+ jump(jump_force)
+ just_jumped = true
+ else:
+ if want2jump and velocity.y < -jump_force / 2:
+ velocity.y = -jump_force / 2
+
+ if want2jump and double_jump == true:
+ jump(jump_force * .75)
+ double_jump = false
## Jumps with [param force] force.
func jump(force: float) -> void:
- # SoundFx.play("Jump", -20)
- if double_jump:
- Utils.instance_scene_on_main(JumpEffect, global_position)
- else:
- Utils.instance_scene_on_main(DoubleJumpEffect, global_position)
- velocity.y = -force
+ SoundManager.play("jump", -10)
+ if double_jump:
+ Utils.instance_scene_on_main(JumpEffect, global_position)
+ else:
+ Utils.instance_scene_on_main(DoubleJumpEffect, global_position)
+ velocity.y = -force
## Uses the velocity to move_and_slide.
func move() -> void:
- var was_in_air := not is_on_floor()
- var was_on_floor := is_on_floor()
- var last_position := position
- var last_velocity := velocity
- move_and_slide()
-
- # landing
- if was_in_air and is_on_floor():
- velocity.x = last_velocity.x
- double_jump = true
- Utils.instance_scene_on_main(JumpEffect, global_position)
-
- # just left ground
- if was_on_floor and not is_on_floor() and not just_jumped:
- position.y = last_position.y
- coyote.start()
- Utils.instance_scene_on_main(JumpEffect, global_position)
+ var was_in_air := not is_on_floor()
+ var was_on_floor := is_on_floor()
+ var last_position := position
+ var last_velocity := velocity
+ move_and_slide()
+
+ # landing
+ if was_in_air and is_on_floor():
+ velocity.x = last_velocity.x
+ double_jump = true
+ Utils.instance_scene_on_main(JumpEffect, global_position)
+
+ # just left ground
+ if was_on_floor and not is_on_floor() and not just_jumped:
+ position.y = last_position.y
+ coyote.start()
+ Utils.instance_scene_on_main(JumpEffect, global_position)
## Checks if we should enter a wall slide.
func wall_slide_check():
- if not is_on_floor() and is_on_wall_only():
- state = State.WALL_SLIDE
- double_jump = true
- dust()
+ if not is_on_floor() and is_on_wall_only():
+ state = State.WALL_SLIDE
+ double_jump = true
+ dust()
## Checks what wall we are against.
func get_wall_axis() -> int:
- var is_right_wall := test_move(transform, Vector2.RIGHT)
- var is_left_wall := test_move(transform, Vector2.LEFT)
- return int(is_left_wall) - int(is_right_wall)
+ var is_right_wall := test_move(transform, Vector2.RIGHT)
+ var is_left_wall := test_move(transform, Vector2.LEFT)
+ return int(is_left_wall) - int(is_right_wall)
## Checks if we should jump off the [param wall_axis].
func wall_slide_jump_check(wall_axis: int) -> void:
- if Input.is_action_just_pressed(&"jump"):
- velocity.x = wall_axis * top_speed
- velocity.y = -jump_force / 1.25
- state = State.MOVE
- wall_dust(wall_axis)
- # SoundFx.play("Jump", -20)
+ if Input.is_action_just_pressed(&"jump"):
+ velocity.x = wall_axis * top_speed
+ velocity.y = -jump_force / 1.25
+ state = State.MOVE
+ wall_dust(wall_axis)
+ SoundManager.play("jump", -10)
## Creates dust against the [param wall_axis].
func wall_dust(wall_axis: int) -> void:
- var dust_position = global_position + Vector2(wall_axis * 4, -2)
- var dust_fx := Utils.instance_scene_on_main(WallJumpEffect, dust_position) as Node2D
- dust_fx.scale.x = wall_axis
+ var dust_position = global_position + Vector2(wall_axis * 4, -2)
+ var dust_fx := Utils.instance_scene_on_main(WallJumpEffect, dust_position) as Node2D
+ dust_fx.scale.x = wall_axis
## Slides down the wall.
func wall_slide_drop(delta: float) -> void:
- var max_slide_speed := wall_slide_fall_speed
- if Input.is_action_pressed("down"):
- max_slide_speed = max_wall_slide_fall_speed
- velocity.y = min(velocity.y + GRAVITY * delta, max_slide_speed)
+ var max_slide_speed := wall_slide_fall_speed
+ if Input.is_action_pressed("down"):
+ max_slide_speed = max_wall_slide_fall_speed
+ velocity.y = min(velocity.y + GRAVITY * delta, max_slide_speed)
## Checks if we should detatch from the wall.
func wall_detatch(wall_axis: int, delta: float) -> void:
- var detached := false
- if aiming: return
+ var detached := false
+ if aiming: return
- if Input.is_action_just_pressed("right"):
- velocity.x = accel * delta
- detached = true
+ if Input.is_action_just_pressed("right"):
+ velocity.x = accel * delta
+ detached = true
- if Input.is_action_just_pressed("left"):
- velocity.x = -accel * delta
- detached = true
+ if Input.is_action_just_pressed("left"):
+ velocity.x = -accel * delta
+ detached = true
- if detached:
- state = State.MOVE
- wall_dust(wall_axis)
+ if detached:
+ state = State.MOVE
+ wall_dust(wall_axis)
- if wall_axis == 0 or is_on_floor():
- state = State.MOVE
+ if wall_axis == 0 or is_on_floor():
+ state = State.MOVE
func hit(damage: int) -> void:
- health -= damage
+ health -= damage
## Disable the aim gizmo.
func disable_aim_gizmo() -> void:
- aiming = false
- aim_gizmo.enabled = false
- aim_gizmo.hide()
+ aiming = false
+ aim_gizmo.enabled = false
+ aim_gizmo.hide()
## Throws the hammer.
func throw(rot: float) -> void:
- rot += randf_range(-0.01, 0.01)
- remove_child(current_hammer)
- current_hammer.position.x = 0 # center
- current_hammer.global_position = to_global(current_hammer.position)
- Globals.levelmanager.current_level.add_child(current_hammer)
- current_hammer.hit_player = false
- current_hammer.hit_enemys = true
- current_hammer.throw(Vector2.from_angle(rot))
- current_hammer = null
- disable_aim_gizmo()
+ rot += randf_range(-0.01, 0.01)
+ remove_child(current_hammer)
+ current_hammer.position.x = 0 # center
+ current_hammer.global_position = to_global(current_hammer.position)
+ Globals.levelmanager.current_level.add_child(current_hammer)
+ current_hammer.hit_player = false
+ current_hammer.hit_enemys = true
+ current_hammer.throw(Vector2.from_angle(rot))
+ SoundManager.play("throw", -15)
+ current_hammer = null
+ disable_aim_gizmo()