From 7614b1207692f49bc5400136ad5a13e8380e9148 Mon Sep 17 00:00:00 2001 From: Rendo Date: Thu, 26 Jun 2025 20:18:19 +0500 Subject: [PATCH] Survival mode ready --- addons/floatmodifiers/FloatModifiers.cs | 1 + addons/floatmodifiers/FloatModsProperty.cs | 5 + default_bus_layout.tres | 3 +- resources/animations/plants/aloe.res | Bin 863 -> 873 bytes resources/animations/zombies/basic_zombie.res | Bin 633 -> 644 bytes resources/plants/Aloe.tres | 6 +- resources/plants/Garlic.tres | 6 +- resources/plants/Peashooter.tres | 12 ++ resources/plants/PotatoMine.tres | 2 + resources/plants/Snowpea.tres | 6 +- resources/plants/Spikeweed.tres | 6 +- resources/plants/Sunflower.tres | 2 + resources/plants/Threepeater.tres | 2 + resources/plants/Wallnut.tres | 4 +- resources/themes/ChooseYourSeeds.tres | 28 ++- resources/zombies/buckethead.tres | 2 +- resources/zombies/conehead.tres | 2 +- resources/zombies/hobo.tres | 2 +- scenes/entities/Zombies/bucket_zombie.tscn | 25 ++- scenes/entities/Zombies/cone_zombie.tscn | 25 ++- scenes/entities/Zombies/hobo.tscn | 66 +++++-- scenes/entities/Zombies/zombie.tscn | 12 +- scenes/entities/plants/peashooter.tscn | 1 + scenes/entities/plants/snowpea.tscn | 14 +- scenes/entities/plants/sunflower.tscn | 20 ++- scenes/entities/plants/threepeater.tscn | 9 +- scenes/gui/choose_your_seeds.tscn | 32 +++- .../left_boundary_marker.tscn | 6 + .../right_boundary_marker.tscn | 6 + scenes/projectiles/pea.tscn | 2 +- scenes/projectiles/snowpea_projectile.tscn | 2 +- scenes/prototype_survival.tscn | 60 ++++++- scripts/DebugZombieSpawner.cs | 2 +- scripts/Utility.cs | 4 +- .../gui/choose_your_seeds/Previewport.cs | 5 + .../components/level/LeftBoundaryMarker.cs | 12 ++ .../level/LeftBoundaryMarker.cs.uid | 1 + .../components/level/RightBoundaryMarker.cs | 12 ++ .../level/RightBoundaryMarker.cs.uid | 1 + .../zombe_spawners/SurvivalZombieSpawner.cs | 170 ++++++++++++++++++ .../SurvivalZombieSpawner.cs.uid | 1 + .../level/zombe_spawners/ZombieSequencer.cs | 31 +++- .../components/plants/PlantEyesightLimiter.cs | 2 +- .../plants/behaviours/SunflowerBehaviour.cs | 2 +- scripts/components/zombies/EatBox.cs | 2 +- scripts/components/zombies/ZombieMover.cs | 6 +- .../zombies/behaviours/HoboBehaviour.cs | 1 + scripts/resources/PlantResource.cs | 6 +- scripts/resources/ZombieResource.cs | 4 +- scripts/systems/GameRegistry.cs | 36 ++-- 50 files changed, 586 insertions(+), 81 deletions(-) create mode 100644 scenes/level components/left_boundary_marker.tscn create mode 100644 scenes/level components/right_boundary_marker.tscn create mode 100644 scripts/components/level/LeftBoundaryMarker.cs create mode 100644 scripts/components/level/LeftBoundaryMarker.cs.uid create mode 100644 scripts/components/level/RightBoundaryMarker.cs create mode 100644 scripts/components/level/RightBoundaryMarker.cs.uid create mode 100644 scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs create mode 100644 scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs.uid diff --git a/addons/floatmodifiers/FloatModifiers.cs b/addons/floatmodifiers/FloatModifiers.cs index e540413..365d627 100644 --- a/addons/floatmodifiers/FloatModifiers.cs +++ b/addons/floatmodifiers/FloatModifiers.cs @@ -16,6 +16,7 @@ public partial class FloatModifiers : Resource percentage_value = per, mult_value = mult }; + mod.ResourceLocalToScene = true; return mod; } diff --git a/addons/floatmodifiers/FloatModsProperty.cs b/addons/floatmodifiers/FloatModsProperty.cs index b2d5b14..f0f358d 100644 --- a/addons/floatmodifiers/FloatModsProperty.cs +++ b/addons/floatmodifiers/FloatModsProperty.cs @@ -68,8 +68,13 @@ public partial class FloatModsProperty : EditorProperty if (newValue == null) { newValue = new(); + newValue.ResourceLocalToScene = true; EmitChanged(GetEditedProperty(), newValue); } + if (newValue.ResourceLocalToScene == false) + { + newValue.ResourceLocalToScene = true; + } if (newValue == _currentValue) { return; diff --git a/default_bus_layout.tres b/default_bus_layout.tres index 9473b3a..56dd1ae 100644 --- a/default_bus_layout.tres +++ b/default_bus_layout.tres @@ -1,9 +1,10 @@ [gd_resource type="AudioBusLayout" format=3 uid="uid://igejanqt2yqf"] [resource] +bus/0/volume_db = -0.130497 bus/1/name = &"MusicBus" bus/1/solo = false bus/1/mute = false bus/1/bypass_fx = false -bus/1/volume_db = 0.0 +bus/1/volume_db = -0.526013 bus/1/send = &"Master" diff --git a/resources/animations/plants/aloe.res b/resources/animations/plants/aloe.res index 535302c00bfe57196223af72e719666aade17f5e..850841724f5860bf5cdc5bbb70c21b3bb9a63fa7 100644 GIT binary patch literal 873 zcmV-v1D5>Q+3{L~S8hUd(<#{d66Ui*_2 zRRC20UH}@+WXNH;%5n_hzvgk7t7x}}_L^ zaB=N=j{ML3PjCevCS{&)UQNc;iUbzRqWS(as4mQ`oh z8l@y2&Fu{VKAY=jajx#%IGXIo8`qZ8>pbU4s#U0>BW=6V=25TrAM=ejFlt|yaf5ZP zHo4OOmh&dPY)Toqdh&7nfB8NRVHjd5Keiw&frMfBbDXl*)r|k1&M*E0_&-sc!MG?K zkT5J&L?4n7|K>l4Q*H+=<5skO8)rqgqE+?5Ak*R9C?OAX;UUT%94rq`3UzQJD#SH- zbdWl-s`}WvTNV*SMntHMDVSAGdO3}I;<$AP&N7BrIvE(C61DMkEGUY?QYMh*q?ba2 ziiqMkU|^#Ffp3zl>}gEXlz{;naPbjPLBZK*GMLMyRJwpBuDeZe!XiOU)W+#WltRC4 zj_5;DBKnVsASuBDfW@eBSu!IsBPl3IDvbfK0uh;^vJDbI!ywgS1Vn@&L6H%mV1fiv zP*O&rFdPmkkRT^vy}=L~S!6Y`i>FK}V-o!?ap7p#Zvb_^Q=4&0LSZIJ^;8qh`vn`A z@$EnrFiw3cW&9`iKyU_Cmt!fA9X^d9Mz8QE&WNr=T%c96Wj9URKT?2tYHmsjZRXVhWRYAdBY#Qd2`i#2S&u literal 863 zcmV-l1EBm;Q$s@n000005C8yK3jhE|0{{RhwJ-f(SqkkL04CsUKOk+K4geSc5(P;T zO@I(+glx;gN0U9tcDuZ{e}qOREeCH-)G$pAUVHQHV-LAnMa;s4%ulw;*Rr_|6pT=8@l5+p=yhZ7WY{wD)U;Zt37WKGLZWe8>JO68(xi46p!EFr_ zFs@!tkpGtd39cXn1xvO8#OHr?Q*USREQHdl3wj}h|C;|46MqHo=@lb|-G{JKgC`TI`^L*4?}$e%43Pafkq{u`$Zde!rPqdCTZ0RO3qv-qt@#$y~$ z5)o%q;>Y|Kamww0<+m2C;eOMiYf;PUU|{+1ZV?bz!Eg{|4iA$DH-SQ3sTy$(93fLk zv#gG-%V`)E5DmtG9xl0DJV!PjRCL%5t*T~4H6*3AQof9LxdnfkrAO_f&@}fQbwUL z9Q`PeASXea;ouork{Gwek4lL#A$E6|4koMlQL(!Y32e(#VSw5TJi?6k#bv-a^{KRw zKN$kSDJbtSpFsZbF@iWN#Gi0Rbrmp?cF;ZJT03Dld233kL2xrMkqKU~ET=6nWp4KTI&f>fYQ~v>?*& zYM&jOS(=+V^aHmCBIqiwKGfp+mwVaO4SoKT8d( zeO&|!)V<8BA6qA}#&8h^Es-zi>9oPw{A43^6WWJiJwK2_HZQ$s@n000005C8yZ2LJ$U0ssIgwJ-f(Xa*G%0LEBTJ5Y;~4zLKduBw`v zb!KK}h8=6yhW3dp-`;z#>CHCe-g1F-O%?i7Di8yr8Z;$NCMXg6U%epeNBga%Kma@d zL;x!~wTq)Tm;Z0PT?FDHH;f-_S5Ec6z+SwGRBHSje+a-DYSgyuBl=xrvVe)U&QBf1GU=JC(UioiyG3@G*jw$Fi~=71bVgt z;t(K)9VNswFsH$wQtHrFrdl>$({UWfah%O&q_QUClD8qoq1GQE7D6Z+90@KNry2nm z7Z!?jtW`|5mC5L@Aka84F_3Y=uy*s{pe*>@$f?K%7+bdql`SMN_}tg}!lLn?fW`k0 zIEzs4i$Fs1A%KCXVNpXQGo+v(g;Hyff{~f3@)964DGGDQD>M>NAfhR=tWse!fXHYd zdJ)6aFw}*r=G&+sUUJ1(tK7zJA!ro&*bRVI^*K^BAQ(`KJ~5c5-hK-pBDj|YAOeyD zGz-Z?u(!?p+xXKLR2^fMyJ+YcY89I(#P;^K0 zhSB`@s1EPW6<1IV5-2z|Y1A;#d7IJ33MDiOCtfi4F^>TM(~y_M9Nq@*l5{d@Rhe-_ eAIw%?HDsrAXP$gst>IIS{J=gfoEHyLQ$s_s%qyG# literal 633 zcmV-<0*3ukQ$s@n000005C8zn2LJ$J0ssIgwJ-f(%Lcs?00tOSJy30u4rmZF(-w?* z2~<_hJ530N)2#g_%eVL5Yi!fB+*>Yy`dw9)z*dK=M7btJUA$vNYyBTa8)5%wKLtJj zI{-xh>-H(!_`+RN#a2#NbZQrC;#~f3Id4haU=pEL4F3iEU+@koR+t!}h#2u7z&Wf8 zH4QMf*4Lng|CRq37k|9*xa4if@u*d@b&$ek+Z^R<9bd`mBq7brQtru{VSWDxoGsJ1 z1)EydwA3ZH=l=j-7N3$aYCLKT3^D3`85K@WPFS?=&*5`9f?91Vl;$?*MG$Ffnkj`$ zzB6*Jd7huU!DKu1An9&0aF?*v(o5u9>F z?w?-Bf&=(Id}s~}vNw3jh87664v4@-r+_1sQgX}wb1CvZCShw2Np-~!P{DWBf+7A= zvCd?jan;NEZ^u(XC+0G1dkyN5pE3T57)Y>jalwt97{;OB;tVAGbiclVSiX-;98{hq zFzOE_ps%S&<3s$hP?CuY+lGBe5?7EtwlHuyDbqz2X>0+XVO{jQd2`i^HU+$ diff --git a/resources/plants/Aloe.tres b/resources/plants/Aloe.tres index ef38f1b..78a8d0b 100644 --- a/resources/plants/Aloe.tres +++ b/resources/plants/Aloe.tres @@ -1,14 +1,16 @@ [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" path="res://scripts/resources/PlantResource.cs" id="1_vw2kg"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/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") +display_name = "Aloe" +display_description = "Heals plantoids" Cost = 75 Scene = ExtResource("2_6a4ia") ReloadTime = 15.0 -StartReloadTime = 0.0 +ReloadProgress = 0.0 Preview = ExtResource("1_t4137") Layer = 1 diff --git a/resources/plants/Garlic.tres b/resources/plants/Garlic.tres index 87cee87..f418eb4 100644 --- a/resources/plants/Garlic.tres +++ b/resources/plants/Garlic.tres @@ -1,11 +1,13 @@ [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" path="res://scripts/resources/PlantResource.cs" id="1_e15gf"] -[ext_resource type="PackedScene" uid="uid://bes4e6sksax67" path="res://scenes/entities/plants/garlic.tscn" id="2_81n0p"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/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") +display_name = "Garlic" +display_description = "Redirects zomboids" Cost = 50 Scene = ExtResource("2_81n0p") ReloadTime = 7.5 diff --git a/resources/plants/Peashooter.tres b/resources/plants/Peashooter.tres index dd296be..5bf5a93 100644 --- a/resources/plants/Peashooter.tres +++ b/resources/plants/Peashooter.tres @@ -6,6 +6,18 @@ [resource] script = ExtResource("1_amvh8") +display_name = "Peashooter" +display_description = "Shoots peas +Shoots peas +Shoots peas +Shoots peas + +Shoots peas +Shoots peas + +Shoots peas +Shoots peas +Shoots peas" Cost = 75 Scene = ExtResource("1_rqf2x") ReloadTime = 5.0 diff --git a/resources/plants/PotatoMine.tres b/resources/plants/PotatoMine.tres index 162db8c..7a32d9f 100644 --- a/resources/plants/PotatoMine.tres +++ b/resources/plants/PotatoMine.tres @@ -6,6 +6,8 @@ [resource] script = ExtResource("1_33j6b") +display_name = "Potato mine" +display_description = "Blow" Cost = 25 Scene = ExtResource("2_ig2ti") ReloadTime = 25.0 diff --git a/resources/plants/Snowpea.tres b/resources/plants/Snowpea.tres index cb675e7..841a7d2 100644 --- a/resources/plants/Snowpea.tres +++ b/resources/plants/Snowpea.tres @@ -1,14 +1,16 @@ [gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://duflq3eexs6m"] -[ext_resource type="Script" path="res://scripts/resources/PlantResource.cs" id="1_0cpi0"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/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") +display_name = "Snowgrave" +display_description = "Proceed." Cost = 175 Scene = ExtResource("2_k47h0") ReloadTime = 5.0 -StartReloadTime = 0.0 +ReloadProgress = 0.0 Preview = ExtResource("1_7fyy2") Layer = 1 diff --git a/resources/plants/Spikeweed.tres b/resources/plants/Spikeweed.tres index 3c14710..e3751a8 100644 --- a/resources/plants/Spikeweed.tres +++ b/resources/plants/Spikeweed.tres @@ -1,14 +1,16 @@ [gd_resource type="Resource" script_class="PlantResource" load_steps=4 format=3 uid="uid://cas11tg6chiu4"] -[ext_resource type="Script" path="res://scripts/resources/PlantResource.cs" id="1_0bymo"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/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") +display_name = "Spikeweed" +display_description = "Walk" Cost = 100 Scene = ExtResource("2_iv8de") ReloadTime = 5.0 -StartReloadTime = 0.0 +ReloadProgress = 0.0 Preview = ExtResource("1_2ol2i") Layer = 1 diff --git a/resources/plants/Sunflower.tres b/resources/plants/Sunflower.tres index 2ef6c23..010c1ee 100644 --- a/resources/plants/Sunflower.tres +++ b/resources/plants/Sunflower.tres @@ -6,6 +6,8 @@ [resource] script = ExtResource("3_vt4jc") +display_name = "Sunflower" +display_description = "Suns" Cost = 50 Scene = ExtResource("2_gcyr5") ReloadTime = 5.0 diff --git a/resources/plants/Threepeater.tres b/resources/plants/Threepeater.tres index c2cf45b..54d1f19 100644 --- a/resources/plants/Threepeater.tres +++ b/resources/plants/Threepeater.tres @@ -6,6 +6,8 @@ [resource] script = ExtResource("3_3lugi") +display_name = "Threepeater" +display_description = "WIP" Cost = 300 Scene = ExtResource("2_uqpu0") ReloadTime = 5.0 diff --git a/resources/plants/Wallnut.tres b/resources/plants/Wallnut.tres index c975f37..26d7682 100644 --- a/resources/plants/Wallnut.tres +++ b/resources/plants/Wallnut.tres @@ -1,11 +1,13 @@ [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" path="res://scripts/resources/PlantResource.cs" id="1_27l0t"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/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") +display_name = "Wallnut" +display_description = "Pechenka" Cost = 50 Scene = ExtResource("2_rkn3h") ReloadTime = 20.0 diff --git a/resources/themes/ChooseYourSeeds.tres b/resources/themes/ChooseYourSeeds.tres index 4347cfe..fe483d4 100644 --- a/resources/themes/ChooseYourSeeds.tres +++ b/resources/themes/ChooseYourSeeds.tres @@ -1,4 +1,4 @@ -[gd_resource type="Theme" load_steps=10 format=3 uid="uid://e8n88g31w7x7"] +[gd_resource type="Theme" load_steps=13 format=3 uid="uid://e8n88g31w7x7"] [ext_resource type="Texture2D" uid="uid://ci1a150qo2op2" path="res://assets/sprites/gui/ChooseYourSeeds/Panel.tres" id="1_86pbs"] [ext_resource type="Texture2D" uid="uid://bj5fouwjk3kum" path="res://assets/sprites/gui/ChooseYourSeeds/InnerPanel.tres" id="2_txg3r"] @@ -19,6 +19,27 @@ texture_margin_top = 6.0 texture_margin_right = 4.0 texture_margin_bottom = 3.0 +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_qlmyy"] +texture = ExtResource("3_gf6bj") +texture_margin_left = 4.0 +texture_margin_top = 7.0 +texture_margin_right = 4.0 +texture_margin_bottom = 7.0 + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_la16p"] +texture = ExtResource("4_xn7o0") +texture_margin_left = 4.0 +texture_margin_top = 4.0 +texture_margin_right = 4.0 +texture_margin_bottom = 4.0 + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_744lb"] +texture = ExtResource("4_xn7o0") +texture_margin_left = 4.0 +texture_margin_top = 4.0 +texture_margin_right = 4.0 +texture_margin_bottom = 4.0 + [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_amjg8"] bg_color = Color(0.574582, 0.300953, 0.501998, 1) corner_radius_top_left = 4 @@ -43,6 +64,11 @@ texture_margin_bottom = 4.0 [resource] Panel/styles/panel = SubResource("StyleBoxTexture_o7bns") PanelContainer/styles/panel = SubResource("StyleBoxTexture_jrih7") +VScrollBar/styles/grabber = SubResource("StyleBoxTexture_qlmyy") +VScrollBar/styles/grabber_highlight = SubResource("StyleBoxTexture_qlmyy") +VScrollBar/styles/grabber_pressed = SubResource("StyleBoxTexture_qlmyy") +VScrollBar/styles/scroll = SubResource("StyleBoxTexture_la16p") +VScrollBar/styles/scroll_focus = SubResource("StyleBoxTexture_744lb") VSlider/icons/grabber = ExtResource("3_gf6bj") VSlider/icons/grabber_disabled = null VSlider/icons/grabber_highlight = ExtResource("3_gf6bj") diff --git a/resources/zombies/buckethead.tres b/resources/zombies/buckethead.tres index 6971f02..2721cfd 100644 --- a/resources/zombies/buckethead.tres +++ b/resources/zombies/buckethead.tres @@ -5,6 +5,6 @@ [resource] script = ExtResource("1_sngfh") -cost = 7 +cost = 5.0 scene = ExtResource("1_lhcag") metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/resources/zombies/conehead.tres b/resources/zombies/conehead.tres index 8e9bc33..8e21ed2 100644 --- a/resources/zombies/conehead.tres +++ b/resources/zombies/conehead.tres @@ -5,6 +5,6 @@ [resource] script = ExtResource("1_sw7hj") -cost = 3 +cost = 2.0 scene = ExtResource("1_llf5l") metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/resources/zombies/hobo.tres b/resources/zombies/hobo.tres index 309bb06..0be10aa 100644 --- a/resources/zombies/hobo.tres +++ b/resources/zombies/hobo.tres @@ -5,6 +5,6 @@ [resource] script = ExtResource("1_u5qpq") -cost = 5 +cost = 7.0 scene = ExtResource("1_4myt6") metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/scenes/entities/Zombies/bucket_zombie.tscn b/scenes/entities/Zombies/bucket_zombie.tscn index 473b39f..7741a44 100644 --- a/scenes/entities/Zombies/bucket_zombie.tscn +++ b/scenes/entities/Zombies/bucket_zombie.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://xu4i6tmkv00a"] +[gd_scene load_steps=8 format=3 uid="uid://xu4i6tmkv00a"] [ext_resource type="PackedScene" uid="uid://hhjbqkjqpt7x" path="res://scenes/entities/Zombies/cone_zombie.tscn" id="1_mwqpo"] [ext_resource type="Shader" uid="uid://d0eo5uuj222c4" path="res://assets/shaders/CG_color_blender.gdshader" id="2_3mrqj"] [ext_resource type="Texture2D" uid="uid://ce04l60l6mhfk" path="res://assets/sprites/bucket.tres" id="3_0nlp0"] +[ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_1s2fn"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_wdi07"] resource_local_to_scene = true @@ -10,6 +11,20 @@ shader = ExtResource("2_3mrqj") shader_parameter/blend_color = Color(1, 1, 1, 1) shader_parameter/amount = 0.0 +[sub_resource type="Resource" id="Resource_2bm8y"] +resource_local_to_scene = true +script = ExtResource("4_1s2fn") +flat_value = 10.0 +percentage_value = 0.0 +mult_value = 1.0 + +[sub_resource type="Resource" id="Resource_lt6ps"] +resource_local_to_scene = true +script = ExtResource("4_1s2fn") +flat_value = 0.2 +percentage_value = 0.0 +mult_value = 1.0 + [node name="BucketZombie" instance=ExtResource("1_mwqpo")] [node name="CanvasGroup" parent="." index="0"] @@ -19,5 +34,11 @@ material = SubResource("ShaderMaterial_wdi07") position = Vector2(-12, -83) texture = ExtResource("3_0nlp0") +[node name="Eatbox" parent="." index="2"] +_damage = SubResource("Resource_2bm8y") + +[node name="Mover" parent="." index="5"] +_speed = SubResource("Resource_lt6ps") + [node name="Armor" parent="." index="7"] -_maxHP = 180 +_maxHP = 385 diff --git a/scenes/entities/Zombies/cone_zombie.tscn b/scenes/entities/Zombies/cone_zombie.tscn index e8588de..3fdcade 100644 --- a/scenes/entities/Zombies/cone_zombie.tscn +++ b/scenes/entities/Zombies/cone_zombie.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=6 format=3 uid="uid://hhjbqkjqpt7x"] +[gd_scene load_steps=9 format=3 uid="uid://hhjbqkjqpt7x"] [ext_resource type="PackedScene" uid="uid://co11v3w8hbwgf" path="res://scenes/entities/Zombies/zombie.tscn" id="1_3dq4c"] [ext_resource type="Shader" uid="uid://d0eo5uuj222c4" path="res://assets/shaders/CG_color_blender.gdshader" id="2_2dq8e"] [ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/components/Armor.cs" id="3_5s7in"] [ext_resource type="Texture2D" uid="uid://ceqvdmude7cgg" path="res://assets/sprites/cone.tres" id="4_qdhik"] +[ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_qof5v"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sat5k"] resource_local_to_scene = true @@ -11,6 +12,20 @@ shader = ExtResource("2_2dq8e") shader_parameter/blend_color = Color(1, 1, 1, 1) shader_parameter/amount = 0.0 +[sub_resource type="Resource" id="Resource_w70im"] +resource_local_to_scene = true +script = ExtResource("4_qof5v") +flat_value = 10.0 +percentage_value = 0.0 +mult_value = 1.0 + +[sub_resource type="Resource" id="Resource_qof5v"] +resource_local_to_scene = true +script = ExtResource("4_qof5v") +flat_value = 0.2 +percentage_value = 0.0 +mult_value = 1.0 + [node name="ConeZombie" node_paths=PackedStringArray("_armor") instance=ExtResource("1_3dq4c")] _armor = NodePath("Armor") @@ -21,8 +36,14 @@ material = SubResource("ShaderMaterial_sat5k") position = Vector2(-12, -88) texture = ExtResource("4_qdhik") +[node name="Eatbox" parent="." index="2"] +_damage = SubResource("Resource_w70im") + +[node name="Mover" parent="." index="5"] +_speed = SubResource("Resource_qof5v") + [node name="Armor" type="Node" parent="." index="7"] script = ExtResource("3_5s7in") -_maxHP = 60 +_maxHP = 130 [connection signal="ArmorLost" from="Armor" to="CanvasGroup/Hat" method="queue_free"] diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index 390f5e1..58fad32 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=31 format=3 uid="uid://bgqmwsb6ynm81"] +[gd_scene load_steps=34 format=3 uid="uid://bgqmwsb6ynm81"] [ext_resource type="PackedScene" uid="uid://co11v3w8hbwgf" path="res://scenes/entities/Zombies/zombie.tscn" id="1_fnu7s"] [ext_resource type="Shader" uid="uid://d0eo5uuj222c4" path="res://assets/shaders/CG_color_blender.gdshader" id="2_6qr4h"] [ext_resource type="Texture2D" uid="uid://cse1504ao4g8e" path="res://assets/sprites/atlases/zombies/hobo.png" id="3_6qr4h"] [ext_resource type="AnimationLibrary" uid="uid://cuh2kyb21hmkm" path="res://resources/animations/zombies/basic_zombie.res" id="4_02fim"] [ext_resource type="Script" uid="uid://c5v2og85t7s6j" path="res://scripts/components/zombies/behaviours/HoboBehaviour.cs" id="4_5selg"] +[ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_c1y3b"] [ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/components/Armor.cs" id="4_w8pya"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_w8pya"] @@ -21,6 +22,13 @@ region = Rect2(0, 15, 40, 49) atlas = ExtResource("3_6qr4h") region = Rect2(3, 0, 35, 11) +[sub_resource type="Resource" id="Resource_qg8rq"] +resource_local_to_scene = true +script = ExtResource("4_c1y3b") +flat_value = 10.0 +percentage_value = 0.0 +mult_value = 1.0 + [sub_resource type="Animation" id="Animation_qv5y7"] length = 0.001 tracks/0/type = "value" @@ -35,6 +43,18 @@ tracks/0/keys = { "update": 0, "values": [Color(1, 1, 1, 1)] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Mover:_speedControlMult") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_sq25x"] _data = { @@ -50,12 +70,9 @@ tracks/0/path = NodePath("Mover") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 1.93333), -"transitions": PackedFloat32Array(1, 1), +"times": PackedFloat32Array(1.93333), +"transitions": PackedFloat32Array(1), "values": [{ -"args": [0.0], -"method": &"SetSpeedMult" -}, { "args": [3.0], "method": &"SetSpeedMult" }] @@ -72,22 +89,32 @@ tracks/1/keys = { "update": 0, "values": [Color(1, 1, 1, 1), Color(1, 0, 0, 1)] } +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Mover:_speedControlMult") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [0.0, 1.0] +} [sub_resource type="Animation" id="Animation_5selg"] resource_name = "walk" -tracks/0/type = "method" +tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("Mover") +tracks/0/path = NodePath("Mover:_speedControlMult") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"values": [{ -"args": [0.1], -"method": &"SetSpeedFlat" -}] +"update": 0, +"values": [1.0] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_5selg"] @@ -165,6 +192,13 @@ states/hobo_zombie_run/position = Vector2(866, 89) transitions = ["Start", "basic_zombie_idle", SubResource("AnimationNodeStateMachineTransition_vxhht"), "basic_zombie_idle", "basic_zombie_eat", SubResource("AnimationNodeStateMachineTransition_y2ivb"), "basic_zombie_walk", "basic_zombie_eat", SubResource("AnimationNodeStateMachineTransition_7d3k4"), "basic_zombie_idle", "basic_zombie_walk", SubResource("AnimationNodeStateMachineTransition_qg8rq"), "basic_zombie_idle", "hobo_zombie_run", SubResource("AnimationNodeStateMachineTransition_4248q"), "hobo_zombie_run", "basic_zombie_eat", SubResource("AnimationNodeStateMachineTransition_tu6af"), "basic_zombie_eat", "hobo_zombie_run", SubResource("AnimationNodeStateMachineTransition_yalvk"), "hobo_zombie_can_destroy", "basic_zombie_idle", SubResource("AnimationNodeStateMachineTransition_7jlle"), "basic_zombie_eat", "basic_zombie_walk", SubResource("AnimationNodeStateMachineTransition_w1b1s"), "basic_zombie_walk", "hobo_zombie_run", SubResource("AnimationNodeStateMachineTransition_02fim")] graph_offset = Vector2(55, -28) +[sub_resource type="Resource" id="Resource_4248q"] +resource_local_to_scene = true +script = ExtResource("4_c1y3b") +flat_value = 0.2 +percentage_value = 0.0 +mult_value = 1.0 + [node name="Hobo" node_paths=PackedStringArray("_armor") instance=ExtResource("1_fnu7s")] _armor = NodePath("CanArmor") @@ -182,6 +216,9 @@ z_index = -1 position = Vector2(-6, -63) texture = SubResource("AtlasTexture_5selg") +[node name="Eatbox" parent="." index="2"] +_damage = SubResource("Resource_qg8rq") + [node name="AnimationPlayer" parent="." index="3"] libraries = { &"": SubResource("AnimationLibrary_sq25x"), @@ -195,9 +232,12 @@ speed_scale = 3.0 tree_root = SubResource("AnimationNodeStateMachine_xg3p6") advance_expression_base_node = NodePath("../Behaviour") +[node name="Mover" parent="." index="5"] +_speed = SubResource("Resource_4248q") + [node name="CanArmor" type="Node" parent="." index="7"] script = ExtResource("4_w8pya") -_maxHP = 100 +_maxHP = 180 metadata/_custom_type_script = "uid://fd4im1fmwc5n" [node name="Behaviour" type="Node" parent="." index="8" node_paths=PackedStringArray("_eatBox", "_animationTree")] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index d14e135..53a6d26 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -21,6 +21,7 @@ shader_parameter/amount = 0.0 size = Vector2(2, 48) [sub_resource type="Resource" id="Resource_ruqsf"] +resource_local_to_scene = true script = ExtResource("7_b3p4o") flat_value = 10.0 percentage_value = 0.0 @@ -34,14 +35,14 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("AnimationTree:parameters/conditions/no_can") +tracks/0/path = NodePath("Mover:_speedControlMult") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] +"update": 0, +"values": [0.0] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_sq25x"] @@ -88,15 +89,16 @@ transitions = ["Start", "basic_zombie_idle", SubResource("AnimationNodeStateMach graph_offset = Vector2(13, 26) [sub_resource type="Resource" id="Resource_ckb7n"] +resource_local_to_scene = true script = ExtResource("7_b3p4o") -flat_value = 0.1 +flat_value = 0.2 percentage_value = 0.0 mult_value = 1.0 [node name="Zombie" type="Node2D"] y_sort_enabled = true script = ExtResource("1_qq3f1") -_maxHP = 100 +_maxHP = 70 [node name="CanvasGroup" type="CanvasGroup" parent="."] material = SubResource("ShaderMaterial_63ls2") diff --git a/scenes/entities/plants/peashooter.tscn b/scenes/entities/plants/peashooter.tscn index dd01d96..80bd2df 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -54,6 +54,7 @@ states/peashooter_shoot/position = Vector2(674, 82) transitions = ["Start", "peashooter_idle", SubResource("AnimationNodeStateMachineTransition_70n3m"), "peashooter_idle", "peashooter_shoot", SubResource("AnimationNodeStateMachineTransition_2lwpg"), "peashooter_shoot", "peashooter_idle", SubResource("AnimationNodeStateMachineTransition_k61yr")] [sub_resource type="SegmentShape2D" id="SegmentShape2D_8iovl"] +resource_local_to_scene = true [sub_resource type="RectangleShape2D" id="RectangleShape2D_r7xnh"] size = Vector2(20, 44) diff --git a/scenes/entities/plants/snowpea.tscn b/scenes/entities/plants/snowpea.tscn index 575d9e4..eb784f2 100644 --- a/scenes/entities/plants/snowpea.tscn +++ b/scenes/entities/plants/snowpea.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://b7innrovtmf5u"] +[gd_scene load_steps=14 format=3 uid="uid://b7innrovtmf5u"] [ext_resource type="PackedScene" uid="uid://dy41q1kxray5t" path="res://scenes/entities/plants/peashooter.tscn" id="1_lp85e"] [ext_resource type="Texture2D" uid="uid://cu0651pvvkmvm" path="res://assets/sprites/atlases/plants/snow_pea.png" id="2_ytrm0"] @@ -22,7 +22,7 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_djmlc"] _data = { -"RESET": SubResource("Animation_pephc") +&"RESET": SubResource("Animation_pephc") } [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_dv2ad"] @@ -49,6 +49,9 @@ states/snowpea_shoot/node = SubResource("AnimationNodeAnimation_ptach") states/snowpea_shoot/position = Vector2(682, 100) transitions = ["snowpea_shoot", "snowpea_idle", SubResource("AnimationNodeStateMachineTransition_8spty"), "Start", "snowpea_idle", SubResource("AnimationNodeStateMachineTransition_lshcr"), "snowpea_idle", "snowpea_shoot", SubResource("AnimationNodeStateMachineTransition_ihul0")] +[sub_resource type="SegmentShape2D" id="SegmentShape2D_3oyhk"] +resource_local_to_scene = true + [node name="Snowpea" instance=ExtResource("1_lp85e")] [node name="Sprite2D" parent="." index="0"] @@ -56,8 +59,8 @@ texture = ExtResource("2_ytrm0") [node name="AnimationPlayer" parent="." index="1"] libraries = { -"": SubResource("AnimationLibrary_djmlc"), -"snowpea": ExtResource("4_jvx5y") +&"": SubResource("AnimationLibrary_djmlc"), +&"snowpea": ExtResource("4_jvx5y") } autoplay = "snowpea/idle" @@ -66,3 +69,6 @@ tree_root = SubResource("AnimationNodeStateMachine_qdmro") [node name="Shooter" parent="." index="3"] _projectile = ExtResource("5_bv86m") + +[node name="CollisionShape2D" parent="Eysight" index="0"] +shape = SubResource("SegmentShape2D_3oyhk") diff --git a/scenes/entities/plants/sunflower.tscn b/scenes/entities/plants/sunflower.tscn index 1015bfb..156f60a 100644 --- a/scenes/entities/plants/sunflower.tscn +++ b/scenes/entities/plants/sunflower.tscn @@ -3,9 +3,9 @@ [ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_bikjn"] [ext_resource type="Texture2D" uid="uid://b3tuidu8dag8u" path="res://assets/sprites/atlases/plants/sunflower.png" id="2_fwcda"] [ext_resource type="AnimationLibrary" uid="uid://yjytiuj4u7oh" path="res://resources/animations/plants/sunflower.res" id="3_btsik"] -[ext_resource type="Script" path="res://scripts/components/plants/PlantSunSpawner.cs" id="3_te0pl"] +[ext_resource type="Script" uid="uid://b71gebny84s81" path="res://scripts/components/plants/PlantSunSpawner.cs" id="3_te0pl"] [ext_resource type="PackedScene" uid="uid://bpekho7leatr5" path="res://scenes/sun.tscn" id="4_b8hls"] -[ext_resource type="Script" path="res://scripts/components/plants/behaviours/SunflowerBehaviour.cs" id="5_26je0"] +[ext_resource type="Script" uid="uid://bth7gah4tn7uj" path="res://scripts/components/plants/behaviours/SunflowerBehaviour.cs" id="5_26je0"] [sub_resource type="Animation" id="Animation_bfx6v"] length = 0.001 @@ -24,7 +24,7 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_ek2al"] _data = { -"RESET": SubResource("Animation_bfx6v") +&"RESET": SubResource("Animation_bfx6v") } [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_lkpmx"] @@ -60,12 +60,12 @@ size = Vector2(26, 48) texture = ExtResource("2_fwcda") hframes = 9 vframes = 2 -frame = 1 +frame = 2 [node name="AnimationPlayer" parent="." index="1"] libraries = { -"": SubResource("AnimationLibrary_ek2al"), -"sunflower": ExtResource("3_btsik") +&"": SubResource("AnimationLibrary_ek2al"), +&"sunflower": ExtResource("3_btsik") } [node name="AnimationTree" parent="." index="2"] @@ -82,7 +82,11 @@ _amountPerSun = 25 script = ExtResource("5_26je0") [node name="Timer" type="Timer" parent="Behaviour" index="0"] -wait_time = 5.0 +wait_time = 24.25 + +[node name="StartTimer" type="Timer" parent="Behaviour" index="1"] +wait_time = 12.0 +one_shot = true autostart = true [node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] @@ -90,3 +94,5 @@ position = Vector2(0, 4) shape = SubResource("RectangleShape2D_4xs4g") [connection signal="timeout" from="Behaviour/Timer" to="Behaviour" method="Timeout"] +[connection signal="timeout" from="Behaviour/StartTimer" to="Behaviour" method="Timeout"] +[connection signal="timeout" from="Behaviour/StartTimer" to="Behaviour/Timer" method="start"] diff --git a/scenes/entities/plants/threepeater.tscn b/scenes/entities/plants/threepeater.tscn index 8b2b8f5..d132a36 100644 --- a/scenes/entities/plants/threepeater.tscn +++ b/scenes/entities/plants/threepeater.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://eegv1qihfv2q"] +[gd_scene load_steps=12 format=3 uid="uid://eegv1qihfv2q"] [ext_resource type="PackedScene" uid="uid://dy41q1kxray5t" path="res://scenes/entities/plants/peashooter.tscn" id="1_muntu"] [ext_resource type="Script" uid="uid://djpc0kvagpadv" path="res://scripts/components/plants/ThreepeaterShooter.cs" id="2_ieami"] @@ -96,7 +96,11 @@ _data = { &"shoot": SubResource("Animation_7sohe") } +[sub_resource type="SegmentShape2D" id="SegmentShape2D_j7h7q"] +resource_local_to_scene = true + [sub_resource type="SegmentShape2D" id="SegmentShape2D_yb26d"] +resource_local_to_scene = true [node name="Threepeater" instance=ExtResource("1_muntu")] @@ -109,6 +113,9 @@ libraries = { [node name="Shooter" parent="." index="3"] script = ExtResource("2_ieami") +[node name="CollisionShape2D" parent="Eysight" index="0"] +shape = SubResource("SegmentShape2D_j7h7q") + [node name="CollisionShape2D2" type="CollisionShape2D" parent="Eysight" index="1"] position = Vector2(0, 60) shape = SubResource("SegmentShape2D_yb26d") diff --git a/scenes/gui/choose_your_seeds.tscn b/scenes/gui/choose_your_seeds.tscn index 15f745f..247cc58 100644 --- a/scenes/gui/choose_your_seeds.tscn +++ b/scenes/gui/choose_your_seeds.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://dpxxjfd5lv5sv"] +[gd_scene load_steps=15 format=3 uid="uid://dpxxjfd5lv5sv"] [ext_resource type="Theme" uid="uid://e8n88g31w7x7" path="res://resources/themes/ChooseYourSeeds.tres" id="1_bfo8i"] [ext_resource type="Texture2D" uid="uid://dr8a0rx42o3qy" path="res://assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres" id="2_so2bw"] @@ -100,6 +100,13 @@ _data = { [sub_resource type="ViewportTexture" id="ViewportTexture_rmoaa"] viewport_path = NodePath("Panel/MarginContainer/VBoxContainer/HBoxContainer/Frame/Previewport") +[sub_resource type="LabelSettings" id="LabelSettings_fmc0y"] +font_size = 24 +font_color = Color(0, 0, 0, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_ln6r7"] +font_color = Color(0, 0, 0, 1) + [node name="ChooseYourSeeds" type="Control"] process_mode = 3 layout_mode = 3 @@ -151,10 +158,12 @@ layout_mode = 2 layout_mode = 2 texture = ExtResource("2_so2bw") -[node name="Previewport" type="SubViewport" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/Frame"] +[node name="Previewport" type="SubViewport" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/Frame" node_paths=PackedStringArray("title", "description")] canvas_item_default_texture_filter = 0 size = Vector2i(65, 65) script = ExtResource("3_fmc0y") +title = NodePath("../../PanelContainer/ScrollContainer/VBoxContainer/Title") +description = NodePath("../../PanelContainer/ScrollContainer/VBoxContainer/Description") [node name="FrameField" type="Sprite2D" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/Frame/Previewport"] texture = ExtResource("3_rn5vx") @@ -175,6 +184,25 @@ texture = SubResource("ViewportTexture_rmoaa") layout_mode = 2 size_flags_horizontal = 3 +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer"] +layout_mode = 2 +horizontal_scroll_mode = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Title" type="Label" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer/VBoxContainer"] +layout_mode = 2 +label_settings = SubResource("LabelSettings_fmc0y") +horizontal_alignment = 1 + +[node name="Description" type="Label" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/PanelContainer/ScrollContainer/VBoxContainer"] +layout_mode = 2 +text = " +" +label_settings = SubResource("LabelSettings_ln6r7") + [node name="ScrollContainer" type="ScrollContainer" parent="Panel/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 diff --git a/scenes/level components/left_boundary_marker.tscn b/scenes/level components/left_boundary_marker.tscn new file mode 100644 index 0000000..8d32bbd --- /dev/null +++ b/scenes/level components/left_boundary_marker.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://plc2gus4ppds"] + +[ext_resource type="Script" uid="uid://d2dq6f0bk7pfx" path="res://scripts/components/level/LeftBoundaryMarker.cs" id="1_q4xoc"] + +[node name="LeftBoundaryMarker" type="Marker2D"] +script = ExtResource("1_q4xoc") diff --git a/scenes/level components/right_boundary_marker.tscn b/scenes/level components/right_boundary_marker.tscn new file mode 100644 index 0000000..72bc133 --- /dev/null +++ b/scenes/level components/right_boundary_marker.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://jm7wm08d2mi7"] + +[ext_resource type="Script" uid="uid://bymylx25skfot" path="res://scripts/components/level/RightBoundaryMarker.cs" id="1_cf1wn"] + +[node name="right_boundary_marker" type="Marker2D"] +script = ExtResource("1_cf1wn") diff --git a/scenes/projectiles/pea.tscn b/scenes/projectiles/pea.tscn index c880e8b..48d33f1 100644 --- a/scenes/projectiles/pea.tscn +++ b/scenes/projectiles/pea.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://b2hrv0aqbui7u"] -[ext_resource type="Script" path="res://scripts/components/LinearProjectile.cs" id="1_3kc4s"] +[ext_resource type="Script" uid="uid://dxlwvwy3hj56x" path="res://scripts/components/LinearProjectile.cs" id="1_3kc4s"] [ext_resource type="Texture2D" uid="uid://dq0mul65hevtt" path="res://assets/sprites/plants/pea.tres" id="2_26q5x"] [sub_resource type="CircleShape2D" id="CircleShape2D_ix1sk"] diff --git a/scenes/projectiles/snowpea_projectile.tscn b/scenes/projectiles/snowpea_projectile.tscn index b141c84..0f46653 100644 --- a/scenes/projectiles/snowpea_projectile.tscn +++ b/scenes/projectiles/snowpea_projectile.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=5 format=3 uid="uid://domeukw4ucmyr"] -[ext_resource type="Script" path="res://scripts/components/LinearProjectile.cs" id="1_fkydi"] +[ext_resource type="Script" uid="uid://dxlwvwy3hj56x" path="res://scripts/components/LinearProjectile.cs" id="1_fkydi"] [ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://resources/effects/SnowSlow.tres" id="2_fn62x"] [ext_resource type="Texture2D" uid="uid://dn4l67snkx5mr" path="res://assets/sprites/plants/snowpea_projectile.tres" id="2_xt8td"] diff --git a/scenes/prototype_survival.tscn b/scenes/prototype_survival.tscn index f42552a..cb4bd37 100644 --- a/scenes/prototype_survival.tscn +++ b/scenes/prototype_survival.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://c1335fke4thpm"] +[gd_scene load_steps=15 format=3 uid="uid://c1335fke4thpm"] [ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/components/level/RuntimeLevelData.cs" id="1_tnxdx"] [ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/background_summer.png" id="1_vafkg"] @@ -9,6 +9,23 @@ [ext_resource type="Script" uid="uid://cslqjdd5wq4rc" path="res://scripts/components/level/SunSpawner.cs" id="7_gnb05"] [ext_resource type="PackedScene" uid="uid://bpekho7leatr5" path="res://scenes/sun.tscn" id="8_8nyym"] [ext_resource type="Script" uid="uid://bsuw5lvnr3kol" path="res://scripts/components/level/zombe_spawners/ZombieSequencer.cs" id="9_8nyym"] +[ext_resource type="PackedScene" uid="uid://jm7wm08d2mi7" path="res://scenes/level components/right_boundary_marker.tscn" id="9_q2l3d"] +[ext_resource type="Script" uid="uid://nkb6i7lrkl8y" path="res://scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs" id="10_1kjp6"] +[ext_resource type="PackedScene" uid="uid://plc2gus4ppds" path="res://scenes/level components/left_boundary_marker.tscn" id="10_5h8lk"] + +[sub_resource type="GDScript" id="GDScript_1kjp6"] +resource_name = "zombiePoints" +script/source = "extends Label + + +func _process(delta: float) -> void: + text = str(get_node(\"../SurvivalAI\").get(\"points\")) + \"\\n\" + str(get_node(\"../SurvivalAI\").time) +" + +[sub_resource type="Curve" id="Curve_1kjp6"] +_limits = [0.0, 5.0, 0.0, 2000.0] +_data = [Vector2(0, 0), 0.0, 0.000634783, 0, 0, Vector2(19.8456, 0.0978518), 0.0, 0.0, 0, 0, Vector2(114.664, 0.12832), 0.0, 0.0, 0, 0, Vector2(213.892, 0.465625), 0.0017272, 0.00230293, 0, 0, Vector2(1499.45, 2.99414), 0.0, 0.00350837, 0, 0, Vector2(2000, 5), 0.00737658, 0.0, 0, 0] +point_count = 6 [node name="PrototypeSurvival" type="Node2D"] @@ -21,6 +38,14 @@ position = Vector2(500, 200) texture = ExtResource("1_vafkg") metadata/_edit_lock_ = true +[node name="Label" type="Label" parent="."] +z_index = 3465 +offset_left = 678.0 +offset_top = 362.0 +offset_right = 718.0 +offset_bottom = 379.0 +script = SubResource("GDScript_1kjp6") + [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(481, 200) metadata/_edit_lock_ = true @@ -68,15 +93,42 @@ script = ExtResource("7_gnb05") SunScene = ExtResource("8_8nyym") [node name="Timer" type="Timer" parent="SunSpawner"] -wait_time = 15.0 +wait_time = 10.0 +autostart = true -[node name="ZombieSequencer" type="Node2D" parent="."] +[node name="right_boundary_marker" parent="." instance=ExtResource("9_q2l3d")] +position = Vector2(755, 376) + +[node name="LeftBoundaryMarker" parent="." instance=ExtResource("10_5h8lk")] +position = Vector2(305, 76) + +[node name="ZombieSequencer" type="Node2D" parent="." node_paths=PackedStringArray("spawnTimer", "waveTimer")] position = Vector2(823, 0) script = ExtResource("9_8nyym") +spawnTimer = NodePath("Timer") +waveTimer = NodePath("../SurvivalAI/Timer") [node name="Timer" type="Timer" parent="ZombieSequencer"] -wait_time = 5.0 +wait_time = 2.5 +autostart = true + +[node name="SurvivalAI" type="Node" parent="."] +script = ExtResource("10_1kjp6") +supportPool = Array[String](["hobo"]) +tankPool = Array[String](["conehead", "buckethead", "hobo"]) +hordePool = Array[String](["basic", "conehead", "buckethead"]) +velocity_curve = SubResource("Curve_1kjp6") + +[node name="Timer" type="Timer" parent="SurvivalAI"] +wait_time = 10.0 + +[node name="Timer" type="Timer" parent="SurvivalAI/Timer"] +wait_time = 20.0 +one_shot = true autostart = true [connection signal="timeout" from="SunSpawner/Timer" to="SunSpawner" method="Spawn"] [connection signal="timeout" from="ZombieSequencer/Timer" to="ZombieSequencer" method="FormSquad"] +[connection signal="timeout" from="SurvivalAI/Timer" to="SurvivalAI" method="SummonWave"] +[connection signal="timeout" from="SurvivalAI/Timer/Timer" to="SurvivalAI" method="SummonWave"] +[connection signal="timeout" from="SurvivalAI/Timer/Timer" to="SurvivalAI/Timer" method="start"] diff --git a/scripts/DebugZombieSpawner.cs b/scripts/DebugZombieSpawner.cs index cbab253..0ee0f30 100644 --- a/scripts/DebugZombieSpawner.cs +++ b/scripts/DebugZombieSpawner.cs @@ -37,7 +37,7 @@ public partial class DebugZombieSpawner : PopupPanel { return; } - + ZombieSequencer.Instance.DebugClearQueue(); for(int i = 0; i < spin.Value; i++) { ZombieSequencer.Instance.Add(variants[0]); diff --git a/scripts/Utility.cs b/scripts/Utility.cs index 7de042a..d2e86f0 100644 --- a/scripts/Utility.cs +++ b/scripts/Utility.cs @@ -25,8 +25,8 @@ public class Utility public const int TileWidth = 50; public const int TileHeight = 60; public const int LayersCount = 3; - public static readonly Vector2I LeftFieldBoundary = new(305,76); - public static readonly Vector2I RightFieldBoundary = new(755,376); + public static Vector2I LeftFieldBoundary = new(305,76); + public static Vector2I RightFieldBoundary = new(755,376); public static readonly Vector2 Tile = new(TileWidth, TileHeight); diff --git a/scripts/components/gui/choose_your_seeds/Previewport.cs b/scripts/components/gui/choose_your_seeds/Previewport.cs index 12bdfd6..f1d88a7 100644 --- a/scripts/components/gui/choose_your_seeds/Previewport.cs +++ b/scripts/components/gui/choose_your_seeds/Previewport.cs @@ -7,6 +7,9 @@ public partial class Previewport : SubViewport { private RuntimePlantData current_display; + [Export] private Label title; + [Export] private Label description; + public override void _Ready() { GetParent().GetViewport().GuiFocusChanged += OnFocusChanged; @@ -28,6 +31,8 @@ public partial class Previewport : SubViewport current_display.QueueFree(); } current_display = resource.Scene.Instantiate(); + title.Text = resource.display_name; + description.Text = resource.display_description; AddChild(current_display); current_display.DisableBrain(); } diff --git a/scripts/components/level/LeftBoundaryMarker.cs b/scripts/components/level/LeftBoundaryMarker.cs new file mode 100644 index 0000000..6f9411a --- /dev/null +++ b/scripts/components/level/LeftBoundaryMarker.cs @@ -0,0 +1,12 @@ +using Godot; +using Newlon; + +public partial class LeftBoundaryMarker : Marker2D +{ + public override void _Ready() + { + Utility.LeftFieldBoundary = (Vector2I)GlobalPosition; + QueueFree(); + } + +} diff --git a/scripts/components/level/LeftBoundaryMarker.cs.uid b/scripts/components/level/LeftBoundaryMarker.cs.uid new file mode 100644 index 0000000..236a0d4 --- /dev/null +++ b/scripts/components/level/LeftBoundaryMarker.cs.uid @@ -0,0 +1 @@ +uid://d2dq6f0bk7pfx diff --git a/scripts/components/level/RightBoundaryMarker.cs b/scripts/components/level/RightBoundaryMarker.cs new file mode 100644 index 0000000..a477fdb --- /dev/null +++ b/scripts/components/level/RightBoundaryMarker.cs @@ -0,0 +1,12 @@ +using Godot; +using Newlon; + +public partial class RightBoundaryMarker : Marker2D +{ + public override void _Ready() + { + Utility.RightFieldBoundary = (Vector2I)GlobalPosition; + QueueFree(); + } + +} diff --git a/scripts/components/level/RightBoundaryMarker.cs.uid b/scripts/components/level/RightBoundaryMarker.cs.uid new file mode 100644 index 0000000..cd6d657 --- /dev/null +++ b/scripts/components/level/RightBoundaryMarker.cs.uid @@ -0,0 +1 @@ +uid://bymylx25skfot diff --git a/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs b/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs new file mode 100644 index 0000000..992e0e2 --- /dev/null +++ b/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs @@ -0,0 +1,170 @@ +using System.Collections.Generic; +using Godot; +using Godot.Collections; + +public partial class SurvivalZombieSpawner : Node +{ + // Zombie pools + // Points from pools go in that order: support -> tank -> horde -> bank + // Horde pool is allowed to shrink during runtime + [Export] private Array supportPool; + [Export] private Array tankPool; + [Export] private Array hordePool; + + private List cachedSupportPool; + private List cachedTankPool; + private List cachedHordePool; + + private float minSupportPoints; + private float minTankPoints; + private float minHordePoints; + + [Export] private float points = 0; + [Export] private float huge_wave_points; + [Export] private Curve velocity_curve; + private float velocity = 0; + [Export] private double time = 0.0; + private float fin_a; + private RandomNumberGenerator rng = new(); + + + public override void _Ready() + { + rng.Randomize(); + + cachedSupportPool = LoadFromRegistry(supportPool); + cachedTankPool = LoadFromRegistry(tankPool); + cachedHordePool = LoadFromRegistry(hordePool); + + cachedTankPool.Sort((x, y) => + { + return (int)(x.cost - y.cost); + }); + cachedHordePool.Sort((x, y) => + { + return (int)(x.cost - y.cost); + }); + + minSupportPoints = cachedSupportPool[0].cost; + minTankPoints = cachedTankPool[0].cost; + minHordePoints = cachedHordePool[0].cost; + + fin_a = (velocity_curve.Sample(velocity_curve.MaxDomain) - velocity_curve.Sample(velocity_curve.MaxDomain - 0.001f)) / 0.001f; + } + + public override void _Process(double delta) + { + points += velocity * (float)delta; + + if (time > velocity_curve.MaxDomain) + { + velocity += fin_a * (float)delta; + } + else + { + velocity = velocity_curve.Sample((float)time); + } + time += delta; + } + + public void SummonWave() + { + bool big_wave = false; + if ((int)time % 300 == 0) + { + points += velocity/velocity_curve.Sample((float)time)*huge_wave_points; + big_wave = true; + } + + float support_points = points * 0.2f; + float tank_points = points * 0.5f; + float horde_points = points * 0.3f; + points = 0; + + List wave = []; + var remaining = SummonTank(tank_points, wave); + support_points += remaining * 0.8f; + horde_points += remaining * 0.2f; + horde_points += SummonSupport(support_points, wave); + points += SummonHorde(horde_points, wave, big_wave); + + wave.Sort((x, y) => { return rng.RandiRange(-1, 1); }); + + foreach (var zom in wave) + { + ZombieSequencer.Instance.Add(zom.internal_id); + } + + big_wave = false; + } + + private float SummonSupport(float given_points, List wave) + { + if (cachedSupportPool.Count == 0) + { + return given_points; + } + while (given_points >= minSupportPoints) + { + var chosen_zombie = cachedSupportPool[rng.RandiRange(0, cachedSupportPool.Count - 1)]; + if (given_points - chosen_zombie.cost >= 0) + { + wave.Add(chosen_zombie); + given_points -= chosen_zombie.cost; + } + } + return given_points; + } + private float SummonTank(float given_points, List wave) + { + if (cachedTankPool.Count == 0) + { + return given_points; + } + int zombieIndex = cachedTankPool.Count - 1; + while (given_points >= minSupportPoints && zombieIndex > -1) + { + if (cachedTankPool[zombieIndex].cost > given_points) + { + zombieIndex--; + continue; + } + var chosen_zombie = cachedTankPool[zombieIndex]; + wave.Add(chosen_zombie); + given_points -= chosen_zombie.cost; + } + return given_points; + } + private float SummonHorde(float given_points, List wave, bool is_big) + { + if (cachedHordePool.Count == 0) + { + return given_points; + } + while (is_big == false && cachedHordePool.Count > 1 && cachedHordePool[1].cost * 15 <= given_points) + { + cachedHordePool.RemoveAt(0); + minHordePoints = cachedHordePool[0].cost; + } + while (given_points >= minHordePoints) + { + var chosen_zombie = cachedHordePool[rng.RandiRange(0, cachedHordePool.Count - 1)]; + if (given_points - chosen_zombie.cost >= 0) + { + wave.Add(chosen_zombie); + given_points -= chosen_zombie.cost; + } + } + return given_points; + } + + private List LoadFromRegistry(Array pool) + { + List list = []; + foreach (var res in pool) + { + list.Add(GameRegistry.GetZombieByName(res)); + } + return list; + } +} diff --git a/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs.uid b/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs.uid new file mode 100644 index 0000000..a1c158f --- /dev/null +++ b/scripts/components/level/zombe_spawners/SurvivalZombieSpawner.cs.uid @@ -0,0 +1 @@ +uid://nkb6i7lrkl8y diff --git a/scripts/components/level/zombe_spawners/ZombieSequencer.cs b/scripts/components/level/zombe_spawners/ZombieSequencer.cs index 66ada13..5f4b284 100644 --- a/scripts/components/level/zombe_spawners/ZombieSequencer.cs +++ b/scripts/components/level/zombe_spawners/ZombieSequencer.cs @@ -9,11 +9,18 @@ public partial class ZombieSequencer : Node2D public static ZombieSequencer Instance { get; private set; } private Queue queue = []; private RandomNumberGenerator rng = new(); + private bool turbo = false; + + [Export] private Timer spawnTimer; + [Export] private Timer waveTimer; + + private double startSpawnTime; public override void _Ready() { rng.Randomize(); Instance = this; + startSpawnTime = spawnTimer.WaitTime; } @@ -44,7 +51,8 @@ public partial class ZombieSequencer : Node2D foreach (int lane in list) { - Spawn(queue.Dequeue(), lane); + if (queue.Count > 0) + Spawn(queue.Dequeue(), lane); } } @@ -53,11 +61,30 @@ public partial class ZombieSequencer : Node2D RuntimeZombieData zombie = GameRegistry.GetZombieByName(id).scene.Instantiate(); PoolContainer.Instance.Zombies.AddChild(zombie); - zombie.GlobalPosition = new Vector2(GlobalPosition.X, Utility.RightFieldBoundary.Y - (lane-1) * Utility.TileHeight); + zombie.GlobalPosition = new Vector2(GlobalPosition.X, Utility.RightFieldBoundary.Y - (lane - 1) * Utility.TileHeight); } public void Add(string id) { queue.Enqueue(id); } + + public override void _Process(double delta) + { + if (turbo == false && queue.Count > waveTimer.WaitTime / startSpawnTime * 5.0) + { + spawnTimer.WaitTime = waveTimer.WaitTime / queue.Count; + turbo = true; + } + else if(turbo && queue.Count == 0) + { + spawnTimer.WaitTime = startSpawnTime; + turbo = false; + } + } + + public void DebugClearQueue() + { + queue.Clear(); + } } diff --git a/scripts/components/plants/PlantEyesightLimiter.cs b/scripts/components/plants/PlantEyesightLimiter.cs index 60248d6..0900fc1 100644 --- a/scripts/components/plants/PlantEyesightLimiter.cs +++ b/scripts/components/plants/PlantEyesightLimiter.cs @@ -8,7 +8,7 @@ public partial class PlantEyesightLimiter : CollisionShape2D { if (Shape is SegmentShape2D segment) { - segment.B = new Vector2(Utility.RightFieldBoundary.X-GlobalPosition.X, 0); + segment.B = new Vector2(Utility.RightFieldBoundary.X - GlobalPosition.X, 0); } } } \ No newline at end of file diff --git a/scripts/components/plants/behaviours/SunflowerBehaviour.cs b/scripts/components/plants/behaviours/SunflowerBehaviour.cs index 735a8f5..8672ac9 100644 --- a/scripts/components/plants/behaviours/SunflowerBehaviour.cs +++ b/scripts/components/plants/behaviours/SunflowerBehaviour.cs @@ -13,7 +13,7 @@ public partial class SunflowerBehaviour : Node public void Timeout() { - _tree.Set("parameters/conditions/produce",true); + _tree.Set("parameters/conditions/produce", true); } } diff --git a/scripts/components/zombies/EatBox.cs b/scripts/components/zombies/EatBox.cs index 474371f..8493cab 100644 --- a/scripts/components/zombies/EatBox.cs +++ b/scripts/components/zombies/EatBox.cs @@ -8,7 +8,7 @@ public partial class EatBox : Area2D { // Rewrite this class completely when field system will be introduced. - [Export] private FloatModifiers _damage; + [Export] public FloatModifiers _damage; private RuntimePlantData plant; public bool isEating = false; diff --git a/scripts/components/zombies/ZombieMover.cs b/scripts/components/zombies/ZombieMover.cs index f2cc17f..c9b8261 100644 --- a/scripts/components/zombies/ZombieMover.cs +++ b/scripts/components/zombies/ZombieMover.cs @@ -6,12 +6,15 @@ public partial class ZombieMover : Node { [Export] private FloatModifiers _speed; + [Export] + private float _speedControlMult; private Node2D _zombie; public override void _Ready() { _zombie = GetParent(); _speed = (FloatModifiers)_speed.Duplicate(); + _speed.ChangePercentage((float)GD.RandRange(-0.05,0.05)); } public override void _PhysicsProcess(double delta) @@ -20,7 +23,8 @@ public partial class ZombieMover : Node * (float)delta * Utility.TileWidth * GetParent().LocalTimescale - * _speed.GetValue(); + * _speed.GetValue() + * _speedControlMult; } public void SetSpeedFlat(float speed) diff --git a/scripts/components/zombies/behaviours/HoboBehaviour.cs b/scripts/components/zombies/behaviours/HoboBehaviour.cs index c149d37..86cc9a6 100644 --- a/scripts/components/zombies/behaviours/HoboBehaviour.cs +++ b/scripts/components/zombies/behaviours/HoboBehaviour.cs @@ -13,5 +13,6 @@ public partial class HoboBehaviour : Node canDestroyed = true; ((AnimationNodeStateMachinePlayback)_animationTree.Get("parameters/playback")).Travel("hobo_zombie_can_destroy"); _animationTree.Set("parameters/eat_Tree/blend/blend_amount", 1.0); + _eatBox._damage.SetMult(3.0f); } } diff --git a/scripts/resources/PlantResource.cs b/scripts/resources/PlantResource.cs index ff43361..dab31cb 100644 --- a/scripts/resources/PlantResource.cs +++ b/scripts/resources/PlantResource.cs @@ -5,15 +5,19 @@ namespace Newlon; [GlobalClass] public partial class PlantResource : Resource { + [Export] public string display_name; + [Export(PropertyHint.MultilineText)] public string display_description; [Export] public int Cost; [Export] public PackedScene Scene; [Export] public float ReloadTime; - [Export(PropertyHint.Range,"0,1,0.01")] + [Export(PropertyHint.Range, "0,1,0.01")] public float ReloadProgress; [Export] public Texture2D Preview; [Export] public int Layer = 1; + + public string internal_id; } diff --git a/scripts/resources/ZombieResource.cs b/scripts/resources/ZombieResource.cs index 6c6e217..55e5b4e 100644 --- a/scripts/resources/ZombieResource.cs +++ b/scripts/resources/ZombieResource.cs @@ -3,6 +3,8 @@ using Godot; [GlobalClass] public partial class ZombieResource : Resource { - [Export] public int cost; + [Export] public float cost; [Export] public PackedScene scene; + + public string internal_id; } diff --git a/scripts/systems/GameRegistry.cs b/scripts/systems/GameRegistry.cs index b677a9d..6f30736 100644 --- a/scripts/systems/GameRegistry.cs +++ b/scripts/systems/GameRegistry.cs @@ -7,13 +7,11 @@ public partial class GameRegistry : Node private const string PLANT_RESOURCE_PATH = "res://resources/plants/"; private const string ZOMBIE_RESOURCE_PATH = "res://resources/zombies/"; public static GameRegistry Instance { get; private set; } - private Dictionary PlantDictionary = []; - private Dictionary ZombieDictionary = []; + public static readonly Dictionary PlantDictionary = []; + public static readonly Dictionary ZombieDictionary = []; - public override void _Ready() + public override void _Ready() { - Instance = this; - //Plant init string[] plantFiles = DirAccess.GetFilesAt(PLANT_RESOURCE_PATH); @@ -22,6 +20,7 @@ public partial class GameRegistry : Node if (ResourceLoader.Exists(PLANT_RESOURCE_PATH + file)) { var plant = ResourceLoader.Load(PLANT_RESOURCE_PATH + file); + plant.internal_id = file.ToLower().Split('.')[0]; PlantDictionary.Add(file.ToLower().Split('.')[0], plant); } } @@ -34,6 +33,7 @@ public partial class GameRegistry : Node if (ResourceLoader.Exists(ZOMBIE_RESOURCE_PATH + file)) { var zombie = ResourceLoader.Load(ZOMBIE_RESOURCE_PATH + file); + zombie.internal_id = file.ToLower().Split('.')[0]; ZombieDictionary.Add(file.ToLower().Split('.')[0], zombie); } } @@ -41,13 +41,13 @@ public partial class GameRegistry : Node public static PlantResource GetPlantByName(string name) { - if (Instance.PlantDictionary.ContainsKey(name) == false) return null; - return Instance.PlantDictionary[name]; + if (PlantDictionary.ContainsKey(name) == false) return null; + return PlantDictionary[name]; } public static List GetPlantNames() { List result = []; - foreach (var key in Instance.PlantDictionary.Keys) + foreach (var key in PlantDictionary.Keys) { result.Add(key); } @@ -56,23 +56,26 @@ public partial class GameRegistry : Node public static List GetPlants() { List result = []; - foreach (var value in Instance.PlantDictionary.Values) + foreach (var value in PlantDictionary.Values) { result.Add(value); } return result; } - + public static int GetPlantCount() + { + return PlantDictionary.Count; + } public static ZombieResource GetZombieByName(string name) { - if (Instance.ZombieDictionary.ContainsKey(name) == false) return null; - return Instance.ZombieDictionary[name]; + if (ZombieDictionary.ContainsKey(name) == false) return null; + return ZombieDictionary[name]; } public static List GetZombieNames() { List result = []; - foreach (var key in Instance.ZombieDictionary.Keys) + foreach (var key in ZombieDictionary.Keys) { result.Add(key); } @@ -81,11 +84,16 @@ public partial class GameRegistry : Node public static List GetZombies() { List result = []; - foreach (var value in Instance.ZombieDictionary.Values) + foreach (var value in ZombieDictionary.Values) { result.Add(value); } return result; } + public static int GetZombieCount() + { + return ZombieDictionary.Count; + } + }