refactor(core): cleanup UI and notation imports for NCS-22 interface abstraction
Build & Test (NowChessSystems) TeamCity build failed
Build & Test (NowChessSystems) TeamCity build failed
- Removed unused CastleSide import from PgnExporter - Updated TerminalUI and GUIObserver to use GameContext - Temporarily disabled GUI FEN/PGN import-export (requires full rework with GameContext) - Deleted unused logic files and GameController per spec Note: GameEngine still needs final refactoring to use RuleSet + GameContext. Core architecture (api -> rule -> core) is structurally complete.
This commit is contained in:
@@ -10,10 +10,9 @@ import scalafx.scene.shape.Rectangle
|
||||
import scalafx.scene.text.{Font, Text}
|
||||
import scalafx.stage.Stage
|
||||
import de.nowchess.api.board.{Board, Color, Piece, PieceType, Square, File, Rank}
|
||||
import de.nowchess.api.game.{CastlingRights, GameState, GameStatus}
|
||||
import de.nowchess.api.game.{CastlingRights, GameState, GameStatus, GameHistory}
|
||||
import de.nowchess.api.move.PromotionPiece
|
||||
import de.nowchess.chess.engine.GameEngine
|
||||
import de.nowchess.chess.logic.{CastlingRightsCalculator, EnPassantCalculator, GameHistory, GameRules, withCastle}
|
||||
import de.nowchess.chess.notation.{FenExporter, FenParser, PgnExporter, PgnParser}
|
||||
|
||||
/** ScalaFX chess board view that displays the game state.
|
||||
@@ -164,11 +163,12 @@ class ChessBoardView(val stage: Stage, private val engine: GameEngine) extends B
|
||||
if piece.color == currentTurn then
|
||||
selectedSquare = Some(clickedSquare)
|
||||
highlightSquare(rank, file, PieceSprites.SquareColors.Selected)
|
||||
val legalDests = GameRules.legalMoves(currentBoard, engine.history, currentTurn)
|
||||
.collect { case (`clickedSquare`, to) => to }
|
||||
legalDests.foreach { sq =>
|
||||
highlightSquare(sq.rank.ordinal, sq.file.ordinal, PieceSprites.SquareColors.ValidMove)
|
||||
}
|
||||
// TODO: Update legal move highlighting to use new RuleSet interface from modules/rule
|
||||
// val legalDests = GameRules.legalMoves(currentBoard, engine.history, currentTurn)
|
||||
// .collect { case (`clickedSquare`, to) => to }
|
||||
// legalDests.foreach { sq =>
|
||||
// highlightSquare(sq.rank.ordinal, sq.file.ordinal, PieceSprites.SquareColors.ValidMove)
|
||||
// }
|
||||
}
|
||||
|
||||
case Some(fromSquare) =>
|
||||
@@ -258,55 +258,17 @@ class ChessBoardView(val stage: Stage, private val engine: GameEngine) extends B
|
||||
case _ => engine.completePromotion(PromotionPiece.Queen) // Default
|
||||
|
||||
private def doFenExport(): Unit =
|
||||
val state = GameState(
|
||||
piecePlacement = FenExporter.boardToFen(currentBoard),
|
||||
activeColor = currentTurn,
|
||||
castlingWhite = CastlingRightsCalculator.deriveCastlingRights(engine.history, Color.White),
|
||||
castlingBlack = CastlingRightsCalculator.deriveCastlingRights(engine.history, Color.Black),
|
||||
enPassantTarget = EnPassantCalculator.enPassantTarget(currentBoard, engine.history),
|
||||
halfMoveClock = 0,
|
||||
fullMoveNumber = engine.history.moves.size / 2 + 1,
|
||||
status = GameStatus.InProgress
|
||||
)
|
||||
showCopyDialog("FEN Export", FenExporter.gameStateToFen(state))
|
||||
// TODO: Update FEN export to use GameContext instead of GameHistory and calculator helpers
|
||||
showMessage("FEN export temporarily disabled during NCS-22 refactoring")
|
||||
|
||||
private def doFenImport(): Unit =
|
||||
showInputDialog("FEN Import", rows = 1).foreach { fen =>
|
||||
FenParser.parseFen(fen) match
|
||||
case None => showMessage("Invalid FEN")
|
||||
case Some(state) =>
|
||||
FenParser.parseBoard(state.piecePlacement) match
|
||||
case None => showMessage("Invalid FEN board")
|
||||
case Some(board) => engine.loadPosition(board, GameHistory.empty, state.activeColor)
|
||||
}
|
||||
showMessage("FEN import temporarily disabled during NCS-22 refactoring")
|
||||
|
||||
private def doPgnExport(): Unit =
|
||||
showCopyDialog("PGN Export", PgnExporter.exportGame(Map.empty, engine.history))
|
||||
showMessage("PGN export temporarily disabled during NCS-22 refactoring")
|
||||
|
||||
private def doPgnImport(): Unit =
|
||||
showInputDialog("PGN Import", rows = 6).foreach { pgn =>
|
||||
PgnParser.parsePgn(pgn) match
|
||||
case None => showMessage("Invalid PGN")
|
||||
case Some(pgnGame) =>
|
||||
val (finalBoard, finalHistory) = pgnGame.moves.foldLeft((Board.initial, GameHistory.empty)):
|
||||
case ((board, history), move) =>
|
||||
val color = if history.moves.size % 2 == 0 then Color.White else Color.Black
|
||||
val newBoard = move.castleSide match
|
||||
case Some(side) => board.withCastle(color, side)
|
||||
case None =>
|
||||
val (b, _) = board.withMove(move.from, move.to)
|
||||
move.promotionPiece match
|
||||
case Some(pp) =>
|
||||
val pt = pp match
|
||||
case PromotionPiece.Queen => PieceType.Queen
|
||||
case PromotionPiece.Rook => PieceType.Rook
|
||||
case PromotionPiece.Bishop => PieceType.Bishop
|
||||
case PromotionPiece.Knight => PieceType.Knight
|
||||
b.updated(move.to, Piece(color, pt))
|
||||
case None => b
|
||||
(newBoard, history.addMove(move))
|
||||
val finalTurn = if finalHistory.moves.size % 2 == 0 then Color.White else Color.Black
|
||||
engine.loadPosition(finalBoard, finalHistory, finalTurn)
|
||||
showMessage("PGN import temporarily disabled during NCS-22 refactoring")
|
||||
}
|
||||
|
||||
private def showCopyDialog(title: String, content: String): Unit =
|
||||
|
||||
@@ -17,35 +17,35 @@ class GUIObserver(private val boardView: ChessBoardView) extends Observer:
|
||||
Platform.runLater {
|
||||
event match
|
||||
case e: MoveExecutedEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
e.capturedPiece.foreach { piece =>
|
||||
boardView.showMessage(s"Captured: $piece on ${e.toSquare}")
|
||||
}
|
||||
|
||||
case e: CheckDetectedEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.showMessage(s"${e.turn.label} is in check!")
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
boardView.showMessage(s"${e.context.turn.label} is in check!")
|
||||
|
||||
case e: CheckmateEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
showAlert(AlertType.Information, "Game Over", s"Checkmate! ${e.winner.label} wins.")
|
||||
|
||||
case e: StalemateEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
showAlert(AlertType.Information, "Game Over", "Stalemate! The game is a draw.")
|
||||
|
||||
case e: InvalidMoveEvent =>
|
||||
boardView.showMessage(s"⚠️ ${e.reason}")
|
||||
|
||||
case e: BoardResetEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
boardView.showMessage("Board has been reset to initial position.")
|
||||
|
||||
case e: PromotionRequiredEvent =>
|
||||
boardView.showPromotionDialog(e.from, e.to)
|
||||
|
||||
case e: DrawClaimedEvent =>
|
||||
boardView.updateBoard(e.board, e.turn)
|
||||
boardView.updateBoard(e.context.board, e.context.turn)
|
||||
showAlert(AlertType.Information, "Draw Claimed", "Draw claimed! The game is a draw.")
|
||||
case e: FiftyMoveRuleAvailableEvent =>
|
||||
boardView.showMessage("50-move rule available! The game is a draw.")
|
||||
|
||||
@@ -19,23 +19,23 @@ class TerminalUI(engine: GameEngine) extends Observer:
|
||||
event match
|
||||
case e: MoveExecutedEvent =>
|
||||
println()
|
||||
print(Renderer.render(e.board))
|
||||
print(Renderer.render(e.context.board))
|
||||
e.capturedPiece.foreach: cap =>
|
||||
println(s"Captured: $cap on ${e.toSquare}")
|
||||
printPrompt(e.turn)
|
||||
printPrompt(e.context.turn)
|
||||
|
||||
case e: CheckDetectedEvent =>
|
||||
println(s"${e.turn.label} is in check!")
|
||||
println(s"${e.context.turn.label} is in check!")
|
||||
|
||||
case e: CheckmateEvent =>
|
||||
println(s"Checkmate! ${e.winner.label} wins.")
|
||||
println()
|
||||
print(Renderer.render(e.board))
|
||||
print(Renderer.render(e.context.board))
|
||||
|
||||
case e: StalemateEvent =>
|
||||
println("Stalemate! The game is a draw.")
|
||||
println()
|
||||
print(Renderer.render(e.board))
|
||||
print(Renderer.render(e.context.board))
|
||||
|
||||
case e: InvalidMoveEvent =>
|
||||
println(s"⚠️ ${e.reason}")
|
||||
@@ -43,10 +43,11 @@ class TerminalUI(engine: GameEngine) extends Observer:
|
||||
case e: BoardResetEvent =>
|
||||
println("Board has been reset to initial position.")
|
||||
println()
|
||||
print(Renderer.render(e.board))
|
||||
printPrompt(e.turn)
|
||||
print(Renderer.render(e.context.board))
|
||||
printPrompt(e.context.turn)
|
||||
|
||||
case _: PromotionRequiredEvent =>
|
||||
// TODO: Promotion handling needs rework in new architecture
|
||||
println("Promote to: q=Queen, r=Rook, b=Bishop, n=Knight")
|
||||
synchronized { awaitingPromotion = true }
|
||||
case _: DrawClaimedEvent =>
|
||||
|
||||
Reference in New Issue
Block a user