using cfg.GuideCfg;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Gameplay.Guide
{
///
/// 引导组
///
public class GuideGroup
{
///
/// 引导步骤
///
private readonly LinkedList linkGuideStep;
///
/// 当前引导步骤
///
private LinkedListNode curStep;
#region 属性
///
/// 引导组id
///
public int GroupId
{
get; private set;
}
///
/// 是否引导中
///
public bool IsGuiding
{
get { return curStep != null && curStep.Value.IsGuiding; }
}
///
/// 是否引导完成
///
public bool IsComplete
{
get { return curStep != null && curStep == linkGuideStep.Last && E_GuideState.Complete == curStep.Value.GuideState; }
}
///
/// 当前引导步骤
///
public GuideStepBase CurStep
{
get { return curStep.Value; }
}
///
/// 获取下一步引导id
///
public int NextGroupId
{
get
{
if (null == linkGuideStep.Last)
return 0;
return linkGuideStep.Last.Value.Cfg.NextId;
}
}
#endregion
///
/// 引导组构造
///
///
///
/// 是否跳过起始步骤
public GuideGroup(int groupId, LinkedList linkCfg, bool isSkipBeginSkip = false)
{
GroupId = groupId;
linkGuideStep = new();
foreach (DataGuideCfg cfg in linkCfg)
{
if (!isSkipBeginSkip)
{
linkGuideStep.AddLast(CreateGuideStep(cfg));
continue;
}
if (!cfg.IsBeginStep)
linkGuideStep.AddLast(CreateGuideStep(cfg));
}
curStep = linkGuideStep.First;
}
///
/// 开始引导
///
public void BeginGuide()
{
if (null == curStep)
return;
curStep.Value.StartGuide();
}
///
/// 开始下一步引导
///
public void BeginNextStep()
{
curStep = curStep.Next;
curStep.Value.StartGuide();
}
///
/// 开始指定步骤引导
///
///
public void BeginGuideById(int id)
{
curStep = linkGuideStep.First;
while (null != curStep)
{
if (curStep.Value.Cfg.Id == id)
break;
curStep = curStep.Next;
}
curStep?.Value.StartGuide();
}
///
/// 结束引导
///
public void EndGuide()
{
if (IsGuiding)
{
UIRoot.Instance.IsEnableGraphicRaycaster(true);
curStep.Value.EndGuide();
}
}
///
/// 创建引导步骤
///
///
///
private GuideStepBase CreateGuideStep(DataGuideCfg dataGuideCfg)
{
if (null == dataGuideCfg)
return null;
return dataGuideCfg.GuideStepType switch
{
E_GuideStepType.PlayVideo => new PlayVideoStep(dataGuideCfg),
E_GuideStepType.ClickButton => new ClickButtonStep(dataGuideCfg),
E_GuideStepType.DragButton => new SliderButtonStep(dataGuideCfg),
E_GuideStepType.ClickFloor => new ClickFloorStep(dataGuideCfg),
E_GuideStepType.EnterHome => new EnterMainStateStep(dataGuideCfg),
E_GuideStepType.ShowGuideTip => new ShowGuideTipStep(dataGuideCfg),
E_GuideStepType.EnterLevel => new EnterLevelStep(dataGuideCfg),
E_GuideStepType.Embattle => new LevelEmbattleStep(dataGuideCfg),
E_GuideStepType.EmbattleVehicle => new LevelEmbattleStep(dataGuideCfg),
E_GuideStepType.TeachFightMove => new TeachFightMoveStep(dataGuideCfg),
E_GuideStepType.TeachFightAttack => new TeachFightAttackStep(dataGuideCfg),
E_GuideStepType.TeachFightEmbattle => new TeachFightEmbattle(dataGuideCfg),
E_GuideStepType.TeachFightMoraleAndRepression => new TeachMoraleAndRepression(dataGuideCfg),
E_GuideStepType.TeachFightUseSkill => new TeachUseSkill(dataGuideCfg),
E_GuideStepType.WaitLevelComplete => new WaitLevelOver(dataGuideCfg),
E_GuideStepType.OpenChoosePerson => new OpenChoosePersonStep(dataGuideCfg),
E_GuideStepType.Wait => new WaitStep(dataGuideCfg),
E_GuideStepType.WaitOpenChangeName => new WaitOpenChangeName(dataGuideCfg),
E_GuideStepType.WaitEditTeam => new WaitEditTeamStep(dataGuideCfg),
E_GuideStepType.NoteStep => new NoteStep(dataGuideCfg),
E_GuideStepType.SaveDefaultTeam => new SaveDefaultTeamStep(dataGuideCfg),
_ => throw new Exception($"未处理类型:{dataGuideCfg.GuideStepType}"),
};
}
}
}