a game about throwing hammers made for the github game off
Diffstat (limited to 'hammers/hammer.gd')
-rw-r--r--hammers/hammer.gd65
1 files changed, 59 insertions, 6 deletions
diff --git a/hammers/hammer.gd b/hammers/hammer.gd
index 395a3b8..a52741b 100644
--- a/hammers/hammer.gd
+++ b/hammers/hammer.gd
@@ -16,7 +16,7 @@ var direction := Vector2.ZERO
## Maximum speed
@export var top_speed := 200
-## The amount it can turn towards its target in radians
+## The amount it can turn towards its target
@export var steer_force = 0.05
## The target
@@ -28,30 +28,83 @@ var hit_player := true
## To hit the enemys
var hit_enemys := false
+## The amount of time before gravity kicks in.
+var lifetime := 1
+
+## The gravity
+var grav := 4
+
+## Terminal velocity
+var terminal_velocity := 15
+
@onready var trail := $Trail as Trail2D
@onready var outline_shader := ($Sprite as Sprite2D).material as ShaderMaterial
+@onready var target_finder := $TargetFinder as Area2D
+@onready var hitbox := $Hitbox as Hitbox
func _ready() -> void:
+ set_masks()
+
+## Sets the collision masks.
+func set_masks() -> void:
set_collision_mask_value(3, hit_player)
set_collision_mask_value(4, hit_enemys)
+ target_finder.set_collision_mask_value(3, hit_player)
+ target_finder.set_collision_mask_value(4, hit_enemys)
+ hitbox.collision_mask = target_finder.collision_mask
+ target_finder.monitoring = not is_instance_valid(target)
+ hitbox.monitoring = hit_player || hit_enemys
+## Moves the direction towards the target.
func seek() -> void:
- if target:
+ if is_instance_valid(target):
direction = direction + (global_position.direction_to(target.global_position) - direction) * steer_force
+ elif not target == null:
+ # target died (!)
+ target = null
+ target_finder.monitoring = true
+## Highlights this hammer. See also [method unhighlight].
func highlight() -> void:
outline_shader.set_shader_parameter(&"line_width", .75)
+## Un-highlights this hammer. See also [method highlight].
func unhighlight() -> void:
outline_shader.set_shader_parameter(&"line_width", 0)
func _physics_process(delta: float) -> void:
- seek()
- velocity = (direction * acceleration * delta).limit_length(top_speed)
+ lifetime -= delta
+ if lifetime < 0:
+ velocity.y += grav * delta
+ velocity.y = clampf(velocity.y, -terminal_velocity, terminal_velocity)
+ else:
+ seek()
+ velocity = (direction * acceleration * delta)
+ velocity.y = lerpf(velocity.y, 0, .2) # hard to move up
+ velocity = velocity.limit_length(top_speed)
rotation = velocity.angle() + PI/2 # face forward
global_position += velocity
func _on_body_entered(_body: Node2D) -> void:
- trail.clear_points()
- global_position += velocity # go into the wall a little
+ trail.emitting = false
+ target_finder.monitoring = false
+ hitbox.monitoring = false
+ set_collision_layer_value(7, true)
+ global_position += velocity.limit_length(1) # go into the wall a little
+ velocity = Vector2.ZERO
+ target = null
+ steer_force = 0.05
set_physics_process(false)
+ trail.clear_points()
+
+## Throws this [Hammer].
+func throw(p_direction: Vector2) -> void:
+ direction = p_direction
+ trail.emitting = true
+ set_physics_process(true)
+ set_masks()
+
+
+func _on_target_finder_node_entered(n: Node2D) -> void:
+ target = n
+ target_finder.set_deferred(&"monitoring", false)