From e406f9b8b42966af125e576b6c130ae1bd810238 Mon Sep 17 00:00:00 2001 From: RalphR <1715333874@qq.com> Date: Thu, 23 Mar 2023 23:31:35 +0800 Subject: [PATCH 1/4] new: guozhao, zhujianping, caojinyu new function: getCardByPattern --- image/generals/caojinyu.jpg | Bin 0 -> 18530 bytes image/generals/guozhao.jpg | Bin 0 -> 19047 bytes image/generals/zhujianping.jpg | Bin 0 -> 14015 bytes init.lua | 677 ++++++++++++++++++++++++++++++--- 4 files changed, 632 insertions(+), 45 deletions(-) create mode 100644 image/generals/caojinyu.jpg create mode 100644 image/generals/guozhao.jpg create mode 100644 image/generals/zhujianping.jpg diff --git a/image/generals/caojinyu.jpg b/image/generals/caojinyu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5f68ae160e4ea65bbdb352e00530f1f86192253 GIT binary patch literal 18530 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 literal 0 HcmV?d00001 diff --git a/image/generals/zhujianping.jpg b/image/generals/zhujianping.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e253a8fc0ed82a0f77d2f06f8ac761f601e68ac GIT binary patch literal 14015 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 #data.to:getCardIds(Player.Hand) and - #player:getCardIds(Player.Equip) >= #data.to:getCardIds(Player.Equip) + #player:getCardIds(Player.Equip) >= #data.to:getCardIds(Player.Equip) and + not data.chain end, on_refresh = function(self, event, target, player, data) local room = player.room @@ -423,6 +434,7 @@ local m_1v2_getLogic = function() function m_1v2_logic:chooseGenerals() local room = self.room + local generalNum = room.settings.generalNum local function setPlayerGeneral(player, general) if Fk.generals[general] == nil then return end player.general = general @@ -434,14 +446,13 @@ local m_1v2_getLogic = function() local lord = room:getLord() room.current = lord local nonlord = room.players - local generals = Fk:getGeneralsRandomly(#nonlord * 3) + local generals = Fk:getGeneralsRandomly(#nonlord * generalNum) table.shuffle(generals) for _, p in ipairs(nonlord) do - local arg = { - (table.remove(generals, 1)).name, - (table.remove(generals, 1)).name, - (table.remove(generals, 1)).name, - } + local arg = {} + for i = 1, generalNum do + table.insert(arg, table.remove(generals, 1).name) + end p.request_data = json.encode(arg) p.default_reply = arg[1] end @@ -551,6 +562,26 @@ Fk:loadTranslationTable{ ["#m_1v2_rule"] = "挑选遗产", ["m_1v2_draw2"] = "摸两张牌", ["m_1v2_heal"] = "回复1点体力", + + [":m_1v2_mode"] = [[ +# 欢乐斗地主模式简介 + +___ + +总体规则类似身份局。游戏由三人进行,一人扮演地主(主公),其他两人扮演农民(反贼)。 + +地主增加一点体力上限和体力,且拥有以下额外技能: + +- **飞扬**:判定阶段开始时,你可以弃置两张手牌并弃置自己判定区内的一张牌。 + +- **跋扈**:锁定技,准备阶段,你摸一张牌;出牌阶段,你可以多使用一张杀。 + +当农民被击杀后,另一名农民可以选择:摸两张牌,或者回复一点体力。 + +*击杀农民的人没有摸三张牌的奖励。* + +胜利规则与身份局一致。 + ]], } local dujin = fk.CreateTriggerSkill{ @@ -680,25 +711,14 @@ local qinzheng = fk.CreateTriggerSkill{ name = "qinzheng", anim_type = "drawcard", frequency = Skill.Compulsory, - events = {fk.AfterCardUseDeclared, fk.CardResponding}, - on_trigger = function(self, event, target, player, data) - self.cancel_cost = false - local num = player:getMark("@qinzheng") - local skillNum = {} - - if num % 3 == 0 then table.insert(skillNum, 3) end - if num % 5 == 0 then table.insert(skillNum, 5) end - if num % 8 == 0 then table.insert(skillNum, 8) end - - for _, i in ipairs(skillNum) do - self.cost_data = i - self:doCost(event, target, player, data) - end - end, + events = {fk.CardUsing, fk.CardResponding}, can_trigger = function(self, event, target, player, data) - if player:hasSkill(self.name) and target == player then - return self.cost_data == 3 or self.cost_data == 5 or self.cost_data == 8 - end + return + target == player and + player:hasSkill(self.name) and + not table.every({ 3, 5, 8 }, function(num) + return player:getMark("@" .. self.name) % num ~= 0 + end) end, on_use = function(self, event, player, target, data) local randCard = function(cardName) @@ -723,34 +743,44 @@ local qinzheng = fk.CreateTriggerSkill{ return nil end - - if self.cost_data == 3 then - local card = randCard({"slash", "jink"}) - - if card ~= nil then - player.room:obtainCard(player.id, card, true, fk.ReasonDraw) - end - elseif self.cost_data == 5 then - local card = randCard({"peach", "analeptic"}) - - if card ~= nil then - player.room:obtainCard(player.id, card, true, fk.ReasonDraw) + + local loopList = table.filter({ 3, 5, 8 }, function(num) + return player:getMark("@" .. self.name) % num == 0 + end) + + local toObtain = {} + for _, count in ipairs(loopList) do + local cardList = {"slash", "jink"} + if count == 5 then + cardList = {"peach", "analeptic"} + elseif count == 8 then + cardList = {"ex_nihilo", "duel"} end - else - local card = randCard({"ex_nihilo", "duel"}) - - if card ~= nil then - player.room:obtainCard(player.id, card, true, fk.ReasonDraw) + + local randomCard = randCard(cardList) + if randomCard then + table.insert(toObtain, randomCard.id) end end + + if #toObtain > 0 then + player.room:moveCards({ + ids = toObtain, + to = player.id, + toArea = Player.Hand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end end, - refresh_events = {fk.AfterCardUseDeclared, fk.CardResponding}, + refresh_events = {fk.PreCardUse, fk.PreCardRespond}, can_refresh = function(self, event, target, player, data) return player:hasSkill(self.name) and target == player end, on_refresh = function(self, event, target, player, data) - player.room:addPlayerMark(player, "@qinzheng", 1) + player.room:addPlayerMark(player, "@" .. self.name, 1) end, } @@ -764,5 +794,562 @@ Fk:loadTranslationTable{ ["@qinzheng"] = "勤政", } +local lijue = General(extension, "lijue", "qun", 4, 6) +Fk:loadTranslationTable{ + ["lijue"] = "李傕", +} + +local langxi = fk.CreateTriggerSkill{ + name = "langxi", + anim_type = "offensive", + events = { fk.EventPhaseStart }, + can_trigger = function(self, event, target, player, data) + return + target == player and + player:hasSkill(self.name) and + player.phase == Player.Start and + not table.every(player.room:getOtherPlayers(player), function(p) + return p.hp > player.hp + end) + end, + on_cost = function(self, event, target, player, data) + local room = player.room + local target = room:askForChoosePlayers( + player, + table.map( + table.filter(room:getOtherPlayers(player), function(p) + return p.hp <= player.hp + end), + function(p) + return p.id + end + ), + 1, + 1, + "#langxi-ask", + self.name + ) + + if #target > 0 then + self.cost_data = target[1] + return true + end + + return false + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:damage({ + from = player, + to = room:getPlayerById(self.cost_data), + damage = math.random(0, 2), + damageType = fk.NormalDamage, + skillName = self.name, + }) + end, +} +Fk:loadTranslationTable{ + ["langxi"] = "狼袭", + [":langxi"] = "准备阶段开始时,你可以对一名体力值不大于你的其他角色随机造成0~2点伤害。", + ["#langxi-ask"] = "狼袭:请选择一名体力值不大于你的其他角色,对其随机造成0~2点伤害", +} +lijue:addSkill(langxi) + +local yisuan = fk.CreateTriggerSkill{ + name = "yisuan", + anim_type = "drawcard", + events = { fk.CardUseFinished }, + can_trigger = function(self, event, target, player, data) + return + target == player and + player:hasSkill(self.name) and + player.phase == Player.Play and + player:usedSkillTimes(self.name) < 1 and + data.card.type == Card.TypeTrick and + data.card.sub_type ~= Card.SubtypeDelayedTrick and + player.room:getCardArea(data.card) == Card.Processing + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:changeMaxHp(player, -1) + room:obtainCard(player.id, data.card, true, fk.ReasonPrey) + end, +} +Fk:loadTranslationTable{ + ["yisuan"] = "亦算", + [":yisuan"] = "每阶段限一次,当你于出牌阶段内使用普通锦囊牌结算结束后,你可以减1点体力上限,然后获得此牌。", +} +lijue:addSkill(yisuan) + +local ex__huanggai = General(extension, "ex__huanggai", "wu", 4) +local ex__kurou = fk.CreateActiveSkill{ + name = "ex__kurou", + anim_type = "negative", + can_use = function(self, player) + return player:usedSkillTimes(self.name) == 0 + end, + target_num = 0, + card_num = 1, + on_use = function(self, room, effect) + local from = room:getPlayerById(effect.from) + room:throwCard(effect.cards, self.name, from) + room:loseHp(from, 1, self.name) + end +} +ex__huanggai:addSkill(ex__kurou) +local zhaxiangBuff = fk.CreateTargetModSkill{ + name = "#zhaxiangBuff", + residue_func = function(self, player, skill, scope) + if skill.trueName == "slash_skill" and scope == Player.HistoryPhase then + return player.phase ~= Player.NotActive and player:usedSkillTimes("zhaxiang") + end + end, +} +local zhaxiangHit = fk.CreateTriggerSkill{ + name = "#zhaxiangHit", + mute = true, + frequency = Skill.Compulsory, + events = {fk.TargetSpecified}, + can_trigger = function(self, event, target, player, data) + return target == player and player:hasSkill(self.name) and + data.card.trueName == "slash" and data.card.color == Card.Red and + player.phase ~= Player.NotActive and player:usedSkillTimes("zhaxiang") > 0 + end, + on_use = function(self, event, target, player, data) + data.disresponsive = true + end, +} +local zhaxiang = fk.CreateTriggerSkill{ + name = "zhaxiang", + anim_type = "drawcard", + frequency = Skill.Compulsory, + events = {fk.HpLost}, + on_trigger = function(self, event, target, player, data) + for i = 1, data.num do + self:doCost(event, target, player, data) + end + end, + on_use = function(self, event, target, player, data) + player:drawCards(3) + end, +} +zhaxiang:addRelatedSkill(zhaxiangBuff) +zhaxiang:addRelatedSkill(zhaxiangHit) +ex__huanggai:addSkill(zhaxiang) +Fk:loadTranslationTable{ + ["ex__huanggai"] = "界黄盖", + ["ex__kurou"] = "苦肉", + [":ex__kurou"] = "出牌阶段限一次,你可以弃置一张牌并失去一点体力。", + ["zhaxiang"] = "诈降", + [":zhaxiang"] = "锁定技,每当你失去1点体力,你摸三张牌,若这是你回合内,你可以多使用一张杀且红色的杀不可闪避。", + ["#zhaxiangHit"] = "诈降", +} + + +function getCardByPattern(room, pattern, fromPiles) --TODO: move this! + pattern = pattern or "." + fromPiles = room.draw_pile + + local cards = {} + for i = 1, #fromPiles, 1 do + local card = Fk:getCardById(fromPiles[i]) + if card:matchPattern(pattern) then + table.insertIfNeed(cards, fromPiles[i]) + end + end + if #cards > 0 then + return(cards[math.random(1, #cards)]) + else + return nil + end +end + + +local guozhao = General(extension, "guozhao", "wei", 3, 3, General.Female) +local pianchong = fk.CreateTriggerSkill{ + name = "pianchong", + anim_type = "drawcard", + events = {fk.EventPhaseStart}, + can_trigger = function(self, event, target, player, data) + return target == player and player:hasSkill(self.name) and player.phase == Player.Draw + end, + on_use = function(self, event, target, player, data) + local room = player.room + local cards = {} + table.insert(cards, getCardByPattern(room, ".|.|heart,diamond")) + table.insert(cards, getCardByPattern(room, ".|.|spade,club")) + if #cards > 0 then + room:moveCards({ + ids = cards, + to = player.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end + local choice = room:askForChoice(player, {"red", "black"}, self.name) + room:setPlayerMark(player, "@pianchong", choice) + return true + end, + + refresh_events = {fk.EventPhaseStart, fk.AfterCardsMove}, + can_refresh = function(self, event, target, player, data) + if player:hasSkill(self.name) and not player.dead and player:getMark("@pianchong") ~= 0 then + if event == fk.EventPhaseStart then + return target == player and player.phase == Player.Start + else + local times = 0 + for _, move in ipairs(data) do + if move.from == player.id then + for _, info in ipairs(move.moveInfo) do + if info.fromArea == Card.PlayerHand or info.fromArea == Card.PlayerEquip then + local color = player:getMark("@pianchong") + if Fk:getCardById(info.cardId):getColorString() == color then + times = times + 1 + end + end + end + end + end + if times > 0 then + player.room:setPlayerMark(player, self.name, times) + return true + end + end + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.EventPhaseStart then + room:setPlayerMark(player, "@pianchong", 0) + else + local pattern + local color = player:getMark("@pianchong") + if color == "red" then + pattern = ".|.|spade,club" + else + pattern = ".|.|heart,diamond" + end + local n = player:getMark(self.name) + room:setPlayerMark(player, self.name, 0) + local cards = {} + for i = 1, n, 1 do + table.insert(cards, getCardByPattern(room, pattern)) + end + if #cards > 0 then + room:moveCards({ + ids = cards, + to = player.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end + end + end, +} +local zunwei = fk.CreateActiveSkill{ + name = "zunwei", + anim_type = "drawcard", + can_use = function(self, player) + if player:usedSkillTimes(self.name) == 0 then + for i = 1, 3, 1 do + if player:getMark(self.name .. tostring(i)) == 0 then + return true + end + end + end + return false + end, + card_filter = function() + return false + end, + target_filter = function(self, to_select, selected) + if #selected == 0 then + local target = Fk:currentRoom():getPlayerById(to_select) + local player = Fk:currentRoom():getPlayerById(Self.id) + return (player:getMark("zunwei1") == 0 and #player.player_cards[Player.Hand] < #target.player_cards[Player.Hand]) or + (player:getMark("zunwei2") == 0 and #player.player_cards[Player.Equip] < #target.player_cards[Player.Equip]) or + (player:getMark("zunwei3") == 0 and player:isWounded() and player.hp < target.hp) + end + return false + end, + target_num = 1, + card_num = 0, + on_use = function(self, room, effect) + local player = room:getPlayerById(effect.from) + local target = room:getPlayerById(effect.tos[1]) + local choices = {} + if player:getMark("zunwei1") == 0 and #player.player_cards[Player.Hand] < #target.player_cards[Player.Hand] then + table.insert(choices, "zunwei1") + end + if player:getMark("zunwei2") == 0 and #player.player_cards[Player.Equip] < #target.player_cards[Player.Equip] then + table.insert(choices, "zunwei2") + end + if player:getMark("zunwei3") == 0 and player:isWounded() and player.hp < target.hp then + table.insert(choices, "zunwei3") + end + local choice = room:askForChoice(player, choices, self.name) + if choice == "zunwei1" then + player:drawCards(math.min(#target.player_cards[Player.Hand] - #player.player_cards[Player.Hand], 5)) + elseif choice == "zunwei2" then + local n = #target.player_cards[Player.Equip] - #player.player_cards[Player.Equip] + for i = 1, n, 1 do + local types = {Card.SubtypeWeapon, Card.SubtypeArmor, Card.SubtypeDefensiveRide, Card.SubtypeOffensiveRide, Card.SubtypeTreasure} + local cards = {} + for i = 1, #room.draw_pile, 1 do + local card = Fk:getCardById(room.draw_pile[i]) + for _, type in ipairs(types) do + if card.sub_type == type and player:getEquipment(type) == nil then + table.insertIfNeed(cards, room.draw_pile[i]) + end + end + end + if #cards > 0 then + local equip = cards[math.random(1, #cards)] + room:useCard({ + from = player.id, + tos = {{player.id}}, + card = Fk:getCardById(equip), + }) + end + end + elseif choice == "zunwei3" then + room:recover{who = player, num = math.min(player:getLostHp(), target.hp - player.hp), skillName = self.name} + end + room:setPlayerMark(player, choice, 1) + end, +} +guozhao:addSkill(pianchong) +guozhao:addSkill(zunwei) +Fk:loadTranslationTable{ + ["guozhao"] = "郭照", + ["pianchong"] = "偏宠", + [":pianchong"] = "摸牌阶段,你可以改为从牌堆获得红牌和黑牌各一张,然后选择一项直到你的下回合开始:1.你每失去一张红色牌时摸一张黑色牌,2.你每失去一张黑色牌时摸一张红色牌。", + ["zunwei"] = "尊位", + [":zunwei"] = "出牌阶段限一次,你可以选择一名其他角色,并选择执行以下一项,然后移除该选项:1.将手牌数摸至与该角色相同(最多摸五张);2.随机使用牌堆中的装备牌至与该角色相同;3.将体力回复至与该角色相同。", + ["@pianchong"] = "偏宠", + ["zunwei1"] = "将手牌摸至与其相同(最多摸五张)", + ["zunwei2"] = "使用装备至与其相同", + ["zunwei3"] = "回复体力至与其相同", +} + +local caojinyu = General(extension, "caojinyu", "wei", 3, 3, General.Female) +local yuqi = fk.CreateTriggerSkill{ + name = "yuqi", + anim_type = "masochism", + events = {fk.Damaged}, + can_trigger = function(self, event, target, player, data) + return player:hasSkill(self.name) and not player.dead and not target.dead and + (target == player or player:distanceTo(target) <= player:getMark("yuqi1")) and player:getMark(self.name) < 2 + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:addPlayerMark(player, self.name, 1) + --local card_ids = room:getNCards(player:getMark("yuqi2")) + + --FIXME: askForCardsChosen? or yiji? + local n1, n2 = 0, 0 + if player:getMark("yuqi2") >= player:getMark("yuqi4") then + n2 = player:getMark("yuqi4") + n1 = math.min(player:getMark("yuqi3"), player:getMark("yuqi2") - player:getMark("yuqi4")) + else + n2 = player:getMark("yuqi2") + end + target:drawCards(n1) + player:drawCards(n2) + end, + + refresh_events = {fk.DrawInitialCards, fk.EventPhaseStart}, -- FIXME: can't trigger at fk.GameStart? + can_refresh = function(self, event, target, player, data) + if event == fk.DrawInitialCards then + return target == player and target:hasSkill(self.name) + else + return target.phase == Player.NotActive + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.DrawInitialCards then + room:setPlayerMark(player, "yuqi2", 3) + room:setPlayerMark(player, "yuqi3", 1) + room:setPlayerMark(player, "yuqi4", 1) + room:setPlayerMark(player, "@" .. self.name, string.format("%d-%d-%d-%d", 0, 3, 1, 1)) + else + room:setPlayerMark(player, self.name, 0) + end + end, +} +local function AddYuqi(player, skillName, num) + local room = player.room + local choices = {} + for i = 1, 4, 1 do + if player:getMark("yuqi" .. tostring(i)) < 5 then + table.insert(choices, "yuqi" .. tostring(i)) + end + end + if #choices > 0 then + local choice = room:askForChoice(player, choices, skillName) + local x = player:getMark(choice) + if x + num < 6 then + x = x + num + else + x = 5 + end + room:setPlayerMark(player, choice, x) + room:setPlayerMark(player, "@yuqi", string.format("%d-%d-%d-%d", + player:getMark("yuqi1"), + player:getMark("yuqi2"), + player:getMark("yuqi3"), + player:getMark("yuqi4"))) + end +end +local shanshen = fk.CreateTriggerSkill{ + name = "shanshen", + anim_type = "control", + events = {fk.Death}, + can_trigger = function(self, event, target, player, data) + return player:hasSkill(self.name) and target ~= player and not player.dead + end, + on_use = function(self, event, target, player, data) + local room = player.room + AddYuqi(player, self.name, 2) + if target:getMark(self.name) == 0 and player:isWounded() then + room:recover{ + who = player, + num = 1, + skillName = self.name, + } + end + end, + refresh_events = {fk.DamageCaused}, + can_refresh = function(self, event, target, player, data) + return target == player and target:hasSkill(self.name) and data.to:getMark(self.name) == 0 + end, + on_refresh = function(self, event, target, player, data) + player.room:setPlayerMark(data.to, self.name, 1) + end, +} +local xianjing = fk.CreateTriggerSkill{ + name = "xianjing", + anim_type = "control", + events = {fk.EventPhaseStart}, + can_trigger = function(self, event, target, player, data) + if target == player and player:hasSkill(self.name) and player.phase == Player.Start then + for i = 1, 4, 1 do + if player:getMark("yuqi" .. tostring(i)) < 5 then + return true + end + end + end + return false + end, + on_use = function(self, event, target, player, data) + AddYuqi(player, self.name, 1) + if not player:isWounded() then + AddYuqi(player, self.name, 1) + end + end, +} +caojinyu:addSkill(yuqi) +caojinyu:addSkill(shanshen) +caojinyu:addSkill(xianjing) +Fk:loadTranslationTable{ + ["caojinyu"] = "曹金玉", + ["yuqi"] = "隅泣", + [":yuqi"] = "当有角色受到伤害后,若你与其距离0或者更少,你可以观看牌堆顶的三张牌,将其中至多一张交给受伤角色,至多一张自己获得,剩余的牌放回牌堆顶。(每回合限触发2次)", + ["shanshen"] = "善身", + [":shanshen"] = "当有角色死亡时,你可令“隅泣”中的一个数字+2(单项不能超过5)。然后若你没有对死亡角色造成过伤害,你回复1点体力。", + ["xianjing"] = "娴静", + [":xianjing"] = "准备阶段,你可令“隅泣”中的一个数字+1(单项不能超过5)。若你满体力值,则再令“隅泣”中的一个数字+1。", + ["@yuqi"] = "隅泣", + ["yuqi1"] = "距离", + ["yuqi2"] = "观看牌数", + ["yuqi3"] = "交给受伤角色牌数", + ["yuqi4"] = "自己获得牌数", +} + +local zhujianping = General(extension, "zhujianping", "qun", 3) +local xiangmian = fk.CreateActiveSkill{ + name = "xiangmian", + anim_type = "offensive", + can_use = function(self, player) + return player:usedSkillTimes(self.name) < 1 + end, + card_filter = function() + return false + end, + target_filter = function(self, to_select, selected) + return #selected == 0 and to_select ~= Self.id and Fk:currentRoom():getPlayerById(to_select):getMark("@xiangmian") == 0 + end, + target_num = 1, + on_use = function(self, room, effect) + local target = room:getPlayerById(effect.tos[1]) + local judge = { + who = target, + reason = self.name, + pattern = ".", + } + room:judge(judge) + room:setPlayerMark(target, "@xiangmian", string.format("%s-%d", + Fk:translate(judge.card:getSuitString()), + judge.card.number)) + room:setPlayerMark(target, "xiangmian_suit", judge.card:getSuitString()) + room:setPlayerMark(target, "xiangmian_num", judge.card.number) + end, +} +local xiangmian_kill = fk.CreateTriggerSkill{ + name = "#xiangmian_kill", + refresh_events = {fk.CardUseFinished}, + can_refresh = function(self, event, target, player, data) + return target == player and target:getMark("xiangmian_num") > 0 + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + room:addPlayerMark(target, self.name, 1) + if data.card:getSuitString() == target:getMark("xiangmian_suit") or target:getMark(self.name) == target:getMark("xiangmian_num") then + room:loseHp(target, target.hp, "xiangmian") + end + end, +} +local tianji = fk.CreateTriggerSkill{ + name = "tianji", + events = {fk.FinishJudge}, + frequency = Skill.Compulsory, + can_trigger = function(self, event, target, player, data) + return player:hasSkill(self.name) + end, + on_use = function(self, event, target, player, data) + local room = player.room + local card = data.card + local cards = {} + table.insert(cards, getCardByPattern(room, ".|.|.|.|.|"..card:getTypeString())) + table.insert(cards, getCardByPattern(room, ".|.|"..card:getSuitString())) + table.insert(cards, getCardByPattern(room, ".|"..card.number)) + if #cards > 0 then + room:moveCards({ + ids = cards, + to = player.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end + end, +} +xiangmian:addRelatedSkill(xiangmian_kill) +zhujianping:addSkill(xiangmian) +zhujianping:addSkill(tianji) +Fk:loadTranslationTable{ + ["zhujianping"] = "朱建平", + ["xiangmian"] = "相面", + [":xiangmian"] = "出牌阶段限一次,你可以令一名其他角色进行一次判定,当该角色使用判定花色的牌或使用第X张牌后(X为判定点数),其失去所有体力。每名其他角色限一次。", + ["tianji"] = "天机", + [":tianji"] = "锁定技,生效后的判定牌进入弃牌堆后,你从牌堆随机获得与该牌类型、花色和点数相同的牌各一张。", + ["@xiangmian"] = "相面", +} return {extension} -- Gitee From b5d1e8a4af63a15191b4c578d32898a37ecdfa3a Mon Sep 17 00:00:00 2001 From: RalphR <1715333874@qq.com> Date: Fri, 24 Mar 2023 09:19:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=5F(:=D0=B7=E3=80=8D=E2=88=A0)=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- init.lua | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 203 insertions(+), 11 deletions(-) diff --git a/init.lua b/init.lua index 03e9f7d..56fbe7d 100644 --- a/init.lua +++ b/init.lua @@ -1,14 +1,4 @@ -local extension = Package("joy1") -extension.extensionName = "joy" - -Fk:loadTranslationTable{ - ["joy1"] = "热门武将", - - -- TODO: move them - ["m_ex"] = "手杀界", - ["ol_ex"] = "OL界", - ["ex"] = "界限突破", -} +local extension = Package("joy") Fk:loadTranslationTable{ ["joy"] = "热门武将", @@ -954,6 +944,208 @@ Fk:loadTranslationTable{ ["#zhaxiangHit"] = "诈降", } +local new__zhenlie = fk.CreateTriggerSkill{ + name = "new__zhenlie", + anim_type = "defensive", + events = {fk.TargetConfirmed}, + can_trigger = function(self, event, target, player, data) + if player:hasSkill(self.name) and target == player and data.from ~= player.id then + return (data.card.type == Card.TypeTrick and data.card.sub_type ~= Card.SubtypeDelayedTrick) or data.card.trueName == "slash" + end + end, + on_use = function(self, event, target, player, data) + player.room:loseHp(player, 1, from) + + table.insertIfNeed(data.nullifiedTargets, player.id) + + local tar = player.room:getPlayerById(data.from) + if tar:isAllNude() then return end + local cid = player.room:askForCardChosen( + player, + tar, + "he", + self.name + ) + + player.room:throwCard(cid, self.name, tar, player) + end, +} +local new__miji = fk.CreateTriggerSkill{ + name = "new__miji", + anim_type = "drawcard", + events = {fk.EventPhaseStart}, + can_trigger = function(self, event, target, player, data) + return player:hasSkill(self.name) and target == player and player.phase == Player.Finish and player:isWounded() + end, + on_use = function(self, event, target, player, data) + local num = player:getLostHp() + + player:drawCards(num, self.name) + + local cids = player.room:askForCard(player, 1, num, false, self.name, true) + local cards = table.map(cids, function(p) + return Fk:getCardById(p) + end) + + if #cards > 0 then + local dummy = Fk:cloneCard'slash' + local prompt = "#new__miji" + local tar = player.room:askForChoosePlayers(player, table.map(player.room:getOtherPlayers(player), function(p) + return p.id + end), 1, 1, prompt, self.name) + + dummy:addSubcards(cards) + + player.room:obtainCard(tar[1], dummy, false, fk.ReasonGive) + end + end, +} +local new__wangyi = General:new(extension, "new__wangyi", "wei", 3, 3, General.Female) + +new__wangyi:addSkill(new__zhenlie) +new__wangyi:addSkill(new__miji) + +Fk:loadTranslationTable{ + ["new__wangyi"] = "王异", + ["new__zhenlie"] = "贞烈", + [":new__zhenlie"] = "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力使此牌对你无效,然后你弃置其一张牌。", + ["new__miji"] = "秘计", + [":new__miji"] = "结束阶段,你可以摸至多X张牌(X为你已损失的体力值),然后将等量的手牌交给其他角色。", + ["#new__miji"] = "将牌交给1名其他角色", +} + +local zishu = fk.CreateTriggerSkill{ + name = "zishu", + anim_type = "drawcard", + frequency = Skill.Compulsory, + events = {fk.EventPhaseStart, fk.AfterCardsMove}, + can_trigger = function(self, event, target, player, data) + if not player:hasSkill(self.name) then return end + + if event == fk.EventPhaseStart and target.phase == Player.NotActive then + local cards = player:getMark("#zishu-discard") + + return cards ~= 0 and cards ~= {} + elseif event == fk.AfterCardsMove and player.phase < Player.NotActive then + for _, d in ipairs(data) do + return d.skillName ~= self.name and d.toArea == Player.Hand and d.to == player.id + end + end + end, + on_use = function(self, event, target, player, data) + if event == fk.EventPhaseStart then + local discards = player:getMark("#zishu-discard") + + for _, discid in ipairs(discards) do + for _, card in ipairs(player.player_cards[Player.Hand]) do + if discid == card then + player.room:throwCard(card, self.name, player, player) + end + end + end + + player.room:setPlayerMark(player, "#zishu-discard", 0) + elseif event == fk.AfterCardsMove then + player:drawCards(1, self.name) + end + end, + + refresh_events = {fk.AfterCardsMove}, + can_refresh = function(self, event, target, player, data) + if player:hasSkill(self.name) then + for _, d in ipairs(data) do + return d.skillName ~= self.name and d.toArea == Player.Hand and d.to == player.id + end + end + end, + on_refresh = function(self, event, target, player, data) + if player.phase == Player.NotActive then + local discards = player:getMark("#zishu-discard") + local cards = {} + + if discards == 0 then + discards = {} + end + + for _, d in ipairs(data) do + for _, info in ipairs(d.moveInfo) do + if d.toArea == Player.Hand and d.to == player.id and info.cardId ~= nil then + table.insert(cards, info.cardId) + end + end + end + + table.insertTable(discards, cards) + player.room:setPlayerMark(player, "#zishu-discard", discards) + end + end, +} +local yingyuan = fk.CreateTriggerSkill{ + name = "yingyuan", + anim_type = "support", + events = {fk.CardUseFinished}, + can_trigger = function(self, event, target, player, data) + if player:hasSkill(self.name) and target == player and player.phase == Player.Play and data.card ~= nil and player.room:getCardArea(data.card) == Card.Processing then + local cardMark = player:getMark("#yingyuan-give") + + if cardMark == 0 then cardMark = {} end + + return not table.contains(cardMark, data.card.trueName) + end + end, + on_cost = function(self, event, target, player, data) + local prompt = "#yingyuan-give:::" .. data.card.name + local tar = player.room:askForChoosePlayers(player, table.map(player.room:getOtherPlayers(player), function(p) + return p.id + end), 1, 1, prompt, self.name) + + if #tar > 0 then + self.cost_data = tar + return true + end + end, + on_use = function(self, event, target, player, data) + local cards = data.card + + player.room:obtainCard(self.cost_data[1], cards, false, fk.ReasonGive) + + local cardMark = player:getMark("#yingyuan-give") + + if cardMark == 0 then + cardMark = {} + end + + table.insert(cardMark, cards.trueName) + player.room:setPlayerMark(player, "#yingyuan-give", cardMark) + end, + + refresh_events = {fk.EventPhaseStart}, + can_refresh = function(self, event, target, player, data) + if player:hasSkill(self.name) and target.phase == Player.NotActive then + local cards = player:getMark("#yingyuan-give") + + return cards ~= 0 and cards ~= {} + end + end, + on_refresh = function(self, event, target, player, data) + player.room:setPlayerMark(player, "#yingyuan-give", 0) + end, +} +local maliang = General:new(extension, "maliang", "shu", 3) + +maliang:addSkill(zishu) +maliang:addSkill(yingyuan) + +Fk:loadTranslationTable{ + ["maliang"] = "马良", + ["zishu"] = "自书", + [":zishu"] = "锁定技,你的回合外,你获得的牌均会在当前回合结束后置入弃牌堆;你的回合内,当你不因此技能效果获得牌时,摸一张牌。", + ["#zishu-discard"] = "自书", + ["yingyuan"] = "应援", + [":yingyuan"] = "当你于回合内使用的牌置入弃牌堆后,你可以将之交给一名其他角色(相同牌名的牌每回合限一次)。", + ["#yingyuan-give"] = "你可以选择1名其他角色,并将 %arg 交给他", +} + function getCardByPattern(room, pattern, fromPiles) --TODO: move this! pattern = pattern or "." -- Gitee From a0986d09cc0a400993472e5fa43e68b54a1295e3 Mon Sep 17 00:00:00 2001 From: RalphR <1715333874@qq.com> Date: Mon, 27 Mar 2023 20:28:53 +0800 Subject: [PATCH 3/4] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E5=91=A8=E5=AE=A3=202.?= =?UTF-8?q?=E6=9C=B1=E5=BB=BA=E5=B9=B3fixed=203.getCardByPattern=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E8=87=B3room?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image/generals/zhouxuan.jpg | Bin 0 -> 16080 bytes init.lua | 253 ++++++++++++++++++++++++++++++++---- 2 files changed, 226 insertions(+), 27 deletions(-) create mode 100644 image/generals/zhouxuan.jpg diff --git a/image/generals/zhouxuan.jpg b/image/generals/zhouxuan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb9ff4fa4e1d981aa4c545f6f807a526d0519bf3 GIT binary patch literal 16080 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 0 then - return(cards[math.random(1, #cards)]) - else - return nil - end -end - - local guozhao = General(extension, "guozhao", "wei", 3, 3, General.Female) local pianchong = fk.CreateTriggerSkill{ name = "pianchong", @@ -1177,8 +1157,8 @@ local pianchong = fk.CreateTriggerSkill{ on_use = function(self, event, target, player, data) local room = player.room local cards = {} - table.insert(cards, getCardByPattern(room, ".|.|heart,diamond")) - table.insert(cards, getCardByPattern(room, ".|.|spade,club")) + table.insert(cards, room:getCardByPattern(".|.|heart,diamond")) + table.insert(cards, room:getCardByPattern(".|.|spade,club")) if #cards > 0 then room:moveCards({ ids = cards, @@ -1236,7 +1216,7 @@ local pianchong = fk.CreateTriggerSkill{ room:setPlayerMark(player, self.name, 0) local cards = {} for i = 1, n, 1 do - table.insert(cards, getCardByPattern(room, pattern)) + table.insert(cards, room:getCardByPattern(pattern)) end if #cards > 0 then room:moveCards({ @@ -1483,7 +1463,7 @@ local xiangmian = fk.CreateActiveSkill{ return false end, target_filter = function(self, to_select, selected) - return #selected == 0 and to_select ~= Self.id and Fk:currentRoom():getPlayerById(to_select):getMark("@xiangmian") == 0 + return #selected == 0 and to_select ~= Self.id and Fk:currentRoom():getPlayerById(to_select):getMark("xiangmian_suit") == 0 end, target_num = 1, on_use = function(self, room, effect) @@ -1511,6 +1491,8 @@ local xiangmian_kill = fk.CreateTriggerSkill{ local room = player.room room:addPlayerMark(target, self.name, 1) if data.card:getSuitString() == target:getMark("xiangmian_suit") or target:getMark(self.name) == target:getMark("xiangmian_num") then + room:setPlayerMark(target, "xiangmian_num", 0) + room:setPlayerMark(target, "@xiangmian", 0) room:loseHp(target, target.hp, "xiangmian") end end, @@ -1526,9 +1508,9 @@ local tianji = fk.CreateTriggerSkill{ local room = player.room local card = data.card local cards = {} - table.insert(cards, getCardByPattern(room, ".|.|.|.|.|"..card:getTypeString())) - table.insert(cards, getCardByPattern(room, ".|.|"..card:getSuitString())) - table.insert(cards, getCardByPattern(room, ".|"..card.number)) + table.insert(cards, room:getCardByPattern(".|.|.|.|.|"..card:getTypeString())) + table.insert(cards, room:getCardByPattern(".|.|"..card:getSuitString())) + table.insert(cards, room:getCardByPattern(".|"..card.number)) if #cards > 0 then room:moveCards({ ids = cards, @@ -1553,4 +1535,221 @@ Fk:loadTranslationTable{ ["@xiangmian"] = "相面", } +local zhouxuan = General(extension, "zhouxuan", "wei", 3) +local wumei = fk.CreateTriggerSkill{ + name = "wumei", + anim_type = "control", + events = {fk.EventPhaseStart}, + can_trigger = function(self, event, target, player, data) + return target == player and player:hasSkill(self.name) and player.phase == Player.RoundStart and player:getMark("wumei") == 0 + end, + on_cost = function(self, event, target, player, data) + local p = player.room:askForChoosePlayers(player, table.map(player.room:getAlivePlayers(), function(p) return p.id end), 1, 1, "#wumei-choose", self.name) + if #p > 0 then + self.cost_data = p[1] + return true + end + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:addPlayerMark(player, "wumei", 1) + for _, p in ipairs(room:getAlivePlayers()) do + room:setPlayerMark(p, "wumei_hp", p.hp) + end + local to = room:getPlayerById(self.cost_data) + room:addPlayerMark(to, "wumei_extra", 1) + to:gainAnExtraTurn() + end, + + refresh_events = {fk.EventPhaseStart, fk.TurnStart}, + can_refresh = function(self, event, target, player, data) + if event == fk.EventPhaseStart then + return player.phase == Player.NotActive and player:getMark("wumei_extra") > 0 + else + return target.seat == 1 + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.EventPhaseStart then + room:setPlayerMark(player, "wumei_extra", 0) + for _, p in ipairs(room:getAlivePlayers()) do + p.hp = p:getMark("wumei_hp") + room:broadcastProperty(p, "hp") + room:setPlayerMark(p, "wumei_hp", 0) + end + else + for _, p in ipairs(room:getAlivePlayers()) do + if p:getMark("wumei") > 0 then + room:setPlayerMark(p, "wumei", 0) + end + end + end + end, +} +local zhanmeng = fk.CreateTriggerSkill{ + name = "zhanmeng", + events = {fk.CardUsing}, + can_trigger = function(self, event, target, player, data) + if target == player and player:hasSkill(self.name) then + for i = 1, 3, 1 do + if player:getMark(self.name .. tostring(i)) == 0 then + return true + end + end + end + end, + on_cost = function(self, event, target, player, data) + local room = player.room + local choices = {"Cancel"} + self.cost_data = {} + if player:getMark("zhanmeng1") == 0 and table.contains(room:getTag("zhanmeng1"), data.card.trueName) then + table.insert(choices, "zhanmeng1") + end + if player:getMark("zhanmeng2") == 0 then + table.insert(choices, "zhanmeng2") + end + local tos = {} + if player:getMark("zhanmeng3") == 0 then + for _, p in ipairs(room:getOtherPlayers(player)) do + if #p.player_cards[Player.Hand] + #p.player_cards[Player.Equip] > 1 then + table.insertIfNeed(choices, "zhanmeng3") + table.insert(tos, p) + end + end + end + local choice = room:askForChoice(player, choices, self.name) + if choice == "Cancel" then return end + self.cost_data[1] = choice + if choice == "zhanmeng3" then + local p = room:askForChoosePlayers(player, table.map(tos, function(p) return p.id end), 1, 1, "#zhanmeng-choose", self.name) + if #p > 0 then + self.cost_data[2] = p[1] + end + end + return #self.cost_data > 0 + end, + on_use = function(self, event, target, player, data) + local room = player.room + local choice = self.cost_data[1] + room:setPlayerMark(player, choice, 1) + if choice == "zhanmeng1" then + local card = {room:getCardByPattern("nondamage_card")} + if #card > 0 then + room:moveCards({ + ids = card, + to = player.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end + elseif choice == "zhanmeng2" then + room:setPlayerMark(player, "zhanmeng2_invoke", data.card.trueName) + elseif choice == "zhanmeng3" then + local p = room:getPlayerById(self.cost_data[2]) + --ATTENTION: this skill may discard cards after target filted, so cards like dismantlement,snatch,collateral,fire_attack should check again before effect! + local discards = room:askForDiscard(p, 2, 2, true, self.name, false) + if Fk:getCardById(discards[1]).number + Fk:getCardById(discards[2]).number > 10 then + room:damage{ + from = player, + to = p, + damage = 1, + damageType = fk.FireDamage, + skillName = self.name, + } + end + end + end, + + refresh_events = {fk.EventPhaseStart}, + can_refresh = function(self, event, target, player, data) + return target == player and player:hasSkill(self.name) and player.phase == Player.NotActive + end, + on_refresh = function(self, event, target, player, data) + for i = 1, 3, 1 do + player.room:setPlayerMark(player, self.name .. tostring(i), 0) + end + end, +} +local zhanmeng_record = fk.CreateTriggerSkill{ + name = "#zhanmeng_record", + + refresh_events = {fk.CardUsing, fk.EventPhaseStart}, + can_refresh = function(self, event, target, player, data) + if target == player then + if event == fk.CardUsing then + return true + else + return player.phase == Player.Start or player.phase == Player.NotActive + end + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.CardUsing then + local zhanmeng2 = room:getTag("zhanmeng2") + if type(zhanmeng2) ~= "table" then + zhanmeng2 = {} + end + if not table.contains(zhanmeng2, data.card.trueName) then + table.insert(zhanmeng2, data.card.trueName) + room:setTag("zhanmeng2", zhanmeng2) + end + for _, p in ipairs(room:getAlivePlayers()) do + if p:getMark("zhanmeng2_get") == data.card.trueName then + room:setPlayerMark(p, "zhanmeng2_get", 0) + local card = {room:getCardByPattern("damage_card")} + if #card > 0 then + room:moveCards({ + ids = card, + to = p.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = p.id, + skillName = "zhanmeng", + }) + end + end + end + else + if player.phase == Player.Start then + local zhanmeng2 = room:getTag("zhanmeng2") + if type(zhanmeng2) ~= "table" then + zhanmeng2 = {} + end + room:setTag("zhanmeng1", zhanmeng2) --cards used in last turn + zhanmeng2 = {} + room:setTag("zhanmeng2", zhanmeng2) --cards used in current turn + for _, p in ipairs(room:getAlivePlayers()) do + if type(p:getMark("zhanmeng2_invoke")) == "string" then + room:setPlayerMark(p, "zhanmeng2_get", p:getMark("zhanmeng2_invoke")) + room:setPlayerMark(p, "zhanmeng2_invoke", 0) + end + end + elseif player.phase == Player.NotActive then + for _, p in ipairs(room:getAlivePlayers()) do + room:setPlayerMark(p, "zhanmeng2_get", 0) + end + end + end + end, +} +zhanmeng:addRelatedSkill(zhanmeng_record) +zhouxuan:addSkill(wumei) +zhouxuan:addSkill(zhanmeng) +Fk:loadTranslationTable{ + ["zhouxuan"] = "周宣", + ["wumei"] = "寤寐", + [":wumei"] = "每轮限一次,回合开始前,你可以令一名角色执行一个额外的回合:该回合结束时,将所有存活角色的体力值调整为此额外回合开始时的数值。", + ["zhanmeng"] = "占梦", + [":zhanmeng"] = "你使用牌时,可以执行以下一项(每回合每项各限一次):1.上一回合内,若没有同名牌被使用,你获得一张非伤害牌。2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌。3.令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害。", + ["#wumei-choose"] = "占梦: 你可以令一名角色执行一个额外的回合", + ["zhanmeng1"] = "你获得一张非伤害牌", + ["zhanmeng2"] = "下一回合内,当同名牌首次被使用后,你获得一张伤害牌", + ["zhanmeng3"] = "令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害", + ["#zhanmeng-choose"] = "占梦: 令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害", +} + return {extension} -- Gitee From 8ced02f06d5c1d4c0ab0c52a8bae072be89c2115 Mon Sep 17 00:00:00 2001 From: RalphR <1715333874@qq.com> Date: Mon, 27 Mar 2023 21:16:41 +0800 Subject: [PATCH 4/4] changed back... --- init.lua | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index edd8462..fc1efa0 100644 --- a/init.lua +++ b/init.lua @@ -1146,6 +1146,39 @@ Fk:loadTranslationTable{ ["#yingyuan-give"] = "你可以选择1名其他角色,并将 %arg 交给他", } + +---@param pattern string +---@param fromPiles integer[] +---@return integer[] | nil +function getCardByPattern(room, pattern, fromPiles) + pattern = pattern or "." + fromPiles = room.draw_pile + + --THIS IS STUPID! + if pattern == "damage_card" then + pattern = "slash,duel,savage_assault,archery_attack,fire_attack,thunder" + elseif pattern == "nondamage_card" then + pattern = "jink,peach,dismantlement,snatch,collateral,nullification,indulgence,amazing_grace,god_salvation".. + "crossbow,double_swords,qinggang_sword,ice_sword,axe,spear,blade,halberd,kylin_bow,eight_diagram,nioh_shield,chitu,dayuan,dilu,jueying,zixing,zhuahuangfeidian".. + "analeptic,iron_chain,supply_shortage".. + "guding_blade,fan,silver_lion,vine,hualiu" + end + + local cards = {} + for i = 1, #fromPiles, 1 do + local card = Fk:getCardById(fromPiles[i]) + if card:matchPattern(pattern) then + table.insertIfNeed(cards, fromPiles[i]) + end + end + if #cards > 0 then + return(cards[math.random(1, #cards)]) + else + return nil + end +end + + local guozhao = General(extension, "guozhao", "wei", 3, 3, General.Female) local pianchong = fk.CreateTriggerSkill{ name = "pianchong", @@ -1157,8 +1190,8 @@ local pianchong = fk.CreateTriggerSkill{ on_use = function(self, event, target, player, data) local room = player.room local cards = {} - table.insert(cards, room:getCardByPattern(".|.|heart,diamond")) - table.insert(cards, room:getCardByPattern(".|.|spade,club")) + table.insert(cards, getCardByPattern(room, ".|.|heart,diamond")) + table.insert(cards, getCardByPattern(room, ".|.|spade,club")) if #cards > 0 then room:moveCards({ ids = cards, @@ -1216,7 +1249,7 @@ local pianchong = fk.CreateTriggerSkill{ room:setPlayerMark(player, self.name, 0) local cards = {} for i = 1, n, 1 do - table.insert(cards, room:getCardByPattern(pattern)) + table.insert(cards, getCardByPattern(room, pattern)) end if #cards > 0 then room:moveCards({ @@ -1508,9 +1541,9 @@ local tianji = fk.CreateTriggerSkill{ local room = player.room local card = data.card local cards = {} - table.insert(cards, room:getCardByPattern(".|.|.|.|.|"..card:getTypeString())) - table.insert(cards, room:getCardByPattern(".|.|"..card:getSuitString())) - table.insert(cards, room:getCardByPattern(".|"..card.number)) + table.insert(cards, getCardByPattern(room, ".|.|.|.|.|"..card:getTypeString())) + table.insert(cards, getCardByPattern(room, ".|.|"..card:getSuitString())) + table.insert(cards, getCardByPattern(room, ".|"..card.number)) if #cards > 0 then room:moveCards({ ids = cards, @@ -1634,7 +1667,7 @@ local zhanmeng = fk.CreateTriggerSkill{ local choice = self.cost_data[1] room:setPlayerMark(player, choice, 1) if choice == "zhanmeng1" then - local card = {room:getCardByPattern("nondamage_card")} + local card = {getCardByPattern(room, "nondamage_card")} if #card > 0 then room:moveCards({ ids = card, @@ -1700,7 +1733,7 @@ local zhanmeng_record = fk.CreateTriggerSkill{ for _, p in ipairs(room:getAlivePlayers()) do if p:getMark("zhanmeng2_get") == data.card.trueName then room:setPlayerMark(p, "zhanmeng2_get", 0) - local card = {room:getCardByPattern("damage_card")} + local card = {getCardByPattern(room, "damage_card")} if #card > 0 then room:moveCards({ ids = card, -- Gitee