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/2] 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/2] =?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