NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Guide/GuideManager.cs

308 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
/// <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.CurStep.Cfg.Id}</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; // 该组没有完成,重来
}
}
}