Chess: Add support for more game results
This commit is contained in:
parent
44f75850dc
commit
d834d41c41
108
src/chess.lua
108
src/chess.lua
@ -759,21 +759,51 @@ local function update_formspec(meta)
|
|||||||
local moves = get_moves_formstring(meta)
|
local moves = get_moves_formstring(meta)
|
||||||
local eaten_img = get_eaten_formstring(meta)
|
local eaten_img = get_eaten_formstring(meta)
|
||||||
local lastMove = meta:get_string("lastMove")
|
local lastMove = meta:get_string("lastMove")
|
||||||
|
local gameResult = meta:get_string("gameResult")
|
||||||
|
|
||||||
-- arrow to show whose turn it is
|
-- arrow to show whose turn it is
|
||||||
local blackArr = (lastMove == "white" and "image[1,0.2;0.7,0.7;chess_turn_black.png]") or ""
|
local blackArr = (gameResult == "" and lastMove == "white" and "image[1,0.2;0.7,0.7;chess_turn_black.png]") or ""
|
||||||
local whiteArr = ((lastMove == "" or lastMove == "black") and "image[1,9.05;0.7,0.7;chess_turn_white.png]") or ""
|
local whiteArr = (gameResult == "" and (lastMove == "" or lastMove == "black") and "image[1,9.05;0.7,0.7;chess_turn_white.png]") or ""
|
||||||
local turnBlack = minetest.colorize("#000001", playerBlack)
|
local turnBlack = minetest.colorize("#000001", playerBlack)
|
||||||
local turnWhite = minetest.colorize("#000001", playerWhite)
|
local turnWhite = minetest.colorize("#000001", playerWhite)
|
||||||
-- display the word "check" if the player is in check
|
|
||||||
local check_s = minetest.colorize("#FF0000", "\\["..FS("check").."\\]")
|
-- several status words for the player
|
||||||
|
-- player is in check
|
||||||
|
local check_s = minetest.colorize("#FF8000", "["..S("check").."]")
|
||||||
|
-- player has been checkmated
|
||||||
|
local mate_s = minetest.colorize("#FF0000", "["..S("checkmate").."]")
|
||||||
|
-- player has won
|
||||||
|
local win_s = minetest.colorize("#00FF00", "["..S("winner").."]")
|
||||||
|
-- player has a draw
|
||||||
|
local draw_s = minetest.colorize("#FF00FF", "["..S("draw").."]")
|
||||||
|
|
||||||
local mrsplit = string.split(moves_raw, ";")
|
local mrsplit = string.split(moves_raw, ";")
|
||||||
local m_sel_idx = math.ceil(#mrsplit / 2)
|
local m_sel_idx = math.ceil(#mrsplit / 2)
|
||||||
|
|
||||||
|
local status_black = ""
|
||||||
|
local status_white = ""
|
||||||
|
if gameResult == "blackWon" then
|
||||||
|
status_black = " " .. win_s
|
||||||
|
status_white = " " .. mate_s
|
||||||
|
elseif gameResult == "draw" then
|
||||||
|
status_black = " " .. draw_s
|
||||||
|
status_white = " " .. draw_s
|
||||||
|
elseif gameResult == "whiteWon" then
|
||||||
|
status_black = " " .. mate_s
|
||||||
|
status_white = " " .. win_s
|
||||||
|
else
|
||||||
|
if black_king_attacked then
|
||||||
|
status_black = " " .. check_s
|
||||||
|
end
|
||||||
|
if white_king_attacked then
|
||||||
|
status_white = " " .. check_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local formspec = fs ..
|
local formspec = fs ..
|
||||||
"label[1.9,0.3;" .. turnBlack .. (black_king_attacked and " " .. check_s or "") .. "]" ..
|
"label[1.9,0.3;" .. turnBlack .. minetest.formspec_escape(status_black) .. "]" ..
|
||||||
blackArr ..
|
blackArr ..
|
||||||
"label[1.9,9.15;" .. turnWhite .. (white_king_attacked and " " .. check_s or "") .. "]" ..
|
"label[1.9,9.15;" .. turnWhite .. minetest.formspec_escape(status_white) .. "]" ..
|
||||||
whiteArr ..
|
whiteArr ..
|
||||||
"table[8.9,1.05;5.07,3.75;moves;" .. moves .. ";"..m_sel_idx.."]" ..
|
"table[8.9,1.05;5.07,3.75;moves;" .. moves .. ";"..m_sel_idx.."]" ..
|
||||||
eaten_img
|
eaten_img
|
||||||
@ -781,6 +811,65 @@ local function update_formspec(meta)
|
|||||||
meta:set_string("formspec", formspec)
|
meta:set_string("formspec", formspec)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function update_game_result(meta)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
local board_t = board_to_table(inv)
|
||||||
|
|
||||||
|
update_formspec(meta)
|
||||||
|
local blackCanMove = false
|
||||||
|
local whiteCanMove = false
|
||||||
|
|
||||||
|
for i = 1, 64 do
|
||||||
|
local possibleMovesHere = get_possible_moves(board_t, i)
|
||||||
|
local stack_name = inv:get_stack("board", i):get_name()
|
||||||
|
if stack_name:find("black") then
|
||||||
|
for k, v in pairs(possibleMovesHere) do
|
||||||
|
blackCanMove = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
elseif stack_name:find("white") then
|
||||||
|
for k, v in pairs(possibleMovesHere) do
|
||||||
|
whiteCanMove = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if blackCanMove and whiteCanMove then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local currentTurn
|
||||||
|
local lastTurn = meta:get_string("lastTurn")
|
||||||
|
if lastTurn == "black" or lastTurn == "" then
|
||||||
|
currentTurn = "white"
|
||||||
|
else
|
||||||
|
currentTurn = "black"
|
||||||
|
end
|
||||||
|
if currentTurn == "black" and not blackCanMove then
|
||||||
|
if meta:get_string("blackAttacked") == "true" then
|
||||||
|
-- black was checkmated
|
||||||
|
meta:set_string("gameResult", "whiteWon")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
-- stalemate
|
||||||
|
meta:set_string("gameResult", "draw")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if currentTurn == "white" and not whiteCanMove then
|
||||||
|
if meta:get_string("whiteAttacked") == "true" then
|
||||||
|
-- white was checkmated
|
||||||
|
meta:set_string("gameResult", "blackWon")
|
||||||
|
return
|
||||||
|
else
|
||||||
|
-- stalemate
|
||||||
|
meta:set_string("gameResult", "draw")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function realchess.init(pos)
|
function realchess.init(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
@ -790,6 +879,7 @@ function realchess.init(pos)
|
|||||||
meta:set_string("playerBlack", "")
|
meta:set_string("playerBlack", "")
|
||||||
meta:set_string("playerWhite", "")
|
meta:set_string("playerWhite", "")
|
||||||
meta:set_string("lastMove", "")
|
meta:set_string("lastMove", "")
|
||||||
|
meta:set_string("gameResult", "")
|
||||||
meta:set_string("blackAttacked", "")
|
meta:set_string("blackAttacked", "")
|
||||||
meta:set_string("whiteAttacked", "")
|
meta:set_string("whiteAttacked", "")
|
||||||
|
|
||||||
@ -1538,6 +1628,7 @@ local function ai_move(inv, meta)
|
|||||||
|
|
||||||
add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, choice_from, choice_to)
|
add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, choice_from, choice_to)
|
||||||
add_to_eaten_list(meta, pieceTo, pieceTo_s)
|
add_to_eaten_list(meta, pieceTo, pieceTo_s)
|
||||||
|
update_game_result(meta)
|
||||||
|
|
||||||
update_formspec(meta)
|
update_formspec(meta)
|
||||||
end
|
end
|
||||||
@ -1621,10 +1712,13 @@ function realchess.move_piece(meta, pieceFrom, from_list, from_index, to_list, t
|
|||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
inv:set_stack(from_list, from_index, "")
|
inv:set_stack(from_list, from_index, "")
|
||||||
inv:set_stack(to_list, to_index, pieceFrom)
|
inv:set_stack(to_list, to_index, pieceFrom)
|
||||||
|
|
||||||
|
update_game_result(meta)
|
||||||
update_formspec(meta)
|
update_formspec(meta)
|
||||||
|
|
||||||
-- The AI always plays black; make sure it doesn't move twice in the case of a swap:
|
-- The AI always plays black; make sure it doesn't move twice in the case of a swap:
|
||||||
-- Only let it play if it didn't already play.
|
-- Only let it play if it didn't already play.
|
||||||
if meta:get_string("mode") == "single" and meta:get_string("lastMove") ~= "black" then
|
if meta:get_string("mode") == "single" and meta:get_string("lastMove") ~= "black" and meta:get_string("gameResult") == "" then
|
||||||
ai_move(inv, meta)
|
ai_move(inv, meta)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user