Module:Necropolis packs/sandbox

From Path of Exile Wiki
Jump to navigation Jump to search

This is the module sandbox page for Module:Necropolis packs (diff).

Module documentation[view] [edit] [history] [purge]


Renders pack data for Template:Necropolis pack.

Usage

{{#invoke:Necropolis packs|function_name}}


require('Module:No globals')
local m_util = require('Module:Util')

local use_sandbox = m_util.misc.maybe_sandbox('Necropolis_packs')
local m_data = mw.loadData('Module:Necropolis_packs/data')
local m_lookup = mw.loadData('Module:Necropolis_pack_lookup/data')
local m_monsters = mw.loadData('Module:Monster_packs/data')

local function _show_monsters(pack_ids, show_areas)
	local result = {""}
	-- #pack_ids doesn't work?
	if not pack_ids[1] then
		return "No known monsters are associated with this pack."
	elseif not pack_ids[2] then
		result[#result+1] = "Pack composition (not visible through the lantern):"
	else
		result[#result+1] = "Pack composition (not visible through the lantern) - one of:"
	end
	for _, pack_id in ipairs(pack_ids) do
		local pack = m_monsters[pack_id]
		local line = "* Pack size: " .. pack.min_count .. '-' .. pack.max_count
		if pack.additional_count ~= 0 then
			line = line .. '+' .. pack.additional_count
		end
		result[#result+1] = line
		line = "** Monsters: "
		for i, monster in ipairs(pack.monsters) do
			if i ~= 1 then
				line = line .. ", "
			end
			line = line .. string.format("[[Monster:%s|%s]]", string.gsub(monster.monster_id, "_", "~"), monster.name)
		end
		result[#result+1] = line
		if pack.boss_chance ~= 0 then
			if pack.boss_count == 1 then
				line = "** Leader"
			else
				line = "** " .. pack.boss_count .. " leaders"
			end
			if pack.boss_chance == 100 then
				line = line .. ": "
			else
				line = line .. " (" .. pack.boss_chance .. "% chance): "
			end
			for i, monster in ipairs(pack.boss_monsters) do
				if i ~= 1 then
					line = line .. ", "
				end
				line = line .. string.format("[[Monster:%s|%s]]", string.gsub(monster.monster_id, "_", "~"), monster.name)
			end
			result[#result+1] = line
		end
		if show_areas then
			line = "** Areas: "
			for i, area in ipairs(pack.areas) do
				if i ~= 1 then
					line = line .. ", "
				end
				line = line .. string.format("[[Area:%s|%s]] (%s)", string.gsub(area.area_id, "_", "~"), area.name, area.weight)
			end
			result[#result+1] = line
		end
	end
	return table.concat(result, '\n')
end

local function _expand_template(data)
	return m_util.string.trim(mw.getCurrentFrame():expandTemplate{
		title = use_sandbox and 'Template:Necropolis pack/display/sandbox' or 'Template:Necropolis pack/display',
		args = {
			name = data.name,
			description = data.description,
			leader = data.leader
		}
	})
end

local function _render_pack(tpl_args)
	tpl_args = tpl_args or {}
	local pack_id = tpl_args.pack_id
	if tpl_args.item_name and not pack_id then
		local found = m_lookup[tpl_args.item_name]
		if not found then
			return
		end
		pack_id = found.pack_id
	end
	if pack_id then
		local data = m_data[pack_id]
		if tpl_args.pack_composition and data.monster_pack_ids then
			return mw.getCurrentFrame():preprocess(_expand_template(data) .. "\n" .. _show_monsters(data.monster_pack_ids, tpl_args.pack_areas))
		else
			return mw.getCurrentFrame():preprocess(_expand_template(data))
		end
	else
		local all = {"==All known packs=="}
		for _, data in pairs(m_data) do
			if data.name and data.name ~= '' then
				all[#all+1] = "===" .. data.name .. "==="
				all[#all+1] = _expand_template(data)
				if data.monster_pack_ids then
					all[#all+1] = _show_monsters(data.monster_pack_ids, true)
				end
			end
		end
		return mw.getCurrentFrame():preprocess(table.concat(all, '\n'))
	end
end

local p = {}

p.render_pack = m_util.misc.invoker_factory(_render_pack)

return p