FreeKill/packages/test/init.lua
Ho-spair cec18e0614
Modify game core (#294)
- 新增船新“休整”机制;
- 修改作废逻辑,并可在当前响应读条禁用该技能(出牌阶段空闲时间点尚未完成限制);
- 修复锁视技的相关bug,其cardFilter新增标识是否为判定的参数;
- 将护甲扣减融合进体力扣减流程,为伤害流程增加“虚拟伤害”概念,为伤害流程增加“造成过伤害”标识id以供记录搜索使用;
- 为变将新增可删除副将。

---------

Co-authored-by: notify <notify-ctrl@qq.com>
2023-12-10 18:55:16 +08:00

406 lines
13 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.

-- SPDX-License-Identifier: GPL-3.0-or-later
local extension = Package("test_p_0")
extension.extensionName = "test"
local cheat = fk.CreateActiveSkill{
name = "cheat",
anim_type = "drawcard",
prompt = "#cheat",
can_use = Util.TrueFunc,
card_filter = Util.FalseFunc,
target_num = 0,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
local cardType = { 'basic', 'trick', 'equip' }
local cardTypeName = room:askForChoice(from, cardType, "cheat")
local card_types = {Card.TypeBasic, Card.TypeTrick, Card.TypeEquip}
cardType = card_types[table.indexOf(cardType, cardTypeName)]
local allCardIds = Fk:getAllCardIds()
local allCardMapper = {}
local allCardNames = {}
for _, id in ipairs(allCardIds) do
local card = Fk:getCardById(id)
if card.type == cardType then
if allCardMapper[card.name] == nil then
table.insert(allCardNames, card.name)
end
allCardMapper[card.name] = allCardMapper[card.name] or {}
table.insert(allCardMapper[card.name], id)
end
end
if #allCardNames == 0 then
return
end
local cardName = room:askForChoice(from, allCardNames, "cheat")
local toGain -- = room:printCard(cardName, Card.Heart, 1)
if #allCardMapper[cardName] > 0 then
toGain = allCardMapper[cardName][math.random(1, #allCardMapper[cardName])]
end
-- from:addToPile(self.name, toGain, true, self.name)
-- room:setCardMark(Fk:getCardById(toGain), "@@test_cheat-phase", 1)
-- room:setCardMark(Fk:getCardById(toGain), "@@test_cheat-inhand", 1)
room:obtainCard(effect.from, toGain, true, fk.ReasonPrey)
end
}
local test_filter = fk.CreateFilterSkill{
name = "test_filter",
card_filter = function(self, card)
return card.number > 11
end,
view_as = function(self, card)
return Fk:cloneCard("crossbow", card.suit, card.number)
end,
}
local control = fk.CreateActiveSkill{
name = "control",
anim_type = "control",
can_use = Util.TrueFunc,
card_filter = Util.FalseFunc,
card_num = 0,
target_filter = function(self, to_select)
return to_select ~= Self.id
end,
min_target_num = 1,
--interaction = function()return UI.Spin {
--choices = Fk.package_names,
--from=2,to=8,
-- default = "guanyu",
--}end,
on_use = function(self, room, effect)
--room:doSuperLightBox("packages/test/qml/Test.qml")
local from = room:getPlayerById(effect.from)
-- room:setPlayerMark(from, "@[test]test", {
-- all = {3, 1, 6, 9, 5, 11, 10, 2, 8, 7, 12, 4, 13},
-- ok = {10, 2},
-- })
-- room:swapSeat(from, to)
for _, pid in ipairs(effect.tos) do
local to = room:getPlayerById(pid)
-- p(room:askForPoxi(from, "test", {
-- { "你自己", from:getCardIds "h" },
-- { "对方", to:getCardIds "h" },
-- }, from.hp, false))
-- room:setPlayerMark(from, "@$a", {1,2,3})
-- room:setPlayerMark(from, "@$b", {'slash','duel','axe'})
if to:getMark("mouxushengcontrolled") == 0 then
room:addPlayerMark(to, "mouxushengcontrolled")
from:control(to)
else
room:setPlayerMark(to, "mouxushengcontrolled", 0)
to:control(to)
end
end
--local success, dat = room:askForUseViewAsSkill(from, "test_vs", nil, true)
--if success then
--local card = Fk.skills["test_vs"]:viewAs(dat.cards)
--room:useCard{
--from = from.id,
--tos = table.map(dat.targets, function(e) return {e} end),
--card = card,
--}
--end
-- from:pindian({to})
-- local result = room:askForCustomDialog(from, "simayi", "packages/test/qml/TestDialog.qml", "Hello, world. FROM LUA")
-- print(result)
-- room:fillAG(from, { 1, 43, 77 })
-- local id = room:askForAG(from, { 1, 43, 77 })
-- room:takeAG(from, id)
-- room:delay(2000)
-- room:closeAG(from)
-- local cards = room:askForCardsChosen(from, from, 2, 3, "hej", "")
-- from:addToPile(self.name, cards)
-- from.kingdom = "wei"
-- room:broadcastProperty(from, "kingdom")
-- p(cards)
-- room:useVirtualCard("slash", nil, from, room:getOtherPlayers(from), self.name, true)
end,
}
--[[
Fk:addPoxiMethod{
name = "test",
card_filter = function(to_select, selected, data, extra_data)
local s = Fk:getCardById(to_select).suit
for _, id in ipairs(selected) do
if Fk:getCardById(id).suit == s then return false end
end
return true
end,
feasible = function(selected, data, extra_data)
return #selected == 0 or #selected == 4 or #selected == extra_data
end,
prompt = "魄袭:选你们俩手牌总共四个花色,或者不选直接按确定按钮"
}
Fk:loadTranslationTable{['@[test]test']='割圆'}
Fk:addQmlMark{
name = "test",
how_to_show = function(name, value)
local all_points = value.all
local ok_points = value.ok
-- 若没有点亮的就不显示
if #ok_points == 0 then return "" end
-- 否则,显示相邻的,逻辑上要构成循环
local start_idx = table.indexOf(all_points, ok_points[1]) - 1
local end_idx = table.indexOf(all_points, ok_points[#ok_points]) + 1
if start_idx == 0 then start_idx = #all_points end
if end_idx == #all_points + 1 then end_idx = 1 end
if start_idx == end_idx then
return Card:getNumberStr(all_points[start_idx])
else
return Card:getNumberStr(all_points[start_idx]) .. Card:getNumberStr(all_points[end_idx])
end
end,
qml_path = "packages/test/qml/TestDialog"
}
--]]
local test_vs = fk.CreateViewAsSkill{
name = "test_vs",
pattern = "nullification",
prompt = "#test_vs",
card_filter = function(self, to_select, selected)
return #selected == 0
end,
interaction = function(self)
return UI.ComboBox {
choices = {
"ex_nihilo",
"duel",
"snatch",
"dismantlement",
"savage_assault",
"archery_attack",
"lightning",
"nullification",
},
detailed = true,
}
end,
view_as = function(self, cards)
if #cards ~= 1 then
return nil
end
if not self.interaction.data then return end
local c = Fk:cloneCard(self.interaction.data)
c.skillName = self.name
c:addSubcard(cards[1])
return c
end,
}
local test_trig = fk.CreateTriggerSkill{
name = "test_trig",
events = {fk.EventPhaseEnd},
can_trigger = function(self, event, target, player, data)
return target == player and player:hasSkill(self.name) and player.phase == Player.Discard
end,
on_cost = function(self, event, target, player, data)
local cards = player.room:askForDiscard(player, 1, 1, false, self.name, true, nil, "#test_trig-ask", true)
if #cards > 0 then
self.cost_data = cards
return true
end
end,
on_use = function(self, event, target, player, data)
player.room:throwCard(self.cost_data, self.name, player, player)
end,
}
local damage_maker = fk.CreateActiveSkill{
name = "damage_maker",
anim_type = "offensive",
prompt = "#damage_maker",
can_use = Util.TrueFunc,
card_filter = Util.FalseFunc,
card_num = 0,
target_filter = function(self, to_select, selected)
if self.interaction.data == "revive" then return false end
return #selected < 2
end,
min_target_num = function(self)
return self.interaction.data == "revive" and 0 or 1
end,
max_target_num = function(self)
return self.interaction.data == "revive" and 0 or 2
end,
interaction = function() return UI.ComboBox {
choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage", "lose_hp", "heal_hp", "lose_max_hp", "heal_max_hp", "revive"}
} end,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
local victim = #effect.tos > 0 and room:getPlayerById(effect.tos[1])
local target = #effect.tos > 1 and room:getPlayerById(effect.tos[2])
local choice = self.interaction.data
local number
if choice ~= "revive" then
local choices = {}
for i = 1, 99 do
table.insert(choices, tostring(i))
end
number = tonumber(room:askForChoice(from, choices, self.name, nil))
end
if target then from = target end
if choice == "heal_hp" then
room:recover{
who = victim,
num = number,
recoverBy = from,
skillName = self.name
}
elseif choice == "heal_max_hp" then
room:changeMaxHp(victim, number)
elseif choice == "lose_max_hp" then
room:changeMaxHp(victim, -number)
elseif choice == "lose_hp" then
room:loseHp(victim, number, self.name)
elseif choice == "revive" then
local targets = table.map(table.filter(room.players, function(p) return p.dead end), function(p) return "seat#" .. tostring(p.seat) end)
if #targets > 0 then
targets = room:askForChoice(from, targets, self.name, "#revive-ask")
if targets then
target = tonumber(string.sub(targets, 6))
for _, p in ipairs(room.players) do
if p.seat == target then
room:revivePlayer(p, true)
break
end
end
end
end
else
local choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage"}
room:damage({
from = from,
to = victim,
damage = number,
damageType = table.indexOf(choices, choice),
skillName = self.name
})
end
end,
}
local change_hero = fk.CreateActiveSkill{
name = "change_hero",
can_use = Util.TrueFunc,
card_filter = Util.FalseFunc,
card_num = 0,
target_filter = function(self, to_select, selected)
return #selected < 1
end,
target_num = 1,
interaction = function(self)
return UI.ComboBox {
choices = { "mainGeneral", "deputyGeneral"},
}
end,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
local target = room:getPlayerById(effect.tos[1])
local choice = self.interaction.data
local generals = room:getNGenerals(8)
local general = room:askForGeneral(from, generals, 1)
if general == nil then
general = table.random(generals)
end
table.removeOne(generals, general)
room:changeHero(target, general, false, choice == "deputyGeneral", true)
room:returnToGeneralPile(generals)
end,
}
local test_zhenggong = fk.CreateTriggerSkill{
name = "test_zhenggong",
events = {fk.RoundStart},
frequency = Skill.Compulsory,
anim_type = "negative",
can_trigger = function(self, event, target, player, data)
return player:hasSkill(self.name) and player.room:getTag("RoundCount") == 1
end,
on_use = function(self, event, target, player, data)
player:gainAnExtraTurn()
end,
}
local test_feichu = fk.CreateActiveSkill{
name = "test_feichu",
can_use = Util.TrueFunc,
card_filter = Util.FalseFunc,
card_num = 0,
target_filter = function(self, to_select, selected)
return #selected < 1
end,
target_num = 1,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
local eqipSlots = from:getAvailableEquipSlots()
table.insert(eqipSlots, Player.JudgeSlot)
room:abortPlayerArea(from, eqipSlots)
end,
}
local test2 = General(extension, "mouxusheng", "wu", 4, 4, General.Female)
test2.shield = 3
test2.hidden = true
test2:addSkill("rende")
test2:addSkill(cheat)
test2:addSkill(control)
--test2:addSkill(test_vs)
--test2:addSkill(test_trig)
test2:addSkill(damage_maker)
test2:addSkill(test_zhenggong)
test2:addSkill(change_hero)
-- test2:addSkill(test_feichu)
local shibing = General(extension, "blank_shibing", "qun", 5)
shibing.hidden = true
Fk:loadTranslationTable{
["blank_shibing"] = "男士兵",
}
local nvshibing = General(extension, "blank_nvshibing", "qun", 5, 5, General.Female)
Fk:loadTranslationTable{
["blank_nvshibing"] = "女士兵",
}
nvshibing.hidden = true
Fk:loadTranslationTable{
["test_p_0"] = "测试包",
["test"] = "测试",
["test_filter"] = "破军",
[":test_filter"] = "你的点数大于11的牌视为无中生有。",
["mouxusheng"] = "谋徐盛",
-- ["cheat"] = "小开",
[":cheat"] = "出牌阶段,你可获得想要的牌。",
["#cheat"] = "cheat你可以获得一张想要的牌",
["$cheat"] = "喝啊!",
-- ["@@test_cheat-phase"] = "苦肉",
-- ["@@test_cheat-inhand"] = "连营",
--["#test_trig-ask"] = "你可弃置一张手牌",
["control"] = "控制",
[":control"] = "出牌阶段,你可以控制/解除控制若干名其他角色。",
["$control"] = "战将临阵,斩关刈城!",
["test_vs"] = "视为",
[":test_vs"] = "你可以将牌当包含无懈在内的某张锦囊使用。",
["#test_vs"] = "视为:你可以学习锦囊牌的用法",
["damage_maker"] = "制伤",
[":damage_maker"] = "出牌阶段,你可以进行一次伤害制造器。",
["#damage_maker"] = "制伤:选择一名小白鼠,可选另一名角色做伤害来源(默认谋徐盛)",
["#revive-ask"] = "复活一名角色!",
["$damage_maker"] = "区区数百魏军,看我一击灭之!",
["test_zhenggong"] = "迅测",
[":test_zhenggong"] = "锁定技,首轮开始时,你执行额外的回合。",
["$test_zhenggong"] = "今疑兵之计,已搓敌兵心胆,其安敢侵近!",
["change_hero"] = "变更",
[":change_hero"] = "出牌阶段,你可以变更一名角色武将牌。",
["$change_hero"] = "敌军色厉内荏,可筑假城以退敌!",
["~mouxusheng"] = "来世,愿再为我江东之臣……",
}
return { extension }