diff --git a/#Scenes/Events/mob/0.tscn b/#Scenes/Events/mob/0.tscn index a7c2184e..5d4bee77 100644 --- a/#Scenes/Events/mob/0.tscn +++ b/#Scenes/Events/mob/0.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://sg1wi7uqvv25"] +[gd_scene load_steps=16 format=3 uid="uid://sg1wi7uqvv25"] [ext_resource type="Script" path="res://#Scenes/SceneScripts/TestingScene.gd" id="1_nmgwp"] [ext_resource type="PackedScene" uid="uid://bcpmrmofcilbn" path="res://Core/Battler.tscn" id="2_e6pjn"] @@ -13,17 +13,25 @@ [ext_resource type="Texture2D" uid="uid://d4muqvs3etnr8" path="res://Art/Card_layout/discard_pile.png" id="12_0nlrw"] [ext_resource type="Script" path="res://UI/DiscardPileUISetter.gd" id="13_8nsar"] [ext_resource type="PackedScene" uid="uid://bam77cwf4emyr" path="res://#Scenes/TopBarOverlay.tscn" id="14_os5i4"] +[ext_resource type="Texture2D" uid="uid://by65g3tjujc72" path="res://Art/Background/1-1.png" id="15_5h66l"] [ext_resource type="PackedScene" uid="uid://ruwidm3egyrx" path="res://#Scenes/xp_bar.tscn" id="15_r7cr8"] [node name="TestingScene" type="Node2D"] script = ExtResource("1_nmgwp") metadata/_edit_vertical_guides_ = [1216.0] +[node name="Background" type="TextureRect" parent="."] +custom_minimum_size = Vector2(1920, 1080) +offset_right = 1920.0 +offset_bottom = 1080.0 +texture = ExtResource("15_5h66l") +expand_mode = 1 + [node name="Battler" parent="." instance=ExtResource("2_e6pjn")] position = Vector2(896, 364) [node name="Player" parent="." instance=ExtResource("4_ss8ob")] -position = Vector2(986, 631) +position = Vector2(429, 677) [node name="CanvasLayer" type="CanvasLayer" parent="."] @@ -54,7 +62,7 @@ hover_offset_max = 100.0 max_rotation = 40.0 draw_pile_ui = NodePath("../DrawPile") discard_pile_ui = NodePath("../DiscardPile") -play_at_height = 500.0 +play_at_height = 800.0 [node name="EndTurnButton" type="Button" parent="CanvasLayer/UIControl"] layout_mode = 1 @@ -171,6 +179,7 @@ main menu" [node name="TopBarOverlay" parent="CanvasLayer/UIControl" instance=ExtResource("14_os5i4")] layout_mode = 1 +offset_bottom = -987.0 [node name="XP progress" parent="CanvasLayer/UIControl" instance=ExtResource("15_r7cr8")] layout_mode = 1 diff --git a/#Scenes/SceneScripts/MainMenu.gd b/#Scenes/SceneScripts/MainMenu.gd index fa68643b..28e21abe 100644 --- a/#Scenes/SceneScripts/MainMenu.gd +++ b/#Scenes/SceneScripts/MainMenu.gd @@ -33,6 +33,7 @@ func _on_continue_pressed() -> void: CardManager.load_data() InventoryManager.load_inventory() SceneManager.load_scene_data() + EnemyManager.load_data() func _on_button_hovered(button: TextureButton) -> void: button.grab_focus() diff --git a/#Scenes/Tes281A.tmp b/#Scenes/Tes281A.tmp deleted file mode 100644 index 3b6654b0..00000000 --- a/#Scenes/Tes281A.tmp +++ /dev/null @@ -1,221 +0,0 @@ -[gd_scene load_steps=19 format=3 uid="uid://b60uabg68ra1l"] - -[ext_resource type="Script" path="res://#Scenes/SceneScripts/TestingScene.gd" id="1_ji0t8"] -[ext_resource type="Script" path="res://Map/MapManager.gd" id="2_50npk"] -[ext_resource type="PackedScene" uid="uid://clmg3l3n28x38" path="res://Entity/Player/Player.tscn" id="3_4psp7"] -[ext_resource type="PackedScene" uid="uid://dpjfy4pv0vxst" path="res://Cards/CardContainer.tscn" id="3_e7sws"] -[ext_resource type="Script" path="res://#Scenes/SceneScripts/TestingScene_UIcontrol.gd" id="4_h8431"] -[ext_resource type="PackedScene" uid="uid://bcpmrmofcilbn" path="res://Core/Battler.tscn" id="8_qtw1k"] -[ext_resource type="Script" path="res://UI/DrawPileUISetter.gd" id="8_voref"] -[ext_resource type="Script" path="res://UI/DiscardPileUISetter.gd" id="10_pqly7"] -[ext_resource type="Texture2D" uid="uid://caemucaya30wh" path="res://Art/Card_layout/draw_pile.png" id="11_pw70x"] -[ext_resource type="Texture2D" uid="uid://d4muqvs3etnr8" path="res://Art/Card_layout/discard_pile.png" id="12_kxw48"] -[ext_resource type="Script" path="res://UI/EndTurnButton.gd" id="14_dpe64"] -[ext_resource type="Script" path="res://UI/EnergyLabel.gd" id="14_nckre"] -[ext_resource type="Texture2D" uid="uid://hqkt8t1v2f5h" path="res://Art/Card_layout/deck_pile.png" id="18_b54hn"] -[ext_resource type="Script" path="res://#Scenes/InventoryTester.gd" id="18_duj0f"] -[ext_resource type="Texture2D" uid="uid://bl5v3bgnntoc5" path="res://Art/Card_layout/energy_count.png" id="19_spyxg"] -[ext_resource type="Script" path="res://UI/DeckPileUISetter.gd" id="19_ucc6f"] -[ext_resource type="Texture2D" uid="uid://cjlatwiw7r80d" path="res://Art/Map/icon.png" id="20_tiho6"] -[ext_resource type="Script" path="res://UI/MapButton.gd" id="22_druf4"] - -[node name="TestingScene" type="Node2D"] -script = ExtResource("1_ji0t8") -metadata/_edit_vertical_guides_ = [1216.0] - -[node name="Battler" parent="." instance=ExtResource("8_qtw1k")] - -[node name="TestMap" type="Node2D" parent="."] -script = ExtResource("2_50npk") - -[node name="Player" parent="." instance=ExtResource("3_4psp7")] -position = Vector2(595, 284) - -[node name="CanvasLayer" type="CanvasLayer" parent="."] - -[node name="UIControl" type="Control" parent="CanvasLayer"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -script = ExtResource("4_h8431") - -[node name="CardContainer" parent="CanvasLayer/UIControl" node_paths=PackedStringArray("draw_pile_ui", "discard_pile_ui") instance=ExtResource("3_e7sws")] -layout_mode = 1 -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 0 -starting_hand_size = 10 -max_hand_width = 900.0 -min_card_separation = 90.0 -max_card_separation = 120.0 -hover_offset_max = 100.0 -max_rotation = 40.0 -draw_pile_ui = NodePath("../DrawPile") -discard_pile_ui = NodePath("../DiscardPile") -play_at_height = 500.0 - -[node name="EndTurnButton" type="Button" parent="CanvasLayer/UIControl"] -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -145.0 -offset_top = -141.0 -offset_right = -35.0 -offset_bottom = -109.0 -grow_horizontal = 0 -grow_vertical = 0 -text = "end turn" -script = ExtResource("14_dpe64") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/UIControl"] -layout_mode = 1 -anchors_preset = -1 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 17.0 -offset_top = -159.0 -offset_right = 257.0 -offset_bottom = 32.0 -scale = Vector2(0.38, 0.38) -texture = ExtResource("19_spyxg") - -[node name="EnergyLabel" type="Label" parent="CanvasLayer/UIControl/TextureRect"] -layout_mode = 0 -offset_left = 82.1705 -offset_top = 72.8682 -offset_right = 92.1705 -offset_bottom = 95.8682 -scale = Vector2(3.93058, 3.1094) -text = "0" -horizontal_alignment = 1 -vertical_alignment = 1 -script = ExtResource("14_nckre") - -[node name="DrawPile" type="TextureButton" parent="CanvasLayer/UIControl" node_paths=PackedStringArray("pile_count_label")] -layout_mode = 1 -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 30.0 -offset_top = -69.0 -offset_right = 70.0 -offset_bottom = -29.0 -grow_vertical = 0 -texture_normal = ExtResource("11_pw70x") -texture_pressed = ExtResource("11_pw70x") -texture_hover = ExtResource("11_pw70x") -texture_disabled = ExtResource("11_pw70x") -texture_focused = ExtResource("11_pw70x") -stretch_mode = 0 -script = ExtResource("8_voref") -pile_count_label = NodePath("DrawPileCount") - -[node name="DrawPileCount" type="Label" parent="CanvasLayer/UIControl/DrawPile"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "0" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="DiscardPile" type="TextureButton" parent="CanvasLayer/UIControl" node_paths=PackedStringArray("pile_count_label")] -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -64.0 -offset_top = -72.0 -offset_right = -24.0 -offset_bottom = -32.0 -grow_horizontal = 0 -grow_vertical = 0 -texture_normal = ExtResource("12_kxw48") -texture_pressed = ExtResource("12_kxw48") -texture_hover = ExtResource("12_kxw48") -texture_disabled = ExtResource("12_kxw48") -texture_focused = ExtResource("12_kxw48") -stretch_mode = 0 -script = ExtResource("10_pqly7") -pile_count_label = NodePath("DrawPileCount") - -[node name="DrawPileCount" type="Label" parent="CanvasLayer/UIControl/DiscardPile"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "0" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="DeckPile" type="TextureButton" parent="CanvasLayer/UIControl"] -layout_mode = 1 -anchors_preset = -1 -anchor_left = 1.00078 -anchor_right = 1.00078 -offset_left = -62.0 -offset_top = 35.0 -offset_right = -22.0 -offset_bottom = 75.0 -texture_normal = ExtResource("18_b54hn") -texture_pressed = ExtResource("18_b54hn") -texture_hover = ExtResource("18_b54hn") -texture_disabled = ExtResource("18_b54hn") -texture_focused = ExtResource("18_b54hn") -stretch_mode = 0 -script = ExtResource("19_ucc6f") -metadata/_edit_use_anchors_ = true - -[node name="MapIcon" type="TextureButton" parent="CanvasLayer/UIControl"] -layout_mode = 0 -offset_left = 1174.0 -offset_top = 31.0 -offset_right = 1214.0 -offset_bottom = 71.0 -texture_normal = ExtResource("20_tiho6") -texture_pressed = ExtResource("20_tiho6") -texture_hover = ExtResource("20_tiho6") -texture_disabled = ExtResource("20_tiho6") -texture_focused = ExtResource("20_tiho6") -ignore_texture_size = true -stretch_mode = 0 -script = ExtResource("22_druf4") - -[node name="back_to_main_menu" type="Button" parent="CanvasLayer/UIControl"] -layout_mode = 0 -offset_left = 29.0 -offset_top = 22.0 -offset_right = 148.0 -offset_bottom = 86.0 -theme_override_font_sizes/font_size = 20 -text = "Go back to -main menu" - -[node name="Button" type="Button" parent="."] -offset_left = 138.0 -offset_top = 257.0 -offset_right = 146.0 -offset_bottom = 265.0 -scale = Vector2(22.96, 18.44) -script = ExtResource("18_duj0f") - -[connection signal="pressed" from="CanvasLayer/UIControl/EndTurnButton" to="CanvasLayer/UIControl/EndTurnButton" method="_on_pressed"] -[connection signal="pressed" from="CanvasLayer/UIControl/back_to_main_menu" to="CanvasLayer/UIControl" method="_on_back_to_main_menu_pressed"] -[connection signal="pressed" from="Button" to="Button" method="_on_pressed"] diff --git a/Art/Background/1-1.png b/Art/Background/1-1.png new file mode 100644 index 00000000..3a1f60ae Binary files /dev/null and b/Art/Background/1-1.png differ diff --git a/Art/Background/1-1.png.import b/Art/Background/1-1.png.import new file mode 100644 index 00000000..762f65e2 --- /dev/null +++ b/Art/Background/1-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by65g3tjujc72" +path="res://.godot/imported/1-1.png-525520126e2cc762e91f3f4f88560ca6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Background/1-1.png" +dest_files=["res://.godot/imported/1-1.png-525520126e2cc762e91f3f4f88560ca6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Character/concept_art_lighted.png b/Art/Character/concept_art_lighted.png new file mode 100644 index 00000000..d375b89a Binary files /dev/null and b/Art/Character/concept_art_lighted.png differ diff --git a/Art/Character/concept_art_lighted.png.import b/Art/Character/concept_art_lighted.png.import new file mode 100644 index 00000000..61752a5f --- /dev/null +++ b/Art/Character/concept_art_lighted.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ch03socwivjxp" +path="res://.godot/imported/concept_art_lighted.png-c29d06931b609c07a30a8b006d115e74.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Character/concept_art_lighted.png" +dest_files=["res://.godot/imported/concept_art_lighted.png-c29d06931b609c07a30a8b006d115e74.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Enemies/golden_cauldron-finished.png b/Art/Enemies/golden_cauldron-finished.png new file mode 100644 index 00000000..08a3b60a Binary files /dev/null and b/Art/Enemies/golden_cauldron-finished.png differ diff --git a/Art/Enemies/golden_cauldron-finished.png.import b/Art/Enemies/golden_cauldron-finished.png.import new file mode 100644 index 00000000..32fcbe0d --- /dev/null +++ b/Art/Enemies/golden_cauldron-finished.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvr6ky4vqv4lf" +path="res://.godot/imported/golden_cauldron-finished.png-156cbc2011db8cbb6cf905d6952e3e9b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Enemies/golden_cauldron-finished.png" +dest_files=["res://.godot/imported/golden_cauldron-finished.png-156cbc2011db8cbb6cf905d6952e3e9b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png b/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png new file mode 100644 index 00000000..b8de0b17 Binary files /dev/null and b/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png differ diff --git a/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png.import b/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png.import new file mode 100644 index 00000000..aafdff76 --- /dev/null +++ b/Art/Enemies/motorized_bears/motorized_bear_leader-finished.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ua4ml58lwg4r" +path="res://.godot/imported/motorized_bear_leader-finished.png-f5971ba03729a9f0148f6ec16d0c9ece.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Enemies/motorized_bears/motorized_bear_leader-finished.png" +dest_files=["res://.godot/imported/motorized_bear_leader-finished.png-f5971ba03729a9f0148f6ec16d0c9ece.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Enemies/motorized_bears/motorized_bear_leader.png.import b/Art/Enemies/motorized_bears/motorized_bear_leader.png.import new file mode 100644 index 00000000..3dedbd58 --- /dev/null +++ b/Art/Enemies/motorized_bears/motorized_bear_leader.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvvuudr130dwm" +path="res://.godot/imported/motorized_bear_leader.png-712f635f6ab1c54e9cdf92def0d08391.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Enemies/motorized_bears/motorized_bear_leader.png" +dest_files=["res://.godot/imported/motorized_bear_leader.png-712f635f6ab1c54e9cdf92def0d08391.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png b/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png new file mode 100644 index 00000000..13658516 Binary files /dev/null and b/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png differ diff --git a/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png.import b/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png.import new file mode 100644 index 00000000..9c56c11d --- /dev/null +++ b/Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qwjhfnceugt0" +path="res://.godot/imported/motorized_bear_underlings_1-finished.png-9445a0f8e512b5f7c19f9562e9a6e4fa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png" +dest_files=["res://.godot/imported/motorized_bear_underlings_1-finished.png-9445a0f8e512b5f7c19f9562e9a6e4fa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png b/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png new file mode 100644 index 00000000..3eb23e69 Binary files /dev/null and b/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png differ diff --git a/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png.import b/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png.import new file mode 100644 index 00000000..b3d126e9 --- /dev/null +++ b/Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw0id8n5qemg8" +path="res://.godot/imported/motorized_bear_underlings_2-finished.png-1f7568807c554d5da7fe6a18d1b23211.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png" +dest_files=["res://.godot/imported/motorized_bear_underlings_2-finished.png-1f7568807c554d5da7fe6a18d1b23211.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Cards/CardContainer.tscn b/Cards/CardContainer.tscn index a3a71969..85614d41 100644 --- a/Cards/CardContainer.tscn +++ b/Cards/CardContainer.tscn @@ -1,14 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://dpjfy4pv0vxst"] +[gd_scene load_steps=3 format=3 uid="uid://dpjfy4pv0vxst"] [ext_resource type="Script" path="res://Cards/CardContainer.gd" id="1_8wctf"] [ext_resource type="PackedScene" uid="uid://caxbd2ppk3ans" path="res://Cards/Card.tscn" id="2_ytmtr"] -[ext_resource type="Resource" uid="uid://dxgoopi1roxu4" path="res://Cards/Resource/Card_Damage.tres" id="3_bi3df"] -[ext_resource type="Resource" uid="uid://0x385c3nuq8f" path="res://Cards/Resource/Card_DamageAllEnemies.tres" id="4_14cb3"] -[ext_resource type="Resource" uid="uid://boodcfdepyk5i" path="res://Cards/Resource/Card_DamageHealth.tres" id="5_dugjd"] -[ext_resource type="Resource" uid="uid://d4lugn62mmlep" path="res://Cards/Resource/Card_DrawCards.tres" id="6_56fxe"] -[ext_resource type="Resource" uid="uid://d12g33rc6c3u5" path="res://Cards/Resource/Card_Heal.tres" id="7_6wjqi"] -[ext_resource type="Resource" uid="uid://ctx8jsvac84so" path="res://Cards/Resource/Card_Poison.tres" id="8_gbk7f"] -[ext_resource type="Resource" uid="uid://uv2rili0xf3x" path="res://Cards/Resource/Card_Damage_EVERYTHING.tres" id="9_df5d4"] [node name="CardContainer" type="Control"] layout_mode = 3 @@ -17,4 +10,3 @@ script = ExtResource("1_8wctf") card_scene = ExtResource("2_ytmtr") total_hand_width = 500.0 card_queued_offset = 200.0 -default_deck = Array[Resource("res://Cards/CardBase.gd")]([ExtResource("3_bi3df"), ExtResource("4_14cb3"), ExtResource("5_dugjd"), ExtResource("6_56fxe"), ExtResource("7_6wjqi"), ExtResource("8_gbk7f"), ExtResource("9_df5d4")]) diff --git a/Cards/CardSets/DefaultDeck.tres b/Cards/CardSets/DefaultDeck.tres index 0f1e6e28..09bf170e 100644 --- a/Cards/CardSets/DefaultDeck.tres +++ b/Cards/CardSets/DefaultDeck.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://Cards/CardSetBase.gd" id="1_pnxc0"] [ext_resource type="Resource" uid="uid://dam752rc15nu5" path="res://Cards/Resource/Card_Buff_Poison_Duration.tres" id="1_to4gc"] [ext_resource type="Resource" uid="uid://dxgoopi1roxu4" path="res://Cards/Resource/Card_Damage.tres" id="2_q7qqo"] -[ext_resource type="Resource" uid="uid://cnxsrwpr52cig" path="res://Cards/Resource/Card_DamageAllEnemies.tres" id="3_4ka0y"] +[ext_resource type="Resource" uid="uid://0x385c3nuq8f" path="res://Cards/Resource/Card_DamageAllEnemies.tres" id="3_4ka0y"] [ext_resource type="Resource" uid="uid://boodcfdepyk5i" path="res://Cards/Resource/Card_DamageHealth.tres" id="4_es3ma"] [ext_resource type="Resource" uid="uid://3s4aet1ciesh" path="res://Cards/Resource/Card_damage_and_poison.tres" id="5_giy28"] [ext_resource type="Resource" uid="uid://uv2rili0xf3x" path="res://Cards/Resource/Card_Damage_EVERYTHING.tres" id="6_gr534"] diff --git a/Cards/Movement State/MoveState_Queued.gd b/Cards/Movement State/MoveState_Queued.gd index 162f1dc2..39d676cc 100644 --- a/Cards/Movement State/MoveState_Queued.gd +++ b/Cards/Movement State/MoveState_Queued.gd @@ -31,9 +31,9 @@ func on_state_process(delta: float) -> void: offset_desired_position += OFFSET_FROM_MOUSE var is_in_play_area : bool = CardManager.card_container.is_queued_card_in_play_area() - var is_insta_cast : bool = _state.card.card_cast_type != GlobalEnums.CardCastType.INSTA_CAST + var is_not_insta_cast : bool = _state.card.card_cast_type != GlobalEnums.CardCastType.INSTA_CAST - if(is_in_play_area && is_insta_cast): + if(is_in_play_area && is_not_insta_cast): _state.card.position = _state.card.position.lerp(TARGET_CARD_POS, delta * MOVE_SPEED) else : _state.card.position = _state.card.position.lerp(offset_desired_position, delta * MOVE_SPEED) diff --git a/Cards/Targeting/TargetAllEnemies.gd b/Cards/Targeting/TargetAllEnemies.gd index af4bb76a..b5dcbbaa 100644 --- a/Cards/Targeting/TargetAllEnemies.gd +++ b/Cards/Targeting/TargetAllEnemies.gd @@ -7,12 +7,12 @@ class_name TargetAllEnemies extends TargetingBase ## @Override [br] ## See [TargetingBase] for more information [br] func _init() -> void: - cast_type = GlobalEnums.CardCastType.INSTA_CAST + cast_type = GlobalEnums.CardCastType.INSTA_CAST - + ## @Override [br] ## See [TargetingBase] for more information [br] @warning_ignore("unused_parameter") func generate_target_list(targeted_entity: Entity) -> Array[Entity]: - return EnemyManager.enemy_list + return EnemyManager.current_enemy_group.enemy_list diff --git a/Cards/Targeting/TargetEverything.gd b/Cards/Targeting/TargetEverything.gd index e90ead67..2749d423 100644 --- a/Cards/Targeting/TargetEverything.gd +++ b/Cards/Targeting/TargetEverything.gd @@ -14,6 +14,6 @@ func _init() -> void: ## See [TargetingBase] for more information [br] @warning_ignore("unused_parameter") func generate_target_list(targeted_entity:Entity) -> Array[Entity]: - var targets: Array[Entity] = EnemyManager.enemy_list.duplicate() + var targets: Array[Entity] = EnemyManager.current_enemy_group.enemy_list.duplicate() targets.append(PlayerManager.player) return targets diff --git a/Cards/Targeting/TargetRandomEnemies.gd b/Cards/Targeting/TargetRandomEnemies.gd index f419ab9e..727aa45c 100644 --- a/Cards/Targeting/TargetRandomEnemies.gd +++ b/Cards/Targeting/TargetRandomEnemies.gd @@ -18,7 +18,7 @@ func _init() -> void: @warning_ignore("unused_parameter") func generate_target_list(targeted_entity: Entity) -> Array[Entity]: var target_list: Array[Entity] = [] - var enemy_list: Array[Entity] = EnemyManager.enemy_list.duplicate() + var enemy_list: Array[Entity] = EnemyManager.current_enemy_group.enemy_list.duplicate() var enemy_list_size: int = enemy_list.size() for _i: int in range(number_of_targets): var random_index: int = randi_range(0,enemy_list_size-1) diff --git a/Cards/Targeting/TargetRight.gd b/Cards/Targeting/TargetRight.gd index 70932b3b..5530a13e 100644 --- a/Cards/Targeting/TargetRight.gd +++ b/Cards/Targeting/TargetRight.gd @@ -6,16 +6,16 @@ class_name TargetRight extends TargetingBase ## @Override [br] ## See [TargetingBase] for more information [br] func _init() -> void: - cast_type = GlobalEnums.CardCastType.TARGET + cast_type = GlobalEnums.CardCastType.TARGET ## @Override [br] ## See [TargetingBase] for more information [br] func generate_target_list(targeted_entity: Entity) -> Array[Entity]: - var enemy_list: Array[Entity] = EnemyManager.enemy_list - var index_of_current_target: int = enemy_list.find(targeted_entity) - assert(index_of_current_target != -1, "The targeted enemy is not in the list of enemies") - var target_list: Array[Entity] = [targeted_entity] - if index_of_current_target < enemy_list.size() - 1: - target_list.append(enemy_list[index_of_current_target + 1]) - return target_list + var enemy_list: Array[Entity] = EnemyManager.current_enemy_group.enemy_list + var index_of_current_target: int = enemy_list.find(targeted_entity) + assert(index_of_current_target != -1, "The targeted enemy is not in the list of enemies") + var target_list: Array[Entity] = [targeted_entity] + if index_of_current_target < enemy_list.size() - 1: + target_list.append(enemy_list[index_of_current_target + 1]) + return target_list diff --git a/Core/Battler.gd b/Core/Battler.gd index 8b3bbc9a..d1595fb8 100644 --- a/Core/Battler.gd +++ b/Core/Battler.gd @@ -5,16 +5,19 @@ class_name Battler ## This class holds a list of all the enemies, so it's a good central place to dispatch ## battle actions (player clicking on enemies, enemy attacks, applying status). -@export var enemies_to_summon: Array[PackedScene] -@export var enemy_spacing: float = 50.0 + +@export var enemy_x_spacing: float = 100 +@export var enemy_y_spacing: float = -30 @export var enemy_attack_delay: float = 0.3 var _enemy_list: Array[Entity] var _enemy_action_list: Array[EnemyAction] = [] func _ready() -> void: - _summon_enemies() - EnemyManager.enemy_list = _enemy_list + var enemy_group: EnemyGroup = EnemyManager.choose_enemy_group().instantiate() + add_child(enemy_group) + _summon_enemies(enemy_group) + EnemyManager.current_enemy_group.enemy_list = _enemy_list # check if our player has been initialized already. If not, wait for the signal if (PlayerManager.player == null): @@ -28,17 +31,28 @@ func _ready() -> void: CardManager.on_card_action_finished.connect(_handle_deaths.unbind(1)) -func _summon_enemies() -> void: +func _summon_enemies(enemy_group: EnemyGroup) -> void: + EnemyManager.current_enemy_group = enemy_group + var enemies_to_summon: Array[PackedScene] = enemy_group.enemy_list_packed_scene + for enemy_index: int in enemies_to_summon.size(): - var enemy_instance: Node = enemies_to_summon[enemy_index].instantiate() + var enemy_instance: Enemy = enemies_to_summon[enemy_index].instantiate() add_child(enemy_instance) _enemy_list.append(enemy_instance) + EnemyManager.current_enemy_group.enemy_list.append(enemy_instance) enemy_instance.get_click_handler().on_click.connect(_on_enemy_clicked.bind(enemy_instance)) - enemy_instance.position.x += enemy_spacing * enemy_index + if enemy_group.positions.size() > enemy_index: + # if positions are available for that enemy, use it + enemy_instance.global_position = enemy_group.positions[enemy_index] + else: + # otherwise use default + enemy_instance.global_position.x += enemy_x_spacing * enemy_index + enemy_instance.global_position.y += enemy_y_spacing * enemy_index + # setup party for enemy: Entity in _enemy_list: - enemy.get_party_component().set_party(_enemy_list) + enemy.get_party_component().set_party(_enemy_list ) func _on_player_initialized() -> void: @@ -180,7 +194,7 @@ func _handle_enemy_deaths() -> void: enemy.queue_free() for enemy: Enemy in _enemy_list: - enemy.get_party_component().set_party(_enemy_list) + enemy.get_party_component().set_party(_enemy_list ) ## return TRUE if battle have ended either with victory or defeat diff --git a/Core/Battler.tscn b/Core/Battler.tscn index 4415712c..9900816f 100644 --- a/Core/Battler.tscn +++ b/Core/Battler.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://bcpmrmofcilbn"] [ext_resource type="Script" path="res://Core/Battler.gd" id="1_7pmkk"] -[ext_resource type="PackedScene" uid="uid://85ove4xi0gf0" path="res://Entity/Enemy/Enemy_SaplingGreen.tscn" id="2_3w4is"] -[ext_resource type="PackedScene" uid="uid://bxgvbltw03uda" path="res://Entity/Enemy/Enemy_SaplingRed.tscn" id="3_s0fw5"] +[ext_resource type="PackedScene" uid="uid://85ove4xi0gf0" path="res://Entity/Enemy/EnemyScene/Enemy_SaplingGreen.tscn" id="2_3w4is"] +[ext_resource type="PackedScene" uid="uid://bxgvbltw03uda" path="res://Entity/Enemy/EnemyScene/Enemy_SaplingRed.tscn" id="3_s0fw5"] [node name="Battler" type="Node2D"] position = Vector2(596, 89) diff --git a/Entity/Enemy/Enemy.gd b/Entity/Enemy/Enemy.gd index 287419e0..66ebaba6 100644 --- a/Entity/Enemy/Enemy.gd +++ b/Entity/Enemy/Enemy.gd @@ -2,6 +2,8 @@ extends Entity class_name Enemy ## Base enemy class. +@export var enemy_name: GlobalEnums.PossibleEnemies + ## @Override [br] ## See [Entity] for more information [br] ## Connect the enemy to the [PhaseManager] to make it attack when it's its turn. diff --git a/Entity/Enemy/EnemyGroup.gd b/Entity/Enemy/EnemyGroup.gd new file mode 100644 index 00000000..6f5e5624 --- /dev/null +++ b/Entity/Enemy/EnemyGroup.gd @@ -0,0 +1,11 @@ +class_name EnemyGroup extends Node + +## The scene of each enemy +@export var enemy_list_packed_scene: Array[PackedScene] + +## The position of those enemies on the screen [br] +## @experimental +## This could be changed to be automatically calculated maybe +@export var positions: Array[Vector2] + +var enemy_list: Array[Entity] diff --git a/Entity/Enemy/EnemyGroup/golden_cauldron_group.tscn b/Entity/Enemy/EnemyGroup/golden_cauldron_group.tscn new file mode 100644 index 00000000..93dd8151 --- /dev/null +++ b/Entity/Enemy/EnemyGroup/golden_cauldron_group.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://1uqpxix8wb18"] + +[ext_resource type="PackedScene" uid="uid://d3brguvgvsh5m" path="res://Entity/Enemy/EnemyGroup/test_group.tscn" id="1_fm87o"] +[ext_resource type="PackedScene" uid="uid://7hs1nfyh7mj4" path="res://Entity/Enemy/EnemyScene/golden_cauldron.tscn" id="2_wjrop"] + +[node name="EnemyGroup" instance=ExtResource("1_fm87o")] +enemy_list_packed_scene = Array[PackedScene]([ExtResource("2_wjrop")]) +positions = Array[Vector2]([Vector2(1330, 580)]) diff --git a/Entity/Enemy/EnemyGroup/motorized_bears.tscn b/Entity/Enemy/EnemyGroup/motorized_bears.tscn new file mode 100644 index 00000000..8de81c0a --- /dev/null +++ b/Entity/Enemy/EnemyGroup/motorized_bears.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=4 format=3 uid="uid://cio8a6qvoj2k"] + +[ext_resource type="PackedScene" uid="uid://d3brguvgvsh5m" path="res://Entity/Enemy/EnemyGroup/test_group.tscn" id="1_ujbly"] +[ext_resource type="PackedScene" uid="uid://btt0xgebuosow" path="res://Entity/Enemy/EnemyScene/motorized_bear_leader.tscn" id="3_wttjg"] +[ext_resource type="PackedScene" uid="uid://xwiymm7vlijs" path="res://Entity/Enemy/EnemyScene/motorized_bear_underling_2.tscn" id="4_im2yl"] + +[node name="EnemyGroup" instance=ExtResource("1_ujbly")] +enemy_list_packed_scene = Array[PackedScene]([ExtResource("4_im2yl"), ExtResource("3_wttjg"), ExtResource("4_im2yl")]) +positions = Array[Vector2]([Vector2(900, 600), Vector2(1275, 600), Vector2(1550, 700)]) diff --git a/Entity/Enemy/EnemyGroup/test_group.tscn b/Entity/Enemy/EnemyGroup/test_group.tscn new file mode 100644 index 00000000..745d3b9b --- /dev/null +++ b/Entity/Enemy/EnemyGroup/test_group.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=4 format=3 uid="uid://d3brguvgvsh5m"] + +[ext_resource type="Script" path="res://Entity/Enemy/EnemyGroup.gd" id="1_5wmc0"] +[ext_resource type="PackedScene" uid="uid://85ove4xi0gf0" path="res://Entity/Enemy/EnemyScene/Enemy_SaplingGreen.tscn" id="2_7m6bd"] +[ext_resource type="PackedScene" uid="uid://bxgvbltw03uda" path="res://Entity/Enemy/EnemyScene/Enemy_SaplingRed.tscn" id="3_bafm4"] + +[node name="EnemyGroup" type="Node2D"] +script = ExtResource("1_5wmc0") +enemy_list_packed_scene = Array[PackedScene]([ExtResource("2_7m6bd"), ExtResource("3_bafm4")]) diff --git a/Entity/Enemy/Enemy.tscn b/Entity/Enemy/EnemyScene/Enemy.tscn similarity index 91% rename from Entity/Enemy/Enemy.tscn rename to Entity/Enemy/EnemyScene/Enemy.tscn index eb69bd0c..ed23bcc6 100644 --- a/Entity/Enemy/Enemy.tscn +++ b/Entity/Enemy/EnemyScene/Enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://bpgsmfprnm2kk"] +[gd_scene load_steps=16 format=3 uid="uid://bpgsmfprnm2kk"] [ext_resource type="Script" path="res://Entity/Enemy/Enemy.gd" id="1_ya6nf"] [ext_resource type="Script" path="res://Entity/Components/StatComponent.gd" id="2_twygh"] @@ -14,9 +14,6 @@ [ext_resource type="Script" path="res://Entity/Components/StressComponent.gd" id="11_qf75g"] [ext_resource type="PackedScene" uid="uid://dbidy5j4uyopc" path="res://Entity/Components/block_display.tscn" id="13_u3jb7"] -[sub_resource type="RectangleShape2D" id="RectangleShape2D_b8bva"] -size = Vector2(104, 93) - [sub_resource type="LabelSettings" id="LabelSettings_urr12"] font_size = 26 @@ -25,7 +22,6 @@ font_size = 26 font_color = Color(0.435294, 0.67451, 0.815686, 1) [node name="Enemy" type="Node2D"] -position = Vector2(0, 50) script = ExtResource("1_ya6nf") [node name="StatComponent" type="Node" parent="."] @@ -46,9 +42,8 @@ script = ExtResource("6_m32ri") [node name="Area2D" type="Area2D" parent="."] -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] -position = Vector2(5, 2.5) -shape = SubResource("RectangleShape2D_b8bva") +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Area2D"] +polygon = PackedVector2Array(-38, 48, 43, 48, 44, -44, -37, -44) [node name="HealthLabel" type="Label" parent="." node_paths=PackedStringArray("health_component")] offset_left = -57.0 diff --git a/Entity/Enemy/Enemy_SaplingGreen.tscn b/Entity/Enemy/EnemyScene/Enemy_SaplingGreen.tscn similarity index 84% rename from Entity/Enemy/Enemy_SaplingGreen.tscn rename to Entity/Enemy/EnemyScene/Enemy_SaplingGreen.tscn index 65103691..daa6b6d4 100644 --- a/Entity/Enemy/Enemy_SaplingGreen.tscn +++ b/Entity/Enemy/EnemyScene/Enemy_SaplingGreen.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://85ove4xi0gf0"] -[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/Enemy.tscn" id="1_klc51"] +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_klc51"] [node name="Enemy" instance=ExtResource("1_klc51")] diff --git a/Entity/Enemy/Enemy_SaplingRed.tscn b/Entity/Enemy/EnemyScene/Enemy_SaplingRed.tscn similarity index 69% rename from Entity/Enemy/Enemy_SaplingRed.tscn rename to Entity/Enemy/EnemyScene/Enemy_SaplingRed.tscn index 9e237255..c743df68 100644 --- a/Entity/Enemy/Enemy_SaplingRed.tscn +++ b/Entity/Enemy/EnemyScene/Enemy_SaplingRed.tscn @@ -1,15 +1,15 @@ [gd_scene load_steps=3 format=3 uid="uid://bxgvbltw03uda"] -[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/Enemy.tscn" id="1_ayq70"] -[ext_resource type="Texture2D" uid="uid://bmno324u2v60w" path="res://Art/Enemies/red_sapling-default.png" id="2_qypjd"] +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_m4exw"] +[ext_resource type="Texture2D" uid="uid://bmno324u2v60w" path="res://Art/Enemies/red_sapling-default.png" id="2_jht5f"] -[node name="Enemy" instance=ExtResource("1_ayq70")] +[node name="Enemy" instance=ExtResource("1_m4exw")] [node name="HealthComponent" parent="." index="2"] max_health = 50.0 [node name="Sprite2D" parent="." index="3"] -texture = ExtResource("2_qypjd") +texture = ExtResource("2_jht5f") [node name="StressLabel" parent="." index="7"] text = "40/80" diff --git a/Entity/Enemy/EnemyScene/golden_cauldron.tscn b/Entity/Enemy/EnemyScene/golden_cauldron.tscn new file mode 100644 index 00000000..6b171467 --- /dev/null +++ b/Entity/Enemy/EnemyScene/golden_cauldron.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=3 uid="uid://7hs1nfyh7mj4"] + +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_kje8b"] +[ext_resource type="Texture2D" uid="uid://dvr6ky4vqv4lf" path="res://Art/Enemies/golden_cauldron-finished.png" id="2_nr485"] + +[node name="Enemy" instance=ExtResource("1_kje8b")] +enemy_name = 10 + +[node name="Sprite2D" parent="." index="3"] +scale = Vector2(0.447793, 0.447793) +texture = ExtResource("2_nr485") + +[node name="CollisionPolygon2D" parent="Area2D" index="0"] +position = Vector2(25.479, -3.69674) +scale = Vector2(1.40701, 0.94837) +polygon = PackedVector2Array(-111.924, 282.27, 94.1861, 286.488, 188.713, 205.296, 97.029, 98.7977, 121.194, -47.7696, 83.5252, -311.38, -109.081, -310.326, -173.758, 88.2533) + +[node name="HealthLabel" parent="." index="6"] +offset_top = -352.0 +offset_bottom = -313.0 + +[node name="StressLabel" parent="." index="7"] +offset_top = -411.0 +offset_bottom = -372.0 diff --git a/Entity/Enemy/EnemyScene/motorized_bear_leader.tscn b/Entity/Enemy/EnemyScene/motorized_bear_leader.tscn new file mode 100644 index 00000000..a8eadf1c --- /dev/null +++ b/Entity/Enemy/EnemyScene/motorized_bear_leader.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=3 format=3 uid="uid://btt0xgebuosow"] + +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_ivea1"] +[ext_resource type="Texture2D" uid="uid://ua4ml58lwg4r" path="res://Art/Enemies/motorized_bears/motorized_bear_leader-finished.png" id="2_4f3hy"] + +[node name="Enemy" instance=ExtResource("1_ivea1")] +enemy_name = 35 + +[node name="HealthComponent" parent="." index="2"] +max_health = 200 + +[node name="Sprite2D" parent="." index="3"] +scale = Vector2(0.23, 0.23) +texture = ExtResource("2_4f3hy") + +[node name="CollisionPolygon2D" parent="Area2D" index="0"] +polygon = PackedVector2Array(-223, 173, 94, 174, 175, 53, 172, -62, 234, -150, 32, -174, -202, -84) + +[node name="HealthLabel" parent="." index="6"] +offset_top = -243.0 +offset_bottom = -204.0 + +[node name="StressLabel" parent="." index="7"] +offset_top = -284.0 +offset_bottom = -245.0 diff --git a/Entity/Enemy/EnemyScene/motorized_bear_underling_1.tscn b/Entity/Enemy/EnemyScene/motorized_bear_underling_1.tscn new file mode 100644 index 00000000..52066a78 --- /dev/null +++ b/Entity/Enemy/EnemyScene/motorized_bear_underling_1.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://ddmdgjwr55yep"] + +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_5lmv1"] +[ext_resource type="Texture2D" uid="uid://qwjhfnceugt0" path="res://Art/Enemies/motorized_bears/motorized_bear_underlings_1-finished.png" id="2_4k1f2"] + +[node name="Enemy" instance=ExtResource("1_5lmv1")] +enemy_name = 35 + +[node name="HealthComponent" parent="." index="2"] +max_health = 75 + +[node name="Sprite2D" parent="." index="3"] +scale = Vector2(0.15, 0.15) +texture = ExtResource("2_4k1f2") + +[node name="CollisionPolygon2D" parent="Area2D" index="0"] +polygon = PackedVector2Array(-136, 109, 72, 107, 134, 24, 127, -107, -62, -108, -78, -87, -64, -40, -134, 11) + +[node name="HealthLabel" parent="." index="6"] +offset_left = -37.0 +offset_top = -157.0 +offset_right = 77.0 +offset_bottom = -118.0 + +[node name="StressLabel" parent="." index="7"] +offset_left = -37.0 +offset_top = -203.0 +offset_right = 77.0 +offset_bottom = -164.0 diff --git a/Entity/Enemy/EnemyScene/motorized_bear_underling_2.tscn b/Entity/Enemy/EnemyScene/motorized_bear_underling_2.tscn new file mode 100644 index 00000000..09d47e31 --- /dev/null +++ b/Entity/Enemy/EnemyScene/motorized_bear_underling_2.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://xwiymm7vlijs"] + +[ext_resource type="PackedScene" uid="uid://bpgsmfprnm2kk" path="res://Entity/Enemy/EnemyScene/Enemy.tscn" id="1_5lmv1"] +[ext_resource type="Texture2D" uid="uid://cw0id8n5qemg8" path="res://Art/Enemies/motorized_bears/motorized_bear_underlings_2-finished.png" id="2_qqj6j"] + +[node name="Enemy" instance=ExtResource("1_5lmv1")] +enemy_name = 35 + +[node name="HealthComponent" parent="." index="2"] +max_health = 75 + +[node name="Sprite2D" parent="." index="3"] +scale = Vector2(0.15, 0.15) +texture = ExtResource("2_qqj6j") + +[node name="CollisionPolygon2D" parent="Area2D" index="0"] +polygon = PackedVector2Array(-125, 107, 79, 112, 140, 29, 134, -101, -62, -108, -78, -87, -56, -43, -127, 10) + +[node name="HealthLabel" parent="." index="6"] +offset_left = -37.0 +offset_top = -157.0 +offset_right = 77.0 +offset_bottom = -118.0 + +[node name="StressLabel" parent="." index="7"] +offset_left = -37.0 +offset_top = -203.0 +offset_right = 77.0 +offset_bottom = -164.0 diff --git a/Entity/Player/Player.tscn b/Entity/Player/Player.tscn index 6eb87165..f3482cee 100644 --- a/Entity/Player/Player.tscn +++ b/Entity/Player/Player.tscn @@ -4,18 +4,18 @@ [ext_resource type="Script" path="res://Entity/Components/StatComponent.gd" id="2_cf8lx"] [ext_resource type="Script" path="res://Entity/Components/StatusComponent.gd" id="3_l5gfj"] [ext_resource type="Script" path="res://Entity/Components/HealthComponent.gd" id="4_8ip81"] -[ext_resource type="Texture2D" uid="uid://cq1ii3ed6oels" path="res://Art/Character/default.png" id="5_ygjep"] +[ext_resource type="Texture2D" uid="uid://ch03socwivjxp" path="res://Art/Character/concept_art_lighted.png" id="5_widel"] [ext_resource type="Script" path="res://Input/ClickHandler.gd" id="6_kgqto"] [ext_resource type="Script" path="res://UI/HealthLabel.gd" id="7_1hqya"] [ext_resource type="Script" path="res://Entity/Components/PartyComponent.gd" id="8_mmgs7"] [ext_resource type="Script" path="res://Entity/Components/EnergyComponent.gd" id="9_5kwft"] -[ext_resource type="PackedScene" path="res://Entity/Components/block_display.tscn" id="10_cogpc"] +[ext_resource type="PackedScene" uid="uid://dbidy5j4uyopc" path="res://Entity/Components/block_display.tscn" id="10_cogpc"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_b8bva"] -size = Vector2(104, 93) +size = Vector2(577, 731) [sub_resource type="LabelSettings" id="LabelSettings_urr12"] -font_size = 26 +font_size = 55 [node name="Player" type="Node2D"] script = ExtResource("1_4qbo7") @@ -30,8 +30,8 @@ script = ExtResource("3_l5gfj") script = ExtResource("4_8ip81") [node name="Sprite2D" type="Sprite2D" parent="."] -scale = Vector2(6, 6) -texture = ExtResource("5_ygjep") +scale = Vector2(0.764854, 0.764854) +texture = ExtResource("5_widel") [node name="ClickHandler" type="Node" parent="."] script = ExtResource("6_kgqto") @@ -39,14 +39,14 @@ script = ExtResource("6_kgqto") [node name="Area2D" type="Area2D" parent="."] [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] -position = Vector2(5, 2.5) +position = Vector2(-65.5, 42.5) shape = SubResource("RectangleShape2D_b8bva") [node name="HealthLabel" type="Label" parent="." node_paths=PackedStringArray("health_component")] -offset_left = -48.0 -offset_top = -84.0 -offset_right = 52.0 -offset_bottom = -45.0 +offset_left = -390.0 +offset_top = -168.0 +offset_right = -183.0 +offset_bottom = -77.0 text = "100/100" label_settings = SubResource("LabelSettings_urr12") script = ExtResource("7_1hqya") diff --git a/Global/DEBUG_VAR.gd b/Global/DEBUG_VAR.gd index b95e7067..6fcf0170 100644 --- a/Global/DEBUG_VAR.gd +++ b/Global/DEBUG_VAR.gd @@ -19,3 +19,7 @@ const DEBUG_ACTIVE_INVENTORY_DEBUG_BUTTONS : bool = false ## Temporary debug option to print the number of each generated event type [br] ## TO BE REMOVED after implmentation const DEBUG_PRINT_EVENT_COUNT : bool = false + +## Used in tests to use the same enemy group all the time +## It can't be a const because we change it inside the tests +var DEBUG_USE_TEST_ENEMY_GROUP: bool = false diff --git a/Global/Global_Enums.gd b/Global/Global_Enums.gd index 25f8fe1d..353d37d2 100644 --- a/Global/Global_Enums.gd +++ b/Global/Global_Enums.gd @@ -116,3 +116,56 @@ static func choose_event_from_type(event_type: EventType) -> EventBase: return EventDialogue.new() # A case for an EventType has not been defined, so we arbitrarily return Random return EventRandom.new() + + +## All the available enemies +enum PossibleEnemies { + billy, + cat_5_hurricane, + cat_eyes, + cubicle_villager, + definitely_a_ku100, + edgar_allen_poe, + emu_ku100, + family_friendly_pangolin, + faun_club, + four_dio, + golden_cauldron, + green_beans, + he_moves_in_a_pentagram, + ku10000, + matter_baby, + mushroomling, + overflowing_blender_of_mac_n_cheese, + placid_puddle, + sapoling, + seedlings, + slime_in_jar, + slime_mold, + slimeling, + snail, + suited_bald_man, + suspiciously_cheap_slime, + swarm_of_insects, + the_slide, + the_snake, + undefended_soccer_net, + wendigo, + spiral_of_ants, + + # Mini-boss + attack_elephant, + clarence_the_worm, + fauna_inventory, + motorized_bears, + not_pickle, + one_guy, + orange_on_a_table, + untuned_kalimba, + # Boss + asmr_rically_accurate_omni_angel, + bethany, + nemu, + o_beehive, + the_berts, +} diff --git a/Managers/CardManager.gd b/Managers/CardManager.gd index 2aa0f656..f363dab4 100644 --- a/Managers/CardManager.gd +++ b/Managers/CardManager.gd @@ -48,7 +48,7 @@ func save_data() -> void: var save_file: ConfigFile = SaveManager.save_file save_file.set_value("CardManager", "current_deck", current_deck) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: push_error("Error saving player data: ", error) diff --git a/Managers/EnemyManager.gd b/Managers/EnemyManager.gd index b6e1ba7d..16286852 100644 --- a/Managers/EnemyManager.gd +++ b/Managers/EnemyManager.gd @@ -2,7 +2,119 @@ extends Node ## Globally accessible for easy access to the enemies ## They are for now only accessible through the battler which is not very practical -## The list of enemies to spawn -@export var enemy_list: Array[Entity]: - set(list): - enemy_list = list +## Distribution of enemies over the floors [br] +## The values are arrays of PackedScene [br] +## The keys are of format (X,Y,Z) with X the tree section from 1 to 3, +## Y the lower percent at which the enemy groups of the corresponding value are found, +## Z the higher percent at which the enemy groups of the corresponding vlaue are found [br] +## The intervals defined by the values are continuous, successive and non-overlapping. +@export var enemy_group_distribution: Dictionary = { + [1, 0, 20]: [], # an array of packed scene for enemy groups + [1, 20, 40]: [], + [1, 40, 60]: [], + [1, 60, 80]: [], + [1, 80, 100]: [], + [2, 0, 20]: [], # section 2 + [2, 20, 40]: [], + [2, 40, 60]: [], + [2, 60, 80]: [], + [2, 80, 100]: [], + [3, 0, 20]: [], # section 3 + [3, 20, 40]: [], + [3, 40, 60]: [], + [3, 60, 80]: [], + [3, 80, 100]: [], +} + +## The group of enemies currently being used, set at the start of the combat [br] +var current_enemy_group: EnemyGroup + +## The packed scene corresponding to the group of enemies, this is used to keep track of it between saves [br] +## DO NOT FORGET to set this back to null once the fight is done [br] +## The reset is handled via signals to be sure to not forget it when changing the battler +var current_enemy_group_packed: PackedScene = null + +## The last recorded lower bound of the current sub-section +var current_lower_bound: int = enemy_group_distribution.keys()[0][1] +## The last recorded higher bound of the current sub-section +var current_higher_bound: int = enemy_group_distribution.keys()[0][2] +## The last used array of enemy group +var enemy_group_array: Array[PackedScene] +## The shuffled version of the `enemy_group_array` +var shuffled_enemy_group_array: Array[PackedScene] = [] + +func _ready() -> void: + if enemy_group_array.is_empty(): + enemy_group_array.assign(enemy_group_distribution.values()[0]) + PhaseManager.on_event_win.connect(_clear_data) + PhaseManager.on_defeat.connect(_clear_data) + + +## This calls the inner function that actually chooses the enemy group [br] +## This is done to save the packed scene in this EnemyManger before it is returned +func choose_enemy_group() -> PackedScene: + var packed_enemy_group: PackedScene = _choose_enemy_group_inner() + current_enemy_group_packed = packed_enemy_group + return packed_enemy_group + +## Chooses an enemy group in the following way: [br] +## - Check if the player is in the same sub-section as the previous time this function was called [br] +## - Choose an array of enemy group depending on player position if either sub-section changed, or the array to choose from is empty [br] +## - Shuffle it, pop the last element of that array +func _choose_enemy_group_inner() -> PackedScene: + if current_enemy_group != null: + return current_enemy_group_packed + if DebugVar.DEBUG_USE_TEST_ENEMY_GROUP: + return load("res://Entity/Enemy/EnemyGroup/test_group.tscn") # return a test group + var height_percent_position: float = MapManager.get_map_percent_with_player_position() + if (current_lower_bound <= height_percent_position && current_higher_bound > height_percent_position): + # meaning we stayed in the same sub-section of the map, keep the same array of enemies + if shuffled_enemy_group_array.is_empty(): + shuffled_enemy_group_array = enemy_group_array + shuffled_enemy_group_array.shuffle() + + return shuffled_enemy_group_array.pop_back() + else: + # we entered a new sub-section, search the corresponding array of enemy group + for key: Array[int] in enemy_group_distribution: + # include lower bound, exclude higher bound + if (key[1] <= height_percent_position && key[2] > height_percent_position): + enemy_group_array = enemy_group_distribution[key] + shuffled_enemy_group_array = enemy_group_array + shuffled_enemy_group_array.shuffle() + return shuffled_enemy_group_array.pop_back() + push_error("No suitable sub-section or enemy has been found, returning a default enemy group") + return load("res://Entity/Enemy/EnemyGroup/test_group.tscn") # return the test group to not crash the game + +func save_data() -> void: + var save_file: ConfigFile = SaveManager.save_file + save_file.set_value("EnemyManager", "current_enemy_group", current_enemy_group) + save_file.set_value("EnemyManager", "current_lower_bound", current_lower_bound) + save_file.set_value("EnemyManager", "current_higher_bound", current_higher_bound) + save_file.set_value("EnemyManager", "enemy_group_array", enemy_group_array) + save_file.set_value("EnemyManager", "shuffled_enemy_group_array", shuffled_enemy_group_array) + + var error: Error = save_file.save(SaveManager.save_file_path) + if error: + push_error("Error saving inventory data: ", error) + +func load_data() -> void: + var save_file: ConfigFile = SaveManager.load_save_file() + if save_file == null: + return + + if save_file.has_section_key("EnemyManager", "current_enemy_group"): + current_enemy_group = save_file.get_value("EnemyManager", "current_enemy_group") + if save_file.has_section_key("EnemyManager", "current_lower_bound"): + current_lower_bound = save_file.get_value("EnemyManager", "current_lower_bound") + if save_file.has_section_key("EnemyManager", "current_higher_bound"): + current_higher_bound = save_file.get_value("EnemyManager", "current_higher_bound") + if save_file.has_section_key("EnemyManager", "enemy_group_array"): + enemy_group_array = save_file.get_value("EnemyManager", "enemy_group_array") + if save_file.has_section_key("EnemyManager", "shuffled_enemy_group_array"): + shuffled_enemy_group_array = save_file.get_value("EnemyManager", "shuffled_enemy_group_array") + +## Clear the data regarding the current enemy group being fought +func _clear_data() -> void: + current_enemy_group = null + current_enemy_group_packed = null diff --git a/Managers/EnemyManager.tscn b/Managers/EnemyManager.tscn new file mode 100644 index 00000000..5f8c0d37 --- /dev/null +++ b/Managers/EnemyManager.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=4 format=3 uid="uid://3frrexqe4dng"] + +[ext_resource type="Script" path="res://Managers/EnemyManager.gd" id="1_3jnpp"] +[ext_resource type="PackedScene" uid="uid://1uqpxix8wb18" path="res://Entity/Enemy/EnemyGroup/golden_cauldron_group.tscn" id="2_7seft"] +[ext_resource type="PackedScene" uid="uid://cio8a6qvoj2k" path="res://Entity/Enemy/EnemyGroup/motorized_bears.tscn" id="3_t6wf7"] + +[node name="EnemyManager" type="Node2D"] +script = ExtResource("1_3jnpp") +enemy_group_distribution = { +[1, 0, 20]: [ExtResource("2_7seft"), ExtResource("3_t6wf7")], +[1, 20, 40]: [], +[1, 40, 60]: [], +[1, 60, 80]: [], +[1, 80, 100]: [], +[2, 0, 20]: [], +[2, 20, 40]: [], +[2, 40, 60]: [], +[2, 60, 80]: [], +[2, 80, 100]: [], +[3, 0, 20]: [], +[3, 20, 40]: [], +[3, 40, 60]: [], +[3, 60, 80]: [], +[3, 80, 100]: [] +} diff --git a/Managers/InventoryManager.gd b/Managers/InventoryManager.gd index de556e16..7b5ef783 100644 --- a/Managers/InventoryManager.gd +++ b/Managers/InventoryManager.gd @@ -54,7 +54,7 @@ func save_inventory() -> void: save_file.set_value("InventoryManager", "consumable_component", consumable_component) save_file.set_value("InventoryManager", "relic_component", relic_component) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: push_error("Error saving inventory data: ", error) diff --git a/Managers/MapManager.gd b/Managers/MapManager.gd index f908a8f4..1f158aac 100644 --- a/Managers/MapManager.gd +++ b/Managers/MapManager.gd @@ -248,7 +248,7 @@ func save_map_data() -> void: var save_file: ConfigFile = SaveManager.save_file save_file.set_value("MapManager", "map_width_array", map_width_array) save_file.set_value("MapManager", "current_map", current_map) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: print("Error saving player data: ", error) @@ -292,3 +292,11 @@ func debug_print_event_count() -> void: for k: String in events: print("Event " + k + " has " + str(events[k]) + " rooms (expected: "+ str(float(expected_probabilities[k] * total_nb_rooms/100.0)).pad_decimals(2) +"). (The percentage is " + str(float(events[k]) * 100 / total_nb_rooms).pad_decimals(2) + "%, expected: " + str(expected_probabilities[k]) + "%)") print("Total number of rooms generated: " + str(total_nb_rooms)) + + +## Returns the percent height of the player in the current map +func get_map_percent_with_player_position() -> float: + var player_position: Vector2i = PlayerManager.player_position + var number_of_floors: int = map_width_array.size() + var player_y_floor: int = player_position.y + return (player_y_floor/number_of_floors) * 100 diff --git a/Managers/PlayerManager.gd b/Managers/PlayerManager.gd index e07df234..1a5c013d 100644 --- a/Managers/PlayerManager.gd +++ b/Managers/PlayerManager.gd @@ -51,7 +51,7 @@ func save_player() -> void: save_file.set_value("Player", "player_room", player_room) save_file.set_value("Player", "player_persistent_data", player_persistent_data) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: push_error("Error saving player data: ", error) diff --git a/Managers/SaveManager.gd b/Managers/SaveManager.gd index 6b2c62be..f3435d5b 100644 --- a/Managers/SaveManager.gd +++ b/Managers/SaveManager.gd @@ -1,6 +1,7 @@ extends Node var save_file: ConfigFile +var save_file_path: String = "user://save/save_data.ini" func _ready() -> void: save_file = ConfigFile.new() @@ -14,14 +15,15 @@ func execute_save() -> void: InventoryManager.save_inventory() CardManager.save_data() SceneManager.save_scene_data() + EnemyManager.save_data() func clear_data() -> void: DirAccess.remove_absolute("user://save/current_scene.tscn") - DirAccess.remove_absolute("user://save/save_data.ini") + DirAccess.remove_absolute(SaveManager.save_file_path) func load_save_file() -> ConfigFile: - if FileAccess.file_exists("user://save/save_data.ini"): - var error: Error = save_file.load("user://save/save_data.ini") + if FileAccess.file_exists(SaveManager.save_file_path): + var error: Error = save_file.load(SaveManager.save_file_path) if error: push_error("Error loading save_data ", error) @@ -32,5 +34,5 @@ func load_save_file() -> ConfigFile: return null func has_saved_data() -> bool: - var save_file: ConfigFile = SaveManager.load_save_file() - return save_file != null + var save_file_loc: ConfigFile = SaveManager.load_save_file() + return save_file_loc != null diff --git a/Managers/SceneManager.gd b/Managers/SceneManager.gd index d1de8749..4018a8b2 100644 --- a/Managers/SceneManager.gd +++ b/Managers/SceneManager.gd @@ -87,7 +87,7 @@ func save_scene_data() -> void: var save_file: ConfigFile = SaveManager.save_file save_file.set_value("SceneManager", "current_event", current_event) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: push_error("Error saving player data: ", error) diff --git a/Managers/XpManager.gd b/Managers/XpManager.gd index 97f677a6..52b5444d 100644 --- a/Managers/XpManager.gd +++ b/Managers/XpManager.gd @@ -71,7 +71,7 @@ func save_data() -> void: var save_file: ConfigFile = SaveManager.save_file save_file.set_value("XPManager", "current_xp", current_xp) - var error: Error = save_file.save("user://save/save_data.ini") + var error: Error = save_file.save(SaveManager.save_file_path) if error: print("Error saving player data: ", error) diff --git a/Tests/TestBase.gd b/Tests/TestBase.gd index 25d1a164..70b103ef 100644 --- a/Tests/TestBase.gd +++ b/Tests/TestBase.gd @@ -49,6 +49,7 @@ var _enemy_list: Array[Entity] ## To be overidden by child tests if they want to do something more or something else [br] ## Child tests that just want to add some stuff can call super to do the initial setup, then their own setup func before_each() -> void: + DebugVar.DEBUG_USE_TEST_ENEMY_GROUP = true # Init the player, battler, and card container _player = _player_scene.instantiate() _battler = _battler_scene.instantiate() @@ -59,8 +60,9 @@ func before_each() -> void: get_tree().root.add_child(_battler) get_tree().root.add_child(_card_container) - # Setup enemy list _enemy_list = _battler._enemy_list + + # Setup enemy list _enemy = _enemy_list[0] # enemy 1 has 100 HP _enemy_2 = _enemy_list[1] # enemy 2 50 HP @@ -92,6 +94,7 @@ func before_each() -> void: ## Clear between tests func after_each() -> void: + DebugVar.DEBUG_USE_TEST_ENEMY_GROUP = false _player.queue_free() _enemy.queue_free() _enemy_2.queue_free() diff --git a/Tests/test_death_handling.gd b/Tests/test_death_handling.gd index 8f79db4c..7c47457e 100644 --- a/Tests/test_death_handling.gd +++ b/Tests/test_death_handling.gd @@ -142,10 +142,10 @@ func test_enemy_list_size_enemy_manager() -> void: var card_damage: CardBase = load("res://Cards/Resource/Card_Damage.tres") assert_eq(_enemy_list.size(), 2) - assert_eq(EnemyManager.enemy_list.size(), 2) + assert_eq(EnemyManager.current_enemy_group.enemy_list.size(), 2) card_damage.on_card_play(_player, _enemy) assert_eq(_enemy_list.size(), 1) - assert_eq(EnemyManager.enemy_list.size(), 1) + assert_eq(EnemyManager.current_enemy_group.enemy_list.size(), 1) assert_true(_enemy.is_queued_for_deletion()) await get_tree().process_frame assert_false(is_instance_valid(_enemy)) diff --git a/Tests/test_health.gd b/Tests/test_health.gd index fd1b08e0..cf4d9066 100644 --- a/Tests/test_health.gd +++ b/Tests/test_health.gd @@ -93,7 +93,7 @@ func test_poison_status() -> void: # Test Card to Deal 2 damage to all enemies func test_card_damage_all() -> void: - _enemy.get_party_component().set_party(_enemy_list) + _enemy.get_party_component().set_party(_enemy_list ) var card_damage_all: CardBase = load("res://Cards/Resource/Card_DamageAllEnemies.tres") card_damage_all.on_card_play(_player, null) diff --git a/project.godot b/project.godot index 45e3094c..bb6ec744 100644 --- a/project.godot +++ b/project.godot @@ -29,7 +29,7 @@ CardManager="*res://Managers/CardManager.gd" PhaseManager="*res://Managers/PhaseManager.gd" RandomGenerator="*res://Managers/RandomGenerator.gd" GlobalVar="*res://Global/GLOBAL_VAR.gd" -EnemyManager="*res://Managers/EnemyManager.gd" +EnemyManager="*res://Managers/EnemyManager.tscn" MapManager="*res://Managers/MapManager.gd" InventoryManager="*res://Managers/InventoryManager.gd" DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"