Module:Buildingbox

--- --- Module to create an infobox for displaying on a building's wiki page. --- --- Shows the facts from the data about the specified building in an easy-to- --- read table, with a large icon, information, categories, and the flavor --- text. --- --- This should be invoked from Template:Buildingbox with the parameter of the --- building whose infobox should be shown. See the template documentation for --- more information about parameters and errors and to see examples. --- --- @module Buildingbox local Buildingbox = {}

local StyleUtils = require("Module:StyleUtils")

local Infobox = require("Module:Infobox")

local WorkshopsData = require("Module:WorkshopsData") local InstitutionsData = require("Module:InstitutionsData") local CampsData = require("Module:CampsData") local FarmsData = require("Module:FarmsData") local CollectorsData = require("Module:CollectorsData")

--region Private constants

local ARGS = { ["name"] = "name", ["purpose"] = "purpose", ["species_preference"] = "species_preference", ["specializations"] = "specializations", }

--endregion

--region Private methods

--- --- Shortcut method to expand a template with parameters --- ---@param buildingName string the name of the building ---@return string html markup returned by the template local function expandRecipeList(buildingName)

return mw.getCurrentFrame:expandTemplate{ title="Recipe", args={ building= buildingName, display="list"	} } end

--- --- Shortcut method since the size methods return two values. --- ---@param buildingName string the name of the building to check ---@return number, number the X and Y sizes local function distributeSizes(buildingName)

local sizeX, sizeY = WorkshopsData.getWorkshopSize(buildingName) if sizeX and sizeY then return sizeX, sizeY end

sizeX, sizeY = InstitutionsData.getInstitutionSize(buildingName) if sizeX and sizeY then return sizeX, sizeY end

sizeX, sizeY = CampsData.getCampSize(buildingName) if sizeX and sizeY then return sizeX, sizeY end

sizeX, sizeY = FarmsData.getFarmSize(buildingName) if sizeX and sizeY then return sizeX, sizeY end

sizeX, sizeY = CollectorsData.getCollectorSize(buildingName) return sizeX, sizeY end

--- --- Builds using the provided wikiInfobox a few header items. --- ---@param wikiInfobox table mw.html object into which we're building this ---@param buildingName string the name of the building the infobox is about ---@return table the Mediawiki html object into which we've been adding things local function makeHeaderContent(wikiInfobox, buildingName)

-- Grab the data we'll use to populate this. local description = WorkshopsData.getWorkshopDescription(buildingName) or InstitutionsData.getInstitutionDescription(buildingName) or CampsData.getCampDescription(buildingName) or FarmsData.getFarmDescription(buildingName) or CollectorsData.getCollectorDescription(buildingName) local iconFilename = WorkshopsData.getWorkshopIcon(buildingName) or InstitutionsData.getInstitutionIcon(buildingName) or CampsData.getCampIcon(buildingName) or FarmsData.getFarmIcon(buildingName) or CollectorsData.getCollectorIcon(buildingName)

-- Start the header area local header = Infobox.startNewHeader(wikiInfobox)

Infobox.makeTitle(header, buildingName) Infobox.makeFlavorText(header, description) Infobox.makeTitleIcon(header, iconFilename)

return wikiInfobox end

--- --- Builds using the provided wikiInfobox a subtable to lay out headers and --- fields. --- ---@param wikiInfobox table mw.html object into which we're building this ---@param buildingName string the name of the good the infobox is about ---@param params table of template parameters ---@return table the Mediawiki html object into which we've been adding things local function makeInnerContent(wikiInfobox, buildingName, params)

-- Grab the data we'll use to populate this. local category = WorkshopsData.getWorkshopCategory(buildingName) or InstitutionsData.getInstitutionCategory(buildingName) or CampsData.getCampCategory(buildingName) or FarmsData.getFarmCategory(buildingName) or CollectorsData.getCollectorCategory(buildingName) local recipesTable = WorkshopsData.getAllWorkshopRecipes(buildingName) or InstitutionsData.getAllInstitutionRecipes(buildingName) or CampsData.getAllCampRecipes(buildingName) or FarmsData.getAllFarmRecipes(buildingName) or CollectorsData.getAllCollectorRecipes(buildingName) local isMovable = WorkshopsData.isWorkshopMovable(buildingName) or InstitutionsData.isInstitutionMovable(buildingName) or CampsData.isCampMovable(buildingName) or FarmsData.isFarmMovable(buildingName) or CollectorsData.isCollectorMovable(buildingName) local isEssential = WorkshopsData.isWorkshopInitiallyEssential(buildingName) or InstitutionsData.isInstitutionInitiallyEssential(buildingName) or CampsData.isCampInitiallyEssential(buildingName) or FarmsData.isFarmInitiallyEssential(buildingName) or CollectorsData.isCollectorInitiallyEssential(buildingName) local sizeX, sizeY = distributeSizes(buildingName) local range = CampsData.getCampArea(buildingName) -- Workshops and -- Institutions don't have a range/area or FarmsData.getFarmArea(buildingName) -- Collectors don't have a range local storageCap = WorkshopsData.getWorkshopStorage(buildingName) -- Institutions don't have storage or CampsData.getCampStorage(buildingName) or FarmsData.getFarmStorage(buildingName) or CollectorsData.getCollectorStorage(buildingName) local numWorkplaces = WorkshopsData.getWorkshopNumberOfWorkplaces(buildingName) or InstitutionsData.getInstitutionNumberOfWorkplaces(buildingName) or CampsData.getCampNumberOfWorkplaces(buildingName) or FarmsData.getFarmNumberOfWorkplaces(buildingName) or CollectorsData.getCollectorNumberOfWorkplaces(buildingName) local constructionTime = WorkshopsData.getWorkshopConstructionTime(buildingName) or InstitutionsData.getInstitutionConstructionTime(buildingName) or CampsData.getCampConstructionTime(buildingName) or FarmsData.getFarmConstructionTime(buildingName) or CollectorsData.getCollectorConstructionTime(buildingName) local constructionGoods = WorkshopsData.getAllWorkshopRequiredGoods(buildingName) or InstitutionsData.getAllInstitutionRequiredGoods(buildingName) or CampsData.getAllCampRequiredGoods(buildingName) or FarmsData.getAllFarmRequiredGoods(buildingName) or CollectorsData.getAllCollectorRequiredGoods(buildingName) local buildingID = WorkshopsData.getWorkshopID(buildingName) or InstitutionsData.getInstitutionID(buildingName) or CampsData.getCampID(buildingName) or FarmsData.getFarmID(buildingName) or CollectorsData.getCollectorID(buildingName)

-- Start the inner table local innerTable = Infobox.startNewInnerTable(wikiInfobox)

-- we'll reuse this to mark where separators are needed in the table local needsSeparator = false

-- Start with the things from the parameters, if any for paramTitle, paramValue in pairs(params or {}) do		if paramTitle ~= nil and paramValue ~= nil then Infobox.makeInnerRow(innerTable, paramValue, false,					Infobox.toTitleCase(paramTitle), paramValue) -- Require a separator if there were any parameters. needsSeparator = true end end

needsSeparator = Infobox.makeInnerRow(innerTable, category, needsSeparator,			Infobox.TITLE_CATEGORY,			Infobox.makeCategoryIcon(category, false) .. StyleUtils.NBSP .. category) needsSeparator = Infobox.makeInnerRow(innerTable, recipesTable and #recipesTable > 0,			needsSeparator, Infobox.TITLE_RECIPES,			expandRecipeList(buildingName))

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, isMovable, needsSeparator,			Infobox.TITLE_MOVABLE, isMovable and "Yes" or "No") needsSeparator = Infobox.makeInnerRow(innerTable, isEssential, needsSeparator,			Infobox.TITLE_ESSENTIAL, isEssential and "Yes" or "No") needsSeparator = Infobox.makeInnerRow(innerTable, sizeX and sizeY,			needsSeparator, Infobox.TITLE_SIZE, sizeX .. " × " .. sizeY) needsSeparator = Infobox.makeInnerRow(innerTable, range, needsSeparator,			Infobox.TITLE_RANGE, range) needsSeparator = Infobox.makeInnerRow(innerTable, storageCap, needsSeparator,			Infobox.TITLE_STORAGE_CAPACITY, storageCap)

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, numWorkplaces, needsSeparator,			Infobox.TITLE_WORKPLACES, numWorkplaces)

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, constructionTime,			needsSeparator, Infobox.TITLE_CONSTRUCTION_TIME,			constructionTime) needsSeparator = Infobox.makeInnerRow(innerTable, constructionGoods, needsSeparator,			Infobox.TITLE_CONSTRUCTION_COST,			Infobox.writeRequiredGoodsRows(constructionGoods) )

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, buildingID, needsSeparator,			Infobox.TITLE_ID, StyleUtils.ITALIC .. buildingID .. StyleUtils.ITALIC)

-- Close the inner table, and return it with the passed context Infobox.endInnerTable(wikiInfobox, innerTable)

return wikiInfobox end

--endregion

--region Public methods

--- --- Creates an html and wiki markup to display the data in an infobox. --- --- @param frame table from template's calling context --- @return string of html and wiki markup function Buildingbox.renderBuildingbox(frame) -- Every building must have a name. local buildingName = frame.args[ARGS.name] if not buildingName or buildingName == "" then return "You must specify the name of the building. See Template:Buildingbox for examples." end

-- Use this method here to check to see whether the provided name is valid. if not ( WorkshopsData.getWorkshopID(buildingName)			or InstitutionsData.getInstitutionID(buildingName)			or CampsData.getCampID(buildingName)			or FarmsData.getFarmID(buildingName)			or CollectorsData.getCollectorID(buildingName) ) then return "Buildingbox can't find the specified building: " .. buildingName .. "."	end

-- Additional template parameters, may or may not be present. local purpose = frame.args[ARGS.purpose] local speciesPref = frame.args[ARGS.species_preference] local specializations = frame.args[ARGS.specializations]

local wikiInfobox = Infobox.startNewInfobox makeHeaderContent(wikiInfobox, buildingName) makeInnerContent(wikiInfobox, buildingName,			{ [ARGS.purpose] = purpose, [ARGS.species_preference] = speciesPref,			 [ARGS.specializations] = specializations }) return wikiInfobox end

--endregion

return Buildingbox