diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs index d37745bd..d0077d9d 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/SaveSlotManager/SaveFile.cs @@ -38,6 +38,8 @@ namespace AxibugEmuOnline.Client } } + public event Action OnSavSuccessed; + /// 存档顺序号,用于判断云存档和本地存档的同步状态,是否存在冲突 public uint Sequecen { get; private set; } @@ -126,7 +128,7 @@ namespace AxibugEmuOnline.Client m_headerCache = new Header(); fixed (Header* headPtr = &m_headerCache) { - var headP=(byte*)headPtr; + var headP = (byte*)headPtr; Marshal.Copy(raw, 0, (IntPtr)headP, sizeof(Header)); } @@ -179,6 +181,8 @@ namespace AxibugEmuOnline.Client m_screenShotCaches = screenShotData; IsEmpty = false; + + OnSavSuccessed?.Invoke(); } /// diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs index 90b81e4c..b20d5c56 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs @@ -9,7 +9,7 @@ namespace AxibugEmuOnline.Client { private InGameUI m_gameUI; - public override string Name => "保存"; + public override string Name => "存档"; public InGameUI_SaveStateMenu(InGameUI inGameUI) { @@ -22,39 +22,81 @@ namespace AxibugEmuOnline.Client List result = new List(); foreach (var savFile in saveFiles) { - if (savFile.AutoSave) continue; result.Add(new SaveSlotMenu(m_gameUI, savFile)); } return result; } /// 存档侧边选项UI - public class SaveSlotMenu : ExecuteMenu + public class SaveSlotMenu : ExpandMenu { public override Type MenuUITemplateType => typeof(OptionUI_SavSlotItem); public SaveFile SavFile { get; private set; } - private InGameUI m_ingameUI; - - public override bool Visible => !SavFile.AutoSave; + List m_subOptions = new List(); + public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}"; public SaveSlotMenu(InGameUI inGameui, SaveFile savFile) { SavFile = savFile; - m_ingameUI = inGameui; + + //非自动存档,增加保存选项 + if (!savFile.AutoSave) m_subOptions.Add(new SaveMenuItem(inGameui, savFile)); + //添加读取选项 + m_subOptions.Add(new LoadMenuItem(inGameui, savFile)); } - public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + protected override List GetOptionMenus() { - cancelHide = true; - var stateData = m_ingameUI.Core.GetStateBytes(); - var tex = m_ingameUI.Core.OutputPixel; - var screenData = tex.ToJPG(); - - SavFile.Save(SavFile.Sequecen, stateData, screenData); + return m_subOptions; } - public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}"; + public class SaveMenuItem : ExecuteMenu + { + SaveFile m_savFile; + InGameUI m_ingameUI; + public override string Name => "保存"; + + public SaveMenuItem(InGameUI inGameui, SaveFile savFile) + { + m_ingameUI = inGameui; + m_savFile = savFile; + } + + public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + { + var stateData = m_ingameUI.Core.GetStateBytes(); + var tex = m_ingameUI.Core.OutputPixel; + var screenData = tex.ToJPG(); + + m_savFile.Save(m_savFile.Sequecen, stateData, screenData); + } + } + + public class LoadMenuItem : ExecuteMenu + { + SaveFile m_savFile; + InGameUI m_ingameUI; + public override string Name => "读取"; + + public LoadMenuItem(InGameUI inGameui, SaveFile savFile) + { + m_ingameUI = inGameui; + m_savFile = savFile; + } + + public override void OnExcute(OptionUI optionUI, ref bool cancelHide) + { + cancelHide = true; + m_savFile.GetSavData(out byte[] savData, out var _); + if (savData != null) + { + m_ingameUI.Core.LoadStateFromBytes(savData); + } + + OverlayManager.HideSideBar(); + } + } } } } \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs index 6a517274..b52e8316 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI.cs @@ -221,14 +221,21 @@ namespace AxibugEmuOnline.Client } + /// + /// 关闭这个侧边栏选项UI + /// public void Hide() { if (m_bPoped) { + if (m_child != null) + { + m_child.Hide(); + } + Vector2 start = new Vector2(-MenuRoot.rect.width, MenuRoot.anchoredPosition.y); Vector2 end = new Vector2(0, MenuRoot.anchoredPosition.y); - ReleaseRuntimeMenus(); m_runtimeMenuItems.Clear(); diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs index fac8acca..d0fc9d20 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OptionUI/OptionUI_SavSlotItem.cs @@ -17,6 +17,8 @@ namespace AxibugEmuOnline.Client base.OnSetData(menuData); RefreshUI(); + + MenuData.SavFile.OnSavSuccessed += RefreshUI; } private void RefreshUI() @@ -57,12 +59,13 @@ namespace AxibugEmuOnline.Client Destroy(m_screenTex); m_screenTex = null; } + + MenuData.SavFile.OnSavSuccessed -= RefreshUI; } public override void OnExecute(OptionUI optionUI, ref bool cancelHide) { MenuData.OnExcute(optionUI, ref cancelHide); - RefreshUI(); } } } diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs index 73fe0bec..44404edc 100644 --- a/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs +++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/OverlayUI/OverlayManager.cs @@ -39,9 +39,15 @@ namespace AxibugEmuOnline.Client s_ins.m_OptionUI.Pop(menus, defaultIndex, onClose); } + public static void HideSideBar() + { + s_ins.m_OptionUI.Hide(); + } + public static void PopTip(string msg) { s_ins.m_popTipsUI.Pop(msg); } + } }