Module:Building data: Difference between revisions
From Beyond These Stars Official Wiki
m Some fields are not in the data |
adding icon address |
||
| Line 925: | Line 925: | ||
display_name = record.DisplayNameTerm_en, | display_name = record.DisplayNameTerm_en, | ||
description = record.DescriptionTerm_en, | description = record.DescriptionTerm_en, | ||
icon = record.IconAddress, | |||
construction_resources = {}, | construction_resources = {}, | ||
construction_time = tonumber(record.ConstructionTime), | construction_time = tonumber(record.ConstructionTime), | ||
Revision as of 01:20, 18 September 2026
Documentation for this module may be created at Module:Building data/doc
local p = {}
--#region Cargo-related type definitions and constants
--- Cargo row from querying Buildings; all values are strings at runtime.
---@class CargoBuildingRecord
---@field page_name string|nil
---@field guid string|nil
---@field Name string|nil
---@field Category string|nil
---@field DisplayNameTerm_en string|nil
---@field DisplayNamePluralTerm_en string|nil
---@field DescriptionTerm_en string|nil
---@field UpgradeTerm string|nil
---@field UpgradeTerm_en string|nil
---@field IconAddress string|nil
---@field PlacementRules_1 string|nil
---@field PlacementRules_2 string|nil
---@field PlacementRules_3 string|nil
---@field PlacementRules_4 string|nil
---@field PlacementRules_5 string|nil
---@field PlacementRules_6 string|nil
---@field AnchorBuildingNames_1 string|nil
---@field AnchorBuildingNames_2 string|nil
---@field ConstructionResources string|nil
---@field ConstructionResources_1_Name string|nil
---@field ConstructionResources_1_Amount string|nil
---@field ConstructionResources_2_Name string|nil
---@field ConstructionResources_2_Amount string|nil
---@field ConstructionResources_3_Name string|nil
---@field ConstructionResources_3_Amount string|nil
---@field ConstructionResources_4_Name string|nil
---@field ConstructionResources_4_Amount string|nil
---@field ConstructionResources_5_Name string|nil
---@field ConstructionResources_5_Amount string|nil
---@field ConstructionResources_6_Name string|nil
---@field ConstructionResources_6_Amount string|nil
---@field SecondaryPrefabAddresses_1 string|nil
---@field SecondaryPrefabAddresses_2 string|nil
---@field RepairResources_1_Name string|nil
---@field RepairResources_1_Amount string|nil
---@field RepairResources_2_Name string|nil
---@field RepairResources_2_Amount string|nil
---@field RepairResources_3_Name string|nil
---@field RepairResources_3_Amount string|nil
---@field RepairResources_4_Name string|nil
---@field RepairResources_4_Amount string|nil
---@field RepairResources_5_Name string|nil
---@field RepairResources_5_Amount string|nil
---@field RepairResources_6_Name string|nil
---@field RepairResources_6_Amount string|nil
---@field ConstructionTime string|nil
---@field ConstructionPeepCount string|nil
---@field UnlockMode string|nil
---@field UnlockValues string|nil
---@field UnlockValues_1 string|nil
---@field UnlockValues_2 string|nil
---@field UnlockValues_3 string|nil
---@field UnlockValues_4 string|nil
---@field RequiredRecords_1 string|nil
---@field UpgradePointsEarned string|nil
---@field LockedInDemo string|nil
---@field FootprintIconAddress string|nil
---@field TechTreeDisplay string|nil
---@field TechTreePrevious string|nil
---@field TechTreeRow string|nil
---@field AdjacencyBonuses string|nil
---@field AdjacencyBonuses_1_GroupName string|nil
---@field AdjacencyBonuses_1_Evaluator string|nil
---@field AdjacencyBonuses_1_EvaluatorThreshold string|nil
---@field AdjacencyBonuses_1_Action string|nil
---@field AdjacencyBonuses_1_ActionNames string|nil
---@field AdjacencyBonuses_1_ActionNames_1 string|nil
---@field AdjacencyBonuses_1_ActionNames_2 string|nil
---@field AdjacencyBonuses_1_ActionNames_3 string|nil
---@field AdjacencyBonuses_1_ActionNames_4 string|nil
---@field AdjacencyBonuses_1_ActionNames_5 string|nil
---@field AdjacencyBonuses_1_EvaluatorValue string|nil
---@field AdjacencyBonuses_1_ActionValue string|nil
---@field AdjacencyBonuses_2_GroupName string|nil
---@field AdjacencyBonuses_2_Evaluator string|nil
---@field AdjacencyBonuses_2_EvaluatorThreshold string|nil
---@field AdjacencyBonuses_2_Action string|nil
---@field AdjacencyBonuses_2_ActionNames string|nil
---@field AdjacencyBonuses_2_ActionNames_1 string|nil
---@field AdjacencyBonuses_2_ActionNames_2 string|nil
---@field AdjacencyBonuses_2_ActionNames_3 string|nil
---@field AdjacencyBonuses_2_ActionNames_4 string|nil
---@field AdjacencyBonuses_2_ActionNames_5 string|nil
---@field AdjacencyBonuses_2_EvaluatorValue string|nil
---@field AdjacencyBonuses_2_ActionValue string|nil
---@field AdjacencyBonuses_3_GroupName string|nil
---@field AdjacencyBonuses_3_Evaluator string|nil
---@field AdjacencyBonuses_3_EvaluatorThreshold string|nil
---@field AdjacencyBonuses_3_Action string|nil
---@field AdjacencyBonuses_3_ActionNames string|nil
---@field AdjacencyBonuses_3_ActionNames_1 string|nil
---@field AdjacencyBonuses_3_ActionNames_2 string|nil
---@field AdjacencyBonuses_3_ActionNames_3 string|nil
---@field AdjacencyBonuses_3_ActionNames_4 string|nil
---@field AdjacencyBonuses_3_EvaluatorValue string|nil
---@field AdjacencyBonuses_3_ActionValue string|nil
---@field AdjacencyBonuses_4_GroupName string|nil
---@field AdjacencyBonuses_4_Evaluator string|nil
---@field AdjacencyBonuses_4_EvaluatorThreshold string|nil
---@field AdjacencyBonuses_4_Action string|nil
---@field AdjacencyBonuses_4_ActionNames string|nil
---@field AdjacencyBonuses_4_EvaluatorValue string|nil
---@field AdjacencyBonuses_4_ActionValue string|nil
---@field OperationRules string|nil
---@field OperationRules_1 string|nil
---@field OperationRules_2 string|nil
---@field OperationRules_3 string|nil
---@field OperationRules_4 string|nil
---@field OperationRules_5 string|nil
---@field OperationRules_6 string|nil
---@field OperationRules_7 string|nil
---@field OperationRules_8 string|nil
---@field OperationRules_9 string|nil
---@field OperationRules_10 string|nil
---@field OperationRules_11 string|nil
---@field OperationRules_12 string|nil
---@field OperationRules_13 string|nil
---@field MaxPeeps string|nil
---@field PeepExhaustionRemoved string|nil
---@field PeepAgeAdded string|nil
---@field PeepHappinessAdded string|nil
---@field PeepHappinessCost string|nil
---@field PollutionOutputMode string|nil
---@field SourceOfOxygenRange string|nil
---@field Resources string|nil
---@field Resources_1_Name string|nil
---@field Resources_1_Maximum string|nil
---@field Resources_1_StorageMode string|nil
---@field Resources_1_StartFull string|nil
---@field Resources_1_FetchInRange string|nil
---@field Resources_1_CanBeShared string|nil
---@field Resources_1_CycleThoughResourceSources string|nil
---@field Resources_1_GatheringMode string|nil
---@field Resources_1_DistributionMode string|nil
---@field Resources_1_DeliverInRange string|nil
---@field Resources_1_VehicleFetchsAndDelivers string|nil
---@field Resources_2_Name string|nil
---@field Resources_2_Maximum string|nil
---@field Resources_2_StorageMode string|nil
---@field Resources_2_StartFull string|nil
---@field Resources_2_FetchInRange string|nil
---@field Resources_2_CanBeShared string|nil
---@field Resources_2_CycleThoughResourceSources string|nil
---@field Resources_2_GatheringMode string|nil
---@field Resources_2_DistributionMode string|nil
---@field Resources_2_DeliverInRange string|nil
---@field Resources_2_VehicleFetchsAndDelivers string|nil
---@field Resources_3_Name string|nil
---@field Resources_3_Maximum string|nil
---@field Resources_3_StorageMode string|nil
---@field Resources_3_StartFull string|nil
---@field Resources_3_FetchInRange string|nil
---@field Resources_3_CanBeShared string|nil
---@field Resources_3_CycleThoughResourceSources string|nil
---@field Resources_3_GatheringMode string|nil
---@field Resources_3_DistributionMode string|nil
---@field Resources_3_DeliverInRange string|nil
---@field Resources_3_VehicleFetchsAndDelivers string|nil
---@field Resources_4_Name string|nil
---@field Resources_4_Maximum string|nil
---@field Resources_4_StorageMode string|nil
---@field Resources_4_StartFull string|nil
---@field Resources_4_FetchInRange string|nil
---@field Resources_4_CanBeShared string|nil
---@field Resources_4_CycleThoughResourceSources string|nil
---@field Resources_4_GatheringMode string|nil
---@field Resources_4_DistributionMode string|nil
---@field Resources_4_DeliverInRange string|nil
---@field Resources_4_VehicleFetchsAndDelivers string|nil
---@field Resources_5_Name string|nil
---@field Resources_5_Maximum string|nil
---@field Resources_5_StorageMode string|nil
---@field Resources_5_StartFull string|nil
---@field Resources_5_FetchInRange string|nil
---@field Resources_5_CanBeShared string|nil
---@field Resources_5_CycleThoughResourceSources string|nil
---@field Resources_5_GatheringMode string|nil
---@field Resources_5_DistributionMode string|nil
---@field Resources_5_DeliverInRange string|nil
---@field Resources_5_VehicleFetchsAndDelivers string|nil
---@field Resources_6_Name string|nil
---@field Resources_6_Maximum string|nil
---@field Resources_6_StorageMode string|nil
---@field Resources_6_StartFull string|nil
---@field Resources_6_FetchInRange string|nil
---@field Resources_6_CanBeShared string|nil
---@field Resources_6_CycleThoughResourceSources string|nil
---@field Resources_6_GatheringMode string|nil
---@field Resources_6_DistributionMode string|nil
---@field Resources_6_DeliverInRange string|nil
---@field Resources_6_VehicleFetchsAndDelivers string|nil
---@field Resources_7_Name string|nil
---@field Resources_7_Maximum string|nil
---@field Resources_7_StorageMode string|nil
---@field Resources_7_StartFull string|nil
---@field Resources_7_FetchInRange string|nil
---@field Resources_7_CanBeShared string|nil
---@field Resources_7_CycleThoughResourceSources string|nil
---@field Resources_7_GatheringMode string|nil
---@field Resources_7_DistributionMode string|nil
---@field Resources_7_DeliverInRange string|nil
---@field Resources_7_VehicleFetchsAndDelivers string|nil
---@field Resources_8_Name string|nil
---@field Resources_8_Maximum string|nil
---@field Resources_8_StorageMode string|nil
---@field Resources_8_StartFull string|nil
---@field Resources_8_FetchInRange string|nil
---@field Resources_8_CanBeShared string|nil
---@field Resources_8_CycleThoughResourceSources string|nil
---@field Resources_8_GatheringMode string|nil
---@field Resources_8_DistributionMode string|nil
---@field Resources_8_DeliverInRange string|nil
---@field Resources_8_VehicleFetchsAndDelivers string|nil
---@field Resources_9_Name string|nil
---@field Resources_9_Maximum string|nil
---@field Resources_9_StorageMode string|nil
---@field Resources_9_StartFull string|nil
---@field Resources_9_FetchInRange string|nil
---@field Resources_9_CanBeShared string|nil
---@field Resources_9_CycleThoughResourceSources string|nil
---@field Resources_9_GatheringMode string|nil
---@field Resources_9_DistributionMode string|nil
---@field Resources_9_DeliverInRange string|nil
---@field Resources_9_VehicleFetchsAndDelivers string|nil
---@field ResourceGroups string|nil
---@field ResourceGroups_1_Type string|nil
---@field ResourceGroups_1_Maximum string|nil
---@field ResourceGroups_1_GatheringMode string|nil
---@field ResourceGroups_1_DistributionMode string|nil
---@field ResourceGroups_1_StartFullResource string|nil
---@field ResourceGroups_2_Type string|nil
---@field ResourceGroups_2_Maximum string|nil
---@field ResourceGroups_2_GatheringMode string|nil
---@field ResourceGroups_2_DistributionMode string|nil
---@field ResourceGroups_2_StartFullResource string|nil
---@field DefinedResourceLists string|nil
---@field DefinedResourceLists_2_Name string|nil
---@field DefinedResourceLists_2_Maximum string|nil
---@field DefinedResourceLists_2_StorageMode string|nil
---@field DefinedResourceLists_2_StartFull string|nil
---@field DefinedResourceLists_2_FetchInRange string|nil
---@field DefinedResourceLists_2_CanBeShared string|nil
---@field DefinedResourceLists_2_CycleThoughResourceSources string|nil
---@field DefinedResourceLists_2_GatheringMode string|nil
---@field DefinedResourceLists_2_DistributionMode string|nil
---@field DefinedResourceLists_2_DeliverInRange string|nil
---@field DefinedResourceLists_2_VehicleFetchsAndDelivers string|nil
---@field DefaultFetchMode string|nil
---@field DefaultDeliveryMode string|nil
---@field FetchTime string|nil
---@field DeliveryTime string|nil
---@field TotalStorageMaximum string|nil
---@field MaxSeedSlots string|nil
---@field BuildingTasks string|nil
---@field PlayerSelectableTasks_1 string|nil
---@field PlayerSelectableTasks_2 string|nil
---@field PlayerSelectableTasks_3 string|nil
---@field SourceDefinition string|nil
---@field Hotkey string|nil
---@field ConstructionMustReplace string|nil
---@field AutoUnlock string|nil
---@field TechTreeListPreviousExit string|nil
---@field TechTreeListEntry string|nil
---@field TechTreeLineVerticalOffset string|nil
---@field PowerRange string|nil
---@field PeepEnergyAdded string|nil
---@field PeepEnergyCost string|nil
--- Cargo row from querying BuildingTasks; all values are strings at runtime.
---@class CargoBuildingTasksRecord
---@field BuildingTasks_1_Name string|nil
---@field BuildingTasks_1_InitialState string|nil
---@field BuildingTasks_1_Time string|nil
---@field BuildingTasks_1_MinimumTimeDelta string|nil
---@field BuildingTasks_1_Outputs_1_Type string|nil
---@field BuildingTasks_1_Outputs_1_Resource string|nil
---@field BuildingTasks_1_Outputs_1_Value string|nil
---@field BuildingTasks_1_Outputs_2_Type string|nil
---@field BuildingTasks_1_Outputs_2_Resource string|nil
---@field BuildingTasks_1_Outputs_2_Value string|nil
---@field BuildingTasks_1_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_1_Inputs_1_Type string|nil
---@field BuildingTasks_1_Inputs_1_Resource string|nil
---@field BuildingTasks_1_Inputs_1_Value string|nil
---@field BuildingTasks_1_Inputs_2_Type string|nil
---@field BuildingTasks_1_Inputs_2_Resource string|nil
---@field BuildingTasks_1_Inputs_2_Value string|nil
---@field BuildingTasks_2_Name string|nil
---@field BuildingTasks_2_InitialState string|nil
---@field BuildingTasks_2_Time string|nil
---@field BuildingTasks_2_MinimumTimeDelta string|nil
---@field BuildingTasks_2_Outputs_1_Type string|nil
---@field BuildingTasks_2_Outputs_1_Resource string|nil
---@field BuildingTasks_2_Outputs_1_Value string|nil
---@field BuildingTasks_2_Outputs_2_Type string|nil
---@field BuildingTasks_2_Outputs_2_Resource string|nil
---@field BuildingTasks_2_Outputs_2_Value string|nil
---@field BuildingTasks_2_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_2_Inputs_1_Type string|nil
---@field BuildingTasks_2_Inputs_1_Resource string|nil
---@field BuildingTasks_2_Inputs_1_Value string|nil
---@field BuildingTasks_2_Inputs_2_Type string|nil
---@field BuildingTasks_2_Inputs_2_Resource string|nil
---@field BuildingTasks_2_Inputs_2_Value string|nil
---@field BuildingTasks_3_Name string|nil
---@field BuildingTasks_3_InitialState string|nil
---@field BuildingTasks_3_Time string|nil
---@field BuildingTasks_3_MinimumTimeDelta string|nil
---@field BuildingTasks_3_Outputs_1_Type string|nil
---@field BuildingTasks_3_Outputs_1_Resource string|nil
---@field BuildingTasks_3_Outputs_1_Value string|nil
---@field BuildingTasks_3_Outputs_2_Type string|nil
---@field BuildingTasks_3_Outputs_2_Resource string|nil
---@field BuildingTasks_3_Outputs_2_Value string|nil
---@field BuildingTasks_3_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_3_Inputs_1_Type string|nil
---@field BuildingTasks_3_Inputs_1_Resource string|nil
---@field BuildingTasks_3_Inputs_1_Value string|nil
---@field BuildingTasks_3_Inputs_2_Type string|nil
---@field BuildingTasks_3_Inputs_2_Resource string|nil
---@field BuildingTasks_3_Inputs_2_Value string|nil
---@field BuildingTasks_4_Name string|nil
---@field BuildingTasks_4_InitialState string|nil
---@field BuildingTasks_4_Time string|nil
---@field BuildingTasks_4_MinimumTimeDelta string|nil
---@field BuildingTasks_4_Outputs_1_Type string|nil
---@field BuildingTasks_4_Outputs_1_Resource string|nil
---@field BuildingTasks_4_Outputs_1_Value string|nil
-- -@field BuildingTasks_4_Outputs_2_Type string|nil
-- -@field BuildingTasks_4_Outputs_2_Resource string|nil
-- -@field BuildingTasks_4_Outputs_2_Value string|nil
---@field BuildingTasks_4_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_4_Inputs_1_Type string|nil
---@field BuildingTasks_4_Inputs_1_Resource string|nil
---@field BuildingTasks_4_Inputs_1_Value string|nil
---@field BuildingTasks_4_Inputs_2_Type string|nil
---@field BuildingTasks_4_Inputs_2_Resource string|nil
---@field BuildingTasks_4_Inputs_2_Value string|nil
---@field BuildingTasks_5_Name string|nil
---@field BuildingTasks_5_InitialState string|nil
---@field BuildingTasks_5_Time string|nil
---@field BuildingTasks_5_MinimumTimeDelta string|nil
---@field BuildingTasks_5_Outputs_1_Type string|nil
---@field BuildingTasks_5_Outputs_1_Resource string|nil
---@field BuildingTasks_5_Outputs_1_Value string|nil
-- -@field BuildingTasks_5_Outputs_2_Type string|nil
-- -@field BuildingTasks_5_Outputs_2_Resource string|nil
-- -@field BuildingTasks_5_Outputs_2_Value string|nil
---@field BuildingTasks_5_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_5_Inputs_1_Type string|nil
---@field BuildingTasks_5_Inputs_1_Resource string|nil
---@field BuildingTasks_5_Inputs_1_Value string|nil
---@field BuildingTasks_5_Inputs_2_Type string|nil
---@field BuildingTasks_5_Inputs_2_Resource string|nil
---@field BuildingTasks_5_Inputs_2_Value string|nil
---@field BuildingTasks_6_Name string|nil
---@field BuildingTasks_6_InitialState string|nil
---@field BuildingTasks_6_Time string|nil
---@field BuildingTasks_6_MinimumTimeDelta string|nil
---@field BuildingTasks_6_Outputs_1_Type string|nil
---@field BuildingTasks_6_Outputs_1_Resource string|nil
---@field BuildingTasks_6_Outputs_1_Value string|nil
---@field BuildingTasks_6_Outputs_2_Type string|nil
---@field BuildingTasks_6_Outputs_2_Resource string|nil
---@field BuildingTasks_6_Outputs_2_Value string|nil
---@field BuildingTasks_6_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_6_Inputs_1_Type string|nil
---@field BuildingTasks_6_Inputs_1_Resource string|nil
---@field BuildingTasks_6_Inputs_1_Value string|nil
---@field BuildingTasks_6_Inputs_2_Type string|nil
---@field BuildingTasks_6_Inputs_2_Resource string|nil
---@field BuildingTasks_6_Inputs_2_Value string|nil
local QUERIES = {
BUILDINGS = {
TABLE = "Buildings",
WHERE = "page_name",
FIELDS = {
"page_name",
"guid",
"Name",
"Category",
"DisplayNameTerm_en",
"DisplayNamePluralTerm_en",
"DescriptionTerm_en",
"UpgradeTerm",
"UpgradeTerm_en",
"IconAddress",
"PlacementRules_1",
"PlacementRules_2",
"PlacementRules_3",
"PlacementRules_4",
"PlacementRules_5",
"PlacementRules_6",
"AnchorBuildingNames_1",
"AnchorBuildingNames_2",
"ConstructionResources",
"ConstructionResources_1_Name",
"ConstructionResources_1_Amount",
"ConstructionResources_2_Name",
"ConstructionResources_2_Amount",
"ConstructionResources_3_Name",
"ConstructionResources_3_Amount",
"ConstructionResources_4_Name",
"ConstructionResources_4_Amount",
"ConstructionResources_5_Name",
"ConstructionResources_5_Amount",
"ConstructionResources_6_Name",
"ConstructionResources_6_Amount",
"SecondaryPrefabAddresses_1",
"SecondaryPrefabAddresses_2",
"RepairResources_1_Name",
"RepairResources_1_Amount",
"RepairResources_2_Name",
"RepairResources_2_Amount",
"RepairResources_3_Name",
"RepairResources_3_Amount",
"RepairResources_4_Name",
"RepairResources_4_Amount",
"RepairResources_5_Name",
"RepairResources_5_Amount",
"RepairResources_6_Name",
"RepairResources_6_Amount",
"ConstructionTime",
"ConstructionPeepCount",
"UnlockMode",
"UnlockValues",
"UnlockValues_1",
"UnlockValues_2",
"UnlockValues_3",
"UnlockValues_4",
"RequiredRecords_1",
"UpgradePointsEarned",
"LockedInDemo",
"FootprintIconAddress",
"TechTreeDisplay",
"TechTreePrevious",
"TechTreeRow",
"AdjacencyBonuses",
"AdjacencyBonuses_1_GroupName",
"AdjacencyBonuses_1_Evaluator",
"AdjacencyBonuses_1_EvaluatorThreshold",
"AdjacencyBonuses_1_Action",
"AdjacencyBonuses_1_ActionNames",
"AdjacencyBonuses_1_ActionNames_1",
"AdjacencyBonuses_1_ActionNames_2",
"AdjacencyBonuses_1_ActionNames_3",
"AdjacencyBonuses_1_ActionNames_4",
"AdjacencyBonuses_1_ActionNames_5",
"AdjacencyBonuses_1_EvaluatorValue",
"AdjacencyBonuses_1_ActionValue",
"AdjacencyBonuses_2_GroupName",
"AdjacencyBonuses_2_Evaluator",
"AdjacencyBonuses_2_EvaluatorThreshold",
"AdjacencyBonuses_2_Action",
"AdjacencyBonuses_2_ActionNames",
"AdjacencyBonuses_2_ActionNames_1",
"AdjacencyBonuses_2_ActionNames_2",
"AdjacencyBonuses_2_ActionNames_3",
"AdjacencyBonuses_2_ActionNames_4",
"AdjacencyBonuses_2_ActionNames_5",
"AdjacencyBonuses_2_EvaluatorValue",
"AdjacencyBonuses_2_ActionValue",
"AdjacencyBonuses_3_GroupName",
"AdjacencyBonuses_3_Evaluator",
"AdjacencyBonuses_3_EvaluatorThreshold",
"AdjacencyBonuses_3_Action",
"AdjacencyBonuses_3_ActionNames",
"AdjacencyBonuses_3_ActionNames_1",
"AdjacencyBonuses_3_ActionNames_2",
"AdjacencyBonuses_3_ActionNames_3",
"AdjacencyBonuses_3_ActionNames_4",
"AdjacencyBonuses_3_EvaluatorValue",
"AdjacencyBonuses_3_ActionValue",
"AdjacencyBonuses_4_GroupName",
"AdjacencyBonuses_4_Evaluator",
"AdjacencyBonuses_4_EvaluatorThreshold",
"AdjacencyBonuses_4_Action",
"AdjacencyBonuses_4_ActionNames",
"AdjacencyBonuses_4_EvaluatorValue",
"AdjacencyBonuses_4_ActionValue",
"OperationRules",
"OperationRules_1",
"OperationRules_2",
"OperationRules_3",
"OperationRules_4",
"OperationRules_5",
"OperationRules_6",
"OperationRules_7",
"OperationRules_8",
"OperationRules_9",
"OperationRules_10",
"OperationRules_11",
"OperationRules_12",
"OperationRules_13",
"MaxPeeps",
"PeepExhaustionRemoved",
"PeepAgeAdded",
"PeepHappinessAdded",
"PeepHappinessCost",
"PollutionOutputMode",
"SourceOfOxygenRange",
"Resources",
"Resources_1_Name",
"Resources_1_Maximum",
"Resources_1_StorageMode",
"Resources_1_StartFull",
"Resources_1_FetchInRange",
"Resources_1_CanBeShared",
"Resources_1_CycleThoughResourceSources",
"Resources_1_GatheringMode",
"Resources_1_DistributionMode",
"Resources_1_DeliverInRange",
"Resources_1_VehicleFetchsAndDelivers",
"Resources_2_Name",
"Resources_2_Maximum",
"Resources_2_StorageMode",
"Resources_2_StartFull",
"Resources_2_FetchInRange",
"Resources_2_CanBeShared",
"Resources_2_CycleThoughResourceSources",
"Resources_2_GatheringMode",
"Resources_2_DistributionMode",
"Resources_2_DeliverInRange",
"Resources_2_VehicleFetchsAndDelivers",
"Resources_3_Name",
"Resources_3_Maximum",
"Resources_3_StorageMode",
"Resources_3_StartFull",
"Resources_3_FetchInRange",
"Resources_3_CanBeShared",
"Resources_3_CycleThoughResourceSources",
"Resources_3_GatheringMode",
"Resources_3_DistributionMode",
"Resources_3_DeliverInRange",
"Resources_3_VehicleFetchsAndDelivers",
"Resources_4_Name",
"Resources_4_Maximum",
"Resources_4_StorageMode",
"Resources_4_StartFull",
"Resources_4_FetchInRange",
"Resources_4_CanBeShared",
"Resources_4_CycleThoughResourceSources",
"Resources_4_GatheringMode",
"Resources_4_DistributionMode",
"Resources_4_DeliverInRange",
"Resources_4_VehicleFetchsAndDelivers",
"Resources_5_Name",
"Resources_5_Maximum",
"Resources_5_StorageMode",
"Resources_5_StartFull",
"Resources_5_FetchInRange",
"Resources_5_CanBeShared",
"Resources_5_CycleThoughResourceSources",
"Resources_5_GatheringMode",
"Resources_5_DistributionMode",
"Resources_5_DeliverInRange",
"Resources_5_VehicleFetchsAndDelivers",
"Resources_6_Name",
"Resources_6_Maximum",
"Resources_6_StorageMode",
"Resources_6_StartFull",
"Resources_6_FetchInRange",
"Resources_6_CanBeShared",
"Resources_6_CycleThoughResourceSources",
"Resources_6_GatheringMode",
"Resources_6_DistributionMode",
"Resources_6_DeliverInRange",
"Resources_6_VehicleFetchsAndDelivers",
"Resources_7_Name",
"Resources_7_Maximum",
"Resources_7_StorageMode",
"Resources_7_StartFull",
"Resources_7_FetchInRange",
"Resources_7_CanBeShared",
"Resources_7_CycleThoughResourceSources",
"Resources_7_GatheringMode",
"Resources_7_DistributionMode",
"Resources_7_DeliverInRange",
"Resources_7_VehicleFetchsAndDelivers",
"Resources_8_Name",
"Resources_8_Maximum",
"Resources_8_StorageMode",
"Resources_8_StartFull",
"Resources_8_FetchInRange",
"Resources_8_CanBeShared",
"Resources_8_CycleThoughResourceSources",
"Resources_8_GatheringMode",
"Resources_8_DistributionMode",
"Resources_8_DeliverInRange",
"Resources_8_VehicleFetchsAndDelivers",
"Resources_9_Name",
"Resources_9_Maximum",
"Resources_9_StorageMode",
"Resources_9_StartFull",
"Resources_9_FetchInRange",
"Resources_9_CanBeShared",
"Resources_9_CycleThoughResourceSources",
"Resources_9_GatheringMode",
"Resources_9_DistributionMode",
"Resources_9_DeliverInRange",
"Resources_9_VehicleFetchsAndDelivers",
"ResourceGroups",
"ResourceGroups_1_Type",
"ResourceGroups_1_Maximum",
"ResourceGroups_1_GatheringMode",
"ResourceGroups_1_DistributionMode",
"ResourceGroups_1_StartFullResource",
"ResourceGroups_2_Type",
"ResourceGroups_2_Maximum",
"ResourceGroups_2_GatheringMode",
"ResourceGroups_2_DistributionMode",
"ResourceGroups_2_StartFullResource",
"DefinedResourceLists",
"DefinedResourceLists_2_Name",
"DefinedResourceLists_2_Maximum",
"DefinedResourceLists_2_StorageMode",
"DefinedResourceLists_2_StartFull",
"DefinedResourceLists_2_FetchInRange",
"DefinedResourceLists_2_CanBeShared",
"DefinedResourceLists_2_CycleThoughResourceSources",
"DefinedResourceLists_2_GatheringMode",
"DefinedResourceLists_2_DistributionMode",
"DefinedResourceLists_2_DeliverInRange",
"DefinedResourceLists_2_VehicleFetchsAndDelivers",
"DefaultFetchMode",
"DefaultDeliveryMode",
"FetchTime",
"DeliveryTime",
"TotalStorageMaximum",
"MaxSeedSlots",
"BuildingTasks",
"PlayerSelectableTasks_1",
"PlayerSelectableTasks_2",
"PlayerSelectableTasks_3",
"SourceDefinition",
"Hotkey",
"ConstructionMustReplace",
"AutoUnlock",
"TechTreeListPreviousExit",
"TechTreeListEntry",
"TechTreeLineVerticalOffset",
"PowerRange",
"PeepEnergyAdded",
"PeepEnergyCost",
},
},
TASKS = {
TABLE = "BuildingTasks",
WHERE = "guid",
FIELDS = {
"BuildingTasks_1_Name",
"BuildingTasks_1_InitialState",
"BuildingTasks_1_Time",
"BuildingTasks_1_MinimumTimeDelta",
"BuildingTasks_1_Outputs_1_Type",
"BuildingTasks_1_Outputs_1_Resource",
"BuildingTasks_1_Outputs_1_Value",
"BuildingTasks_1_Outputs_2_Type",
"BuildingTasks_1_Outputs_2_Resource",
"BuildingTasks_1_Outputs_2_Value",
"BuildingTasks_1_PollutionSlowdownThreshold",
"BuildingTasks_1_Inputs_1_Type",
"BuildingTasks_1_Inputs_1_Resource",
"BuildingTasks_1_Inputs_1_Value",
"BuildingTasks_1_Inputs_2_Type",
"BuildingTasks_1_Inputs_2_Resource",
"BuildingTasks_1_Inputs_2_Value",
"BuildingTasks_2_Name",
"BuildingTasks_2_InitialState",
"BuildingTasks_2_Time",
"BuildingTasks_2_MinimumTimeDelta",
"BuildingTasks_2_Outputs_1_Type",
"BuildingTasks_2_Outputs_1_Resource",
"BuildingTasks_2_Outputs_1_Value",
"BuildingTasks_2_Outputs_2_Type",
"BuildingTasks_2_Outputs_2_Resource",
"BuildingTasks_2_Outputs_2_Value",
"BuildingTasks_2_PollutionSlowdownThreshold",
"BuildingTasks_2_Inputs_1_Type",
"BuildingTasks_2_Inputs_1_Resource",
"BuildingTasks_2_Inputs_1_Value",
"BuildingTasks_2_Inputs_2_Type",
"BuildingTasks_2_Inputs_2_Resource",
"BuildingTasks_2_Inputs_2_Value",
"BuildingTasks_3_Name",
"BuildingTasks_3_InitialState",
"BuildingTasks_3_Time",
"BuildingTasks_3_MinimumTimeDelta",
"BuildingTasks_3_Outputs_1_Type",
"BuildingTasks_3_Outputs_1_Resource",
"BuildingTasks_3_Outputs_1_Value",
"BuildingTasks_3_Outputs_2_Type",
"BuildingTasks_3_Outputs_2_Resource",
"BuildingTasks_3_Outputs_2_Value",
"BuildingTasks_3_PollutionSlowdownThreshold",
"BuildingTasks_3_Inputs_1_Type",
"BuildingTasks_3_Inputs_1_Resource",
"BuildingTasks_3_Inputs_1_Value",
"BuildingTasks_3_Inputs_2_Type",
"BuildingTasks_3_Inputs_2_Resource",
"BuildingTasks_3_Inputs_2_Value",
"BuildingTasks_4_Name",
"BuildingTasks_4_InitialState",
"BuildingTasks_4_Time",
"BuildingTasks_4_MinimumTimeDelta",
"BuildingTasks_4_Outputs_1_Type",
"BuildingTasks_4_Outputs_1_Resource",
"BuildingTasks_4_Outputs_1_Value",
-- "BuildingTasks_4_Outputs_2_Type",
-- "BuildingTasks_4_Outputs_2_Resource",
-- "BuildingTasks_4_Outputs_2_Value",
"BuildingTasks_4_PollutionSlowdownThreshold",
"BuildingTasks_4_Inputs_1_Type",
"BuildingTasks_4_Inputs_1_Resource",
"BuildingTasks_4_Inputs_1_Value",
-- "BuildingTasks_4_Inputs_2_Type",
-- "BuildingTasks_4_Inputs_2_Resource",
-- "BuildingTasks_4_Inputs_2_Value",
"BuildingTasks_5_Name",
"BuildingTasks_5_InitialState",
"BuildingTasks_5_Time",
"BuildingTasks_5_MinimumTimeDelta",
"BuildingTasks_5_Outputs_1_Type",
"BuildingTasks_5_Outputs_1_Resource",
"BuildingTasks_5_Outputs_1_Value",
-- "BuildingTasks_5_Outputs_2_Type",
-- "BuildingTasks_5_Outputs_2_Resource",
-- "BuildingTasks_5_Outputs_2_Value",
"BuildingTasks_5_PollutionSlowdownThreshold",
"BuildingTasks_5_Inputs_1_Type",
"BuildingTasks_5_Inputs_1_Resource",
"BuildingTasks_5_Inputs_1_Value",
-- "BuildingTasks_5_Inputs_2_Type",
-- "BuildingTasks_5_Inputs_2_Resource",
-- "BuildingTasks_5_Inputs_2_Value",
"BuildingTasks_6_Name",
"BuildingTasks_6_InitialState",
"BuildingTasks_6_Time",
"BuildingTasks_6_MinimumTimeDelta",
"BuildingTasks_6_Outputs_1_Type",
"BuildingTasks_6_Outputs_1_Resource",
"BuildingTasks_6_Outputs_1_Value",
"BuildingTasks_6_Outputs_2_Type",
"BuildingTasks_6_Outputs_2_Resource",
"BuildingTasks_6_Outputs_2_Value",
"BuildingTasks_6_PollutionSlowdownThreshold",
"BuildingTasks_6_Inputs_1_Type",
"BuildingTasks_6_Inputs_1_Resource",
"BuildingTasks_6_Inputs_1_Value",
"BuildingTasks_6_Inputs_2_Type",
"BuildingTasks_6_Inputs_2_Resource",
"BuildingTasks_6_Inputs_2_Value",
}
}
}
--#endregion
--#region Cargo queries
--- Queries cargo for the building record with the given name.
---@param building_name string the name of the building to fetch
---@return CargoBuildingRecord|nil
local function query_building(building_name)
local cargo = mw.ext.cargo
if not cargo then return nil end
local result = cargo.query(
QUERIES.BUILDINGS.TABLE,
table.concat(QUERIES.BUILDINGS.FIELDS, ","), {
where = QUERIES.BUILDINGS.WHERE .. '="' .. building_name .. '"',
})
if not result or #result == 0 then return nil end
return result[1]
end
--- Queries cargo for the building tasks record with the given guid.
---@param building_tasks_guid string the guid of the building tasks to fetch
---@return CargoBuildingTasksRecord|nil
local function query_building_tasks(building_tasks_guid)
local cargo = mw.ext.cargo
if not cargo then return nil end
local result = cargo.query(
QUERIES.TASKS.TABLE,
table.concat(QUERIES.TASKS.FIELDS, ","), {
where = QUERIES.TASKS.WHERE .. '="' .. building_tasks_guid .. '"',
})
if not result or #result == 0 then return nil end
return result[1]
end
--#endregion
--#region Local helper functions
--- Restructures the construction resources of a building record from the database into a more usable format.
---@param record CargoBuildingRecord
---@return ConstructionPair[]
local function restructure_construction_resources(record)
local construction_resources = {}
for i = 1, p.MAX_CONSTRUCTION_PAIRS do
local construction_resource = record[string.format("ConstructionResources_%d_Name", i)]
local construction_amount = record[string.format("ConstructionResources_%d_Amount", i)]
if construction_resource and construction_amount then
table.insert(construction_resources, {
name = construction_resource,
amount = construction_amount,
})
end
end
return construction_resources
end
--- Restructures the unlock values of a building record from the database into a more usable format.
---@param record CargoBuildingRecord
---@return string[]
local function restructure_unlock_values(record)
local unlock_values = {}
for i = 1, p.MAX_UNLOCK_VALUES do
local unlock_value = record[string.format("UnlockValues_%d", i)]
if unlock_value then
table.insert(unlock_values, unlock_value)
end
end
return unlock_values
end
--- Restructures the adjacency bonuses of a building record from the database into a more usable format.
---@param record CargoBuildingRecord
---@return AdjacencyBonus[]
local function restructure_adjacency_bonuses(record)
local adjacency_bonuses = {}
for i = 1, p.MAX_ADJACENCY_BONUSES do
local group_name = record[string.format("AdjacencyBonuses_%d_GroupName", i)]
local evaluator_type = record[string.format("AdjacencyBonuses_%d_Evaluator", i)]
local evaluator_threshold = record[string.format("AdjacencyBonuses_%d_EvaluatorThreshold", i)]
local evaluator_value = record[string.format("AdjacencyBonuses_%d_EvaluatorValue", i)]
local action = record[string.format("AdjacencyBonuses_%d_Action", i)]
local action_value = record[string.format("AdjacencyBonuses_%d_ActionValue", i)]
if group_name and evaluator_type and evaluator_threshold and evaluator_value and action and action_value then
table.insert(adjacency_bonuses, {
bonus_name = group_name,
evaluator_type = evaluator_type,
evaluator_threshold = tonumber(evaluator_threshold),
evaluator_value = evaluator_value,
action = action,
action_value = tonumber(action_value),
})
end
end
return adjacency_bonuses
end
--- Restructures the inputs or ouputs of a building task
---@param record CargoBuildingTasksRecord the building tasks record retrieved for the building
---@param task_num number which task to restructure
---@param which_io "Inputs"|"Outputs" the type of tasks to restructure
---@return BuildingTaskIO[]
local function restructure_task_io(record, task_num, which_io)
local task_io = {}
local max = ((which_io == "Inputs") and p.MAX_BUILDING_TASK_INPUTS) or p.MAX_BUILDING_TASK_OUTPUTS
local task_type_prefix = "BuildingTasks_" .. task_num .. "_" .. which_io .. "_"
for i = 1, max do
local put_type = record[string.format(task_type_prefix .. "Type", i)]
local put_resource = record[string.format(task_type_prefix .. "Resource", i)]
local put_value = record[string.format(task_type_prefix .. "Value", i)]
if put_type and put_resource and put_value then
table.insert(task_io, {
type = put_type,
resource = put_resource,
value = put_value,
})
end
end
return task_io
end
--- Restructures the tasks of a building record from the database into a more usable format.
---@param record CargoBuildingRecord
---@return BuildingTask[]|nil
local function restructure_tasks(record)
local tasks_guid = record.BuildingTasks
if not tasks_guid then return {} end
local raw_tasks = query_building_tasks(tasks_guid)
if not raw_tasks then return nil end
local tasks = {}
for i = 1, p.MAX_BUILDING_TASKS do
local task_name = raw_tasks[string.format("BuildingTasks_%d_Name", i)]
local time = tonumber(raw_tasks[string.format("BuildingTasks_%d_Time", i)])
local pollution_slowdown = tonumber(raw_tasks[string.format("BuildingTasks_%d_PollutionSlowdownThreshold", i)])
local outputs = restructure_task_io(raw_tasks, i, "Outputs")
local inputs = restructure_task_io(raw_tasks, i, "Inputs")
if task_name and time and pollution_slowdown and outputs and inputs then
table.insert(tasks, {
task_name = task_name,
time = time,
outputs = outputs,
inputs = inputs,
pollution_slowdown_threshold = pollution_slowdown,
})
end
end
return tasks
end
--- Restructures a flat building record from the database into a more usable format.
---@param record CargoBuildingRecord
---@return BuildingRecord|nil
local function restructure_building_record(record)
local building = {
name = record.page_name,
category = record.Category,
display_name = record.DisplayNameTerm_en,
description = record.DescriptionTerm_en,
icon = record.IconAddress,
construction_resources = {},
construction_time = tonumber(record.ConstructionTime),
unlock_mode = record.UnlockMode,
unlock_values = {},
is_in_demo = record.LockedInDemo,
footprint_icon = record.FootprintIconAddress,
tech_tree_previous = record.TechTreePrevious,
adjacency_bonuses = {},
max_peeps = tonumber(record.MaxPeeps),
peep_exhaustion_removed = tonumber(record.PeepExhaustionRemoved),
peep_age_added = tonumber(record.PeepAgeAdded),
peep_happiness_added = tonumber(record.PeepHappinessAdded),
peep_happiness_cost = tonumber(record.PeepHappinessCost),
pollution_output_mode = record.PollutionOutputMode,
oxygen_source_range = tonumber(record.SourceOfOxygenRange),
fetch_mode = record.DefaultFetchMode,
delivery_mode = record.DefaultDeliveryMode,
fetch_time = tonumber(record.FetchTime),
delivery_time = tonumber(record.DeliveryTime),
tasks = {},
power_range = tonumber(record.PowerRange),
}
building.construction_resources = restructure_construction_resources(record)
building.unlock_values = restructure_unlock_values(record)
building.adjacency_bonuses = restructure_adjacency_bonuses(record)
building.tasks = restructure_tasks(record)
return building
end
--#endregion
--#region Public interface
---@class BuildingDataModule
---@field MAX_CONSTRUCTION_PAIRS number the maximum number of construction pairs
---@field MAX_UNLOCK_VALUES number the maximum number of unlock values
---@field MAX_ADJACENCY_BONUSES number the maximum number of adjacency bonuses
---@field MAX_BUILDING_TASKS number the maximum number of building tasks
---@field MAX_BUILDING_TASK_OUTPUTS number the maximum number of building task outputs
---@field MAX_BUILDING_TASK_INPUTS number the maximum number of building task inputs
---@field get_building fun(building_name: string): BuildingRecord|nil looks up a building by name
p.MAX_CONSTRUCTION_PAIRS = 6
p.MAX_UNLOCK_VALUES = 4
p.MAX_ADJACENCY_BONUSES = 4
p.MAX_BUILDING_TASKS = 9
p.MAX_BUILDING_TASK_OUTPUTS = 2
p.MAX_BUILDING_TASK_INPUTS = 5
---@class ConstructionPair
---@field name string the name of the construction resource
---@field amount string the amount of the construction resource
---@class AdjacencyBonus
---@field bonus_name string|nil the codename for the bonus group
---@field evaluator_type string|nil the type of evaluator that triggers the bonus
---@field evaluator_threshold number|nil the threshold value for the evaluator
---@field evaluator_value string|nil the codename for what condition evaluated for the trigger
---@field action string|nil the action to take when the bonus is triggered
---@field action_value number|nil the value to apply for the action
---@class BuildingTaskIO
---@field type string|nil the type of input/output
---@field resource string|nil the codename for the resource
---@field value string|nil the value of the input/output
---@class BuildingTask
---@field task_name string|nil the name of the task
---@field time number|nil the time it takes to complete the task
---@field outputs BuildingTaskIO[]|nil the outputs of the task
---@field inputs BuildingTaskIO[]|nil the inputs of the task
---@field pollution_slowdown_threshold number|nil the threshold at which pollution slows down the task
---@class BuildingRecord
---@field name string|nil the in-game codename for the building
---@field category string|nil the category of the building
---@field display_name string|nil the display name of the building
---@field description string|nil the description of the building
---@field construction_resources ConstructionPair[]|nil the construction resources of the building
---@field construction_time number|nil the time it takes to construct the building
---@field unlock_mode string|nil the requirement for unlocking the building
---@field unlock_values string[]|nil the values required for unlocking the building
---@field is_in_demo boolean whether the building is locked in the demo
---@field footprint_icon string|nil the icon filename for the building's footprint
---@field tech_tree_previous string|nil the previous building in the tech tree
---@field adjacency_bonuses AdjacencyBonus[]|nil the adjacency bonuses of the building
---@field max_peeps number|nil the maximum number of peeps that can be assigned to the building
---@field peep_exhaustion_removed number|nil the amount of exhaustion removed per peep per second
---@field peep_age_added number|nil the amount of age added per peep per second
---@field peep_happiness_added number|nil the amount of happiness added per peep per second
---@field peep_happiness_cost number|nil the cost of happiness per peep per second
---@field pollution_output_mode string|nil the level of pollution output from the building
---@field oxygen_source_range number|nil the range of the oxygen source for the building
---@field fetch_mode string|nil the mode for fetching resources from the building
---@field delivery_mode string|nil the mode for delivering resources to the building
---@field fetch_time number|nil the time it takes to fetch resources from the building
---@field delivery_time number|nil the time it takes to deliver resources to the building
---@field tasks BuildingTask[]|nil the tasks the building can work on
---@field power_range number|nil the range of the power source for the building
--- Fetches a building record from the database.
---@param building_name string the in-game name of the building to fetch
---@return BuildingRecord|nil
function p.get_building(building_name)
local raw_record = query_building(building_name)
if not raw_record then return nil end
local record = restructure_building_record(raw_record)
return record
end
---@cast p BuildingDataModule
return p
--#endregion


