Module:ItemInfo
跳转到导航
跳转到搜索
可在Module:ItemInfo/doc创建此模块的帮助文档
local p = {}
local be = require 'Module:BattleEffect'
local ci = require 'Module:CardInfo'
local ei = require 'Module:EnemyInfo'
local function getIdByCategoryAndIndex(game, category, index)
if game == 'AT1' then
local baseId = {
['饰品'] = 0,
['防具'] = 20,
['重要'] = 49,
['材料物品'] = 61,
['合成材料'] = 95,
['使用'] = 119,
['武器'] = 191,
['葛拉斯诺晶体'] = 226
}
local categoryStartId = baseId[category]
if categoryStartId then
return categoryStartId + index - 1
else
error("无效的物品类别: " .. tostring(category))
end
end
end
local function getAt1MelcInfo(id)
local recipes = mw.loadJsonData('数据:AT1/调合配方')
local ret = {}
ret.item_use_this = {}
for i, recipe in ipairs(recipes) do
if tonumber(recipe.id) == id then
local mat = {}
for i = 1, 4 do
mat[i] = tonumber(recipe['mat'..i])
if mat[i] == -1 then mat[i] = nil end
if mat[i] == 226 then mat[i] = -1 end
end
local nam = {}
if recipe['orica-naming'] ~= '' then nam.orica = recipe['orica-naming'] end
if recipe['misya-naming'] ~= '' then nam.misya = recipe['misya-naming'] end
if recipe['shurelia-naming'] ~= '' then nam.shurelia = recipe['shurelia-naming'] end
ret.material = mat
ret.naming = nam
else
for i = 1, 4 do
if tonumber(recipe['mat'..i]) == id then
table.insert(ret.item_use_this, recipe['id'])
end
end
end
end
return ret
end
function p.loadItemInfoByIndex(game, category, index)
local id = getIdByCategoryAndIndex(game, category, index)
-- 获取索引(综合数据)
local matIdx = mw.loadJsonData('数据:' .. game .. '/' .. category .. '/索引')
local itemBase = matIdx[index]
local status, data = pcall(mw.loadJsonData, '数据:' .. game .. '/' .. category .. '/' .. index)
local melc = getAt1MelcInfo(id)
if status then
ret = {}
for k, v in pairs(data) do
ret[k] = v
end
for k, v in pairs(itemBase) do
ret[k] = v
end
for k, v in pairs(melc) do
ret[k] = v
end
ret.id = id
return ret
else
ret = {}
for k, v in pairs(itemBase) do
ret[k] = v
end
for k, v in pairs(melc) do
ret[k] = v
end
ret.id = id
return ret
end
end
-- 根据物品Id获取物品信息
function p.loadItemById(game, id)
id = tonumber(id)
if game == 'AT1' then
-- id 区间检查
if id >= 0 and id <= 19 then
-- 饰品
return p.loadItemInfoByIndex(game, '饰品', id + 1)
elseif id >= 20 and id <= 20 + 28 then
-- 防具
return p.loadItemInfoByIndex(game, '防具', id - 20 + 1)
elseif id >= 49 and id <= 49 + 11 then
-- 重要
return p.loadItemInfoByIndex(game, '重要', id - 49 + 1)
elseif id >= 61 and id <= 61 + 33 then
-- 材料(采集)
return p.loadItemInfoByIndex(game, '材料物品', id - 61 + 1)
elseif id >= 95 and id <= 95 + 23 then
-- 材料(合成)
return p.loadItemInfoByIndex(game, '合成材料', id - 95 + 1)
elseif id >= 119 and id <= 119 + 71 then
-- 使用类物品
return p.loadItemInfoByIndex(game, '使用', id - 119 + 1)
elseif id >= 191 and id <= 191 + 34 then
-- 武器
return p.loadItemInfoByIndex(game, '武器', id - 191 + 1)
elseif id >= 226 and id <= 226 + 339 then
-- 葛拉斯诺晶体
return p.loadItemInfoByIndex(game, '葛拉斯诺晶体', id - 226 + 1)
end
return nil, '获取数据失败,无效物品ID: ' .. id
elseif game == 'AT2' then
elseif game == 'AT3' then
end
return nil, '获取数据失败,所指定的游戏不存在'
end
-- 根据物品ID获取物品类别,及索引
local function queryCategoryById(game, id)
id = tonumber(id)
if game == 'AT1' then
-- id 区间检查
if id >= 0 and id <= 19 then
-- 饰品
return '装备', '饰品', id + 1
elseif id >= 20 and id <= 20 + 28 then
-- 防具
return '装备', '防具', id - 20 + 1
elseif id >= 49 and id <= 49 + 11 then
-- 重要
return '重要', nil, id - 49 + 1
elseif id >= 61 and id <= 61 + 33 then
-- 材料(采集)
return '材料', '采集', id - 61 + 1
elseif id >= 95 and id <= 95 + 23 then
-- 材料(合成)
return '材料', '合成', id -95 + 1
elseif id >= 119 and id <= 119 + 71 then
-- 使用类物品
return '使用', nil, id - 119 + 1
elseif id >= 191 and id <= 191 + 34 then
-- 武器
return '装备', '武器', id - 191 + 1
elseif id >= 226 and id <= 226 + 339 then
-- 葛拉斯诺晶体
return '葛拉斯诺晶体', nil, id - 226 + 1
end
return nil, '获取数据失败,无效物品ID: ' .. id
elseif game == 'AT2' then
elseif game == 'AT3' then
end
return nil, '获取数据失败,所指定的游戏不存在'
end
-- 根据ID获取物品名
local function getNameById(game, id)
local item, err = p.loadItemById(game, id)
if err then return err end
return item.name
end
-- 过滤重结晶项
local function recryFilter(recry)
local game = 'AT1'
local ret = {}
if recry == nil then return ret end
if recry.s_prod ~= '-1' then
ret.s_prod = getNameById(game, recry.s_prod)
end
if recry.a_prod ~= '-1' then
ret.a_prod = getNameById(game, recry.a_prod)
end
if recry.b_prod ~= '-1' then
ret.b_prod = getNameById(game, recry.b_prod)
end
if recry.c_prod ~= '-1' then
ret.c_prod = getNameById(game, recry.c_prod)
end
return ret
end
p.gcType = {'#b70000', '#0d57cb', '#139a00', '#9f0087'}
local paramNames = {'hp', 'mp', 'atk', 'crit', 'def', 'agi', 'fdef', 'idef', 'tdef', 'wdef', 'fatk', 'iatk', 'tatk', 'watk', 'dmg_max', 'burst_spd', 'gd_resist', 'harmonics'}
local paramDisplay = {'HP', 'MP', '攻击力', '暴击率', '防御力', '敏捷', '炎抗性', '冰抗性', '雷抗性', '风抗性', '炎攻击', '冰攻击', '雷攻击', '风攻击', '附加伤害', '爆发速率', 'GD抗性', '谐调强化'}
local function checkAndMakeParamList(item)
result = {}
for i, v in ipairs(paramNames) do
if item[v] ~= '0' then
table.insert(result, '* ' .. paramDisplay[i] .. ':' .. item[v])
end
end
return table.concat(result, '\n')
end
function p.generateGrathnodeCrystalList()
local result = {}
local index = mw.loadJsonData('数据:AT1/葛拉斯诺晶体/索引')
for i = 1, 339 do
local item = index[i]
local type = tonumber(item.type)
-- 之后要替换为图片及标题的::before元素,提供更好的视觉效果
local icon = '<span style="background-color: ' .. p.gcType[type + 1] .. '; padding: 0 .25em; color: white">' .. item.level .. '</span>'
local section = '==' .. item.name .. '==\n' .. string.gsub(item.desc, 'CR', '<br />')
local html = mw.html.create('table'):addClass('wikitable')
html:tag('tr')
:tag('th'):wikitext('类型'):done()
:tag('th'):wikitext('品质'):done()
:tag('th'):wikitext('GD'):done()
:tag('th'):wikitext('价格'):done()
:tag('th'):wikitext('稀有度'):done()
:tag('th'):wikitext(be.getBattleEffectById('AT1', item.eff_key)):done()
html:tag('tr')
:tag('th'):wikitext(icon):done()
:tag('td'):wikitext(item.quality):done()
:tag('td'):wikitext(item.gd):done()
:tag('td'):wikitext(string.sub(item.price, 0, -2)):done()
:tag('td'):wikitext(item.rarity):done()
:tag('td'):wikitext(item.eff_val):done()
local list = checkAndMakeParamList(item)
table.insert(result, section .. tostring(html) .. '\n' .. list)
end
return table.concat(result, '\n')
end
local function makeArgumentOfParameter(args, para)
for i, v in ipairs(paramNames) do
args[paramDisplay[i]] = para[v]
end
end
local function generateArguments(item, category, subcategory)
local filteredRecrystalisation = recryFilter(item.recry)
local arguments = {
["物品名"] = item.name,
["图像"] = item.img,
["原文"] = item.ori,
["类别"] = category,
["子类别"] = subcategory,
["游戏"] = 'AT1',
["重结晶S"] = filteredRecrystalisation.s_prod,
["重结晶A"] = filteredRecrystalisation.a_prod,
["重结晶B"] = filteredRecrystalisation.b_prod,
["重结晶C"] = filteredRecrystalisation.c_prod,
["其他来源"] = item.alt_src,
["笔记"] = item.desc,
["特殊效果"] = item.effect
}
if item.base ~= nil then
arguments["卖价"] = item.base.sell_price
end
if item.para ~= nil then
makeArgumentOfParameter(arguments, item.para)
end
if item.base.synthesisable == '1' then
arguments["配方"] = ci.getRecipeCardNameById(item.base.rc_id)
end
if item.src ~= nil then
for i = 1, 5 do
if item.src[i] ~= nil then
arguments['来源' .. i .. '/类别'] = item.src[i].type
if item.src[i].type == '敌' and tonumber(item.src[i].desc) then
arguments['来源' .. i .. '/详细'] = ei.getFoeInfoById('AT1', item.src[i].desc).name
else
arguments['来源' .. i .. '/详细'] = item.src[i].desc
end
end
end
end
if item.item_use_this ~= nil then
for i = 1, 12 do
arguments['合成用途' .. i] = item.item_use_this[i]
end
end
if item.naming ~= nil then
arguments["欧莉卡命名"] = item.naming.orica
arguments["弥纱命名"] = item.naming.misya
arguments["修蕾莉亚命名"] = item.naming.shurelia
end
if item.material ~= nil then
for i = 1, 4 do
arguments['材料' .. i] = item.material[i]
end
end
if item.powered_slots ~= nil then
local slots = ''
for i = 1, 4 do
if item.powered_slots[i] == '1' then
slots = slots .. i
end
end
arguments["强化槽位"] = slots
end
return arguments
end
-- 生成物品基本信息的方法,使用模板“物品信息”
-- type:采集/合成
function p.at1ItemInfo(category, subcategory, index)
local catName = category
if category == '装备' then
catName = subcategory
else
if subcategory == '合成' then
catName = '合成材料'
elseif subcategory == '采集' then
catName = '材料物品'
end
end
local item = p.loadItemInfoByIndex('AT1', catName, index)
local arguments = generateArguments(item, category, subcategory)
return mw.getCurrentFrame():expandTemplate {
title = '物品信息',
args = arguments
}
end
local function getAuxDataLinkById(game, id)
local category, subcategory, index = queryCategoryById(game, id)
local cate = category
if category == nil then return nil end
if category == '装备' then
cate = subcategory
elseif category == '材料' then
if subcategory == '采集' then
cate = '材料物品'
elseif subcategory == '合成' then
cate = '合成材料'
end
end
return '数据:' .. game .. '/' .. cate .. '/' .. index
end
-- 获取Aux链接
function p.getAuxDataLink(frame)
local game = frame.args[1]
local id = frame.args[2]
return getAuxDataLinkById(game, id)
end
-- AT1 物品信息卡(按ID)
function p.makeAt1ItemInfo(frame)
local id = frame.args[1]
local item, err = p.loadItemById('AT1', id)
if err ~= nil then return '获取物品数据出错:' .. err end
local cat, subcat = queryCategoryById('AT1', id)
local arguments = generateArguments(item, cat, subcat)
arguments.AuxDataLink = getAuxDataLinkById('AT1', id)
return mw.getCurrentFrame():expandTemplate {
title = '物品信息',
args = arguments
}
end
function p.getItemName(frame)
return getNameById(frame.args[1], frame.args[2])
end
-- 列表生成相关函数
function p.listArmorsInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/防具/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 19
for i = 1, 29 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listWeaponsInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/武器/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 190
for i = 1, 35 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listAccessoriesInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/饰品/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = -1
for i = 1, 20 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listMaterialsInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/材料物品/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 60
for i = 1, 34 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listMelcMaterialsInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/合成材料/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 94
for i = 1, 24 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listKeysInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/重要/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 48
for i = 1, 12 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
function p.listUseInAt1()
local html = mw.html.create('table'):addClass('wikitable')
local matIdx = mw.loadJsonData('数据:AT1/使用/索引')
html:tag('tr')
:tag('th'):wikitext('ID'):done()
:tag('th'):wikitext('索引'):done()
:tag('th'):wikitext('名称'):done()
:tag('th'):wikitext('卖价'):done()
:tag('th'):wikitext('配方'):done()
local baseIndex = 118
for i = 1, 72 do
local item = matIdx[i]
local recipe = '-'
if item.base.synthesisable ~= '0' then
recipe = ci.getRecipeCardNameById(item.base.rc_id)
end
html:tag('tr')
:tag('td'):wikitext(tostring(baseIndex + i)):done()
:tag('td'):wikitext(tostring(i)):done()
:tag('td'):wikitext('[[攻略:AT1/物品/' .. item.name .. '|' .. item.name .. ']]'):done()
:tag('td'):wikitext(tostring(item.base.sell_price)):done()
:tag('td'):wikitext(recipe):done()
end
return tostring(html)
end
return p