a game about throwing hammers made for the github game off
-rw-r--r--hammers/hammer.gd63
-rw-r--r--hammers/hammer_01.tscn4
-rw-r--r--hammers/hammer_02.tscn4
-rw-r--r--hammers/hammer_03.tscn12
-rw-r--r--hammers/hammer_base.tscn11
5 files changed, 56 insertions, 38 deletions
diff --git a/hammers/hammer.gd b/hammers/hammer.gd
index 86db072..53110e3 100644
--- a/hammers/hammer.gd
+++ b/hammers/hammer.gd
@@ -4,6 +4,14 @@ class_name Hammer
@icon("res://assets/hammers/hammer01.png")
+@onready var left_cast := $LeftCast as RayCast2D
+@onready var right_cast := $RightCast as RayCast2D
+@onready var head := $Head as Marker2D
+@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
+
## The current velocity
var velocity := Vector2.ZERO
@@ -22,19 +30,23 @@ var direction := Vector2.ZERO
## The hit enum.
enum HITS {_a, _b, _c, PLAYER, ENEMY, NONE}
+## These nodes want to have their collision mask set.
+@onready var hitmasks = [target_finder, hitbox, left_cast, right_cast, self]
+
## Pick which layers to hit.
@export var hits: HITS = HITS.PLAYER:
set(value):
- set_collision_mask_value(hits, false)
- target_finder.set_collision_mask_value(hits, false)
+ for node in hitmasks:
+ node.set_collision_mask_value(hits, false)
hits = value
hitbox.monitoring = hits != HITS.NONE
+ left_cast.enabled = hits != HITS.NONE
+ right_cast.enabled = hits != HITS.NONE
if value == HITS.NONE:
return
- set_collision_mask_value(hits, true)
- target_finder.set_collision_mask_value(hits, true)
+ for node in hitmasks:
+ node.set_collision_mask_value(hits, true)
target_finder.monitoring = not is_instance_valid(target)
- hitbox.collision_mask = target_finder.collision_mask
## The amount of time before gravity kicks in.
@export var lifetime := 3.0
@@ -45,38 +57,34 @@ enum HITS {_a, _b, _c, PLAYER, ENEMY, NONE}
## The target
var target: Node2D = null
-@onready var head := $Head as Marker2D
-@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:
hits = hits
+## Lerps direction towards [param to].
+func dirlerp(to: Vector2) -> void:
+ direction = lerp(direction, to, steer_force * clampf(lifetime, 0, 1))
## Moves the direction towards the target.
func seek() -> void:
if is_instance_valid(target):
- direction = lerp(
- direction, head.global_position.direction_to(target.global_position), steer_force * clampf(lifetime, 0, 1)
- )
+ dirlerp(head.global_position.direction_to(target.global_position))
elif target_finder.monitoring == false:
target = null
target_finder.monitoring = true
-# func anticrash() -> void:
-# var space := get_world_2d().direct_space_state
-# var param := PhysicsRayQueryParameters2D.create(head.global_position, head.global_position + (direction * 10), pow(2, 1-1) + pow(2, hits - 1))
-# var result := space.intersect_ray(param)
-# if result.is_empty() or result.collider is Player or result.collider is Enemy:
-# return
-# direction = lerp(
-# direction,
-# direction.bounce(head.global_position.direction_to(result.position)),
-# steer_force * clampf(lifetime, 0, 1)
-# )
+## Tries not to crash.
+func anticrash() -> void:
+ var is_wall := func is_wall(ray: RayCast2D) -> bool:
+ if not ray.is_colliding(): return false
+ if target and ray.get_collider().get_class() == target.get_class(): return false
+ return true
+
+ var results: Array[bool] = [is_wall.call(left_cast), is_wall.call(right_cast)]
+ if results.count(true) == 2: return # resign to our fate
+
+ for i in range(2):
+ if results[i]:
+ dirlerp(direction.rotated(steer_force if i == 0 else -steer_force))
## Highlights this hammer. See also [method unhighlight].
func highlight() -> void:
@@ -94,7 +102,7 @@ func _physics_process(delta: float) -> void:
velocity.y += grav * delta
else:
seek()
-# anticrash()
+ anticrash()
velocity += (direction * acceleration * delta)
if velocity.y < 0:
velocity.y = lerpf(velocity.y, 0, .1) # hard to move up
@@ -111,6 +119,7 @@ func _on_body_entered(_body: Node2D) -> void:
set_collision_layer_value(7, true)
global_position += velocity.limit_length(1) # go into the wall a little
velocity = Vector2.ZERO
+ hits = HITS.NONE
target = null
steer_force = 0.05
lifetime = 3
diff --git a/hammers/hammer_01.tscn b/hammers/hammer_01.tscn
index 36b03d8..a39d5df 100644
--- a/hammers/hammer_01.tscn
+++ b/hammers/hammer_01.tscn
@@ -4,7 +4,7 @@
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_le3ds"]
[ext_resource type="Texture2D" uid="uid://dcf5es758pw1n" path="res://assets/hammers/hammer01.png" id="2_sdlv5"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_mr4f6"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_u0220"]
resource_local_to_scene = true
shader = ExtResource("2_le3ds")
shader_parameter/light_offset = 1.0
@@ -14,7 +14,7 @@ shader_parameter/sin_frequency = 0.25
[node name="Hammer01" instance=ExtResource("1_350hj")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_mr4f6")
+material = SubResource("ShaderMaterial_u0220")
texture = ExtResource("2_sdlv5")
[editable path="Hitbox"]
diff --git a/hammers/hammer_02.tscn b/hammers/hammer_02.tscn
index 743a6f5..7d4816b 100644
--- a/hammers/hammer_02.tscn
+++ b/hammers/hammer_02.tscn
@@ -4,7 +4,7 @@
[ext_resource type="Texture2D" uid="uid://bcpy0wbrlmqsq" path="res://assets/hammers/hammer02.png" id="2_dmvhv"]
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_rf70p"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_8htv8"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_6ejuw"]
resource_local_to_scene = true
shader = ExtResource("2_rf70p")
shader_parameter/light_offset = 1.0
@@ -14,7 +14,7 @@ shader_parameter/sin_frequency = 0.25
[node name="Hammer02" instance=ExtResource("1_vy2k1")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_8htv8")
+material = SubResource("ShaderMaterial_6ejuw")
texture = ExtResource("2_dmvhv")
[node name="Hitbox" parent="." index="3"]
diff --git a/hammers/hammer_03.tscn b/hammers/hammer_03.tscn
index d8b0098..0225f48 100644
--- a/hammers/hammer_03.tscn
+++ b/hammers/hammer_03.tscn
@@ -4,32 +4,32 @@
[ext_resource type="Texture2D" uid="uid://blx67dnlqysnc" path="res://assets/hammers/hammer03.png" id="2_0uj7a"]
[ext_resource type="Shader" path="res://hammers/hammer_outline.gdshader" id="2_huryw"]
-[sub_resource type="ShaderMaterial" id="ShaderMaterial_wxyih"]
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_wq5re"]
resource_local_to_scene = true
shader = ExtResource("2_huryw")
shader_parameter/light_offset = 1.0
shader_parameter/line_width = 0.0
shader_parameter/sin_frequency = 0.25
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_3xqdd"]
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_2xwsd"]
size = Vector2(8, 12)
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_ta2m2"]
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_lidys"]
size = Vector2(8, 12)
[node name="Hammer03" instance=ExtResource("1_wc0io")]
[node name="Sprite" parent="." index="1"]
-material = SubResource("ShaderMaterial_wxyih")
+material = SubResource("ShaderMaterial_wq5re")
texture = ExtResource("2_0uj7a")
[node name="Collision" parent="." index="2"]
-shape = SubResource("RectangleShape2D_3xqdd")
+shape = SubResource("RectangleShape2D_2xwsd")
[node name="Hitbox" parent="." index="3"]
damage = 3
[node name="Collision" parent="Hitbox" index="0"]
-shape = SubResource("RectangleShape2D_ta2m2")
+shape = SubResource("RectangleShape2D_lidys")
[editable path="Hitbox"]
diff --git a/hammers/hammer_base.tscn b/hammers/hammer_base.tscn
index c6de599..43b00c2 100644
--- a/hammers/hammer_base.tscn
+++ b/hammers/hammer_base.tscn
@@ -16,7 +16,7 @@ shader_parameter/line_width = 0.0
shader_parameter/sin_frequency = 0.25
[sub_resource type="CircleShape2D" id="CircleShape2D_jubww"]
-radius = 70.0
+radius = 125.0
[node name="Hammer" type="Area2D"]
texture_filter = 1
@@ -60,8 +60,17 @@ monitorable = false
shape = SubResource("CircleShape2D_jubww")
[node name="Head" type="Marker2D" parent="."]
+position = Vector2(0, -6)
+
+[node name="LeftCast" type="RayCast2D" parent="."]
+visible = false
+position = Vector2(0, -6)
+target_position = Vector2(-4, -15)
+
+[node name="RightCast" type="RayCast2D" parent="."]
visible = false
position = Vector2(0, -6)
+target_position = Vector2(4, -15)
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="area_entered" from="TargetFinder" to="." method="_on_target_finder_node_entered"]