NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Area/AreaChecker.cs

198 lines
6.9 KiB
C#

using AOT.PostProcess.BlackArea;
using cfg.SkillCfg;
using Gameplay.Character;
using Gameplay.PostProcess.BlackArea;
using Gameplay.Skill;
using Gameplay.Unit;
using Gameplay.Unit.Data;
namespace Gameplay.Area
{
public class AreaChecker
{
public GameUnit owner;
public int troopId;
public int influenceId;
public EReleaseCheckType checkType;
public void InitFromCharacterSkill(SkillHandle skillHandle)
{
var unit = skillHandle.owner;
owner = unit;
influenceId = skillHandle.runtimeData.configData.ShowAreaId;
checkType = skillHandle.runtimeData.configData.ReleaseCheckType;
troopId = unit.commonData.troopId;
}
public void InitFromPlayerSkill(DataPlayerSkill skillConfig, int troopId)
{
owner = null;
influenceId = skillConfig.InfluenceAreaId;
checkType = skillConfig.ReleaseCheckType;
this.troopId = troopId;
}
public bool CheckAvailable(int cellIndex)
{
switch (checkType)
{
// 常规
case EReleaseCheckType.None:
return true;
case EReleaseCheckType.CenterIsEnemy:
return _CheckCenterIsEnemy(cellIndex);
case EReleaseCheckType.CenterIsSelfSide:
return _CheckCenterIsSelfSide(cellIndex);
case EReleaseCheckType.CenterIsEmpty:
return _CheckCenterIsEmpty(cellIndex);
case EReleaseCheckType.AreaContainsEnemy:
return _CheckAreaContainsEnemy(cellIndex);
case EReleaseCheckType.AreaContainsSelfSide:
return _CheckAreaContainsSelfSide(cellIndex);
case EReleaseCheckType.CenterIsSelfVehicle:
return _CheckCenterIsSelfVehicle(cellIndex);
case EReleaseCheckType.DeadUnitInSelfPrepare:
return _CheckHasSelfDeadCharacters();
case EReleaseCheckType.AnyCell:
return _CheckAnyCell(cellIndex);
default:
DebugUtil.LogError("暂未处理的检查类型:{0}", checkType);
return false;
}
return true;
}
private bool _CheckAnyCell(int cellIndex)
{
return cellIndex != -1;
}
private bool _CheckHasSelfDeadCharacters()
{
for (int i = 0; i < GameUnitManager.instance.deadUnits.count; i++)
{
var unit = GameUnitManager.instance.deadUnits.GetByIndex(i);
if (unit.commonData.troopId != troopId)
{
continue;
}
if (unit.gameunitType != EGameUnitType.Character)
{
continue;
}
return true;
}
return false;
}
private bool _CheckCenterIsSelfVehicle(int centerCellIndex)
{
var units = AreaManager.instance.GetUnitsByCellIndex(centerCellIndex);
var senderTroopId = troopId;
var isSelf = false;
for (var i = 0; i < units.Count; ++i)
{
var u = units[i];
if (u.gameunitType != EGameUnitType.Vehicle) continue;
if (u.commonData.troopId == senderTroopId)
{
isSelf = true;
break;
}
}
return isSelf;
}
private bool _CheckAreaContainsSelfSide(int centerCellIndex)
{
var influenceAreaId = influenceId;
var areaIndexs = AreaManager.instance.GetCellIndexs(centerCellIndex, influenceAreaId);
// 查找所有友军
for (var i = 0; i < areaIndexs.Count; ++i)
{
var searchCellIndex = areaIndexs[i];
var isSelf = _CheckCenterIsSelfSide(searchCellIndex);
if (isSelf) return true;
}
return false;
}
private bool _CheckAreaContainsEnemy(int centerCellIndex)
{
if (troopId == ETroopsId.Self)
{
// 需要额外判断是否在光亮区域
var isLight = BlackAreaManager.instance.CheckIsInLightArea(centerCellIndex);
if (!isLight) return false;
}
var influenceAreaId = influenceId;
var areaIndexs = AreaManager.instance.GetCellIndexs(centerCellIndex, influenceAreaId);
// 查找所有敌人
for (var i = 0; i < areaIndexs.Count; ++i)
{
var searchCellIndex = areaIndexs[i];
var isEnemy = _CheckCenterIsEnemy(searchCellIndex);
if (isEnemy) return true;
}
return false;
}
private bool _CheckCenterIsEmpty(int centerCellIndex)
{
if (troopId == ETroopsId.Self)
{
// 需要额外判断是否在光亮区域
var isLight = BlackAreaManager.instance.CheckIsInLightArea(centerCellIndex);
if (!isLight) return false;
}
var units = AreaManager.instance.GetUnitsByCellIndex(centerCellIndex);
var isEmpty = units.Count == 0;
return isEmpty;
}
private bool _CheckCenterIsSelfSide(int centerCellIndex)
{
var units = AreaManager.instance.GetUnitsByCellIndex(centerCellIndex);
var senderTroopId = troopId;
var isSelf = false;
for (var i = 0; i < units.Count; ++i)
{
var u = units[i];
if (u.gameunitType != EGameUnitType.Character) continue;
if (u.commonData.troopId == senderTroopId)
{
isSelf = true;
break;
}
}
return isSelf;
}
private bool _CheckCenterIsEnemy(int centerCellIndex)
{
if (troopId == ETroopsId.Self)
{
// 需要额外判断是否在光亮区域
var isLight = BlackAreaManager.instance.CheckIsInLightArea(centerCellIndex);
if (!isLight) return false;
}
var units = AreaManager.instance.GetUnitsByCellIndex(centerCellIndex);
var senderTroopId = troopId;
var isEnemy = false;
for (var i = 0; i < units.Count; ++i)
{
var u = units[i];
if (u.gameunitType != EGameUnitType.Character) continue;
if (u.statusData.isDead) continue;
if (u.commonData.troopId != senderTroopId)
{
isEnemy = true;
break;
}
}
return isEnemy;
}
}
}