diff --git a/packages/mougong/audio/death/mou__caoren.mp3 b/packages/mougong/audio/death/mou__caoren.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a6dc9758b69d416c592fbe54ab36819d9c747672 Binary files /dev/null and b/packages/mougong/audio/death/mou__caoren.mp3 differ diff --git a/packages/mougong/audio/death/mou__huangzhong.mp3 b/packages/mougong/audio/death/mou__huangzhong.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1f90b06010c7ae6cc674fc3a937492557346c0fb Binary files /dev/null and b/packages/mougong/audio/death/mou__huangzhong.mp3 differ diff --git a/packages/mougong/audio/skill/mou__jiewei1.mp3 b/packages/mougong/audio/skill/mou__jiewei1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4e2524c496a726f1dc724478851d20d4d1ecbdc1 Binary files /dev/null and b/packages/mougong/audio/skill/mou__jiewei1.mp3 differ diff --git a/packages/mougong/audio/skill/mou__jiewei2.mp3 b/packages/mougong/audio/skill/mou__jiewei2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..77c0910fc7d0f644b865e73dce4109bc8f379ae3 Binary files /dev/null and b/packages/mougong/audio/skill/mou__jiewei2.mp3 differ diff --git a/packages/mougong/audio/skill/mou__jushou1.mp3 b/packages/mougong/audio/skill/mou__jushou1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2bdd46ea6893bf38568ef5e6bfb526de45e42a04 Binary files /dev/null and b/packages/mougong/audio/skill/mou__jushou1.mp3 differ diff --git a/packages/mougong/audio/skill/mou__jushou2.mp3 b/packages/mougong/audio/skill/mou__jushou2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a6a8ea9fc9ca00a87d2a939388d4cceaaecc975a Binary files /dev/null and b/packages/mougong/audio/skill/mou__jushou2.mp3 differ diff --git a/packages/mougong/audio/skill/mou__jushou3.mp3 b/packages/mougong/audio/skill/mou__jushou3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..78efe51fb15ed776f5714ab3aa834d92bad8964c Binary files /dev/null and b/packages/mougong/audio/skill/mou__jushou3.mp3 differ diff --git a/packages/mougong/audio/skill/mou__liegong1.mp3 b/packages/mougong/audio/skill/mou__liegong1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9f7c657c0af28039b122b74a51058e0be4f5bf1f Binary files /dev/null and b/packages/mougong/audio/skill/mou__liegong1.mp3 differ diff --git a/packages/mougong/audio/skill/mou__liegong2.mp3 b/packages/mougong/audio/skill/mou__liegong2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..79dc2bc66e70c48a9b018510b399aef1ed32d0fb Binary files /dev/null and b/packages/mougong/audio/skill/mou__liegong2.mp3 differ diff --git a/packages/mougong/image/generals/mou__caoren.jpg b/packages/mougong/image/generals/mou__caoren.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3394fd98471e27cee1cf1ad20a1603dba58171ee Binary files /dev/null and b/packages/mougong/image/generals/mou__caoren.jpg differ diff --git a/packages/mougong/image/generals/mou__huangzhong.jpg b/packages/mougong/image/generals/mou__huangzhong.jpg new file mode 100644 index 0000000000000000000000000000000000000000..413d592019873c8d2e47b13831c87613b95474ec Binary files /dev/null and b/packages/mougong/image/generals/mou__huangzhong.jpg differ diff --git a/packages/mougong/init.lua b/packages/mougong/init.lua new file mode 100644 index 0000000000000000000000000000000000000000..40d7f3634587bf029ab3bdf58361c9d14fa07ec2 --- /dev/null +++ b/packages/mougong/init.lua @@ -0,0 +1,9 @@ +local yu = require 'packages.mougong.yu' + +Fk:loadTranslationTable{ + ["mou"] = "谋", +} + +return { + yu, +} diff --git a/packages/mougong/yu.lua b/packages/mougong/yu.lua new file mode 100644 index 0000000000000000000000000000000000000000..c157ceeeaeb95225ea635e0f0e8a8235f3d8033b --- /dev/null +++ b/packages/mougong/yu.lua @@ -0,0 +1,352 @@ +local extension = Package("mou_yu") +extension.extensionName = "mougong" + +Fk:loadTranslationTable{ + ["mou_yu"] = "谋攻篇-虞包", +} + +local mouyuanshao = General(extension, "mou__yuanshao", "qun", 4) + +local mouxueyi = fk.CreateTriggerSkill{ + name = "mou__xueyi$", + anim_type = "drawcard", + events = {fk.TargetSpecified}, + can_trigger = function(self, event, target, player, data) + local room = player.room + local to = room:getPlayerById(data.to) + return target == player and player:hasSkill(self.name) and to.kingdom == "qun" and to ~= player + end, + on_use = function(self, event, target, player, data) + player:drawCards(1, self.name) + end, +} +local mouxueyi_Max = fk.CreateMaxCardsSkill{ + name = "#mou_xueyi__Max", + correct_func = function(self, player) + if player:hasSkill(self.name) then + local hmax = 0 + for _, p in ipairs(Fk:currentRoom().alive_players) do + if p ~= player and p.kingdom == "qun" then + hmax = hmax + 1 + end + end + return hmax *2 + else + return 0 + end + end, +} + + +local mouluanjiDraw = fk.CreateTriggerSkill{ + name = "#mou_luanji__Draw", + anim_type = "offensive", + events = {fk.CardUseFinished,fk.CardRespondFinished}, + can_trigger = function(self, event, target, player, data) + if player:hasSkill("mouluanji") and data.card.name == "jink" then + return data.responseToEvent and data.responseToEvent.from == player.id and data.responseToEvent.card.name =="archery_attack" + end + end, + on_cost = function() return true end, + on_use = function(self, event, target, player, data) + player:drawCards(1, self.name) + end, +} +local mouluanji = fk.CreateViewAsSkill{ + name = "mouluanji", + anim_type = "offensive", + pattern = "archery_attack", + enabled_at_play = function(self, player) + return player:usedSkillTimes(self.name) == 0 + end, + card_filter = function(self, to_select, selected) + if #selected == 1 then + return Fk:currentRoom():getCardArea(to_select) ~= Player.Equip + elseif #selected == 2 then + return false + end + + return Fk:currentRoom():getCardArea(to_select) ~= Player.Equip + end, + view_as = function(self, cards) + if #cards ~= 2 then + return nil + end + + local c = Fk:cloneCard("archery_attack") + c:addSubcards(cards) + return c + end, +} + +Fk:loadTranslationTable{ + ["mou__yuanshao"] = "谋袁绍", + ["mouluanji"] = "乱击", + ["#mou_luanji__Draw"] = "乱击", + [":mouluanji"] = "①出牌阶段限一次,你可以将两张手牌当做万箭齐发使用。;".. + "②当你使用的万箭齐发被【闪】响应时,你摸一张牌。
", + ["mou__xueyi"] = "血裔", + ["#mou_xueyi__Max"] = "血裔", + [":mou__xueyi"] = "主公技,锁定技,①你的手牌上限+2X(X为场上其他群势力角色数)。;".. + "②当你使用牌指定其他群势力角色时,你摸一张牌。
", +} + +local moucaoren = General(extension, "mou__caoren", "wei", 4) +moucaoren.shield = 1 + +local moujushouDraw = fk.CreateTriggerSkill{ + name = "#mou__jushou_draw", + mute = true, + events = { fk.TurnedOver }, + can_trigger = function(self, event, target, player, data) + return target == player and player:hasSkill(self.name) and player.faceup + end, + on_cost = function() return true end, + on_use = function(self, event, target, player, data) + local room = player.room + room:broadcastSkillInvoke("mou__jushou", 3) + room:notifySkillInvoked(player, "mou__jushou", "drawcard") + player:drawCards(player.shield, self.name) + end, +} +local moujushouShibei = fk.CreateTriggerSkill{ + name = "#mou__jushou_shibei", + mute = true, + events = { fk.Damaged }, + can_trigger = function(self, event, target, player, data) + if not (target == player and player:hasSkill(self.name)) then + return + end + return not player.faceup + end, + on_cost = function(self, event, target, player, data) + local room = player.room + local choices = { "turnover", "add1shield", "Cancel" } + if player.shield >= 5 then table.removeOne(choices, "add1shield") end + local choice = room:askForChoice(player, choices, self.name) + if choice ~= "Cancel" then + self.cost_data = choice + return true + end + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:broadcastSkillInvoke("mou__jushou", 2) + room:notifySkillInvoked(player, "mou__jushou", "masochism") + if self.cost_data == "turnover" then + player:turnOver() + else + room:changeShield(player, 1) + end + end, +} +mouluanji:addRelatedSkill(mouluanjiDraw) +mouyuanshao:addSkill(mouluanji) + +local moujushou = fk.CreateActiveSkill{ + name = "mou__jushou", + mute = true, + can_use = function(self, player) + return player:usedSkillTimes(self.name) == 0 and player.faceup + end, + target_num = 0, + card_num = 0, + card_filter = function() return false end, + on_use = function(self, room, effect) + local from = room:getPlayerById(effect.from) + room:broadcastSkillInvoke("mou__jushou", 1) + room:notifySkillInvoked(from, "mou__jushou", "defensive") + from:turnOver() + local s = from.shield + if s < 5 then + local cards = room:askForDiscard(from, 1, math.min(2, 5 - s), true, + self.name, true, nil, "#mou__jushou-discard") + if #cards > 0 then + room:changeShield(from, #cards) + end + end + end, +} +moujushou:addRelatedSkill(moujushouDraw) +moujushou:addRelatedSkill(moujushouShibei) +moucaoren:addSkill(moujushou) +local moujiewei = fk.CreateActiveSkill{ + name = "mou__jiewei", + can_use = function(self, player) + return player:usedSkillTimes(self.name) == 0 and player.shield > 0 + end, + target_num = 1, + card_num = 0, + card_filter = function() return false end, + target_filter = function(self, to_select, selected) + return #selected == 0 and to_select ~= Self.id and + not Fk:currentRoom():getPlayerById(to_select):isKongcheng() + end, + on_use = function(self, room, effect) + local player = room:getPlayerById(effect.from) + room:changeShield(player, -1) + local target = room:getPlayerById(effect.tos[1]) + + local cids = target.player_cards[Player.Hand] + room:fillAG(player, cids) + + local id = room:askForAG(player, cids, false, self.name) + room:closeAG(player) + + if not id then return false end + room:obtainCard(player, id, false) + end, +} +moucaoren:addSkill(moujiewei) +Fk:loadTranslationTable{ + ["mou__caoren"] = "谋曹仁", + ["mou__jushou"] = "据守", + ["#mou__jushou_shibei"] = "据守", + ["#mou__jushou_draw"] = "据守", + [":mou__jushou"] = "①出牌阶段限一次,若你的武将牌正面朝上,你可以翻面," .. + "然后你弃置至多两张牌并获得等量的“护甲”。
" .. + "②当你受到伤害后,若你的武将牌背面朝上,你可以选择一项:" .. + "1.翻面;2.获得1点“护甲”。
" .. + "③当你的武将牌从背面翻至正面时,你摸等同于你“护甲”值的牌。", + ["#mou__jushou-discard"] = "据守:你现在可以弃至多两张牌并获得等量护甲", + ["turnover"] = "翻面", + ["add1shield"] = "获得1点护甲", + ["mou__jiewei"] = "解围", + [":mou__jiewei"] = "出牌阶段限一次,你可以失去1点“护甲”并选择一名其他" .. + "角色,你观看其手牌并获得其中一张。", + ["$mou__jushou1"] = "白马沉河共歃誓,怒涛没城亦不悔!", + ["$mou__jushou2"] = "山水速疾来去易,襄樊镇固永难开!", + ["$mou__jushou3"] = "汉水溢流断归路,守城之志穷且坚!", + ["$mou__jiewei1"] = "同袍之谊,断不可弃之!", + ["$mou__jiewei2"] = "贼虽势盛,若吾出马,亦可解之。", + ["~mou__caoren"] = "吾身可殉,然襄樊之地万不可落于吴蜀之手……", +} + +local mouhuangzhong = General(extension, "mou__huangzhong", "shu", 4) +local mouliegongFilter = fk.CreateFilterSkill{ + name = "#mou__liegong_filter", + card_filter = function(self, card, player) + return card.trueName == "slash" and + card.name ~= "slash" and + not player:getEquipment(Card.SubtypeWeapon) and + player:hasSkill(self.name) + end, + view_as = function(self, card, player) + local c = Fk:cloneCard("slash", card.suit, card.number) + c.skillName = "mou__liegong" + return c + end, +} +local mouliegongProhibit = fk.CreateProhibitSkill{ + name = "#mou__liegong_prohibit", + is_prohibited = function() return false end, + prohibit_use = function(self, player, card) + -- FIXME: 确保是因为【杀】而出闪,并且指明好事件id + if Fk.currentResponsePattern ~= "jink" or card.name ~= "jink" then + return false + end + + local suits = player:getMark("mou__liegong") + if type(suits) == "string" and suits ~= "" then + suits = suits:split("+") + if table.contains(suits, card:getSuitString()) then + return true + end + end + end, +} +local mouliegong = fk.CreateTriggerSkill{ + name = "mou__liegong", + anim_type = "offensive", + 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 + #TargetGroup:getRealTargets(data.tos) == 1 and + player:getMark("mouliegongRecord") ~= 0 + end, + on_use = function(self, event, target, player, data) + local room = player.room + local logic = room.logic + local cardUseEvent = logic:getCurrentEvent().parent + cardUseEvent.liegong_used = true + + -- 让他不能出闪 + local target = room:getPlayerById(data.to) + local suits = player:getMark("mouliegongRecord") + room:setPlayerMark(target, self.name, suits) + + -- 展示牌堆顶的牌,计算加伤数量 + suits = suits:split("+") + local cards = room:getNCards(#suits - 1) + room:moveCardTo(cards, Card.DiscardPile) -- FIXME + data.additionalDamage = (data.additionalDamage or 0) + + #table.filter(cards, function(id) + local c = Fk:getCardById(id) + return table.contains(suits, c:getSuitString()) + end) + end, + + refresh_events = {fk.TargetConfirmed, fk.CardUsing, fk.CardUseFinished}, + can_refresh = function(self, event, target, player, data) + if not (target == player and player:hasSkill(self.name)) then return end + local room = player.room + if event == fk.CardUseFinished then + return room.logic:getCurrentEvent().liegong_used + else + return true + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.CardUseFinished then + room:setPlayerMark(player, "mouliegongRecord", 0) + room:setPlayerMark(player, "@mouliegongRecord", 0) + for _, p in ipairs(room:getAlivePlayers()) do + room:setPlayerMark(p, "mouliegong", 0) + end + else + local suit = data.card:getSuitString() + if table.contains({ "spade", "heart", "club", "diamond" }, suit) then + local m = player:getMark("mouliegongRecord") + if m == 0 then + m = suit + elseif type(m) == "string" then + local suits = m:split("+") + table.insertIfNeed(suits, suit) + m = table.concat(suits, "+") + end + room:setPlayerMark(player, "mouliegongRecord", m) + local card_suits_table = { + spade = "♠", + club = "♣", + heart = "♥", + diamond = "♦", + } + room:setPlayerMark(player, "@mouliegongRecord", table.concat( + table.map(m:split("+"), function(s) return card_suits_table[s] end) + , "")) + end + end + end, +} +mouliegong:addRelatedSkill(mouliegongFilter) +mouliegong:addRelatedSkill(mouliegongProhibit) +mouhuangzhong:addSkill(mouliegong) +Fk:loadTranslationTable{ + ["mou__huangzhong"] = "谋黄忠", + ["~mou__huangzhong"] = "弦断弓藏,将老孤亡…", + ["mou__liegong"] = "烈弓", + [":mou__liegong"] = "若你未装备武器,你的【杀】只能当作普通【杀】使用或打出。" + .. "你使用牌时或成为其他角色使用牌的目标后,若此牌的花色未被“烈弓”记录," + .. "则记录此种花色。当你使用【杀】指定唯一目标后,你可以展示牌堆顶的X张牌" + .. "(X为你记录的花色数-1,且至少为0),然后每有一张牌花色与“烈弓”记录的" + .. "花色相同,你令此【杀】伤害+1,且其不能使用“烈弓”记录花色的牌响应此" + .. "【杀】。若如此做,此【杀】结算结束后,清除“烈弓”记录的花色。", + ["$mou__liegong1"] = "矢贯坚石,劲冠三军!", + ["$mou__liegong2"] = "吾虽年迈,箭矢犹锋!", + ["@mouliegongRecord"] = "烈弓", + ["#mou__liegong_filter"] = "烈弓", +} + +return extension