private IEnumerator Simulate_Coroutine(Action OnSimulationCompleted, List <APActionNode> attackNodes) { // 액션포인트가 충분한지부터 체크 if (_gameState.self.actionPoint < _gameState.self.owner.GetActionSlot(ActionType.Attack).cost) { OnSimulationCompleted(); yield break; } // 현실 큐브로 기본공격 범위를 먼저 Get Cube centerCube = _gameState._unitPos[_gameState.self]; List <Cube> cubesInAttackRange = MapMgr.Instance.GetCubes( _gameState.self.owner.basicAttackRange, centerCube ); // 공격 가능한 모든 곳으로 공격하는 모든 경우의 수는 List로 생성 foreach (Cube cube in cubesInAttackRange) { List <Cube> splashCubes = MapMgr.Instance.GetCubes(_gameState.self.owner.basicAttackSplash, cube); List <APUnit> splashUnits = _gameState._unitPos.Where(unitPos => splashCubes.Contains(unitPos.Value)).Select(unitPos => unitPos.Key).ToList(); // 자기 자신의 위치를 공격하는 것은 예외처리 if (cube == centerCube) { continue; } // 스플래쉬 범위에 자기 자신이 있는 것도 제외 else if (splashCubes.Contains(_gameState._unitPos[_gameState.self])) { continue; } // cubesInAttackRange안의 적유닛이 하나라도 있는 큐브를 공격하는 AttackActionNode (Splash 포함) if (splashUnits.Any(units => _gameState.self.owner.team.enemyTeams.Contains(units.owner.team))) { attackNodes.Add(ActionNode_Attack.Create(_gameState, _prevScore, cube)); } yield return(null); } OnSimulationCompleted(); }
private IEnumerator Simulate_Coroutine(Action OnSimulationCompleted, List <APActionNode> attackNodes) { // 액션포인트가 충분한지부터 체크 if (_gameState.self.actionPoint < _gameState.self.owner.GetActionSlot(ActionType.Attack).cost) { OnSimulationCompleted(); yield break; } // 현실 큐브로 기본공격 범위를 먼저 Get Cube centerCube = _gameState._unitPos[_gameState.self]; List <Cube> cubesInAttackRange = MapMgr.Instance.GetCubes( _gameState.self.owner.basicAttackRange, centerCube ); // 공격 가능한 모든 곳으로 공격하는 모든 경우의 수는 List로 생성 foreach (Cube cube in cubesInAttackRange) { // 자기 자신의 위치를 공격하는 것은 예외처리 if (cube == centerCube) { continue; } // cubesInAttackRange안의 적유닛이 있는 한 큐브를 공격하는 AttackActionNode if (_gameState._unitPos.ContainsValue(cube)) { APUnit apUnit = _gameState._unitPos.FirstOrDefault(p => p.Value == cube).Key; Cube gameStateCube = _gameState._unitPos[apUnit]; if (gameStateCube != null && _gameState._unitPos[_gameState.self] != gameStateCube && _gameState.self.owner.team.enemyTeams.Contains(apUnit.owner.team)) { attackNodes.Add(ActionNode_Attack.Create(_gameState, _prevScore, _actionPointPanel, apUnit.owner)); } } yield return(null); } OnSimulationCompleted(); }