using Cysharp.Threading.Tasks; using Framework; using Gameplay.SubSystems; using NLDPB; using PhxhSDK; using System; using cfg.LegionBattleCfg; namespace Gameplay.LegionBattle { public sealed partial class LegionBattleManager : Singlenton, IInitable, IUpdatable { /// /// 按钮CD(秒) /// private const float BUTTON_CD = 3f; /// /// 服务器操作消息冷却(秒) /// private const float Net_CD = 1f; /// /// 服务器消息冷却完成的时间 /// private DateTime netCDEndTime; /// /// 当前军团战阶段 /// public LegionBattleStatus CurBattleStatus { get; private set; } /// /// 当前军团战报名状态 /// private LegionBattleSignStatus _curBattleLegionBattleSignStatus; /// /// 军团长指挥按钮CD结束时间 /// public DateTime ButtonCDEndTime { get; private set; } /// /// 是否可以发送消息 /// public bool IsSendNet { get { return CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server) >= netCDEndTime; } } /// /// 军团战 /// public LegionBattle CurBattle { get; private set; } /* private LegionBattleView v; public LegionBattleView View { get { if(v == null) { var go = new GameObject(); go.name = "LegionBattleView"; GameObject.DontDestroyOnLoad(go); v = go.AddComponent(); v.Init(); } return v; } }*/ public LegionBattleSignStatus CurBattleLegionBattleSignStatus { get { return _curBattleLegionBattleSignStatus; } set { _curBattleLegionBattleSignStatus = value; } } public void Init() { InitAction(); EventManager.Instance.Register(EventManager.EventName.LegionBattleStatus, OnBattleLegionStatus); } public void Update(float deltaTime) { if (IsLegionBattle) CurBattle?.Update(deltaTime); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.LegionBattleStatus, OnBattleLegionStatus); ReleaseAction(); } #region API /// /// 加载军团战 /// /// /// public async UniTask LoadLegionBattle() { await CurBattle.Load(); return E_LoadingResult.Success; } /// /// 加载军团战查看地图 /// /// public async UniTask LoadLegionBattleInspect() { CurBattle = new(MapID); await CurBattle.LoadInspect(); return E_LoadingResult.Success; } /// /// 卸载军团战 /// public async void UnloadLegionBattle() { if (null != CurBattle) { await CurBattle.Unload(); CurBattle.Release(); CurBattle = null; } } public static string GetStartTimeStr(int scheduleID) { var startTime = CommonUtils.GetScheduleStartDateTime(scheduleID); var timeStr = startTime.ToString("HH:mm"); return CommonUtils.GetLocalizeText("legionbattle_start_time", startTime.Year, startTime.Month, startTime.Day, timeStr); } public static string GetEndTimeStr(int scheduleID) { var endTime = CommonUtils.GetScheduleStartDateTime(scheduleID); var timeStr = endTime.ToString("HH:mm"); return CommonUtils.GetLocalizeText("legionbattle_start_time", endTime.Year, endTime.Month, endTime.Day, timeStr); } /// /// 是否以进行编队 /// /// public bool CheckIsEditTeam() { var teams = TeamEditManager.Instance.TeamLegionList; foreach (var team in teams) { if (!team.IsMemberEmpty()) { return true; } } return false; } /// /// 获取阵营对应名称 /// /// /// public static string GetTeamName(BattlefieldActorCamp camp) { switch (camp) { case BattlefieldActorCamp.CampA: return CommonUtils.GetLocalizeText("legionbattle_team_blue"); case BattlefieldActorCamp.CampB: return CommonUtils.GetLocalizeText("legionbattle_team_red"); default: return CommonUtils.GetLocalizeText("legionbattle_team_none"); } } /// /// 设置指挥冷却时间 /// public void SetCommandCD() { ButtonCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(BUTTON_CD); EventManager.Instance.Send(EventManager.EventName.UpdateLegionBattleButtonCD); } /// /// 设置军团战所有消息冷却时间 /// public void SetNetCD() { netCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(Net_CD); } /// /// 是否占领要塞 /// public bool IsOccupyFortress(BattlefieldActorCamp camp) { foreach (var data in CurBattle.BuildingDatas) { if (data.Cfg.Type != BuildingType.Fortress) continue; return data.CurCamp == camp; } return false; } /// /// 获取某个阵营的某个建筑的数量和加成 /// public float GetBuildBuffInfo(BattlefieldActorCamp camp, BuildingType buildingType, out int count) { count = 0; var buffPerBuilding = 0f; foreach (var buildingData in CurBattle.BuildingDatas) { if (buildingData.CurCamp != camp || buildingData.Cfg.Type != buildingType) continue; count++; if (buffPerBuilding == 0f) { buffPerBuilding = buildingType switch { BuildingType.Granary => buildingData.Cfg.HungerAddIn, BuildingType.Fortification => buildingData.Cfg.DefAddIn, BuildingType.Blockhouse => buildingData.Cfg.AttackAddIn, BuildingType.Hospital => buildingData.Cfg.HpRecover, _ => buffPerBuilding }; } } return buffPerBuilding; } /// /// 获取攻击对手的难易度 /// public DifficultyLevel GetAttackResultData(BattlefieldActorCamp attackCamp, BattlefieldActorCamp defCamp) { if (TryGetLegionData(attackCamp, out var atkLegionData) && TryGetLegionData(defCamp, out var defLegionData)) { var atkValue = 0; foreach (var member in atkLegionData.DicMember.Values) { atkValue += member.Attack; } var defValue = 0; foreach (var member in defLegionData.DicMember.Values) { defValue += member.Def; } var resultValue = defValue == 0 ? -1 : (float)atkValue / defValue - 1; var cfgData = GetLegionResultCfgData(resultValue); return cfgData?.DifficultyLevel ?? DifficultyLevel.Hard; } return DifficultyLevel.Hard; } public DataLegionResult GetLegionResultCfgData(float result) { var resultCfg = TableManager.Instance.Tables.LegionResult; foreach (var data in resultCfg.DataList) { if (result > data.ScoreMin && result <= data.ScoreMax) { return data; } } return null; } #endregion /// /// 军团战状态变化 /// /// private void OnBattleLegionStatus(LegionBattleStatus legionBattleStatus) { CurBattleStatus = legionBattleStatus; if (IsLegionBattleOK && LegionBattleStatus.Combat != CurBattleStatus) { Debug("军团战结束"); // TODO 进入结算 } } } }