using cfg.SkillCfg; 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.InfluenceAreaId; 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(); default: DebugUtil.LogError("暂未处理的检查类型:{0}", checkType); return false; } return true; } 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) { 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) { 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) { 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.commonData.troopId != senderTroopId) { isEnemy = true; break; } } return isEnemy; } } }