Exemplo n.º 1
0
    // FixedUpdate() 함수는 고정된 프레임 수(1초에 60번)에 따라 매 프레임마다 호출됩니다.
    // 여기서의 FixedUpdate() 함수는 턴의 각 단계를 진행시키는 함수입니다.
    void FixedUpdate()
    {
        if (turn == 1)
        {
            // 턴이 시작되면
            //Debug.Log("Turn starts.");
            foreach (PlayerController p in Players)
            {
                // 모든 생존자 마나 2씩 회복
                p.ManaRecovery();
            }
            // 행동 결정 단계로 넘어감
            turn = 2;
        }
        else if (turn == 2)
        {
            // 행동 결정 단계에서
            //Debug.Log("Decide your behavior.");

            if (Players[0].GetTargetDecide())       // 대상 결정 중이면
            {
                if (!decideButton.activeInHierarchy)
                {
                    decideButton.SetActive(true);   // 결정 버튼이 나타나게 한다.
                }
                if (Input.GetMouseButtonDown(0))
                {
                    PlayerToSelectTarget();         // 플레이어1이 선택한 대상들을 저장하여 기억한다.
                }
            }
            else
            {
                if (decideButton.activeInHierarchy)
                {
                    decideButton.SetActive(false);  // 결정 버튼이 보이지 않게 한다.
                }
            }
            bool isCompleted = true;
            foreach (PlayerController p in Players)
            {
                // 사망한 플레이어는 행동을 결정하지 않음
                if (p.GetDead())
                {
                    continue;
                }
                else if (!p.GetHasDecided())
                {
                    isCompleted = false;
                    break;
                }
            }
            // TODO 각 플레이어가 결정한 행동을 저장해 놓아야 한다.
            // 행동은 PlayerController.cs에서 만들도록 한다.
            // 만약 모든 생존자가 행동 결정을 완료하면 행동 수행 단계로 넘어감
            if (isCompleted)
            {
                turn = 3;
            }
        }
        else if (turn == 3)
        {
            foreach (Behavior behavior in Behaviors)
            {
                if (behavior.GetObjectPlayers().Count == 2)
                {
                    Debug.Log(behavior.GetSubjectPlayer().GetPlayerName() + " -> "
                              + behavior.GetObjectPlayers()[0].GetPlayerName() + ", " + behavior.GetObjectPlayers()[1].GetPlayerName() + " (" + behavior.GetBehavior().Name + ")");
                }
                else if (behavior.GetObjectPlayers().Count == 1)
                {
                    Debug.Log(behavior.GetSubjectPlayer().GetPlayerName() + " -> "
                              + behavior.GetObjectPlayers()[0].GetPlayerName() + " (" + behavior.GetBehavior().Name + ")");
                }
            }
            //Debug.Log("Performming behaviors...");
            // 모든 플레이어의 상태이상을 해제하고 행동을 결정하지 않은 상태로 초기화함
            foreach (PlayerController p in Players)
            {
                p.Purify();
                p.SetNotDecided();
            }
            // 전 단계에서 결정된 행동들을 수행함
            foreach (Behavior b in Behaviors)
            {
                // TODO 피해 무시, 상대 행동 무효화 등의 행동은 가장 먼저 이루어져야 함
                //StartCoroutine("PerformBehavior", b);
                BehaviorManager.Perform(b);
            }
            Behaviors = new List <Behavior>();
            turn      = 4;
        }
        else if (turn == 4)
        {
            //Debug.Log("Processing the dead...");
            foreach (PlayerController p in Players)
            {
                p.Death();
            }
            turn = 5;
        }
        else if (turn == 5)
        {
            bool isEnd   = false;
            bool allDead = true;
            for (int i = 0; i < 5; i++)
            {
                //Debug.Log(PlayerPermutation[i].player.GetPlayerName() + "'s target is " + PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[0]].player.GetPlayerName() + " and "+ PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[1]].player.GetPlayerName() + ".");
                if (!PlayerPermutation[i].player.GetDead())
                {
                    allDead = false;
                    if (PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[0]].player.GetDead() &&
                        PlayerPermutation[PlayerPermutation[i].GetTargetIndex()[1]].player.GetDead())
                    {
                        isWin[i] = true;
                        isEnd    = true;
                        Debug.Log(PlayerPermutation[i].player.GetPlayerName() + " wins!");
                    }
                }
            }
            if (allDead)
            {
                Debug.Log("No one wins.");
                isEnd = true;
            }
            if (isEnd)
            {
                Debug.Log("Battle ends.");
                turn = 6;
            }
            else
            {
                Debug.Log("Turn ends.");
                turn = 1;   // 7로 놓으면 수동으로(버튼을 눌러서) 턴 진행, 1로 놓으면 자동으로 턴 진행
            }
        }
    }