예제 #1
0
파일: SRC.play.cs 프로젝트: 7474/SRC
        private void CPUOperation(string uparty)
        {
            // CPUによるユニット操作
            for (var phase = 1; phase <= 5; phase++)
            {
                foreach (var u in UList.Items)
                {
                    // フェイズ中に行動するユニットを選択
                    Commands.SelectedUnit = u;
                    if (u.Status != "出撃")
                    {
                        continue;
                    }

                    if (u.Action == 0)
                    {
                        continue;
                    }

                    if ((u.Party ?? "") != (uparty ?? ""))
                    {
                        continue;
                    }

                    var phaseJudgeUnit = u;

                    // 他のユニットを護衛しているユニットは護衛対象と同じ順に行動
                    if (PList.IsDefined(u.Mode))
                    {
                        var p = PList.Item(u.Mode);
                        if (p.Unit != null)
                        {
                            if (p.Unit.Party == uparty)
                            {
                                phaseJudgeUnit = p.Unit;
                            }
                        }
                    }
                    // XXX 二段階走査してるってこと?
                    if (PList.IsDefined(phaseJudgeUnit.Mode))
                    {
                        var p = PList.Item(phaseJudgeUnit.Mode);
                        if (p.Unit != null)
                        {
                            if (p.Unit.Party == uparty)
                            {
                                phaseJudgeUnit = p.Unit;
                            }
                        }
                    }

                    switch (phase)
                    {
                    case 1:
                        // 最初にサポート能力を持たないザコユニットが行動
                        if (phaseJudgeUnit.BossRank >= 0)
                        {
                            continue;
                        }
                        if (phaseJudgeUnit.MainPilot().HasSupportSkill())
                        {
                            continue;
                        }

                        break;

                    case 2:
                        // 次にサポート能力を持たないボスユニットが行動
                        if (phaseJudgeUnit.MainPilot().HasSupportSkill())
                        {
                            continue;
                        }

                        break;

                    case 3:
                        // 次に統率能力を持つユニットが行動
                        if (!phaseJudgeUnit.MainPilot().IsSkillAvailable("統率"))
                        {
                            continue;
                        }
                        break;

                    case 4:
                        // 次にサポート能力を持つザコユニットが行動
                        if (phaseJudgeUnit.BossRank >= 0)
                        {
                            continue;
                        }
                        break;

                    case 5:
                        // 最後にサポート能力を持つボスユニットが行動
                        break;
                    }

                    while (Commands.SelectedUnit.Action > 0)
                    {
                        // 途中で状態が変更された場合
                        if (Commands.SelectedUnit.Status != "出撃")
                        {
                            break;
                        }

                        // 途中で陣営が変更された場合
                        if ((Commands.SelectedUnit.Party ?? "") != (uparty ?? ""))
                        {
                            break;
                        }

                        if (!GUI.IsRButtonPressed())
                        {
                            GUIStatus.DisplayUnitStatus(Commands.SelectedUnit);
                            GUI.Center(Commands.SelectedUnit.x, Commands.SelectedUnit.y);
                            GUI.RedrawScreen();
                            // XXX
                            //Application.DoEvents();
                        }

                        IsCanceled = false; // Cancelコマンドのクリア

                        // ユニットを行動させる
                        COM.OperateUnit();
                        if (IsScenarioFinished)
                        {
                            return;
                        }

                        // ハイパーモード・ノーマルモードの自動発動チェック
                        UList.CheckAutoHyperMode();
                        UList.CheckAutoNormalMode();

                        // Cancelコマンドが実行されたらここで終了
                        if (IsCanceled)
                        {
                            if (Commands.SelectedUnit is null)
                            {
                                break;
                            }

                            if (Commands.SelectedUnit.Status != "出撃")
                            {
                                break;
                            }

                            IsCanceled = false;
                        }

                        // 行動数を減少
                        Commands.SelectedUnit.UseAction();

                        // 接触イベント
                        {
                            var withBlock13 = Commands.SelectedUnit;
                            if (withBlock13.Status == "出撃" && withBlock13.x > 1)
                            {
                                if (Map.MapDataForUnit[withBlock13.x - 1, withBlock13.y] is object)
                                {
                                    Commands.SelectedTarget = Map.MapDataForUnit[withBlock13.x - 1, withBlock13.y];
                                    Event.HandleEvent("接触", withBlock13.MainPilot().ID, Map.MapDataForUnit[withBlock13.x - 1, withBlock13.y].MainPilot().ID);
                                    if (IsScenarioFinished)
                                    {
                                        return;
                                    }
                                }
                            }
                        }

                        {
                            var withBlock14 = Commands.SelectedUnit;
                            if (withBlock14.Status == "出撃" && withBlock14.x < Map.MapWidth)
                            {
                                if (Map.MapDataForUnit[withBlock14.x + 1, withBlock14.y] is object)
                                {
                                    Commands.SelectedTarget = Map.MapDataForUnit[withBlock14.x + 1, withBlock14.y];
                                    Event.HandleEvent("接触", withBlock14.MainPilot().ID, Map.MapDataForUnit[withBlock14.x + 1, withBlock14.y].MainPilot().ID);
                                    if (IsScenarioFinished)
                                    {
                                        return;
                                    }
                                }
                            }
                        }

                        {
                            var withBlock15 = Commands.SelectedUnit;
                            if (withBlock15.Status == "出撃" && withBlock15.y > 1)
                            {
                                if (Map.MapDataForUnit[withBlock15.x, withBlock15.y - 1] is object)
                                {
                                    Commands.SelectedTarget = Map.MapDataForUnit[withBlock15.x, withBlock15.y - 1];
                                    Event.HandleEvent("接触", withBlock15.MainPilot().ID, Map.MapDataForUnit[withBlock15.x, withBlock15.y - 1].MainPilot().ID);
                                    if (IsScenarioFinished)
                                    {
                                        return;
                                    }
                                }
                            }
                        }

                        {
                            var withBlock16 = Commands.SelectedUnit;
                            if (withBlock16.Status == "出撃" && withBlock16.y < Map.MapHeight)
                            {
                                if (Map.MapDataForUnit[withBlock16.x, withBlock16.y + 1] is object)
                                {
                                    Commands.SelectedTarget = Map.MapDataForUnit[withBlock16.x, withBlock16.y + 1];
                                    Event.HandleEvent("接触", withBlock16.MainPilot().ID, Map.MapDataForUnit[withBlock16.x, withBlock16.y + 1].MainPilot().ID);
                                    if (IsScenarioFinished)
                                    {
                                        return;
                                    }
                                }
                            }
                        }

                        // 進入イベント
                        {
                            var withBlock17 = Commands.SelectedUnit;
                            if (withBlock17.Status == "出撃")
                            {
                                Event.HandleEvent("進入", withBlock17.MainPilot().ID, "" + withBlock17.x, "" + withBlock17.y);
                                if (IsScenarioFinished)
                                {
                                    return;
                                }
                            }
                        }

                        // 行動終了イベント
                        {
                            var withBlock18 = Commands.SelectedUnit;
                            if (withBlock18.Status == "出撃")
                            {
                                Event.HandleEvent("行動終了", withBlock18.MainPilot().ID);
                                if (IsScenarioFinished)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }