模块:Npc
来自乐园数据管理室
此模块的文档可以在模块:Npc/doc创建
local p = {} local QueryHelper = require("Module:Xb2QueryHelper") local html = require("Module:Html") local BdatEnums = require("Module:BdatEnums") local Flag = require("Module:Flag") local Condition = require("Module:Condition") local function processTalk(talkArr) local talkText = "" for _, row in ipairs(talkArr) do row = mw.ustring.gsub(row, "\n", "<br>") row = mw.ustring.gsub(row, "%[ML:Dash.*%]", "──") row = mw.ustring.gsub(row, "%[ML:Feeling .*%]", "") talkText = talkText .. "<li>" .. row .. "</li>" end return "<ul>" .. talkText .. "</ul>" end function p.main(frame) local out = "" local currentTitle = mw.title.getCurrentTitle() local npcName = currentTitle.text local npcs = QueryHelper.getNpcPopByNpcName(npcName) -- 过滤无出现地点的NPC local npcsWithoutNoPop = {} for _, npc in ipairs(npcs) do if #npc.Pops > 0 then table.insert(npcsWithoutNoPop, npc) end end -- mw.log(mw.text.jsonEncode(npcs, mw.text.JSON_PRETTY)) -- mw.logObject(npcsWithoutNoPop) -- table.sort比较函数,相同要返回false,一直返回true会出错 local sortFunc = function(a, b) -- 把任务id小于1000的隐式主线任务设为0,认为它不存在 if a.QuestFlag <= 1000 then a.QuestFlag = 0 end if b.QuestFlag <= 1000 then b.QuestFlag = 0 end -- 不是任务的排前面 if a.QuestFlag * b.QuestFlag == 0 and a.QuestFlag > 0 or b.QuestFlag > 0 then if a.QuestFlag == b.QuestFlag then return false else return a.QuestFlag < b.QuestFlag end end -- 按ScenarioFlagMin升序 if a.ScenarioFlagMin > 0 and b.ScenarioFlagMin > 0 then if a.ScenarioFlagMin == b.ScenarioFlagMin then return false else return a.ScenarioFlagMin <= b.ScenarioFlagMin end end -- 按QuestFlag升序 if a.QuestFlag > 1000 or b.QuestFlag > 1000 then if a.QuestFlag == b.QuestFlag then return false else return a.QuestFlag < b.QuestFlag end end return a.row_id < b.row_id end for _, npc in ipairs(npcsWithoutNoPop) do if #npcsWithoutNoPop > 1 then out = out .. html.h2("Npc: " .. npc.row_id) end -- NPC info and picture out = out .. '<div class="flex-wrap" style="justify-content: space-between;">' local race = BdatEnums.getNpcRaceName(npc) out = out .. html.wikitable( {"性别", "人种"}, { {BdatEnums.Gender[npc.Gender], race} } ) out = out .. "[[文件:NPC-" .. npc.row_id .. ".jpg|none|400px|上传NPC照片]]" out = out .. "</div>" -- 出现点 table.sort(npc.Pops, sortFunc) for _, npcPop in ipairs(npc.Pops) do -- SMW mw.smw.set {PopID = npcPop.row_id} out = out .. html.h3("Pop: " .. npcPop.row_id) do -- 第一行:基本信息、条件 local scenario if npcPop.ScenarioFlagMin > 0 or npcPop.ScenarioFlagMax > 0 then scenario = npcPop.ScenarioFlagMin == npcPop.ScenarioFlagMax and Flag.scenario(npcPop.ScenarioFlagMin) or Flag.scenario(npcPop.ScenarioFlagMin) .. " ~ " .. Flag.scenario(npcPop.ScenarioFlagMax) end local quest, questPhase = Flag.quest(npcPop.QuestFlag, npcPop.row_id > 40000) mw.smw.set {QuestDisplay = quest} local npcPopRowData = { world = BdatEnums.getWorldName(math.floor(npcPop.row_id / 1000)), timerange = table.concat(BdatEnums.getTimeRange(npcPop.TimeRange), ", "), scenario = scenario, quest = questPhase and (quest .. "#" .. questPhase) or quest, condition = Condition.getById(npcPop.Condition, npcPop.row_id > 40000), memberNum = npcPop.memberNum } local th = { {scope = "world", label = "地域"}, {scope = "timerange", label = "时间段"} } if npcPopRowData.scenario then table.insert(th, {scope = "scenario", label = "主线剧情"}) end if npcPopRowData.quest then table.insert(th, {scope = "quest", label = "任务"}) end if npcPop.Group > 0 then table.insert(th, {scope = "memberNum", label = "人数"}) end out = out .. '<div class="flex-wrap">' out = out .. html.wikitable(th, {npcPopRowData}) if npcPop.Condition > 0 then local conditionText = Condition.getById(npcPop.Condition, npcPop.row_id > 40000) if conditionText then out = out .. html.wikitable( {"条件"}, { {conditionText} } ) end end out = out .. "</div>" end do -- 第二行:对话、地图 out = out .. '<div class="flex-wrap" style="justify-content: space-between;">' -- Talkable属性为true才显示对话 if npcPop.Talkable then local languageTable = { {lan = "cn", label = "简"}, {lan = "tw", label = "繁"}, {lan = "jp", label = "日"} } local talkList = {} for _, v in ipairs(languageTable) do -- 设置语言 QueryHelper.language = v.lan table.insert(talkList, QueryHelper.getDialogByEventId(npcPop.EventID)) end -- 重置语言 QueryHelper.language = "cn" -- 对话语句数大于0时才显示 if #talkList[1] > 0 then out = out .. '<div class="xbxbtabs">' for i, v in ipairs(languageTable) do local tabslabel = v.label local tabsname = npcPop.EventID .. v.lan out = out .. '<div data-name="' .. tabsname .. '" data-label="' .. tabslabel .. '" >' .. html.wikitable( {"对话"}, { {processTalk(talkList[i])} } ) .. "</div>" end out = out .. "</div>" end end -- 地图 out = out .. '<div style="flex-grow: 1;min-width: 360px;max-width: 640px;">' .. mw.ustring.format([[<div class="xb2map-npc" data-gmk-id="%s" ></div>]], npcPop.name) .. "</div>" out = out .. "</div>" end end -- SMW mw.smw.set { Race = race } end return out end return p