Skip to content

Commit 5d09cf2

Browse files
committed
feat(game): 实现游戏状态管理和存档系统
- 添加游戏状态管理器,支持玩家等级、经验值和场景管理 - 实现游戏标志系统,用于存储游戏进度标记 - 集成库存管理系统到加载和保存菜单 - 更新确认对话框关闭顺序以避免UI问题 - 优化UI根节点处理子节点重父功能 - 添加开发环境下的UI路由栈检查机制 - 改进存档槽位项目的数据验证逻辑 - 移除废弃的开发模式标识字段 - 添加完整的游戏状态接口定义 - 集成游戏状态和库存管理器到架构模块中
1 parent e44210a commit 5d09cf2

28 files changed

Lines changed: 402 additions & 67 deletions

Echoes-of-the-Pit.sln.DotSettings.user

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@
1212
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEnum_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F24f5857a073841e189d805de9660178ef49910_003Fb4_003F2ea68a57_003FEnum_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1313
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventBus_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F61c57f4bd08d4c21bac71557aba622f9e800_003F55_003F96ad7958_003FEventBus_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1414
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEvent_00601_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F61c57f4bd08d4c21bac71557aba622f9e800_003Fe6_003Fe17bc579_003FEvent_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
15+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGameStateMachineSystem_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5925795c11fe4433bbee068fe73deb83be00_003F0d_003F79e55aba_003FGameStateMachineSystem_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1516
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGodotSceneRegistry_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6ff9779f21864e7eb8b005d73a41c9598a00_003F35_003F4492b80f_003FGodotSceneRegistry_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1617
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGodotSceneRegistry_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd724d2f4686d47d58495a4e2207ccf297400_003F2c_003F101171ae_003FGodotSceneRegistry_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1718
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGodotUiFactory_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6ff9779f21864e7eb8b005d73a41c9598a00_003F8b_003Fccce2e6b_003FGodotUiFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1819
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AGodotUiRegistry_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd724d2f4686d47d58495a4e2207ccf297400_003Fe1_003F45a5502b_003FGodotUiRegistry_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1920
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIArchitectureContext_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd8d4ae3dc5ea465093e3f17aaa7918844400_003Fd3_003F36ba345a_003FIArchitectureContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
2021
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIContextAware_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd8d4ae3dc5ea465093e3f17aaa7918844400_003F0d_003F74aae105_003FIContextAware_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
22+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIStateMachine_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F82915d50350f448aa36de6570a33096b4400_003Fe9_003F74a76d4f_003FIStateMachine_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
2123
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIStorage_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6e461ba644be49f0a2922e9f84107df14400_003F3f_003F648f255c_003FIStorage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
2224
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIUiRoot_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5d762ac04c904c2984362a71be5aae154c00_003F29_003F4867a557_003FIUiRoot_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
2325
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIUiRouter_002Ecs_002Fl_003AD_0021_003FTool_003FDevelopment_0020Tools_003FJetBrains_003F_002EJetBrains_003F_002ERider_003Fconfig_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5d762ac04c904c2984362a71be5aae154c00_003F36_003F0bd2d5f9_003FIUiRouter_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

global/UiRoot.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,14 @@ public void AddUiPage(IUiPageBehavior child, UiLayer layer, int orderInLayer = 0
4040
if (!_containers.TryGetValue(layer, out var container))
4141
throw new InvalidOperationException($"UiLayer not found: {layer}");
4242

43-
if (item.GetParent() != container)
43+
if (item.GetParent() == null)
44+
{
45+
container.AddChild(item);
46+
}
47+
else if (item.GetParent() != container)
48+
{
4449
item.Reparent(container);
50+
}
4551

4652
item.ZIndex = (int)layer * 100 + orderInLayer;
4753
item.ZAsRelative = false;
@@ -101,6 +107,7 @@ public override void _Ready()
101107
var router = this.GetSystem<IUiRouter>()!;
102108
router.BindRoot(this);
103109
this.SendEvent<UiRootReadyEvent>();
110+
_log.Debug($"[UiRoot] Ready. Path={GetPath()} InTree={IsInsideTree()}");
104111
}
105112

106113
private void InitLayers()

global/game_entry_point.tscn

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,5 @@ metadata/_custom_type_script = "uid://cl054n3c8n68a"
2626

2727
[node name="GameEntryPoint" type="Node"]
2828
script = ExtResource("1_a14y6")
29-
IsDev = false
3029
UiPageConfigs = Array[Object]([SubResource("Resource_l8ju5"), SubResource("Resource_3xsct")])
3130
GameSceneConfigs = Array[Object]([SubResource("Resource_f22d5")])

project.godot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ config_version=5
1111
[application]
1212

1313
config/name="Echoes-of-the-Pit"
14-
run/main_scene="uid://ba2a80bdo4vlf"
14+
run/main_scene="uid://6s2urcdmkpbt"
1515
config/features=PackedStringArray("4.5", "C#", "GL Compatibility")
1616
boot_splash/fullsize=false
1717
boot_splash/image="uid://p5dak2wsc1nk"

scenes/load_menu/load_menu.tscn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[ext_resource type="Script" uid="uid://yf6gtgm5cgxf" path="res://scripts/load_menu/LoadMenu.cs" id="1_df2ov"]
44
[ext_resource type="PackedScene" uid="uid://0wmexdyug5ix" path="res://scenes/component/save_slot_item.tscn" id="2_yo27f"]
5-
[ext_resource type="PackedScene" path="res://scenes/component/confirmation_dialog.tscn" id="3_jwr0c"]
5+
[ext_resource type="PackedScene" uid="uid://cpsan4k3m5r6e" path="res://scenes/component/confirmation_dialog.tscn" id="3_jwr0c"]
66

77
[node name="LoadMenu" type="Control"]
88
layout_mode = 3
@@ -96,5 +96,6 @@ theme_override_font_sizes/font_size = 32
9696
text = "返回"
9797

9898
[node name="ConfirmationDialog" parent="." instance=ExtResource("3_jwr0c")]
99+
unique_name_in_owner = true
99100
visible = false
100101
layout_mode = 1

script_templates/Node/PageControllerTemplate.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,29 @@ public IUiPageBehavior GetPage()
3939
_page ??= new CanvasItemUiPageBehavior<_BASE_>(this,UiKeyStr);
4040
return _page;
4141
}
42+
43+
/// <summary>
44+
/// Godot节点就绪回调方法,用于初始化组件准备就绪后的操作
45+
/// </summary>
4246
public override void _Ready()
4347
{
44-
// 当页面功能完善后该代码可以考虑注释
45-
CallDeferred(nameof(CheckIfInStack));
48+
CallDeferred(nameof(CallDeferredInit));
4649
}
50+
4751
/// <summary>
48-
/// 检查当前UI是否在路由栈顶,如果不在则将页面推入路由栈,请注意这个方法主要用于在开发过程中,启动当前场景时将当前UI推入路由栈
49-
/// 页面功能完善后该代码可以考虑注释
52+
/// 延迟初始化方法,获取环境信息并根据开发环境条件和路由状态决定是否推送页面到路由栈
5053
/// </summary>
51-
private void CheckIfInStack()
54+
private void CallDeferredInit()
5255
{
53-
if (!_uiRouter.IsTop(UiKeyStr))
56+
var env = this.GetEnvironment();
57+
// 检查当前环境是否为开发环境且UI路由栈顶不是当前UI键时,将页面推入路由栈
58+
if (GameConstants.Development.Equals(env.Name, StringComparison.Ordinal) &&!_uiRouter.IsTop(UiKeyStr))
5459
{
5560
_uiRouter.Push(GetPage());
5661
}
62+
// 请注意,事件绑定请在此处绑定
5763
}
64+
5865
/// <summary>
5966
/// 页面进入时调用的方法
6067
/// </summary>

scripts/component/ConfirmationDialog.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ public void HideDialog()
5050

5151
private void OnConfirmButtonPressed()
5252
{
53-
HideDialog();
5453
EmitSignalConfirmed();
5554
_confirmCallback?.Invoke();
55+
HideDialog();
5656
}
5757

5858
private void OnCancelButtonPressed()

scripts/component/SaveSlotItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public partial class SaveSlotItem : HBoxContainer, IController
5555
/// <summary>
5656
/// 检查是否有存档数据
5757
/// </summary>
58-
public bool HasSave => _saveData is { Inventory.Count: > 0 };
58+
public bool HasSave => _saveData is { SlotDescription.Length: > 0 };
5959

6060
/// <summary>
6161
/// 组件准备就绪时调用,初始化事件监听器
@@ -113,7 +113,7 @@ private void UpdateButtons()
113113
DeleteButton.Visible = _showDeleteButton;
114114

115115
// 根据存档数据存在情况设置按钮状态
116-
if (_saveData is { Inventory.Count: > 0 })
116+
if (_saveData is { SlotDescription.Length: > 0 })
117117
{
118118
ActionButton.Text = _isLoadMode ? "读取" : "覆盖";
119119
ActionButton.Disabled = false;

scripts/constants/GameConstants.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

scripts/constants/GameConstants.cs.uid

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)