/// <summary> /// Convierte un movimiento de pieza /// </summary> private MovementFigureModel ConvertPieceMovement(PieceMovementModel movement) { MovementFigureModel movementFigure = new MovementFigureModel(ConvertTurn(movement.Turn), movement.Content); // Convierte los datos básicos ConvertMovementBase(movement, movementFigure); // Añade las variaciones (antes de mover real) foreach (VariationModel variation in movement.Variations) { movementFigure.Variations.Add(ConvertVariation(variation, movementFigure)); } // Convierte el color de la figura if (movement.Turn.Type == TurnModel.TurnType.White) { movementFigure.Color = PieceBaseModel.PieceColor.White; } else { movementFigure.Color = PieceBaseModel.PieceColor.Black; } // Convierte los datos de la notación SAN ConvertSan(movementFigure, movement.Content); // Devuelve el movimiento return(movementFigure); }
/// <summary> /// Lee los movimientos /// </summary> private SentenceBaseModel ReadMovements(IEnumerator <SentenceBaseModel> sentenceEnumerator, SentenceBaseModel previousSentence, List <BaseMovementModel> movements) { SentenceBaseModel sentence = previousSentence; BaseMovementModel lastMovement = null; TurnModel lastTurn = null; // Añade los movimientos do { // Trata la sentencia switch (sentence) { case SentenceTurnNumberModel sentenceTurn: lastMovement = null; lastTurn = new TurnModel(sentenceTurn.Content, TurnModel.TurnType.White); break; case SentenceTurnPlayModel sentencePlay: if (lastTurn == null) { sentence = new SentenceErrorModel($"There is not turn to add the play {sentencePlay.Content}"); } else { // Crea el movimiento lastMovement = new PieceMovementModel(lastTurn, sentencePlay.Content); // Añade el movimiento movements.Add(lastMovement); } break; case SentenceTurnResultModel sentenceResult: if (lastTurn == null) { sentence = new SentenceErrorModel($"There is not turn to add the result {sentenceResult.Content}"); } else { // Crea el movimiento lastMovement = new ResultMovementModel(lastTurn, sentence.Content); // Añade el movimiento movements.Add(lastMovement); } break; case SentenceTurnInformationModel sentenceInformation: if (lastMovement == null) { sentence = new SentenceErrorModel($"There is not movement to add the information {sentenceInformation.Content}"); } else { lastMovement.Info.Add(new InfoMovementModel(sentence.Content)); } break; case SentenceCommentModel sentenceComment: if (lastMovement == null) { sentence = new SentenceErrorModel($"There is not sentence to add the comment {sentenceComment.Content}"); } else { lastMovement.Comments.Add(sentenceComment.Content); } break; case SentenceTurnStartVariationModel sentenceVariation: if (lastMovement == null) { sentence = new SentenceErrorModel("There is not sentence to add a variation"); } else { VariationModel variation = new VariationModel(lastMovement); // Limpia esta sentencia del enumerado sentence = GetNextSentence(sentenceEnumerator); // Añade los comentarios y la información a la variación while (sentence is SentenceTurnInformationModel || sentence is SentenceCommentModel) { // Añade la información de la sentencia switch (sentence) { case SentenceTurnInformationModel sentenceInfo: variation.Info.Add(new InfoMovementModel(sentenceInfo.Content)); break; case SentenceCommentModel sentenceComment: variation.Comments.Add(sentenceComment.Content); break; } // Pasa a la siguiente sentencia sentence = GetNextSentence(sentenceEnumerator); } // Lee los movimientos de la variación sentence = ReadMovements(sentenceEnumerator, sentence, variation.Movements); // Añade la variación a la colección if (variation.Movements.Count > 0) { lastMovement.Variations.Add(variation); } // Pasa a la siguiente sentencia if (!(sentence is SentenceTurnEndVariationModel)) { sentence = new SentenceErrorModel("Can't find the end variation sentence"); } } break; } // Pasa a la siguiente sentencia if (!(sentence is SentenceErrorModel)) { sentence = GetNextSentence(sentenceEnumerator); } }while (!(sentence is SentenceEndModel) && !(sentence is SentenceErrorModel) && !(sentence is SentenceTagModel) && !(sentence is SentenceTurnEndVariationModel)); // Devuelve la última sentencia leída return(sentence); }