FreeKill/packages/test/init.lua

351 lines
11 KiB
Lua
Raw Normal View History

-- SPDX-License-Identifier: GPL-3.0-or-later
2023-05-18 23:45:08 +00:00
local extension = Package("test_p_0")
extension.extensionName = "test"
local cheat = fk.CreateActiveSkill{
name = "cheat",
anim_type = "drawcard",
prompt = "#cheat",
can_use = function(self, player)
return true
end,
card_filter = function(self, card)
return false
end,
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",
2023-06-04 12:00:35 +00:00
anim_type = "control",
can_use = function(self, player)
return true
end,
card_filter = function(self, card)
-- if self.interaction.data == "joy" then
--local c = Fk:getCardById(card)
--return Self:getPileNameOfId(card) == self.name and c.color == Card.Red
return false
-- end
end,
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:swapSeat(from, to)
for _, pid in ipairs(effect.tos) do
local to = room:getPlayerById(pid)
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,
}
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",
2023-06-04 12:00:35 +00:00
anim_type = "offensive",
prompt = "#damage_maker",
can_use = function(self, player)
return true
end,
card_filter = function(self, card)
return false
end,
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 = function(self, player)
return true
end,
card_filter = function(self, card)
return false
end,
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 = table.map(Fk:getGeneralsRandomly(8, Fk:getAllGenerals()), function(p) return p.name end)
local general = room:askForGeneral(from, generals, 1)
if general == nil then
general = table.random(generals)
end
room:changeHero(target, general, false, choice == "deputyGeneral", true)
end,
}
2023-06-11 08:53:27 +00:00
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 test2 = General(extension, "mouxusheng", "wu", 99, 99, General.Female)
test2.shield = 5
test2:addSkill("rende")
test2:addSkill(cheat)
test2:addSkill(control)
2023-07-11 13:15:38 +00:00
--test2:addSkill(test_vs)
--test2:addSkill(test_trig)
test2:addSkill(damage_maker)
test2:addSkill(change_hero)
2023-06-11 08:53:27 +00:00
test2:addSkill(test_zhenggong)
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{
2023-05-18 23:45:08 +00:00
["test_p_0"] = "测试包",
["test"] = "测试",
["test_filter"] = "破军",
[":test_filter"] = "你的点数大于11的牌视为无中生有。",
["mouxusheng"] = "谋徐盛",
2023-06-04 12:00:35 +00:00
-- ["cheat"] = "小开",
[":cheat"] = "出牌阶段你可以以红桃A打印一张想要的牌并获得之。",
["#cheat"] = "cheat你可以获得一张想要的牌",
-- ["@@test_cheat-phase"] = "苦肉",
-- ["@@test_cheat-inhand"] = "连营",
--["#test_trig-ask"] = "你可弃置一张手牌",
["control"] = "控制",
2023-06-04 12:00:35 +00:00
[":control"] = "出牌阶段,你可以控制/解除控制若干名其他角色。",
["test_vs"] = "视为",
[":test_vs"] = "你可以将牌当包含无懈在内的某张锦囊使用。",
["#test_vs"] = "视为:你可以学习锦囊牌的用法",
2023-06-04 12:00:35 +00:00
["damage_maker"] = "制伤",
[":damage_maker"] = "出牌阶段,你可以进行一次伤害制造器。",
["#damage_maker"] = "制伤:选择一名小白鼠,可选另一名角色做伤害来源(默认谋徐盛)",
["#revive-ask"] = "复活一名角色!",
2023-06-04 12:00:35 +00:00
["change_hero"] = "变更",
2023-06-04 12:00:35 +00:00
[":change_hero"] = "出牌阶段,你可以变更一名角色武将牌。",
2023-06-11 08:53:27 +00:00
["test_zhenggong"] = "迅测",
[":test_zhenggong"] = "锁定技,首轮开始时,你执行额外的回合。",
}
2023-05-18 23:45:08 +00:00
return { extension }