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()); } }