以下是使用无名杀Lua脚本实现“虚像”技能的代码: ```lua -- 定义技能名 local 虚像 = sgs.CreateTriggerSkill{ name = "虚像", -- 触发时机为目标结算前 events = {sgs.SlashTargetConfirmed, sgs.CardTargetConfirmed}, -- 触发条件 filter = function(self, event, room, target, data) local card = data:toCardUse() -- 仅当目标是自己,且牌为杀或伤害锦囊牌时触发 if target:objectName() == room:getSelf():objectName() and (card:isKindOf("Slash") or card:isKindOf("DamageCard")) then -- 检查自己是否有牌可弃置 return target:canDiscard("he", 1) end return false end, -- 触发效果 on_trigger = function(self, event, room, target, data) local card = data:toCardUse() -- 让玩家选择弃置一张牌 local discard = room:askForDiscard(target, self.name, 1, 1, false, false) if #discard > 0 then local discard_card = discard[1] -- 让玩家选择一名其他角色 local players = room:getOtherPlayers(target) local new_target = room:askForPlayerChosen(target, players, self.name, "请选择一名其他角色成为此牌目标") if new_target then -- 移除原目标 card:removeTarget(target) -- 添加新目标 card:addTarget(new_target) -- 记录弃置牌的花色 local suit = discard_card:getSuit() -- 监听伤害事件 local damage_listener = function(self, event, room, damage) if damage.to:objectName() == new_target:objectName() then -- 若新目标受伤,下个回合手牌上限减1 room:setPlayerProperty(new_target, "handcard_lim", new_target:getHandcardLim() - 1, self.name) -- 禁止使用或打出与弃置牌花色相同的牌 new_target:gainSkill("虚像_suit_restrict", true) new_target:tag[self.name .. "_suit"] = suit -- 移除监听 room:removePlayerSkill(new_target, "虚像_damage_listener") return false end return true end -- 注册伤害监听技能 local damage_skill = sgs.CreateTriggerSkill{ name = "虚像_damage_listener", events = {sgs.DamageInflicted}, on_trigger = damage_listener } new_target:gainSkill(damage_skill) end end return false end } -- 定义花色限制技能 local suit_restrict = sgs.CreateViewAsSkill{ name = "虚像_suit_restrict", view_filter = function(self, selected, to_select) local player = self:getOwner() local suit = player:tag["虚像_suit"] if to_select:getSuit() == suit then return false end return true end, view_as = function(self) return nil end } -- 回合结束时移除花色限制技能和手牌上限限制 local turn_end_listener = function(self, event, room, player) if player:hasSkill("虚像_suit_restrict") then player:loseSkill("虚像_suit_restrict") room:setPlayerProperty(player, "handcard_lim", player:getHandcardLim() + 1, self.name) player:tag["虚像_suit"] = nil end return true end local turn_end_skill = sgs.CreateTriggerSkill{ name = "虚像_turn_end_listener", events = {sgs.TurnEnd}, on_trigger = turn_end_listener } -- 注册技能 sgs.LoadSkill(虚像) sgs.LoadSkill(suit_restrict) sgs.LoadSkill(turn_end_skill) ``` 额外注意的逻辑点 1. 代码中假设玩家选择弃置牌和选择新目标时都会正常操作,如果玩家取消操作,代码逻辑可能无法按预期执行,需要根据实际情况添加相应的错误处理。 2. 手牌上限的修改是在伤害事件触发后进行的,要确保伤害事件的监听逻辑正确,避免出现伤害未触发但手牌上限已修改的情况。 3. 花色限制技能的移除是在回合结束时进行的,要保证回合结束事件的监听逻辑正确,避免花色限制技能未及时移除的问题。 [2025-07-16 19:55:10 | AI写代码神器 | 1093点数解答]