diff --git a/scenes/enemy.tscn b/scenes/enemy.tscn index 38276ef..9cf0867 100644 --- a/scenes/enemy.tscn +++ b/scenes/enemy.tscn @@ -134,7 +134,7 @@ _data = { &"explode": SubResource("Animation_epg4t") } -[node name="EnemyTest" type="Area2D" unique_id=1433837580 groups=["enemies"]] +[node name="Enemy" type="Area2D" unique_id=1433837580 groups=["enemies"]] script = ExtResource("1_4gyqm") [node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138] diff --git a/scenes/enemy_chicken.gd b/scenes/enemy_chicken.gd new file mode 100644 index 0000000..641c9d1 --- /dev/null +++ b/scenes/enemy_chicken.gd @@ -0,0 +1,57 @@ +extends Area2D + +var bullet_scene = preload("res://scenes/enemy_bullet.tscn") +var start_pos = Vector2.ZERO +var speed = 0 +var tween_speed: float = 1.4 + +var exploding = false + +var enemy_move_aggression = randf_range(5, 20) +var enemy_shoot_aggression = randf_range(4, 20) + +@onready var screensize = get_viewport_rect().size + + +func start(pos): + speed = 0 + position = Vector2(pos.x, -pos.y) + start_pos = pos + await get_tree().create_timer(randf_range(0.25, 0.55)).timeout + var tween = create_tween().set_trans(Tween.TRANS_BACK) + tween.tween_property(self, "position:y", start_pos.y, tween_speed) + await tween.finished + $MoveTimer.wait_time = enemy_move_aggression + $MoveTimer.start() + $ShootTimer.wait_time = enemy_shoot_aggression + $ShootTimer.start() + + +func _on_timer_timeout() -> void: + speed = randf_range(75, 100) + +func _on_shoot_timer_timeout(): + var b = bullet_scene.instantiate() + get_tree().root.add_child(b) + b.start(position) + $ShootTimer.wait_time = randf_range(4, 20) + $ShootTimer.start() + +func _process(delta): + position.y += speed * delta + if position.y > screensize.y + 32: + start(start_pos) + + +func explode(): + if exploding: return + exploding = true + print_debug("Enemy explode!") + EventBus.enemy_hit.emit(5) + speed = 0 + #$AnimationPlayer.play("explode") + #set_deferred("monitoring", false) + #await $AnimationPlayer.animation_finished + queue_free() + EventBus.enemy_died.emit() + diff --git a/scenes/enemy_chicken.gd.uid b/scenes/enemy_chicken.gd.uid new file mode 100644 index 0000000..1a642ba --- /dev/null +++ b/scenes/enemy_chicken.gd.uid @@ -0,0 +1 @@ +uid://i0r17jo6838m diff --git a/scenes/enemy_chicken.tscn b/scenes/enemy_chicken.tscn new file mode 100644 index 0000000..dea1412 --- /dev/null +++ b/scenes/enemy_chicken.tscn @@ -0,0 +1,72 @@ +[gd_scene format=3 uid="uid://drwm27rxxpq3t"] + +[ext_resource type="Script" uid="uid://i0r17jo6838m" path="res://scenes/enemy_chicken.gd" id="1_s7c3p"] +[ext_resource type="Texture2D" uid="uid://cy4jggxmnohbb" path="res://sprites/chicken.png" id="2_h1rgn"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_4gyqm"] +size = Vector2(21, 23) + +[sub_resource type="Animation" id="Animation_h1rgn"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_s7c3p"] +resource_name = "flap" +length = 0.4 +loop_mode = 2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0.0009999999, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [0, 1, 2] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_7ellt"] +_data = { +&"RESET": SubResource("Animation_h1rgn"), +&"flap": SubResource("Animation_s7c3p") +} + +[node name="EnemyChicken" type="Area2D" unique_id=1433837580 groups=["enemies"]] +scale = Vector2(0.7, 0.7) +script = ExtResource("1_s7c3p") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138] +texture = ExtResource("2_h1rgn") +hframes = 3 +region_enabled = true +region_rect = Rect2(0, 0, 84, 32) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1841693239] +scale = Vector2(1.5384617, 1.5384617) +shape = SubResource("RectangleShape2D_4gyqm") + +[node name="MoveTimer" type="Timer" parent="." unique_id=1928257014] +one_shot = true + +[node name="ShootTimer" type="Timer" parent="." unique_id=1985644907] +one_shot = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=702523492] +libraries/ = SubResource("AnimationLibrary_7ellt") +autoplay = &"flap" + +[connection signal="timeout" from="MoveTimer" to="." method="_on_timer_timeout"] +[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"] diff --git a/scenes/enemy_test.tscn b/scenes/enemy_test.tscn deleted file mode 100644 index 0d5da26..0000000 --- a/scenes/enemy_test.tscn +++ /dev/null @@ -1,225 +0,0 @@ -[gd_scene format=3 uid="uid://drwm27rxxpq3t"] - -[ext_resource type="Script" uid="uid://xoihsrr4hw4k" path="res://scenes/enemy.gd" id="1_ainam"] -[ext_resource type="Texture2D" uid="uid://deyu1prtitqcp" path="res://_graphics/Mini Pixel Pack 3/Enemies/Bon_Bon (16 x 16).png" id="2_mo2s0"] -[ext_resource type="Texture2D" uid="uid://h04wm5a27u0" path="res://_graphics/Mini Pixel Pack 3/Effects/Explosion (16 x 16).png" id="3_1yn4p"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_4gyqm"] -size = Vector2(14, 8) - -[sub_resource type="Animation" id="Animation_iifgy"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [ExtResource("2_mo2s0")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D:hframes") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [4] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Sprite2D:frame") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [2] -} - -[sub_resource type="Animation" id="Animation_qi2p4"] -resource_name = "bounce" -loop_mode = 1 -step = 0.05 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [ExtResource("2_mo2s0")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D:hframes") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [4] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Sprite2D:frame") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 0.1023555, 0.2, 0.3, 0.35), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 1, -"values": [2, 1, 0, 3, 0] -} - -[sub_resource type="Animation" id="Animation_epg4t"] -resource_name = "explode" -step = 0.05 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Sprite2D:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 1, -"values": [0, 1, 2, 4, 5] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Sprite2D:texture") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [ExtResource("3_1yn4p")] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("Sprite2D:hframes") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [6] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_3yqyl"] -_data = { -&"RESET": SubResource("Animation_iifgy"), -&"bounce": SubResource("Animation_qi2p4"), -&"explode": SubResource("Animation_epg4t") -} - -[sub_resource type="Animation" id="Animation_ainam"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, 0)] -} - -[sub_resource type="Animation" id="Animation_mo2s0"] -resource_name = "wiggle" -length = 3.0 -loop_mode = 1 -tracks/0/type = "bezier" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:position:x") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"handle_modes": PackedInt32Array(0, 2, 0, 2, 2), -"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 8, -0.16666667, 0, 0.083333336, 0, 0, -0.16666667, 0, 0, 0, -7, -0.083333336, 1.1666667, 0, 0, 0, -0.16666667, -1.1666667, 0, 0), -"times": PackedFloat32Array(0, 1, 1.5, 2, 3) -} -tracks/1/type = "bezier" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:position:y") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"handle_modes": PackedInt32Array(0, 2, 0, 2, 2), -"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 7.162058, -0.16666667, -1.3333334, 0.083333336, 0.6666667, 12, -0.16666667, -2, 0, 0, 8, -0.083333336, 0.6666667, 0, 0, 0, -0.16666667, 1.3333334, 0, 0), -"times": PackedFloat32Array(0, 1, 1.5, 2, 3) -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_1yn4p"] -_data = { -&"RESET": SubResource("Animation_ainam"), -&"wiggle": SubResource("Animation_mo2s0") -} - -[sub_resource type="Curve2D" id="Curve2D_1yn4p"] -_data = { -"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, -13, 0, 0, 0, 0, 30, 9, 0, 0, 0, 0, 10, 23, 8.891694, -1.4366493, -8.891694, 1.4366493, 0, 27, 0, 0, 0, 0, -18, 7, 0, 0, 0, 0, -14, -11, 0, 0, 0, 0, 0, 0) -} -point_count = 8 - -[node name="EnemyTest" type="Area2D" unique_id=1433837580 groups=["enemies"]] -script = ExtResource("1_ainam") - -[node name="Sprite2D" type="Sprite2D" parent="." unique_id=2115910138] -texture = ExtResource("2_mo2s0") -hframes = 4 -frame = 2 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1841693239] -shape = SubResource("RectangleShape2D_4gyqm") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=505814518] -libraries/ = SubResource("AnimationLibrary_3yqyl") -autoplay = &"bounce" - -[node name="AnimationWiggle" type="AnimationPlayer" parent="." unique_id=800893512] -libraries/ = SubResource("AnimationLibrary_1yn4p") -autoplay = &"MoveAlongPath" - -[node name="MoveTimer" type="Timer" parent="." unique_id=1928257014] -one_shot = true - -[node name="ShootTimer" type="Timer" parent="." unique_id=1985644907] -one_shot = true - -[node name="Path2D" type="Path2D" parent="." unique_id=1830415709] -visible = false -curve = SubResource("Curve2D_1yn4p") - -[node name="PathFollow2D" type="PathFollow2D" parent="Path2D" unique_id=1294967533] -visible = false -rotation = -0.7140907 - -[connection signal="timeout" from="MoveTimer" to="." method="_on_timer_timeout"] -[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"] diff --git a/scenes/goose.gd b/scenes/goose.gd index 1d29420..d591948 100644 --- a/scenes/goose.gd +++ b/scenes/goose.gd @@ -1,22 +1,45 @@ extends Area2D +var goose_talking: bool = false func _ready() -> void: EventBus.goose_talk.connect(_on_goose_talk) func _on_goose_talk(frame_index: int): - print("QUACK") - self.show() - $DapperGoose/Bubble.set_frame(frame_index) - var tween = create_tween() - tween.tween_property(self, "position:x", position.x - 50, .5).set_ease(tween.EASE_OUT) - await tween.finished - $DapperGoose/Bubble.show() - await get_tree().create_timer(3).timeout - $DapperGoose/Bubble.hide() - - tween = create_tween() - tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN) - await tween.finished - self.hide() + + #var quacking = get_tree().create_timer(3).timeout + + if goose_talking == false: + print("QUACK") + #goose_talking = true + self.show() + $DapperGoose/Bubble.set_frame(frame_index) + var tween = create_tween() + tween.tween_property(self, "position:x", position.x - 50, .5).set_ease(tween.EASE_OUT) + await tween.finished + $DapperGoose/Bubble.show() + $DapperGoose/Quacking.start() + await $DapperGoose/Quacking.timeout + $DapperGoose/Bubble.hide() + goose_talking = false + tween = create_tween() + tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN) + await tween.finished + self.hide() + + if goose_talking == true: + print("I'm interrupting") + $DapperGoose/Quacking.stop() + $DapperGosse/Bubble.set_frame(frame_index) + $DapperGoose/Quacking.start() + await $DapperGoose/Quacking.timeout + $DapperGoose/Bubble.hide() + goose_talking = false + tween = create_tween() + tween.tween_property(self, "position:x", position.x + 50, .5).set_ease(tween.EASE_IN) + await tween.finished + self.hide() + + + diff --git a/scenes/goose.tscn b/scenes/goose.tscn index 8b22310..17ef3f2 100644 --- a/scenes/goose.tscn +++ b/scenes/goose.tscn @@ -16,7 +16,10 @@ texture = ExtResource("1_wo8sg") [node name="Bubble" type="Sprite2D" parent="DapperGoose" unique_id=2012258473] position = Vector2(-108, -21) texture = ExtResource("3_g7ad0") -hframes = 3 +hframes = 4 + +[node name="Quacking" type="Timer" parent="DapperGoose" unique_id=1836315393] +wait_time = 3.0 [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1718121082] position = Vector2(-18.5, 1) diff --git a/scenes/main.gd b/scenes/main.gd index 3b97277..9224275 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -1,6 +1,5 @@ extends Node2D -var enemy = preload("res://scenes/enemy.tscn") var player = preload("res://scenes/player.tscn") var instance = null var playing: bool = false @@ -78,7 +77,7 @@ func _on_player_died(): # get_tree().call_group("enemies", "queue_free") # $Player.set_process(false) # get_tree().call_group("enemies", "set_process", false) - enemy_win() + EventBus.goose_talk.emit(3) instance.queue_free() game_over.show() await get_tree().create_timer(2).timeout @@ -117,7 +116,7 @@ func new_game(): # Tell the enemies to spawn! #await get_tree().create_timer(.5).timeout - $Wave.spawn_enemies() + $Wave.spawn_enemies() # Tell the game we're playing. @@ -145,6 +144,3 @@ func win_game(): game_over.hide() $CanvasLayer/Title.show() start_button.show() - -func enemy_win() -> void: - print("Enemy win!") diff --git a/scenes/parallax_starfield.tscn b/scenes/parallax_starfield.tscn index 5c27de5..108c1aa 100644 --- a/scenes/parallax_starfield.tscn +++ b/scenes/parallax_starfield.tscn @@ -9,7 +9,7 @@ z_index = -100 self_modulate = Color(0.09185078, 0.09185078, 0.09185078, 1) z_index = 5 scroll_scale = Vector2(-1, 1) -scroll_offset = Vector2(-87, -1) +scroll_offset = Vector2(-88, -1) repeat_size = Vector2(0, 64) autoscroll = Vector2(0, 12) repeat_times = 6 @@ -24,7 +24,7 @@ region_rect = Rect2(0, 0, 64, 64) [node name="Sprite2D2" type="Sprite2D" parent="Foreground" unique_id=197485442] texture_repeat = 2 -position = Vector2(293, 160) +position = Vector2(296, 160) texture = ExtResource("1_b1x6b") flip_h = true hframes = 4 diff --git a/wave.gd b/scenes/wave.gd similarity index 89% rename from wave.gd rename to scenes/wave.gd index 72f0d21..a133424 100644 --- a/wave.gd +++ b/scenes/wave.gd @@ -2,11 +2,11 @@ extends Node2D var wave_count: int = 0 var enemy_count: int = 0 -var enemy = preload("res://scenes/enemy.tscn") +var enemy = preload("res://scenes/enemy_chicken.tscn") @export var wave_complete: bool = false -const COLS: int = 9 +const COLS: int = 5 const ROWS: int = 3 func _ready(): @@ -18,8 +18,8 @@ func spawn_enemies(): print("Enemy Wave: ", wave_count) for x in range(COLS): for y in range(ROWS): - var e = enemy.instantiate() - var pos = Vector2(x * (16 + 8) + 24, 16 * 4 + y * 16) + var e = enemy.instantiate() + var pos = Vector2(x * (28 + 4) + 56, 28 * 2 + y * 38) add_child(e) e.start(pos) enemy_count = ROWS * COLS diff --git a/wave.gd.uid b/scenes/wave.gd.uid similarity index 100% rename from wave.gd.uid rename to scenes/wave.gd.uid diff --git a/scenes/wave.tscn b/scenes/wave.tscn index 41da3a7..7b6be1c 100644 --- a/scenes/wave.tscn +++ b/scenes/wave.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://drf1k1iulvy6f"] -[ext_resource type="Script" uid="uid://cqnotqarpsavn" path="res://wave.gd" id="1_y5ysc"] +[ext_resource type="Script" uid="uid://cqnotqarpsavn" path="res://scenes/wave.gd" id="1_y5ysc"] [node name="Wave" type="Node2D" unique_id=2117861058] script = ExtResource("1_y5ysc") diff --git a/sprites/Screen Recording 2026-02-14 at 00.23.06.mov b/sprites/Screen Recording 2026-02-14 at 00.23.06.mov new file mode 100644 index 0000000..987543f Binary files /dev/null and b/sprites/Screen Recording 2026-02-14 at 00.23.06.mov differ diff --git a/sprites/bubble.png b/sprites/bubble.png index f6c82fe..b406e33 100644 Binary files a/sprites/bubble.png and b/sprites/bubble.png differ diff --git a/sprites/chicken.png b/sprites/chicken.png new file mode 100644 index 0000000..7407a36 Binary files /dev/null and b/sprites/chicken.png differ diff --git a/sprites/chicken.png.import b/sprites/chicken.png.import new file mode 100644 index 0000000..5f683f5 --- /dev/null +++ b/sprites/chicken.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cy4jggxmnohbb" +path="res://.godot/imported/chicken.png-fad9cdcbe0face9d67d25185baea2fd4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/chicken.png" +dest_files=["res://.godot/imported/chicken.png-fad9cdcbe0face9d67d25185baea2fd4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1