diff --git a/lua/client/client.lua b/lua/client/client.lua index 1a37f9a02a580816e64c0b8aa0bb0f43ba8993ca..0473f00fc73ee06ee0ba10ddf7c1a304b9c18a09 100644 --- a/lua/client/client.lua +++ b/lua/client/client.lua @@ -981,6 +981,12 @@ fk.client_callback["SetBanner"] = function(self, data) end end +fk.client_callback["SetCurrent"] = function(self, data) + -- jsonData: [ int id ] + local playerId = data[1] + self:setCurrent(self:getPlayerById(playerId)) +end + fk.client_callback["SetCardMark"] = function(self, data) -- jsonData: [ int id, string mark, int value ] local card, mark, value = data[1], data[2], data[3] diff --git a/lua/core/room/abstract_room.lua b/lua/core/room/abstract_room.lua index 22292fa3c940a2fede442b96d605870ff7158e4e..32115f40079459f6078a6cda672d2d7628737678 100644 --- a/lua/core/room/abstract_room.lua +++ b/lua/core/room/abstract_room.lua @@ -59,6 +59,12 @@ function AbstractRoom:getBanner(name) return self.banners[name] end +--- 设置房间的当前行动者 +---@param player Player +function AbstractRoom:setCurrent(player) + self.current = player +end + function AbstractRoom:toJsonObject() local card_manager = CardManager.toJsonObject(self) @@ -70,6 +76,7 @@ function AbstractRoom:toJsonObject() return { card_manager = card_manager, circle = table.map(self.players, Util.IdMapper), + current = self.current, banners = self.banners, timeout = self.timeout, settings = self.settings, @@ -82,6 +89,7 @@ function AbstractRoom:loadJsonObject(o) CardManager.loadJsonObject(self, o.card_manager) -- 需要上层(目前是Client)自己根据circle添加玩家 + self.current = o.current self.banners = o.banners self.timeout = o.timeout self.settings = o.settings diff --git a/lua/server/events/gameflow.lua b/lua/server/events/gameflow.lua index 1324cbbdfc87051c266dde04edb974f7d985c90c..1903beae470e328f08cc7bce07a9d32ac4e12b86 100644 --- a/lua/server/events/gameflow.lua +++ b/lua/server/events/gameflow.lua @@ -114,7 +114,7 @@ function Round:action() if room.current.seat > nextTurnOwner.seat and not changingData.skipRoundPlus then break else - room.current = nextTurnOwner + room:setCurrent(nextTurnOwner) end end end diff --git a/lua/server/gamelogic.lua b/lua/server/gamelogic.lua index fd9c3ca1959c658126f2b34377881a9d8264c288..707e67e49c61a78ae8dcd571c65399d433161290 100644 --- a/lua/server/gamelogic.lua +++ b/lua/server/gamelogic.lua @@ -105,7 +105,7 @@ function GameLogic:chooseGenerals() local lord_generals = {} if lord ~= nil then - room.current = lord + room:setCurrent(lord) local generals = room:getNGenerals(generalNum) lord_generals = room:askForGeneral(lord, generals, n) local lord_general, deputy @@ -265,7 +265,7 @@ function GameLogic:action() execGameEvent(GameEvent.Round) if room.game_finished then break end if table.every(room.players, function(p) return p.dead and p.rest == 0 end) then room:gameOver("") end - room.current = room.players[1] + room:setCurrent(room.players[1]) end end diff --git a/lua/server/room.lua b/lua/server/room.lua index 42ff5e3d9e82bcf41bbd368fd4fb956d19d75a93..37dd552e1890689e8547c7327bc2daec6452d2da 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -481,6 +481,14 @@ function Room:setBanner(name, value) self:doBroadcastNotify("SetBanner", json.encode{ name, value }) end +--- 设置房间的当前行动者 +---@param player ServerPlayer +function Room:setCurrent(player) + AbstractRoom.setCurrent(self, player) + -- rawset(self, "current", player) + self:doBroadcastNotify("SetCurrent", json.encode{ player and player.id or nil }) +end + ---@param player ServerPlayer ---@param general string ---@param changeKingdom? boolean diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index dec1e1e04a3910f68e5883cf7f6f6f06bedbdfe9..d147fbf2d8d4e3ed1ec6b058e3fda0f153781caa 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -403,7 +403,7 @@ function ServerPlayer:gainAnExtraTurn(delay, skillName, turnData) } local current = room.current - room.current = self + room:setCurrent(self) room:addTableMark(self, "_extra_turn_count", skillName) @@ -415,7 +415,7 @@ function ServerPlayer:gainAnExtraTurn(delay, skillName, turnData) room:setPlayerMark(self, "_extra_turn_count", mark) end - room.current = current + room:setCurrent(current) end --- 当前是否处于额外的回合。 diff --git a/standard/init.lua b/standard/init.lua index 29fb2e4051e0783698d2e5657337299677a3ea50..ec78651501e1ec893bd81339ca7d8b07003a53f8 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -1131,7 +1131,7 @@ local role_getlogic = function() local lord_num = 3 if lord ~= nil then - room.current = lord + room:setCurrent(lord) local a1 = #room.general_pile local a2 = #room.players * generalNum if a1 < a2 then