如果你看到本段文字,说明该页面未正常加载全局JS,部分功能无法使用,请点击 刷新 重新加载页面。
如果打开页面显示缩略图创建出错,请点击刷新或页面右上WIKI功能中的刷新按钮清除页面缓存并刷新,如果还有问题,请多尝试几次。
全站通知:

模块:彩蛋台词

来自碧蓝航线WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

这个模块用来显示彩蛋台词的触发条件。

特定舰船

{{#invoke:彩蛋台词|舰船|新月|小天鹅|命运女神|萤火虫}}
或
{{#invoke:彩蛋台词|舰船|20109|20110|20112|20114}}
或
{{#invoke:彩蛋台词|CoupleShip|201091|201101|命运女神|201141}}
新月小天鹅命运女神萤火虫

新月小天鹅命运女神萤火虫
新月小天鹅命运女神萤火虫

参数支持舰船ID或舰船名字。

舰船ID支持XXX和XXX1两种格式。
函数舰船也写作CoupleShip

{{#invoke:彩蛋台词|舰船|新月|小天鹅|命运女神|萤火虫|数量=1}}
{{#invoke:彩蛋台词|舰船|新月|小天鹅|命运女神|萤火虫|数量=2}}
{{#invoke:彩蛋台词|舰船|新月|小天鹅|命运女神|光辉|数量=4}}
新月小天鹅命运女神萤火虫

新月小天鹅命运女神萤火虫
新月小天鹅命运女神光辉

数量规定编队中存在几艘船。
{{#invoke:彩蛋台词|解析|20109|20110|20112|20114|2|0}}
新月小天鹅命运女神萤火虫 旧的写法


特定类型

{{#invoke:彩蛋台词|类型|重巡|数量=2}}
或
{{#invoke:彩蛋台词|CoupleType|3|数量=2}}
或
{{#invoke:彩蛋台词|CoupleType|3|2}}
重巡2艘

重巡2艘
重巡2艘

支持舰船类型ID或舰船类型的名字

函数类型也写作CoupleType

{{#invoke:彩蛋台词|解析|3|2|1}}
重巡2艘 旧的写法


特定阵营

{{#invoke:彩蛋台词|阵营|皇家|数量=5}}
或
{{#invoke:彩蛋台词|CoupleNation|2|数量=5}}
或
{{#invoke:彩蛋台词|CoupleNation|2|5}}
皇家5艘

皇家5艘
皇家5艘

支持阵营ID或阵营的名字

函数阵营也写作CoupleNation

{{#invoke:彩蛋台词|解析|2|5|3}
皇家5艘 旧的写法

特定画师

{{#invoke:彩蛋台词|画师|番茄|数量=3}}
或
{{#invoke:彩蛋台词|CoupleIllustro|4|数量=3}}
或
{{#invoke:彩蛋台词|CoupleIllustro|4|3}}
(番茄舰队3艘)

(番茄大队3只)
(番茄大队3只)

支持画师ID或画师的名字。

(有些画师的舰队有独特的彩蛋)
函数画师也写作CoupleIllustro

{{#invoke:彩蛋台词|解析|4|3|4}
(番茄大队3只) 旧的写法

Text = mw.text

local p = {}

ZhNum = {
	[1] = '一',
	[2] = '两',
	[3] = '三',
	[4] = '四',
	[5] = '五',
	[6] = '六',
	[7] = '七',
	[8] = '八'
}

--------------------------------------------------
--	公开函数
--------------------------------------------------
p.Parse = function(frame)
	local arg = parseArgument(frame)
	local n = #arg
	if n < 1 then return '' end
	
	local couple_type = arg[n]
	arg[n] = nil
	
	if couple_type == 0 then
		-- CoupleShip
		--10112,10113,10114,2,0
		local span_num = arg[#arg]
		arg[#arg] = nil
		return parseShipCouple(arg, span_num)
	elseif couple_type == 1 then
		--CoupleType
		--3-2-1
		return parseTypeCouple(arg[1], arg[2])
	elseif couple_type == 3 then
		--CoupleNation
		--2-5-3
		return parseNationCouple(arg[1], arg[2])
	elseif couple_type == 4 then
		--CoupleIllustro
		--4,3,4
		return parseIllustroCouple(arg[1], arg[2])
	end
	return [[<small>'''(???)'''</small>]]
end
p['解析']=p.Parse

p.CoupleShip = function(frame)
	local arg = parseArgument(frame)
	if not arg[2] then 
		arg[1] = arg[1] or '???'
		return parseShipCouple(arg, 1)
	end
	local span_num = arg['数量'] or 1
	local tmp = arg[#arg] 
	if type(tmp) == 'number' and tmp <= 8 then
		span_num = tmp
		arg[#arg] = nil
	end
	return parseShipCouple(arg, span_num)
end
p.CoupleType = function(frame)
	local arg = parseArgument(frame)
	return parseTypeCouple(arg[1] or '???', arg[2] or arg['数量'] or 1)
end
p.CoupleNation = function(frame)
	local arg = parseArgument(frame)
	return parseNationCouple(arg[1] or '???', arg[2] or arg['数量'] or 1)
end
p.CoupleIllustro = function(frame)
	local arg = parseArgument(frame)
	return parseIllustroCouple(arg[1] or '???', arg[2] or arg['数量'] or 1)
end

p['舰船'] = p.CoupleShip
p['类型'] = p.CoupleType
p['阵营'] = p.CoupleNation
p['画师'] = p.CoupleIllustro

--------------------------------------------------
--	主要过程
--------------------------------------------------
--特定舰船触发的彩蛋
function parseShipCouple(shipList, spanNum)
	local title = ''	--编队中包含xxx、xxx或xxx中任意n艘
	local text = ''		--(xx, xx, xx)
	spanNum = spanNum or 1
	
	if #shipList == 1 then
		title = ('编队中包含%s'):format(shipIdToName(shipList[1]))
		text = '(' .. spanLink(shipIdToName(shipList[1]), title) ..')'
	else
		for i, v in ipairs(shipList) do
			shipList[i] = shipIdToName(shipList[i])
			
			if i == 1 then
				title = shipList[i]
			elseif i ~= n then
				title = title .. '、' .. shipList[i]
			elseif #shipList == spanNum then
				title = title .. '和' .. shipList[i]
			else
				title = title .. '或' .. shipList[i]
			end
		end
		title = #shipList == spanNum 
			and ('编队中包含%s%s艘舰船'):format(title, ZhNum[spanNum])
			or ('编队中包含%s中任意%s艘舰船'):format(title, ZhNum[spanNum])
			
		for i, v in ipairs(shipList) do
			if i == 1 then
				text = spanLink(shipList[i], title)
			else
				text = text .. ',' .. spanLink(shipList[i], title)
			end
		end
		text = '(' .. text .. ')'
	end
	return spanText(title, text)
end

--舰船类型触发的彩蛋
function parseTypeCouple(shipType, spanNum)
	--3-2-1
	local ship_type = typeIdToName(shipType)
	local title = ('编队中包含%d艘类型为%s的舰船'):format(spanNum, ship_type)
	local text = '('..spanLink(ship_type, title, ship_type..spanNum..'艘')..')'
	
	return spanText(title, text)
end

--特定阵营触发的彩蛋
function parseNationCouple(nationId, spanNum)
	--2-5-3
	local nation = nationIdToName(nationId)
	local title = ('编队中包含%d艘属于%s的舰船'):format(spanNum, nation)
	local text = '('..spanLink('阵营',title, nation..spanNum..'艘')..')'
	
	return spanText(title, text)
end

--特定画师触发的彩蛋
function parseIllustroCouple(illustroId, spanNum)
	--4,3,4
	local name = illustroIdToName(illustroId)
	local fleet = getFleetNickname(illustroId)
	return spanText(
		('编队中包含%d艘画师为%s的舰船'):format(spanNum, name),
			('('..fleet..')'):format(spanNum)
		)
end

--------------------------------------------------
--	工具函数
--------------------------------------------------
function shipIdToName(id)
	mSHD = require('模块:舰娘数据')
	
	return type(id) == 'string' and id
		or mSHD.ShipIdToName(id, '未知')
end

function typeIdToName(id)
	mSHD = require('模块:舰娘数据')
	
	return type(id) == 'string' and id
		or mSHD.TypeIdToName(id, '未知')
end

function nationIdToName(id)
	mSHD = require('模块:舰娘数据')
	
	return type(id) == 'string' and id
		or mSHD.NationIdToName(id, '未知')
end

function illustroIdToName(id)
	if type(id) == 'string' then return id end
	
	mILL = require('模块:画师数据')
	local data = mILL.GetIllustratorData(id)
	if not data then return '未知' end
	return data.name or data.pen_name
end

function getFleetNickname(id)
	if id == 10 then return '猴子军团%d只' 
	elseif id == 8  then return '八才战队%d艘'
	elseif id == 4  then return '番茄大队%d只'
	elseif id == 1  then return '枫之军团%d艘'
	elseif id == 7  then return '阿鸡分队%d只'
	end
	
	mILL = require('模块:画师数据')
	local data = mILL.GetIllustratorData(id)
	
	if not data then
		return type(id) == 'string'
			and id .. '舰队%d艘'
			or '未知舰队%d艘'
	end
	
	return (data.pen_name or data.name) .. '舰队%d艘'
end

function spanText(title, text)
	return ('<span style="font-weight:bold;font-size:smaller;color:#555555;" title="%s">%s</span>')
			:format(tostring(title), tostring(text))
end

function spanLink(link, title, text)
	return ('[[%s|<span style="color:#555555;" title="%s">%s</span>]]')
			:format(tostring(link), tostring(title), tostring(text or link))

	-- return ('[[%s|<span style="color:#555555;" title="%s">%s</span>]]')
			-- :format(tostring(link), tostring(title), tostring(text or link))
end

function parseArgument(frame)
	local arg = {}
	for k, v in pairs(frame.args) do
		arg[k] = tonumber(v) or Text.trim(v)
	end
	return arg
end

return p