parent
bd0af8b2cf
commit
b2a963739b
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
|
@ -37,6 +37,7 @@ function Skill:initialize(name, frequency)
|
||||||
self.frequency = frequency
|
self.frequency = frequency
|
||||||
self.visible = true
|
self.visible = true
|
||||||
self.lordSkill = false
|
self.lordSkill = false
|
||||||
|
self.cardSkill = false
|
||||||
self.mute = false
|
self.mute = false
|
||||||
self.anim_type = ""
|
self.anim_type = ""
|
||||||
self.related_skills = {}
|
self.related_skills = {}
|
||||||
|
@ -78,6 +79,10 @@ end
|
||||||
---@param player Player @ 玩家
|
---@param player Player @ 玩家
|
||||||
---@return boolean
|
---@return boolean
|
||||||
function Skill:isEffectable(player)
|
function Skill:isEffectable(player)
|
||||||
|
if self.cardSkill then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
local nullifySkills = Fk:currentRoom().status_skills[InvaliditySkill] or {}
|
local nullifySkills = Fk:currentRoom().status_skills[InvaliditySkill] or {}
|
||||||
for _, nullifySkill in ipairs(nullifySkills) do
|
for _, nullifySkill in ipairs(nullifySkills) do
|
||||||
if self.name ~= nullifySkill.name and nullifySkill:getInvalidity(player, self) then
|
if self.name ~= nullifySkill.name and nullifySkill:getInvalidity(player, self) then
|
||||||
|
|
|
@ -28,7 +28,7 @@ end
|
||||||
---@param player Player
|
---@param player Player
|
||||||
---@param card Card @ helper
|
---@param card Card @ helper
|
||||||
function ActiveSkill:canUse(player, card)
|
function ActiveSkill:canUse(player, card)
|
||||||
return true
|
return self:isEffectable(player)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Determine whether a card can be selected by this skill
|
--- Determine whether a card can be selected by this skill
|
||||||
|
|
|
@ -426,6 +426,7 @@ end
|
||||||
|
|
||||||
local function readCardSpecToCard(card, spec)
|
local function readCardSpecToCard(card, spec)
|
||||||
card.skill = spec.skill or defaultCardSkill
|
card.skill = spec.skill or defaultCardSkill
|
||||||
|
card.skill.cardSkill = true
|
||||||
card.special_skills = spec.special_skills
|
card.special_skills = spec.special_skills
|
||||||
card.is_damage_card = spec.is_damage_card
|
card.is_damage_card = spec.is_damage_card
|
||||||
end
|
end
|
||||||
|
|
|
@ -148,6 +148,11 @@ GameEvent.functions[GameEvent.Damage] = function(self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if damageStruct.damageType ~= fk.NormalDamage and damageStruct.to.chained then
|
||||||
|
damageStruct.beginnerOfTheDamage = true
|
||||||
|
damageStruct.to:setChainState(false)
|
||||||
|
end
|
||||||
|
|
||||||
-- 先扣减护甲,再扣体力值
|
-- 先扣减护甲,再扣体力值
|
||||||
local shield_to_lose = math.min(damageStruct.damage, damageStruct.to.shield)
|
local shield_to_lose = math.min(damageStruct.damage, damageStruct.to.shield)
|
||||||
self:changeShield(damageStruct.to, -shield_to_lose)
|
self:changeShield(damageStruct.to, -shield_to_lose)
|
||||||
|
@ -179,6 +184,29 @@ GameEvent.functions[GameEvent.Damage] = function(self)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
GameEvent.exit_funcs[GameEvent.Damage] = function(self)
|
||||||
|
local room = self.room
|
||||||
|
local damageStruct = self.data[1]
|
||||||
|
|
||||||
|
room.logic:trigger(fk.DamageFinished, damageStruct.to, damageStruct)
|
||||||
|
|
||||||
|
if damageStruct.beginnerOfTheDamage and not damageStruct.chain then
|
||||||
|
local targets = table.filter(room:getAlivePlayers(), function(p)
|
||||||
|
return p.chained
|
||||||
|
end)
|
||||||
|
for _, p in ipairs(targets) do
|
||||||
|
room:sendLog{
|
||||||
|
type = "#ChainDamage",
|
||||||
|
from = p.id
|
||||||
|
}
|
||||||
|
local dmg = table.simpleClone(damageStruct)
|
||||||
|
dmg.to = p
|
||||||
|
dmg.chain = true
|
||||||
|
room:damage(dmg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
GameEvent.functions[GameEvent.LoseHp] = function(self)
|
GameEvent.functions[GameEvent.LoseHp] = function(self)
|
||||||
local player, num, skillName = table.unpack(self.data)
|
local player, num, skillName = table.unpack(self.data)
|
||||||
local self = self.room
|
local self = self.room
|
||||||
|
|
|
@ -205,7 +205,7 @@ GameEvent.functions[GameEvent.UseCard] = function(self)
|
||||||
|
|
||||||
if cardUseEvent.responseToEvent then
|
if cardUseEvent.responseToEvent then
|
||||||
cardUseEvent.responseToEvent.cardsResponded = cardUseEvent.responseToEvent.cardsResponded or {}
|
cardUseEvent.responseToEvent.cardsResponded = cardUseEvent.responseToEvent.cardsResponded or {}
|
||||||
table.insert(cardUseEvent.responseToEvent.cardsResponded, cardUseEvent.card)
|
table.insertIfNeed(cardUseEvent.responseToEvent.cardsResponded, cardUseEvent.card)
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, event in ipairs({ fk.AfterCardUseDeclared, fk.AfterCardTargetDeclared, fk.CardUsing }) do
|
for _, event in ipairs({ fk.AfterCardUseDeclared, fk.AfterCardTargetDeclared, fk.CardUsing }) do
|
||||||
|
|
|
@ -18,3 +18,6 @@ MarkEnum.AddMaxCardsInTurn = "AddMaxCards-turn"
|
||||||
MarkEnum.MinusMaxCards = "MinusMaxCards"
|
MarkEnum.MinusMaxCards = "MinusMaxCards"
|
||||||
---@field AddMaxCards string @ 于本回合内减少标记值数量的手牌上限
|
---@field AddMaxCards string @ 于本回合内减少标记值数量的手牌上限
|
||||||
MarkEnum.MinusMaxCardsInTurn = "MinusMaxCards-turn"
|
MarkEnum.MinusMaxCardsInTurn = "MinusMaxCards-turn"
|
||||||
|
|
||||||
|
---@field uncompulsoryInvalidity string @ 非锁定技失效,可带清除标记后缀
|
||||||
|
MarkEnum.UncompulsoryInvalidity = "uncompulsoryInvalidity"
|
||||||
|
|
|
@ -2041,7 +2041,7 @@ function Room:doCardUseEffect(cardUseEvent)
|
||||||
unoffsetableList = cardUseEvent.unoffsetableList,
|
unoffsetableList = cardUseEvent.unoffsetableList,
|
||||||
additionalDamage = cardUseEvent.additionalDamage,
|
additionalDamage = cardUseEvent.additionalDamage,
|
||||||
additionalRecover = cardUseEvent.additionalRecover,
|
additionalRecover = cardUseEvent.additionalRecover,
|
||||||
cardIdsResponded = cardUseEvent.nullifiedTargets,
|
cardsResponded = cardUseEvent.cardsResponded,
|
||||||
prohibitedCardNames = cardUseEvent.prohibitedCardNames,
|
prohibitedCardNames = cardUseEvent.prohibitedCardNames,
|
||||||
extra_data = cardUseEvent.extra_data,
|
extra_data = cardUseEvent.extra_data,
|
||||||
}
|
}
|
||||||
|
@ -2092,7 +2092,15 @@ function Room:doCardUseEffect(cardUseEvent)
|
||||||
|
|
||||||
collaboratorsIndex[toId] = collaboratorsIndex[toId] + 1
|
collaboratorsIndex[toId] = collaboratorsIndex[toId] + 1
|
||||||
|
|
||||||
self:doCardEffect(table.simpleClone(cardEffectEvent))
|
local curCardEffectEvent = table.simpleClone(cardEffectEvent)
|
||||||
|
self:doCardEffect(curCardEffectEvent)
|
||||||
|
|
||||||
|
if curCardEffectEvent.cardsResponded then
|
||||||
|
cardUseEvent.cardsResponded = cardUseEvent.cardsResponded or {}
|
||||||
|
for _, card in ipairs(curCardEffectEvent.cardsResponded) do
|
||||||
|
table.insertIfNeed(cardUseEvent.cardsResponded, card)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -2816,6 +2824,10 @@ function Room:getCardsFromPileByRule(pattern, num, fromPile)
|
||||||
table.insertTable(pileToSearch, self.discard_pile)
|
table.insertTable(pileToSearch, self.discard_pile)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if #pileToSearch == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
local cardPack = {}
|
local cardPack = {}
|
||||||
if num < 3 then
|
if num < 3 then
|
||||||
for i = 1, num do
|
for i = 1, num do
|
||||||
|
|
|
@ -158,42 +158,6 @@ extension:addCards({
|
||||||
analeptic:clone(Card.Diamond, 9),
|
analeptic:clone(Card.Diamond, 9),
|
||||||
})
|
})
|
||||||
|
|
||||||
local ironChainEffect = fk.CreateTriggerSkill{
|
|
||||||
name = "iron_chain_effect",
|
|
||||||
global = true,
|
|
||||||
priority = { [fk.BeforeHpChanged] = 10, [fk.DamageFinished] = 0 }, -- game rule
|
|
||||||
events = { fk.BeforeHpChanged, fk.DamageFinished },
|
|
||||||
can_trigger = function(self, event, target, player, data)
|
|
||||||
if event == fk.BeforeHpChanged then
|
|
||||||
return target == player and data.damageEvent and data.damageEvent.damageType ~= fk.NormalDamage and player.chained
|
|
||||||
else
|
|
||||||
return target == player and data.beginnerOfTheDamage and not data.chain
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
on_trigger = function(self, event, target, player, data)
|
|
||||||
local room = player.room
|
|
||||||
if event == fk.BeforeHpChanged then
|
|
||||||
data.damageEvent.beginnerOfTheDamage = true
|
|
||||||
player:setChainState(false)
|
|
||||||
else
|
|
||||||
local targets = table.filter(room:getAlivePlayers(), function(p)
|
|
||||||
return p.chained
|
|
||||||
end)
|
|
||||||
for _, p in ipairs(targets) do
|
|
||||||
room:sendLog{
|
|
||||||
type = "#ChainDamage",
|
|
||||||
from = p.id
|
|
||||||
}
|
|
||||||
local dmg = table.simpleClone(data)
|
|
||||||
dmg.to = p
|
|
||||||
dmg.chain = true
|
|
||||||
room:damage(dmg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
Fk:addSkill(ironChainEffect)
|
|
||||||
|
|
||||||
local recast = fk.CreateActiveSkill{
|
local recast = fk.CreateActiveSkill{
|
||||||
name = "recast",
|
name = "recast",
|
||||||
target_num = 0,
|
target_num = 0,
|
||||||
|
|
|
@ -106,10 +106,28 @@ local choosePlayersToMoveCardInBoardSkill = fk.CreateActiveSkill{
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local uncompulsoryInvalidity = fk.CreateInvaliditySkill {
|
||||||
|
name = "uncompulsory_invalidity",
|
||||||
|
global = true,
|
||||||
|
invalidity_func = function(self, from, skill)
|
||||||
|
local suffix = { "-phase", "-turn", "-round" }
|
||||||
|
return
|
||||||
|
(skill.frequency ~= Skill.Compulsory and skill.frequency ~= Skill.Wake) and
|
||||||
|
not (skill:isEquipmentSkill() or skill.name:endsWith("&")) and
|
||||||
|
(
|
||||||
|
from:getMark(MarkEnum.UncompulsoryInvalidity) ~= 0 or
|
||||||
|
table.find(suffix, function(s)
|
||||||
|
return from:getMark(MarkEnum.UncompulsoryInvalidity .. s) ~= 0
|
||||||
|
end)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
AuxSkills = {
|
AuxSkills = {
|
||||||
discardSkill,
|
discardSkill,
|
||||||
chooseCardsSkill,
|
chooseCardsSkill,
|
||||||
choosePlayersSkill,
|
choosePlayersSkill,
|
||||||
maxCardsSkill,
|
maxCardsSkill,
|
||||||
choosePlayersToMoveCardInBoardSkill,
|
choosePlayersToMoveCardInBoardSkill,
|
||||||
|
uncompulsoryInvalidity,
|
||||||
}
|
}
|
||||||
|
|
|
@ -560,6 +560,7 @@ local kongchengAudio = fk.CreateTriggerSkill{
|
||||||
}
|
}
|
||||||
local kongcheng = fk.CreateProhibitSkill{
|
local kongcheng = fk.CreateProhibitSkill{
|
||||||
name = "kongcheng",
|
name = "kongcheng",
|
||||||
|
frequency = Skill.Compulsory,
|
||||||
is_prohibited = function(self, from, to, card)
|
is_prohibited = function(self, from, to, card)
|
||||||
if to:hasSkill(self.name) and to:isKongcheng() then
|
if to:hasSkill(self.name) and to:isKongcheng() then
|
||||||
return card.trueName == "slash" or card.name == "duel"
|
return card.trueName == "slash" or card.name == "duel"
|
||||||
|
@ -608,6 +609,7 @@ zhaoyun:addSkill(longdan)
|
||||||
|
|
||||||
local mashu = fk.CreateDistanceSkill{
|
local mashu = fk.CreateDistanceSkill{
|
||||||
name = "mashu",
|
name = "mashu",
|
||||||
|
frequency = Skill.Compulsory,
|
||||||
correct_func = function(self, from, to)
|
correct_func = function(self, from, to)
|
||||||
if from:hasSkill(self.name) then
|
if from:hasSkill(self.name) then
|
||||||
return -1
|
return -1
|
||||||
|
@ -654,6 +656,7 @@ local jizhi = fk.CreateTriggerSkill{
|
||||||
}
|
}
|
||||||
local qicai = fk.CreateTargetModSkill{
|
local qicai = fk.CreateTargetModSkill{
|
||||||
name = "qicai",
|
name = "qicai",
|
||||||
|
frequency = Skill.Compulsory,
|
||||||
distance_limit_func = function(self, player, skill)
|
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_name = string.sub(skill.name, 1, -7) -- assuming all card skill is named with name_skill
|
||||||
local card = Fk:cloneCard(card_name)
|
local card = Fk:cloneCard(card_name)
|
||||||
|
@ -879,6 +882,7 @@ daqiao:addSkill(liuli)
|
||||||
|
|
||||||
local qianxun = fk.CreateProhibitSkill{
|
local qianxun = fk.CreateProhibitSkill{
|
||||||
name = "qianxun",
|
name = "qianxun",
|
||||||
|
frequency = Skill.Compulsory,
|
||||||
is_prohibited = function(self, from, to, card)
|
is_prohibited = function(self, from, to, card)
|
||||||
if to:hasSkill(self.name) then
|
if to:hasSkill(self.name) then
|
||||||
return card.name == "indulgence" or card.name == "snatch"
|
return card.name == "indulgence" or card.name == "snatch"
|
||||||
|
|
|
@ -780,7 +780,7 @@ extension:addCards({
|
||||||
fk.MarkArmorNullified = "mark__armor_nullified"
|
fk.MarkArmorNullified = "mark__armor_nullified"
|
||||||
|
|
||||||
local armorInvalidity = fk.CreateInvaliditySkill {
|
local armorInvalidity = fk.CreateInvaliditySkill {
|
||||||
name = "armor_invalidity_skill",
|
name = "armor_invalidity",
|
||||||
global = true,
|
global = true,
|
||||||
invalidity_func = function(self, from, skill)
|
invalidity_func = function(self, from, skill)
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue