打开/关闭菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
圈圈菌Q留言 | 贡献2025年1月13日 (一) 14:28的版本

此模块的文档可以在模块: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.fighter="%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 )
	-- 创建一个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['notation'] )
					:done()
				:done()
				:tag('span'):addClass('tmp-item')
					--[[:tag('span'):addClass('tmp-item-label')
						:wikitext('启动帧')
					:done()]]
					:tag('span'):addClass('tmp-item-data')
						:wikitext( move['name'] )
					:done()
				:done()
				:tag('span'):addClass('tmp-item')
					--[[:tag('span'):addClass('tmp-item-label')
						:wikitext('收招帧')
					:done()]]
					:tag('span'):addClass('tmp-item-data')
						:wikitext( move['caption'] )
					: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