diff --git a/lua/client/client_util.lua b/lua/client/client_util.lua index 5c1b97fbd0700df05e07a8f04763e06229acb555..265c4157978eddfe300c0616b2c9219afa6200e4 100644 --- a/lua/client/client_util.lua +++ b/lua/client/client_util.lua @@ -416,26 +416,8 @@ end function GetSkillStatus(skill_name) local player = Self local skill = Fk.skills[skill_name] - local locked = not skill:isEffectable(player) - if not locked then - for mark, value in pairs(player.mark) do - if mark == MarkEnum.InvalidSkills then - if table.contains(value, skill_name) then - locked = true - break - end - elseif mark:startsWith(MarkEnum.InvalidSkills .. "-") and table.contains(value, skill_name) then - for _, suffix in ipairs(MarkEnum.TempMarkSuffix) do - if mark:find(suffix, 1, true) then - locked = true - break - end - end - end - end - end return { - locked = locked, ---@type boolean + locked = not skill:isEffectable(player), times = skill:getTimes() } end diff --git a/lua/core/player.lua b/lua/core/player.lua index e9fd0e9a8cadfe4c2b171a4a7d7f74882a2557bf..a9f167bb028c33c45f960d33448f284b72a71dbd 100644 --- a/lua/core/player.lua +++ b/lua/core/player.lua @@ -671,7 +671,7 @@ end --- 设定玩家使用特定牌的历史次数。 ---@param cardName string @ 牌名 ----@param num integer @ 次数 +---@param num? integer @ 次数 默认0 ---@param scope? integer @ 历史范围 全为nil意为清空 function Player:setCardUseHistory(cardName, num, scope) if cardName == "" and num == nil and scope == nil then diff --git a/lua/core/skill.lua b/lua/core/skill.lua index 1b6d7e82ef3cca3681d7d165ae145f74c6430267..532adec47c43484b591286ad542e7633c76e3570 100644 --- a/lua/core/skill.lua +++ b/lua/core/skill.lua @@ -124,6 +124,20 @@ function Skill:isEffectable(player) end end + for mark, value in pairs(player.mark) do -- 耦合 MarkEnum.InvalidSkills ! + if mark == MarkEnum.InvalidSkills then + if table.contains(value, self.name) then + return false + end + elseif mark:startsWith(MarkEnum.InvalidSkills .. "-") and table.contains(value, self.name) then + for _, suffix in ipairs(MarkEnum.TempMarkSuffix) do + if mark:find(suffix, 1, true) then + return false + end + end + end + end + return true end diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index 0c48510a1d01874eb615d3243012408efb03fd0d..fa49e59c7b087133d003d384cc18661d01e9f4f2 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -16,7 +16,7 @@ end -- 获得技能的最大使用次数 ---@param player Player @ 使用者 ----@param scope integer @ 考察时机(默认为回合) +---@param scope integer @ 查询历史范围(默认为回合) ---@param card Card @ 卡牌 ---@param to Player @ 目标 ---@return number @ 最大使用次数 @@ -34,7 +34,7 @@ end -- 判断一个角色是否在技能的次数限制内 ---@param player Player @ 使用者 ----@param scope integer @ 考察时机(默认为回合) +---@param scope integer @ 查询历史范围(默认为回合) ---@param card? Card @ 牌,若没有牌,则尝试制造一张虚拟牌 ---@param card_name? string @ 牌名 ---@param to any @ 目标 diff --git a/lua/server/events/skill.lua b/lua/server/events/skill.lua index 95ce3a8dd155ffdeedb251a80e8e6b85f870ed2f..62a8ce53d7352e2e7beecf41f60be4fb9223a07d 100644 --- a/lua/server/events/skill.lua +++ b/lua/server/events/skill.lua @@ -137,6 +137,11 @@ function SkillEventWrappers:handleAddLoseSkills(player, skill_names, source_skil -- table.insertTableIfNeed(lost_piles, player:getPile(pile_name)) -- end -- end + + self:validateSkill(player, actual_skill) + for _, suf in ipairs(MarkEnum.TempMarkSuffix) do + self:validateSkill(player, actual_skill, suf) + end end end else diff --git a/lua/server/mark_enum.lua b/lua/server/mark_enum.lua index a74aca9990daab6120bb20b89c9ab5098eab4d42..d414ddd207153ec85c2766d10225b0a5ab14214a 100644 --- a/lua/server/mark_enum.lua +++ b/lua/server/mark_enum.lua @@ -29,7 +29,7 @@ MarkEnum.BypassTimesLimitTo = "BypassTimesLimitTo" MarkEnum.BypassDistancesLimitTo = "BypassDistancesLimitTo" ---非锁定技失效 MarkEnum.UncompulsoryInvalidity = "UncompulsoryInvalidity" ----失效技能表(用``Room:addTableMark``和``Room:removeTableMark``控制) +---失效技能表(用``Room:invalidateSkill``和``Room:validateSkill``控制) MarkEnum.InvalidSkills = "InvalidSkills" ---不可明置(值为表,m - 主将, d - 副将) MarkEnum.RevealProhibited = "RevealProhibited" diff --git a/lua/server/room.lua b/lua/server/room.lua index f7de92c9f76e2bb7a0cbb12b1d9dd956b9b40ce1..ec525590a1e6be1a80c2b9cd1f6a7848c1ab8483 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -2977,5 +2977,22 @@ function Room:removeTableMark(sth, mark, value) end end +--- 无效化技能 +---@param player ServerPlayer +---@param skill_name string +---@param temp? string @ 作用范围,``-round`` ``-turn`` ``-phase``或不填 +function Room:invalidateSkill(player, skill_name, temp) + temp = temp and temp or "" + self:addTableMark(player, MarkEnum.InvalidSkills .. temp, skill_name) +end + +--- 有效化技能 +---@param player ServerPlayer +---@param skill_name string +---@param temp? string @ 作用范围,``-round`` ``-turn`` ``-phase``或不填 +function Room:validateSkill(player, skill_name, temp) + temp = temp and temp or "" + self:removeTableMark(player, MarkEnum.InvalidSkills .. temp, skill_name) +end return Room