Module:Building data: Difference between revisions

From Beyond These Stars Official Wiki
Serves processed results from cargo query for a Building
 
m Some fields are not in the data
Line 335: Line 335:
---@field BuildingTasks_4_Outputs_1_Resource string|nil
---@field BuildingTasks_4_Outputs_1_Resource string|nil
---@field BuildingTasks_4_Outputs_1_Value string|nil
---@field BuildingTasks_4_Outputs_1_Value string|nil
---@field BuildingTasks_4_Outputs_2_Type string|nil
-- -@field BuildingTasks_4_Outputs_2_Type string|nil
---@field BuildingTasks_4_Outputs_2_Resource string|nil
-- -@field BuildingTasks_4_Outputs_2_Resource string|nil
---@field BuildingTasks_4_Outputs_2_Value string|nil
-- -@field BuildingTasks_4_Outputs_2_Value string|nil
---@field BuildingTasks_4_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_4_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_4_Inputs_1_Type string|nil
---@field BuildingTasks_4_Inputs_1_Type string|nil
Line 352: Line 352:
---@field BuildingTasks_5_Outputs_1_Resource string|nil
---@field BuildingTasks_5_Outputs_1_Resource string|nil
---@field BuildingTasks_5_Outputs_1_Value string|nil
---@field BuildingTasks_5_Outputs_1_Value string|nil
---@field BuildingTasks_5_Outputs_2_Type string|nil
-- -@field BuildingTasks_5_Outputs_2_Type string|nil
---@field BuildingTasks_5_Outputs_2_Resource string|nil
-- -@field BuildingTasks_5_Outputs_2_Resource string|nil
---@field BuildingTasks_5_Outputs_2_Value string|nil
-- -@field BuildingTasks_5_Outputs_2_Value string|nil
---@field BuildingTasks_5_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_5_PollutionSlowdownThreshold string|nil
---@field BuildingTasks_5_Inputs_1_Type string|nil
---@field BuildingTasks_5_Inputs_1_Type string|nil
Line 716: Line 716:
       "BuildingTasks_4_Outputs_1_Resource",
       "BuildingTasks_4_Outputs_1_Resource",
       "BuildingTasks_4_Outputs_1_Value",
       "BuildingTasks_4_Outputs_1_Value",
       "BuildingTasks_4_Outputs_2_Type",
       -- "BuildingTasks_4_Outputs_2_Type",
       "BuildingTasks_4_Outputs_2_Resource",
       -- "BuildingTasks_4_Outputs_2_Resource",
       "BuildingTasks_4_Outputs_2_Value",
       -- "BuildingTasks_4_Outputs_2_Value",
       "BuildingTasks_4_PollutionSlowdownThreshold",
       "BuildingTasks_4_PollutionSlowdownThreshold",
       "BuildingTasks_4_Inputs_1_Type",
       "BuildingTasks_4_Inputs_1_Type",
       "BuildingTasks_4_Inputs_1_Resource",
       "BuildingTasks_4_Inputs_1_Resource",
       "BuildingTasks_4_Inputs_1_Value",
       "BuildingTasks_4_Inputs_1_Value",
       "BuildingTasks_4_Inputs_2_Type",
       -- "BuildingTasks_4_Inputs_2_Type",
       "BuildingTasks_4_Inputs_2_Resource",
       -- "BuildingTasks_4_Inputs_2_Resource",
       "BuildingTasks_4_Inputs_2_Value",
       -- "BuildingTasks_4_Inputs_2_Value",
       "BuildingTasks_5_Name",
       "BuildingTasks_5_Name",
       "BuildingTasks_5_InitialState",
       "BuildingTasks_5_InitialState",
Line 733: Line 733:
       "BuildingTasks_5_Outputs_1_Resource",
       "BuildingTasks_5_Outputs_1_Resource",
       "BuildingTasks_5_Outputs_1_Value",
       "BuildingTasks_5_Outputs_1_Value",
       "BuildingTasks_5_Outputs_2_Type",
       -- "BuildingTasks_5_Outputs_2_Type",
       "BuildingTasks_5_Outputs_2_Resource",
       -- "BuildingTasks_5_Outputs_2_Resource",
       "BuildingTasks_5_Outputs_2_Value",
       -- "BuildingTasks_5_Outputs_2_Value",
       "BuildingTasks_5_PollutionSlowdownThreshold",
       "BuildingTasks_5_PollutionSlowdownThreshold",
       "BuildingTasks_5_Inputs_1_Type",
       "BuildingTasks_5_Inputs_1_Type",
       "BuildingTasks_5_Inputs_1_Resource",
       "BuildingTasks_5_Inputs_1_Resource",
       "BuildingTasks_5_Inputs_1_Value",
       "BuildingTasks_5_Inputs_1_Value",
       "BuildingTasks_5_Inputs_2_Type",
       -- "BuildingTasks_5_Inputs_2_Type",
       "BuildingTasks_5_Inputs_2_Resource",
       -- "BuildingTasks_5_Inputs_2_Resource",
       "BuildingTasks_5_Inputs_2_Value",
       -- "BuildingTasks_5_Inputs_2_Value",
       "BuildingTasks_6_Name",
       "BuildingTasks_6_Name",
       "BuildingTasks_6_InitialState",
       "BuildingTasks_6_InitialState",

Revision as of 14:09, 13 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,
    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