2023-04-09 05:35:35 +00:00
|
|
|
|
-- SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local extension = Package:new("standard")
|
2022-03-31 05:29:23 +00:00
|
|
|
|
extension.metadata = require "packages.standard.metadata"
|
2022-04-01 12:51:01 +00:00
|
|
|
|
dofile "packages/standard/game_rule.lua"
|
2022-09-15 03:17:13 +00:00
|
|
|
|
dofile "packages/standard/aux_skills.lua"
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local jianxiong = fk.CreateTriggerSkill{
|
|
|
|
|
name = "jianxiong",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "masochism",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
events = {fk.Damaged},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
local room = target.room
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return target == player and player:hasSkill(self.name) and data.card and
|
2023-08-02 13:50:47 +00:00
|
|
|
|
table.every(data.card:isVirtual() and data.card.subcards or {data.card.id}, function(id) return room:getCardArea(id) == Card.Processing end)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
2023-08-02 13:50:47 +00:00
|
|
|
|
player.room:obtainCard(player.id, data.card, true, fk.ReasonJustMove)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2023-04-15 04:06:24 +00:00
|
|
|
|
|
|
|
|
|
local hujia = fk.CreateViewAsSkill{
|
|
|
|
|
name = "hujia$",
|
|
|
|
|
anim_type = "defensive",
|
|
|
|
|
pattern = "jink",
|
|
|
|
|
card_filter = function(self, to_select, selected)
|
|
|
|
|
return false
|
|
|
|
|
end,
|
|
|
|
|
view_as = function(self, cards)
|
|
|
|
|
if #cards ~= 0 then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
local c = Fk:cloneCard("jink")
|
|
|
|
|
c.skillName = self.name
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
enabled_at_play = function(self, player)
|
|
|
|
|
return false
|
|
|
|
|
end,
|
|
|
|
|
enabled_at_response = function(self, player)
|
|
|
|
|
return not table.every(Fk:currentRoom().alive_players, function(p)
|
|
|
|
|
return p == player or p.kingdom ~= "wei"
|
|
|
|
|
end)
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
local hujiaResponse = fk.CreateTriggerSkill{
|
|
|
|
|
name = "#hujiaResponse",
|
|
|
|
|
events = {fk.PreCardUse, fk.PreCardRespond},
|
|
|
|
|
mute = true,
|
|
|
|
|
priority = 10,
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:hasSkill(self.name, true) and table.contains(data.card.skillNames, "hujia")
|
|
|
|
|
end,
|
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
|
|
|
|
room:doIndicate(player.id, TargetGroup:getRealTargets(data.tos))
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
|
|
|
|
for _, p in ipairs(room:getOtherPlayers(player)) do
|
|
|
|
|
if p.kingdom == "wei" then
|
2023-07-14 14:17:54 +00:00
|
|
|
|
local cardResponded = room:askForResponse(p, "jink", "jink", "#hujia-ask:" .. player.id, true)
|
2023-04-15 04:06:24 +00:00
|
|
|
|
if cardResponded then
|
|
|
|
|
room:responseCard({
|
|
|
|
|
from = p.id,
|
|
|
|
|
card = cardResponded,
|
|
|
|
|
skipDrop = true,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
data.card = cardResponded
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if event == fk.PreCardUse and player.phase == Player.Play then
|
|
|
|
|
room:setPlayerMark(player, "hujia-failed-phase", 1)
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
refresh_events = {fk.CardUsing},
|
|
|
|
|
can_refresh = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:hasSkill(self.name, true) and player:getMark("hujia-failed-phase") > 0
|
|
|
|
|
end,
|
|
|
|
|
on_refresh = function(self, event, target, player, data)
|
|
|
|
|
player.room:setPlayerMark(player, "hujia-failed-phase", 0)
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
hujia:addRelatedSkill(hujiaResponse)
|
|
|
|
|
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local caocao = General:new(extension, "caocao", "wei", 4)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
caocao:addSkill(jianxiong)
|
2023-04-15 04:06:24 +00:00
|
|
|
|
caocao:addSkill(hujia)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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,
|
|
|
|
|
}
|
2023-01-07 07:20:44 +00:00
|
|
|
|
local fankui = fk.CreateTriggerSkill{
|
|
|
|
|
name = "fankui",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "masochism",
|
2023-01-07 07:20:44 +00:00
|
|
|
|
events = {fk.Damaged},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
if target == player and player:hasSkill(self.name) and data.from and not data.from.dead then
|
|
|
|
|
if data.from == player then
|
|
|
|
|
return #player.player_cards[Player.Equip] > 0
|
|
|
|
|
else
|
|
|
|
|
return not data.from:isNude()
|
|
|
|
|
end
|
|
|
|
|
end
|
2023-01-07 07:20:44 +00:00
|
|
|
|
end,
|
2023-01-16 13:04:28 +00:00
|
|
|
|
on_use = function(self, event, target, player, data)
|
2023-01-07 07:20:44 +00:00
|
|
|
|
local room = player.room
|
2023-02-15 11:54:35 +00:00
|
|
|
|
local from = data.from
|
2023-08-03 07:26:52 +00:00
|
|
|
|
local flag = from == player and "e" or "he"
|
2023-07-11 13:15:38 +00:00
|
|
|
|
local card = room:askForCardChosen(player, from, flag, self.name)
|
|
|
|
|
room:obtainCard(player.id, card, false, fk.ReasonPrey)
|
2023-01-07 07:20:44 +00:00
|
|
|
|
end
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local simayi = General:new(extension, "simayi", "wei", 3)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
simayi:addSkill(guicai)
|
2023-01-07 07:20:44 +00:00
|
|
|
|
simayi:addSkill(fankui)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local ganglie = fk.CreateTriggerSkill{
|
|
|
|
|
name = "ganglie",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "masochism",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
events = {fk.Damaged},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return target == player and player:hasSkill(self.name)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
2023-02-15 11:54:35 +00:00
|
|
|
|
local from = data.from
|
2023-07-11 13:15:38 +00:00
|
|
|
|
if from and not from.dead then room:doIndicate(player.id, {from.id}) end
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local judge = {
|
2023-02-15 11:54:35 +00:00
|
|
|
|
who = player,
|
2023-01-21 16:49:11 +00:00
|
|
|
|
reason = self.name,
|
2023-05-13 05:23:18 +00:00
|
|
|
|
pattern = ".|.|^heart",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
}
|
|
|
|
|
room:judge(judge)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
if judge.card.suit ~= Card.Heart and from and not from.dead then
|
2023-02-15 11:54:35 +00:00
|
|
|
|
local discards = room:askForDiscard(from, 2, 2, false, self.name, true)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
if #discards == 0 then
|
|
|
|
|
room:damage{
|
2023-02-15 11:54:35 +00:00
|
|
|
|
from = player,
|
|
|
|
|
to = from,
|
2023-01-21 16:49:11 +00:00
|
|
|
|
damage = 1,
|
|
|
|
|
skillName = self.name,
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local xiahoudun = General:new(extension, "xiahoudun", "wei", 4)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
xiahoudun:addSkill(ganglie)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local tuxi = fk.CreateTriggerSkill{
|
|
|
|
|
name = "tuxi",
|
|
|
|
|
anim_type = "control",
|
|
|
|
|
events = {fk.EventPhaseStart},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return target == player and player:hasSkill(self.name) and player.phase == Player.Draw and
|
|
|
|
|
table.find(player.room:getOtherPlayers(player), function(p) return not p:isKongcheng() end)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
2023-07-11 13:15:38 +00:00
|
|
|
|
local targets = table.map(table.filter(room:getOtherPlayers(player), function(p)
|
|
|
|
|
return not p:isKongcheng() end), function (p) return p.id end)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
|
|
|
|
|
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
|
2023-07-11 13:15:38 +00:00
|
|
|
|
if player.dead then return end
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local p = room:getPlayerById(id)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
if not p.dead then
|
|
|
|
|
local c = room:askForCardChosen(player, p, "h", self.name)
|
|
|
|
|
room:obtainCard(player.id, c, false, fk.ReasonPrey)
|
|
|
|
|
end
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local zhangliao = General:new(extension, "zhangliao", "wei", 4)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
zhangliao:addSkill(tuxi)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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,
|
2023-07-11 13:15:38 +00:00
|
|
|
|
}
|
|
|
|
|
local luoyi_trigger = fk.CreateTriggerSkill{
|
|
|
|
|
name = "#luoyi_trigger",
|
|
|
|
|
mute = true,
|
|
|
|
|
events = {fk.DamageCaused},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:usedSkillTimes("luoyi", Player.HistoryTurn) > 0 and
|
|
|
|
|
not data.chain and data.card and (data.card.trueName == "slash" or data.card.name == "duel")
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
2023-07-11 13:15:38 +00:00
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local room = player.room
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:broadcastSkillInvoke("luoyi")
|
|
|
|
|
room:notifySkillInvoked(player, "luoyi")
|
2023-01-29 10:11:41 +00:00
|
|
|
|
data.damage = data.damage + 1
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local xuchu = General:new(extension, "xuchu", "wei", 4)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
luoyi:addRelatedSkill(luoyi_trigger)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
xuchu:addSkill(luoyi)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local tiandu = fk.CreateTriggerSkill{
|
|
|
|
|
name = "tiandu",
|
2023-07-11 13:15:38 +00:00
|
|
|
|
anim_type = "drawcard",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
events = {fk.FinishJudge},
|
2023-07-11 13:15:38 +00:00
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:hasSkill(self.name) and player.room:getCardArea(data.card) == Card.Processing
|
|
|
|
|
end,
|
2023-01-29 10:11:41 +00:00
|
|
|
|
on_use = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
player.room:obtainCard(player.id, data.card, true, fk.ReasonJustMove)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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)
|
2023-08-02 13:39:03 +00:00
|
|
|
|
local room = player.room
|
|
|
|
|
local ids = room:getNCards(2)
|
|
|
|
|
local fakemove = {
|
|
|
|
|
toArea = Card.PlayerHand,
|
|
|
|
|
to = player.id,
|
|
|
|
|
moveInfo = table.map(ids, function(id) return {cardId = id, fromArea = Card.Void} end),
|
|
|
|
|
moveReason = fk.ReasonJustMove,
|
|
|
|
|
}
|
|
|
|
|
room:notifyMoveCards({player}, {fakemove})
|
|
|
|
|
for _, id in ipairs(ids) do
|
|
|
|
|
room:setCardMark(Fk:getCardById(id), "yiji", 1)
|
|
|
|
|
end
|
|
|
|
|
while table.find(ids, function(id) return Fk:getCardById(id):getMark("yiji") > 0 end) do
|
|
|
|
|
if not room:askForUseActiveSkill(player, "yiji_active", "#yiji-give", true) then
|
|
|
|
|
for _, id in ipairs(ids) do
|
|
|
|
|
room:setCardMark(Fk:getCardById(id), "yiji", 0)
|
|
|
|
|
end
|
|
|
|
|
ids = table.filter(ids, function(id) return room:getCardArea(id) ~= Card.PlayerHand end)
|
|
|
|
|
fakemove = {
|
|
|
|
|
from = player.id,
|
|
|
|
|
toArea = Card.Void,
|
|
|
|
|
moveInfo = table.map(ids, function(id) return {cardId = id, fromArea = Card.PlayerHand} end),
|
|
|
|
|
moveReason = fk.ReasonGive,
|
|
|
|
|
}
|
|
|
|
|
room:notifyMoveCards({player}, {fakemove})
|
|
|
|
|
room:moveCards({
|
|
|
|
|
fromArea = Card.Void,
|
|
|
|
|
ids = ids,
|
|
|
|
|
to = player.id,
|
|
|
|
|
toArea = Card.PlayerHand,
|
|
|
|
|
moveReason = fk.ReasonGive,
|
|
|
|
|
skillName = self.name,
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
local yiji_active = fk.CreateActiveSkill{
|
|
|
|
|
name = "yiji_active",
|
|
|
|
|
mute = true,
|
|
|
|
|
min_card_num = 1,
|
|
|
|
|
target_num = 1,
|
|
|
|
|
card_filter = function(self, to_select, selected, targets)
|
|
|
|
|
return Fk:getCardById(to_select):getMark("yiji") > 0
|
|
|
|
|
end,
|
|
|
|
|
target_filter = function(self, to_select, selected, selected_cards)
|
|
|
|
|
return #selected == 0
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, room, effect)
|
|
|
|
|
local player = room:getPlayerById(effect.from)
|
|
|
|
|
local target = room:getPlayerById(effect.tos[1])
|
|
|
|
|
room:doIndicate(player.id, {target.id})
|
|
|
|
|
for _, id in ipairs(effect.cards) do
|
|
|
|
|
room:setCardMark(Fk:getCardById(id), "yiji", 0)
|
|
|
|
|
end
|
|
|
|
|
local fakemove = {
|
|
|
|
|
from = player.id,
|
|
|
|
|
toArea = Card.Void,
|
|
|
|
|
moveInfo = table.map(effect.cards, function(id) return {cardId = id, fromArea = Card.PlayerHand} end),
|
|
|
|
|
moveReason = fk.ReasonGive,
|
|
|
|
|
}
|
|
|
|
|
room:notifyMoveCards({player}, {fakemove})
|
|
|
|
|
room:moveCards({
|
|
|
|
|
fromArea = Card.Void,
|
|
|
|
|
ids = effect.cards,
|
|
|
|
|
to = target.id,
|
|
|
|
|
toArea = Card.PlayerHand,
|
|
|
|
|
moveReason = fk.ReasonGive,
|
|
|
|
|
skillName = self.name,
|
|
|
|
|
})
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2022-05-01 10:37:13 +00:00
|
|
|
|
local guojia = General:new(extension, "guojia", "wei", 3)
|
2023-08-02 13:39:03 +00:00
|
|
|
|
Fk:addSkill(yiji_active)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
guojia:addSkill(tiandu)
|
|
|
|
|
guojia:addSkill(yiji)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local luoshen = fk.CreateTriggerSkill{
|
|
|
|
|
name = "luoshen",
|
|
|
|
|
anim_type = "drawcard",
|
|
|
|
|
events = {fk.EventPhaseStart},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return target == player and player:hasSkill(self.name) and player.phase == Player.Start
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
|
|
|
|
while true do
|
|
|
|
|
local judge = {
|
|
|
|
|
who = player,
|
|
|
|
|
reason = self.name,
|
2023-07-11 13:15:38 +00:00
|
|
|
|
pattern = ".|.|spade,club",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
}
|
|
|
|
|
room:judge(judge)
|
2023-08-03 07:26:52 +00:00
|
|
|
|
if judge.card.color ~= Card.Black or player.dead or not room:askForSkillInvoke(player, self.name) then
|
2023-01-29 10:11:41 +00:00
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-08-03 07:26:52 +00:00
|
|
|
|
local luoshen_obtain = fk.CreateTriggerSkill{
|
|
|
|
|
name = "#luoshen_obtain",
|
|
|
|
|
mute = true,
|
|
|
|
|
frequency = Skill.Compulsory,
|
|
|
|
|
events = {fk.FinishJudge},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return target == player and data.reason == "luoshen" and data.card.color == Card.Black end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
player.room:obtainCard(player.id, data.card)
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
luoshen:addRelatedSkill(luoshen_obtain)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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
|
2023-08-03 07:26:52 +00:00
|
|
|
|
and Fk:currentRoom():getCardArea(to_select) == Player.Hand
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
view_as = function(self, cards)
|
|
|
|
|
if #cards ~= 1 then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
local c = Fk:cloneCard("jink")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-29 10:11:41 +00:00
|
|
|
|
c:addSubcard(cards[1])
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local zhenji = General:new(extension, "zhenji", "wei", 3, 3, General.Female)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
zhenji:addSkill(luoshen)
|
|
|
|
|
zhenji:addSkill(qingguo)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local rende = fk.CreateActiveSkill{
|
|
|
|
|
name = "rende",
|
|
|
|
|
anim_type = "support",
|
|
|
|
|
card_filter = function(self, to_select, selected)
|
2023-08-02 13:50:47 +00:00
|
|
|
|
return Fk:currentRoom():getCardArea(to_select) == Card.PlayerHand
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
target_filter = function(self, to_select, selected)
|
|
|
|
|
return #selected == 0 and to_select ~= Self.id
|
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 1,
|
|
|
|
|
min_card_num = 1,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local target = room:getPlayerById(effect.tos[1])
|
|
|
|
|
local player = room:getPlayerById(effect.from)
|
|
|
|
|
local cards = effect.cards
|
2023-07-11 13:15:38 +00:00
|
|
|
|
local marks = player:getMark("_rende_cards-phase")
|
2023-08-02 13:50:47 +00:00
|
|
|
|
room:moveCardTo(cards, Player.Hand, target, fk.ReasonGive, self.name, nil, false, player.id)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:addPlayerMark(player, "_rende_cards-phase", #cards)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
if marks < 2 and marks + #cards >= 2 and player:isWounded() then
|
|
|
|
|
room:recover{
|
2023-02-15 11:54:35 +00:00
|
|
|
|
who = player,
|
2023-01-29 10:11:41 +00:00
|
|
|
|
num = 1,
|
2023-07-11 13:15:38 +00:00
|
|
|
|
recoverBy = player,
|
2023-01-29 10:11:41 +00:00
|
|
|
|
skillName = self.name
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-04-15 04:06:24 +00:00
|
|
|
|
|
|
|
|
|
local jijiang = fk.CreateViewAsSkill{
|
|
|
|
|
name = "jijiang$",
|
|
|
|
|
anim_type = "offensive",
|
|
|
|
|
pattern = "slash",
|
|
|
|
|
card_filter = function(self, to_select, selected)
|
|
|
|
|
return false
|
|
|
|
|
end,
|
|
|
|
|
view_as = function(self, cards)
|
|
|
|
|
if #cards ~= 0 then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
local c = Fk:cloneCard("slash")
|
|
|
|
|
c.skillName = self.name
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
enabled_at_play = function(self, player)
|
|
|
|
|
return player:getMark("jijiang-failed-phase") == 0 and not table.every(Fk:currentRoom().alive_players, function(p)
|
|
|
|
|
return p == player or p.kingdom ~= "shu"
|
|
|
|
|
end)
|
|
|
|
|
end,
|
|
|
|
|
enabled_at_response = function(self, player)
|
|
|
|
|
return not table.every(Fk:currentRoom().alive_players, function(p)
|
|
|
|
|
return p == player or p.kingdom ~= "shu"
|
|
|
|
|
end)
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
local jijiangResponse = fk.CreateTriggerSkill{
|
|
|
|
|
name = "#jijiangResponse",
|
|
|
|
|
events = {fk.PreCardUse, fk.PreCardRespond},
|
|
|
|
|
mute = true,
|
|
|
|
|
priority = 10,
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:hasSkill(self.name, true) and table.contains(data.card.skillNames, "jijiang")
|
|
|
|
|
end,
|
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
|
|
|
|
room:doIndicate(player.id, TargetGroup:getRealTargets(data.tos))
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
|
|
|
|
for _, p in ipairs(room:getOtherPlayers(player)) do
|
|
|
|
|
if p.kingdom == "shu" then
|
2023-07-14 14:17:54 +00:00
|
|
|
|
local cardResponded = room:askForResponse(p, "slash", "slash", "#jijiang-ask:" .. player.id, true)
|
2023-04-15 04:06:24 +00:00
|
|
|
|
if cardResponded then
|
|
|
|
|
room:responseCard({
|
|
|
|
|
from = p.id,
|
|
|
|
|
card = cardResponded,
|
|
|
|
|
skipDrop = true,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
data.card = cardResponded
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if event == fk.PreCardUse and player.phase == Player.Play then
|
|
|
|
|
room:setPlayerMark(player, "jijiang-failed-phase", 1)
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end,
|
|
|
|
|
refresh_events = {fk.CardUsing},
|
|
|
|
|
can_refresh = function(self, event, target, player, data)
|
|
|
|
|
return target == player and player:hasSkill(self.name, true) and player:getMark("jijiang-failed-phase") > 0
|
|
|
|
|
end,
|
|
|
|
|
on_refresh = function(self, event, target, player, data)
|
|
|
|
|
player.room:setPlayerMark(player, "jijiang-failed-phase", 0)
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
jijiang:addRelatedSkill(jijiangResponse)
|
|
|
|
|
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local liubei = General:new(extension, "liubei", "shu", 4)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
liubei:addSkill(rende)
|
2023-04-15 04:06:24 +00:00
|
|
|
|
liubei:addSkill(jijiang)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-16 11:13:07 +00:00
|
|
|
|
local wusheng = fk.CreateViewAsSkill{
|
|
|
|
|
name = "wusheng",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "offensive",
|
2023-01-16 11:13:07 +00:00
|
|
|
|
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")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-16 11:13:07 +00:00
|
|
|
|
c:addSubcard(cards[1])
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local guanyu = General:new(extension, "guanyu", "shu", 4)
|
2023-01-16 11:13:07 +00:00
|
|
|
|
guanyu:addSkill(wusheng)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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
|
2023-03-07 02:21:56 +00:00
|
|
|
|
data.card.trueName == "slash" and
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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",
|
2023-06-20 05:37:03 +00:00
|
|
|
|
bypass_times = function(self, player, skill, scope)
|
2023-03-07 02:21:56 +00:00
|
|
|
|
if player:hasSkill(self.name) and skill.trueName == "slash_skill"
|
2023-01-29 10:11:41 +00:00
|
|
|
|
and scope == Player.HistoryPhase then
|
2023-06-18 16:20:50 +00:00
|
|
|
|
return true
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
paoxiao:addRelatedSkill(paoxiaoAudio)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local zhangfei = General:new(extension, "zhangfei", "shu", 4)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
zhangfei:addSkill(paoxiao)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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")
|
2023-07-11 13:15:38 +00:00
|
|
|
|
player.room:notifySkillInvoked(player, "kongcheng", "defensive")
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local kongcheng = fk.CreateProhibitSkill{
|
|
|
|
|
name = "kongcheng",
|
2023-06-11 04:45:12 +00:00
|
|
|
|
frequency = Skill.Compulsory,
|
2023-01-21 16:49:11 +00:00
|
|
|
|
is_prohibited = function(self, from, to, card)
|
|
|
|
|
if to:hasSkill(self.name) and to:isKongcheng() then
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return card.trueName == "slash" or card.trueName == "duel"
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
kongcheng:addRelatedSkill(kongchengAudio)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local zhugeliang = General:new(extension, "zhugeliang", "shu", 3)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
zhugeliang:addSkill(guanxing)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
zhugeliang:addSkill(kongcheng)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local longdan = fk.CreateViewAsSkill{
|
|
|
|
|
name = "longdan",
|
|
|
|
|
pattern = "slash,jink",
|
|
|
|
|
card_filter = function(self, to_select, selected)
|
|
|
|
|
if #selected == 1 then return false end
|
2023-05-13 05:23:18 +00:00
|
|
|
|
local _c = Fk:getCardById(to_select)
|
|
|
|
|
local c
|
|
|
|
|
if _c.trueName == "slash" then
|
|
|
|
|
c = Fk:cloneCard("jink")
|
|
|
|
|
elseif _c.name == "jink" then
|
|
|
|
|
c = Fk:cloneCard("slash")
|
|
|
|
|
else
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
return (Fk.currentResponsePattern == nil and c.skill:canUse(Self)) or (Fk.currentResponsePattern and Exppattern:Parse(Fk.currentResponsePattern):match(c))
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end,
|
|
|
|
|
view_as = function(self, cards)
|
|
|
|
|
if #cards ~= 1 then
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
local _c = Fk:getCardById(cards[1])
|
|
|
|
|
local c
|
2023-03-07 02:21:56 +00:00
|
|
|
|
if _c.trueName == "slash" then
|
2023-01-21 16:49:11 +00:00
|
|
|
|
c = Fk:cloneCard("jink")
|
|
|
|
|
elseif _c.name == "jink" then
|
|
|
|
|
c = Fk:cloneCard("slash")
|
|
|
|
|
end
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-21 16:49:11 +00:00
|
|
|
|
c:addSubcard(cards[1])
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local zhaoyun = General:new(extension, "zhaoyun", "shu", 4)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
zhaoyun:addSkill(longdan)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-04 06:21:29 +00:00
|
|
|
|
local mashu = fk.CreateDistanceSkill{
|
|
|
|
|
name = "mashu",
|
2023-06-11 04:45:12 +00:00
|
|
|
|
frequency = Skill.Compulsory,
|
2023-01-04 06:21:29 +00:00
|
|
|
|
correct_func = function(self, from, to)
|
|
|
|
|
if from:hasSkill(self.name) then
|
|
|
|
|
return -1
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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
|
2023-03-07 02:21:56 +00:00
|
|
|
|
data.card.trueName == "slash"
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local machao = General:new(extension, "machao", "shu", 4)
|
2023-01-04 06:21:29 +00:00
|
|
|
|
machao:addSkill(mashu)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
machao:addSkill(tieqi)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local jizhi = fk.CreateTriggerSkill{
|
|
|
|
|
name = "jizhi",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "drawcard",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
events = {fk.CardUsing},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return target == player and player:hasSkill(self.name) and data.card:isCommonTrick()
|
2023-01-21 16:49:11 +00:00
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
player:drawCards(1, self.name)
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local qicai = fk.CreateTargetModSkill{
|
|
|
|
|
name = "qicai",
|
2023-06-11 04:45:12 +00:00
|
|
|
|
frequency = Skill.Compulsory,
|
2023-07-11 13:15:38 +00:00
|
|
|
|
bypass_distances = function(self, player, skill, card)
|
|
|
|
|
return player:hasSkill(self.name) and card and card.type == Card.TypeTrick
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local huangyueying = General:new(extension, "huangyueying", "shu", 3, 3, General.Female)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
huangyueying:addSkill(jizhi)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
huangyueying:addSkill(qicai)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2022-09-14 05:01:10 +00:00
|
|
|
|
local zhiheng = fk.CreateActiveSkill{
|
|
|
|
|
name = "zhiheng",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "drawcard",
|
|
|
|
|
can_use = function(self, player)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 0,
|
|
|
|
|
min_card_num = 1,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2022-12-20 04:51:54 +00:00
|
|
|
|
local from = room:getPlayerById(effect.from)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:throwCard(effect.cards, self.name, from, from)
|
|
|
|
|
from:drawCards(#effect.cards, self.name)
|
2022-09-14 05:01:10 +00:00
|
|
|
|
end
|
|
|
|
|
}
|
2023-04-15 04:06:24 +00:00
|
|
|
|
|
|
|
|
|
local jiuyuan = fk.CreateTriggerSkill{
|
|
|
|
|
name = "jiuyuan$",
|
|
|
|
|
anim_type = "support",
|
2023-06-04 11:39:20 +00:00
|
|
|
|
frequency = Skill.Compulsory,
|
2023-04-15 04:06:24 +00:00
|
|
|
|
events = {fk.PreHpRecover},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
return
|
|
|
|
|
target == player and
|
|
|
|
|
player:hasSkill(self.name) and
|
|
|
|
|
data.card and
|
|
|
|
|
data.card.trueName == "peach" and
|
|
|
|
|
data.recoverBy and
|
|
|
|
|
data.recoverBy.kingdom == "wu" and
|
|
|
|
|
data.recoverBy ~= player
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
data.num = data.num + 1
|
|
|
|
|
end,
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local sunquan = General:new(extension, "sunquan", "wu", 4)
|
2022-09-14 05:01:10 +00:00
|
|
|
|
sunquan:addSkill(zhiheng)
|
2023-04-15 04:06:24 +00:00
|
|
|
|
sunquan:addSkill(jiuyuan)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local qixi = fk.CreateViewAsSkill{
|
|
|
|
|
name = "qixi",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "control",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
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")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-21 16:49:11 +00:00
|
|
|
|
c:addSubcard(cards[1])
|
|
|
|
|
return c
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local ganning = General:new(extension, "ganning", "wu", 4)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
ganning:addSkill(qixi)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local keji = fk.CreateTriggerSkill{
|
|
|
|
|
name = "keji",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "defensive",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
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
|
2023-01-29 10:11:41 +00:00
|
|
|
|
player:usedCardTimes("slash") < 1 and
|
2023-01-21 16:49:11 +00:00
|
|
|
|
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
|
2023-02-26 08:51:29 +00:00
|
|
|
|
end
|
2023-01-21 16:49:11 +00:00
|
|
|
|
if event == fk.CardResponding then
|
2023-03-14 12:48:08 +00:00
|
|
|
|
return player.phase == Player.Play and data.card.trueName == "slash"
|
2023-01-21 16:49:11 +00:00
|
|
|
|
elseif event == fk.EventPhaseStart then
|
2023-03-14 12:48:08 +00:00
|
|
|
|
return player.phase == Player.NotActive
|
2023-01-21 16:49:11 +00:00
|
|
|
|
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
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local lvmeng = General:new(extension, "lvmeng", "wu", 4)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
lvmeng:addSkill(keji)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-08 06:57:42 +00:00
|
|
|
|
local kurou = fk.CreateActiveSkill{
|
|
|
|
|
name = "kurou",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "drawcard",
|
2023-01-09 11:15:18 +00:00
|
|
|
|
card_filter = function(self, to_select, selected, selected_targets)
|
2023-01-08 06:57:42 +00:00
|
|
|
|
return false
|
|
|
|
|
end,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2023-01-08 06:57:42 +00:00
|
|
|
|
local from = room:getPlayerById(effect.from)
|
|
|
|
|
room:loseHp(from, 1, self.name)
|
2023-01-08 07:05:52 +00:00
|
|
|
|
if from:isAlive() then
|
2023-07-11 13:15:38 +00:00
|
|
|
|
from:drawCards(2, self.name)
|
2023-01-08 07:05:52 +00:00
|
|
|
|
end
|
2023-01-08 06:57:42 +00:00
|
|
|
|
end
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local huanggai = General:new(extension, "huanggai", "wu", 4)
|
2023-01-08 06:57:42 +00:00
|
|
|
|
huanggai:addSkill(kurou)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local yingzi = fk.CreateTriggerSkill{
|
|
|
|
|
name = "yingzi",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "drawcard",
|
2023-01-21 16:49:11 +00:00
|
|
|
|
events = {fk.DrawNCards},
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
data.n = data.n + 1
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local fanjian = fk.CreateActiveSkill{
|
|
|
|
|
name = "fanjian",
|
|
|
|
|
can_use = function(self, player)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 and not player:isKongcheng()
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
card_filter = function() return false end,
|
|
|
|
|
target_filter = function(self, to_select, selected)
|
|
|
|
|
return #selected == 0 and to_select ~= Self.id
|
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 1,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:obtainCard(target.id, card, true, fk.ReasonPrey)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
if Fk:getCardById(card):getSuitString() ~= choice then
|
|
|
|
|
room:damage{
|
2023-02-15 11:54:35 +00:00
|
|
|
|
from = player,
|
|
|
|
|
to = target,
|
2023-01-29 10:11:41 +00:00
|
|
|
|
damage = 1,
|
|
|
|
|
skillName = self.name,
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local zhouyu = General:new(extension, "zhouyu", "wu", 3)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
zhouyu:addSkill(yingzi)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
zhouyu:addSkill(fanjian)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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
|
2023-03-07 02:21:56 +00:00
|
|
|
|
data.card.trueName == "slash"
|
2023-01-29 10:11:41 +00:00
|
|
|
|
if ret then
|
|
|
|
|
local room = player.room
|
2023-08-02 13:50:47 +00:00
|
|
|
|
local from = room:getPlayerById(data.from)
|
|
|
|
|
for _, p in ipairs(room.alive_players) do
|
|
|
|
|
if p ~= player and p.id ~= data.from and player:inMyAttackRange(p) and not from:isProhibited(p, data.card) then
|
|
|
|
|
return true
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
2023-02-26 07:01:14 +00:00
|
|
|
|
local prompt = "#liuli-target"
|
2023-08-02 13:50:47 +00:00
|
|
|
|
local targets = {}
|
|
|
|
|
local from = room:getPlayerById(data.from)
|
|
|
|
|
for _, p in ipairs(room.alive_players) do
|
|
|
|
|
if p ~= player and p.id ~= data.from and player:inMyAttackRange(p) and not from:isProhibited(p, data.card) then
|
|
|
|
|
table.insert(targets, p.id)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if #targets == 0 then return false end
|
|
|
|
|
local plist, cid = room:askForChooseCardAndPlayers(player, targets, 1, 1, nil, prompt, self.name, true)
|
2023-02-26 07:01:14 +00:00
|
|
|
|
if #plist > 0 then
|
|
|
|
|
self.cost_data = {plist[1], cid}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
local room = player.room
|
2023-02-26 07:01:14 +00:00
|
|
|
|
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)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local daqiao = General:new(extension, "daqiao", "wu", 3, 3, General.Female)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
daqiao:addSkill(guose)
|
|
|
|
|
daqiao:addSkill(liuli)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-21 16:49:11 +00:00
|
|
|
|
local qianxun = fk.CreateProhibitSkill{
|
|
|
|
|
name = "qianxun",
|
2023-06-11 04:45:12 +00:00
|
|
|
|
frequency = Skill.Compulsory,
|
2023-01-21 16:49:11 +00:00
|
|
|
|
is_prohibited = function(self, from, to, card)
|
|
|
|
|
if to:hasSkill(self.name) then
|
|
|
|
|
return card.name == "indulgence" or card.name == "snatch"
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local luxun = General:new(extension, "luxun", "wu", 3)
|
2023-01-21 16:49:11 +00:00
|
|
|
|
luxun:addSkill(qianxun)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
luxun:addSkill(lianying)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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
|
|
|
|
|
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
|
2023-08-03 07:26:52 +00:00
|
|
|
|
return true
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_trigger = function(self, event, target, player, data)
|
2023-08-03 07:26:52 +00:00
|
|
|
|
local i = 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
|
|
|
|
|
i = i + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end
|
2023-08-03 07:26:52 +00:00
|
|
|
|
self.cancel_cost = false
|
|
|
|
|
for i = 1, i do
|
|
|
|
|
if self.cancel_cost or not player:hasSkill(self.name) then break end
|
|
|
|
|
self:doCost(event, target, player, data)
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_cost = function(self, event, target, player, data)
|
|
|
|
|
if player.room:askForSkillInvoke(player, self.name) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
self.cancel_cost = true
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
player:drawCards(2, self.name)
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local jieyin = fk.CreateActiveSkill{
|
|
|
|
|
name = "jieyin",
|
2023-01-29 10:11:41 +00:00
|
|
|
|
anim_type = "support",
|
|
|
|
|
can_use = function(self, player)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
2023-01-09 11:15:18 +00:00
|
|
|
|
card_filter = function(self, to_select, selected)
|
2023-08-02 13:50:47 +00:00
|
|
|
|
return #selected < 2 and Fk:currentRoom():getCardArea(to_select) == Player.Hand
|
2023-01-09 11:15:18 +00:00
|
|
|
|
end,
|
|
|
|
|
target_filter = function(self, to_select, selected)
|
|
|
|
|
local target = Fk:currentRoom():getPlayerById(to_select)
|
|
|
|
|
return target:isWounded() and
|
2023-01-29 10:11:41 +00:00
|
|
|
|
target.gender == General.Male
|
2023-01-09 11:15:18 +00:00
|
|
|
|
and #selected < 1
|
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 1,
|
|
|
|
|
card_num = 2,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local from = room:getPlayerById(effect.from)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:throwCard(effect.cards, self.name, from, from)
|
2023-01-09 11:15:18 +00:00
|
|
|
|
room:recover({
|
2023-02-15 11:54:35 +00:00
|
|
|
|
who = room:getPlayerById(effect.tos[1]),
|
2023-01-09 11:15:18 +00:00
|
|
|
|
num = 1,
|
2023-08-03 07:26:52 +00:00
|
|
|
|
recoverBy = from,
|
2023-01-09 11:15:18 +00:00
|
|
|
|
skillName = self.name
|
|
|
|
|
})
|
|
|
|
|
if from:isWounded() then
|
|
|
|
|
room:recover({
|
2023-08-03 07:26:52 +00:00
|
|
|
|
who = from,
|
2023-01-09 11:15:18 +00:00
|
|
|
|
num = 1,
|
2023-08-03 07:26:52 +00:00
|
|
|
|
recoverBy = from,
|
2023-01-09 11:15:18 +00:00
|
|
|
|
skillName = self.name
|
|
|
|
|
})
|
|
|
|
|
end
|
2023-08-02 13:50:47 +00:00
|
|
|
|
end
|
2023-01-09 11:15:18 +00:00
|
|
|
|
}
|
|
|
|
|
local sunshangxiang = General:new(extension, "sunshangxiang", "wu", 3, 3, General.Female)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
sunshangxiang:addSkill(xiaoji)
|
2023-01-09 11:15:18 +00:00
|
|
|
|
sunshangxiang:addSkill(jieyin)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local qingnang = fk.CreateActiveSkill{
|
|
|
|
|
name = "qingnang",
|
|
|
|
|
anim_type = "support",
|
|
|
|
|
can_use = function(self, player)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
card_filter = function(self, to_select, selected, targets)
|
2023-08-02 13:50:47 +00:00
|
|
|
|
return #selected == 0 and Fk:currentRoom():getCardArea(to_select) == Player.Hand
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
target_filter = function(self, to_select, selected, cards)
|
|
|
|
|
return #selected == 0 and Fk:currentRoom():getPlayerById(to_select):isWounded()
|
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 1,
|
|
|
|
|
card_num = 1,
|
2023-02-15 11:54:35 +00:00
|
|
|
|
on_use = function(self, room, effect)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
local from = room:getPlayerById(effect.from)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
room:throwCard(effect.cards, self.name, from, from)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
room:recover({
|
2023-02-15 11:54:35 +00:00
|
|
|
|
who = room:getPlayerById(effect.tos[1]),
|
2023-01-29 10:11:41 +00:00
|
|
|
|
num = 1,
|
2023-08-03 07:26:52 +00:00
|
|
|
|
recoverBy = from,
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
c.skillName = self.name
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local huatuo = General:new(extension, "huatuo", "qun", 3)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
huatuo:addSkill(qingnang)
|
|
|
|
|
huatuo:addSkill(jijiu)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-03-05 17:07:54 +00:00
|
|
|
|
local wushuang = fk.CreateTriggerSkill{
|
|
|
|
|
name = "wushuang",
|
|
|
|
|
anim_type = "offensive",
|
|
|
|
|
frequency = Skill.Compulsory,
|
|
|
|
|
events = {fk.TargetSpecified, fk.TargetConfirmed},
|
|
|
|
|
can_trigger = function(self, event, target, player, data)
|
|
|
|
|
if not player:hasSkill(self.name) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if event == fk.TargetSpecified then
|
2023-05-26 12:53:26 +00:00
|
|
|
|
return target == player and table.contains({ "slash", "duel" }, data.card.trueName)
|
2023-03-05 17:07:54 +00:00
|
|
|
|
else
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return data.to == player.id and data.card.trueName == "duel"
|
2023-03-05 17:07:54 +00:00
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
on_use = function(self, event, target, player, data)
|
|
|
|
|
data.fixedResponseTimes = data.fixedResponseTimes or {}
|
2023-03-07 02:21:56 +00:00
|
|
|
|
if data.card.trueName == "slash" then
|
2023-03-05 17:07:54 +00:00
|
|
|
|
data.fixedResponseTimes["jink"] = 2
|
|
|
|
|
else
|
|
|
|
|
data.fixedResponseTimes["slash"] = 2
|
|
|
|
|
data.fixedAddTimesResponsors = data.fixedAddTimesResponsors or {}
|
|
|
|
|
table.insert(data.fixedAddTimesResponsors, (event == fk.TargetSpecified and data.to or data.from))
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
}
|
2022-03-28 14:24:30 +00:00
|
|
|
|
local lvbu = General:new(extension, "lvbu", "qun", 4)
|
2023-03-05 17:07:54 +00:00
|
|
|
|
lvbu:addSkill(wushuang)
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
2023-02-21 05:44:24 +00:00
|
|
|
|
local lijian = fk.CreateActiveSkill{
|
|
|
|
|
name = "lijian",
|
|
|
|
|
anim_type = "offensive",
|
|
|
|
|
can_use = function(self, player)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0
|
2023-02-21 05:44:24 +00:00
|
|
|
|
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
|
2023-02-26 07:01:14 +00:00
|
|
|
|
Fk:currentRoom():getPlayerById(to_select).gender == General.Male
|
2023-02-21 05:44:24 +00:00
|
|
|
|
end,
|
2023-02-26 07:01:14 +00:00
|
|
|
|
target_num = 2,
|
|
|
|
|
min_card_num = 1,
|
2023-02-21 05:44:24 +00:00
|
|
|
|
on_use = function(self, room, use)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
local player = room:getPlayerById(use.from)
|
|
|
|
|
room:throwCard(use.cards, self.name, player, player)
|
2023-02-21 05:44:24 +00:00
|
|
|
|
local duel = Fk:cloneCard("duel")
|
2023-04-02 04:56:29 +00:00
|
|
|
|
duel.skillName = self.name
|
2023-07-11 13:15:38 +00:00
|
|
|
|
local new_use = { ---@type CardUseStruct
|
|
|
|
|
from = use.tos[2],
|
|
|
|
|
tos = { { use.tos[1] } },
|
|
|
|
|
card = duel,
|
|
|
|
|
prohibitedCardNames = { "nullification" },
|
|
|
|
|
}
|
2023-02-21 05:44:24 +00:00
|
|
|
|
room:useCard(new_use)
|
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-29 10:11:41 +00:00
|
|
|
|
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)
|
2023-07-11 13:15:38 +00:00
|
|
|
|
player:drawCards(1, self.name)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
end,
|
|
|
|
|
}
|
2023-01-09 11:15:18 +00:00
|
|
|
|
local diaochan = General:new(extension, "diaochan", "qun", 3, 3, General.Female)
|
2023-02-21 05:44:24 +00:00
|
|
|
|
diaochan:addSkill(lijian)
|
2023-01-29 10:11:41 +00:00
|
|
|
|
diaochan:addSkill(biyue)
|
2023-02-27 02:23:48 +00:00
|
|
|
|
|
2023-03-13 16:12:02 +00:00
|
|
|
|
local role_mode = fk.CreateGameMode{
|
|
|
|
|
name = "aaa_role_mode", -- just to let it at the top of list
|
|
|
|
|
minPlayer = 2,
|
|
|
|
|
maxPlayer = 8,
|
2023-07-02 12:47:10 +00:00
|
|
|
|
surrender_func = function(self, playedTime)
|
|
|
|
|
local roleCheck = false
|
|
|
|
|
local roleText = ""
|
|
|
|
|
local roleTable = {
|
|
|
|
|
{ "lord" },
|
|
|
|
|
{ "lord", "rebel" },
|
|
|
|
|
{ "lord", "rebel", "renegade" },
|
|
|
|
|
{ "lord", "loyalist", "rebel", "renegade" },
|
|
|
|
|
{ "lord", "loyalist", "rebel", "rebel", "renegade" },
|
|
|
|
|
{ "lord", "loyalist", "rebel", "rebel", "rebel", "renegade" },
|
|
|
|
|
{ "lord", "loyalist", "loyalist", "rebel", "rebel", "rebel", "renegade" },
|
|
|
|
|
{ "lord", "loyalist", "loyalist", "rebel", "rebel", "rebel", "rebel", "renegade" },
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
roleTable = roleTable[#Fk:currentRoom().players]
|
|
|
|
|
|
|
|
|
|
if Self.role == "renegade" then
|
2023-07-16 11:18:43 +00:00
|
|
|
|
local rebelNum = #table.filter(roleTable, function(role)
|
|
|
|
|
return role == "rebel"
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
for _, p in ipairs(Fk:currentRoom().players) do
|
|
|
|
|
if p.role == "rebel" then
|
|
|
|
|
if not p.dead then
|
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
rebelNum = rebelNum - 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
roleCheck = rebelNum == 0
|
|
|
|
|
roleText = "left lord and loyalist alive"
|
2023-07-02 12:47:10 +00:00
|
|
|
|
elseif Self.role == "rebel" then
|
|
|
|
|
local rebelNum = #table.filter(roleTable, function(role)
|
|
|
|
|
return role == "rebel"
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
local renegadeDead = not table.find(roleTable, function(role)
|
|
|
|
|
return role == "renegade"
|
|
|
|
|
end)
|
|
|
|
|
for _, p in ipairs(Fk:currentRoom().players) do
|
|
|
|
|
if p.role == "renegade" and p.dead then
|
|
|
|
|
renegadeDead = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if p ~= Self and p.role == "rebel" then
|
2023-07-02 14:13:51 +00:00
|
|
|
|
if not p.dead then
|
2023-07-02 12:47:10 +00:00
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
rebelNum = rebelNum - 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
roleCheck = renegadeDead and rebelNum == 1
|
|
|
|
|
roleText = "left one rebel alive"
|
|
|
|
|
else
|
|
|
|
|
if Self.role == "loyalist" then
|
|
|
|
|
return { { text = "loyalist never surrender", passed = false } }
|
|
|
|
|
else
|
|
|
|
|
if #Fk:currentRoom().alive_players == 2 then
|
|
|
|
|
roleCheck = true
|
|
|
|
|
else
|
|
|
|
|
local lordNum = #table.filter(roleTable, function(role)
|
|
|
|
|
return role == "lord" or role == "loyalist"
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
local renegadeDead = not table.find(roleTable, function(role)
|
|
|
|
|
return role == "renegade"
|
|
|
|
|
end)
|
|
|
|
|
for _, p in ipairs(Fk:currentRoom().players) do
|
|
|
|
|
if p.role == "renegade" and p.dead then
|
|
|
|
|
renegadeDead = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if p ~= Self and (p.role == "lord" or p.role == "loyalist") then
|
2023-07-02 14:13:51 +00:00
|
|
|
|
if not p.dead then
|
2023-07-02 12:47:10 +00:00
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
lordNum = lordNum - 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
roleCheck = renegadeDead and lordNum == 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
roleText = "left you alive"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return {
|
2023-07-02 12:53:42 +00:00
|
|
|
|
{ text = "time limitation: 5 min", passed = playedTime >= 300 },
|
2023-07-02 12:47:10 +00:00
|
|
|
|
{ text = roleText, passed = roleCheck },
|
|
|
|
|
}
|
|
|
|
|
end,
|
2023-03-13 16:12:02 +00:00
|
|
|
|
}
|
|
|
|
|
extension:addGameMode(role_mode)
|
2023-07-02 12:47:10 +00:00
|
|
|
|
Fk:loadTranslationTable{
|
|
|
|
|
["time limitation: 5 sec"] = "游戏时长达到5秒(测试用)",
|
2023-07-16 11:18:43 +00:00
|
|
|
|
["left lord and loyalist alive"] = "仅剩你和主忠方存活",
|
2023-07-02 12:47:10 +00:00
|
|
|
|
["left one rebel alive"] = "反贼仅剩你存活且不存在存活内奸",
|
|
|
|
|
["left you alive"] = "主忠方仅剩你存活且其他阵营仅剩一方",
|
|
|
|
|
["loyalist never surrender"] = "忠臣永不投降!",
|
|
|
|
|
}
|
2023-03-13 16:12:02 +00:00
|
|
|
|
|
2023-04-23 13:10:07 +00:00
|
|
|
|
local anjiang = General(extension, "anjiang", "unknown", 5)
|
|
|
|
|
anjiang.gender = General.Agender
|
|
|
|
|
anjiang.total_hidden = true
|
|
|
|
|
|
|
|
|
|
Fk:loadTranslationTable{
|
|
|
|
|
["anjiang"] = "暗将",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local heg_mode = require "packages.standard.hegemony"
|
|
|
|
|
extension:addGameMode(heg_mode)
|
|
|
|
|
|
2023-02-27 02:23:48 +00:00
|
|
|
|
-- load translations of this package
|
|
|
|
|
dofile "packages/standard/i18n/init.lua"
|
2022-03-28 14:24:30 +00:00
|
|
|
|
|
|
|
|
|
return extension
|