using cfg.GuideCfg;
using Framework;
using Gameplay.Net;
using NLDPB;
using PhxhSDK;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Gameplay.Guide
{
///
/// 新手引导管理器
///
public class GuideManager : Singlenton, IInitable
{
///
/// 新手引导配置字典,key:引导组,Value:引导步骤配置链表
///
private Dictionary> dicGuideCfg;
///
/// 当前的引导组
///
private GuideGroup curGroup;
///
/// 是否引导中
///
public bool IsGuiding
{
get { return curGroup != null && curGroup.IsGuiding; }
}
///
/// 控制地板点击
///
public bool IsControlFloor = true;
///
/// 是否改名
///
public bool IsChangeName = true;
///
/// 是否跳过剧情
///
public bool IsSkipStory = false;
///
/// 指定地板索引
///
public int FloorIndex = -1;
public void Init()
{
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData);
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData);
}
///
/// 开始引导
///
public bool BeginGuide()
{
#if GUIDE
if (IsGuiding)
return false;
try
{
foreach (var guide in dicGuideCfg)
{
int completeGroupId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.NewGuideProgress);
if (guide.Key > completeGroupId)
{
DebugUtil.Log($"已完成的引导组id:{completeGroupId},开始引导组id:{guide.Key}");
curGroup = new(guide.Key, guide.Value); // TODO 测试
curGroup.BeginGuide();
return true;
}
}
}
catch (Exception e)
{
DebugUtil.LogError($"跳过引导,错误信息:{e}");
}
#endif
return false;
}
///
/// 完成指定引导步骤
///
///
public void CompleteStep(GuideStepBase step)
{
if (null == curGroup)
return;
if (step != curGroup.CurStep)
{
DebugUtil.LogError("要完成的引导步骤不是当前步骤");
EndGuide(true);
return;
}
if (curGroup.IsComplete)
{
NetHelper.SaveGuideProgress((uint)curGroup.GroupId); // 完成引导组,保存服务器
DebugUtil.Log($"完成引导组,服务器保存id:{curGroup.GroupId}");
int nextGroupId = curGroup.NextGroupId;
if (dicGuideCfg.TryGetValue(nextGroupId, out LinkedList linkCfg))
{
curGroup = new(nextGroupId, linkCfg);
curGroup.BeginGuide();
}
else
EndGuide(false);
}
else
curGroup.BeginNextStep();
}
///
/// 回到指定步骤
///
///
public void ReturnStep(int stepId)
{
curGroup.EndGuide();
curGroup.BeginGuideById(stepId);
}
///
/// 结束引导
///
public void EndGuide(bool isReEnterMain)
{
if (IsGuiding)
curGroup.EndGuide();
curGroup = null;
UIManager.Instance.CloseWindow(UINameConst.UI_Guide);
UIManager.Instance.CloseWindow(UINameConst.UI_GuideTip);
if (isReEnterMain)
GameStateManager.Instance.ChangeState(new GameStateMainScene());
}
///
/// 初始化数据
///
private void InitData()
{
dicGuideCfg = new();
foreach (DataGuideCfg cfg in TableManager.Instance.Tables.GuideConfig.DataList)
{
if (dicGuideCfg.ContainsKey(cfg.GroupId) && !IsFirstStep(cfg))
continue;
DataGuideCfg addCfg = cfg; // 记录要添加进链表的引导步骤配置
int groudId = cfg.GroupId;
LinkedList linkCfg = new();
dicGuideCfg[groudId] = linkCfg;
while (null != addCfg && addCfg.GroupId == groudId)
{
linkCfg.AddLast(addCfg);
if (0 == addCfg.NextId)
addCfg = null;
else if (addCfg.Id >= addCfg.NextId)
throw new Exception($"{addCfg.Id}引导的下一步id配置错误,下一步id小于等于当前id可能导致死循环");
else
addCfg = TableManager.Instance.Tables.GuideConfig.Get(addCfg.NextId);
}
}
#region 检验每个引导组的步骤顺序是否正常
foreach (LinkedList linkCfg in dicGuideCfg.Values)
{
DataGuideCfg preCfg = null;
foreach (DataGuideCfg cfg in linkCfg)
{
if (null == preCfg)
{
preCfg = cfg;
continue;
}
if (preCfg.NextId != cfg.Id)
{
Debug.LogError($"新手引导配置出错,组id:{cfg.GroupId}, 当前步骤id:{preCfg.Id}, 实际下一步步骤id:{preCfg.NextId}, 当前下一步步骤id:{cfg.Id}");
return;
}
else
preCfg = cfg;
}
}
#endregion
}
///
/// 是否是引导组的第一步
///
///
private bool IsFirstStep(DataGuideCfg dataGuideCfg)
{
return dataGuideCfg.Id == dataGuideCfg.GroupId;
}
}
}