Module:Housamo
简介
这个模块主要用于东京放课后召唤师的数据处理,这个模块包含了一些实用的功能函数。
使用本模块的方法:{{#invoke:Housamo|<func_name>|<arg1>|<arg2>|...}}
在本文档中,所有已定义(和即将定义的)的函数名均使用housamo.<func_name>
的格式说明原型,然而在上面的使用范例中,<func_name>
部分不需要添加任何的housamo.*
的前缀,例如,使用时应当遵循如下范例:
{{#invoke:Housamo|Stars|3}}
在本文档中该函数被描述为housamo.Stars
,但使用时只需要且只能写Stars
,否则模块调用失败。
在本文档中,参数表会被展开成具体的参数个体(而模块源码中直接使用frame
接收一个table
),其中,标有[]
的参数表示是可选的参数,这类参数在不指定时会被提供默认值,例如,对于定义为housamo.SomeFunc(arg1,[arg2=0],[arg3=0])
,如果您只想指定arg1
和arg3
,那么您可以考虑如下几种写法:
{{#invoke:Housamo|SomeFunc|a||b}} <!-- arg2的位置留空 --> {{#invoke:Housamo|SomeFunc|a|arg3=b}} <!-- 除给定的arg1之外直接指定arg3 -->
在上述两种情况中,arg2
因未被指定而具有默认值0
。这等价于:
{{#invoke:Housamo|SomeFunc|a|0|b}}
函数列表
数据表示
housamo.Stars(num, [compact = false], [extend = false])
输出稀有度的星级表示。
- 返回
- 以重复的“★”或“数字+★”构成的字符串。
- 参数
num:int
:表示五角星的数量,注意在此函数中num应当不小于0且不大于5,否则会输出错误的字符串compact:bool
:若为false
则稀有度显示是以展开的方式(直接平铺的五角星文本),否则以折叠的方式(数字+★)的模式显现extend:bool
:由于该函数默认限制了星级只能在0~5之间,额外指定该参数为true
可打破这一限制,允许超过5的数字输出正确的结果
housamo.TypeColor(type,[sharp]) housamo.tc(type,[sharp])
输出对应于属性type
的颜色,函数名可简写为tc
,该函数输出的颜色表与参数对照如下:
- 火
- 水
- 木
- 天
- 冥
- 英雄
- 魔
- 世界
- 全
- 返回
- HTML颜色代码
- 参数
type:str
:目标的属性名,可以是火|水|木|天|冥|英雄|魔|世界|全
。sharp:bool
:指定返回结果是否包含#
,默认不包含,在某些场合例如表格的style里我们有必要关闭#
。
housamo.ValueMap([rarity=3], values) housamo.vm([rarity=3],values)
基于给定的稀有度输出等级数据列,亦可作vm
。例如,使用{{#invoke:Housamo|vm|4|100,200,300,400,500,600}}
,会得到:
100 (LV1)
200 (LV35)
300 (LV45)
400 (LV55)
500 (LV65)
600 (LV75)
若某一项数据不知道,推荐使用?
占位,像这样{{#invoke:Housamo|vm|4|100,?,300,?,500,600}}
,会得到:
100 (LV1)
? (LV35)
300 (LV45)
? (LV55)
500 (LV65)
600 (LV75)
此外,如果提供的数据数量不足,则后面的数据列会自动填充为?
。{{#invoke:Housamo|vm|4|100,200,300}}
,会得到:
100 (LV1)
200 (LV35)
300 (LV45)
? (LV55)
? (LV65)
? (LV75)
注意:请不要使用连续的逗号(,
)来跳过数据,因为Lua的匹配模式机制,在本函数中连续的逗号会被视为1个逗号。
- 返回
- 数据列wikitext
- 参数
rarity:int
:给定的稀有度,控制输出的等级节点,该参数可省略但不可跳过。values:numberlist(6)
:数值列,注意,这里所谓的numberlist
类型是用逗号,
分隔的数列,例如10,5,6,24,7,8
这种的,而numberlist(6)
指该数列有6个元素,多余元素不予采纳,若列中某个元素不是数字,则在该函数中会被输出为?
,关于这个参数的具体用法看看上面的范例就知道了。
资源获取
housamo.CharLink(name, [display = ""]) housamo.cl(name, [display = ""])
输出对应于角色的链接文本。即输入{{#invoke:Housamo|CharLink|戍孝}}
则可返回[[东京放课后召唤师:戍孝|戍孝]]
的wikitext,由于魔术字解析后于模板展开,而链接解析后于魔术字解析,因此在页面中执行该调用会直接获得一个链接文本,也就是戍孝。该调用的<func_name>
可简写为cl
。
- 返回
- 链接文本
- 参数
name:str
:待编订链接文本的名称(通常是角色名),该参数必须指定,否则报错!display:str
:指定该参数可以使用该参数文本覆写原有的链接文本,若指定为空字符串则保持与name
相同。
housamo.TypeImage(name, [scale = 30], [full=false]) housamo.typi(name, [scale = 30], [full=false])
输出对应于属性的图片文件名。该调用的<func_name>
可简写为typi
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的属性名,可以是火|水|木|天|冥|英雄|魔|世界|全
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponImage(name, [scale = 30], [full=false]) housamo.wpi(name, [scale = 30], [full=false])
输出对应于武器的图片文件名,用法与housamo.TypeImage
基本相同。该调用的<func_name>
可简写为wpi
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无|未知
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponRangeImage(name, [scale = 30], [full=false]) housamo.wpri(name, [scale = 30], [full=false])
输出对应于武器其攻击范围的图片文件名,用法与housamo.WeaponImage
相同,不过这个函数返回的是武器攻击范围的图片而非武器图片。该调用的<func_name>
可简写为wpri
。
- 返回
- 文件名/置入文件
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无|未知
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:该参数仅在full=true
时生效,指定该参数可以控制该图片的宽度,注意,我们这里只允许图片等比例放大,因此只能指定一个维度的值。full:bool
:指定该参数为true
时该功能直接返回置入该图片的wiki文本,否则只返回带有后缀的文件名。
housamo.WeaponRangeGrid(name, [scale = 30]) housamo.wprg(name, [scale = 30])
输出对应于武器其攻击范围的图示,用法与housamo.WeaponImage
类似,但不完全相同,这个函数返回的是武器攻击范围的网格图示,完全通过HTML实现而不借助图片。该调用的<func_name>
可简写为wprg
。
注意:使用此函数之前请务必使用<templatestyles src="User:あの太/沙箱/custom.css" />
引用CSS文件,否则您只会获得个寂寞。
不过应该是有办法不需要引入这个东西的,回头我再看看Scribunto怎么调用templatestyles
例如:
<templatestyles src="User:あの太/沙箱/custom.css" /> {{#invoke:Housamo|wprg|斩击}}会得到:
此函数目前尚未实现自定义功能,预计日后能够实现,此外,基于其图示高清晰度和可定制性,此函数有望替代housamo.WeaponRangeImage
- 返回
- HTML网格
- 参数
name:str
:目标的武器名,可以是打击|突击|刺击|射击|斩击|魔法|横一文字|狙击|全域|无
,该参数必须指定,否则报错!此外,指定的值不在允许的取值范围内也会报错!scale:int
:指定该参数可以控制该网格的宽度,注意,我们这里只允许网格长宽等比例,因此只能指定一个维度的值。
local housamo = {}
housamo.housamo = housamo
local ustring = require("ustring")
--[=[
housamo.ifex(condition,true_val,false_val)
这个东西不是给#invoke使用的,而是只针对当前文件使用的一个辅助函数
这个东西相当于三元运算符 ?: ,不过因为lua没提供这个运算符所以这里实现了一下
--]=]
function ifex(condition,true_val,false_val)
return (condition and {true_val} or {false_val})[1]
end
function strnone(str)
return str == nil or str == [[]]
end
function tryget(target, fallback)
return ifex(target, target, fallback)
end
function fetchimg(filename, width)
return ustring.format("[[File:%s|%dpx]]", filename, width)
end
do
local typeimg =
{
["火"] = "東放火屬性.png",
["水"] = "東放水屬性.png",
["木"] = "東放木屬性.png",
["天"] = "東放天屬性.png",
["冥"] = "東放冥屬性.png",
["英雄"] = "東放英雄屬性.png",
["魔"] = "東放魔屬性.png",
["世界"] = "東放世界屬性.png",
["全"] = "東放全屬性.png",
["无限"] = "东放无限属性.png",
["零"] = "东放零属性.png",
}
housamo.typeimg = typeimg
local weaponimg =
{
["打击"] = "东放武器-打击.png",
["斩击"] = "东放武器-斩击.png",
["突击"] = "东放武器-突击.png",
["射击"] = "东放武器-射击.png",
["魔法"] = "东放武器-魔法.png",
["横一文字"] = "东放武器-橫一文字.png",
["狙击"] = "东放武器-狙击.png",
["全域"] = "东放武器-全域.png",
["无"] = "东放武器-无.png",
["未知"] = "东放武器-未知.png",
}
weaponimg["刺击"] = weaponimg["突击"]
housamo.weaponimg = weaponimg
local wrangeimg =
{
["打击"] = "Range_weapon_knock.png",
["斩击"] = "Range_weapon_slash.png",
["突击"] = "Range_weapon_thrust.png",
["射击"] = "Range_weapon_shoot.png",
["魔法"] = "Range_weapon_magic.png",
["横一文字"] = "Range_weapon_longslash.png",
["狙击"] = "Range_weapon_snipe.png",
["全域"] = "Range_weapon_all.png",
["无"] = "Range_weapon_nothing.png",
}
wrangeimg["刺击"] = wrangeimg["突击"]
wrangeimg["未知"] = wrangeimg["无"]
housamo.wrangeimg = wrangeimg
local wrangemap =
{
["打击"] =
{
{3,3,1},
{4,3,2},
},
["斩击"] =
{
{3,2,1},
{3,3,1},
{3,4,1},
{4,3,2},
},
["突击"] =
{
{2,3,1},
{3,3,1},
{4,3,2},
},
["射击"] =
{
{1,3,1},
{2,3,1},
{3,3,1},
{4,3,2},
},
["魔法"] =
{
{1,3,1},
{2,2,1},
{2,3,1},
{2,4,1},
{3,3,1},
{4,3,2},
},
["横一文字"] =
{
{3,-1,1},
{4,3,2},
},
["狙击"] =
{
{-1,3,1},
},
["全域"] =
{
{1,-1,1},
{2,-1,1},
{3,-1,1},
{4,-1,1},
{5,3,2},
},
["无"] =
{
{4,3,2},
},
}
wrangemap["刺击"]=wrangemap["突击"]
housamo.wrangemap = wrangemap
local colormap =
{
["火"] = "e84e4b",
["水"] = "1d95df",
["木"] = "61ec2a",
["天"] = "b1af0a",
["冥"] = "b21de4",
["英雄"] = "e1e6e9",
["魔"] = "000000",
["世界"] = "976937",
["全"] = "8e8b8c",
["无限"] = "ff7300",
["零"] = "ff00ff",
}
housamo.colormap = colormap
end
function housamo.Stars(frame)
local num = (frame.args.num and {frame.args.num} or {frame.args[1]})[1]
local compact = (frame.args.compact and {frame.args.compact} or {frame.args[2]})[1]
local extend = (frame.args.extend and {frame.args.extend} or {frame.args[3]})[1]
num = (num == "") and 0 or tonumber(num)
compact = (compact == "true") and true or false
extend = (extend == "true") and true or false
local result;
if(num == nil) then
result = [['''稀有度应当是数字''']]
else
if( extend or (num >= 0 and num <= 5)) then
if(not(compact)) then
result = string.rep("★",num)
else
result = num .. "★"
end
else
result = [['''稀有度应在0~5之间''']]
end
end
return result
end
housamo.stars = housamo.Stars
--[[
function housamo.test(frame)
local argstr = ""
for k,v in ipairs(frame.args) do
argstr = argstr .. k .. ':' .. v .. '(' .. type(v) .. ')'
end
return argstr
end
--]]
function housamo.CharLink(frame)
local name = ifex(frame.args.name, frame.args.name, frame.args[1])
local display = ifex(frame.args.display, frame.args.display, frame.args[2])
if name == [[]] or name == nil then
return "请指定链接角色的名字"
end
if display == [[]] or display == nil then
display = name
end
return ustring.format("[[东京放课后召唤师:%s|%s]]", name, display)
end
housamo.cl = housamo.CharLink
function housamo.CharLinkList(frame)
local str = frame.args[1] or ""
local split = frame.args[2] or " • "
if str == "" then
return [['''无''']]
end
local list = mw.text.split(str,',')
local clist = [[]]
for k,v in pairs(list) do
if v ~= [[]] then
clist = clist .. ustring.format("[[东京放课后召唤师:%s|%s]]", v, v)
if next(list,k) then
clist = clist .. split
end
end
end
return clist
end
housamo.clist = housamo.CharLinkList
function housamo.TypeImage(frame)
local name = tryget(frame.args.name, frame.args[1])
local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),32)
local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false)
if strnone(name) then
return "'''未提供属性名称'''"
end
local typ = housamo.typeimg[name]
if typ==nil then
return ustring.format([['''指定的属性"%s"不存在''']], name)
end
if full then
return fetchimg(typ,scale) --ustring.format("[[File:%s|%dpx]]", typ, scale)
else
return typ
end
end
housamo.typi = housamo.TypeImage
function housamo.Weapon(frame)
local name = tryget(frame.args.name, frame.args[1])
local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),32)
local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false)
if strnone(name) then
return "'''未提供武器名称'''"
end
local wep = housamo.weaponimg[name]
if wep==nil then
return ustring.format([['''指定的武器"%s"不存在''']], name)
end
if full then
return fetchimg(wep,scale) --ustring.format("[[File:%s|%dpx]]", wep, scale)
else
return wep
end
end
housamo.wpi = housamo.Weapon
function housamo.WeaponRangeImage(frame)
local name = tryget(frame.args.name, frame.args[1])
local scale = tryget(tonumber(tryget(frame.args.name,frame.args[2])),80)
local full = ifex(tryget(frame.args.full,frame.args[3]) == "true", true, false)
if strnone(name) then
return "'''未提供武器范围名称'''"
end
local wpr = housamo.wrangeimg[name]
if wpr==nil then
return ustring.format([['''指定的武器范围"%s"不存在''']], name)
end
if full then
return fetchimg(wpr,scale)
else
return wpr
end
end
housamo.wpri = housamo.WeaponRangeImage
function housamo.WeaponRangeGrid(frame)
local field =
{
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0},
}
local state=
{
[0] = "empty" ,
[1] = "attack" ,
[2] = "self" ,
}
local name = frame.args.name or frame.args[1]
local scale = frame.args.scale or frame.args[2]
local manpl = housamo.wrangemap[name]
local prompt = [[]]
scale = tonumber(scale) or 80
local paint = function(row, col, flg)
if flg < 0 or flg > 2 then
prompt = prompt .. ustring.format([[Invalid flag %d at %d, fallback to 0.<br/>]],flg,a)
flg = 0
end
if row == -1 and col == -1 then
for i=1,#field do
for j=1,#field[i] do
field[i][j] = flg
end
end
elseif row == -1 then
for i = 1,#field do
field[i][col]=flg
end
elseif col == -1 then
for i = 1,#field[row] do
field[row][i]=flg
end
elseif row <=5 and row > 0 and col <= 5 and col > 0 then
field[row][col] = flg
else
prompt = prompt .. ustring.format([[Out of index at param:%d, omitted this time.<br/>]], a)
end
end
if manpl == nil then
return ustring.format([['''指定的武器范围"%s"不存在''']], name)
else
for i=1,#manpl do
local row,col,flg = manpl[i][1],manpl[i][2],manpl[i][3]
paint(row,col,flg)
end
end
local cellstr = [[]]
for i = 1,#field do
for j = 1,#field[i] do
cellstr = cellstr .. ustring.format([[<div class="wrange-cell %s" style="grid-row=%d; grid-column=%d"></div>]], state[field[i][j]], i, j)
end
end
local container = ustring.format([[<div class="wrange-grid" style = "width:%dpx;height:%dpx">%s</div>]],scale,scale,cellstr)
frame:extensionTag( 'templatestyles', '',{ src = "User:あの太/沙箱/custom.css" } )
return container
end
housamo.wprg = housamo.WeaponRangeGrid
function housamo.ValueMap(frame)
local rarity = tonumber(frame.args.rarity or frame.args[1]) or 3
local valuestr = frame.args.values or frame.args[2]
local pattern = [=[[^,]+]=]
local vmap = {}
local pop = string.gmatch(valuestr, pattern)
for i = 1,6 do
local v = pop()
vmap[i] = tonumber(v)
end
local html = mw.html.create()
html:wikitext(ustring.format([[%s (LV%d)]],tostring(vmap[1] or '?'),1)):tag("br")
-- 1,20,30,40,50,60
-- 1,25,35,45,55,65
-- 1,30,40,50,60,70
for i = 2,5 do
local lv = (rarity-1+2*i) * 5
html:wikitext(ustring.format([[%s (LV%d)]],tostring(vmap[i] or '?'),lv)):tag("br")
end
html:wikitext(ustring.format([[<font color="red">%s (LV%d)</font>]],tostring(vmap[6] or '?'),55+rarity*5))
return tostring(html)
end
housamo.vm = housamo.ValueMap
function housamo.TypeColor(frame)
local type = frame.args.type or frame.args[1]
local sharp = (frame.args.sharp or frame.args[2])
local colortext = housamo.colormap[type]
if type==nil or type==[[]] then
colortext = [[ffffff]]
end
if colortext == nil then
return ustring.format([['''指定的属性"%s"没有对应的颜色''']],type)
elseif sharp == nil or sharp=="false" then
return colortext
else
return [[#]] .. colortext
end
end
housamo.tc = housamo.TypeColor
function housamo.HasPage(name)
local str = '东京放课后召唤师:' .. name
local title = mw.title.new(str)
return title:getContent() ~= nil
end
function housamo.GeneralList(frame)
local r = [[]]
local str = frame.args[1] or [[]]
local splitter = frame.args[2] or [[ ]]
local divider = frame.args[3] or [[、]]
local list = mw.text.split(str, splitter)
if ustring.len(str) == 0 then
return [[]]
end
for k,v in pairs(list) do
local link = nil
if housamo.weaponimg[v] ~= nil then
link = housamo.wpi{args={name=v,full="true"}}
elseif housamo.typeimg[v] ~= nil then
link = housamo.typi{args={name=v,full="true"}} --ustring.format("[[File:%s|32px|link=]]",housamo.typeimg[v])
elseif housamo.HasPage(v) then
link = housamo.cl{args={name=v}}
else
link = v
end
r = r .. link
if next(list,k) then r = r .. divider end
end
return r
end
housamo.glist = housamo.GeneralList
function housamo.test(frame)
local str = [[]]
for k,v in ipairs(frame.args) do
str = str .. k ..[[ ]] .. v ..[[<br/>]]
end
return str;
end
return housamo