模块:Enemy
来自乐园数据管理室
此模块的文档可以在模块:Enemy/doc创建
local p = {} local loadJson = require("Module:JSON").loadJson local html = require("Module:Html") local torna = require("Module:Torna").checkTitle() function p.getDataByEnemyId(enemyId) local bit32 = require("bit32") local EnArrange = loadJson("CHR_EnArrange/" .. enemyId) local Category = loadJson("EnemyCategory")[enemyId] or "普通敌人" -- 必定存在的属性 local EnParamBase = loadJson("CHR_EnParamTable/" .. EnArrange.Lv) local EnParam = loadJson("CHR_EnParam/" .. EnArrange.ParamID) local RSC = loadJson("RSC_En/" .. EnParam.ResourceID) local Grow = loadJson("BTL_Grow/" .. EnArrange.Lv) -- 反应动作计算 local IvdFiCombo = { ["击退"] = bit32.extract(EnParam.IvdFiCombo, 0), ["吹飞"] = bit32.extract(EnParam.IvdFiCombo, 1), ["破防"] = bit32.extract(EnParam.IvdFiCombo, 2), ["倒地"] = bit32.extract(EnParam.IvdFiCombo, 3), ["浮空"] = bit32.extract(EnParam.IvdFiCombo, 4), ["猛击"] = bit32.extract(EnParam.IvdFiCombo, 5) } local RstFiCombo = { ["击退"] = bit32.extract(EnParam.RstFiCombo, 0), ["吹飞"] = bit32.extract(EnParam.RstFiCombo, 1), ["破防"] = bit32.extract(EnParam.RstFiCombo, 2), ["倒地"] = bit32.extract(EnParam.RstFiCombo, 3), ["浮空"] = bit32.extract(EnParam.RstFiCombo, 4), ["猛击"] = bit32.extract(EnParam.RstFiCombo, 5) } local caculateReactionRate = function(Ivd, Rst) if Ivd == 1 then return "无效" elseif Rst == 1 then return "40%" else return "100%" end end -- 强化能力 local loadEnhanceText = function(EnhanceID) if EnhanceID > 0 then local text = loadJson("BTL_Enhance/" .. EnhanceID).CaptionText if #text == 0 then return "Unknown Enhance: [[ " .. "JSON:BTL_Enhance/" .. EnhanceID .. "|" .. EnhanceID .. "]]" end return text end return nil end local Enhances = { loadEnhanceText(EnArrange.EnhanceID1), loadEnhanceText(EnArrange.EnhanceID2), loadEnhanceText(EnArrange.EnhanceID3) } local outData = { ["ID"] = EnArrange.id, ["等级"] = EnArrange.Lv, ["等级浮动"] = EnArrange.LvRand, ["体型"] = EnArrange.Scale .. "%", ["分类"] = Category, ["种族"] = RSC.TypeFamily, ["属性"] = EnParam.Atr, ["暴击率"] = EnParam.CriticalRate .. "%", ["格挡率"] = EnParam.GuardRate .. "%", ParamBase = { Hp = EnParamBase.HpMaxBase * EnParam.HpMaxRev / 1000, Strength = EnParamBase.StrengthBase * EnParam.StrengthRev / 1000, PowEther = EnParamBase.PowEtherBase * EnParam.PowEtherRev / 1000, Dex = EnParamBase.DexBase * EnParam.DexRev / 1000, Agility = EnParamBase.AgilityBase * EnParam.AgilityRev / 1000, Luck = EnParamBase.LuckBase * EnParam.LuckRev / 1000 }, ["物理防御"] = EnParam.RstPower .. "%", ["以太防御"] = EnParam.RstEther .. "%", ["击杀奖励"] = { EXP = math.floor(Grow.EnemyExp * EnArrange.ExpRev / 100), Gold = math.floor(Grow.EnemyGold * EnArrange.GoldRev / 100), WP = math.floor(Grow.EnemyWP * EnArrange.WPRev / 100), SP = math.floor(Grow.EnemySP * EnArrange.SPRev / 100) }, ["反应动作抗性"] = { ["击退"] = caculateReactionRate(IvdFiCombo["击退"], RstFiCombo["击退"]), ["吹飞"] = caculateReactionRate(IvdFiCombo["吹飞"], RstFiCombo["吹飞"]), ["破防"] = caculateReactionRate(IvdFiCombo["破防"], RstFiCombo["破防"]), ["倒地"] = caculateReactionRate(IvdFiCombo["倒地"], RstFiCombo["倒地"]), ["浮空"] = caculateReactionRate(IvdFiCombo["浮空"], RstFiCombo["浮空"]), ["猛击"] = caculateReactionRate(IvdFiCombo["猛击"], RstFiCombo["猛击"]) }, Enhance = Enhances, IgnoreLevPow = EnArrange.IgnoreLevPow } -- 可能存在的属性 -- 珍稀种能力修正 if EnArrange.ParamRev > 0 then local EnParamRev = loadJson("CHR_EnParam_Rev/" .. EnArrange.ParamRev) outData.ParamBase.Hp = outData.ParamBase.Hp * EnParamRev.HpMaxRev / 1000 outData.ParamBase.Strength = outData.ParamBase.Strength * EnParamRev.StrengthRev / 1000 outData.ParamBase.PowEther = outData.ParamBase.PowEther * EnParamRev.PowEtherRev / 1000 outData.ParamBase.Dex = outData.ParamBase.Dex * EnParamRev.DexRev / 1000 outData.ParamBase.Agility = outData.ParamBase.Agility * EnParamRev.AgilityRev / 1000 outData.ParamBase.Luck = outData.ParamBase.Luck * EnParamRev.LuckRev / 1000 outData.Multiply = { Hp = EnParam.HpMaxRev / 1000 * EnParamRev.HpMaxRev / 1000, Strength = EnParam.StrengthRev / 1000 * EnParamRev.StrengthRev / 1000, PowEther = EnParam.PowEtherRev / 1000 * EnParamRev.PowEtherRev / 1000, Dex = EnParam.DexRev / 1000 * EnParamRev.DexRev / 1000, Agility = EnParam.AgilityRev / 1000 * EnParamRev.AgilityRev / 1000, Luck = EnParam.LuckRev / 1000 * EnParamRev.LuckRev / 1000 } end -- 掉落 local parseDropItem = function(DropItem) local out = {} for i = 1, 8 do if DropItem["ItemID" .. i] ~= 0 then local itemTitle = mw.title.new(DropItem["ItemID" .. i], "物品") if torna then local tornaTitle = mw.title.new(DropItem["ItemID" .. i], "黄金之国物品") if tornaTitle.exists then itemTitle = tornaTitle end end table.insert( out, { Item = "[[" .. itemTitle.fullText .. "|" .. itemTitle.text .. "]]", DropProb = DropItem["DropProb" .. i] / 10 .. "%", First = DropItem["FirstNamed" .. i] == 1 and "✔" or "" } ) mw.smw.set { ["掉落"] = itemTitle.fullText, [itemTitle.fullText .. "掉率"] = DropItem["DropProb" .. i] / 10 .. "%" .. (DropItem["FirstNamed" .. i] == 1 and "(初次100%)" or "") } end end return out end if EnArrange.DropTableID > 0 then local EnDropItem1 = loadJson("BTL_EnDropItem/" .. EnArrange.DropTableID) outData["击杀奖励"]["DropItem1"] = parseDropItem(EnDropItem1) end if EnArrange.DropTableID3 > 0 then local EnDropItem2 = loadJson("BTL_EnDropItem/" .. EnArrange.DropTableID3) outData["击杀奖励"]["DropItem2"] = parseDropItem(EnDropItem2) end if EnArrange.PreciousID ~= 0 then local itemTitle = mw.title.new(EnArrange.PreciousID, "物品") outData["击杀奖励"].PreciousID = "[[" .. itemTitle.fullText .. "|" .. itemTitle.text .. "]]" mw.smw.set { ["掉落"] = itemTitle.fullText, [itemTitle.fullText .. "掉率"] = "100%" } end -- 愤怒光环 if EnParam.Aura > 0 then local Aura = loadJson("BTL_Aura/" .. EnParam.Aura) outData.Aura = { Name = Aura.Name, ChangeAtr = Aura.ChangeAtr, Enhance = { loadEnhanceText(Aura.Enhance1), loadEnhanceText(Aura.Enhance2), loadEnhanceText(Aura.Enhance3) } } end -- arts local BdatEnums = require("Module:BdatEnums") local parseArtsEn = function(Arts) local ArtsType = BdatEnums.ArtsType[Arts.ArtsType] local ArtsBuff = Arts.ArtsBuff > 0 and BdatEnums.ArtsBuff[Arts.ArtsBuff] or "" local ArtsDeBuff = Arts.ArtsDeBuff > 0 and loadJson("BTL_Buff/" .. Arts.ArtsDeBuff).Name or "" local Target = BdatEnums.ArtsTarget[Arts.Target] local DmgMgn = Arts.DmgMgn if Target == "自身" or ArtsType == "减益效果" then DmgMgn = 0 end local HitFrm = {} local hitNum = 0 for i = 1, 16 do table.insert(HitFrm, Arts["HitFrm" .. i]) if Arts["HitFrm" .. i] > 0 then hitNum = hitNum + 1 end end local DmgRt = {} local DmgRtTotal = 0 for i = 1, 16 do local potencyRatio = Arts["DmgRt" .. i] if potencyRatio == 255 then potencyRatio = -1 end table.insert(DmgRt, potencyRatio) if potencyRatio > 0 then DmgRtTotal = DmgRtTotal + potencyRatio end end local ReAct = {} for i = 1, 16 do local ReActText = Arts["ReAct" .. i] > 0 and BdatEnums.ReActType[Arts["ReAct" .. i]] or "" table.insert(ReAct, ReActText) end local hit = {} local DmgTotal = 0 for i = 1, 16 do local dmgPerHit = 0 if DmgRtTotal > 0 then -- DmgRt 总和大于0时,每hit伤害按 DmgRt 分割 if DmgRt[i] > 0 then dmgPerHit = DmgMgn * DmgRt[i] / DmgRtTotal end else -- DmgRtTotal 为 0 if HitFrm[i] > 0 and DmgRt[i] == 0 then -- HitFrame存在且DmgRt不为-1 dmgPerHit = DmgMgn / hitNum end end if HitFrm[i] > 0 or dmgPerHit > 0 or #ReAct[i] > 0 then local dmg = tonumber(mw.ustring.format("%.2f", dmgPerHit)) table.insert( hit, { HitTime = tonumber(mw.ustring.format("%.2f", HitFrm[i] / 30)), Dmg = dmg > 0 and dmg or "", ReAct = ReAct[i] } ) DmgTotal = DmgTotal + dmgPerHit end end local hitText = html.wikitable( { {scope = "HitTime", label = "秒"}, {scope = "Dmg", label = "伤害倍率"}, {scope = "ReAct", label = "特效"} }, hit, {class = "borderless-table"} ) -- summon local SummonText = "" if Arts.Summon and Arts.Summon > 0 then local SummonResult = {} local Summon = loadJson("BTL_Summon/" .. Arts.Summon) for _, id in ipairs(Summon.EnemyID) do if id > 0 then local enemyData = loadJson("CHR_EnArrange/" .. id) local ns = "敌人" local currentTitle = mw.title.getCurrentTitle() if "黄金之国" == mw.ustring.sub(tostring(currentTitle), 1, 4) then ns = "黄金之国敌人" end local title = mw.title.new(enemyData.Name, ns) table.insert(SummonResult, "[[" .. title.fullText .. "|" .. title.text .. "]]") mw.smw.set {["SummonEnemy"] = title.fullText} end end SummonText = table.concat(SummonResult, "<br>") end local Resist = {} if Arts.SArmor1 then table.insert(Resist, "吹飞") table.insert(Resist, "击退") end if Arts.SArmor2 then table.insert(Resist, "破防") table.insert(Resist, "倒地") table.insert(Resist, "浮空") table.insert(Resist, "猛击") end Resist = table.concat(Resist, " ") return { ID = Arts.id, Name = Arts.Name == 0 and "" or Arts.Name, DebugName = Arts.DebugName, ArtsType = ArtsType, ArtsBuff = ArtsBuff, ArtsDeBuff = ArtsDeBuff, Target = Target, Distance = Arts.Distance, RangeType = BdatEnums.ArtsRangeType[Arts.RangeType], Radius = Arts.Radius, Length = Arts.Length, Atr = Arts.Atr, HitRevise = Arts.HitRevise .. "%", CriRevise = Arts.CriRevise .. "%", DmgMgn = DmgTotal > 0 and DmgTotal or "", RecastTime = Arts.Recast / 30 .. "秒", StartRecast = Arts.StartRecast .. "%", Enhance = loadEnhanceText(Arts.Enhance), Summon = SummonText, Resist = Resist, Hit = hit, HitText = hitText } end outData.Arts = {} for i = 1, 16 do local artsId = EnParam["ArtsNum" .. i] if artsId > 0 then local Arts = loadJson("BTL_Arts_En/" .. artsId) table.insert(outData.Arts, parseArtsEn(Arts)) end end local parseArtsBl = function(Arts) local ArtsType = BdatEnums.ArtsType[Arts.ArtsType] local ArtsBuff = Arts.ArtsBuff > 0 and BdatEnums.ArtsBuff[Arts.ArtsBuff] or "" local ArtsDeBuff = Arts.ArtsDeBuff > 0 and loadJson("BTL_Buff/" .. Arts.ArtsDeBuff).Name or "" local Target = BdatEnums.ArtsTarget[Arts.Target] local DmgMgn = Arts.DmgMgn6 if Target == "自身" or ArtsType == "减益效果" then DmgMgn = 0 end local HitFrm = {} local hitNum = 0 for i = 1, 16 do table.insert(HitFrm, Arts["HitFrm" .. i]) if Arts["HitFrm" .. i] > 0 then hitNum = hitNum + 1 end end local DmgRt = {} local DmgRtTotal = 0 for i = 1, 16 do local potencyRatio = Arts["DmgRt" .. i] if potencyRatio == 255 then potencyRatio = -1 end table.insert(DmgRt, potencyRatio) if potencyRatio > 0 then DmgRtTotal = DmgRtTotal + potencyRatio end end local ReAct = {} for i = 1, 16 do local ReActText = Arts["ReAct" .. i] > 0 and BdatEnums.ReActType[Arts["ReAct" .. i]] or "" table.insert(ReAct, ReActText) end local hit = {} local DmgTotal = 0 for i = 1, 16 do local dmgPerHit = 0 if DmgRtTotal > 0 then -- DmgRt 总和大于0时,每hit伤害按 DmgRt 分割 if DmgRt[i] > 0 then dmgPerHit = DmgMgn * DmgRt[i] / DmgRtTotal end else -- DmgRtTotal 为 0 if HitFrm[i] > 0 and DmgRt[i] == 0 then -- HitFrame存在且DmgRt不为-1 dmgPerHit = DmgMgn / hitNum end end if HitFrm[i] > 0 or dmgPerHit > 0 or #ReAct[i] > 0 then local dmg = tonumber(mw.ustring.format("%.2f", dmgPerHit)) table.insert( hit, { HitTime = tonumber(mw.ustring.format("%.2f", HitFrm[i] / 30)), Dmg = dmg > 0 and dmg or "", ReAct = ReAct[i] } ) DmgTotal = DmgTotal + dmgPerHit end end local hitText = html.wikitable( { {scope = "HitTime", label = "秒"}, {scope = "Dmg", label = "伤害倍率"}, {scope = "ReAct", label = "特效"} }, hit, {class = "borderless-table"} ) local Resist = {} if Arts.SArmor1 then table.insert(Resist, "吹飞") table.insert(Resist, "击退") end if Arts.SArmor2 then table.insert(Resist, "破防") table.insert(Resist, "倒地") table.insert(Resist, "浮空") table.insert(Resist, "猛击") end Resist = table.concat(Resist, " ") return { ID = Arts.id, Name = Arts.Name == 0 and "" or Arts.Name, DebugName = Arts.DebugName, ArtsType = ArtsType, ArtsBuff = ArtsBuff, ArtsDeBuff = ArtsDeBuff, Target = Target, Distance = Arts.Distance, RangeType = BdatEnums.ArtsRangeType[Arts.RangeType], Radius = Arts.Radius, Length = Arts.Length, Atr = Arts.Atr, HitRevise = Arts.HitRevise .. "%", CriRevise = Arts.CriRevise .. "%", DmgMgn = DmgTotal > 0 and DmgTotal or "", Enhance = loadEnhanceText(Arts.Enhance5), Resist = Resist, Hit = hit, HitText = hitText } end -- 携带异刃 if EnArrange.EnemyBladeID > 0 then local BladeID = loadJson("CHR_EnArrange/" .. EnArrange.EnemyBladeID).BladeID local CHR_Bl = loadJson("CHR_Bl/" .. BladeID) local Arts1 = CHR_Bl.BArts1 > 0 and loadJson("BTL_Arts_Bl/" .. CHR_Bl.BArts1) or nil local Arts2 = CHR_Bl.BArts2 > 0 and loadJson("BTL_Arts_Bl/" .. CHR_Bl.BArts2) or nil local Arts3 = CHR_Bl.BArts3 > 0 and loadJson("BTL_Arts_Bl/" .. CHR_Bl.BArts3) or nil local ArtsEx = CHR_Bl.BArtsEx outData.Blade = { ["属性"] = CHR_Bl.Atr, ["Arts"] = { Arts1 and parseArtsBl(Arts1), Arts2 and parseArtsBl(Arts2), Arts3 and parseArtsBl(Arts3) } } end -- 后处理 outData.ParamBase.Hp = math.floor(outData.ParamBase.Hp) outData.ParamBase.Strength = math.floor(outData.ParamBase.Strength) outData.ParamBase.PowEther = math.floor(outData.ParamBase.PowEther) outData.ParamBase.Dex = math.floor(outData.ParamBase.Dex) outData.ParamBase.Agility = math.floor(outData.ParamBase.Agility) outData.ParamBase.Luck = math.floor(outData.ParamBase.Luck) -- SMW mw.smw.set { ["ZoneID"] = EnArrange.ZoneID, ["敌人分类"] = Category, ["地域"] = EnArrange.ZoneID > 0 and loadJson("FLD_maplist/" .. EnArrange.ZoneID).nameID, ["等级"] = EnArrange.Lv, ["等级浮动"] = EnArrange.LvRand, ["无视等级差补正"] = EnArrange.IgnoreLevPow and "✔" or "✘", ["种族"] = outData["种族"], EXP = outData["击杀奖励"].EXP, Gold = outData["击杀奖励"].Gold, WP = outData["击杀奖励"].WP, SP = outData["击杀奖励"].SP, HP = outData.ParamBase.Hp, ["力量"] = outData.ParamBase.Strength, ["以太力"] = outData.ParamBase.PowEther, ["灵巧"] = outData.ParamBase.Dex, ["敏捷"] = outData.ParamBase.Agility, ["运气"] = outData.ParamBase.Luck, ["物理抗性"] = outData["物理防御"], ["以太抗性"] = outData["以太防御"], ["暴击率"] = outData["暴击率"], ["格挡率"] = outData["格挡率"], ["吹飞"] = outData["反应动作抗性"]["吹飞"], ["击退"] = outData["反应动作抗性"]["击退"], ["破防"] = outData["反应动作抗性"]["破防"], ["倒地"] = outData["反应动作抗性"]["倒地"], ["浮空"] = outData["反应动作抗性"]["浮空"], ["猛击"] = outData["反应动作抗性"]["猛击"] } return outData end function p.singleEnemyContent(data) local out = "" out = out .. '<div class="flex-wrap">' -- 基本信息 local basicInfo = "" if data["分类"] == "任务敌人" then local currentTitle = mw.title.getCurrentTitle() local quest = {} local result = mw.smw.ask {"[[任务敌人::" .. currentTitle.fullText .. "]]"} if result then for _, v in ipairs(result) do table.insert(quest, v[1]) end end basicInfo = html.wikitable( { "等级", "属性", "分类", "任务", "种族", "体型" }, { { data["等级"] .. (data["等级浮动"] == 0 and "" or " ( +" .. data["等级浮动"] .. " )"), data["属性"], data["分类"], table.concat(quest, "<br>"), data["种族"], data["体型"] } }, {transpose = true} ) else basicInfo = html.wikitable( { "等级", "属性", "分类", "种族", "体型" }, { { data["等级"] .. (data["等级浮动"] == 0 and "" or " ( +" .. data["等级浮动"] .. " )"), data["属性"], data["分类"], data["种族"], data["体型"] } }, {transpose = true} ) end local ingoreLv = data.IgnoreLevPow and '<div class="card">无视等级差补正</div>' or "" out = out .. "<div>" .. basicInfo .. ingoreLv .. "</div>" out = out .. html.wikitable( { {scope = "Hp", label = "HP"}, {scope = "Strength", label = "力量"}, {scope = "PowEther", label = "以太力"}, {scope = "Agility", label = "敏捷"}, {scope = "Dex", label = "灵巧"}, {scope = "Luck", label = "运气"} }, {data.ParamBase}, {transpose = true} ) out = out .. html.wikitable( {"物理抗性", "以太抗性", "暴击率", "格挡率"}, { { data["物理防御"], data["以太防御"], data["暴击率"], data["格挡率"] } }, {transpose = true} ) out = out .. html.wikitable( { {scope = "吹飞", label = "吹飞"}, {scope = "击退", label = "击退"}, {scope = "破防", label = "破防"}, {scope = "倒地", label = "倒地"}, {scope = "浮空", label = "浮空"}, {scope = "猛击", label = "猛击"} }, {data["反应动作抗性"]}, {transpose = true} ) if #data.Enhance > 0 then out = out .. html.wikitable({"被动能力"}, {{html.ul(data.Enhance)}}) end if data.Aura then data.Aura.Name = data.Aura.Name or "愤怒" out = out .. '<div class="card"><div class="title">' .. data.Aura.Name .. '</div><div class="flex-wrap">' .. html.wikitable({"被动能力"}, {{html.ul(data.Aura.Enhance)}}) .. html.wikitable({"属性变化"}, {{data.Aura.ChangeAtr}}) .. "</div></div>" end out = out .. "</div>" -- 敌人武技 if #data.Arts > 0 then out = out .. html.h3("武技") out = out .. html.wikitable( { {scope = "Name", label = "名称"}, {scope = "ArtsType", label = "类型"}, {scope = "Target", label = "释放对象"}, {scope = "RangeType", label = "判定范围"}, {scope = "DmgMgn", label = "伤害倍率"}, {scope = "RecastTime", label = "冷却时间"} }, data.Arts, { width = "100%", expandRow = { {scope = "Atr", label = "攻击属性"}, {scope = "Distance", label = "使用距离"}, {scope = "StartRecast", label = "初始冷却"}, {scope = "HitRevise", label = "命中修正"}, {scope = "CriRevise", label = "暴击修正"}, {scope = "ArtsBuff", label = "技能使用中状态"}, {scope = "ArtsDeBuff", label = "减益效果"}, {scope = "Enhance", label = "特效"}, {scope = "HitText", label = "技能判定"}, {scope = "Summon", label = "召唤"}, {scope = "Resist", label = "反应动作无效"} }, expandRowKey = "ID" } ) end if data.Blade then out = out .. html.h3("异刃必杀") out = out .. html.wikitable( { {scope = "Name", label = "名称"}, {scope = "ArtsType", label = "类型"}, {scope = "Target", label = "释放对象"}, {scope = "RangeType", label = "判定范围"}, {scope = "DmgMgn", label = "伤害倍率"} }, data.Blade.Arts, { width = "100%", expandRow = { {scope = "Atr", label = "攻击属性"}, {scope = "Distance", label = "使用距离"}, {scope = "HitRevise", label = "命中修正"}, {scope = "CriRevise", label = "暴击修正"}, {scope = "ArtsBuff", label = "技能使用中状态"}, {scope = "ArtsDeBuff", label = "减益效果"}, {scope = "Enhance", label = "特效"}, {scope = "HitText", label = "技能判定"}, {scope = "Resist", label = "反应动作无效"} }, expandRowKey = "ID" } ) end -- 击杀奖励 local dropContent = "" local schema if data["分类"] == "剧情敌人" or data["分类"] == "珍稀种" then schema = { {scope = "Item", label = "掉落物品"}, {scope = "DropProb", label = "概率"}, {scope = "First", label = "初次"} } else schema = { {scope = "Item", label = "掉落物品"}, {scope = "DropProb", label = "概率"} } end if data["击杀奖励"]["DropItem1"] then dropContent = dropContent .. html.wikitable(schema, data["击杀奖励"]["DropItem1"]) end if data["击杀奖励"]["DropItem2"] then dropContent = dropContent .. html.wikitable(schema, data["击杀奖励"]["DropItem2"]) end if data["击杀奖励"].PreciousID then dropContent = dropContent .. html.wikitable({"贵重品"}, {{data["击杀奖励"].PreciousID}}) end if data["击杀奖励"].EXP > 0 or data["击杀奖励"].Gold > 0 or data["击杀奖励"].WP > 0 or data["击杀奖励"].SP > 0 then dropContent = dropContent .. html.wikitable( { "EXP", "Gold", "WP", "SP" }, { { data["击杀奖励"].EXP, data["击杀奖励"].Gold, data["击杀奖励"].WP, data["击杀奖励"].SP } } ) end if #dropContent > 0 then out = out .. html.h3("击杀奖励") .. '<div class="flex-wrap">' .. dropContent .. "</div>" end -- 地图 if data["分类"] == "打捞敌人" or data["分类"] == "召唤敌人" then out = out .. html.h3("出现方式") local currentTitle = mw.title.getCurrentTitle() local result result = mw.smw.ask("[[打捞点:+]][[SalvageEnemyPop::" .. currentTitle.fullText .. "]]|format=ul") if result then out = out .. html.wikitable({"打捞点"}, result) end result = mw.smw.ask("[[SummonEnemy::" .. currentTitle.fullText .. "]]") if result then out = out .. html.wikitable({"召唤"}, result) end else out = out .. html.h3("地图位置") out = out .. '<div class="multi-xb2map-enemy" data-enemy-id="' .. data.ID .. '"></div>' end return out end function p.main() local out = "" local getEnemyId = function(enemy) -- 判断enemy输入数字或对象 local enemyId, enemyTitle if type(enemy) == "number" then enemyId = enemy enemyTitle = enemy elseif type(enemy) == "table" then enemyId = enemy.id enemyTitle = enemy.title end return enemyId, enemyTitle end local currentTitle = mw.title.getCurrentTitle() local ids = loadJson("EnemyIdMap")[currentTitle.text] local filteredIds = {} if torna then for _, enemy in ipairs(ids) do local id = getEnemyId(enemy) if id > 1427 and id < 1673 then table.insert(filteredIds, enemy) end end else for _, enemy in ipairs(ids) do local id = getEnemyId(enemy) if id < 1427 or id > 1673 then table.insert(filteredIds, enemy) end end end if #filteredIds > 0 then for _, enemy in ipairs(filteredIds) do local enemyId, enemyTitle = getEnemyId(enemy) local enemyData = p.getDataByEnemyId(enemyId) if #filteredIds > 1 then -- 分段落 out = out .. html.h2(enemyTitle) end out = out .. p.singleEnemyContent(enemyData) end end return out end return p