Example #1
0
        public static IEnumerator SelectSkillApplyPoint(BattleData battleData, Direction originalDirection)
        {
            Direction beforeDirection = originalDirection;
            Unit      selectedUnit    = battleData.selectedUnitObject.GetComponent <Unit>();

            while (battleData.currentState == CurrentState.SelectSkillApplyPoint)
            {
                Vector2 selectedUnitPos = battleData.selectedUnitObject.GetComponent <Unit>().GetPosition();

                List <GameObject> activeRange   = new List <GameObject>();
                Skill             selectedSkill = battleData.SelectedSkill;
                activeRange = battleData.tileManager.GetTilesInRange(selectedSkill.GetFirstRangeForm(),
                                                                     selectedUnitPos,
                                                                     selectedSkill.GetFirstMinReach(),
                                                                     selectedSkill.GetFirstMaxReach(),
                                                                     battleData.selectedUnitObject.GetComponent <Unit>().GetDirection());

                Tile selectedTile = UdongNoodle.FindEnemyTile(activeRange, battleData.selectedUnitObject);

                if (selectedTile == null)
                {
                    // 아무것도 할 게 없을 경우 휴식
                    battleData.currentState = CurrentState.RestAndRecover;
                    yield return(battleData.battleManager.StartCoroutine(RestAndRecover.Run(battleData)));

                    yield break;
                }
                // activeRange[Random.Range(0, activeRange.Count)].GetComponent<Tile>();

                battleData.selectedTilePosition = selectedTile.GetTilePos();

                // 타겟팅 스킬을 타겟이 없는 장소에 지정했을 경우 적용되지 않도록 예외처리 필요 - 대부분의 스킬은 논타겟팅. 추후 보강.

                BattleManager battleManager = battleData.battleManager;
                battleData.currentState = CurrentState.CheckApplyOrChain;

                List <GameObject> tilesInSkillRange = GetTilesInSkillRange(battleData, selectedTile);

                yield return(SkillAndChainStates.ApplyChain(battleData, tilesInSkillRange));

                FocusUnit(battleData.SelectedUnit);
                battleData.currentState = CurrentState.FocusToUnit;

                yield return(battleManager.StartCoroutine(SkillAndChainStates.CheckApplyOrChain(battleData, battleData.SelectedTile, originalDirection)));
            }
        }
Example #2
0
        public static IEnumerator AIMove(BattleData battleData)
        {
            BattleManager battleManager = battleData.battleManager;

            yield return(battleManager.StartCoroutine(AIDIe(battleData)));

            Dictionary <Vector2, TileWithPath> movableTilesWithPath = PathFinder.CalculatePath(battleData.selectedUnitObject);
            List <GameObject> movableTiles = new List <GameObject>();

            foreach (KeyValuePair <Vector2, TileWithPath> movableTileWithPath in movableTilesWithPath)
            {
                movableTiles.Add(movableTileWithPath.Value.tile);
            }

            battleData.uiManager.UpdateApBarUI(battleData, battleData.unitManager.GetAllUnits());

            // var randomPosition = movableTiles[Random.Range(0, movableTiles.Count)].GetComponent<Tile>().GetTilePos();
            var randomPosition = UdongNoodle.FindNearestEnemy(movableTiles, battleData.unitManager.GetAllUnits(), battleData.selectedUnitObject);

            // FIXME : 어딘가로 옮겨야 할 텐데...
            GameObject        destTile       = battleData.tileManager.GetTile(randomPosition);
            List <GameObject> destPath       = movableTilesWithPath[randomPosition].path;
            Vector2           currentTilePos = battleData.selectedUnitObject.GetComponent <Unit>().GetPosition();
            Vector2           distanceVector = randomPosition - currentTilePos;
            int distance = (int)Mathf.Abs(distanceVector.x) + (int)Mathf.Abs(distanceVector.y);
            int totalUseActivityPoint = movableTilesWithPath[randomPosition].requireActivityPoint;

            // battleData.moveCount += distance;

            // battleData.tileManager.DepaintTiles(movableTiles, TileColor.Blue);
            battleData.currentState = CurrentState.CheckDestination;

            List <GameObject> destTileList = destPath;

            destTileList.Add(destTile);

            // 카메라를 옮기고
            Camera.main.transform.position = new Vector3(destTile.transform.position.x, destTile.transform.position.y, -10);

            battleData.currentState = CurrentState.MoveToTile;
            yield return(battleManager.StartCoroutine(MoveStates.MoveToTile(battleData, destTile, Direction.Right, totalUseActivityPoint)));

            yield return(AIAttack(battleData));
        }