From b2db0c777ef8f49cdd86ed87a3e7b0d9e7312eaf Mon Sep 17 00:00:00 2001 From: xxyheaven <1433191064@qq.com> Date: Sun, 21 Apr 2024 22:10:27 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=8C=BA=E5=8F=8A?= =?UTF-8?q?=E5=BC=83=E7=89=8C=E5=A0=86=E6=94=AF=E6=8C=81=E7=A7=98=E5=AF=86?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=EF=BC=9B=E5=8F=AF=E4=BB=A5=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=AF=B9=E6=8C=87=E5=AE=9A=E8=A7=92=E8=89=B2?= =?UTF-8?q?=EF=BC=88=E4=B8=80=E8=88=AC=E4=B8=BA=E7=A7=BB=E5=8A=A8=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E8=80=85=EF=BC=89=E5=8F=AF=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/events/movecard.lua | 10 ++++++---- lua/server/room.lua | 14 ++++++++------ lua/server/system_enum.lua | 2 ++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lua/server/events/movecard.lua b/lua/server/events/movecard.lua index 724eb31..33d4134 100644 --- a/lua/server/events/movecard.lua +++ b/lua/server/events/movecard.lua @@ -57,6 +57,7 @@ GameEvent.functions[GameEvent.MoveCards] = function(self) specialVisible = cardsMoveInfo.specialVisible, drawPilePosition = cardsMoveInfo.drawPilePosition, moveMark = cardsMoveInfo.moveMark, + visiblePlayers = cardsMoveInfo.visiblePlayers, } table.insert(cardsMoveStructs, cardsMoveStruct) @@ -69,10 +70,11 @@ GameEvent.functions[GameEvent.MoveCards] = function(self) from = cardsMoveInfo.from, toArea = Card.DiscardPile, moveReason = fk.ReasonPutIntoDiscardPile, - specialName = cardsMoveInfo.specialName, - specialVisible = cardsMoveInfo.specialVisible, - drawPilePosition = cardsMoveInfo.drawPilePosition, - moveMark = cardsMoveInfo.moveMark, + moveVisible = true, + --specialName = cardsMoveInfo.specialName, + --specialVisible = cardsMoveInfo.specialVisible, + --drawPilePosition = cardsMoveInfo.drawPilePosition, + --moveMark = cardsMoveInfo.moveMark, } table.insert(cardsMoveStructs, cardsMoveStruct) diff --git a/lua/server/room.lua b/lua/server/room.lua index f4346a4..45caf24 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -948,20 +948,22 @@ function Room:notifyMoveCards(players, card_moves, forceVisible) end end - local function containArea(area, relevant) --处理区的处理? + local function containArea(area, relevant, defaultVisible) --处理区的处理? local areas = relevant - and {Card.PlayerEquip, Card.PlayerJudge, Card.DiscardPile, Card.Processing, Card.PlayerHand, Card.PlayerSpecial} - or {Card.PlayerEquip, Card.PlayerJudge, Card.DiscardPile, Card.Processing} - return table.contains(areas, area) + and {Card.PlayerEquip, Card.PlayerJudge, Card.PlayerHand, Card.PlayerSpecial} + or {Card.PlayerEquip, Card.PlayerJudge} + return table.contains(areas, area) or (defaultVisible and table.contains({Card.Processing, Card.DiscardPile}, area)) end -- forceVisible make the move visible -- if move is relevant to player's hands or equips, it should be open -- cards move from/to equip/judge/discard/processing should be open - if not (move.moveVisible or forceVisible or containArea(move.toArea, move.to and p.isBuddy and p:isBuddy(move.to))) then + if not (move.moveVisible or forceVisible or + (move.visiblePlayers and table.find(move.visiblePlayers, function(pid) return p:isBuddy(pid) end)) or + containArea(move.toArea, move.to and p:isBuddy(move.to), move.moveVisible == nil)) then for _, info in ipairs(move.moveInfo) do - if not containArea(info.fromArea, move.from and p.isBuddy and p:isBuddy(move.from)) then + if not containArea(info.fromArea, move.from and p:isBuddy(move.from), move.moveVisible == nil) then info.cardId = -1 end end diff --git a/lua/server/system_enum.lua b/lua/server/system_enum.lua index 4d827d8..37cc262 100644 --- a/lua/server/system_enum.lua +++ b/lua/server/system_enum.lua @@ -16,6 +16,7 @@ ---@field public specialVisible? boolean @ 控制上述创建私人牌堆后是否令其可见 ---@field public drawPilePosition? integer @ 移至牌堆的索引位置,值为-1代表置入牌堆底,或者牌堆牌数+1也为牌堆底 ---@field public moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} +---@field public visiblePlayers? integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) --- MoveInfo 一张牌的来源信息 ---@class MoveInfo @@ -37,6 +38,7 @@ ---@field public specialVisible? boolean @ 控制上述创建私人牌堆后是否令其可见 ---@field public drawPilePosition? integer @ 移至牌堆的索引位置,值为-1代表置入牌堆底,或者牌堆牌数+1也为牌堆底 ---@field public moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} +---@field public visiblePlayers? integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) --- PindianResult 拼点结果 ---@class PindianResult -- Gitee From 3472591377ca8213009be70fdbad4f9c0469374b Mon Sep 17 00:00:00 2001 From: xxyheaven <1433191064@qq.com> Date: Mon, 22 Apr 2024 19:36:12 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E8=A3=85=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/room.lua | 28 ++++++++++++++++++++++++---- lua/server/serverplayer.lua | 13 ++++++++----- lua/server/system_enum.lua | 4 ++-- standard/init.lua | 3 ++- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/lua/server/room.lua b/lua/server/room.lua index 45caf24..c760fcf 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -959,9 +959,20 @@ function Room:notifyMoveCards(players, card_moves, forceVisible) -- if move is relevant to player's hands or equips, it should be open -- cards move from/to equip/judge/discard/processing should be open - if not (move.moveVisible or forceVisible or - (move.visiblePlayers and table.find(move.visiblePlayers, function(pid) return p:isBuddy(pid) end)) or - containArea(move.toArea, move.to and p:isBuddy(move.to), move.moveVisible == nil)) then + local singleVisible = move.moveVisible or forceVisible + if move.visiblePlayers and not singleVisible then + local visiblePlayers = move.visiblePlayers + if type(visiblePlayers) == "number" then + if p:isBuddy(visiblePlayers) then + singleVisible = true + end + elseif type(visiblePlayers) == "table" then + if table.find(visiblePlayers, function(pid) return p:isBuddy(pid) end) then + singleVisible = true + end + end + end + if not (singleVisible or containArea(move.toArea, move.to and p:isBuddy(move.to), move.moveVisible == nil)) then for _, info in ipairs(move.moveInfo) do if not containArea(info.fromArea, move.from and p:isBuddy(move.from), move.moveVisible == nil) then info.cardId = -1 @@ -2821,6 +2832,13 @@ function Room:doCardUseEffect(cardUseEvent) if not findSameCard then if cardUseEvent.card:isVirtual() then self:getPlayerById(target):addVirtualEquip(cardUseEvent.card) + elseif cardUseEvent.card.name ~= Fk:getCardById(cardUseEvent.card.id, true).name then + local card = Fk:cloneCard(cardUseEvent.card.name) + card.skillNames = cardUseEvent.card.skillNames + card:addSubcard(cardUseEvent.card.id) + self:getPlayerById(target):addVirtualEquip(card) + else + self:getPlayerById(target):removeVirtualEquip(cardUseEvent.card.id) end self:moveCards({ @@ -3205,7 +3223,8 @@ end ---@param visible? boolean @ 是否明置 ---@param proposer? integer @ 移动操作者的id ---@param moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} -function Room:moveCardTo(card, to_place, target, reason, skill_name, special_name, visible, proposer, moveMark) +---@param visiblePlayers? integer|integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) +function Room:moveCardTo(card, to_place, target, reason, skill_name, special_name, visible, proposer, moveMark, visiblePlayers) reason = reason or fk.ReasonJustMove skill_name = skill_name or "" special_name = special_name or "" @@ -3238,6 +3257,7 @@ function Room:moveCardTo(card, to_place, target, reason, skill_name, special_nam moveVisible = visible, proposer = proposer, moveMark = moveMark, + visiblePlayers = visiblePlayers, }) end end diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index 0c9ae9e..2f1fdea 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -593,7 +593,7 @@ end ---@param skillName? string function ServerPlayer:addToPile(pile_name, card, visible, skillName) local room = self.room - room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible) + room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible, self.id) end function ServerPlayer:bury() @@ -638,6 +638,7 @@ function ServerPlayer:clearPiles() end function ServerPlayer:addVirtualEquip(card) + self:removeVirtualEquip(card:getEffectiveId()) Player.addVirtualEquip(self, card) self.room:doBroadcastNotify("AddVirtualEquip", json.encode{ player = self.id, @@ -648,10 +649,12 @@ end function ServerPlayer:removeVirtualEquip(cid) local ret = Player.removeVirtualEquip(self, cid) - self.room:doBroadcastNotify("RemoveVirtualEquip", json.encode{ - player = self.id, - id = cid, - }) + if ret then + self.room:doBroadcastNotify("RemoveVirtualEquip", json.encode{ + player = self.id, + id = cid, + }) + end return ret end diff --git a/lua/server/system_enum.lua b/lua/server/system_enum.lua index 37cc262..7974390 100644 --- a/lua/server/system_enum.lua +++ b/lua/server/system_enum.lua @@ -16,7 +16,7 @@ ---@field public specialVisible? boolean @ 控制上述创建私人牌堆后是否令其可见 ---@field public drawPilePosition? integer @ 移至牌堆的索引位置,值为-1代表置入牌堆底,或者牌堆牌数+1也为牌堆底 ---@field public moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} ----@field public visiblePlayers? integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) +---@field public visiblePlayers? integer|integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) --- MoveInfo 一张牌的来源信息 ---@class MoveInfo @@ -38,7 +38,7 @@ ---@field public specialVisible? boolean @ 控制上述创建私人牌堆后是否令其可见 ---@field public drawPilePosition? integer @ 移至牌堆的索引位置,值为-1代表置入牌堆底,或者牌堆牌数+1也为牌堆底 ---@field public moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} ----@field public visiblePlayers? integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) +---@field public visiblePlayers? integer|integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) --- PindianResult 拼点结果 ---@class PindianResult diff --git a/standard/init.lua b/standard/init.lua index fb4856c..44aed8d 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -273,7 +273,8 @@ local yiji = fk.CreateTriggerSkill{ for _, id in ipairs(ret.cards) do table.removeOne(ids, id) end - room:moveCardTo(ret.cards, Card.PlayerHand, room:getPlayerById(ret.targets[1]), fk.ReasonGive, self.name, nil, false, player.id) + room:moveCardTo(ret.cards, Card.PlayerHand, room:getPlayerById(ret.targets[1]), fk.ReasonGive, + self.name, nil, false, player.id, nil, player.id) if #ids == 0 then break end if player.dead then room:moveCards({ -- Gitee From 6589f60146ca86c05516f4baaddf2518eaae7f4d Mon Sep 17 00:00:00 2001 From: xxyheaven <1433191064@qq.com> Date: Wed, 24 Apr 2024 21:51:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=A7=BB=E5=8A=A8=E4=BA=8B=E4=BB=B6=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/client/client.lua | 34 ++++++++++++++++++-- lua/core/player.lua | 8 +---- lua/server/room.lua | 63 +++++-------------------------------- lua/server/serverplayer.lua | 2 +- standard/i18n/zh_CN.lua | 2 +- 5 files changed, 42 insertions(+), 67 deletions(-) diff --git a/lua/client/client.lua b/lua/client/client.lua index dbbd2d9..7137e90 100644 --- a/lua/client/client.lua +++ b/lua/client/client.lua @@ -137,9 +137,11 @@ function Client:moveCards(moves) pcardMax = self:getPlayerById(move.to):getMaxCards(), id = move.to, }) - if (not Self:isBuddy(self:getPlayerById(move.to)) and move.toArea == Card.PlayerHand) or table.contains(ids, -1) then - ids = table.map(ids, function() return -1 end) + if (move.toArea == Card.PlayerHand and not Self:isBuddy(self:getPlayerById(move.to))) or + (move.toArea == Card.PlayerSpecial and not move.moveVisible) then + ids = {-1} end + self:getPlayerById(move.to):addCards(move.toArea, ids, move.specialName) elseif move.toArea == Card.DiscardPile then table.insert(self.discard_pile, move.ids[1]) @@ -474,7 +476,32 @@ end ---@param moves CardsMoveStruct[] local function separateMoves(moves) local ret = {} ---@type CardsMoveInfo[] + + local function containArea(area, relevant, defaultVisible) --处理区的处理? + local areas = relevant + and {Card.PlayerEquip, Card.PlayerJudge, Card.PlayerHand} + or {Card.PlayerEquip, Card.PlayerJudge} + return table.contains(areas, area) or (defaultVisible and table.contains({Card.Processing, Card.DiscardPile}, area)) + end + for _, move in ipairs(moves) do + local singleVisible = move.moveVisible + if move.visiblePlayers and not singleVisible then + local visiblePlayers = move.visiblePlayers + if type(visiblePlayers) == "number" then + if Self:isBuddy(visiblePlayers) then + singleVisible = true + end + elseif type(visiblePlayers) == "table" then + if table.find(visiblePlayers, function(pid) return Self:isBuddy(pid) end) then + singleVisible = true + end + end + end + if not singleVisible then + singleVisible = containArea(move.toArea, move.to and Self:isBuddy(move.to), move.moveVisible == nil) + end + for _, info in ipairs(move.moveInfo) do table.insert(ret, { ids = {info.cardId}, @@ -486,6 +513,7 @@ local function separateMoves(moves) specialName = move.specialName, fromSpecialName = info.fromSpecialName, proposer = move.proposer, + moveVisible = singleVisible or containArea(info.fromArea, move.from and Self:isBuddy(move.from), move.moveVisible == nil) }) end end @@ -513,7 +541,7 @@ local function mergeMoves(moves) proposer = move.proposer, } end - table.insert(temp[info].ids, move.ids[1]) + table.insert(temp[info].ids, move.moveVisible and move.ids[1] or -1) end for _, v in pairs(temp) do table.insert(ret, v) diff --git a/lua/core/player.lua b/lua/core/player.lua index aaedad1..5db1ea3 100644 --- a/lua/core/player.lua +++ b/lua/core/player.lua @@ -260,13 +260,7 @@ function Player:removeCards(playerArea, cardIds, specialName) if #fromAreaIds == 0 then break end - - if table.contains(fromAreaIds, id) then - table.removeOne(fromAreaIds, id) - -- FIXME: 为客户端移动id为-1的牌考虑,但总感觉有地方需要商讨啊! - elseif table.every(fromAreaIds, function(e) return e == -1 end) then - table.remove(fromAreaIds, 1) - elseif id == -1 then + if not table.removeOne(fromAreaIds, id) and not table.removeOne(fromAreaIds, -1) then table.remove(fromAreaIds, 1) end end diff --git a/lua/server/room.lua b/lua/server/room.lua index c760fcf..7b7cc96 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -948,37 +948,6 @@ function Room:notifyMoveCards(players, card_moves, forceVisible) end end - local function containArea(area, relevant, defaultVisible) --处理区的处理? - local areas = relevant - and {Card.PlayerEquip, Card.PlayerJudge, Card.PlayerHand, Card.PlayerSpecial} - or {Card.PlayerEquip, Card.PlayerJudge} - return table.contains(areas, area) or (defaultVisible and table.contains({Card.Processing, Card.DiscardPile}, area)) - end - - -- forceVisible make the move visible - -- if move is relevant to player's hands or equips, it should be open - -- cards move from/to equip/judge/discard/processing should be open - - local singleVisible = move.moveVisible or forceVisible - if move.visiblePlayers and not singleVisible then - local visiblePlayers = move.visiblePlayers - if type(visiblePlayers) == "number" then - if p:isBuddy(visiblePlayers) then - singleVisible = true - end - elseif type(visiblePlayers) == "table" then - if table.find(visiblePlayers, function(pid) return p:isBuddy(pid) end) then - singleVisible = true - end - end - end - if not (singleVisible or containArea(move.toArea, move.to and p:isBuddy(move.to), move.moveVisible == nil)) then - for _, info in ipairs(move.moveInfo) do - if not containArea(info.fromArea, move.from and p:isBuddy(move.from), move.moveVisible == nil) then - info.cardId = -1 - end - end - end end p:doNotify("MoveCards", json.encode(arg)) end @@ -3147,34 +3116,18 @@ end --- 让一名玩家获得一张牌 ---@param player integer|ServerPlayer @ 要拿牌的玩家 ----@param cid integer|Card|integer[] @ 要拿到的卡牌 +---@param card integer|Card|integer[] @ 要拿到的卡牌 ---@param unhide? boolean @ 是否明着拿 ---@param reason? CardMoveReason @ 卡牌移动的原因 ---@param proposer? integer @ 移动操作者的id -function Room:obtainCard(player, cid, unhide, reason, proposer) - if type(cid) ~= "number" then - assert(cid and type(cid) == "table") - if cid[1] == nil then - cid = cid:isVirtual() and cid.subcards or {cid.id} - end - else - cid = {cid} - end - if #cid == 0 then return end - - if type(player) == "table" then - player = player.id +---@param skill_name? string @ 技能名 +---@param moveMark? table|string @ 移动后自动赋予标记,格式:{标记名(支持-inarea后缀,移出值代表区域后清除), 值} +---@param visiblePlayers? integer|integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) +function Room:obtainCard(player, card, unhide, reason, proposer, skill_name, moveMark, visiblePlayers) + if type(player) == "number" then + player = self:getPlayerById(player) end - - self:moveCards({ - ids = cid, - from = self.owner_map[cid[1]], - to = player, - toArea = Card.PlayerHand, - moveReason = reason or fk.ReasonJustMove, - proposer = proposer or player, - moveVisible = unhide or false, - }) + self:moveCardTo(card, Card.PlayerHand, player, reason, skill_name, nil, unhide, proposer or player.id, moveMark, visiblePlayers) end --- 让玩家摸牌 diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index 2f1fdea..4157f6a 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -593,7 +593,7 @@ end ---@param skillName? string function ServerPlayer:addToPile(pile_name, card, visible, skillName) local room = self.room - room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible, self.id) + room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible, self.id, nil, self.id) end function ServerPlayer:bury() diff --git a/standard/i18n/zh_CN.lua b/standard/i18n/zh_CN.lua index b633733..4957631 100644 --- a/standard/i18n/zh_CN.lua +++ b/standard/i18n/zh_CN.lua @@ -246,7 +246,7 @@ Fk:loadTranslationTable{ ["$lianying1"] = "牌不是万能的,但是没牌是万万不能的。", ["$lianying2"] = "旧的不去,新的不来。", ["lianying"] = "连营", - [":lianying"] = "当你失去最后的手牌后,你可以摸一张牌。", + [":lianying"] = "当你失去手牌后,若你没有手牌,你可以摸一张牌。", ["sunshangxiang"] = "孙尚香", ["#sunshangxiang"] = "弓腰姬", -- Gitee From f56a313e5f7a411824e63ffd3a7bbce22ee5d165 Mon Sep 17 00:00:00 2001 From: xxyheaven <1433191064@qq.com> Date: Wed, 24 Apr 2024 22:41:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?addtopile=E8=BF=BD=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/room.lua | 2 +- lua/server/serverplayer.lua | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lua/server/room.lua b/lua/server/room.lua index 7b7cc96..7d28b34 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -3116,7 +3116,7 @@ end --- 让一名玩家获得一张牌 ---@param player integer|ServerPlayer @ 要拿牌的玩家 ----@param card integer|Card|integer[] @ 要拿到的卡牌 +---@param card integer|integer[]|Card|Card[] @ 要拿到的卡牌 ---@param unhide? boolean @ 是否明着拿 ---@param reason? CardMoveReason @ 卡牌移动的原因 ---@param proposer? integer @ 移动操作者的id diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index 4157f6a..28f5bd4 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -588,12 +588,14 @@ function ServerPlayer:drawCards(num, skillName, fromPlace, moveMark) end ---@param pile_name string ----@param card integer|Card +---@param card integer | integer[] | Card | Card[] ---@param visible? boolean ---@param skillName? string -function ServerPlayer:addToPile(pile_name, card, visible, skillName) - local room = self.room - room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible, self.id, nil, self.id) +---@param proposer? integer +---@param visiblePlayers? integer | integer[] +function ServerPlayer:addToPile(pile_name, card, visible, skillName, proposer, visiblePlayers) + self.room:moveCardTo(card, Card.PlayerSpecial, self, fk.ReasonJustMove, skillName, pile_name, visible, + proposer or self.id, nil, visiblePlayers or self.id) end function ServerPlayer:bury() -- Gitee