diff --git a/project.godot b/project.godot index 0126a26..ca53140 100644 --- a/project.godot +++ b/project.godot @@ -44,6 +44,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://FireExtinguisherEnemy.gd" }, { +"base": "AnimatedSprite", +"class": "FourSidedSprite", +"language": "GDScript", +"path": "res://src/behaviours/graphics/FourSidedSprite.gd" +}, { "base": "Node", "class": "Ownership", "language": "GDScript", @@ -75,9 +80,14 @@ _global_script_classes=[ { "path": "res://src/behaviours/spawning/SpawnEveryPeriod.gd" }, { "base": "Node", -"class": "TeleportToScreenEdge", +"class": "TeleportToRandomPosition", "language": "GDScript", "path": "res://src/behaviours/movement/TeleportToScreenEdge.gd" +}, { +"base": "Node", +"class": "TeleportToScreenEdge", +"language": "GDScript", +"path": "res://src/behaviours/movement/TeleportToRandomPosition.gd" } ] _global_script_class_icons={ "Alliance": "", @@ -87,12 +97,14 @@ _global_script_class_icons={ "DropLoot": "", "ErraticMovement": "", "FireExtinguisherEnemy": "", +"FourSidedSprite": "", "Ownership": "", "PlayerMovement": "", "RNG": "", "RandomRotationOnReady": "", "SetSpawnedGoalTo": "", "SpawnEveryPeriod": "", +"TeleportToRandomPosition": "", "TeleportToScreenEdge": "" } diff --git a/src/behaviours/graphics/FourSidedSprite.gd b/src/behaviours/graphics/FourSidedSprite.gd new file mode 100644 index 0000000..054849b --- /dev/null +++ b/src/behaviours/graphics/FourSidedSprite.gd @@ -0,0 +1,29 @@ +extends AnimatedSprite +class_name FourSidedSprite + + +const UP_LEFT = -3*PI/4 +const UP_RIGHT = -PI/4 +const DOWN_RIGHT = PI/4 +const DOWN_LEFT = 3*PI/4 + + +func turn(direction: Vector2) -> String: + var angle = direction.angle() + var anime + + if _between(UP_LEFT, angle, UP_RIGHT): + anime = "up" + elif _between(UP_RIGHT, angle, DOWN_RIGHT): + anime = "right" + elif _between(DOWN_RIGHT, angle, DOWN_LEFT): + anime = "down" + else: + anime = "left" + + play(anime) + return animation + + +func _between(m, val, x) -> bool: + return (m < val) && (val <= x) diff --git a/src/behaviours/graphics/FourSidedSprite.tscn b/src/behaviours/graphics/FourSidedSprite.tscn new file mode 100644 index 0000000..aa34d0e --- /dev/null +++ b/src/behaviours/graphics/FourSidedSprite.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/behaviours/graphics/FourSidedSprite.gd" type="Script" id=1] + +[node name="FourSidedSprite" type="AnimatedSprite"] +script = ExtResource( 1 ) diff --git a/src/behaviours/movement/AttractedToMovement.gd b/src/behaviours/movement/AttractedToMovement.gd index f0fb0a3..202bb97 100644 --- a/src/behaviours/movement/AttractedToMovement.gd +++ b/src/behaviours/movement/AttractedToMovement.gd @@ -2,6 +2,7 @@ extends Node class_name AttractedToMovement +signal moving_in_direction(direction) signal touching_goal signal goal_reached @@ -19,6 +20,7 @@ var _goal_reached_triggered: bool = false func move(): var direction: Vector2 = (goal.global_position - parent.global_position).normalized() + emit_signal("moving_in_direction", direction) var _motion: Vector2 = parent.move_and_slide(direction * movement_per_second, Vector2.ZERO) for slide_no in parent.get_slide_count(): var slide = parent.get_slide_collision(slide_no) diff --git a/src/behaviours/movement/TeleportToRandomPosition.gd b/src/behaviours/movement/TeleportToRandomPosition.gd new file mode 100644 index 0000000..490a829 --- /dev/null +++ b/src/behaviours/movement/TeleportToRandomPosition.gd @@ -0,0 +1,33 @@ +extends Node +class_name TeleportToScreenEdge + + +signal teleported(to) + + +export var bounds: Vector2 + + +onready var parent = get_parent() +onready var rng = get_tree().root.get_node("Game/RNG").rng + + +func teleport(): + var random = rng.randi_range(1, 4) + + var new_position + if random == 1: + # Left + new_position = Vector2(0, rng.randf_range(0, bounds.y)) + elif random == 2: + # Right + new_position = Vector2(bounds.x, rng.randf_range(0, bounds.y)) + elif random == 3: + # Top + new_position = Vector2(rng.randf_range(0, bounds.x), 0) + else: + # Bottom + new_position = Vector2(rng.randf_range(0, bounds.y), bounds.y) + + parent.set_position(new_position) + emit_signal("teleported", parent.position) diff --git a/src/behaviours/movement/TeleportToRandomPosition.tscn b/src/behaviours/movement/TeleportToRandomPosition.tscn new file mode 100644 index 0000000..2d95719 --- /dev/null +++ b/src/behaviours/movement/TeleportToRandomPosition.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/behaviours/movement/TeleportToScreenEdge.gd" type="Script" id=1] + +[node name="TeleportToRandomPosition" type="Node"] +script = ExtResource( 1 ) diff --git a/src/behaviours/movement/TeleportToScreenEdge.gd b/src/behaviours/movement/TeleportToScreenEdge.gd index 490a829..38067fd 100644 --- a/src/behaviours/movement/TeleportToScreenEdge.gd +++ b/src/behaviours/movement/TeleportToScreenEdge.gd @@ -1,5 +1,5 @@ extends Node -class_name TeleportToScreenEdge +class_name TeleportToRandomPosition signal teleported(to) @@ -13,21 +13,10 @@ onready var rng = get_tree().root.get_node("Game/RNG").rng func teleport(): - var random = rng.randi_range(1, 4) - - var new_position - if random == 1: - # Left - new_position = Vector2(0, rng.randf_range(0, bounds.y)) - elif random == 2: - # Right - new_position = Vector2(bounds.x, rng.randf_range(0, bounds.y)) - elif random == 3: - # Top - new_position = Vector2(rng.randf_range(0, bounds.x), 0) - else: - # Bottom - new_position = Vector2(rng.randf_range(0, bounds.y), bounds.y) + var new_position = Vector2( + rng.randf_range(0, bounds.x), + rng.randf_range(0, bounds.y) + ) parent.set_position(new_position) emit_signal("teleported", parent.position) diff --git a/src/entities/enemies/ChaserEnemy.tscn b/src/entities/enemies/ChaserEnemy.tscn new file mode 100644 index 0000000..fbde14d --- /dev/null +++ b/src/entities/enemies/ChaserEnemy.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://src/entities/enemies/EnemySnowmanLeft.png" type="Texture" id=1] +[ext_resource path="res://src/behaviours/movement/ErraticMovement.tscn" type="PackedScene" id=2] +[ext_resource path="res://src/behaviours/movement/AttractedToMovement.tscn" type="PackedScene" id=3] +[ext_resource path="res://src/entities/enemies/AbstractEnemy.tscn" type="PackedScene" id=4] +[ext_resource path="res://FireExtinguisherEnemy.gd" type="Script" id=5] +[ext_resource path="res://src/entities/enemies/EnemySnowmanBack.png" type="Texture" id=6] +[ext_resource path="res://src/entities/enemies/EnemySnowmanFront.png" type="Texture" id=7] +[ext_resource path="res://src/entities/enemies/EnemySnowmanRight.png" type="Texture" id=8] +[ext_resource path="res://src/behaviours/graphics/FourSidedSprite.tscn" type="PackedScene" id=9] + +[sub_resource type="CapsuleShape2D" id=1] +radius = 9.0 +height = 10.0 + +[sub_resource type="SpriteFrames" id=2] +animations = [ { +"frames": [ ExtResource( 1 ) ], +"loop": true, +"name": "left", +"speed": 5.0 +}, { +"frames": [ ExtResource( 8 ) ], +"loop": true, +"name": "right", +"speed": 5.0 +}, { +"frames": [ ExtResource( 6 ) ], +"loop": true, +"name": "up", +"speed": 5.0 +}, { +"frames": [ ExtResource( 7 ) ], +"loop": true, +"name": "down", +"speed": 5.0 +} ] + +[node name="ChaserEnemy" instance=ExtResource( 4 )] +script = ExtResource( 5 ) + +[node name="Shape" type="CollisionShape2D" parent="." index="0"] +shape = SubResource( 1 ) + +[node name="FourSidedSprite" parent="Shape" index="0" instance=ExtResource( 9 )] +frames = SubResource( 2 ) +animation = "down" + +[node name="ErraticMovement" parent="." index="4" instance=ExtResource( 2 )] + +[node name="AttractedToMovement" parent="." index="5" instance=ExtResource( 3 )] + +[connection signal="moving_in_direction" from="AttractedToMovement" to="Shape/FourSidedSprite" method="turn"] diff --git a/src/mechanics/EnemySnowmanBack.png b/src/entities/enemies/EnemySnowmanBack.png similarity index 100% rename from src/mechanics/EnemySnowmanBack.png rename to src/entities/enemies/EnemySnowmanBack.png diff --git a/src/mechanics/EnemySnowmanBack.png.import b/src/entities/enemies/EnemySnowmanBack.png.import similarity index 65% rename from src/mechanics/EnemySnowmanBack.png.import rename to src/entities/enemies/EnemySnowmanBack.png.import index e0133c9..36aecfd 100644 --- a/src/mechanics/EnemySnowmanBack.png.import +++ b/src/entities/enemies/EnemySnowmanBack.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/EnemySnowmanBack.png-b2eed2720f48972b09c43adc35364e67.stex" +path="res://.import/EnemySnowmanBack.png-d689ef59a615a3796d8d5dee024e3fb9.stex" metadata={ "vram_texture": false } [deps] -source_file="res://src/mechanics/EnemySnowmanBack.png" -dest_files=[ "res://.import/EnemySnowmanBack.png-b2eed2720f48972b09c43adc35364e67.stex" ] +source_file="res://src/entities/enemies/EnemySnowmanBack.png" +dest_files=[ "res://.import/EnemySnowmanBack.png-d689ef59a615a3796d8d5dee024e3fb9.stex" ] [params] @@ -20,7 +20,7 @@ compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 flags/repeat=0 -flags/filter=true +flags/filter=false flags/mipmaps=false flags/anisotropic=false flags/srgb=2 diff --git a/src/mechanics/EnemySnowmanFront.png b/src/entities/enemies/EnemySnowmanFront.png similarity index 100% rename from src/mechanics/EnemySnowmanFront.png rename to src/entities/enemies/EnemySnowmanFront.png diff --git a/src/mechanics/EnemySnowmanFront.png.import b/src/entities/enemies/EnemySnowmanFront.png.import similarity index 65% rename from src/mechanics/EnemySnowmanFront.png.import rename to src/entities/enemies/EnemySnowmanFront.png.import index 72c4d8a..8cb6e0a 100644 --- a/src/mechanics/EnemySnowmanFront.png.import +++ b/src/entities/enemies/EnemySnowmanFront.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/EnemySnowmanFront.png-a3abfa69d73157e46639cd3e486ba674.stex" +path="res://.import/EnemySnowmanFront.png-cd9afc4418c9808a8eabdd96966d3a3c.stex" metadata={ "vram_texture": false } [deps] -source_file="res://src/mechanics/EnemySnowmanFront.png" -dest_files=[ "res://.import/EnemySnowmanFront.png-a3abfa69d73157e46639cd3e486ba674.stex" ] +source_file="res://src/entities/enemies/EnemySnowmanFront.png" +dest_files=[ "res://.import/EnemySnowmanFront.png-cd9afc4418c9808a8eabdd96966d3a3c.stex" ] [params] @@ -20,7 +20,7 @@ compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 flags/repeat=0 -flags/filter=true +flags/filter=false flags/mipmaps=false flags/anisotropic=false flags/srgb=2 diff --git a/src/mechanics/EnemySnowmanLeft.png b/src/entities/enemies/EnemySnowmanLeft.png similarity index 100% rename from src/mechanics/EnemySnowmanLeft.png rename to src/entities/enemies/EnemySnowmanLeft.png diff --git a/src/mechanics/EnemySnowmanLeft.png.import b/src/entities/enemies/EnemySnowmanLeft.png.import similarity index 65% rename from src/mechanics/EnemySnowmanLeft.png.import rename to src/entities/enemies/EnemySnowmanLeft.png.import index 7f97d68..3320b0f 100644 --- a/src/mechanics/EnemySnowmanLeft.png.import +++ b/src/entities/enemies/EnemySnowmanLeft.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/EnemySnowmanLeft.png-651743351802fe1f1144983f041aa579.stex" +path="res://.import/EnemySnowmanLeft.png-622396971c521134bfb97a1767ad0b42.stex" metadata={ "vram_texture": false } [deps] -source_file="res://src/mechanics/EnemySnowmanLeft.png" -dest_files=[ "res://.import/EnemySnowmanLeft.png-651743351802fe1f1144983f041aa579.stex" ] +source_file="res://src/entities/enemies/EnemySnowmanLeft.png" +dest_files=[ "res://.import/EnemySnowmanLeft.png-622396971c521134bfb97a1767ad0b42.stex" ] [params] @@ -20,7 +20,7 @@ compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 flags/repeat=0 -flags/filter=true +flags/filter=false flags/mipmaps=false flags/anisotropic=false flags/srgb=2 diff --git a/src/mechanics/EnemySnowmanRight.png b/src/entities/enemies/EnemySnowmanRight.png similarity index 100% rename from src/mechanics/EnemySnowmanRight.png rename to src/entities/enemies/EnemySnowmanRight.png diff --git a/src/mechanics/EnemySnowmanRight.png.import b/src/entities/enemies/EnemySnowmanRight.png.import similarity index 65% rename from src/mechanics/EnemySnowmanRight.png.import rename to src/entities/enemies/EnemySnowmanRight.png.import index d128560..510fbb7 100644 --- a/src/mechanics/EnemySnowmanRight.png.import +++ b/src/entities/enemies/EnemySnowmanRight.png.import @@ -2,15 +2,15 @@ importer="texture" type="StreamTexture" -path="res://.import/EnemySnowmanRight.png-3e7f2a8dafa504a24f600bb4b8857d35.stex" +path="res://.import/EnemySnowmanRight.png-75a99b9b1b6aa0a37e6ab3b171957d06.stex" metadata={ "vram_texture": false } [deps] -source_file="res://src/mechanics/EnemySnowmanRight.png" -dest_files=[ "res://.import/EnemySnowmanRight.png-3e7f2a8dafa504a24f600bb4b8857d35.stex" ] +source_file="res://src/entities/enemies/EnemySnowmanRight.png" +dest_files=[ "res://.import/EnemySnowmanRight.png-75a99b9b1b6aa0a37e6ab3b171957d06.stex" ] [params] @@ -20,7 +20,7 @@ compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 flags/repeat=0 -flags/filter=true +flags/filter=false flags/mipmaps=false flags/anisotropic=false flags/srgb=2 diff --git a/src/entities/enemies/FireExtinguisherEnemy.tscn b/src/entities/enemies/FireExtinguisherEnemy.tscn deleted file mode 100644 index 733b319..0000000 --- a/src/entities/enemies/FireExtinguisherEnemy.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=7 format=2] - -[ext_resource path="res://src/mechanics/White.png" type="Texture" id=1] -[ext_resource path="res://src/behaviours/movement/ErraticMovement.tscn" type="PackedScene" id=2] -[ext_resource path="res://src/behaviours/movement/AttractedToMovement.tscn" type="PackedScene" id=3] -[ext_resource path="res://src/entities/enemies/AbstractEnemy.tscn" type="PackedScene" id=4] -[ext_resource path="res://FireExtinguisherEnemy.gd" type="Script" id=5] - -[sub_resource type="RectangleShape2D" id=1] -extents = Vector2( 16, 16 ) - -[node name="FireExtinguisherEnemy" instance=ExtResource( 4 )] -script = ExtResource( 5 ) - -[node name="Shape" type="CollisionShape2D" parent="." index="0"] -shape = SubResource( 1 ) - -[node name="Sprite" type="Sprite" parent="Shape" index="0"] -texture = ExtResource( 1 ) - -[node name="ErraticMovement" parent="." index="4" instance=ExtResource( 2 )] - -[node name="AttractedToMovement" parent="." index="5" instance=ExtResource( 3 )] diff --git a/src/levels/Game.tscn b/src/levels/Game.tscn index 8d0eaf7..39b02f2 100644 --- a/src/levels/Game.tscn +++ b/src/levels/Game.tscn @@ -8,7 +8,7 @@ [ext_resource path="res://src/levels/Game.gd" type="Script" id=6] [ext_resource path="res://src/ui/TimeSurvived.tscn" type="PackedScene" id=7] [ext_resource path="res://src/mechanics/ScreenEdgeSpawner.tscn" type="PackedScene" id=8] -[ext_resource path="res://src/entities/enemies/FireExtinguisherEnemy.tscn" type="PackedScene" id=9] +[ext_resource path="res://src/entities/enemies/ChaserEnemy.tscn" type="PackedScene" id=9] [ext_resource path="res://src/behaviours/targeting/SetSpawnedGoalTo.tscn" type="PackedScene" id=10] [ext_resource path="res://src/levels/PhaseOneMusic.gd" type="Script" id=11] [ext_resource path="res://src/ui/HealthBar.tscn" type="PackedScene" id=14] @@ -49,7 +49,7 @@ position = Vector2( 596, 268 ) [node name="Fire" parent="PhaseOne/Entities" instance=ExtResource( 3 )] position = Vector2( 640, 320 ) -intensity = 1.0 +intensity = 2.0 [node name="Pickups" type="Node" parent="PhaseOne/Entities"]