From 12b7435d1973ddfe5e9848c749885cb18c3831a9 Mon Sep 17 00:00:00 2001 From: Rendo Date: Fri, 18 Jul 2025 03:36:49 +0500 Subject: [PATCH] Initial field spawns --- project.godot | 8 +- resources/levels/balance_and_spawn_test.tres | 5 +- resources/plants/Cucumber.tres | 2 +- resources/plants/Nerdus.tres | 2 +- scenes/entities/plants/aloe.tscn | 1 + scenes/entities/plants/cucumber.tscn | 35 ++--- scenes/entities/plants/garlic.tscn | 1 + scenes/entities/plants/nerdus.tscn | 137 +++++++++--------- scenes/entities/plants/peashooter.tscn | 1 + scenes/entities/plants/potato_mine.tscn | 1 + scenes/entities/plants/snowpea.tscn | 1 + scenes/entities/plants/spikeweed.tscn | 4 +- scenes/entities/plants/sunflower.tscn | 2 + scenes/entities/plants/threepeater.tscn | 1 + scenes/entities/plants/wallnut.tscn | 3 +- scenes/templates/standard_players_house.tscn | 7 +- scripts/LevelStateBrainDisabler.cs | 19 +++ scripts/LevelStateBrainDisabler.cs.uid | 1 + scripts/level/InitialPackedSceneSpawner.cs | 59 ++++++++ .../level/InitialPackedSceneSpawner.cs.uid | 1 + scripts/level/PoolContainer.cs | 2 +- scripts/plants/RuntimePlantData.cs | 2 + translations/gui.en.translation | Bin 1321 -> 2278 bytes translations/gui.ru.translation | Bin 1693 -> 3161 bytes translations/plants.en.translation | Bin 1208 -> 3102 bytes translations/plants.ru.translation | Bin 1523 -> 4225 bytes translations/zombies.en.translation | Bin 781 -> 1842 bytes translations/zombies.ru.translation | Bin 986 -> 2753 bytes 28 files changed, 197 insertions(+), 98 deletions(-) create mode 100644 scripts/LevelStateBrainDisabler.cs create mode 100644 scripts/LevelStateBrainDisabler.cs.uid create mode 100644 scripts/level/InitialPackedSceneSpawner.cs create mode 100644 scripts/level/InitialPackedSceneSpawner.cs.uid diff --git a/project.godot b/project.godot index 23294a5..c8d0ffe 100644 --- a/project.godot +++ b/project.godot @@ -120,10 +120,10 @@ locale/translations=PackedStringArray("res://translations/plants.en.translation" [layer_names] 2d_physics/layer_1="Reserved" -2d_physics/layer_2="Plants LD" -2d_physics/layer_3="Plants Full" -2d_physics/layer_4="Zombies LD" -2d_physics/layer_5="Zombies Full" +2d_physics/layer_2="Plants Dummy" +2d_physics/layer_3="Plants True" +2d_physics/layer_4="Zombies Dummy" +2d_physics/layer_5="Zombies True" 2d_physics/layer_7="FallLine" 2d_physics/layer_8="FallParticles" diff --git a/resources/levels/balance_and_spawn_test.tres b/resources/levels/balance_and_spawn_test.tres index 3487575..eaeba09 100644 --- a/resources/levels/balance_and_spawn_test.tres +++ b/resources/levels/balance_and_spawn_test.tres @@ -1,5 +1,6 @@ -[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=30 format=3 uid="uid://ctbue7dex4umy"] +[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=31 format=3 uid="uid://ctbue7dex4umy"] +[ext_resource type="PackedScene" uid="uid://b5x35v3w2u8dx" path="res://scenes/entities/plants/potato_mine.tscn" id="1_5e1dl"] [ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_46lr8"] [ext_resource type="Script" uid="uid://cw7yc3i2lgcja" path="res://addons/pvzadventure/WaveEvent.cs" id="2_otfbt"] [ext_resource type="Script" uid="uid://7rptlb5qr3b6" path="res://addons/pvzadventure/WaveData.cs" id="3_cugtx"] @@ -130,4 +131,4 @@ wavePercentage = 0.5 standardWaveDelay = 15.0 initialWaveDelay = 20.0 waves = [SubResource("Resource_qsvr4"), SubResource("Resource_otfbt"), SubResource("Resource_nv3y4"), SubResource("Resource_mt5r8"), SubResource("Resource_kugcf"), SubResource("Resource_oyvhx"), SubResource("Resource_k4k25"), SubResource("Resource_oxbea"), SubResource("Resource_5cdj6")] -initialScenes = Array[PackedScene]([null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]) +initialScenes = Array[PackedScene]([null, ExtResource("1_5e1dl"), null, null, null, null, null, null, null, null, ExtResource("1_5e1dl"), null, null, null, null, null, null, null, null, ExtResource("1_5e1dl"), null, null, null, null, null, null, null, null, ExtResource("1_5e1dl"), null, null, null, null, null, null, null, null, ExtResource("1_5e1dl"), null, null, null, null, null, null, null]) diff --git a/resources/plants/Cucumber.tres b/resources/plants/Cucumber.tres index 73c491f..ba71dcf 100644 --- a/resources/plants/Cucumber.tres +++ b/resources/plants/Cucumber.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://cl5bsa2unhcl0"] +[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/PlantResource.cs" id="1_jrx81"] [ext_resource type="Texture2D" uid="uid://bt76iudw2qgnv" path="res://assets/sprites/atlases/plants/cumbucer.png" id="1_tdg4d"] diff --git a/resources/plants/Nerdus.tres b/resources/plants/Nerdus.tres index beb0d1d..3f8c8a5 100644 --- a/resources/plants/Nerdus.tres +++ b/resources/plants/Nerdus.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://do7m0lfki5ere"] +[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"] diff --git a/scenes/entities/plants/aloe.tscn b/scenes/entities/plants/aloe.tscn index af96d9d..95e85da 100644 --- a/scenes/entities/plants/aloe.tscn +++ b/scenes/entities/plants/aloe.tscn @@ -95,6 +95,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(22, 32) [node name="Aloe" instance=ExtResource("1_n25yi")] +internal_id = "aloe" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/cucumber.tscn b/scenes/entities/plants/cucumber.tscn index bd8256d..385ed6e 100644 --- a/scenes/entities/plants/cucumber.tscn +++ b/scenes/entities/plants/cucumber.tscn @@ -28,23 +28,6 @@ _data = { &"RESET": SubResource("Animation_n1xkd") } -[sub_resource type="Animation" id="Animation_ig0op"] -length = 0.666675 -loop_mode = 2 -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.166667, 0.333333, 0.5, 0.666667), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1), -"update": 1, -"values": [10, 11, 12, 13, 14] -} - [sub_resource type="Animation" id="Animation_d45iq"] length = 0.833342 step = 0.0833333 @@ -75,6 +58,23 @@ tracks/1/keys = { }] } +[sub_resource type="Animation" id="Animation_ig0op"] +length = 0.666675 +loop_mode = 2 +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.166667, 0.333333, 0.5, 0.666667), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [10, 11, 12, 13, 14] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_n1xkd"] _data = { &"attack": SubResource("Animation_d45iq"), @@ -124,6 +124,7 @@ height = 48.0 size = Vector2(26, 600) [node name="Cucumber" instance=ExtResource("1_65f4u")] +internal_id = "cucumber" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/garlic.tscn b/scenes/entities/plants/garlic.tscn index 25ac97e..f8eb8cb 100644 --- a/scenes/entities/plants/garlic.tscn +++ b/scenes/entities/plants/garlic.tscn @@ -60,6 +60,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(32, 29) [node name="Garlic" instance=ExtResource("1_5i0e6")] +internal_id = "garlic" MaxHP = 200.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/nerdus.tscn b/scenes/entities/plants/nerdus.tscn index 2e5e6c4..96d3e36 100644 --- a/scenes/entities/plants/nerdus.tscn +++ b/scenes/entities/plants/nerdus.tscn @@ -26,57 +26,6 @@ _data = { &"RESET": SubResource("Animation_ga4vy") } -[sub_resource type="Animation" id="Animation_yxvnw"] -length = 1.16668 -loop_mode = 2 -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.166667, 0.333333, 0.5, 0.666667, 0.833333), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), -"update": 1, -"values": [0, 1, 2, 3, 4, 5] -} - -[sub_resource type="Animation" id="Animation_o12iv"] -length = 1.16668 -loop_mode = 2 -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.166667, 0.333333, 0.5, 0.666667, 0.833333, 1), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [7, 8, 9, 10, 11, 12, 13] -} - -[sub_resource type="Animation" id="Animation_6e60l"] -length = 1.16668 -loop_mode = 2 -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.166667, 0.333333, 0.5, 0.666667, 0.833333, 1), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [14, 15, 16, 17, 18, 19, 20] -} - [sub_resource type="Animation" id="Animation_v7ffp"] length = 0.500008 step = 0.0833333 @@ -107,6 +56,36 @@ tracks/1/keys = { }] } +[sub_resource type="Animation" id="Animation_6a4q1"] +length = 0.500008 +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), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [35, 36, 37, 38, 39, 40] +} +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Hurtbox") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.416667), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"ReturnAllDamage" +}] +} + [sub_resource type="Animation" id="Animation_rb7ob"] length = 0.500008 step = 0.0833333 @@ -137,8 +116,9 @@ tracks/1/keys = { }] } -[sub_resource type="Animation" id="Animation_6a4q1"] -length = 0.500008 +[sub_resource type="Animation" id="Animation_yxvnw"] +length = 1.16668 +loop_mode = 2 step = 0.0833333 tracks/0/type = "value" tracks/0/imported = false @@ -147,24 +127,44 @@ 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), +"times": PackedFloat32Array(0, 0.166667, 0.333333, 0.5, 0.666667, 0.833333), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), "update": 1, -"values": [35, 36, 37, 38, 39, 40] +"values": [0, 1, 2, 3, 4, 5] } -tracks/1/type = "method" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Hurtbox") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0.416667), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"ReturnAllDamage" -}] + +[sub_resource type="Animation" id="Animation_6e60l"] +length = 1.16668 +loop_mode = 2 +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.166667, 0.333333, 0.5, 0.666667, 0.833333, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [14, 15, 16, 17, 18, 19, 20] +} + +[sub_resource type="Animation" id="Animation_o12iv"] +length = 1.16668 +loop_mode = 2 +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.166667, 0.333333, 0.5, 0.666667, 0.833333, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [7, 8, 9, 10, 11, 12, 13] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_pddnl"] @@ -252,6 +252,7 @@ radius = 24.0 size = Vector2(73, 48) [node name="Nerdus" instance=ExtResource("1_8ui1h")] +internal_id = "nerdus" MaxHP = 200.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/peashooter.tscn b/scenes/entities/plants/peashooter.tscn index ef8888c..b676b47 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -73,6 +73,7 @@ resource_local_to_scene = true size = Vector2(20, 44) [node name="Peashooter" instance=ExtResource("1_pyk3o")] +internal_id = "peashooter" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/potato_mine.tscn b/scenes/entities/plants/potato_mine.tscn index 0c0876c..9ccb7aa 100644 --- a/scenes/entities/plants/potato_mine.tscn +++ b/scenes/entities/plants/potato_mine.tscn @@ -78,6 +78,7 @@ size = Vector2(15, 27) size = Vector2(22, 19) [node name="Potato mine" instance=ExtResource("1_dj7ul")] +internal_id = "potatomine" MaxHP = 20.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/snowpea.tscn b/scenes/entities/plants/snowpea.tscn index 97fd65c..3f10926 100644 --- a/scenes/entities/plants/snowpea.tscn +++ b/scenes/entities/plants/snowpea.tscn @@ -63,6 +63,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] resource_local_to_scene = true [node name="Snowpea" instance=ExtResource("1_lp85e")] +internal_id = "snowpea" [node name="Sprite2D" parent="." index="0"] texture = ExtResource("2_ytrm0") diff --git a/scenes/entities/plants/spikeweed.tscn b/scenes/entities/plants/spikeweed.tscn index 76f5221..4cec7dc 100644 --- a/scenes/entities/plants/spikeweed.tscn +++ b/scenes/entities/plants/spikeweed.tscn @@ -36,6 +36,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(49, 38) [node name="Spikeweed" instance=ExtResource("1_vmbvr")] +internal_id = "spikeweed" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] @@ -54,9 +55,8 @@ tree_root = SubResource("AnimationNodeBlendTree_63okc") parameters/TimeScale/scale = 1.0 parameters/Tree/blend_position = 0 -[node name="Behaviour" type="Node" parent="." index="3" node_paths=PackedStringArray("_tree")] +[node name="Behaviour" type="Node" parent="." index="3"] script = ExtResource("3_uhpn7") -_tree = NodePath("../AnimationTree") [node name="Hitbox" parent="." index="4"] collision_layer = 4 diff --git a/scenes/entities/plants/sunflower.tscn b/scenes/entities/plants/sunflower.tscn index 528f936..ab4040a 100644 --- a/scenes/entities/plants/sunflower.tscn +++ b/scenes/entities/plants/sunflower.tscn @@ -66,12 +66,14 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(26, 48) [node name="Sunflower" instance=ExtResource("1_bikjn")] +internal_id = "sunflower" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] texture = ExtResource("2_fwcda") hframes = 9 vframes = 2 +frame = 3 [node name="AnimationPlayer" parent="." index="1"] libraries = { diff --git a/scenes/entities/plants/threepeater.tscn b/scenes/entities/plants/threepeater.tscn index e297737..a14b9a1 100644 --- a/scenes/entities/plants/threepeater.tscn +++ b/scenes/entities/plants/threepeater.tscn @@ -135,6 +135,7 @@ resource_local_to_scene = true resource_local_to_scene = true [node name="Threepeater" instance=ExtResource("1_muntu")] +internal_id = "threepeater" [node name="Sprite2D" parent="." index="0"] position = Vector2(6, -13) diff --git a/scenes/entities/plants/wallnut.tscn b/scenes/entities/plants/wallnut.tscn index 9fd5ce4..dd822c1 100644 --- a/scenes/entities/plants/wallnut.tscn +++ b/scenes/entities/plants/wallnut.tscn @@ -38,13 +38,14 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(33, 46) [node name="Wallnut" instance=ExtResource("1_fluxn")] +internal_id = "wallnut" MaxHP = 600.0 [node name="Sprite2D" parent="." index="0"] texture = ExtResource("2_o5tda") hframes = 12 vframes = 3 -frame = 9 +frame = 10 [node name="AnimationPlayer" parent="." index="1"] libraries = { diff --git a/scenes/templates/standard_players_house.tscn b/scenes/templates/standard_players_house.tscn index 27ba02b..bf96ecf 100644 --- a/scenes/templates/standard_players_house.tscn +++ b/scenes/templates/standard_players_house.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3 uid="uid://bu0dh5ct387xu"] +[gd_scene load_steps=17 format=3 uid="uid://bu0dh5ct387xu"] [ext_resource type="PackedScene" uid="uid://dd3yegl1xo44m" path="res://scenes/templates/level_template.tscn" id="1_vdv3d"] [ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/background_summer.png" id="3_lsqv3"] @@ -7,6 +7,7 @@ [ext_resource type="Script" uid="uid://puqxp2xeg1r2" path="res://scripts/level/LevelRunner.cs" id="5_vbgdr"] [ext_resource type="PackedScene" uid="uid://c668qnmmpli5r" path="res://scenes/gui/wave_progress.tscn" id="6_yw4uo"] [ext_resource type="Script" uid="uid://bc3s06ejbotma" path="res://scripts/gui/ZombieLevelPreviewer.cs" id="7_8ajos"] +[ext_resource type="Script" uid="uid://b31mnk4enldc4" path="res://scripts/level/InitialPackedSceneSpawner.cs" id="8_pqj5f"] [sub_resource type="Animation" id="Animation_vbgdr"] resource_name = "CYS_Sequence" @@ -342,8 +343,12 @@ fadeAnimation = NodePath("../GameOverScreen/AnimationPlayer") [node name="CollisionShape2D" parent="Checkbox" index="0"] shape = SubResource("WorldBoundaryShape2D_yw4uo") +[node name="InitialSpawner" type="Node" parent="." index="18"] +script = ExtResource("8_pqj5f") + [connection signal="OnLevelStateChanged" from="Data" to="SunSpawner/Timer" method="OnLevelStateChanged"] [connection signal="OnLevelStateChanged" from="Data" to="ZombieLevelPrevewer" method="OnLevelStateChanged"] +[connection signal="OnLevelStateChanged" from="Data" to="InitialSpawner" method="OnLevelStateChanged"] [connection signal="FinalWaveInitiated" from="LevelRunner" to="MainAnimationPlayer" method="play" binds= ["FW_Sequence"]] [connection signal="HugeWaveApproachingCallback" from="LevelRunner" to="MainAnimationPlayer" method="play" binds= ["HW_Sequence"]] [connection signal="HugeWaveInitiated" from="LevelRunner" to="GUI/WaveProgress" method="OnHugeWaveApproached"] diff --git a/scripts/LevelStateBrainDisabler.cs b/scripts/LevelStateBrainDisabler.cs new file mode 100644 index 0000000..a962117 --- /dev/null +++ b/scripts/LevelStateBrainDisabler.cs @@ -0,0 +1,19 @@ +using Godot; +using Newlon.Components; +using Newlon.Components.Level; + +[GlobalClass] +public partial class LevelStateBrainDisabler : Node +{ + public override void _Ready() + { + RuntimeLevelData.Instance.OnLevelStateChanged += OnLevelStateChanged; + } + public void OnLevelStateChanged(RuntimeLevelData.LevelStates state) + { + if (state == RuntimeLevelData.LevelStates.Game) + { + GetParent().EnableBrain(); + } + } +} diff --git a/scripts/LevelStateBrainDisabler.cs.uid b/scripts/LevelStateBrainDisabler.cs.uid new file mode 100644 index 0000000..4de2e7b --- /dev/null +++ b/scripts/LevelStateBrainDisabler.cs.uid @@ -0,0 +1 @@ +uid://ldjyga3rbqoj diff --git a/scripts/level/InitialPackedSceneSpawner.cs b/scripts/level/InitialPackedSceneSpawner.cs new file mode 100644 index 0000000..1dfd00d --- /dev/null +++ b/scripts/level/InitialPackedSceneSpawner.cs @@ -0,0 +1,59 @@ +using Godot; +using Newlon.Components; +using Newlon.Components.Level; +using Newlon.Components.Plants; +using Newlon.Components.Zombies; + +public partial class InitialPackedSceneSpawner : Node +{ + public void OnLevelStateChanged(RuntimeLevelData.LevelStates state) + { + if (state == RuntimeLevelData.LevelStates.ChooseYourSeeds) + { + for (int i = 0; i < RuntimeLevelData.LevelResource.initialScenes.Count; i++) + { + var packed = RuntimeLevelData.LevelResource.initialScenes[i]; + if (packed == null) continue; + var scene = packed.Instantiate(); + + if (scene is Node2D node) + { + int x = i % 9; + int y = i / 9; + var position = FieldParams.LeftFieldBoundary + new Vector2((x + 0.5f) * FieldParams.TileWidth, (y + 0.5f) * FieldParams.TileHeight); + + if (node is Entity entity) + { + var brainDisabler = new LevelStateBrainDisabler(); + entity.DisableBrain(); + entity.AddChild(brainDisabler); + + if (entity is RuntimeZombieData) + { + PoolContainer.Instance.Structures.AddChild(node); + node.GlobalPosition = position; + } + else if (entity is RuntimePlantData plant) + { + PoolContainer.Instance.Plants.AddChild(plant); + node.GlobalPosition = position; + PoolContainer.Instance.EntityField[GameRegistry.GetPlantByName(plant.internal_id).Layer].Add(plant.GlobalPosition, plant); + } + else + { + PoolContainer.Instance.Structures.AddChild(entity); + node.GlobalPosition = position; + PoolContainer.Instance.EntityField[1].Add(entity.GlobalPosition, entity); + } + } + else + { + PoolContainer.Instance.Structures.AddChild(node); + } + + } + + } + } + } +} diff --git a/scripts/level/InitialPackedSceneSpawner.cs.uid b/scripts/level/InitialPackedSceneSpawner.cs.uid new file mode 100644 index 0000000..66197a9 --- /dev/null +++ b/scripts/level/InitialPackedSceneSpawner.cs.uid @@ -0,0 +1 @@ +uid://b31mnk4enldc4 diff --git a/scripts/level/PoolContainer.cs b/scripts/level/PoolContainer.cs index 22a73d1..2b6e582 100644 --- a/scripts/level/PoolContainer.cs +++ b/scripts/level/PoolContainer.cs @@ -24,7 +24,7 @@ public partial class PoolContainer : Node2D public static PoolContainer Instance { get; private set; } public Dictionary[] EntityField = { new(), new(), new() }; - public override void _Ready() + public override void _EnterTree() { Instance = this; } diff --git a/scripts/plants/RuntimePlantData.cs b/scripts/plants/RuntimePlantData.cs index 6968e5d..d5b8b7b 100644 --- a/scripts/plants/RuntimePlantData.cs +++ b/scripts/plants/RuntimePlantData.cs @@ -9,6 +9,8 @@ namespace Newlon.Components.Plants; public partial class RuntimePlantData : Entity { + [Export] + public string internal_id; public int Line { get; set; } public PlantResource Resource; private AudioStream eatenSound = ResourceLoader.Load("res://assets/audio/sfx/gulp.mp3"); diff --git a/translations/gui.en.translation b/translations/gui.en.translation index 1613f4ba12a7458f6e625d29b81eb1f9ccc840a0..23b0fe9a0b092ef8a5ac8abe18ec4e843e584908 100644 GIT binary patch literal 2278 zcmbtWZAe>J7(OOhnh!tLZi`VvH8un)l^Uxyn43z>;>SqLCCU6qOk)ynH72=Ny$RK= z?Wk@raf6kuZvD}LV8>wY*PuVPitQkDl#a1gMCLv~Hsb1rL)edw?cBX5db|8sp{@rW z&N}Nb{*UR(b zXm`rEGAM+HI}-rW|7R6zf5Y~n{~HZ;ji$VKVt%%wJKrt=KMA(y0Ak#OuezOCFd`Ze z44hsn{uTCOeZ`5jZ931MKYRbw1{jHP zi2q8!8$i&BFq`6$pG!t!@K|x+b-F?*2nJTUvRX=zSR3nDTsN#2BxBY_Sj{VEbq=i{ zwVHx~?`RxaS(gYZYkfno$KkZQT@EA^_}oZPIy+k(9-FVz-35%h4GBeEj?VUuR`-jZ z?oOu@>{PVJ?Q{G3Xoo(K5nVyx%qmCXXCMz8G+|#viQ~u{K-uB zN2_s{L}5APUrYYpV=mRr>FL|CiNf11*@Mf?Bb-J~{Ux2m9r8)YVoTym`SjwLe$z{w+De~C7<8^@aWBfQR2qoKCHdyZ)I2RKQ3(aj z0i%Y9VbgN-oVr#%VuA#0=V$1}mi4#&iY9~HpL}cKz6rZ()T`d*0cyr;g5-@PdD7uY z8H&fkb(=5%j<}1Qytrr)U~C-A-~2b zfjI4Q?T-jMd?jie*szcn(iGI^M4ql>RY?mt1Dg2Bi3w$cqgQY<#NRCr`Z{p;Ja3t* zO%xg|vc$-WWwy|Sy)zr_cadd^I-@JiQF&)}8TRqYX?P%yvLGUWavF@14&~mQe?})r;vz*pEE20Z*l}8Mb(O0^q<0rmGK%82 z&-jD__#EtBC3ZxphmJ(qaksb#~dDNRai|x*cMu{}p&Y)k`6; rXF}_R$M6KD?l+=WLZ0#y1l*6dN+^+b+PZxEZzuWvA>ZX5_=ockyFdGF literal 1321 zcmV+^1=jjfQ$s@n000005C8z>2mk;P1pojjwJ-f(eHJ{s6x$5AmPsUx}EKJkfFWXNHAll>W!@pT)1{77#h(qN

a%&0XHyEHUBsKcaQ$JLbm@q{|(f2UDyA0{wrv3 z2yzS|>5Pg%HzPzSy8TC+Q%Nc$9VI8JnshT(BArnG13X?r9h*ie`Y83^=J9_3r{kz2 zO~=gtvd7G$jPqEIk+gAc8ka}pyfns0D(6hcRR7uku`~6egp|k{JpQYf=VbG^q~#+O zu|qr}$xJqZKRKuBJHhgWVH6mjF=&EvM1 zx1KMIKHr+pbs`3dL7_XV@B96fn1mUEM@dLZzNG;5F9gy0OF<R`pN1CiD-Qv zFxdO~n&1gSyIGxDp<>+bl^4eC)SC76xRC7#+Vap2L|WIRg0>tqv`gz22*JGd!f4Io zws`mHI0?m^i>I6Naq0dwFaG;LQ|LMO5!HnRG-66syEP#GlNfAwX?tOnT zArkI4oih~g&19ADB5u!jn$=I8PG)bMvlP!~(Vn%cN?^BX zSUba>-Tt9D-+itpE#0k%#PHMBN{B(SV~9<;#}rvG50EHuiS^XlJ>gLJA0;mFelDEb z$<%bXhisJ)&h1nm6R&Bl|KlwwU4U~t0J#Y;`h06>P4qB^Zrina;tJ-i95D__aBi0> z)4J!XXxuJrs4rWCg(U3OeJT35oEpAEOgoS6kxAMKyoL+I$Mn4Heb1Jw?(N#!EzI3c zIecgvY<^p;9-N33XB78&%)E5mD_13;i)G#5UAa}rXyRUbIz1j*E8U$SbzKcN?#6|V z%7^8uv)wF#taP*qCr_*d;eOFZfzx$8->qZLWFHkZm`K<4ZkrsUZ(j=wLxRydz0r!s zO#=f=+H?VK^)2$&*eNFiZ>TXDBFHflkciBLNs<=YKmtM#LgEb)0M;l>GZGV#$)~8i zGQ%2627skG`XYRdM(e7sRe*eXg(G<$SC7*bM0o9DkF4`LMrtVVmh!&@m?Bx=NCepx zX7&h%!1-)g8h{_d9 z3u`6B-6PBM6qonnMTet}Z|fXP=v8!&Etckq&O3~9r1+lqK?G%1+zE{ f+ldyp8q&(^q(@au^n9SlagUO7*EFsRQd2`in6`wc diff --git a/translations/gui.ru.translation b/translations/gui.ru.translation index 966f144a70656459ef226622e9f36344de0fe659..48ad9acef2cd30427f5dc8e2b7a519747da33bdd 100644 GIT binary patch literal 3161 zcmcInTWl0n7#=QyuAzj0ScJq=Bqkc%EtNt;T$PdvO&Z!PScP$1XLpC~q_aEg%xn>( z#Xl` z=lqxNzszi8S7e)1eimXRS_FCs)S7Yhl>Vlc*lnq4+fW_dOoQz`3ovY6yrNy1IBWa7 zI~niCp=yw&*=E*?Yf;0Dt47o@qjp?NYf@F^URq6Q(gWb6G}~5_nk_BHLfp`#2QlqX z?T)CU#tcnbf@Lfl@6?L6*baQ4?=Vs{% zI*aFD0l5#G1cpCaSpgyg>tPT*vv>$p8Y`a_;5`CbSKh0uIP(nVjTLLU*M@a_nfD4t zQprFu5SdBz>*LGxH5f->6A_t4{OfD0zgvcpP$ROZS0~mX+AcPU#%Cfcm%>Pbk%;aP zwcQw9`#ku0%!%fg`OmHVF|Y>wRag_9`ueN(w-B9oFz*KWdVgx^zWN6itHC2$9=S65 zCk$VTIZ^fXRpx$#>J7}_2Kn+QR$uuGONneIn%r1hUk`o0{l0x$mt6Y(ckuggrXS?% zU3Rdwx0ksGA$$bO0v~sK*E7JE=i|&hj0rSO<5m#{z#5z? zl43rFtpb4VgPxmONthfr4buw852$HH&RRye!*Mb;Dn6mxanni!lgZGY`j*kmPp}YGz#(#` zNVYJ@A+t&llmiz0Bnhq12Mq!?N|hq34b}x;h5=+D<kW6WC+|0X_;m zdbY?}LkVz7DXht95qjJ}wz!AECR4^pvoM0p256P_CX(<1wnfQ7eM#IK!o3mPE(K6V zC5Y>zEcJ350D?uiIE33G`}1y(+ZRCe4MjpdQ9%fn#0My>Fuo{JEs{sw5~`0}DDVpa zYufGg0zx9Ng$?o%Iz1o3oa+N~WhiRgmv?J<&ei20Aq6QE4;00apXj!uX+|_=WHn{G znJ^vJluqhtjmdf{8Q!o-!CM!}ucNsH?XIL80(&l_5yWFcBq9s(6qo)jOhh4~r4uH5 z$_oKfh#&x{lTxxgCn+L)@NmFOdrGA|G88#Wb=YR8X~$+=nq_Bgw%1I>bj?O55~rq+9qq@01c z0e2?g@+f5jYcn(3)C^1FW5o_qk4L`(csVcV$5A1@@(d7N6`Q;u z@j)ym&e+dUEH5~on~4g>-uKqb&WE`ki%zcy!&-Wk4dO-i5#Dbn`8j@0nnk$4Jb~p=`Qpvv z5LaG79tpqbkG}eO$}P4Kcz0^cBC_Qq0yG;Cr7PN#uaAuVU$rkM?E}b3G&}@@#=<=* eznd^rk@7)&MbH<;r!{x2SA3k)cT@y_D*gs=HMhY4 literal 1693 zcmV;O24eYAQ$s@n000005C8yJ3;+Oy1^@skwJ-f(SPR`V0E$mM5loQQaXJf_IML!n z0Pq5a_Pa+De-?OwJK1CjL~(raJSW8f$U-Q87qS@Ic=aj zz!+T%gHaCo#Kmj&`?wSW=7Mu?NI@nzUA_5l~qFC1$z$pqF z#&S1}gd+!FZTA5xIT6ClaCP?s^uPo!I2T6UP4v^<9e5;kcZ2Rua6BH5$L?Ox-I&J) zpwKfOJ41OoTI~ch9uCqV6qi z)f&gkWo>J zp`Q{Yf`Clm5kuI-P!Ng`ML<76Lb&QgkQ{g`B}a0pPaSw8m%5MxUv&(;)qfm#AU8Ac z)J_{{Yjf2#MrmHC9i49ORMj;c1p`oS&QQZv{DiC(pqm_ht@=}~FJx{mIIyQd&{noFxs@_ofmxWBZ>u=S&*i&yJ zZ!_i5N)jsnFc?(+y750w8ehzkb@jY1)RBkhBF&Una`4&`=#<|RU!n0%8S6%0&N|kT1^;!e3yt3*9?RapFY)h@9OIer!((+h^~l(% zSo}+T%EhhYGfmMYmbc=Nbm(aU$5=6Y;!q)yBxh#I@@OSf&U!DuTkmCGHd*`t`IPWU zQqjYLrqj)i*frOpM@p`XR7+W2X{xsxxf;8sYpxs~LuFs~y6{`~W#M}n?3Z<9Jbds0 zB8pBFb$3jsh}5rc-V0BhLhvJx9XwS{tO5?tj5#T#PIV&(e(L10mwd^o4&*^@ zpQPL^#o103O&0DQA7ipK>n`ADp%4 z?xw>^HxWuJ5&q@i*NaSfM=ri8xyR`*wc`bV`;nr1eDN)vgQzyx!9ICD?ikpb0 zjBD)BTY7@*WiR5r{>q3a-e>`@N9tLGIYeoZx*bX@bxZ9`U32Kkni?+DbUU=fr;6$V zfdQ!DG^G$iBtjyiAW70{VFU>>~fk63}-HVhzYOeV-wtQ*V7hC_7tQAy(9+vb;J zO|sI8XELDb(t}JXJJ(XCDqD!B83;yBu&{~apCaSjPxOZE(MLjvR4<7 zO+*Q|raB`tzXe%B+O6;sHTTuk5Dq=ne`Sn+{x1i@RwkXY;oLHNY2_qfrr2!hchOsi z2QvbbN+Ud`Vztks6m9m^Z3_VaF_b&bCGEuY>1Kq2<+v&lTgH+YAf7fg-tWkm3pWag ztw2K{<;)f%)ZhQlLWw$3tcf7b9CDljrn5@?`hSRlxu)5oJT~$K_5TzxaSyM6Z2Gbp zlU&`t9sVhWXw^WuT4Z{B>-D*FU@_~7G+qZ`!|YwsUcSt3+XEk&ZuoY8Oa6e_v4Ml( zkA1hv=e;IeYc^67l-vLT`FtinKz!Wf4%7lVQd2`i&j>hF diff --git a/translations/plants.en.translation b/translations/plants.en.translation index fdff9b215d127e43bd2cd30183904d1fbc568e46..d431b30050502477ceb40a06eb9acba004e1ec69 100644 GIT binary patch literal 3102 zcmc&%e`s4(6n;s%EPaX1IyH$dwhhI(6*XzrWjNDnYSSreZAdDHZrST=`qsWRO=4bZ zQ!x`{Vu!AC4hD))n2do=MGG?U4`Ed2hT5W4|M15~ohT?eMG6&p^}8?cC9hqY*5Z!` zANSsK&$;)U@0@#Y5)1|JqvWp)ErA}m5$H&!`9c0MuD3JA#)TN0<`Z#d|=wN9+l%@H@<(!-1Qid?%oVjM&XpT{(t^BEAvy%>|QhVzL60c7W&* z9C_m&=2dk5M1Q?XzW3sD74z`34zjyda+7iR^oLkb*&kEVI`4-kUm^RDHL3u`kK@1X zm^5KbDum$U>7QS(Lm)4r|1zN1v%6a+PQysyMX|46S2=S%l#W981R(C2Ia3RJvKHY( zu|GLhc7qNMT!8EofSi_UU=m8cSb~G0cR>^JS@gyYVXIj@aN=I?;Q$>M_q^v7BlWr2 z`!kkry?V2b7I#8_$WpgJH@5hKyP2TBCF0rV^gx?PH4(K{@Gboh6|>sBjj>=;zrE>; zY8#z16C;av^L1Ty?sB})F~5wl+f~9Cu38bm_>}X4HRo!1VcSZB$)@aCGiTipu9S9$ z-_$NP72~5a8^LCS!>+S_dA!ST(6!HLbS`%AS~^srHNfB>;e&W31~T+Jmo|yAU!hs= zd5o>o&ps{rHm3RLX6;%swUqLusZyo4RHg!%Q)REs=M${5s?TN=q8D@5YH&R1FKQ7N zi)@u6;nHp0cbK&b3;sX67X1P1xv6%oce<*2M11f^n{^^qG5b=tHx*mF-LhSyxCJJYGB_>q#l_KKbuZ%qBAq1V>G#V%?6r#B?)am!PG0klc`6KS_w@SB@ z9GS#ik{{rPIj&dc&ZqmpE)K}&y~*#rIQM^Y*MjQFKF$m^7CR=cxOmsn8j?a9itmpl zhPjj+Qb4e69<|b!Z}}cowWesWYN^|Nm4)y?xziACx}1eO_9I7^DR6g*3q4fY*4?18 zUC>6h_-;SjZ}_^Fmdr+N;#MhmLXp_H(V?CG&ZOKUA=ORFS2~P`pIO_p_g@|vYC*GQ z=>xp2aMzAc@pg-zp~Ocvcbui=*z+f))ZOb*(Wp8p;={@ENrf<9*MzA{IweMO!;Oe7 n`h$n|N9k$1A-uvXq`Cy_-D`Ovi#_@zspR(#`K=SgKZCyjX!${T literal 1208 zcmV;p1V{T)Q$s@n000005C8xm3;+P21ONaiwJ-f(APco50H(CYN`RbI2e2Z0Hk$P2 z%BW5GDXz|9mtp}eMuR!HSt-QYPI?}A>s4cG+9PSTjr%Y`%S6th{$Ut3sppCyTt5uH zdd#M8mG8{oZkYn00I&eP07z?E%wF@@L8|dK$wK`9@aX@G{@?fiy#N0Z@c*>w|F{3o z1_Ic0MFwlxcNTK@YDa#p8x;N z&)f-~XCC$cIM1VCx%OP<$oW+^-xx+Jr>?O-SH{18R_p(F zs{B8ce;JHG%!&ug_6XrJ_W#H6|1D3#YVtqE#w z=m60wHjzpBAvL2}_}4%GtF%TVN{E~PZ}YE%ycded(7AtI`&W%DhhI)L!03Fb{~G9D z8~B%Du}w&ViAhiRC}ZPcO3Gg_NNE4R|JO5D0z4lLXT{aqG1Fz* z;Z=*VS{xYZ(XvOWG3a&1Dl*Z4j6ibagq%LdP0Cp<6m6=Hn^cTRkvETfK-8 zZM(9z6W5E_5p-qkr?B&cX1m!=1WyIKbVExE%jwvnAu<^=VGV!O)0|>}_KWA(aWpmu zr-icHx)N5o?d`dN*OMmY&}rDAS^6FO#_ePwk`Odgy=r6DBg3O+V(h-12;UJH9KIcf zKj6@w{@k3#{uTO$*;e<Rbrpeuo<5AKnJy&=jn z^TEwfFGNLlhr?m3UNtcZyzG|B2R93uTuK>}kew8|%o}pPDWK9JG2mAeH%J84b5CF+ zIG5s3$)y4by<_mhQPF!83@Q2LxGgs6}n5&)wp401RQ35);h=3I#IREiB~o2nUZp zaZSmxtda+)oV9&HGz|}|_zT;KdH*Zk61IfXFhM06PhZBGl1EDr-#lrc1rMBW5XTp@ zL$22hz8e{xUQ-m&;ab(&5j~z$m?nh$v&MXjA|PZBZi}vXJEz>W`3}Dr2GICx4uxqL zVh9udA-7RVFpIT$uPR?UF)m}tBL_=|LR&M@o_begh1~lSU=T`bcfYS#1o(dO$OCHi zEYcOAT|=u!W%r1~k7_oe83#=h@PA8~1(KqE#BBFmjWM)qk2TlEfE~I^E8Ad$OAn3jfQv3?Su>lHx5;YW1O{k_^tY4PGEr`~>mZmVp WDD~|$->Gmbg{tqh;VJ=AQ$s_>x>Jq- diff --git a/translations/plants.ru.translation b/translations/plants.ru.translation index 228d4484fc91ea41082fab6d9abbe617031f6aaf..dc540f9aafb0dec1177753bf8891460136b86fdb 100644 GIT binary patch literal 4225 zcmd^DUuaup6u;^=wVRvM>13e0DB>#8rnT*GDB^5=S%;8K7<473>7@&6lbV}4^g-KZ zwMw)8o8VM*ZbJ$pTbd-NY2b^DDY6$q{hjaTyZ7dwEVU1Up{M!o zx!-rrcYfz@>pkRsSu1`v;G1a^=poRn!_nYS@NJ|2aKs-n2mR4tI0Ux!xeH&rF24Tg z&wp$hP`umuz6YBg0YwZmJQ4{QzQJ(7Kj@2weP+N28QNC&yO4j#(C!6i$S_U+fMIHP z<3XM&teLI{_ikGN#8_pd#-)`FwU3bcYb=qj#1#U1ACb`d3J+#LMhGC3KhgDd!gewEhZ@|#&yb4MvPK| z@{|VU#T2D=W{5E{E?HSI)6_tpWB)Q`b;?i*!bYh;Nf8$_`}CebcrYA!q2C`l?u!`x zy&bxU(Xxn%G2YYDEMNCR#5_)=DJN!hT7`ao$Ux7in1M*ht`ybMu0u+irQvR=I%M&= zRos*Bu!yr*!JH~8T0ON?d}?D<4u>+i^Cj;ApSP>CSB&XmoDIV7xR_S=tN^P?qXldl z;|tNUMrVsK^*e3z`4{dq#&=V6tSgGYSA+@s-UNYm-Obmk&rNCqlb4m&_0C9R`0*r}f4h~|o7rC_2iH@4|?L4~<(;#%UgwOu!j zKseNIy2O+^FzKLDiFk*{Q|3aK9H+23W>$)*ohs*mc$$`E@%_e8GojJB@&rM_gdfxJ z6HrCse*mAtug;-jcv(z$I@N{y|2BOZiUsODV4SzAunjn~&@-Kucj$0eSGR9}_iJ6f zt?f_R0l_I)fPbcC%S@o{qS_^76D#J6Y_3QjE2ZE=F;SXzcJ2S~dM#PfH$|*6;5|*x zmBpnCqO*V~CEN1~fQ|_SyKD`J=L`xHUdr*r-T{Y{loeTXi)F@g%sN1|mda9EiERrT z=nM?u$~y_)yQ(l}u)Er$R!*U8B+%)($McNkGP+tXX)QtCrLnw`)GfNTtwglbR`y_2 z;b97MqZ;1WM?8hNFWZO#hnqvz>Fio%4Rco|mIfIZ55yeh>~4>FAh!Cn=4vBrL{?UolR(8t^swM?C-i<;6cA{sx=}O6ULp delta 1509 zcmVnubzlyEOgdm(7~8oDSFR3X@(+>8S3 zx8keNet1QVQ+X74;y=DYV&PZ74qS;)s7mOxzk+9m0R+2T_4s6@l zC_tDj5LzsMd0-oWXSA5@B`asIT8biaM(ikNLpou5f$ab@cET&|kgHa`MRl9odVXn( zFaCV-=5ZT5`l?&>N_&3zs$Akp$<`+-eEgiDPi5@XP&5nh?n zrHK#Ns-xzGZvwpe9#^eQ96RQdw$|d0phxSkrcn1VY18kxSsQfAwB~bL(@XulZqo~2 zGobf>o%po3!~Z^Y^F^pz_}re4x>rogTixom=61;EC&*PINQ6%iR!g_V`_fMVU;O#p zR-PT;dy8B1!ShqEy(RuUZlA7N4e1EwcDKUsw)PAaku}$g+N%gejV7bPgsO+$^7i-i zxJ?gy@D+XOrF2S*UdZdt_tQLAJvr!uzW-i-HCU*`_m+64O;N9Mpl)G9tL0nT--G6r zg7op{P`Oy z^f{Jk&l7JxSmaJ}(xeEB)$=QhW;7UCR-V?8SF-|t>CfHzjJ!^Lw@!N&ftPxEVQ$TT z|Gu?YKm;6*U&s|)0aY0RGX7wd5(!W6rYf%szz^91 zDJ($dk${`pvw&4LhWQb2lZ=d(q$bgS1^40U4uNT^h<_MRK9Odbbp9B38tX8KeuJSC zA)Vq4oYIaCb7NFXr_yYC3t{qJ)J=Nw(D>O4DX(_)|9|lTQ)10^2gK~OOBbdcBYN43 zMrt6NW>5>9qFEIGfrm*Hc*qf6kfQVbB@Eqc`oQNzh6Y5F{gV40p+1+FQdXINT3S&y zmp1zl1w!7`Bc7y_44k{9V1iw!TJ8}o6#{xMMiqXxose0iHA#5tj)(##2$y*`cB{W6 zzX5p0T|&!|lp6}sA zYjJC15#DtA*{(O-)5@?(&BPra43eTcl{{{~QN+`82{UC#70|0~tll~7QOI-@klF@+Bwa~oLk08*$ z(6zVFu+f0gkI=Nxy3n{ffzY+kz0kBS000L700031002@`QbPs+P7r}2#)$xU!c<|( L8oAUHQd2`iaMaV6 diff --git a/translations/zombies.en.translation b/translations/zombies.en.translation index e020dc19a5b97efcf0867e4e6719003300ff2ed4..88a36796965221e00126181332e6dad5e7e30ed7 100644 GIT binary patch literal 1842 zcmWFv4svFI0u~?*!fZe+3dH^eC7HRIRjDZsDg!4_BsaCVI59o7 zn1LP00qaO*;07`?5{on9OA?cEQWvd0LZ4|lA_GKbcnX%;qx(l#nbTU?}qg*@8&ohC4rO0&>CTgY091${DMFJNpvI76xjz z24W?vzo-8IX;6rPf)HdT2v5pbyOSBHi66)@0AiSU>y?~Yia`6e0|f+t@-TC+N92A0 z`Q;K2zX9U4EtQ7%fHWxhK^Wv$c_6+442XYDdd&>CCr5EG{bTT`X7i1Ma_8)0_!l)f zif!3Ru1dpy9u;DbZP@skx&B!({EIFX)B0yC;r}mNQQ|*ita)t(*T3kaAi-Fm((s6X z*>)G4uqZUh`)9=W!R%;!sV$OvN9GeUxO5oh{bw{YXZYuF8$-iVmbE{z*kKr_&jeTd zkHHC?x-wD|QyBh*SKO^;IFjkKrH40}jux^eIKb(gJFz7*jh`42=hKsDw0e zb;(G?+V*Q$s@n000005C8x*2LJ%|0ssIgwJ-f(H3nT50G8v1OTZ90V`{xcKbNwj z^Z;N#6yIIc35FZ(L1DYQ1p1{g7G84reoIx~?Ot;vbhPb#%T$qS*-}dIR3Xbo?SDC= zs7T%qu_`b3f^|{@Z$gYl}%ez)hin0 z5z0p?Fl~u){uB7$>i7efK&#n*2i5-rzYEiyF#KQRKMO2iZb}sSafpA6X;7soV3r@h zesOdf`Y?PP<2aE62Ia@MACvs25p@H>DSp6mGDrTu{&Bzq9-#s=04U}AzVH8%{~-U# z?6fu0bWVeS>`_g(wHl1h!6H(MZt&}pFQuOaui*+DS$U&l9Dsllky;q_>Q_l(`l^~Hn%j?8Do2FnCQA_i`| zDh5)D_J^=S?6yIslE`RDICWh$E$wWR(gLZ(bDF0P<${!qneQ1Q9&C1kb0;QIt$@(j zTp-~0CulB9r~$1qkd%pJ0vg3_+E9WaR8{2x5+DN^PBR$E1V~_vVP+g-=BGzI_m>wLCQH?KZ0oiy`$;JGH?w`=2ZCBDD$cFW=$08csR diff --git a/translations/zombies.ru.translation b/translations/zombies.ru.translation index 15340f2c689180372f60e15dca0ef807cce41e0d..3598bc45850c50ac5763aa28dd7a383e34a823d6 100644 GIT binary patch literal 2753 zcmd^B%S%*I7{9&W?Rpm-Y#~9+I2u+)tM&!vLNFP|@uHLSkbB3%C~$lh8ln+}kR+{z znQ=zPdASK%MDQI5`ZuISyQtrH?%e6-jDwXs&+u{Pe6RDp&uzWedRr^4z1SJ{15N<$ z_D2Juz+=6;&G3cIpf4JTgn_o!9&GjB>Yh&D$qm}Lt?UQEbQ)mjW@Nzd>)v3*?+bdP z5wGdj!@73dNelZzx^@VdkZzj39^KRq;GiUQ?Fjz%`pjN$)Ylc%wPQGT4fy-?XbHhL znNcGU?ybKp?K1OXZ5oh$AaXG5-55|o6hN^_ zyf~mo0Ve@JvCfzFy3)=#=VDa?a0S5EGo0#fdvFtk3;54q<2|eENgTDaCD>h}HPwIr z{0dATOHkMHx{Qq@19FoTODjD^#RBB`BlO0>vqBVT+qET@jR}q8tVcS)6GZ zlf!aK$Pq!WOS+1{#VGDNO!K%XOBuc<#WG+>$|*VBB0Bt$V8po9?KAoey}R?8pe2hz zKBEj3I^2rh2^|aSN{HGwjX_IFPO*s z47*;+afkSOFD|E5#?eijejE~@aDtMS3TL)z<`q>j zBxfk^6xg2r+d_IhO*ki?#mDO}a1mOh literal 986 zcmV<0110=YQ$s@n000005C8zg3IG7Y0{{RhwJ-f(#0kY602V2YNbt@$W8@VmBAdv# zJqQc$FpxCcZpgQ81S}LgTwI0sTy25>4{%88HSxdAhQr#sJ!`=$9xivQ)K11J@(cxV zR6%XnQ%u~Iq0CoUjhKD^?=!xKolv=@r#4!{qnP9scT~1+1Tv46EQ5?aR5{qQ} zfI$@L8%HeS$6~vHLE8f?f-9dWf+^bs45mI60)r~BB#u_&2=$d#s1aBSSt}6?Z8NZ~ z;TIeR*$0jn9kxMMtxn^I5>;P#Vgg}Ksnh6^!FB@M0s`0pIN$Khm$$rYiCfpTvD>=k zJ;}Sib=Rl29&7IAb8hsr=f0lj_IB7+|GKa{JI-wl6x$Nq!0tSVUSf1Ql1~c71qj6k z)k3CAVS_r{bXaOSKd?a?R>UabP+@l@SitBA0pNhWrG32(efrl87fdvm*zT+)Ij_DZN=3X6^EGSJm-qbZTGwsem>Y9N zT${G8>*lP9tEfOQTp=;f@>-sspY7b*j^5mQ=4Y-AhaPv_&A;w>^7h!ibKCj!0z(L? zy7CghL^Vnx!wezBC^8aBL^7kGtkPBk4~n3?ZO32&j08S6&q(ig(tf^i+^FHn%R5X? z%+m{p?ioC*jwhHL%RBO*1tIoeEO~H8pye^5hMjc;deX=Bu~Z#5D2gX56mVzk9M zJT8L433$#0RFG{6#J)3px(twjbg3VHygu$!Ub){1AX+@`mZmeWBXxXMQkvzqq-Q2S!%RES*Kd_?le(q7}NYT6}Nr({2JPz I4pLJ?LoX=k`2YX_