此模块的文档可以在模块:MMC/doc创建
local p = {}
local mArguments
local cargo
local cache = {}
-- splitStringIntoTable函数以@param2为分隔符,将@param1拆分成字符串并放入表中,如果@param3为true,还要修剪每个部分前后的空白
local splitString = require( 'Module:SplitStringToTable' ).splitStringIntoTable
-- 使用cargo查询招式数据并缓存
local function getMovesData( chara, input )
-- 如果cache字符串长度大于0(即有数据)则直接返回缓存
if #cache > 0 then return cache end
cargo = require( 'Module:Cargo' )
local tables = 'MoveData'
local fields = 'fighter,name,input,subtitle,caption,notation,dmg,meter,guard,properties,startup,active,recovery,hitstop,hitstun,blockstun,onhit,onblock,pic,hitbox'
local args = {
where = string.format('MoveData.chara="%s" and MoveData.input="%s"', chara, input),
orderBy = '_rowID',
limit = "101",
}
local results = cargo.getQueryResults( tables, fields, args, false )
-- 结果存储于items中,键为input
local items = {}
for _, result in pairs( results ) do
items[result.input] = result
end
-- 返回包含结果的缓存表
cache = items
return cache
end
-- 从缓存数据中获取匹配的招式,检查是否存在匹配招式,若不存在,报错
-- 若存在,将匹配的招式存储在moves表中并返回
local function getMove( chara, input )
local data = getMovesData( chara, input )
local moves = {}
local match = data[ input ]
if not match then
error( string.format( 'Could not find matching move ( %s: %s)', chara, input ) )
end
moves[ input ] = data[ input ]
return moves
end
-- 生成包含招式信息的HTML代码
local function getHTML( move, label, hitboxMode, imageNumber, game )
-- 创建一个tooltip类的span标签,若写入了@param2标签文本则显示,否则显示传入的move表中的input值
local html = mw.html.create('span'):addClass('tooltip')
if label then
html:wikitext(label)
else
html:wikitext( move['input'] )
end
-- 如果@param3为true则显示move表中的hitbox,否则显示pic,如果未查询到图片,报错
local imgString
if hitboxMode then
imgString = move['hitbox']
else
imgString = move['pic']
end
if not imgString then
error( string.format( 'Image not found' ) )
end
-- 若未提供imageNumber,默认为1
if not imageNumber then imageNumber = 1 end
-- 分隔符是什么呢?暂定为;吧
local imagesTable
imagesTable = splitString( imgString, ';' )
-- 创建tooltiptext类的span标签并添加图片和各类招式信息(可更改)
local ttText = mw.html.create('span'):addClass('tooltiptext')
:tag('span'):addClass('mw-parser-output')
:tag('span'):addClass('tmp')
:tag('span'):addClass('tmp-image')
:wikitext( string.format('[[File:%s|130x200px]]', imagesTable[tonumber(imageNumber)] ) )
:done()
:tag('span'):addClass('tmp-items')
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:wikitext('防御')
:done()
:tag('span'):addClass('tmp-item-data')
:wikitext( move['guard'] )
:done()
:done()
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:wikitext('启动帧')
:done()
:tag('span'):addClass('tmp-item-data')
:wikitext( move['startup'] )
:done()
:done()
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:wikitext('收招帧')
:done()
:tag('span'):addClass('tmp-item-data')
:wikitext( move['recovery'] )
:done()
:done()
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:wikitext('加减帧')
:done()
:tag('span'):addClass('tmp-item-data')
:wikitext( move['onblock'] )
:done()
:done()
:done()
:done()
:done()
:done()
html:node(ttText)
html:done()
return html
end
-- 从字符串@param1中删除指定的字符串@param2
function removeSubstring(largerString, substring)
local result = largerString:gsub(substring, '')
return result
end
-- 处理模板调用的入口函数,引入Arguments模块获取参数,调用p._main函数处理参数并返回生成的Wiki文本
function p.main(frame)
mArguments = require( 'Module:Arguments' )
local args = mArguments.getArgs(frame)
return p._main(args)
end
-- 提取参数表中的各类参数
function p._main( args )
local chara = args['chara']
local input = args['input']
local label = args['label']
local hitboxMode = args['hitboxMode']
local imageNumber = args['imageNumber']
-- 如果input未指定,报错
if not input then
error( 'No inputs specified for the template' )
end
-- 调用getMove获取匹配的招式数据
local moves = getMove( chara, input )
-- 调用getHTML生成HTML代码并返回
local html = getHTML( moves[input], label, hitboxMode, imageNumber )
-- 添加样式表引用
return tostring(html) .. mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Template:TooltipMovePreview/styles.css' }
}
end
return p