Chess: Implement halfmove clock (no effect yet)

For the 50-move and 75-move rules
This commit is contained in:
Wuzzy 2023-07-16 13:49:47 +02:00
parent 3fbc705a3f
commit 3dbb283231

View File

@ -1311,8 +1311,9 @@ local function update_formspec(meta)
end end
d_en_passant = index_to_notation(xy_to_index(dsx, dsy)) d_en_passant = index_to_notation(xy_to_index(dsx, dsy))
end end
-- The halfmove clock is not implemented and is always at 0 -- The halfmove clock counts for how many consecutive halfmoves
local d_halfmove_clock = "0" -- have been made with no pawn advancing and no piece being captured
local d_halfmove_clock = meta:get_int("halfmoveClock")
-- fullmove starts at 1 and should count up every time black moves -- fullmove starts at 1 and should count up every time black moves
local d_fullmove = tostring(get_current_fullmove(meta) + 1) local d_fullmove = tostring(get_current_fullmove(meta) + 1)
@ -1479,6 +1480,7 @@ function realchess.init(pos)
meta:set_int("promotionPawnFromIdx", 0) meta:set_int("promotionPawnFromIdx", 0)
meta:set_int("promotionPawnToIdx", 0) meta:set_int("promotionPawnToIdx", 0)
meta:set_int("prevDoublePawnStepTo", 0) meta:set_int("prevDoublePawnStepTo", 0)
meta:set_int("halfmoveClock", 0)
meta:set_string("moves_raw", "") meta:set_string("moves_raw", "")
meta:set_string("eaten", "") meta:set_string("eaten", "")
@ -1585,6 +1587,7 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
local doublePawnStep = nil local doublePawnStep = nil
local en_passant_target = nil local en_passant_target = nil
local lostCastlingRightRook = nil local lostCastlingRightRook = nil
local resetHalfmoveClock = false
-- PAWN -- PAWN
if pieceFrom:sub(11,14) == "pawn" then if pieceFrom:sub(11,14) == "pawn" then
@ -1600,11 +1603,13 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
-- activate promotion -- activate promotion
promotion = true promotion = true
end end
resetHalfmoveClock = true
elseif from_x - 1 == to_x or from_x + 1 == to_x then elseif from_x - 1 == to_x or from_x + 1 == to_x then
if to_index >= 1 and to_index <= 8 and pieceTo:find("black") then if to_index >= 1 and to_index <= 8 and pieceTo:find("black") then
-- activate promotion -- activate promotion
promotion = true promotion = true
end end
resetHalfmoveClock = true
else else
return false return false
end end
@ -1615,6 +1620,7 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
end end
-- store the destination of this double step in meta (needed for en passant check) -- store the destination of this double step in meta (needed for en passant check)
doublePawnStep = to_index doublePawnStep = to_index
resetHalfmoveClock = true
else else
return false return false
end end
@ -1648,6 +1654,7 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
if not can_capture then if not can_capture then
return false return false
end end
resetHalfmoveClock = true
else else
return false return false
end end
@ -1664,11 +1671,13 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
-- activate promotion -- activate promotion
promotion = true promotion = true
end end
resetHalfmoveClock = true
elseif from_x - 1 == to_x or from_x + 1 == to_x then elseif from_x - 1 == to_x or from_x + 1 == to_x then
if to_index >= 57 and to_index <= 64 and pieceTo:find("white") then if to_index >= 57 and to_index <= 64 and pieceTo:find("white") then
-- activate promotion -- activate promotion
promotion = true promotion = true
end end
resetHalfmoveClock = true
else else
return false return false
end end
@ -1679,6 +1688,7 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
end end
-- store the destination of this double step in meta (needed for en passant check) -- store the destination of this double step in meta (needed for en passant check)
doublePawnStep = to_index doublePawnStep = to_index
resetHalfmoveClock = true
else else
return false return false
end end
@ -1712,6 +1722,7 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
if not can_capture then if not can_capture then
return false return false
end end
resetHalfmoveClock = true
else else
return false return false
end end
@ -2002,6 +2013,17 @@ function realchess.move(meta, from_list, from_index, to_list, to_index, playerNa
return false return false
end end
if pieceTo ~= "" then
resetHalfmoveClock = true
end
-- The halfmove clock counts the number of consecutive halfmoves
-- in which neither a pawn was moved nor a piece was captured.
if resetHalfmoveClock then
meta:set_int("halfmoveClock", 0)
else
meta:set_int("halfmoveClock", meta:get_int("halfmoveClock") + 1)
end
if en_passant_target then if en_passant_target then
inv:set_stack(to_list, en_passant_target, "") inv:set_stack(to_list, en_passant_target, "")
end end