モジュール:Spawn table

提供: Minecraft Wiki
移動先: 案内検索
local p = {}

local i18n = {
	processArgsModule = 'モジュール:ProcessArgs',
	entityLinkTemplate = 'EntityLink',
	editionsTemplate = 'テンプレート:Editions',
	mobColumn = 'Mob',
	chanceColumn = mw.getCurrentFrame():expandTemplate{title='Tooltip', args={'スポーン確率', 'カテゴリ内でのMobの相対的なスポーン確率'}},
	groupSizeColumn = mw.getCurrentFrame():expandTemplate{title='Tooltip', args={'スポーン数', '1回の抽選でスポーンするMobの数'}}
}

local spawnData = {}  -- contains mob spawn info

local groupArgs = {
	['passive'] = '友好カテゴリ',
	['hostile'] = '敵対カテゴリ',
	['water'] = '水中カテゴリ',
	['watercreature'] = '水生生物カテゴリ',
	['ambient'] = '環境カテゴリ',
	['waterambient'] = '水中環境カテゴリ'
}

local hasNotes = false

-- parses input arguments into spawnData table
local function parseInput(args)
	for argName in pairs(groupArgs) do
		local groupArg = args[argName]
		
		if groupArg then
			local currentGroup = {}
			local totalWeight = 0
			currentGroup.mobs = {}
			
			groupArg = groupArg .. '\n'  -- allow last line to be matched like the rest
			
			-- parse input of group parameter
			for line in mw.ustring.gmatch(groupArg, '[^\r\n]+[\r\n]') do  -- split on newline
				local parsedLine = {}
				for key, value in mw.ustring.gmatch(line, '([%a]+)%s*=%s*(.-)%s*[,\r\n]') do
					if value ~= '' then
						parsedLine[key:lower()] = value
					end
				end
				--parsedLine.mob = mw.ustring.match(line, '^%s*(.-)%s*,')
				parsedLine.note = mw.ustring.match(line, 'note=%s*(.-)%s*[\r\n]')
				
				local currentMob = {}
				
				-- convert weight to number; becomes nil if conversion fails
				if parsedLine.weight then
					weightNum = tonumber(parsedLine.weight)
					-- if converted to number successfully
					if weightNum then
						currentMob.weight = weightNum
						totalWeight = totalWeight + weightNum
					end
				end
				
				if parsedLine.size then
					currentMob.size = parsedLine.size
				end
				
				if parsedLine.note then
					hasNotes = true
					currentMob.note = parsedLine.note
				end
				
				if parsedLine.notename then
					currentMob.notename = parsedLine.notename
				end
				
				if parsedLine.mob then
					currentMob.mob = parsedLine.mob
					table.insert(currentGroup.mobs, currentMob)
				end
			end
			currentGroup.totalWeight = totalWeight
			spawnData[argName] = currentGroup
		end
	end
end


-- takes root <table> html object and adds table body using info in spawnData 
local function addTableBody(tableRoot, numberOfColumns)
	local frame = mw.getCurrentFrame()
	local groupNumber = 1
	
	for groupArg, groupTable in pairs(spawnData) do
		local groupHeader = mw.html.create('tr')
		groupHeader:tag('th')
			:attr('colspan', numberOfColumns)
			:wikitext(groupArgs[groupArg])
			
		tableRoot:node(groupHeader)
		
		for _, mobData in ipairs(groupTable.mobs) do
			local tableRow = mw.html.create('tr')
			
			local mobCellText = frame:expandTemplate{title=i18n.entityLinkTemplate, args={mobData.mob}}
			
			if mobData.note then 
				mobCellText = mobCellText .. frame:extensionTag{name='ref', content=mobData.note, args={name=mobData.mob:lower(), group='注釈'}}
			elseif mobData.notename then
				mobCellText = mobCellText .. frame:extensionTag{name='ref', args={name=mobData.notename:lower(), group='注釈'}}
			end
			
			tableRow:tag('th')
				:css('text-align', 'left')
				:css('font-weight', 'normal')
				:wikitext(mobCellText)
			
			tableRow:tag('td')
				:css('text-align', 'center')
				:wikitext('<sup>' .. mobData.weight .. '</sup>&frasl;<sub>' .. groupTable.totalWeight .. '</sub>')
			
			tableRow:tag('td')
				:css('text-align', 'center')
				:wikitext(mobData.size)
			
			tableRoot:node(tableRow)
		end
	end
end


-- function called from template
function p.mobSpawnTable(frame)
	local args = frame
	if frame == mw.getCurrentFrame() then
		args = require(i18n.processArgsModule).merge( true )
	else
		frame = mw.getCurrentFrame()
	end
	
	parseInput(args)

	local columns = {i18n.mobColumn, i18n.chanceColumn, i18n.groupSizeColumn}
	-- local biome = string.lower(args.biome or mw.title.getCurrentTitle().text)  -- may be useful if Cargo functionality is added
	
	local tableRoot = mw.html.create('table'):attr('class', 'wikitable')
	
	local titleStr = args.title
	
	if args.edition then
		local editionStr = frame:expandTemplate{title=i18n.editionsTemplate, args={args.edition}}
		if titleStr then
			titleStr = titleStr .. '(' .. editionStr .. ')'
		else
			titleStr = editionStr
		end
	end
	
	if titleStr then
		tableRoot
			:tag('caption')
				:wikitext(titleStr)
	end
	
	local colHeaders = mw.html.create('tr')
	
	for _, value in pairs(columns) do
		colHeaders:tag('th'):wikitext(value)
	end
	
	tableRoot:node(colHeaders)
	
	addTableBody(tableRoot, #columns)
	
	local outputWikitext = tostring(tableRoot)

	if hasNotes then
		outputWikitext = outputWikitext .. '\n\n' .. frame:extensionTag{name='references', args={group='注釈'}}
	end
	
	return outputWikitext
end

return p