Minecraft Wiki
Advertisement
Minecraft Wiki
1.293
pagina's

Deze module implementeert {{Breektabel}}.

Afhankelijkheden[]

[bekijken | bewerken | geschiedenis | cache legen]Bovenstaande documentatie is getranscludeerd uit Module:Breektabel/doc.

local p = {}

local breektijdhoofd;

local function getBreektijdhoofd( f )
	if breektijdhoofd == nil then
		breektijdhoofd = '[[Vernietigen|Breektijd]]' .. f:preprocess( '<ref group="opmerking" name="breektijdopm">Tijd is voor onbetoverd gereedschap in seconden.</ref>' )
	end
	return breektijdhoofd
end

p.rij = function( f )
	local args = require( 'Module:ProcessArgs' ).norm()
	
	local getDplVar = function( var )
		local waarde = f:callParserFunction( '#dplvar', 'breaking ' .. var )
		if waarde == '' then
			waarde = false
		end
		return waarde
	end
	local dplVars = {}
	local setDplVar = function( var, waarde )
		table.insert( dplVars, 'breaking ' .. var )
		table.insert( dplVars, waarde or '1' )
	end
	
	local rijen = {}
	local tabelonderdelen = {}
	local categorieen = {}
	
	local horizontaal
	if args.horizontaal or args[1]:match( ';' ) then
		horizontaal = true
	end
	
	local toonGereedschap = true
	local toonSchaar = true
	local toonZwaard = true
	local header, sortable, simple
	if horizontaal or not getDplVar( 'header' ) then
		if args.verberggereedschap or horizontaal and ( not args[2] or args[2]:lower() == 'elk' or args[2]:lower() == 'geen' ) then
			toonGereedschap = false
			setDplVar( 'verberggereedschap' )
		end
		if args.verbergschaar or horizontaal and not args.schaar then
			toonSchaar = false
			setDplVar( 'verbergschaar' )
		end
		if args.verbergzwaard or horizontaal and not args.zwaard then
			toonZwaard = false
			setDplVar( 'verbergzwaard' )
		end
		
		sortable = not horizontaal and args.sort
		if sortable then
			setDplVar( 'sortable' )
		end
		simple = args.simple
		if simple and not horizontaal then
			setDplVar( 'simple' )
		end
		
		local tabelklassen = { 'wikitable' }
		if sortable then
			table.insert( tabelklassen, 'sortable' )
		end
		table.insert( rijen, ' {| class="' .. table.concat( tabelklassen, ' ' ) .. '" style="text-align:center"' )
	
		local sorteertype = ''
		if sortable then
			sorteertype = 'data-sort-type="number"'
		end
		local rowspan = ''
		if not horizontaal then
			rowspan = 'rowspan=2'
		end
		
		header = {
			'!' .. rowspan .. ' | Blok'
		}
		
		if not simple then
			table.insert( header, '! ' .. rowspan .. sorteertype .. ' | Hardheid' )
			if toonGereedschap then
				table.insert( header, '! ' .. rowspan .. ' | Gereedschap' )
			end
		end
		
		local gereedschapkolommen = {}
		if toonGereedschap then
			gereedschapkolommen = { 'Hout', 'Steen', 'IJzer', 'Diamant', 'Goud' }
		end
		table.insert(
			gereedschapkolommen, 1,
			'<abbr title="Inclusief voorwerpen die geen gereedschap zijn en het verkeerde type gereedschap">Hand</abbr>'
		)
		if not simple then
			if toonSchaar then
				table.insert( gereedschapkolommen, 'Schaar' )
			end
			if toonZwaard then
				table.insert( gereedschapkolommen, 'Zwaard' )
			end
		end
		
		if not horizontaal then
			table.insert( header, '! colspan="' .. #gereedschapkolommen .. '" |' .. getBreektijdhoofd( f ) )
			table.insert( header, '|-' )
		end
		
		for _, gereedschap in ipairs( gereedschapkolommen ) do
			table.insert( header, '! ' .. sorteertype .. ' | ' .. gereedschap )
		end
		
		if not horizontaal then
			header = table.concat( header, '\n' )
			setDplVar( 'header', header )
		end
		table.insert( tabelonderdelen, header )
	else
		toonGereedschap = not getDplVar( 'verberggereedschap' )
		toonSchaar = not getDplVar( 'verbergschaar' )
		toonZwaard = not getDplVar( 'verbergzwaard' )
		sortable = getDplVar( 'sortable' )
		simple = getDplVar( 'simple' )
	end
	
	local sprite = require( 'Module:Sprite' )
	local hardheid = require( 'Module:Waarden' ).hardheidModule
	
	local vulCellen = function( cellentabel, tekst, num )
		for i = 1, num do
			table.insert( cellentabel, tekst )
		end
	end
	local materiaalgraad = {
		Elk = 0,
		Hout = 1,
		Goud = 1,
		Steen = 2,
		IJzer = 3,
		Diamant = 4,
		Geen = 5
	}
	local materiaalsnelheid = {
		Geen = 1,
		Elk = 1,
		Hout = 2,
		Steen = 4,
		IJzer = 6,
		Diamant = 8,
		Goud = 12
	}
	local voegBlokToe = function( blokArgs )
		local cellen = {}
		local blokken = mw.text.split( blokArgs[1], '%s*,%s*' )
		local hardheidwaarde = tonumber( hardheid{ blokken[1], type = 'hardheid' } )
		if not hardheidwaarde then
			hardheidwaarde = '?'
		end
		local onbreekbaar
		if hardheidwaarde == -1 or blokArgs.vloeistof then
			onbreekbaar = true
		end
		
		local blockSprites = {}
		local links = mw.text.split( blokArgs.link or '', '%s*,%s*' )
		local ids = mw.text.split( blokArgs.sprite or '', '%s*,%s*' )
		local voorwerpen = mw.text.split( blokArgs.voorwerp or '', '%s*,%s*' )
		for i, blok in ipairs( blokken ) do
			local link
			if not links[i] and links[1] ~= '' then
				link = links[1]
			elseif links[i] ~= '' then
				link = links[i]
			end
			local id
			if not ids[i] and ids[1] ~= '' then
				id = ids[1]
			elseif ids[i] ~= '' then
				id = ids[i]
			end
			local bloktekst
			if args.textTrim then
				bloktekst = blok:gsub( args.textTrim .. '$', '' )
			else
				bloktekst = blok
			end
			local blockSpriteArgs = {
				data = 'BlokSprite',
				blok,
				tekst = bloktekst,
				link = link,
				id = id
			}
			if voorwerpen[i] == '1' or not voorwerpen[i] and voorwerpen[1] == '1' then
				blockSpriteArgs.data = 'VoorwerpSprite'
			end
			
			local image, spriteCat = sprite.link( blockSpriteArgs )
			table.insert( blockSprites, image )
			table.insert( categorieen, spriteCat )
		end
		table.insert( cellen,
			'! style="text-align:left" | ' .. table.concat( blockSprites, '<br>' ) .. ( blokArgs.opmerking or '' )
		)
		
		local gereedschap = mw.text.trim( simple and 'Gereedschap' or blokArgs[2] or 'Elk' ):gsub( '^%l', string.upper )
		local materiaal = mw.text.trim( simple and blokArgs[2] or blokArgs[3] or 'Elk' ):gsub( '^%l', string.upper )
		if gereedschap == 'Geen' then
			materiaal = gereedschap
		end
		if materiaal == 'Ijzer' then
			materiaal = 'IJzer'
		end
		if not simple then
			local hardheidtekst = tostring( hardheidwaarde ):gsub( '%.', ',' ) -- Vervang decimale punt door komma
			if hardheidwaarde == -1 then
				hardheidtekst = ( sortable and 'data-sort-value="999" | ' or '' ) .. '∞'
			end
			table.insert( cellen, '|' .. hardheidtekst )
			
			if toonGereedschap then
				local gereedschapcel = '—'
				if gereedschap ~= 'Elk' and gereedschap ~= 'Geen' then
					local gereedschapnaam = ( materiaal ~= 'Elk' and materiaal .. 'en ' or '' ) .. gereedschap:lower()
					local image, spriteCat = sprite.sprite{
						data = 'VoorwerpSprite',
						( materiaal == 'Elk' and 'Houten ' or '' ) .. gereedschapnaam,
						title = gereedschapnaam,
						link = gereedschap
					}
					gereedschapcel = ( sortable and 'data-sort-value="' .. gereedschapnaam .. '" |' or '' ) .. image
					table.insert( categorieen, spriteCat )
				end
				table.insert( cellen, '|' .. gereedschapcel )
			end
		end
		
		local keuzes = {}
		local getKeuze = function( keuze, tekst )
			if not keuzes[keuze] then
				keuzes[keuze] = f:expandTemplate{ title = 'Table Choice', args = { keuze, '' } }
			end
			return keuzes[keuze] .. tekst
		end
		
		if hardheidwaarde == '?' then
			vulCellen( cellen, '|?', 6 )
		else
			local tijdsduur = function( num )
				if num < 0.05 then		-- Minimale breektijd van 1 speltick (0,05 seconden)
					num = 0.05
				else					-- Anders moeten ze gebroken worden in een x aantal spelticks van 0,05 seconden
					num = math.ceil( num * 20 ) / 20
				end
				return num
			end
			
			if onbreekbaar then
				table.insert( cellen, '| ' .. ( sortable and 'data-sort-value="999" ' or '' ) .. getKeuze( 'no_temp', '∞' ) )
				if toonGereedschap then
					vulCellen( cellen, '|—', 5 )
				end
			else
				local drop = 'yes_temp'
				if blokArgs.drop == '0' then
					drop = 'partial_temp'
				end
				local vereistNiveau = onbreekbaar and 999 or materiaalgraad[materiaal]
				local voegMateriaalcelToe = function ( materiaal )
					local zalVallen = drop
					if materiaalgraad[materiaal] < vereistNiveau then
						zalVallen = 'no_temp'
					end
					local breektijd = tijdsduur( hardheidwaarde / materiaalsnelheid[materiaal] * ( zalVallen == 'no_temp' and 5 or 1.5 ) )
					local breektijdAP = tostring( breektijd ):gsub( '%.', ',' ) -- Vervang decimale punt door komma
					table.insert( cellen, '|' .. getKeuze( zalVallen, breektijdAP ) )
				end
				
				if not toonGereedschap or gereedschap == 'Elk' or gereedschap == 'Geen' then
					voegMateriaalcelToe( 'Elk' )
					if toonGereedschap then
						vulCellen( cellen, '|—', 5 )
					end
				else
					for _, materiaal in ipairs{ 'Elk', 'Hout', 'Steen', 'IJzer', 'Diamant', 'Goud' } do
						voegMateriaalcelToe( materiaal )
					end
				end
			end
			
			if not simple and ( toonSchaar or toonZwaard ) then
				local gereedschappen = {}
				if toonSchaar then
					table.insert( gereedschappen, 'Schaar' )
				end
				if toonZwaard then
					table.insert( gereedschappen, 'Zwaard' )
				end
				if hardheidwaarde == '?' then
					vulCellen( cellen, '|?', #gereedschappen )
				else
					local gereedschapsnelheid = {
						Schaar = 1,
						Zwaard = 1.5
					}
					if blokken[1] == 'Wol' then
						gereedschapsnelheid.Schaar = 5
					elseif blokken[1] == 'Bladeren' then
						gereedschapsnelheid.Schaar = 15
					elseif blokken[1] == 'Spinnenweb' then
						gereedschapsnelheid.Zwaard = 15
						gereedschapsnelheid.Schaar = 15
					end
					
					for _, gereedschap in ipairs( gereedschappen ) do
						local gereedschapLaatVallen = blokArgs[mw.ustring.lower( gereedschap )]
						if not gereedschapLaatVallen then
							table.insert( cellen, '|—' )
						else
							local zalVallen = 'yes_temp'
							if gereedschapLaatVallen == '0' then
								zalVallen = 'partial_temp'
							end
							
							local breektijd = tijdsduur( hardheidwaarde / gereedschapsnelheid[gereedschap] * 1.5 )
							local breektijdAP = tostring( breektijd ):gsub( '%.', ',' ) -- Vervang decimale punt door komma
							table.insert( cellen, '|' .. getKeuze( zalVallen, breektijdAP ) )
						end
					end
				end
			end
		end
		
		if not horizontaal then
			cellen = table.concat( cellen, '\n' )
		end
		table.insert( tabelonderdelen, cellen )
	end
	
	if horizontaal then
		local blokkenArgs = {}
		for _, arg in ipairs{ 1, 'opmerking', 'sprite', 'link', 'voorwerp', 'drop', 2, 3, 'schaar', 'zwaard' } do
			if args[arg] then
				local kol = 0
				for kolwaarde in mw.text.gsplit( args[arg], '%s*;%s*' ) do
					kol = kol + 1
					if kolwaarde ~= '' then
						if not blokkenArgs[kol] then
							blokkenArgs[kol] = {}
						end
						
						blokkenArgs[kol][arg] = kolwaarde
					end
				end
			end
		end
		for _, blok in ipairs( blokkenArgs ) do
			voegBlokToe( blok )
		end
		
		local kolommen = #tabelonderdelen
		for rij = 1, #tabelonderdelen[1] do
			local cellen = {}
			for kol = 1, kolommen do
				table.insert( cellen, tabelonderdelen[kol][rij] )
			end
			table.insert( rijen, table.concat( cellen, '\n' ) )
		end
		
		-- Voeg de breektijduitleg toe na de rij voor het blok wanneer de tabel simple is of na de gereedschap- of hardheidrij wanneer de tabel dat niet is
		table.insert( rijen, simple and 3 or toonGereedschap and 5 or 4, '! colspan="' .. kolommen + 1 .. '" |' .. getBreektijdhoofd( f ) )
	else
		voegBlokToe( args )
		for _, rij in ipairs( tabelonderdelen ) do
			table.insert( rijen, rij )
		end
	end
	table.insert( rijen, '' )
	
	local opmerking = ''
	if args.einde or horizontaal then
		opmerking = f:preprocess( '<references group="opmerking"/>' )
		
		if args.einde == '2' then
			table.insert( rijen, header or getDplVar( 'header' ) )
		end
		table.insert( rijen, '|}' )
		
		if not horizontaal then
			f:callParserFunction( '#dplvar:set',
				'breaking header', '',
				'breaking verberggereedschap', '',
				'breaking verbergschaar', '',
				'breaking verbergzwaard', '',
				'breaking simple', '',
				'breaking sortable', ''
			)
		end
	elseif #dplVars > 0 then
		f:callParserFunction( '#dplvar:set', dplVars )
	end
	
	return table.concat( rijen, '\n|-\n' ) .. opmerking .. table.concat( categorieen )
end

return p
Advertisement