diff --git a/prefabs/UI/Inventory/Inventory.tscn b/prefabs/UI/Inventory/Inventory.tscn index 7a6d4da..87a6ea2 100644 --- a/prefabs/UI/Inventory/Inventory.tscn +++ b/prefabs/UI/Inventory/Inventory.tscn @@ -472,7 +472,7 @@ offset_right = 54.4142 offset_bottom = 207.286 grow_horizontal = 0 grow_vertical = 2 -text = "[I]" +text = "[i]" label_settings = SubResource("LabelSettings_l3npx") [node name="QuestLogRoot" parent="." instance=ExtResource("7_vvo7l")] diff --git a/prefabs/characters/Player2D.tscn b/prefabs/characters/Vesna.tscn similarity index 97% rename from prefabs/characters/Player2D.tscn rename to prefabs/characters/Vesna.tscn index cff4237..b8070d8 100644 --- a/prefabs/characters/Player2D.tscn +++ b/prefabs/characters/Vesna.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=485 format=3 uid="uid://c25udixd5m6l0"] +[gd_scene load_steps=489 format=3 uid="uid://c25udixd5m6l0"] [ext_resource type="Script" uid="uid://b05uyj001ehwi" path="res://scripts/CSharp/Common/Farming/VesnaBehaviour2D.cs" id="1_yd5ep"] [ext_resource type="Script" uid="uid://cjbclkxesh3hc" path="res://scripts/CSharp/Common/CharacterControls/PlayerMovement.cs" id="2_1vqmv"] @@ -283,6 +283,7 @@ [ext_resource type="Resource" uid="uid://tt3d166mntmi" path="res://resources/low code/farming/var_sceneNameProvider.tres" id="471_83c4i"] [ext_resource type="AudioStream" uid="uid://fihv17va3r58" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_02_R.wav" id="471_e04c3"] [ext_resource type="AudioStream" uid="uid://cvvjd2i6x047n" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_03_R.wav" id="472_g32y8"] +[ext_resource type="Script" uid="uid://dj1qjambsa4pg" path="res://scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs" id="472_kduih"] [ext_resource type="Texture2D" uid="uid://blh0t2ofqj2uq" path="res://art/animation/Vesna2D/Vesna Anims Tools/F01-Idle-Gießkanne/0016.png" id="472_wdxsr"] [ext_resource type="AudioStream" uid="uid://dymoalptxmge" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_04_R.wav" id="473_8hbu5"] [ext_resource type="AudioStream" uid="uid://4555a4w30tda" path="res://audio/sfx/Footsteps/Single/Gravel/Reverb/SFX_Footstep_Gravel_05_R.wav" id="474_t1d6r"] @@ -294,8 +295,11 @@ [ext_resource type="Texture2D" uid="uid://dqubvx1a08kn4" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0002.png" id="478_5myrm"] [ext_resource type="Texture2D" uid="uid://dystt4hyqad74" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0004.png" id="480_wnay3"] [ext_resource type="Resource" uid="uid://cmqapbvv0hev2" path="res://resources/low code/farming/event_watering.tres" id="481_t1d6r"] +[ext_resource type="Script" uid="uid://d27xoo1reo5gu" path="res://scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs" id="482_0ptfk"] [ext_resource type="Texture2D" uid="uid://bopxv06co1osl" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0006.png" id="482_wfdif"] +[ext_resource type="Script" uid="uid://iquhbkr7pqeg" path="res://scripts/CSharp/Common/Savegame/SaveCheats.cs" id="483_kduih"] [ext_resource type="Texture2D" uid="uid://coyggdfwgkeru" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0008.png" id="484_32thn"] +[ext_resource type="Script" uid="uid://ca4s0algeij1h" path="res://scripts/CSharp/Common/Savegame/SaveIDProviderTool.cs" id="484_upuan"] [ext_resource type="Texture2D" uid="uid://du6x1h42smp6m" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0010.png" id="486_kobao"] [ext_resource type="Texture2D" uid="uid://bras5gn8ov27l" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0012.png" id="488_ygjj5"] [ext_resource type="Texture2D" uid="uid://rjmsht4g8dvp" path="res://art/animation/Vesna2D/Vesna Anims Sequences/F02-Walk/0014.png" id="490_6603x"] @@ -2119,38 +2123,57 @@ frame = 7 frame_progress = 0.229832 offset = Vector2(0, -450) -[node name="WateringCanUI" type="Node2D" parent="CharacterBody2D" node_paths=PackedStringArray("_slider")] -position = Vector2(0, -929) +[node name="DetectionCross" parent="CharacterBody2D" instance=ExtResource("466_e04c3")] +position = Vector2(0, -200) + +[node name="PlantCreatedEventListener" type="Node" parent="CharacterBody2D"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("468_t1d6r")]) + +[node name="PickedUpInteractableListener" type="Node" parent="CharacterBody2D"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("469_t1d6r")]) + +[node name="WateringCan" type="Node2D" parent="CharacterBody2D"] + +[node name="WateringCanFillState" type="Node" parent="CharacterBody2D/WateringCan" groups=["Saveable"]] +script = ExtResource("482_0ptfk") +Payload = 0 +metadata/SaveID = "2d2f153b-8a09-45a9-b114-79259c833f9f" + +[node name="WateringEventListener" type="Node" parent="CharacterBody2D/WateringCan"] +script = ExtResource("467_8hbu5") +_eventResources = Array[Object]([ExtResource("481_t1d6r")]) + +[node name="WateringCanUI" type="Node2D" parent="CharacterBody2D/WateringCan" node_paths=PackedStringArray("_slider")] +position = Vector2(0, -939) scale = Vector2(2, 2) script = ExtResource("467_j4m0f") _slider = NodePath("HSlider") -[node name="HSlider" type="HSlider" parent="CharacterBody2D/WateringCanUI"] +[node name="HSlider" type="HSlider" parent="CharacterBody2D/WateringCan/WateringCanUI"] visible = false modulate = Color(0.3515, 0.780425, 0.95, 1) custom_minimum_size = Vector2(150, 50) anchors_preset = 5 anchor_left = 0.5 anchor_right = 0.5 -offset_left = -43.0 -offset_right = 57.0 -offset_bottom = 64.0 +offset_left = -115.0 +offset_top = -33.999996 +offset_right = 35.0 +offset_bottom = 30.000004 grow_horizontal = 2 +scale = Vector2(1.4200003, 2.5611823) +size_flags_horizontal = 3 +size_flags_vertical = 2 max_value = 1.0 step = 0.0 editable = false scrollable = false -[node name="DetectionCross" parent="CharacterBody2D" instance=ExtResource("466_e04c3")] -position = Vector2(0, -200) - -[node name="PlantCreatedEventListener" type="Node" parent="CharacterBody2D"] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("468_t1d6r")]) - -[node name="PickedUpInteractableListener" type="Node" parent="CharacterBody2D"] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("469_t1d6r")]) +[node name="WateringCanSaveHelper" type="Node" parent="CharacterBody2D/WateringCan" node_paths=PackedStringArray("_wateringCanFillStateNode")] +script = ExtResource("472_kduih") +_wateringCanFillStateNode = NodePath("../WateringCanFillState") [node name="FarmingControls" type="Node2D" parent="." node_paths=PackedStringArray("_movingPlayer")] script = ExtResource("817_6nrw3") @@ -2174,18 +2197,23 @@ script = ExtResource("471_2f15g") [node name="Timer" type="Timer" parent="SFX/FootstepsAudio"] wait_time = 0.5 -[node name="WateringEventListener" type="Node" parent="."] -script = ExtResource("467_8hbu5") -_eventResources = Array[Object]([ExtResource("481_t1d6r")]) +[node name="SaveSystem" type="Node" parent="."] + +[node name="SaveGameCheat" type="Node" parent="SaveSystem"] +script = ExtResource("483_kduih") + +[node name="SaveIDProvider" type="Node" parent="SaveSystem"] +script = ExtResource("484_upuan") -[connection signal="FilledWateringCan" from="." to="CharacterBody2D/WateringCanUI" method="Refill"] -[connection signal="InventorySelectionChanged" from="." to="CharacterBody2D/WateringCanUI" method="IsWateringCanActive"] +[connection signal="FilledWateringCan" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="Refill"] +[connection signal="InventorySelectionChanged" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="IsWateringCanActive"] [connection signal="PickedUpTool" from="." to="CharacterBody2D/visuals" method="ActivateTool"] -[connection signal="PickedUpTool" from="." to="CharacterBody2D/WateringCanUI" method="IsWateringCanActive"] +[connection signal="PickedUpTool" from="." to="CharacterBody2D/WateringCan/WateringCanUI" method="IsWateringCanActive"] [connection signal="LookDirection" from="CharacterBody2D/visuals" to="CharacterBody2D/DetectionCross" method="SetDirection"] [connection signal="EventRaised" from="CharacterBody2D/PlantCreatedEventListener" to="CharacterBody2D/visuals" method="PlayFarmingAnimation"] [connection signal="EventRaised" from="CharacterBody2D/PickedUpInteractableListener" to="CharacterBody2D/visuals" method="PlayPickUpAnimation"] +[connection signal="OnLoadingComplete" from="CharacterBody2D/WateringCan/WateringCanFillState" to="CharacterBody2D/WateringCan/WateringCanSaveHelper" method="OnLoad"] +[connection signal="EventRaised" from="CharacterBody2D/WateringCan/WateringEventListener" to="CharacterBody2D/visuals" method="PlayWateringAnimation"] +[connection signal="EventRaised" from="CharacterBody2D/WateringCan/WateringEventListener" to="CharacterBody2D/WateringCan/WateringCanUI" method="Water"] [connection signal="timelineStarted" from="DialogicToggle" to="SFX/FootstepsAudio/Timer" method="stop"] [connection signal="timeout" from="SFX/FootstepsAudio/Timer" to="SFX/FootstepsAudio" method="PlayOneShot"] -[connection signal="EventRaised" from="WateringEventListener" to="CharacterBody2D/visuals" method="PlayWateringAnimation"] -[connection signal="EventRaised" from="WateringEventListener" to="CharacterBody2D/WateringCanUI" method="Water"] diff --git a/prefabs/day_and_night/day_and_night.tscn b/prefabs/day_and_night/day_and_night.tscn new file mode 100644 index 0000000..5b6dfd1 --- /dev/null +++ b/prefabs/day_and_night/day_and_night.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=3 uid="uid://cqy831wnquvpc"] + +[ext_resource type="Script" uid="uid://d27xoo1reo5gu" path="res://scripts/CSharp/Low Code/Variables/SaveableVariableNode.cs" id="1_386s0"] +[ext_resource type="Script" uid="uid://du5facslfvg77" path="res://scripts/CSharp/Common/DayAndNight/CalendarController.cs" id="2_bl8tj"] + +[node name="Day and Night" type="Node"] + +[node name="Controller" type="Node" parent="." node_paths=PackedStringArray("_dayCounter")] +script = ExtResource("2_bl8tj") +_dayCounter = NodePath("../DayCounter") + +[node name="DayCounter" type="Node" parent="." groups=["Saveable"]] +script = ExtResource("1_386s0") +Payload = 0 +metadata/SaveID = "12c6da2e-fc71-4281-a04a-dfd3c7943975" diff --git a/prefabs/farm/plants/base_plant.tscn b/prefabs/farm/plants/base_plant.tscn index d20e588..b234d2b 100644 --- a/prefabs/farm/plants/base_plant.tscn +++ b/prefabs/farm/plants/base_plant.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://gishbn0a8eke"] +[gd_scene load_steps=12 format=3 uid="uid://gishbn0a8eke"] [ext_resource type="Script" uid="uid://cms357f23fmfy" path="res://scripts/CSharp/Common/Farming/PlantBehaviour2D.cs" id="1_66p1c"] [ext_resource type="Texture2D" uid="uid://mrnc81ukugh6" path="res://art/farm/farming/farmobjekte/plant_template.png" id="2_oyl0t"] @@ -6,6 +6,7 @@ [ext_resource type="PackedScene" uid="uid://cqc72e4hq6bcd" path="res://prefabs/interactions/interaction_area_2d.tscn" id="5_3j24b"] [ext_resource type="PackedScene" uid="uid://dpbbroif2tnil" path="res://prefabs/interactions/generic_item_on_ground_2d.tscn" id="6_gdrin"] [ext_resource type="Resource" uid="uid://blr8tine5m0ma" path="res://resources/items/tomato.tres" id="7_vjw4j"] +[ext_resource type="Script" uid="uid://j2mhvb45egej" path="res://scripts/CSharp/Low Code/Variables/VariableNode.cs" id="8_3og52"] [ext_resource type="Texture2D" uid="uid://bleimj6jr1jka" path="res://art/general/rectangle.png" id="9_vjw4j"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_u4cty"] @@ -28,7 +29,7 @@ radius = 300.0 resource_local_to_scene = true radius = 300.0 -[node name="BasePlant" type="Node2D" node_paths=PackedStringArray("_seeds", "_smallPlants", "_bigPlants", "_readyPlants", "_harvestablePlant", "_magicEffect")] +[node name="BasePlant" type="Node2D" node_paths=PackedStringArray("_seeds", "_smallPlants", "_bigPlants", "_readyPlants", "_harvestablePlant", "_magicEffect", "_lifecycle")] z_index = 1 y_sort_enabled = true script = ExtResource("1_66p1c") @@ -38,6 +39,7 @@ _bigPlants = [NodePath("BigPlant/01"), NodePath("BigPlant/02"), NodePath("BigPla _readyPlants = [NodePath("ReadyPlantInventoryItem/ReadyPlant/01"), NodePath("ReadyPlantInventoryItem/ReadyPlant/02"), NodePath("ReadyPlantInventoryItem/ReadyPlant/03")] _harvestablePlant = NodePath("ReadyPlantInventoryItem") _magicEffect = NodePath("magic vfx") +_lifecycle = NodePath("LifeCycle") [node name="Seeds" type="Node2D" parent="."] position = Vector2(0, 0.5) @@ -136,6 +138,7 @@ shape = SubResource("CircleShape2D_vjw4j") [node name="ReadyPlantInventoryItem" parent="." instance=ExtResource("6_gdrin")] position = Vector2(0, 2.3) IsActive = false +_saveToDisk = false [node name="SpawnWithItem" parent="ReadyPlantInventoryItem" index="0"] _blueprint = ExtResource("7_vjw4j") @@ -206,6 +209,10 @@ scale_amount_max = 0.1 color = Color(0.400601, 0.62444, 0.791217, 1) hue_variation_max = 0.4 +[node name="LifeCycle" type="Node" parent="."] +script = ExtResource("8_3og52") +Payload = 3 + [connection signal="Interacted" from="GrowingInteractionArea" to="." method="Grow"] [connection signal="SuccessfulPickUp" from="ReadyPlantInventoryItem" to="." method="queue_free"] diff --git a/project.godot b/project.godot index a88b31e..66ef019 100644 --- a/project.godot +++ b/project.godot @@ -34,6 +34,7 @@ Signal_Debugger="*res://addons/SignalVisualizer/Debugger/SignalDebugger.gd" FightWorldAutoload="*res://prefabs/fight/fight_world_autoload.tscn" SaveGameManager="*res://scripts/CSharp/Common/Savegame/SaveGameManager.cs" SettingsSaveController="*res://scripts/CSharp/Common/Savegame/SettingsSaveController.cs" +DayAndNight="*res://prefabs/day_and_night/day_and_night.tscn" [dialogic] @@ -268,6 +269,7 @@ interact={ ui_inventory_open_close={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":73,"key_label":0,"unicode":105,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } ui_inventory_advance={ @@ -300,6 +302,11 @@ ui_inventory_journal_open_close={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":74,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null) ] } +NextDayCheat={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} [internationalization] diff --git a/scenes/Babushka_scene_bootstrap.tscn b/scenes/Babushka_scene_bootstrap.tscn index f567a1b..cc284e0 100644 --- a/scenes/Babushka_scene_bootstrap.tscn +++ b/scenes/Babushka_scene_bootstrap.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=3 format=3 uid="uid://bopv10dqm1knc"] +[gd_scene load_steps=5 format=3 uid="uid://bopv10dqm1knc"] [ext_resource type="PackedScene" uid="uid://c6wnoif01ltld" path="res://scenes/Babushka_scene_startMenu.tscn" id="1_15ton"] [ext_resource type="Script" uid="uid://bbp0dyddwdbl8" path="res://scripts/CSharp/Common/Savegame/WindowSettingsSync.cs" id="2_d3jfo"] +[ext_resource type="Script" uid="uid://iquhbkr7pqeg" path="res://scripts/CSharp/Common/Savegame/SaveCheats.cs" id="4_ocsjo"] +[ext_resource type="Script" uid="uid://ca4s0algeij1h" path="res://scripts/CSharp/Common/Savegame/SaveIDProviderTool.cs" id="5_iyo8m"] [node name="BabushkaSceneBootstrap" type="Node2D"] @@ -11,3 +13,11 @@ [node name="WindowSettings" type="Node" parent="."] script = ExtResource("2_d3jfo") + +[node name="SaveSystem" type="Node" parent="."] + +[node name="SaveGameCheat" type="Node" parent="SaveSystem"] +script = ExtResource("4_ocsjo") + +[node name="SaveIDProvider" type="Node" parent="SaveSystem"] +script = ExtResource("5_iyo8m") diff --git a/scenes/Babushka_scene_farm_outside_2d.tscn b/scenes/Babushka_scene_farm_outside_2d.tscn index a86eeaf..09d13c0 100644 --- a/scenes/Babushka_scene_farm_outside_2d.tscn +++ b/scenes/Babushka_scene_farm_outside_2d.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=118 format=3 uid="uid://gigb28qk8t12"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="1_7wfwe"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="1_7wfwe"] [ext_resource type="Texture2D" uid="uid://8sr11ex30n0m" path="res://art/mockups/Kenney_Backgrounds/Samples/uncolored_hills.png" id="2_7b2ri"] [ext_resource type="Script" uid="uid://bqomwxclsbhd3" path="res://scripts/CSharp/Common/Camera/CameraController.cs" id="3_p4qqi"] [ext_resource type="Texture2D" uid="uid://be1nofeo7an0" path="res://art/mockups/Kenney_Backgrounds/PNG/cloud2.png" id="3_r34wi"] @@ -1061,6 +1061,7 @@ position = Vector2(145.5, -224) shape = SubResource("RectangleShape2D_0sfl7") [node name="InteractionArea" parent="YSorted/Well" instance=ExtResource("27_klb81")] +_id = 1 metadata/SaveID = "b8f7b7fe-e057-4974-ba12-9134722998de" [node name="CollisionShape3D" parent="YSorted/Well/InteractionArea/Area2D" index="0"] diff --git a/scenes/Babushka_scene_farm_outside_2d_ducksCollected.tscn b/scenes/Babushka_scene_farm_outside_2d_ducksCollected.tscn index bc363ac..e4b3fb6 100644 --- a/scenes/Babushka_scene_farm_outside_2d_ducksCollected.tscn +++ b/scenes/Babushka_scene_farm_outside_2d_ducksCollected.tscn @@ -26,7 +26,7 @@ [ext_resource type="Shader" uid="uid://xnky830dtfsn" path="res://shader/repeat_texture.gdshader" id="24_1bax8"] [ext_resource type="Texture2D" uid="uid://btea6eyucsyxj" path="res://art/farm/farming/farmobjekte/zaun/tilable fence middle part.png" id="25_ox3k7"] [ext_resource type="Texture2D" uid="uid://3ed3dgq3irn2" path="res://art/farm/farming/farmobjekte/zaun/tilable fence end part2.png" id="26_rnkrk"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="28_d4s66"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="28_d4s66"] [ext_resource type="Resource" uid="uid://dlcmqfjvgphqu" path="res://resources/items/rake.tres" id="29_36k8l"] [ext_resource type="Resource" uid="uid://cndd64batns31" path="res://resources/items/wateringcan.tres" id="30_te7n5"] [ext_resource type="Texture2D" uid="uid://dg7rlugnq0t45" path="res://art/farm/farming/farmobjekte/brünnen.png" id="31_h1k77"] diff --git a/scenes/Babushka_scene_fight_world_room.tscn b/scenes/Babushka_scene_fight_world_room.tscn index 5665420..6396ece 100644 --- a/scenes/Babushka_scene_fight_world_room.tscn +++ b/scenes/Babushka_scene_fight_world_room.tscn @@ -23,7 +23,7 @@ [ext_resource type="Texture2D" uid="uid://bmjjfd5ngptxe" path="res://art/nature/baum märz 2025/backtreebois team kennedy.png" id="21_mlqvj"] [ext_resource type="Texture2D" uid="uid://bcw6oeovkmiup" path="res://art/nature/baum märz 2025/sonnenblumeseamless.png" id="22_22c4u"] [ext_resource type="Shader" uid="uid://xnky830dtfsn" path="res://shader/repeat_texture.gdshader" id="23_2ouqg"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="24_ffcio"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="24_ffcio"] [ext_resource type="Resource" uid="uid://dlcmqfjvgphqu" path="res://resources/items/rake.tres" id="25_3h260"] [ext_resource type="Resource" uid="uid://cndd64batns31" path="res://resources/items/wateringcan.tres" id="26_1bhpp"] [ext_resource type="Shader" uid="uid://braevmqauoek7" path="res://shader/swaying_plant.gdshader" id="27_txtka"] diff --git a/scenes/Babushka_scene_forest_fight_1_2d.tscn b/scenes/Babushka_scene_forest_fight_1_2d.tscn index 5b218ae..57ee474 100644 --- a/scenes/Babushka_scene_forest_fight_1_2d.tscn +++ b/scenes/Babushka_scene_forest_fight_1_2d.tscn @@ -27,7 +27,7 @@ [ext_resource type="Script" uid="uid://di0xxwfw43m0i" path="res://scripts/CSharp/Common/FightOld/FightStarter.cs" id="26_gg38r"] [ext_resource type="PackedScene" uid="uid://hk8ahyp6dgl6" path="res://prefabs/fightOld/fight_base_scene.tscn" id="27_55b52"] [ext_resource type="PackedScene" uid="uid://bp64p6y72j71w" path="res://prefabs/fightOld/fighters/enemy_blob_fighter.tscn" id="27_hfhye"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="29_3jjxs"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="29_3jjxs"] [ext_resource type="PackedScene" uid="uid://ddpl8cbck7e6s" path="res://prefabs/characters/Chugar.tscn" id="29_26tkn"] [ext_resource type="PackedScene" uid="uid://cr66tpdr5rma5" path="res://prefabs/fightOld/fighters/enemy_mavkha_fighter.tscn" id="29_hfhye"] [ext_resource type="Resource" uid="uid://dlcmqfjvgphqu" path="res://resources/items/rake.tres" id="30_l10vl"] diff --git a/scenes/Babushka_scene_indoor_common_room.tscn b/scenes/Babushka_scene_indoor_common_room.tscn index a2023a6..b494ae5 100644 --- a/scenes/Babushka_scene_indoor_common_room.tscn +++ b/scenes/Babushka_scene_indoor_common_room.tscn @@ -15,7 +15,7 @@ [ext_resource type="Texture2D" uid="uid://cop1vjvhwlsec" path="res://art/indoor/room export/Room_01_shelf.png" id="12_bu2a1"] [ext_resource type="Texture2D" uid="uid://404glx32r1w8" path="res://art/indoor/room export/Room_01_bench.png" id="13_rongr"] [ext_resource type="Texture2D" uid="uid://ckvytnpi8gcxq" path="res://art/eyes_atlas.png" id="14_d7yky"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="15_7a68a"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="15_7a68a"] [ext_resource type="Script" uid="uid://31p67cdowuw4" path="res://scripts/CSharp/Common/Animation/AnimationStarter.cs" id="15_27bwy"] [ext_resource type="Texture2D" uid="uid://c4q12jiligcl7" path="res://art/animals/katze.png" id="15_sndxu"] [ext_resource type="AudioStream" uid="uid://cohyenfo1rtxh" path="res://audio/sfx/Animals/SFX_Cat_Meow_01.wav" id="16_d7yky"] @@ -218,7 +218,7 @@ radius = 400.0 z_index = 1 y_sort_enabled = true script = ExtResource("1_3vr4f") -_sceneNamesToLoad = PackedStringArray("res://scenes/Babushka_scene_indoor_vesnas_room.tscn", "res://scenes/Babushka_scene_farm_outside_2d_ducksCollected.tscn") +_sceneNamesToLoad = PackedStringArray("res://scenes/Babushka_scene_indoor_vesnas_room.tscn", "res://scenes/Babushka_scene_farm_outside_2d.tscn") [node name="Foreground" type="Node" parent="."] diff --git a/scenes/Babushka_scene_indoor_vesnas_room.tscn b/scenes/Babushka_scene_indoor_vesnas_room.tscn index f5adf59..ebae355 100644 --- a/scenes/Babushka_scene_indoor_vesnas_room.tscn +++ b/scenes/Babushka_scene_indoor_vesnas_room.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://ceaa2qj2bmw43"] +[gd_scene load_steps=16 format=3 uid="uid://ceaa2qj2bmw43"] [ext_resource type="Script" uid="uid://cssdu8viimwm6" path="res://scripts/CSharp/Common/SceneTransition.cs" id="1_c6eln"] [ext_resource type="Texture2D" uid="uid://cugtxcfuds31r" path="res://art/indoor/Babushka_bg_01.png" id="2_j25a2"] @@ -6,8 +6,9 @@ [ext_resource type="PackedScene" uid="uid://cqc72e4hq6bcd" path="res://prefabs/interactions/interaction_area_2d.tscn" id="8_phqdf"] [ext_resource type="Resource" uid="uid://csj15gnlx1jmx" path="res://resources/quests/demo/8_goto_bed.tres" id="9_heyef"] [ext_resource type="Script" uid="uid://puw74w6lmcvl" path="res://scripts/CSharp/Common/Fight/NightStarter.cs" id="10_j25a2"] +[ext_resource type="Script" uid="uid://jg4jryfus3bw" path="res://scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs" id="11_heyef"] [ext_resource type="Texture2D" uid="uid://cop1vjvhwlsec" path="res://art/indoor/room export/Room_01_shelf.png" id="13_11fdt"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="18_3gevq"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="18_3gevq"] [ext_resource type="Script" uid="uid://bqomwxclsbhd3" path="res://scripts/CSharp/Common/Camera/CameraController.cs" id="23_408bg"] [ext_resource type="PackedScene" uid="uid://cgjc4wurbgimy" path="res://prefabs/UI/Inventory/Inventory.tscn" id="24_xwo8y"] @@ -125,8 +126,12 @@ shape = SubResource("CircleShape2D_2spkc") script = ExtResource("10_j25a2") _sceneIndexToLoad = 1 +[node name="CountDayUp" type="Node" parent="NightStarter"] +script = ExtResource("11_heyef") + [connection signal="Interacted" from="BedInteraction" to="BedInteraction/QuestCompleter" method="Trigger"] [connection signal="Interacted" from="BedInteraction" to="NightStarter" method="StartNight"] +[connection signal="Interacted" from="BedInteraction" to="NightStarter/CountDayUp" method="IncreaseDayCount"] [connection signal="Interacted" from="DoorInteraction" to="." method="LoadScene"] [connection signal="LoadScene" from="NightStarter" to="." method="LoadSceneAtIndex"] diff --git a/scenes/Babushka_scene_outside_beets.tscn b/scenes/Babushka_scene_outside_beets.tscn index cb7f0da..2118566 100644 --- a/scenes/Babushka_scene_outside_beets.tscn +++ b/scenes/Babushka_scene_outside_beets.tscn @@ -26,7 +26,7 @@ [ext_resource type="Shader" uid="uid://xnky830dtfsn" path="res://shader/repeat_texture.gdshader" id="24_anpd4"] [ext_resource type="Texture2D" uid="uid://btea6eyucsyxj" path="res://art/farm/farming/farmobjekte/zaun/tilable fence middle part.png" id="25_8mej4"] [ext_resource type="Texture2D" uid="uid://3ed3dgq3irn2" path="res://art/farm/farming/farmobjekte/zaun/tilable fence end part2.png" id="26_bwvai"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="27_qtaxr"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="27_qtaxr"] [ext_resource type="Resource" uid="uid://dlcmqfjvgphqu" path="res://resources/items/rake.tres" id="28_le48k"] [ext_resource type="Resource" uid="uid://cndd64batns31" path="res://resources/items/wateringcan.tres" id="30_dr6bm"] [ext_resource type="Texture2D" uid="uid://dg7rlugnq0t45" path="res://art/farm/farming/farmobjekte/brünnen.png" id="30_lgb3w"] diff --git a/scenes/Babushka_scene_startMenu.tscn b/scenes/Babushka_scene_startMenu.tscn index 262a257..02d132a 100644 --- a/scenes/Babushka_scene_startMenu.tscn +++ b/scenes/Babushka_scene_startMenu.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://c6wnoif01ltld"] +[gd_scene load_steps=5 format=3 uid="uid://c6wnoif01ltld"] [ext_resource type="Script" uid="uid://cssdu8viimwm6" path="res://scripts/CSharp/Common/SceneTransition.cs" id="1_fj2fh"] +[ext_resource type="Script" uid="uid://iquhbkr7pqeg" path="res://scripts/CSharp/Common/Savegame/SaveCheats.cs" id="3_dl0t1"] [ext_resource type="Texture2D" uid="uid://c7atj6ohlmir3" path="res://art/ui/StartScreen/titlescreen.png" id="3_r0y6o"] [ext_resource type="Texture2D" uid="uid://du612t3xytly3" path="res://art/ui/StartScreen/babushkalog_white.png" id="4_dl0t1"] @@ -21,37 +22,6 @@ expand_mode = 2 stretch_mode = 6 metadata/_edit_use_anchors_ = true -[node name="Start" type="Button" parent="CanvasLayer/TextureRect"] -custom_minimum_size = Vector2(100, 30) -layout_mode = 1 -anchors_preset = 4 -anchor_top = 0.5 -anchor_bottom = 0.5 -offset_left = 200.0 -offset_top = -15.5 -offset_right = 400.0 -offset_bottom = 24.5 -grow_vertical = 2 -scale = Vector2(2, 2) -toggle_mode = true -text = "Start" - -[node name="Quit" type="Button" parent="CanvasLayer/TextureRect"] -custom_minimum_size = Vector2(100, 30) -layout_mode = 1 -anchors_preset = 4 -anchor_top = 0.5 -anchor_bottom = 0.5 -offset_left = 200.0 -offset_top = 97.0 -offset_right = 400.0 -offset_bottom = 137.0 -grow_vertical = 2 -scale = Vector2(2, 2) -toggle_mode = true -text = "Quit -" - [node name="Text" type="TextureRect" parent="CanvasLayer/TextureRect"] layout_mode = 1 offset_left = 50.0 @@ -62,5 +32,55 @@ scale = Vector2(0.5, 0.5) texture = ExtResource("4_dl0t1") stretch_mode = 3 -[connection signal="pressed" from="CanvasLayer/TextureRect/Start" to="." method="LoadScene"] -[connection signal="pressed" from="CanvasLayer/TextureRect/Quit" to="." method="Quit"] +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/TextureRect"] +custom_minimum_size = Vector2(500, 300) +layout_mode = 0 +offset_left = 204.0 +offset_top = 497.0 +offset_right = 704.0 +offset_bottom = 797.0 + +[node name="MarginContainer" type="MarginContainer" parent="CanvasLayer/TextureRect/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_bottom = 10 + +[node name="Continue" type="Button" parent="CanvasLayer/TextureRect/VBoxContainer/MarginContainer"] +custom_minimum_size = Vector2(100, 80) +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +toggle_mode = true +text = "Continue +" + +[node name="MarginContainer2" type="MarginContainer" parent="CanvasLayer/TextureRect/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_bottom = 10 + +[node name="New Game" type="Button" parent="CanvasLayer/TextureRect/VBoxContainer/MarginContainer2"] +custom_minimum_size = Vector2(100, 80) +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +toggle_mode = true +text = "New Game +" +script = ExtResource("3_dl0t1") + +[node name="MarginContainer3" type="MarginContainer" parent="CanvasLayer/TextureRect/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_bottom = 10 + +[node name="Quit" type="Button" parent="CanvasLayer/TextureRect/VBoxContainer/MarginContainer3"] +custom_minimum_size = Vector2(100, 80) +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +toggle_mode = true +text = "Quit +" + +[connection signal="pressed" from="CanvasLayer/TextureRect/VBoxContainer/MarginContainer/Continue" to="." method="LoadScene"] +[connection signal="pressed" from="CanvasLayer/TextureRect/VBoxContainer/MarginContainer2/New Game" to="." method="LoadScene"] +[connection signal="pressed" from="CanvasLayer/TextureRect/VBoxContainer/MarginContainer2/New Game" to="CanvasLayer/TextureRect/VBoxContainer/MarginContainer2/New Game" method="Reset"] +[connection signal="pressed" from="CanvasLayer/TextureRect/VBoxContainer/MarginContainer3/Quit" to="." method="Quit"] diff --git a/scenes/IndoorTest.tscn b/scenes/IndoorTest.tscn index 5c9f3be..9c56484 100644 --- a/scenes/IndoorTest.tscn +++ b/scenes/IndoorTest.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://chvc0e4441o2k"] [ext_resource type="Texture2D" uid="uid://ejq7h5pgxl84" path="res://art/indoor/küchenraum.png" id="2_ttdge"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="3_oibke"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="3_oibke"] [node name="IndoorTest" type="Node2D"] diff --git a/scenes/testing/abandoned_street_2D.tscn b/scenes/testing/abandoned_street_2D.tscn index a30ed4c..55d9235 100644 --- a/scenes/testing/abandoned_street_2D.tscn +++ b/scenes/testing/abandoned_street_2D.tscn @@ -10,7 +10,7 @@ [ext_resource type="Texture2D" uid="uid://bradm5u7vjjxq" path="res://art/mockups/trees/darktree8.png" id="9_viosu"] [ext_resource type="Texture2D" uid="uid://bryqg0hb4f0ry" path="res://art/mockups/trees/darktree9.png" id="10_clutx"] [ext_resource type="Texture2D" uid="uid://c1iyeflkwaqxf" path="res://art/testingground/mushroom1.png" id="11_ovtse"] -[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Player2D.tscn" id="12_k41x3"] +[ext_resource type="PackedScene" uid="uid://c25udixd5m6l0" path="res://prefabs/characters/Vesna.tscn" id="12_k41x3"] [node name="AbandonedStreet" type="Node2D"] diff --git a/scripts/CSharp/Common/Animation/VesnaAnimations.cs b/scripts/CSharp/Common/Animation/VesnaAnimations.cs index 1881d2d..f883252 100644 --- a/scripts/CSharp/Common/Animation/VesnaAnimations.cs +++ b/scripts/CSharp/Common/Animation/VesnaAnimations.cs @@ -18,12 +18,23 @@ public partial class VesnaAnimations : Node /// Emits the last look direction of the player to other scripts. /// [Signal] public delegate void LookDirectionEventHandler(Vector2 direction); - - public override void _Ready() + + public override void _EnterTree() + { + // calling with a 1-frame delay to avoid race conditions. + CallDeferred(nameof(SetupSubscriptions)); + } + + private void SetupSubscriptions() { InventoryManager.Instance.playerInventory.InventoryContentsChanged += HandleNewItemInInventory; } + public override void _ExitTree() + { + InventoryManager.Instance.playerInventory.InventoryContentsChanged -= HandleNewItemInInventory; + } + private void HandleNewItemInInventory() { // for future Kathi: this does not, in fact, check if an item has been added only, but triggers on every content change! diff --git a/scripts/CSharp/Common/DayAndNight/CalendarController.cs b/scripts/CSharp/Common/DayAndNight/CalendarController.cs new file mode 100644 index 0000000..878ff02 --- /dev/null +++ b/scripts/CSharp/Common/DayAndNight/CalendarController.cs @@ -0,0 +1,44 @@ +using Babushka.scripts.CSharp.Low_Code.Variables; +using Godot; + +namespace Babushka.scripts.CSharp.Common.DayAndNight; + +public partial class CalendarController : Node +{ + [Export] private SaveableVariableNode _dayCounter; + + public static CalendarController? Instance; + + public int CurrentDay + { + get + { + if (Instance == null) + return 0; + return Instance._dayCounter.Payload.AsInt32(); + } + } + + public override void _Ready() + { + if (Instance == null) + { + Instance = this; + } + } + + public override void _Input(InputEvent @event) + { + if (@event.IsActionPressed("NextDayCheat")) + { + GoToNextDay(); + } + } + + public void GoToNextDay() + { + int days = _dayCounter.Payload.AsInt32(); + days++; + _dayCounter.Payload = days; + } +} \ No newline at end of file diff --git a/scripts/CSharp/Common/DayAndNight/CalendarController.cs.uid b/scripts/CSharp/Common/DayAndNight/CalendarController.cs.uid new file mode 100644 index 0000000..4993549 --- /dev/null +++ b/scripts/CSharp/Common/DayAndNight/CalendarController.cs.uid @@ -0,0 +1 @@ +uid://du5facslfvg77 diff --git a/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs b/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs new file mode 100644 index 0000000..a51b4ee --- /dev/null +++ b/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs @@ -0,0 +1,11 @@ +using Godot; + +namespace Babushka.scripts.CSharp.Common.DayAndNight; + +public partial class DayAndNightHelper : Node +{ + public void IncreaseDayCount() + { + CalendarController.Instance?.GoToNextDay(); + } +} \ No newline at end of file diff --git a/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs.uid b/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs.uid new file mode 100644 index 0000000..7b924fa --- /dev/null +++ b/scripts/CSharp/Common/DayAndNight/DayAndNightHelper.cs.uid @@ -0,0 +1 @@ +uid://jg4jryfus3bw diff --git a/scripts/CSharp/Common/Farming/FarmingControls2D.cs b/scripts/CSharp/Common/Farming/FarmingControls2D.cs index 10014e5..163f07e 100644 --- a/scripts/CSharp/Common/Farming/FarmingControls2D.cs +++ b/scripts/CSharp/Common/Farming/FarmingControls2D.cs @@ -1,7 +1,5 @@ -using System; using Babushka.scripts.CSharp.Low_Code.Variables; using Godot; -using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; diff --git a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs index 52b02a5..bf9116f 100644 --- a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs @@ -1,5 +1,6 @@ using System; using Babushka.scripts.CSharp.Common.CharacterControls; +using Babushka.scripts.CSharp.Common.DayAndNight; using Babushka.scripts.CSharp.Common.Inventory; using Babushka.scripts.CSharp.Common.Savegame; using Babushka.scripts.CSharp.Low_Code.Events; @@ -45,8 +46,11 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable private bool _canPlant; private bool _canWater; + private int _currentDay; private PlantBehaviour2D? _currentPlant; + + private const string DAY_COUNTER_SAVE_ID = "12c6da2e-fc71-4281-a04a-dfd3c7943975"; [Signal] public delegate void PlantedEventHandler(); @@ -56,6 +60,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable _canPlant = (FieldState == FieldState.Tilled || FieldState == FieldState.Watered) && _seedsActive; // fieldstate == tilled && watering can ausgewählt _canWater = (FieldState == FieldState.Tilled || FieldState == FieldState.Planted) && _wateringCanActive; + FieldInteractionArea.IsActive = _canPlant || _canWater; } @@ -71,9 +76,13 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable UpdateInteractionArea(); } - public override void _Ready() + public override void _EnterTree() { LoadFromSaveData(); + } + + public override void _Ready() + { if(PlantingPlaceholder.GetChildCount() > 0) _currentPlant = PlantingPlaceholder.GetChild(0); UpdateFieldState(FieldState); @@ -84,7 +93,7 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable base._Ready(); } - public void UpdateFieldState(FieldState state) + public void UpdateFieldState(FieldState state, bool updateSaveAfter = true) { switch (state) { @@ -112,18 +121,25 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable break; } UpdateInteractionArea(); - UpdateSaveData(); + if(updateSaveAfter) + UpdateSaveData(); } public void Water() { - if (WateringCanState.GetFillState() > 0) + if (WateringCanState.GetFillState() > 0 && FieldState != FieldState.Watered) { UpdateFieldState(FieldState.Watered); _wateringParticles.Emitting = true; WateringCanState.Water(); _wateringEvent.Raise(); + + if (_currentPlant != null) + { + _currentPlant.DaysWatered++; + UpdateSaveData(); + } } } @@ -166,6 +182,16 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable } private void PlantPrefab(string prefabPath) + { + InstantiatePlant(prefabPath); + + if (_currentPlant != null) + { + _currentPlant.DayPlanted = _currentDay; + } + } + + private void InstantiatePlant(string prefabPath) { PackedScene prefab = ResourceLoader.Load(prefabPath, nameof(PackedScene)); Node2D plant2d = prefab.Instantiate(); @@ -181,11 +207,15 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable #region SAVE AND LOAD + /// + /// Update save data as prep for scene transition (when data is saved and loaded from disk). + /// public void UpdateSaveData() { var payloadData = new Dictionary { - { "field_state", (int)FieldState } + { "field_state", (int)FieldState }, + { "day_count_on_last_exit", _currentDay} }; if (_currentPlant != null) @@ -194,8 +224,8 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable "plant_data", new Dictionary() { { "prefab_path", _currentPlant.PrefabPath }, - { "plant_state", (int)_currentPlant.State }, - { "plant_days_growing", _currentPlant.DaysGrowing } + { "plant_start_day", _currentPlant.DayPlanted }, + { "plant_watered_days", _currentPlant.DaysWatered } } ); } @@ -204,50 +234,91 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable SavegameService.AppendDataToSave(id, payloadData); } + /// + /// Loads on scene enter. + /// public void LoadFromSaveData() { + // Get field and plant data string id = _saveIdHolder.GetMeta("SaveID").AsString(); Dictionary save = SavegameService.GetSaveData(id); if (save.Count > 0) { - if (save.TryGetValue("field_state", out Variant fieldStateVar)) - { - int fieldStateInt = fieldStateVar.AsInt32(); - FieldState = (FieldState) fieldStateInt; - - if (fieldStateInt != 0) - { - Visible = true; - UpdateFieldState(FieldState); - } - } - + // get plant first because it's also relevant for the field state if (save.TryGetValue("plant_data", out Variant plantDataVar)) { Dictionary plantDataDict = plantDataVar.AsGodotDictionary(); if (plantDataDict.TryGetValue("prefab_path", out Variant prefabPathVar)) { - PlantPrefab(prefabPathVar.AsString()); + InstantiatePlant(prefabPathVar.AsString()); } else { return; } + if (plantDataDict.TryGetValue("plant_start_day", out Variant plantStartDay) && _currentPlant != null) + { + _currentPlant.DayPlanted = plantStartDay.AsInt32(); + } + if (plantDataDict.TryGetValue("plant_watered_days", out Variant plantDaysWatered) && _currentPlant != null) + { + _currentPlant.DaysWatered = plantDaysWatered.AsInt32(); + } + } + + // Get current day count: Load only. Saving the day count is handled on the day and night prefab. + Dictionary dayCountSave = SavegameService.GetSaveData(DAY_COUNTER_SAVE_ID); - if (plantDataDict.TryGetValue("plant_state", out Variant plantStateVar) && _currentPlant != null) + if (dayCountSave.Count > 0) + { + if (dayCountSave.TryGetValue("payload", out Variant dayCountVar)) { - _currentPlant.State = (PlantState) plantStateVar.AsInt32(); - _currentPlant.GrowPlant(); + _currentDay = dayCountVar.AsInt32(); + if (_currentPlant != null) + { + _currentPlant.CurrentDayInCalendar = _currentDay; + } } + } + + // get field state + if (save.TryGetValue("field_state", out Variant fieldStateVar)) + { + int fieldStateInt = fieldStateVar.AsInt32(); - if (plantDataDict.TryGetValue("plant_days_growing", out Variant plantDaysGrowingVar) && _currentPlant != null) + // if the field has been unlocked, make it visible. + if (fieldStateInt != 0) { - _currentPlant.DaysGrowing = plantDaysGrowingVar.AsInt32(); + Visible = true; + + if (save.TryGetValue("day_count_on_last_exit", out Variant lastDayCountVar)) + { + int lastDayCount = lastDayCountVar.AsInt32(); + + // if day is today, then just use the provided field state as is. + if (CalendarController.Instance != null && _currentDay != lastDayCount) + { + // if the field was watered the day before, set it to tilled or planted. + if (fieldStateInt == 3) + { + if (_currentPlant != null) + { + fieldStateInt = 2; + } + else + { + fieldStateInt = 1; + } + } + } + } + + FieldState = (FieldState) fieldStateInt; + UpdateFieldState(FieldState, false); } - } } } diff --git a/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs b/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs index 82cdeaf..3b88dd9 100644 --- a/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/PlantBehaviour2D.cs @@ -1,6 +1,9 @@ using System; +using System.Diagnostics; using Babushka.scripts.CSharp.Common.Inventory; +using Babushka.scripts.CSharp.Low_Code.Variables; using Godot; +using Godot.Collections; namespace Babushka.scripts.CSharp.Common.Farming; @@ -9,7 +12,8 @@ namespace Babushka.scripts.CSharp.Common.Farming; /// public partial class PlantBehaviour2D : Node2D { - [Export] private string _prefabPath; + + [ExportGroup("Plant State")] [Export] private Sprite2D[] _seeds; [Export] private Sprite2D[] _smallPlants; [Export] private Sprite2D[] _bigPlants; @@ -19,11 +23,18 @@ public partial class PlantBehaviour2D : Node2D [Export] private ItemOnGround2D _harvestablePlant; [Export] private CpuParticles2D _magicEffect; [Export] private bool _magicWordNeeded = true; + + [ExportGroup("PlantConfig")] + [Export] private string _prefabPath; + [Export] private VariableNode _lifecycle; private string _magicWordDialogicEventName = "MagicWord"; private Sprite2D? _currentPlantSprite = null; private bool _magicWordSaid = false; private bool _calledOnReady = false; + private int _dayPlanted; + private int _currentDay; + private int _daysWatered; public PlantState State { @@ -31,8 +42,26 @@ public partial class PlantBehaviour2D : Node2D set => _state = value; } - public int DaysGrowing { get; set; } - + /// + /// The day count at the day this plant was planted. + /// + public int DayPlanted + { + get => _dayPlanted; + set => _dayPlanted = value; + } + + public int CurrentDayInCalendar + { + get => _currentDay; + set + { + if (_currentDay == value) return; + _currentDay = value; + DaysGrowingChanged(); + } + } + public string PrefabPath => _prefabPath; /// @@ -44,6 +73,15 @@ public partial class PlantBehaviour2D : Node2D set => _field = value; } + public int DaysWatered + { + get => _daysWatered; + set + { + _daysWatered = value; + } + } + public override void _Ready() { if (_state == PlantState.None) @@ -58,13 +96,32 @@ public partial class PlantBehaviour2D : Node2D GrowPlant(); } } + + private void DaysGrowingChanged() + { + int lifecycle = _lifecycle.Payload.AsInt32(); + Debug.Assert(lifecycle > 0); + + float growth = (float)_daysWatered / lifecycle; + int growthFloor = Mathf.FloorToInt(growth); + + _state = growthFloor switch + { + 0 => PlantState.None, + 1 => PlantState.Planted, + 2 => PlantState.SmallPlant, + _ => PlantState.BigPlant + }; + + _calledOnReady = true; + Grow(); + } public void Grow() { GrowPlant(); } - /// /// Transitions the plant to its next growth stage. /// diff --git a/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs new file mode 100644 index 0000000..0086a57 --- /dev/null +++ b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs @@ -0,0 +1,33 @@ +using Babushka.scripts.CSharp.Low_Code.Variables; +using Godot; + +namespace Babushka.scripts.CSharp.Common.Farming; + +public partial class WateringCanSaveHelper : Node +{ + [Export] private SaveableVariableNode _wateringCanFillStateNode; + + public override void _EnterTree() + { + WateringCanState.OnFill += SetFillState; + WateringCanState.OnWater += SetFillState; + } + + public override void _ExitTree() + { + WateringCanState.OnFill -= SetFillState; + WateringCanState.OnWater -= SetFillState; + } + + + public void SetFillState() + { + _wateringCanFillStateNode.Payload = WateringCanState.GetFillState(); + } + + private void OnLoad() + { + WateringCanState.SetFillState(_wateringCanFillStateNode.Payload.AsInt32()); + } + +} \ No newline at end of file diff --git a/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid new file mode 100644 index 0000000..da908bc --- /dev/null +++ b/scripts/CSharp/Common/Farming/WateringCanSaveHelper.cs.uid @@ -0,0 +1 @@ +uid://dj1qjambsa4pg diff --git a/scripts/CSharp/Common/Farming/WateringCanState.cs b/scripts/CSharp/Common/Farming/WateringCanState.cs index cc6bdaf..359ee6f 100644 --- a/scripts/CSharp/Common/Farming/WateringCanState.cs +++ b/scripts/CSharp/Common/Farming/WateringCanState.cs @@ -29,6 +29,7 @@ public static class WateringCanState public delegate void WateringCanDelegate(bool state); public static event WateringCanDelegate WateringCanActiveStateChanged; public static event Action? OnWater; + public static event Action? OnFill; @@ -38,6 +39,7 @@ public static class WateringCanState public static void Fill() { _fillstate = MAX_FILLSTATE; + OnFill?.Invoke(); } /// @@ -69,6 +71,15 @@ public static class WateringCanState return _fillstate; } + /// + /// Public setter. Used for saving and loading. + /// + /// + public static void SetFillState(int fillstate) + { + _fillstate = fillstate; + } + /// /// Sets the Active state of the watering can, i.e. if it is currently in hand and if the ui should be active. /// diff --git a/scripts/CSharp/Common/Inventory/InventoryInstance.cs b/scripts/CSharp/Common/Inventory/InventoryInstance.cs index a05f778..55fb944 100644 --- a/scripts/CSharp/Common/Inventory/InventoryInstance.cs +++ b/scripts/CSharp/Common/Inventory/InventoryInstance.cs @@ -50,12 +50,14 @@ public partial class InventoryInstance : Node, ISaveable LoadFromSaveData(); InventoryContentsChanged += UpdateSaveData; SlotAmountChanged += UpdateSaveData; + SavegameService.OnSaveGameReset += SaveGameReset; } - + public override void _ExitTree() { InventoryContentsChanged -= UpdateSaveData; SlotAmountChanged -= UpdateSaveData; + SavegameService.OnSaveGameReset -= SaveGameReset; } public InventoryActionResult AddItem(ItemInstance newItem) @@ -216,5 +218,17 @@ public partial class InventoryInstance : Node, ISaveable } } } + + /// + /// Called when a new save is created. + /// Needs to do a runtime check because the InventoryInstance is already in existence at the beginning of the first scene. + /// + private void SaveGameReset() + { + foreach (var slot in _slots) + { + slot.itemInstance = null; + } + } #endregion } diff --git a/scripts/CSharp/Common/Inventory/InventoryUi.cs b/scripts/CSharp/Common/Inventory/InventoryUi.cs index 690d1f5..11d9cfd 100644 --- a/scripts/CSharp/Common/Inventory/InventoryUi.cs +++ b/scripts/CSharp/Common/Inventory/InventoryUi.cs @@ -28,6 +28,7 @@ public partial class InventoryUi : Control public override void _ExitTree() { + InventoryManager.Instance.playerInventory.InventoryContentsChanged -= SetSlotContent; UnsubscribeSlots(); } diff --git a/scripts/CSharp/Common/Inventory/ItemOnGround2D.cs b/scripts/CSharp/Common/Inventory/ItemOnGround2D.cs index 1dc21a1..c13f4e8 100644 --- a/scripts/CSharp/Common/Inventory/ItemOnGround2D.cs +++ b/scripts/CSharp/Common/Inventory/ItemOnGround2D.cs @@ -11,10 +11,12 @@ public partial class ItemOnGround2D : Node, ISaveable [Export] public bool IsActive = true; [Export] private bool _infiniteSupply = false; [Export] private int _finiteSupply = 1; + [Export] private bool _saveToDisk = true; private int pickUpCounter = 0; [Signal] public delegate void SuccessfulPickUpEventHandler(); + private Label _itemLabel => GetNode public partial class VariableNode : Node { - [Export] public Variant Payload { get; set; } + [Export] public Variant Payload + { + get + { + return _payload; + } + set + { + if (_payload.Equals(value)) + return; + + _payload = value; + EmitSignal(SignalName.ValueChanged); + } + } + + private Variant _payload; + + [Signal] public delegate void ValueChangedEventHandler(); } \ No newline at end of file