AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/AppMain/UI/InGameUI/InGameUI_SaveStateMenu.cs

102 lines
3.5 KiB
C#

using AxibugEmuOnline.Client.ClientCore;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
public class InGameUI_SaveStateMenu : ExpandMenu
{
private InGameUI m_gameUI;
public override string Name => "存档";
public InGameUI_SaveStateMenu(InGameUI inGameUI)
{
m_gameUI = inGameUI;
}
protected override List<InternalOptionMenu> GetOptionMenus()
{
var saveFiles = App.SavMgr.GetSlotSaves(m_gameUI.RomFile.ID, m_gameUI.RomFile.Platform);
List<InternalOptionMenu> result = new List<InternalOptionMenu>();
foreach (var savFile in saveFiles)
{
result.Add(new SaveSlotMenu(m_gameUI, savFile));
}
return result;
}
/// <summary> 存档侧边选项UI </summary>
public class SaveSlotMenu : ExpandMenu
{
public override Type MenuUITemplateType => typeof(OptionUI_SavSlotItem);
public SaveFile SavFile { get; private set; }
List<InternalOptionMenu> m_subOptions = new List<InternalOptionMenu>();
public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}";
public SaveSlotMenu(InGameUI inGameui, SaveFile savFile)
{
SavFile = savFile;
//非自动存档,增加保存选项
if (!savFile.AutoSave) m_subOptions.Add(new SaveMenuItem(inGameui, savFile));
//添加读取选项
m_subOptions.Add(new LoadMenuItem(inGameui, savFile));
}
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_subOptions;
}
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_ingameUI.Core.DrawCanvas.transform.localScale);
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();
}
}
}
}
}