using System.Collections.Generic;
using UnityEngine;
using Articy.Touhou;
///
/// 关卡池化管理
///
namespace Game
{
public enum ELevelType
{
Home,
Battle,
BattleElite,
BattleBoss,
BattleBigBoss,
BattleFinalBoss,
Store,
Treasure,
Money,
Random,
Drama,
Rest,
None = 99,
}
public class LevelPoolManager : ObjectPoolBase
{
private readonly string _mLevelPath = "Level/";
private LevelPoolItem _mCurLevel;
private List _mFinishedLevel = new List();
private float _mLoadingTimeLeft;
private Dictionary _mDoorTypeDict = new Dictionary();//关卡类型对应门的实体id
private bool _isAIDirectorInit = false;
public override void Update()
{
if (_mLoadingTimeLeft == 0)
{
return;
}
_mLoadingTimeLeft -= Time.deltaTime;
if (_mLoadingTimeLeft <= 0)
{
_mLoadingTimeLeft = 0;
Loading(false);
}
}
public override void OnDestroy()
{
}
public void EnterLevel(string levelId)
{
if (string.IsNullOrEmpty(levelId))
{
Util.Print("关卡id为空");
return;
}
if (_mCurLevel != null)
{
_mCurLevel.Destroy();
}
EnterLevelReal(levelId);
}
private void EnterLevelReal(string levelId)
{
Loading(true);
var levelNew = Create($"Level{levelId.ToString()}", (item) =>
{
var cfg = Util.GetConfig(levelId);
if (!(cfg is Level))
{
Util.Print("关卡id错误:", levelId);
return;
}
var cfgLevel = cfg as Level;
item.CfgId = cfg.TechnicalName;
item.Cfg = cfgLevel.GetFeatureLevel();
item.Init();
});
levelNew.SetPlayerBorn(_mCurLevel == null ? "" : _mCurLevel.CfgId);
_mFinishedLevel.Add(levelNew.CfgId);
_mCurLevel = levelNew;
_mCurLevel.CreateLevel();
}
public GameObject CreateLevelGo(string levelId)
{
var path = $"{_mLevelPath}{levelId.ToString()}";
var go = PrefabManager.Instance.CreateGo(path);
go.transform.parent = Root.transform;
return go;
}
private void Loading(bool isLoading)
{
if (isLoading)
{
_mLoadingTimeLeft = GameConst.LoadingMinTime;
UIManager.Instance.OpenInNew(EuiPage.Loading);
}
else
{
UIManager.Instance.OpenInNew(EuiPage.Hud);
// TODO 显示关卡名称
// string levelName = m_CurLevel.m_LevelNode.Text;
// if (!string.IsNullOrEmpty(levelName))
// {
// EventManager.instance.SendEvent(EEvent.ShowLevelName, levelName);
// }
}
}
private void LoadDoorTypeDict()
{
var cfgs = Util.GetDoorConfigDataAll();
foreach (var item in cfgs)
{
var cfg = item.Template.Door;
_mDoorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName;
}
}
public string GetDoorId(ELevelType levelType)
{
if (!_mDoorTypeDict.ContainsKey(levelType))
{
Util.Print("无该类型的传送门:", levelType);
return "";
}
return _mDoorTypeDict[levelType];
}
public LevelPoolItem GetCurLevel()
{
return _mCurLevel;
}
public LevelNodeMonsterWave GetCurWave()
{
return _mCurLevel.CurWave;
}
public bool IsLevelLoading()
{
return _mLoadingTimeLeft > 0;
}
public List GetFinishedLevel()
{
return _mFinishedLevel;
}
public int GetDifficulty()
{
return _mCurLevel.Cfg.Difficulty;
}
public bool GetAIDirectorInit()
{
return _isAIDirectorInit;
}
public void SetAIDirectorInit()
{
_isAIDirectorInit = true;
}
public int GetModuleNum(EAIModuleType type)
{
if (_mCurLevel == null)
{
return 0;
}
if (_mCurLevel.CurWave == null)
{
return 0;
}
return _mCurLevel.CurWave.GetModuleNum(type);
}
}
}
namespace Game
{
public abstract partial class Util
{
public static void EnterLevel(string levelId)
{
LevelPoolManager.Instance.EnterLevel(levelId);
}
public static LevelPoolItem GetCurLevel()
{
return LevelPoolManager.Instance.GetCurLevel();
}
public static LevelNodeMonsterWave GetCurWave()
{
return LevelPoolManager.Instance.GetCurWave();
}
public static int GetDifficulty()
{
return LevelPoolManager.Instance.GetDifficulty();
}
public static bool IsLevelLoading()
{
return LevelPoolManager.Instance.IsLevelLoading();
}
public static List GetFinishedLevel()
{
return LevelPoolManager.Instance.GetFinishedLevel();
}
public static bool GetAIDirectorInit()
{
return LevelPoolManager.Instance.GetAIDirectorInit();
}
public static void SetAIDirectorInit()
{
LevelPoolManager.Instance.SetAIDirectorInit();
}
public static int GetModuleNum(EAIModuleType type)
{
return LevelPoolManager.Instance.GetModuleNum(type);
}
}
}