Module:BuildingData: Difference between revisions

From Against the Storm Official Wiki
(extracted normalize methods to new Utility module)
m (changed function scope)
Line 191: Line 191:


-- normalize input
-- normalize input
     local strArg = BuildingData.normalizeName(strArg)
     local strArg = Utility.normalizeBuildingName(strArg)
-- Get it from the big table below and return it.
-- Get it from the big table below and return it.

Revision as of 18:11, 12 February 2023

Documentation for this module may be created at Module:BuildingData/doc

-------------------------------------------------------------------------------
-- This module primarily supplies data and lookup functions for other modules 
-- that support templates like {{Building_link}}.
-- https://hoodedhorse.com/wiki/Against_the_Storm/Template:Building_link
-- 
-- The main data table stores all available data about buildings themselves 
-- and relies on other modules to store relationships between buildings and 
-- products, services, etc.
--
-- The helper functions include getters (to keep the data hidden) and a large
-- deconfliction method to provide some robustness when using the template
-- and from other Lua modules. Looking up a building requires using in-game 
-- names, but forgives small differences in spacing, apostrophes, and plurals.

-- Please help keep this table updated as the game is updated.
-- @module BuildingData
local BuildingData = {}

--
-- Dependencies
--
RecipeData = RecipeData or require("Module:RecipeData") -- used to get recipe data
Utility = Utility or require("Module:Utility") -- need normalize functions



-- 
-- Constants
-- 
-- Specializations
local S_ALCH = "Alchemy"
local S_BREW = "Brewing"
local S_CLOT = "Cloth"
local S_ENGI = "Engineering"
local S_MEAT = "Meat production"
local S_WARM = "Warmth"
local S_WOOD = "Wood"

-- Resource names of building costs
local C_BRICK = "Bricks"
local C_FABRI = "Fabric"
local C_PARTS = "Parts"
local C_PIPES = "Pipes"
local C_PLANK = "Planks"

-- Rain types for rain engines
local R_DRIZZ = "Drizzle Water"
local R_CLEAR = "Clearance Water"
local R_STORM = "Storm Water"



--
-- Class Variables
--



-------------------------------------------------------------------------------
-- Primary data table for this module.
-- 
-- This table stores the details of buildings according to in-game information.
-- A design decision of this table is to make the key the same as the page 
-- name, so that whenever .page is referenced, it can be used again to retrieve 
-- the rest of the data. (The lookup method will handle converting it to 
-- lowercase.)
-- Structure:
-- @key a lowercase version of the building name, with the same spaces, 
-- apostrophes, singular, and spelling
-- @field iconfile a string of the filename.png of the icon used in the 
-- game, case-sensitive and must include extension, but without the "File:"
-- @field page the name of the wiki page, case-sensitive, but otherwise 
-- must be the same as the key
-- @field spec1[opt] the first specialization listed in the in-game 
-- encyclopedia (use the constants, above), if any
-- @field spec2[opt] the second specialization listed in the in-game 
-- encyclopedia (use the constants, above), if any
-- @field cost1 the first listed resource cost in the in-game encyclopedia 
-- (use constants, above)
-- @field cost2 the second listed resource cost in the in-game encyclopedia 
-- (use constants, above), if any
-- @field cost3 the third listed resource cost in the in-game encyclopedia 
-- (use constants, above), if any
-- @field workers the number of worker slots
-- @field raintype the color of rain used in the Rain Engine of this building 
-- (use constants, above), if any
-- @field description the in-game description text, in plain text
-- @table tBuildingData the primary data table for buildings
local tBuildingData = { 
	
	-- Starting Buildings
	["ancient hearth"] = {iconfile="Small Hearth icon.png", page="Ancient Hearth", spec1=S_WARM, workers=1, description="The heart of the colony is protected by the Holy Flame. {{Villagers}} gather here to rest, eat, and receive clothing. If the fire goes out, people will lose hope. Can't be moved. Size: 4x4."},
	["main warehouse"] = {iconfile="Main_Storage_icon.png", page="Main Warehouse"},
	
	-- Camps
	["foragers' camp"] = {iconfile="Forager's Camp icon", page="Foragers' Camp"},
	["harvesters' camp"] = {iconfile="Harvester Camp icon.png", page="Harvesters' Camp"},
	["herbalists' camp"] = {iconfile="Herbalist's_Camp_icon.png", page="Herbalists' Camp"},
	["stonecutters' camp"] = {iconfile="Stonecutter's Camp icon.png", page="Stonecutters' Camp"},
	["trappers' camp"] = {iconfile="Trapper's Camp icon.png", page="Trappers' Camp"},
	["woodcutters' camp"] = {iconfile="Woodcutters Camp icon", page="Woodcutters' Camp"},
	
	-- Farms
	["farm field"] = {iconfile="Farmfield_icon.png", page="Farm Field"},
	["greenhouse"] = {iconfile="Greenhouse_icon.png", page="Greenhouse"},
	["herb garden"] = {iconfile="HerbGarden_icon.png", page="Herb Garden"},
	["plantation"] = {iconfile="Plantation_icon.png", page="Plantation"},
	["small farm"] = {iconfile="SmallFarm_icon.png", page="Small Farm"},
	
	-- Food production
	["bakery"] = {iconfile="Bakery_icon.png", page="Bakery"},
	["butcher"] = {iconfile="Butcher_icon.png", page="Butcher"},
	["cellar"] = {iconfile="Cellar_icon.png", page="Cellar"},
	["cookhouse"] = {iconfile="Cookhouse_icon.png", page="Cookhouse"},
	["field kitchen"] = {iconfile="Field_Kitchen_icon.png", page="Field Kitchen"},
	["granary"] = {iconfile="Granary_icon.png", page="Granary"},
	["grill"] = {iconfile="Grill_icon.png", page="Grill"},
	["ranch"] = {iconfile="Ranch_icon.png", page="Ranch"},
	["smokehouse"] = {iconfile="Smokehouse_icon.png", page="Smokehouse"},
	
	-- Housing
	["shelter"] = {iconfile="Shelter icon.png", page="Shelter"},
	["big shelter"] = {iconfile="Big Shelter icon.png", page="Big Shelter"},
	["human house"] = {iconfile="Human House icon.png", page="Human House"},
	["beaver house"] = {iconfile="Beaver House icon.png", page="Beaver House"},
	["lizard house"] = {iconfile="Lizard House icon.png", page="Lizard House"},
	["harpy house"] = {iconfile="Harpy House icon.png", page="Harpy House"},
	
	-- Industry
	["crude workstation"] = {iconfile="Crude_Workstation_icon.png", page="Crude Workstation"},
	["makeshift post"] = {iconfile="Makeshift_Post_icon.png", page="Makeshift Post"},
	["advanced rain collector"] = {iconfile="Advanced_Rain_Collector_icon.png", page="Advanced Rain Collector", spec1=S_ENGI, spec2=S_ALCH, cost1=C_PIPES, cost2=C_PARTS, cost3=C_PLANK, description="Can collect [[infused rainwater]] used for crafting and powering [[Rain Engines]] in production buildings. The type of collected rainwater depends on the [[season]]. Can't be moved. Size: 3x2."},
	["alchemist's hut"] = {iconfile="Alchemist_Hut_icon.png", page="Alchemist's Hut", spec1=S_ALCH, spec2=S_BREW, cost1=C_PLANK, cost2=C_BRICK, workers=2, recipe1="Crystalized Dew", grade1=2, recipe2="Cosmetics", grade2=2, recipe3="Wine", grade3=2, description="Can produce: {{rl|Crystalized Dew}} {{P2Star}}, {{rl|Cosmetics}} {{P2star}}, {{rl|Wine}} {{P2Star}}. Can use: {{rl|Clearance Water}}. Can't be moved. Size: 3x2."},
	["apothecary"] = {iconfile="Apothecary_icon.png", page="Apothecary", spec1=S_ALCH, cost1=C_PLANK, cost2=C_BRICK, workers=2, recipe1="Cosmetics", grade1=2, recipe2="Incense", grade2=2, recipe3="Biscuits", grade3=2, description="Can produce: {{rl|Cosmetics}} {{P2Star}}, {{rl|Incense}} {{P2Star}}, {{rl|Biscuits}} {{P2Star}}. Can use: {{rl|Clearance Water}}. Can't be moved. Size: 3x3."},
	["artisan"] = {iconfile="Artisan_icon.png", page="Artisan"},
	["brewery"] = {iconfile="Brewery_icon.png", page="Brewery"},
	["brick oven"] = {iconfile="Brick_Oven_icon.png", page="Brick Oven"},
	["brickyard"] = {iconfile="Brickyard_icon.png", page="Brickyard"},
	["carpenter"] = {iconfile="Carpenter_icon.png", page="Carpenter"},
	["clothier"] = {iconfile="Clothier_icon.png", page="Clothier"},
	["cooperage"] = {iconfile="Cooperage_icon.png", page="Cooperage"},
	["druid's hut"] = {iconfile="Druid_icon.png", page="Druid's Hut"},
	["flawless brewery"] = {iconfile="Brewery_icon.png", page="Flawless Brewery"},
	["flawless rain mill"] = {iconfile="Rain_Mill_icon.png", page="Flawless Rain Mill"},
	["furnace"] = {iconfile="Furnace_icon.png", page="Furnace"},
	["kiln"] = {iconfile="Kiln_icon.png", page="Kiln"},
	["leatherworker"] = {iconfile="Leatherworks_icon.png", page="Leatherworker"},
	["lumber mill"] = {iconfile="Lumbermill_icon.png", page="Lumber Mill"},
	["mine"] = {iconfile="Mine_icon.png", page="Mine"},
	["press"] = {iconfile="Press_icon.png", page="Press"},
	["provisioner"] = {iconfile="Provisioner_icon.png", page="Provisioner"},
	["rain collector"] = {iconfile="Rain_Collector_icon.png", page="Rain Collector"},
	["rain mill"] = {iconfile="Rain_Mill_icon.png", page="Rain Mill"},
	["scribe"] = {iconfile="Scribe_icon.png", page="Scribe"},
	["smelter"] = {iconfile="Smelter_icon.png", page="Smelter"},
	["toolshop"] = {iconfile="Toolshop_icon.png", page="Toolshop"},
	["weaver"] = {iconfile="Weaver_icon.png", page="Weaver"},
	
	-- City Buildings
	["archaeologist's office"] = {iconfile="Archeologist_office_icon.png", page="Archaeologist's Office", cost1=C_PLANK, cost2=C_BRICK, cost3=C_FABRI, description="A building designed to help you study the past. Can be [[upgrade]]d to locate [[archaeological discoveries]] or improve [[exploration]] capabilities. Can be moved for: 5 {{rl|Wood}}. Size: 3x3."},
	["small hearth"] = {iconfile="Temporary_Hearth_icon.png", page="Small Hearth"},
	["warehouse"] = {iconfile="Storage_icon.png", page="Warehouse"},
	["trading post"] = {iconfile="Trading_Post_icon.png", page="Trading Post"},
	["blight post"] = {iconfile="Blight_Post_icon.png", page="Blight Post"},
	["hydrant"] = {iconfile="Hydrant_icon.png", page="Hydrant"},
	["forsaken altar"] = {iconfile="Altar_icon.png", page="Forsaken Altar"},
	
	-- Service Buildings
	["bath house"] = {iconfile="Bath_House_icon.png", page="Bath House"},
	["clan hall"] = {iconfile="Clan_Hall_icon.png", page="Clan Hall"},
	["explorers' lodge"] = {iconfile="Explorers_Lodge_icon.png", page="Explorers' Lodge"},
	["guild house"] = {iconfile="Guild_House_icon.png", page="Guild House"},
	["monastery"] = {iconfile="Monastery_icon.png", page="Monastery"},
	["tavern"] = {iconfile="Tavern_icon.png", page="Tavern"},
	["temple"] = {iconfile="Temple_icon.png", page="Temple"},
}



-------------------------------------------------------------------------------
-- Main lookup function
-- Accepts the in-game name and returns the name of the page on the wiki
-- associated with that in-game item, resource, building, etc.
-------------------------------------------------------------------------------



-- returns the whole data table for the specified key
-- need to run normalize function first
function BuildingData.getData(strArg)

	-- normalize input
    local strArg = Utility.normalizeBuildingName(strArg)
	
	-- Get it from the big table below and return it.
    return tBuildingData[strArg]
end



-- simpler version if all that's needed is the iconfile.
-- error handling by the calling module is required.
function BuildingData.getIconFilename(strArg)

	local data = getData(strArg)
	
	-- if this particular data block doesn't have a iconfile, this will return nil
	-- therefore, error handling will be necessary
	return data.iconfile or nil
end



-- simpler version if all that's needed is the page name.
-- error handling by the calling module is required.
function BuildingData.getPagename(strArg)

	local data = getData(strArg)
	
	-- if this particular data block doesn't have a page name, this will return nil
	-- therefore, error handling will be necessary
	return data.page or nil
end



-- simpler version if all that's needed is the description.
-- error handling by the calling module is required.
function BuildingData.getDescription(strArg)

	local data = getData(strArg)
	
	-- if this particular data block doesn't have a description, this will return nil
	-- therefore, error handling will be necessary
	return data.description or nil
end



-- Return this class when required into another module.
return BuildingData