Module:Spawn Locations

local p = {}

local Franchise = require("Module:Franchise") local Term = require("Module:Term") local utilsCargo = require("Module:UtilsCargo") local utilsMarkup = require("Module:UtilsMarkup") local utilsTable = require("Module:UtilsTable")

function p.Main(frame) local pageName = frame:getParent.args[1] or mw.title.getCurrentTitle.subpageText local cargoResults = utilsCargo.query("LocationFeatures", "_pageName, baseGame, game", {		-- Entries referring to sublocations are not listed to avoid redudancy in the infobox list. 		-- e.g. for Rats in TWW, we wait to display Jail Maze as a habitat but not Jail.		where = utilsCargo.allOf( { subject = pageName }, "sublocations__full IS NULL" ),		sortBy = "_pageName"	})

local locationsByBaseGame = utilsTable.groupBy(cargoResults, "baseGame") local gameLists = {} local gameCount = 0 local lastGame for game, results in pairs(locationsByBaseGame) do		local locations = utilsTable.uniqueBy(results, "_pageName") -- remove duplicates locations = utilsTable.map(locations, "_pageName") local locationLinks = utilsTable.map(locations, function(page)			return Term.link(page, game)		end) gameLists[game] = locationLinks gameCount = gameCount + 1 lastGame = game end

if gameCount == 0 then return "" elseif gameCount == 1 then return utilsMarkup.list(gameLists[lastGame]) else gameLists = utilsTable.mapValues(gameLists, function(locations)			return table.concat(locations, ", ")		end) return frame:expandTemplate({			title = "Infobox Game Blocks",			args = gameLists,		}) end end

return p