打开/关闭菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:MMC:修订间差异

来自骷髅女孩Wiki
创建页面,内容为“local p = {} local mArguments local cargo local cache = {} local splitString = require( 'Module:SplitStringToTable' ).splitStringIntoTable --- Return the Moves data and cache the data for reuse on the same page --- --- @return table local function getMovesData( game, chara, input ) -- Return cached data if #cache > 0 then return cache end -- Lazy initalize Module:Cargo cargo = require( 'Module:Cargo' ) local tables = string.format('MoveD…”
 
无编辑摘要
第3行: 第3行:
local cargo
local cargo
local cache = {}
local cache = {}
 
-- splitStringIntoTable函数以@param2为分隔符,将@param1拆分成字符串并放入表中,如果@param3为true,还要修剪每个部分前后的空白
local splitString = require( 'Module:SplitStringToTable' ).splitStringIntoTable
local splitString = require( 'Module:SplitStringToTable' ).splitStringIntoTable
 
-- 使用cargo查询招式数据并缓存
--- Return the Moves data and cache the data for reuse on the same page
local function getMovesData( chara, input )
---
-- 如果cache字符串长度大于0(即有数据)则直接返回缓存
--- @return table
local function getMovesData( game, chara, input )
    -- Return cached data
     if #cache > 0 then return cache end
     if #cache > 0 then return cache end
    -- Lazy initalize Module:Cargo
     cargo = require( 'Module:Cargo' )
     cargo = require( 'Module:Cargo' )
 
     local tables = 'MoveData'
     local tables = string.format('MoveData_%s', game)
     local fields = 'fighter,name,input,subtitle,caption,notation,dmg,meter,guard,properties,startup,active,recovery,hitstop,hitstun,blockstun,onhit,onblock,pic,hitbox'
     local fields = 'chara,name,input,damage,guard,startup,recovery,onBlock,images,hitboxes'
     local args = {
     local args = {
         where  = string.format('MoveData_%s.chara="%s" and MoveData_%s.input="%s"', game, chara, game, input),
         where  = string.format('MoveData.chara="%s" and MoveData.input="%s"', chara, input),
         orderBy = '_rowID',
         orderBy = '_rowID',
         limit = "101",
         limit = "101",
     }
     }
     local results = cargo.getQueryResults( tables, fields, args, false )
     local results = cargo.getQueryResults( tables, fields, args, false )
 
    -- 结果存储于items中,键为input
     local items = {}
     local items = {}
     for _, result in pairs( results ) do
     for _, result in pairs( results ) do
         items[result.input] = result
         items[result.input] = result
     end
     end
 
     -- 返回包含结果的缓存表
     -- Save to cache
     cache = items
     cache = items
    -- mw.logObject(cache)
     return cache
     return cache
end
end
 
-- 从缓存数据中获取匹配的招式,检查是否存在匹配招式,若不存在,报错
--- Return the move table that matches the input
-- 若存在,将匹配的招式存储在moves表中并返回
---
local function getMove( chara, input )
--- @param chara string character to look for
     local data = getMovesData( chara, input )
--- @param inputs table Move input(s) to look for
--- @return table
local function getMove( game, chara, input )
     local data = getMovesData( game, chara, input )
 
local moves = {}
local moves = {}
local match = data[ input ]
local match = data[ input ]
if not match then
if not match then
         error( string.format( 'Could not find matching move ( %s — %s: %s)', game, chara, input ) )
         error( string.format( 'Could not find matching move ( %s: %s)', chara, input ) )
end
end
moves[ input ] = data[ input ]
moves[ input ] = data[ input ]
    -- mw.logObject( moves, 'Matched move' )
     return moves
     return moves
end
end
 
-- 生成包含招式信息的HTML代码
local function getHTML( move, label, hitboxMode, imageNumber, game )
local function getHTML( move, label, hitboxMode, imageNumber, game )
-- 创建一个tooltip类的span标签,若写入了@param2标签文本则显示,否则显示传入的move表中的input值
local html = mw.html.create('span'):addClass('tooltip')
local html = mw.html.create('span'):addClass('tooltip')
if label then  
if label then  
第64行: 第48行:
html:wikitext( move['input'] )
html:wikitext( move['input'] )
end
end
-- 如果@param3为true则显示move表中的hitbox,否则显示pic,如果未查询到图片,报错
local imgString
local imgString
if hitboxMode then
if hitboxMode then
imgString = move['hitboxes']
imgString = move['hitbox']
else
else
imgString = move['images']
imgString = move['pic']
end
end
if not imgString then
if not imgString then
error( string.format( 'Image not found' ) )
error( string.format( 'Image not found' ) )
end
end
-- 若未提供imageNumber,默认为1
if not imageNumber then imageNumber = 1 end
if not imageNumber then imageNumber = 1 end
-- 分隔符是什么呢?暂定为;吧
local imagesTable  
local imagesTable  
if game == 'GBVSR' or game == 'HNK' or game == 'SMS' or game == 'SBX' or game == 'BBCT' then
imagesTable = splitString( imgString, ';' )
imagesTable = splitString( imgString, '\\' )
-- 创建tooltiptext类的span标签并添加图片和各类招式信息(可更改)
else
imagesTable = splitString( imgString, ';' )
end
local ttText = mw.html.create('span'):addClass('tooltiptext')
local ttText = mw.html.create('span'):addClass('tooltiptext')
:tag('span'):addClass('mw-parser-output')
:tag('span'):addClass('mw-parser-output')
第92行: 第73行:
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:tag('span'):addClass('tmp-item-label')
:wikitext('Guard')
:wikitext('防御')
:done()
:done()
:tag('span'):addClass('tmp-item-data')
:tag('span'):addClass('tmp-item-data')
第100行: 第81行:
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:tag('span'):addClass('tmp-item-label')
:wikitext('Startup')
:wikitext('启动帧')
:done()
:done()
:tag('span'):addClass('tmp-item-data')
:tag('span'):addClass('tmp-item-data')
第108行: 第89行:
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:tag('span'):addClass('tmp-item-label')
:wikitext('Recovery')
:wikitext('收招帧')
:done()
:done()
:tag('span'):addClass('tmp-item-data')
:tag('span'):addClass('tmp-item-data')
第116行: 第97行:
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item')
:tag('span'):addClass('tmp-item-label')
:tag('span'):addClass('tmp-item-label')
:wikitext('Advantage')
:wikitext('加减帧')
:done()
:done()
:tag('span'):addClass('tmp-item-data')
:tag('span'):addClass('tmp-item-data')
:wikitext( move['onBlock'] )
:wikitext( move['onblock'] )
:done()
:done()
:done()
:done()
第126行: 第107行:
:done()
:done()
:done()
:done()
html:node(ttText)
html:node(ttText)
html:done()
html:done()
return html
return html
end
end
 
-- 从字符串中删除第一个斜杠及其后面的内容
function removeTextAfterSlash(str)
function removeTextAfterSlash(str)
     local index = string.find(str, "/")
     local index = string.find(str, "/")
第141行: 第120行:
     end
     end
end
end
 
-- 从字符串@param1中删除指定的字符串@param2
function removeSubstring(largerString, substring)
function removeSubstring(largerString, substring)
     local result = largerString:gsub(substring, '')
     local result = largerString:gsub(substring, '')
     return result
     return result
end
end
 
-- 处理模板调用的入口函数,引入Arguments模块获取参数,调用p._main函数处理参数并返回生成的Wiki文本
function removeXrd(str)
    local prefix = 'GGXRD-R2\/'
    if string.sub(str, 1, #prefix) == prefix then
        return string.sub(str, #prefix + 1)
    else
        return str
    end
end
 
function p.main(frame)
function p.main(frame)
mArguments = require( 'Module:Arguments' )
mArguments = require( 'Module:Arguments' )
第161行: 第131行:
return p._main(args)
return p._main(args)
end
end
 
-- 提取参数表中的各类参数
--- Return the wikitext needed for the template
---
--- @return string
function p._main( args )
function p._main( args )
    local game = args['game']
     local chara = args['chara']
     local chara = args['chara']
     local input = args['input']
     local input = args['input']
第172行: 第138行:
     local hitboxMode = args['hitboxMode']
     local hitboxMode = args['hitboxMode']
     local imageNumber = args['imageNumber']
     local imageNumber = args['imageNumber']
      
     -- 如果chara未指定,则从当前页面标题提取(不要这个功能)
     if not game then
     --[[ if not chara then
        game = mw.title.getCurrentTitle().rootText
    end
    if game == 'GGXRD-R2' then game = 'GGXRDR2' end
   
    if not chara then
         chara = mw.title.getCurrentTitle().text
         chara = mw.title.getCurrentTitle().text
         chara = removeSubstring(chara, string.format('%s/', game))
         chara = removeSubstring(chara, string.format('%s/', game))
     end
     end ]]
    -- 如果input未指定,报错
     if not input then
     if not input then
         error( 'No inputs specified for the template' )
         error( 'No inputs specified for the template' )
     end
     end
     if game == 'GGXRDR2' then chara = removeXrd(chara) end
     -- 把chara后的/全删除
     chara = removeTextAfterSlash(chara)
     chara = removeTextAfterSlash(chara)
-- 调用getMove获取匹配的招式数据
     local moves = getMove( game, chara, input )
     local moves = getMove( chara, input )
     local html = getHTML( moves[input], label, hitboxMode, imageNumber, game )
    -- 调用getHTML生成HTML代码并返回
     local html = getHTML( moves[input], label, hitboxMode, imageNumber )
    -- 添加样式表引用
     return tostring(html) .. mw.getCurrentFrame():extensionTag{
     return tostring(html) .. mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Template:TooltipMovePreview/styles.css' }
name = 'templatestyles', args = { src = 'Template:TooltipMovePreview/styles.css' }

2025年1月11日 (六) 01:10的版本

此模块的文档可以在模块: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
-- 从字符串中删除第一个斜杠及其后面的内容
function removeTextAfterSlash(str)
    local index = string.find(str, "/")
    if index then
        return string.sub(str, 1, index - 1)
    else
        return str
    end
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']
    -- 如果chara未指定,则从当前页面标题提取(不要这个功能)
    --[[ if not chara then
        chara = mw.title.getCurrentTitle().text
        chara = removeSubstring(chara, string.format('%s/', game))
    end ]]
    -- 如果input未指定,报错
    if not input then
        error( 'No inputs specified for the template' )
    end
    -- 把chara后的/全删除
    chara = removeTextAfterSlash(chara)
	-- 调用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