From 3106c6fb1b1c91a196f35ee25d83974c3638ee67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 7 Dec 2024 01:42:04 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=87=BA=E9=99=90=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/core/skill_type/active.lua | 2 +- lua/core/skill_type/target_mod.lua | 58 ++++++++++++++++------------ lua/core/skill_type/usable_skill.lua | 16 +++++--- lua/fk_ex.lua | 20 +++++----- standard/init.lua | 35 ++++++++++------- 5 files changed, 75 insertions(+), 56 deletions(-) diff --git a/lua/core/skill_type/active.lua b/lua/core/skill_type/active.lua index eac2014..3fae6c3 100644 --- a/lua/core/skill_type/active.lua +++ b/lua/core/skill_type/active.lua @@ -30,7 +30,7 @@ end ---@param extra_data? UseExtraData @ 额外数据 ---@return bool function ActiveSkill:canUse(player, card, extra_data) - return self:isEffectable(player) + return self:isEffectable(player) and self:withinTimesLimit(player, Player.HistoryPhase, card) end -- 判断一张牌是否可被此技能选中 diff --git a/lua/core/skill_type/target_mod.lua b/lua/core/skill_type/target_mod.lua index 142cd75..a9e62ce 100644 --- a/lua/core/skill_type/target_mod.lua +++ b/lua/core/skill_type/target_mod.lua @@ -3,50 +3,60 @@ ---@class TargetModSkill : StatusSkill local TargetModSkill = StatusSkill:subclass("TargetModSkill") ----@param player Player ----@param card_skill ActiveSkill ----@param scope integer ----@param card Card +-- 使用某技能在某时间段无次数限制 +---@param player Player @ 使用者 +---@param card_skill ActiveSkill @ 目标技能 +---@param scope integer @ 考察时间段 +---@param card? Card @ 使用牌时的牌 +---@param to? Player @ 目标 function TargetModSkill:bypassTimesCheck(player, card_skill, scope, card, to) return false end ----@param player Player ----@param card_skill ActiveSkill ----@param scope integer ----@param card Card +-- 修改某技能在某时间段的次数上限 +---@param player Player @ 使用者 +---@param card_skill ActiveSkill @ 目标技能 +---@param scope integer @ 考察时间段 +---@param card? Card @ 使用牌时的牌 +---@param to? Player @ 目标 function TargetModSkill:getResidueNum(player, card_skill, scope, card, to) return 0 end ----@param player Player ----@param card_skill ActiveSkill ----@param card Card +-- 使用某技能无距离限制 +---@param player Player @ 使用者 +---@param card_skill ActiveSkill @ 目标技能 +---@param card? Card @ 使用牌时的牌 +---@param to? Player @ 目标 function TargetModSkill:bypassDistancesCheck(player, card_skill, card, to) return false end ----@param player Player ----@param card_skill ActiveSkill ----@param card Card +-- 修改某技能的距离限制 +---@param player Player @ 使用者 +---@param card_skill ActiveSkill @ 目标技能 +---@param card? Card @ 使用牌时的牌 +---@param to? Player @ 目标 function TargetModSkill:getDistanceLimit(player, card_skill, card, to) return 0 end ----@param player Player ----@param card_skill ActiveSkill ----@param card Card +-- 修改某技能的额定目标数 +---@param player Player @ 使用者 +---@param card_skill ActiveSkill @ 目标技能 +---@param card? Card @ 使用牌时的牌 function TargetModSkill:getExtraTargetNum(player, card_skill, card) return 0 end ----@param player Player ----@param to_select integer @ id of the target ----@param selected integer[] @ ids of selected targets ----@param selected_cards integer[] @ ids of selected cards ----@param card Card @ helper ----@param selectable boolean @can be selected ----@param extra_data? any @ extra_data +-- 技能描述 +---@param player Player @ 使用者 +---@param to_select integer @ 待选目标 +---@param selected integer[] @ 已选目标 +---@param selected_cards integer[] @ 已选牌 +---@param card? Card @ 使用牌时的牌 +---@param selectable boolean @ 待选目标是否可选 +---@param extra_data? any @ 额外信息 function TargetModSkill:getTargetTip(player, to_select, selected, selected_cards, card, selectable, extra_data) end return TargetModSkill diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index fa49e59..7ed0e1d 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -17,8 +17,8 @@ end -- 获得技能的最大使用次数 ---@param player Player @ 使用者 ---@param scope integer @ 查询历史范围(默认为回合) ----@param card Card @ 卡牌 ----@param to Player @ 目标 +---@param card? Card @ 卡牌 +---@param to? Player @ 目标 ---@return number @ 最大使用次数 function UsableSkill:getMaxUseTime(player, scope, card, to) scope = scope or Player.HistoryTurn @@ -40,7 +40,7 @@ end ---@param to any @ 目标 ---@return bool function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) - if to and to.dead then return false end + if to and to.dead then return false end -- 一般情况不会对死人使用技能的…… scope = scope or Player.HistoryTurn local status_skills = Fk:currentRoom().status_skills[TargetModSkill] or Util.DummyTable if not card then @@ -50,12 +50,16 @@ function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) card = Fk:cloneCard(self.name:sub(1, #self.name - 6)) end end - if not card_name and card then - card_name = card.trueName - end for _, skill in ipairs(status_skills) do if skill:bypassTimesCheck(player, self, scope, card, to) then return true end end + if not card_name then + if card then + card_name = card.trueName + else ---坏了,不是卡的技能 + return player:usedSkillTimes(self.name, scope) < self:getMaxUseTime(player, scope, card, to) + end + end local temp_suf = table.simpleClone(MarkEnum.TempMarkSuffix) local card_temp_suf = table.simpleClone(MarkEnum.CardTempMarkSuffix) diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index 90b66ca..0c73543 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -214,19 +214,19 @@ function fk.CreateTriggerSkill(spec) end ---@class ActiveSkillSpec: UsableSkillSpec ----@field public can_use? fun(self: ActiveSkill, player: Player, card: Card, extra_data: any): boolean? +---@field public can_use? fun(self: ActiveSkill, player: Player, card?: Card, extra_data: any): boolean? ---@field public card_filter? fun(self: ActiveSkill, to_select: integer, selected: integer[], selected_targets: integer[]): boolean? ----@field public target_filter? fun(self: ActiveSkill, to_select: integer, selected: integer[], selected_cards: integer[], card: Card, extra_data: any): boolean? +---@field public target_filter? fun(self: ActiveSkill, to_select: integer, selected: integer[], selected_cards: integer[], card?: Card, extra_data: any): boolean? ---@field public feasible? fun(self: ActiveSkill, selected: integer[], selected_cards: integer[]): boolean? ---@field public on_use? fun(self: ActiveSkill, room: Room, cardUseEvent: CardUseStruct | SkillEffectEvent): boolean? ---@field public on_action? fun(self: ActiveSkill, room: Room, cardUseEvent: CardUseStruct | SkillEffectEvent, finished: boolean): boolean? ---@field public about_to_effect? fun(self: ActiveSkill, room: Room, cardEffectEvent: CardEffectEvent | SkillEffectEvent): boolean? ---@field public on_effect? fun(self: ActiveSkill, room: Room, cardEffectEvent: CardEffectEvent | SkillEffectEvent): boolean? ---@field public on_nullified? fun(self: ActiveSkill, room: Room, cardEffectEvent: CardEffectEvent | SkillEffectEvent): boolean? ----@field public mod_target_filter? fun(self: ActiveSkill, to_select: integer, selected: integer[], user: integer, card: Card, distance_limited: boolean): boolean? +---@field public mod_target_filter? fun(self: ActiveSkill, to_select: integer, selected: integer[], user: integer, card?: Card, distance_limited: boolean): boolean? ---@field public prompt? string|fun(self: ActiveSkill, selected_cards: integer[], selected_targets: integer[]): string ---@field public interaction? any ----@field public target_tip? fun(self: ActiveSkill, to_select: integer, selected: integer[], selected_cards: integer[], card: Card, selectable: boolean, extra_data: any): string|TargetTipDataSpec? +---@field public target_tip? fun(self: ActiveSkill, to_select: integer, selected: integer[], selected_cards: integer[], card?: Card, selectable: boolean, extra_data: any): string|TargetTipDataSpec? ---@param spec ActiveSkillSpec ---@return ActiveSkill @@ -428,12 +428,12 @@ function fk.CreateMaxCardsSkill(spec) end ---@class TargetModSpec: StatusSkillSpec ----@field public bypass_times? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, scope: integer, card: Card, to: Player): boolean? ----@field public residue_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, scope: integer, card: Card, to: Player): number? ----@field public bypass_distances? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card: Card, to: Player): boolean? ----@field public distance_limit_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card: Card, to: Player): number? ----@field public extra_target_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card: Card): number? ----@field public target_tip_func? fun(self: TargetModSkill, player: Player, to_select: integer, selected: integer[], selected_cards: integer[], card: Card, selectable: boolean, extra_data: any): string|TargetTipDataSpec? +---@field public bypass_times? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, scope: integer, card?: Card, to?: Player): boolean? +---@field public residue_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, scope: integer, card?: Card, to?: Player): number? +---@field public bypass_distances? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card?: Card, to?: Player): boolean? +---@field public distance_limit_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card?: Card, to?: Player): number? +---@field public extra_target_func? fun(self: TargetModSkill, player: Player, skill: ActiveSkill, card?: Card): number? +---@field public target_tip_func? fun(self: TargetModSkill, player: Player, to_select: integer, selected: integer[], selected_cards: integer[], card?: Card, selectable: boolean, extra_data: any): string|TargetTipDataSpec? ---@param spec TargetModSpec ---@return TargetModSkill diff --git a/standard/init.lua b/standard/init.lua index ec78651..06ac8e0 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -636,9 +636,10 @@ local zhiheng = fk.CreateActiveSkill{ name = "zhiheng", prompt = "#zhiheng-active", anim_type = "drawcard", - can_use = function(self, player) - return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 - end, + max_phase_use_time = 1, + -- can_use = function(self, player) + -- return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 + -- end, target_num = 0, min_card_num = 1, card_filter = function(self, to_select) @@ -762,9 +763,10 @@ local yingzi = fk.CreateTriggerSkill{ local fanjian = fk.CreateActiveSkill{ name = "fanjian", prompt = "#fanjian-active", - can_use = function(self, player) - return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 - end, + max_phase_use_time = 1, + -- can_use = function(self, player) + -- return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 + -- end, card_filter = Util.FalseFunc, target_filter = function(self, to_select, selected) return #selected == 0 and to_select ~= Self.id @@ -938,9 +940,10 @@ local jieyin = fk.CreateActiveSkill{ name = "jieyin", prompt = "#jieyin-active", anim_type = "support", - can_use = function(self, player) - return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 - end, + max_phase_use_time = 1, + -- can_use = function(self, player) + -- return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 + -- end, card_filter = function(self, to_select, selected) return #selected < 2 and Fk:currentRoom():getCardArea(to_select) == Player.Hand and not Self:prohibitDiscard(Fk:getCardById(to_select)) end, @@ -980,9 +983,10 @@ local qingnang = fk.CreateActiveSkill{ name = "qingnang", prompt = "#qingnang-active", anim_type = "support", - can_use = function(self, player) - return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 - end, + max_phase_use_time = 1, + -- can_use = function(self, player) + -- return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 + -- end, card_filter = function(self, to_select, selected, targets) return #selected == 0 and Fk:currentRoom():getCardArea(to_select) == Player.Hand and not Self:prohibitDiscard(Fk:getCardById(to_select)) @@ -1066,9 +1070,10 @@ local lijian = fk.CreateActiveSkill{ name = "lijian", prompt = "#lijian-active", anim_type = "offensive", - can_use = function(self, player) - return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 - end, + max_phase_use_time = 1, + -- can_use = function(self, player) + -- return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 + -- end, card_filter = function(self, to_select, selected) return #selected == 0 and not Self:prohibitDiscard(Fk:getCardById(to_select)) end, -- Gitee From 20c610bc7388949e7a421649bd06618865e99626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 7 Dec 2024 01:46:01 +0800 Subject: [PATCH 2/5] fix --- lua/core/skill_type/usable_skill.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index 7ed0e1d..53d45f7 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -37,7 +37,7 @@ end ---@param scope integer @ 查询历史范围(默认为回合) ---@param card? Card @ 牌,若没有牌,则尝试制造一张虚拟牌 ---@param card_name? string @ 牌名 ----@param to any @ 目标 +---@param to? Player @ 目标 ---@return bool function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) if to and to.dead then return false end -- 一般情况不会对死人使用技能的…… -- Gitee From 178123b975a3a17354ef82b6fcd9bbf4908a0fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 7 Dec 2024 03:29:28 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=86=8D=E8=A7=81=E4=BA=86=EF=BC=8C9999?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/core/skill_type/usable_skill.lua | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index 53d45f7..88b32f9 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -11,7 +11,7 @@ function UsableSkill:initialize(name, frequency) frequency = frequency or Skill.NotFrequent Skill.initialize(self, name, frequency) - self.max_use_time = {9999, 9999, 9999, 9999} + self.max_use_time = { nil, nil, nil, nil } end -- 获得技能的最大使用次数 @@ -19,10 +19,11 @@ end ---@param scope integer @ 查询历史范围(默认为回合) ---@param card? Card @ 卡牌 ---@param to? Player @ 目标 ----@return number @ 最大使用次数 +---@return number? @ 最大使用次数,nil就是无限 function UsableSkill:getMaxUseTime(player, scope, card, to) scope = scope or Player.HistoryTurn local ret = self.max_use_time[scope] + if not ret then return nil end local status_skills = Fk:currentRoom().status_skills[TargetModSkill] or Util.DummyTable for _, skill in ipairs(status_skills) do local correct = skill:getResidueNum(player, self, scope, card, to) @@ -50,14 +51,18 @@ function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) card = Fk:cloneCard(self.name:sub(1, #self.name - 6)) end end + + local limit = self:getMaxUseTime(player, scope, card, to) + if not limit then return true end for _, skill in ipairs(status_skills) do if skill:bypassTimesCheck(player, self, scope, card, to) then return true end end + if not card_name then if card then card_name = card.trueName else ---坏了,不是卡的技能 - return player:usedSkillTimes(self.name, scope) < self:getMaxUseTime(player, scope, card, to) + return player:usedSkillTimes(self.name, scope) < limit end end @@ -81,7 +86,7 @@ function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) return false end - return player:usedCardTimes(card_name, scope) < self:getMaxUseTime(player, scope, card, to) or + return player:usedCardTimes(card_name, scope) < limit or hasMark(card, MarkEnum.BypassTimesLimit, card_temp_suf) or hasMark(player, MarkEnum.BypassTimesLimit, temp_suf) or hasMark(to, MarkEnum.BypassTimesLimitTo, temp_suf) -- Gitee From 2da696f1b56b54c8c2abb189a46761195adbd703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 7 Dec 2024 03:29:58 +0800 Subject: [PATCH 4/5] paoxiao fix --- standard/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standard/init.lua b/standard/init.lua index 06ac8e0..ee64f1c 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -467,7 +467,7 @@ local paoxiaoAudio = fk.CreateTriggerSkill{ can_refresh = function(self, event, target, player, data) return target == player and player:hasSkill(self) and data.card.trueName == "slash" and - player:usedCardTimes("slash") > 1 + player:usedCardTimes("slash", Player.HistoryPhase) > 1 end, on_refresh = function(self, event, target, player, data) player:broadcastSkillInvoke("paoxiao") -- Gitee From c1e6dd34a785f8233acf5b82eb677ced73b45673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 7 Dec 2024 03:46:41 +0800 Subject: [PATCH 5/5] fix --- lua/fk_ex.lua | 8 ++++---- standard/init.lua | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index 0c73543..c76ce7c 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -75,10 +75,10 @@ function fk.readUsableSpecToSkill(skill, spec) skill.max_card_num = spec.max_card_num or skill.max_card_num skill.card_num_table = spec.card_num_table or skill.card_num_table skill.max_use_time = { - spec.max_phase_use_time or 9999, - spec.max_turn_use_time or 9999, - spec.max_round_use_time or 9999, - spec.max_game_use_time or 9999, + spec.max_phase_use_time, + spec.max_turn_use_time, + spec.max_round_use_time, + spec.max_game_use_time, } skill.distance_limit = spec.distance_limit or skill.distance_limit skill.expand_pile = spec.expand_pile diff --git a/standard/init.lua b/standard/init.lua index ee64f1c..efbb371 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -482,7 +482,7 @@ local paoxiao = fk.CreateTargetModSkill{ name = "paoxiao", frequency = Skill.Compulsory, bypass_times = function(self, player, skill, scope) - if player:hasSkill(self) and skill.trueName == "slash_skill" + if player:hasSkill(self) and skill.trueName == "slash_skill" --- 究竟是【杀】的限制呢,还是【杀】技能的限制呢? and scope == Player.HistoryPhase then return true end -- Gitee