Added AttachGameMetadata to GameRules interface
Implemented metadata setup for Battleship (phase + readiness flags)
Implemented no-op metadata hook for TicTacToe
Moved generic phase/ready metadata out of MatchInit
Added game/mode metadata to match state
Fixed json:"metadata" tag in MatchState
### Core Engine
- Updated `GameRules.ApplyMove` to return `(changed, gameOver, winnerIdx, keepTurn)`
- Added keepTurn handling in `MatchLoop` to support Battleship mode B (classic rules)
- Removed old single-board handling from MatchState and MatchInit
- Cleaned go.mod by marking protobuf dependency as indirect
### Battleship
- Implemented board-based state tracking using MatchState.Boards:
- `p0_ships`, `p0_shots`, `p1_ships`, `p1_shots`
- Removed legacy metadata-based ship/shot board encoding
- Rewrote ValidateMove to use structured boards
- Rewrote ApplyMove for classic Battleship rules (mode B):
- Hits allow the attacker to keep their turn
- Miss switches turn
- Destroyed ship sections marked `X`
- Improved CheckGameOver using structured boards
### TicTacToe
- Updated ApplyMove signature to match new interface
- Ensured TicTacToe always returns `keepTurn = false`
- Updated code paths to use MatchState.Boards instead of Board
### Summary
This commit completes the migration from a single-board architecture to a
multi-board architecture across the engine, TicTacToe, and Battleship, enabling
support for more complex games and multiple modes such as Battleship Mode B.
### Major changes
- Replace single-board MatchState (`Board`) with multi-board map (`Boards`)
- Update GenericMatch to initialize empty Boards and populate them via GameRules.InitBoards
- Remove legacy `newEmptyBoard` helper from match.go
- Update .gitignore to include *BKP* patterns
### GameRules interface
- Add InitBoards(players, cfg) to allow games to construct their own board sets
- Add detailed documentation explaining method responsibilities and usage
- Improve MovePayload comment clarity
### TicTacToe updates
- Implement InitBoards to produce a single `"tictactoe"` board
- Replace all old references to `state.Board` with `state.Boards["tictactoe"]`
- Make CheckGameOver, ValidateMove, and ApplyMove multi-board compatible
### Battleship updates
- Implement InitBoards generating per-player ships + shots boards:
- p0_ships, p0_shots
- p1_ships, p1_shots
### Match flow updates
- Boards are now created only when all players have joined
- Initial state broadcast now includes `boards` instead of `board`
This completes the backend migration for multi-board games and prepares the architecture
for Battleship and other complex board-based games.
Updated TicTacToeRules and BattleshipRules to implement ApplyMove(state, playerIdx, payload) (bool, bool, int) as required by GameRules.
Added win/draw resolution logic directly inside each game’s ApplyMove return.
Removed obsolete convertToGamePlayers helper.
Updated GenericMatch to call AssignPlayerSymbols with []*structs.Player directly.
Ensured all rule implementations now fully satisfy the GameRules interface.