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

272 lines
9.3 KiB
C#

using AOT.PostProcess.BlackArea;
using cfg.SkillCfg;
using Gameplay.Character;
using Gameplay.Level;
using Gameplay.PostProcess.BlackArea;
using Gameplay.Skill;
using Gameplay.Unit;
using Gameplay.Unit.Data;
using Gameplay.Vehicle.Impl;
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.CenterIsCanUpVehicle:
return _CheckCenterIsCanUpVehicle(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 _CheckCenterIsCanUpVehicle(int centerCellIndex)
{
if (centerCellIndex == -1)
{
return false;
}
var units = AreaManager.instance.GetUnitsByCellIndex(centerCellIndex);
for (int i = 0; i < units.Count; i++)
{
var unit = units[i];
if (unit.gameunitType != EGameUnitType.Vehicle)
{
continue;
}
var vehicle = unit as NormalVehicle;
if (vehicle == null)
{
DebugUtil.LogError("车辆类型错误");
continue;
}
if (vehicle.CheckCanUp(owner))
{
return true;
}
}
return false;
}
private bool _CheckCenterIsSelfVehicle(int centerCellIndex)
{
if (centerCellIndex == -1)
{
return false;
}
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)
{
if (centerCellIndex == -1)
{
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 isSelf = _CheckCenterIsSelfSide(searchCellIndex);
if (isSelf) return true;
}
return false;
}
private bool _CheckAreaContainsEnemy(int centerCellIndex)
{
if (centerCellIndex == -1)
{
return false;
}
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 (centerCellIndex == -1)
{
return false;
}
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;
if (!isEmpty) return false;
// 还需要判断格子信息
var blockData = LevelManager.Instance.CurrentLevel.Map.GetBlockData(centerCellIndex);
if (blockData == null)
{
return false;
}
var property = blockData.GetTerrainTypeProperty();
if (property.banAttack || !property.selectable)
{
return false;
}
return true;
}
private bool _CheckCenterIsSelfSide(int centerCellIndex)
{
if (centerCellIndex == -1)
{
return false;
}
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
&& u.gameunitType != EGameUnitType.Building
&& u.gameunitType != EGameUnitType.Vehicle) continue;
if (!u.statusData.canBeAttack) continue;
if (u.commonData.troopId == senderTroopId)
{
isSelf = true;
break;
}
}
return isSelf;
}
private bool _CheckCenterIsEnemy(int centerCellIndex)
{
if (centerCellIndex == -1)
{
return false;
}
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
&& u.gameunitType != EGameUnitType.Building
&& u.gameunitType != EGameUnitType.Vehicle) continue;
if (u.statusData.isDead) continue;
if (!u.statusData.canBeAttack) continue;
if (u.commonData.troopId != senderTroopId)
{
isEnemy = true;
break;
}
}
return isEnemy;
}
}
}