309 lines
10 KiB
C#
309 lines
10 KiB
C#
using cfg.GuideCfg;
|
||
using Framework;
|
||
using Gameplay.Area;
|
||
using Gameplay.Level;
|
||
using Gameplay.Net;
|
||
using Gameplay.PlayerSkill;
|
||
using Gameplay.Skill;
|
||
using NLDPB;
|
||
using PhxhSDK;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace Gameplay.Guide
|
||
{
|
||
/// <summary>
|
||
/// 新手引导管理器
|
||
/// </summary>
|
||
public class GuideManager : Singlenton<GuideManager>, IInitable, IUpdatable
|
||
{
|
||
/// <summary>
|
||
/// 新手引导配置字典,key:引导组,Value:引导步骤配置链表
|
||
/// </summary>
|
||
private Dictionary<int, LinkedList<DataGuideCfg>> dicGuideCfg;
|
||
/// <summary>
|
||
/// 当前的引导组
|
||
/// </summary>
|
||
private GuideGroup curGroup;
|
||
private bool isGuiding;
|
||
|
||
/// <summary>
|
||
/// 是否引导中
|
||
/// </summary>
|
||
public bool IsGuiding
|
||
{
|
||
get { return curGroup != null && curGroup.IsGuiding; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 控制地板点击
|
||
/// </summary>
|
||
public bool IsControlFloor = false;
|
||
/// <summary>
|
||
/// 是否改名
|
||
/// </summary>
|
||
public bool IsChangeName = true;
|
||
/// <summary>
|
||
/// 指定地板索引
|
||
/// </summary>
|
||
public int FloorIndex = -1;
|
||
/// <summary>
|
||
/// 是否编队引导
|
||
/// </summary>
|
||
public bool IsEditTeamGuide = false;
|
||
|
||
public void Init()
|
||
{
|
||
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData);
|
||
}
|
||
|
||
public void Update(float deltaTime)
|
||
{
|
||
if (!Instance.IsGuiding)
|
||
return;
|
||
|
||
if (!LevelManager.Instance.IsInLevel)
|
||
return;
|
||
|
||
if (null == LevelManager.Instance.CurrentLevel)
|
||
return;
|
||
|
||
if (!LevelManager.Instance.CurrentLevel.isInBattle)
|
||
return;
|
||
|
||
if (!LevelManager.Instance.CurrentLevel.IsPause())
|
||
return;
|
||
|
||
AreaManager.instance.LogicUpdate(deltaTime);
|
||
SkillManager.instance.playerSkillManager.LogicUpdate(deltaTime);
|
||
}
|
||
|
||
public void Release()
|
||
{
|
||
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 开始引导
|
||
/// </summary>
|
||
public bool BeginGuide()
|
||
{
|
||
#if GUIDE
|
||
if (IsGuiding)
|
||
return false;
|
||
|
||
try
|
||
{
|
||
int completeStepId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.NewGuideProgress);
|
||
int groupId = GetGuideGroupId(completeStepId);
|
||
if (!dicGuideCfg.TryGetValue(groupId, out LinkedList<DataGuideCfg> linkCfg))
|
||
return false;
|
||
|
||
UIManager.Instance.IsEnableBack = false;
|
||
DebugUtil.Log($"<color=#00FA9A>已完成的引导步骤id:{completeStepId},开始引导组id:{groupId}</color>");
|
||
curGroup = new(groupId, linkCfg);
|
||
curGroup.BeginGuide();
|
||
|
||
return true;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
DebugUtil.LogError($"跳过引导,错误信息:{e}");
|
||
}
|
||
#endif
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 完成指定引导步骤
|
||
/// </summary>
|
||
/// <param name="step"></param>
|
||
public void CompleteStep(GuideStepBase step)
|
||
{
|
||
if (null == curGroup)
|
||
return;
|
||
|
||
if (step != curGroup.CurStep)
|
||
{
|
||
DebugUtil.LogError("要完成的引导步骤不是当前步骤");
|
||
EndGuide(true);
|
||
|
||
return;
|
||
}
|
||
|
||
NetHelper.SaveGuideProgress((uint)curGroup.CurStep.Cfg.Id); // 完成引导步骤,保存服务器
|
||
DebugUtil.Log($"<color=#00FA9A>完成引导步骤,服务器保存引导id:{curGroup.GroupId}</color>");
|
||
|
||
if (curGroup.IsComplete)
|
||
{
|
||
DebugUtil.Log($"<color=#00FA9A>完成引导组,组id:{curGroup.GroupId}</color>");
|
||
|
||
int nextGroupId = curGroup.NextGroupId;
|
||
if (dicGuideCfg.TryGetValue(nextGroupId, out LinkedList<DataGuideCfg> linkCfg))
|
||
{
|
||
curGroup = new(nextGroupId, linkCfg, true);
|
||
curGroup.BeginGuide();
|
||
}
|
||
else
|
||
EndGuide(false);
|
||
}
|
||
else
|
||
{
|
||
if (curGroup.CurStep.Cfg.IsComplete)
|
||
DebugUtil.Log($"<color=#00FA9A>提前完成引导组,组id:{curGroup.GroupId}</color>");
|
||
|
||
curGroup.BeginNextStep();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 回到指定步骤
|
||
/// </summary>
|
||
/// <param name="step"></param>
|
||
public void ReturnStep(int stepId)
|
||
{
|
||
curGroup.EndGuide();
|
||
curGroup.BeginGuideById(stepId);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 结束引导
|
||
/// </summary>
|
||
public void EndGuide(bool isReEnterMain)
|
||
{
|
||
if (IsGuiding)
|
||
curGroup.EndGuide();
|
||
|
||
UIManager.Instance.IsEnableBack = true;
|
||
curGroup = null;
|
||
UIManager.Instance.CloseWindow(UINameConst.UI_Guide);
|
||
UIManager.Instance.CloseWindow(UINameConst.UI_GuideTip);
|
||
|
||
if (isReEnterMain)
|
||
GameStateManager.Instance.ChangeState(new GameStateMainScene());
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化数据
|
||
/// </summary>
|
||
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<DataGuideCfg> 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<DataGuideCfg> 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
|
||
}
|
||
|
||
/// <summary>
|
||
/// 是否是引导组的第一步
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private bool IsFirstStep(DataGuideCfg dataGuideCfg)
|
||
{
|
||
return dataGuideCfg.Id == dataGuideCfg.GroupId;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取应该引导的引导组id
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private int GetGuideGroupId(int completeStepId)
|
||
{
|
||
GuideConfig guideConfig = TableManager.Instance.Tables.GuideConfig;
|
||
if (guideConfig.DataList.Count <= 0)
|
||
return 0;
|
||
|
||
if (completeStepId >= guideConfig.DataList[^1].Id) // 大于等于最后一步的id
|
||
return 0; // 跳过引导
|
||
|
||
DataGuideCfg completeCfg = guideConfig.Get(completeStepId); // 已经完成的引导步骤配置
|
||
if (null == completeCfg) // 没有获取到,说明不是存在的配置id
|
||
return guideConfig.DataList.Count > 0 ? guideConfig.DataList[0].GroupId : 0;
|
||
|
||
bool isGroupComplete = false; // 当前步骤所在引导组是否完成
|
||
DataGuideCfg nextCfg = guideConfig.Get(completeCfg.NextId);
|
||
if (null == nextCfg)
|
||
return 0; // 没有下一步了
|
||
else if (nextCfg.GroupId != completeCfg.GroupId) // 该步骤是该组最后一步,表示整组完成
|
||
isGroupComplete = true;
|
||
else
|
||
{
|
||
foreach (DataGuideCfg cfg in TableManager.Instance.Tables.GuideConfig.DataList)
|
||
{
|
||
if (cfg.GroupId != completeCfg.GroupId)
|
||
continue;
|
||
|
||
if (cfg.IsComplete && cfg.Id <= completeCfg.Id)
|
||
{
|
||
DebugUtil.Log($"<color=#00FA9A>引导步骤{completeStepId}所在组{cfg.GroupId}的{cfg.Id}步骤完成,该组完成</color>");
|
||
isGroupComplete = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (isGroupComplete) // 该组完成,取下一组
|
||
{
|
||
DataGuideCfg dataGuideCfg = guideConfig.Get(completeCfg.NextId);
|
||
while (null != dataGuideCfg)
|
||
{
|
||
if (dataGuideCfg.GroupId == completeCfg.GroupId)
|
||
{
|
||
dataGuideCfg = guideConfig.Get(dataGuideCfg.NextId);
|
||
continue;
|
||
}
|
||
|
||
return dataGuideCfg.GroupId;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
else
|
||
return completeCfg.GroupId; // 该组没有完成,重来
|
||
}
|
||
}
|
||
} |