using cfg.DialogueCfg;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using Gameplay.Guide;
using Gameplay.Level;
using PhxhSDK;
using System;
using System.Collections.Generic;
using System.Linq;
using Random = UnityEngine.Random;
///
/// 台词管理器
///
public class DialogueManager : Singlenton, IInitable, IUpdatable
{
///
/// 台词播放记录数据
///
private class DialoguePlayData
{
///
/// 台词对应次数字典
///
public Dictionary DicCount;
///
/// 上一次日期
///
public DateTime LastTime;
public DialoguePlayData()
{
DicCount = new();
}
public void SetNewTime(DateTime dateTime)
{
LastTime = dateTime;
DicCount.Clear();
}
}
///
/// 实际语音id = 角色id * RATIO + 台词id
/// 实际台词文本key = "Dialogue_{实际语音id}"
///
private const int RATIO = 1000;
///
/// 台词播放记录数据key
///
private const string DIALOGUE_PLAY_DATA = "Dialogue_Play_Data";
///
/// 角色台词对应的权重字典,key:角色id,value: subKey:台词id,subValue:台词权重
///
private Dictionary> dicDialogueWeight;
///
/// 台词数据字典字典,key:台词类型,value:台词配置数据列表
///
private Dictionary> dicDialogue;
///
/// 台词播放记录数据
///
private DialoguePlayData dialoguePlayData;
#region 战斗台词
///
/// 当前播放的战斗台词
///
private Audio curFightAudio;
///
/// 当前战斗台词优先级
///
private int curFightDialoguePriority;
///
/// 当前战斗语音类型
///
private E_DialogueType curFightDialogueType;
///
/// 等待播放的获得增益buff语音,value:角色id
///
private readonly Queue queueWaitGetBuffDialogue = new();
#endregion
///
/// 是否初始化
///
private bool isInit;
#region 临时数据
///
/// 符合条件的台词数据
///
private readonly List listDialogueDataTemp = new();
private readonly List listDialogueWeight = new();
#endregion
///
/// 是否正在播放战斗语音
///
public bool IsPlayingFightDialogue
{
get { return null != curFightAudio && curFightAudio.IsPlaying; }
}
public void Init()
{
isInit = false;
dicDialogueWeight = new();
dialoguePlayData = StorageMgr.Instance.GetStorage(DIALOGUE_PLAY_DATA);
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnInit);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_SELF_RETREAT, (Action)OnFightRetreat);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_SELECT_UNIT, (Action)OnFightChoose);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_CLICK_MOVE, (Action)OnFightMove);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_CLICK_ATTACK, (Action)OnFightAttack);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_USE_SKILL, (Action)OnFightUseSkill);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_UP_VEHICLE, (Action)OnFightBoardVehicle);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_DOWN_VEHICLE, (Action)OnFightLeaveVehicle);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_GET_P_BUFF, (Action)OnFightGetBuff);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_KILL_ENEMY, (Action)OnFightKillEnemy);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_LET_ENEMY_RETREAT, (Action)OnFightRepelEnemy);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_HAS_SHEILD, (Action)OnFightArmourDown);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_NO_SHEILD, (Action)OnFightArmourBloodZero);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_DEAD, (Action)OnFightKnockedDown);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_LOW_MORALE, (Action)OnFightStifleState);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_RETREAT, (Action)OnFightRetreatState);
}
public void Update(float deltaTime)
{
if (null == LevelManager.Instance.CurrentLevel)
return;
if (!LevelManager.Instance.CurrentLevel.IsInBattle())
return;
if (IsPlayingFightDialogue)
return;
if (E_DialogueType.FightUseSkill != curFightDialogueType)
{
if (queueWaitGetBuffDialogue.Count > 0)
queueWaitGetBuffDialogue.Clear();
return;
}
while (queueWaitGetBuffDialogue.TryDequeue(out int roleId))
{
PlayFightDiaogue(roleId, E_DialogueType.FightGetBuff);
}
}
public void Release()
{
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_RETREAT, (Action)OnFightRetreatState);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_LOW_MORALE, (Action)OnFightStifleState);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_DEAD, (Action)OnFightKnockedDown);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_NO_SHEILD, (Action)OnFightArmourBloodZero);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_HAS_SHEILD, (Action)OnFightArmourDown);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_LET_ENEMY_RETREAT, (Action)OnFightRepelEnemy);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_KILL_ENEMY, (Action)OnFightKillEnemy);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_GET_P_BUFF, (Action)OnFightGetBuff);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_DOWN_VEHICLE, (Action)OnFightLeaveVehicle);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_UP_VEHICLE, (Action)OnFightBoardVehicle);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_USE_SKILL, (Action)OnFightUseSkill);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_CLICK_ATTACK, (Action)OnFightAttack);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_CLICK_MOVE, (Action)OnFightMove);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_SELECT_UNIT, (Action)OnFightChoose);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_SELF_RETREAT, (Action)OnFightRetreat);
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnInit);
listDialogueDataTemp.Clear();
}
///
/// 播放台词
///
///
///
///
///
public async UniTask