diff --git a/lua/core/player.lua b/lua/core/player.lua index f63651da531c26c8a867f3d06a3f24f6c67c4599..371582c8e80e510d4dd1654ce1d365029aa7bf66 100644 --- a/lua/core/player.lua +++ b/lua/core/player.lua @@ -221,6 +221,15 @@ function Player:getMark(mark) return mark end +--- 获取角色对应Mark并初始化为table +---@param mark string @ 标记 +---@return table +function Player:getTableMark(mark) + local mark = self.mark[mark] + if type(mark) == "table" then return table.simpleClone(mark) end + return {} +end + --- 获取角色有哪些Mark。 function Player:getMarkNames() local ret = {} diff --git a/lua/server/ai/random_ai.lua b/lua/server/ai/random_ai.lua index 6a5ca098476ba49a7c082b3bf72b400732298140..deea7ff5d0130923920a10a3139a0607a6d69b3f 100644 --- a/lua/server/ai/random_ai.lua +++ b/lua/server/ai/random_ai.lua @@ -17,7 +17,8 @@ function RandomAI:useActiveSkill(skill, card) filter_func = Util.FalseFunc end - if self.command == "PlayCard" and (not skill:canUse(player, card) or player:prohibitUse(card)) then + if self.command == "PlayCard" and card and card.class and card:isInstanceOf(Card) + and (not skill:canUse(player, card) or player:prohibitUse(card)) then return "" end diff --git a/lua/server/events/gameflow.lua b/lua/server/events/gameflow.lua index 68b10c452cae72a92a696ac9e8cc3e12d3e2992d..4e6c2b7ff14f9d2ab72b5b9f0558d9b922ae4df2 100644 --- a/lua/server/events/gameflow.lua +++ b/lua/server/events/gameflow.lua @@ -284,6 +284,8 @@ function Turn:clear() logic:trigger(fk.AfterTurnEnd, current, nil, self.interrupted) current.phase = Player.NotActive + room:setTag("endTurn", false) + for _, p in ipairs(room.players) do p:setCardUseHistory("", 0, Player.HistoryTurn) p:setSkillUseHistory("", 0, Player.HistoryTurn) @@ -332,6 +334,7 @@ function Phase:main() [Player.Judge] = function() local cards = player:getCardIds(Player.Judge) while #cards > 0 do + if player._phase_end then break end local cid = table.remove(cards) if not cid then return end local card = player:removeVirtualEquip(cid) @@ -359,11 +362,12 @@ function Phase:main() n = 2 } room.logic:trigger(fk.DrawNCards, player, data) - room:drawCards(player, data.n, "game_rule") + if not player._phase_end then + room:drawCards(player, data.n, "game_rule") + end room.logic:trigger(fk.AfterDrawNCards, player, data) end, [Player.Play] = function() - player._play_phase_end = false while not player.dead do logic:trigger(fk.StartPlayCard, player, nil, true) room:notifyMoveFocus(player, "PlayCard") @@ -375,13 +379,13 @@ function Phase:main() room:useCard(useResult) end - if player._play_phase_end then - player._play_phase_end = false + if player._phase_end then break end end end, [Player.Discard] = function() + if player._phase_end then return end local discardNum = #table.filter( player:getCardIds(Player.Hand), function(id) local card = Fk:getCardById(id) @@ -423,6 +427,7 @@ function Phase:clear() room:setPlayerMark(p, name, 0) end end + p._phase_end = false end for cid, cmark in pairs(room.card_marks) do diff --git a/lua/server/room.lua b/lua/server/room.lua index 6203ec8156fcdab8f3b5fcff5ec3630ac8405ca8..d0580f9cdda31c3f913a527e23cab1fbd73bca4d 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -4232,4 +4232,10 @@ function Room:setPlayerRest(player, roundNum) self:broadcastProperty(player, "rest") end +--- 结束当前回合(不会终止结算) +function Room:endTurn() + self.current._phase_end = true + self:setTag("endTurn", true) +end + return Room diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index 5e35ae525502930f395d4862e9d4fc948e180eb8..fed16201fdc7163a4a69cb8acfda341242a9133c 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -479,7 +479,7 @@ function ServerPlayer:play(phase_table) end for i = 1, #phases do - if self.dead then + if self.dead or room:getTag("endTurn") or phases[i] == nil then self:changePhase(self.phase, Player.NotActive) break end @@ -540,10 +540,17 @@ end --- 当进行到出牌阶段空闲点时,结束出牌阶段。 function ServerPlayer:endPlayPhase() - self._play_phase_end = true + if self.phase == Player.Play then + self._phase_end = true + end -- TODO: send log end +--- 结束当前阶段。 +function ServerPlayer:endCurrentPhase() + self._phase_end = true +end + --- 获得一个额外回合 ---@param delay? boolean ---@param skillName? string