Chess: Refactor figurine string

This commit is contained in:
Wuzzy 2023-07-15 10:06:24 +02:00
parent 78106fe9e4
commit 820f4238a0

View File

@ -2,7 +2,6 @@ local realchess = {}
local S = minetest.get_translator("xdecor") local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end local FS = function(...) return minetest.formspec_escape(S(...)) end
local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false
local MOVES_LIST_SYMBOL_EMPTY = 69
local AI_NAME = S("Dumb AI") local AI_NAME = S("Dumb AI")
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
@ -759,17 +758,36 @@ local function has_king_safe_move(theoretical_moves, board, player)
end end
end end
-- Base names of all Chess pieces (with color)
local pieces_basenames = {
"pawn_white",
"rook_white",
"knight_white",
"bishop_white",
"queen_white",
"king_white",
"pawn_black",
"rook_black",
"knight_black",
"bishop_black",
"queen_black",
"king_black",
}
-- Initial positions of the pieces on the chessboard.
local pieces = { -- The pieces are specified as item names.
"realchess:rook_black_1", -- It starts a8, continues with b8, c8, etc. then continues with a7, b7, etc. etc.
"realchess:knight_black_1", local starting_grid = {
"realchess:bishop_black_1", -- file '8'
"realchess:queen_black", "realchess:rook_black_1", -- a8
"realchess:knight_black_1", -- b8
"realchess:bishop_black_1", -- c8
"realchess:queen_black", -- ...
"realchess:king_black", "realchess:king_black",
"realchess:bishop_black_2", "realchess:bishop_black_2",
"realchess:knight_black_2", "realchess:knight_black_2",
"realchess:rook_black_2", "realchess:rook_black_2",
-- file '7'
"realchess:pawn_black_1", "realchess:pawn_black_1",
"realchess:pawn_black_2", "realchess:pawn_black_2",
"realchess:pawn_black_3", "realchess:pawn_black_3",
@ -778,8 +796,10 @@ local pieces = {
"realchess:pawn_black_6", "realchess:pawn_black_6",
"realchess:pawn_black_7", "realchess:pawn_black_7",
"realchess:pawn_black_8", "realchess:pawn_black_8",
-- files '6' thru '3'
'','','','','','','','','','','','','','','','', '','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','', '','','','','','','','','','','','','','','','',
-- file '2'
"realchess:pawn_white_1", "realchess:pawn_white_1",
"realchess:pawn_white_2", "realchess:pawn_white_2",
"realchess:pawn_white_3", "realchess:pawn_white_3",
@ -788,6 +808,7 @@ local pieces = {
"realchess:pawn_white_6", "realchess:pawn_white_6",
"realchess:pawn_white_7", "realchess:pawn_white_7",
"realchess:pawn_white_8", "realchess:pawn_white_8",
-- file '1'
"realchess:rook_white_1", "realchess:rook_white_1",
"realchess:knight_white_1", "realchess:knight_white_1",
"realchess:bishop_white_1", "realchess:bishop_white_1",
@ -798,15 +819,23 @@ local pieces = {
"realchess:rook_white_2" "realchess:rook_white_2"
} }
local pieces_str, x = "", 0 -- Figurine image IDs and file names for the chess notation table.
for i = 1, #pieces do -- Note: "figurine" refers to the chess notation icon, NOT the chess piece for playing.
local p = pieces[i]:match(":(%w+_%w+)") local figurines_str = "", 0
if pieces[i]:find(":(%w+)_(%w+)") and not pieces_str:find(p) then local figurines_str_cnt = 0
pieces_str = pieces_str .. x .. "=chess_figurine_" .. p .. ".png," local MOVES_LIST_SYMBOL_EMPTY = figurines_str_cnt
x = x + 1 figurines_str = figurines_str .. MOVES_LIST_SYMBOL_EMPTY .. "=mailbox_blank16.png"
end for i = 1, #pieces_basenames do
figurines_str_cnt = figurines_str_cnt + 1
local p = pieces_basenames[i]
figurines_str = figurines_str .. "," .. figurines_str_cnt .. "=chess_figurine_" .. p .. ".png"
end end
pieces_str = pieces_str .. MOVES_LIST_SYMBOL_EMPTY .. "=mailbox_blank16.png"
local function get_figurine_id(piece_itemname)
local piece_s = piece_itemname:match(":(%w+_%w+)")
return figurines_str:match("(%d+)=chess_figurine_" .. piece_s)
end
local fs_init = [[ local fs_init = [[
formspec_version[2] formspec_version[2]
@ -836,9 +865,9 @@ local fs = [[
tableoptions[background=#00000000;highlight=#00000000;border=false] tableoptions[background=#00000000;highlight=#00000000;border=false]
]] ]]
-- move; white piece; white halfmove; black piece; black halfmove -- move; white piece; white halfmove; black piece; black halfmove
.."tablecolumns[text;image," .. pieces_str .. ";text;image," .. pieces_str .. ";text]" .."tablecolumns[text;image," .. figurines_str .. ";text;image," .. figurines_str .. ";text]"
local function add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_idx, to_idx, special) local function add_move_to_moves_list(meta, pieceFrom, pieceTo, from_idx, to_idx, special)
local moves_raw = meta:get_string("moves_raw") local moves_raw = meta:get_string("moves_raw")
if moves_raw ~= "" then if moves_raw ~= "" then
moves_raw = moves_raw .. ";" moves_raw = moves_raw .. ";"
@ -846,12 +875,12 @@ local function add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_
if not special then if not special then
special = "" special = ""
end end
moves_raw = moves_raw .. pieceFrom .. "," .. pieceTo .. "," .. pieceTo_s .. "," .. from_idx .. "," .. to_idx .. "," .. special moves_raw = moves_raw .. pieceFrom .. "," .. pieceTo .. "," .. from_idx .. "," .. to_idx .. "," .. special
meta:set_string("moves_raw", moves_raw) meta:set_string("moves_raw", moves_raw)
end end
local function add_special_to_moves_list(meta, special) local function add_special_to_moves_list(meta, special)
add_move_to_moves_list(meta, "", "", "", "", "", special) add_move_to_moves_list(meta, "", "", "", "", special)
end end
-- Create the full formspec string for the sequence of moves. -- Create the full formspec string for the sequence of moves.
@ -869,10 +898,9 @@ local function get_moves_formstring(meta)
local move_split = string.split(moves_split[m], ",", true) local move_split = string.split(moves_split[m], ",", true)
local pieceFrom = move_split[1] local pieceFrom = move_split[1]
local pieceTo = move_split[2] local pieceTo = move_split[2]
local pieceTo_s = move_split[3] local from_idx = tonumber(move_split[3])
local from_idx = tonumber(move_split[4]) local to_idx = tonumber(move_split[4])
local to_idx = tonumber(move_split[5]) local special = move_split[5]
local special = move_split[6]
-- true if White plays, false if Black plays -- true if White plays, false if Black plays
local curPlayerIsWhite = m % 2 == 1 local curPlayerIsWhite = m % 2 == 1
@ -894,15 +922,14 @@ local function get_moves_formstring(meta)
else else
local from_x, from_y = index_to_xy(from_idx) local from_x, from_y = index_to_xy(from_idx)
local to_x, to_y = index_to_xy(to_idx) local to_x, to_y = index_to_xy(to_idx)
local pieceFrom_s = pieceFrom:match(":(%w+_%w+)")
local pieceFrom_si_id local pieceFrom_si_id
-- Show no piece icon for pawn -- Show no piece icon for pawn
if pieceFrom:sub(11,14) == "pawn" then if pieceFrom:sub(11,14) == "pawn" then
pieceFrom_si_id = MOVES_LIST_SYMBOL_EMPTY pieceFrom_si_id = MOVES_LIST_SYMBOL_EMPTY
else else
pieceFrom_si_id = pieces_str:match("(%d+)=chess_figurine_" .. pieceFrom_s) pieceFrom_si_id = get_figurine_id(pieceFrom)
end end
local pieceTo_si_id = pieceTo_s ~= "" and pieces_str:match("(%d+)=chess_figurine_" .. pieceTo_s) or "" local pieceTo_si_id = pieceTo ~= "" and get_figurine_id(pieceTo)
local coordFrom = index_to_notation(from_idx) local coordFrom = index_to_notation(from_idx)
local coordTo = index_to_notation(to_idx) local coordTo = index_to_notation(to_idx)
@ -962,9 +989,10 @@ local function get_moves_formstring(meta)
return moves_out, move_no return moves_out, move_no
end end
local function add_to_eaten_list(meta, pieceTo, pieceTo_s) local function add_to_eaten_list(meta, pieceTo)
local eaten = meta:get_string("eaten") local eaten = meta:get_string("eaten")
if pieceTo ~= "" then if pieceTo ~= "" then
local pieceTo_s = pieceTo:match(":(%w+_%w+)") or ""
eaten = eaten .. pieceTo_s .. "," eaten = eaten .. pieceTo_s .. ","
end end
meta:set_string("eaten", eaten) meta:set_string("eaten", eaten)
@ -1243,7 +1271,7 @@ function realchess.init(pos)
meta:set_string("eaten", "") meta:set_string("eaten", "")
meta:set_string("mode", "") meta:set_string("mode", "")
inv:set_list("board", pieces) inv:set_list("board", starting_grid)
inv:set_size("board", 64) inv:set_size("board", 64)
-- Clear legacy metadata -- Clear legacy metadata
@ -1828,7 +1856,6 @@ local function ai_move(inv, meta)
local pieceFrom = inv:get_stack("board", choice_from):get_name() local pieceFrom = inv:get_stack("board", choice_from):get_name()
local pieceTo = inv:get_stack("board", choice_to):get_name() local pieceTo = inv:get_stack("board", choice_to):get_name()
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or ""
local board = board_to_table(inv) local board = board_to_table(inv)
local black_king_idx, white_king_idx = locate_kings(board) local black_king_idx, white_king_idx = locate_kings(board)
@ -1902,8 +1929,8 @@ local function ai_move(inv, meta)
meta:set_string("lastMove", aiColor) meta:set_string("lastMove", aiColor)
meta:set_int("lastMoveTime", minetest.get_gametime()) meta:set_int("lastMoveTime", minetest.get_gametime())
add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, choice_from, choice_to) add_move_to_moves_list(meta, pieceFrom, pieceTo, choice_from, choice_to)
add_to_eaten_list(meta, pieceTo, pieceTo_s) add_to_eaten_list(meta, pieceTo)
update_game_result(meta) update_game_result(meta)
@ -2121,7 +2148,6 @@ function realchess.update_state(meta, from_index, to_index, thisMove, promotionO
local board = board_to_table(inv) local board = board_to_table(inv)
local pieceTo = board[to_index] local pieceTo = board[to_index]
local pieceFrom = promotionOverride or board[from_index] local pieceFrom = promotionOverride or board[from_index]
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or ""
if not promotionOverride then if not promotionOverride then
board[to_index] = board[from_index] board[to_index] = board[from_index]
@ -2151,9 +2177,8 @@ function realchess.update_state(meta, from_index, to_index, thisMove, promotionO
meta:set_string("lastMove", lastMove) meta:set_string("lastMove", lastMove)
meta:set_int("lastMoveTime", minetest.get_gametime()) meta:set_int("lastMoveTime", minetest.get_gametime())
local pieceTo_s = pieceTo ~= "" and pieceTo:match(":(%w+_%w+)") or "" add_move_to_moves_list(meta, pieceFrom, pieceTo, from_index, to_index)
add_move_to_moves_list(meta, pieceFrom, pieceTo, pieceTo_s, from_index, to_index) add_to_eaten_list(meta, pieceTo)
add_to_eaten_list(meta, pieceTo, pieceTo_s)
end end
function realchess.promote_pawn(meta, color, promoteTo) function realchess.promote_pawn(meta, color, promoteTo)