From ae8319586838df334a24e04153664fb24c85de39 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Sat, 8 Jul 2023 00:50:21 -0400 Subject: [PATCH] position-based turtle spiking (closes #135) --- maps/abyss.tscn | 35 +-------------- maps/abyss_scholar.tscn | 3 -- maps/test_room.tscn | 5 ++- objects/enemy/turtle.gd | 92 ++++++++++++++++++++++++++++++++++----- objects/enemy/turtle.tscn | 2 +- 5 files changed, 86 insertions(+), 51 deletions(-) diff --git a/maps/abyss.tscn b/maps/abyss.tscn index 1272dca..f0e06c0 100644 --- a/maps/abyss.tscn +++ b/maps/abyss.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=31 format=2] +[gd_scene load_steps=28 format=2] [ext_resource path="res://maps/map.gd" type="Script" id=1] [ext_resource path="res://objects/hud/hud.tscn" type="PackedScene" id=2] @@ -40,21 +40,6 @@ extents = Vector2( 4, 320 ) [sub_resource type="RectangleShape2D" id=8] extents = Vector2( 128, 4 ) -[sub_resource type="Curve2D" id=13] -_data = { -"points": PoolVector2Array( 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 16, 24, 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, -8, 24, 0, 0, 0, 0, -16, 16, 0, 0, 0, 0, -16, 8, 0, 0, 0, 0, -8, 0, 0, 0, 0, 0, 8, 0 ) -} - -[sub_resource type="Curve2D" id=14] -_data = { -"points": PoolVector2Array( 0, 0, 0, 0, 8, -24, 0, 0, 0, 0, 8, -32, 0, 0, 0, 0, 8, -40, 0, 0, 0, 0, 16, -40, 0, 0, 0, 0, 64, -40, 0, 0, 0, 0, 72, -40, 0, 0, 0, 0, 72, -16, 0, 0, 0, 0, 72, -8, 0, 0, 0, 0, 8, -8, 0, 0, 0, 0, 8, -24 ) -} - -[sub_resource type="Curve2D" id=15] -_data = { -"points": PoolVector2Array( 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 72, 56, 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 0 ) -} - [node name="Map" type="Node2D" groups=["map"]] pause_mode = 1 script = ExtResource( 1 ) @@ -196,42 +181,24 @@ position = Vector2( 88, 528 ) position = Vector2( 56, 40 ) right_down_boundary = 9.0 speed = 50 -spike_delay = 3.0 [node name="Turtle2" parent="Enemies" instance=ExtResource( 16 )] position = Vector2( 88, 264 ) left_up_boundary = 10.0 speed = 30 -spike_delay = 0.5 [node name="Eel" parent="Enemies" instance=ExtResource( 18 )] position = Vector2( 152, 96 ) speed = 50.0 -[node name="Path2D" parent="Enemies/Eel" index="0"] -curve = SubResource( 13 ) - [node name="Eel2" parent="Enemies" instance=ExtResource( 18 )] position = Vector2( 144, 256 ) speed = 50.0 -[node name="Path2D" parent="Enemies/Eel2" index="0"] -curve = SubResource( 14 ) - -[node name="PathFollow2D" parent="Enemies/Eel2/Path2D" index="0"] -position = Vector2( 8, -24 ) -rotation = -1.5708 - [node name="Eel3" parent="Enemies" instance=ExtResource( 18 )] position = Vector2( 40, 112 ) speed = 50.0 -[node name="Path2D" parent="Enemies/Eel3" index="0"] -curve = SubResource( 15 ) - -[node name="PathFollow2D" parent="Enemies/Eel3/Path2D" index="0"] -rotation = 2.35619 - [node name="Collectibles" type="Node2D" parent="."] [node name="Star" parent="Collectibles" instance=ExtResource( 17 )] diff --git a/maps/abyss_scholar.tscn b/maps/abyss_scholar.tscn index df9dbed..e9860db 100644 --- a/maps/abyss_scholar.tscn +++ b/maps/abyss_scholar.tscn @@ -379,20 +379,17 @@ speed = 60 position = Vector2( 56, 32 ) right_down_boundary = 13.0 speed = 50 -spike_delay = 3.0 [node name="Turtle2" parent="Enemies/Turtle" instance=ExtResource( 16 )] position = Vector2( 48, 280 ) left_up_boundary = 6.0 speed = 30 -spike_delay = 2.5 [node name="Turtle3" parent="Enemies/Turtle" instance=ExtResource( 16 )] position = Vector2( 192, 472 ) left_up_boundary = 3.0 right_down_boundary = 3.0 speed = 30 -spike_delay = 1.0 [node name="Collectibles" type="Node2D" parent="."] diff --git a/maps/test_room.tscn b/maps/test_room.tscn index 8835d9c..f722aa6 100644 --- a/maps/test_room.tscn +++ b/maps/test_room.tscn @@ -134,6 +134,7 @@ material = SubResource( 4 ) position = Vector2( 4, 4 ) z_index = -3 frames = SubResource( 5 ) +frame = 1 playing = true [node name="Steam" parent="." instance=ExtResource( 23 )] @@ -167,10 +168,10 @@ right_down_boundary = 5.0 position = Vector2( 152, 152 ) left_up_boundary = 4.0 right_down_boundary = 4.0 -move_direction = 1 +spike_positions = [ -2.0, 2.0 ] [node name="MovingPlatform" parent="." instance=ExtResource( 6 )] -position = Vector2( 128, 152 ) +position = Vector2( 96, 144 ) scale = Vector2( 2, 1 ) left_up_boundary = 4.0 right_down_boundary = 4.0 diff --git a/objects/enemy/turtle.gd b/objects/enemy/turtle.gd index 015c225..422067e 100644 --- a/objects/enemy/turtle.gd +++ b/objects/enemy/turtle.gd @@ -1,37 +1,107 @@ tool extends "res://objects/enemy/enemy_move_sidesideupdown.gd" -export var spike_delay: float = 2.0 +## positions along the path where spikes will trigger +export (Array, float) var spike_positions: Array = [] +## time spikes stay active export var spike_time: float = 0.25 +# animates the spikes +var can_spike: bool = true var spike_tween: SceneTreeTween +# index of the current spike position to check for +onready var current_spike_position: int = 0 onready var sprite: Sprite = $"%Sprite" onready var spike_shape: CollisionShape2D = $"%SpikeShape" func _ready() -> void: + # don't act in the editor if Engine.editor_hint: return - spike_tween = create_tween().set_loops() + + # positions must be in order + spike_positions.sort() + for i in spike_positions.size(): + # scale to be in tiles + spike_positions[i] = spike_positions[i] * 8.0 + # should start with the first positive spike position + if spike_positions[i] < 0.0: + current_spike_position = i + 1 + +func _process(delta: float) -> void: + # update debug graphics in editor + if Engine.editor_hint and Engine.get_frames_drawn() % 10 == 0: + update() + +func _physics_process(delta: float) -> void: + # do nothing in editor + if Engine.editor_hint: + return + + # sync hitbox + $HeadHitbox.scale.x = $ToFlip.scale.x + + # check if can still spike before doing all this work + if not can_spike: + return + # use positions in correct axis + var pos = position.x if move_direction == Direction.HORIZONTAL else position.y + var pos_start = startpos.x if move_direction == Direction.HORIZONTAL else startpos.y + # slightly different logic depending on forward/backwards unfortunately :I + match sign(direction): + 1.0: + # make sure there are any positions left to check in this direction + if current_spike_position < spike_positions.size(): + # check if passed the spike position + if pos >= pos_start + spike_positions[current_spike_position]: + # move on to next position + current_spike_position += 1 + spike() + -1.0: + # make sure there are still positions left in this direction + if current_spike_position - 1 >= 0: + # check if passed the position + if pos <= pos_start + spike_positions[current_spike_position - 1]: + # move on to next (previous because backwards) position + current_spike_position -= 1 + spike() + +## performs the spike animation +func spike() -> void: + # reset tween + if spike_tween != null: + spike_tween.kill() # never have two tweens acting on the same thing + spike_tween = create_tween() spike_tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS) - - spike_tween.tween_property(spike_shape, "disabled", true, 0.0) - spike_tween.tween_property(sprite, "frame_coords:y", 0.0, 0.0) - spike_tween.tween_interval(spike_delay) - + # indicator sprite spike_tween.tween_property(sprite, "frame_coords:y", 1.0, 0.0) spike_tween.tween_interval(spike_time * 2.0) - + # spikes active spike_tween.tween_property(spike_shape, "disabled", false, 0.0) spike_tween.tween_property(sprite, "frame_coords:y", 2.0, 0.0) spike_tween.tween_interval(spike_time) - -func _physics_process(delta: float) -> void: - $HeadHitbox.scale.x = $ToFlip.scale.x + # spikes gone once more + spike_tween.tween_property(spike_shape, "disabled", true, 0.0) + spike_tween.tween_property(sprite, "frame_coords:y", 0.0, 0.0) func die() -> void: + # disable spiking + can_spike = false + # stop tween spike_tween.kill() + # disable hitbox spike_shape.set_deferred("disabled", true) + # reset animation sprite.frame_coords.y = 3 Audio.play_sound(death_sound, Audio.ac_die) $"%DeathSplatter".emitting = true + +func _draw() -> void: + if Engine.editor_hint: + # still draw base moving enemy debug lines + ._draw() + # draw dots at spike positions + for pos in spike_positions: + var dir = Vector2.RIGHT if move_direction == Direction.HORIZONTAL else Vector2.DOWN + draw_circle(dir * pos * 8.0, 2.0, Color.red) diff --git a/objects/enemy/turtle.tscn b/objects/enemy/turtle.tscn index 02a48b1..5fb6cdb 100644 --- a/objects/enemy/turtle.tscn +++ b/objects/enemy/turtle.tscn @@ -68,7 +68,6 @@ texture = ExtResource( 1 ) centered = false hframes = 3 vframes = 4 -frame = 6 [node name="SwimPlayer" type="AnimationPlayer" parent="ToFlip"] root_node = NodePath("../..") @@ -92,6 +91,7 @@ unique_name_in_owner = true unique_name_in_owner = true position = Vector2( 8.5, -1.5 ) shape = SubResource( 5 ) +disabled = true [node name="Platform" type="KinematicBody2D" parent="SpikeHitbox"]