以下是为无名杀编写的"渐专"技能代码: ```lua local jianzhuan = { name = "jianzhuan", frequency = "locked", events = {sgs.EventPhaseEnd}, on_trigger = function(self, event, player, data) if event == sgs.EventPhaseEnd and player:getPhase() == sgs.Player_Finish then local room = player:getRoom() local x = player:getMark("@zhuan") + 1 local usedOptions = player:getMark("jianzhuan_used") if usedOptions == 15 then -- 二进制1111表示四个选项都使用过 player:addMark("@zhuan") room:setPlayerMark(player, "jianzhuan_used", 0) room:sendCompulsoryTriggerLog(player, self:objectName()) room:notifySkillInvoked(player, self:objectName()) else room:setPlayerMark(player, "jianzhuan_used", 0) end end end, can_preshow = true } local jianzhuanVS = sgs.CreateViewAsSkill{ name = "jianzhuan", n = 999, view_filter = function(self, selected, to_select) return true end, view_as = function(self, cards) return sgs.Sanguosha:cloneCard("slash", sgs.Card_NoSuit, 0) end, enabled_at_play = function(self, player) return player:getMark("jianzhuan_used") < 15 end } local jianzhuanUse = sgs.CreateTriggerSkill{ name = "#jianzhuan_use", events = {sgs.CardUsed}, frequency = "compulsory", on_trigger = function(self, event, player, data) local use = data:toCardUse() if use.card:isKindOf("Slash") and use.card:getSkillName() == "jianzhuan" then local room = player:getRoom() local choices = {} local x = player:getMark("@zhuan") + 1 local used = player:getMark("jianzhuan_used") if bit32.band(used, 1) == 0 then table.insert(choices, "draw:"..x) end if bit32.band(used, 2) == 0 then table.insert(choices, "discard:"..x) end if bit32.band(used, 4) == 0 then table.insert(choices, "recast:"..x) end if bit32.band(used, 8) == 0 then table.insert(choices, "letdraw:"..x) end local choice = room:askForChoice(player, "jianzhuan", table.concat(choices, "+")) local option, num = string.match(choice, "(%a+):(%d+)") num = tonumber(num) if option == "draw" then player:drawCards(num, "jianzhuan") room:addPlayerMark(player, "jianzhuan_used", 1) elseif option == "discard" then local target = room:askForPlayerChosen(player, room:getOtherPlayers(player), "jianzhuan", "@jianzhuan-discard:"..num, true) if target then room:askForDiscard(target, "jianzhuan", num, num, false, true) end room:addPlayerMark(player, "jianzhuan_used", 2) elseif option == "recast" then local cards = room:askForExchange(player, "jianzhuan", num, num, true, "@jianzhuan-recast:"..num) if cards then room:throwCard(cards, player) player:drawCards(num, "jianzhuan") end room:addPlayerMark(player, "jianzhuan_used", 4) elseif option == "letdraw" then local target = room:askForPlayerChosen(player, room:getOtherPlayers(player), "jianzhuan", "@jianzhuan-letdraw:"..num, true) if target then target:drawCards(num, "jianzhuan") end room:addPlayerMark(player, "jianzhuan_used", 8) end end return false end } extension:insertRelatedSkills("jianzhuan", "#jianzhuan_use") ``` 代码逻辑说明: 1. 使用二进制标记记录已使用的选项(1=摸牌,2=弃牌,4=重铸,8=令摸牌) 2. 每回合结束时检查是否使用了全部四个选项,是则增加"专"标记 3. x值为"专"标记数+1 4. 通过虚拟卡牌触发技能选择界面 三条额外需要注意的逻辑点: 1. 二进制标记组合15(1111)表示四个选项都已使用 2. 每回合结束时重置使用记录 3. 技能选项的可用性取决于当前回合是否已使用过该选项 [2025-05-02 10:44:46 | AI写代码神器 | 1155点数解答]