From 9df5d94fcbc124d0cb57ea37e33e1576b334dc8d Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Wed, 15 Aug 2018 01:54:56 +0200 Subject: [PATCH] New chessboard interface --- src/chess.lua | 232 ++++++++++++++++++++++++++++-------------- textures/chess_bg.png | Bin 678 -> 29706 bytes 2 files changed, 157 insertions(+), 75 deletions(-) diff --git a/src/chess.lua b/src/chess.lua index 1089da5..1381430 100644 --- a/src/chess.lua +++ b/src/chess.lua @@ -12,18 +12,73 @@ local function xy_to_index(x, y) return x + y * 8 + 1 end +local chat_prefix = minetest.colorize("#FFFF00", "[Chess] ") +local letters = {'A','B','C','D','E','F','G','H'} + +local pieces = { + "realchess:rook_black_1", + "realchess:knight_black_1", + "realchess:bishop_black_1", + "realchess:queen_black", + "realchess:king_black", + "realchess:bishop_black_2", + "realchess:knight_black_2", + "realchess:rook_black_2", + "realchess:pawn_black_1", + "realchess:pawn_black_2", + "realchess:pawn_black_3", + "realchess:pawn_black_4", + "realchess:pawn_black_5", + "realchess:pawn_black_6", + "realchess:pawn_black_7", + "realchess:pawn_black_8", + '','','','','','','','','','','','','','','','', + '','','','','','','','','','','','','','','','', + "realchess:pawn_white_1", + "realchess:pawn_white_2", + "realchess:pawn_white_3", + "realchess:pawn_white_4", + "realchess:pawn_white_5", + "realchess:pawn_white_6", + "realchess:pawn_white_7", + "realchess:pawn_white_8", + "realchess:rook_white_1", + "realchess:knight_white_1", + "realchess:bishop_white_1", + "realchess:queen_white", + "realchess:king_white", + "realchess:bishop_white_2", + "realchess:knight_white_2", + "realchess:rook_white_2" +} + +local pieces_str, x = "", 0 +for i = 1, #pieces do + local p = pieces[i]:match(":(%w+_%w+)") + if pieces[i]:find(":(%w+)_(%w+)") and not pieces_str:find(p) then + pieces_str = pieces_str .. x .. "=" .. p .. ".png," + x = x + 1 + end +end +pieces_str = pieces_str .. "69=mailbox_blank16.png" + +local fs = [[ + size[14.7,10;] + no_prepend[] + bgcolor[#080808BB;true] + background[0,0;14.7,10;chess_bg.png] + list[context;board;0.3,1;8,8;] + listcolors[#00000000;#00000000;#00000000;#30434C;#FFF] + tableoptions[background=#00000000;highlight=#00000000;border=false] + button[10.5,8.5;2,2;new;New game] +]] .. "tablecolumns[image," .. pieces_str .. + ";text;color;text;color;text;image," .. pieces_str .. "]" + function realchess.init(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - local formspec = [[ size[8,8.6;] - bgcolor[#080808BB;true] - background[0,0;8,8;chess_bg.png] - button[3.1,7.8;2,2;new;New game] - list[context;board;0,0;8,8;] - listcolors[#00000000;#00000000;#00000000;#30434C;#FFF] ]] - - meta:set_string("formspec", formspec) + meta:set_string("formspec", fs) meta:set_string("infotext", "Chess Board") meta:set_string("playerBlack", "") meta:set_string("playerWhite", "") @@ -36,43 +91,10 @@ function realchess.init(pos) meta:set_int("castlingWhiteL", 1) meta:set_int("castlingWhiteR", 1) - inv:set_list("board", { - "realchess:rook_black_1", - "realchess:knight_black_1", - "realchess:bishop_black_1", - "realchess:queen_black", - "realchess:king_black", - "realchess:bishop_black_2", - "realchess:knight_black_2", - "realchess:rook_black_2", - "realchess:pawn_black_1", - "realchess:pawn_black_2", - "realchess:pawn_black_3", - "realchess:pawn_black_4", - "realchess:pawn_black_5", - "realchess:pawn_black_6", - "realchess:pawn_black_7", - "realchess:pawn_black_8", - '','','','','','','','','','','','','','','','', - '','','','','','','','','','','','','','','','', - "realchess:pawn_white_1", - "realchess:pawn_white_2", - "realchess:pawn_white_3", - "realchess:pawn_white_4", - "realchess:pawn_white_5", - "realchess:pawn_white_6", - "realchess:pawn_white_7", - "realchess:pawn_white_8", - "realchess:rook_white_1", - "realchess:knight_white_1", - "realchess:bishop_white_1", - "realchess:queen_white", - "realchess:king_white", - "realchess:bishop_white_2", - "realchess:knight_white_2", - "realchess:rook_white_2" - }) + meta:set_string("moves", "") + meta:set_string("eaten", "") + inv:set_list("board", pieces) inv:set_size("board", 64) end @@ -85,7 +107,6 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player local meta = minetest.get_meta(pos) if meta:get_string("winner") ~= "" then - minetest.chat_send_player(playerName, "This game is over.") return 0 end @@ -99,11 +120,10 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player if pieceFrom:find("white") then if playerWhite ~= "" and playerWhite ~= playerName then - minetest.chat_send_player(playerName, "Someone else plays white pieces!") + minetest.chat_send_player(playerName, chat_prefix .. "Someone else plays white pieces!") return 0 end if lastMove ~= "" and lastMove ~= "black" then - minetest.chat_send_player(playerName, "It's not your turn, wait for your opponent to play.") return 0 end if pieceTo:find("white") then @@ -114,11 +134,10 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player thisMove = "white" elseif pieceFrom:find("black") then if playerBlack ~= "" and playerBlack ~= playerName then - minetest.chat_send_player(playerName, "Someone else plays black pieces!") + minetest.chat_send_player(playerName, chat_prefix .. "Someone else plays black pieces!") return 0 end if lastMove ~= "" and lastMove ~= "white" then - minetest.chat_send_player(playerName, "It's not your turn, wait for your opponent to play.") return 0 end if pieceTo:find("black") then @@ -528,20 +547,71 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player meta:set_string("lastMove", lastMove) meta:set_int("lastMoveTime", minetest.get_gametime()) - if lastMove == "black" then - minetest.chat_send_player(playerWhite, "["..os.date("%H:%M:%S").."] ".. - playerName.." moved a "..pieceFrom:match(":(%a+)")..", it's now your turn.") - elseif lastMove == "white" then - minetest.chat_send_player(playerBlack, "["..os.date("%H:%M:%S").."] ".. - playerName.." moved a "..pieceFrom:match(":(%a+)")..", it's now your turn.") - end - if pieceTo:sub(11,14) == "king" then - minetest.chat_send_player(playerBlack, playerName.." won the game.") - minetest.chat_send_player(playerWhite, playerName.." won the game.") meta:set_string("winner", thisMove) end + local moves = meta:get_string("moves") + local pieceFrom_s = pieceFrom:match(":(%w+_%w+)") + local pieceFrom_si_id = pieces_str:match("(%d+)=" .. pieceFrom_s) + local pieceTo_s = pieceTo_s ~= "" and pieceTo:match(":(%w+_%w+)") or "" + local pieceTo_si_id = pieceTo_s ~= "" and pieces_str:match("(%d+)=" .. pieceTo_s) or "" + + moves = pieceFrom_si_id .. "," .. + letters[from_x + 1] .. (from_y + 1) .. "," .. + (pieceTo ~= "" and "#33FF33" or "#FFFFFF") .. ", > ,#FFFFFF," .. + letters[to_x + 1] .. (to_y + 1) .. "," .. + (pieceTo ~= "" and pieceTo_si_id or "69") .. "," .. + moves + + meta:set_string("moves", moves) + + local eaten = meta:get_string("eaten") + if pieceTo ~= "" then + eaten = eaten .. pieceTo_s .. "," + end + + meta:set_string("eaten", eaten) + + local eaten_t = string.split(eaten, ",") + local eaten_img = "" + + local a, b = 0, 0 + for i = 1, #eaten_t do + local is_white = eaten_t[i]:sub(-5,-1) == "white" + local X = (is_white and a or b) % 4 + local Y = ((is_white and a or b) % 16 - X) / 4 + + if is_white then + a = a + 1 + else + b = b + 1 + end + + eaten_img = eaten_img .. + "image[" .. ((X + (is_white and 11.7 or 8.8)) - (X * 0.45)) .. "," .. + ((Y + 5.56) - (Y * 0.2)) .. ";1,1;" .. eaten_t[i] .. ".png]" + end + + local black_win = lastMove == "black" and pieceTo:sub(11,14) == "king" + local white_win = lastMove == "white" and pieceTo:sub(11,14) == "king" + + local formspec = fs .. + "label[2,0.3;" .. (black_win and + minetest.colorize("#00FF00", playerBlack .. " has win") or + minetest.colorize("#000001", + (lastMove == "white" and playerBlack ~= "" and not white_win) and + playerBlack .. "..." or playerBlack)) .. "]" .. + "label[2,9.15;" .. (white_win and + minetest.colorize("#00FF00", playerWhite .. " has win") or + minetest.colorize("#000001", + (lastMove == "black" and playerWhite ~= "" and not black_win) and + playerWhite .. "..." or playerWhite)) .. "]" .. + "table[8.9,1.05;5.07,3.75;moves;" .. moves:sub(1,-2) .. ";1]" .. + eaten_img + + meta:set_string("formspec", formspec) + return 1 end @@ -550,8 +620,11 @@ local function timeout_format(timeout_limit) local minutes = math.floor(time_remaining / 60) local seconds = time_remaining % 60 - if minutes == 0 then return seconds.." sec." end - return minutes.." min. "..seconds.." sec." + if minutes == 0 then + return seconds .. " sec." + end + + return minutes .. " min. " .. seconds .. " sec." end function realchess.fields(pos, _, fields, sender) @@ -564,14 +637,20 @@ function realchess.fields(pos, _, fields, sender) if fields.quit then return end -- timeout is 5 min. by default for resetting the game (non-players only) - if fields.new and (playerWhite == playerName or playerBlack == playerName) then - realchess.init(pos) - elseif fields.new and lastMoveTime ~= 0 and minetest.get_gametime() >= timeout_limit and + if fields.new then + if (playerWhite == playerName or playerBlack == playerName) then + realchess.init(pos) + else + minetest.chat_send_player(playerName, chat_prefix .. + "You can't reset the chessboard, a game has been started.\n" .. + "If you are not a current player, try again in " .. + timeout_format(timeout_limit)) + end + end + + if fields.new and lastMoveTime ~= 0 and minetest.get_gametime() >= timeout_limit and (playerWhite ~= playerName or playerBlack ~= playerName) then realchess.init(pos) - else - minetest.chat_send_player(playerName, "[!] You can't reset the chessboard, a game has been started.\n".. - "If you are not a current player, try again in "..timeout_format(timeout_limit)) end end @@ -579,6 +658,7 @@ function realchess.dig(pos, player) if not player then return false end + local meta = minetest.get_meta(pos) local playerName = player:get_player_name() local timeout_limit = meta:get_int("lastMoveTime") + 300 @@ -586,8 +666,10 @@ function realchess.dig(pos, player) -- timeout is 5 min. by default for digging the chessboard (non-players only) return (lastMoveTime == 0 and minetest.get_gametime() > timeout_limit) or - minetest.chat_send_player(playerName, "[!] You can't dig the chessboard, a game has been started.\n".. - "Reset it first if you're a current player, or dig again in "..timeout_format(timeout_limit)) + minetest.chat_send_player(playerName, chat_prefix .. + "You can't dig the chessboard, a game has been started.\n" .. + "Reset it first if you're a current player, or dig it again in " .. + timeout_format(timeout_limit)) end function realchess.on_move(pos, from_list, from_index) @@ -620,17 +702,17 @@ minetest.register_node(":realchess:chessboard", { local function register_piece(name, count) for _, color in pairs({"black", "white"}) do if not count then - minetest.register_craftitem(":realchess:"..name.."_"..color, { - description = color:gsub("^%l", string.upper).." "..name:gsub("^%l", string.upper), - inventory_image = name.."_"..color..".png", + minetest.register_craftitem(":realchess:" .. name .. "_" .. color, { + description = color:gsub("^%l", string.upper) .. " " .. name:gsub("^%l", string.upper), + inventory_image = name .. "_" .. color .. ".png", stack_max = 1, groups = {not_in_creative_inventory=1} }) else for i = 1, count do - minetest.register_craftitem(":realchess:"..name.."_"..color.."_"..i, { - description = color:gsub("^%l", string.upper).." "..name:gsub("^%l", string.upper), - inventory_image = name.."_"..color..".png", + minetest.register_craftitem(":realchess:" .. name .. "_" .. color .. "_" .. i, { + description = color:gsub("^%l", string.upper) .. " " .. name:gsub("^%l", string.upper), + inventory_image = name .. "_" .. color .. ".png", stack_max = 1, groups = {not_in_creative_inventory=1} }) diff --git a/textures/chess_bg.png b/textures/chess_bg.png index 02ff72adc491e7becf0861eb72159af07a1aaf34..41ee603d2ea813dd31f85053a16f0db1e0235c4c 100644 GIT binary patch literal 29706 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 Hn}+-!8HUqlrOG3)X(l7Wni$ z#j?!qxtaGgoB{~R|T z-Da9E%~2xs`t<2dbKeVm`SC%u}Z}aE514D-3-Ty&`DttN&vKLRC z+Q78z`}O1DwUTyj3z|G1ZHbw#efsMT?W+C%j_iCh(f|306B)BOBQq_Zta-cg^K|+5 z|8H$f7GY^p;97Lo_HdJt#M