From 38543dd67608393f6474dd4acc68e87bf4f1ba8a Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 00:04:38 +0500 Subject: [PATCH 01/19] menu music --- .../pvzadventure/scenes/adventure_editor.tscn | 5 +++++ assets/sprites/atlases/atlas1.png | Bin 35726 -> 36135 bytes scenes/main_menu.tscn | 10 +++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/addons/pvzadventure/scenes/adventure_editor.tscn b/addons/pvzadventure/scenes/adventure_editor.tscn index 00a3f0f..6a7f9f3 100644 --- a/addons/pvzadventure/scenes/adventure_editor.tscn +++ b/addons/pvzadventure/scenes/adventure_editor.tscn @@ -41,6 +41,11 @@ script = ExtResource("2_d5hwn") [node name="FileDialog" type="FileDialog" parent="Editor/StatusBar/HBoxContainer/FileButton"] +[node name="Button" type="Button" parent="Editor/StatusBar/HBoxContainer"] +layout_mode = 2 +text = "Play" +flat = true + [node name="WorkArea" type="HSplitContainer" parent="Editor"] layout_mode = 2 size_flags_vertical = 3 diff --git a/assets/sprites/atlases/atlas1.png b/assets/sprites/atlases/atlas1.png index 6027a0b2e9b08f643fa6b1113ee4c81ef96ef52f..66ad649f26497e0807006676af85ee399276a8dd 100644 GIT binary patch delta 34940 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 delta 34447 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 z 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�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 diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn index 5c434df..57e395f 100644 --- a/scenes/main_menu.tscn +++ b/scenes/main_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=3 uid="uid://bfstrli64u23y"] +[gd_scene load_steps=20 format=3 uid="uid://bfstrli64u23y"] [ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_jk1qb"] [ext_resource type="Script" uid="uid://drru785m4eep" path="res://scripts/gui/main_menu_rich_text.gd" id="2_5dd4i"] @@ -11,7 +11,7 @@ [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="7_7b55j"] [ext_resource type="Texture2D" uid="uid://drydueofrb448" path="res://assets/sprites/gui/almanach/book.tres" id="7_flqon"] [ext_resource type="AudioStream" uid="uid://bdx83fokp6kha" path="res://assets/audio/sfx/buttonclick.mp3" id="8_5pajh"] -[ext_resource type="AudioStream" uid="uid://djgyc7bbwcepp" path="res://assets/audio/music/Александр Зацепин - Увертюра.mp3" id="9_j7ex8"] +[ext_resource type="AudioStream" uid="uid://cp7c8ys8sk2r0" path="res://assets/audio/music/Toxa/Upcoming Serenity.wav" id="12_1ajci"] [ext_resource type="PackedScene" uid="uid://bvpt0q4j6nx18" path="res://scenes/gui/almanach.tscn" id="12_rcqid"] [ext_resource type="PackedScene" uid="uid://djfsa0pxqeoq1" path="res://scenes/gui/cursor_canvas_layer.tscn" id="14_1ajci"] @@ -36,6 +36,10 @@ texture_margin_top = 6.0 texture_margin_right = 6.0 texture_margin_bottom = 6.0 +[sub_resource type="AudioStreamPlaylist" id="AudioStreamPlaylist_7b55j"] +stream_count = 1 +stream_0 = ExtResource("12_1ajci") + [sub_resource type="GDScript" id="GDScript_flqon"] resource_name = "version_label" script/source = "extends Label @@ -195,7 +199,7 @@ channel = "button" metadata/_custom_type_script = "uid://c36bj8u7jghc7" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] -stream = ExtResource("9_j7ex8") +stream = SubResource("AudioStreamPlaylist_7b55j") volume_db = -20.0 autoplay = true bus = &"MusicBus" From e5daad7e7a41677ef84c182b3c2c6e9533fdcc34 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 00:42:29 +0500 Subject: [PATCH 02/19] Play button in editor --- addons/pvzadventure/.gitignore | 1 + .../pvzadventure/scenes/adventure_editor.tscn | 3 ++- .../pvzadventure/scripts/AdventureEditor.cs | 18 ++++++++++++++---- .../pvzadventure/scripts/AdventurePlayer.cs | 19 +++++++++++++++++++ .../scripts/AdventurePlayer.cs.uid | 1 + assets/levels/win_test.tres | 1 + 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 addons/pvzadventure/.gitignore create mode 100644 addons/pvzadventure/scripts/AdventurePlayer.cs create mode 100644 addons/pvzadventure/scripts/AdventurePlayer.cs.uid diff --git a/addons/pvzadventure/.gitignore b/addons/pvzadventure/.gitignore new file mode 100644 index 0000000..6e25fa8 --- /dev/null +++ b/addons/pvzadventure/.gitignore @@ -0,0 +1 @@ +cache/ \ No newline at end of file diff --git a/addons/pvzadventure/scenes/adventure_editor.tscn b/addons/pvzadventure/scenes/adventure_editor.tscn index 6a7f9f3..3b35cce 100644 --- a/addons/pvzadventure/scenes/adventure_editor.tscn +++ b/addons/pvzadventure/scenes/adventure_editor.tscn @@ -41,7 +41,7 @@ script = ExtResource("2_d5hwn") [node name="FileDialog" type="FileDialog" parent="Editor/StatusBar/HBoxContainer/FileButton"] -[node name="Button" type="Button" parent="Editor/StatusBar/HBoxContainer"] +[node name="PlayButton" type="Button" parent="Editor/StatusBar/HBoxContainer"] layout_mode = 2 text = "Play" flat = true @@ -84,6 +84,7 @@ text = "New" [connection signal="HardReloadRequested" from="." to="Editor/WorkArea/PanelContainer" method="ClearChildren"] [connection signal="ResourceChanged" from="." to="Editor/WorkArea/Inspector/ResourceInspector" method="Refresh"] +[connection signal="pressed" from="Editor/StatusBar/HBoxContainer/PlayButton" to="." method="Play"] [connection signal="Refreshed" from="Editor/WorkArea/Inspector/ResourceInspector" to="." method="Save"] [connection signal="button_clicked" from="Editor/WorkArea/Inspector/ResourceInspector/Tree" to="Editor/WorkArea/Inspector/ResourceInspector" method="OnTreeButtonClicked"] [connection signal="item_edited" from="Editor/WorkArea/Inspector/ResourceInspector/Tree" to="Editor/WorkArea/Inspector/ResourceInspector" method="OnItemEdited"] diff --git a/addons/pvzadventure/scripts/AdventureEditor.cs b/addons/pvzadventure/scripts/AdventureEditor.cs index 196799c..a6f3948 100644 --- a/addons/pvzadventure/scripts/AdventureEditor.cs +++ b/addons/pvzadventure/scripts/AdventureEditor.cs @@ -55,11 +55,21 @@ public partial class AdventureEditor : MarginContainer HardReload(); } } - public override void _ExitTree() - { - EditorInterface.Singleton.GetInspector().PropertyEdited -= OnInspectorPropertyChanged; + public void Play() + { + var player = new AdventurePlayer(); + var packed = new PackedScene(); + player.pathToLevel = editedPath; + packed.Pack(player); + ResourceSaver.Save(packed, "res://addons/pvzadventure/cache/player.tscn"); + EditorInterface.Singleton.PlayCustomScene("res://addons/pvzadventure/cache/player.tscn"); + } + public override void _ExitTree() + { + EditorInterface.Singleton.GetInspector().PropertyEdited -= OnInspectorPropertyChanged; EditorInterface.Singleton.GetInspector().EditedObjectChanged -= OnResourceChanged; - } + } + } #endif \ No newline at end of file diff --git a/addons/pvzadventure/scripts/AdventurePlayer.cs b/addons/pvzadventure/scripts/AdventurePlayer.cs new file mode 100644 index 0000000..fcc8ba4 --- /dev/null +++ b/addons/pvzadventure/scripts/AdventurePlayer.cs @@ -0,0 +1,19 @@ +using Godot; +using Newlon; + +[Tool] +public partial class AdventurePlayer : Node +{ + const string tilesetUID = "uid://dd3yegl1xo44m"; + [Export] public string pathToLevel; + public override void _Ready() + { + if (Engine.IsEditorHint()) return; + + CallDeferred("InitLevel"); + } + private void InitLevel() + { + LevelController.Instance.StartLevel(ResourceLoader.Load(tilesetUID), ResourceLoader.Load(pathToLevel)); + } +} diff --git a/addons/pvzadventure/scripts/AdventurePlayer.cs.uid b/addons/pvzadventure/scripts/AdventurePlayer.cs.uid new file mode 100644 index 0000000..160fa99 --- /dev/null +++ b/addons/pvzadventure/scripts/AdventurePlayer.cs.uid @@ -0,0 +1 @@ +uid://bbkfrk07l6kev diff --git a/assets/levels/win_test.tres b/assets/levels/win_test.tres index 7c662e7..c71ece7 100644 --- a/assets/levels/win_test.tres +++ b/assets/levels/win_test.tres @@ -38,5 +38,6 @@ wavePercentage = 0.0 standardWaveDelay = 20.0 initialWaveDelay = 10.0 reward = ExtResource("1_sw8bw") +forbiddenPlants = [] waves = [SubResource("Resource_swlbc"), SubResource("Resource_pkoaj")] 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]) From b4ea69b2527072492cd09252f7182993286ac016 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 00:53:29 +0500 Subject: [PATCH 03/19] Editor slight refactor --- addons/pvzadventure/scenes/adventure_editor.tscn | 4 ++-- addons/pvzadventure/scenes/asset_browser_button.tscn | 2 +- addons/pvzadventure/scenes/ze_grid_item.tscn | 2 +- addons/pvzadventure/scenes/ze_row_editor.tscn | 2 +- addons/pvzadventure/scenes/zombie_editor.tscn | 6 +++--- .../scripts/{ => adventure-editor}/AdventureEditor.cs | 1 + .../scripts/{ => adventure-editor}/AdventureEditor.cs.uid | 0 .../scripts/{ => adventure-editor}/AdventurePlayer.cs | 0 .../scripts/{ => adventure-editor}/AdventurePlayer.cs.uid | 0 .../{ => adventure-editor}/AdventureResourceInspector.cs | 0 .../AdventureResourceInspector.cs.uid | 0 .../scripts/{ => zombie-editor}/ZE_AssetBrowser.cs | 0 .../scripts/{ => zombie-editor}/ZE_AssetBrowser.cs.uid | 0 .../scripts/{ => zombie-editor}/ZE_AssetBrowserButton.cs | 0 .../{ => zombie-editor}/ZE_AssetBrowserButton.cs.uid | 0 .../scripts/{ => zombie-editor}/ZE_GridContainer.cs | 0 .../scripts/{ => zombie-editor}/ZE_GridContainer.cs.uid | 0 .../pvzadventure/scripts/{ => zombie-editor}/ZE_GridItem.cs | 0 .../scripts/{ => zombie-editor}/ZE_GridItem.cs.uid | 0 .../scripts/{ => zombie-editor}/ZE_RowEditor.cs | 0 .../scripts/{ => zombie-editor}/ZE_RowEditor.cs.uid | 0 .../scripts/{ => zombie-editor}/ZombieEditor.cs | 0 .../scripts/{ => zombie-editor}/ZombieEditor.cs.uid | 0 23 files changed, 9 insertions(+), 8 deletions(-) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventureEditor.cs (96%) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventureEditor.cs.uid (100%) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventurePlayer.cs (100%) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventurePlayer.cs.uid (100%) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventureResourceInspector.cs (100%) rename addons/pvzadventure/scripts/{ => adventure-editor}/AdventureResourceInspector.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_AssetBrowser.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_AssetBrowser.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_AssetBrowserButton.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_AssetBrowserButton.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_GridContainer.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_GridContainer.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_GridItem.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_GridItem.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_RowEditor.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZE_RowEditor.cs.uid (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZombieEditor.cs (100%) rename addons/pvzadventure/scripts/{ => zombie-editor}/ZombieEditor.cs.uid (100%) diff --git a/addons/pvzadventure/scenes/adventure_editor.tscn b/addons/pvzadventure/scenes/adventure_editor.tscn index 3b35cce..134f5b3 100644 --- a/addons/pvzadventure/scenes/adventure_editor.tscn +++ b/addons/pvzadventure/scenes/adventure_editor.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=5 format=3 uid="uid://dkq82o31vr3i2"] -[ext_resource type="Script" uid="uid://dkgxtig5fwdgi" path="res://addons/pvzadventure/scripts/AdventureEditor.cs" id="1_go5yu"] +[ext_resource type="Script" uid="uid://dkgxtig5fwdgi" path="res://addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs" id="1_go5yu"] [ext_resource type="Script" uid="uid://binuuattefn7d" path="res://addons/pvzadventure/scripts/FileButton.cs" id="2_d5hwn"] [ext_resource type="Script" uid="uid://c6jttmpeyakoa" path="res://addons/pvzadventure/scripts/EditorsContainer.cs" id="3_5imrs"] -[ext_resource type="Script" uid="uid://b0hl4ap18wbb2" path="res://addons/pvzadventure/scripts/AdventureResourceInspector.cs" id="3_d5hwn"] +[ext_resource type="Script" uid="uid://b0hl4ap18wbb2" path="res://addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs" id="3_d5hwn"] [node name="AdventureEditor" type="MarginContainer"] anchors_preset = 15 diff --git a/addons/pvzadventure/scenes/asset_browser_button.tscn b/addons/pvzadventure/scenes/asset_browser_button.tscn index 5725a16..f135cd9 100644 --- a/addons/pvzadventure/scenes/asset_browser_button.tscn +++ b/addons/pvzadventure/scenes/asset_browser_button.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://iwnklc62rni8"] -[ext_resource type="Script" uid="uid://cpedvgx23hlko" path="res://addons/pvzadventure/scripts/ZE_AssetBrowserButton.cs" id="1_jbknv"] +[ext_resource type="Script" uid="uid://cpedvgx23hlko" path="res://addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowserButton.cs" id="1_jbknv"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jbknv"] bg_color = Color(0.18359, 0.18359, 0.18359, 1) diff --git a/addons/pvzadventure/scenes/ze_grid_item.tscn b/addons/pvzadventure/scenes/ze_grid_item.tscn index 58534ee..ecc6455 100644 --- a/addons/pvzadventure/scenes/ze_grid_item.tscn +++ b/addons/pvzadventure/scenes/ze_grid_item.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://segxys6udhyw"] -[ext_resource type="Script" uid="uid://fof6kr0et8ng" path="res://addons/pvzadventure/scripts/ZE_GridItem.cs" id="1_fwfh1"] +[ext_resource type="Script" uid="uid://fof6kr0et8ng" path="res://addons/pvzadventure/scripts/zombie-editor/ZE_GridItem.cs" id="1_fwfh1"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jbknv"] bg_color = Color(0.18359, 0.18359, 0.18359, 1) diff --git a/addons/pvzadventure/scenes/ze_row_editor.tscn b/addons/pvzadventure/scenes/ze_row_editor.tscn index b06dfcd..38390c9 100644 --- a/addons/pvzadventure/scenes/ze_row_editor.tscn +++ b/addons/pvzadventure/scenes/ze_row_editor.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://buvnw8a7pku78"] -[ext_resource type="Script" uid="uid://q84g5imvatfl" path="res://addons/pvzadventure/scripts/ZE_RowEditor.cs" id="1_wm7b4"] +[ext_resource type="Script" uid="uid://q84g5imvatfl" path="res://addons/pvzadventure/scripts/zombie-editor/ZE_RowEditor.cs" id="1_wm7b4"] [node name="RowEditor" type="VBoxContainer"] anchors_preset = 15 diff --git a/addons/pvzadventure/scenes/zombie_editor.tscn b/addons/pvzadventure/scenes/zombie_editor.tscn index c5426c2..c799abf 100644 --- a/addons/pvzadventure/scenes/zombie_editor.tscn +++ b/addons/pvzadventure/scenes/zombie_editor.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=10 format=3 uid="uid://db5ah76l43ng2"] -[ext_resource type="Script" uid="uid://bnuno3uhya4sg" path="res://addons/pvzadventure/scripts/ZE_AssetBrowser.cs" id="1_klhya"] -[ext_resource type="Script" uid="uid://bd5hl0etgvf5a" path="res://addons/pvzadventure/scripts/ZombieEditor.cs" id="1_thd7y"] -[ext_resource type="Script" uid="uid://do7s5mo36c280" path="res://addons/pvzadventure/scripts/ZE_GridContainer.cs" id="2_13ic4"] +[ext_resource type="Script" uid="uid://bnuno3uhya4sg" path="res://addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowser.cs" id="1_klhya"] +[ext_resource type="Script" uid="uid://bd5hl0etgvf5a" path="res://addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs" id="1_thd7y"] +[ext_resource type="Script" uid="uid://do7s5mo36c280" path="res://addons/pvzadventure/scripts/zombie-editor/ZE_GridContainer.cs" id="2_13ic4"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_thd7y"] bg_color = Color(0.430693, 0.742747, 0.314214, 1) diff --git a/addons/pvzadventure/scripts/AdventureEditor.cs b/addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs similarity index 96% rename from addons/pvzadventure/scripts/AdventureEditor.cs rename to addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs index a6f3948..32b1ccd 100644 --- a/addons/pvzadventure/scripts/AdventureEditor.cs +++ b/addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs @@ -57,6 +57,7 @@ public partial class AdventureEditor : MarginContainer } public void Play() { + if (ResourceLoader.Exists(editedPath) == false) return; var player = new AdventurePlayer(); var packed = new PackedScene(); player.pathToLevel = editedPath; diff --git a/addons/pvzadventure/scripts/AdventureEditor.cs.uid b/addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/AdventureEditor.cs.uid rename to addons/pvzadventure/scripts/adventure-editor/AdventureEditor.cs.uid diff --git a/addons/pvzadventure/scripts/AdventurePlayer.cs b/addons/pvzadventure/scripts/adventure-editor/AdventurePlayer.cs similarity index 100% rename from addons/pvzadventure/scripts/AdventurePlayer.cs rename to addons/pvzadventure/scripts/adventure-editor/AdventurePlayer.cs diff --git a/addons/pvzadventure/scripts/AdventurePlayer.cs.uid b/addons/pvzadventure/scripts/adventure-editor/AdventurePlayer.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/AdventurePlayer.cs.uid rename to addons/pvzadventure/scripts/adventure-editor/AdventurePlayer.cs.uid diff --git a/addons/pvzadventure/scripts/AdventureResourceInspector.cs b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs similarity index 100% rename from addons/pvzadventure/scripts/AdventureResourceInspector.cs rename to addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs diff --git a/addons/pvzadventure/scripts/AdventureResourceInspector.cs.uid b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/AdventureResourceInspector.cs.uid rename to addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs.uid diff --git a/addons/pvzadventure/scripts/ZE_AssetBrowser.cs b/addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowser.cs similarity index 100% rename from addons/pvzadventure/scripts/ZE_AssetBrowser.cs rename to addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowser.cs diff --git a/addons/pvzadventure/scripts/ZE_AssetBrowser.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowser.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZE_AssetBrowser.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowser.cs.uid diff --git a/addons/pvzadventure/scripts/ZE_AssetBrowserButton.cs b/addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowserButton.cs similarity index 100% rename from addons/pvzadventure/scripts/ZE_AssetBrowserButton.cs rename to addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowserButton.cs diff --git a/addons/pvzadventure/scripts/ZE_AssetBrowserButton.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowserButton.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZE_AssetBrowserButton.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZE_AssetBrowserButton.cs.uid diff --git a/addons/pvzadventure/scripts/ZE_GridContainer.cs b/addons/pvzadventure/scripts/zombie-editor/ZE_GridContainer.cs similarity index 100% rename from addons/pvzadventure/scripts/ZE_GridContainer.cs rename to addons/pvzadventure/scripts/zombie-editor/ZE_GridContainer.cs diff --git a/addons/pvzadventure/scripts/ZE_GridContainer.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZE_GridContainer.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZE_GridContainer.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZE_GridContainer.cs.uid diff --git a/addons/pvzadventure/scripts/ZE_GridItem.cs b/addons/pvzadventure/scripts/zombie-editor/ZE_GridItem.cs similarity index 100% rename from addons/pvzadventure/scripts/ZE_GridItem.cs rename to addons/pvzadventure/scripts/zombie-editor/ZE_GridItem.cs diff --git a/addons/pvzadventure/scripts/ZE_GridItem.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZE_GridItem.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZE_GridItem.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZE_GridItem.cs.uid diff --git a/addons/pvzadventure/scripts/ZE_RowEditor.cs b/addons/pvzadventure/scripts/zombie-editor/ZE_RowEditor.cs similarity index 100% rename from addons/pvzadventure/scripts/ZE_RowEditor.cs rename to addons/pvzadventure/scripts/zombie-editor/ZE_RowEditor.cs diff --git a/addons/pvzadventure/scripts/ZE_RowEditor.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZE_RowEditor.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZE_RowEditor.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZE_RowEditor.cs.uid diff --git a/addons/pvzadventure/scripts/ZombieEditor.cs b/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs similarity index 100% rename from addons/pvzadventure/scripts/ZombieEditor.cs rename to addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs diff --git a/addons/pvzadventure/scripts/ZombieEditor.cs.uid b/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs.uid similarity index 100% rename from addons/pvzadventure/scripts/ZombieEditor.cs.uid rename to addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs.uid From c8862d2be6dc75a46f729b8c6e97862d527b4297 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 01:05:43 +0500 Subject: [PATCH 04/19] Adventure level resource groups and seedpackets --- addons/pvzadventure/AdventureLevelResource.cs | 10 ++++++++-- assets/levels/balance_and_spawn_test.tres | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/pvzadventure/AdventureLevelResource.cs b/addons/pvzadventure/AdventureLevelResource.cs index 7f712b4..ba5c57d 100644 --- a/addons/pvzadventure/AdventureLevelResource.cs +++ b/addons/pvzadventure/AdventureLevelResource.cs @@ -8,11 +8,17 @@ public partial class AdventureLevelResource : Resource { [Export] public int startSun = 50; //[Export] public Array conditions; + [ExportGroup("Wave properties")] [Export(PropertyHint.Range, "0,1,0.01")] public float wavePercentage; [Export] public float standardWaveDelay; [Export] public float initialWaveDelay; [Export] public RewardResource reward; - [Export] public Array forbiddenPlants; - [Export] public Array waves; + [ExportGroup("Editor-edited properties")] + [ExportSubgroup("Seedpackets")] + [Export] public Array forbiddenPlants = new(); + [Export] public Array forbiddenTags = new(); + [Export] public Array prepickedPlants = new(); + [ExportSubgroup("Waves")] + [Export] public Array waves = new(); [Export] public Array initialScenes = [.. new PackedScene[45]]; } diff --git a/assets/levels/balance_and_spawn_test.tres b/assets/levels/balance_and_spawn_test.tres index 5ff7aae..71b912f 100644 --- a/assets/levels/balance_and_spawn_test.tres +++ b/assets/levels/balance_and_spawn_test.tres @@ -132,5 +132,7 @@ standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_pd3l1") forbiddenPlants = [] +forbiddenTags = Array[String]([]) +prepickedPlants = Array[String]([]) 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]) From 6795b8cb6cfd9136f5a51376bea822a7720560b1 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 01:10:23 +0500 Subject: [PATCH 05/19] little editor refactor --- addons/pvzadventure/PvZAdventure.cs | 2 +- .../{ => adventure-editor}/adventure_editor.tscn | 0 .../{ => initial-editor}/initial_editor.tscn | 2 +- .../{ => initial-editor}/universal_grid_item.tscn | 0 .../{ => zombie-editor}/asset_browser_button.tscn | 0 .../scenes/{ => zombie-editor}/ze_grid_item.tscn | 0 .../scenes/{ => zombie-editor}/ze_row_editor.tscn | 0 .../scenes/{ => zombie-editor}/zombie_editor.tscn | 0 .../AdventureResourceInspector.cs | 15 ++++++++++++--- assets/levels/video_level.tres | 2 ++ 10 files changed, 16 insertions(+), 5 deletions(-) rename addons/pvzadventure/scenes/{ => adventure-editor}/adventure_editor.tscn (100%) rename addons/pvzadventure/scenes/{ => initial-editor}/initial_editor.tscn (98%) rename addons/pvzadventure/scenes/{ => initial-editor}/universal_grid_item.tscn (100%) rename addons/pvzadventure/scenes/{ => zombie-editor}/asset_browser_button.tscn (100%) rename addons/pvzadventure/scenes/{ => zombie-editor}/ze_grid_item.tscn (100%) rename addons/pvzadventure/scenes/{ => zombie-editor}/ze_row_editor.tscn (100%) rename addons/pvzadventure/scenes/{ => zombie-editor}/zombie_editor.tscn (100%) diff --git a/addons/pvzadventure/PvZAdventure.cs b/addons/pvzadventure/PvZAdventure.cs index c996d1f..f7a87ee 100644 --- a/addons/pvzadventure/PvZAdventure.cs +++ b/addons/pvzadventure/PvZAdventure.cs @@ -4,7 +4,7 @@ using Godot; [Tool] public partial class PvZAdventure : EditorPlugin { - private PackedScene panel = ResourceLoader.Load("res://addons/pvzadventure/scenes/adventure_editor.tscn"); + private PackedScene panel = ResourceLoader.Load("uid://dkq82o31vr3i2"); private Control panelInstance; public override void _EnterTree() diff --git a/addons/pvzadventure/scenes/adventure_editor.tscn b/addons/pvzadventure/scenes/adventure-editor/adventure_editor.tscn similarity index 100% rename from addons/pvzadventure/scenes/adventure_editor.tscn rename to addons/pvzadventure/scenes/adventure-editor/adventure_editor.tscn diff --git a/addons/pvzadventure/scenes/initial_editor.tscn b/addons/pvzadventure/scenes/initial-editor/initial_editor.tscn similarity index 98% rename from addons/pvzadventure/scenes/initial_editor.tscn rename to addons/pvzadventure/scenes/initial-editor/initial_editor.tscn index 0ec1e16..75a39d5 100644 --- a/addons/pvzadventure/scenes/initial_editor.tscn +++ b/addons/pvzadventure/scenes/initial-editor/initial_editor.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://sqessjn0m4o3"] -[ext_resource type="PackedScene" uid="uid://djb8ynxhnmo0t" path="res://addons/pvzadventure/scenes/universal_grid_item.tscn" id="1_d8e2t"] +[ext_resource type="PackedScene" uid="uid://djb8ynxhnmo0t" path="res://addons/pvzadventure/scenes/initial-editor/universal_grid_item.tscn" id="1_d8e2t"] [ext_resource type="Script" uid="uid://cumeahjpjgagq" path="res://addons/pvzadventure/scripts/InitialEditor.cs" id="1_tu7vy"] [node name="InitialEditor" type="ScrollContainer"] diff --git a/addons/pvzadventure/scenes/universal_grid_item.tscn b/addons/pvzadventure/scenes/initial-editor/universal_grid_item.tscn similarity index 100% rename from addons/pvzadventure/scenes/universal_grid_item.tscn rename to addons/pvzadventure/scenes/initial-editor/universal_grid_item.tscn diff --git a/addons/pvzadventure/scenes/asset_browser_button.tscn b/addons/pvzadventure/scenes/zombie-editor/asset_browser_button.tscn similarity index 100% rename from addons/pvzadventure/scenes/asset_browser_button.tscn rename to addons/pvzadventure/scenes/zombie-editor/asset_browser_button.tscn diff --git a/addons/pvzadventure/scenes/ze_grid_item.tscn b/addons/pvzadventure/scenes/zombie-editor/ze_grid_item.tscn similarity index 100% rename from addons/pvzadventure/scenes/ze_grid_item.tscn rename to addons/pvzadventure/scenes/zombie-editor/ze_grid_item.tscn diff --git a/addons/pvzadventure/scenes/ze_row_editor.tscn b/addons/pvzadventure/scenes/zombie-editor/ze_row_editor.tscn similarity index 100% rename from addons/pvzadventure/scenes/ze_row_editor.tscn rename to addons/pvzadventure/scenes/zombie-editor/ze_row_editor.tscn diff --git a/addons/pvzadventure/scenes/zombie_editor.tscn b/addons/pvzadventure/scenes/zombie-editor/zombie_editor.tscn similarity index 100% rename from addons/pvzadventure/scenes/zombie_editor.tscn rename to addons/pvzadventure/scenes/zombie-editor/zombie_editor.tscn diff --git a/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs index 53532b8..5fdb532 100644 --- a/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs +++ b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs @@ -145,9 +145,18 @@ public partial class AdventureResourceInspector : Node } private TreeItem CreateItem(string Name, TreeItem root = null) { - var item = tree.CreateItem(root); - item.SetText(0, Name); - return item; + if (root == null) + { + var item = tree.CreateItem(); + item.SetText(0, Name); + return item; + } + else + { + var item = tree.CreateItem(root); + item.SetText(0, Name); + return item; + } } private TreeItem CreateItem(string Name, TreeItem.TreeCellMode cellMode, bool editable, TreeItem root = null) { diff --git a/assets/levels/video_level.tres b/assets/levels/video_level.tres index e9942cd..6dd82a5 100644 --- a/assets/levels/video_level.tres +++ b/assets/levels/video_level.tres @@ -282,6 +282,8 @@ standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_eqa0o") forbiddenPlants = Array[String](["aloe", "spikeweed", "peashooter", "wallnut"]) +forbiddenTags = Array[String]([]) +prepickedPlants = Array[String]([]) waves = [SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")] 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]) metadata/_custom_type_script = "uid://bximdujbkj2n4" From a2d4edad77a091335af44cf62cb16434b003a123 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 04:08:05 +0500 Subject: [PATCH 06/19] Prepicked plants editor --- .../seedpack-editor/editor_seedpacket.tscn | 47 ++++++ .../foribidden_editor_seedpacket.tscn | 55 +++++++ .../seedpack-editor/seedpacket_editor.tscn | 152 ++++++++++++++++++ addons/pvzadventure/scripts/BaseEditor.cs | 16 ++ addons/pvzadventure/scripts/BaseEditor.cs.uid | 1 + addons/pvzadventure/scripts/BaseWaveEditor.cs | 5 + .../scripts/BaseWaveEditor.cs.uid | 1 + addons/pvzadventure/scripts/InitialEditor.cs | 6 +- .../AdventureResourceInspector.cs | 31 +++- .../seedpacket-editor/DnDSeedpacket.cs | 51 ++++++ .../seedpacket-editor/DnDSeedpacket.cs.uid | 1 + .../seedpacket-editor/SeedpacketEditor.cs | 53 ++++++ .../seedpacket-editor/SeedpacketEditor.cs.uid | 1 + .../seedpacket-editor/editor_seedpacket.gd | 28 ++++ .../editor_seedpacket.gd.uid | 1 + .../scripts/zombie-editor/ZombieEditor.cs | 10 +- assets/levels/balance_and_spawn_test.tres | 4 +- assets/levels/video_level.tres | 4 +- assets/levels/win_test.tres | 6 +- scenes/entities/plants/aloe.tscn | 2 +- scenes/entities/plants/cucumber.tscn | 2 +- scenes/entities/plants/garlic.tscn | 2 +- scenes/entities/plants/nerdus.tscn | 2 +- scenes/entities/plants/peashooter.tscn | 2 +- scenes/entities/plants/potato_mine.tscn | 2 +- scenes/entities/plants/snipach.tscn | 2 +- scenes/entities/plants/snowpea.tscn | 2 +- scenes/entities/plants/spikeweed.tscn | 2 +- scenes/entities/plants/sunflower.tscn | 2 +- scenes/entities/plants/threepeater.tscn | 2 +- scenes/entities/plants/wallnut.tscn | 2 +- scripts/SaveSerializer.cs | 2 +- scripts/entities/plants/RuntimePlantData.cs | 2 - scripts/gui/LevelGUIElements.cs | 1 + scripts/gui/choose_your_seeds/GridLoader.cs | 18 ++- .../gui/seedpackets/PrepickedDummyHandler.cs | 15 ++ .../seedpackets/PrepickedDummyHandler.cs.uid | 1 + scripts/gui/seedpackets/PrepickedHandler.cs | 23 +++ .../gui/seedpackets/PrepickedHandler.cs.uid | 1 + scripts/level/InitialPackedSceneSpawner.cs | 2 +- .../zombe_spawners/SurvivalZombieSpawner.cs | 2 +- scripts/resources/entities/EntityResource.cs | 12 +- scripts/systems/GameRegistry.cs | 6 +- 43 files changed, 532 insertions(+), 50 deletions(-) create mode 100644 addons/pvzadventure/scenes/seedpack-editor/editor_seedpacket.tscn create mode 100644 addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn create mode 100644 addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn create mode 100644 addons/pvzadventure/scripts/BaseEditor.cs create mode 100644 addons/pvzadventure/scripts/BaseEditor.cs.uid create mode 100644 addons/pvzadventure/scripts/BaseWaveEditor.cs create mode 100644 addons/pvzadventure/scripts/BaseWaveEditor.cs.uid create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs.uid create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs.uid create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid create mode 100644 scripts/gui/seedpackets/PrepickedDummyHandler.cs create mode 100644 scripts/gui/seedpackets/PrepickedDummyHandler.cs.uid create mode 100644 scripts/gui/seedpackets/PrepickedHandler.cs create mode 100644 scripts/gui/seedpackets/PrepickedHandler.cs.uid diff --git a/addons/pvzadventure/scenes/seedpack-editor/editor_seedpacket.tscn b/addons/pvzadventure/scenes/seedpack-editor/editor_seedpacket.tscn new file mode 100644 index 0000000..926cc1d --- /dev/null +++ b/addons/pvzadventure/scenes/seedpack-editor/editor_seedpacket.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=4 format=3 uid="uid://dwbqlfs51en62"] + +[ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="1_dmimt"] +[ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_0vy3a"] +[ext_resource type="Script" uid="uid://bhah157u6q56b" path="res://addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs" id="3_61l76"] + +[node name="EditorSeedpacket" type="TextureButton" node_paths=PackedStringArray("preview")] +anchors_preset = -1 +anchor_right = 0.103667 +anchor_bottom = 0.21 +offset_right = -0.199997 +mouse_default_cursor_shape = 2 +texture_normal = ExtResource("1_dmimt") +texture_focused = ExtResource("2_0vy3a") +stretch_mode = 0 +script = ExtResource("3_61l76") +preview = NodePath("PlantPreviewContainer/Preview") +metadata/_edit_use_anchors_ = true + +[node name="PlantPreviewContainer" type="Control" parent="."] +clip_contents = true +layout_mode = 1 +anchor_left = -0.061 +anchor_top = -0.036 +anchor_right = 1.061 +anchor_bottom = 0.661 +offset_left = 0.00199986 +offset_top = 0.0320001 +offset_right = -0.0019989 +offset_bottom = -0.0319977 +mouse_filter = 2 + +[node name="Preview" type="TextureRect" parent="PlantPreviewContainer"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.185 +anchor_top = 0.205 +anchor_right = 0.815 +anchor_bottom = 1.333 +offset_left = -0.0200005 +offset_top = 0.00999928 +offset_right = 0.0199966 +offset_bottom = 0.0259933 +mouse_filter = 2 +mouse_default_cursor_shape = 2 +expand_mode = 1 +stretch_mode = 5 diff --git a/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn b/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn new file mode 100644 index 0000000..1997f9f --- /dev/null +++ b/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=4 format=3 uid="uid://dymyownbt688c"] + +[ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="1_x27jk"] +[ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_m8071"] +[ext_resource type="Texture2D" uid="uid://cjkwy3u0wuax3" path="res://assets/sprites/gui/ForbiddenPacket.tres" id="3_ji8qd"] + +[node name="EditorSeedpacket" type="TextureButton"] +anchors_preset = -1 +anchor_right = 0.137 +anchor_bottom = 0.28 +offset_right = -0.199997 +mouse_default_cursor_shape = 2 +texture_normal = ExtResource("1_x27jk") +texture_focused = ExtResource("2_m8071") +stretch_mode = 0 +metadata/_edit_use_anchors_ = true + +[node name="PlantPreviewContainer" type="Control" parent="."] +clip_contents = true +layout_mode = 1 +anchor_left = -0.061 +anchor_top = -0.036 +anchor_right = 1.061 +anchor_bottom = 0.661 +offset_left = 0.00199986 +offset_top = 0.0320001 +offset_right = -0.0019989 +offset_bottom = -0.0319977 +mouse_filter = 2 + +[node name="Preview" type="TextureRect" parent="PlantPreviewContainer"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.185 +anchor_top = 0.205 +anchor_right = 0.815 +anchor_bottom = 1.333 +offset_left = -0.0200005 +offset_top = 0.00999928 +offset_right = 0.0199966 +offset_bottom = 0.0259933 +mouse_filter = 2 +mouse_default_cursor_shape = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="ForbiddenTexture" type="TextureRect" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("3_ji8qd") diff --git a/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn b/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn new file mode 100644 index 0000000..d50b7fa --- /dev/null +++ b/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn @@ -0,0 +1,152 @@ +[gd_scene load_steps=3 format=3 uid="uid://drc0o8du38apr"] + +[ext_resource type="PackedScene" uid="uid://dwbqlfs51en62" path="res://addons/pvzadventure/scenes/seedpack-editor/editor_seedpacket.tscn" id="1_m5lsd"] +[ext_resource type="Script" uid="uid://d1ks2q0c3eu0v" path="res://addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs" id="1_vrmxn"] + +[node name="SeedpacketEditor" type="ScrollContainer"] +texture_filter = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +horizontal_scroll_mode = 0 +script = ExtResource("1_vrmxn") +metadata/_edit_lock_ = true + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +metadata/_edit_lock_ = true + +[node name="PrepickedPlants" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/PrepickedPlants"] +layout_mode = 2 +text = "Prepicked plants" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PrepickedContainer" type="HBoxContainer" parent="VBoxContainer/PrepickedPlants"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +alignment = 1 + +[node name="Slot1" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot1" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot2" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot2" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot3" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot3" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot4" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot4" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot5" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot5" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot6" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot6" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot7" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot7" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot8" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot8" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="Slot9" type="AspectRatioContainer" parent="VBoxContainer/PrepickedPlants/PrepickedContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +ratio = 0.7321 + +[node name="Seedpacket" parent="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot9" instance=ExtResource("1_m5lsd")] +layout_mode = 2 + +[node name="ForbiddenTags" type="VBoxContainer" parent="VBoxContainer"] +visible = false +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/ForbiddenTags"] +layout_mode = 2 +text = "Forbidden tags" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TagsContainer" type="GridContainer" parent="VBoxContainer/ForbiddenTags"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +columns = 9 + +[node name="ForbiddenPlants" type="VBoxContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/ForbiddenPlants"] +layout_mode = 2 +text = "Forbidden plants" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="FPlantsContainer" type="GridContainer" parent="VBoxContainer/ForbiddenPlants"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +columns = 9 + +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot1/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot2/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot3/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot4/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot5/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot6/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot7/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot8/Seedpacket" to="." method="Save"] +[connection signal="SaveCallback" from="VBoxContainer/PrepickedPlants/PrepickedContainer/Slot9/Seedpacket" to="." method="Save"] diff --git a/addons/pvzadventure/scripts/BaseEditor.cs b/addons/pvzadventure/scripts/BaseEditor.cs new file mode 100644 index 0000000..751a183 --- /dev/null +++ b/addons/pvzadventure/scripts/BaseEditor.cs @@ -0,0 +1,16 @@ +using Godot; + +[Tool] +public abstract partial class BaseEditor : Node +{ + public AdventureLevelResource editedResource; + [Signal] public delegate void SaveCallbackEventHandler(); + public virtual void SetEditedData(AdventureLevelResource data) + { + editedResource = data; + } + public virtual void Save() + { + EmitSignal(SignalName.SaveCallback); + } +} diff --git a/addons/pvzadventure/scripts/BaseEditor.cs.uid b/addons/pvzadventure/scripts/BaseEditor.cs.uid new file mode 100644 index 0000000..7effb93 --- /dev/null +++ b/addons/pvzadventure/scripts/BaseEditor.cs.uid @@ -0,0 +1 @@ +uid://dxtrrfg1pba4p diff --git a/addons/pvzadventure/scripts/BaseWaveEditor.cs b/addons/pvzadventure/scripts/BaseWaveEditor.cs new file mode 100644 index 0000000..7bfb72d --- /dev/null +++ b/addons/pvzadventure/scripts/BaseWaveEditor.cs @@ -0,0 +1,5 @@ +public abstract partial class BaseWaveEditor : BaseEditor +{ + public WaveData editedWave; + public abstract void SetEditedWave(WaveData wave); +} diff --git a/addons/pvzadventure/scripts/BaseWaveEditor.cs.uid b/addons/pvzadventure/scripts/BaseWaveEditor.cs.uid new file mode 100644 index 0000000..b12ecb4 --- /dev/null +++ b/addons/pvzadventure/scripts/BaseWaveEditor.cs.uid @@ -0,0 +1 @@ +uid://b23csior6audk diff --git a/addons/pvzadventure/scripts/InitialEditor.cs b/addons/pvzadventure/scripts/InitialEditor.cs index 1ebcb4b..4048452 100644 --- a/addons/pvzadventure/scripts/InitialEditor.cs +++ b/addons/pvzadventure/scripts/InitialEditor.cs @@ -1,10 +1,8 @@ using Godot; [Tool] -public partial class InitialEditor : Node +public partial class InitialEditor : BaseEditor { - public AdventureLevelResource editedResource; - [Signal] public delegate void SaveCallbackEventHandler(); public override void _Ready() { foreach (var child in GetChild(0).GetChildren()) @@ -15,7 +13,7 @@ public partial class InitialEditor : Node } } } - public void SetData(AdventureLevelResource resource) + public override void SetEditedData(AdventureLevelResource resource) { editedResource = resource; for (int i = 0; i < GetChild(0).GetChildCount(); i++) diff --git a/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs index 5fdb532..9e00a9c 100644 --- a/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs +++ b/addons/pvzadventure/scripts/adventure-editor/AdventureResourceInspector.cs @@ -11,8 +11,10 @@ public partial class AdventureResourceInspector : Node const string ZOMBIES_ITEM_NAME = "Zombies"; const string EVENTS_ITEM_NAME = "Events"; const string HUGEWAVE_ITEM_NAME = "Is huge wave?"; + const string SEEDPACKETS_ITEM_NAME = "Seedpackets editor"; private PackedScene zombieEditorScene = ResourceLoader.Load("uid://db5ah76l43ng2"); private PackedScene initialEditorScene = ResourceLoader.Load("uid://sqessjn0m4o3"); + private PackedScene seedpacketEditorScene = ResourceLoader.Load("uid://drc0o8du38apr"); private Tree tree; private AdventureLevelResource heldResource; @@ -28,6 +30,7 @@ public partial class AdventureResourceInspector : Node private TreeItem root; private TreeItem initialData; + private TreeItem seedpacketData; public override void _Ready() { @@ -48,6 +51,7 @@ public partial class AdventureResourceInspector : Node root = CreateItem(LEVEL_ITEM_NAME); initialData = CreateItem(INITIAL_ITEM_NAME, root); + seedpacketData = CreateItem(SEEDPACKETS_ITEM_NAME, root); for (int i = 0; i < heldResource.waves.Count; i++) { @@ -58,7 +62,7 @@ public partial class AdventureResourceInspector : Node CreateItem(EVENTS_ITEM_NAME, wave); CreateItem(HUGEWAVE_ITEM_NAME, TreeItem.TreeCellMode.Check, true, wave) .SetChecked(0, heldResource.waves[i].isHugeWave); - + var delay = tree.CreateItem(wave); if (heldResource.waves[i].customWaveDelay > 0) @@ -94,8 +98,7 @@ public partial class AdventureResourceInspector : Node var editor = zombieEditorScene.Instantiate(); editorContainer.AddChild(editor); - editor.SetEditedWave(heldResource.waves[GetWaveIndex(selected.GetParent())]); - editor.SaveCallback += adventureEditor.Save; + SetupWaveEditor(editor, heldResource.waves[GetWaveIndex(selected.GetParent())]); return; case EVENTS_ITEM_NAME: @@ -103,9 +106,14 @@ public partial class AdventureResourceInspector : Node case INITIAL_ITEM_NAME: var initialEditor = initialEditorScene.Instantiate(); editorContainer.AddChild(initialEditor); - initialEditor.SetData(heldResource); - initialEditor.SaveCallback += adventureEditor.Save; + SetupEditor(initialEditor); break; + case SEEDPACKETS_ITEM_NAME: + var seedpacketEditor = seedpacketEditorScene.Instantiate(); + editorContainer.AddChild(seedpacketEditor); + SetupEditor(seedpacketEditor); + break; + } } @@ -161,10 +169,21 @@ public partial class AdventureResourceInspector : Node private TreeItem CreateItem(string Name, TreeItem.TreeCellMode cellMode, bool editable, TreeItem root = null) { var item = tree.CreateItem(root); - item.SetCellMode(0,cellMode); + item.SetCellMode(0, cellMode); item.SetEditable(0, editable); item.SetText(0, Name); return item; } + private void SetupEditor(BaseEditor editor) + { + editor.SetEditedData(heldResource); + editor.SaveCallback += adventureEditor.Save; + } + private void SetupWaveEditor(BaseWaveEditor editor, WaveData editedWave) + { + SetupEditor(editor); + editor.SetEditedWave(editedWave); + } } + #endif \ No newline at end of file diff --git a/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs b/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs new file mode 100644 index 0000000..09d8c01 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs @@ -0,0 +1,51 @@ +using Godot; +using Newlon.Resources; + +[Tool] +public partial class DnDSeedpacket : TextureButton +{ + [Signal] public delegate void SaveCallbackEventHandler(); + [Export] private TextureRect preview; + public PlantResource HeldResource; + + public override bool _CanDropData(Vector2 atPosition, Variant data) + { + if (data.VariantType == Variant.Type.Dictionary) + { + if ((string)data.AsGodotDictionary()["type"] == "files") + { + return ResourceLoader.Load(data.AsGodotDictionary()["files"].AsGodotArray()[0]) is PlantResource; + } + } + return false; + } + + public override void _DropData(Vector2 atPosition, Variant data) + { + HeldResource = ResourceLoader.Load(data.AsGodotDictionary()["files"].AsGodotArray()[0]) as PlantResource; + Update(); + } + public override void _Pressed() + { + HeldResource = null; + Update(); + } + + private void Update() + { + RefreshTexture(); + EmitSignal(SignalName.SaveCallback); + } + public void RefreshTexture() + { + if (HeldResource != null) + { + preview.Texture = HeldResource.Preview; + } + else + { + preview.Texture = null; + } + } + +} diff --git a/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs.uid b/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs.uid new file mode 100644 index 0000000..0485078 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/DnDSeedpacket.cs.uid @@ -0,0 +1 @@ +uid://bhah157u6q56b diff --git a/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs new file mode 100644 index 0000000..637f6b4 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs @@ -0,0 +1,53 @@ +using Godot; +using Godot.Collections; +using Newlon.Resources; + +[Tool] +public partial class SeedpacketEditor : BaseEditor +{ + private const string PLANTS_DIRECTORY = "res://assets/plants/"; + public override void SetEditedData(AdventureLevelResource data) + { + base.SetEditedData(data); + SetPrepickedPlants(); + } + + public override void Save() + { + CalculatePrepickedPlants(); + base.Save(); + } + private void SetPrepickedPlants() + { + for (int i = 0; i < editedResource.prepickedPlants.Count; i++) + { + if (GetNode("%PrepickedContainer").GetChild(i).GetNode("Seedpacket") is DnDSeedpacket packet) + { + packet.HeldResource = TryGetPlant(editedResource.prepickedPlants[i]); + packet.RefreshTexture(); + } + } + } + private void CalculatePrepickedPlants() + { + Array prepicked = new(); + foreach (var child in GetNode("%PrepickedContainer").GetChildren()) + { + if (child.GetNode("Seedpacket") is DnDSeedpacket packet && packet.HeldResource != null) + { + prepicked.Add(packet.HeldResource.GetInternalID()); + } + } + editedResource.prepickedPlants = prepicked; + } + private PlantResource TryGetPlant(string plantName) + { + foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) + { + if (plantName != file.TrimSuffix(".tres").ToLower()) continue; + return ResourceLoader.Load(PLANTS_DIRECTORY + file); + } + return null; + } + +} diff --git a/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs.uid b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs.uid new file mode 100644 index 0000000..63f09ec --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs.uid @@ -0,0 +1 @@ +uid://d1ks2q0c3eu0v diff --git a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd new file mode 100644 index 0000000..535771f --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd @@ -0,0 +1,28 @@ +@tool +extends TextureButton + +signal save_callback + +var held_data : PlantResource = null +@export var preview : TextureRect + +func _can_drop_data(at_position: Vector2, data: Variant) -> bool: + if typeof(data) == TYPE_DICTIONARY: + if data.type == "files": + return load(data.files[0]) is PlantResource + return false + +func _drop_data(at_position: Vector2, data: Variant) -> void: + held_data = load(data.files[0]) as PlantResource + update() + +func update(): + if held_data: + preview.texture = held_data.Preview + else: + preview.texture = null + save_callback.emit() + +func _pressed() -> void: + held_data = null + update() diff --git a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid new file mode 100644 index 0000000..089de69 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid @@ -0,0 +1 @@ +uid://donugf6vnchij diff --git a/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs b/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs index dd82404..2b78024 100644 --- a/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs +++ b/addons/pvzadventure/scripts/zombie-editor/ZombieEditor.cs @@ -2,19 +2,13 @@ using Godot; [Tool] -public partial class ZombieEditor : VBoxContainer +public partial class ZombieEditor : BaseWaveEditor { - public WaveData editedWave; [Export] private ZE_GridContainer container; - [Signal] public delegate void SaveCallbackEventHandler(); - public void SetEditedWave(WaveData data) + public override void SetEditedWave(WaveData data) { editedWave = data; container.SetData(editedWave); } - public void Save() - { - EmitSignal(SignalName.SaveCallback); - } } diff --git a/assets/levels/balance_and_spawn_test.tres b/assets/levels/balance_and_spawn_test.tres index 71b912f..573e358 100644 --- a/assets/levels/balance_and_spawn_test.tres +++ b/assets/levels/balance_and_spawn_test.tres @@ -131,8 +131,8 @@ wavePercentage = 0.5 standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_pd3l1") -forbiddenPlants = [] +forbiddenPlants = Array[String]([]) forbiddenTags = Array[String]([]) prepickedPlants = Array[String]([]) -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")] +waves = Array[ExtResource("3_cugtx")]([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]) diff --git a/assets/levels/video_level.tres b/assets/levels/video_level.tres index 6dd82a5..e2e7c8d 100644 --- a/assets/levels/video_level.tres +++ b/assets/levels/video_level.tres @@ -283,7 +283,7 @@ initialWaveDelay = 20.0 reward = ExtResource("1_eqa0o") forbiddenPlants = Array[String](["aloe", "spikeweed", "peashooter", "wallnut"]) forbiddenTags = Array[String]([]) -prepickedPlants = Array[String]([]) -waves = [SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")] +prepickedPlants = Array[String](["snipach", "potatomine", "sunflower", "garlic", "cucumber"]) +waves = Array[ExtResource("4_kc7t2")]([SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")]) 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]) metadata/_custom_type_script = "uid://bximdujbkj2n4" diff --git a/assets/levels/win_test.tres b/assets/levels/win_test.tres index c71ece7..8c622fd 100644 --- a/assets/levels/win_test.tres +++ b/assets/levels/win_test.tres @@ -38,6 +38,8 @@ wavePercentage = 0.0 standardWaveDelay = 20.0 initialWaveDelay = 10.0 reward = ExtResource("1_sw8bw") -forbiddenPlants = [] -waves = [SubResource("Resource_swlbc"), SubResource("Resource_pkoaj")] +forbiddenPlants = Array[String]([]) +forbiddenTags = Array[String]([]) +prepickedPlants = Array[String]([]) +waves = Array[ExtResource("3_mtsmf")]([SubResource("Resource_swlbc"), SubResource("Resource_pkoaj")]) 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]) diff --git a/scenes/entities/plants/aloe.tscn b/scenes/entities/plants/aloe.tscn index b9b8369..9d00776 100644 --- a/scenes/entities/plants/aloe.tscn +++ b/scenes/entities/plants/aloe.tscn @@ -104,7 +104,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(22, 32) [node name="Aloe" instance=ExtResource("1_n25yi")] -internal_id = "aloe" +GetInternalID() = "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 6669e8f..a07809c 100644 --- a/scenes/entities/plants/cucumber.tscn +++ b/scenes/entities/plants/cucumber.tscn @@ -133,7 +133,7 @@ height = 48.0 size = Vector2(26, 600) [node name="Cucumber" instance=ExtResource("1_65f4u")] -internal_id = "cucumber" +GetInternalID() = "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 16f671a..f2f96c0 100644 --- a/scenes/entities/plants/garlic.tscn +++ b/scenes/entities/plants/garlic.tscn @@ -60,7 +60,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(32, 29) [node name="Garlic" instance=ExtResource("1_5i0e6")] -internal_id = "garlic" +GetInternalID() = "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 6ae9086..e468c96 100644 --- a/scenes/entities/plants/nerdus.tscn +++ b/scenes/entities/plants/nerdus.tscn @@ -252,7 +252,7 @@ radius = 24.0 size = Vector2(73, 48) [node name="Nerdus" instance=ExtResource("1_8ui1h")] -internal_id = "nerdus" +GetInternalID() = "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 841fd67..db74fc8 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -82,7 +82,7 @@ resource_local_to_scene = true size = Vector2(20, 44) [node name="Peashooter" instance=ExtResource("1_pyk3o")] -internal_id = "peashooter" +GetInternalID() = "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 a444609..3537efd 100644 --- a/scenes/entities/plants/potato_mine.tscn +++ b/scenes/entities/plants/potato_mine.tscn @@ -87,7 +87,7 @@ size = Vector2(15, 27) size = Vector2(22, 19) [node name="Potato mine" instance=ExtResource("1_dj7ul")] -internal_id = "potatomine" +GetInternalID() = "potatomine" MaxHP = 20.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/snipach.tscn b/scenes/entities/plants/snipach.tscn index 1156733..7b90b71 100644 --- a/scenes/entities/plants/snipach.tscn +++ b/scenes/entities/plants/snipach.tscn @@ -31,7 +31,7 @@ region = Rect2(592, 64, 50, 60) size = Vector2(40, 36) [node name="Snipach" instance=ExtResource("1_ltcu2")] -internal_id = "snipach" +GetInternalID() = "snipach" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/snowpea.tscn b/scenes/entities/plants/snowpea.tscn index a3031e6..82aaa87 100644 --- a/scenes/entities/plants/snowpea.tscn +++ b/scenes/entities/plants/snowpea.tscn @@ -72,7 +72,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] resource_local_to_scene = true [node name="Snowpea" instance=ExtResource("1_lp85e")] -internal_id = "snowpea" +GetInternalID() = "snowpea" [node name="Sprite2D" parent="." index="0"] material = SubResource("ShaderMaterial_g872w") diff --git a/scenes/entities/plants/spikeweed.tscn b/scenes/entities/plants/spikeweed.tscn index b76c66a..409f6f6 100644 --- a/scenes/entities/plants/spikeweed.tscn +++ b/scenes/entities/plants/spikeweed.tscn @@ -46,7 +46,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(49, 38) [node name="Spikeweed" instance=ExtResource("1_vmbvr")] -internal_id = "spikeweed" +GetInternalID() = "spikeweed" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/sunflower.tscn b/scenes/entities/plants/sunflower.tscn index 3fba194..4ac1a75 100644 --- a/scenes/entities/plants/sunflower.tscn +++ b/scenes/entities/plants/sunflower.tscn @@ -74,7 +74,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(26, 48) [node name="Sunflower" instance=ExtResource("1_bikjn")] -internal_id = "sunflower" +GetInternalID() = "sunflower" MaxHP = 30.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scenes/entities/plants/threepeater.tscn b/scenes/entities/plants/threepeater.tscn index bd4e077..770a8db 100644 --- a/scenes/entities/plants/threepeater.tscn +++ b/scenes/entities/plants/threepeater.tscn @@ -135,7 +135,7 @@ resource_local_to_scene = true resource_local_to_scene = true [node name="Threepeater" instance=ExtResource("1_muntu")] -internal_id = "threepeater" +GetInternalID() = "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 ce6d938..91ea5cd 100644 --- a/scenes/entities/plants/wallnut.tscn +++ b/scenes/entities/plants/wallnut.tscn @@ -47,7 +47,7 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] size = Vector2(33, 46) [node name="Wallnut" instance=ExtResource("1_fluxn")] -internal_id = "wallnut" +GetInternalID() = "wallnut" MaxHP = 600.0 [node name="Sprite2D" parent="." index="0"] diff --git a/scripts/SaveSerializer.cs b/scripts/SaveSerializer.cs index 5a66922..3a8ee44 100644 --- a/scripts/SaveSerializer.cs +++ b/scripts/SaveSerializer.cs @@ -42,7 +42,7 @@ public partial class SaveSerializer : Node foreach (var plant in playerProgress.PlayerPlants) { - save.PlayerPlants.Add(plant.internal_id); + save.PlayerPlants.Add(plant.GetInternalID()); } access.StoreString(JsonSerializer.Serialize(save)); diff --git a/scripts/entities/plants/RuntimePlantData.cs b/scripts/entities/plants/RuntimePlantData.cs index dd0b42e..82d0a01 100644 --- a/scripts/entities/plants/RuntimePlantData.cs +++ b/scripts/entities/plants/RuntimePlantData.cs @@ -10,8 +10,6 @@ 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/scripts/gui/LevelGUIElements.cs b/scripts/gui/LevelGUIElements.cs index e79eea4..62e567d 100644 --- a/scripts/gui/LevelGUIElements.cs +++ b/scripts/gui/LevelGUIElements.cs @@ -15,4 +15,5 @@ public partial class LevelGUIElements : Control { Instance = this; } + } diff --git a/scripts/gui/choose_your_seeds/GridLoader.cs b/scripts/gui/choose_your_seeds/GridLoader.cs index 3f2c24f..286321f 100644 --- a/scripts/gui/choose_your_seeds/GridLoader.cs +++ b/scripts/gui/choose_your_seeds/GridLoader.cs @@ -7,7 +7,7 @@ namespace Newlon.Components.GUI; public partial class GridLoader : GridContainer { private PackedScene _plantCard; - const string SEEDPACKED_UID = "uid://e7vutg71l6f2"; + public const string SEEDPACKED_UID = "uid://e7vutg71l6f2"; public override void _Ready() { _plantCard = ResourceLoader.Load(SEEDPACKED_UID); @@ -24,11 +24,21 @@ public partial class GridLoader : GridContainer slot.SetResource(resource); - slot.SetForbidden(RuntimeLevelData.LevelResource.forbiddenPlants.Contains(resource.internal_id)); + slot.SetForbidden(RuntimeLevelData.LevelResource.forbiddenPlants.Contains(resource.GetInternalID())); slot.SetLocked(PlayerProgress.Instance.PlayerPlants.Contains(resource) == false); if (GetChildCount() == 1) slot.GrabFocus(); - var handler = new ChoosableHandler(slot); - slot.SetHandler(handler); + + if (RuntimeLevelData.LevelResource.prepickedPlants.Contains(resource.GetInternalID())) + { + slot.SetHandler(new PrepickedDummyHandler(slot)); + slot.disablePacket = true; + } + else + { + slot.SetHandler(new ChoosableHandler(slot)); + } + + } } } diff --git a/scripts/gui/seedpackets/PrepickedDummyHandler.cs b/scripts/gui/seedpackets/PrepickedDummyHandler.cs new file mode 100644 index 0000000..8a71cda --- /dev/null +++ b/scripts/gui/seedpackets/PrepickedDummyHandler.cs @@ -0,0 +1,15 @@ +namespace Newlon.Components.GUI.Seedpackets; +public class PrepickedDummyHandler : SeedpacketHandler +{ + public PrepickedDummyHandler(Seedpacket owner) : base(owner) + { + if (LevelGUIElements.Instance.SeedpacketsHotbar.GetChildCount() >= PlayerProgress.Instance.MaxSeedpackets) return; + _owner.disablePacket = true; + + var hotbarSeedpacket = Seedpacket.Prefab.Instantiate(); + LevelGUIElements.Instance.SeedpacketsHotbar.AddChild(hotbarSeedpacket); + hotbarSeedpacket.SetResource(_owner.GetResource()); + + hotbarSeedpacket.SetHandler(new PrepickedHandler(_owner)); + } +} \ No newline at end of file diff --git a/scripts/gui/seedpackets/PrepickedDummyHandler.cs.uid b/scripts/gui/seedpackets/PrepickedDummyHandler.cs.uid new file mode 100644 index 0000000..9c0ffdc --- /dev/null +++ b/scripts/gui/seedpackets/PrepickedDummyHandler.cs.uid @@ -0,0 +1 @@ +uid://c7uf1ygofsurs diff --git a/scripts/gui/seedpackets/PrepickedHandler.cs b/scripts/gui/seedpackets/PrepickedHandler.cs new file mode 100644 index 0000000..96dd3fc --- /dev/null +++ b/scripts/gui/seedpackets/PrepickedHandler.cs @@ -0,0 +1,23 @@ +using Newlon.Components.Level; + +namespace Newlon.Components.GUI.Seedpackets; + +public class PrepickedHandler : SeedpacketHandler +{ + public PrepickedHandler(Seedpacket owner) : base(owner) + { + RuntimeLevelData.Instance.OnLevelStateChanged += OnLevelStateChanged; + } + + public void OnLevelStateChanged(RuntimeLevelData.LevelStates state) + { + if (state == RuntimeLevelData.LevelStates.Game) + { + _owner.SetHandler(new HotbarHandler(_owner)); + } + else if (state != RuntimeLevelData.LevelStates.ChooseYourSeeds) + { + _owner.disablePacket = true; + } + } +} \ No newline at end of file diff --git a/scripts/gui/seedpackets/PrepickedHandler.cs.uid b/scripts/gui/seedpackets/PrepickedHandler.cs.uid new file mode 100644 index 0000000..8205a20 --- /dev/null +++ b/scripts/gui/seedpackets/PrepickedHandler.cs.uid @@ -0,0 +1 @@ +uid://d3da4b6e4qwtm diff --git a/scripts/level/InitialPackedSceneSpawner.cs b/scripts/level/InitialPackedSceneSpawner.cs index 98dad91..459ddce 100644 --- a/scripts/level/InitialPackedSceneSpawner.cs +++ b/scripts/level/InitialPackedSceneSpawner.cs @@ -39,7 +39,7 @@ public partial class InitialPackedSceneSpawner : Node { PoolContainer.Instance.Plants.AddChild(plant); node.GlobalPosition = position; - plant.Resource = GameRegistry.GetEntityByName(plant.internal_id) as PlantResource; + plant.Resource = GameRegistry.GetEntityByName(plant.Resource.GetInternalID()) as PlantResource; PoolContainer.Instance.EntityField[plant.Resource.Layer].Add(plant.GlobalPosition, plant); } else diff --git a/scripts/level/zombe_spawners/SurvivalZombieSpawner.cs b/scripts/level/zombe_spawners/SurvivalZombieSpawner.cs index b2af6a6..ca11ba6 100644 --- a/scripts/level/zombe_spawners/SurvivalZombieSpawner.cs +++ b/scripts/level/zombe_spawners/SurvivalZombieSpawner.cs @@ -94,7 +94,7 @@ public partial class SurvivalZombieSpawner : Node foreach (var zom in wave) { - ZombieSequencer.Instance.Add(zom.internal_id); + ZombieSequencer.Instance.Add(zom.GetInternalID()); } big_wave = false; diff --git a/scripts/resources/entities/EntityResource.cs b/scripts/resources/entities/EntityResource.cs index c84ec52..45d0c9a 100644 --- a/scripts/resources/entities/EntityResource.cs +++ b/scripts/resources/entities/EntityResource.cs @@ -12,7 +12,17 @@ public partial class EntityResource : Resource [Export] public Texture2D Preview; [Export] public CustomSeedpacketFrame CustomFrame; [Export] public int Order = 0; - public string internal_id; public string parsedDescription; public bool isDescriptionParsed; + private string internal_id = ""; + public string GetInternalID() + { + if (internal_id == "") + { + string[] splitstr = ResourcePath.Split('/'); + string file = splitstr[splitstr.Length - 1].ToLower(); + internal_id = file.TrimSuffix(".tres"); + } + return internal_id; + } } diff --git a/scripts/systems/GameRegistry.cs b/scripts/systems/GameRegistry.cs index 372af94..562eb8c 100644 --- a/scripts/systems/GameRegistry.cs +++ b/scripts/systems/GameRegistry.cs @@ -21,8 +21,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]; - EntityDictionary.Add(file.ToLower().Split('.')[0], plant); + EntityDictionary.Add(plant.GetInternalID(), plant); } } //Zombie init @@ -33,8 +32,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]; - EntityDictionary.Add(file.ToLower().Split('.')[0], zombie); + EntityDictionary.Add(zombie.GetInternalID(), zombie); } } } From 5336655ab0475c2b91bc95876a7c3ba1dd1ac2bb Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 04:41:38 +0500 Subject: [PATCH 07/19] Forbidden plants --- .../foribidden_editor_seedpacket.tscn | 8 ++- .../seedpack-editor/seedpacket_editor.tscn | 3 ++ .../ForbiddableSeedpacket.cs | 28 ++++++++++ .../ForbiddableSeedpacket.cs.uid | 1 + .../seedpacket-editor/SeedpacketEditor.cs | 52 ++++++++++++++++++- .../seedpacket-editor/editor_seedpacket.gd | 28 ---------- .../editor_seedpacket.gd.uid | 1 - assets/levels/video_level.tres | 4 +- .../gui/seedpackets/PrepickedDummyHandler.cs | 3 +- 9 files changed, 92 insertions(+), 36 deletions(-) create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs create mode 100644 addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs.uid delete mode 100644 addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd delete mode 100644 addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid diff --git a/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn b/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn index 1997f9f..8258894 100644 --- a/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn +++ b/addons/pvzadventure/scenes/seedpack-editor/foribidden_editor_seedpacket.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=4 format=3 uid="uid://dymyownbt688c"] +[gd_scene load_steps=5 format=3 uid="uid://dymyownbt688c"] [ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="1_x27jk"] [ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_m8071"] [ext_resource type="Texture2D" uid="uid://cjkwy3u0wuax3" path="res://assets/sprites/gui/ForbiddenPacket.tres" id="3_ji8qd"] +[ext_resource type="Script" uid="uid://cy5t2lk5g75x7" path="res://addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs" id="3_m8071"] -[node name="EditorSeedpacket" type="TextureButton"] +[node name="EditorSeedpacket" type="TextureButton" node_paths=PackedStringArray("preview", "forrbidTexture")] anchors_preset = -1 anchor_right = 0.137 anchor_bottom = 0.28 @@ -13,6 +14,9 @@ mouse_default_cursor_shape = 2 texture_normal = ExtResource("1_x27jk") texture_focused = ExtResource("2_m8071") stretch_mode = 0 +script = ExtResource("3_m8071") +preview = NodePath("PlantPreviewContainer/Preview") +forrbidTexture = NodePath("ForbiddenTexture") metadata/_edit_use_anchors_ = true [node name="PlantPreviewContainer" type="Control" parent="."] diff --git a/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn b/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn index d50b7fa..2ab8ecc 100644 --- a/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn +++ b/addons/pvzadventure/scenes/seedpack-editor/seedpacket_editor.tscn @@ -112,6 +112,7 @@ layout_mode = 2 visible = false layout_mode = 2 size_flags_vertical = 3 +alignment = 1 [node name="Label" type="Label" parent="VBoxContainer/ForbiddenTags"] layout_mode = 2 @@ -128,6 +129,7 @@ columns = 9 [node name="ForbiddenPlants" type="VBoxContainer" parent="VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +alignment = 1 [node name="Label" type="Label" parent="VBoxContainer/ForbiddenPlants"] layout_mode = 2 @@ -138,6 +140,7 @@ vertical_alignment = 1 [node name="FPlantsContainer" type="GridContainer" parent="VBoxContainer/ForbiddenPlants"] unique_name_in_owner = true layout_mode = 2 +size_flags_horizontal = 4 size_flags_vertical = 3 columns = 9 diff --git a/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs b/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs new file mode 100644 index 0000000..5d2c9e0 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs @@ -0,0 +1,28 @@ +using Godot; +using Newlon.Resources; + +[Tool] +public partial class ForbiddableSeedpacket : TextureButton +{ + [Signal] public delegate void SaveCallbackEventHandler(); + [Export] private TextureRect preview; + [Export] private TextureRect forrbidTexture; + public PlantResource HeldResource; + public bool forbidden = false; + public override void _Pressed() + { + forbidden = !forbidden; + Update(); + } + + private void Update() + { + RefreshTexture(); + EmitSignal(SignalName.SaveCallback); + } + public void RefreshTexture() + { + preview.Texture = HeldResource.Preview; + forrbidTexture.Visible = forbidden; + } +} diff --git a/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs.uid b/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs.uid new file mode 100644 index 0000000..957fc62 --- /dev/null +++ b/addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs.uid @@ -0,0 +1 @@ +uid://cy5t2lk5g75x7 diff --git a/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs index 637f6b4..1265a70 100644 --- a/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs +++ b/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using Godot; using Godot.Collections; +using Newlon.Components.GUI; using Newlon.Resources; [Tool] @@ -9,15 +11,17 @@ public partial class SeedpacketEditor : BaseEditor public override void SetEditedData(AdventureLevelResource data) { base.SetEditedData(data); - SetPrepickedPlants(); + SetupPrepickedPlants(); + SetupForbiddablePlants(); } public override void Save() { CalculatePrepickedPlants(); + CalculateForbiddenPlants(); base.Save(); } - private void SetPrepickedPlants() + private void SetupPrepickedPlants() { for (int i = 0; i < editedResource.prepickedPlants.Count; i++) { @@ -28,6 +32,21 @@ public partial class SeedpacketEditor : BaseEditor } } } + private void SetupForbiddablePlants() + { + var plants = GetPlants(); + var packed = ResourceLoader.Load("uid://dymyownbt688c"); + for (int i = 0; i < plants.Count; i++) + { + var seedpacket = packed.Instantiate(); + seedpacket.HeldResource = plants[i]; + seedpacket.forbidden = editedResource.forbiddenPlants.Contains(plants[i].GetInternalID()); + seedpacket.RefreshTexture(); + seedpacket.SaveCallback += Save; + + GetNode("%FPlantsContainer").AddChild(seedpacket); + } + } private void CalculatePrepickedPlants() { Array prepicked = new(); @@ -40,6 +59,20 @@ public partial class SeedpacketEditor : BaseEditor } editedResource.prepickedPlants = prepicked; } + private void CalculateForbiddenPlants() + { + Array forbidden = new(); + + foreach (var child in GetNode("%FPlantsContainer").GetChildren()) + { + if (child is ForbiddableSeedpacket packet && packet.forbidden) + { + forbidden.Add(packet.HeldResource.GetInternalID()); + } + } + + editedResource.forbiddenPlants = forbidden; + } private PlantResource TryGetPlant(string plantName) { foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) @@ -49,5 +82,20 @@ public partial class SeedpacketEditor : BaseEditor } return null; } + private List GetPlants() + { + var result = new List(); + + foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) + { + result.Add(ResourceLoader.Load(PLANTS_DIRECTORY + file)); + } + result.Sort((a, b) => + { + return a.Order - b.Order; + }); + + return result; + } } diff --git a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd deleted file mode 100644 index 535771f..0000000 --- a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd +++ /dev/null @@ -1,28 +0,0 @@ -@tool -extends TextureButton - -signal save_callback - -var held_data : PlantResource = null -@export var preview : TextureRect - -func _can_drop_data(at_position: Vector2, data: Variant) -> bool: - if typeof(data) == TYPE_DICTIONARY: - if data.type == "files": - return load(data.files[0]) is PlantResource - return false - -func _drop_data(at_position: Vector2, data: Variant) -> void: - held_data = load(data.files[0]) as PlantResource - update() - -func update(): - if held_data: - preview.texture = held_data.Preview - else: - preview.texture = null - save_callback.emit() - -func _pressed() -> void: - held_data = null - update() diff --git a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid b/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid deleted file mode 100644 index 089de69..0000000 --- a/addons/pvzadventure/scripts/seedpacket-editor/editor_seedpacket.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://donugf6vnchij diff --git a/assets/levels/video_level.tres b/assets/levels/video_level.tres index e2e7c8d..9cfc2fc 100644 --- a/assets/levels/video_level.tres +++ b/assets/levels/video_level.tres @@ -281,9 +281,9 @@ wavePercentage = 0.5 standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_eqa0o") -forbiddenPlants = Array[String](["aloe", "spikeweed", "peashooter", "wallnut"]) +forbiddenPlants = Array[String]([]) forbiddenTags = Array[String]([]) -prepickedPlants = Array[String](["snipach", "potatomine", "sunflower", "garlic", "cucumber"]) +prepickedPlants = Array[String]([]) waves = Array[ExtResource("4_kc7t2")]([SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")]) 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]) metadata/_custom_type_script = "uid://bximdujbkj2n4" diff --git a/scripts/gui/seedpackets/PrepickedDummyHandler.cs b/scripts/gui/seedpackets/PrepickedDummyHandler.cs index 8a71cda..5c11a1e 100644 --- a/scripts/gui/seedpackets/PrepickedDummyHandler.cs +++ b/scripts/gui/seedpackets/PrepickedDummyHandler.cs @@ -10,6 +10,7 @@ public class PrepickedDummyHandler : SeedpacketHandler LevelGUIElements.Instance.SeedpacketsHotbar.AddChild(hotbarSeedpacket); hotbarSeedpacket.SetResource(_owner.GetResource()); - hotbarSeedpacket.SetHandler(new PrepickedHandler(_owner)); + hotbarSeedpacket.SetHandler(new PrepickedHandler(hotbarSeedpacket)); + hotbarSeedpacket.disablePacket = true; } } \ No newline at end of file From ca6b468ae2f57fd1c9a85e74080471468c75de10 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 29 Jul 2025 05:11:50 +0500 Subject: [PATCH 08/19] redirection tiles --- assets/effects/GarlicEffect.tres | 3 +- assets/effects/NerdusEffect.tres | 3 +- assets/levels/balance_and_spawn_test.tres | 4 +- assets/levels/tile_test.tres | 53 ++++++++++++++++ project.godot | 3 +- scenes/entities/Zombies/hobo.tscn | 2 +- scenes/entities/Zombies/zombie.tscn | 2 +- scenes/entities/plants/garlic.tscn | 2 +- scenes/entities/tiles/base_tile.tscn | 22 +++++++ scenes/entities/tiles/redirect_down_tile.tscn | 25 ++++++++ scenes/entities/tiles/redirect_up_tile.tscn | 25 ++++++++ scenes/entities/tiles/slow_tile.tscn | 24 ++++++++ scenes/entities/tiles/speed_tile.tscn | 24 ++++++++ scenes/templates/level_template.tscn | 2 +- scripts/entities/AreaOfEffect.cs | 21 +++++++ scripts/entities/AreaOfEffect.cs.uid | 1 + scripts/entities/InvulnerableEntity.cs | 14 +++++ scripts/entities/InvulnerableEntity.cs.uid | 1 + scripts/systems/effects/Effect.cs | 1 + scripts/systems/effects/GarlicEffect.cs | 59 ------------------ .../systems/effects/PermanentSpeedEffect.cs | 27 +++++++++ .../effects/PermanentSpeedEffect.cs.uid | 1 + .../systems/effects/RandomRedirectEffect.cs | 60 +++++++++++++++++++ ...ect.cs.uid => RandomRedirectEffect.cs.uid} | 0 scripts/systems/effects/RedirectEffect.cs | 55 +++++++++++++++++ scripts/systems/effects/RedirectEffect.cs.uid | 1 + scripts/systems/effects/SlownessEffect.cs | 4 +- 27 files changed, 369 insertions(+), 70 deletions(-) create mode 100644 assets/levels/tile_test.tres create mode 100644 scenes/entities/tiles/base_tile.tscn create mode 100644 scenes/entities/tiles/redirect_down_tile.tscn create mode 100644 scenes/entities/tiles/redirect_up_tile.tscn create mode 100644 scenes/entities/tiles/slow_tile.tscn create mode 100644 scenes/entities/tiles/speed_tile.tscn create mode 100644 scripts/entities/AreaOfEffect.cs create mode 100644 scripts/entities/AreaOfEffect.cs.uid create mode 100644 scripts/entities/InvulnerableEntity.cs create mode 100644 scripts/entities/InvulnerableEntity.cs.uid delete mode 100644 scripts/systems/effects/GarlicEffect.cs create mode 100644 scripts/systems/effects/PermanentSpeedEffect.cs create mode 100644 scripts/systems/effects/PermanentSpeedEffect.cs.uid create mode 100644 scripts/systems/effects/RandomRedirectEffect.cs rename scripts/systems/effects/{GarlicEffect.cs.uid => RandomRedirectEffect.cs.uid} (100%) create mode 100644 scripts/systems/effects/RedirectEffect.cs create mode 100644 scripts/systems/effects/RedirectEffect.cs.uid diff --git a/assets/effects/GarlicEffect.tres b/assets/effects/GarlicEffect.tres index 5696f04..0a36011 100644 --- a/assets/effects/GarlicEffect.tres +++ b/assets/effects/GarlicEffect.tres @@ -1,8 +1,9 @@ [gd_resource type="Resource" load_steps=2 format=3 uid="uid://dsg1vjx76ifgu"] -[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/GarlicEffect.cs" id="1_rfumy"] +[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/RandomRedirectEffect.cs" id="1_rfumy"] [resource] script = ExtResource("1_rfumy") +tilesWalked = 0.2 Duration = 1.0 Slot = "garlic" diff --git a/assets/effects/NerdusEffect.tres b/assets/effects/NerdusEffect.tres index b2bb49f..2eda568 100644 --- a/assets/effects/NerdusEffect.tres +++ b/assets/effects/NerdusEffect.tres @@ -1,8 +1,9 @@ [gd_resource type="Resource" load_steps=2 format=3 uid="uid://dme4nvp28otq6"] -[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/GarlicEffect.cs" id="1_bd12u"] +[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/RandomRedirectEffect.cs" id="1_bd12u"] [resource] script = ExtResource("1_bd12u") +tilesWalked = 0.2 Duration = 0.25 Slot = "garlic" diff --git a/assets/levels/balance_and_spawn_test.tres b/assets/levels/balance_and_spawn_test.tres index 573e358..74d97a8 100644 --- a/assets/levels/balance_and_spawn_test.tres +++ b/assets/levels/balance_and_spawn_test.tres @@ -131,8 +131,8 @@ wavePercentage = 0.5 standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_pd3l1") -forbiddenPlants = Array[String]([]) +forbiddenPlants = Array[String](["peashooter", "threepeater"]) forbiddenTags = Array[String]([]) -prepickedPlants = Array[String]([]) +prepickedPlants = Array[String](["nerdus"]) waves = Array[ExtResource("3_cugtx")]([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]) diff --git a/assets/levels/tile_test.tres b/assets/levels/tile_test.tres new file mode 100644 index 0000000..6f7fc01 --- /dev/null +++ b/assets/levels/tile_test.tres @@ -0,0 +1,53 @@ +[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=18 format=3 uid="uid://b6txurjc3j8n8"] + +[ext_resource type="PackedScene" uid="uid://cp8oadhwu51i7" path="res://scenes/entities/tiles/redirect_down_tile.tscn" id="1_8ahni"] +[ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_nvwhw"] +[ext_resource type="PackedScene" uid="uid://c5lplejgx7mex" path="res://scenes/entities/tiles/speed_tile.tscn" id="2_4or4b"] +[ext_resource type="Script" uid="uid://7rptlb5qr3b6" path="res://addons/pvzadventure/WaveData.cs" id="2_8ahni"] +[ext_resource type="PackedScene" uid="uid://d4kee4ipw1k1q" path="res://scenes/entities/tiles/redirect_up_tile.tscn" id="2_w7xe8"] +[ext_resource type="PackedScene" uid="uid://cy0puq5mtnxq7" path="res://scenes/entities/tiles/slow_tile.tscn" id="3_1dd05"] +[ext_resource type="Resource" uid="uid://bhy1gc3vi8le1" path="res://assets/rewards/GarlicReward.tres" id="5_gern8"] +[ext_resource type="Script" uid="uid://cw7yc3i2lgcja" path="res://addons/pvzadventure/WaveEvent.cs" id="7_nm8hx"] +[ext_resource type="Script" uid="uid://dl12rj75tk2qi" path="res://addons/pvzadventure/RowSpawn.cs" id="8_x4xyo"] +[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/entities/ZombieResource.cs" id="9_2qvjb"] +[ext_resource type="Resource" uid="uid://buvacn56kyy2p" path="res://assets/zombies/basic.tres" id="10_gern8"] + +[sub_resource type="Resource" id="Resource_u4615"] +script = ExtResource("8_x4xyo") +zombies = Array[ExtResource("9_2qvjb")]([null, ExtResource("10_gern8"), null, null, ExtResource("10_gern8")]) + +[sub_resource type="Resource" id="Resource_gern8"] +script = ExtResource("8_x4xyo") +zombies = Array[ExtResource("9_2qvjb")]([null, ExtResource("10_gern8"), null, null, ExtResource("10_gern8")]) + +[sub_resource type="Resource" id="Resource_u7b14"] +script = ExtResource("8_x4xyo") +zombies = Array[ExtResource("9_2qvjb")]([null, ExtResource("10_gern8"), null, null, ExtResource("10_gern8")]) + +[sub_resource type="Resource" id="Resource_gmxhq"] +script = ExtResource("8_x4xyo") +zombies = Array[ExtResource("9_2qvjb")]([null, ExtResource("10_gern8"), null, null, ExtResource("10_gern8")]) + +[sub_resource type="Resource" id="Resource_gjnpd"] +script = ExtResource("8_x4xyo") +zombies = Array[ExtResource("9_2qvjb")]([null, ExtResource("10_gern8"), null, null, ExtResource("10_gern8")]) + +[sub_resource type="Resource" id="Resource_2qvjb"] +script = ExtResource("2_8ahni") +zombiesOrdered = Array[ExtResource("8_x4xyo")]([SubResource("Resource_u4615"), SubResource("Resource_gern8"), SubResource("Resource_u7b14"), SubResource("Resource_gmxhq"), SubResource("Resource_gjnpd")]) +events = Array[ExtResource("7_nm8hx")]([]) +customWaveDelay = 0.0 +isHugeWave = false + +[resource] +script = ExtResource("1_nvwhw") +startSun = 50 +wavePercentage = 0.0 +standardWaveDelay = 10.0 +initialWaveDelay = 10.0 +reward = ExtResource("5_gern8") +forbiddenPlants = Array[String]([]) +forbiddenTags = Array[String]([]) +prepickedPlants = Array[String]([]) +waves = Array[ExtResource("2_8ahni")]([SubResource("Resource_2qvjb")]) +initialScenes = Array[PackedScene]([null, null, null, null, null, null, null, null, null, null, null, ExtResource("2_4or4b"), null, null, ExtResource("1_8ahni"), null, null, null, null, null, ExtResource("2_w7xe8"), null, null, ExtResource("2_4or4b"), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ExtResource("3_1dd05"), ExtResource("3_1dd05"), null, null, null]) diff --git a/project.godot b/project.godot index b39e007..b5e760c 100644 --- a/project.godot +++ b/project.godot @@ -200,7 +200,7 @@ locale/test="en" [layer_names] -2d_physics/layer_1="Reserved" +2d_physics/layer_1="Structures" 2d_physics/layer_2="Plants Dummy" 2d_physics/layer_3="Plants True" 2d_physics/layer_4="Zombies Dummy" @@ -208,6 +208,7 @@ locale/test="en" 2d_physics/layer_6="Projectiles" 2d_physics/layer_7="FallLine" 2d_physics/layer_8="FallParticles" +2d_physics/layer_9="Tiles" [rendering] diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index 4c4d03e..112fbf5 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=65 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="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="3_b583s"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="3_b583s"] [ext_resource type="Script" uid="uid://dt5uj25u0g6y3" path="res://scripts/particles/FallParticle.cs" id="3_tu6af"] [ext_resource type="Script" uid="uid://c5v2og85t7s6j" path="res://scripts/entities/zombies/behaviours/HoboBehaviour.cs" id="4_5selg"] [ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_c1y3b"] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index 88699b8..7914fc0 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -20,7 +20,7 @@ [ext_resource type="Script" uid="uid://cnn0ymuhypdff" path="res://scripts/audio/ChannelPlaylist.cs" id="12_he8da"] [ext_resource type="AudioStream" uid="uid://w0qfwds4o3ti" path="res://assets/audio/sfx/hit_generic.tres" id="12_vjrlo"] [ext_resource type="Script" uid="uid://b8r6fxsfjdo3a" path="res://scripts/audio/EffectBasedPlayer.cs" id="17_ltj46"] -[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="18_2q05d"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="18_2q05d"] [ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://assets/effects/SnowSlow.tres" id="19_ccrjo"] [ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="21_xnora"] [ext_resource type="Script" uid="uid://dk32ln8c2574d" path="res://scripts/entities/zombies/ZombieKillHandler.cs" id="23_mc1kl"] diff --git a/scenes/entities/plants/garlic.tscn b/scenes/entities/plants/garlic.tscn index f2f96c0..c6b64fc 100644 --- a/scenes/entities/plants/garlic.tscn +++ b/scenes/entities/plants/garlic.tscn @@ -5,7 +5,7 @@ [ext_resource type="AnimationLibrary" uid="uid://cjl81f61gdlvi" path="res://assets/animations/plants/garlic.res" id="3_jkb3q"] [ext_resource type="Script" uid="uid://btkmd86pn828y" path="res://scripts/entities/plants/behaviours/HpBasedBehaviour.cs" id="4_bv44h"] [ext_resource type="Script" uid="uid://bmtukcq10m8wo" path="res://scripts/entities/plants/ReturnEffect.cs" id="5_oob20"] -[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="6_gho1l"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="6_gho1l"] [sub_resource type="Animation" id="Animation_k0cex"] length = 0.001 diff --git a/scenes/entities/tiles/base_tile.tscn b/scenes/entities/tiles/base_tile.tscn new file mode 100644 index 0000000..5cb075b --- /dev/null +++ b/scenes/entities/tiles/base_tile.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://bfooovcq272ks"] + +[ext_resource type="Script" uid="uid://cq1dl578rbvrj" path="res://scripts/entities/InvulnerableEntity.cs" id="1_5ykcf"] +[ext_resource type="Script" uid="uid://bd1f7x1nin0i0" path="res://scripts/entities/AreaOfEffect.cs" id="2_qq7uk"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_5ykcf"] +size = Vector2(30, 40) + +[node name="BaseTile" type="Node2D"] +script = ExtResource("1_5ykcf") +MaxHP = 10.0 +completeInvulnerability = true + +[node name="Sprite2D" type="Sprite2D" parent="."] + +[node name="EffectCollider" type="Area2D" parent="."] +collision_layer = 256 +collision_mask = 8 +script = ExtResource("2_qq7uk") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="EffectCollider"] +shape = SubResource("RectangleShape2D_5ykcf") diff --git a/scenes/entities/tiles/redirect_down_tile.tscn b/scenes/entities/tiles/redirect_down_tile.tscn new file mode 100644 index 0000000..b32fcd6 --- /dev/null +++ b/scenes/entities/tiles/redirect_down_tile.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=6 format=3 uid="uid://cp8oadhwu51i7"] + +[ext_resource type="PackedScene" uid="uid://bfooovcq272ks" path="res://scenes/entities/tiles/base_tile.tscn" id="1_e3yor"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_xv011"] +[ext_resource type="Script" uid="uid://blky82wwkqirx" path="res://scripts/systems/effects/RedirectEffect.cs" id="3_q6o68"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_q6o68"] +atlas = ExtResource("2_xv011") +region = Rect2(160, 22, 41, 36) + +[sub_resource type="Resource" id="Resource_4mqps"] +script = ExtResource("3_q6o68") +tilesWalked = 0.2 +down = true +Duration = 1.0 +Slot = "redirect" +metadata/_custom_type_script = "uid://blky82wwkqirx" + +[node name="RedirectDownTile" instance=ExtResource("1_e3yor")] + +[node name="Sprite2D" parent="." index="0"] +texture = SubResource("AtlasTexture_q6o68") + +[node name="EffectCollider" parent="." index="1"] +givenEffect = SubResource("Resource_4mqps") diff --git a/scenes/entities/tiles/redirect_up_tile.tscn b/scenes/entities/tiles/redirect_up_tile.tscn new file mode 100644 index 0000000..1d719f6 --- /dev/null +++ b/scenes/entities/tiles/redirect_up_tile.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=6 format=3 uid="uid://d4kee4ipw1k1q"] + +[ext_resource type="PackedScene" uid="uid://bfooovcq272ks" path="res://scenes/entities/tiles/base_tile.tscn" id="1_wp3vm"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_8aumo"] +[ext_resource type="Script" uid="uid://blky82wwkqirx" path="res://scripts/systems/effects/RedirectEffect.cs" id="2_le24f"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_ry33t"] +atlas = ExtResource("2_8aumo") +region = Rect2(110, 22, 42, 36) + +[sub_resource type="Resource" id="Resource_8aumo"] +script = ExtResource("2_le24f") +tilesWalked = 0.2 +down = false +Duration = 1.0 +Slot = "redirect" +metadata/_custom_type_script = "uid://blky82wwkqirx" + +[node name="RedirectUpTile" instance=ExtResource("1_wp3vm")] + +[node name="Sprite2D" parent="." index="0"] +texture = SubResource("AtlasTexture_ry33t") + +[node name="EffectCollider" parent="." index="1"] +givenEffect = SubResource("Resource_8aumo") diff --git a/scenes/entities/tiles/slow_tile.tscn b/scenes/entities/tiles/slow_tile.tscn new file mode 100644 index 0000000..1fc05fb --- /dev/null +++ b/scenes/entities/tiles/slow_tile.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=6 format=3 uid="uid://cy0puq5mtnxq7"] + +[ext_resource type="PackedScene" uid="uid://bfooovcq272ks" path="res://scenes/entities/tiles/base_tile.tscn" id="1_jktsj"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_b65si"] +[ext_resource type="Script" uid="uid://3q40oeb4cabf" path="res://scripts/systems/effects/PermanentSpeedEffect.cs" id="3_b65si"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_b8lvr"] +atlas = ExtResource("2_b65si") +region = Rect2(260, 22, 42, 36) + +[sub_resource type="Resource" id="Resource_b8lvr"] +script = ExtResource("3_b65si") +Multiplier = 0.9 +Duration = 0.5 +Slot = "permanent_speed" +metadata/_custom_type_script = "uid://3q40oeb4cabf" + +[node name="SlowTile" instance=ExtResource("1_jktsj")] + +[node name="Sprite2D" parent="." index="0"] +texture = SubResource("AtlasTexture_b8lvr") + +[node name="EffectCollider" parent="." index="1"] +givenEffect = SubResource("Resource_b8lvr") diff --git a/scenes/entities/tiles/speed_tile.tscn b/scenes/entities/tiles/speed_tile.tscn new file mode 100644 index 0000000..3429e50 --- /dev/null +++ b/scenes/entities/tiles/speed_tile.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=6 format=3 uid="uid://c5lplejgx7mex"] + +[ext_resource type="PackedScene" uid="uid://bfooovcq272ks" path="res://scenes/entities/tiles/base_tile.tscn" id="1_0mgu2"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_770cq"] +[ext_resource type="Script" uid="uid://3q40oeb4cabf" path="res://scripts/systems/effects/PermanentSpeedEffect.cs" id="3_770cq"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_p8mgt"] +atlas = ExtResource("2_770cq") +region = Rect2(206, 22, 50, 37) + +[sub_resource type="Resource" id="Resource_p8mgt"] +script = ExtResource("3_770cq") +Multiplier = 1.2 +Duration = 0.5 +Slot = "permanent_speed" +metadata/_custom_type_script = "uid://3q40oeb4cabf" + +[node name="SpeedTile" instance=ExtResource("1_0mgu2")] + +[node name="Sprite2D" parent="." index="0"] +texture = SubResource("AtlasTexture_p8mgt") + +[node name="EffectCollider" parent="." index="1"] +givenEffect = SubResource("Resource_p8mgt") diff --git a/scenes/templates/level_template.tscn b/scenes/templates/level_template.tscn index 337191a..cc8741b 100644 --- a/scenes/templates/level_template.tscn +++ b/scenes/templates/level_template.tscn @@ -828,7 +828,7 @@ follow_viewport_enabled = true script = ExtResource("13_0x4ji") [node name="Hitbox" type="Area2D" parent="GameOverZombie/LoseZone"] -collision_layer = 2 +collision_layer = 6 [node name="CollisionShape2D" type="CollisionShape2D" parent="GameOverZombie/LoseZone/Hitbox"] position = Vector2(122, 199.5) diff --git a/scripts/entities/AreaOfEffect.cs b/scripts/entities/AreaOfEffect.cs new file mode 100644 index 0000000..153ae33 --- /dev/null +++ b/scripts/entities/AreaOfEffect.cs @@ -0,0 +1,21 @@ +using Godot; +using Newlon.Systems.Effects; + +namespace Newlon.Components; + +public partial class AreaOfEffect : Area2D +{ + [Export] public Effect givenEffect; + public override void _Ready() + { + AreaEntered += OnAreaEntered; + } + + public void OnAreaEntered(Area2D what) + { + if (what.GetParent() is Entity entity) + { + entity.GiveEffect(givenEffect); + } + } +} diff --git a/scripts/entities/AreaOfEffect.cs.uid b/scripts/entities/AreaOfEffect.cs.uid new file mode 100644 index 0000000..6bbb667 --- /dev/null +++ b/scripts/entities/AreaOfEffect.cs.uid @@ -0,0 +1 @@ +uid://bd1f7x1nin0i0 diff --git a/scripts/entities/InvulnerableEntity.cs b/scripts/entities/InvulnerableEntity.cs new file mode 100644 index 0000000..dc41ac7 --- /dev/null +++ b/scripts/entities/InvulnerableEntity.cs @@ -0,0 +1,14 @@ +using Godot; + +namespace Newlon.Components; + +public partial class InvulnerableEntity : Entity +{ + public override void TakeDamage(float amount, Node origin) + { + } + public override void Heal(float amount, Node origin) + { + } + +} diff --git a/scripts/entities/InvulnerableEntity.cs.uid b/scripts/entities/InvulnerableEntity.cs.uid new file mode 100644 index 0000000..4462658 --- /dev/null +++ b/scripts/entities/InvulnerableEntity.cs.uid @@ -0,0 +1 @@ +uid://cq1dl578rbvrj diff --git a/scripts/systems/effects/Effect.cs b/scripts/systems/effects/Effect.cs index aa80f70..43f9ecd 100644 --- a/scripts/systems/effects/Effect.cs +++ b/scripts/systems/effects/Effect.cs @@ -2,6 +2,7 @@ using Godot; namespace Newlon.Systems.Effects; +[GlobalClass] public abstract partial class Effect : Resource { [Export] public float Duration; diff --git a/scripts/systems/effects/GarlicEffect.cs b/scripts/systems/effects/GarlicEffect.cs deleted file mode 100644 index f8966ab..0000000 --- a/scripts/systems/effects/GarlicEffect.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Godot; -using Newlon.Components.Zombies; - -namespace Newlon.Systems.Effects; - -public partial class GarlicEffect : Effect -{ - [Export] private float tilesWalked = 0.2f; - RandomNumberGenerator RandomNumberGenerator; - - public override void Enter(Node target) - { - if(RandomNumberGenerator == null) - { - RandomNumberGenerator = new RandomNumberGenerator(); - RandomNumberGenerator.Randomize(); - } - if(target is RuntimeZombieData zombieData) - zombieData.AbleToEat = false; - //Animation call - } - - public override void Exit(Node target) - { - if(target is RuntimeZombieData zombieData) - { - int mult; - if((int)zombieData.GlobalPosition.Y/FieldParams.TileHeight <= 2) - { - mult = 1; - } - else if((int)zombieData.GlobalPosition.Y/FieldParams.TileHeight >= 6) - { - mult = -1; - } - else - { - if(RandomNumberGenerator.RandiRange(0,1) == 0) - { - mult = 1; - } - else - { - mult = -1; - } - } - zombieData.AbleToEat = false; - var tween = zombieData.CreateTween(); - tween.TweenProperty(zombieData,"position:y",zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); - tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); - tween.TweenCallback(Callable.From(() => {zombieData.AbleToEat = true;})); - } - } - - public override void Process(Node target) - { - - } -} diff --git a/scripts/systems/effects/PermanentSpeedEffect.cs b/scripts/systems/effects/PermanentSpeedEffect.cs new file mode 100644 index 0000000..e555539 --- /dev/null +++ b/scripts/systems/effects/PermanentSpeedEffect.cs @@ -0,0 +1,27 @@ +using Godot; +using Newlon.Components; + +namespace Newlon.Systems.Effects; + +[GlobalClass] +public partial class PermanentSpeedEffect : Effect +{ + [Export] public float Multiplier; + + public override void Enter(Node target) + { + if (target is Entity entity) + { + entity.LocalTimescale *= Multiplier; + } + } + + public override void Exit(Node target) + { + } + + public override void Process(Node target) + { + + } +} diff --git a/scripts/systems/effects/PermanentSpeedEffect.cs.uid b/scripts/systems/effects/PermanentSpeedEffect.cs.uid new file mode 100644 index 0000000..a18520a --- /dev/null +++ b/scripts/systems/effects/PermanentSpeedEffect.cs.uid @@ -0,0 +1 @@ +uid://3q40oeb4cabf diff --git a/scripts/systems/effects/RandomRedirectEffect.cs b/scripts/systems/effects/RandomRedirectEffect.cs new file mode 100644 index 0000000..f57e4d2 --- /dev/null +++ b/scripts/systems/effects/RandomRedirectEffect.cs @@ -0,0 +1,60 @@ +using Godot; +using Newlon.Components.Zombies; + +namespace Newlon.Systems.Effects; + +[GlobalClass] +public partial class RandomRedirectEffect : Effect +{ + [Export] private float tilesWalked = 0.2f; + RandomNumberGenerator RandomNumberGenerator; + + public override void Enter(Node target) + { + if (RandomNumberGenerator == null) + { + RandomNumberGenerator = new RandomNumberGenerator(); + RandomNumberGenerator.Randomize(); + } + if (target is RuntimeZombieData zombieData) + zombieData.AbleToEat = false; + //Animation call + } + + public override void Exit(Node target) + { + if (target is RuntimeZombieData zombieData) + { + int mult; + if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight <= 2) + { + mult = 1; + } + else if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight >= 6) + { + mult = -1; + } + else + { + if (RandomNumberGenerator.RandiRange(0, 1) == 0) + { + mult = 1; + } + else + { + mult = -1; + } + } + zombieData.AbleToEat = false; + var tween = zombieData.CreateTween(); + tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); + tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); + tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); + } + } + + public override void Process(Node target) + { + + } +} diff --git a/scripts/systems/effects/GarlicEffect.cs.uid b/scripts/systems/effects/RandomRedirectEffect.cs.uid similarity index 100% rename from scripts/systems/effects/GarlicEffect.cs.uid rename to scripts/systems/effects/RandomRedirectEffect.cs.uid diff --git a/scripts/systems/effects/RedirectEffect.cs b/scripts/systems/effects/RedirectEffect.cs new file mode 100644 index 0000000..988e1cf --- /dev/null +++ b/scripts/systems/effects/RedirectEffect.cs @@ -0,0 +1,55 @@ +using Godot; +using Newlon.Components.Zombies; + +namespace Newlon.Systems.Effects; + +[GlobalClass] +public partial class RedirectEffect : Effect +{ + [Export] private float tilesWalked = 0.2f; + [Export] private bool down = false; + + public override void Enter(Node target) + { + if (target is RuntimeZombieData zombieData) + zombieData.AbleToEat = false; + //Animation call + } + + public override void Exit(Node target) + { + if (target is RuntimeZombieData zombieData) + { + int mult; + if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight <= 2) + { + mult = 1; + } + else if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight >= 6) + { + mult = -1; + } + else + { + if (down) + { + mult = 1; + } + else + { + mult = -1; + } + } + zombieData.AbleToEat = false; + var tween = zombieData.CreateTween(); + tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); + tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); + tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); + } + } + + public override void Process(Node target) + { + + } +} diff --git a/scripts/systems/effects/RedirectEffect.cs.uid b/scripts/systems/effects/RedirectEffect.cs.uid new file mode 100644 index 0000000..2c898ac --- /dev/null +++ b/scripts/systems/effects/RedirectEffect.cs.uid @@ -0,0 +1 @@ +uid://blky82wwkqirx diff --git a/scripts/systems/effects/SlownessEffect.cs b/scripts/systems/effects/SlownessEffect.cs index 19d7a4e..b4d7a83 100644 --- a/scripts/systems/effects/SlownessEffect.cs +++ b/scripts/systems/effects/SlownessEffect.cs @@ -1,9 +1,9 @@ using Godot; using Newlon.Components; -using System; namespace Newlon.Systems.Effects; +[GlobalClass] public partial class SlownessEffect : Effect { [Export] public Color ColorOverride; @@ -29,6 +29,6 @@ public partial class SlownessEffect : Effect public override void Process(Node target) { - + } } From a53160a1c1cd15438d5271ea46bf176af4bc0eec Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 00:56:53 +0500 Subject: [PATCH 09/19] new effect system --- assets/effects/GarlicEffect.tres | 4 +- scenes/projectiles/pea.tscn | 12 ++- scripts/Newlon.cs | 9 +- scripts/entities/Entity.cs | 90 ++++++++----------- scripts/systems/effects/Effect.cs | 12 ++- scripts/systems/effects/EffectHandler.cs | 48 ++++++++++ scripts/systems/effects/EffectHandler.cs.uid | 1 + .../systems/effects/PermanentSpeedEffect.cs | 11 +-- .../systems/effects/RandomRedirectEffect.cs | 21 +++-- scripts/systems/effects/RedirectEffect.cs | 7 +- scripts/systems/effects/SlownessEffect.cs | 20 ++--- 11 files changed, 146 insertions(+), 89 deletions(-) create mode 100644 scripts/systems/effects/EffectHandler.cs create mode 100644 scripts/systems/effects/EffectHandler.cs.uid diff --git a/assets/effects/GarlicEffect.tres b/assets/effects/GarlicEffect.tres index 0a36011..7ef6399 100644 --- a/assets/effects/GarlicEffect.tres +++ b/assets/effects/GarlicEffect.tres @@ -1,9 +1,9 @@ -[gd_resource type="Resource" load_steps=2 format=3 uid="uid://dsg1vjx76ifgu"] +[gd_resource type="Resource" script_class="RandomRedirectEffect" load_steps=2 format=3 uid="uid://dsg1vjx76ifgu"] [ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/RandomRedirectEffect.cs" id="1_rfumy"] [resource] script = ExtResource("1_rfumy") tilesWalked = 0.2 -Duration = 1.0 +Duration = 3.0 Slot = "garlic" diff --git a/scenes/projectiles/pea.tscn b/scenes/projectiles/pea.tscn index 38ac1ef..b6eb1b5 100644 --- a/scenes/projectiles/pea.tscn +++ b/scenes/projectiles/pea.tscn @@ -1,9 +1,18 @@ -[gd_scene load_steps=5 format=3 uid="uid://b2hrv0aqbui7u"] +[gd_scene load_steps=7 format=3 uid="uid://b2hrv0aqbui7u"] [ext_resource type="Script" uid="uid://dxlwvwy3hj56x" path="res://scripts/projectiles/LinearProjectile.cs" id="1_3kc4s"] [ext_resource type="Texture2D" uid="uid://dq0mul65hevtt" path="res://assets/sprites/plants/pea.tres" id="2_26q5x"] +[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/RandomRedirectEffect.cs" id="2_fwj1o"] [ext_resource type="PackedScene" uid="uid://1d33w4ubtury" path="res://scenes/particles/pea_particles.tscn" id="2_osqrk"] +[sub_resource type="Resource" id="Resource_22ej5"] +script = ExtResource("2_fwj1o") +tilesWalked = 0.2 +travelTime = 0.2 +Duration = 0.3 +Slot = "testra" +metadata/_custom_type_script = "uid://bb6lv1djnqjaw" + [sub_resource type="CircleShape2D" id="CircleShape2D_ix1sk"] radius = 6.0 @@ -13,6 +22,7 @@ collision_mask = 8 script = ExtResource("1_3kc4s") _speed = 3.0 _damage = 10 +_impactEffect = SubResource("Resource_22ej5") particles = ExtResource("2_osqrk") [node name="Sprite" type="Sprite2D" parent="."] diff --git a/scripts/Newlon.cs b/scripts/Newlon.cs index 9a4d5ea..aa01d14 100644 --- a/scripts/Newlon.cs +++ b/scripts/Newlon.cs @@ -1,9 +1,14 @@ +using Godot; + namespace Newlon; public static class LON { - public static float Pr(string path) + public static void ForceFinishTween(Tween tween) { - return 0; + if (tween == null) return; + + tween.Pause(); + tween.CustomStep(Mathf.Inf); } } \ No newline at end of file diff --git a/scripts/entities/Entity.cs b/scripts/entities/Entity.cs index 697f69f..8720ca5 100644 --- a/scripts/entities/Entity.cs +++ b/scripts/entities/Entity.cs @@ -113,8 +113,7 @@ public partial class Entity : Node2D #region Effects [Export] private Array _effectImmunities = new(); [Export] private bool completeInvulnerability = false; - private readonly Dictionary _activeEffectSlots = new(); - private readonly Dictionary _effectSlotTimers = new(); + private readonly Dictionary effectHandlers = new(); [Signal] public delegate void EffectStartedEventHandler(Effect what); [Signal] public delegate void EffectEndedEventHandler(Effect what); @@ -123,50 +122,25 @@ public partial class Entity : Node2D public virtual void GiveEffect(Effect what) { - if (Killed) return; - if (_effectImmunities.Contains(what) || completeInvulnerability) - { + if (what == null || + Killed || + completeInvulnerability || _effectImmunities.Contains(what)) return; - } - string slot = what.Slot; - if (_activeEffectSlots.ContainsKey(slot) == false) - { + var slot = what.Slot; + if (effectHandlers.ContainsKey(slot) == false) InitSlot(slot); - } - if (what == _activeEffectSlots[slot]) + if (effectHandlers[slot].HandledEffect == what) { - EmitSignal(SignalName.EffectContinued, what); + effectHandlers[slot].Restart(); } else { - EmitSignal(SignalName.EffectStarted, what); + effectHandlers[slot].HandledEffect = what; + effectHandlers[slot].Start(); } - if (_activeEffectSlots[slot] != null) - { - _effectSlotTimers[slot].Stop(); - _activeEffectSlots[slot].Exit(this); - } - _effectSlotTimers[slot].WaitTime = what.Duration; - _effectSlotTimers[slot].Start(); - - what.Enter(this); - _activeEffectSlots[slot] = what; - - } - - private void InitSlot(string key) - { - _activeEffectSlots.Add(key, null); - - var timer = new Timer() { Autostart = false, OneShot = true }; - AddChild(timer); - timer.Timeout += () => { EndEffectAtSlot(key); }; - - _effectSlotTimers.Add(key, timer); - } public void EndEffect(Effect what) @@ -174,34 +148,48 @@ public partial class Entity : Node2D EndEffectAtSlot(what.Slot); } + public Tween CreateTweenEffect(Effect effect) + { + Tween tween = CreateTween(); + + effectHandlers[effect.Slot].EffectTween = tween; + + return tween; + } + protected void ClearEffects() { - foreach (var slot in _activeEffectSlots.Keys) + foreach (var slot in effectHandlers.Keys) { - if (_activeEffectSlots[slot] != null) - { - _activeEffectSlots[slot].Exit(this); - _effectSlotTimers[slot].Stop(); - _activeEffectSlots[slot] = null; - } + effectHandlers[slot].End(); } } + private void InitSlot(string key) + { + effectHandlers.Add(key, new EffectHandler()); + effectHandlers[key].handler = this; + effectHandlers[key].EffectTimer = new(); + + AddChild(effectHandlers[key].EffectTimer); + effectHandlers[key].EffectTimer.Name = key + "Timer"; + + effectHandlers[key].EffectTimer.Timeout += () => { EndEffectAtSlot(key); }; + } public void ProcessEffects() { - if (Killed) return; - foreach (string key in _activeEffectSlots.Keys) - _activeEffectSlots[key]?.Process(this); + foreach (var slot in effectHandlers.Keys) + { + effectHandlers[slot].Process(); + } } private void EndEffectAtSlot(string slot) { - _activeEffectSlots[slot].Exit(this); - _activeEffectSlots[slot] = null; - - EmitSignal(SignalName.EffectEnded, _activeEffectSlots[slot]); - + EmitSignal(SignalName.EffectEnded, effectHandlers[slot].HandledEffect); + effectHandlers[slot].End(); } + #endregion #region LocalTimescale private float _localTimescale = 1.0f; diff --git a/scripts/systems/effects/Effect.cs b/scripts/systems/effects/Effect.cs index 43f9ecd..738eade 100644 --- a/scripts/systems/effects/Effect.cs +++ b/scripts/systems/effects/Effect.cs @@ -1,4 +1,5 @@ using Godot; +using Newlon.Components; namespace Newlon.Systems.Effects; @@ -7,7 +8,12 @@ public abstract partial class Effect : Resource { [Export] public float Duration; [Export] public string Slot; - public abstract void Enter(Node target); - public abstract void Process(Node target); - public abstract void Exit(Node target); + public abstract void Enter(Entity target); + public abstract void Process(Entity target); + public abstract void Exit(Entity target); + + private Tween CreateTween(Entity fromEntity) + { + return fromEntity.CreateTweenEffect(this); + } } diff --git a/scripts/systems/effects/EffectHandler.cs b/scripts/systems/effects/EffectHandler.cs new file mode 100644 index 0000000..e8a6590 --- /dev/null +++ b/scripts/systems/effects/EffectHandler.cs @@ -0,0 +1,48 @@ +using Godot; +using Newlon.Components; + +namespace Newlon.Systems.Effects; + +public partial class EffectHandler : RefCounted +{ + public Entity handler; + public Effect HandledEffect; + public Timer EffectTimer; + public Tween EffectTween; + + public void Start() + { + EffectTimer.WaitTime = HandledEffect.Duration; + EffectTimer.Start(); + + HandledEffect.Enter(handler); + } + public void End() + { + HandledEffect.Exit(handler); + HandledEffect = null; + EffectTimer.Stop(); + if (EffectTween != null) + { + LON.ForceFinishTween(EffectTween); + EffectTween.Kill(); + } + } + public void Process() + { + HandledEffect.Process(handler); + } + public void Restart() + { + HandledEffect.Exit(handler); + EffectTimer.Stop(); + if (EffectTween != null) + { + LON.ForceFinishTween(EffectTween); + EffectTween.Kill(); + } + + HandledEffect.Enter(handler); + EffectTimer.Start(); + } +} diff --git a/scripts/systems/effects/EffectHandler.cs.uid b/scripts/systems/effects/EffectHandler.cs.uid new file mode 100644 index 0000000..5bbd866 --- /dev/null +++ b/scripts/systems/effects/EffectHandler.cs.uid @@ -0,0 +1 @@ +uid://csxb8rllqjb1t diff --git a/scripts/systems/effects/PermanentSpeedEffect.cs b/scripts/systems/effects/PermanentSpeedEffect.cs index e555539..88c2203 100644 --- a/scripts/systems/effects/PermanentSpeedEffect.cs +++ b/scripts/systems/effects/PermanentSpeedEffect.cs @@ -8,19 +8,16 @@ public partial class PermanentSpeedEffect : Effect { [Export] public float Multiplier; - public override void Enter(Node target) + public override void Enter(Entity target) { - if (target is Entity entity) - { - entity.LocalTimescale *= Multiplier; - } + target.LocalTimescale *= Multiplier; } - public override void Exit(Node target) + public override void Exit(Entity target) { } - public override void Process(Node target) + public override void Process(Entity target) { } diff --git a/scripts/systems/effects/RandomRedirectEffect.cs b/scripts/systems/effects/RandomRedirectEffect.cs index f57e4d2..63cd05d 100644 --- a/scripts/systems/effects/RandomRedirectEffect.cs +++ b/scripts/systems/effects/RandomRedirectEffect.cs @@ -1,4 +1,5 @@ using Godot; +using Newlon.Components; using Newlon.Components.Zombies; namespace Newlon.Systems.Effects; @@ -7,9 +8,10 @@ namespace Newlon.Systems.Effects; public partial class RandomRedirectEffect : Effect { [Export] private float tilesWalked = 0.2f; + [Export] private float travelTime = 1; RandomNumberGenerator RandomNumberGenerator; - public override void Enter(Node target) + public override void Enter(Entity target) { if (RandomNumberGenerator == null) { @@ -19,9 +21,14 @@ public partial class RandomRedirectEffect : Effect if (target is RuntimeZombieData zombieData) zombieData.AbleToEat = false; //Animation call + Animation(target); } - public override void Exit(Node target) + public override void Exit(Entity target) + { + + } + private void Animation(Entity target) { if (target is RuntimeZombieData zombieData) { @@ -46,14 +53,14 @@ public partial class RandomRedirectEffect : Effect } } zombieData.AbleToEat = false; - var tween = zombieData.CreateTween(); - tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); - tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); + var tween = zombieData.CreateTweenEffect(this); + tween.TweenInterval(Duration-travelTime); + tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, travelTime); + tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, travelTime); tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); } } - - public override void Process(Node target) + public override void Process(Entity target) { } diff --git a/scripts/systems/effects/RedirectEffect.cs b/scripts/systems/effects/RedirectEffect.cs index 988e1cf..b53ba58 100644 --- a/scripts/systems/effects/RedirectEffect.cs +++ b/scripts/systems/effects/RedirectEffect.cs @@ -1,5 +1,6 @@ using Godot; using Newlon.Components.Zombies; +using Newlon.Components; namespace Newlon.Systems.Effects; @@ -9,14 +10,14 @@ public partial class RedirectEffect : Effect [Export] private float tilesWalked = 0.2f; [Export] private bool down = false; - public override void Enter(Node target) + public override void Enter(Entity target) { if (target is RuntimeZombieData zombieData) zombieData.AbleToEat = false; //Animation call } - public override void Exit(Node target) + public override void Exit(Entity target) { if (target is RuntimeZombieData zombieData) { @@ -48,7 +49,7 @@ public partial class RedirectEffect : Effect } } - public override void Process(Node target) + public override void Process(Entity target) { } diff --git a/scripts/systems/effects/SlownessEffect.cs b/scripts/systems/effects/SlownessEffect.cs index b4d7a83..64c328e 100644 --- a/scripts/systems/effects/SlownessEffect.cs +++ b/scripts/systems/effects/SlownessEffect.cs @@ -9,25 +9,19 @@ public partial class SlownessEffect : Effect [Export] public Color ColorOverride; [Export] public float Multiplier; - public override void Enter(Node target) + public override void Enter(Entity target) { - if (target is Entity entity) - { - entity.LocalTimescale *= Multiplier; - entity.Modulate = ColorOverride; - } + target.LocalTimescale *= Multiplier; + target.Modulate = ColorOverride; } - public override void Exit(Node target) + public override void Exit(Entity target) { - if (target is Entity entity) - { - entity.LocalTimescale /= Multiplier; - entity.Modulate = Colors.White; - } + target.LocalTimescale /= Multiplier; + target.Modulate = Colors.White; } - public override void Process(Node target) + public override void Process(Entity target) { } From 2ff33cc4b851fb4c20813aaa613a3a3116e3d03f Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 01:02:31 +0500 Subject: [PATCH 10/19] oops --- scripts/systems/effects/RedirectEffect.cs | 29 ++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/scripts/systems/effects/RedirectEffect.cs b/scripts/systems/effects/RedirectEffect.cs index b53ba58..588d2bf 100644 --- a/scripts/systems/effects/RedirectEffect.cs +++ b/scripts/systems/effects/RedirectEffect.cs @@ -13,8 +13,35 @@ public partial class RedirectEffect : Effect public override void Enter(Entity target) { if (target is RuntimeZombieData zombieData) + { zombieData.AbleToEat = false; - //Animation call + //Animation call + int mult; + if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight <= 2) + { + mult = 1; + } + else if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight >= 6) + { + mult = -1; + } + else + { + if (down) + { + mult = 1; + } + else + { + mult = -1; + } + } + zombieData.AbleToEat = false; + var tween = zombieData.CreateTweenEffect(this); + tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); + tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); + tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); + } } public override void Exit(Entity target) From 452a87d2805a4fbca64cd668f7fbf4c09b4e69c5 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 01:42:51 +0500 Subject: [PATCH 11/19] Small improvements --- assets/levels/video_level.tres | 10 +++-- project.godot | 1 - scenes/entities/tiles/base_tile.tscn | 2 +- scenes/entities/tiles/slow_tile.tscn | 2 +- scenes/entities/tiles/speed_tile.tscn | 2 +- scenes/projectiles/pea.tscn | 12 +----- scripts/systems/effects/EffectHandler.cs | 1 + scripts/systems/effects/RedirectEffect.cs | 32 +------------- translations/gui.csv | 4 ++ translations/gui.en.translation | Bin 2590 -> 2662 bytes translations/gui.ru.translation | Bin 3501 -> 3565 bytes translations/plants.csv | 50 +++++++++++----------- translations/plants.en.translation | Bin 3738 -> 3842 bytes translations/plants.ru.translation | Bin 5213 -> 5345 bytes translations/rewards.csv.import | 4 +- translations/rewards.en.translation | Bin 1050 -> 1094 bytes translations/rewards.ru.translation | Bin 1709 -> 1809 bytes translations/zombies.csv | 20 ++++----- translations/zombies.en.translation | Bin 2002 -> 2026 bytes translations/zombies.ru.translation | Bin 2829 -> 2817 bytes 20 files changed, 56 insertions(+), 84 deletions(-) diff --git a/assets/levels/video_level.tres b/assets/levels/video_level.tres index 9cfc2fc..8219e51 100644 --- a/assets/levels/video_level.tres +++ b/assets/levels/video_level.tres @@ -1,7 +1,11 @@ -[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=64 format=3 uid="uid://dwd5oqr0tuvhv"] +[gd_resource type="Resource" script_class="AdventureLevelResource" load_steps=68 format=3 uid="uid://dwd5oqr0tuvhv"] [ext_resource type="Resource" uid="uid://c268ghdrraxgr" path="res://assets/rewards/NerdusReward.tres" id="1_eqa0o"] +[ext_resource type="PackedScene" uid="uid://c5lplejgx7mex" path="res://scenes/entities/tiles/speed_tile.tscn" id="1_jfmww"] +[ext_resource type="PackedScene" uid="uid://cp8oadhwu51i7" path="res://scenes/entities/tiles/redirect_down_tile.tscn" id="1_qx8xe"] [ext_resource type="Script" uid="uid://bximdujbkj2n4" path="res://addons/pvzadventure/AdventureLevelResource.cs" id="1_r0wru"] +[ext_resource type="PackedScene" uid="uid://cy0puq5mtnxq7" path="res://scenes/entities/tiles/slow_tile.tscn" id="2_8syff"] +[ext_resource type="PackedScene" uid="uid://d4kee4ipw1k1q" path="res://scenes/entities/tiles/redirect_up_tile.tscn" id="2_hyvhe"] [ext_resource type="Script" uid="uid://cw7yc3i2lgcja" path="res://addons/pvzadventure/WaveEvent.cs" id="3_icaa5"] [ext_resource type="Script" uid="uid://7rptlb5qr3b6" path="res://addons/pvzadventure/WaveData.cs" id="4_kc7t2"] [ext_resource type="Script" uid="uid://dl12rj75tk2qi" path="res://addons/pvzadventure/RowSpawn.cs" id="5_66y5q"] @@ -281,9 +285,9 @@ wavePercentage = 0.5 standardWaveDelay = 30.0 initialWaveDelay = 20.0 reward = ExtResource("1_eqa0o") -forbiddenPlants = Array[String]([]) +forbiddenPlants = Array[String](["garlic", "nerdus"]) forbiddenTags = Array[String]([]) prepickedPlants = Array[String]([]) waves = Array[ExtResource("4_kc7t2")]([SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")]) -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, null, null, null, null, null, null, null, ExtResource("1_jfmww"), null, null, null, null, null, null, null, null, ExtResource("1_qx8xe"), null, null, null, null, null, null, null, null, ExtResource("2_8syff"), null, null, null, null, null, null, null, null, ExtResource("2_hyvhe"), null, null, null, null, null, null, null, null, ExtResource("1_jfmww")]) metadata/_custom_type_script = "uid://bximdujbkj2n4" diff --git a/project.godot b/project.godot index b5e760c..96ed95b 100644 --- a/project.godot +++ b/project.godot @@ -196,7 +196,6 @@ cursor_right={ [internationalization] locale/translations=PackedStringArray("res://translations/plants.en.translation", "res://translations/plants.ru.translation", "res://translations/zombies.en.translation", "res://translations/zombies.ru.translation", "res://translations/gui.en.translation", "res://translations/gui.ru.translation", "res://translations/rewards.en.translation", "res://translations/rewards.ru.translation") -locale/test="en" [layer_names] diff --git a/scenes/entities/tiles/base_tile.tscn b/scenes/entities/tiles/base_tile.tscn index 5cb075b..dae4271 100644 --- a/scenes/entities/tiles/base_tile.tscn +++ b/scenes/entities/tiles/base_tile.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" uid="uid://bd1f7x1nin0i0" path="res://scripts/entities/AreaOfEffect.cs" id="2_qq7uk"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_5ykcf"] -size = Vector2(30, 40) +size = Vector2(20, 26) [node name="BaseTile" type="Node2D"] script = ExtResource("1_5ykcf") diff --git a/scenes/entities/tiles/slow_tile.tscn b/scenes/entities/tiles/slow_tile.tscn index 1fc05fb..f2d7b69 100644 --- a/scenes/entities/tiles/slow_tile.tscn +++ b/scenes/entities/tiles/slow_tile.tscn @@ -10,7 +10,7 @@ region = Rect2(260, 22, 42, 36) [sub_resource type="Resource" id="Resource_b8lvr"] script = ExtResource("3_b65si") -Multiplier = 0.9 +Multiplier = 0.667 Duration = 0.5 Slot = "permanent_speed" metadata/_custom_type_script = "uid://3q40oeb4cabf" diff --git a/scenes/entities/tiles/speed_tile.tscn b/scenes/entities/tiles/speed_tile.tscn index 3429e50..be47bdf 100644 --- a/scenes/entities/tiles/speed_tile.tscn +++ b/scenes/entities/tiles/speed_tile.tscn @@ -10,7 +10,7 @@ region = Rect2(206, 22, 50, 37) [sub_resource type="Resource" id="Resource_p8mgt"] script = ExtResource("3_770cq") -Multiplier = 1.2 +Multiplier = 1.333 Duration = 0.5 Slot = "permanent_speed" metadata/_custom_type_script = "uid://3q40oeb4cabf" diff --git a/scenes/projectiles/pea.tscn b/scenes/projectiles/pea.tscn index b6eb1b5..38ac1ef 100644 --- a/scenes/projectiles/pea.tscn +++ b/scenes/projectiles/pea.tscn @@ -1,18 +1,9 @@ -[gd_scene load_steps=7 format=3 uid="uid://b2hrv0aqbui7u"] +[gd_scene load_steps=5 format=3 uid="uid://b2hrv0aqbui7u"] [ext_resource type="Script" uid="uid://dxlwvwy3hj56x" path="res://scripts/projectiles/LinearProjectile.cs" id="1_3kc4s"] [ext_resource type="Texture2D" uid="uid://dq0mul65hevtt" path="res://assets/sprites/plants/pea.tres" id="2_26q5x"] -[ext_resource type="Script" uid="uid://bb6lv1djnqjaw" path="res://scripts/systems/effects/RandomRedirectEffect.cs" id="2_fwj1o"] [ext_resource type="PackedScene" uid="uid://1d33w4ubtury" path="res://scenes/particles/pea_particles.tscn" id="2_osqrk"] -[sub_resource type="Resource" id="Resource_22ej5"] -script = ExtResource("2_fwj1o") -tilesWalked = 0.2 -travelTime = 0.2 -Duration = 0.3 -Slot = "testra" -metadata/_custom_type_script = "uid://bb6lv1djnqjaw" - [sub_resource type="CircleShape2D" id="CircleShape2D_ix1sk"] radius = 6.0 @@ -22,7 +13,6 @@ collision_mask = 8 script = ExtResource("1_3kc4s") _speed = 3.0 _damage = 10 -_impactEffect = SubResource("Resource_22ej5") particles = ExtResource("2_osqrk") [node name="Sprite" type="Sprite2D" parent="."] diff --git a/scripts/systems/effects/EffectHandler.cs b/scripts/systems/effects/EffectHandler.cs index e8a6590..d47209a 100644 --- a/scripts/systems/effects/EffectHandler.cs +++ b/scripts/systems/effects/EffectHandler.cs @@ -19,6 +19,7 @@ public partial class EffectHandler : RefCounted } public void End() { + if (HandledEffect == null) return; HandledEffect.Exit(handler); HandledEffect = null; EffectTimer.Stop(); diff --git a/scripts/systems/effects/RedirectEffect.cs b/scripts/systems/effects/RedirectEffect.cs index 588d2bf..197ba94 100644 --- a/scripts/systems/effects/RedirectEffect.cs +++ b/scripts/systems/effects/RedirectEffect.cs @@ -38,42 +38,14 @@ public partial class RedirectEffect : Effect } zombieData.AbleToEat = false; var tween = zombieData.CreateTweenEffect(this); - tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); - tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); + tween.TweenProperty(zombieData, "global_position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); + tween.Parallel().TweenProperty(zombieData, "global_position:x", zombieData.GlobalPosition.X - FieldParams.TileWidth * tilesWalked, Duration); tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); } } public override void Exit(Entity target) { - if (target is RuntimeZombieData zombieData) - { - int mult; - if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight <= 2) - { - mult = 1; - } - else if ((int)zombieData.GlobalPosition.Y / FieldParams.TileHeight >= 6) - { - mult = -1; - } - else - { - if (down) - { - mult = 1; - } - else - { - mult = -1; - } - } - zombieData.AbleToEat = false; - var tween = zombieData.CreateTween(); - tween.TweenProperty(zombieData, "position:y", zombieData.GlobalPosition.Y + FieldParams.TileHeight * mult, Duration); - tween.Parallel().TweenProperty(zombieData, "position:x", zombieData.GlobalPosition.X - FieldParams.TileHeight * tilesWalked, Duration); - tween.TweenCallback(Callable.From(() => { zombieData.AbleToEat = true; })); - } } public override void Process(Entity target) diff --git a/translations/gui.csv b/translations/gui.csv index 25e4c41..82f9121 100644 --- a/translations/gui.csv +++ b/translations/gui.csv @@ -42,10 +42,12 @@ DETERMINATION Peachniil SergeiManagement Tyamonster +Deem0n155 [/ul] [center][color=cyan]Special thanks[/color][/center] [ul] [img]uid://y2hhywmmy0t5[/img][font=uid://bor21ae1lks57]Aleksej ""[color=pink]Second beam[/color]"" Mirenkov[/font] +[font=uid://bor21ae1lks57]LIL AQ — Music[/font] [/ul] All rights for Plants versus Zombies franchise belong to PopCap games","[center][font_size=24]О нас[/font_size][/center] Сделано в [color=steel_blue]Godot Engine [img=16]res://icon.svg[/img][/color] @@ -62,10 +64,12 @@ DETERMINATION Peachniil SergeiManagement Tyamonster +Deem0n155 [/ul] [center][color=cyan]Special thanks[/color][/center] [ul] [img]uid://y2hhywmmy0t5[/img][font=uid://bor21ae1lks57]Алексей ""[color=pink]Second beam[/color]"" Миренков[/font] +[font=uid://bor21ae1lks57]Lil AQ — музыка[/font] [/ul] Все права на Plants versus Zombies франшизу принадлежат PopCap games." close,Close,Закрыть diff --git a/translations/gui.en.translation b/translations/gui.en.translation index 5557c205c29091fad2e737c507bd32a101c45825..412b4603d39c9f39984e782cf7088d0769c31563 100644 GIT binary patch delta 208 zcmbOy@=RpICq~|>ObiT%fq2)yAhCs$|1*kfZe?L$Xk}nvmns sFc8k(zx2{Q*2xOYT15onY>r}9V&im4P0cmPGc+}wT+MmVAT2+y#I`gu#Y$g4DZj|bFfr9I xC%f3xJk}>ON5L^r;ZegBg$sKwHec9&vHQZV3mY~Yb7eF00PO)A9uyqp3;>#fI*0%O delta 169 zcmaDWy;gbyBNMMOGXnz%@A?-cmN=P@NnC3ZI|IW81_)*X(u_cCFLswJ4=64PWP|X$ zvj@Y@aZL7SQWJ6q3iAVnKv?3FWd2Fc$?Z&PjO~-xF^MxeO+LotFBt|@!VQ!LVUTGc poV|bPC7;Q9%-W2Oo1>VO*e17e9@t#ZmBb7(2dEybC@46{82}*KAua#_ diff --git a/translations/plants.csv b/translations/plants.csv index 4d161f1..aa61116 100644 --- a/translations/plants.csv +++ b/translations/plants.csv @@ -1,93 +1,93 @@ keys,en,ru aloe,Aloe,Алоэ aloe_desc,"Health points: [color=DARK_RED]{MaxHP}[/color] -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Ability recharge time: [color=DARK_RED]{wait_time} seconds[/color]. Heals plant when it has [color=DARK_RED]{_hpTreshold|%}%[/color] of its health.","Очки здоровья: [color=dark_red]{MaxHP}[/color]. -Время перезарядки: [color=dark_red]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=dark_red]{ReloadTime} секунд[/color]. Время перезарядки способности: [color=dark_red]{wait_time} секунд[/color]. Лечит растения [color=DARK_RED] с {_hpTreshold|%}% [/color] здоровья." garlic,Garlic,Чеснок garlic_desc,"Health points: [color=DARK_RED]{MaxHP}[/color] -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]." +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]." peashooter,Peashooter,Горохострел peashooter_desc,"Health points: [color=DARK_RED]{MaxHP}[/color]. -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Pea damage: [color=DARK_RED]{_damage}[/color]. Firerate: [color=DARK_RED]{FireTimer.wait_time} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color]. -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон от гороха: [color=DARK_RED]{_damage}[/color]. Задержка стрельбы: [color=DARK_RED]{FireTimer.wait_time} секунды[/color]." potatomine,Potato mine,Картофельная мина potatomine_desc,"Health points: [color=DARK_RED]{MaxHP}[/color]. -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Explosion damage: [color=DARK_RED]{damage}[/color]. Prime time: [color=DARK_RED]{PrimeTimer.wait_time} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color]. -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон от взрыва: [color=DARK_RED]{damage}[/color]. Время роста: [color=DARK_RED]{PrimeTimer.wait_time} секунд[/color]." snowpea,Snowpea,Снежный горох snowpea_desc,"Health points: [color=DARK_RED]{MaxHP}[/color]. -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Pea damage: [color=DARK_RED]{_damage}[/color]. Firerate: [color=DARK_RED]{FireTimer.wait_time} seconds[/color]. Slow percentage: [color=STEEL_BLUE]{Multiplier|*-1|+1|%}%[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color]. -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон от гороха: [color=DARK_RED]{_damage}[/color]. Задержка стрельбы: [color=DARK_RED]{FireTimer.wait_time} секунды[/color]. Процент замедления: [color=STEEL_BLUE]{Multiplier|*-1|+1|%}%[/color]." spikeweed,Spikeweed,Колючка spikeweed_desc,"Health points: [color=DARK_RED]{MaxHP}[/color]. -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Damage per second: [color=DARK_RED]{_damage|*invokationsPerSecond}[/color]. [color=transparent]{invokationsPerSecond}[/color]","Очки здоровья: [color=DARK_RED]{MaxHP}[/color]. -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон в секунду: [color=DARK_RED]{_damage|*invokationsPerSecond}[/color]. [color=transparent]{invokationsPerSecond}[/color]." sunflower,Sunflower,Подсолнух sunflower_desc,"Health points: [color=DARK_RED]{MaxHP}[/color] -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Initial sun production time: [color=DARK_RED]{StartTimer.wait_time} seconds[/color]. Sun production time: [color=DARK_RED]{Timer.wait_time} seconds[/color](After first sun produced).","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Изначальная задержка выработки солнца: [color=DARK_RED]{StartTimer.wait_time} секунд[/color]. Задержка выработки солнца: [color=DARK_RED]{Timer.wait_time} секунды[/color](После первого солнца)." threepeater,Threepeater,Тристрел threepeater_desc,"Health points: [color=DARK_RED]{MaxHP}[/color]. -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Pea damage: [color=DARK_RED]{_damage}[/color] ([color=darkred]{_damage|*3}[/color] in close proximity). Firerate: [color=DARK_RED]{FireTimer.wait_time} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color]. -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон от гороха: [color=DARK_RED]{_damage}[/color] ([color=darkred]{_damage|*3}[/color] вблизи). Задержка стрельбы: [color=DARK_RED]{FireTimer.wait_time} секунд[/color]." wallnut,Wallnut,Стенорех wallnut_desc,"Health points: [color=DARK_RED]{MaxHP}[/color] -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]." +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]." nerdus,Pickly cactus,Колкий кактус nerdus_desc,"He is very critical about other’s behaviour. He likes to pay people back in kind. Health points: [color=darkred] {MaxHP}[/color]. -Reload time: [color=darkred] {ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=darkred] {ReloadTime} seconds[/color]. Damage conversion: [color=darkred]1 bite = {bitesToPeas} peas [/color].","Он очень критичен к поведению других. Ему нравится отплачивать людям добром за добро. Очки здоровья: [color=darkred] {MaxHP}[/color]. -Время перезарядки: [color=darkred]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=darkred]{ReloadTime} секунд[/color]. Конвертация урона: [color=darkred]1 укус = {bitesToPeas} горошин [/color]." cucumber,Cucumber,Огурец cucumber_desc,"He has a little trouble with differentiating left and right, so he doesn't make this choice at all. Health points: [color=darkred] {MaxHP}[/color]. -Reload time: [color=darkred] {ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=darkred] {ReloadTime} seconds[/color]. Seed damage: [color=darkred] {_damage}[/color]. Firerate: [color=darkred] {FireTimer.wait_time} seconds[/color].","Он имеет небольшие проблемы с различением левого и правого, поэтому он не думает об этом вовсе. Очки здоровья: [color=darkred] {MaxHP}[/color]. -Время перезарядки: [color=darkred]{ReloadTime} секунд[/color]. +Время готовности пакета: [color=darkred]{ReloadTime} секунд[/color]. Урон семечка: [color=darkred] {_damage}[/color]. Скорость стрельбы: [color=darkred]{FireTimer.wait_time} секунд[/color]." snipach,Snipach,Спинат snipach_desc,"Health points: [color=DARK_RED]{MaxHP}[/color] -Reload time: [color=DARK_RED]{ReloadTime} seconds[/color]. +Seedpacket recharge time: [color=DARK_RED]{ReloadTime} seconds[/color]. Shot damage: [color=darkred]{_damage}[/color]. -Ability recharge: [color=darkred]{Timer.wait_time}[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] -Время перезарядки: [color=DARK_RED]{ReloadTime} секунд[/color]. +Reload time: [color=darkred]{Timer.wait_time}[/color].","Очки здоровья: [color=DARK_RED]{MaxHP}[/color] +Время готовности пакета: [color=DARK_RED]{ReloadTime} секунд[/color]. Урон за выстрел: [color=darkred]{_damage}[/color]. Перезарядка способности: [color=darkred]{Timer.wait_time}[/color]." diff --git a/translations/plants.en.translation b/translations/plants.en.translation index 9729c484d4a0b11d27d221f1b3a606265ab7cff6..de149a38e52f7e82388294fa82ca56f78f546db0 100644 GIT binary patch delta 803 zcmbOw+a$L^jY%qzk%57efq{V=h=EKnZu#PS)sAhl1CvzjGmsQeeA1hxW$r8t3|v4y z2*Z@7e+w$`W@2Et0~Gs!B;LE;K0XVm=sHmB1(LWStKgMSKz=?Dmrvf#BwruF4&@=K zTGYoP5(u>I0Z{B4l6a!G%VtNQZ6Fu$Ac^)XBMx24U_>I4#q&of=%4^@$x-=pe_lZa%~{CJuzX|BcOHXfbw^N7^dz?ra8Yg z(8bI^HF`kI&8~6gD9|cVAlny+fe4J(3wmz51=J671<;`k@<6)4v537%(v~Tn36gMiTE`Zyz54RCEp~b{k3DkX7)?OCUcDh_fbdXOgcMV2ARM zR4wXb5m5o!b{!}NQVp{$(c5LS8qhY73wV&kd*(ELZUUO~04T-|R18zk!(G1oHx^fi zC|mNB0o4P|m>kM1=$XU;2?S6;!1TtPn!v}&1`!ZJGSjWK{sS{J0|QVC7{k>6i@vgk zbMks-@%l#~S3oh)v0xLoeY|{+8>ovPs9X++ZBIRs^ezYIFk*uiU-Jc0Ae5l zgL@fFz+f^rPsQXTeBzVic-bb;;gyF z`nRBhUSg1(WBoXA`SfU~&@2Q=$}ap1|o(ltV#o;GS&EeSF z`nRBh9A*Xv6`%kJ!^C^n+s8`)O*R4wfG|wlkX7(X0gy8hXvW0J$C%{n=W{`MNTx38 zV-axz+9m~53BoYliQX=oy@0kU0o8&qOuT1K<7Y2!28Jm>0T70X^Kh3hk6~wE5C*CR zVVHP`vL%lJP`wlb!{iiZLCNFgLr#nb$zq-2}2h7>K}ly`bl|BS8Hydw_w(AP>a9`58DFE=;(v`@+79 zy^|lZD^G4Z!Sb8g1?NH(vJ095ZRD8DDEt(~ IL|2hH0D8N9{{R30 diff --git a/translations/rewards.csv.import b/translations/rewards.csv.import index 0030832..5e333f6 100644 --- a/translations/rewards.csv.import +++ b/translations/rewards.csv.import @@ -3,11 +3,13 @@ importer="csv_translation" type="Translation" uid="uid://xvsya47m66cl" -valid=false [deps] +files=["res://translations/rewards.en.translation", "res://translations/rewards.ru.translation"] + source_file="res://translations/rewards.csv" +dest_files=["res://translations/rewards.en.translation", "res://translations/rewards.ru.translation"] [params] diff --git a/translations/rewards.en.translation b/translations/rewards.en.translation index 2283c31a6e34312ee5ae31978d7c76e121af7640..e0de19601f6275f9ed648881e595197db27bd717 100644 GIT binary patch delta 108 zcmbQmag1ZbBt}&`1_p-zXut(1<^{y8K&$}70h_loGBfgiO+R=_fsuhh7$_t+c|DUg rqw(g~Ov;Q3|AIL=F0A4Eu*fR-hUe~Pro4X)4D3KfK(!1(!9mUdd?hAu delta 74 zcmX@cF^glvBu3T$Sb!Y^1A_|?vjVXK5PNOj&dAI-`4W=>qrzrpW@SbmcAzLD5C;VZ GIRgN<(H#f? diff --git a/translations/rewards.ru.translation b/translations/rewards.ru.translation index 214dd3fa34bf53d30ff558c1825d2860e8e7e3ca..3bfbef4e77d586710c4ee85bfcd372ad2b6a60de 100644 GIT binary patch delta 167 zcmZ3>JCSe0LPk|P1_p-zXut(1<^{y8K&$}70h^C8GBfgiO+R>QAu|JmA5h3|@;)YO z#`l|lF)d+^zA*1%)5S(0Zn&`Z!tM(@E^NB6;lkF7O$rxw0l7fNgmV#`5}`5W!3-!80>nTB#;sR! zW_2+$Ft7pTVt^Qkz~a{8cE6R3D?OQqpYAe$SC*?_b>5Koxw%`|}{L-Ajs znz2mq=6g)Gj0m0_iz$LPS&k)j^KRBKMqa3D_e1ApB6KI;V=|iT&Cbb(5H)W4DFGB# TncT?k!ov=<1mxJD;2>uJSe-V# delta 204 zcmaFGe~Ev?JVwTx$@3ZY1^+WJFqkqjFhm2flGWeSCX??oiicV=F)$bcMFM~rh`_k@ zO3timW(I~oK!FgTJP?7!uSev5-~qB<05L02Zf#4Y;TIsA8;aS0v^)@(PxfY-z-)KH zX|gW6(d0Ei?9O}>h2O(+5t+aFBx^V$P{3ib2D<~8E@02&Wnc%I1#(kRaF8Op` delta 203 zcmZn^>lNFumXR@H@;XL+!3B&A3>TnS$?EUvg30d~#Y4N985qt2ML`&dz_|5F&a6^a z1_oWA90)T(#ji)?evksPbAbv$cx_9iVLOnP1d4$$8xYF_@uJC5O#dgdF$+v?Vwag5 yz@D)AF>@>7`VXZ0QNOZlUH&IPUhzF1FK5s>f>WzU9T`d&= From abd08661c4738f261398851f15db920bf108d867 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 02:21:11 +0500 Subject: [PATCH 12/19] Inheritance cleared --- scenes/entities/Zombies/bucket_zombie.tscn | 1353 ++++++++++++++++++-- scenes/entities/Zombies/cone_zombie.tscn | 1234 +++++++++++++++++- scenes/entities/Zombies/door_zombie.tscn | 186 --- scenes/entities/Zombies/hobo.tscn | 644 ++++++++-- scenes/entities/Zombies/zombie.tscn | 40 +- scenes/entities/plants/aloe.tscn | 49 +- scenes/entities/plants/cucumber.tscn | 58 +- scenes/entities/plants/garlic.tscn | 40 +- scenes/entities/plants/nerdus.tscn | 40 +- scenes/entities/plants/peashooter.tscn | 58 +- scenes/entities/plants/potato_mine.tscn | 63 +- scenes/entities/plants/snipach.tscn | 59 +- scenes/entities/plants/snowpea.tscn | 93 +- scenes/entities/plants/spikeweed.tscn | 49 +- scenes/entities/plants/sunflower.tscn | 55 +- scenes/entities/plants/threepeater.tscn | 85 +- scenes/entities/plants/wallnut.tscn | 48 +- scenes/templates/plant_template.tscn | 5 +- 18 files changed, 3396 insertions(+), 763 deletions(-) delete mode 100644 scenes/entities/Zombies/door_zombie.tscn diff --git a/scenes/entities/Zombies/bucket_zombie.tscn b/scenes/entities/Zombies/bucket_zombie.tscn index 2982093..dce2bc7 100644 --- a/scenes/entities/Zombies/bucket_zombie.tscn +++ b/scenes/entities/Zombies/bucket_zombie.tscn @@ -1,40 +1,772 @@ -[gd_scene load_steps=17 format=3 uid="uid://xu4i6tmkv00a"] +[gd_scene load_steps=71 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://btf4xhu31ln6n" path="res://assets/shaders/canvas_group_flash.gdshader" id="2_lea3a"] +[ext_resource type="Script" uid="uid://dildme6epx8l4" path="res://scripts/entities/zombies/RuntimeZombieData.cs" id="1_6aq6w"] [ext_resource type="Texture2D" uid="uid://ce04l60l6mhfk" path="res://assets/sprites/bucket1.tres" id="3_0nlp0"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="3_xq7ta"] +[ext_resource type="Script" uid="uid://dt5uj25u0g6y3" path="res://scripts/particles/FallParticle.cs" id="4_1avwi"] [ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_1s2fn"] [ext_resource type="Texture2D" uid="uid://ikk4jp7mvm3s" path="res://assets/sprites/bucket2.tres" id="4_xx7fu"] [ext_resource type="AudioStream" uid="uid://bu1egfsyplpx4" path="res://assets/audio/sfx/metalhit_generic.tres" id="5_lt6ps"] [ext_resource type="Texture2D" uid="uid://cmmpfi8ug43l2" path="res://assets/sprites/bucket3.tres" id="5_v1iwd"] +[ext_resource type="Script" uid="uid://dau0tfmlfiqmo" path="res://scripts/entities/EntityHPObserver.cs" id="5_wndvs"] [ext_resource type="AudioStream" uid="uid://w0qfwds4o3ti" path="res://assets/audio/sfx/hit_generic.tres" id="6_kedip"] [ext_resource type="Texture2D" uid="uid://dacgbwohpmeed" path="res://assets/sprites/zombies/basic.png" id="6_lea3a"] +[ext_resource type="Script" uid="uid://bbw848msxb4re" path="res://scripts/entities/DegradingSprite.cs" id="8_jdtg8"] +[ext_resource type="Texture2D" uid="uid://dri70dxyks7xh" path="res://assets/sprites/zombies/hobo.png" id="11_5swed"] +[ext_resource type="AnimationLibrary" uid="uid://ceb3khu7rwgy8" path="res://assets/animations/zombies/basic.res" id="12_gjchu"] +[ext_resource type="Script" uid="uid://dw7v3s4kbu7ma" path="res://scripts/entities/AnimationStatistics.cs" id="13_lbhkf"] +[ext_resource type="Script" uid="uid://dqyony6jxt2p0" path="res://scripts/entities/zombies/EatBox.cs" id="14_xxv4d"] +[ext_resource type="AnimationNodeStateMachine" uid="uid://dj0blope85bg7" path="res://assets/animations/zombies/basic_zombie_tree.tres" id="16_bufgc"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="17_3hgrb"] +[ext_resource type="Script" uid="uid://7hdj2k14lfe4" path="res://scripts/entities/zombies/ZombieMover.cs" id="18_tffdk"] +[ext_resource type="Script" uid="uid://cnn0ymuhypdff" path="res://scripts/audio/ChannelPlaylist.cs" id="19_k2y7k"] +[ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/entities/Armor.cs" id="22_aasgd"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="23_rgojs"] +[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="24_3ui6x"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="24_wndvs"] +[ext_resource type="AudioStream" uid="uid://bg76miyscfvhu" path="res://assets/audio/sfx/groan.tres" id="25_ix7xe"] +[ext_resource type="Script" uid="uid://b8r6fxsfjdo3a" path="res://scripts/audio/EffectBasedPlayer.cs" id="26_7018m"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="27_wd16f"] +[ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://assets/effects/SnowSlow.tres" id="28_b1su1"] +[ext_resource type="AudioStream" uid="uid://dt13iugnnx4op" path="res://assets/audio/sfx/yuck_generic.tres" id="29_si5j4"] +[ext_resource type="AudioStream" uid="uid://bjotp63arocci" path="res://assets/audio/sfx/frozen.mp3" id="30_qu32w"] +[ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="31_lml24"] +[ext_resource type="Script" uid="uid://dk32ln8c2574d" path="res://scripts/entities/zombies/ZombieKillHandler.cs" id="32_m7hhr"] +[ext_resource type="Material" uid="uid://jr0vpg030jqv" path="res://assets/ZombieMaterial.tres" id="34_jdtg8"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_03nuu"] -resource_local_to_scene = true -shader = ExtResource("2_lea3a") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/blend = 0.0 -shader_parameter/selected = false +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_wn68q"] +tip_nodepath = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 17 +joint_data/0/bone2d_node = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = 0.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = false +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 16 +joint_data/1/bone2d_node = NodePath("Butt/Body/LeftUpperArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = false +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false -[sub_resource type="ShaderMaterial" id="ShaderMaterial_1iamf"] -resource_local_to_scene = true -shader = ExtResource("3_xq7ta") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_x5uj2"] +tip_nodepath = NodePath("Butt/Body/RightUpperArm/RightLowerArm/RightHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 8 +joint_data/0/bone2d_node = NodePath("Butt/Body/RightUpperArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = false +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 9 +joint_data/1/bone2d_node = NodePath("Butt/Body/RightUpperArm/RightLowerArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 90.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_vcc72"] +tip_nodepath = NodePath("Butt/RightUpperLeg/RightLowerLeg/RightFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 1 +joint_data/0/bone2d_node = NodePath("Butt/RightUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 2 +joint_data/1/bone2d_node = NodePath("Butt/RightUpperLeg/RightLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 160.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_kto0i"] +tip_nodepath = NodePath("Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 4 +joint_data/0/bone2d_node = NodePath("Butt/LeftUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 5 +joint_data/1/bone2d_node = NodePath("Butt/LeftUpperLeg/LeftLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = -90.0 +joint_data/1/constraint_angle_max = 0.0 +joint_data/1/constraint_angle_invert = true +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModificationStack2D" id="SkeletonModificationStack2D_wn68q"] +modification_count = 4 +modifications/0 = SubResource("SkeletonModification2DCCDIK_wn68q") +modifications/1 = SubResource("SkeletonModification2DCCDIK_x5uj2") +modifications/2 = SubResource("SkeletonModification2DCCDIK_vcc72") +modifications/3 = SubResource("SkeletonModification2DCCDIK_kto0i") + +[sub_resource type="AtlasTexture" id="AtlasTexture_jvn5w"] +atlas = ExtResource("6_lea3a") +region = Rect2(15, 30, 20, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vmdbp"] +atlas = ExtResource("6_lea3a") +region = Rect2(64, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x1oyw"] +atlas = ExtResource("6_lea3a") +region = Rect2(93, 50, 17, 9) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vjx3c"] +atlas = ExtResource("6_lea3a") +region = Rect2(79, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f31xd"] +atlas = ExtResource("6_lea3a") +region = Rect2(47, 33, 8, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_od8jf"] +atlas = ExtResource("6_lea3a") +region = Rect2(59, 33, 7, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p4711"] +atlas = ExtResource("6_lea3a") +region = Rect2(71, 30, 19, 13) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1bk2b"] +atlas = ExtResource("6_lea3a") +region = Rect2(12, 43, 6, 18) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y06yv"] +atlas = ExtResource("6_lea3a") +region = Rect2(36, 50, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lu8go"] +atlas = ExtResource("6_lea3a") +region = Rect2(22, 45, 8, 15) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cdq7v"] +atlas = ExtResource("6_lea3a") +region = Rect2(93, 8, 29, 39) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e7wc3"] +atlas = ExtResource("6_lea3a") +region = Rect2(72, 2, 13, 26) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wn68q"] +atlas = ExtResource("6_lea3a") +region = Rect2(36, 0, 32, 29) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vcc72"] +atlas = ExtResource("6_lea3a") +region = Rect2(93, 3, 2, 3) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kto0i"] +atlas = ExtResource("6_lea3a") +region = Rect2(105, 2, 3, 4) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x5uj2"] +atlas = ExtResource("6_lea3a") +region = Rect2(15, 17, 17, 6) + +[sub_resource type="CircleShape2D" id="CircleShape2D_dn8ha"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_67t4t"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_djocr"] +atlas = ExtResource("6_lea3a") +region = Rect2(2, 7, 6, 19) + +[sub_resource type="AtlasTexture" id="AtlasTexture_auqeq"] +atlas = ExtResource("6_lea3a") +region = Rect2(0, 32, 9, 15) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vlvtp"] +atlas = ExtResource("11_5swed") +region = Rect2(55, 0, 9, 10) + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ccrjo"] +radius = 3.00026 +height = 16.007 [sub_resource type="AtlasTexture" id="AtlasTexture_wfem3"] atlas = ExtResource("6_lea3a") region = Rect2(24, 2, 9, 9) -[sub_resource type="AtlasTexture" id="AtlasTexture_auqeq"] +[sub_resource type="AtlasTexture" id="AtlasTexture_4q1fo"] atlas = ExtResource("6_lea3a") region = Rect2(0, 32, 9, 15) +[sub_resource type="Animation" id="Animation_vn3j1"] +resource_name = "RESET" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Zombie/Butt/Body/LeftUpperArm:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, -20)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Zombie/Butt/Body/LeftUpperArm:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Zombie/Butt/Body/Head/LeftEye:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -9)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Zombie/Butt/Body/Head/LeftEye:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Zombie/Butt/Body/Head/RightEye:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-16, -8)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Zombie/Butt/Body/Head/RightEye:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Zombie/Butt/Body/Head/Jaw:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, 3)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Zombie/Butt/Body/Head/Jaw:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 15)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:rotation") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Zombie/Butt/Body/RightUpperArm:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-14, -23)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Zombie/Butt/Body/RightUpperArm:rotation") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 10)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:rotation") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Zombie/Butt/LeftUpperLeg:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 4)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Zombie/Butt/LeftUpperLeg:rotation") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:rotation") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 12)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:rotation") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("Zombie/Butt/RightUpperLeg:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-6, 3)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("Zombie/Butt/RightUpperLeg:rotation") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("Zombie/Butt:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, -35)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("Zombie/Butt:rotation") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("Zombie/Butt/Body:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, -2)] +} +tracks/33/type = "value" +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/path = NodePath("Zombie/Butt/Body:rotation") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/34/type = "value" +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/path = NodePath("Zombie:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/35/type = "value" +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/path = NodePath("Zombie:rotation") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/36/type = "value" +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/path = NodePath("Zombie/Butt/Body/Head:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-10, -25)] +} +tracks/37/type = "value" +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/path = NodePath("Zombie/Butt/Body/Head:rotation") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/38/type = "value" +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/path = NodePath("Zombie/Butt/Body/Head:visible") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/39/type = "value" +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:position") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-0.0022974, -17.0131)] +} +tracks/40/type = "value" +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:rotation") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/41/type = "value" +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:visible") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/42/type = "value" +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/path = NodePath("Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm/Left_Hand:texture") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [SubResource("AtlasTexture_vlvtp")] +} +tracks/43/type = "value" +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/path = NodePath("Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm/Left_Hand:offset") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -1)] +} +tracks/44/type = "value" +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/path = NodePath("Zombie/Butt/Body/Tie:scale") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_x5uj2"] +_data = { +&"RESET": SubResource("Animation_vn3j1") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_hxyad"] +size = Vector2(26, 48) + [sub_resource type="Resource" id="Resource_lea3a"] resource_local_to_scene = true script = ExtResource("4_1s2fn") @@ -42,6 +774,18 @@ flat_value = 5.0 percentage_value = 0.0 mult_value = 1.0 +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r4ug6"] +size = Vector2(16, 48) + +[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_2q05d"] + +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ccrjo"] +nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_2q05d") +nodes/TimeScale/position = Vector2(60, 120) +nodes/Tree/node = ExtResource("16_bufgc") +nodes/Tree/position = Vector2(-240, 120) +node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] + [sub_resource type="Resource" id="Resource_v1iwd"] resource_local_to_scene = true script = ExtResource("4_1s2fn") @@ -49,131 +793,490 @@ flat_value = 0.2 percentage_value = 0.0 mult_value = 1.0 -[node name="BucketZombie" instance=ExtResource("1_mwqpo")] +[sub_resource type="Resource" id="Resource_dn8ha"] +script = ExtResource("31_lml24") +restartTreshold = -1.0 +metadata/_custom_type_script = "uid://c1x4n4nqyq72f" -[node name="CanvasGroup" parent="." index="0"] -material = SubResource("ShaderMaterial_03nuu") +[node name="BucketZombie" type="Node2D" node_paths=PackedStringArray("_armor", "_player", "_tree")] +y_sort_enabled = true +script = ExtResource("1_6aq6w") +_armor = NodePath("Armor") +MaxHP = 100.0 +_player = NodePath("CanvasGroup/basic_zombie_walk/AnimationPlayer") +_tree = NodePath("AnimationTree") +metadata/_edit_vertical_guides_ = [-159.0] -[node name="Zombie" parent="CanvasGroup/basic_zombie_walk" index="0"] -use_parent_material = false +[node name="CanvasGroup" type="CanvasGroup" parent="."] +material = ExtResource("34_jdtg8") -[node name="Butt" parent="CanvasGroup/basic_zombie_walk/Zombie" index="0"] -use_parent_material = false +[node name="basic_zombie_walk" type="Node2D" parent="CanvasGroup"] + +[node name="Zombie" type="Skeleton2D" parent="CanvasGroup/basic_zombie_walk"] +modification_stack = SubResource("SkeletonModificationStack2D_wn68q") + +[node name="Butt" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie"] +position = Vector2(5, -35) scale = Vector2(0.999912, 0.999912) +rest = Transform2D(1, 0, 0, 1, 5, -35) +editor_settings/show_bone_gizmo = false -[node name="Butt" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="0"] -use_parent_material = false - -[node name="RightUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="1"] -use_parent_material = false -scale = Vector2(0.999829, 0.999829) - -[node name="RightLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg" index="1"] -scale = Vector2(0.999834, 0.999834) - -[node name="RightFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg" index="0"] -scale = Vector2(0.999831, 0.999831) - -[node name="LeftUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="2"] -use_parent_material = false -scale = Vector2(0.999831, 0.999831) - -[node name="LeftLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg" index="1"] -scale = Vector2(0.999831, 0.999831) - -[node name="LeftFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg" index="1"] -scale = Vector2(0.99983, 0.99983) - -[node name="Body" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="3"] -use_parent_material = false -scale = Vector2(0.999832, 0.999832) - -[node name="RightUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="0"] -use_parent_material = false -scale = Vector2(0.999827, 0.999827) - -[node name="RightLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm" index="1"] -scale = Vector2(0.999821, 0.999821) - -[node name="RightHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm" index="0"] -scale = Vector2(0.999827, 0.999827) - -[node name="Tie" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="2"] -rotation = 0.0622776 -skew = -0.000231266 - -[node name="Head" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="3"] -scale = Vector2(0.999831, 0.999831) - -[node name="Right_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="0"] -position = Vector2(-16, -8) - -[node name="Left_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="1"] -position = Vector2(-4, -9) - -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="2"] -position = Vector2(-3.00076, 2.9987) -rotation = 0.00604386 -scale = Vector2(0.999828, 0.999828) - -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="1"] -scale = Vector2(0.999828, 0.999828) - -[node name="Hat" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="4"] -position = Vector2(-6, -8) - -[node name="Sprite" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" index="0"] -material = SubResource("ShaderMaterial_1iamf") -position = Vector2(0.994479, -10.0058) -texture = ExtResource("3_0nlp0") -degradationStages = Array[Texture]([ExtResource("3_0nlp0"), ExtResource("4_xx7fu"), ExtResource("5_v1iwd")]) - -[node name="LeftUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="4"] -scale = Vector2(0.999824, 0.999824) - -[node name="Left_Lower_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" index="0"] -rotation = 0.0585546 -scale = Vector2(0.999996, 0.999996) - -[node name="Left_Hand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm" index="0"] -show_behind_parent = false -position = Vector2(-0.99983, 12.9978) -rotation = -0.0258424 -scale = Vector2(0.99965, 0.99965) - -[node name="LeftLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" index="2"] -scale = Vector2(0.999826, 0.999826) - -[node name="LeftHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm" index="0"] -scale = Vector2(0.99982, 0.99982) - -[node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand" index="0"] -texture = SubResource("AtlasTexture_wfem3") +[node name="Butt" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +texture = SubResource("AtlasTexture_jvn5w") centered = false -offset = Vector2(-4, 0) +offset = Vector2(-10, -3) metadata/_edit_lock_ = true -[node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm" index="1"] +[node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +position = Vector2(-6, 3) +scale = Vector2(0.999834, 0.999834) +rest = Transform2D(1, 0, 0, 1, -6, 3) +editor_settings/show_bone_gizmo = false + +[node name="Right_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +texture = SubResource("AtlasTexture_vmdbp") +centered = false +offset = Vector2(-6, -2) +metadata/_edit_lock_ = true + +[node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +position = Vector2(-2, 12) +scale = Vector2(0.999832, 0.999832) +rest = Transform2D(1, 0, 0, 1, -2, 12) +editor_settings/show_bone_gizmo = false + +[node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-2, 14) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -2, 14) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 0.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot"] +texture = SubResource("AtlasTexture_x1oyw") +centered = false +offset = Vector2(-4, -3) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-18, -2) +texture = SubResource("AtlasTexture_vjx3c") +centered = false +offset = Vector2(12, 1) +metadata/_edit_lock_ = true + +[node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +position = Vector2(6, 4) +scale = Vector2(0.999835, 0.999835) +rest = Transform2D(1, 0, 0, 1, 6, 4) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +texture = SubResource("AtlasTexture_f31xd") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +position = Vector2(-1, 13) +scale = Vector2(0.999833, 0.999833) +rest = Transform2D(1, 0, 0, 1, -1, 13) +editor_settings/show_bone_gizmo = false + +[node name="Left_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +texture = SubResource("AtlasTexture_od8jf") +centered = false +offset = Vector2(-1, 0) +metadata/_edit_lock_ = true + +[node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +position = Vector2(6, 10) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, 6, 10) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 160.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot"] +texture = SubResource("AtlasTexture_p4711") +centered = false +offset = Vector2(-14, -3) +metadata/_edit_lock_ = true + +[node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +position = Vector2(1, -2) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, 1, -2) +editor_settings/show_bone_gizmo = false + +[node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +z_index = -1 +position = Vector2(-14, -23) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -14, -23) +editor_settings/show_bone_gizmo = false + +[node name="Right_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +texture = SubResource("AtlasTexture_1bk2b") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +position = Vector2(-2, 15) +scale = Vector2(0.999825, 0.999825) +rest = Transform2D(1, 0, 0, 1, -2, 15) +editor_settings/show_bone_gizmo = false + +[node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 8.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand"] +texture = SubResource("AtlasTexture_y06yv") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +texture = SubResource("AtlasTexture_lu8go") +centered = false +offset = Vector2(-5, -1) +metadata/_edit_lock_ = true + +[node name="Body" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +rotation = 0.00163735 +texture = SubResource("AtlasTexture_cdq7v") +centered = false +offset = Vector2(-15, -27) +metadata/_edit_lock_ = true + +[node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-9, -21) +rotation = -0.0667573 +skew = -0.000233412 +rest = Transform2D(1, 0, 0, 1, -9, -21) +auto_calculate_length_and_angle = false +length = 24.0 +bone_angle = 100.0 +editor_settings/show_bone_gizmo = false + +[node name="Tie" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Tie"] +texture = SubResource("AtlasTexture_e7wc3") +centered = false +offset = Vector2(-10, -1) +metadata/_edit_lock_ = true + +[node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-10, -25) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -10, -25) +editor_settings/show_bone_gizmo = false + +[node name="HeadParticle" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" node_paths=PackedStringArray("data")] +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("4_1avwi") +data = NodePath("../../../../../../..") +maxAngle = 45.0 +minTorque = -45.0 +maxTorque = 45.0 +Impulse = 100.0 + +[node name="Head" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] +texture = SubResource("AtlasTexture_wn68q") +centered = false +offset = Vector2(-20, -24) +metadata/_edit_lock_ = true + +[node name="Right_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-16, -8.00001) +scale = Vector2(1, 1) +texture = SubResource("AtlasTexture_vcc72") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true + +[node name="Left_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-4, -9) +scale = Vector2(1, 1) +texture = SubResource("AtlasTexture_kto0i") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true + +[node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-2.91709, 2.79991) +rotation = -0.0466304 +scale = Vector2(0.999829, 0.999829) +texture = SubResource("AtlasTexture_x5uj2") +centered = false +offset = Vector2(-12, -2) +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] +position = Vector2(-4.58496, -8.21035) +shape = SubResource("CircleShape2D_dn8ha") + +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("5_wndvs") +_threshold = 0.0 +_observedEntity = NodePath("../../../../../../../..") + +[node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-3, 3) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -3, 3) +auto_calculate_length_and_angle = false +length = 11.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw"] +remote_path = NodePath("../../HeadParticle/Head/Jaw") + +[node name="RightEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-16, -8) +rest = Transform2D(1, 0, 0, 1, -16, -8) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye"] +remote_path = NodePath("../../HeadParticle/Head/Right_Eye") + +[node name="LeftEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-4, -9) +rest = Transform2D(1, 0, 0, 1, -4, -9) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye"] +remote_path = NodePath("../../HeadParticle/Head/Left_Eye") + +[node name="Hat" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" node_paths=PackedStringArray("data")] +position = Vector2(-6, -8) +collision_layer = 128 +collision_mask = 64 +mass = 0.5 +center_of_mass_mode = 1 +freeze = true +script = ExtResource("4_1avwi") +data = NodePath("../../../../../../..") +maxAngle = 45.0 +minTorque = -45.0 +maxTorque = 45.0 +Impulse = 100.0 + +[node name="Sprite" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" node_paths=PackedStringArray("armor")] +material = ExtResource("24_wndvs") +position = Vector2(0.994479, -10.0058) +texture = ExtResource("3_0nlp0") +script = ExtResource("8_jdtg8") +armor = NodePath("../../../../../../../../Armor") +degradationStages = Array[Texture]([ExtResource("3_0nlp0"), ExtResource("4_xx7fu"), ExtResource("5_v1iwd")]) +thresholdPercentage = Array[float]([1.0, 0.667, 0.333]) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat"] +position = Vector2(1, -6) +shape = SubResource("CircleShape2D_67t4t") + +[node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-1, -20) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -1, -20) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-37, 10) +texture = SubResource("AtlasTexture_djocr") +centered = false +offset = Vector2(33, -12) +metadata/_edit_lock_ = true + +[node name="HandProjectile" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" node_paths=PackedStringArray("data")] +position = Vector2(-2, 14) +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("4_1avwi") +data = NodePath("../../../../../../..") +minTorque = -45.0 +maxTorque = 45.0 + +[node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +rotation = -0.070757 +scale = Vector2(0.999999, 0.999999) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) metadata/_edit_lock_ = true -[node name="Eatbox" parent="." index="2"] +[node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] +position = Vector2(-0.99983, 12.9978) +rotation = -0.0583248 +scale = Vector2(0.999655, 0.999655) +texture = SubResource("AtlasTexture_vlvtp") +centered = false +offset = Vector2(-4, -1) +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +position = Vector2(-0.00104554, 13.0063) +shape = SubResource("CapsuleShape2D_ccrjo") + +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("5_wndvs") +_observedEntity = NodePath("../../../../../../../..") + +[node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-2, 14) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -2, 14) +editor_settings/show_bone_gizmo = false + +[node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.999825, 0.999825) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 6.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand"] +texture = SubResource("AtlasTexture_wfem3") +centered = false +offset = Vector2(-4, 0) +metadata/_edit_lock_ = true + +[node name="Left_Hand_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand"] +remote_path = NodePath("../../../HandProjectile/Left_Lower_Arm/Left_Hand") + +[node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +texture = SubResource("AtlasTexture_4q1fo") +centered = false +offset = Vector2(-5, 0) +metadata/_edit_lock_ = true + +[node name="Left_Lower_Arm_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +scale = Vector2(1.00017, 1.00017) +remote_path = NodePath("../../HandProjectile/Left_Lower_Arm") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CanvasGroup/basic_zombie_walk"] +libraries = { +&"": SubResource("AnimationLibrary_x5uj2"), +&"basic": ExtResource("12_gjchu") +} + +[node name="EatingStatistics" type="Node" parent="CanvasGroup/basic_zombie_walk/AnimationPlayer"] +script = ExtResource("13_lbhkf") +animationName = "basic/eating" +trackToFind = "../../Eatbox" + +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 8 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(4, -24) +shape = SubResource("RectangleShape2D_hxyad") + +[node name="Eatbox" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("14_xxv4d") _damage = SubResource("Resource_lea3a") -[node name="Mover" parent="." index="4"] -_speed = SubResource("Resource_v1iwd") +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eatbox"] +position = Vector2(-10, -24) +shape = SubResource("RectangleShape2D_r4ug6") -[node name="HitPlayer" parent="." index="5"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] +root_node = NodePath("../CanvasGroup/basic_zombie_walk") +tree_root = SubResource("AnimationNodeBlendTree_ccrjo") +advance_expression_base_node = NodePath("../Eatbox") +anim_player = NodePath("../CanvasGroup/basic_zombie_walk/AnimationPlayer") +parameters/TimeScale/scale = 1.0 +script = ExtResource("17_3hgrb") +entity = NodePath("..") + +[node name="Mover" type="Node" parent="."] +script = ExtResource("18_tffdk") +_speed = SubResource("Resource_v1iwd") +_speedControlMult = 0.0374932 + +[node name="HitPlayer" type="Node" parent="."] +script = ExtResource("19_k2y7k") playlist = Array[AudioStream]([ExtResource("5_lt6ps"), ExtResource("6_kedip")]) channels = Array[String](["metal_hit", "hit"]) +metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="Armor" parent="." index="6"] +[node name="Armor" type="Node" parent="."] +script = ExtResource("22_aasgd") MaxHP = 550.0 -[node name="FlashController" parent="Armor" index="0"] -shaderMaterial = SubResource("ShaderMaterial_1iamf") +[node name="FlashController" type="Node" parent="Armor"] +script = ExtResource("23_rgojs") +shaderMaterial = ExtResource("24_wndvs") -[node name="FlashController" parent="." index="10"] -shaderMaterial = SubResource("ShaderMaterial_03nuu") +[node name="GroanPlayer" type="Node" parent="."] +script = ExtResource("24_3ui6x") +audioStream = ExtResource("25_ix7xe") +channel = "groan" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" + +[node name="Timer" type="Timer" parent="GroanPlayer"] +wait_time = 20.0 + +[node name="StartTimer" type="Timer" parent="GroanPlayer/Timer"] +wait_time = 5.0 +one_shot = true +autostart = true + +[node name="EffectPlayer" type="Node" parent="."] +script = ExtResource("26_7018m") +effectsToMap = Array[Resource]([ExtResource("27_wd16f"), ExtResource("28_b1su1")]) +streamsToMapTo = Array[AudioStream]([ExtResource("29_si5j4"), ExtResource("30_qu32w")]) +streamSettings = Array[Object]([null, SubResource("Resource_dn8ha")]) + +[node name="DeathHandler" type="Node" parent="." node_paths=PackedStringArray("_tree", "_collider")] +script = ExtResource("32_m7hhr") +_tree = NodePath("../AnimationTree") +_collider = NodePath("../Hitbox/CollisionShape2D") + +[node name="FlashController" type="Node" parent="."] +script = ExtResource("23_rgojs") +shaderMaterial = ExtResource("34_jdtg8") + +[connection signal="HasBeenKilled" from="." to="DeathHandler" method="OnKilled"] +[connection signal="OnDamaged" from="." to="HitPlayer" method="Play"] +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand/Left_Hand_Remote" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/Left_Lower_Arm_Remote" method="queue_free"] +[connection signal="area_entered" from="Eatbox" to="Eatbox" method="OnAreaEntered"] +[connection signal="area_exited" from="Eatbox" to="Eatbox" method="OnAreaExited"] +[connection signal="ArmorLost" from="Armor" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" method="FallOff"] +[connection signal="ArmorLost" from="Armor" to="HitPlayer" method="Next"] +[connection signal="Damaged" from="Armor" to="HitPlayer" method="Play"] +[connection signal="Damaged" from="Armor" to="Armor/FlashController" method="DamageFlash"] +[connection signal="HpChanged" from="Armor" to="." method="HPChangedMixedInvoker"] +[connection signal="timeout" from="GroanPlayer/Timer" to="GroanPlayer" method="Play"] +[connection signal="timeout" from="GroanPlayer/Timer/StartTimer" to="GroanPlayer/Timer" method="start"] diff --git a/scenes/entities/Zombies/cone_zombie.tscn b/scenes/entities/Zombies/cone_zombie.tscn index 894b678..fa20ff0 100644 --- a/scenes/entities/Zombies/cone_zombie.tscn +++ b/scenes/entities/Zombies/cone_zombie.tscn @@ -1,21 +1,764 @@ -[gd_scene load_steps=18 format=3 uid="uid://hhjbqkjqpt7x"] +[gd_scene load_steps=69 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://btf4xhu31ln6n" path="res://assets/shaders/canvas_group_flash.gdshader" id="2_s2p07"] +[ext_resource type="Script" uid="uid://dildme6epx8l4" path="res://scripts/entities/zombies/RuntimeZombieData.cs" id="1_ffeg6"] +[ext_resource type="Material" uid="uid://jr0vpg030jqv" path="res://assets/ZombieMaterial.tres" id="2_ffeg6"] [ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/entities/Armor.cs" id="3_5s7in"] [ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="3_b8kja"] +[ext_resource type="Texture2D" uid="uid://dacgbwohpmeed" path="res://assets/sprites/zombies/basic.png" id="3_d7bfv"] [ext_resource type="Script" uid="uid://dt5uj25u0g6y3" path="res://scripts/particles/FallParticle.cs" id="3_w70im"] [ext_resource type="Texture2D" uid="uid://ceqvdmude7cgg" path="res://assets/sprites/cone1.tres" id="4_qdhik"] [ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="4_qof5v"] +[ext_resource type="Script" uid="uid://dau0tfmlfiqmo" path="res://scripts/entities/EntityHPObserver.cs" id="5_25dv7"] [ext_resource type="Script" uid="uid://bbw848msxb4re" path="res://scripts/entities/DegradingSprite.cs" id="5_ickyd"] [ext_resource type="Texture2D" uid="uid://cl5ekw72wi75c" path="res://assets/sprites/cone2.tres" id="6_b6mal"] [ext_resource type="AudioStream" uid="uid://bmupd3v3gvsca" path="res://assets/audio/sfx/plastichit_generic.tres" id="7_0amn8"] [ext_resource type="Texture2D" uid="uid://cnn81r1y0xwod" path="res://assets/sprites/cone3.tres" id="7_011r0"] [ext_resource type="AudioStream" uid="uid://w0qfwds4o3ti" path="res://assets/audio/sfx/hit_generic.tres" id="7_67t4t"] +[ext_resource type="Texture2D" uid="uid://dri70dxyks7xh" path="res://assets/sprites/zombies/hobo.png" id="11_a7ae5"] +[ext_resource type="AnimationLibrary" uid="uid://ceb3khu7rwgy8" path="res://assets/animations/zombies/basic.res" id="12_1gn3d"] [ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="13_7fceb"] +[ext_resource type="Script" uid="uid://dw7v3s4kbu7ma" path="res://scripts/entities/AnimationStatistics.cs" id="13_xh0ny"] +[ext_resource type="Script" uid="uid://dqyony6jxt2p0" path="res://scripts/entities/zombies/EatBox.cs" id="14_kx47n"] +[ext_resource type="AnimationNodeStateMachine" uid="uid://dj0blope85bg7" path="res://assets/animations/zombies/basic_zombie_tree.tres" id="16_q51xn"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="17_tttgn"] +[ext_resource type="Script" uid="uid://7hdj2k14lfe4" path="res://scripts/entities/zombies/ZombieMover.cs" id="18_1pso5"] +[ext_resource type="Script" uid="uid://cnn0ymuhypdff" path="res://scripts/audio/ChannelPlaylist.cs" id="19_n3dlr"] +[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="24_v3jd8"] +[ext_resource type="AudioStream" uid="uid://bg76miyscfvhu" path="res://assets/audio/sfx/groan.tres" id="25_6yd48"] +[ext_resource type="Script" uid="uid://b8r6fxsfjdo3a" path="res://scripts/audio/EffectBasedPlayer.cs" id="26_myimu"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="27_dxxec"] +[ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://assets/effects/SnowSlow.tres" id="28_wg63k"] +[ext_resource type="AudioStream" uid="uid://dt13iugnnx4op" path="res://assets/audio/sfx/yuck_generic.tres" id="29_fah3r"] +[ext_resource type="AudioStream" uid="uid://bjotp63arocci" path="res://assets/audio/sfx/frozen.mp3" id="30_p00wq"] +[ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="31_uyysk"] +[ext_resource type="Script" uid="uid://dk32ln8c2574d" path="res://scripts/entities/zombies/ZombieKillHandler.cs" id="32_1sywa"] + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_wn68q"] +tip_nodepath = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 17 +joint_data/0/bone2d_node = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = 0.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = false +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 16 +joint_data/1/bone2d_node = NodePath("Butt/Body/LeftUpperArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = false +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_x5uj2"] +tip_nodepath = NodePath("Butt/Body/RightUpperArm/RightLowerArm/RightHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 8 +joint_data/0/bone2d_node = NodePath("Butt/Body/RightUpperArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = false +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 9 +joint_data/1/bone2d_node = NodePath("Butt/Body/RightUpperArm/RightLowerArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 90.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_vcc72"] +tip_nodepath = NodePath("Butt/RightUpperLeg/RightLowerLeg/RightFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 1 +joint_data/0/bone2d_node = NodePath("Butt/RightUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 2 +joint_data/1/bone2d_node = NodePath("Butt/RightUpperLeg/RightLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 160.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_kto0i"] +tip_nodepath = NodePath("Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 4 +joint_data/0/bone2d_node = NodePath("Butt/LeftUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 5 +joint_data/1/bone2d_node = NodePath("Butt/LeftUpperLeg/LeftLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = -90.0 +joint_data/1/constraint_angle_max = 0.0 +joint_data/1/constraint_angle_invert = true +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModificationStack2D" id="SkeletonModificationStack2D_wn68q"] +modification_count = 4 +modifications/0 = SubResource("SkeletonModification2DCCDIK_wn68q") +modifications/1 = SubResource("SkeletonModification2DCCDIK_x5uj2") +modifications/2 = SubResource("SkeletonModification2DCCDIK_vcc72") +modifications/3 = SubResource("SkeletonModification2DCCDIK_kto0i") + +[sub_resource type="AtlasTexture" id="AtlasTexture_jvn5w"] +atlas = ExtResource("3_d7bfv") +region = Rect2(15, 30, 20, 8) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vmdbp"] +atlas = ExtResource("3_d7bfv") +region = Rect2(64, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x1oyw"] +atlas = ExtResource("3_d7bfv") +region = Rect2(93, 50, 17, 9) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vjx3c"] +atlas = ExtResource("3_d7bfv") +region = Rect2(79, 44, 10, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f31xd"] +atlas = ExtResource("3_d7bfv") +region = Rect2(47, 33, 8, 16) + +[sub_resource type="AtlasTexture" id="AtlasTexture_od8jf"] +atlas = ExtResource("3_d7bfv") +region = Rect2(59, 33, 7, 10) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p4711"] +atlas = ExtResource("3_d7bfv") +region = Rect2(71, 30, 19, 13) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1bk2b"] +atlas = ExtResource("3_d7bfv") +region = Rect2(12, 43, 6, 18) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y06yv"] +atlas = ExtResource("3_d7bfv") +region = Rect2(36, 50, 9, 11) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lu8go"] +atlas = ExtResource("3_d7bfv") +region = Rect2(22, 45, 8, 15) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cdq7v"] +atlas = ExtResource("3_d7bfv") +region = Rect2(93, 8, 29, 39) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e7wc3"] +atlas = ExtResource("3_d7bfv") +region = Rect2(72, 2, 13, 26) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wn68q"] +atlas = ExtResource("3_d7bfv") +region = Rect2(36, 0, 32, 29) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vcc72"] +atlas = ExtResource("3_d7bfv") +region = Rect2(93, 3, 2, 3) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kto0i"] +atlas = ExtResource("3_d7bfv") +region = Rect2(105, 2, 3, 4) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x5uj2"] +atlas = ExtResource("3_d7bfv") +region = Rect2(15, 17, 17, 6) + +[sub_resource type="CircleShape2D" id="CircleShape2D_dn8ha"] [sub_resource type="CircleShape2D" id="CircleShape2D_67t4t"] +[sub_resource type="AtlasTexture" id="AtlasTexture_djocr"] +atlas = ExtResource("3_d7bfv") +region = Rect2(2, 7, 6, 19) + +[sub_resource type="AtlasTexture" id="AtlasTexture_auqeq"] +atlas = ExtResource("3_d7bfv") +region = Rect2(0, 32, 9, 15) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vlvtp"] +atlas = ExtResource("11_a7ae5") +region = Rect2(55, 0, 9, 10) + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ccrjo"] +radius = 3.00026 +height = 16.007 + +[sub_resource type="Animation" id="Animation_vn3j1"] +resource_name = "RESET" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Zombie/Butt/Body/LeftUpperArm:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, -20)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Zombie/Butt/Body/LeftUpperArm:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Zombie/Butt/Body/Head/LeftEye:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -9)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Zombie/Butt/Body/Head/LeftEye:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Zombie/Butt/Body/Head/RightEye:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-16, -8)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Zombie/Butt/Body/Head/RightEye:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Zombie/Butt/Body/Head/Jaw:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3, 3)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Zombie/Butt/Body/Head/Jaw:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 15)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Zombie/Butt/Body/RightUpperArm/RightLowerArm:rotation") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Zombie/Butt/Body/RightUpperArm:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-14, -23)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Zombie/Butt/Body/RightUpperArm:rotation") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 10)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1, 13)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Zombie/Butt/LeftUpperLeg/LeftLowerLeg:rotation") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Zombie/Butt/LeftUpperLeg:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(6, 4)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Zombie/Butt/LeftUpperLeg:rotation") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 14)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot:rotation") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2, 12)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Zombie/Butt/RightUpperLeg/RightLowerLeg:rotation") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("Zombie/Butt/RightUpperLeg:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-6, 3)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("Zombie/Butt/RightUpperLeg:rotation") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("Zombie/Butt:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, -35)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("Zombie/Butt:rotation") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("Zombie/Butt/Body:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, -2)] +} +tracks/33/type = "value" +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/path = NodePath("Zombie/Butt/Body:rotation") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/34/type = "value" +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/path = NodePath("Zombie:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/35/type = "value" +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/path = NodePath("Zombie:rotation") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/36/type = "value" +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/path = NodePath("Zombie/Butt/Body/Head:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-10, -25)] +} +tracks/37/type = "value" +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/path = NodePath("Zombie/Butt/Body/Head:rotation") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/38/type = "value" +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/path = NodePath("Zombie/Butt/Body/Head:visible") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/39/type = "value" +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:position") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-0.0022974, -17.0131)] +} +tracks/40/type = "value" +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:rotation") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/41/type = "value" +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/path = NodePath("Zombie/Butt/Body/Head/TrashcanLid:visible") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/42/type = "value" +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/path = NodePath("Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm/Left_Hand:texture") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [SubResource("AtlasTexture_vlvtp")] +} +tracks/43/type = "value" +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/path = NodePath("Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm/Left_Hand:offset") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-4, -1)] +} +tracks/44/type = "value" +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/path = NodePath("Zombie/Butt/Body/Tie:scale") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_x5uj2"] +_data = { +&"RESET": SubResource("Animation_vn3j1") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_hxyad"] +size = Vector2(26, 48) + [sub_resource type="Resource" id="Resource_011r0"] resource_local_to_scene = true script = ExtResource("4_qof5v") @@ -23,6 +766,18 @@ flat_value = 5.0 percentage_value = 0.0 mult_value = 1.0 +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r4ug6"] +size = Vector2(16, 48) + +[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_2q05d"] + +[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_ccrjo"] +nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_2q05d") +nodes/TimeScale/position = Vector2(60, 120) +nodes/Tree/node = ExtResource("16_q51xn") +nodes/Tree/position = Vector2(-240, 120) +node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] + [sub_resource type="Resource" id="Resource_b6mal"] resource_local_to_scene = true script = ExtResource("4_qof5v") @@ -30,69 +785,285 @@ flat_value = 0.2 percentage_value = 0.0 mult_value = 1.0 -[sub_resource type="ShaderMaterial" id="ShaderMaterial_b8kja"] -resource_local_to_scene = true -shader = ExtResource("2_s2p07") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/blend = 0.0 -shader_parameter/selected = false +[sub_resource type="Resource" id="Resource_dn8ha"] +script = ExtResource("31_uyysk") +restartTreshold = -1.0 +metadata/_custom_type_script = "uid://c1x4n4nqyq72f" -[node name="ConeZombie" node_paths=PackedStringArray("_armor") instance=ExtResource("1_3dq4c")] +[node name="ConeZombie" type="Node2D" node_paths=PackedStringArray("_armor", "_player", "_tree")] +y_sort_enabled = true +script = ExtResource("1_ffeg6") _armor = NodePath("Armor") +MaxHP = 100.0 +_player = NodePath("CanvasGroup/basic_zombie_walk/AnimationPlayer") +_tree = NodePath("AnimationTree") +metadata/_edit_vertical_guides_ = [-159.0] -[node name="RightUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="1"] +[node name="CanvasGroup" type="CanvasGroup" parent="."] +material = ExtResource("2_ffeg6") + +[node name="basic_zombie_walk" type="Node2D" parent="CanvasGroup"] + +[node name="Zombie" type="Skeleton2D" parent="CanvasGroup/basic_zombie_walk"] +use_parent_material = true +modification_stack = SubResource("SkeletonModificationStack2D_wn68q") + +[node name="Butt" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie"] +use_parent_material = true +position = Vector2(5, -35) +scale = Vector2(0.999903, 0.999903) +rest = Transform2D(1, 0, 0, 1, 5, -35) +editor_settings/show_bone_gizmo = false + +[node name="Butt" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +texture = SubResource("AtlasTexture_jvn5w") +centered = false +offset = Vector2(-10, -3) +metadata/_edit_lock_ = true + +[node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(-6, 3) scale = Vector2(0.999835, 0.999835) +rest = Transform2D(1, 0, 0, 1, -6, 3) +editor_settings/show_bone_gizmo = false -[node name="RightLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg" index="1"] -scale = Vector2(0.999837, 0.999837) +[node name="Right_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +texture = SubResource("AtlasTexture_vmdbp") +centered = false +offset = Vector2(-6, -2) +metadata/_edit_lock_ = true -[node name="RightFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg" index="0"] -scale = Vector2(0.999835, 0.999835) - -[node name="LeftUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="2"] +[node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +position = Vector2(-2, 12) scale = Vector2(0.999833, 0.999833) +rest = Transform2D(1, 0, 0, 1, -2, 12) +editor_settings/show_bone_gizmo = false -[node name="LeftLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg" index="1"] -scale = Vector2(0.999833, 0.999833) +[node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-2, 14) +scale = Vector2(0.999834, 0.999834) +rest = Transform2D(1, 0, 0, 1, -2, 14) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 0.0 +editor_settings/show_bone_gizmo = false -[node name="LeftFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg" index="1"] +[node name="Right_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot"] +texture = SubResource("AtlasTexture_x1oyw") +centered = false +offset = Vector2(-4, -3) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-18, -2) +texture = SubResource("AtlasTexture_vjx3c") +centered = false +offset = Vector2(12, 1) +metadata/_edit_lock_ = true + +[node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(6, 4) +scale = Vector2(0.999834, 0.999834) +rest = Transform2D(1, 0, 0, 1, 6, 4) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +texture = SubResource("AtlasTexture_f31xd") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +position = Vector2(-1, 13) +scale = Vector2(0.999831, 0.999831) +rest = Transform2D(1, 0, 0, 1, -1, 13) +editor_settings/show_bone_gizmo = false + +[node name="Left_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +texture = SubResource("AtlasTexture_od8jf") +centered = false +offset = Vector2(-1, 0) +metadata/_edit_lock_ = true + +[node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +position = Vector2(6, 10) scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, 6, 10) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 160.0 +editor_settings/show_bone_gizmo = false -[node name="Body" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="3"] -scale = Vector2(0.99983, 0.99983) +[node name="Left_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot"] +texture = SubResource("AtlasTexture_p4711") +centered = false +offset = Vector2(-14, -3) +metadata/_edit_lock_ = true -[node name="RightUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="0"] -scale = Vector2(0.999829, 0.999829) +[node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(1, -2) +scale = Vector2(0.999831, 0.999831) +rest = Transform2D(1, 0, 0, 1, 1, -2) +editor_settings/show_bone_gizmo = false -[node name="RightLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm" index="1"] -scale = Vector2(0.999826, 0.999826) - -[node name="RightHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm" index="0"] +[node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +z_index = -1 +use_parent_material = true +position = Vector2(-14, -23) scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -14, -23) +editor_settings/show_bone_gizmo = false -[node name="Tie" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="2"] -rotation = 0.0945796 -skew = -0.000153542 +[node name="Right_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +texture = SubResource("AtlasTexture_1bk2b") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true -[node name="Head" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="3"] -scale = Vector2(0.999829, 0.999829) +[node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +position = Vector2(-2, 15) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -2, 15) +editor_settings/show_bone_gizmo = false -[node name="Right_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="0"] +[node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 8.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand"] +texture = SubResource("AtlasTexture_y06yv") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +texture = SubResource("AtlasTexture_lu8go") +centered = false +offset = Vector2(-5, -1) +metadata/_edit_lock_ = true + +[node name="Body" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +rotation = 0.00163735 +texture = SubResource("AtlasTexture_cdq7v") +centered = false +offset = Vector2(-15, -27) +metadata/_edit_lock_ = true + +[node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-9, -21) +rotation = -0.0279659 +skew = -0.000154853 +rest = Transform2D(1, 0, 0, 1, -9, -21) +auto_calculate_length_and_angle = false +length = 24.0 +bone_angle = 100.0 +editor_settings/show_bone_gizmo = false + +[node name="Tie" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Tie"] +texture = SubResource("AtlasTexture_e7wc3") +centered = false +offset = Vector2(-10, -1) +metadata/_edit_lock_ = true + +[node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-10, -25) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -10, -25) +editor_settings/show_bone_gizmo = false + +[node name="HeadParticle" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" node_paths=PackedStringArray("data")] +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("3_w70im") +data = NodePath("../../../../../../..") +maxAngle = 45.0 +minTorque = -45.0 +maxTorque = 45.0 +Impulse = 100.0 + +[node name="Head" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] +texture = SubResource("AtlasTexture_wn68q") +centered = false +offset = Vector2(-20, -24) +metadata/_edit_lock_ = true + +[node name="Right_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-16, -8) +texture = SubResource("AtlasTexture_vcc72") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true -[node name="Left_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="1"] +[node name="Left_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-4, -9.00001) +texture = SubResource("AtlasTexture_kto0i") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true + +[node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-2.68686, 2.24379) +rotation = 0.0273591 +scale = Vector2(0.999828, 0.999828) +texture = SubResource("AtlasTexture_x5uj2") +centered = false +offset = Vector2(-12, -2) +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] +position = Vector2(-4.58496, -8.21035) +shape = SubResource("CircleShape2D_dn8ha") + +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("5_25dv7") +_threshold = 0.0 +_observedEntity = NodePath("../../../../../../../..") + +[node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-3, 3) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -3, 3) +auto_calculate_length_and_angle = false +length = 11.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw"] +remote_path = NodePath("../../HeadParticle/Head/Jaw") + +[node name="RightEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-16, -8) +rest = Transform2D(1, 0, 0, 1, -16, -8) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye"] +remote_path = NodePath("../../HeadParticle/Head/Right_Eye") + +[node name="LeftEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-4, -9) +rest = Transform2D(1, 0, 0, 1, -4, -9) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="2"] -position = Vector2(-3.00116, 2.99804) -rotation = 0.00917867 -scale = Vector2(0.999829, 0.999829) +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye"] +remote_path = NodePath("../../HeadParticle/Head/Left_Eye") -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="1"] -scale = Vector2(0.999829, 0.999829) - -[node name="Hat" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="4" node_paths=PackedStringArray("data")] +[node name="Hat" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" node_paths=PackedStringArray("data")] position = Vector2(-2.5, -13.5) collision_layer = 128 collision_mask = 64 @@ -106,7 +1077,7 @@ minTorque = -45.0 maxTorque = 45.0 Impulse = 100.0 -[node name="Sprite" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" index="0" node_paths=PackedStringArray("armor")] +[node name="Sprite" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" node_paths=PackedStringArray("armor")] material = ExtResource("3_b8kja") position = Vector2(-1, -12) texture = ExtResource("4_qdhik") @@ -115,52 +1086,183 @@ armor = NodePath("../../../../../../../../Armor") degradationStages = Array[Texture]([ExtResource("4_qdhik"), ExtResource("6_b6mal"), ExtResource("7_011r0")]) thresholdPercentage = Array[float]([1.0, 0.667, 0.333]) -[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" index="1"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat"] position = Vector2(1, -6) shape = SubResource("CircleShape2D_67t4t") -[node name="LeftUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="4"] -scale = Vector2(0.999833, 0.999833) +[node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-1, -20) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -1, -20) +editor_settings/show_bone_gizmo = false -[node name="Left_Lower_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" index="0"] -rotation = 0.0889256 -scale = Vector2(0.999999, 0.999999) +[node name="Left_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-37, 10) +texture = SubResource("AtlasTexture_djocr") +centered = false +offset = Vector2(33, -12) +metadata/_edit_lock_ = true -[node name="Left_Hand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm" index="0"] +[node name="HandProjectile" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" node_paths=PackedStringArray("data")] +position = Vector2(-2, 14) +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("3_w70im") +data = NodePath("../../../../../../..") +minTorque = -45.0 +maxTorque = 45.0 + +[node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +rotation = 0.108809 +scale = Vector2(0.999993, 0.999993) +texture = SubResource("AtlasTexture_auqeq") +centered = false +offset = Vector2(-5, 0) +metadata/_edit_lock_ = true + +[node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] +show_behind_parent = true position = Vector2(-0.99983, 12.9978) -rotation = -0.0392463 +rotation = -0.116983 scale = Vector2(0.999658, 0.999658) +texture = SubResource("AtlasTexture_vlvtp") +centered = false +offset = Vector2(-4, -1) +metadata/_edit_lock_ = true -[node name="LeftLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" index="2"] -scale = Vector2(0.999829, 0.999829) +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +position = Vector2(-0.00104554, 13.0063) +shape = SubResource("CapsuleShape2D_ccrjo") -[node name="LeftHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm" index="0"] +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("5_25dv7") +_observedEntity = NodePath("../../../../../../../..") + +[node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-2, 14) +scale = Vector2(0.999823, 0.999823) +rest = Transform2D(1, 0, 0, 1, -2, 14) +editor_settings/show_bone_gizmo = false + +[node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +position = Vector2(-1, 13) scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 6.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false -[node name="Eatbox" parent="." index="2"] +[node name="Left_Hand_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand"] +remote_path = NodePath("../../../HandProjectile/Left_Lower_Arm/Left_Hand") + +[node name="Left_Lower_Arm_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +scale = Vector2(1.00017, 1.00017) +remote_path = NodePath("../../HandProjectile/Left_Lower_Arm") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CanvasGroup/basic_zombie_walk"] +libraries = { +&"": SubResource("AnimationLibrary_x5uj2"), +&"basic": ExtResource("12_1gn3d") +} + +[node name="EatingStatistics" type="Node" parent="CanvasGroup/basic_zombie_walk/AnimationPlayer"] +script = ExtResource("13_xh0ny") +animationName = "basic/eating" +trackToFind = "../../Eatbox" + +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 8 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(4, -24) +shape = SubResource("RectangleShape2D_hxyad") + +[node name="Eatbox" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("14_kx47n") _damage = SubResource("Resource_011r0") -[node name="Mover" parent="." index="4"] -_speed = SubResource("Resource_b6mal") -_speedControlMult = 0.371759 +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eatbox"] +position = Vector2(-10, -24) +shape = SubResource("RectangleShape2D_r4ug6") -[node name="HitPlayer" parent="." index="5"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] +root_node = NodePath("../CanvasGroup/basic_zombie_walk") +tree_root = SubResource("AnimationNodeBlendTree_ccrjo") +advance_expression_base_node = NodePath("../Eatbox") +anim_player = NodePath("../CanvasGroup/basic_zombie_walk/AnimationPlayer") +parameters/TimeScale/scale = 1.0 +script = ExtResource("17_tttgn") +entity = NodePath("..") + +[node name="Mover" type="Node" parent="."] +script = ExtResource("18_1pso5") +_speed = SubResource("Resource_b6mal") +_speedControlMult = 2.27305 + +[node name="HitPlayer" type="Node" parent="."] +script = ExtResource("19_n3dlr") playlist = Array[AudioStream]([ExtResource("7_0amn8"), ExtResource("7_67t4t")]) channels = Array[String](["plastic_hit", "hit"]) +metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="Armor" type="Node" parent="." index="6"] +[node name="Armor" type="Node" parent="."] script = ExtResource("3_5s7in") MaxHP = 195.0 -[node name="FlashController" type="Node" parent="Armor" index="0"] +[node name="FlashController" type="Node" parent="Armor"] script = ExtResource("13_7fceb") shaderMaterial = ExtResource("3_b8kja") -[node name="FlashController" parent="." index="10"] -shaderMaterial = SubResource("ShaderMaterial_b8kja") +[node name="GroanPlayer" type="Node" parent="."] +script = ExtResource("24_v3jd8") +audioStream = ExtResource("25_6yd48") +channel = "groan" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[connection signal="ArmorLost" from="Armor" to="HitPlayer" method="Next"] +[node name="Timer" type="Timer" parent="GroanPlayer"] +wait_time = 20.0 + +[node name="StartTimer" type="Timer" parent="GroanPlayer/Timer"] +wait_time = 5.0 +one_shot = true +autostart = true + +[node name="EffectPlayer" type="Node" parent="."] +script = ExtResource("26_myimu") +effectsToMap = Array[Resource]([ExtResource("27_dxxec"), ExtResource("28_wg63k")]) +streamsToMapTo = Array[AudioStream]([ExtResource("29_fah3r"), ExtResource("30_p00wq")]) +streamSettings = Array[Object]([null, SubResource("Resource_dn8ha")]) + +[node name="DeathHandler" type="Node" parent="." node_paths=PackedStringArray("_tree", "_collider")] +script = ExtResource("32_1sywa") +_tree = NodePath("../AnimationTree") +_collider = NodePath("../Hitbox/CollisionShape2D") + +[node name="FlashController" type="Node" parent="."] +script = ExtResource("13_7fceb") +shaderMaterial = ExtResource("2_ffeg6") + +[connection signal="HasBeenKilled" from="." to="DeathHandler" method="OnKilled"] +[connection signal="OnDamaged" from="." to="HitPlayer" method="Play"] +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand/Left_Hand_Remote" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/Left_Lower_Arm_Remote" method="queue_free"] +[connection signal="area_entered" from="Eatbox" to="Eatbox" method="OnAreaEntered"] +[connection signal="area_exited" from="Eatbox" to="Eatbox" method="OnAreaExited"] [connection signal="ArmorLost" from="Armor" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Hat" method="FallOff"] +[connection signal="ArmorLost" from="Armor" to="HitPlayer" method="Next"] [connection signal="Damaged" from="Armor" to="HitPlayer" method="Play"] [connection signal="Damaged" from="Armor" to="Armor/FlashController" method="DamageFlash"] [connection signal="HpChanged" from="Armor" to="." method="HPChangedMixedInvoker"] +[connection signal="timeout" from="GroanPlayer/Timer" to="GroanPlayer" method="Play"] +[connection signal="timeout" from="GroanPlayer/Timer/StartTimer" to="GroanPlayer/Timer" method="start"] diff --git a/scenes/entities/Zombies/door_zombie.tscn b/scenes/entities/Zombies/door_zombie.tscn deleted file mode 100644 index ace74c3..0000000 --- a/scenes/entities/Zombies/door_zombie.tscn +++ /dev/null @@ -1,186 +0,0 @@ -[gd_scene load_steps=19 format=3 uid="uid://p5jhgg2r7e07"] - -[ext_resource type="PackedScene" uid="uid://co11v3w8hbwgf" path="res://scenes/entities/Zombies/zombie.tscn" id="1_k7yv2"] -[ext_resource type="Shader" uid="uid://d0eo5uuj222c4" path="res://assets/shaders/CG_color_blender.gdshader" id="2_g7fge"] -[ext_resource type="Script" uid="uid://dildme6epx8l4" path="res://scripts/entities/zombies/RuntimeZombieData.cs" id="2_uhol2"] -[ext_resource type="Script" uid="uid://c3cfnrmnnuqms" path="res://addons/floatmodifiers/FloatModifiers.cs" id="3_uvlkc"] -[ext_resource type="Texture2D" uid="uid://b18blso5pbc6a" path="res://assets/sprites/zombies/armor.png" id="4_ed67f"] -[ext_resource type="Script" uid="uid://dt5uj25u0g6y3" path="res://scripts/particles/FallParticle.cs" id="4_woxi6"] -[ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/entities/Armor.cs" id="5_ed67f"] -[ext_resource type="Script" uid="uid://bbw848msxb4re" path="res://scripts/entities/DegradingSprite.cs" id="6_woxi6"] -[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="7_tj3uj"] -[ext_resource type="Script" uid="uid://d3l8e8ko5r5i3" path="res://scripts/entities/ArmorHPObserver.cs" id="7_uhol2"] -[ext_resource type="AudioStream" uid="uid://bu1egfsyplpx4" path="res://assets/audio/sfx/metalhit_generic.tres" id="8_uhol2"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_ed67f"] -size = Vector2(20, 48) - -[sub_resource type="AtlasTexture" id="AtlasTexture_woxi6"] -atlas = ExtResource("4_ed67f") -region = Rect2(0, 71, 48, 88) - -[sub_resource type="AtlasTexture" id="AtlasTexture_yhtii"] -atlas = ExtResource("4_ed67f") -region = Rect2(48, 71, 48, 88) - -[sub_resource type="AtlasTexture" id="AtlasTexture_tj3uj"] -atlas = ExtResource("4_ed67f") -region = Rect2(96, 71, 47, 88) - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_p0ieu"] -resource_local_to_scene = true -shader = ExtResource("2_g7fge") -shader_parameter/blend_color = Color(0.73, 0.73, 0.73, 1) -shader_parameter/amount = 0.0 - -[sub_resource type="Resource" id="Resource_ed67f"] -resource_local_to_scene = true -script = ExtResource("3_uvlkc") -flat_value = 5.0 -percentage_value = 0.0 -mult_value = 1.0 - -[sub_resource type="Resource" id="Resource_woxi6"] -resource_local_to_scene = true -script = ExtResource("3_uvlkc") -flat_value = 0.2 -percentage_value = 0.0 -mult_value = 1.0 - -[node name="DoorZombie" instance=ExtResource("1_k7yv2")] - -[node name="Shield" type="Node2D" parent="." index="0" node_paths=PackedStringArray("_armor")] -position = Vector2(-29, 0) -script = ExtResource("2_uhol2") -_armor = NodePath("MainHP") -metadata/_custom_type_script = "uid://3tw88wj1nrj1" - -[node name="Hitbox" type="Area2D" parent="Shield" index="0"] -collision_layer = 8 -collision_mask = 0 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Shield/Hitbox" index="0"] -position = Vector2(0, -25) -shape = SubResource("RectangleShape2D_ed67f") - -[node name="MainHP" type="Node" parent="Shield" index="1"] -script = ExtResource("5_ed67f") -MaxHP = 375.0 -metadata/_custom_type_script = "uid://fd4im1fmwc5n" - -[node name="Particle" type="RigidBody2D" parent="Shield" index="2" node_paths=PackedStringArray("data")] -use_parent_material = true -position = Vector2(0, -43) -collision_layer = 128 -collision_mask = 64 -freeze = true -script = ExtResource("4_woxi6") -data = NodePath("..") -minTorque = 100.0 -maxTorque = -100.0 - -[node name="Sprite2D" type="Sprite2D" parent="Shield/Particle" index="0" node_paths=PackedStringArray("armor")] -z_index = 1 -use_parent_material = true -texture = SubResource("AtlasTexture_woxi6") -script = ExtResource("6_woxi6") -armor = NodePath("../../MainHP") -degradationStages = Array[Texture2D]([SubResource("AtlasTexture_woxi6"), SubResource("AtlasTexture_yhtii"), SubResource("AtlasTexture_tj3uj")]) -thresholdPercentage = Array[float]([1.0, 0.667, 0.333]) - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Shield/Particle" index="1"] -position = Vector2(0, 18) -shape = SubResource("RectangleShape2D_ed67f") - -[node name="Observer" type="Node" parent="Shield/Particle" index="2" node_paths=PackedStringArray("_observedArmor")] -script = ExtResource("7_uhol2") -_threshold = 0.0 -_observedArmor = NodePath("../../MainHP") - -[node name="ChannelPlayer" type="Node" parent="Shield" index="3"] -script = ExtResource("7_tj3uj") -audioStream = ExtResource("8_uhol2") -channel = "metalhit" -metadata/_custom_type_script = "uid://c36bj8u7jghc7" - -[node name="CanvasGroup" parent="." index="1"] -material = SubResource("ShaderMaterial_p0ieu") - -[node name="RightUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="1"] -scale = Vector2(0.99983, 0.99983) - -[node name="RightLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg" index="1"] -scale = Vector2(0.999832, 0.999832) - -[node name="RightFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg" index="0"] -scale = Vector2(0.999831, 0.999831) - -[node name="LeftUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="2"] -scale = Vector2(0.999834, 0.999834) - -[node name="LeftLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg" index="1"] -scale = Vector2(0.999833, 0.999833) - -[node name="LeftFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg" index="1"] -scale = Vector2(0.999829, 0.999829) - -[node name="Body" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="3"] -scale = Vector2(0.999831, 0.999831) - -[node name="RightUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="0"] -scale = Vector2(0.99983, 0.99983) - -[node name="RightLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm" index="1"] -scale = Vector2(0.999828, 0.999828) - -[node name="RightHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm" index="0"] -scale = Vector2(0.99983, 0.99983) - -[node name="Tie" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="2"] -rotation = 0.163815 -skew = -0.000518203 - -[node name="Head" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="3"] -scale = Vector2(0.999829, 0.999829) - -[node name="Right_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="0"] -position = Vector2(-16, -8) - -[node name="Left_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="1"] -position = Vector2(-4, -9) - -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="2"] -position = Vector2(-3.00201, 2.99659) -rotation = 0.0158977 -scale = Vector2(0.99983, 0.99983) - -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="1"] -scale = Vector2(0.99983, 0.99983) - -[node name="LeftUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="4"] -scale = Vector2(0.999831, 0.999831) - -[node name="Left_Lower_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" index="0"] -rotation = 0.154022 -scale = Vector2(0.999998, 0.999998) - -[node name="Left_Hand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm" index="0"] -position = Vector2(-0.99983, 12.9978) -rotation = -0.0679757 -scale = Vector2(0.999658, 0.999658) - -[node name="LeftLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" index="2"] -scale = Vector2(0.999828, 0.999828) - -[node name="LeftHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm" index="0"] -scale = Vector2(0.999828, 0.999828) - -[node name="Eatbox" parent="." index="3"] -_damage = SubResource("Resource_ed67f") - -[node name="Mover" parent="." index="5"] -_speed = SubResource("Resource_woxi6") -_speedControlMult = 1.31004 - -[connection signal="OnDamaged" from="Shield" to="Shield/ChannelPlayer" method="Play"] -[connection signal="ThresholdReached" from="Shield/Particle/Observer" to="Shield/Particle" method="FallOff"] diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index 112fbf5..7b5400a 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -1,14 +1,17 @@ -[gd_scene load_steps=65 format=3 uid="uid://bgqmwsb6ynm81"] +[gd_scene load_steps=94 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="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="3_b583s"] +[ext_resource type="Script" uid="uid://dildme6epx8l4" path="res://scripts/entities/zombies/RuntimeZombieData.cs" id="1_5h5we"] +[ext_resource type="Script" uid="uid://bcc7skl7ts6sh" path="res://scripts/systems/effects/Effect.cs" id="2_ssrsu"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="3_b583s"] [ext_resource type="Script" uid="uid://dt5uj25u0g6y3" path="res://scripts/particles/FallParticle.cs" id="3_tu6af"] [ext_resource type="Script" uid="uid://c5v2og85t7s6j" path="res://scripts/entities/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="Material" uid="uid://jr0vpg030jqv" path="res://assets/ZombieMaterial.tres" id="4_ssrsu"] [ext_resource type="Script" uid="uid://fd4im1fmwc5n" path="res://scripts/entities/Armor.cs" id="4_w8pya"] [ext_resource type="Texture2D" uid="uid://dri70dxyks7xh" path="res://assets/sprites/zombies/hobo.png" id="5_b583s"] [ext_resource type="Script" uid="uid://bbw848msxb4re" path="res://scripts/entities/DegradingSprite.cs" id="5_ndwp0"] [ext_resource type="Texture2D" uid="uid://8h5vg1pk32b2" path="res://assets/sprites/garbage_can1.tres" id="6_i6nje"] +[ext_resource type="Texture2D" uid="uid://dacgbwohpmeed" path="res://assets/sprites/zombies/basic.png" id="6_ihedj"] [ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="6_vn3j1"] [ext_resource type="Texture2D" uid="uid://cogfbn4re3kob" path="res://assets/sprites/garbage_can2.tres" id="7_txjqc"] [ext_resource type="AnimationLibrary" uid="uid://ceb3khu7rwgy8" path="res://assets/animations/zombies/basic.res" id="7_vn3j1"] @@ -19,16 +22,112 @@ [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="11_7jlle"] [ext_resource type="Script" uid="uid://d3l8e8ko5r5i3" path="res://scripts/entities/ArmorHPObserver.cs" id="12_vn3j1"] [ext_resource type="AudioStream" uid="uid://ch55p7qbaawtp" path="res://assets/audio/sfx/argh.tres" id="12_w1b1s"] +[ext_resource type="Script" uid="uid://dau0tfmlfiqmo" path="res://scripts/entities/EntityHPObserver.cs" id="14_2awep"] +[ext_resource type="Script" uid="uid://dw7v3s4kbu7ma" path="res://scripts/entities/AnimationStatistics.cs" id="17_arnax"] +[ext_resource type="Script" uid="uid://dqyony6jxt2p0" path="res://scripts/entities/zombies/EatBox.cs" id="18_p6vn8"] [ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="19_8y6c0"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="20_l220p"] +[ext_resource type="Script" uid="uid://7hdj2k14lfe4" path="res://scripts/entities/zombies/ZombieMover.cs" id="21_vuumd"] +[ext_resource type="Script" uid="uid://cnn0ymuhypdff" path="res://scripts/audio/ChannelPlaylist.cs" id="22_uxp8e"] [ext_resource type="Shader" uid="uid://btf4xhu31ln6n" path="res://assets/shaders/canvas_group_flash.gdshader" id="23_nc6p3"] +[ext_resource type="AudioStream" uid="uid://bg76miyscfvhu" path="res://assets/audio/sfx/groan.tres" id="26_i0ku7"] +[ext_resource type="Script" uid="uid://b8r6fxsfjdo3a" path="res://scripts/audio/EffectBasedPlayer.cs" id="30_pilme"] +[ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://assets/effects/SnowSlow.tres" id="31_y40pw"] +[ext_resource type="AudioStream" uid="uid://dt13iugnnx4op" path="res://assets/audio/sfx/yuck_generic.tres" id="32_xr8w3"] +[ext_resource type="AudioStream" uid="uid://bjotp63arocci" path="res://assets/audio/sfx/frozen.mp3" id="33_6wb5p"] +[ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="34_1p6mb"] +[ext_resource type="Script" uid="uid://dk32ln8c2574d" path="res://scripts/entities/zombies/ZombieKillHandler.cs" id="35_jg5ia"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_vn3j1"] -resource_local_to_scene = true -shader = ExtResource("23_nc6p3") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/blend = 0.0 -shader_parameter/selected = false +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_wn68q"] +tip_nodepath = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 17 +joint_data/0/bone2d_node = NodePath("Butt/Body/LeftUpperArm/LeftLowerArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = 0.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = false +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 16 +joint_data/1/bone2d_node = NodePath("Butt/Body/LeftUpperArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = false +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_x5uj2"] +tip_nodepath = NodePath("Butt/Body/RightUpperArm/RightLowerArm/RightHand") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 8 +joint_data/0/bone2d_node = NodePath("Butt/Body/RightUpperArm") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = false +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 9 +joint_data/1/bone2d_node = NodePath("Butt/Body/RightUpperArm/RightLowerArm") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 90.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_vcc72"] +tip_nodepath = NodePath("Butt/RightUpperLeg/RightLowerLeg/RightFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 1 +joint_data/0/bone2d_node = NodePath("Butt/RightUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 2 +joint_data/1/bone2d_node = NodePath("Butt/RightUpperLeg/RightLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = 0.0 +joint_data/1/constraint_angle_max = 160.0 +joint_data/1/constraint_angle_invert = false +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModification2DCCDIK" id="SkeletonModification2DCCDIK_kto0i"] +tip_nodepath = NodePath("Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot") +ccdik_data_chain_length = 2 +joint_data/0/bone_index = 4 +joint_data/0/bone2d_node = NodePath("Butt/LeftUpperLeg") +joint_data/0/rotate_from_joint = false +joint_data/0/enable_constraint = true +joint_data/0/constraint_angle_min = -90.0 +joint_data/0/constraint_angle_max = 90.0 +joint_data/0/constraint_angle_invert = true +joint_data/0/constraint_in_localspace = true +joint_data/0/editor_draw_gizmo = true +joint_data/1/bone_index = 5 +joint_data/1/bone2d_node = NodePath("Butt/LeftUpperLeg/LeftLowerLeg") +joint_data/1/rotate_from_joint = false +joint_data/1/enable_constraint = true +joint_data/1/constraint_angle_min = -90.0 +joint_data/1/constraint_angle_max = 0.0 +joint_data/1/constraint_angle_invert = true +joint_data/1/constraint_in_localspace = true +joint_data/1/editor_draw_gizmo = true +editor/draw_gizmo = false + +[sub_resource type="SkeletonModificationStack2D" id="SkeletonModificationStack2D_wn68q"] +modification_count = 4 +modifications/0 = SubResource("SkeletonModification2DCCDIK_wn68q") +modifications/1 = SubResource("SkeletonModification2DCCDIK_x5uj2") +modifications/2 = SubResource("SkeletonModification2DCCDIK_vcc72") +modifications/3 = SubResource("SkeletonModification2DCCDIK_kto0i") [sub_resource type="AtlasTexture" id="AtlasTexture_txjqc"] atlas = ExtResource("5_b583s") @@ -74,6 +173,10 @@ region = Rect2(91, 32, 9, 15) atlas = ExtResource("5_b583s") region = Rect2(137, 19, 29, 39) +[sub_resource type="AtlasTexture" id="AtlasTexture_e7wc3"] +atlas = ExtResource("6_ihedj") +region = Rect2(72, 2, 13, 26) + [sub_resource type="AtlasTexture" id="AtlasTexture_5selg"] atlas = ExtResource("5_b583s") region = Rect2(0, 29, 35, 11) @@ -86,6 +189,14 @@ height = 48.0 atlas = ExtResource("5_b583s") region = Rect2(80, 0, 32, 30) +[sub_resource type="AtlasTexture" id="AtlasTexture_vcc72"] +atlas = ExtResource("6_ihedj") +region = Rect2(93, 3, 2, 3) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kto0i"] +atlas = ExtResource("6_ihedj") +region = Rect2(105, 2, 3, 4) + [sub_resource type="AtlasTexture" id="AtlasTexture_7cvmi"] atlas = ExtResource("5_b583s") region = Rect2(38, 22, 22, 13) @@ -96,6 +207,8 @@ region = Rect2(34, 38, 45, 27) [sub_resource type="CircleShape2D" id="CircleShape2D_vn3j1"] +[sub_resource type="CircleShape2D" id="CircleShape2D_dn8ha"] + [sub_resource type="AtlasTexture" id="AtlasTexture_tebih"] atlas = ExtResource("5_b583s") region = Rect2(34, 0, 6, 19) @@ -108,6 +221,10 @@ region = Rect2(43, 0, 9, 15) atlas = ExtResource("5_b583s") region = Rect2(55, 0, 9, 10) +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ccrjo"] +radius = 3.00026 +height = 16.007 + [sub_resource type="Animation" id="Animation_vn3j1"] resource_name = "RESET" tracks/0/type = "value" @@ -656,6 +773,9 @@ _data = { &"RESET": SubResource("Animation_vn3j1") } +[sub_resource type="RectangleShape2D" id="RectangleShape2D_hxyad"] +size = Vector2(26, 48) + [sub_resource type="Resource" id="Resource_n380g"] resource_local_to_scene = true script = ExtResource("4_c1y3b") @@ -663,6 +783,9 @@ flat_value = 5.0 percentage_value = 0.0 mult_value = 1.0 +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r4ug6"] +size = Vector2(16, 48) + [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_2q05d"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_vn3j1"] @@ -757,85 +880,207 @@ flat_value = 0.4 percentage_value = 0.0 mult_value = 1.0 -[node name="Hobo" node_paths=PackedStringArray("_armor") instance=ExtResource("1_fnu7s")] +[sub_resource type="Resource" id="Resource_dn8ha"] +script = ExtResource("34_1p6mb") +restartTreshold = -1.0 +metadata/_custom_type_script = "uid://c1x4n4nqyq72f" + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_vn3j1"] +resource_local_to_scene = true +shader = ExtResource("23_nc6p3") +shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) +shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) +shader_parameter/blend = 0.0 +shader_parameter/selected = false + +[node name="Hobo" type="Node2D" node_paths=PackedStringArray("_armor", "_player", "_tree")] +y_sort_enabled = true +script = ExtResource("1_5h5we") _armor = NodePath("CanArmor") MaxHP = 185.0 -_effectImmunities = [ExtResource("3_b583s")] +_player = NodePath("CanvasGroup/basic_zombie_walk/AnimationPlayer") +_tree = NodePath("AnimationTree") +_effectImmunities = Array[ExtResource("2_ssrsu")]([ExtResource("3_b583s")]) +metadata/_edit_vertical_guides_ = [-159.0] -[node name="CanvasGroup" parent="." index="0"] -material = SubResource("ShaderMaterial_vn3j1") +[node name="CanvasGroup" type="CanvasGroup" parent="."] +material = ExtResource("4_ssrsu") -[node name="Butt" parent="CanvasGroup/basic_zombie_walk/Zombie" index="0"] +[node name="basic_zombie_walk" type="Node2D" parent="CanvasGroup"] + +[node name="Zombie" type="Skeleton2D" parent="CanvasGroup/basic_zombie_walk"] +use_parent_material = true +modification_stack = SubResource("SkeletonModificationStack2D_wn68q") + +[node name="Butt" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie"] +use_parent_material = true +position = Vector2(5, -35) scale = Vector2(0.999902, 0.999902) +rest = Transform2D(1, 0, 0, 1, 5, -35) +editor_settings/show_bone_gizmo = false -[node name="Butt" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="0"] +[node name="Butt" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true texture = SubResource("AtlasTexture_txjqc") +centered = false +offset = Vector2(-10, -3) +metadata/_edit_lock_ = true -[node name="RightUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="1"] -scale = Vector2(0.999831, 0.999831) - -[node name="Right_Upper_Leg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg" index="0"] -texture = SubResource("AtlasTexture_b583s") - -[node name="RightLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg" index="1"] -scale = Vector2(0.999832, 0.999832) - -[node name="RightFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg" index="0"] -scale = Vector2(0.999835, 0.999835) - -[node name="Right_Foot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot" index="0"] -texture = SubResource("AtlasTexture_uoit3") - -[node name="Right_Lower_Leg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg" index="1"] -texture = SubResource("AtlasTexture_vn3j1") - -[node name="LeftUpperLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="2"] -scale = Vector2(0.99983, 0.99983) - -[node name="Left_Upper_Leg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg" index="0"] -texture = SubResource("AtlasTexture_yb81c") - -[node name="LeftLowerLeg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg" index="1"] -scale = Vector2(0.999832, 0.999832) - -[node name="Left_Lower_Leg" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg" index="0"] -texture = SubResource("AtlasTexture_nlwsb") - -[node name="LeftFoot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg" index="1"] -scale = Vector2(0.999814, 0.999814) - -[node name="Left_Foot" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot" index="0"] -texture = SubResource("AtlasTexture_8y6c0") - -[node name="Body" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt" index="3"] -scale = Vector2(0.999824, 0.999824) - -[node name="RightUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="0"] +[node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(-6, 3) scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -6, 3) +editor_settings/show_bone_gizmo = false -[node name="Right_Upper_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm" index="0"] +[node name="Right_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +texture = SubResource("AtlasTexture_b583s") +centered = false +offset = Vector2(-6, -2) +metadata/_edit_lock_ = true + +[node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] +position = Vector2(-2, 12) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -2, 12) +editor_settings/show_bone_gizmo = false + +[node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-2, 14) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -2, 14) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 0.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg/RightFoot"] +texture = SubResource("AtlasTexture_uoit3") +centered = false +offset = Vector2(-4, -3) +metadata/_edit_lock_ = true + +[node name="Right_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] +position = Vector2(-18, -2) +texture = SubResource("AtlasTexture_vn3j1") +centered = false +offset = Vector2(12, 1) +metadata/_edit_lock_ = true + +[node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(6, 4) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, 6, 4) +editor_settings/show_bone_gizmo = false + +[node name="Left_Upper_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +texture = SubResource("AtlasTexture_yb81c") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true + +[node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] +position = Vector2(-1, 13) +scale = Vector2(0.99983, 0.99983) +rest = Transform2D(1, 0, 0, 1, -1, 13) +editor_settings/show_bone_gizmo = false + +[node name="Left_Lower_Leg" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +texture = SubResource("AtlasTexture_nlwsb") +centered = false +offset = Vector2(-1, 0) +metadata/_edit_lock_ = true + +[node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] +position = Vector2(6, 10) +scale = Vector2(0.999818, 0.999818) +rest = Transform2D(1, 0, 0, 1, 6, 10) +auto_calculate_length_and_angle = false +length = 12.0 +bone_angle = 160.0 +editor_settings/show_bone_gizmo = false + +[node name="Left_Foot" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg/LeftFoot"] +texture = SubResource("AtlasTexture_8y6c0") +centered = false +offset = Vector2(-14, -3) +metadata/_edit_lock_ = true + +[node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] +use_parent_material = true +position = Vector2(1, -2) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, 1, -2) +editor_settings/show_bone_gizmo = false + +[node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +z_index = -1 +use_parent_material = true +position = Vector2(-14, -23) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -14, -23) +editor_settings/show_bone_gizmo = false + +[node name="Right_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] texture = SubResource("AtlasTexture_nc6p3") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true -[node name="RightLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm" index="1"] -scale = Vector2(0.999815, 0.999815) +[node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] +position = Vector2(-2, 15) +scale = Vector2(0.999816, 0.999816) +rest = Transform2D(1, 0, 0, 1, -2, 15) +editor_settings/show_bone_gizmo = false -[node name="Right_Hand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand" index="0"] +[node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] +position = Vector2(-1, 13) +scale = Vector2(0.999828, 0.999828) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 8.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false + +[node name="Right_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm/RightHand"] texture = SubResource("AtlasTexture_y0p2l") +centered = false +offset = Vector2(-4, -2) +metadata/_edit_lock_ = true -[node name="Right_Lower_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm" index="1"] +[node name="Right_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] texture = SubResource("AtlasTexture_op0h6") +centered = false +offset = Vector2(-5, -1) +metadata/_edit_lock_ = true -[node name="Body" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="1"] +[node name="Body" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +rotation = 0.00163735 texture = SubResource("AtlasTexture_0s5wm") +centered = false +offset = Vector2(-15, -27) +metadata/_edit_lock_ = true -[node name="Tie" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="2"] -rotation = 0.0332545 +[node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-9, -21) +rotation = 0.0486026 scale = Vector2(1e-05, 1e-05) +skew = -0.000476122 +rest = Transform2D(1, 0, 0, 1, -9, -21) +auto_calculate_length_and_angle = false +length = 24.0 +bone_angle = 100.0 +editor_settings/show_bone_gizmo = false -[node name="Tie" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Tie" index="0"] +[node name="Tie" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Tie"] visible = false +texture = SubResource("AtlasTexture_e7wc3") +centered = false +offset = Vector2(-10, -1) +metadata/_edit_lock_ = true -[node name="Can" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="3" node_paths=PackedStringArray("data")] +[node name="Can" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" node_paths=PackedStringArray("data")] scale = Vector2(1.00027, 1.00027) collision_layer = 128 collision_mask = 64 @@ -847,7 +1092,7 @@ minTorque = -45.0 maxTorque = 45.0 Impulse = 100.0 -[node name="Sprite2D" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can" index="0" node_paths=PackedStringArray("armor")] +[node name="Sprite2D" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can" node_paths=PackedStringArray("armor")] material = ExtResource("6_vn3j1") position = Vector2(-5.9999, -4.5002) texture = ExtResource("6_i6nje") @@ -856,33 +1101,65 @@ armor = NodePath("../../../../../../../CanArmor") degradationStages = Array[Texture2D]([ExtResource("6_i6nje"), ExtResource("7_txjqc"), ExtResource("8_b583s")]) thresholdPercentage = Array[float]([1.0, 0.667, 0.333]) -[node name="Sprite2D2" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can" index="1"] +[node name="Sprite2D2" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can"] z_index = -1 material = ExtResource("6_vn3j1") position = Vector2(-7.4999, -27.5002) texture = SubResource("AtlasTexture_5selg") -[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can" index="2"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can"] position = Vector2(-4.9999, -5.0002) shape = SubResource("CapsuleShape2D_4248q") -[node name="Head" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" index="0"] +[node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-10, -25) +scale = Vector2(0.999829, 0.999829) +rest = Transform2D(1, 0, 0, 1, -10, -25) +editor_settings/show_bone_gizmo = false + +[node name="HeadParticle" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" node_paths=PackedStringArray("data")] +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("3_tu6af") +data = NodePath("../../../../../../..") +maxAngle = 45.0 +minTorque = -45.0 +maxTorque = 45.0 +Impulse = 100.0 + +[node name="Head" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] texture = SubResource("AtlasTexture_pjhfy") +centered = false +offset = Vector2(-20, -24) +metadata/_edit_lock_ = true -[node name="Right_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="0"] -position = Vector2(-16, -8.00001) +[node name="Right_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] +position = Vector2(-16, -8) +scale = Vector2(1, 1) +texture = SubResource("AtlasTexture_vcc72") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true -[node name="Left_Eye" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="1"] +[node name="Left_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-4, -9) +scale = Vector2(1, 1) +texture = SubResource("AtlasTexture_kto0i") +centered = false +offset = Vector2(-2, -2) +metadata/_edit_lock_ = true -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="2"] +[node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-3, 3) -rotation = -0.0540862 -scale = Vector2(0.999834, 0.999834) +rotation = -0.0790489 +scale = Vector2(0.999826, 0.999826) texture = SubResource("AtlasTexture_7cvmi") +centered = false offset = Vector2(-14, -2) +metadata/_edit_lock_ = true -[node name="TrashcanLid" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" index="3" node_paths=PackedStringArray("data")] +[node name="TrashcanLid" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" node_paths=PackedStringArray("data")] position = Vector2(-3, 3) scale = Vector2(0.999826, 0.999826) collision_layer = 128 @@ -891,7 +1168,7 @@ freeze = true script = ExtResource("3_tu6af") data = NodePath("../../../../../../../../..") -[node name="Trashcan_lid" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" index="0"] +[node name="Trashcan_lid" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid"] z_index = -1 material = ExtResource("6_vn3j1") position = Vector2(2.99822, -20.0166) @@ -900,19 +1177,59 @@ texture = SubResource("AtlasTexture_n380g") offset = Vector2(-0.5, -0.5) metadata/_edit_lock_ = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" index="1"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid"] position = Vector2(2.99791, -20.018) shape = SubResource("CircleShape2D_vn3j1") -[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" index="2" node_paths=PackedStringArray("_observedArmor")] +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" node_paths=PackedStringArray("_observedArmor")] script = ExtResource("12_vn3j1") _threshold = 0.333 _observedArmor = NodePath("../../../../../../../../../../CanArmor") -[node name="Jaw" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="1"] -scale = Vector2(0.999834, 0.999834) +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] +position = Vector2(-4.58496, -8.21035) +shape = SubResource("CircleShape2D_dn8ha") -[node name="TrashcanLid" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head" index="4"] +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("14_2awep") +_threshold = 0.0 +_observedEntity = NodePath("../../../../../../../..") + +[node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-3, 3) +scale = Vector2(0.999826, 0.999826) +rest = Transform2D(1, 0, 0, 1, -3, 3) +auto_calculate_length_and_angle = false +length = 11.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw"] +remote_path = NodePath("../../HeadParticle/Head/Jaw") + +[node name="RightEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-16, -8) +rest = Transform2D(1, 0, 0, 1, -16, -8) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye"] +remote_path = NodePath("../../HeadParticle/Head/Right_Eye") + +[node name="LeftEye" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] +position = Vector2(-4, -9) +rest = Transform2D(1, 0, 0, 1, -4, -9) +auto_calculate_length_and_angle = false +length = 2.0 +bone_angle = 180.0 +editor_settings/show_bone_gizmo = false + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye"] +remote_path = NodePath("../../HeadParticle/Head/Left_Eye") + +[node name="TrashcanLid" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-0.0022974, -17.0131) scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -0.0022974, -17.0131) @@ -921,84 +1238,195 @@ length = 12.0 bone_angle = 180.0 editor_settings/show_bone_gizmo = false -[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid" index="0"] +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid"] remote_path = NodePath("../../HeadParticle/Head/TrashcanLid/Trashcan_lid") -[node name="LeftUpperArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body" index="5"] -scale = Vector2(0.999825, 0.999825) +[node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] +position = Vector2(-1, -20) +scale = Vector2(0.999827, 0.999827) +rest = Transform2D(1, 0, 0, 1, -1, -20) +editor_settings/show_bone_gizmo = false -[node name="Left_Upper_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" index="0"] +[node name="Left_Upper_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-37, 10) texture = SubResource("AtlasTexture_tebih") +centered = false +offset = Vector2(33, -12) +metadata/_edit_lock_ = true -[node name="Left_Lower_Arm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" index="0"] -rotation = 0.0299982 -scale = Vector2(0.999995, 0.999995) +[node name="HandProjectile" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" node_paths=PackedStringArray("data")] +position = Vector2(-2, 14) +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("3_tu6af") +data = NodePath("../../../../../../..") +minTorque = -45.0 +maxTorque = 45.0 + +[node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +rotation = 0.0438435 +scale = Vector2(0.999994, 0.999994) texture = SubResource("AtlasTexture_auxav") +centered = false +offset = Vector2(-5, 0) +metadata/_edit_lock_ = true -[node name="Left_Hand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm" index="0"] +[node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] +show_behind_parent = true position = Vector2(-0.99983, 12.9978) -rotation = 0.0 scale = Vector2(0.999652, 0.999652) texture = SubResource("AtlasTexture_dntsa") +centered = false +offset = Vector2(-4, -1) +metadata/_edit_lock_ = true -[node name="LeftLowerArm" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm" index="2"] -scale = Vector2(0.999825, 0.999825) +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] +position = Vector2(-0.00104554, 13.0063) +shape = SubResource("CapsuleShape2D_ccrjo") -[node name="LeftHand" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm" index="0"] +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" node_paths=PackedStringArray("_observedEntity")] +script = ExtResource("14_2awep") +_observedEntity = NodePath("../../../../../../../..") + +[node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] +position = Vector2(-2, 14) +scale = Vector2(0.999824, 0.999824) +rest = Transform2D(1, 0, 0, 1, -2, 14) +editor_settings/show_bone_gizmo = false + +[node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +position = Vector2(-1, 13) scale = Vector2(0.999822, 0.999822) +rest = Transform2D(1, 0, 0, 1, -1, 13) +auto_calculate_length_and_angle = false +length = 6.0 +bone_angle = 90.0 +editor_settings/show_bone_gizmo = false -[node name="AnimationPlayer" parent="CanvasGroup/basic_zombie_walk" index="1"] +[node name="Left_Hand_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand"] +remote_path = NodePath("../../../HandProjectile/Left_Lower_Arm/Left_Hand") + +[node name="Left_Lower_Arm_Remote" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] +scale = Vector2(1.00017, 1.00017) +remote_path = NodePath("../../HandProjectile/Left_Lower_Arm") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CanvasGroup/basic_zombie_walk"] libraries = { &"": SubResource("AnimationLibrary_x5uj2"), &"basic": ExtResource("7_vn3j1"), &"hobo": ExtResource("8_yb81c") } -[node name="EatingStatistics" parent="CanvasGroup/basic_zombie_walk/AnimationPlayer" index="0"] +[node name="EatingStatistics" type="Node" parent="CanvasGroup/basic_zombie_walk/AnimationPlayer"] +script = ExtResource("17_arnax") animationName = "hobo/eating_without_arms" +trackToFind = "../../Eatbox" -[node name="Eatbox" parent="." index="2"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 8 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(4, -24) +shape = SubResource("RectangleShape2D_hxyad") + +[node name="Eatbox" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("18_p6vn8") _damage = SubResource("Resource_n380g") -[node name="AnimationTree" parent="." index="3"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eatbox"] +position = Vector2(-10, -24) +shape = SubResource("RectangleShape2D_r4ug6") + +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] +root_node = NodePath("../CanvasGroup/basic_zombie_walk") tree_root = SubResource("AnimationNodeBlendTree_txjqc") advance_expression_base_node = NodePath("../Behaviour") +anim_player = NodePath("../CanvasGroup/basic_zombie_walk/AnimationPlayer") +parameters/TimeScale/scale = 1.0 +script = ExtResource("20_l220p") +entity = NodePath("..") -[node name="Mover" parent="." index="4"] +[node name="Mover" type="Node" parent="."] +script = ExtResource("21_vuumd") _speed = SubResource("Resource_4248q") -_speedControlMult = 0.0 -[node name="HitPlayer" parent="." index="5"] +[node name="HitPlayer" type="Node" parent="."] +script = ExtResource("22_uxp8e") playlist = Array[AudioStream]([ExtResource("8_4248q"), ExtResource("9_tu6af")]) channels = Array[String](["metal_hit", "hit"]) +metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="CanArmor" type="Node" parent="." index="7"] +[node name="GroanPlayer" type="Node" parent="."] +script = ExtResource("11_7jlle") +audioStream = ExtResource("26_i0ku7") +channel = "groan" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" + +[node name="Timer" type="Timer" parent="GroanPlayer"] +wait_time = 20.0 + +[node name="StartTimer" type="Timer" parent="GroanPlayer/Timer"] +wait_time = 5.0 +one_shot = true +autostart = true + +[node name="CanArmor" type="Node" parent="."] script = ExtResource("4_w8pya") MaxHP = 550.0 metadata/_custom_type_script = "uid://fd4im1fmwc5n" -[node name="FlashController" type="Node" parent="CanArmor" index="0"] +[node name="FlashController" type="Node" parent="CanArmor"] script = ExtResource("19_8y6c0") shaderMaterial = ExtResource("6_vn3j1") -[node name="Behaviour" type="Node" parent="." index="8" node_paths=PackedStringArray("_eatBox", "_animationTree")] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_eatBox", "_animationTree")] script = ExtResource("4_5selg") _eatBox = NodePath("../Eatbox") _animationTree = NodePath("../AnimationTree") -[node name="RipPlayer" type="Node" parent="." index="11"] +[node name="EffectPlayer" type="Node" parent="."] +script = ExtResource("30_pilme") +effectsToMap = Array[Resource]([ExtResource("3_b583s"), ExtResource("31_y40pw")]) +streamsToMapTo = Array[AudioStream]([ExtResource("32_xr8w3"), ExtResource("33_6wb5p")]) +streamSettings = Array[Object]([null, SubResource("Resource_dn8ha")]) + +[node name="DeathHandler" type="Node" parent="." node_paths=PackedStringArray("_tree", "_collider")] +script = ExtResource("35_jg5ia") +_tree = NodePath("../AnimationTree") +_collider = NodePath("../Hitbox/CollisionShape2D") + +[node name="RipPlayer" type="Node" parent="."] script = ExtResource("11_7jlle") audioStream = ExtResource("12_w1b1s") channel = "anger" metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="FlashController" parent="." index="12"] +[node name="FlashController" type="Node" parent="."] +script = ExtResource("19_8y6c0") shaderMaterial = SubResource("ShaderMaterial_vn3j1") +[connection signal="HasBeenKilled" from="." to="DeathHandler" method="OnKilled"] +[connection signal="OnDamaged" from="." to="HitPlayer" method="Play"] +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" method="FallOff"] [connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid/RemoteTransform2D" method="queue_free"] -[connection signal="ArmorLost" from="CanArmor" to="HitPlayer" method="Next"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/LeftEye/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/LeftHand/Left_Hand_Remote" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm/Left_Lower_Arm_Remote" method="queue_free"] +[connection signal="area_entered" from="Eatbox" to="Eatbox" method="OnAreaEntered"] +[connection signal="area_exited" from="Eatbox" to="Eatbox" method="OnAreaExited"] +[connection signal="timeout" from="GroanPlayer/Timer" to="GroanPlayer" method="Play"] +[connection signal="timeout" from="GroanPlayer/Timer/StartTimer" to="GroanPlayer/Timer" method="start"] [connection signal="ArmorLost" from="CanArmor" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can" method="FallOff"] +[connection signal="ArmorLost" from="CanArmor" to="HitPlayer" method="Next"] [connection signal="ArmorLost" from="CanArmor" to="Behaviour" method="Trashed"] [connection signal="Damaged" from="CanArmor" to="HitPlayer" method="Play"] [connection signal="Damaged" from="CanArmor" to="CanArmor/FlashController" method="DamageFlash"] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index 7914fc0..687ee9d 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -20,7 +20,7 @@ [ext_resource type="Script" uid="uid://cnn0ymuhypdff" path="res://scripts/audio/ChannelPlaylist.cs" id="12_he8da"] [ext_resource type="AudioStream" uid="uid://w0qfwds4o3ti" path="res://assets/audio/sfx/hit_generic.tres" id="12_vjrlo"] [ext_resource type="Script" uid="uid://b8r6fxsfjdo3a" path="res://scripts/audio/EffectBasedPlayer.cs" id="17_ltj46"] -[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="18_2q05d"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="18_2q05d"] [ext_resource type="Resource" uid="uid://7uj0oe656jfx" path="res://assets/effects/SnowSlow.tres" id="19_ccrjo"] [ext_resource type="Script" uid="uid://c1x4n4nqyq72f" path="res://scripts/audio/ChannelSettings.cs" id="21_xnora"] [ext_resource type="Script" uid="uid://dk32ln8c2574d" path="res://scripts/entities/zombies/ZombieKillHandler.cs" id="23_mc1kl"] @@ -815,7 +815,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999835, 0.999835) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -833,7 +833,7 @@ editor_settings/show_bone_gizmo = false [node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] position = Vector2(-2, 14) -scale = Vector2(0.999833, 0.999833) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -2, 14) auto_calculate_length_and_angle = false length = 12.0 @@ -868,7 +868,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999836, 0.999836) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -880,7 +880,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.999831, 0.999831) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -904,7 +904,7 @@ editor_settings/show_bone_gizmo = false z_index = -1 use_parent_material = true position = Vector2(-14, -23) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -916,13 +916,13 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false [node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 8.0 @@ -950,8 +950,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.0871529 -skew = -0.000476122 +rotation = 0.143865 +skew = -0.000476241 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -1004,9 +1004,9 @@ offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-3.00107, 2.99818) -rotation = 0.00845789 -scale = Vector2(0.999829, 0.999829) +position = Vector2(-2.95686, 2.88837) +rotation = 0.0182787 +scale = Vector2(0.999831, 0.999831) texture = SubResource("AtlasTexture_x5uj2") centered = false offset = Vector2(-12, -2) @@ -1023,7 +1023,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999831, 0.999831) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1079,7 +1079,7 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.0819429 +rotation = 0.154659 scale = Vector2(0.999998, 0.999998) texture = SubResource("AtlasTexture_auqeq") centered = false @@ -1088,9 +1088,9 @@ metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] show_behind_parent = true -position = Vector2(-0.99983, 12.9978) -rotation = -0.0361645 -scale = Vector2(0.999656, 0.999656) +position = Vector2(-0.999829, 12.9978) +rotation = -0.0781564 +scale = Vector2(0.999658, 0.999658) texture = SubResource("AtlasTexture_vlvtp") centered = false offset = Vector2(-4, -1) @@ -1112,7 +1112,7 @@ editor_settings/show_bone_gizmo = false [node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999826, 0.999826) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 6.0 @@ -1167,7 +1167,7 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("4_u5syx") _speed = SubResource("Resource_ckb7n") -_speedControlMult = 0.271112 +_speedControlMult = 1.64254 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("12_he8da") diff --git a/scenes/entities/plants/aloe.tscn b/scenes/entities/plants/aloe.tscn index 9d00776..5215df8 100644 --- a/scenes/entities/plants/aloe.tscn +++ b/scenes/entities/plants/aloe.tscn @@ -1,19 +1,13 @@ -[gd_scene load_steps=23 format=3 uid="uid://bw1w8jp0yeypy"] +[gd_scene load_steps=24 format=3 uid="uid://bw1w8jp0yeypy"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_n25yi"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_dm0tl"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_8fr1j"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_aimqk"] [ext_resource type="Texture2D" uid="uid://b6tyoa5htapir" path="res://assets/sprites/atlases/plants/aloe.png" id="2_iup5p"] [ext_resource type="AnimationLibrary" uid="uid://bgutjc3ruq27s" path="res://assets/animations/plants/aloe.res" id="3_3sp3b"] [ext_resource type="Script" uid="uid://cljytsmqac0w7" path="res://scripts/entities/plants/behaviours/AloeBehaviour.cs" id="4_55asm"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="4_aimqk"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="5_gfy6j"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_8fr1j"] -resource_local_to_scene = true -shader = ExtResource("2_dm0tl") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="7_vpcbp"] [sub_resource type="Animation" id="Animation_vknky"] length = 0.001 @@ -103,43 +97,54 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_oe0dc"] size = Vector2(22, 32) -[node name="Aloe" instance=ExtResource("1_n25yi")] -GetInternalID() = "aloe" +[node name="Aloe" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_8fr1j") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_8fr1j") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_aimqk") position = Vector2(9, -14) texture = ExtResource("2_iup5p") hframes = 8 vframes = 4 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_wlien"), &"aloe": ExtResource("3_3sp3b") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_gfy6j") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/conditions/charged = false parameters/Tree/conditions/heal = false +script = ExtResource("4_aimqk") +entity = NodePath("..") -[node name="Behaviour" type="Node" parent="." index="3"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("4_55asm") _hpTreshold = 0.5 -[node name="Timer" type="Timer" parent="Behaviour" index="0" node_paths=PackedStringArray("entity")] +[node name="Timer" type="Timer" parent="Behaviour" node_paths=PackedStringArray("entity")] wait_time = 15.0 one_shot = true script = ExtResource("5_gfy6j") entity = NodePath("../..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] shape = SubResource("RectangleShape2D_oe0dc") -[node name="FlashController" parent="." index="5"] -shaderMaterial = SubResource("ShaderMaterial_8fr1j") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("7_vpcbp") +shaderMaterial = ExtResource("2_aimqk") +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="timeout" from="Behaviour/Timer" to="Behaviour" method="OnTimeout"] diff --git a/scenes/entities/plants/cucumber.tscn b/scenes/entities/plants/cucumber.tscn index a07809c..1b65733 100644 --- a/scenes/entities/plants/cucumber.tscn +++ b/scenes/entities/plants/cucumber.tscn @@ -1,21 +1,15 @@ -[gd_scene load_steps=25 format=3 uid="uid://cjoyh54cpjla7"] +[gd_scene load_steps=26 format=3 uid="uid://cjoyh54cpjla7"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_65f4u"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_xwpd6"] [ext_resource type="Texture2D" uid="uid://bt76iudw2qgnv" path="res://assets/sprites/atlases/plants/cumbucer.png" id="2_ig0op"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_jbggv"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_q31qc"] [ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="3_d45iq"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="3_q31qc"] [ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/entities/plants/Shooter.cs" id="4_sckvu"] [ext_resource type="PackedScene" uid="uid://c1ig40gtdcb60" path="res://scenes/projectiles/cucumber_projectile.tscn" id="5_sckvu"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="6_xwpd6"] [ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="7_q31qc"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_jbggv"] -resource_local_to_scene = true -shader = ExtResource("2_jbggv") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="9_a66ro"] [sub_resource type="Animation" id="Animation_n1xkd"] length = 0.001 @@ -118,7 +112,6 @@ transitions = ["Start", "cucumber_idle", SubResource("AnimationNodeStateMachineT graph_offset = Vector2(137, -3) [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_xwpd6"] -graph_offset = Vector2(-370, 72) nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_ig0op") nodes/TimeScale/position = Vector2(60, 140) nodes/Tree/node = SubResource("AnimationNodeStateMachine_jbggv") @@ -132,54 +125,67 @@ height = 48.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_n1xkd"] size = Vector2(26, 600) -[node name="Cucumber" instance=ExtResource("1_65f4u")] -GetInternalID() = "cucumber" +[node name="Cucumber" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +material = ExtResource("2_q31qc") +script = ExtResource("1_xwpd6") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_jbggv") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_q31qc") texture = ExtResource("2_ig0op") hframes = 10 vframes = 2 frame = 10 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_gogcg"), &"cucumber": SubResource("AnimationLibrary_n1xkd") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_xwpd6") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/conditions/ready = false +script = ExtResource("3_q31qc") +entity = NodePath("..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] shape = SubResource("CapsuleShape2D_ig0op") -[node name="Eysight" type="Area2D" parent="." index="4"] +[node name="Eysight" type="Area2D" parent="."] collision_layer = 4 collision_mask = 8 script = ExtResource("3_d45iq") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight"] shape = SubResource("RectangleShape2D_n1xkd") -[node name="Shooter" type="Marker2D" parent="." index="5" node_paths=PackedStringArray("_timer")] +[node name="Shooter" type="Marker2D" parent="." node_paths=PackedStringArray("_timer")] script = ExtResource("4_sckvu") _projectile = ExtResource("5_sckvu") _timer = NodePath("FireTimer") -[node name="FireTimer" type="Timer" parent="Shooter" index="0" node_paths=PackedStringArray("entity")] +[node name="FireTimer" type="Timer" parent="Shooter" node_paths=PackedStringArray("entity")] wait_time = 2.5 one_shot = true script = ExtResource("6_xwpd6") entity = NodePath("../..") -[node name="Behaviour" type="Node" parent="." index="6" node_paths=PackedStringArray("_shootTimer", "_sight")] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_shootTimer", "_sight")] script = ExtResource("7_q31qc") _shootTimer = NodePath("../Shooter/FireTimer") _sight = NodePath("../Eysight") -[node name="FlashController" parent="." index="7"] -shaderMaterial = SubResource("ShaderMaterial_jbggv") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("9_a66ro") +shaderMaterial = ExtResource("2_q31qc") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] diff --git a/scenes/entities/plants/garlic.tscn b/scenes/entities/plants/garlic.tscn index c6b64fc..5ca32ca 100644 --- a/scenes/entities/plants/garlic.tscn +++ b/scenes/entities/plants/garlic.tscn @@ -1,11 +1,14 @@ -[gd_scene load_steps=16 format=3 uid="uid://qq0cw8xtcoj3"] +[gd_scene load_steps=19 format=3 uid="uid://qq0cw8xtcoj3"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_5i0e6"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_gu3kj"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_1angc"] [ext_resource type="Texture2D" uid="uid://dff73m8ahamaa" path="res://assets/sprites/atlases/plants/garlic.png" id="2_w2jbi"] [ext_resource type="AnimationLibrary" uid="uid://cjl81f61gdlvi" path="res://assets/animations/plants/garlic.res" id="3_jkb3q"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="4_1angc"] [ext_resource type="Script" uid="uid://btkmd86pn828y" path="res://scripts/entities/plants/behaviours/HpBasedBehaviour.cs" id="4_bv44h"] [ext_resource type="Script" uid="uid://bmtukcq10m8wo" path="res://scripts/entities/plants/ReturnEffect.cs" id="5_oob20"] -[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/RandomRedirectEffect.tres" id="6_gho1l"] +[ext_resource type="Resource" uid="uid://dsg1vjx76ifgu" path="res://assets/effects/GarlicEffect.tres" id="6_gho1l"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="8_6iwlp"] [sub_resource type="Animation" id="Animation_k0cex"] length = 0.001 @@ -59,37 +62,52 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_thlvs"] size = Vector2(32, 29) -[node name="Garlic" instance=ExtResource("1_5i0e6")] -GetInternalID() = "garlic" +[node name="Garlic" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_gu3kj") MaxHP = 200.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_1angc") texture = ExtResource("2_w2jbi") hframes = 8 vframes = 3 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_v4l78"), &"garlic": ExtResource("3_jkb3q") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_2o7sr") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/blend_position = 1.0 +script = ExtResource("4_1angc") +entity = NodePath("..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(1, 11.5) shape = SubResource("RectangleShape2D_thlvs") -[node name="Behaviour" type="Node" parent="." index="4"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("4_bv44h") parameters = Array[String](["parameters/Tree/blend_position"]) -[node name="ReturnEffect" type="Node" parent="." index="5"] +[node name="ReturnEffect" type="Node" parent="."] script = ExtResource("5_oob20") _effectToReturn = ExtResource("6_gho1l") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("8_6iwlp") +shaderMaterial = ExtResource("2_1angc") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="OnHPChanged" from="." to="Behaviour" method="OnHPChanged"] [connection signal="OnHPChanged" from="." to="ReturnEffect" method="OnDamageRecieved"] diff --git a/scenes/entities/plants/nerdus.tscn b/scenes/entities/plants/nerdus.tscn index e468c96..bb6393e 100644 --- a/scenes/entities/plants/nerdus.tscn +++ b/scenes/entities/plants/nerdus.tscn @@ -1,10 +1,13 @@ -[gd_scene load_steps=31 format=3 uid="uid://k5aj2slxar7w"] +[gd_scene load_steps=34 format=3 uid="uid://k5aj2slxar7w"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_8ui1h"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_o12iv"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_6e60l"] [ext_resource type="Texture2D" uid="uid://b06e8xhdy77d1" path="res://assets/sprites/atlases/plants/nerdus.png" id="2_614v4"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="3_6e60l"] [ext_resource type="Script" uid="uid://dcokqes5wwo3k" path="res://scripts/entities/plants/NerdusReturnAttack.cs" id="3_614v4"] [ext_resource type="Resource" uid="uid://dme4nvp28otq6" path="res://assets/effects/NerdusEffect.tres" id="4_ga4vy"] [ext_resource type="Script" uid="uid://btkmd86pn828y" path="res://scripts/entities/plants/behaviours/HpBasedBehaviour.cs" id="5_o1ggp"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="7_v7ffp"] [sub_resource type="Animation" id="Animation_ga4vy"] length = 0.001 @@ -251,46 +254,61 @@ radius = 24.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_ga4vy"] size = Vector2(73, 48) -[node name="Nerdus" instance=ExtResource("1_8ui1h")] -GetInternalID() = "nerdus" +[node name="Nerdus" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_o12iv") MaxHP = 200.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_6e60l") texture = ExtResource("2_614v4") hframes = 7 vframes = 6 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_o1ggp"), &"nerdus": SubResource("AnimationLibrary_pddnl") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_6a4q1") advance_expression_base_node = NodePath("../Hurtbox") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/Attack/blend_position = 1.0 parameters/Tree/Idle/blend_position = 1.0 +script = ExtResource("3_6e60l") +entity = NodePath("..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0, 3) shape = SubResource("CircleShape2D_8ui1h") -[node name="Hurtbox" type="Area2D" parent="." index="4"] +[node name="Hurtbox" type="Area2D" parent="."] collision_layer = 0 collision_mask = 8 script = ExtResource("3_614v4") returnEffect = ExtResource("4_ga4vy") bitesToPeas = 1.6 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox"] position = Vector2(3.5, 3) shape = SubResource("RectangleShape2D_ga4vy") -[node name="Behaviour" type="Node" parent="." index="5"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("5_o1ggp") parameters = Array[String](["parameters/Tree/Attack/blend_position", "parameters/Tree/Idle/blend_position"]) +[node name="FlashController" type="Node" parent="."] +script = ExtResource("7_v7ffp") +shaderMaterial = ExtResource("2_6e60l") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="OnHPChanged" from="." to="Hurtbox" method="OnHPChanged"] [connection signal="OnHPChanged" from="." to="Behaviour" method="OnHPChanged"] diff --git a/scenes/entities/plants/peashooter.tscn b/scenes/entities/plants/peashooter.tscn index db74fc8..11ed7f7 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -1,25 +1,19 @@ -[gd_scene load_steps=26 format=3 uid="uid://dy41q1kxray5t"] +[gd_scene load_steps=27 format=3 uid="uid://dy41q1kxray5t"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_pyk3o"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_p4cd5"] [ext_resource type="Texture2D" uid="uid://cksryh4w5dbbx" path="res://assets/sprites/atlases/plants/peashooter.png" id="2_14qlx"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_fp65y"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_p4cd5"] [ext_resource type="AnimationLibrary" uid="uid://bv1dl1g4dmbho" path="res://assets/animations/plants/peashooter.res" id="3_8lrhp"] [ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/entities/plants/Shooter.cs" id="3_a4ew1"] [ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="4_saxds"] [ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="5_7qiua"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_ceium"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="6_q58jr"] [ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="7_2bki8"] [ext_resource type="Script" uid="uid://hccb0aee0x0o" path="res://scripts/entities/plants/PlantEyesightLimiter.cs" id="8_nl4jc"] [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="9_mbbd7"] [ext_resource type="AudioStream" uid="uid://dsv81mvrdg3w3" path="res://assets/audio/sfx/throw_generic.tres" id="10_q58jr"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_fp65y"] -resource_local_to_scene = true -shader = ExtResource("2_fp65y") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="14_dmys5"] [sub_resource type="Animation" id="Animation_a2y0j"] length = 0.001 @@ -81,63 +75,75 @@ resource_local_to_scene = true [sub_resource type="RectangleShape2D" id="RectangleShape2D_r7xnh"] size = Vector2(20, 44) -[node name="Peashooter" instance=ExtResource("1_pyk3o")] -GetInternalID() = "peashooter" +[node name="Peashooter" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_p4cd5") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_fp65y") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_p4cd5") texture = ExtResource("2_14qlx") hframes = 10 vframes = 2 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_ipp6b"), &"peashooter": ExtResource("3_8lrhp") } autoplay = "peashooter/idle" -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_q58jr") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/conditions/ready = false +script = ExtResource("5_ceium") +entity = NodePath("..") -[node name="Shooter" type="Marker2D" parent="." index="3" node_paths=PackedStringArray("_timer")] +[node name="Shooter" type="Marker2D" parent="." node_paths=PackedStringArray("_timer")] position = Vector2(12, -4) script = ExtResource("3_a4ew1") _projectile = ExtResource("4_saxds") _timer = NodePath("FireTimer") -[node name="FireTimer" type="Timer" parent="Shooter" index="0" node_paths=PackedStringArray("entity")] +[node name="FireTimer" type="Timer" parent="Shooter" node_paths=PackedStringArray("entity")] wait_time = 1.5 one_shot = true script = ExtResource("6_q58jr") entity = NodePath("../..") -[node name="Behaviour" type="Node" parent="." index="4" node_paths=PackedStringArray("_shootTimer", "_sight")] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_shootTimer", "_sight")] script = ExtResource("5_7qiua") _shootTimer = NodePath("../Shooter/FireTimer") _sight = NodePath("../Eysight") -[node name="Eysight" type="Area2D" parent="." index="5"] +[node name="Eysight" type="Area2D" parent="."] collision_layer = 4 collision_mask = 8 script = ExtResource("7_2bki8") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight"] shape = SubResource("SegmentShape2D_8iovl") script = ExtResource("8_nl4jc") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0, 5) shape = SubResource("RectangleShape2D_r7xnh") -[node name="ChannelPlayer" type="Node" parent="." index="7"] +[node name="ChannelPlayer" type="Node" parent="."] script = ExtResource("9_mbbd7") audioStream = ExtResource("10_q58jr") channel = "pea_shoot" metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="FlashController" parent="." index="8"] -shaderMaterial = SubResource("ShaderMaterial_fp65y") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("14_dmys5") +shaderMaterial = ExtResource("2_p4cd5") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] diff --git a/scenes/entities/plants/potato_mine.tscn b/scenes/entities/plants/potato_mine.tscn index 3537efd..6c08e76 100644 --- a/scenes/entities/plants/potato_mine.tscn +++ b/scenes/entities/plants/potato_mine.tscn @@ -1,24 +1,18 @@ -[gd_scene load_steps=29 format=3 uid="uid://b5x35v3w2u8dx"] +[gd_scene load_steps=30 format=3 uid="uid://b5x35v3w2u8dx"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_dj7ul"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_lx7n5"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_a0d1l"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_a0d1l"] [ext_resource type="Texture2D" uid="uid://c77o6ba0mw7a3" path="res://assets/sprites/atlases/plants/potato_mine.png" id="2_sneas"] [ext_resource type="Script" uid="uid://bhl6o2m3fn4xg" path="res://scripts/entities/plants/ExplosionComponent.cs" id="3_2hd5y"] [ext_resource type="AnimationLibrary" uid="uid://bjlbdvr6f0r7e" path="res://assets/animations/plants/potato_mine.res" id="3_7tqmj"] [ext_resource type="Script" uid="uid://c7qfh4py0uulo" path="res://scripts/entities/plants/behaviours/PotatomineBehaviour.cs" id="4_twx65"] [ext_resource type="PackedScene" uid="uid://ckanq33rao1ur" path="res://scenes/particles/potato_explosion.tscn" id="5_px4r0"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_v27q1"] [ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="7_b1j2f"] [ext_resource type="AudioStream" uid="uid://dltjtpyfr1so0" path="res://assets/audio/sfx/potato_mine.mp3" id="8_3vqdc"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="8_824aq"] [ext_resource type="AudioStream" uid="uid://b27om1bw1x04e" path="res://assets/audio/sfx/dirt_rise.mp3" id="9_3vqdc"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_crloj"] -resource_local_to_scene = true -shader = ExtResource("2_lx7n5") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="13_cfvur"] [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_3vqdc"] @@ -86,85 +80,96 @@ size = Vector2(15, 27) [sub_resource type="RectangleShape2D" id="RectangleShape2D_ti2g4"] size = Vector2(22, 19) -[node name="Potato mine" instance=ExtResource("1_dj7ul")] -GetInternalID() = "potatomine" +[node name="Potato mine" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_a0d1l") MaxHP = 20.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_crloj") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_a0d1l") texture = ExtResource("2_sneas") hframes = 7 vframes = 4 frame = 7 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"potato_mine": ExtResource("3_7tqmj") } autoplay = "idle_unprimed" -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_824aq") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/conditions/explode = false parameters/Tree/conditions/primed = false +script = ExtResource("5_v27q1") +entity = NodePath("..") -[node name="Detectionbox" type="Area2D" parent="." index="3"] +[node name="Detectionbox" type="Area2D" parent="."] collision_layer = 0 collision_mask = 8 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Detectionbox" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Detectionbox"] position = Vector2(0, 9) shape = SubResource("CircleShape2D_824aq") -[node name="ExplosionBox" type="Area2D" parent="." index="4"] +[node name="ExplosionBox" type="Area2D" parent="."] collision_layer = 0 collision_mask = 8 script = ExtResource("3_2hd5y") damage = 6000 particles = ExtResource("5_px4r0") -[node name="CollisionShape2D" type="CollisionShape2D" parent="ExplosionBox" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="ExplosionBox"] position = Vector2(0, 9) shape = SubResource("CircleShape2D_wvns6") -[node name="ExplosionPlayer" type="Node" parent="ExplosionBox" index="1"] +[node name="ExplosionPlayer" type="Node" parent="ExplosionBox"] script = ExtResource("7_b1j2f") audioStream = ExtResource("8_3vqdc") channel = "explosion" metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="PrimeTimer" type="Timer" parent="." index="5" node_paths=PackedStringArray("entity")] +[node name="PrimeTimer" type="Timer" parent="." node_paths=PackedStringArray("entity")] wait_time = 15.0 one_shot = true autostart = true script = ExtResource("8_824aq") entity = NodePath("..") -[node name="Behaviour" type="Node" parent="." index="6" node_paths=PackedStringArray("_hitbox", "detectionBox", "_unprimedShape", "_primedShape")] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_hitbox", "detectionBox", "_unprimedShape", "_primedShape")] script = ExtResource("4_twx65") _hitbox = NodePath("../Hitbox") detectionBox = NodePath("../Detectionbox") _unprimedShape = NodePath("../Hitbox/Unprimed") _primedShape = NodePath("../Hitbox/Primed") -[node name="Unprimed" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="Unprimed" type="CollisionShape2D" parent="Hitbox"] position = Vector2(-0.5, 14.5) shape = SubResource("RectangleShape2D_qfqko") -[node name="Primed" type="CollisionShape2D" parent="Hitbox" index="1"] +[node name="Primed" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0, 16.5) shape = SubResource("RectangleShape2D_ti2g4") disabled = true -[node name="ChannelPlayer" type="Node" parent="." index="8"] +[node name="ChannelPlayer" type="Node" parent="."] script = ExtResource("7_b1j2f") audioStream = ExtResource("9_3vqdc") channel = "plant_rise" metadata/_custom_type_script = "uid://c36bj8u7jghc7" -[node name="FlashController" parent="." index="9"] -shaderMaterial = SubResource("ShaderMaterial_crloj") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("13_cfvur") +shaderMaterial = ExtResource("2_a0d1l") +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="area_entered" from="Detectionbox" to="Behaviour" method="OnAreaEntered"] [connection signal="timeout" from="PrimeTimer" to="Behaviour" method="Prime"] diff --git a/scenes/entities/plants/snipach.tscn b/scenes/entities/plants/snipach.tscn index 7b90b71..f3387cd 100644 --- a/scenes/entities/plants/snipach.tscn +++ b/scenes/entities/plants/snipach.tscn @@ -1,21 +1,15 @@ -[gd_scene load_steps=13 format=3 uid="uid://bmk41n57j7hgx"] +[gd_scene load_steps=14 format=3 uid="uid://bmk41n57j7hgx"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_ltcu2"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_ktw4a"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_moq7q"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_moq7q"] [ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="3_ktw4a"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="4_4ermv"] [ext_resource type="Script" uid="uid://cu63aiowp5bqd" path="res://scripts/entities/plants/DragAction.cs" id="4_5jowj"] [ext_resource type="Script" uid="uid://co7ttejdo2qot" path="res://scripts/entities/plants/AreaAttack.cs" id="5_twsk4"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="6_4uf0y"] [ext_resource type="Script" uid="uid://csgksiyma0h4t" path="res://scripts/entities/plants/behaviours/SnipachBehaviour.cs" id="6_twsk4"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="7_3hyni"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_f4wwx"] -resource_local_to_scene = true -shader = ExtResource("2_ktw4a") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 - [sub_resource type="AtlasTexture" id="AtlasTexture_f4wwx"] atlas = ExtResource("3_ktw4a") region = Rect2(525, 241, 79, 72) @@ -30,26 +24,40 @@ region = Rect2(592, 64, 50, 60) [sub_resource type="RectangleShape2D" id="RectangleShape2D_5jowj"] size = Vector2(40, 36) -[node name="Snipach" instance=ExtResource("1_ltcu2")] -GetInternalID() = "snipach" +[node name="Snipach" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_moq7q") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_f4wwx") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_moq7q") position = Vector2(8, -16) texture = SubResource("AtlasTexture_f4wwx") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] + +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] +anim_player = NodePath("../AnimationPlayer") +script = ExtResource("4_4ermv") +entity = NodePath("..") + +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(-0.75, -2.5) shape = SubResource("RectangleShape2D_ktw4a") -[node name="DragAction" type="Node" parent="Hitbox" index="1"] +[node name="DragAction" type="Node" parent="Hitbox"] script = ExtResource("4_5jowj") -[node name="FlashController" parent="." index="4"] -shaderMaterial = SubResource("ShaderMaterial_f4wwx") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("6_4uf0y") +shaderMaterial = ExtResource("2_moq7q") -[node name="ShootBox" type="Area2D" parent="." index="5"] +[node name="ShootBox" type="Area2D" parent="."] visible = false collision_layer = 32 collision_mask = 24 @@ -57,29 +65,30 @@ input_pickable = false script = ExtResource("5_twsk4") _damage = 400 -[node name="Sprite2D" type="Sprite2D" parent="ShootBox" index="0"] +[node name="Sprite2D" type="Sprite2D" parent="ShootBox"] texture = SubResource("AtlasTexture_3hyni") -[node name="CollisionShape2D" type="CollisionShape2D" parent="ShootBox" index="1"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="ShootBox"] shape = SubResource("RectangleShape2D_5jowj") -[node name="Behaviour" type="Node" parent="." index="6" node_paths=PackedStringArray("attackBox", "timer", "guardTimer")] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("attackBox", "timer", "guardTimer")] script = ExtResource("6_twsk4") attackBox = NodePath("../ShootBox") timer = NodePath("Timer") guardTimer = NodePath("GuardTimer") -[node name="Timer" type="Timer" parent="Behaviour" index="0" node_paths=PackedStringArray("entity")] +[node name="Timer" type="Timer" parent="Behaviour" node_paths=PackedStringArray("entity")] wait_time = 15.0 one_shot = true script = ExtResource("7_3hyni") entity = NodePath("../..") -[node name="GuardTimer" type="Timer" parent="Behaviour" index="1"] +[node name="GuardTimer" type="Timer" parent="Behaviour"] wait_time = 0.2 one_shot = true autostart = true ignore_time_scale = true +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="DragBegin" from="Hitbox/DragAction" to="Behaviour" method="OnDragBegin"] [connection signal="DragEnd" from="Hitbox/DragAction" to="Behaviour" method="OnDragEnd"] diff --git a/scenes/entities/plants/snowpea.tscn b/scenes/entities/plants/snowpea.tscn index 82aaa87..45fc12f 100644 --- a/scenes/entities/plants/snowpea.tscn +++ b/scenes/entities/plants/snowpea.tscn @@ -1,18 +1,19 @@ -[gd_scene load_steps=18 format=3 uid="uid://b7innrovtmf5u"] +[gd_scene load_steps=27 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="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_klsgb"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_klsgb"] [ext_resource type="Texture2D" uid="uid://cu0651pvvkmvm" path="res://assets/sprites/atlases/plants/snow_pea.png" id="2_ytrm0"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_yyg2a"] [ext_resource type="AnimationLibrary" uid="uid://cke5wmmrvevbs" path="res://assets/animations/plants/snowpea.res" id="4_jvx5y"] [ext_resource type="PackedScene" uid="uid://domeukw4ucmyr" path="res://scenes/projectiles/snowpea_projectile.tscn" id="5_bv86m"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_g872w"] -resource_local_to_scene = true -shader = ExtResource("2_yyg2a") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_fbp2l"] +[ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/entities/plants/Shooter.cs" id="6_br16s"] +[ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="8_bjd0y"] +[ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="9_hg126"] +[ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="10_noqdw"] +[ext_resource type="Script" uid="uid://hccb0aee0x0o" path="res://scripts/entities/plants/PlantEyesightLimiter.cs" id="11_terbf"] +[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="12_dvoqf"] +[ext_resource type="AudioStream" uid="uid://dsv81mvrdg3w3" path="res://assets/audio/sfx/throw_generic.tres" id="13_o05jr"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="14_oijop"] [sub_resource type="Animation" id="Animation_pephc"] length = 0.001 @@ -71,28 +72,78 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="SegmentShape2D" id="SegmentShape2D_3oyhk"] resource_local_to_scene = true -[node name="Snowpea" instance=ExtResource("1_lp85e")] -GetInternalID() = "snowpea" +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r7xnh"] +size = Vector2(20, 44) -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_g872w") +[node name="Snowpea" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_klsgb") +MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") + +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_klsgb") texture = ExtResource("2_ytrm0") +hframes = 10 +vframes = 2 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_djmlc"), &"snowpea": ExtResource("4_jvx5y") } autoplay = "snowpea/idle" -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_3oyhk") +anim_player = NodePath("../AnimationPlayer") +parameters/TimeScale/scale = 1.0 +parameters/Tree/conditions/ready = false +script = ExtResource("5_fbp2l") +entity = NodePath("..") -[node name="Shooter" parent="." index="3"] +[node name="Shooter" type="Marker2D" parent="." node_paths=PackedStringArray("_timer")] +position = Vector2(12, -4) +script = ExtResource("6_br16s") _projectile = ExtResource("5_bv86m") +_timer = NodePath("FireTimer") -[node name="CollisionShape2D" parent="Eysight" index="0"] +[node name="FireTimer" type="Timer" parent="Shooter" node_paths=PackedStringArray("entity")] +wait_time = 1.5 +one_shot = true +script = ExtResource("8_bjd0y") +entity = NodePath("../..") + +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_shootTimer", "_sight")] +script = ExtResource("9_hg126") +_shootTimer = NodePath("../Shooter/FireTimer") +_sight = NodePath("../Eysight") + +[node name="Eysight" type="Area2D" parent="."] +collision_layer = 4 +collision_mask = 8 +script = ExtResource("10_noqdw") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight"] shape = SubResource("SegmentShape2D_3oyhk") +script = ExtResource("11_terbf") -[node name="FlashController" parent="." index="8"] -shaderMaterial = SubResource("ShaderMaterial_g872w") +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(0, 5) +shape = SubResource("RectangleShape2D_r7xnh") + +[node name="ChannelPlayer" type="Node" parent="."] +script = ExtResource("12_dvoqf") +audioStream = ExtResource("13_o05jr") +channel = "pea_shoot" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" + +[node name="FlashController" type="Node" parent="."] +script = ExtResource("14_oijop") +shaderMaterial = ExtResource("2_klsgb") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] diff --git a/scenes/entities/plants/spikeweed.tscn b/scenes/entities/plants/spikeweed.tscn index 409f6f6..b98941b 100644 --- a/scenes/entities/plants/spikeweed.tscn +++ b/scenes/entities/plants/spikeweed.tscn @@ -1,20 +1,14 @@ -[gd_scene load_steps=15 format=3 uid="uid://bdhod5c6o53ha"] +[gd_scene load_steps=16 format=3 uid="uid://bdhod5c6o53ha"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_vmbvr"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_63okc"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_kd62n"] [ext_resource type="Texture2D" uid="uid://coafh3mjharxo" path="res://assets/sprites/atlases/plants/spikeweed.png" id="2_ffrjr"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_kd62n"] [ext_resource type="Script" uid="uid://co7ttejdo2qot" path="res://scripts/entities/plants/AreaAttack.cs" id="3_hqtbm"] [ext_resource type="AnimationLibrary" uid="uid://cen6ku4y01dyg" path="res://assets/animations/plants/spikeweed.res" id="3_nwshn"] [ext_resource type="Script" uid="uid://dqquodxaijmem" path="res://scripts/entities/plants/behaviours/SpikeweedBehaviour.cs" id="3_uhpn7"] [ext_resource type="Script" uid="uid://dw7v3s4kbu7ma" path="res://scripts/entities/AnimationStatistics.cs" id="5_yfuxj"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_yfuxj"] -resource_local_to_scene = true -shader = ExtResource("2_63okc") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="6_sqcsr"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="9_lq7xg"] [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_jleqa"] @@ -45,47 +39,54 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_1di76"] size = Vector2(49, 38) -[node name="Spikeweed" instance=ExtResource("1_vmbvr")] -GetInternalID() = "spikeweed" +[node name="Spikeweed" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_kd62n") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_yfuxj") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_kd62n") texture = ExtResource("2_ffrjr") hframes = 10 vframes = 2 -frame = 6 +frame = 1 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"spikeweed": ExtResource("3_nwshn") } -[node name="DPSStatistics" type="Node" parent="AnimationPlayer" index="0"] +[node name="DPSStatistics" type="Node" parent="AnimationPlayer"] script = ExtResource("5_yfuxj") animationName = "spikeweed/attack" trackToFind = "Hitbox" -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_63okc") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/blend_position = 0 +script = ExtResource("6_sqcsr") +entity = NodePath("..") -[node name="Behaviour" type="Node" parent="." index="3"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("3_uhpn7") -[node name="Hitbox" parent="." index="4"] +[node name="Hitbox" type="Area2D" parent="."] collision_layer = 4 collision_mask = 8 script = ExtResource("3_hqtbm") _damage = 6 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0.5, 9) shape = SubResource("RectangleShape2D_1di76") -[node name="FlashController" parent="." index="5"] -shaderMaterial = SubResource("ShaderMaterial_yfuxj") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("9_lq7xg") +shaderMaterial = ExtResource("2_kd62n") +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="area_entered" from="Hitbox" to="Behaviour" method="OnHitboxEntered"] [connection signal="area_exited" from="Hitbox" to="Behaviour" method="OnHitboxExited"] diff --git a/scenes/entities/plants/sunflower.tscn b/scenes/entities/plants/sunflower.tscn index 4ac1a75..3d6d1b8 100644 --- a/scenes/entities/plants/sunflower.tscn +++ b/scenes/entities/plants/sunflower.tscn @@ -1,21 +1,15 @@ -[gd_scene load_steps=21 format=3 uid="uid://bg7lomiorxo2c"] +[gd_scene load_steps=22 format=3 uid="uid://bg7lomiorxo2c"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_bikjn"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_yyn2e"] [ext_resource type="Texture2D" uid="uid://b3tuidu8dag8u" path="res://assets/sprites/atlases/plants/sunflower.png" id="2_fwcda"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_qpvbo"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_yyn2e"] [ext_resource type="AnimationLibrary" uid="uid://yjytiuj4u7oh" path="res://assets/animations/plants/sunflower.res" id="3_btsik"] [ext_resource type="Script" uid="uid://b71gebny84s81" path="res://scripts/entities/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" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_7omaw"] [ext_resource type="Script" uid="uid://bth7gah4tn7uj" path="res://scripts/entities/plants/behaviours/SunflowerBehaviour.cs" id="5_26je0"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="7_rlkb7"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_mdjfv"] -resource_local_to_scene = true -shader = ExtResource("2_qpvbo") -shader_parameter/FLASH_COLOR = Color(0.78, 0.78, 0.78, 0.501961) -shader_parameter/HIGHLIGHT_COLOR = Color(0.69, 0, 0, 0.282353) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="10_w3e3c"] [sub_resource type="Animation" id="Animation_bfx6v"] length = 0.001 @@ -73,56 +67,67 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4xs4g"] size = Vector2(26, 48) -[node name="Sunflower" instance=ExtResource("1_bikjn")] -GetInternalID() = "sunflower" +[node name="Sunflower" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_yyn2e") MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_mdjfv") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_yyn2e") texture = ExtResource("2_fwcda") hframes = 9 vframes = 2 -frame = 2 +frame = 4 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_ek2al"), &"sunflower": ExtResource("3_btsik") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_rlkb7") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/conditions/produce = false +script = ExtResource("5_7omaw") +entity = NodePath("..") -[node name="PlantSunSpawner" type="Node2D" parent="." index="3"] +[node name="PlantSunSpawner" type="Node2D" parent="."] position = Vector2(-2, 0) script = ExtResource("3_te0pl") _sunScene = ExtResource("4_b8hls") _amountPerSun = 25 -[node name="Behaviour" type="Node" parent="." index="4"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("5_26je0") -[node name="Timer" type="Timer" parent="Behaviour" index="0" node_paths=PackedStringArray("entity")] +[node name="Timer" type="Timer" parent="Behaviour" node_paths=PackedStringArray("entity")] wait_time = 24.25 script = ExtResource("7_rlkb7") entity = NodePath("../..") -[node name="StartTimer" type="Timer" parent="Behaviour" index="1" node_paths=PackedStringArray("entity")] +[node name="StartTimer" type="Timer" parent="Behaviour" node_paths=PackedStringArray("entity")] wait_time = 12.0 one_shot = true autostart = true script = ExtResource("7_rlkb7") entity = NodePath("../..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0, 4) shape = SubResource("RectangleShape2D_4xs4g") -[node name="FlashController" parent="." index="6"] -shaderMaterial = SubResource("ShaderMaterial_mdjfv") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("10_w3e3c") +shaderMaterial = ExtResource("2_yyn2e") +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [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 770a8db..73e6100 100644 --- a/scenes/entities/plants/threepeater.tscn +++ b/scenes/entities/plants/threepeater.tscn @@ -1,9 +1,18 @@ -[gd_scene load_steps=20 format=3 uid="uid://eegv1qihfv2q"] +[gd_scene load_steps=30 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://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_833fu"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_833fu"] [ext_resource type="Script" uid="uid://djpc0kvagpadv" path="res://scripts/entities/plants/ThreepeaterShooter.cs" id="2_ieami"] [ext_resource type="Texture2D" uid="uid://dyfa4462hu3w1" path="res://assets/sprites/atlases/plants/threepeater.png" id="2_j7h7q"] [ext_resource type="Script" uid="uid://hccb0aee0x0o" path="res://scripts/entities/plants/PlantEyesightLimiter.cs" id="3_dqn6w"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="4_ht2a0"] +[ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="6_kscbk"] +[ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="7_anbbx"] +[ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="8_pp80j"] +[ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="9_salpp"] +[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="11_13f0q"] +[ext_resource type="AudioStream" uid="uid://dsv81mvrdg3w3" path="res://assets/audio/sfx/throw_generic.tres" id="12_4a4xw"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="13_otw6n"] [sub_resource type="Animation" id="Animation_a2y0j"] length = 0.001 @@ -134,39 +143,89 @@ resource_local_to_scene = true [sub_resource type="SegmentShape2D" id="SegmentShape2D_yb26d"] resource_local_to_scene = true -[node name="Threepeater" instance=ExtResource("1_muntu")] -GetInternalID() = "threepeater" +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r7xnh"] +size = Vector2(20, 44) -[node name="Sprite2D" parent="." index="0"] +[node name="Threepeater" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_833fu") +MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") + +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_833fu") position = Vector2(6, -13) texture = ExtResource("2_j7h7q") hframes = 13 +vframes = 2 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"": SubResource("AnimationLibrary_ipp6b"), &"threepeater": SubResource("AnimationLibrary_o2obw") } +autoplay = "peashooter/idle" -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_j7h7q") +anim_player = NodePath("../AnimationPlayer") +parameters/TimeScale/scale = 1.0 +parameters/Tree/conditions/ready = false +script = ExtResource("4_ht2a0") +entity = NodePath("..") -[node name="Shooter" parent="." index="3"] +[node name="Shooter" type="Marker2D" parent="." node_paths=PackedStringArray("_timer")] position = Vector2(20, -9) script = ExtResource("2_ieami") +_projectile = ExtResource("6_kscbk") +_timer = NodePath("FireTimer") -[node name="Timer" parent="Shooter" index="0"] -wait_time = 1.6 +[node name="FireTimer" type="Timer" parent="Shooter" node_paths=PackedStringArray("entity")] +wait_time = 1.5 +one_shot = true +script = ExtResource("7_anbbx") +entity = NodePath("../..") -[node name="CollisionShape2D" parent="Eysight" index="0"] +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_shootTimer", "_sight")] +script = ExtResource("8_pp80j") +_shootTimer = NodePath("../Shooter/FireTimer") +_sight = NodePath("../Eysight") + +[node name="Eysight" type="Area2D" parent="."] +collision_layer = 4 +collision_mask = 8 +script = ExtResource("9_salpp") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight"] shape = SubResource("SegmentShape2D_j7h7q") +script = ExtResource("3_dqn6w") -[node name="CollisionShape2D2" type="CollisionShape2D" parent="Eysight" index="1"] +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Eysight"] position = Vector2(0, 60) shape = SubResource("SegmentShape2D_yb26d") script = ExtResource("3_dqn6w") -[node name="CollisionShape2D3" type="CollisionShape2D" parent="Eysight" index="2"] +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Eysight"] position = Vector2(0, -60) shape = SubResource("SegmentShape2D_yb26d") script = ExtResource("3_dqn6w") + +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(0, 5) +shape = SubResource("RectangleShape2D_r7xnh") + +[node name="ChannelPlayer" type="Node" parent="."] +script = ExtResource("11_13f0q") +audioStream = ExtResource("12_4a4xw") +channel = "pea_shoot" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" + +[node name="FlashController" type="Node" parent="."] +script = ExtResource("13_otw6n") +shaderMaterial = ExtResource("2_833fu") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] diff --git a/scenes/entities/plants/wallnut.tscn b/scenes/entities/plants/wallnut.tscn index 91ea5cd..86fc9ed 100644 --- a/scenes/entities/plants/wallnut.tscn +++ b/scenes/entities/plants/wallnut.tscn @@ -1,18 +1,12 @@ -[gd_scene load_steps=14 format=3 uid="uid://bq7imkpr2yqyr"] +[gd_scene load_steps=15 format=3 uid="uid://bq7imkpr2yqyr"] -[ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_fluxn"] -[ext_resource type="Shader" uid="uid://cgc7spjkhsx7c" path="res://assets/shaders/generic_flash.gdshader" id="2_bi7an"] +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_mnh2m"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_mnh2m"] [ext_resource type="Texture2D" uid="uid://dstqh1wc5dvmo" path="res://assets/sprites/atlases/plants/wallnut.png" id="2_o5tda"] [ext_resource type="AnimationLibrary" uid="uid://0bdesb8j2mbo" path="res://assets/animations/plants/wallnut.res" id="3_xl65q"] [ext_resource type="Script" uid="uid://btkmd86pn828y" path="res://scripts/entities/plants/behaviours/HpBasedBehaviour.cs" id="4_cjtyy"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_ladjs"] -resource_local_to_scene = true -shader = ExtResource("2_bi7an") -shader_parameter/FLASH_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/HIGHLIGHT_COLOR = Color(1, 0.709804, 0.439216, 0.5) -shader_parameter/selected = false -shader_parameter/blend = 0.0 +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_2hmhw"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="7_frxj2"] [sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_y3tlf"] @@ -46,35 +40,47 @@ node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_khltr"] size = Vector2(33, 46) -[node name="Wallnut" instance=ExtResource("1_fluxn")] -GetInternalID() = "wallnut" +[node name="Wallnut" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_mnh2m") MaxHP = 600.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") -[node name="Sprite2D" parent="." index="0"] -material = SubResource("ShaderMaterial_ladjs") +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_mnh2m") texture = ExtResource("2_o5tda") hframes = 12 vframes = 3 +frame = 10 -[node name="AnimationPlayer" parent="." index="1"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { &"wallnut": ExtResource("3_xl65q") } -[node name="AnimationTree" parent="." index="2"] +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] tree_root = SubResource("AnimationNodeBlendTree_bi7an") +anim_player = NodePath("../AnimationPlayer") parameters/TimeScale/scale = 1.0 parameters/Tree/blend_position = 1.0 +script = ExtResource("5_2hmhw") +entity = NodePath("..") -[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" index="0"] +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(3.5, 5) shape = SubResource("RectangleShape2D_khltr") -[node name="Behaviour" type="Node" parent="." index="4"] +[node name="Behaviour" type="Node" parent="."] script = ExtResource("4_cjtyy") parameters = Array[String](["parameters/Tree/blend_position"]) -[node name="FlashController" parent="." index="5"] -shaderMaterial = SubResource("ShaderMaterial_ladjs") +[node name="FlashController" type="Node" parent="."] +script = ExtResource("7_frxj2") +shaderMaterial = ExtResource("2_mnh2m") +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] [connection signal="OnHPChanged" from="." to="Behaviour" method="OnHPChanged"] diff --git a/scenes/templates/plant_template.tscn b/scenes/templates/plant_template.tscn index 158bd36..a259d5b 100644 --- a/scenes/templates/plant_template.tscn +++ b/scenes/templates/plant_template.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=5 format=3 uid="uid://b1hjjbdwf1rtc"] +[gd_scene load_steps=4 format=3 uid="uid://b1hjjbdwf1rtc"] [ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_324sd"] -[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_3uws4"] [ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="2_e75pf"] [ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="4_3uws4"] @@ -11,7 +10,6 @@ _player = NodePath("AnimationPlayer") _tree = NodePath("AnimationTree") [node name="Sprite2D" type="Sprite2D" parent="."] -material = ExtResource("2_3uws4") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] @@ -26,6 +24,5 @@ collision_mask = 0 [node name="FlashController" type="Node" parent="."] script = ExtResource("4_3uws4") -shaderMaterial = ExtResource("2_3uws4") [connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] From 7c3820f51c25148acc4c0319f041c7b5749437c2 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 02:44:25 +0500 Subject: [PATCH 13/19] Z order --- scenes/entities/Zombies/bucket_zombie.tscn | 49 +++++----- scenes/entities/Zombies/cone_zombie.tscn | 37 ++++---- scenes/entities/Zombies/hobo.tscn | 103 ++++++++++----------- scenes/entities/Zombies/zombie.tscn | 54 +++++------ scenes/templates/level_template.tscn | 16 +++- 5 files changed, 127 insertions(+), 132 deletions(-) diff --git a/scenes/entities/Zombies/bucket_zombie.tscn b/scenes/entities/Zombies/bucket_zombie.tscn index dce2bc7..dd6e00c 100644 --- a/scenes/entities/Zombies/bucket_zombie.tscn +++ b/scenes/entities/Zombies/bucket_zombie.tscn @@ -829,7 +829,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] position = Vector2(-6, 3) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999833, 0.999833) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -841,13 +841,13 @@ metadata/_edit_lock_ = true [node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] position = Vector2(-2, 12) -scale = Vector2(0.999832, 0.999832) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -2, 12) editor_settings/show_bone_gizmo = false [node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] position = Vector2(-2, 14) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -2, 14) auto_calculate_length_and_angle = false length = 12.0 @@ -869,7 +869,7 @@ metadata/_edit_lock_ = true [node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] position = Vector2(6, 4) -scale = Vector2(0.999835, 0.999835) +scale = Vector2(0.999836, 0.999836) rest = Transform2D(1, 0, 0, 1, 6, 4) editor_settings/show_bone_gizmo = false @@ -881,7 +881,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.999833, 0.999833) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -893,7 +893,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999831, 0.999831) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -913,9 +913,8 @@ rest = Transform2D(1, 0, 0, 1, 1, -2) editor_settings/show_bone_gizmo = false [node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] -z_index = -1 position = Vector2(-14, -23) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -927,13 +926,13 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999825, 0.999825) +scale = Vector2(0.999824, 0.999824) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false [node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 8.0 @@ -961,8 +960,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = -0.0667573 -skew = -0.000233412 +rotation = 0.140731 +skew = -0.000234008 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -977,7 +976,7 @@ metadata/_edit_lock_ = true [node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-10, -25) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999826, 0.999826) rest = Transform2D(1, 0, 0, 1, -10, -25) editor_settings/show_bone_gizmo = false @@ -999,8 +998,7 @@ offset = Vector2(-20, -24) metadata/_edit_lock_ = true [node name="Right_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-16, -8.00001) -scale = Vector2(1, 1) +position = Vector2(-16, -8) texture = SubResource("AtlasTexture_vcc72") centered = false offset = Vector2(-2, -2) @@ -1008,16 +1006,15 @@ metadata/_edit_lock_ = true [node name="Left_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-4, -9) -scale = Vector2(1, 1) texture = SubResource("AtlasTexture_kto0i") centered = false offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-2.91709, 2.79991) -rotation = -0.0466304 -scale = Vector2(0.999829, 0.999829) +position = Vector2(-3.00173, 2.99707) +rotation = 0.0136575 +scale = Vector2(0.99983, 0.99983) texture = SubResource("AtlasTexture_x5uj2") centered = false offset = Vector2(-12, -2) @@ -1034,7 +1031,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1117,16 +1114,16 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = -0.070757 -scale = Vector2(0.999999, 0.999999) +rotation = 0.132318 +scale = Vector2(0.999998, 0.999998) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] -position = Vector2(-0.99983, 12.9978) -rotation = -0.0583248 +position = Vector2(-0.999829, 12.9978) +rotation = -0.0583971 scale = Vector2(0.999655, 0.999655) texture = SubResource("AtlasTexture_vlvtp") centered = false @@ -1143,7 +1140,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false @@ -1216,7 +1213,7 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("18_tffdk") _speed = SubResource("Resource_v1iwd") -_speedControlMult = 0.0374932 +_speedControlMult = 0.997214 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("19_k2y7k") diff --git a/scenes/entities/Zombies/cone_zombie.tscn b/scenes/entities/Zombies/cone_zombie.tscn index fa20ff0..26d0608 100644 --- a/scenes/entities/Zombies/cone_zombie.tscn +++ b/scenes/entities/Zombies/cone_zombie.tscn @@ -825,7 +825,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999835, 0.999835) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -837,13 +837,13 @@ metadata/_edit_lock_ = true [node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] position = Vector2(-2, 12) -scale = Vector2(0.999833, 0.999833) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -2, 12) editor_settings/show_bone_gizmo = false [node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] position = Vector2(-2, 14) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999833, 0.999833) rest = Transform2D(1, 0, 0, 1, -2, 14) auto_calculate_length_and_angle = false length = 12.0 @@ -866,7 +866,7 @@ metadata/_edit_lock_ = true [node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(6, 4) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999835, 0.999835) rest = Transform2D(1, 0, 0, 1, 6, 4) editor_settings/show_bone_gizmo = false @@ -906,12 +906,11 @@ metadata/_edit_lock_ = true [node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(1, -2) -scale = Vector2(0.999831, 0.999831) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, 1, -2) editor_settings/show_bone_gizmo = false [node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] -z_index = -1 use_parent_material = true position = Vector2(-14, -23) scale = Vector2(0.999828, 0.999828) @@ -926,7 +925,7 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false @@ -960,8 +959,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = -0.0279659 -skew = -0.000154853 +rotation = -0.128654 +skew = -0.000155091 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -1012,9 +1011,9 @@ offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-2.68686, 2.24379) -rotation = 0.0273591 -scale = Vector2(0.999828, 0.999828) +position = Vector2(-2.84023, 2.61439) +rotation = -0.0898652 +scale = Vector2(0.999827, 0.999827) texture = SubResource("AtlasTexture_x5uj2") centered = false offset = Vector2(-12, -2) @@ -1031,7 +1030,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1092,7 +1091,7 @@ shape = SubResource("CircleShape2D_67t4t") [node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-1, -20) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -1, -20) editor_settings/show_bone_gizmo = false @@ -1114,8 +1113,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.108809 -scale = Vector2(0.999993, 0.999993) +rotation = -0.136361 +scale = Vector2(0.999995, 0.999995) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) @@ -1124,7 +1123,7 @@ metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] show_behind_parent = true position = Vector2(-0.99983, 12.9978) -rotation = -0.116983 +rotation = -0.112403 scale = Vector2(0.999658, 0.999658) texture = SubResource("AtlasTexture_vlvtp") centered = false @@ -1141,7 +1140,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999823, 0.999823) +scale = Vector2(0.999825, 0.999825) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false @@ -1202,7 +1201,7 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("18_1pso5") _speed = SubResource("Resource_b6mal") -_speedControlMult = 2.27305 +_speedControlMult = 0.706804 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("19_n3dlr") diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index 7b5400a..e9306ee 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -185,6 +185,12 @@ region = Rect2(0, 29, 35, 11) radius = 17.0 height = 48.0 +[sub_resource type="AtlasTexture" id="AtlasTexture_n380g"] +atlas = ExtResource("5_b583s") +region = Rect2(34, 38, 45, 27) + +[sub_resource type="CircleShape2D" id="CircleShape2D_vn3j1"] + [sub_resource type="AtlasTexture" id="AtlasTexture_pjhfy"] atlas = ExtResource("5_b583s") region = Rect2(80, 0, 32, 30) @@ -201,12 +207,6 @@ region = Rect2(105, 2, 3, 4) atlas = ExtResource("5_b583s") region = Rect2(38, 22, 22, 13) -[sub_resource type="AtlasTexture" id="AtlasTexture_n380g"] -atlas = ExtResource("5_b583s") -region = Rect2(34, 38, 45, 27) - -[sub_resource type="CircleShape2D" id="CircleShape2D_vn3j1"] - [sub_resource type="CircleShape2D" id="CircleShape2D_dn8ha"] [sub_resource type="AtlasTexture" id="AtlasTexture_tebih"] @@ -929,7 +929,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -970,7 +970,7 @@ metadata/_edit_lock_ = true [node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(6, 4) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999824, 0.999824) rest = Transform2D(1, 0, 0, 1, 6, 4) editor_settings/show_bone_gizmo = false @@ -982,7 +982,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -994,7 +994,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.999818, 0.999818) +scale = Vector2(0.99982, 0.99982) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -1010,15 +1010,14 @@ metadata/_edit_lock_ = true [node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(1, -2) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999825, 0.999825) rest = Transform2D(1, 0, 0, 1, 1, -2) editor_settings/show_bone_gizmo = false [node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] -z_index = -1 use_parent_material = true position = Vector2(-14, -23) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -1030,7 +1029,7 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999816, 0.999816) +scale = Vector2(0.999814, 0.999814) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false @@ -1064,7 +1063,7 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.0486026 +rotation = 0.0385608 scale = Vector2(1e-05, 1e-05) skew = -0.000476122 rest = Transform2D(1, 0, 0, 1, -9, -21) @@ -1102,7 +1101,6 @@ degradationStages = Array[Texture2D]([ExtResource("6_i6nje"), ExtResource("7_txj thresholdPercentage = Array[float]([1.0, 0.667, 0.333]) [node name="Sprite2D2" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Can"] -z_index = -1 material = ExtResource("6_vn3j1") position = Vector2(-7.4999, -27.5002) texture = SubResource("AtlasTexture_5selg") @@ -1128,6 +1126,32 @@ minTorque = -45.0 maxTorque = 45.0 Impulse = 100.0 +[node name="TrashcanLid" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" node_paths=PackedStringArray("data")] +position = Vector2(-3, 3.00001) +scale = Vector2(0.999826, 0.999826) +collision_layer = 128 +collision_mask = 64 +freeze = true +script = ExtResource("3_tu6af") +data = NodePath("../../../../../../../..") + +[node name="Trashcan_lid" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid"] +material = ExtResource("6_vn3j1") +position = Vector2(2.99822, -20.0166) +scale = Vector2(1, 1) +texture = SubResource("AtlasTexture_n380g") +offset = Vector2(-0.5, -0.5) +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid"] +position = Vector2(2.99791, -20.018) +shape = SubResource("CircleShape2D_vn3j1") + +[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid" node_paths=PackedStringArray("_observedArmor")] +script = ExtResource("12_vn3j1") +_threshold = 0.333 +_observedArmor = NodePath("../../../../../../../../../CanArmor") + [node name="Head" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] texture = SubResource("AtlasTexture_pjhfy") centered = false @@ -1152,40 +1176,13 @@ metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-3, 3) -rotation = -0.0790489 -scale = Vector2(0.999826, 0.999826) +rotation = -0.0627166 +scale = Vector2(0.999829, 0.999829) texture = SubResource("AtlasTexture_7cvmi") centered = false offset = Vector2(-14, -2) metadata/_edit_lock_ = true -[node name="TrashcanLid" type="RigidBody2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head" node_paths=PackedStringArray("data")] -position = Vector2(-3, 3) -scale = Vector2(0.999826, 0.999826) -collision_layer = 128 -collision_mask = 64 -freeze = true -script = ExtResource("3_tu6af") -data = NodePath("../../../../../../../../..") - -[node name="Trashcan_lid" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid"] -z_index = -1 -material = ExtResource("6_vn3j1") -position = Vector2(2.99822, -20.0166) -scale = Vector2(1, 1) -texture = SubResource("AtlasTexture_n380g") -offset = Vector2(-0.5, -0.5) -metadata/_edit_lock_ = true - -[node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid"] -position = Vector2(2.99791, -20.018) -shape = SubResource("CircleShape2D_vn3j1") - -[node name="Observer" type="Node" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" node_paths=PackedStringArray("_observedArmor")] -script = ExtResource("12_vn3j1") -_threshold = 0.333 -_observedArmor = NodePath("../../../../../../../../../../CanArmor") - [node name="CollisionShape2D" type="CollisionShape2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle"] position = Vector2(-4.58496, -8.21035) shape = SubResource("CircleShape2D_dn8ha") @@ -1197,7 +1194,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999826, 0.999826) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1239,11 +1236,11 @@ bone_angle = 180.0 editor_settings/show_bone_gizmo = false [node name="RemoteTransform2D" type="RemoteTransform2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid"] -remote_path = NodePath("../../HeadParticle/Head/TrashcanLid/Trashcan_lid") +remote_path = NodePath("../../HeadParticle/TrashcanLid/Trashcan_lid") [node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-1, -20) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999824, 0.999824) rest = Transform2D(1, 0, 0, 1, -1, -20) editor_settings/show_bone_gizmo = false @@ -1265,8 +1262,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.0438435 -scale = Vector2(0.999994, 0.999994) +rotation = 0.034785 +scale = Vector2(0.999997, 0.999997) texture = SubResource("AtlasTexture_auxav") centered = false offset = Vector2(-5, 0) @@ -1291,7 +1288,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999824, 0.999824) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false @@ -1412,8 +1409,8 @@ shaderMaterial = SubResource("ShaderMaterial_vn3j1") [connection signal="HasBeenKilled" from="." to="DeathHandler" method="OnKilled"] [connection signal="OnDamaged" from="." to="HitPlayer" method="Play"] [connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] -[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid" method="FallOff"] -[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid/RemoteTransform2D" method="queue_free"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid" method="FallOff"] +[connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/TrashcanLid/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/TrashcanLid/RemoteTransform2D" method="queue_free"] [connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle" method="FallOff"] [connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/Jaw/RemoteTransform2D" method="queue_free"] [connection signal="ThresholdReached" from="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Observer" to="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/RightEye/RemoteTransform2D" method="queue_free"] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index 687ee9d..7d18c53 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -815,7 +815,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999835, 0.999835) +scale = Vector2(0.999834, 0.999834) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -827,13 +827,13 @@ metadata/_edit_lock_ = true [node name="RightLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg"] position = Vector2(-2, 12) -scale = Vector2(0.999835, 0.999835) +scale = Vector2(0.999832, 0.999832) rest = Transform2D(1, 0, 0, 1, -2, 12) editor_settings/show_bone_gizmo = false [node name="RightFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/RightUpperLeg/RightLowerLeg"] position = Vector2(-2, 14) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999831, 0.999831) rest = Transform2D(1, 0, 0, 1, -2, 14) auto_calculate_length_and_angle = false length = 12.0 @@ -868,7 +868,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.999836, 0.999836) +scale = Vector2(0.999832, 0.999832) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -880,7 +880,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -896,15 +896,14 @@ metadata/_edit_lock_ = true [node name="Body" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(1, -2) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, 1, -2) editor_settings/show_bone_gizmo = false [node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] -z_index = -1 use_parent_material = true position = Vector2(-14, -23) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -916,13 +915,13 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.99983, 0.99983) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false [node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 8.0 @@ -950,8 +949,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.143865 -skew = -0.000476241 +rotation = -0.0127525 +skew = -0.000478387 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -988,25 +987,23 @@ offset = Vector2(-20, -24) metadata/_edit_lock_ = true [node name="Right_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-16, -8) -scale = Vector2(1, 1) +position = Vector2(-16, -8.00001) texture = SubResource("AtlasTexture_vcc72") centered = false offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Left_Eye" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-4, -9) -scale = Vector2(1, 1) +position = Vector2(-4, -9.00001) texture = SubResource("AtlasTexture_kto0i") centered = false offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-2.95686, 2.88837) -rotation = 0.0182787 -scale = Vector2(0.999831, 0.999831) +position = Vector2(-2.98416, 2.96178) +rotation = -0.0089077 +scale = Vector2(0.999826, 0.999826) texture = SubResource("AtlasTexture_x5uj2") centered = false offset = Vector2(-12, -2) @@ -1023,7 +1020,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999831, 0.999831) +scale = Vector2(0.999826, 0.999826) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1057,7 +1054,7 @@ remote_path = NodePath("../../HeadParticle/Head/Left_Eye") [node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-1, -20) -scale = Vector2(0.999831, 0.999831) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -1, -20) editor_settings/show_bone_gizmo = false @@ -1079,8 +1076,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.154659 -scale = Vector2(0.999998, 0.999998) +rotation = -0.0135165 +scale = Vector2(0.999999, 0.999999) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) @@ -1088,9 +1085,9 @@ metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] show_behind_parent = true -position = Vector2(-0.999829, 12.9978) -rotation = -0.0781564 -scale = Vector2(0.999658, 0.999658) +position = Vector2(-0.99983, 12.9978) +rotation = -0.0111417 +scale = Vector2(0.99966, 0.99966) texture = SubResource("AtlasTexture_vlvtp") centered = false offset = Vector2(-4, -1) @@ -1106,13 +1103,13 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false [node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999829, 0.999829) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 6.0 @@ -1167,7 +1164,6 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("4_u5syx") _speed = SubResource("Resource_ckb7n") -_speedControlMult = 1.64254 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("12_he8da") diff --git a/scenes/templates/level_template.tscn b/scenes/templates/level_template.tscn index cc8741b..60fa513 100644 --- a/scenes/templates/level_template.tscn +++ b/scenes/templates/level_template.tscn @@ -622,23 +622,27 @@ Structures = NodePath("Structures") Particles = NodePath("Particles") [node name="Zombies" type="Node2D" parent="Pools"] -z_index = 3 +z_index = 20 +z_as_relative = false y_sort_enabled = true [node name="Plants" type="Node2D" parent="Pools"] -z_index = 1 +z_as_relative = false y_sort_enabled = true [node name="Projectiles" type="Node2D" parent="Pools"] -z_index = 4 +z_index = 30 +z_as_relative = false y_sort_enabled = true [node name="Structures" type="Node2D" parent="Pools"] -z_index = 2 +z_index = 10 +z_as_relative = false y_sort_enabled = true [node name="Particles" type="Node2D" parent="Pools"] -z_index = 5 +z_index = 40 +z_as_relative = false [node name="Lines" type="Node2D" parent="."] script = ExtResource("3_4bmqp") @@ -688,6 +692,8 @@ layer = -2 follow_viewport_enabled = true [node name="Background" type="Sprite2D" parent="Background"] +z_index = -100 +z_as_relative = false position = Vector2(500, 200) texture = ExtResource("4_y72yf") metadata/_edit_lock_ = true From 594b9878f2fb5fac9d7ff98046ce0fe49c19c522 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 03:52:34 +0500 Subject: [PATCH 14/19] aloe effect --- scenes/entities/Zombies/bucket_zombie.tscn | 38 ++--- scenes/entities/Zombies/hobo.tscn | 24 +-- scenes/particles/aloe_effect.tscn | 155 ++++++++++++++++++ .../plants/behaviours/AloeBehaviour.cs | 16 +- .../gui/choose_your_seeds/CYSFocusSetup.cs | 36 +--- scripts/particles/MixedParticles.cs | 12 ++ scripts/particles/MixedParticles.cs.uid | 1 + 7 files changed, 212 insertions(+), 70 deletions(-) create mode 100644 scenes/particles/aloe_effect.tscn create mode 100644 scripts/particles/MixedParticles.cs create mode 100644 scripts/particles/MixedParticles.cs.uid diff --git a/scenes/entities/Zombies/bucket_zombie.tscn b/scenes/entities/Zombies/bucket_zombie.tscn index dd6e00c..e8d6372 100644 --- a/scenes/entities/Zombies/bucket_zombie.tscn +++ b/scenes/entities/Zombies/bucket_zombie.tscn @@ -869,7 +869,7 @@ metadata/_edit_lock_ = true [node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] position = Vector2(6, 4) -scale = Vector2(0.999836, 0.999836) +scale = Vector2(0.999835, 0.999835) rest = Transform2D(1, 0, 0, 1, 6, 4) editor_settings/show_bone_gizmo = false @@ -881,7 +881,7 @@ metadata/_edit_lock_ = true [node name="LeftLowerLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg"] position = Vector2(-1, 13) -scale = Vector2(0.999834, 0.999834) +scale = Vector2(0.999838, 0.999838) rest = Transform2D(1, 0, 0, 1, -1, 13) editor_settings/show_bone_gizmo = false @@ -893,7 +893,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.999831, 0.999831) +scale = Vector2(0.999832, 0.999832) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -914,7 +914,7 @@ editor_settings/show_bone_gizmo = false [node name="RightUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-14, -23) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -14, -23) editor_settings/show_bone_gizmo = false @@ -926,13 +926,13 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999824, 0.999824) +scale = Vector2(0.999822, 0.999822) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false [node name="RightHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm/RightLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 8.0 @@ -960,8 +960,8 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.140731 -skew = -0.000234008 +rotation = -0.0699613 +skew = -0.000234127 rest = Transform2D(1, 0, 0, 1, -9, -21) auto_calculate_length_and_angle = false length = 24.0 @@ -976,7 +976,7 @@ metadata/_edit_lock_ = true [node name="Head" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-10, -25) -scale = Vector2(0.999826, 0.999826) +scale = Vector2(0.999832, 0.999832) rest = Transform2D(1, 0, 0, 1, -10, -25) editor_settings/show_bone_gizmo = false @@ -1012,8 +1012,8 @@ offset = Vector2(-2, -2) metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] -position = Vector2(-3.00173, 2.99707) -rotation = 0.0136575 +position = Vector2(-2.69782, 2.27068) +rotation = -0.00688613 scale = Vector2(0.99983, 0.99983) texture = SubResource("AtlasTexture_x5uj2") centered = false @@ -1092,7 +1092,7 @@ shape = SubResource("CircleShape2D_67t4t") [node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-1, -20) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.999825, 0.999825) rest = Transform2D(1, 0, 0, 1, -1, -20) editor_settings/show_bone_gizmo = false @@ -1114,8 +1114,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.132318 -scale = Vector2(0.999998, 0.999998) +rotation = 0.0380849 +scale = Vector2(1, 1) texture = SubResource("AtlasTexture_auqeq") centered = false offset = Vector2(-5, 0) @@ -1123,8 +1123,8 @@ metadata/_edit_lock_ = true [node name="Left_Hand" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile/Left_Lower_Arm"] position = Vector2(-0.999829, 12.9978) -rotation = -0.0583971 -scale = Vector2(0.999655, 0.999655) +rotation = -0.126472 +scale = Vector2(0.999657, 0.999657) texture = SubResource("AtlasTexture_vlvtp") centered = false offset = Vector2(-4, -1) @@ -1140,13 +1140,13 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999828, 0.999828) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false [node name="LeftHand" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/LeftLowerArm"] position = Vector2(-1, 13) -scale = Vector2(0.999825, 0.999825) +scale = Vector2(0.999827, 0.999827) rest = Transform2D(1, 0, 0, 1, -1, 13) auto_calculate_length_and_angle = false length = 6.0 @@ -1213,7 +1213,7 @@ entity = NodePath("..") [node name="Mover" type="Node" parent="."] script = ExtResource("18_tffdk") _speed = SubResource("Resource_v1iwd") -_speedControlMult = 0.997214 +_speedControlMult = 1.94682 [node name="HitPlayer" type="Node" parent="."] script = ExtResource("19_k2y7k") diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index e9306ee..58a43f1 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -929,7 +929,7 @@ metadata/_edit_lock_ = true [node name="RightUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(-6, 3) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.99983, 0.99983) rest = Transform2D(1, 0, 0, 1, -6, 3) editor_settings/show_bone_gizmo = false @@ -970,7 +970,7 @@ metadata/_edit_lock_ = true [node name="LeftUpperLeg" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt"] use_parent_material = true position = Vector2(6, 4) -scale = Vector2(0.999824, 0.999824) +scale = Vector2(0.999826, 0.999826) rest = Transform2D(1, 0, 0, 1, 6, 4) editor_settings/show_bone_gizmo = false @@ -994,7 +994,7 @@ metadata/_edit_lock_ = true [node name="LeftFoot" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/LeftUpperLeg/LeftLowerLeg"] position = Vector2(6, 10) -scale = Vector2(0.99982, 0.99982) +scale = Vector2(0.999821, 0.999821) rest = Transform2D(1, 0, 0, 1, 6, 10) auto_calculate_length_and_angle = false length = 12.0 @@ -1029,7 +1029,7 @@ metadata/_edit_lock_ = true [node name="RightLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/RightUpperArm"] position = Vector2(-2, 15) -scale = Vector2(0.999814, 0.999814) +scale = Vector2(0.999816, 0.999816) rest = Transform2D(1, 0, 0, 1, -2, 15) editor_settings/show_bone_gizmo = false @@ -1063,7 +1063,7 @@ metadata/_edit_lock_ = true [node name="Tie" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-9, -21) -rotation = 0.0385608 +rotation = 0.00541537 scale = Vector2(1e-05, 1e-05) skew = -0.000476122 rest = Transform2D(1, 0, 0, 1, -9, -21) @@ -1176,8 +1176,8 @@ metadata/_edit_lock_ = true [node name="Jaw" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head/HeadParticle/Head"] position = Vector2(-3, 3) -rotation = -0.0627166 -scale = Vector2(0.999829, 0.999829) +rotation = -0.00880774 +scale = Vector2(0.999828, 0.999828) texture = SubResource("AtlasTexture_7cvmi") centered = false offset = Vector2(-14, -2) @@ -1194,7 +1194,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="Jaw" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/Head"] position = Vector2(-3, 3) -scale = Vector2(0.999829, 0.999829) +scale = Vector2(0.999828, 0.999828) rest = Transform2D(1, 0, 0, 1, -3, 3) auto_calculate_length_and_angle = false length = 11.0 @@ -1240,7 +1240,7 @@ remote_path = NodePath("../../HeadParticle/TrashcanLid/Trashcan_lid") [node name="LeftUpperArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body"] position = Vector2(-1, -20) -scale = Vector2(0.999824, 0.999824) +scale = Vector2(0.999826, 0.999826) rest = Transform2D(1, 0, 0, 1, -1, -20) editor_settings/show_bone_gizmo = false @@ -1262,8 +1262,8 @@ minTorque = -45.0 maxTorque = 45.0 [node name="Left_Lower_Arm" type="Sprite2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm/HandProjectile"] -rotation = 0.034785 -scale = Vector2(0.999997, 0.999997) +rotation = 0.0048851 +scale = Vector2(0.999996, 0.999996) texture = SubResource("AtlasTexture_auxav") centered = false offset = Vector2(-5, 0) @@ -1288,7 +1288,7 @@ _observedEntity = NodePath("../../../../../../../..") [node name="LeftLowerArm" type="Bone2D" parent="CanvasGroup/basic_zombie_walk/Zombie/Butt/Body/LeftUpperArm"] position = Vector2(-2, 14) -scale = Vector2(0.999827, 0.999827) +scale = Vector2(0.999826, 0.999826) rest = Transform2D(1, 0, 0, 1, -2, 14) editor_settings/show_bone_gizmo = false diff --git a/scenes/particles/aloe_effect.tscn b/scenes/particles/aloe_effect.tscn new file mode 100644 index 0000000..591a1ff --- /dev/null +++ b/scenes/particles/aloe_effect.tscn @@ -0,0 +1,155 @@ +[gd_scene load_steps=14 format=3 uid="uid://b3na62o5pu1gt"] + +[ext_resource type="Texture2D" uid="uid://k60ylegy845j" path="res://assets/sprites/atlases/tile_animations.png" id="1_4r1tv"] +[ext_resource type="Script" uid="uid://5ve2i0iu5oxr" path="res://scripts/particles/MixedParticles.cs" id="1_ftbe0"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_mhmlv"] + +[sub_resource type="Animation" id="Animation_mhmlv"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D/GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} + +[sub_resource type="Animation" id="Animation_4r1tv"] +resource_name = "main" +length = 1.33334 +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.728266, 0.916667), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 1, 0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D/GPUParticles2D:emitting") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.333333), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Sprite2D:self_modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0.916667, 1.33333), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ftbe0"] +_data = { +&"RESET": SubResource("Animation_mhmlv"), +&"main": SubResource("Animation_4r1tv") +} + +[sub_resource type="AtlasTexture" id="AtlasTexture_mhmlv"] +atlas = ExtResource("1_4r1tv") +region = Rect2(150, 0, 150, 50) +filter_clip = true + +[sub_resource type="AtlasTexture" id="AtlasTexture_ftbe0"] +atlas = ExtResource("2_mhmlv") +region = Rect2(79, 102, 15, 15) + +[sub_resource type="Curve" id="Curve_ftbe0"] +_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1e-05, 0), 0.0, 0.0, 0, 0, Vector2(0.152284, 1), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_100so"] +curve = SubResource("Curve_ftbe0") + +[sub_resource type="Curve" id="Curve_q4bj6"] +_data = [Vector2(0, 1), 0.0, -1.0, 0, 1, Vector2(1, 0), -1.0, 0.0, 1, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_dajq0"] +curve = SubResource("Curve_q4bj6") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_100so"] +particle_flag_disable_z = true +emission_shape = 1 +emission_sphere_radius = 20.0 +direction = Vector3(0, -1, 0) +spread = 0.0 +flatness = 1.0 +initial_velocity_min = 115.79 +initial_velocity_max = 115.79 +scale_curve = SubResource("CurveTexture_dajq0") +alpha_curve = SubResource("CurveTexture_100so") + +[node name="AloeEffect" type="Node2D" node_paths=PackedStringArray("emitter")] +script = ExtResource("1_ftbe0") +emitter = NodePath("Sprite2D/GPUParticles2D") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_ftbe0") +} +autoplay = "main" + +[node name="Sprite2D" type="Sprite2D" parent="."] +z_index = -1 +z_as_relative = false +position = Vector2(0, 22) +texture = SubResource("AtlasTexture_mhmlv") +offset = Vector2(0, -13.1) +hframes = 3 + +[node name="GPUParticles2D" type="GPUParticles2D" parent="Sprite2D"] +z_index = 50 +z_as_relative = false +position = Vector2(0, -1) +emitting = false +texture = SubResource("AtlasTexture_ftbe0") +one_shot = true +explosiveness = 0.25 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_100so") diff --git a/scripts/entities/plants/behaviours/AloeBehaviour.cs b/scripts/entities/plants/behaviours/AloeBehaviour.cs index 420abf6..9286900 100644 --- a/scripts/entities/plants/behaviours/AloeBehaviour.cs +++ b/scripts/entities/plants/behaviours/AloeBehaviour.cs @@ -8,12 +8,13 @@ public partial class AloeBehaviour : BaseBehaviour [Export] private float _hpTreshold = 0.25f; private Timer _timer; private bool _charge = true; + private PackedScene particlesPacked = ResourceLoader.Load("uid://b3na62o5pu1gt"); public override void _Ready() - { + { base._Ready(); - _timer = GetNode("Timer"); - } + _timer = GetNode("Timer"); + } public override void _Process(double delta) { @@ -34,9 +35,12 @@ public partial class AloeBehaviour : BaseBehaviour public void Heal() { var checkPos = GetParent().GlobalPosition + Vector2.Right * FieldParams.TileWidth; - if (PoolContainer.Instance.TryGetEntity(checkPos, out RuntimePlantData plantData)) - { - plantData.Heal(300, GetParent()); + if (PoolContainer.Instance.TryGetEntity(checkPos, out RuntimePlantData plantData)) + { + plantData.Heal(300, GetParent()); + var particles = particlesPacked.Instantiate(); + PoolContainer.Instance.Particles.AddChild(particles); + particles.GlobalPosition = plantData.GlobalPosition; } } diff --git a/scripts/gui/choose_your_seeds/CYSFocusSetup.cs b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs index dd18203..8df6ef9 100644 --- a/scripts/gui/choose_your_seeds/CYSFocusSetup.cs +++ b/scripts/gui/choose_your_seeds/CYSFocusSetup.cs @@ -15,48 +15,18 @@ public partial class CYSFocusSetup : Node Control control = grid.GetChild(i); - // If it isn't leftmost element - if (x != 0) - { - control.FocusNeighborLeft = control.GetPathTo(grid.GetChild(PositionToIndex(x - 1, y))); - } - // If it isn't upmost element - if (y != 0) - { - control.FocusNeighborTop = control.GetPathTo(grid.GetChild(PositionToIndex(x, y - 1))); - } - else + if (y == 0) { control.FocusNeighborTop = control.GetPathTo(textContainer); } - // If it isn't rightmost element - if (x != grid.Columns - 1 && i != grid.GetChildCount()) + if (x == grid.Columns - 1) { - control.FocusNeighborRight = control.GetPathTo(grid.GetChild(PositionToIndex(x + 1, y))); - } - else - { - if (y != 0) - { - control.FocusNeighborRight = control.GetPathTo(grid.GetChild(PositionToIndex(x + 1, y - 1))); - } - else - { - control.FocusNeighborRight = control.GetPathTo(button); - } - } - if (PositionToIndex(x, y + 1) < grid.GetChildCount()) - { - control.FocusNeighborBottom = control.GetPathTo(grid.GetChild(PositionToIndex(x, y + 1))); + control.FocusNeighborRight = control.GetPathTo(button); } } QueueFree(); } - private int PositionToIndex(int x, int y) - { - return y * grid.Columns + x; - } } diff --git a/scripts/particles/MixedParticles.cs b/scripts/particles/MixedParticles.cs new file mode 100644 index 0000000..f487357 --- /dev/null +++ b/scripts/particles/MixedParticles.cs @@ -0,0 +1,12 @@ +using Godot; + +namespace Newlon.Particles; + +public partial class MixedParticles : Node2D +{ + [Export] private GpuParticles2D emitter; + public override void _Ready() + { + emitter.Finished += ()=> { QueueFree(); }; + } +} diff --git a/scripts/particles/MixedParticles.cs.uid b/scripts/particles/MixedParticles.cs.uid new file mode 100644 index 0000000..22eaca3 --- /dev/null +++ b/scripts/particles/MixedParticles.cs.uid @@ -0,0 +1 @@ +uid://5ve2i0iu5oxr From 04cb7153951e16702d69d9136ef5783bc252ff68 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 05:06:25 +0500 Subject: [PATCH 15/19] entity field rework, now it is fuzzy and good :+1: --- scripts/entities/plants/RuntimePlantData.cs | 2 +- scripts/gui/ShovelButton.cs | 2 +- scripts/level/InitialPackedSceneSpawner.cs | 6 +-- scripts/level/PlantField.cs | 4 +- scripts/level/PoolContainer.cs | 52 ++++++++++----------- scripts/systems/static-data/FieldParams.cs | 2 + 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/scripts/entities/plants/RuntimePlantData.cs b/scripts/entities/plants/RuntimePlantData.cs index 82d0a01..a6ddd56 100644 --- a/scripts/entities/plants/RuntimePlantData.cs +++ b/scripts/entities/plants/RuntimePlantData.cs @@ -20,7 +20,7 @@ public partial class RuntimePlantData : Entity } public override void Kill() { - PoolContainer.Instance.EntityField[Resource.Layer].Remove(GlobalPosition); + PoolContainer.Instance.RemoveEntity(GlobalPosition, Resource.Layer); QueueFree(); } } diff --git a/scripts/gui/ShovelButton.cs b/scripts/gui/ShovelButton.cs index c1ba12e..4853b35 100644 --- a/scripts/gui/ShovelButton.cs +++ b/scripts/gui/ShovelButton.cs @@ -96,7 +96,7 @@ public partial class ShovelButton : TextureButton var checkedPosition = (position / FieldParams.Tile).Ceil() * FieldParams.Tile - new Vector2(20, 14); for (int i = FieldParams.LayersCount - 1; i >= 0; i--) { - if (PoolContainer.Instance.EntityField[i].TryGetValue(checkedPosition, out var entity) && entity is RuntimePlantData plantData) + if (PoolContainer.Instance.TryGetEntity(checkedPosition, out RuntimePlantData plantData,i)) { return plantData; } diff --git a/scripts/level/InitialPackedSceneSpawner.cs b/scripts/level/InitialPackedSceneSpawner.cs index 459ddce..f5e9a64 100644 --- a/scripts/level/InitialPackedSceneSpawner.cs +++ b/scripts/level/InitialPackedSceneSpawner.cs @@ -33,20 +33,20 @@ public partial class InitialPackedSceneSpawner : Node if (entity is RuntimeZombieData) { PoolContainer.Instance.Zombies.AddChild(node); - node.GlobalPosition = position + new Vector2(0,0.5f*FieldParams.TileHeight); + node.GlobalPosition = position + new Vector2(0, 0.5f * FieldParams.TileHeight); } else if (entity is RuntimePlantData plant) { PoolContainer.Instance.Plants.AddChild(plant); node.GlobalPosition = position; plant.Resource = GameRegistry.GetEntityByName(plant.Resource.GetInternalID()) as PlantResource; - PoolContainer.Instance.EntityField[plant.Resource.Layer].Add(plant.GlobalPosition, plant); + PoolContainer.Instance.TrySetEntity(plant.GlobalPosition, plant, plant.Resource.Layer); } else { PoolContainer.Instance.Structures.AddChild(entity); node.GlobalPosition = position; - PoolContainer.Instance.EntityField[1].Add(entity.GlobalPosition, entity); + PoolContainer.Instance.TrySetEntity(entity.GlobalPosition,entity,1); } } else diff --git a/scripts/level/PlantField.cs b/scripts/level/PlantField.cs index d54a11b..aac1a4b 100644 --- a/scripts/level/PlantField.cs +++ b/scripts/level/PlantField.cs @@ -59,7 +59,7 @@ public partial class PlantField : Node2D bool canPlace = _resource != null && inBoundary - && PoolContainer.Instance.EntityField[_resource.Layer].ContainsKey(expected_pos) == false + && PoolContainer.Instance.IsPositionVacant(expected_pos,_resource.Layer) && RuntimeLevelData.Instance.CheckSpendSun((int)_resource.Cost); // Setting visuals @@ -96,7 +96,7 @@ public partial class PlantField : Node2D plant.GlobalPosition = (_plantSetter.GlobalPosition / FieldParams.Tile).Ceil() * FieldParams.Tile - new Vector2(20, 14); plant.Resource = (PlantResource)_resource; - PoolContainer.Instance.EntityField[_resource.Layer].Add(plant.GlobalPosition, plant); + PoolContainer.Instance.TrySetEntity(plant.GlobalPosition,plant,_resource.Layer); RuntimeLevelData.Instance.SpendSun((int)_resource.Cost); diff --git a/scripts/level/PoolContainer.cs b/scripts/level/PoolContainer.cs index 4be8269..156d47e 100644 --- a/scripts/level/PoolContainer.cs +++ b/scripts/level/PoolContainer.cs @@ -24,39 +24,39 @@ public partial class PoolContainer : Node2D public static PoolContainer Instance { get; private set; } - public Dictionary[] EntityField = { new(), new(), new() }; + //public Dictionary[] EntityField = { new(), new(), new() }; + private readonly Entity[,] EntityField = new Entity[3,FieldParams.ColumnsCount * FieldParams.RowsCount]; public override void _EnterTree() { Instance = this; } - public bool TryGetEntity(Vector2 key, out Entity result, int layer = 1) + public bool TryGetEntity(Vector2 positionVector, out T result, int layer = 1) where T : Entity { - if (EntityField[layer].ContainsKey(key)) - { - result = EntityField[layer][key]; - } - else - { - result = null; - } - return EntityField[layer].ContainsKey(key) - && EntityField[layer][key] != null; - } - - public bool TryGetEntity(Vector2 key, out T result, int layer = 1) where T : class - { - if (EntityField[layer].ContainsKey(key)) - { - result = EntityField[layer][key] as T; - } - else - { - result = null; - } - return EntityField[layer].ContainsKey(key) - && EntityField[layer][key] != null + var position = VectorToIndex(positionVector); + result = EntityField[layer, position] as T; + return EntityField[layer,position] != null && result != null; } + public bool TrySetEntity(Vector2 positionVector, Entity whatToSet, int layer = 1) + { + var position = VectorToIndex(positionVector); + if (IsPositionVacant(positionVector, layer) == false) return false; + EntityField[layer, position] = whatToSet; + return true; + } + public bool IsPositionVacant(Vector2 positionVector, int layer = 1) + { + return EntityField[layer, VectorToIndex(positionVector)] == null; + } + public void RemoveEntity(Vector2 positionVector, int layer = 1) + { + EntityField[layer, VectorToIndex(positionVector)] = null; + } + public static int VectorToIndex(Vector2 vector) + { + var intedVec = (vector - FieldParams.LeftFieldBoundary) / FieldParams.Tile; + return (int)intedVec.X + (int)intedVec.Y * FieldParams.ColumnsCount; + } public void SpawnParticles(PackedScene particles, Vector2 position, float rotation = 0) { diff --git a/scripts/systems/static-data/FieldParams.cs b/scripts/systems/static-data/FieldParams.cs index 4eca66e..e3f0d26 100644 --- a/scripts/systems/static-data/FieldParams.cs +++ b/scripts/systems/static-data/FieldParams.cs @@ -7,6 +7,8 @@ public class FieldParams public const int TileWidth = 50; public const int TileHeight = 60; public const int LayersCount = 3; + public const int ColumnsCount = 9; + public const int RowsCount = 5; public static Vector2I LeftFieldBoundary = new(305, 76); public static Vector2I RightFieldBoundary = new(755, 376); public static readonly Vector2 Tile = new(TileWidth, TileHeight); From 9f7919b1df9e947bda8cef14254213969e1b9f1c Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 05:27:20 +0500 Subject: [PATCH 16/19] repeater and compound projectile --- assets/plants/Repeater.tres | 22 +++ scenes/entities/plants/cucumber.tscn | 2 +- scenes/entities/plants/repeater.tscn | 149 ++++++++++++++++++ scenes/projectiles/cucumber_projectile.tscn | 35 ++-- .../cucumber_projectile_compound.tscn | 13 ++ .../projectiles/cucumber_projectile_part.tscn | 23 --- scenes/projectiles/repeater_projectile.tscn | 10 ++ scripts/projectiles/CompoundProjectile.cs | 22 +++ scripts/projectiles/CompoundProjectile.cs.uid | 1 + 9 files changed, 235 insertions(+), 42 deletions(-) create mode 100644 assets/plants/Repeater.tres create mode 100644 scenes/entities/plants/repeater.tscn create mode 100644 scenes/projectiles/cucumber_projectile_compound.tscn delete mode 100644 scenes/projectiles/cucumber_projectile_part.tscn create mode 100644 scenes/projectiles/repeater_projectile.tscn create mode 100644 scripts/projectiles/CompoundProjectile.cs create mode 100644 scripts/projectiles/CompoundProjectile.cs.uid diff --git a/assets/plants/Repeater.tres b/assets/plants/Repeater.tres new file mode 100644 index 0000000..ac232f3 --- /dev/null +++ b/assets/plants/Repeater.tres @@ -0,0 +1,22 @@ +[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://b4r1687hg0rf5"] + +[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_6km43"] +[ext_resource type="PackedScene" uid="uid://bb4ya5qx224ca" path="res://scenes/entities/plants/repeater.tscn" id="2_6km43"] +[ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_e606l"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_qnsfo"] +atlas = ExtResource("1_6km43") +region = Rect2(604, 241, 45, 51) + +[resource] +script = ExtResource("3_e606l") +Layer = 1 +DontRegister = false +NameKey = "repeater" +DescriptionKey = "repeater_desc" +Cost = 175.0 +Scene = ExtResource("2_6km43") +ReloadTime = 5.0 +ReloadProgress = 0.0 +Preview = SubResource("AtlasTexture_qnsfo") +Order = 12 diff --git a/scenes/entities/plants/cucumber.tscn b/scenes/entities/plants/cucumber.tscn index 1b65733..3d8d930 100644 --- a/scenes/entities/plants/cucumber.tscn +++ b/scenes/entities/plants/cucumber.tscn @@ -6,7 +6,7 @@ [ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="3_d45iq"] [ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="3_q31qc"] [ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/entities/plants/Shooter.cs" id="4_sckvu"] -[ext_resource type="PackedScene" uid="uid://c1ig40gtdcb60" path="res://scenes/projectiles/cucumber_projectile.tscn" id="5_sckvu"] +[ext_resource type="PackedScene" uid="uid://c1ig40gtdcb60" path="res://scenes/projectiles/cucumber_projectile_compound.tscn" id="5_sckvu"] [ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="6_xwpd6"] [ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="7_q31qc"] [ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="9_a66ro"] diff --git a/scenes/entities/plants/repeater.tscn b/scenes/entities/plants/repeater.tscn new file mode 100644 index 0000000..7a5fba9 --- /dev/null +++ b/scenes/entities/plants/repeater.tscn @@ -0,0 +1,149 @@ +[gd_scene load_steps=27 format=3 uid="uid://bb4ya5qx224ca"] + +[ext_resource type="Script" uid="uid://dli2i6albvugt" path="res://scripts/entities/plants/RuntimePlantData.cs" id="1_22an6"] +[ext_resource type="Material" uid="uid://cn7ac4meka1hc" path="res://assets/GenericFlashMaterial.tres" id="2_tut6f"] +[ext_resource type="Texture2D" uid="uid://cksryh4w5dbbx" path="res://assets/sprites/atlases/plants/peashooter.png" id="3_8aoci"] +[ext_resource type="AnimationLibrary" uid="uid://bv1dl1g4dmbho" path="res://assets/animations/plants/peashooter.res" id="4_rdf0i"] +[ext_resource type="Script" uid="uid://dwlwi42smgxkb" path="res://scripts/TimeScalableAnimationTree.cs" id="5_dwhke"] +[ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/entities/plants/Shooter.cs" id="6_f5jji"] +[ext_resource type="PackedScene" uid="uid://b45wmmcie6yeg" path="res://scenes/projectiles/repeater_projectile.tscn" id="7_22an6"] +[ext_resource type="Script" uid="uid://c4jy0cnbnx33h" path="res://scripts/TimeScalableTimer.cs" id="8_w0eom"] +[ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/entities/plants/behaviours/PeashooterBehaviour.cs" id="9_cqtdb"] +[ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/entities/plants/Eyesight.cs" id="10_bi2sw"] +[ext_resource type="Script" uid="uid://hccb0aee0x0o" path="res://scripts/entities/plants/PlantEyesightLimiter.cs" id="11_4nqum"] +[ext_resource type="Script" uid="uid://c36bj8u7jghc7" path="res://scripts/audio/ChannelPlayer.cs" id="12_7n1bh"] +[ext_resource type="AudioStream" uid="uid://dsv81mvrdg3w3" path="res://assets/audio/sfx/throw_generic.tres" id="13_hxb23"] +[ext_resource type="Script" uid="uid://30pbgasu64aw" path="res://scripts/entities/FlashShaderController.cs" id="14_aq7hn"] + +[sub_resource type="Animation" id="Animation_a2y0j"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ipp6b"] +_data = { +&"RESET": SubResource("Animation_a2y0j") +} + +[sub_resource type="AnimationNodeTimeScale" id="AnimationNodeTimeScale_mbbd7"] + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_34v85"] +animation = &"peashooter/idle" + +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_u4o2k"] +animation = &"peashooter/shoot" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_70n3m"] +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_2lwpg"] +advance_mode = 2 +advance_condition = &"ready" + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_k61yr"] +switch_mode = 2 +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_13o7y"] +states/peashooter_idle/node = SubResource("AnimationNodeAnimation_34v85") +states/peashooter_idle/position = Vector2(420, 92) +states/peashooter_shoot/node = SubResource("AnimationNodeAnimation_u4o2k") +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="AnimationNodeBlendTree" id="AnimationNodeBlendTree_q58jr"] +graph_offset = Vector2(-518.8, 27.8) +nodes/TimeScale/node = SubResource("AnimationNodeTimeScale_mbbd7") +nodes/TimeScale/position = Vector2(0, 120) +nodes/Tree/node = SubResource("AnimationNodeStateMachine_13o7y") +nodes/Tree/position = Vector2(-300, 120) +node_connections = [&"TimeScale", 0, &"Tree", &"output", 0, &"TimeScale"] + +[sub_resource type="SegmentShape2D" id="SegmentShape2D_8iovl"] +resource_local_to_scene = true + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r7xnh"] +size = Vector2(20, 44) + +[node name="Repeater" type="Node2D" node_paths=PackedStringArray("_player", "_tree")] +script = ExtResource("1_22an6") +MaxHP = 30.0 +_player = NodePath("AnimationPlayer") +_tree = NodePath("AnimationTree") + +[node name="Sprite2D" type="Sprite2D" parent="."] +material = ExtResource("2_tut6f") +texture = ExtResource("3_8aoci") +hframes = 10 +vframes = 2 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_ipp6b"), +&"peashooter": ExtResource("4_rdf0i") +} +autoplay = "peashooter/idle" + +[node name="AnimationTree" type="AnimationTree" parent="." node_paths=PackedStringArray("entity")] +tree_root = SubResource("AnimationNodeBlendTree_q58jr") +anim_player = NodePath("../AnimationPlayer") +parameters/TimeScale/scale = 1.0 +parameters/Tree/conditions/ready = false +script = ExtResource("5_dwhke") +entity = NodePath("..") + +[node name="Shooter" type="Marker2D" parent="." node_paths=PackedStringArray("_timer")] +position = Vector2(12, -4) +script = ExtResource("6_f5jji") +_projectile = ExtResource("7_22an6") +_timer = NodePath("FireTimer") + +[node name="FireTimer" type="Timer" parent="Shooter" node_paths=PackedStringArray("entity")] +wait_time = 1.5 +one_shot = true +script = ExtResource("8_w0eom") +entity = NodePath("../..") + +[node name="Behaviour" type="Node" parent="." node_paths=PackedStringArray("_shootTimer", "_sight")] +script = ExtResource("9_cqtdb") +_shootTimer = NodePath("../Shooter/FireTimer") +_sight = NodePath("../Eysight") + +[node name="Eysight" type="Area2D" parent="."] +collision_layer = 4 +collision_mask = 8 +script = ExtResource("10_bi2sw") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Eysight"] +shape = SubResource("SegmentShape2D_8iovl") +script = ExtResource("11_4nqum") + +[node name="Hitbox" type="Area2D" parent="."] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] +position = Vector2(0, 5) +shape = SubResource("RectangleShape2D_r7xnh") + +[node name="ChannelPlayer" type="Node" parent="."] +script = ExtResource("12_7n1bh") +audioStream = ExtResource("13_hxb23") +channel = "pea_shoot" +metadata/_custom_type_script = "uid://c36bj8u7jghc7" + +[node name="FlashController" type="Node" parent="."] +script = ExtResource("14_aq7hn") +shaderMaterial = ExtResource("2_tut6f") + +[connection signal="OnDamaged" from="." to="FlashController" method="DamageFlash"] diff --git a/scenes/projectiles/cucumber_projectile.tscn b/scenes/projectiles/cucumber_projectile.tscn index b314338..e3e56af 100644 --- a/scenes/projectiles/cucumber_projectile.tscn +++ b/scenes/projectiles/cucumber_projectile.tscn @@ -1,24 +1,23 @@ -[gd_scene load_steps=3 format=3 uid="uid://c1ig40gtdcb60"] +[gd_scene load_steps=5 format=3 uid="uid://pf8sq0bk3epn"] -[ext_resource type="PackedScene" uid="uid://pf8sq0bk3epn" path="res://scenes/projectiles/cucumber_projectile_part.tscn" id="1_3auks"] +[ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="1_iyfw1"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_12o6v"] -[sub_resource type="GDScript" id="GDScript_3auks"] -resource_name = "cucumber" -script/source = "extends Node2D +[sub_resource type="AtlasTexture" id="AtlasTexture_h74iy"] +atlas = ExtResource("2_12o6v") +region = Rect2(24, 88, 7, 13) +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_iyfw1"] +radius = 6.0 +height = 24.0 -func _ready() -> void: - await get_tree().process_frame - get_child(0).reparent(get_parent()) - get_child(0).reparent(get_parent()) - queue_free() -" +[node name="CucumberProjectile" instance=ExtResource("1_iyfw1")] +_speed = 5.0 +_damage = 25 -[node name="CucumberProjectileScene" type="Node2D"] -script = SubResource("GDScript_3auks") +[node name="Sprite" parent="." index="0"] +rotation = -1.5708 +texture = SubResource("AtlasTexture_h74iy") -[node name="CucumberProjectile" parent="." instance=ExtResource("1_3auks")] -rotation = 1.5708 - -[node name="CucumberProjectile2" parent="." instance=ExtResource("1_3auks")] -rotation = 4.71239 +[node name="CollisionShape2D" parent="." index="1"] +shape = SubResource("CapsuleShape2D_iyfw1") diff --git a/scenes/projectiles/cucumber_projectile_compound.tscn b/scenes/projectiles/cucumber_projectile_compound.tscn new file mode 100644 index 0000000..cfa3618 --- /dev/null +++ b/scenes/projectiles/cucumber_projectile_compound.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=3 format=3 uid="uid://c1ig40gtdcb60"] + +[ext_resource type="PackedScene" uid="uid://pf8sq0bk3epn" path="res://scenes/projectiles/cucumber_projectile.tscn" id="1_3auks"] +[ext_resource type="Script" uid="uid://j6nq8w2n8532" path="res://scripts/projectiles/CompoundProjectile.cs" id="1_pmbxx"] + +[node name="CucumberProjectileScene" type="Node2D"] +script = ExtResource("1_pmbxx") + +[node name="CucumberProjectile" parent="." instance=ExtResource("1_3auks")] +rotation = 1.5708 + +[node name="CucumberProjectile2" parent="." instance=ExtResource("1_3auks")] +rotation = 4.71239 diff --git a/scenes/projectiles/cucumber_projectile_part.tscn b/scenes/projectiles/cucumber_projectile_part.tscn deleted file mode 100644 index e3e56af..0000000 --- a/scenes/projectiles/cucumber_projectile_part.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://pf8sq0bk3epn"] - -[ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="1_iyfw1"] -[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="2_12o6v"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_h74iy"] -atlas = ExtResource("2_12o6v") -region = Rect2(24, 88, 7, 13) - -[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_iyfw1"] -radius = 6.0 -height = 24.0 - -[node name="CucumberProjectile" instance=ExtResource("1_iyfw1")] -_speed = 5.0 -_damage = 25 - -[node name="Sprite" parent="." index="0"] -rotation = -1.5708 -texture = SubResource("AtlasTexture_h74iy") - -[node name="CollisionShape2D" parent="." index="1"] -shape = SubResource("CapsuleShape2D_iyfw1") diff --git a/scenes/projectiles/repeater_projectile.tscn b/scenes/projectiles/repeater_projectile.tscn new file mode 100644 index 0000000..e207ded --- /dev/null +++ b/scenes/projectiles/repeater_projectile.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://b45wmmcie6yeg"] + +[ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="1_6vktd"] + +[node name="RepeaterProjectile" type="Node2D"] + +[node name="Pea" parent="." instance=ExtResource("1_6vktd")] + +[node name="Pea2" parent="." instance=ExtResource("1_6vktd")] +position = Vector2(-21, 0) diff --git a/scripts/projectiles/CompoundProjectile.cs b/scripts/projectiles/CompoundProjectile.cs new file mode 100644 index 0000000..7d19124 --- /dev/null +++ b/scripts/projectiles/CompoundProjectile.cs @@ -0,0 +1,22 @@ +using Godot; + +public partial class CompoundProjectile : Node2D +{ + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + GetTree().ProcessFrame += ReleaseCompound; + } + + public void ReleaseCompound() + { + GetTree().ProcessFrame -= ReleaseCompound; + + foreach (var child in GetChildren()) + { + child.Reparent(GetParent()); + } + + QueueFree(); + } +} diff --git a/scripts/projectiles/CompoundProjectile.cs.uid b/scripts/projectiles/CompoundProjectile.cs.uid new file mode 100644 index 0000000..e2bac87 --- /dev/null +++ b/scripts/projectiles/CompoundProjectile.cs.uid @@ -0,0 +1 @@ +uid://j6nq8w2n8532 From 821cdfd8a3ba19b66f2548bd0621823bbd8d64da Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 05:45:12 +0500 Subject: [PATCH 17/19] initial reload --- assets/plants/Garlic.tres | 2 +- assets/plants/PotatoMine.tres | 2 +- scripts/gui/seedpackets/HotbarPregameHandler.cs | 1 + scripts/gui/seedpackets/PrepickedHandler.cs | 1 + scripts/gui/seedpackets/Seedpacket.cs | 5 +++++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/assets/plants/Garlic.tres b/assets/plants/Garlic.tres index 9b19b7b..d821c21 100644 --- a/assets/plants/Garlic.tres +++ b/assets/plants/Garlic.tres @@ -13,6 +13,6 @@ DescriptionKey = "garlic_desc" Cost = 50.0 Scene = ExtResource("2_81n0p") ReloadTime = 7.5 -ReloadProgress = 0.67 +ReloadProgress = 0.0 Preview = ExtResource("1_datic") Order = 7 diff --git a/assets/plants/PotatoMine.tres b/assets/plants/PotatoMine.tres index 1abf969..825de86 100644 --- a/assets/plants/PotatoMine.tres +++ b/assets/plants/PotatoMine.tres @@ -13,6 +13,6 @@ DescriptionKey = "potatomine_desc" Cost = 25.0 Scene = ExtResource("2_ig2ti") ReloadTime = 25.0 -ReloadProgress = 0.9 +ReloadProgress = 0.0 Preview = ExtResource("1_xk2pg") Order = 3 diff --git a/scripts/gui/seedpackets/HotbarPregameHandler.cs b/scripts/gui/seedpackets/HotbarPregameHandler.cs index 0f9a656..eded986 100644 --- a/scripts/gui/seedpackets/HotbarPregameHandler.cs +++ b/scripts/gui/seedpackets/HotbarPregameHandler.cs @@ -25,6 +25,7 @@ public class HotbarPregameHandler : SeedpacketHandler, ISeedpacketPress if (state == RuntimeLevelData.LevelStates.Game) { _owner.SetHandler(new HotbarHandler(_owner)); + _owner.StartWithResourceOffset(); } else if (state != RuntimeLevelData.LevelStates.ChooseYourSeeds) { diff --git a/scripts/gui/seedpackets/PrepickedHandler.cs b/scripts/gui/seedpackets/PrepickedHandler.cs index 96dd3fc..0988e56 100644 --- a/scripts/gui/seedpackets/PrepickedHandler.cs +++ b/scripts/gui/seedpackets/PrepickedHandler.cs @@ -14,6 +14,7 @@ public class PrepickedHandler : SeedpacketHandler if (state == RuntimeLevelData.LevelStates.Game) { _owner.SetHandler(new HotbarHandler(_owner)); + _owner.StartWithResourceOffset(); } else if (state != RuntimeLevelData.LevelStates.ChooseYourSeeds) { diff --git a/scripts/gui/seedpackets/Seedpacket.cs b/scripts/gui/seedpackets/Seedpacket.cs index 23fe08d..dae46e7 100644 --- a/scripts/gui/seedpackets/Seedpacket.cs +++ b/scripts/gui/seedpackets/Seedpacket.cs @@ -81,6 +81,11 @@ public partial class Seedpacket : TextureButton { _timer.Start(); } + public void StartWithResourceOffset() + { + _timer.Start(_resource.ReloadTime * (1.0 - _resource.ReloadProgress)+0.05); + Callable.From(()=>{ _timer.WaitTime = _resource.ReloadTime; }).CallDeferred(); + } public void OnUnfocused() { From 55b65e516328e749be3e455f3f81737fc3a25e4e Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 05:48:57 +0500 Subject: [PATCH 18/19] tiles now at foot level --- scenes/entities/tiles/base_tile.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/scenes/entities/tiles/base_tile.tscn b/scenes/entities/tiles/base_tile.tscn index dae4271..58bac5a 100644 --- a/scenes/entities/tiles/base_tile.tscn +++ b/scenes/entities/tiles/base_tile.tscn @@ -12,6 +12,7 @@ MaxHP = 10.0 completeInvulnerability = true [node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(0, 12) [node name="EffectCollider" type="Area2D" parent="."] collision_layer = 256 From e1b3fb8724e9f089a505f9d83db27abda2f1655f Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 30 Jul 2025 05:51:02 +0500 Subject: [PATCH 19/19] repeater frame --- assets/plants/Repeater.tres | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/assets/plants/Repeater.tres b/assets/plants/Repeater.tres index ac232f3..85f96ca 100644 --- a/assets/plants/Repeater.tres +++ b/assets/plants/Repeater.tres @@ -1,8 +1,20 @@ -[gd_resource type="Resource" script_class="PlantResource" load_steps=5 format=3 uid="uid://b4r1687hg0rf5"] +[gd_resource type="Resource" script_class="PlantResource" load_steps=10 format=3 uid="uid://b4r1687hg0rf5"] [ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_6km43"] +[ext_resource type="Texture2D" uid="uid://dhf2opi0brx23" path="res://assets/sprites/gui/almanach/premium_field.tres" id="1_ormja"] [ext_resource type="PackedScene" uid="uid://bb4ya5qx224ca" path="res://scenes/entities/plants/repeater.tscn" id="2_6km43"] +[ext_resource type="Texture2D" uid="uid://31jc2e7dijas" path="res://assets/sprites/gui/PremiumPlantCard.tres" id="2_8djti"] [ext_resource type="Script" uid="uid://cyenlko1knygw" path="res://scripts/resources/entities/PlantResource.cs" id="3_e606l"] +[ext_resource type="Script" uid="uid://3m7xks3xq3hl" path="res://scripts/gui/seedpackets/CustomSeedpacketFrame.cs" id="3_qnhmj"] + +[sub_resource type="LabelSettings" id="LabelSettings_2f3e1"] + +[sub_resource type="Resource" id="Resource_87lkl"] +script = ExtResource("3_qnhmj") +frame = ExtResource("2_8djti") +font = SubResource("LabelSettings_2f3e1") +almanachField = ExtResource("1_ormja") +metadata/_custom_type_script = "uid://3m7xks3xq3hl" [sub_resource type="AtlasTexture" id="AtlasTexture_qnsfo"] atlas = ExtResource("1_6km43") @@ -19,4 +31,5 @@ Scene = ExtResource("2_6km43") ReloadTime = 5.0 ReloadProgress = 0.0 Preview = SubResource("AtlasTexture_qnsfo") +CustomFrame = SubResource("Resource_87lkl") Order = 12