diff --git a/lua/server/events/usecard.lua b/lua/server/events/usecard.lua index d73f93d0..e1e0a0a8 100644 --- a/lua/server/events/usecard.lua +++ b/lua/server/events/usecard.lua @@ -164,6 +164,20 @@ GameEvent.functions[GameEvent.UseCard] = function(self) local room = self.room local logic = room.logic + if type(cardUseEvent.attachedSkillAndUser) == "table" then + local attachedSkillAndUser = table.simpleClone(cardUseEvent.attachedSkillAndUser) + self:addExitFunc(function() + if + type(attachedSkillAndUser) == "table" and + Fk.skills[attachedSkillAndUser.skillName] and + Fk.skills[attachedSkillAndUser.skillName].afterUse + then + Fk.skills[attachedSkillAndUser.skillName]:afterUse(room:getPlayerById(attachedSkillAndUser.user), cardUseEvent) + end + end) + cardUseEvent.attachedSkillAndUser = nil + end + if cardUseEvent.card.skill then cardUseEvent.card.skill:onUse(room, cardUseEvent) end diff --git a/lua/server/room.lua b/lua/server/room.lua index 96c2e118..d194dd6d 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -2423,23 +2423,7 @@ end ---@param cardUseEvent CardUseStruct @ 使用数据 ---@return boolean function Room:useCard(cardUseEvent) - local attachedSkillAndUser - if type(cardUseEvent.attachedSkillAndUser) == "table" then - attachedSkillAndUser = table.simpleClone(cardUseEvent.attachedSkillAndUser) - cardUseEvent.attachedSkillAndUser = nil - end - - local ret = execGameEvent(GameEvent.UseCard, cardUseEvent) - - if - type(attachedSkillAndUser) == "table" and - Fk.skills[attachedSkillAndUser.skillName] and - Fk.skills[attachedSkillAndUser.skillName].afterUse - then - Fk.skills[attachedSkillAndUser.skillName]:afterUse(self:getPlayerById(attachedSkillAndUser.user), cardUseEvent) - end - - return ret + return execGameEvent(GameEvent.UseCard, cardUseEvent) end ---@param room Room @@ -2686,6 +2670,7 @@ function Room:doCardUseEffect(cardUseEvent) for i = 1, (cardUseEvent.additionalEffect or 0) + 1 do if #TargetGroup:getRealTargets(cardUseEvent.tos) > 0 and cardUseEvent.card.skill.onAction then cardUseEvent.card.skill:onAction(self, cardUseEvent) + cardEffectEvent.extra_data = cardUseEvent.extra_data end -- Else: do effect to all targets diff --git a/packages/standard_cards/init.lua b/packages/standard_cards/init.lua index c0559fcf..9374e9a6 100644 --- a/packages/standard_cards/init.lua +++ b/packages/standard_cards/init.lua @@ -21,7 +21,7 @@ local slashSkill = fk.CreateActiveSkill{ max_phase_use_time = 1, target_num = 1, can_use = function(self, player, card, extra_data) - return (extra_data and extra_data.bypass_times) or + return (extra_data and extra_data.bypass_times) or player.phase ~= Player.Play or table.find(Fk:currentRoom().alive_players, function(p) return self:withinTimesLimit(player, Player.HistoryPhase, card, "slash", p) end) @@ -36,7 +36,12 @@ local slashSkill = fk.CreateActiveSkill{ if #selected < self:getMaxTargetNum(Self, card) then local player = Fk:currentRoom():getPlayerById(to_select) return self:modTargetFilter(to_select, selected, Self.id, card, count_distances) and - (#selected > 0 or (extra_data and extra_data.bypass_times) or self:withinTimesLimit(Self, Player.HistoryPhase, card, "slash", player)) + ( + #selected > 0 or + Self.phase ~= Player.Play or + (extra_data and extra_data.bypass_times) or + self:withinTimesLimit(Self, Player.HistoryPhase, card, "slash", player) + ) end end, on_effect = function(self, room, effect) @@ -660,60 +665,6 @@ local amazingGraceSkill = fk.CreateActiveSkill{ end } -local amazingGraceAction = fk.CreateTriggerSkill{ - name = "amazing_grace_action", - global = true, - priority = { [fk.BeforeCardUseEffect] = 0, [fk.CardUseFinished] = 10 }, -- game rule - events = { fk.BeforeCardUseEffect, fk.CardUseFinished }, - can_trigger = function(self, event, target, player, data) - local frameFilled = data.extra_data and data.extra_data.AGFilled - if event == fk.BeforeCardUseEffect then - return data.card.trueName == 'amazing_grace' and not frameFilled - else - return frameFilled - end - end, - on_trigger = function(self, event, target, player, data) - local room = player.room - if event == fk.BeforeCardUseEffect then - local toDisplay = room:getNCards(#TargetGroup:getRealTargets(data.tos)) - room:moveCards({ - ids = toDisplay, - toArea = Card.Processing, - moveReason = fk.ReasonPut, - }) - - table.forEach(room.players, function(p) - room:fillAG(p, toDisplay) - end) - - data.extra_data = data.extra_data or {} - data.extra_data.AGFilled = toDisplay - else - table.forEach(room.players, function(p) - room:closeAG(p) - end) - - if data.extra_data and data.extra_data.AGFilled then - local toDiscard = table.filter(data.extra_data.AGFilled, function(id) - return room:getCardArea(id) == Card.Processing - end) - - if #toDiscard > 0 then - room:moveCards({ - ids = toDiscard, - toArea = Card.DiscardPile, - moveReason = fk.ReasonPutIntoDiscardPile, - }) - end - end - - data.extra_data.AGFilled = nil - end - end, -} -Fk:addSkill(amazingGraceAction) - local amazingGrace = fk.CreateTrickCard{ name = "amazing_grace", suit = Card.Heart,