模块:ItemInfo:修订间差异
跳转到导航
跳转到搜索
(添加武器支持) |
小 (更新材料自动化) |
||
(未显示同一用户的36个中间版本) | |||
第3行: | 第3行: | ||
local be = require 'Module:BattleEffect' | local be = require 'Module:BattleEffect' | ||
local ci = require 'Module:CardInfo' | 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) | function p.loadItemInfoByIndex(game, category, index) | ||
local id = getIdByCategoryAndIndex(game, category, index) | |||
-- 获取索引(综合数据) | -- 获取索引(综合数据) | ||
local matIdx = mw.loadJsonData('数据:' .. game .. '/' .. category .. '/索引') | local matIdx = mw.loadJsonData('数据:' .. game .. '/' .. category .. '/索引') | ||
local itemBase = matIdx[index] | local itemBase = matIdx[index] | ||
local status, data = pcall(mw.loadJsonData, '数据:' .. game .. '/' .. category .. '/' .. index) | local status, data = pcall(mw.loadJsonData, '数据:' .. game .. '/' .. category .. '/' .. index) | ||
local melc = getAt1MelcInfo(id) | |||
if status then | 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 | else | ||
return | 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 | ||
end | end | ||
第19行: | 第97行: | ||
function p.loadItemById(game, id) | function p.loadItemById(game, id) | ||
id = tonumber(id) | id = tonumber(id) | ||
if game == 'AT1' then | if game == 'AT1' then | ||
-- id 区间检查 | -- 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 | |||
if id >= | -- 根据物品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 | return '葛拉斯诺晶体', nil, id - 226 + 1 | ||
end | end | ||
return nil, '获取数据失败,无效物品ID: ' .. id | return nil, '获取数据失败,无效物品ID: ' .. id | ||
第33行: | 第169行: | ||
end | end | ||
-- 根据ID获取物品名 | |||
local function getNameById(game, id) | local function getNameById(game, id) | ||
local item, err = p.loadItemById(game, id) | local item, err = p.loadItemById(game, id) | ||
第39行: | 第176行: | ||
end | end | ||
-- 过滤重结晶项 | |||
local function recryFilter(recry) | local function recryFilter(recry) | ||
local game = 'AT1' | local game = 'AT1' | ||
local ret = {} | local ret = {} | ||
if recry.s_prod | if recry == nil then return ret end | ||
if recry.s_prod ~= '-1' then | |||
ret.s_prod = getNameById(game, recry.s_prod) | ret.s_prod = getNameById(game, recry.s_prod) | ||
end | end | ||
if recry.a_prod | if recry.a_prod ~= '-1' then | ||
ret.a_prod = getNameById(game, recry.a_prod) | ret.a_prod = getNameById(game, recry.a_prod) | ||
end | end | ||
if recry.b_prod | if recry.b_prod ~= '-1' then | ||
ret.b_prod = getNameById(game, recry.b_prod) | ret.b_prod = getNameById(game, recry.b_prod) | ||
end | end | ||
if recry.c_prod | if recry.c_prod ~= '-1' then | ||
ret.c_prod = getNameById(game, recry.c_prod) | ret.c_prod = getNameById(game, recry.c_prod) | ||
end | end | ||
第65行: | 第196行: | ||
end | end | ||
p.gcType = {'#b70000', '#0d57cb', '#139a00', '#9f0087'} | p.gcType = {'#b70000', '#0d57cb', '#139a00', '#9f0087'} | ||
第131行: | 第214行: | ||
function p.generateGrathnodeCrystalList() | function p.generateGrathnodeCrystalList() | ||
local result = {} | local result = {} | ||
local index = mw.loadJsonData('数据:AT1/葛拉斯诺晶体/索引') | |||
for i = 1, 339 do | for i = 1, 339 do | ||
local item = | local item = index[i] | ||
local type = tonumber(item.type) | local type = tonumber(item.type) | ||
第169行: | 第253行: | ||
end | end | ||
function | local function generateArguments(item, category, subcategory) | ||
local filteredRecrystalisation = recryFilter(item.recry) | local filteredRecrystalisation = recryFilter(item.recry) | ||
第178行: | 第260行: | ||
["图像"] = item.img, | ["图像"] = item.img, | ||
["原文"] = item.ori, | ["原文"] = item.ori, | ||
["类别"] = | ["类别"] = category, | ||
["子类别"] = | ["子类别"] = subcategory, | ||
["游戏"] = 'AT1', | |||
["游戏"] = 'AT1', | |||
["重结晶S"] = filteredRecrystalisation.s_prod, | ["重结晶S"] = filteredRecrystalisation.s_prod, | ||
["重结晶A"] = filteredRecrystalisation.a_prod, | ["重结晶A"] = filteredRecrystalisation.a_prod, | ||
第187行: | 第268行: | ||
["重结晶C"] = filteredRecrystalisation.c_prod, | ["重结晶C"] = filteredRecrystalisation.c_prod, | ||
["其他来源"] = item.alt_src, | ["其他来源"] = item.alt_src, | ||
["笔记"] = item.desc | ["笔记"] = 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 | if item.base.synthesisable == '1' then | ||
arguments["配方"] = ci.getRecipeCardNameById(item.base.rc_id) | arguments["配方"] = ci.getRecipeCardNameById(item.base.rc_id) | ||
end | 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 == '敌' 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.syureria | |||
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 | if category == '装备' then | ||
cate = subcategory | |||
elseif category == '材料' then | |||
if subcategory == '采集' then | |||
cate = '材料物品' | |||
elseif subcategory == '合成' then | |||
cate = '合成材料' | |||
end | end | ||
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 { | return mw.getCurrentFrame():expandTemplate { | ||
第209行: | 第387行: | ||
} | } | ||
end | end | ||
function p.getItemName(frame) | |||
return getNameById(frame.args[1], frame.args[2]) | |||
end | |||
-- 列表生成相关函数 | |||
function p.listArmorsInAt1() | 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 | 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 | end | ||
return | return tostring(html) | ||
end | end | ||
function p.listWeaponsInAt1() | 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 | for i = 1, 35 do | ||
table. | 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 | end | ||
return table. | 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 | end | ||
return p | return p |
2024年10月13日 (日) 10:47的最新版本
可在模块: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' .. item.desc 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 == '敌' 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.syureria 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