From 78d1014067bc3cb1bfbf653d40d5bc9a119fbbbe Mon Sep 17 00:00:00 2001 From: Nicola Date: Sat, 9 May 2026 15:23:10 +0200 Subject: [PATCH] Added GameOver screen and win/death logic. Game can now officially be finished (Positive and Negative) --- Scenes/Game.tscn | 53 +++++++++++++++++++++++++++++++++- Scripts/UI/Common/UIHandler.cs | 23 ++++++++++++++- Scripts/World/World.cs | 4 +-- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/Scenes/Game.tscn b/Scenes/Game.tscn index 9d803d9..abe57ec 100644 --- a/Scenes/Game.tscn +++ b/Scenes/Game.tscn @@ -68,7 +68,7 @@ environment = SubResource("Environment_sb48q") [node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1558432386] follow_viewport_enabled = true -[node name="UIHandler" type="Control" parent="CanvasLayer" unique_id=1713248285 node_paths=PackedStringArray("codingWindow", "robotList", "mainCam", "map", "FPS", "RAM", "options", "uiContent", "menu", "inventory", "researchList", "robotAlarm", "energyLabel", "waterLabel", "hungerLabel", "survivalStatus", "currentLayer", "deepestLayer", "unlockLayer")] +[node name="UIHandler" type="Control" parent="CanvasLayer" unique_id=1713248285 node_paths=PackedStringArray("codingWindow", "robotList", "mainCam", "map", "FPS", "RAM", "options", "uiContent", "menu", "inventory", "researchList", "robotAlarm", "energyLabel", "waterLabel", "hungerLabel", "survivalStatus", "currentLayer", "deepestLayer", "unlockLayer", "gameOver")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -99,6 +99,7 @@ survivalStatus = NodePath("MainUI/HeaderContainer/VBoxContainer/SurvivalStatus") currentLayer = NodePath("MainUI/HeaderContainer/VBoxContainer/CurrentLayer") deepestLayer = NodePath("MainUI/HeaderContainer/VBoxContainer/DeepestLayer") unlockLayer = NodePath("MainUI/HeaderContainer/VBoxContainer/UnlockLayer") +gameOver = NodePath("MainUI/Content/GameOver") [node name="MainUI" type="VBoxContainer" parent="CanvasLayer/UIHandler" unique_id=1437975209] layout_mode = 1 @@ -476,6 +477,54 @@ researchGraph = NodePath("ResearchGraph") [node name="ResearchGraph" type="GraphEdit" parent="CanvasLayer/UIHandler/MainUI/Content/Research" unique_id=414756119] layout_mode = 2 +[node name="GameOver" type="PanelContainer" parent="CanvasLayer/UIHandler/MainUI/Content" unique_id=1632783321] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver" unique_id=12941042] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="Title" type="RichTextLabel" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer" unique_id=622403000] +layout_mode = 2 +bbcode_enabled = true +text = "[font_size=64]Game Over[/font_size]" +fit_content = true +autowrap_mode = 0 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Content" type="RichTextLabel" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer" unique_id=521357002] +layout_mode = 2 +size_flags_vertical = 3 +bbcode_enabled = true +text = "[font_size=32]You finished the game! + +Thank you for playing." +fit_content = true +autowrap_mode = 0 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer" unique_id=1526010823] +layout_mode = 2 +theme_override_constants/separation = 42 + +[node name="Negative" type="Button" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer/HBoxContainer" unique_id=1328278845] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Main Menu" + +[node name="Positive" type="Button" parent="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer/HBoxContainer" unique_id=912287210] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Continue" + [node name="FooterContainer" type="PanelContainer" parent="CanvasLayer/UIHandler/MainUI" unique_id=1495029884] layout_mode = 2 @@ -534,6 +583,8 @@ texture_normal = ExtResource("12_3so38") [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/Content/Menu/VBoxContainer/Button" to="CanvasLayer/UIHandler" method="HandleMenu"] [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/Content/Menu/VBoxContainer/Button2" to="CanvasLayer/UIHandler" method="ShowOptions"] [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/Content/Menu/VBoxContainer/Button3" to="CanvasLayer/UIHandler" method="ExitGame"] +[connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer/HBoxContainer/Negative" to="CanvasLayer/UIHandler" method="ExitGame"] +[connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/Content/GameOver/VBoxContainer/HBoxContainer/Positive" to="CanvasLayer/UIHandler" method="HideGameOver"] [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/FooterContainer/HBoxContainer/Inventory" to="CanvasLayer/UIHandler" method="HandleInventoryButton"] [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/FooterContainer/HBoxContainer/Research" to="CanvasLayer/UIHandler" method="HandleResearchButton"] [connection signal="pressed" from="CanvasLayer/UIHandler/MainUI/FooterContainer/HBoxContainer/Map" to="CanvasLayer/UIHandler" method="HandleMapButton"] diff --git a/Scripts/UI/Common/UIHandler.cs b/Scripts/UI/Common/UIHandler.cs index b620f82..e492b60 100644 --- a/Scripts/UI/Common/UIHandler.cs +++ b/Scripts/UI/Common/UIHandler.cs @@ -23,6 +23,7 @@ public partial class UIHandler : Control [Export] RichTextLabel currentLayer; [Export] RichTextLabel deepestLayer; [Export] Button unlockLayer; + [Export] PanelContainer gameOver; private bool receivedRobotJumpSignal = false; @@ -163,12 +164,20 @@ public partial class UIHandler : Control waterLabel.Text = $"Water: {GameData.survival.thirst:0}/{GameData.survival.maxThirst:0}"; hungerLabel.Text = $"Food: {GameData.survival.hunger:0}/{GameData.survival.maxHunger:0}"; survivalStatus.Text = GameData.survival.currentStatus; + if (GameData.survival.isDead) + { + ShowGameOver(); + } } private void DisplayWorldStats() { currentLayer.Text = $"Current layer: {GameData.currentLayer}/{GameData.ruinSize}"; deepestLayer.Text = $"Deepest layer: {GameData.lowestLayer}"; + if(GameData.lowestLayer == GameData.ruinSize){ + unlockLayer.Visible = false; + return; + } unlockLayer.TooltipText = "Needed items: \r" + GameData.map[GameData.lowestLayer].DisplayGateIngredients(); unlockLayer.Disabled = !GameData.inventory.CanCraft(GameData.map[GameData.lowestLayer].gateIngredients, 1); } @@ -184,8 +193,20 @@ public partial class UIHandler : Control GameData.lowestLayer++; if (GameData.lowestLayer == GameData.ruinSize) { - GD.Print("GAME WON!"); + gameOver.Show(); } } } + + public void ShowGameOver() + { + if(gameOver.Visible) return; + gameOver.GetNode("./VBoxContainer/Content").Text = $"[font_size=32]You died! \r Reason: {GameData.survival.deathReason} \r Better luck next time \r"; + gameOver.Show(); + } + + public void HideGameOver() + { + gameOver.Hide(); + } } diff --git a/Scripts/World/World.cs b/Scripts/World/World.cs index ef5712b..236bb62 100644 --- a/Scripts/World/World.cs +++ b/Scripts/World/World.cs @@ -82,7 +82,7 @@ public partial class World : Node3D public override void _Process(double delta) { - GameData.survival.Update(delta); + survival.Update(delta); if (!canMove) return; if (Input.IsActionJustPressed("layer_up") && currentLayer > 0) currentLayer--; @@ -308,4 +308,4 @@ public partial class World : Node3D } } } -} \ No newline at end of file +}