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

190 lines
6.7 KiB
C#
Raw Normal View History

using cfg.SkillCfg;
2024-07-11 18:10:56 +08:00
using Gameplay.Character;
using Gameplay.PostProcess.BlackArea;
using Gameplay.Skill;
2023-12-13 16:20:41 +08:00
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;
}
2023-12-07 13:08:39 +08:00
2023-12-08 13:28:03 +08:00
public void InitFromPlayerSkill(DataPlayerSkill skillConfig, int troopId)
2023-12-07 13:08:39 +08:00
{
owner = null;
influenceId = skillConfig.InfluenceAreaId;
checkType = skillConfig.ReleaseCheckType;
2023-12-08 13:28:03 +08:00
this.troopId = troopId;
2023-12-07 13:08:39 +08:00
}
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);
2023-12-19 15:01:19 +08:00
case EReleaseCheckType.DeadUnitInSelfPrepare:
return _CheckHasSelfDeadCharacters();
default:
DebugUtil.LogError("暂未处理的检查类型:{0}", checkType);
return false;
}
return true;
}
2023-12-19 15:01:19 +08:00
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)
{
2024-07-11 18:10:56 +08:00
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)
{
2024-07-11 18:10:56 +08:00
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)
{
2024-07-11 18:10:56 +08:00
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;
}
}
}