diff --git a/lua/server/events/movecard.lua b/lua/server/events/movecard.lua index 724eb314fb34bec41bcbecee97c78f4caaeed0fa..33d4134cf5f075e35a47c7f8a63de6a2442c07e2 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 f4346a45c2ce9be791781388f66ea734f021c2f2..c760fcfcbcb8aaa1a2b1a433ff3dca6806105ef7 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -948,20 +948,33 @@ 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 + 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 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 @@ -2819,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({ @@ -3203,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 "" @@ -3236,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 0c9ae9eb5ac34368b9c995557d1684fbacb0a35b..2f1fdea02423b8b5fcf388434d52832d31e2b854 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 4d827d87f58748874af7be0c4ab4471319cd0d8c..797439096314a741b5da47da63234ae940beb895 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|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|integer[] @ 控制移动对特定角色可见(在moveVisible为false时生效) --- PindianResult 拼点结果 ---@class PindianResult diff --git a/standard/init.lua b/standard/init.lua index fb4856c7a5bcd79f3803f930cdeede43b802f973..44aed8d0cc42c40f7a4e8133a935f51d7b9c6e97 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({