/// <summary> /// 棋譜(string型)の読み込みコマンド /// ファイルから読み込むには、MainMenu.ReadKifuFile()のようなメソッドを用いること。 /// </summary> /// <param name="kifuText"></param> public void KifuReadCommand(string kifuText) { AddCommand( () => { if (GameMode.CanUserMove()) { // 対局中ではないので、EnableKifuList == falseになっているが、 // 一時的にこれをtrueにしないと、読み込んだ棋譜に対して、Tree.KifuListが同期しない。 // ゆえに、読み込みの瞬間だけtrueにして、そのあとfalseに戻す。 kifuManager.EnableKifuList = true; var error = kifuManager.FromString(kifuText); kifuManager.EnableKifuList = false; if (error != null) { TheApp.app.MessageShow("棋譜の読み込みに失敗しました。\n" + error, MessageShowType.Error); kifuManager.Init(); // 不正な局面のままになるとまずいので初期化。 } else { // 読み込みが完了すれば自動的に末尾の局面に行っているはずだが、 // 棋譜ウィンドウを更新した結果、分岐局面などに戻ってしまうといけない。 // 棋譜に書かれていた持ち時間設定・残り時間を画面に反映させる。(GameSettingには反映させない) PlayTimers.SetKifuTimeSettings(kifuManager.Tree.KifuTimeSettings); PlayTimers.SetKifuMoveTimes(kifuManager.Tree.GetKifuMoveTimes()); UpdateTimeString(); // 末尾の局面に移動するコマンドを叩いておく。 UpdateKifuSelectedIndex(int.MaxValue); // -- 棋譜上の名前を表示名に反映させる。 foreach (var c in All.Colors()) { var name = kifuManager.KifuHeader.GetPlayerName(c); SetPlayerName(c, name); } } // 棋譜が綺麗になった扱いにする。(この棋譜はファイルなどに丸ごと保存されているはずであるから) KifuDirty = false; // 駒を持ち上げていたりしたらそれをリセットする必要があるので。 RaisePropertyChanged("TurnChanged"); } }); }
/// <summary> /// 棋譜の読み込みコマンド /// </summary> /// <param name="kifuText"></param> public void KifuReadCommand(string kifuText) { AddCommand( () => { if (GameMode.CanUserMove()) { // 対局中ではないので、EnableKifuList == falseになっているが、 // 一時的にこれをtrueにしないと、読み込んだ棋譜に対して、Tree.KifuListが同期しない。 // ゆえに、読み込みの瞬間だけtrueにして、そのあとfalseに戻す。 kifuManager.EnableKifuList = true; var error = kifuManager.FromString(kifuText); kifuManager.EnableKifuList = false; if (error != null) { TheApp.app.MessageShow("棋譜の読み込みに失敗しました。\n" + error, "読み込みエラー"); kifuManager.Init(); // 不正な局面のままになるとまずいので初期化。 } else { // 読み込みが完了すれば自動的に末尾の局面に行っているはずだが、 // 棋譜ウィンドウを更新した結果、分岐局面などに戻ってしまうといけない。 // 棋譜に書かれていた持ち時間設定・残り時間を画面に反映させる。(GameSettingには反映させない) PlayTimers.SetKifuTimeSettings(kifuManager.Tree.KifuTimeSettings); PlayTimers.SetKifuMoveTimes(kifuManager.Tree.GetKifuMoveTimes()); UpdateTimeString(); // 末尾の局面に移動するコマンドを叩いておく。 RaisePropertyChanged("SetKifuListIndex", kifuManager.KifuList.Count - 1); } } }); }
/// <summary> /// 棋譜(string型)の読み込みコマンド /// ファイルから読み込むには、MainMenu.ReadKifuFile()のようなメソッドを用いること。 /// /// merge == trueなら、棋譜を分岐棋譜としてマージする。 /// dirtyは、このあと、KifuDirty(棋譜が汚れているかのフラグ)に設定される値。 /// </summary> /// <param name="kifuText"></param> public void KifuReadCommand(string kifuText, bool merge = false, bool dirty = false) { AddCommand( () => { if (GameMode.CanUserMove()) { // 対局中ではないので、EnableKifuList == falseになっているが、 // 一時的にこれをtrueにしないと、読み込んだ棋譜に対して、Tree.KifuListが同期しない。 // ゆえに、読み込みの瞬間だけtrueにして、そのあとfalseに戻す。 kifuManager.EnableKifuList = true; var oldSelectedIndex = kifuManager.Tree.pliesFromRoot; var error = merge ? kifuManager.MergeFromString(kifuText) : kifuManager.FromString(kifuText); // マージした場合、その棋譜の末尾に行って欲しい気もするが…。 kifuManager.EnableKifuList = false; if (error != null) { TheApp.app.MessageShow((merge ? "棋譜のマージに失敗しました。\n" : "棋譜の読み込みに失敗しました。\n") + error, MessageShowType.Error); kifuManager.Init(); // 不正な局面のままになるとまずいので初期化。 } else { // 読み込みが完了すれば自動的に末尾の局面に行っているはずだが、 // 棋譜ウィンドウを更新した結果、分岐局面などに戻ってしまうといけない。 // 棋譜に書かれていた持ち時間設定・残り時間を画面に反映させる。(GameSettingには反映させない) PlayTimers.SetKifuTimeSettings(kifuManager.Tree.KifuTimeSettings); PlayTimers.SetKifuMoveTimes(kifuManager.Tree.GetKifuMoveTimes()); UpdateTimeString(); // 末尾の局面に移動するコマンドを叩いておく。 // マージ時は、マージ起点に移動してやる。たぶん現在の選択していた行がそれ。 if (!merge) { UpdateKifuSelectedIndex(int.MaxValue); } else { UpdateKifuSelectedIndex(oldSelectedIndex + 1); } // -- 棋譜上の名前を表示名に反映させる。 foreach (var c in All.Colors()) { var name = kifuManager.KifuHeader.GetPlayerName(c); SetPlayerName(c, name); } } // 棋譜が綺麗になった扱いにする。(この棋譜はファイルなどに丸ごと保存されているはずであるから) // ただし、mergeのときは汚れたという扱いにする。(ファイルに残っていないので) KifuDirty = dirty; // 駒を持ち上げていたりしたらそれをリセットする必要があるので。 RaisePropertyChanged("TurnChanged"); } }); }