예제 #1
0
    void Update()
    {
StartGameManager:

        //Restart
        if (!Player.instance)
        {
            if (!Input.GetKey("r"))
            {
                return;
            }
            // 現在のシーン番号を取得
            int sceneIndex = SceneManager.GetActiveScene().buildIndex;

            // 現在のシーンを再読込する
            SceneManager.LoadScene(sceneIndex);
        }

        //プレイヤーのターンかEnemyが動いた後ならUpdateしない
        if (playersTurn || waitAnimation || playerAttacking)
        {
            return;
        }

        if (phase == GamePhase.StartTurn)
        {
            phase = GamePhase.CheckPlayerAct;
            // 単位時間の経過
            player.remainingActionCommandTime += 60;
            for (int i = 0; i < NPCs.Count; i++)
            {
                NPCs[i].remainingActionCommandTime += 60;
            }
            for (int i = 0; i < enemies.Count; i++)
            {
                enemies[i].remainingActionCommandTime += 60;
            }
        }

        if (phase == GamePhase.CheckPlayerAct)
        {
            phase = GamePhase.PlayerAttack;
            //プレイヤーのコマンドを待つか
            if (player.CanAction())
            {
                player.remainingActionCommandTime -= player.GetActionCommandTime();
                playersTurn         = true;
                AllowEnemyTurnDelay = true;
                return;
            }
        }

        //↓プレイヤーの行動が決まったら以下の処理へ
        if (phase == GamePhase.PlayerAttack)
        {
            phase = GamePhase.MoveMap;
            //プレイヤーの攻撃処理
            if (player.GetCommand() == MovingObject.TurnCommand.Attack)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                AttackMovingObject(player);
                // Enemyが死ぬ可能性がある場合は一旦Returnしてコルーチンの処理を待つ
                return;
            }
        }

        if (phase == GamePhase.MoveMap)
        {
            if (player.GetCommand() == MovingObject.TurnCommand.MoveMap)
            {
                if (player.isMoving)
                {
                    return;
                }
                if (boardScript.Stairs[0].GetComponent <Wall>().data.pos == player.logicalPos)
                {
                    MoveMap();
                }
                player.SetCommand(MovingObject.TurnCommand.Undef);
            }
            phase = GamePhase.PlayerThrowItem;
        }

        if (phase == GamePhase.PlayerThrowItem)
        {
            phase = GamePhase.PlayerPutItem;
            if (player.GetCommand() == MovingObject.TurnCommand.ThrowItem)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                ThrowMovingObject(player);
                // Enemyが死ぬ可能性がある場合は一旦Returnしてコルーチンの処理を待つ
                phase = GamePhase.VerifyThrownItemPos;
                return;
            }
        }

        if (phase == GamePhase.VerifyThrownItemPos)
        {
            phase = GamePhase.PlayerUseItem;
        }

        if (phase == GamePhase.PlayerPutItem)
        {
            phase = GamePhase.PlayerUseItem;
            if (player.GetCommand() == MovingObject.TurnCommand.PutItem)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                Item tmp = Item.GenerateItemFromNode(player.PutItem, player.logicalPos);
                player.Inventory.RemoveItem(player.PutItem, player.PutItem.stack);
                phase = GamePhase.VerifyThrownItemPos;
            }
        }

        if (phase == GamePhase.PlayerUseItem)
        {
            phase = GamePhase.PlayerCastMagic;
            if (player.GetCommand() == MovingObject.TurnCommand.UseItem)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                PlayerUseItem();
                return;
            }
        }

        if (phase == GamePhase.PlayerCastMagic)
        {
            phase = GamePhase.PlayerMove;
            if (player.GetCommand() == MovingObject.TurnCommand.CastMagic)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                CastMagicMovingObject(player);
                // Enemyが死ぬ可能性がある場合は一旦Returnしてコルーチンの処理を待つ
                return;
            }
        }

        if (phase == GamePhase.PlayerMove)
        {
            playerMoved = false;
            phase       = GamePhase.EnemyCommandDecide;
            //プレイヤーの移動処理
            if (player.GetCommand() == MovingObject.TurnCommand.Move)
            {
                player.SetCommand(MovingObject.TurnCommand.Undef);
                player.Move();
                playerMoved = true;
                return;
            }
        }

        if (phase == GamePhase.EnemyCommandDecide)
        {
            enemyMoved    = false;
            enemyAttacked = false;
            if (CheckCanActionEnemy())
            {
                for (int i = 0; i < NPCs.Count; i++)
                {
                    if (NPCs[i].CanAction())
                    {
                        NPCs[i].remainingActionCommandTime -= NPCs[i].GetActionCommandTime();
                        NPCs[i].CommandNPC();
                        if (NPCs[i].GetCommand() == MovingObject.TurnCommand.Move)
                        {
                            NPCs[i].Move();
                            enemyMoved = true;
                            NPCs[i].SetCommand(MovingObject.TurnCommand.Undef);
                        }
                    }
                }
                for (int i = 0; i < enemies.Count; i++)
                {
                    if (enemies[i].CanAction())
                    {
                        enemies[i].remainingActionCommandTime -= enemies[i].GetActionCommandTime();
                        enemies[i].CommandEnemy();
                        if (enemies[i].GetCommand() == MovingObject.TurnCommand.Move)
                        {
                            enemies[i].Move();
                            enemyMoved = true;
                            enemies[i].SetCommand(MovingObject.TurnCommand.Undef);
                        }
                    }
                }

                //攻撃目標再設定
                for (int i = 0; i < NPCs.Count; i++)
                {
                    if (NPCs[i].GetCommand() != MovingObject.TurnCommand.Undef)
                    {
                        NPCs[i].CommandNPC();
                    }
                    if (NPCs[i].GetCommand() == MovingObject.TurnCommand.Attack ||
                        NPCs[i].GetCommand() == MovingObject.TurnCommand.CastMagic)
                    {
                        enemyAttacked = true;
                    }
                }
                for (int i = 0; i < enemies.Count; i++)
                {
                    if (enemies[i].GetCommand() != MovingObject.TurnCommand.Undef)
                    {
                        enemies[i].CommandEnemy();
                    }
                    if (enemies[i].GetCommand() == MovingObject.TurnCommand.Attack ||
                        enemies[i].GetCommand() == MovingObject.TurnCommand.CastMagic)
                    {
                        enemyAttacked = true;
                    }
                }

                phase = GamePhase.EnemyMove;
            }
            else
            {
                phase = GamePhase.PlayerGetItem;
            }
        }

        if (phase == GamePhase.EnemyMove)
        {
            enemyAttackCunter = 0;
            phase             = GamePhase.EnemyAttack;
            if (enemyMoved)
            {
                TurnEnemies();
            }
            return;
        }

        if (phase == GamePhase.EnemyAttack)
        {
            if (enemyAttacked)
            {
                if (player.isMoving)
                {
                    return;
                }
                enemyAttackCunter = 0;
                for (int i = enemyAttackCunter; i < NPCs.Count; i++)
                {
                    enemyAttackCunter = i;
                    if (NPCs[i].isMoving)
                    {
                        return;
                    }
                    if (NPCs[i].GetCommand() == MovingObject.TurnCommand.Attack)
                    {
                        NPCs[i].SetCommand(MovingObject.TurnCommand.Undef);
                        AttackMovingObject(NPCs[i]);
                        enemyAttackCunter++;
                        return;
                    }
                    if (NPCs[i].GetCommand() == MovingObject.TurnCommand.CastMagic)
                    {
                        NPCs[i].SetCommand(MovingObject.TurnCommand.Undef);
                        CastMagicMovingObject(NPCs[i]);
                        enemyAttackCunter++;
                        return;
                    }
                }
                enemyAttackCunter = 0;
                for (int i = enemyAttackCunter; i < enemies.Count; i++)
                {
                    enemyAttackCunter = i;
                    if (enemies[i].isMoving)
                    {
                        return;
                    }
                    if (enemies[i].GetCommand() == MovingObject.TurnCommand.Attack)
                    {
                        enemies[i].SetCommand(MovingObject.TurnCommand.Undef);
                        AttackMovingObject(enemies[i]);
                        enemyAttackCunter++;
                        return;
                    }
                    if (enemies[i].GetCommand() == MovingObject.TurnCommand.CastMagic)
                    {
                        enemies[i].SetCommand(MovingObject.TurnCommand.Undef);
                        CastMagicMovingObject(enemies[i]);
                        enemyAttackCunter++;
                        return;
                    }
                }
            }
            phase = GamePhase.PlayerGetItem;
        }

        if (phase == GamePhase.PlayerGetItem)
        {
            if (playerMoved)
            {
                if (player.isMovingPre)
                {
                    return;
                }
                Item tmp = player.GetItemFromTile(items);
                if (tmp)
                {
                    if (player.Inventory.AddItem(new ItemNode(tmp.Node)))
                    {
                        MessageWindow.instance.ConOut(tmp.Node.GetDisplayName() + "を拾った。\n");
                        Destroy(tmp.gameObject);
                    }
                    else
                    {
                        MessageWindow.instance.ConOut("持ち物がいっぱいで拾えない。" + tmp.Node.GetDisplayName() + "の上に乗った。\n");
                    }
                }
            }
            phase = GamePhase.CheckEnemyAct;
        }

        if (phase == GamePhase.CheckEnemyAct)
        {
            if (CheckCanActionEnemy() || player.CanAction())
            {
                phase = GamePhase.CheckPlayerAct;
                goto StartGameManager;
            }
            else
            {
                phase = GamePhase.DungeonAct;
            }
        }

        if (phase == GamePhase.DungeonAct)
        {
            boardScript.DungeonTrun();
            phase = GamePhase.EndTurnProcess;
        }

        if (phase == GamePhase.EndTurnProcess)
        {
            player.EndTurnProcess();
            for (int i = 0; i < enemies.Count; i++)
            {
                enemies[i].EndTurnProcess();
            }
            phase = GamePhase.WaitPlayerTurn;
        }

        if (phase == GamePhase.WaitPlayerTurn)
        {
            StartCoroutine(TurnDelay());
        }
    }