jianyu/jianyu_kg.lua

509 lines
19 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

local extension = Package:new("jianyu_kg")
extension.extensionName = "jianyu"
local Q = require "packages/jianyu/question" -- 考公大学生用的题库
-- TODO: 这两个武将太耦合了,建议重写。
Fk:loadTranslationTable {
["jianyu_kg"] = [[简浴-考公]],
}
local jy_zuoti = fk.CreateActiveSkill {
name = "jy_zuoti",
anim_type = "control",
mute = true,
can_use = function(self, player)
return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0
end,
card_filter = function(self, card)
return false
end,
card_num = 0,
target_filter = function(self, to_select, selected)
return false
end,
on_use = function(self, room, effect)
local player = room:getPlayerById(effect.from)
player:broadcastSkillInvoke(self.name, math.random(4))
room:notifySkillInvoked(player, self.name, "drawcard")
-- 随机从题库拿一道题
local questionFull = Q.getRandomQuestion()
local question = questionFull[1]
local answers = questionFull[2]
local correct_answer = questionFull[3]
------------------------------------------
-- 插入换行符,每若干个字符一次
local function insert_br(str, ct)
local result = ""
local count = 0
local in_br = false -- 用于检测是否在原本的 <br> 之内
-- TODO如果这是最后一个字符那么不要添加br了
for char in str:gmatch("[%z\1-\127\194-\244_][\128-\191]*") do
if char == "<" then
in_br = true
elseif char == ">" and in_br then
in_br = false
count = 0
end
if not in_br then
result = result .. char
count = count + 1
-- 每ct个字符插入一个<br>
if count == ct then
result = result .. "<br>"
count = 0
end
else
result = result .. char
end
end
return result
end
local question_wrap = insert_br(question, 40)
local answers_wrap = {}
for _, a in ipairs(answers) do
table.insert(answers_wrap, insert_br(a, 30))
end
-----------------------------------------------
-- 建立输出到战报里的所有选项
local answers_string = ""
for i, a in ipairs(answers) do
if i ~= #answers then
answers_string = answers_string .. a .. "<br>"
else
answers_string = answers_string .. a
end
end
-- 做题
-- 不仅要让自己看到题目,还要让全场所有人看到题目。
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_zuoti_ob"))
room:sendLog {
type = "%from 的题目:<br>%arg<br>%arg2",
from = player.id,
arg = question,
arg2 = answers_string,
}
local answers_short = {}
for _, a in ipairs(answers) do
table.insert(answers_short, a[1])
end
local choice = room:askForChoice(player, answers_wrap, "#jy_zuoti_q", question_wrap) -- 把skillName改成question可能可以
if choice[1] == correct_answer then -- 仅判断choice[1]因为答案只保留正确选项的选项名字ABCD
player:broadcastSkillInvoke(self.name, math.random(5, 7))
room:addPlayerMark(player, "@jy_zuoti_correct_count")
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_zuoti_correct"))
room:sendLog {
type = "#jy_zuoti_correct_log",
from = player.id,
arg = correct_answer[1],
}
-- cheat从谋徐盛抄来的
local cardType = { 'basic', 'trick', 'equip' }
local cardTypeName = room:askForChoice(player, cardType, self.name, "#jy_zuoti_choose_card")
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 and not Fk:cloneCard(card.name).is_derived 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(player, allCardNames, self.name)
local toGain -- = room:printCard(cardName, Card.Heart, 1)
if #allCardMapper[cardName] > 0 then
toGain = allCardMapper[cardName][math.random(1, #allCardMapper[cardName])]
end
room:obtainCard(player, toGain, true, fk.ReasonPrey)
else
player:broadcastSkillInvoke(self.name, math.random(8, 10))
room:addPlayerMark(player, "@jy_zuoti_incorrect_count")
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_zuoti_incorrect"))
room:sendLog {
type = "#jy_zuoti_incorrect_log",
from = player.id,
arg = choice[1],
arg2 = correct_answer,
}
end
end,
}
-- touhou_standard extremely_wicked
local jy_jieju = fk.CreateActiveSkill {
name = "jy_jieju",
frequency = Skill.Quest,
anim_type = "positive",
can_use = function(self, player)
return player:usedSkillTimes("jy_zuoti", Player.HistoryPhase) ~= 0 and
-- player:usedSkillTimes(self.name, Player.HistoryPhase) <= 1 and
not player:getQuestSkillState("jy_jieju")
end,
card_filter = function(self, card)
return false
end,
card_num = 0,
target_filter = function(self, to_select, selected)
return false
end,
on_use = function(self, room, effect)
local from = room:getPlayerById(effect.from)
local hp_to_be_lost = 1
room:loseHp(from, hp_to_be_lost, self.name)
-- room:throwCard(effect.cards, self.name, from, from)
from:setSkillUseHistory("jy_zuoti", 0, Player.HistoryPhase)
end,
}
local jy_jieju_success = fk.CreateTriggerSkill {
name = "#jy_jieju_success",
anim_type = "positive",
events = {
fk.EventPhaseStart,
},
can_trigger = function(self, event, target, player)
if player:getQuestSkillState("jy_jieju") then
return false
end
return player:hasSkill("jy_jieju") and player.phase == Player.Finish and
player:getMark("@jy_zuoti_correct_count") >= player:getMark("@jy_zuoti_incorrect_count") + 2
end,
on_cost = Util.TrueFunc,
on_use = function(self, event, target, player)
local room = player.room
room:updateQuestSkillState(player, "jy_jieju")
player:drawCards(2, "jy_jieju")
room:recover({
who = player,
num = 2,
recoverBy = player,
skillName = self.name,
})
room:handleAddLoseSkills(player, "jizhi", nil, true, false)
room:handleAddLoseSkills(player, "kanpo", nil, true, false)
room:handleAddLoseSkills(player, "xiangle", nil, true, false)
end
}
local jy_jieju_fail = fk.CreateTriggerSkill {
name = "#jy_jieju_fail",
anim_type = "negative",
events = {
fk.EventPhaseStart,
},
can_trigger = function(self, event, target, player)
if player:getQuestSkillState("jy_jieju") then
return false
end
return player:hasSkill("jy_jieju") and player.phase == Player.Finish and
player:getMark("@jy_zuoti_incorrect_count") >= player:getMark("@jy_zuoti_correct_count") + 2
end,
on_cost = Util.TrueFunc,
on_use = function(self, event, target, player)
local room = player.room
room:updateQuestSkillState(player, "jy_jieju", true)
player:turnOver()
room:handleAddLoseSkills(player, "jy_yuyu", nil, true, false)
room:handleAddLoseSkills(player, "jy_hongwen", nil, true, false)
end
}
jy_jieju:addRelatedSkill(jy_jieju_success)
jy_jieju:addRelatedSkill(jy_jieju_fail)
local jy_guina = fk.CreateActiveSkill {
mute = true,
name = "jy_guina",
anim_type = "control",
can_use = function(self, player)
return player:usedSkillTimes(self.name, Player.HistoryPhase) < 3
end,
card_filter = function(self, card)
return false
end,
card_num = 0,
target_num = 1,
target_filter = function(self, to_select, selected)
return #selected == 0
end,
on_use = function(self, room, effect)
local me = room:getPlayerById(effect.from)
me:broadcastSkillInvoke(self.name, math.random(4))
room:notifySkillInvoked(me, self.name, "drawcard")
local player = room:getPlayerById(effect.tos[1])
-- 随机从题库拿一道题
local questionFull = Q.getRandomQuestion()
local question = questionFull[1]
local answers = questionFull[2]
local correct_answer = questionFull[3]
------------------------------------------
-- 插入换行符,每若干个字符一次
local function insert_br(str, ct)
local result = ""
local count = 0
local in_br = false -- 用于检测是否在原本的 <br> 之内
-- TODO如果这是最后一个字符那么不要添加br了
for char in str:gmatch("[%z\1-\127\194-\244_][\128-\191]*") do
if char == "<" then
in_br = true
elseif char == ">" and in_br then
in_br = false
count = 0
end
if not in_br then
result = result .. char
count = count + 1
-- 每ct个字符插入一个<br>
if count == ct then
result = result .. "<br>"
count = 0
end
else
result = result .. char
end
end
return result
end
local question_wrap = insert_br(question, 40)
local answers_wrap = {}
for _, a in ipairs(answers) do
table.insert(answers_wrap, insert_br(a, 30))
end
-----------------------------------------------
-- 建立输出到战报里的所有选项
local answers_string = ""
for i, a in ipairs(answers) do
if i ~= #answers then
answers_string = answers_string .. a .. "<br>"
else
answers_string = answers_string .. a
end
end
-- 做题
-- 不仅要让自己看到题目,还要让全场所有人看到题目。
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_zuoti_ob"))
room:sendLog {
type = "%from 的题目:<br>%arg<br>%arg2",
from = player.id,
arg = question,
arg2 = answers_string,
}
local answers_short = {}
for _, a in ipairs(answers) do
table.insert(answers_short, a[1])
end
-- local your_question_wrap = "归纳:回答行测真题,若正确你可以自选一张牌,<br>若错误本阶段其所有牌额外指定你为目标:<br><br>" .. question
local choice = room:askForChoice(player, answers_wrap, "#jy_zuoti_q", question_wrap)
if choice[1] == correct_answer then -- 仅判断choice[1]因为答案只保留正确选项的选项名字ABCD
me:broadcastSkillInvoke(self.name, math.random(5, 6)) -- 播放选择正确的语音
-- room:addPlayerMark(player, "@jy_zuoti_correct_count")
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_guina_correct"))
room:sendLog {
type = "#jy_zuoti_correct_log",
from = player.id,
arg = correct_answer[1],
}
-- cheat从谋徐盛抄来的
local cardType = { 'basic', 'trick', 'equip' }
local cardTypeName = room:askForChoice(player, cardType, self.name, "#jy_guina_choose_card")
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 and not Fk:cloneCard(card.name).is_derived 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(player, allCardNames, self.name)
local toGain -- = room:printCard(cardName, Card.Heart, 1)
if #allCardMapper[cardName] > 0 then
toGain = allCardMapper[cardName][math.random(1, #allCardMapper[cardName])]
end
room:obtainCard(player, toGain, true, fk.ReasonPrey)
else
me:broadcastSkillInvoke(self.name, math.random(7, 8)) -- 播放选择错误的语音
-- room:addPlayerMark(player, "@jy_zuoti_incorrect_count")
room:doBroadcastNotify("ShowToast", Fk:translate("#jy_guina_incorrect"))
room:sendLog {
type = "#jy_zuoti_incorrect_log",
from = player.id,
arg = choice[1],
arg2 = correct_answer,
}
room:setPlayerMark(player, "@jy_guina-phase", "") -- 给这个人上标记,标记为被点名的
end
end,
}
local jy_guina_refresh = fk.CreateTriggerSkill {
name = "#jy_guina_refresh",
refresh_events = { fk.TargetConfirming, fk.Damaged },
can_refresh = function(self, event, target, player, data)
if not player:hasSkill(self) then return false end
if event == fk.TargetConfirming then
-- if data.card then 这个事件只针对牌,所以不需要判断是否有牌
return data.from == player.id and
(data.card:isCommonTrick() or data.card.type == Card.TypeBasic)
else
return data.to:getMark("@jy_guina-phase") ~= 0 -- data.from == player
-- 因为这两个事件的data.to和from对应的数据结构不一样
end
end,
on_refresh = function(self, event, target, player, data)
-- TODO借刀等带副目标的不会生效
local room = player.room
if event == fk.TargetConfirming then
local guina_players = {} -- 用来画指示线的
local targets = AimGroup:getAllTargets(data.tos)
for _, p in ipairs(room:getAlivePlayers()) do
if p:getMark("@jy_guina-phase") ~= 0 and not table.contains(targets, p.id) then
-- 判断目标是否不能成为这张牌的目标
if not Self:isProhibited(p, data.card) then
AimGroup:addTargets(player.room, data, p.id)
table.insert(guina_players, p.id)
end
end
end
if #guina_players ~= 0 then
room:notifySkillInvoked(player, "jy_guina", "drawcard")
room:doIndicate(data.from, guina_players)
end
else
room:notifySkillInvoked(player, "jy_guina", "drawcard")
player:drawCards(2, "jy_guina")
end
end,
}
jy_guina:addRelatedSkill(jy_guina_refresh)
local jy__kgdxs = General(extension, "jy__kgdxs", "qun", 6, 6, General.Female)
jy__kgdxs:addSkill(jy_zuoti)
jy__kgdxs:addSkill(jy_jieju)
jy__kgdxs:addRelatedSkill("jizhi")
jy__kgdxs:addRelatedSkill("kanpo")
jy__kgdxs:addRelatedSkill("xiangle")
jy__kgdxs:addRelatedSkill("jy_yuyu")
jy__kgdxs:addRelatedSkill("jy_hongwen")
local kgds = General(extension, "jy__kgds", "god", 4)
kgds:addSkill(jy_guina)
local total_papers, total_questions = Q.questionCount()
Fk:loadTranslationTable {
["jy__kgdxs"] = "考公大学生",
["#jy__kgdxs"] = "公喜发财",
["designer:jy__kgdxs"] = "考公专家",
["cv:jy__kgdxs"] = "侯小菲",
["illustrator:jy__kgdxs"] = "网络图片",
["~jy__kgdxs"] = [[老师,对不起……]],
["jy_zuoti"] = "做题",
[":jy_zuoti"] = [[出牌阶段限一次,你可以回答一道行测真题。若正确,你获得一张你指定的非衍生牌名的牌。<br><font color="grey">收录2018-2024《行测》]] .. total_papers .. [[套共]] .. total_questions .. [[题,经人工筛选,不含图形推理、资料分析。</font>]],
["#jy_zuoti_q"] = "行测真题",
["#jy_zuoti_see_log"] = [[做题:请在战报中查看完整题干]],
["#jy_zuoti_ob"] = [[正在做题!其他角色可以在战报中查看这道题目的完整题干和选项。]],
["#jy_zuoti_correct"] = [[答对了!你可以自选一张牌!<br>你可以在战报中查看正确答案。]],
["#jy_zuoti_incorrect"] = [[答错了,不过没有什么惩罚,你学到了新知识!<br>你可以在战报中查看正确答案。]],
["#jy_zuoti_choose_card"] = [[自选一张牌(尽量不要是自己区域内同牌名的牌)]],
["@jy_zuoti_correct_count"] = "答对",
["#jy_zuoti_correct_log"] = "%from 回答正确,正确答案:%arg。",
["@jy_zuoti_incorrect_count"] = "答错",
["#jy_zuoti_incorrect_log"] = "%from 选择了:%arg正确答案%arg2。",
["$jy_zuoti1"] = [[伟大的智慧之神,我最近每晚都在熬夜复习,考试就请让我通过吧!拜托了拜托了……]],
["$jy_zuoti2"] = [[唉,为什么报告和论文永远写不完?为什么?]],
["$jy_zuoti3"] = [[嗯哼,我也不想熬夜补课题进度。你想陪我一起吗?]],
["$jy_zuoti4"] = [[别害怕。]],
["$jy_zuoti5"] = [[好厉害,好羡慕……你还真是什么都会呀!]],
["$jy_zuoti6"] = [[哇!突然感觉不困了!]],
["$jy_zuoti7"] = [[还是你眼睛尖……]],
["$jy_zuoti8"] = [[现在逃还来得及吗?]],
["$jy_zuoti9"] = [[完了完了完了……]],
["$jy_zuoti10"] = [[啊……我……我要不行了……]],
["jy_jieju"] = "熬夜",
[":jy_jieju"] = [[使命技,出牌阶段,你可以失去一点体力使〖做题〗视为未发动过。<br>
成功回合结束时若你答对比答错至少多2次你摸2张牌、回复2点体力然后获得〖集智〗、〖看破〗、〖享乐〗<br>
失败回合结束时若你答错比答对至少多2次你翻面然后获得〖玉玉〗、〖红温〗。]],
["#jy_jieju_success"] = "结局:成功",
["#jy_jieju_fail"] = "结局:失败",
["jy__kgds"] = "考公专家",
["#jy__kgds"] = "正厅级",
["designer:jy__kgds"] = "考公专家",
["cv:jy__kgds"] = "桑毓泽",
["illustrator:jy__kgds"] = "网络图片",
["~jy__kgds"] = "“庸人”么……呵……",
["jy_guina"] = "归纳",
[":jy_guina"] = [[出牌阶段限三次,你可以令一名角色回答一道行测真题。若正确,其获得一张其指定的非衍生牌名的牌,否则其获得“归纳”直到本阶段结束。你使用基本牌与普通锦囊牌时,额外指定有“归纳”的角色为目标;有“归纳”的角色受到伤害时,你摸两张牌。<br><font color="grey">收录2018-2024《行测》]] .. total_papers .. [[套共]] .. total_questions .. [[题,经人工筛选,不含图形推理、资料分析。</font>]],
["@jy_guina-phase"] = "归纳",
["#jy_guina_correct"] = [[答对了!你可以自选一张牌获得!<br>你可以在战报中查看正确答案。]],
["#jy_guina_incorrect"] = [[答错了,本阶段的所有牌会额外指定你为目标!<br>你可以在战报中查看正确答案。]],
["#jy_guina_choose_card"] = [[自选一张牌(尽量不要是自己区域内同牌名的牌)]],
["$jy_guina1"] = [[让我来考考你。]],
["$jy_guina2"] = [[由我提问了。]],
["$jy_guina3"] = [[期待各位的应答。]],
["$jy_guina4"] = [[动动脑子!]],
["$jy_guina5"] = [[不错,加五分。]],
["$jy_guina6"] = [[做得好,加十分。]],
["$jy_guina7"] = [[零分,下一个!]],
["$jy_guina8"] = [[负分!]],
}
return extension