Módulo:Infobox non-player character

De RuneScape Wiki
Ir para: navegação, pesquisa
Documentação do módulo
Esta documentação é transcluída de Módulo:Infobox non-player character/doc. [editar] [atualizar]
Módulo:Infobox non-player character's a função main é invocada por Predefinição:Infobox NPC.
Módulo:Infobox non-player character carrega dados de Módulo:NPC races.

Gera a Infobox NPC.


--------------------------
-- Módulo para a [[Predefinição:Infobox NPC]]
------------------------
local p = {}

-- "imports"
local onmain = require('Módulo:Mainonly').on_main
local yesno = require('Módulo:Yesno')
local paramtest = require('Módulo:Paramtest')
local infobox = require('Módulo:Infobox')
local cleanimg = require('Módulo:Clean image').clean
local externo = require('Módulo:Top icons')._main
local npcrace = mw.loadData('Módulo:NPC races')

function p.main(frame)
	local args = frame:getParent().args
	local ret = infobox.new(args)

	ret:defineParams{
		{ name = 'nome', func = 'nome' },
		{ name = 'aka', func = 'has_content' },
		{ name = 'imagem', func = imgarg },
		{ name = 'inglês', func = { name = inglesarg, params = { 'inglês', 'nome', 'id' }, flag = { 'd' } } },
		{ name = 'imagebackground', func = { name = imgback, params = { 'imagebackground' }, flag = { 'd' } }, dupes = true },
		{ name = 'vanchor', func = { name = 'has_content', params = { 'versão' }, flag = 'p' } },
		{ name = 'lançamento', func = 'release' },
		{ name = 'descontinuado', func = 'removal' },
		{ name = 'membros', func = 'has_content' },
		{ name = 'missão', func = { name = questarg, params = { 'missão' }, flag = { 'd' } } },
		{ name = 'localização', func = 'has_content' },
		{ name = 'nível', func = 'has_content' },
		{ name = 'ações', func = { name = actionarg, params = { 'ações' }, flag = { 'd' } } },
		{ name = 'actions_smw', func = { name = actionsmw, params = { 'ações' }, flag = { 'p' } }, dupes = true },
		{ name = 'nívelRoubo', func = { name = thievarg, params = { 'nívelRoubo' }, flag = { 'd' } } },
		{ name = 'thievelvl_smw', func = { name = thievarg, params = { 'nívelRoubo' }, flag = { 'd' } }, dupes = true },
		{ name = 'examinar', func = { name = examinearg, params = { 'examinar' }, flag = { 'd' } } },
		{ name = 'mapa', func = { name = maparg, params = { 'mapa' }, flag = { 'd' } } },
		{ name = 'intmap', func = { name = intmaparg, params = { 'intmap' }, flag = { 'd' } } },
		{ name = 'mapdisp', func = { name = mapdisp, params = { 'mapa', 'intmap' }, flag = { 'd', 'd' } }, dupes = true },
		{ name = 'raça', func = racearg },
		{ name = 'id', func = { name = iddisp,  params = { 'id' }, flag = 'p' } },
		{ name = 'cenarioid', func = { name = iddisp,  params = { 'cenarioid', 'cenárioid' }, flag = 'p', 'p' } },
		{ name = 'id_smw', func = { name = idsmw, params = { 'id' }, flag = 'p' }, dupes = true },
		{ name = 'objectid_smw', func = { name = idsmw, params = { 'cenarioid' }, flag = 'p' }, dupes = true },
		{ name = 'chisel_links', func = { name = 'make_chisel_links', params = { 'nome', '<br>', 'mrnd', 'id', 'mrod', 'cenarioid' }, flag = { 'p', 'r', 'r', 'p', 'r', 'p' } } },
		{ name = 'vendedor', func = 'has_content' },
		{ name = 'gênero', func = 'has_content' },
		{ name = 'f2pvisível', func ='has_content' },
		{ name = 'voz', func ='has_content' },
	}

	ret:useSMW({
		members = 'É somente para membros',
		thievelvl_smw = 'Nível de Roubo'
	})

	ret:useSMWOne({
		id_smw = 'All ID do NPC',
		objectid_smw = 'All ID do Cenário'
	})

	ret:useSMWSubobject({
		id_smw = 'ID do NPC',
		objectid_smw = 'ID do Cenário',
--		name = 'NPC name',
		members = 'É somente para membros',
--		location = 'NPC location',
		actions_smw = 'Ações',
		release = 'Data de lançamento',
		update = 'Atualização de lançamento',
		--removal = 'Data de remoção',
		removalupdate = 'Atualização de remoção',
		thievelvl_smw = 'Nível de Roubo',
	})

	ret:setMaxButtons(4)	
	ret:create()
	ret:cleanParams()
	ret:customButtonPlacement(true)

	ret:linkParams{
		image = 'imagebackground'
	}
	
	ret:defineLinks({ links = {{ 'Predefinição:%s', 'Infobox' },
		{ 'Predefinição:Infobox multi NPC', '(multi)' },
		{ 'Predefinição_Discussão:%s', 'Discussão' }}, colspan = '2' })

	ret:defineName('Infobox NPC')
	ret:addClass('rsw-infobox plainlinks')

	ret:addButtonsCaption()

	-- PARAMETER: nome
	ret:addRow{
		{ tag = 'argh', content = 'nome', class='infobox-header', colspan = '2' }
	}

	-- PARAMETER: imagem
	ret:addRow{
		{ tag = 'argd', content = 'imagem', class = 'infobox-image bordered-image', colspan = '2', css = { ['max-width'] = '300px' } },
		meta = { addClass = ret:param('imagebackground', 'r') }
	}
	
	:addRow{
		{ tag = 'argd', content = 'examinar', class = 'infobox-image', colspan = '2', css = { ['max-width'] = '300px', ['text-align'] = 'center', ['font-style'] = 'italic' } }
	}
	
	:addRow{
		{ tag = 'th', content = 'Inglês' },
		{ tag = 'argd', content = 'inglês' }
	}
	
		-- PARAMETER: membros
	:addRow{
		{ tag = 'th', content = '[[Membros]]' },
		{ tag = 'argd', content = 'membros' }
	}
	
	-- PARAMETER: lançamento
	-- (update included automatically by infobox)
	:addRow{
		{ tag = 'th', content = 'Lançamento', css = { ['white-space'] = 'nowrap' } },
		{ tag = 'argd', content = 'lançamento' }
	}

	-- PARAMETER: removal
	if ret:paramDefined('descontinuado') then
		ret:addRow{
			{ tag = 'th', content = 'Descontinuado' },
			{ tag = 'argd', content = 'descontinuado' }
		}
	end

	-- PARAMETER: aka
	if ret:paramDefined('aka') then
		ret:addRow{
			{ tag = 'th', content = 'Também conhecido como' },
			{ tag = 'argd', content = 'aka' }
		}
	end

	-- PARAMETER: nível
	if ret:paramDefined('nível') then
		ret:addRow{
			{ tag = 'th', content = '[[Nível de combate]]', css = { ['white-space'] = 'nowrap' } },
			{ tag = 'argd', content = 'nível' }
		}
	end

	-- PARAMETER: raça
	ret:addRow{
		{ tag = 'th', content = '[[Raças|Raça]]' },
		{ tag = 'argd', content = 'raça' }
	}
	
	-- PARAMETER: missão
	ret:addRow{
		{ tag = 'th', content = '[[:Categoria:NPCs de missões|De Missão]]' },
		{ tag = 'argd', content = 'missão' }
	}

	-- PARAMETER: localização
	ret:addRow{
		{ tag = 'th', content = 'Localização' },
		{ tag = 'argd', content = 'localização' }
	}
	
	-- PARAMETER: vendedor
	ret:addRow{
		{ tag = 'th', content = '[[Lojas|Vende]]' },
		{ tag = 'argd', content = 'vendedor' }
	}

	-- PARAMETER: gênero
	ret:addRow{
		{ tag = 'th', content = 'Gênero' },
		{ tag = 'argd', content = 'gênero' }
	}

	-- PARAMETER: ações
	ret:addRow{
		{ tag = 'th', content = 'Ações' },
		{ tag = 'argd', content = 'ações' }
	}
	
	-- PARAMETER: thievelvl
	if ret:paramDefined('nívelRoubo') then
		ret:addRow{
			{ tag = 'th', content = '[[File:Roubo_ícone.png|link=Roubo|frameless|20px|alt=Nível de Roubo|Nível de Roubo]] [[Roubo|Nível]]' },
			{ tag = 'argd', content = 'nívelRoubo' } }
	end

	-- PARAMETER: mapa
	local map_defined  = ret:paramGrep('mapdisp', function(x) return (x or false) ~= false end)
	if map_defined  == true then
		if ret:paramDefined('mapa') then
		ret:addRow{
			{ tag = 'argd', content = 'mapa', class = 'infobox-map', colspan = '2' } }
		elseif ret:paramDefined('intmap') then
		ret:addRow{
			{ tag = 'argd', content = 'intmap', class = 'infobox-map', colspan = '2' } }
		end
	end

	-- PARAMETER: Advanced data
	ret:addRow{
		{ tag = 'th', content = 'Dados avançados', class = 'infobox-subheader', colspan = '2' },
		meta = {addClass = 'advanced-data'}
	}
	:addRow{
		{ tag = 'th', content = 'ID do NPC' },
		{ tag = 'argd', content = 'id' },
		meta = {addClass = 'advanced-data'}
	}
	if ret:paramDefined('cenarioid', 'all') then
	ret:addRow{
		{ tag = 'th', content = 'ID de Cenário' },
		{ tag = 'argd', content = 'cenarioid' },
		meta = {addClass = 'advanced-data'}
	}
	end
	ret:addRow{
		{ tag = 'th', content = 'Links' },
		{ tag = 'argd', content = 'chisel_links' },
		meta = {addClass = 'advanced-data'} }

	ret:finish()
	if onmain() then
		local a1 = ret:param('all')
		local a2 = ret:categoryData()
		ret:wikitext(addcategories(a1, a2))
	end
	return ret:tostring()
end

function imgarg(arg)
	if infobox.isDefined(arg) then
		return cleanimg{ file = arg, width = 300, height = 300 }
	end
	return nil
end

function imgback(arg)
	if infobox.isDefined(arg) then
		if yesno(arg) then
			return 'infobox-imgbg'
		end
	end
	return ''
end

-- English name
function inglesarg(name, ptname, id)
	mw.log('inglesarg ('..name..', '..ptname..', '..id..')')
    if infobox.isDefined(name) then
        return externo({rsw=name}, pagename) .. string.gsub('[[:en:%s|%s]]', '%%s', name)
    else
    	local translate = require('Módulo:Traduções')._simple
    	local engl = false
    	if infobox.isDefined(ptname) then
    		engl = translate(ptname, 'pt', 'npc', 'en')
    	end
    	if infobox.isDefined(id) and not engl then
    		local id1 = string.match(id, '%d+')
    		mw.log('id1 = '..id1)
    		if id1 then
    			id1 = tonumber(id1)
    			engl = translate(id1, 'id', 'npc', 'en')
    		end
    	end
    	mw.log('end engl = ')
    	mw.log(engl)
    	if engl then
    		return externo({rsw=engl}, pagename) .. string.gsub('[[:en:%s|%s]]', '%%s', engl)
    	end
    end
end

function examinearg(arg)
	if infobox.isDefined(arg) then
		local r = string.gsub(arg, '*', '<br />\'\'\'&bull;\'\'\' ')
		r = string.gsub(r, '<br%s*/?>', '', 1)
		return r
	end
	return nil
end

function thievarg(arg)
	arg = string.gsub(arg or '',',','')
	return tonumber(arg, 10)
end

function maparg(arg)
	if infobox.isDefined(arg) then
		local low = string.lower(arg)
		if yesno(low) == false then
			return nil
		elseif low == 'nome' then
			return string.format('[[Arquivo:%s localização.png]]', mw.title.getCurrentTitle().text)
		elseif string.find(low, '.png') then
			return cleanimg{ file = arg, width = 250 }
		else
			return arg
		end
	else
		return nil
	end
end

function racearg(arg)
	local ret = { '' }
	if infobox.isDefined(arg) then
		for _, v in ipairs(npcrace) do
			if v.race == string.lower(arg) then
			 	table.insert(ret, v.racelink)
		    end
		end
		for i, v in ipairs(ret) do
			if (v ~= '') then
				ret[i] = string.format('[[%s]]', v)
			end
		end
		
		r =  table.concat(ret, '')
		if r ~= '' then
			return r
		else
			--Do not return invalid categories
			--return arg
		end
	end

	return nil
end

function intmaparg(arg)
	if infobox.isDefined(arg) then
		if yesno(arg) == false then
			return nil
		else
			return mw.getCurrentFrame():preprocess( arg )
		end
	else
		return nil
	end
end

function mapdisp(mapa, intmap)
	if infobox.isDefined(intmap) or infobox.isDefined(mapa) then
		if ( yesno(mapa) == false ) or ( string.lower(mapa) == 'nenhum' ) then
			if ( yesno(intmap) == false ) or ( yesno(intmap) == nil ) then
				return false
			end
		elseif ( yesno(intmap) == false ) or ( string.lower(intmap) == 'nenhum' ) then
			if ( yesno(mapa) == false ) or ( yesno(mapa) == nil ) then
				return false
			end
		else
			return true
		end
	else
		return nil
	end
end

function iddisp(id)
	if infobox.isDefined(id) then
		if id:lower() ~= 'não' then
			local r = string.gsub(id, ', *', ', ')
			return r
		elseif id:lower() == 'não' then
			return 'Nenhum'
		end
	end
	return nil
end

function idsmw(id)
	if infobox.isDefined(id) and id:lower() ~= 'não' and id:lower() ~= 'nenhum' then
		local r = string.gsub(id, ', *', infobox.splitpoint)
		return r
	end
	return nil
end

function questarg(arg)
	if infobox.isDefined(arg) then
		if string.lower(arg) == 'não'  then
			return 'Não'
		else
		local r = mw.ustring.gsub(arg, '%[*Desaparecido, Morte Presumida%]*', '!foo!')
		r = string.gsub(r, ',%s*', '<br />\'\'\'&bull;\'\'\' ')
		r = '\'\'\'&bull;\'\'\' ' .. r
		r = mw.ustring.gsub(r, '!foo!', '[[Desaparecido, Morte Presumida]]')
		return r
		end
	end
	return nil
end

function actionarg(arg)
	if infobox.isDefined(arg) then
		if string.lower(arg) == 'nenhuma' or string.lower(arg) == 'nenhum' or string.lower(arg) == 'examinar' then
			return '\'\'\'&bull;\'\'\' [[Examinar]]'
		end
		local r = string.gsub(arg, ',%s*', '<br />\'\'\'&bull;\'\'\' ')
		r = '\'\'\'&bull;\'\'\' ' .. r
		r = mw.ustring.gsub(r, '%[*[Ww]alk [Hh]ere%]*', '[[Walk here|Walk here]]')
		r = mw.ustring.gsub(r, '%[*[Ee]xaminar%]*', '[[Examinar]]')
		if not r:find('Examinar') then
			r = r .. '<br />\'\'\'&bull;\'\'\' [[Examinar]]'
		end
		return r
	end
	return nil
end

function actionsmw(arg)
	if infobox.isDefined(arg) then
		if string.lower(arg) == 'nenhuma' or string.lower(arg) == 'nenhum' or string.lower(arg) == 'examinar' then
			return 'Examinar'
		end
		local r = string.gsub(arg, ',%s*', infobox.splitpoint)
		r = mw.ustring.gsub(r, '%[*[Ww]alk [Hh]ere%]*', 'Walk here')
		r = mw.ustring.gsub(r, '%[*[Ee]xaminar%]*', 'Examinar')
		if not r:find('Examinar') then
			r = r .. infobox.splitpoint .. 'Examinar'
		end
		return r
	end
	return nil
end

function addcategories(args, catargs)
	function is_def(x, y)
		y = y or 'd'
		if infobox.isDefined(x) then
			return infobox.isDefined(x[y])
		end
		return false
	end
	
	local ret = { 'NPCs' }
	
	-- ID based categories
	local misID = {}
	if args.id.switches then
		for i,v in ipairs(args.id.switches) do
			if infobox.isDefined(v) and v ~= 'Nenhum' then
				table.insert(ret, 'NPCs do Cache')
			else
				misID[i] = true
			end
		end
	elseif args.id.d and args.id.d ~= 'Nenhum' then
		table.insert(ret, 'NPCs do Cache')
	end
	
	
	if args.cenarioid.switches then
		for i,v in ipairs(args.cenarioid.switches) do
			if infobox.isDefined(v) and v ~= 'Nenhum' then
				table.insert(ret, 'Cenário do Cache')
				if misID[i] then
					misID[i] = false
				end
			end
		end
	elseif infobox.isDefined(args.cenarioid.d) and args.cenarioid.d ~= 'Nenhum' then
		table.insert(ret, 'Cenário do Cache')
		misID = {}
	end
	for _,v in pairs(misID) do
		if v then
			table.insert(ret, 'Precisa de ID')
		end
	end
	
	local cat_map = {
		-- Adicionada se o parâmetro tem conteúdo
		defined = {
			aka = 'Páginas com AKA',
			['nívelRoubo'] = 'Entidades roubáveis',
		},
		-- Adicionada se o parâmetro não tem conteúdo
		notdefined = {
			imagem = 'NPCs que precisam de imagem',
			membros = 'Precisa de estado de membros',
			['lançamento'] = 'Precisa de data de lançamento',
			examinar = 'Precisa de texto de examinar',
			['ações'] = 'Precisa de ações',
			['raça'] = 'Precisa de raça',
			['gênero'] = 'Precisa de gênero',
		},
	}
	
	-- Run and add mapped categories
	for n, v in pairs(cat_map.defined) do
		if catargs[n] and catargs[n].one_defined then
			table.insert(ret,v)
		end
	end
	for n, v in pairs(cat_map.notdefined) do
		if catargs[n] and catargs[n].all_defined == false then
			table.insert(ret,v)
		end
	end
	
	-- Add the associated race category if matched
	local norace = true
	if args['raça'] and args['raça'].d then
		local racestr = string.gsub(string.gsub(args['raça'].d, '%]%]', ''), '%[%[', '')
		for _, v in ipairs(npcrace) do
			if (v.racelink == racestr) then
		    	table.insert(ret, v.racecat)
		    	if v.addcat then
		    		for _,k in ipairs(v.addcat) do
		    			table.insert(ret, k)
		    		end
		    	end
		    	norace = false
		    end
		end
	end
	if norace then
		table.insert(ret, 'Precisa de raça')
	end
	
	-- Add the associated gender category if matched
	if args['gênero'] then
		if string.lower(args['gênero'].d or '') == 'masculino' then
			table.insert(ret, 'Personagens masculinos')
		elseif string.lower(args['gênero'].d or '') == 'feminino' then
			table.insert(ret, 'Personagens femininos')
		elseif string.lower(args['gênero'].d or '') == 'não' then
			table.insert(ret, 'Personagens sem gênero')
		end
	end

	-- Add the associated category if the parameter is valued at yes
	if args['voz'] then
		if string.lower(args['voz'].d or '') == 'sim' then
			table.insert(ret, 'NPCs com atuação de voz')
		end
	end
	
	if args['f2pvisível'] then
		if string.lower(args['f2pvisível'].d or '') == 'sim' then
			table.insert(ret, 'NPCs que são visíveis mas não interativos em mundos gratuitos')
		end
	end
	
	-- Add the associated category if the parameter is not valued at no
	if args['vendedor'] then
		if string.lower(args['vendedor'].d or '') ~= 'não' then
			table.insert(ret, 'Mercadores')
		end
	end

	if args['missão'] then
		if string.lower(args['missão'].d or '') ~= 'não' then
			table.insert(ret, 'NPCs de missões')
		end
	end
	
	-- Map category
	if catargs.mapdisp and catargs.mapdisp.all_defined == false then
		if args.mapa then
			if args.mapa.d ~= 'não' then
				if args.intmap then
					if args.intmap.d ~= 'não' then
						table.insert(ret, 'Precisa de mapa')
					end
				end
			end
		else
			if args.intmap then
				if args.intmap.d ~= 'não' then
					table.insert(ret, 'Precisa de mapa')
				end
			else
				table.insert(ret, 'Precisa de mapa')
			end
		end
	end
	
	mw.logObject(args['ações'])
	mw.logObject(args['actions_smw'])
	mw.log(infobox.isDefined(args['ações']))
	mw.log(infobox.isDefined(args['actions_smw']))
	mw.log(is_def(args['ações']))
	mw.log(is_def(args['actions_smw']))
	mw.log(string.lower(args['actions_smw'].d or '') == 'examinar')
	
	if is_def(args['ações']) then
        if string.lower(args['actions_smw'].d or '') == 'examinar' then
            table.insert(ret, 'Personagens não interativos')
        else
        	table.insert(ret, 'Personagens interativos')
        end
    end
	
	-- combine table and format category wikicode
	for i, v in ipairs(ret) do
		if (v ~= '') then
			ret[i] = string.format('[[Categoria:%s]]', v)
		end
	end

	return table.concat(ret, '')
end

return p