/// <summary> /// [巻戻し]ボタン /// </summary> public static bool Makimodosi_Srv( out Finger movedKoma, out Finger foodKoma, out string fugoJStr, IRoomViewModel roomViewModel ) { bool successful = false; //------------------------------ // 棋譜から1手削ります //------------------------------ Node <ShootingStarlightable, KyokumenWrapper> removeeLeaf = roomViewModel.GameViewModel.Kifu.CurNode; if (removeeLeaf.PreviousNode == null) { // ルート fugoJStr = "×"; movedKoma = Fingers.Error_1; foodKoma = Fingers.Error_1; goto gt_EndMethod; } //------------------------------ // 符号 //------------------------------ // // 移動前と、移動後では、駒が変わっていることがあります。 // 例えば、「▲2二角成」なら 移動前は角、移動後は馬です。 // // そこで[巻戻し]ボタンでは、移動前の駒に従って、「進んできた動きとは逆の動き」を行います。 RO_Star_Koma koma = Util_Koma.AsKoma(removeeLeaf.Key.LongTimeAgo); fugoJStr = JFugoCreator15Array.ItemMethods[ (int)Haiyaku184Array.Syurui(koma.Haiyaku) ]( removeeLeaf.Key, new KyokumenWrapper(roomViewModel.GameViewModel.GuiSkyConst) ).ToText_UseDou(removeeLeaf); //MessageBox.Show("[巻戻し]符号=" + fugoJStr, "デバッグ"); //------------------------------ // 前の手に戻します //------------------------------ //Finger movedKoma; //Finger foodKoma = Fingers.Error_1;//取られた駒 foodKoma = Fingers.Error_1;//取られた駒 bool isMakimodosi = true; Node <ShootingStarlightable, KyokumenWrapper> out_newNode_OrNull; KifuIO.Ittesasi( removeeLeaf.Key, roomViewModel.GameViewModel.Kifu, isMakimodosi, out movedKoma, out foodKoma, out out_newNode_OrNull ); successful = true; gt_EndMethod: return(successful); }
/// <summary> /// 駒を動かします(1)。マウスボタンが押下されたとき。 /// /// 成る、成らない関連。 /// /// </summary> public static void Komamove1a_50Srv( out bool torareruKomaAri, out RO_Star_Koma koma_Food_after, Starlight dst, Finger btnTumandeiruKoma_Koma, RO_Star_Koma koma1, IRoomViewModel roomViewModel ) { Finger btnKoma_Food_Koma; torareruKomaAri = false; // 取られることになる駒のボタン btnKoma_Food_Koma = Util_Sky.Fingers_AtMasuNow(roomViewModel.GameViewModel.GuiSkyConst, koma1.Masu).ToFirst(); if (Fingers.Error_1 == btnKoma_Food_Koma) { koma_Food_after = null; btnKoma_Food_Koma = Fingers.Error_1; goto gt_EndBlock1; } //>>>>> 取る駒があったとき torareruKomaAri = true; PieceType koma_Food_pre_Syurui = Util_Koma.AsKoma(roomViewModel.GameViewModel.GuiSkyConst.StarlightIndexOf(btnKoma_Food_Koma).Now).Syurui; // その駒は、駒置き場に移動させます。 SyElement akiMasu; switch (koma1.Pside) { case Playerside.P2: akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, roomViewModel.GameViewModel.GuiSkyConst); if (Masu_Honshogi.Error != akiMasu) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P2, akiMasu, //駒台へ KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P2, Util_Masu.OkibaSujiDanToMasu( Okiba.Gote_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; case Playerside.P1: //thru default: akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, roomViewModel.GameViewModel.GuiSkyConst); if (Masu_Honshogi.Error != akiMasu) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P1, akiMasu, //駒台へ KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star_Koma( Playerside.P1, Util_Masu.OkibaSujiDanToMasu( Okiba.Sente_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), KomaSyurui14Array.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; } gt_EndBlock1: if (torareruKomaAri) { { SkyBuffer buffer_Sky1; // 取られる動き buffer_Sky1 = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky1.AddOverwriteStarlight( btnKoma_Food_Koma, new RO_MotionlessStarlight( //btnKoma_Food_Koma, koma_Food_after ) ); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky1)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ } //------------------------------ // 成りは解除。 //------------------------------ switch (Util_Masu.GetOkiba(koma_Food_after.Masu)) { case Okiba.Sente_Komadai: //thru case Okiba.Gote_Komadai: // 駒台へ移動しました //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SkyBuffer buffer_Sky2 = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky2.AddOverwriteStarlight( btnKoma_Food_Koma, new RO_MotionlessStarlight( //btnKoma_Food_Koma, koma_Food_after ) ); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky2)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ break; } } SkyBuffer buffer_Sky = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); buffer_Sky.AddOverwriteStarlight(btnTumandeiruKoma_Koma, dst); roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky)); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ }
/// <summary> /// /// </summary> /// <param name="kifu"></param> /// <param name="restText"></param> /// <param name="startposImporter"></param> /// <param name="logTag"></param> public static void OnChangeSky_Im_Srv( IRoomViewModel roomViewModel, StartposImporter startposImporter, KifuParserA_Genjo genjo ) { // SFENの初期配置の書き方(*1)を元に、駒を並べます。 // // *1…「position startpos moves 7g7f 3c3d 2g2f」といった書き方。 // //------------------------------ // 駒の配置 //------------------------------ { // 先後 Playerside nextTebanside; if (startposImporter.RO_SfenStartpos.PsideIsBlack) { // 黒は先手。 nextTebanside = Converter04.AlternatePside(Playerside.P1);//FIXME:逆か? } else { // 白は後手。 nextTebanside = Converter04.AlternatePside(Playerside.P2);//FIXME:逆か? } ShootingStarlightable move = Util_Sky.NullObjectMove;//ルートなので SkyConst src_Sky_New = startposImporter.ToSky(); Node <ShootingStarlightable, KyokumenWrapper> newNode = new KifuNodeImpl( move, new KyokumenWrapper(new SkyConst(src_Sky_New)), nextTebanside ); Util_InServer.SetCurNode_Srv(roomViewModel, newNode);// GUIに通知するだけ。 } //------------------------------ // 先後 //------------------------------ if (startposImporter.RO_SfenStartpos.PsideIsBlack) { // 黒は先手。 roomViewModel.GameViewModel.Kifu.SetProperty(KifuTreeImpl.PropName_FirstPside, Converter04.AlternatePside(Playerside.P1));//FIXME:逆か? } else { // 白は後手。 roomViewModel.GameViewModel.Kifu.SetProperty(KifuTreeImpl.PropName_FirstPside, Converter04.AlternatePside(Playerside.P2));//FIXME:逆か? } // 駒袋に表示されている駒を、駒台に表示させます。 { // 駒袋に表示されている駒を、駒台へ表示されるように移します。 List <PieceType> syuruiList = new List <PieceType>(); List <int> countList = new List <int>(); List <Playerside> psideList = new List <Playerside>(); //------------------------------------------------------------------------------------------------------------------------ // 移動計画作成 //------------------------------------------------------------------------------------------------------------------------ //------------------------------ // ▲王 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1K) { syuruiList.Add(PieceType.K); countList.Add(startposImporter.RO_SfenStartpos.Moti1K); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mK=" + ro_SfenStartpos.Moti1K); } //------------------------------ // ▲飛 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1R) { syuruiList.Add(PieceType.R); countList.Add(startposImporter.RO_SfenStartpos.Moti1R); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mR=" + ro_SfenStartpos.Moti1R); } //------------------------------ // ▲角 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1B) { syuruiList.Add(PieceType.B); countList.Add(startposImporter.RO_SfenStartpos.Moti1B); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mB=" + ro_SfenStartpos.Moti1B); } //------------------------------ // ▲金 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1G) { syuruiList.Add(PieceType.G); countList.Add(startposImporter.RO_SfenStartpos.Moti1G); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mG=" + ro_SfenStartpos.Moti1G); } //------------------------------ // ▲銀 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1S) { syuruiList.Add(PieceType.S); countList.Add(startposImporter.RO_SfenStartpos.Moti1S); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mS=" + ro_SfenStartpos.Moti1S); } //------------------------------ // ▲桂 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1N) { syuruiList.Add(PieceType.N); countList.Add(startposImporter.RO_SfenStartpos.Moti1N); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mN=" + ro_SfenStartpos.Moti1N); } //------------------------------ // ▲香 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1L) { syuruiList.Add(PieceType.L); countList.Add(startposImporter.RO_SfenStartpos.Moti1L); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mL=" + ro_SfenStartpos.Moti1L); } //------------------------------ // ▲歩 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1P) { syuruiList.Add(PieceType.P); countList.Add(startposImporter.RO_SfenStartpos.Moti1P); psideList.Add(Playerside.P1); //System.C onsole.WriteLine("mP=" + ro_SfenStartpos.Moti1P); } //------------------------------ // △王 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2k) { syuruiList.Add(PieceType.K); countList.Add(startposImporter.RO_SfenStartpos.Moti2k); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mk=" + ro_SfenStartpos.Moti2k); } //------------------------------ // △飛 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2r) { syuruiList.Add(PieceType.R); countList.Add(startposImporter.RO_SfenStartpos.Moti2r); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mr=" + ro_SfenStartpos.Moti2r); } //------------------------------ // △角 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2b) { syuruiList.Add(PieceType.B); countList.Add(startposImporter.RO_SfenStartpos.Moti2b); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mb=" + ro_SfenStartpos.Moti2b); } //------------------------------ // △金 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2g) { syuruiList.Add(PieceType.G); countList.Add(startposImporter.RO_SfenStartpos.Moti2g); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mg=" + ro_SfenStartpos.Moti2g); } //------------------------------ // △銀 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2s) { syuruiList.Add(PieceType.S); countList.Add(startposImporter.RO_SfenStartpos.Moti2s); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("ms=" + ro_SfenStartpos.Moti2s); } //------------------------------ // △桂 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2n) { syuruiList.Add(PieceType.N); countList.Add(startposImporter.RO_SfenStartpos.Moti2n); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mn=" + ro_SfenStartpos.Moti2n); } //------------------------------ // △香 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2l) { syuruiList.Add(PieceType.L); countList.Add(startposImporter.RO_SfenStartpos.Moti2l); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("ml=" + ro_SfenStartpos.Moti2l); } //------------------------------ // △歩 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2p) { syuruiList.Add(PieceType.P); countList.Add(startposImporter.RO_SfenStartpos.Moti2p); psideList.Add(Playerside.P2); //System.C onsole.WriteLine("mp=" + ro_SfenStartpos.Moti2p); } //------------------------------------------------------------------------------------------------------------------------ // 移動 //------------------------------------------------------------------------------------------------------------------------ for (int i = 0; i < syuruiList.Count; i++) { Playerside itaruPside; //(至)先後 Okiba itaruOkiba; //(至)置き場 if (Playerside.P2 == psideList[i]) { // 宛:後手駒台 itaruPside = Playerside.P2; itaruOkiba = Okiba.Gote_Komadai; } else { // 宛:先手駒台 itaruPside = Playerside.P1; itaruOkiba = Okiba.Sente_Komadai; } //------------------------------ // 駒を、駒袋から駒台に移動させます。 //------------------------------ { SkyBuffer buffer_Sky = new SkyBuffer(roomViewModel.GameViewModel.GuiSkyConst); Fingers komas = Util_Sky.Fingers_ByOkibaSyuruiNow(new SkyConst(buffer_Sky), Okiba.KomaBukuro, syuruiList[i]); int moved = 1; foreach (Finger koma in komas.Items) { // 駒台の空いている枡 SyElement akiMasu = KifuIO.GetKomadaiKomabukuroSpace(itaruOkiba, new SkyConst(buffer_Sky)); buffer_Sky.AddOverwriteStarlight(koma, new RO_MotionlessStarlight( //koma, new RO_Star_Koma( itaruPside, akiMasu, syuruiList[i] ))); if (countList[i] <= moved) { break; } moved++; } roomViewModel.GameViewModel.SetGuiSky(new SkyConst(buffer_Sky)); } } } }