diff --git a/game/entities/turret/turret.gd b/game/entities/turret/turret.gd new file mode 100644 index 0000000..2efb821 --- /dev/null +++ b/game/entities/turret/turret.gd @@ -0,0 +1,80 @@ +@tool +class_name Turret +extends Node2D + + +enum Direction { + Left, + Right, +} + + +const ANIMATION_IDLE = "idle" +const ANIMATION_SHOOT = "shoot" + +const SHOT_FRAME = 3 + + +@export_range(0.0, 60.0) var shoot_delay := 3.0 + +@export var direction := Direction.Left: + set(value): + direction = value + if is_node_ready(): + _update_direction() + + +@onready var left_sprite : AnimatedSprite2D = $LeftSprite +@onready var right_sprite : AnimatedSprite2D = $RightSprite + +@onready var left_muzzle : Node2D = $LeftMuzzle +@onready var right_muzzle : Node2D = $RightMuzzle + +@onready var shoot_timer : Timer = $ShootTimer + + +var _current_sprite : AnimatedSprite2D +var _current_muzzle : Node2D + + +func _ready() -> void: + left_sprite.hide() + right_sprite.hide() + _update_direction() + if not Engine.is_editor_hint(): + shoot_timer.start(shoot_delay) + + +func _shoot() -> void: + print("Shot") + + +func _update_direction() -> void: + if _current_sprite: + _current_sprite.hide() + match direction: + Direction.Left: + _current_sprite = left_sprite + _current_muzzle = left_muzzle + Direction.Right: + _current_sprite = right_sprite + _current_muzzle = right_muzzle + _current_sprite.show() + + +func _on_left_sprite_animation_finished() -> void: + left_sprite.play(ANIMATION_IDLE) + + +func _on_right_sprite_animation_finished() -> void: + right_sprite.play(ANIMATION_IDLE) + + +func _on_shoot_timer_timeout() -> void: + _current_sprite.play(ANIMATION_SHOOT) + SoundManager.play_sfx_stream(SoundManager.sfx_stream_turret_shot, global_position) + + +func _on_sprite_frame_changed() -> void: + if _current_sprite.frame == SHOT_FRAME: + _shoot() diff --git a/game/entities/turret/turret.gd.uid b/game/entities/turret/turret.gd.uid new file mode 100644 index 0000000..5e9b484 --- /dev/null +++ b/game/entities/turret/turret.gd.uid @@ -0,0 +1 @@ +uid://cpcawuflstr35 diff --git a/game/entities/turret/turret.tscn b/game/entities/turret/turret.tscn new file mode 100644 index 0000000..d0b7239 --- /dev/null +++ b/game/entities/turret/turret.tscn @@ -0,0 +1,170 @@ +[gd_scene format=3 uid="uid://dn3x1qj88r8pn"] + +[ext_resource type="Script" uid="uid://cpcawuflstr35" path="res://game/entities/turret/turret.gd" id="1_t2kwx"] +[ext_resource type="Texture2D" uid="uid://drbm7sgovja7y" path="res://images/entities/turret.png" id="2_dk6qj"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xc2wu"] +atlas = ExtResource("2_dk6qj") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xyas7"] +atlas = ExtResource("2_dk6qj") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5ypow"] +atlas = ExtResource("2_dk6qj") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jpkta"] +atlas = ExtResource("2_dk6qj") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ofwyn"] +atlas = ExtResource("2_dk6qj") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1lhwr"] +atlas = ExtResource("2_dk6qj") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ep464"] +atlas = ExtResource("2_dk6qj") +region = Rect2(192, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_anymp"] +atlas = ExtResource("2_dk6qj") +region = Rect2(224, 0, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_t2kwx"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xc2wu") +}], +"loop": 1, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xyas7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5ypow") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jpkta") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ofwyn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1lhwr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ep464") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_anymp") +}], +"loop": 0, +"name": &"shoot", +"speed": 10.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_dk6qj"] +atlas = ExtResource("2_dk6qj") +region = Rect2(0, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yfd5k"] +atlas = ExtResource("2_dk6qj") +region = Rect2(32, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ch0l6"] +atlas = ExtResource("2_dk6qj") +region = Rect2(64, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2od74"] +atlas = ExtResource("2_dk6qj") +region = Rect2(96, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o0sii"] +atlas = ExtResource("2_dk6qj") +region = Rect2(128, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bw4r7"] +atlas = ExtResource("2_dk6qj") +region = Rect2(160, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b3apy"] +atlas = ExtResource("2_dk6qj") +region = Rect2(192, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_viadk"] +atlas = ExtResource("2_dk6qj") +region = Rect2(224, 32, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_dk6qj"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_dk6qj") +}], +"loop": 1, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_yfd5k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ch0l6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2od74") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o0sii") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bw4r7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b3apy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_viadk") +}], +"loop": 0, +"name": &"shoot", +"speed": 10.0 +}] + +[node name="Turret" type="Node2D" unique_id=328367237] +script = ExtResource("1_t2kwx") +shoot_delay = null + +[node name="LeftSprite" type="AnimatedSprite2D" parent="." unique_id=1558853615] +position = Vector2(0, -16) +sprite_frames = SubResource("SpriteFrames_t2kwx") +animation = &"idle" + +[node name="RightSprite" type="AnimatedSprite2D" parent="." unique_id=664817745] +visible = false +sprite_frames = SubResource("SpriteFrames_dk6qj") +animation = &"shoot" + +[node name="LeftMuzzle" type="Node2D" parent="." unique_id=1708157273] +position = Vector2(-12, -19) + +[node name="RightMuzzle" type="Node2D" parent="." unique_id=1799037147] +position = Vector2(12, -19) + +[node name="ShootTimer" type="Timer" parent="." unique_id=1043641466] + +[connection signal="animation_finished" from="LeftSprite" to="." method="_on_left_sprite_animation_finished"] +[connection signal="frame_changed" from="LeftSprite" to="." method="_on_sprite_frame_changed"] +[connection signal="animation_finished" from="RightSprite" to="." method="_on_right_sprite_animation_finished"] +[connection signal="sprite_frames_changed" from="RightSprite" to="." method="_on_sprite_frame_changed"] +[connection signal="timeout" from="ShootTimer" to="." method="_on_shoot_timer_timeout"] diff --git a/game/levels/abstract_level.tscn b/game/levels/abstract_level.tscn index f8fe00d..c9def07 100644 --- a/game/levels/abstract_level.tscn +++ b/game/levels/abstract_level.tscn @@ -1199,6 +1199,8 @@ script = ExtResource("1_o2mui") [node name="TileMapLayer" type="TileMapLayer" parent="." unique_id=502099522] tile_set = SubResource("TileSet_71ysb") +[node name="Turrets" type="Node2D" parent="." unique_id=491073452] + [node name="Dangers" type="Node2D" parent="." unique_id=608961351] [node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1125559156] diff --git a/game/levels/test_level.tscn b/game/levels/test_level.tscn index 68f7b36..328ea76 100644 --- a/game/levels/test_level.tscn +++ b/game/levels/test_level.tscn @@ -1,9 +1,10 @@ [gd_scene format=4 uid="uid://cuig5x5fd47hs"] [ext_resource type="PackedScene" uid="uid://hdnty666fw1h" path="res://game/levels/abstract_level.tscn" id="1_46m3m"] +[ext_resource type="PackedScene" uid="uid://dn3x1qj88r8pn" path="res://game/entities/turret/turret.tscn" id="2_giiqr"] [ext_resource type="PackedScene" uid="uid://dxqq07mde0b4a" path="res://game/entities/danger/danger.tscn" id="2_yeikn"] -[sub_resource type="ViewportTexture" id="ViewportTexture_yeikn"] +[sub_resource type="ViewportTexture" id="ViewportTexture_80l8l"] viewport_path = NodePath("CanvasLayer/CodeViewport") [node name="TestLevel" unique_id=1001045799 instance=ExtResource("1_46m3m")] @@ -16,6 +17,10 @@ position = Vector2(0, -38) [node name="TileMapLayer" parent="." index="1" unique_id=502099522] tile_map_data = PackedByteArray("AAAMAP//AAAFAAoAAAAMAP7/AAALAAYAAAAMAP3/AAAIAAYAAAAMAPz/AAAKAAYAAAAMAPv/AAADAAYAAAAMAPr/AAAGAAYAAAAMAPn/AAABAAYAAAAMAPj/AAAIAAYAAAAMAPf/AAAFAAYAAAAMAPb/AAAIAAYAAAAMAPX/AAALAAYAAAAMAPT/AAALAAYAAAAMAPP/AAADAAYAAAAMAPL/AAACAAYAAAAMAPH/AAAFAAYAAAAMAPD/AAABAAYAAAAAAPn/AAADAAQAAAAAAPj/AAAKAAYAAAAAAPf/AAACAAYAAAAAAPb/AAADAAYAAAAAAPX/AAAJAAYAAAAAAPT/AAADAAYAAAAAAPP/AAAIAAYAAAAAAPL/AAAKAAYAAAAAAPH/AAAGAAYAAAAAAPD/AAAJAAYAAAAAAO//AAAJAAYAAAD0////AAAGAAcAAAD0//7/AAAGAAYAAAD0//3/AAABAAYAAAD0//z/AAAGAAYAAAD0//v/AAAFAAYAAAD0//r/AAAHAAYAAAD0//n/AAAHAAYAAAD0//j/AAACAAYAAAD0//f/AAAEAAYAAAD0//b/AAABAAYAAAD0//X/AAABAAYAAAD0//T/AAAIAAYAAAD0//P/AAALAAYAAAD0//L/AAAFAAYAAAD0//H/AAAGAAYAAAD0//D/AAAKAAYAAAD0/+//AAAGAAYAAAD0/+7/AAAKAAYAAAD0/+3/AAAJAAYAAAD0/+z/AAALAAYAAAD0/+v/AAAAAAYAAAD0/+r/AAAIAAYAAAD0/+n/AAAFAAYAAAD0/+j/AAAIAAYAAAD0/+b/AAAEAAYAAAD0/+f/AAADAAYAAAAMAO//AAAIAAYAAAAMAO7/AAACAAYAAAAMAO3/AAAHAAYAAAAMAOz/AAAJAAYAAAAMAOv/AAAFAAYAAAAMAOr/AAALAAYAAAAMAOn/AAADAAYAAAAMAOj/AAAGAAYAAAAMAOf/AAAFAAYAAAAAAO7/AAABAAYAAAAAAO3/AAALAAYAAAAAAOz/AAAKAAYAAAAAAOv/AAAIAAYAAAAAAOr/AAADAAYAAAAAAOn/AAAEAAYAAAAAAOj/AAACAAYAAAAAAOf/AAAAAAYAAAAAAOb/AAAEAAYAAAAMAOb/AAAFAAYAAAAMAOX/AAAJAAgAAAANAOX/AAAIAAUAAAAOAOX/AAAAAAUAAAAPAOX/AAACAAUAAAAQAOX/AAAAAAUAAAARAOX/AAAHAAUAAAASAOX/AAAHAAUAAAATAOX/AAACAAUAAAAUAOX/AAAKAAUAAAAVAOX/AAAKAAUAAAAWAOX/AAAGAAUAAAAXAOX/AAALAAUAAAAYAOX/AAAKAAUAAAAZAOX/AAAAAAUAAAAaAOX/AAADAAUAAAAbAOX/AAAFAAUAAAD0/+X/AAAKAAkAAADz/+X/AAAFAAUAAADy/+X/AAAGAAUAAADx/+X/AAAJAAUAAADw/+X/AAAHAAUAAADv/+X/AAABAAUAAADu/+X/AAAIAAUAAADt/+X/AAAKAAUAAADs/+X/AAAHAAUAAADr/+X/AAAHAAUAAADq/+X/AAABAAUAAADp/+X/AAAKAAUAAADo/+X/AAAIAAUAAADn/+X/AAABAAUAAADm/+X/AAALAAUAAADl/+X/AAAHAAUAAAAAAOX/AAAAAAYAAAAAAOT/AAALAAYAAAAAAOP/AAACAAYAAAAAAOL/AAAEAAYAAAAAAOH/AAAHAAYAAAAAAOD/AAADAAYAAAAAAN//AAAGAAYAAAAAAN7/AAAEAAYAAAAAAN3/AAABAAYAAAAAANz/AAAKAAYAAAAAANv/AAADAAYAAAAAANr/AAACAAMAAAALAP//AAAHAAUAAAAKAP//AAAFAAUAAAAJAP//AAACAAUAAAAIAP//AAAIAAUAAAAHAP//AAAAAAUAAAAGAP//AAABAAUAAAAFAP//AAAJAAUAAAAEAP//AAALAAUAAAADAP//AAAEAAUAAAACAP//AAADAAUAAAABAP//AAAJAAUAAAAAAP//AAAJAAUAAAD/////AAAJAAUAAAD+////AAACAAUAAAD9////AAADAAUAAAD8////AAAGAAUAAAD7////AAACAAUAAAD6////AAAIAAUAAAD5////AAACAAUAAAD4////AAAHAAUAAAD3////AAACAAUAAAD2////AAAKAAUAAAD1////AAAEAAUAAADk/+X/AAAGAAUAAADj/+X/AAAKAAUAAADi/+X/AAACAAUAAADh/+X/AAAFAAUAAADg/+X/AAAGAAUAAADf/+X/AAAKAAUAAADe/+X/AAAIAAUAAADd/+X/AAAKAAUAAADc/+X/AAAIAAUAAADb/+X/AAAEAAUAAADa/+X/AAABAAUAAADZ/+X/AAAKAAUAAADY/+X/AAAAAAUAAADX/+X/AAAGAAUAAADW/+X/AAAKAAUAAADV/+X/AAAJAAUAAADU/+X/AAABAAUAAADT/+X/AAAEAAUAAADS/+X/AAALAAUAAADR/+X/AAACAAUAAADQ/+X/AAAJAAUAAADP/+X/AAAAAAUAAADO/+X/AAAJAAUAAADN/+X/AAAAAAUAAADM/+X/AAAKAAUAAADL/+X/AAACAAUAAADK/+X/AAABAAUAAADJ/+X/AAAJAAUAAADI/+X/AAAFAAUAAADH/+X/AAAAAAEAAAAcAOX/AAAFAAUAAAAdAOX/AAACAAUAAAAeAOX/AAAEAAUAAAAfAOX/AAACAAUAAAAgAOX/AAACAAUAAAAhAOX/AAACAAUAAAAiAOX/AAAJAAUAAAAjAOX/AAAGAAUAAAAkAOX/AAAAAAUAAAAlAOX/AAAEAAUAAAAmAOX/AAAKAAUAAAAnAOX/AAAKAAUAAAAoAOX/AAAEAAUAAAApAOX/AAADAAIAAAA=") +[node name="Turret" parent="Turrets" parent_id_path=PackedInt32Array(491073452) index="0" unique_id=328367237 instance=ExtResource("2_giiqr")] +position = Vector2(606, -432) +shoot_delay = 3.0 + [node name="Danger" parent="Dangers" parent_id_path=PackedInt32Array(608961351) index="0" unique_id=554396375 instance=ExtResource("2_yeikn")] offset_left = 89.0 offset_top = -75.0 @@ -23,4 +28,4 @@ offset_right = 189.0 offset_bottom = -55.0 [node name="CodeSprite" parent="CanvasLayer" parent_id_path=PackedInt32Array(1125559156) index="1" unique_id=1152584149] -texture = SubResource("ViewportTexture_yeikn") +texture = SubResource("ViewportTexture_80l8l") diff --git a/game/managers/sound_manager.gd b/game/managers/sound_manager.gd index 6383965..b1eadbe 100644 --- a/game/managers/sound_manager.gd +++ b/game/managers/sound_manager.gd @@ -32,6 +32,7 @@ const MUSIC_BUS = "Music" @export var sfx_stream_jump : AudioStream @export var sfx_stream_land : AudioStream @export var sfx_stream_swing : AudioStream +@export var sfx_stream_turret_shot : AudioStream @export var sfx_stream_wall_jump : AudioStream diff --git a/game/managers/sound_manager.tscn b/game/managers/sound_manager.tscn index 21ad605..2a8ddc2 100644 --- a/game/managers/sound_manager.tscn +++ b/game/managers/sound_manager.tscn @@ -13,6 +13,7 @@ [ext_resource type="AudioStream" uid="uid://byn27t4ualxmi" path="res://sound/sfx/danger.wav" id="6_wyfta"] [ext_resource type="AudioStream" uid="uid://bj6ausg5hyuyg" path="res://sound/sfx/swing.wav" id="7_ab171"] [ext_resource type="AudioStream" uid="uid://33unutlwsika" path="res://sound/sfx/wall_jump.wav" id="8_22ptj"] +[ext_resource type="AudioStream" uid="uid://bnrvkm5wy8wda" path="res://sound/sfx/turret_shot.wav" id="13_814q3"] [node name="SoundManager" type="Node" unique_id=1576371552] process_mode = 3 @@ -34,4 +35,5 @@ sfx_stream_game_over = ExtResource("6_6ll5c") sfx_stream_jump = ExtResource("5_fpnh3") sfx_stream_land = ExtResource("6_22ptj") sfx_stream_swing = ExtResource("7_ab171") +sfx_stream_turret_shot = ExtResource("13_814q3") sfx_stream_wall_jump = ExtResource("8_22ptj") diff --git a/images/entities/turret.png b/images/entities/turret.png new file mode 100644 index 0000000..1b1ff02 --- /dev/null +++ b/images/entities/turret.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61d433abf66213cc06a2100147440baac12b380fa254bd7bb63426b0399c44e7 +size 919 diff --git a/images/entities/turret.png.import b/images/entities/turret.png.import new file mode 100644 index 0000000..b70b3ac --- /dev/null +++ b/images/entities/turret.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drbm7sgovja7y" +path="res://.godot/imported/turret.png-ba75dfab98f8386e3017b4a163d2f8ed.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/entities/turret.png" +dest_files=["res://.godot/imported/turret.png-ba75dfab98f8386e3017b4a163d2f8ed.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 diff --git a/sound/sfx/turret_shot.wav b/sound/sfx/turret_shot.wav new file mode 100644 index 0000000..a2f61ad --- /dev/null +++ b/sound/sfx/turret_shot.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d90b5d19332baebe3521a7d534e8f6de58721242cf83a38a4173cb0f01ee239 +size 73428 diff --git a/sound/sfx/turret_shot.wav.import b/sound/sfx/turret_shot.wav.import new file mode 100644 index 0000000..b1e810f --- /dev/null +++ b/sound/sfx/turret_shot.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bnrvkm5wy8wda" +path="res://.godot/imported/turret_shot.wav-0fa1864632f50584045cec89f250788d.sample" + +[deps] + +source_file="res://sound/sfx/turret_shot.wav" +dest_files=["res://.godot/imported/turret_shot.wav-0fa1864632f50584045cec89f250788d.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2