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; 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) { 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; } } }