void PuzzleFinished(SubmittedMoveResponse response, bool correct) { CurrentPuzzleEndedUtc = DateTime.UtcNow; response.Correct = correct ? 1 : -1; response.ExplanationSafe = Current.ExplanationSafe; PastPuzzleIds.Add(Current.ID); if (!correct) { Moves.RemoveAt(Moves.Count - 1); FENs.RemoveAt(FENs.Count - 1); Checks.RemoveAt(Checks.Count - 1); response.FEN = FENs[FENs.Count - 1]; ChessGame correctGame = gameConstructor.Construct(Current.Variant, response.FEN); foreach (string move in PossibleVariations.First()) { string[] p = move.Split('-', '='); correctGame.ApplyMove(new Move(p[0], p[1], correctGame.WhoseTurn, p.Length == 2 ? null : new char?(p[2][0])), true); FENs.Add(correctGame.GetFen()); Checks.Add(correctGame.IsInCheck(correctGame.WhoseTurn) ? correctGame.WhoseTurn.ToString().ToLowerInvariant() : null); Moves.Add(move); } } response.ReplayFENs = FENs; response.ReplayChecks = Checks; response.ReplayMoves = Moves; }
void PuzzleFinished(SubmittedMoveResponse response, bool correct) { CurrentPuzzleEndedUtc = DateTime.UtcNow; response.Correct = correct ? 1 : -1; response.ExplanationSafe = Current.ExplanationSafe; if (!PastPuzzleIds.Contains(Current.ID)) { PastPuzzleIds.Add(Current.ID); } string analysisUrl = "https://lichess.org/analysis/{0}/{1}"; string analysisUrlVariant; switch (Current.Variant) { case "Atomic": analysisUrlVariant = "atomic"; break; case "Antichess": analysisUrlVariant = "antichess"; break; case "Crazyhouse": analysisUrlVariant = "crazyhouse"; break; case "Horde": analysisUrlVariant = "horde"; break; case "KingOfTheHill": analysisUrlVariant = "kingOfTheHill"; break; case "ThreeCheck": analysisUrlVariant = "threeCheck"; break; case "RacingKings": analysisUrlVariant = "racingKings"; break; default: analysisUrlVariant = "unknown"; break; } response.AnalysisUrl = string.Format(analysisUrl, analysisUrlVariant, Current.InitialFen.Replace(' ', '_')); List <string> replayFens = new List <string>(FENs); List <string> replayChecks = new List <string>(Checks); List <string> replayMoves = new List <string>(Moves); List <Dictionary <string, int> > replayPockets = new List <Dictionary <string, int> >(Pockets); if (!correct) { Moves.RemoveAt(Moves.Count - 1); FENs.RemoveAt(FENs.Count - 1); Checks.RemoveAt(Checks.Count - 1); Pockets.RemoveAt(Pockets.Count - 1); replayFens.RemoveAt(replayFens.Count - 1); replayMoves.RemoveAt(replayMoves.Count - 1); replayChecks.RemoveAt(replayChecks.Count - 1); replayPockets.RemoveAt(replayPockets.Count - 1); response.FEN = FENs[FENs.Count - 1]; response.Pocket = Pockets[Pockets.Count - 1]; ChessGame correctGame = gameConstructor.Construct(Current.Variant, Current.InitialFen); int i = 0; var full = replayMoves.Concat(PossibleVariations.First()); foreach (string move in full) { if (move == null) { i++; continue; } if (!move.Contains("@")) { string[] p = move.Split('-', '='); correctGame.MakeMove(new Move(p[0], p[1], correctGame.WhoseTurn, p.Length == 2 ? null : new char?(p[2][0])), true); } else { string[] p = move.Split('@'); if (string.IsNullOrEmpty(p[0])) { p[0] = "P"; } Drop drop = new Drop(correctGame.MapPgnCharToPiece(p[0][0], correctGame.WhoseTurn), new Position(p[1]), correctGame.WhoseTurn); (correctGame as CrazyhouseChessGame).ApplyDrop(drop, true); } if (i >= Moves.Count) { replayFens.Add(correctGame.GetFen()); replayChecks.Add(correctGame.IsInCheck(correctGame.WhoseTurn) ? correctGame.WhoseTurn.ToString().ToLowerInvariant() : null); replayMoves.Add(move); replayPockets.Add(correctGame.GenerateJsonPocket()); } i++; } Current.Game = gameConstructor.Construct(Current.Variant, response.FEN); response.Moves = Current.Game.GetValidMoves(Current.Game.WhoseTurn); response.Check = Current.Game.IsInCheck(Player.White) ? "white" : (Current.Game.IsInCheck(Player.Black) ? "black" : null); } response.ReplayFENs = replayFens; response.ReplayChecks = replayChecks; response.ReplayMoves = replayMoves; response.ReplayPockets = replayPockets; }