diff --git a/Fk/Cheat/PlayerDetail.qml b/Fk/Cheat/PlayerDetail.qml index 1b99f0e1..7bc104c3 100644 --- a/Fk/Cheat/PlayerDetail.qml +++ b/Fk/Cheat/PlayerDetail.qml @@ -119,7 +119,7 @@ Flickable { const run = gamedata[2]; const winRate = (win / total) * 100; const runRate = (run / total) * 100; - playerGameData.text = total === 0 ? "Newbie" : "
" + Backend.translate("Win=%1 Run=%2 Total=%3").arg(winRate.toFixed(2)) + playerGameData.text = total === 0 ? Backend.translate("Newbie") : "
" + Backend.translate("Win=%1 Run=%2 Total=%3").arg(winRate.toFixed(2)) .arg(runRate.toFixed(2)).arg(total); } diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index 02122102..b97221ba 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -31,7 +31,15 @@ function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) if skill:bypassTimesCheck(player, self, scope, card, to) then return true end end card_name = card_name or card.trueName - return player:usedCardTimes(card_name, scope) < self:getMaxUseTime(player, scope, card, to) + return player:usedCardTimes(card_name, scope) < self:getMaxUseTime(player, scope, card, to) or + (player:getMark(MarkEnum.BypassTimesLimit) ~= 0 or + table.find(MarkEnum.TempMarkSuffix, function(s) + return player:getMark(MarkEnum.BypassTimesLimit .. s) ~= 0 + end)) or + (to:getMark(MarkEnum.BypassTimesLimitTo) ~= 0 or + table.find(MarkEnum.TempMarkSuffix, function(s) + return to:getMark(MarkEnum.BypassTimesLimitTo .. s) ~= 0 + end)) end function UsableSkill:withinDistanceLimit(player, isattack, card, to) @@ -39,7 +47,15 @@ function UsableSkill:withinDistanceLimit(player, isattack, card, to) for _, skill in ipairs(status_skills) do if skill:bypassDistancesCheck(player, self, card, to) then return true end end - return isattack and player:inMyAttackRange(to, self:getDistanceLimit(player, card, to)) or player:distanceTo(to) <= self:getDistanceLimit(player, card, to) + return isattack and player:inMyAttackRange(to, self:getDistanceLimit(player, card, to)) or player:distanceTo(to) <= self:getDistanceLimit(player, card, to) or + (player:getMark(MarkEnum.BypassDistancesLimit) ~= 0 or + table.find(MarkEnum.TempMarkSuffix, function(s) + return player:getMark(MarkEnum.BypassDistancesLimit .. s) ~= 0 + end)) or + (to:getMark(MarkEnum.BypassDistancesLimitTo) ~= 0 or + table.find(MarkEnum.TempMarkSuffix, function(s) + return to:getMark(MarkEnum.BypassDistancesLimitTo .. s) ~= 0 + end)) end return UsableSkill diff --git a/lua/server/mark_enum.lua b/lua/server/mark_enum.lua index ccb054be..d070ca02 100644 --- a/lua/server/mark_enum.lua +++ b/lua/server/mark_enum.lua @@ -7,7 +7,7 @@ MarkEnum.StraightToWake = "_straight_to_wake" ---@field SwithSkillPreName string @ 转换技状态标记前缀(整体为前缀+转换技技能) MarkEnum.SwithSkillPreName = "__switcher_" ----@field SwithSkillPreName string @ 转换技状态标记前缀(整体为前缀+转换技技能) +---@field QuestSkillPreName string @ 使命技状态标记前缀(整体为前缀+使命技技能) MarkEnum.QuestSkillPreName = "__questPre_" ---@field AddMaxCards string @ 增加标记值数量的手牌上限 @@ -19,10 +19,14 @@ MarkEnum.MinusMaxCards = "MinusMaxCards" ---@field AddMaxCards string @ 于本回合内减少标记值数量的手牌上限 MarkEnum.MinusMaxCardsInTurn = "MinusMaxCards-turn" ----@field BypassTimesLimit string @ 对其使用牌无次数限制,可带清除标记后缀 -MarkEnum.BypassTimesLimit = "bypasstimeslimit" ----@field BypassDistanceLimit string @ 对其使用牌无距离限制,可带清除标记后缀 -MarkEnum.BypassDistanceLimit = "bypassdistancelimit" +---@field BypassTimesLimit string @ 使用牌无次数限制,可带清除标记后缀 +MarkEnum.BypassTimesLimit = "BypassTimesLimit" +---@field BypassDistancesLimit string @ 使用牌无距离限制,可带清除标记后缀 +MarkEnum.BypassDistancesLimit = "BypassDistancesLimit" +---@field BypassTimesLimitTo string @ 对其使用牌无次数限制,可带清除标记后缀 +MarkEnum.BypassTimesLimitTo = "BypassTimesLimitTo" +---@field BypassDistancesLimitTo string @ 对其使用牌无距离限制,可带清除标记后缀 +MarkEnum.BypassDistancesLimitTo = "BypassDistancesLimitTo" ---@field UncompulsoryInvalidity string @ 非锁定技失效,可带清除标记后缀 MarkEnum.UncompulsoryInvalidity = "uncompulsoryInvalidity" diff --git a/lua/server/room.lua b/lua/server/room.lua index 2bf64f51..2a8a0725 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -1539,6 +1539,8 @@ end -- available extra_data: -- * must_targets: integer[] -- * exclusive_targets: integer[] +-- * bypass_distances: boolean +-- * bypass_times: boolean --- 询问玩家使用一张牌。 ---@param player ServerPlayer @ 要询问的玩家 ---@param card_name string @ 使用牌的牌名,若pattern指定了则可随意写,它影响的是烧条的提示信息 @@ -1566,6 +1568,14 @@ function Room:askForUseCard(player, card_name, pattern, prompt, cancelable, extr card_name = table.concat(splitedCardNames, ",") end + if extra_data then + if extra_data.bypass_distances then + player.room:setPlayerMark(player, MarkEnum.BypassDistancesLimit, 1) + end + if extra_data.bypass_times then + player.room:setPlayerMark(player, MarkEnum.BypassTimesLimit, 1) + end + end local command = "AskForUseCard" self:notifyMoveFocus(player, card_name) cancelable = (cancelable == nil) and true or cancelable @@ -1583,6 +1593,8 @@ function Room:askForUseCard(player, card_name, pattern, prompt, cancelable, extr self.logic:trigger(fk.AskForCardUse, player, askForUseCardData) if askForUseCardData.result and type(askForUseCardData.result) == 'table' then + player.room:setPlayerMark(player, MarkEnum.BypassDistancesLimit, 0) + player.room:setPlayerMark(player, MarkEnum.BypassTimesLimit, 0) return askForUseCardData.result else local data = {card_name, pattern, prompt, cancelable, extra_data} @@ -1592,9 +1604,13 @@ function Room:askForUseCard(player, card_name, pattern, prompt, cancelable, extr Fk.currentResponsePattern = nil if result ~= "" then + player.room:setPlayerMark(player, MarkEnum.BypassDistancesLimit, 0) + player.room:setPlayerMark(player, MarkEnum.BypassTimesLimit, 0) return self:handleUseCardReply(player, result) end end + player.room:setPlayerMark(player, MarkEnum.BypassDistancesLimit, 0) + player.room:setPlayerMark(player, MarkEnum.BypassTimesLimit, 0) return nil end diff --git a/packages/standard/aux_skills.lua b/packages/standard/aux_skills.lua index 2d07ccd0..587a3041 100644 --- a/packages/standard/aux_skills.lua +++ b/packages/standard/aux_skills.lua @@ -122,27 +122,6 @@ local uncompulsoryInvalidity = fk.CreateInvaliditySkill { end } -local noTimesLimit = fk.CreateTargetModSkill{ - name = "noTimesLimit", - global = true, - bypass_times = function(self, player, skill, scope, card, to) - return to:getMark(MarkEnum.BypassTimesLimit) ~= 0 or - table.find(MarkEnum.TempMarkSuffix, function(s) - return to:getMark(MarkEnum.BypassTimesLimit .. s) ~= 0 - end) - end -} - -local noDistanceLimit = fk.CreateAttackRangeSkill{ - name = "noDistanceLimit", - global = true, - within_func = function(self, player, to) - return to:getMark(MarkEnum.BypassDistanceLimit) ~= 0 or - table.find(MarkEnum.TempMarkSuffix, function(s) - return to:getMark(MarkEnum.BypassDistanceLimit .. s) ~= 0 - end) - end -} AuxSkills = { discardSkill, chooseCardsSkill, @@ -150,6 +129,4 @@ AuxSkills = { maxCardsSkill, choosePlayersToMoveCardInBoardSkill, uncompulsoryInvalidity, - noTimesLimit, - noDistanceLimit, } diff --git a/packages/standard_cards/init.lua b/packages/standard_cards/init.lua index 57583ccc..f99dd7ed 100644 --- a/packages/standard_cards/init.lua +++ b/packages/standard_cards/init.lua @@ -941,12 +941,8 @@ local bladeSkill = fk.CreateTriggerSkill{ end, on_cost = function(self, event, target, player, data) local room = player.room - room:setPlayerMark(target, MarkEnum.BypassDistanceLimit, 1) - room:setPlayerMark(target, MarkEnum.BypassTimesLimit, 1) local use = room:askForUseCard(player, "slash", nil, "#blade_slash:" .. target.id, - true, { must_targets = {target.id}, exclusive_targets = {target.id} }) - room:setPlayerMark(target, MarkEnum.BypassDistanceLimit, 0) - room:setPlayerMark(target, MarkEnum.BypassTimesLimit, 0) + true, { must_targets = {target.id}, exclusive_targets = {target.id}, bypass_distances = true, bypass_times = true }) if use then use.extraUse = true self.cost_data = use