316 lines
9.4 KiB
C#
316 lines
9.4 KiB
C#
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<LegionBattleManager>, IInitable, IUpdatable
|
|
{
|
|
/// <summary>
|
|
/// 按钮CD(秒)
|
|
/// </summary>
|
|
private const float BUTTON_CD = 3f;
|
|
|
|
/// <summary>
|
|
/// 服务器操作消息冷却(秒)
|
|
/// </summary>
|
|
private const float Net_CD = 1f;
|
|
|
|
/// <summary>
|
|
/// 服务器消息冷却完成的时间
|
|
/// </summary>
|
|
private DateTime netCDEndTime;
|
|
|
|
/// <summary>
|
|
/// 当前军团战阶段
|
|
/// </summary>
|
|
public LegionBattleStatus CurBattleStatus { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 当前军团战报名状态
|
|
/// </summary>
|
|
private LegionBattleSignStatus _curBattleLegionBattleSignStatus;
|
|
|
|
/// <summary>
|
|
/// 军团长指挥按钮CD结束时间
|
|
/// </summary>
|
|
public DateTime ButtonCDEndTime { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 是否可以发送消息
|
|
/// </summary>
|
|
public bool IsSendNet
|
|
{
|
|
get { return CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server) >= netCDEndTime; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 军团战
|
|
/// </summary>
|
|
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<LegionBattleView>();
|
|
v.Init();
|
|
}
|
|
|
|
return v;
|
|
}
|
|
}*/
|
|
|
|
public LegionBattleSignStatus CurBattleLegionBattleSignStatus
|
|
{
|
|
get { return _curBattleLegionBattleSignStatus; }
|
|
|
|
set { _curBattleLegionBattleSignStatus = value; }
|
|
}
|
|
|
|
public void Init()
|
|
{
|
|
InitAction();
|
|
|
|
EventManager.Instance.Register<LegionBattleStatus>(EventManager.EventName.LegionBattleStatus,
|
|
OnBattleLegionStatus);
|
|
}
|
|
|
|
public void Update(float deltaTime)
|
|
{
|
|
if (IsLegionBattle)
|
|
CurBattle?.Update(deltaTime);
|
|
}
|
|
|
|
public void Release()
|
|
{
|
|
EventManager.Instance.Unregister<LegionBattleStatus>(EventManager.EventName.LegionBattleStatus,
|
|
OnBattleLegionStatus);
|
|
|
|
ReleaseAction();
|
|
}
|
|
|
|
#region API
|
|
|
|
/// <summary>
|
|
/// 加载军团战
|
|
/// </summary>
|
|
/// <param name="legionBattleMapId"></param>
|
|
/// <returns></returns>
|
|
public async UniTask<E_LoadingResult> LoadLegionBattle()
|
|
{
|
|
await CurBattle.Load();
|
|
|
|
return E_LoadingResult.Success;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载军团战查看地图
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public async UniTask<E_LoadingResult> LoadLegionBattleInspect()
|
|
{
|
|
CurBattle = new(MapID);
|
|
await CurBattle.LoadInspect();
|
|
|
|
return E_LoadingResult.Success;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 卸载军团战
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否以进行编队
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool CheckIsEditTeam()
|
|
{
|
|
var teams = TeamEditManager.Instance.TeamLegionList;
|
|
foreach (var team in teams)
|
|
{
|
|
if (!team.IsMemberEmpty())
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取阵营对应名称
|
|
/// </summary>
|
|
/// <param name="camp"></param>
|
|
/// <returns></returns>
|
|
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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置指挥冷却时间
|
|
/// </summary>
|
|
public void SetCommandCD()
|
|
{
|
|
ButtonCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(BUTTON_CD);
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.UpdateLegionBattleButtonCD);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置军团战所有消息冷却时间
|
|
/// </summary>
|
|
public void SetNetCD()
|
|
{
|
|
netCDEndTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server).AddSeconds(Net_CD);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 是否占领要塞
|
|
/// </summary>
|
|
public bool IsOccupyFortress(BattlefieldActorCamp camp)
|
|
{
|
|
foreach (var data in CurBattle.BuildingDatas)
|
|
{
|
|
if (data.Cfg.Type != BuildingType.Fortress)
|
|
continue;
|
|
return data.CurCamp == camp;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取某个阵营的某个建筑的数量和加成
|
|
/// </summary>
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取攻击对手的难易度
|
|
/// </summary>
|
|
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
|
|
|
|
/// <summary>
|
|
/// 军团战状态变化
|
|
/// </summary>
|
|
/// <param name="legionBattleStatus"></param>
|
|
private void OnBattleLegionStatus(LegionBattleStatus legionBattleStatus)
|
|
{
|
|
CurBattleStatus = legionBattleStatus;
|
|
if (IsLegionBattleOK && LegionBattleStatus.Combat != CurBattleStatus)
|
|
{
|
|
Debug("军团战结束"); // TODO 进入结算
|
|
}
|
|
}
|
|
}
|
|
} |