FreeKill/packages/standard/init.lua

1061 lines
33 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local extension = Package:new("standard")
extension.metadata = require "packages.standard.metadata"
dofile "packages/standard/game_rule.lua"
dofile "packages/standard/aux_skills.lua"
Fk:loadTranslationTable{
["standard"] = "标准包",
["wei"] = "",
["shu"] = "",
["wu"] = "",
["qun"] = "",
}
Fk:loadTranslationTable{
["black"] = "黑色",
["red"] = '<font color="#CC3131">红色</font>',
["nocolor"] = '<font color="grey">无色</font>',
}
local jianxiong = fk.CreateTriggerSkill{
name = "jianxiong",
anim_type = "masochism",
events = {fk.Damaged},
can_trigger = function(self, event, target, player, data)
local room = target.room
return data.card ~= nil and
target == player and
target:hasSkill(self.name) and
room:getCardArea(data.card) == Card.Processing and
not target.dead
end,
on_use = function(self, event, target, player, data)
local room = player.room
room:obtainCard(player.id, data.card, false)
end,
}
local caocao = General:new(extension, "caocao", "wei", 4)
caocao:addSkill(jianxiong)
Fk:loadTranslationTable{
["caocao"] = "曹操",
["jianxiong"] = "奸雄",
[":jianxiong"] = "当你受到伤害后,你可以获得对你造成伤害的牌。",
}
local guicai = fk.CreateTriggerSkill{
name = "guicai",
anim_type = "control",
events = {fk.AskForRetrial},
can_trigger = function(self, event, target, player, data)
return player:hasSkill(self.name) and not player:isKongcheng()
end,
on_cost = function(self, event, target, player, data)
local room = player.room
local prompt = "#guicai-ask::" .. target.id
local card = room:askForResponse(player, self.name, ".|.|.|hand", prompt, true)
if card ~= nil then
self.cost_data = card
return true
end
end,
on_use = function(self, event, target, player, data)
local room = player.room
room:retrial(self.cost_data, player, data, self.name)
end,
}
local fankui = fk.CreateTriggerSkill{
name = "fankui",
anim_type = "masochism",
events = {fk.Damaged},
frequency = Skill.NotFrequent,
can_trigger = function(self, event, target, player, data)
local room = target.room
local from = data.from
return from ~= nil and
target == player and
target:hasSkill(self.name) and
(not from:isNude()) and
not target.dead
end,
on_use = function(self, event, target, player, data)
local room = player.room
local from = data.from
local card = room:askForCardChosen(player, from, "he", self.name)
room:obtainCard(player.id, card, false)
end
}
local simayi = General:new(extension, "simayi", "wei", 3)
simayi:addSkill(guicai)
simayi:addSkill(fankui)
Fk:loadTranslationTable{
["simayi"] = "司马懿",
["guicai"] = "鬼才",
[":guicai"] = "当一名角色的判定牌生效前,你可以打出一张手牌代替之。",
["#guicai-ask"] = "是否发动“鬼才”,打出一张手牌修改 %dest 的判定?",
["fankui"] = "反馈",
[":fankui"] = "当你受到伤害后,你可以获得伤害来源的一张牌。",
}
local ganglie = fk.CreateTriggerSkill{
name = "ganglie",
anim_type = "masochism",
events = {fk.Damaged},
can_trigger = function(self, event, target, player, data)
local room = target.room
return data.from ~= nil and
target == player and
target:hasSkill(self.name) and
not target.dead
end,
on_use = function(self, event, target, player, data)
local room = player.room
local from = data.from
local judge = {
who = player,
reason = self.name,
pattern = ".|.|spade,club,diamond",
}
room:judge(judge)
if judge.card.suit ~= Card.Heart then
local discards = room:askForDiscard(from, 2, 2, false, self.name, true)
if #discards == 0 then
room:damage{
from = player,
to = from,
damage = 1,
skillName = self.name,
}
end
end
end,
}
local xiahoudun = General:new(extension, "xiahoudun", "wei", 4)
xiahoudun:addSkill(ganglie)
Fk:loadTranslationTable{
["xiahoudun"] = "夏侯惇",
["ganglie"] = "刚烈",
[":ganglie"] = "当你受到伤害后你可以进行判定若结果不为红桃则伤害来源选择一项弃置两张手牌或受到1点伤害。",
}
local tuxi = fk.CreateTriggerSkill{
name = "tuxi",
anim_type = "control",
events = {fk.EventPhaseStart},
can_trigger = function(self, event, target, player, data)
local ret = (target == player and player:hasSkill(self.name) and player.phase == Player.Draw)
if ret then
local room = player.room
for _, p in ipairs(room:getOtherPlayers(player)) do
if not p:isKongcheng() then
return true
end
end
end
end,
on_cost = function(self, event, target, player, data)
local room = player.room
local other = room:getOtherPlayers(player)
local targets = {}
for _, p in ipairs(other) do
if not p:isKongcheng() then
table.insert(targets, p.id)
end
end
local result = room:askForChoosePlayers(player, targets, 1, 2, "#tuxi-ask", self.name)
if #result > 0 then
self.cost_data = result
return true
end
end,
on_use = function(self, event, target, player, data)
local room = player.room
for _, id in ipairs(self.cost_data) do
local p = room:getPlayerById(id)
local c = room:askForCardChosen(player, p, "h", self.name)
room:obtainCard(player.id, c, false)
end
return true
end,
}
local zhangliao = General:new(extension, "zhangliao", "wei", 4)
zhangliao:addSkill(tuxi)
Fk:loadTranslationTable{
["zhangliao"] = "张辽",
["tuxi"] = "突袭",
[":tuxi"] = "摸牌阶段,你可以改为获得至多两名其他角色的各一张手牌。",
["#tuxi-ask"] = "是否发动“突袭”改为获得1-2名角色各一张手牌",
}
local luoyi = fk.CreateTriggerSkill{
name = "luoyi",
anim_type = "offensive",
events = {fk.DrawNCards},
can_trigger = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and data.n > 0
end,
on_use = function(self, event, target, player, data)
data.n = data.n - 1
end,
refresh_events = {fk.DamageCaused},
can_refresh = function(self, event, target, player, data)
if not (target == player and player:hasSkill(self.name) and
player:usedSkillTimes(self.name) > 0) then
return
end
local c = data.card
return c and c.name == "slash" or c.name == "duel"
end,
on_refresh = function(self, event, target, player, data)
local room = player.room
room:broadcastSkillInvoke(self.name)
room:notifySkillInvoked(player, self.name)
data.damage = data.damage + 1
end,
}
local xuchu = General:new(extension, "xuchu", "wei", 4)
xuchu:addSkill(luoyi)
Fk:loadTranslationTable{
["xuchu"] = "许褚",
["luoyi"] = "裸衣",
[":luoyi"] = "摸牌阶段,你可以少摸一张牌,若如此做,本回合你使用【杀】或【决斗】对目标角色造成伤害时,此伤害+1。",
}
local tiandu = fk.CreateTriggerSkill{
name = "tiandu",
events = {fk.FinishJudge},
on_use = function(self, event, target, player, data)
local room = player.room
room:obtainCard(player.id, data.card)
end,
}
local yiji = fk.CreateTriggerSkill{
name = "yiji",
anim_type = "masochism",
events = {fk.Damaged},
on_trigger = function(self, event, target, player, data)
self.cancel_cost = false
for i = 1, data.damage do
if self.cancel_cost then break end
self:doCost(event, target, player, data)
end
end,
on_cost = function(self, event, target, player, data)
local room = player.room
if room:askForSkillInvoke(player, self.name, data) then
return true
end
self.cancel_cost = true
end,
on_use = function(self, event, target, player, data)
-- TODO: yiji logic
player:drawCards(2)
end,
}
local guojia = General:new(extension, "guojia", "wei", 3)
guojia:addSkill(tiandu)
guojia:addSkill(yiji)
Fk:loadTranslationTable{
["guojia"] = "郭嘉",
["tiandu"] = "天妒",
[":tiandu"] = "当你的判定牌生效后,你可以获得之。",
["yiji"] = "遗计",
[":yiji"] = "每当你受到1点伤害后你可以观看牌堆顶的两张牌并任意分配它们。",
}
local luoshen = fk.CreateTriggerSkill{
name = "luoshen",
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.Start
end,
on_use = function(self, event, target, player, data)
local room = player.room
while true do
local judge = {
who = player,
reason = self.name,
pattern = ".|A~K|spade,club",
}
room:judge(judge)
if judge.card.color ~= Card.Black then
break
end
if not room:askForSkillInvoke(player, self.name) then
break
end
end
end,
refresh_events = {fk.FinishJudge},
can_refresh = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and
data.reason == self.name and data.card.color == Card.Black
end,
on_refresh = function(self, event, target, player, data)
local room = player.room
room:obtainCard(player.id, data.card)
end,
}
local qingguo = fk.CreateViewAsSkill{
name = "qingguo",
anim_type = "defensive",
pattern = "jink",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
return Fk:getCardById(to_select).color == Card.Black
and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local c = Fk:cloneCard("jink")
c:addSubcard(cards[1])
return c
end,
}
local zhenji = General:new(extension, "zhenji", "wei", 3, 3, General.Female)
zhenji:addSkill(luoshen)
zhenji:addSkill(qingguo)
Fk:loadTranslationTable{
["zhenji"] = "甄姬",
["luoshen"] = "洛神",
[":luoshen"] = "准备阶段开始时,你可以进行判定:若结果为黑色,判定牌生效后你获得之,然后你可以再次发动“洛神”。",
["qingguo"] = "倾国",
[":qingguo"] = "你可以将一张黑色手牌当【闪】使用或打出。",
}
local rendetrig = fk.CreateTriggerSkill{
name = "#rendetrig",
mute = true,
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)
local room = player.room
room:setPlayerMark(player, "_rende_cards", 0)
end,
}
local rende = fk.CreateActiveSkill{
name = "rende",
anim_type = "support",
card_filter = function(self, to_select, selected)
return Fk:currentRoom():getCardArea(to_select) ~= Card.PlayerEquip
end,
target_filter = function(self, to_select, selected)
return #selected == 0 and to_select ~= Self.id
end,
target_num = 1,
min_card_num = 1,
on_use = function(self, room, effect)
local target = room:getPlayerById(effect.tos[1])
local player = room:getPlayerById(effect.from)
local cards = effect.cards
local marks = player:getMark("_rende_cards")
local dummy = Fk:cloneCard'slash'
dummy:addSubcards(cards)
room:obtainCard(target.id, dummy, false, fk.ReasonGive)
room:addPlayerMark(player, "_rende_cards", #cards)
if marks < 2 and marks + #cards >= 2 and player:isWounded() then
room:recover{
who = player,
num = 1,
skillName = self.name
}
end
end,
}
rende:addRelatedSkill(rendetrig)
local liubei = General:new(extension, "liubei", "shu", 4)
liubei:addSkill(rende)
Fk:loadTranslationTable{
["liubei"] = "刘备",
["rende"] = "仁德",
[":rende"] = "出牌阶段你可以将至少一张手牌任意分配给其他角色。你于本阶段内以此法给出的手牌首次达到两张或更多后你回复1点体力。",
}
local wusheng = fk.CreateViewAsSkill{
name = "wusheng",
anim_type = "offensive",
pattern = "slash",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
return Fk:getCardById(to_select).color == Card.Red
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local c = Fk:cloneCard("slash")
c:addSubcard(cards[1])
return c
end,
}
local guanyu = General:new(extension, "guanyu", "shu", 4)
guanyu:addSkill(wusheng)
Fk:loadTranslationTable{
["guanyu"] = "关羽",
["wusheng"] = "武圣",
[":wusheng"] = "你可以将一张红色牌当【杀】使用或打出。",
}
local paoxiaoAudio = fk.CreateTriggerSkill{
name = "#paoxiaoAudio",
refresh_events = {fk.CardUsing},
can_refresh = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and
data.card.name == "slash" and
player:usedCardTimes("slash") > 1
end,
on_refresh = function(self, event, target, player, data)
player.room:broadcastSkillInvoke("paoxiao")
player.room:doAnimate("InvokeSkill", {
name = "paoxiao",
player = player.id,
skill_type = "offensive",
})
end,
}
local paoxiao = fk.CreateTargetModSkill{
name = "paoxiao",
residue_func = function(self, player, skill, scope)
if player:hasSkill(self.name) and skill.name == "slash_skill"
and scope == Player.HistoryPhase then
return 999
end
end,
}
paoxiao:addRelatedSkill(paoxiaoAudio)
local zhangfei = General:new(extension, "zhangfei", "shu", 4)
zhangfei:addSkill(paoxiao)
Fk:loadTranslationTable{
["zhangfei"] = "张飞",
["paoxiao"] = "咆哮",
[":paoxiao"] = "锁定技,出牌阶段,你使用【杀】无次数限制。",
}
local guanxing = fk.CreateTriggerSkill{
name = "guanxing",
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.Start
end,
on_use = function(self, event, target, player, data)
local room = player.room
room:askForGuanxing(player, room:getNCards(math.min(5, #room.alive_players)))
end,
}
local kongchengAudio = fk.CreateTriggerSkill{
name = "#kongchengAudio",
refresh_events = {fk.AfterCardsMove},
can_refresh = function(self, event, target, player, data)
if not player:hasSkill(self.name) then return end
if not player:isKongcheng() then return end
for _, move in ipairs(data) do
if move.from == player.id then
for _, info in ipairs(move.moveInfo) do
if info.fromArea == Card.PlayerHand then
return true
end
end
end
end
end,
on_refresh = function(self, event, target, player, data)
player.room:broadcastSkillInvoke("kongcheng")
player.room:doAnimate("InvokeSkill", {
name = "kongcheng",
player = player.id,
skill_type = "defensive",
})
end,
}
local kongcheng = fk.CreateProhibitSkill{
name = "kongcheng",
is_prohibited = function(self, from, to, card)
if to:hasSkill(self.name) and to:isKongcheng() then
return card.name == "slash" or card.name == "duel"
end
end,
}
kongcheng:addRelatedSkill(kongchengAudio)
local zhugeliang = General:new(extension, "zhugeliang", "shu", 3)
zhugeliang:addSkill(guanxing)
zhugeliang:addSkill(kongcheng)
Fk:loadTranslationTable{
["zhugeliang"] = "诸葛亮",
["guanxing"] = "观星",
[":guanxing"] = "准备阶段开始时你可以观看牌堆顶的X张牌然后将任意数量的牌置于牌堆顶将其余的牌置于牌堆底。X为存活角色数且至多为5",
["kongcheng"] = "空城",
[":kongcheng"] = "锁定技,若你没有手牌,你不能被选择为【杀】或【决斗】的目标。",
}
local longdan = fk.CreateViewAsSkill{
name = "longdan",
pattern = "slash,jink",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
local c = Fk:getCardById(to_select)
return c.name == "slash" or c.name == "jink"
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local _c = Fk:getCardById(cards[1])
local c
if _c.name == "slash" then
c = Fk:cloneCard("jink")
elseif _c.name == "jink" then
c = Fk:cloneCard("slash")
end
c:addSubcard(cards[1])
return c
end,
}
local zhaoyun = General:new(extension, "zhaoyun", "shu", 4)
zhaoyun:addSkill(longdan)
Fk:loadTranslationTable{
["zhaoyun"] = "赵云",
["longdan"] = "龙胆",
[":longdan"] = "你可以将一张【杀】当【闪】使用或打出,或将一张【闪】当普通【杀】使用或打出。",
}
local mashu = fk.CreateDistanceSkill{
name = "mashu",
correct_func = function(self, from, to)
if from:hasSkill(self.name) then
return -1
end
end,
}
local tieqi = fk.CreateTriggerSkill{
name = "tieqi",
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.name == "slash"
end,
on_use = function(self, event, target, player, data)
local room = player.room
local judge = {
who = player,
reason = self.name,
pattern = ".|.|heart,diamond",
}
room:judge(judge)
if judge.card.color == Card.Red then
data.disresponsive = true
end
end,
}
local machao = General:new(extension, "machao", "shu", 4)
machao:addSkill(mashu)
machao:addSkill(tieqi)
Fk:loadTranslationTable{
["machao"] = "马超",
["mashu"] = "马术",
[":mashu"] = "锁定技。你与其他角色的距离-1。",
["tieqi"] = "铁骑",
[":tieqi"] = "每当你指定【杀】的目标后,你可以进行判定:若结果为红色,该角色不能使用【闪】响应此【杀】。",
}
local jizhi = fk.CreateTriggerSkill{
name = "jizhi",
anim_type = "drawcard",
events = {fk.CardUsing},
can_trigger = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and
data.card.type == Card.TypeTrick and
data.card.sub_type ~= Card.SubtypeDelayedTrick
end,
on_use = function(self, event, target, player, data)
player:drawCards(1, self.name)
end,
}
local qicai = fk.CreateTargetModSkill{
name = "qicai",
distance_limit_func = function(self, player, skill)
local card_name = string.sub(skill.name, 1, -7) -- assuming all card skill is named with name_skill
local card = Fk:cloneCard(card_name)
if player:hasSkill(self.name) and card.type == Card.TypeTrick then
return 999
end
end,
}
local huangyueying = General:new(extension, "huangyueying", "shu", 3, 3, General.Female)
huangyueying:addSkill(jizhi)
huangyueying:addSkill(qicai)
Fk:loadTranslationTable{
["huangyueying"] = "黄月英",
["jizhi"] = "集智",
[":jizhi"] = "每当你使用一张非延时锦囊牌时,你可以摸一张牌。",
["qicai"] = "奇才",
[":qicai"] = "锁定技。你使用锦囊牌无距离限制。",
}
local zhiheng = fk.CreateActiveSkill{
name = "zhiheng",
anim_type = "drawcard",
can_use = function(self, player)
return player:usedSkillTimes(self.name) == 0
end,
target_num = 0,
min_card_num = 1,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
room:throwCard(effect.cards, self.name, from)
room:drawCards(from, #effect.cards, self.name)
end
}
local sunquan = General:new(extension, "sunquan", "wu", 4)
sunquan:addSkill(zhiheng)
Fk:loadTranslationTable{
["sunquan"] = "孙权",
["zhiheng"] = "制衡",
[":zhiheng"] = "阶段技,你可以弃置至少一张牌然后摸等量的牌。",
}
local qixi = fk.CreateViewAsSkill{
name = "qixi",
anim_type = "control",
pattern = "dismantlement",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
return Fk:getCardById(to_select).color == Card.Black
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local c = Fk:cloneCard("dismantlement")
c:addSubcard(cards[1])
return c
end,
}
local ganning = General:new(extension, "ganning", "wu", 4)
ganning:addSkill(qixi)
Fk:loadTranslationTable{
["ganning"] = "甘宁",
["qixi"] = "奇袭",
[":qixi"] = "你可以将一张黑色牌当【过河拆桥】使用。",
}
local keji = fk.CreateTriggerSkill{
name = "keji",
anim_type = "defensive",
events = {fk.EventPhaseChanging},
can_trigger = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and
data.to == Player.Discard and
player:usedCardTimes("slash") < 1 and
player:getMark("_keji_played_slash") == 0
end,
on_use = function(self, event, target, player, data)
return true
end,
refresh_events = {fk.CardResponding, fk.EventPhaseStart},
can_refresh = function(self, event, target, player, data)
if not (target == player and player:hasSkill(self.name)) then
return false
end
if event == fk.CardResponding then
return data.card.name == "slash"
elseif event == fk.EventPhaseStart then
return player.phase == player.NotActive
end
end,
on_refresh = function(self, event, target, player, data)
local room = player.room
if event == fk.CardResponding then
room:addPlayerMark(player, "_keji_played_slash", 1)
elseif event == fk.EventPhaseStart then
room:setPlayerMark(player, "_keji_played_slash", 0)
end
end
}
local lvmeng = General:new(extension, "lvmeng", "wu", 4)
lvmeng:addSkill(keji)
Fk:loadTranslationTable{
["lvmeng"] = "吕蒙",
["keji"] = "克己",
[":keji"] = "若你未于出牌阶段内使用或打出【杀】,你可以跳过弃牌阶段。",
}
local kurou = fk.CreateActiveSkill{
name = "kurou",
anim_type = "drawcard",
card_filter = function(self, to_select, selected, selected_targets)
return false
end,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
room:loseHp(from, 1, self.name)
if from:isAlive() then
room:drawCards(from, 2, self.name)
end
end
}
local huanggai = General:new(extension, "huanggai", "wu", 4)
huanggai:addSkill(kurou)
Fk:loadTranslationTable{
["huanggai"] = "黄盖",
["kurou"] = "苦肉",
[":kurou"] = "出牌阶段你可以失去1点体力然后摸两张牌。",
}
local yingzi = fk.CreateTriggerSkill{
name = "yingzi",
anim_type = "drawcard",
events = {fk.DrawNCards},
on_use = function(self, event, target, player, data)
data.n = data.n + 1
end,
}
local fanjian = fk.CreateActiveSkill{
name = "fanjian",
can_use = function(self, player)
return player:usedSkillTimes(self.name) < 1 and not player:isKongcheng()
end,
card_filter = function() return false end,
target_filter = function(self, to_select, selected)
return #selected == 0 and to_select ~= Self.id
end,
target_num = 1,
on_use = function(self, room, effect)
local player = room:getPlayerById(effect.from)
local target = room:getPlayerById(effect.tos[1])
local choice = room:askForChoice(target, {"spade", "heart", "club", "diamond"}, self.name)
local card = room:askForCardChosen(target, player, 'h', self.name)
room:obtainCard(target.id, card, true)
if Fk:getCardById(card):getSuitString() ~= choice then
room:damage{
from = player,
to = target,
damage = 1,
skillName = self.name,
}
end
end,
}
local zhouyu = General:new(extension, "zhouyu", "wu", 3)
zhouyu:addSkill(yingzi)
zhouyu:addSkill(fanjian)
Fk:loadTranslationTable{
["zhouyu"] = "周瑜",
["yingzi"] = "英姿",
[":yingzi"] = "摸牌阶段,你可以多摸一张牌。",
["fanjian"] = "反间",
[":fanjian"] = "阶段技。你可以令一名其他角色选择一种花色然后正面朝上获得你的一张手牌。若此牌花色与该角色所选花色不同你对其造成1点伤害。",
}
local guose = fk.CreateViewAsSkill{
name = "guose",
anim_type = "control",
pattern = "indulgence",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
return Fk:getCardById(to_select).suit == Card.Diamond
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local c = Fk:cloneCard("indulgence")
c:addSubcard(cards[1])
return c
end,
}
local liuli = fk.CreateTriggerSkill{
name = "liuli",
anim_type = "defensive",
events = {fk.TargetConfirming},
can_trigger = function(self, event, target, player, data)
local ret = target == player and player:hasSkill(self.name) and
data.card.name == "slash"
if ret then
self.target_list = {}
local room = player.room
for _, p in ipairs(room:getOtherPlayers(player)) do
if p.id ~= data.from and player:inMyAttackRange(p) then
table.insert(self.target_list, p.id)
end
end
return #self.target_list > 0
end
end,
on_cost = function(self, event, target, player, data)
local room = player.room
local prompt = "#liuli-target"
local plist, cid = room:askForChooseCardAndPlayers(player, self.target_list, 1, 1, nil, prompt, self.name)
if #plist > 0 then
self.cost_data = {plist[1], cid}
return true
end
end,
on_use = function(self, event, target, player, data)
local room = player.room
local to = self.cost_data[1]
room:doIndicate(player.id, { to })
room:throwCard(self.cost_data[2], self.name, player, player)
TargetGroup:removeTarget(data.targetGroup, player.id)
TargetGroup:pushTargets(data.targetGroup, to)
end,
}
local daqiao = General:new(extension, "daqiao", "wu", 3, 3, General.Female)
daqiao:addSkill(guose)
daqiao:addSkill(liuli)
Fk:loadTranslationTable{
["daqiao"] = "大乔",
["guose"] = "国色",
[":guose"] = "你可以将一张方块牌当【乐不思蜀】使用。",
["liuli"] = "流离",
[":liuli"] = "每当你成为【杀】的目标时,你可以弃置一张牌并选择你攻击范围内为此【杀】合法目标(无距离限制)的一名角色:若如此做,该角色代替你成为此【杀】的目标。",
["#liuli-target"] = "流离:你可以弃置一张牌,将【杀】的目标转移给一名其他角色",
}
local qianxun = fk.CreateProhibitSkill{
name = "qianxun",
is_prohibited = function(self, from, to, card)
if to:hasSkill(self.name) then
return card.name == "indulgence" or card.name == "snatch"
end
end,
}
local lianying = fk.CreateTriggerSkill{
name = "lianying",
anim_type = "drawcard",
events = {fk.AfterCardsMove},
can_trigger = function(self, event, target, player, data)
if not player:hasSkill(self.name) then return end
if not player:isKongcheng() then return end
for _, move in ipairs(data) do
if move.from == player.id then
for _, info in ipairs(move.moveInfo) do
if info.fromArea == Card.PlayerHand then
return true
end
end
end
end
end,
on_use = function(self, event, target, player, data)
player:drawCards(1, self.name)
end,
}
local luxun = General:new(extension, "luxun", "wu", 3)
luxun:addSkill(qianxun)
luxun:addSkill(lianying)
Fk:loadTranslationTable{
["luxun"] = "陆逊",
["qianxun"] = "谦逊",
[":qianxun"] = "锁定技,你不能被选择为【顺手牵羊】与【乐不思蜀】的目标。",
["lianying"] = "连营",
[":lianying"] = "每当你失去最后的手牌后,你可以摸一张牌。",
}
local xiaoji = fk.CreateTriggerSkill{
name = "xiaoji",
anim_type = "drawcard",
events = {fk.AfterCardsMove},
can_trigger = function(self, event, target, player, data)
if not player:hasSkill(self.name) then return end
self.trigger_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.PlayerEquip then
self.trigger_times = self.trigger_times + 1
end
end
end
end
return self.trigger_times > 0
end,
on_trigger = function(self, event, target, player, data)
local ret
for i = 1, self.trigger_times do
ret = self:doCost(event, target, player, data)
if ret then return ret end
end
end,
on_use = function(self, event, target, player, data)
player:drawCards(2, self.name)
end,
}
local jieyin = fk.CreateActiveSkill{
name = "jieyin",
anim_type = "support",
can_use = function(self, player)
return player:usedSkillTimes(self.name) == 0
end,
card_filter = function(self, to_select, selected)
return #selected < 2 and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip
end,
target_filter = function(self, to_select, selected)
local target = Fk:currentRoom():getPlayerById(to_select)
local name = target.general
return target:isWounded() and
target.gender == General.Male
and #selected < 1
end,
target_num = 1,
card_num = 2,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
room:throwCard(effect.cards, self.name, from)
room:recover({
who = room:getPlayerById(effect.tos[1]),
num = 1,
recoverBy = effect.from,
skillName = self.name
})
if from:isWounded() then
room:recover({
who = room:getPlayerById(effect.from),
num = 1,
recoverBy = effect.from,
skillName = self.name
})
end
end
}
local sunshangxiang = General:new(extension, "sunshangxiang", "wu", 3, 3, General.Female)
sunshangxiang:addSkill(xiaoji)
sunshangxiang:addSkill(jieyin)
Fk:loadTranslationTable{
["sunshangxiang"] = "孙尚香",
["xiaoji"] = "枭姬",
[":xiaoji"] = "每当你失去一张装备区的装备牌后,你可以摸两张牌。",
["jieyin"] = "结姻",
[":jieyin"] = "阶段技你可以弃置两张手牌并选择一名已受伤的男性角色若如此做你和该角色各回复1点体力。",
}
local qingnang = fk.CreateActiveSkill{
name = "qingnang",
anim_type = "support",
can_use = function(self, player)
return player:usedSkillTimes(self.name) == 0
end,
card_filter = function(self, to_select, selected, targets)
return #selected == 0 and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip
end,
target_filter = function(self, to_select, selected, cards)
return #selected == 0 and Fk:currentRoom():getPlayerById(to_select):isWounded()
end,
target_num = 1,
card_num = 1,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
room:throwCard(effect.cards, self.name, from)
room:recover({
who = room:getPlayerById(effect.tos[1]),
num = 1,
recoverBy = effect.from,
skillName = self.name
})
end,
}
local jijiu = fk.CreateViewAsSkill{
name = "jijiu",
anim_type = "support",
pattern = "peach",
card_filter = function(self, to_select, selected)
if #selected == 1 then return false end
return Fk:getCardById(to_select).color == Card.Red
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
local c = Fk:cloneCard("peach")
c:addSubcard(cards[1])
return c
end,
enabled_at_play = function(self, player)
return false
end,
enabled_at_response = function(self, player)
return player.phase == Player.NotActive
end,
}
local huatuo = General:new(extension, "huatuo", "qun", 3)
huatuo:addSkill(qingnang)
huatuo:addSkill(jijiu)
Fk:loadTranslationTable{
["huatuo"] = "华佗",
["qingnang"] = "青囊",
[":qingnang"] = "阶段技你可以弃置一张手牌并选择一名已受伤的角色若如此做该角色回复1点体力。",
["jijiu"] = "急救",
[":jijiu"] = "你的回合外,你可以将一张红色牌当【桃】使用。",
}
local lvbu = General:new(extension, "lvbu", "qun", 4)
Fk:loadTranslationTable{
["lvbu"] = "吕布",
}
local lijian = fk.CreateActiveSkill{
name = "lijian",
anim_type = "offensive",
can_use = function(self, player)
return player:usedSkillTimes(self.name) == 0
end,
card_filter = function(self, to_select, selected)
return #selected == 0
end,
target_filter = function(self, to_select, selected)
return #selected < 2 and to_select ~= Self.id and
Fk:currentRoom():getPlayerById(to_select).gender == General.Male
end,
target_num = 2,
min_card_num = 1,
on_use = function(self, room, use)
room:throwCard(use.cards, self.name, room:getPlayerById(use.from))
local duel = Fk:cloneCard("duel")
local new_use = {} ---@type CardUseStruct
new_use.from = use.tos[2]
new_use.tos = { { use.tos[1] } }
new_use.card = duel
new_use.unoffsetableList = table.map(room:getAlivePlayers(), function(e)
return e.id
end)
room:useCard(new_use)
end,
}
local biyue = fk.CreateTriggerSkill{
name = "biyue",
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.Finish
end,
on_use = function(self, event, target, player, data)
player:drawCards(1)
end,
}
local diaochan = General:new(extension, "diaochan", "qun", 3, 3, General.Female)
diaochan:addSkill(lijian)
diaochan:addSkill(biyue)
Fk:loadTranslationTable{
["diaochan"] = "貂蝉",
["lijian"] = "离间",
[":lijian"] = "阶段技,你可以弃置一张牌并选择两名其他男性角色,后选择的角色视为对先选择的角色使用了一张不能被无懈可击的决斗。",
["biyue"] = "闭月",
[":biyue"] = "结束阶段开始时,你可以摸一张牌。",
}
return extension