Пример #1
0
        // 一時中断用データをロード
        public void RestoreData(Stream stream, SRCSaveKind saveKind)
        {
            var quick_load = saveKind == SRCSaveKind.Quik || saveKind == SRCSaveKind.Restart;

            try
            {
                // マウスカーソルを砂時計に
                GUI.ChangeStatus(GuiStatus.WaitCursor);
                if (quick_load)
                {
                    if (Expression.IsOptionDefined("デバッグ"))
                    {
                        Event.LoadEventData(ScenarioFileName, "クイックロード");
                    }
                }
                if (!quick_load)
                {
                    GUI.OpenNowLoadingForm();
                }

                // XXX Version プロパティだけのオブジェクトでバージョンチェックなど
                var data = JsonConvert.DeserializeObject <SRCSuspendData>((new StreamReader(stream).ReadToEnd()));
                //SaveDataVersion = Conversions.ToInteger(fname2);
                var scenario_file_is_different = !FileSystem.RelativePathEuqals(ScenarioPath, ScenarioFileName, data.ScenarioFileName);
                if (scenario_file_is_different)
                {
                    // TODO Impl ウィンドウのタイトルを設定
                    // ウィンドウのタイトルを設定
                    //GUI.MainFormText = "SRC - " + Strings.Left(fname2, Strings.Len(fname2) - 4);
                }
                Titles    = data.Titles;
                TotalTurn = data.TotalTurn;
                Money     = data.Money;
                Event.GlobalVariableList = data.GlobalVariableList;
                PList = data.PList;
                UList = data.UList;
                IList = data.IList;
                //
                ScenarioFileName        = FileSystem.ToAbsolutePath(ScenarioPath, data.ScenarioFileName);
                Turn                    = data.Turn;
                Event.LocalVariableList = data.LocalVariableList;

                // 使用するデータをロード
                if (!quick_load)
                {
                    GUI.SetLoadImageSize(data.Titles.Count * 2 + 5);
                    foreach (var title in Titles)
                    {
                        IncludeData(title);
                    }

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\alias.txt"))
                    //{
                    //    ALDList.Load(ScenarioPath + @"Data\alias.txt");
                    //}

                    //bool localFileExists() { string argfname = ScenarioPath + @"Data\mind.txt"; var ret = SRC.FileSystem.FileExists(argfname); return ret; }

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\sp.txt"))
                    //{
                    //    SPDList.Load(ScenarioPath + @"Data\sp.txt");
                    //}
                    //else if (localFileExists())
                    //{
                    //    SPDList.Load(ScenarioPath + @"Data\mind.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot.txt"))
                    //{
                    //    PDList.Load(ScenarioPath + @"Data\pilot.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\non_pilot.txt"))
                    //{
                    //    NPDList.Load(ScenarioPath + @"Data\non_pilot.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\robot.txt"))
                    //{
                    //    UDList.Load(ScenarioPath + @"Data\robot.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\unit.txt"))
                    //{
                    //    UDList.Load(ScenarioPath + @"Data\unit.txt");
                    //}

                    //GUI.DisplayLoadingProgress();
                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot_message.txt"))
                    //{
                    //    MDList.Load(ScenarioPath + @"Data\pilot_message.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot_dialog.txt"))
                    //{
                    //    DDList.Load(ScenarioPath + @"Data\pilot_dialog.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\effect.txt"))
                    //{
                    //    EDList.Load(ScenarioPath + @"Data\effect.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\animation.txt"))
                    //{
                    //    ADList.Load(ScenarioPath + @"Data\animation.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\ext_animation.txt"))
                    //{
                    //    EADList.Load(ScenarioPath + @"Data\ext_animation.txt");
                    //}

                    //if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\item.txt"))
                    //{
                    //    IDList.Load(ScenarioPath + @"Data\item.txt");
                    //}

                    GUI.DisplayLoadingProgress();
                    IsLocalDataLoaded = true;
                    Event.LoadEventData(ScenarioFileName, "リストア");
                    GUI.DisplayLoadingProgress();
                }
                else
                {
                    if (scenario_file_is_different)
                    {
                        Event.LoadEventData(ScenarioFileName, "リストア");
                    }
                }

                Event.Restore(data);
                PList.Restore(this);
                UList.Restore(this);
                IList.Restore(this);
                Map.Restore(data);

                // XXX 仮処理
                UList.Items.ToList().ForEach(x => x.Update());
                PList.Items.ToList().ForEach(x => x.Update());

                // BGM関連の設定を復元
                // TODO パスの正規化
                var bgmFile = Sound.SearchMidiFile("(" + Path.GetFileName(data.BGMFileName) + ")");
                if (!string.IsNullOrEmpty(bgmFile))
                {
                    // BGMが必ず切り替わる状態で変更してから関連設定を復元する
                    Sound.KeepBGM = false;
                    Sound.BossBGM = false;
                    Sound.ChangeBGM(bgmFile);
                }
                else
                {
                    Sound.StopBGM();
                }
                Sound.RepeatMode = data.RepeatMode;
                Sound.KeepBGM    = data.KeepBGM;
                Sound.BossBGM    = data.BossBGM;

                //    // 乱数系列を復元
                //    if (!Expression.IsOptionDefined("デバッグ") && !Expression.IsOptionDefined("乱数系列非保存") && !FileSystem.EOF(SaveDataFileNumber))
                //    {
                //        FileSystem.Input(SaveDataFileNumber, GeneralLib.RndSeed);
                //        GeneralLib.RndReset();
                //        FileSystem.Input(SaveDataFileNumber, GeneralLib.RndIndex);
                //    }

                if (!quick_load)
                {
                    GUI.DisplayLoadingProgress();
                }

                //    // リンクデータを処理するため、セーブファイルを一旦閉じてから再度読み込み
                //    Event.SkipEventData();
                //    PList.RestoreLinkInfo();
                //    IList.RestoreLinkInfo();
                //    UList.RestoreLinkInfo();
                //    FileSystem.FileClose(SaveDataFileNumber);

                //    // パラメータ情報を処理するため、セーブファイルを一旦閉じてから再度読み込み。
                //    // 霊力やHP、ENといったパラメータは最大値が特殊能力で変動するため、
                //    // 特殊能力の設定が終わってから改めて設定してやる必要がある。

                //    Event.SkipEventData();
                //    PList.RestoreParameter();
                //    IList.RestoreParameter();
                //    UList.RestoreParameter();
                //    PList.UpdateSupportMod();

                // 背景書き換え
                // XXX 常に書き換えでない理由何かある?
                //if (Map.IsMapDirty)
                //{
                int map_x, map_y;
                map_x = GUI.MapX;
                map_y = GUI.MapY;
                GUI.SetupBackground(Map.MapDrawMode, "非同期");
                GUI.MapX = map_x;
                GUI.MapY = map_y;

                // 再開イベントによるマップ画像の書き換え処理を行う
                Event.HandleEvent("再開");
                Map.IsMapDirty = false;
                //}

                Commands.SelectedUnit   = null;
                Commands.SelectedTarget = null;

                // 画面更新
                GUI.Center(GUI.MapX, GUI.MapY);
                if (!quick_load)
                {
                    GUI.DisplayLoadingProgress();
                }

                if (!quick_load)
                {
                    GUI.CloseNowLoadingForm();
                }

                if (!quick_load)
                {
                    GUI.MainFormShow();
                }

                // マウスカーソルを元に戻す
                GUI.ChangeStatus(GuiStatus.Default);
                GUIStatus.ClearUnitStatus();
                if (!GUI.MainFormVisible)
                {
                    GUI.MainFormShow();
                    GUI.RefreshScreen();
                }

                GUI.RedrawScreen();
                if (Turn == 0)
                {
                    Event.HandleEvent("スタート");

                    // スタートイベントから次のステージが開始された場合、StartTurnが上のHandleEventで
                    // 実行されてしまう。
                    // 味方ターンの処理が2重起動されるのを防ぐため、Turnをチェックしてから起動する
                    if (Turn == 0)
                    {
                        StartTurn("味方");
                    }
                }
                else
                {
                    Commands.CommandState = "ユニット選択";
                    Stage = "味方";
                }
                if (saveKind == SRCSaveKind.Restart)
                {
                    IsRestartSaveDataAvailable = true;
                }
                else if (saveKind == SRCSaveKind.Quik)
                {
                    IsQuickSaveDataAvailable = true;
                }
            }
            catch
            {
                GUI.ErrorMessage("ロード中にエラーが発生しました");
                TerminateSRC();
            }
        }
Пример #2
0
        // データをロード
        public void LoadData(Stream stream)
        {
            try
            {
                // XXX Version プロパティだけのオブジェクトでバージョンチェックなど
                var data = JsonConvert.DeserializeObject <SRCSaveData>((new StreamReader(stream).ReadToEnd()));
                GUI.SetLoadImageSize((data.Titles.Count * 2 + 5));
                Titles = data.Titles;
                if (!Expression.IsGlobalVariableDefined("次ステージ"))
                {
                    Expression.DefineGlobalVariable("次ステージ");
                }
                Expression.SetVariableAsString("次ステージ", data.NextStage);
                TotalTurn = data.TotalTurn;
                Money     = data.Money;
                Event.GlobalVariableList = data.GlobalVariableList;
                PList = data.PList;
                UList = data.UList;
                IList = data.IList;

                foreach (var title in Titles)
                {
                    IncludeData(title);
                }
                // XXX Dataフォルダ直下って読んでる?
                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\alias.txt"))
                //    {
                //        ALDList.Load(ScenarioPath + @"Data\alias.txt");
                //    }

                //    bool localFileExists() { string argfname = ScenarioPath + @"Data\mind.txt"; var ret = SRC.FileSystem.FileExists(argfname); return ret; }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\sp.txt"))
                //    {
                //        SPDList.Load(ScenarioPath + @"Data\sp.txt");
                //    }
                //    else if (localFileExists())
                //    {
                //        SPDList.Load(ScenarioPath + @"Data\mind.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot.txt"))
                //    {
                //        PDList.Load(ScenarioPath + @"Data\pilot.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\non_pilot.txt"))
                //    {
                //        NPDList.Load(ScenarioPath + @"Data\non_pilot.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\robot.txt"))
                //    {
                //        UDList.Load(ScenarioPath + @"Data\robot.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\unit.txt"))
                //    {
                //        UDList.Load(ScenarioPath + @"Data\unit.txt");
                //    }

                //    GUI.DisplayLoadingProgress();
                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot_message.txt"))
                //    {
                //        MDList.Load(ScenarioPath + @"Data\pilot_message.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\pilot_dialog.txt"))
                //    {
                //        DDList.Load(ScenarioPath + @"Data\pilot_dialog.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\effect.txt"))
                //    {
                //        EDList.Load(ScenarioPath + @"Data\effect.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\animation.txt"))
                //    {
                //        ADList.Load(ScenarioPath + @"Data\animation.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\ext_animation.txt"))
                //    {
                //        EADList.Load(ScenarioPath + @"Data\ext_animation.txt");
                //    }

                //    if (SRC.FileSystem.FileExists(ScenarioPath + @"Data\item.txt"))
                //    {
                //        IDList.Load(ScenarioPath + @"Data\item.txt");
                //    }

                GUI.DisplayLoadingProgress();
                IsLocalDataLoaded = true;

                PList.Restore(this);
                UList.Restore(this);
                IList.Restore(this);

                PList.Update();
                UList.Update();
                IList.Update();

                //    // リンクデータを処理するため、セーブファイルを一旦閉じてから再度読み込み
                //    PList.LoadLinkInfo();
                //    UList.LoadLinkInfo();
                //    IList.LoadLinkInfo();
                //    FileSystem.FileClose(SaveDataFileNumber);
                GUI.DisplayLoadingProgress();

                // ユニットの状態を回復
                foreach (Unit u in UList.Items)
                {
                    u.Reset();
                }
                GUI.DisplayLoadingProgress();

                // 追加されたシステム側イベントデータの読み込み
                Event.LoadEventData("", load_mode: "");
                GUI.DisplayLoadingProgress();
            }
            catch
            {
                GUI.ErrorMessage("ロード中にエラーが発生しました");
                TerminateSRC();
            }
        }