/// <summary> /// 棋譜ツリーのカレントを変更します。 /// </summary> /// <param name="isMakimodosi"></param> /// <param name="ittemodosuReference"></param> /// <param name="logTag"></param> public static void Before2( ref IttemodosuResult ittemodosuReference ) { Node <IMove, KyokumenWrapper> editNodeRef = ittemodosuReference.SyuryoNode_OrNull; IMove nextMove = editNodeRef.Key; if (ittemodosuReference.FoodKomaSyurui != PieceType.None) { // 元のキーの、取った駒の種類だけを差替えます。 nextMove = Util_Sky258A.BuildMove(editNodeRef.Key.LongTimeAgo, editNodeRef.Key.Now, ittemodosuReference.FoodKomaSyurui); // 現手番 Playerside genTebanside = ((KifuNode)editNodeRef).Value.KyokumenConst.KaisiPside; // キーを差替えたノード editNodeRef = new KifuNodeImpl(nextMove, new KyokumenWrapper(ittemodosuReference.Susunda_Sky_orNull));//, genTebanside } string nextMoveStr = ConvMoveStrSfen.ToMoveStrSfen(nextMove); ittemodosuReference.SyuryoNode_OrNull = editNodeRef;// この変数を返すのがポイント。棋譜とは別に、現局面。 //Util_IttesasuRoutine.iIttemodosuAfter3_ChangeCurrent(kifu_mutable); }
/// <summary> /// 一手戻します。 /// </summary> /// <param name="ittemodosuArg"></param> /// <param name="ittesasu_mutable"></param> /// <param name="ittemodosuResult"></param> /// <param name="logTag"></param> /// <param name="memberName"></param> /// <param name="sourceFilePath"></param> /// <param name="sourceLineNumber"></param> public static void Before1( IttemodosuArg ittemodosuArg, out IttemodosuResult ittemodosuResult , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { bool isMakimodosi = true; ittemodosuResult = new IttemodosuResultImpl(Fingers.Error_1, Fingers.Error_1, null, PieceType.None, null); // // 一手指し開始局面(不変) // 一手指し終了局面(null or 可変) // Playerside kaisi_tebanside = ((KifuNode)ittemodosuArg.KaisiNode).Value.KyokumenConst.KaisiPside; SkyConst kaisi_Sky = ittemodosuArg.KaisiNode.Value.KyokumenConst; // // 編集対象ノード(巻き戻し時と、進む時で異なる) // Node <IMove, KyokumenWrapper> editNodeRef; //------------------------------ // 符号の追加(一手進む) //------------------------------ { // 戻る時。 ittemodosuResult.Susunda_Sky_orNull = null; editNodeRef = ittemodosuArg.KaisiNode; } // // 動かす駒を移動先へ。 // Finger figMovedKoma; Util_IttemodosuRoutine.Do25_UgokasuKoma_IdoSakiHe( out figMovedKoma, ittemodosuArg.Move, kaisi_tebanside, kaisi_Sky ); ittemodosuResult.FigMovedKoma = figMovedKoma; //動かした駒更新 if (Fingers.Error_1 == ittemodosuResult.FigMovedKoma) { goto gt_EndMethod; } // // 巻き戻しなら、非成りに戻します。 // PieceType syurui2 = Util_IttemodosuRoutine.Do30_MakimodosiNara_HinariNiModosu(ittemodosuArg.Move, isMakimodosi); IMoveHalf dst; { dst = Util_IttemodosuRoutine.Do37_KomaOnDestinationMasu(syurui2, ittemodosuArg.Move, kaisi_Sky); } // Sky 局面データは、この関数の途中で何回か変更されます。ローカル変数に退避しておくと、同期が取れなくなります。 //------------------------------------------------------------ // あれば、取られていた駒を取得 //------------------------------------------------------------ Finger figFoodKoma;//取られていた駒 Util_IttemodosuRoutine.Do62_TorareteitaKoma_ifExists( ittemodosuArg.Move, kaisi_Sky, //巻き戻しのとき ittemodosuResult.Susunda_Sky_orNull, out figFoodKoma //変更される場合あり。 ); ittemodosuResult.FigFoodKoma = figFoodKoma; //取られていた駒更新 //------------------------------------------------------------ // 駒の移動 //------------------------------------------------------------ if (Fingers.Error_1 != figFoodKoma) { //------------------------------------------------------------ // 指されていた駒と、取られていた駒の移動 //------------------------------------------------------------ //------------------------------ // 指し手の、取った駒部分を差替えます。 //------------------------------ RO_Star koma = Util_Starlightable.AsKoma(ittemodosuArg.Move.Now); kaisi_Sky = SkyConst.NewInstance_OverwriteOrAdd_Light( kaisi_Sky, ittemodosuArg.KorekaranoTemezumi_orMinus1, // // 指されていた駒 // figMovedKoma, dst, // // 取られていた駒 // figFoodKoma, new RO_Starlight( new RO_Star( Conv_Playerside.Reverse(koma.Pside), //先後を逆にして駒台に置きます。 koma.Masu, // マス (PieceType)ittemodosuArg.Move.FoodKomaSyurui ) )); } else { //------------------------------------------------------------ // 指されていた駒の移動 //------------------------------------------------------------ kaisi_Sky = SkyConst.NewInstance_OverwriteOrAdd_Light( kaisi_Sky, ittemodosuArg.KorekaranoTemezumi_orMinus1, // // 指されていた駒 // figMovedKoma, dst ); } editNodeRef.Value.SetKyokumen(kaisi_Sky); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // この時点で、必ず現局面データに差替えあり // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ノード ittemodosuResult.SyuryoNode_OrNull = editNodeRef;// この変数を返すのがポイント。棋譜とは別に、現局面。 gt_EndMethod: ; }