模块:Plot

来自PRTS
跳转到导航 跳转到搜索

查看文档原页面

这个模块用来生成与剧情序列有关的东西。

navigate函数:用来生成页眉导航(上一关、下一关)。匿名参数按顺序为:类别、系列名、PAGENAME、±1、override。

  1. 类别:同Template:Navigator/plot,主线EP,支线SS,故事集VN
  2. 系列名:同Template:Navigator/plot,主线填章节数(阿拉伯数字),其它填活动名
  3. PAGENAME:强制指定当前页面名
  4. 距离当前页的距离,前一页为-1,后一页为+1。写0大概没有意义,填其它数可能会报错,没试过(其实填0也没试过
  5. override:不查表而是直接以该值作为页面结果进行处理。

list和mobile函数:用来生成Template:剧情导航的剧情序列。匿名参数按顺序为:类别、系列名。好像没必要再解释了。

list用于桌面版navbox,mobile则是移动版的表格低配替代品。分隔符我用的是&nbsp;<b>&middot</b>&#x20;,和{{dot}}不一样。然后就去把{{dot}}改了

剧情数据存储在三个子页面:/EP/SS/VN。分别为主线、支线、故事集。

一些页面在表中以[[X|Y]]的形式储存。Module:Plot/special列出了相关页面及其显示名称。

如何修改、添加子页面的数据?

模仿已有的数据吧,就注意尾巴要不要加逗号,我也忘了该不该加了反正现在能用。

Module:Plot/special要怎么用呢?

模块的行为是去除PAGENAME后面的/NBT、/BEG或者/END,分别替换为(什么都没有)、行动前、行动后,然后得到显示名称。(故事集剧情还会把关卡编号去掉。)当没法按这个逻辑生成显示名称的时候就要用到/special了。/special的语法是p[页面名] = 显示名,如p['W2G/BEG'] = '序章·上'。然后在相应的表中直接以[[X|Y]]的形式加入即可,如这边"[[W2G/BEG|序章·上]]",


local z = {}

function toLink(a, st)
	if st=='VN' then
		return '[[' .. a .. '|' .. mw.ustring.gsub(a, '^.- (.+)/NBT$', '%1') .. ']]'
	else
	    local suf = ''
	    sub = mw.ustring.sub(a, -3)
	    if sub == 'BEG' then
	        suf = ' <span style="font-size:80%;white-space:nowrap">行动前</span>'
	    elseif sub == 'END' then
	        suf = ' <span style="font-size:80%;white-space:nowrap">行动后</span>'
	    elseif sub == 'NBT' then
	    else
	    	return a
	    end
	    return '[[' .. a .. '|' .. mw.ustring.sub(mw.ustring.gsub(a, '^(.-) ', '<span style="white-space:nowrap">%1</span> '), 0, -5) .. suf .. ']]'
	end
end

--- 传参:类别、系列名、{{pagename}}、±1、override
function z.navigate(frame)
    local cat = frame.args[1]
    local series = frame.args[2]
    local pagename = frame:preprocess(frame.args[3])
    local direction = tonumber(frame.args[4])
    local re = frame:preprocess(frame.args[5])
	local isEP = false

	if re ~= '#default' then
		return toLink(re, cat)
	end
	
	local npn = require('Module:Plot/special')[pagename]
	if npn then
		pagename = '[[' .. pagename .. '|' .. npn .. ']]'
	end
	
	if cat == 'EP' then
		series = tonumber(series) + 1   --主题曲从第零章开始,但Lua表格的键从1开始
		isEP = true
	end
	
    local e = require('Module:Plot/' .. cat)
    local stories = e[series]

    local position = nil
    for i, value in ipairs(stories) do
        if value == pagename then
            position = i
            break
        end
    end

    if position then
    	local delta = position + direction
    	if delta == 0 then
    		if isEP and series ~= 1 then
    			local f
    			f = e[series - 1]
    			return toLink(f[#f], cat)
    		else
    			return ''
    		end
    	elseif delta == #stories + 1 then
    		if isEP and series ~= #e then
    			e = e[series + 1]
    			return toLink(e[1], cat)
    		else
    			return ''
    		end
    	else
    		return toLink(stories[delta], cat)
    	end
    else
        return 'Error[[Category:剧情导航出现错误的页面]]'
    end
end


function z.list(frame)
    wt = {}
    local cat = frame.args[1]
    local series = frame.args[2]
    
	if cat == 'EP' then
		series = tonumber(series) + 1   --主题曲从第零章开始,但Lua表格的键从1开始
	end
	
	local e = require('Module:Plot/' .. cat)
    local stories = e[series]
    
    for i, value in ipairs(stories) do
        table.insert(wt, '<li>' .. toLink(stories[i], cat) .. '</li>')
    end

    return table.concat(wt)
end


-- for Navbox for mobile
function z.mobile(frame)
    wt = {}
    local cat = frame.args[1]
    local series = frame.args[2]
    
    if cat == 'EP' then
		series = tonumber(series) + 1   --主题曲从第零章开始,但Lua表格的键从1开始
	end
	
	local e = require('Module:Plot/' .. cat)
    local stories = e[series]

    for i, value in ipairs(stories) do
        table.insert(wt, toLink(stories[i], cat))
    end

    return table.concat(wt, '&nbsp;<b>&middot;</b> ')
end
return z