This commit is contained in:
parent
89c2e1630d
commit
804d6aed2a
1 changed files with 79 additions and 2 deletions
|
|
@ -700,6 +700,20 @@ func (m *ChessMatch) MatchLeave(ctx context.Context, logger runtime.Logger, db *
|
||||||
})
|
})
|
||||||
dispatcher.BroadcastMessage(OpCodeGameOver, msg, nil, nil, true)
|
dispatcher.BroadcastMessage(OpCodeGameOver, msg, nil, nil, true)
|
||||||
|
|
||||||
|
// Update match label to finished so it's not detected as active
|
||||||
|
label := MatchLabel{
|
||||||
|
Game: "chess960",
|
||||||
|
Status: "finished",
|
||||||
|
Result: s.Result,
|
||||||
|
White: s.WhiteName,
|
||||||
|
WhiteID: s.WhiteID,
|
||||||
|
Black: s.BlackName,
|
||||||
|
BlackID: s.BlackID,
|
||||||
|
PositionID: s.PositionID,
|
||||||
|
}
|
||||||
|
labelJSON, _ := json.Marshal(label)
|
||||||
|
dispatcher.MatchLabelUpdate(string(labelJSON))
|
||||||
|
|
||||||
logger.Info("Game forfeited: %s", s.Result)
|
logger.Info("Game forfeited: %s", s.Result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -753,14 +767,77 @@ type MoveResult struct {
|
||||||
Reason string
|
Reason string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert Chess960 FEN castling notation to standard notation for chess library compatibility
|
||||||
|
func convertChess960FenForLibrary(fenStr string) string {
|
||||||
|
parts := strings.Split(fenStr, " ")
|
||||||
|
if len(parts) < 3 {
|
||||||
|
return fenStr
|
||||||
|
}
|
||||||
|
|
||||||
|
castling := parts[2]
|
||||||
|
// Check if it's already standard notation or empty
|
||||||
|
if castling == "-" || castling == "KQkq" || castling == "KQ" || castling == "kq" ||
|
||||||
|
castling == "K" || castling == "Q" || castling == "k" || castling == "q" ||
|
||||||
|
castling == "Kq" || castling == "Qk" || castling == "Kk" || castling == "Qq" {
|
||||||
|
return fenStr
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert Chess960 file-based notation (like HBhb) to standard KQkq
|
||||||
|
newCastling := ""
|
||||||
|
hasWhiteKingside := false
|
||||||
|
hasWhiteQueenside := false
|
||||||
|
hasBlackKingside := false
|
||||||
|
hasBlackQueenside := false
|
||||||
|
|
||||||
|
for _, c := range castling {
|
||||||
|
if c >= 'A' && c <= 'H' {
|
||||||
|
// White castling - higher file = kingside, lower = queenside
|
||||||
|
if c >= 'E' {
|
||||||
|
hasWhiteKingside = true
|
||||||
|
} else {
|
||||||
|
hasWhiteQueenside = true
|
||||||
|
}
|
||||||
|
} else if c >= 'a' && c <= 'h' {
|
||||||
|
// Black castling
|
||||||
|
if c >= 'e' {
|
||||||
|
hasBlackKingside = true
|
||||||
|
} else {
|
||||||
|
hasBlackQueenside = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasWhiteKingside {
|
||||||
|
newCastling += "K"
|
||||||
|
}
|
||||||
|
if hasWhiteQueenside {
|
||||||
|
newCastling += "Q"
|
||||||
|
}
|
||||||
|
if hasBlackKingside {
|
||||||
|
newCastling += "k"
|
||||||
|
}
|
||||||
|
if hasBlackQueenside {
|
||||||
|
newCastling += "q"
|
||||||
|
}
|
||||||
|
|
||||||
|
if newCastling == "" {
|
||||||
|
newCastling = "-"
|
||||||
|
}
|
||||||
|
|
||||||
|
parts[2] = newCastling
|
||||||
|
return strings.Join(parts, " ")
|
||||||
|
}
|
||||||
|
|
||||||
// Validate chess move using corentings/chess/v2 library
|
// Validate chess move using corentings/chess/v2 library
|
||||||
func validateChessMove(fenStr, from, to, promotion string, logger runtime.Logger) MoveResult {
|
func validateChessMove(fenStr, from, to, promotion string, logger runtime.Logger) MoveResult {
|
||||||
result := MoveResult{Turn: "w"}
|
result := MoveResult{Turn: "w"}
|
||||||
|
|
||||||
logger.Info("validateChessMove: FEN=%s, move=%s%s", fenStr, from, to)
|
// Convert Chess960 castling notation to standard for library compatibility
|
||||||
|
convertedFen := convertChess960FenForLibrary(fenStr)
|
||||||
|
logger.Info("validateChessMove: original FEN=%s, converted=%s, move=%s%s", fenStr, convertedFen, from, to)
|
||||||
|
|
||||||
// Parse FEN
|
// Parse FEN
|
||||||
fen, err := chess.FEN(fenStr)
|
fen, err := chess.FEN(convertedFen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("validateChessMove: FEN parse error: %v", err)
|
logger.Error("validateChessMove: FEN parse error: %v", err)
|
||||||
return result
|
return result
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue