From 68cfe89f1dbccdbe8363f1c83937c5b8719c2338 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 9 Aug 2025 21:35:02 +0500 Subject: [PATCH] Peashooters --- assets/animations/zombies/basic.res | Bin 9303 -> 9128 bytes .../animations/zombies/basic_zombie_anim.res | Bin 12737 -> 12896 bytes assets/plants/Aloe.tres | 18 - assets/plants/Cucumber.tres | 23 - assets/plants/Garlic.tres | 18 - assets/plants/Nerdus.tres | 23 - assets/plants/Peashooter.tres | 18 - assets/plants/PotatoMine.tres | 18 - assets/plants/Repeater.tres | 35 - assets/plants/Snipach.tres | 23 - assets/plants/Snowpea.tres | 18 - assets/plants/Spikeweed.tres | 18 - assets/plants/Sunflower.tres | 18 - assets/plants/Threepeater.tres | 18 - assets/plants/Wallnut.tres | 18 - assets/sprites/zombie.tres | 4 +- project.godot | 9 + resources/plants/peashooter.tres | 4 +- resources/zombies/basic.tres | 15 + scenes/levels/standard_level.tscn | 5 +- scenes/plants/peashooter.tscn | 186 +++ scenes/projectiles/pea.tscn | 20 + scenes/zombies/basic.tscn | 1113 +++++++++++++++++ .../plants/peashooter_controller.gd | 33 + .../plants/peashooter_controller.gd.uid | 1 + .../controllers/zombies/basic_controller.gd | 29 + .../zombies/basic_controller.gd.uid | 1 + scripts/components/field_segment_shape.gd | 4 + scripts/components/field_segment_shape.gd.uid | 1 + scripts/components/generic_collider.gd | 15 + scripts/components/generic_collider.gd.uid | 1 + scripts/components/generic_hurtbox.gd | 45 + scripts/components/generic_hurtbox.gd.uid | 1 + scripts/components/mover.gd | 10 + scripts/components/mover.gd.uid | 1 + scripts/components/plant_death_handler.gd | 5 + scripts/components/plant_death_handler.gd.uid | 1 + scripts/components/zombie_death_handler.gd | 5 + .../components/zombie_death_handler.gd.uid | 1 + scripts/entities/entity.gd | 25 +- scripts/level/seedpacket_placer.gd | 7 +- scripts/projectiles/linear_projectile.gd | 18 + scripts/projectiles/linear_projectile.gd.uid | 1 + .../speed_controlled_animation_tree.gd | 5 + .../speed_controlled_animation_tree.gd.uid | 1 + .../speed_controlled_timer.gd | 16 + .../speed_controlled_timer.gd.uid | 1 + 47 files changed, 1571 insertions(+), 279 deletions(-) delete mode 100644 assets/plants/Aloe.tres delete mode 100644 assets/plants/Cucumber.tres delete mode 100644 assets/plants/Garlic.tres delete mode 100644 assets/plants/Nerdus.tres delete mode 100644 assets/plants/Peashooter.tres delete mode 100644 assets/plants/PotatoMine.tres delete mode 100644 assets/plants/Repeater.tres delete mode 100644 assets/plants/Snipach.tres delete mode 100644 assets/plants/Snowpea.tres delete mode 100644 assets/plants/Spikeweed.tres delete mode 100644 assets/plants/Sunflower.tres delete mode 100644 assets/plants/Threepeater.tres delete mode 100644 assets/plants/Wallnut.tres create mode 100644 resources/zombies/basic.tres create mode 100644 scenes/plants/peashooter.tscn create mode 100644 scenes/projectiles/pea.tscn create mode 100644 scenes/zombies/basic.tscn create mode 100644 scripts/components/controllers/plants/peashooter_controller.gd create mode 100644 scripts/components/controllers/plants/peashooter_controller.gd.uid create mode 100644 scripts/components/controllers/zombies/basic_controller.gd create mode 100644 scripts/components/controllers/zombies/basic_controller.gd.uid create mode 100644 scripts/components/field_segment_shape.gd create mode 100644 scripts/components/field_segment_shape.gd.uid create mode 100644 scripts/components/generic_collider.gd create mode 100644 scripts/components/generic_collider.gd.uid create mode 100644 scripts/components/generic_hurtbox.gd create mode 100644 scripts/components/generic_hurtbox.gd.uid create mode 100644 scripts/components/mover.gd create mode 100644 scripts/components/mover.gd.uid create mode 100644 scripts/components/plant_death_handler.gd create mode 100644 scripts/components/plant_death_handler.gd.uid create mode 100644 scripts/components/zombie_death_handler.gd create mode 100644 scripts/components/zombie_death_handler.gd.uid create mode 100644 scripts/projectiles/linear_projectile.gd create mode 100644 scripts/projectiles/linear_projectile.gd.uid create mode 100644 scripts/speed_controlled/speed_controlled_animation_tree.gd create mode 100644 scripts/speed_controlled/speed_controlled_animation_tree.gd.uid create mode 100644 scripts/speed_controlled/speed_controlled_timer.gd create mode 100644 scripts/speed_controlled/speed_controlled_timer.gd.uid diff --git a/assets/animations/zombies/basic.res b/assets/animations/zombies/basic.res index e02f886706a6acc32de96efdb3a6e87b04ffa7e4..80ec4811dfa8e09133570a0f02974f7a28bdd8d9 100644 GIT binary patch literal 9128 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 E0TX0kJ^%m! literal 9303 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 diff --git a/assets/animations/zombies/basic_zombie_anim.res b/assets/animations/zombies/basic_zombie_anim.res index 6ea7db3b2bc89bdc3ff47fc85de479e8f1627a76..7911eac03ee9111cbd6bfa3590c83eddae903f42 100644 GIT binary patch delta 11142 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 ag`9ea9=r~tvy>1_(oHO%jdypid;UM5oE;1R diff --git a/assets/plants/Aloe.tres b/assets/plants/Aloe.tres deleted file mode 100644 index d2229a7..0000000 --- a/assets/plants/Aloe.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bf7vjtufjc8kt"] - -[ext_resource type="Texture2D" uid="uid://d4btl7vqi4v0q" path="res://assets/sprites/plants/aloe.tres" id="1_t4137"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_vw2kg"] -[ext_resource type="PackedScene" uid="uid://bw1w8jp0yeypy" path="res://scenes/entities/plants/aloe.tscn" id="2_6a4ia"] - -[resource] -script = ExtResource("1_vw2kg") -Layer = 1 -DontRegister = false -NameKey = "aloe" -DescriptionKey = "aloe_desc" -Cost = 75.0 -Scene = ExtResource("2_6a4ia") -ReloadTime = 15.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_t4137") -Order = 6 diff --git a/assets/plants/Cucumber.tres b/assets/plants/Cucumber.tres deleted file mode 100644 index 3dca246..0000000 --- a/assets/plants/Cucumber.tres +++ /dev/null @@ -1,23 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://ciewunnfalrbb"] - -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_jrx81"] -[ext_resource type="Texture2D" uid="uid://bt76iudw2qgnv" path="res://assets/sprites/atlases/plants/cumbucer.png" id="1_tdg4d"] -[ext_resource type="PackedScene" uid="uid://cjoyh54cpjla7" path="res://scenes/entities/plants/cucumber.tscn" id="2_0mr6r"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_3gogt"] -atlas = ExtResource("1_tdg4d") -region = Rect2(2, 1, 41, 65) - -[resource] -script = ExtResource("1_jrx81") -Layer = 1 -DontRegister = false -NameKey = "cucumber" -DescriptionKey = "cucumber_desc" -Cost = 75.0 -Scene = ExtResource("2_0mr6r") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = SubResource("AtlasTexture_3gogt") -Order = 8 -metadata/_custom_type_script = "uid://cyenlko1knygw" diff --git a/assets/plants/Garlic.tres b/assets/plants/Garlic.tres deleted file mode 100644 index d821c21..0000000 --- a/assets/plants/Garlic.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://btkkaow4tyw55"] - -[ext_resource type="Texture2D" uid="uid://m8e84blnx7yu" path="res://assets/sprites/plants/garlic.tres" id="1_datic"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_e15gf"] -[ext_resource type="PackedScene" uid="uid://qq0cw8xtcoj3" path="res://scenes/entities/plants/garlic.tscn" id="2_81n0p"] - -[resource] -script = ExtResource("1_e15gf") -Layer = 1 -DontRegister = false -NameKey = "garlic" -DescriptionKey = "garlic_desc" -Cost = 50.0 -Scene = ExtResource("2_81n0p") -ReloadTime = 7.5 -ReloadProgress = 0.0 -Preview = ExtResource("1_datic") -Order = 7 diff --git a/assets/plants/Nerdus.tres b/assets/plants/Nerdus.tres deleted file mode 100644 index 90aeb8d..0000000 --- a/assets/plants/Nerdus.tres +++ /dev/null @@ -1,23 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://8edvnmwu4tyn"] - -[ext_resource type="Texture2D" uid="uid://b06e8xhdy77d1" path="res://assets/sprites/atlases/plants/nerdus.png" id="1_of51r"] -[ext_resource type="PackedScene" uid="uid://k5aj2slxar7w" path="res://scenes/entities/plants/nerdus.tscn" id="2_0i6qf"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_30qd0"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_ivp5w"] -atlas = ExtResource("1_of51r") -region = Rect2(477, 9, 60, 59) - -[resource] -script = ExtResource("3_30qd0") -Layer = 1 -DontRegister = false -NameKey = "nerdus" -DescriptionKey = "nerdus_desc" -Cost = 125.0 -Scene = ExtResource("2_0i6qf") -ReloadTime = 10.0 -ReloadProgress = 0.0 -Preview = SubResource("AtlasTexture_ivp5w") -Order = 10 -metadata/_custom_type_script = "uid://cyenlko1knygw" diff --git a/assets/plants/Peashooter.tres b/assets/plants/Peashooter.tres deleted file mode 100644 index cf3a204..0000000 --- a/assets/plants/Peashooter.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://c8rr1dc7mjr3d"] - -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_amvh8"] -[ext_resource type="Texture2D" uid="uid://ot1n4nval86w" path="res://assets/sprites/plants/peashooter.tres" id="1_rnq6r"] -[ext_resource type="PackedScene" uid="uid://dy41q1kxray5t" path="res://scenes/entities/plants/peashooter.tscn" id="1_rqf2x"] - -[resource] -script = ExtResource("1_amvh8") -Layer = 1 -DontRegister = false -NameKey = "peashooter" -DescriptionKey = "peashooter_desc" -Cost = 75.0 -Scene = ExtResource("1_rqf2x") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_rnq6r") -Order = 0 diff --git a/assets/plants/PotatoMine.tres b/assets/plants/PotatoMine.tres deleted file mode 100644 index 825de86..0000000 --- a/assets/plants/PotatoMine.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bu25xgjd68gv8"] - -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_33j6b"] -[ext_resource type="Texture2D" uid="uid://bhmnt3x5aj1l8" path="res://assets/sprites/plants/potatomine.tres" id="1_xk2pg"] -[ext_resource type="PackedScene" uid="uid://b5x35v3w2u8dx" path="res://scenes/entities/plants/potato_mine.tscn" id="2_ig2ti"] - -[resource] -script = ExtResource("1_33j6b") -Layer = 1 -DontRegister = false -NameKey = "potatomine" -DescriptionKey = "potatomine_desc" -Cost = 25.0 -Scene = ExtResource("2_ig2ti") -ReloadTime = 25.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_xk2pg") -Order = 3 diff --git a/assets/plants/Repeater.tres b/assets/plants/Repeater.tres deleted file mode 100644 index 85f96ca..0000000 --- a/assets/plants/Repeater.tres +++ /dev/null @@ -1,35 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=10 format=3 uid="uid://b4r1687hg0rf5"] - -[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_6km43"] -[ext_resource type="Texture2D" uid="uid://dhf2opi0brx23" path="res://assets/sprites/gui/almanach/premium_field.tres" id="1_ormja"] -[ext_resource type="PackedScene" uid="uid://bb4ya5qx224ca" path="res://scenes/entities/plants/repeater.tscn" id="2_6km43"] -[ext_resource type="Texture2D" uid="uid://31jc2e7dijas" path="res://assets/sprites/gui/PremiumPlantCard.tres" id="2_8djti"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_e606l"] -[ext_resource type="Script" uid="uid://3m7xks3xq3hl" path="res://scripts/gui/seedpackets/CustomSeedpacketFrame.cs" id="3_qnhmj"] - -[sub_resource type="LabelSettings" id="LabelSettings_2f3e1"] - -[sub_resource type="Resource" id="Resource_87lkl"] -script = ExtResource("3_qnhmj") -frame = ExtResource("2_8djti") -font = SubResource("LabelSettings_2f3e1") -almanachField = ExtResource("1_ormja") -metadata/_custom_type_script = "uid://3m7xks3xq3hl" - -[sub_resource type="AtlasTexture" id="AtlasTexture_qnsfo"] -atlas = ExtResource("1_6km43") -region = Rect2(604, 241, 45, 51) - -[resource] -script = ExtResource("3_e606l") -Layer = 1 -DontRegister = false -NameKey = "repeater" -DescriptionKey = "repeater_desc" -Cost = 175.0 -Scene = ExtResource("2_6km43") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = SubResource("AtlasTexture_qnsfo") -CustomFrame = SubResource("Resource_87lkl") -Order = 12 diff --git a/assets/plants/Snipach.tres b/assets/plants/Snipach.tres deleted file mode 100644 index 501a276..0000000 --- a/assets/plants/Snipach.tres +++ /dev/null @@ -1,23 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://drb8nk0i3oyyl"] - -[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_1eecn"] -[ext_resource type="PackedScene" uid="uid://bmk41n57j7hgx" path="res://scenes/entities/plants/snipach.tscn" id="1_h5ln5"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_u5a4p"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_dgfdr"] -atlas = ExtResource("1_1eecn") -region = Rect2(525, 241, 79, 72) - -[resource] -script = ExtResource("1_u5a4p") -Layer = 1 -DontRegister = false -NameKey = "snipach" -DescriptionKey = "snipach_desc" -Cost = 400.0 -Scene = ExtResource("1_h5ln5") -ReloadTime = 7.5 -ReloadProgress = 0.0 -Preview = SubResource("AtlasTexture_dgfdr") -Order = 11 -metadata/_custom_type_script = "uid://cyenlko1knygw" diff --git a/assets/plants/Snowpea.tres b/assets/plants/Snowpea.tres deleted file mode 100644 index 13bc7d0..0000000 --- a/assets/plants/Snowpea.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://duflq3eexs6m"] - -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_0cpi0"] -[ext_resource type="Texture2D" uid="uid://cu7h8bot6jlug" path="res://assets/sprites/plants/snowpea.tres" id="1_7fyy2"] -[ext_resource type="PackedScene" uid="uid://b7innrovtmf5u" path="res://scenes/entities/plants/snowpea.tscn" id="2_k47h0"] - -[resource] -script = ExtResource("1_0cpi0") -Layer = 1 -DontRegister = false -NameKey = "snowpea" -DescriptionKey = "snowpea_desc" -Cost = 175.0 -Scene = ExtResource("2_k47h0") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_7fyy2") -Order = 5 diff --git a/assets/plants/Spikeweed.tres b/assets/plants/Spikeweed.tres deleted file mode 100644 index 4502b23..0000000 --- a/assets/plants/Spikeweed.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://cas11tg6chiu4"] - -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_0bymo"] -[ext_resource type="Texture2D" uid="uid://baqfahxkcvfe1" path="res://assets/sprites/plants/Spikeweed.tres" id="1_2ol2i"] -[ext_resource type="PackedScene" uid="uid://bdhod5c6o53ha" path="res://scenes/entities/plants/spikeweed.tscn" id="2_iv8de"] - -[resource] -script = ExtResource("1_0bymo") -Layer = 1 -DontRegister = false -NameKey = "spikeweed" -DescriptionKey = "spikeweed_desc" -Cost = 100.0 -Scene = ExtResource("2_iv8de") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_2ol2i") -Order = 4 diff --git a/assets/plants/Sunflower.tres b/assets/plants/Sunflower.tres deleted file mode 100644 index 9c2c30f..0000000 --- a/assets/plants/Sunflower.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://drm42f48urvc4"] - -[ext_resource type="Texture2D" uid="uid://iw75j816gbc" path="res://assets/sprites/plants/sunflower.tres" id="1_8rd5i"] -[ext_resource type="PackedScene" uid="uid://bg7lomiorxo2c" path="res://scenes/entities/plants/sunflower.tscn" id="2_gcyr5"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_vt4jc"] - -[resource] -script = ExtResource("3_vt4jc") -Layer = 1 -DontRegister = false -NameKey = "sunflower" -DescriptionKey = "sunflower_desc" -Cost = 50.0 -Scene = ExtResource("2_gcyr5") -ReloadTime = 5.0 -ReloadProgress = 1.0 -Preview = ExtResource("1_8rd5i") -Order = 1 diff --git a/assets/plants/Threepeater.tres b/assets/plants/Threepeater.tres deleted file mode 100644 index d6348e9..0000000 --- a/assets/plants/Threepeater.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://bnhwg57euiyf5"] - -[ext_resource type="Texture2D" uid="uid://8se1nscal0em" path="res://assets/sprites/plants/threepeater.tres" id="1_hinp6"] -[ext_resource type="PackedScene" uid="uid://eegv1qihfv2q" path="res://scenes/entities/plants/threepeater.tscn" id="2_uqpu0"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_3lugi"] - -[resource] -script = ExtResource("3_3lugi") -Layer = 1 -DontRegister = false -NameKey = "threepeater" -DescriptionKey = "threepeater_desc" -Cost = 275.0 -Scene = ExtResource("2_uqpu0") -ReloadTime = 5.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_hinp6") -Order = 9 diff --git a/assets/plants/Wallnut.tres b/assets/plants/Wallnut.tres deleted file mode 100644 index dc3ab26..0000000 --- a/assets/plants/Wallnut.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://c2e2yj7rgoswi"] - -[ext_resource type="Texture2D" uid="uid://g2oppl54efja" path="res://assets/sprites/plants/Wallnut.tres" id="1_2akap"] -[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="1_27l0t"] -[ext_resource type="PackedScene" uid="uid://bq7imkpr2yqyr" path="res://scenes/entities/plants/wallnut.tscn" id="2_rkn3h"] - -[resource] -script = ExtResource("1_27l0t") -Layer = 1 -DontRegister = false -NameKey = "wallnut" -DescriptionKey = "wallnut_desc" -Cost = 50.0 -Scene = ExtResource("2_rkn3h") -ReloadTime = 20.0 -ReloadProgress = 0.0 -Preview = ExtResource("1_2akap") -Order = 2 diff --git a/assets/sprites/zombie.tres b/assets/sprites/zombie.tres index b1a93a6..e532cad 100644 --- a/assets/sprites/zombie.tres +++ b/assets/sprites/zombie.tres @@ -1,7 +1,7 @@ [gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bwwbkybryi6k0"] -[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_f3kba"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="1_g1iew"] [resource] -atlas = ExtResource("1_f3kba") +atlas = ExtResource("1_g1iew") region = Rect2(129, 104, 45, 88) diff --git a/project.godot b/project.godot index bf1e982..8d3ad66 100644 --- a/project.godot +++ b/project.godot @@ -181,6 +181,15 @@ cursor_right={ locale/translations=PackedStringArray("res://translations/plants.en.translation", "res://translations/plants.ru.translation", "res://translations/zombies.en.translation", "res://translations/zombies.ru.translation", "res://translations/gui.en.translation", "res://translations/gui.ru.translation", "res://translations/rewards.en.translation", "res://translations/rewards.ru.translation") +[layer_names] + +2d_physics/layer_1="Structures" +2d_physics/layer_2="Plants" +2d_physics/layer_3="Zombies" +2d_physics/layer_4="Projectiles" + [rendering] textures/canvas_textures/default_texture_filter=0 +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/resources/plants/peashooter.tres b/resources/plants/peashooter.tres index abf2879..d448189 100644 --- a/resources/plants/peashooter.tres +++ b/resources/plants/peashooter.tres @@ -1,7 +1,8 @@ -[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=3 format=3 uid="uid://bf8u3nwwn5e1d"] +[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=4 format=3 uid="uid://bf8u3nwwn5e1d"] [ext_resource type="Texture2D" uid="uid://ot1n4nval86w" path="res://assets/sprites/plants/peashooter.tres" id="1_o0b0s"] [ext_resource type="Script" uid="uid://dtjdfji87kybn" path="res://scripts/resources/entity_resource.gd" id="2_jwk2v"] +[ext_resource type="PackedScene" uid="uid://bxs34adppsh5e" path="res://scenes/plants/peashooter.tscn" id="2_n78qv"] [resource] script = ExtResource("2_jwk2v") @@ -9,5 +10,6 @@ preview = ExtResource("1_o0b0s") cost = 75.0 recharge_time = 5.0 initial_recharge_percent = 1.0 +scene = ExtResource("2_n78qv") order = 0 metadata/_custom_type_script = "uid://dtjdfji87kybn" diff --git a/resources/zombies/basic.tres b/resources/zombies/basic.tres new file mode 100644 index 0000000..10a9b50 --- /dev/null +++ b/resources/zombies/basic.tres @@ -0,0 +1,15 @@ +[gd_resource type="Resource" script_class="SeedpacketResource" load_steps=4 format=3 uid="uid://cbooo6i1rifb7"] + +[ext_resource type="Texture2D" uid="uid://dunlsp8tx7a4w" path="res://assets/sprites/zombies/Зондби.png" id="1_c2mq3"] +[ext_resource type="Script" uid="uid://dtjdfji87kybn" path="res://scripts/resources/entity_resource.gd" id="1_k277m"] +[ext_resource type="PackedScene" uid="uid://dunih4xhnupy5" path="res://scenes/zombies/basic.tscn" id="2_l6de4"] + +[resource] +script = ExtResource("1_k277m") +preview = ExtResource("1_c2mq3") +cost = 1.0 +recharge_time = 5.0 +initial_recharge_percent = 1.0 +scene = ExtResource("2_l6de4") +order = 0 +metadata/_custom_type_script = "uid://dtjdfji87kybn" diff --git a/scenes/levels/standard_level.tscn b/scenes/levels/standard_level.tscn index 809492b..e4af382 100644 --- a/scenes/levels/standard_level.tscn +++ b/scenes/levels/standard_level.tscn @@ -25,13 +25,16 @@ position = Vector2(305, 76) script = ExtResource("1_4dbyi") metadata/_edit_lock_ = true -[node name="SeedpacketPlacer" type="CanvasGroup" parent="Game" node_paths=PackedStringArray("entity_container")] +[node name="SeedpacketPlacer" type="Node2D" parent="Game" node_paths=PackedStringArray("entity_container")] script = ExtResource("4_5r585") entity_container = NodePath("../../LayeredEntityContainer") [node name="Plants" type="Node2D" parent="Game"] unique_name_in_owner = true +[node name="Projectiles" type="Node2D" parent="Game"] +unique_name_in_owner = true + [node name="Background" type="CanvasLayer" parent="Game"] layer = -10 follow_viewport_enabled = true diff --git a/scenes/plants/peashooter.tscn b/scenes/plants/peashooter.tscn new file mode 100644 index 0000000..871c0e6 --- /dev/null +++ b/scenes/plants/peashooter.tscn @@ -0,0 +1,186 @@ +[gd_scene load_steps=23 format=3 uid="uid://bxs34adppsh5e"] + +[ext_resource type="Texture2D" uid="uid://cksryh4w5dbbx" path="res://assets/sprites/atlases/plants/peashooter.png" id="2_4l0yo"] +[ext_resource type="Script" uid="uid://bwdvaov8sse4k" path="res://scripts/entities/entity.gd" id="2_pk084"] +[ext_resource type="Script" uid="uid://be5rfbbl5xgeh" path="res://scripts/components/generic_collider.gd" id="3_2lnl7"] +[ext_resource type="Script" uid="uid://cbmavbe4xd0j2" path="res://scripts/speed_controlled/speed_controlled_animation_tree.gd" id="3_gkdjr"] +[ext_resource type="Script" uid="uid://cbudgx741oxtc" path="res://scripts/components/generic_hurtbox.gd" id="5_gkdjr"] +[ext_resource type="Script" uid="uid://cjulv0bt6deps" path="res://scripts/components/field_segment_shape.gd" id="6_tf8ra"] +[ext_resource type="Script" uid="uid://b0ka8lb5kl1fd" path="res://scripts/components/controllers/plants/peashooter_controller.gd" id="8_0ridr"] +[ext_resource type="Script" uid="uid://d17rkta3k73jx" path="res://scripts/components/plant_death_handler.gd" id="8_6jrfv"] + +[sub_resource type="Animation" id="Animation_tf8ra"] +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_gkdjr"] +resource_name = "idle" +length = 0.833342 +loop_mode = 1 +step = 0.0833333 +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.0833333, 0.166667, 0.25, 0.333333, 0.416667, 0.5, 0.583333, 0.666667, 0.75), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +} + +[sub_resource type="Animation" id="Animation_4l0yo"] +resource_name = "shoot" +length = 0.666675 +step = 0.0833333 +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.0833333, 0.166667, 0.25, 0.333333, 0.416667, 0.5, 0.583333), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [10, 11, 12, 13, 14, 15, 16, 17] +} +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Controller") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.333333), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"shoot" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0ridr"] +_data = { +&"RESET": SubResource("Animation_tf8ra"), +&"idle": SubResource("Animation_gkdjr"), +&"shoot": SubResource("Animation_4l0yo") +} + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_0ridr"] +animation = &"idle" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6jrfv"] +animation = &"shoot" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_0l7qe"] +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_3wvhk"] +advance_mode = 2 +advance_expression = "is_shooting()" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_hlvcn"] +switch_mode = 2 +advance_mode = 2 +advance_expression = "is_shooting() == false" + +[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_1h4ri"] +states/idle/node = SubResource("AnimationNodeAnimation_0ridr") +states/idle/position = Vector2(415, 106) +states/shoot/node = SubResource("AnimationNodeAnimation_6jrfv") +states/shoot/position = Vector2(649, 107) +transitions = ["Start", "idle", SubResource("AnimationNodeStateMachineTransition_0l7qe"), "idle", "shoot", SubResource("AnimationNodeStateMachineTransition_3wvhk"), "shoot", "idle", SubResource("AnimationNodeStateMachineTransition_hlvcn")] + +[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_0l7qe"] + +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_3wvhk"] +graph_offset = Vector2(-541.787, 73.4125) +nodes/main/node = SubResource("AnimationNodeStateMachine_1h4ri") +nodes/main/position = Vector2(-140, 160) +nodes/speed/node = SubResource("AnimationNodeTimeScale_0l7qe") +nodes/speed/position = Vector2(140, 140) +node_connections = [&"output", 0, &"speed", &"speed", 0, &"main"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_6jrfv"] +size = Vector2(26, 40) + +[sub_resource type="SegmentShape2D" id="SegmentShape2D_gkdjr"] +b = Vector2(0, 0) + +[node name="Peashooter" type="Node2D" groups=["Plants"]] +script = ExtResource("2_pk084") +max_hp = 30.0 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_4l0yo") +hframes = 10 +vframes = 2 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_0ridr") +} + +[node name="AnimationTree" type="AnimationTree" parent="."] +tree_root = SubResource("AnimationNodeBlendTree_3wvhk") +advance_expression_base_node = NodePath("../Controller") +anim_player = NodePath("../AnimationPlayer") +parameters/speed/scale = 1.0 +script = ExtResource("3_gkdjr") + +[node name="GenericCollider" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 +monitoring = false +script = ExtResource("3_2lnl7") +metadata/_custom_type_script = "uid://be5rfbbl5xgeh" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="GenericCollider"] +position = Vector2(0, 6) +shape = SubResource("RectangleShape2D_6jrfv") + +[node name="GenericHurtbox" type="Area2D" parent="."] +position = Vector2(17, -4) +collision_layer = 0 +collision_mask = 4 +monitorable = false +script = ExtResource("5_gkdjr") +lookup_layers = 1 +metadata/_custom_type_script = "uid://cbudgx741oxtc" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="GenericHurtbox"] +shape = SubResource("SegmentShape2D_gkdjr") +script = ExtResource("6_tf8ra") + +[node name="Controller" type="Node" parent="." node_paths=PackedStringArray("projectile_transform")] +script = ExtResource("8_0ridr") +projectile_transform = NodePath("../ShootMarker") + +[node name="Timer" type="Timer" parent="Controller"] +wait_time = 1.5 +one_shot = true + +[node name="ShootMarker" type="Marker2D" parent="."] +position = Vector2(17, -4) + +[node name="DeathHandler" type="Node" parent="."] +script = ExtResource("8_6jrfv") + +[connection signal="killed" from="." to="DeathHandler" method="_on_killed"] +[connection signal="collision_end" from="GenericHurtbox" to="Controller" method="_on_generic_hurtbox_collision_end"] +[connection signal="collision_start" from="GenericHurtbox" to="Controller" method="_on_generic_hurtbox_collision_start"] +[connection signal="timeout" from="Controller/Timer" to="Controller" method="_on_timer_timeout"] diff --git a/scenes/projectiles/pea.tscn b/scenes/projectiles/pea.tscn new file mode 100644 index 0000000..d647bc5 --- /dev/null +++ b/scenes/projectiles/pea.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://ciqhjwh4sfe3u"] + +[ext_resource type="Script" uid="uid://fgdhvaq4dek2" path="res://scripts/projectiles/linear_projectile.gd" id="1_qt432"] +[ext_resource type="Texture2D" uid="uid://dq0mul65hevtt" path="res://assets/sprites/plants/pea.tres" id="2_inkwd"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_osqrk"] +radius = 6.0 + +[node name="Pea" type="Area2D"] +collision_layer = 8 +collision_mask = 4 +script = ExtResource("1_qt432") +speed = 300.0 +damage = 10.0 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_inkwd") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_osqrk") diff --git a/scenes/zombies/basic.tscn b/scenes/zombies/basic.tscn new file mode 100644 index 0000000..d81499b --- /dev/null +++ b/scenes/zombies/basic.tscn @@ -0,0 +1,1113 @@ +[gd_scene load_steps=53 format=3 uid="uid://dunih4xhnupy5"] + +[ext_resource type="Texture2D" uid="uid://dacgbwohpmeed" path="res://assets/sprites/zombies/basic.png" id="1_jrplh"] +[ext_resource type="AnimationLibrary" uid="uid://ceb3khu7rwgy8" path="res://assets/animations/zombies/basic.res" id="2_yccea"] +[ext_resource type="Script" uid="uid://cbmavbe4xd0j2" path="res://scripts/speed_controlled/speed_controlled_animation_tree.gd" id="3_qnnv5"] +[ext_resource type="Script" uid="uid://be5rfbbl5xgeh" path="res://scripts/components/generic_collider.gd" id="3_qoqrk"] +[ext_resource type="Script" uid="uid://bdacurei5fp02" path="res://scripts/components/mover.gd" id="3_yccea"] +[ext_resource type="Script" uid="uid://cbudgx741oxtc" path="res://scripts/components/generic_hurtbox.gd" id="4_20equ"] +[ext_resource type="Script" uid="uid://bwdvaov8sse4k" path="res://scripts/entities/entity.gd" id="4_moyxp"] +[ext_resource type="Script" uid="uid://bg88vb74hinkj" path="res://scripts/components/controllers/zombies/basic_controller.gd" id="5_mc88i"] +[ext_resource type="Script" uid="uid://dfnyam1pvkb73" path="res://scripts/components/zombie_death_handler.gd" id="9_ap2hg"] + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_wn68q"] +tip_nodepath = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 17 +joint_data/0/bone2d_node = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = 0.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = false +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 16 +joint_data/1/bone2d_node = NodePath("Butt/Body/LeftUpperArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = false +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_x5uj2"] +tip_nodepath = NodePath("Butt/Body/RightUpperArm/RightLowerArm/RightHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 8 +joint_data/0/bone2d_node = NodePath("Butt/Body/RightUpperArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = false +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 9 +joint_data/1/bone2d_node = NodePath("Butt/Body/RightUpperArm/RightLowerArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 90.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_vcc72"] +tip_nodepath = NodePath("Butt/RightUpperLeg/RightLowerLeg/RightFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 1 +joint_data/0/bone2d_node = NodePath("Butt/RightUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 2 +joint_data/1/bone2d_node = NodePath("Butt/RightUpperLeg/RightLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 160.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_kto0i"] +tip_nodepath = NodePath("Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 4 +joint_data/0/bone2d_node = NodePath("Butt/LeftUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 5 +joint_data/1/bone2d_node = NodePath("Butt/LeftUpperLeg/LeftLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = -90.0 +joint_data/1/constraint_angle_max = 0.0 +joint_data/1/constraint_angle_invert = true +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModificationStack2D" id="SkeletonModificationStack2D_wn68q"] +modification_count = 4 +modifications/0 = SubResource("SkeletonModification2DCCDIK_wn68q") +modifications/1 = SubResource("SkeletonModification2DCCDIK_x5uj2") +modifications/2 = SubResource("SkeletonModification2DCCDIK_vcc72") +modifications/3 = SubResource("SkeletonModification2DCCDIK_kto0i") + +[sub_resource type="AtlasTexture" id="AtlasTexture_jvn5w"] +atlas = ExtResource("1_jrplh") +region = Rect2(15, 30, 20, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vmdbp"] +atlas = ExtResource("1_jrplh") +region = Rect2(64, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x1oyw"] +atlas = ExtResource("1_jrplh") +region = Rect2(93, 50, 17, 9) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vjx3c"] +atlas = ExtResource("1_jrplh") +region = Rect2(79, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f31xd"] +atlas = ExtResource("1_jrplh") +region = Rect2(47, 33, 8, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_od8jf"] +atlas = ExtResource("1_jrplh") +region = Rect2(59, 33, 7, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p4711"] +atlas = ExtResource("1_jrplh") +region = Rect2(71, 30, 19, 13) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1bk2b"] +atlas = ExtResource("1_jrplh") +region = Rect2(12, 43, 6, 18) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y06yv"] +atlas = ExtResource("1_jrplh") +region = Rect2(36, 50, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lu8go"] +atlas = ExtResource("1_jrplh") +region = Rect2(22, 45, 8, 15) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cdq7v"] +atlas = ExtResource("1_jrplh") +region = Rect2(93, 8, 29, 39) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e7wc3"] +atlas = ExtResource("1_jrplh") +region = Rect2(72, 2, 13, 26) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wn68q"] +atlas = ExtResource("1_jrplh") +region = Rect2(36, 0, 32, 30) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x5uj2"] +atlas = ExtResource("1_jrplh") +region = Rect2(15, 17, 17, 6) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vcc72"] +atlas = ExtResource("1_jrplh") +region = Rect2(93, 3, 2, 3) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kto0i"] +atlas = ExtResource("1_jrplh") +region = Rect2(105, 2, 3, 4) + +[sub_resource type="AtlasTexture" id="AtlasTexture_djocr"] +atlas = ExtResource("1_jrplh") +region = Rect2(2, 7, 6, 19) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6y4ja"] +atlas = ExtResource("1_jrplh") +region = Rect2(13, 2, 9, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_auqeq"] +atlas = ExtResource("1_jrplh") +region = Rect2(0, 32, 9, 15) + +[sub_resource type="Animation" id="Animation_x5uj2"] +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Zombie/Butt/Body/LeftUpperArm:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, -20)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Zombie/Butt/Body/LeftUpperArm:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Zombie/Butt/Body/Head/LeftEye:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -9)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Zombie/Butt/Body/Head/LeftEye:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Zombie/Butt/Body/Head/RightEye:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-16, -8)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Zombie/Butt/Body/Head/RightEye:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Zombie/Butt/Body/Head/Jaw:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, 3)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Zombie/Butt/Body/Head/Jaw:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Zombie/Butt/Body/Tie:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-9, -21)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Zombie/Butt/Body/Tie:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:rotation") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 15)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:rotation") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Zombie/Butt/Body/RightUpperArm:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-14, -23)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Zombie/Butt/Body/RightUpperArm:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 10)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:rotation") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:rotation") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Zombie/Butt/LeftUpperLeg:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 4)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Zombie/Butt/LeftUpperLeg:rotation") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:rotation") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 12)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:rotation") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("Zombie/Butt/RightUpperLeg:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-6, 3)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("Zombie/Butt/RightUpperLeg:rotation") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("Zombie/Butt:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, -35)] +} +tracks/33/type = "value" +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/path = NodePath("Zombie/Butt:rotation") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/34/type = "value" +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/path = NodePath("Zombie/Butt/Body:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, -2)] +} +tracks/35/type = "value" +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/path = NodePath("Zombie/Butt/Body:rotation") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/36/type = "value" +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/path = NodePath("Zombie:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/37/type = "value" +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/path = NodePath("Zombie:rotation") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/38/type = "value" +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/path = NodePath("Zombie/Butt/Body/Head:position") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-10, -25)] +} +tracks/39/type = "value" +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/path = NodePath("Zombie/Butt/Body/Head:rotation") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/40/type = "value" +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/path = NodePath("Zombie/Butt/Body/Head:visible") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/41/type = "value" +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/path = NodePath("Zombie/Butt/Body/Tie:scale") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/42/type = "value" +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand/Left_Hand:texture") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [SubResource("AtlasTexture_6y4ja")] +} +tracks/43/type = "value" +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand/Left_Hand:offset") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -1)] +} +tracks/44/type = "value" +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/path = NodePath("../../Mover:speed_control") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_qnnv5"] +_data = { +&"RESET": SubResource("Animation_x5uj2") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_20equ"] +size = Vector2(27, 44) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ap2hg"] +size = Vector2(20, 44) + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_moyxp"] +animation = &"basic/death" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_qoqrk"] +animation = &"basic/eating" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_20equ"] +animation = &"basic/stand" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ap2hg"] +animation = &"basic/walk" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_b2rti"] +switch_mode = 2 +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_culaa"] +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_mc88i"] +advance_mode = 2 +advance_expression = "eating" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_moyxp"] +xfade_time = 0.5 +advance_mode = 2 +advance_expression = "eating == false and walking" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_qoqrk"] +xfade_time = 0.5 +advance_mode = 2 +advance_expression = "eating and walking" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_20equ"] +advance_mode = 2 +advance_expression = "(eating or walking) == false" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ap2hg"] +advance_mode = 2 +advance_expression = "eating == false and walking" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_2naru"] +advance_mode = 2 +advance_expression = "(eating or walking) == false" + +[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_mc88i"] +states/death/node = SubResource("AnimationNodeAnimation_moyxp") +states/death/position = Vector2(739, 100) +states/eating/node = SubResource("AnimationNodeAnimation_qoqrk") +states/eating/position = Vector2(407, 40) +states/idle/node = SubResource("AnimationNodeAnimation_20equ") +states/idle/position = Vector2(297, 100) +states/walk/node = SubResource("AnimationNodeAnimation_ap2hg") +states/walk/position = Vector2(407, 161) +transitions = ["death", "End", SubResource("AnimationNodeStateMachineTransition_b2rti"), "Start", "idle", SubResource("AnimationNodeStateMachineTransition_culaa"), "idle", "eating", SubResource("AnimationNodeStateMachineTransition_mc88i"), "eating", "walk", SubResource("AnimationNodeStateMachineTransition_moyxp"), "walk", "eating", SubResource("AnimationNodeStateMachineTransition_qoqrk"), "walk", "idle", SubResource("AnimationNodeStateMachineTransition_20equ"), "idle", "walk", SubResource("AnimationNodeStateMachineTransition_ap2hg"), "eating", "idle", SubResource("AnimationNodeStateMachineTransition_2naru")] +graph_offset = Vector2(28, -31) + +[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_moyxp"] + +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_qoqrk"] +nodes/main/node = SubResource("AnimationNodeStateMachine_mc88i") +nodes/main/position = Vector2(-140, 180) +nodes/output/position = Vector2(260, 140) +nodes/speed/node = SubResource("AnimationNodeTimeScale_moyxp") +nodes/speed/position = Vector2(100, 140) +node_connections = [&"output", 0, &"speed", &"speed", 0, &"main"] + +[node name="Basic" type="Node2D" groups=["Zombies"]] +script = ExtResource("4_moyxp") +max_hp = 100.0 +layer = &"base" + +[node name="Visual" type="CanvasGroup" parent="."] +position = Vector2(0, 30) + +[node name="basic_zombie_walk" type="Node2D" parent="Visual"] + +[node name="Zombie" type="Skeleton2D" parent="Visual/basic_zombie_walk"] +modification_stack = SubResource("SkeletonModificationStack2D_wn68q") + +[node name="Butt" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie"] +position = Vector2(5, -35) +scale = Vector2(0.999912, 0.999912) +rest = Transform2D(1, 0, 0, 1, 5, -35) +editor_settings/show_bone_gizmo = false + +[node name="Butt" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt"] +texture = SubResource("AtlasTexture_jvn5w") +centered = false +offset = Vector2(-10, -3) +metadata/_edit_lock_ = true + +[node name="RightUpperLeg" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt"] +position = Vector2(-6, 3) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -6, 3) +editor_settings/show_bone_gizmo = false + +[node name="Right_Upper_Leg" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +texture = SubResource("AtlasTexture_vmdbp") +centered = false +offset = Vector2(-6, -2) +metadata/_edit_lock_ = true + +[node name="RightLowerLeg" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +position = Vector2(-2, 12) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -2, 12) +editor_settings/show_bone_gizmo = false + +[node name="RightFoot" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-2, 14) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -2, 14) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 0.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Foot" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot"] +texture = SubResource("AtlasTexture_x1oyw") +centered = false +offset = Vector2(-4, -3) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Leg" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-18, -2) +texture = SubResource("AtlasTexture_vjx3c") +centered = false +offset = Vector2(12, 1) +metadata/_edit_lock_ = true + +[node name="LeftUpperLeg" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt"] +position = Vector2(6, 4) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, 6, 4) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Leg" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +texture = SubResource("AtlasTexture_f31xd") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="LeftLowerLeg" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +position = Vector2(-1, 13) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -1, 13) +editor_settings/show_bone_gizmo = false + +[node name="Left_Lower_Leg" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +texture = SubResource("AtlasTexture_od8jf") +centered = false +offset = Vector2(-1, 0) +metadata/_edit_lock_ = true + +[node name="LeftFoot" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +position = Vector2(6, 10) +scale = Vector2(0.999826, 0.999826) +rest = Transform2D(1, 0, 0, 1, 6, 10) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 160.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Foot" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot"] +texture = SubResource("AtlasTexture_p4711") +centered = false +offset = Vector2(-14, -3) +metadata/_edit_lock_ = true + +[node name="Body" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt"] +position = Vector2(1, -2) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, 1, -2) +editor_settings/show_bone_gizmo = false + +[node name="RightUpperArm" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-14, -23) +scale = Vector2(0.999831, 0.999831) +rest = Transform2D(1, 0, 0, 1, -14, -23) +editor_settings/show_bone_gizmo = false + +[node name="Right_Upper_Arm" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +texture = SubResource("AtlasTexture_1bk2b") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="RightLowerArm" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +position = Vector2(-2, 15) +scale = Vector2(0.99982, 0.99982) +rest = Transform2D(1, 0, 0, 1, -2, 15) +editor_settings/show_bone_gizmo = false + +[node name="RightHand" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 8.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Hand" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand"] +texture = SubResource("AtlasTexture_y06yv") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Arm" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +texture = SubResource("AtlasTexture_lu8go") +centered = false +offset = Vector2(-5, -1) +metadata/_edit_lock_ = true + +[node name="Body" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body"] +rotation = 0.00163735 +texture = SubResource("AtlasTexture_cdq7v") +centered = false +offset = Vector2(-15, -27) +metadata/_edit_lock_ = true + +[node name="Tie" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-9, -21) +skew = -9.59635e-05 +rest = Transform2D(1, 0, 0, 1, -9, -21) +auto_calculate_length_and_angle = false +length = 24.0 +bone_angle = 100.0 +editor_settings/show_bone_gizmo = false + +[node name="Tie" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Tie"] +texture = SubResource("AtlasTexture_e7wc3") +centered = false +offset = Vector2(-10, -1) +metadata/_edit_lock_ = true + +[node name="Head" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-10, -25) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -10, -25) +editor_settings/show_bone_gizmo = false + +[node name="Head" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head"] +texture = SubResource("AtlasTexture_wn68q") +centered = false +offset = Vector2(-20, -24) +metadata/_edit_lock_ = true + +[node name="Jaw" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-3, 3) +scale = Vector2(0.999832, 0.999832) +rest = Transform2D(1, 0, 0, 1, -3, 3) +auto_calculate_length_and_angle = false +length = 11.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="Jaw" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw"] +texture = SubResource("AtlasTexture_x5uj2") +centered = false +offset = Vector2(-12, -2) +metadata/_edit_lock_ = true + +[node name="RightEye" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-16, -8) +rest = Transform2D(1, 0, 0, 1, -16, -8) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Eye" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye"] +texture = SubResource("AtlasTexture_vcc72") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true + +[node name="LeftEye" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-4, -9) +rest = Transform2D(1, 0, 0, 1, -4, -9) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Eye" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye"] +texture = SubResource("AtlasTexture_kto0i") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true + +[node name="LeftUpperArm" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-1, -20) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -1, -20) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Arm" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-37, 10) +texture = SubResource("AtlasTexture_djocr") +centered = false +offset = Vector2(33, -12) +metadata/_edit_lock_ = true + +[node name="LeftLowerArm" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-2, 14) +scale = Vector2(0.999825, 0.999825) +rest = Transform2D(1, 0, 0, 1, -2, 14) +editor_settings/show_bone_gizmo = false + +[node name="LeftHand" type="Bone2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 6.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Hand" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand"] +texture = SubResource("AtlasTexture_6y4ja") +centered = false +offset = Vector2(-4, -1) +metadata/_edit_lock_ = true + +[node name="Left_Lower_Arm" type="Sprite2D" parent="Visual/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +texture = SubResource("AtlasTexture_auqeq") +centered = false +offset = Vector2(-5, 0) +metadata/_edit_lock_ = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Visual/basic_zombie_walk"] +libraries = { +&"": SubResource("AnimationLibrary_qnnv5"), +&"basic": ExtResource("2_yccea") +} + +[node name="Collider" type="Area2D" parent="."] +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("3_qoqrk") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Collider"] +position = Vector2(1.5, 8) +shape = SubResource("RectangleShape2D_20equ") + +[node name="Hurtbox" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 2 +monitorable = false +script = ExtResource("4_20equ") +lookup_layers = 1 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox"] +position = Vector2(-10, 8) +shape = SubResource("RectangleShape2D_ap2hg") + +[node name="AnimationTree" type="AnimationTree" parent="."] +root_node = NodePath("../Visual/basic_zombie_walk") +tree_root = SubResource("AnimationNodeBlendTree_qoqrk") +advance_expression_base_node = NodePath("../Controller") +anim_player = NodePath("../Visual/basic_zombie_walk/AnimationPlayer") +parameters/speed/scale = 1.0 +script = ExtResource("3_qnnv5") + +[node name="Mover" type="Node" parent="."] +script = ExtResource("3_yccea") + +[node name="Controller" type="Node" parent="." node_paths=PackedStringArray("hurtbox")] +script = ExtResource("5_mc88i") +hurtbox = NodePath("../Hurtbox") +damage = 5.0 + +[node name="DeathHandler" type="Node" parent="."] +script = ExtResource("9_ap2hg") + +[connection signal="killed" from="." to="Controller" method="_on_entity_killed"] +[connection signal="animation_finished" from="AnimationTree" to="DeathHandler" method="_on_animation_tree_animation_finished"] diff --git a/scripts/components/controllers/plants/peashooter_controller.gd b/scripts/components/controllers/plants/peashooter_controller.gd new file mode 100644 index 0000000..5908b83 --- /dev/null +++ b/scripts/components/controllers/plants/peashooter_controller.gd @@ -0,0 +1,33 @@ +extends Node + +const projectile := preload("uid://ciqhjwh4sfe3u") + +@export var projectile_transform : Marker2D + +var detected : bool = false +var can_shoot : bool = true + +@onready var timer := $Timer +@onready var entity : Entity = get_parent() + +func is_shooting(): + return detected and can_shoot and entity.disabled == false + +func _on_generic_hurtbox_collision_start() -> void: + detected = true + +func _on_generic_hurtbox_collision_end() -> void: + detected = false + +func shoot(): + if can_shoot == false: + return + can_shoot = false + timer.start() + var proj = projectile.instantiate() + get_tree().current_scene.get_node("%Projectiles").add_child(proj) + proj.global_transform = projectile_transform.global_transform + proj.source = entity + +func _on_timer_timeout() -> void: + can_shoot = true diff --git a/scripts/components/controllers/plants/peashooter_controller.gd.uid b/scripts/components/controllers/plants/peashooter_controller.gd.uid new file mode 100644 index 0000000..5f6acbe --- /dev/null +++ b/scripts/components/controllers/plants/peashooter_controller.gd.uid @@ -0,0 +1 @@ +uid://b0ka8lb5kl1fd diff --git a/scripts/components/controllers/zombies/basic_controller.gd b/scripts/components/controllers/zombies/basic_controller.gd new file mode 100644 index 0000000..7bc0163 --- /dev/null +++ b/scripts/components/controllers/zombies/basic_controller.gd @@ -0,0 +1,29 @@ +extends Node + +var eating: + get: + return is_eating() +var walking: + get: + return is_walking() + +@export var hurtbox : GenericHurtbox +@export var damage : float +@onready var disablable := get_parent() + +var killed := false + +func _on_entity_killed(_context: RefCounted) -> void: + if killed: return + $"../AnimationTree"["parameters/main/playback"].travel("death") + killed = true + +func is_eating() -> bool: + return hurtbox.is_colliding() and disablable.disabled == false + +func is_walking() -> bool: + return disablable.disabled == false + +func bite() -> void: + if hurtbox.is_colliding() == false: return + hurtbox.get_colliding_entity().deal_damage(damage,get_parent()) diff --git a/scripts/components/controllers/zombies/basic_controller.gd.uid b/scripts/components/controllers/zombies/basic_controller.gd.uid new file mode 100644 index 0000000..a3c82d9 --- /dev/null +++ b/scripts/components/controllers/zombies/basic_controller.gd.uid @@ -0,0 +1 @@ +uid://bg88vb74hinkj diff --git a/scripts/components/field_segment_shape.gd b/scripts/components/field_segment_shape.gd new file mode 100644 index 0000000..ba8e43e --- /dev/null +++ b/scripts/components/field_segment_shape.gd @@ -0,0 +1,4 @@ +extends CollisionShape2D + +func _process(_delta: float) -> void: + shape.b = Vector2(FieldParams.field_rect.end.x-global_position.x+FieldParams.TILE.x,0) diff --git a/scripts/components/field_segment_shape.gd.uid b/scripts/components/field_segment_shape.gd.uid new file mode 100644 index 0000000..0242864 --- /dev/null +++ b/scripts/components/field_segment_shape.gd.uid @@ -0,0 +1 @@ +uid://cjulv0bt6deps diff --git a/scripts/components/generic_collider.gd b/scripts/components/generic_collider.gd new file mode 100644 index 0000000..804adcc --- /dev/null +++ b/scripts/components/generic_collider.gd @@ -0,0 +1,15 @@ +extends Area2D + +## Base class for generic colliders. + +class_name GenericCollider + +## Contact layer. Used to check +enum Layers +{ + NORMAL = 1, + LOW = 2, + HIGH = 4 +} + +@export var layer : Layers = Layers.NORMAL diff --git a/scripts/components/generic_collider.gd.uid b/scripts/components/generic_collider.gd.uid new file mode 100644 index 0000000..9f2d11a --- /dev/null +++ b/scripts/components/generic_collider.gd.uid @@ -0,0 +1 @@ +uid://be5rfbbl5xgeh diff --git a/scripts/components/generic_hurtbox.gd b/scripts/components/generic_hurtbox.gd new file mode 100644 index 0000000..7200353 --- /dev/null +++ b/scripts/components/generic_hurtbox.gd @@ -0,0 +1,45 @@ +extends Area2D + +class_name GenericHurtbox + +@export_flags("NORMAL:1","LOW:2","HIGH:4") var lookup_layers : int = 0 +var entities : Array[Entity] = [] + +signal entity_added(entity : Entity) +signal entity_removed(entity : Entity) +signal collision_start +signal collision_end + +func _ready() -> void: + area_entered.connect(on_area_entered) + area_exited.connect(on_area_exited) + +func on_area_entered(area: Area2D): + if area is GenericCollider: + if lookup_layers & area.layer != 0: + add_entity(area.get_parent()) + +func on_area_exited(area: Area2D): + if area is GenericCollider: + if lookup_layers & area.layer != 0: + remove_entity(area.get_parent()) + +func add_entity(entity : Entity): + entities.append(entity) + entity_added.emit(entity) + if entities.size() == 1: + collision_start.emit() + +func remove_entity(entity : Entity): + entities.erase(entity) + entity_removed.emit(entity) + if entities.size() == 0: + collision_end.emit() + +func get_colliding_entity() -> Entity: + if entities.size() == 0: + return null + return entities[0] + +func is_colliding() -> bool: + return entities.size() > 0 diff --git a/scripts/components/generic_hurtbox.gd.uid b/scripts/components/generic_hurtbox.gd.uid new file mode 100644 index 0000000..7f6f36b --- /dev/null +++ b/scripts/components/generic_hurtbox.gd.uid @@ -0,0 +1 @@ +uid://cbudgx741oxtc diff --git a/scripts/components/mover.gd b/scripts/components/mover.gd new file mode 100644 index 0000000..6d9d4ad --- /dev/null +++ b/scripts/components/mover.gd @@ -0,0 +1,10 @@ +extends Node + +@export_range(0,2,0.001,"or_greater","hide_slider","suffix:tiles/second") var speed : float = 0.2 +# Used by animation players to control zombie's movement +@export var speed_control : float = 0.0 + +@onready var parent : Node2D = get_parent() + +func _physics_process(delta: float) -> void: + parent.global_position += -parent.global_transform.x * speed_control * speed * delta * FieldParams.TILE.x diff --git a/scripts/components/mover.gd.uid b/scripts/components/mover.gd.uid new file mode 100644 index 0000000..59ed131 --- /dev/null +++ b/scripts/components/mover.gd.uid @@ -0,0 +1 @@ +uid://bdacurei5fp02 diff --git a/scripts/components/plant_death_handler.gd b/scripts/components/plant_death_handler.gd new file mode 100644 index 0000000..ff221fb --- /dev/null +++ b/scripts/components/plant_death_handler.gd @@ -0,0 +1,5 @@ +extends Node + + +func _on_killed(context: RefCounted) -> void: + get_parent().deconstruct() diff --git a/scripts/components/plant_death_handler.gd.uid b/scripts/components/plant_death_handler.gd.uid new file mode 100644 index 0000000..1b81a66 --- /dev/null +++ b/scripts/components/plant_death_handler.gd.uid @@ -0,0 +1 @@ +uid://d17rkta3k73jx diff --git a/scripts/components/zombie_death_handler.gd b/scripts/components/zombie_death_handler.gd new file mode 100644 index 0000000..8aa4325 --- /dev/null +++ b/scripts/components/zombie_death_handler.gd @@ -0,0 +1,5 @@ +extends Node + +func _on_animation_tree_animation_finished(anim_name: StringName) -> void: + if anim_name.split("/")[1] == "death": + get_parent().deconstruct() diff --git a/scripts/components/zombie_death_handler.gd.uid b/scripts/components/zombie_death_handler.gd.uid new file mode 100644 index 0000000..f9cb8a8 --- /dev/null +++ b/scripts/components/zombie_death_handler.gd.uid @@ -0,0 +1 @@ +uid://dfnyam1pvkb73 diff --git a/scripts/entities/entity.gd b/scripts/entities/entity.gd index 2121b9b..e381c48 100644 --- a/scripts/entities/entity.gd +++ b/scripts/entities/entity.gd @@ -8,8 +8,9 @@ class_name Entity ## Optional spawn layer for grid interactions @export var layer : StringName = "" ## Current amount of health points of an entity. Cannot be below 0 or [code]max_hp[/code] -var hp : float = max_hp - +@onready var hp : float = max_hp +## +var disabled : bool = false signal damaged ## Emitted when damage is taken @@ -20,6 +21,21 @@ signal healed(context : HealedContext) signal hp_changed(context : HPChangedContext) ## Emitted when kill is requested signal killed(context : KilledContext) +## +signal toggled(disabled : bool) + + +## +func disable(): + if disabled: return + disabled = true + toggled.emit(disabled) + +## +func enable(): + if disabled == false: return + disabled = false + toggled.emit(disabled) ## Properly deal damage to entity func deal_damage(amount : float, source : Entity): @@ -42,7 +58,6 @@ func deal_damage(amount : float, source : Entity): hp = 0 kill(source) - ## Properly heal entity func heal(amount : float, source : Entity): var context = HealedContext.new() @@ -61,7 +76,6 @@ func heal(amount : float, source : Entity): if hp > max_hp: hp = max_hp - ## Invoked when an entity is killed by damage. func kill(source : Entity): var context = KilledContext.new() @@ -72,9 +86,6 @@ func kill(source : Entity): LevelEventBus.entity_killed.emit(context) if not layer.is_empty(): LevelEventBus.layer_entity_killed.emit(context) - - deconstruct() - ## Method used to properly deconstruct entity func deconstruct(): diff --git a/scripts/level/seedpacket_placer.gd b/scripts/level/seedpacket_placer.gd index a934670..9a7af23 100644 --- a/scripts/level/seedpacket_placer.gd +++ b/scripts/level/seedpacket_placer.gd @@ -1,4 +1,4 @@ -extends CanvasGroup +extends Node2D @export var entity_container : LayeredEntityContainer var can_plant : bool = false @@ -24,13 +24,16 @@ func _input(event: InputEvent) -> void: if held_packet != null and can_plant and event.is_action_pressed("primary_action"): for child in get_children(): + child.enable() child.reparent(get_tree().current_scene.get_node("%Plants")) LevelEventBus.packet_placed.emit(held_packet) held_packet = null visible = false func on_seedpacket_selected(packet : SeedpacketResource) -> void: - add_child(packet.scene.instantiate()) + var instantiated = packet.scene.instantiate() + add_child(instantiated) + instantiated.disable() held_packet = packet visible = true diff --git a/scripts/projectiles/linear_projectile.gd b/scripts/projectiles/linear_projectile.gd new file mode 100644 index 0000000..96923d0 --- /dev/null +++ b/scripts/projectiles/linear_projectile.gd @@ -0,0 +1,18 @@ +extends Area2D + +var source : Entity + +@export var speed : float +@export var damage : float + +func _ready() -> void: + area_entered.connect(on_area_entered) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta: float) -> void: + global_position += global_transform.x * speed * delta + +func on_area_entered(area : Area2D): + if area.get_parent() != null: + area.get_parent().deal_damage(damage, source) + queue_free() diff --git a/scripts/projectiles/linear_projectile.gd.uid b/scripts/projectiles/linear_projectile.gd.uid new file mode 100644 index 0000000..d945eb0 --- /dev/null +++ b/scripts/projectiles/linear_projectile.gd.uid @@ -0,0 +1 @@ +uid://fgdhvaq4dek2 diff --git a/scripts/speed_controlled/speed_controlled_animation_tree.gd b/scripts/speed_controlled/speed_controlled_animation_tree.gd new file mode 100644 index 0000000..f41c250 --- /dev/null +++ b/scripts/speed_controlled/speed_controlled_animation_tree.gd @@ -0,0 +1,5 @@ +extends AnimationTree + + +func on_speed_changed(speed : float): + set("parameters/speed/scale",speed) diff --git a/scripts/speed_controlled/speed_controlled_animation_tree.gd.uid b/scripts/speed_controlled/speed_controlled_animation_tree.gd.uid new file mode 100644 index 0000000..599e805 --- /dev/null +++ b/scripts/speed_controlled/speed_controlled_animation_tree.gd.uid @@ -0,0 +1 @@ +uid://cbmavbe4xd0j2 diff --git a/scripts/speed_controlled/speed_controlled_timer.gd b/scripts/speed_controlled/speed_controlled_timer.gd new file mode 100644 index 0000000..6783937 --- /dev/null +++ b/scripts/speed_controlled/speed_controlled_timer.gd @@ -0,0 +1,16 @@ +extends Timer + + +var old_speed : float + +func on_speed_changed(speed : float): + var ratio = speed / old_speed + var old_wait_time = wait_time + var old_time_left = time_left + + if old_time_left > 0: + start(old_time_left * ratio) + + wait_time = old_wait_time * ratio + + old_speed = speed diff --git a/scripts/speed_controlled/speed_controlled_timer.gd.uid b/scripts/speed_controlled/speed_controlled_timer.gd.uid new file mode 100644 index 0000000..d3abdf1 --- /dev/null +++ b/scripts/speed_controlled/speed_controlled_timer.gd.uid @@ -0,0 +1 @@ +uid://bk1twclmpvalk