272 lines
9.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|