2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Housamo

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

简介

这个模块主要用于东京放课后召唤师的数据处理,这个模块包含了一些实用的功能函数。

使用本模块的方法:{{#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]),如果您只想指定arg1arg3,那么您可以考虑如下几种写法:


{{#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文本,否则只返回带有后缀的文件名。

Icon-info.png
此函数尚待改进,如非测试目的请不要大量使用
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