示例#1
0
    protected bool UnitPosValidation(List <Unit> units, List <Cube> cubes)
    {
        // 같은 큐브에 같은 유닛이 배치되어있는지 확인
        foreach (Unit unit in units)
        {
            // plan속 유닛
            APUnit apUnit = _gameState._units.Find(u => u.owner == unit);

            // plan에는 유닛이 있지만 실제론 없음
            if (apUnit == null)
            {
                return(false);
            }

            // 실제론 unit이 존재하는 plan에는 없음
            if (_gameState._unitPos.TryGetValue(apUnit, out _) == false)
            {
                return(false);
            }

            // 실제와 plan 둘다 해당 유닛이 있는데
            Cube cubeInPlan;
            if (_gameState._unitPos.TryGetValue(apUnit, out cubeInPlan))
            {
                // 다른 큐브에 있다면
                if (cubeInPlan != unit.GetCube)
                {
                    return(false);
                }
            }
        }

        return(true);
    }
 public APUnit(APUnit apUnit)
 {
     owner = apUnit.owner;
     //cube = apUnit.cube;
     health      = apUnit.health;
     actionPoint = apUnit.actionPoint;
     isSelf      = apUnit.isSelf;
 }
示例#3
0
    public void RequestAsync(APGameState gameState, Action <List <PFPath> > OnServe)
    {
        List <INavable>       navables    = new List <INavable>(gameState._cubes);
        APUnit                unit        = gameState.self;
        int                   maxDistance = unit.actionPoint / unit.owner.GetActionSlot(ActionType.Move).cost;
        Cube                  start       = gameState._unitPos[unit];
        Func <INavable, bool> cubeIgnore  = (cube) =>
        {
            return(cube.IsAccupied() == true);
        };

        StartCoroutine(BFSPathfinding(start, navables, unit.actionPoint, OnServe, cubeIgnore));
    }
示例#4
0
    protected bool UnitHealthValidation(List <Unit> units)
    {
        foreach (Unit unit in units)
        {
            APUnit simulUnit = _gameState._units.Find(u => u.owner == unit);
            if (simulUnit == null) // 실제 유닛은 있지만 plan속 유닛이 없는 경우
            {
                return(false);
            }

            if (simulUnit.health != unit.currHealth) // 둘다 있지만 체력이 다른 경우
            {
                return(false);
            }
        }
        return(true);
    }
示例#5
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();
    }
示例#6
0
 public override void SimulateSkillCasting(APUnit unit)
 {
     unit.health = Mathf.Max(unit.health - amountAvg, 0);
 }
示例#7
0
 public virtual void SimulateSkillCasting(APUnit unit)
 {
 }