• feat: NCS-11 50-move rule (#9)

    NowChess released this 2026-04-01 10:36:24 +02:00 | 319 commits to main since this release

    Summary

    • Implements the FIDE 50-move draw rule: a player may claim a draw if no pawn move or capture has occurred in the last
      50 full moves (100 half-moves)
    • Draw is not automatic — the eligible player must claim it via a TUI menu shown at the start of their turn
    • halfMoveClock: Int is threaded through processMove and gameLoop; resets on pawn move, capture, or en passant;
      increments on all other moves

    Changes

    • GameController.scala: extended MoveResult.Moved and MoveResult.MovedInCheck with newHalfMoveClock: Int; added
      MoveResult.DrawClaimed; added halfMoveClock parameter to processMove and gameLoop; TUI menu shown when clock ≥ 100
    • Main.scala: initial gameLoop call passes halfMoveClock = 0
    • GameControllerTest.scala: updated all existing pattern matches; added 10 new tests covering clock reset, clock
      increment, draw claim, and TUI menu behaviour

    Test plan

    • processMove: 'draw' with halfMoveClock = 100 → DrawClaimed
    • processMove: 'draw' with halfMoveClock = 99 → InvalidFormat
    • Pawn move / capture / en passant → clock resets to 0
    • Quiet piece move → clock increments by 1
    • MovedInCheck carries updated clock
    • TUI menu appears when clock ≥ 100; option 1 claims draw, option 2 continues
    • No TUI menu when clock < 100
    • All 197 tests passing

    Co-authored-by: LQ63 lkhermann@web.de
    Reviewed-on: #9
    Co-authored-by: Leon Hermann lq@blackhole.local
    Co-committed-by: Leon Hermann lq@blackhole.local

    Downloads