Esempio n. 1
0
    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();
    }
Esempio n. 2
0
    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();
    }