private void ExecuteFile(string fname) { if (Strings.LCase(Strings.Right(fname, 5)) == ".srcs") { using (var stream = File.OpenRead(fname)) { // セーブデータの読み込み GUI.OpenNowLoadingForm(); LoadData(stream); GUI.CloseNowLoadingForm(); // インターミッション InterMission.InterMissionCommand(true); if (!IsSubStage) { if (string.IsNullOrEmpty(Expression.GetValueAsString("次ステージ"))) { GUI.ErrorMessage("次のステージのファイル名が設定されていません"); TerminateSRC(); } StartScenario(Expression.GetValueAsString("次ステージ")); } else { IsSubStage = false; } } } else if (Strings.LCase(Strings.Right(fname, 5)) == ".srcq") { // 中断データの読み込み GUI.LockGUI(); RestoreData(fname, SRCSaveKind.Suspend); // 画面を書き直してステータスを表示 GUI.RedrawScreen(); GUIStatus.DisplayGlobalStatus(); GUI.UnlockGUI(); } else if (Strings.LCase(Strings.Right(fname, 4)) == ".eve") { // イベントファイルの実行 StartScenario(fname); } else { GUI.ErrorMessage("「" + fname + "」はSRC用のファイルではありません!" + Constants.vbCr + Constants.vbLf + "拡張子が「.eve」のイベントファイル、" + "または拡張子が「.src」のセーブデータファイルを指定して下さい。"); TerminateSRC(); } }
// 陣営upartyのフェイズを実行 public void StartTurn(string uparty) { // TODO Impl StartTurn Stage = uparty; Sound.BossBGM = false; if (uparty == "味方") { do { // 味方フェイズ Stage = "味方"; // ターン数を進める if (!Map.IsStatusView) { Turn = Turn + 1; TotalTurn = TotalTurn + 1; } // 状態回復 foreach (var currentUnit in UList.Items) { Commands.SelectedUnit = currentUnit; switch (currentUnit.Status) { case "出撃": case "格納": { if ((currentUnit.Party ?? "") == (uparty ?? "")) { if (Map.IsStatusView) { currentUnit.UsedAction = 0; } else { currentUnit.Rest(); } if (IsScenarioFinished) { GUI.UnlockGUI(); return; } } else { currentUnit.UsedAction = 0; } break; } case "旧主形態": case "旧形態": { currentUnit.UsedAction = 0; break; } } } // 味方が敵にかけたスペシャルパワーを解除 foreach (var currentU in UList.Items) { switch (currentU.Status) { case "出撃": case "格納": { currentU.RemoveSpecialPowerInEffect("敵ターン"); break; } } } GUI.RedrawScreen(); // 味方フェイズ用BGMを演奏 if (!Map.IsStatusView) { var terrain = Map.Terrain(1, 1); switch (terrain?.Class ?? "") { case "屋内": Sound.StartBGM(Sound.BGMName("Map3")); break; case "宇宙": Sound.StartBGM(Sound.BGMName("Map5")); break; default: if (terrain?.Name == "壁") { Sound.StartBGM(Sound.BGMName("Map3")); } else { Sound.StartBGM(Sound.BGMName("Map1")); } break; } } // ターンイベント Event.IsUnitCenter = false; Event.HandleEvent("ターン", Turn.ToString(), "味方"); if (IsScenarioFinished) { GUI.UnlockGUI(); return; } // 操作可能なユニットがいるかどうかチェック if (UList.Items.Count(x => x.Party == "味方" && x.CanAction) > 0 || Expression.IsOptionDefined("味方フェイズ強制発動")) { break; } // CPUが操作するユニットがいるかどうかチェック if (UList.Items.Count(x => x.Party != "味方" && x.Status == "出撃") > 0) { break; } // 敵フェイズ StartTurn("敵"); if (IsScenarioFinished) { IsScenarioFinished = false; return; } // 中立フェイズ StartTurn("中立"); if (IsScenarioFinished) { IsScenarioFinished = false; return; } // NPCフェイズ StartTurn("NPC"); if (IsScenarioFinished) { IsScenarioFinished = false; return; } }while (true); } else { // 味方フェイズ以外 // 状態回復 foreach (var currentUnit in UList.Items) { Commands.SelectedUnit = currentUnit; switch (currentUnit.Status) { case "出撃": case "格納": { if ((currentUnit.Party ?? "") == (uparty ?? "")) { currentUnit.Rest(); if (IsScenarioFinished) { GUI.UnlockGUI(); return; } } else { currentUnit.UsedAction = 0; } break; } case "旧主形態": case "旧形態": { currentUnit.UsedAction = 0; break; } } } // 敵ユニットが味方にかけたスペシャルパワーを解除 foreach (var currentUnit in UList.Items) { switch (currentUnit.Status) { case "出撃": case "格納": { currentUnit.RemoveSpecialPowerInEffect("敵ターン"); break; } } } GUI.RedrawScreen(); // 敵(NPC)フェイズ用BGMを演奏 var terrain = Map.Terrain(1, 1); if (Stage == "NPC") { switch (terrain?.Class ?? "") { case "屋内": Sound.StartBGM(Sound.BGMName("Map3")); break; case "宇宙": Sound.StartBGM(Sound.BGMName("Map5")); break; default: if (terrain?.Name == "壁") { Sound.StartBGM(Sound.BGMName("Map3")); } else { Sound.StartBGM(Sound.BGMName("Map1")); } break; } } else { switch (terrain?.Class ?? "") { case "屋内": Sound.StartBGM(Sound.BGMName("Map4")); break; case "宇宙": Sound.StartBGM(Sound.BGMName("Map6")); break; default: if (terrain?.Name == "壁") { Sound.StartBGM(Sound.BGMName("Map4")); } else { Sound.StartBGM(Sound.BGMName("Map2")); } break; } } // ターンイベント Event.HandleEvent("ターン", Turn.ToString(), uparty); if (IsScenarioFinished) { GUI.UnlockGUI(); return; } } int max_lv; Unit max_unit = null; if (uparty == "味方") { // 味方フェイズのプレイヤーによるユニット操作前の処理 // ターン数を表示 if (Turn > 1 && Expression.IsOptionDefined("デバッグ")) { GUI.DisplayTelop("ターン" + SrcFormatter.Format(Turn)); } // 通常のステージでは母艦ユニットまたはレベルがもっとも高い // ユニットを中央に配置 if (!Map.IsStatusView && !Event.IsUnitCenter) { foreach (Unit currentUnit in UList.Items) { if (currentUnit.Party == "味方" && currentUnit.Status == "出撃" && currentUnit.Action > 0) { if (currentUnit.IsFeatureAvailable("母艦")) { GUI.Center(currentUnit.x, currentUnit.y); GUIStatus.DisplayUnitStatus(currentUnit); GUI.RedrawScreen(); GUI.UnlockGUI(); return; } } } max_lv = 0; foreach (Unit cuttentUnit in UList.Items) { if (cuttentUnit.Party == "味方" && cuttentUnit.Status == "出撃") { if (cuttentUnit.MainPilot().Level > max_lv) { max_unit = cuttentUnit; max_lv = cuttentUnit.MainPilot().Level; } } } if (max_unit != null) { GUI.Center(max_unit.x, max_unit.y); } } // ステータスを表示 if (!Map.IsStatusView) { GUIStatus.DisplayGlobalStatus(); } // プレイヤーによる味方ユニット操作に移行 GUI.RedrawScreen(); GUI.UnlockGUI(); return; } GUI.LockGUI(); CPUOperation(uparty); if (IsScenarioFinished) { return; } // ステータスウィンドウの表示を消去 GUIStatus.ClearUnitStatus(); }