增加存档的重试和解决冲突的操作菜单选项

This commit is contained in:
Alienjack 2025-08-20 01:27:47 +08:00
parent 9270852fe0
commit c864dceb5d
2 changed files with 88 additions and 8 deletions

View File

@ -63,7 +63,7 @@ namespace AxibugEmuOnline.Client
/// <summary> 存档顺序号,用于判断云存档和本地存档的同步状态,是否存在冲突 </summary>
public uint Sequecen { get; private set; }
SimpleFSM<SaveFile> FSM;
public SimpleFSM<SaveFile> FSM { get; private set; }
byte[] m_savDataCaches;
byte[] m_screenShotCaches;
Header m_headerCache;
@ -219,7 +219,7 @@ namespace AxibugEmuOnline.Client
/// </summary>
public void TrySync()
{
if (FSM.CurrentState is not IdleState && FSM.CurrentState is not SyncedState) return;
if (FSM.CurrentState is not IdleState && FSM.CurrentState is not SyncedState && FSM.CurrentState is not SyncFailedState) return;
FSM.ChangeState<CheckingNetworkState>();
}

View File

@ -33,17 +33,23 @@ namespace AxibugEmuOnline.Client
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}";
SaveMenuItem saveMENU;
LoadMenuItem loadMENU;
RetryMenuItem retryMENU;
UseLocalSaveMenuItem useLocalMENU;
UseRemoteSaveMenuItem useRemoteMENU;
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));
saveMENU = new SaveMenuItem(inGameui, savFile);
loadMENU = new LoadMenuItem(inGameui, savFile);
retryMENU = new RetryMenuItem(inGameui, savFile);
useLocalMENU = new UseLocalSaveMenuItem(inGameui, savFile);
useRemoteMENU = new UseRemoteSaveMenuItem(inGameui, savFile);
}
public override void OnShow(OptionUI_MenuItem ui)
@ -55,7 +61,21 @@ namespace AxibugEmuOnline.Client
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_subOptions;
var menus = new List<InternalOptionMenu>();
if (SavFile.GetCurrentState() is SaveFile.ConflictState)
{
menus.Add(useRemoteMENU);
menus.Add(useLocalMENU);
}
else
{
if (SavFile.GetCurrentState() is SaveFile.SyncFailedState) menus.Add(retryMENU);
if (!SavFile.AutoSave) menus.Add(saveMENU);
if (!SavFile.IsEmpty) menus.Add(loadMENU);
}
return menus;
}
public class SaveMenuItem : ExecuteMenu
@ -111,6 +131,66 @@ namespace AxibugEmuOnline.Client
OverlayManager.HideSideBar();
}
}
public class RetryMenuItem : ExecuteMenu
{
SaveFile m_savFile;
InGameUI m_ingameUI;
public override string Name => "重试";
public override bool Visible => m_savFile.GetCurrentState() is SaveFile.SyncFailedState;
public RetryMenuItem(InGameUI inGameui, SaveFile savFile)
{
m_ingameUI = inGameui;
m_savFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
cancelHide = true;
m_savFile.TrySync();
}
}
public class UseRemoteSaveMenuItem : ExecuteMenu
{
SaveFile m_savFile;
InGameUI m_ingameUI;
public override string Name => "使用云端存档";
public UseRemoteSaveMenuItem(InGameUI inGameui, SaveFile savFile)
{
m_ingameUI = inGameui;
m_savFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
if (m_savFile.GetCurrentState() is not SaveFile.ConflictState) return;
cancelHide = true;
m_savFile.FSM.ChangeState<SaveFile.DownloadingState>();
}
}
public class UseLocalSaveMenuItem : ExecuteMenu
{
SaveFile m_savFile;
InGameUI m_ingameUI;
public override string Name => "使用本地存档";
public UseLocalSaveMenuItem(InGameUI inGameui, SaveFile savFile)
{
m_ingameUI = inGameui;
m_savFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
if (m_savFile.GetCurrentState() is not SaveFile.ConflictState) return;
cancelHide = true;
m_savFile.FSM.ChangeState<SaveFile.UploadingState>();
}
}
}
}
}