From 1ba876a9d5dbf680ad0ed256d1db6fb1aecb4631 Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:16:18 -0600 Subject: [PATCH 1/8] add allowedBuildings field to Game and Factory interfaces - Add Game.allowedBuildings to track globally unlocked buildings per save - Add Factory.allowedBuildings for factory-specific building overrides for the global settings - Supports Satisfactory-style persistent building unlocks --- src/factories/Factory.ts | 2 ++ src/games/Game.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/src/factories/Factory.ts b/src/factories/Factory.ts index ff6ee19f..00ce66f3 100644 --- a/src/factories/Factory.ts +++ b/src/factories/Factory.ts @@ -7,6 +7,8 @@ export interface Factory { inputs: FactoryInput[]; outputs: FactoryOutput[]; powerConsumption?: number | null; + /** Factory-specific building overrides. If set, overrides game-level allowedBuildings */ + allowedBuildings?: string[] | null; } export interface FactoryInput { diff --git a/src/games/Game.ts b/src/games/Game.ts index 655c4913..00a8fd60 100644 --- a/src/games/Game.ts +++ b/src/games/Game.ts @@ -8,6 +8,7 @@ export interface Game { // factories: Factory[]; settings: GameSettings; allowedRecipes?: string[]; + allowedBuildings?: string[]; collapsedFactoriesIds?: string[]; // Only if saved savedId?: string; From 81338808429d9bafb5dd75bda9db39e35eb80393 Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 2/8] implement game-level building management - Initialize new games with empty allowedBuildings array - Add toggleGameBuilding() to manage individual buildings - Add setGameAllowedBuildings() for batch updates - Add enableAllGameBuildings() and disableAllGameBuildings() helpers - Add useGameAllowedBuildings() hook for UI access --- src/games/gamesSlice.ts | 50 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/games/gamesSlice.ts b/src/games/gamesSlice.ts index 4079e622..414fcf2a 100644 --- a/src/games/gamesSlice.ts +++ b/src/games/gamesSlice.ts @@ -1,11 +1,12 @@ +import { useStore } from '@/core/zustand'; +import { createSlice } from '@/core/zustand-helpers/slices'; import { + FactoryBuildingsForRecipes, FactoryConveyorBelts, FactoryPipelinesExclAlternates, } from '@/recipes/FactoryBuilding'; import dayjs from 'dayjs'; import { useShallow } from 'zustand/shallow'; -import { useStore } from '@/core/zustand'; -import { createSlice } from '@/core/zustand-helpers/slices'; import { Game, type GameRemoteData, GameSettings } from './Game'; export interface GamesSlice { @@ -31,6 +32,7 @@ export const gamesSlice = createSlice({ createdAt: dayjs().toISOString(), ...game, factoriesIds: [], + allowedBuildings: [], settings: { noHighlight100PercentUsage: false, highlight100PercentColor: '#339af0', @@ -69,6 +71,42 @@ export const gamesSlice = createSlice({ } state.games[targetId].allowedRecipes = allowedRecipes; }, + setGameAllowedBuildings: + (gameId: string | undefined, allowedBuildings: string[]) => state => { + const targetId = gameId ?? state.selected; + if (!targetId) { + throw new Error('No game selected'); + } + state.games[targetId].allowedBuildings = allowedBuildings; + }, + toggleGameBuilding: + (buildingId: string, enabled?: boolean) => state => { + const game = state.games[state.selected ?? '']; + if (!game) return; + + if (!game.allowedBuildings) { + game.allowedBuildings = []; + } + + const index = game.allowedBuildings.indexOf(buildingId); + const shouldAdd = enabled ?? index === -1; + + if (shouldAdd && index === -1) { + game.allowedBuildings.push(buildingId); + } else if (!shouldAdd && index !== -1) { + game.allowedBuildings.splice(index, 1); + } + }, + enableAllGameBuildings: () => state => { + const game = state.games[state.selected ?? '']; + if (!game) return; + game.allowedBuildings = FactoryBuildingsForRecipes.map(b => b.id); + }, + disableAllGameBuildings: () => state => { + const game = state.games[state.selected ?? '']; + if (!game) return; + game.allowedBuildings = []; + }, setRemoteGameData: (gameId: string, data: GameRemoteData) => state => { state.games[gameId].authorId = data.author_id; state.games[gameId].createdAt = data.created_at; @@ -131,6 +169,14 @@ export function useGameSettings() { ); } +export function useGameAllowedBuildings() { + return useStore( + useShallow( + state => state.games.games[state.games.selected ?? '']?.allowedBuildings, + ), + ); +} + export function useGameSetting( key: keyof GameSettings, defaultValue?: GameSettings[keyof GameSettings], From f9757178547e8dae27fe95afc1548e45a9143d0a Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 3/8] add factory-level building override actions - Add setFactoryAllowedBuildings() to enable/disable factory overrides - Add toggleFactoryBuilding() for granular factory building control - Allows factories to have custom building settings independent of game --- src/factories/store/factoriesSlice.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/factories/store/factoriesSlice.ts b/src/factories/store/factoriesSlice.ts index f392fcda..04061a17 100644 --- a/src/factories/store/factoriesSlice.ts +++ b/src/factories/store/factoriesSlice.ts @@ -34,6 +34,29 @@ export const factoriesSlice = createSlice({ (factoryId: string, outputIndex: number, amount: number) => state => { state.factories[factoryId].outputs[outputIndex].amount = amount; }, + setFactoryAllowedBuildings: + (factoryId: string, allowedBuildings: string[] | null) => state => { + state.factories[factoryId].allowedBuildings = allowedBuildings; + }, + toggleFactoryBuilding: + (factoryId: string, buildingId: string, enabled?: boolean) => state => { + const factory = state.factories[factoryId]; + if (!factory) return; + + // Initialize with empty array if not set + if (factory.allowedBuildings === undefined || factory.allowedBuildings === null) { + factory.allowedBuildings = []; + } + + const index = factory.allowedBuildings.indexOf(buildingId); + const shouldAdd = enabled ?? index === -1; + + if (shouldAdd && index === -1) { + factory.allowedBuildings.push(buildingId); + } else if (!shouldAdd && index !== -1) { + factory.allowedBuildings.splice(index, 1); + } + }, }, }); From 99bcee7843016e9f53a2678d78854e427de4db37 Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 4/8] integrate building restrictions into solver system - Update createSolver() to accept allowedBuildings parameter - Calculate blockedBuildings based on allowedBuildings - Solvers inherit factory-specific buildings or fall back to game-level - Ensures solver respects building availability constraints --- src/solver/store/solverFactoriesActions.ts | 21 +++++++++++++++++++-- src/solver/store/solverSlice.ts | 10 ++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/solver/store/solverFactoriesActions.ts b/src/solver/store/solverFactoriesActions.ts index 4fa357a4..0da74356 100644 --- a/src/solver/store/solverFactoriesActions.ts +++ b/src/solver/store/solverFactoriesActions.ts @@ -35,7 +35,16 @@ export const solverFactoriesActions = createActions({ logger.info('Creating solver', factoryId); const gameAllowedRecipes = state.games.games[state.games.selected ?? '']?.allowedRecipes; - get().createSolver(factoryId, { allowedRecipes: gameAllowedRecipes }); + const factory = state.factories.factories[factoryId]; + const gameAllowedBuildings = + state.games.games[state.games.selected ?? '']?.allowedBuildings; + // Use factory-specific buildings if set, otherwise use game-level + const allowedBuildings = + factory?.allowedBuildings ?? gameAllowedBuildings; + get().createSolver(factoryId, { + allowedRecipes: gameAllowedRecipes, + allowedBuildings: allowedBuildings, + }); } }, createFactoryWithSolver: @@ -50,7 +59,15 @@ export const solverFactoriesActions = createActions({ get().addFactoryIdToGame(targetId, factoryId); const gameAllowedRecipes = state.games.games[targetId]?.allowedRecipes; - get().createSolver(factoryId, { allowedRecipes: gameAllowedRecipes }); + const gameAllowedBuildings = + state.games.games[targetId]?.allowedBuildings; + // Use factory-specific buildings if set, otherwise use game-level + const allowedBuildings = + factory?.allowedBuildings ?? gameAllowedBuildings; + get().createSolver(factoryId, { + allowedRecipes: gameAllowedRecipes, + allowedBuildings: allowedBuildings, + }); }, // Input/Output should be synced addFactoryInput: diff --git a/src/solver/store/solverSlice.ts b/src/solver/store/solverSlice.ts index e90587cb..5330c9ee 100644 --- a/src/solver/store/solverSlice.ts +++ b/src/solver/store/solverSlice.ts @@ -1,5 +1,6 @@ import { toggleAsSet } from '@/core/state-utils/toggleAsSet'; import { createSlice } from '@/core/zustand-helpers/slices'; +import { FactoryBuildingsForRecipes } from '@/recipes/FactoryBuilding'; import { AllFactoryRecipes } from '@/recipes/FactoryRecipe'; import { getAllAlternateRecipeIds, @@ -51,9 +52,17 @@ export const solversSlice = createSlice({ id: string, options?: { allowedRecipes?: string[]; + allowedBuildings?: string[]; }, ) => state => { + // If allowedBuildings is provided, block all buildings not in the list + const blockedBuildings = options?.allowedBuildings + ? FactoryBuildingsForRecipes.filter( + b => !options.allowedBuildings!.includes(b.id), + ).map(b => b.id) + : undefined; + state.instances[id] = { id, isFactory: false, @@ -61,6 +70,7 @@ export const solversSlice = createSlice({ request: { allowedRecipes: options?.allowedRecipes ?? getAllDefaultRecipesIds(), + blockedBuildings, objective: 'minimize_resources', }, }; From f380eb583ff296d3275f2a94cce5fe5f202e69fd Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 5/8] add building sync mechanism for factories - Add syncGameBuildingsToFactories() to propagate game building changes - Respects factory-level overrides when syncing - Keeps all factories aligned with game settings unless overridden --- src/games/store/gameFactoriesActions.ts | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/games/store/gameFactoriesActions.ts b/src/games/store/gameFactoriesActions.ts index 2be88349..d7db51df 100644 --- a/src/games/store/gameFactoriesActions.ts +++ b/src/games/store/gameFactoriesActions.ts @@ -2,6 +2,7 @@ import { useStore } from '@/core/zustand'; import { createActions } from '@/core/zustand-helpers/actions'; import { Factory } from '@/factories/Factory'; import { Game } from '@/games/Game'; +import { FactoryBuildingsForRecipes } from '@/recipes/FactoryBuilding'; import type { SolverInstance } from '@/solver/store/Solver'; import dayjs from 'dayjs'; import { cloneDeep, omit } from 'lodash'; @@ -89,6 +90,35 @@ export const gameFactoriesActions = createActions({ state.games.selected = null; } }, + /** + * Syncs the game's allowedBuildings to all factory solvers' blockedBuildings + */ + syncGameBuildingsToFactories: (gameId?: string | null) => state => { + const targetId = gameId ?? state.games.selected; + if (!targetId) return; + + const game = state.games.games[targetId]; + if (!game) return; + + const allowedBuildings = game.allowedBuildings ?? []; + const blockedBuildings = FactoryBuildingsForRecipes.filter( + b => !allowedBuildings.includes(b.id), + ).map(b => b.id); + + game.factoriesIds.forEach(factoryId => { + const factory = state.factories.factories[factoryId]; + const solver = state.solvers.instances[factoryId]; + + // Skip if factory has its own building overrides + if (factory?.allowedBuildings !== undefined && factory?.allowedBuildings !== null) { + return; + } + + if (solver) { + solver.request.blockedBuildings = blockedBuildings; + } + }); + }, }); export type SerializedGame = { From ae15591d23255218e2863acf439bd7d0cc841a2c Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 6/8] add building management UI to game settings - Add Available Buildings section with checkboxes for each building - Add Enable All / Disable All buttons for quick configuration - Buildings automatically sync to all factories on change - Provides clear explanation of Satisfactory-style unlock system --- src/games/settings/GameSettingsModal.tsx | 66 ++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/src/games/settings/GameSettingsModal.tsx b/src/games/settings/GameSettingsModal.tsx index 0ffdd6e4..d4aedb31 100644 --- a/src/games/settings/GameSettingsModal.tsx +++ b/src/games/settings/GameSettingsModal.tsx @@ -1,5 +1,10 @@ import { SelectIconInput } from '@/core/form/SelectIconInput'; +import { useFormOnChange } from '@/core/form/useFormOnChange'; +import { useStore } from '@/core/zustand'; +import { GameSettings } from '@/games/Game'; +import { useGameAllowedBuildings, useGameSettings } from '@/games/gamesSlice'; import { + FactoryBuildingsForRecipes, FactoryConveyorBelts, FactoryPipelinesExclAlternates, } from '@/recipes/FactoryBuilding'; @@ -8,18 +13,16 @@ import { Button, Checkbox, ColorInput, + Group, Image, Modal, Space, Stack, + Text, Title, } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { IconSettings } from '@tabler/icons-react'; -import { useFormOnChange } from '@/core/form/useFormOnChange'; -import { useStore } from '@/core/zustand'; -import { GameSettings } from '@/games/Game'; -import { useGameSettings } from '@/games/gamesSlice'; export interface IGameSettingsModalProps { withLabel?: boolean; @@ -54,6 +57,7 @@ const PipelinesOptions = FactoryPipelinesExclAlternates.map( export function GameSettingsModal(props: IGameSettingsModalProps) { const [opened, { open, close }] = useDisclosure(false); const settings = useGameSettings(); + const allowedBuildings = useGameAllowedBuildings(); const onChangeHandler = useFormOnChange(updateGameSettings); return ( @@ -110,6 +114,60 @@ export function GameSettingsModal(props: IGameSettingsModalProps) { onChange={onChangeHandler('maxPipeline')} placeholder="No pipeline selected" /> + + Available Buildings + + + Select which buildings you have unlocked in your save. When you + create a new factory, only these buildings will be available. This + mirrors how Satisfactory unlocks work. + + + + + + {FactoryBuildingsForRecipes.map(building => ( + + + {building.name} + + } + checked={allowedBuildings?.includes(building.id) ?? false} + onChange={e => { + useStore + .getState() + .toggleGameBuilding(building.id, e.currentTarget.checked); + useStore.getState().syncGameBuildingsToFactories(); + }} + /> + ))} + From c996391a814f70990a1057c58c118a7e23fafa51 Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:04:37 -0600 Subject: [PATCH 7/8] add factory-specific building override UI - Add Factory Override toggle switch in solver limitations - Allow factories to override global building settings - Checkboxes disabled when using global settings - Shows contextual help text based on override state - Enables specialized factory configurations --- .../SolverLimitationsDrawer.tsx | 145 +++++++++++++----- 1 file changed, 106 insertions(+), 39 deletions(-) diff --git a/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx b/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx index b5c34c4d..53971478 100644 --- a/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx +++ b/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx @@ -1,10 +1,11 @@ import { FormOnChangeHandler } from '@/core/form/useFormOnChange'; import { useStore } from '@/core/zustand'; -import { useGameSetting } from '@/games/gamesSlice.ts'; +import { useFactory } from '@/factories/store/factoriesSlice'; +import { useGameAllowedBuildings, useGameSetting } from '@/games/gamesSlice.ts'; import { - FactoryBuildingsForRecipes, - FactoryConveyorBelts, - FactoryPipelinesExclAlternates, + FactoryBuildingsForRecipes, + FactoryConveyorBelts, + FactoryPipelinesExclAlternates, } from '@/recipes/FactoryBuilding'; import { AllFactoryItemsMap } from '@/recipes/FactoryItem'; import { FactoryItemImage } from '@/recipes/ui/FactoryItemImage'; @@ -12,16 +13,16 @@ import { WorldResourcesList } from '@/recipes/WorldResources'; import type { SolverInstance } from '@/solver/store/Solver'; import { usePathSolverRequest } from '@/solver/store/solverSelectors'; import { - Alert, - Checkbox, - Group, - Image, - List, - Radio, - SimpleGrid, - Stack, - Switch, - Text, + Alert, + Checkbox, + Group, + Image, + List, + Radio, + SimpleGrid, + Stack, + Switch, + Text } from '@mantine/core'; import { IconInfoCircleFilled } from '@tabler/icons-react'; import { useState } from 'react'; @@ -40,8 +41,13 @@ export function SolverLimitationsDrawer( const request = usePathSolverRequest(); const maxPipeline = useGameSetting('maxPipeline'); const maxBelt = useGameSetting('maxBelt'); + const factory = useFactory(id); + const gameAllowedBuildings = useGameAllowedBuildings(); const [advanced, setAdvanced] = useState(false); + const [useFactoryOverride, setUseFactoryOverride] = useState( + factory?.allowedBuildings !== undefined && factory?.allowedBuildings !== null + ); const showAdvanced = advanced || @@ -114,32 +120,93 @@ export function SolverLimitationsDrawer( })} - Buildings - {FactoryBuildingsForRecipes.map(building => ( - - - {building.name} - - } - checked={!request?.blockedBuildings?.includes(building.id)} - onChange={e => - useStore - .getState() - .toggleBlockedBuilding( - id!, - building.id, - !e.currentTarget.checked, - ) - } + + Buildings + { + const override = e.currentTarget.checked; + setUseFactoryOverride(override); + if (override) { + // Initialize with current game settings + useStore + .getState() + .setFactoryAllowedBuildings(id!, gameAllowedBuildings ?? []); + } else { + // Clear factory override, use game settings + useStore.getState().setFactoryAllowedBuildings(id!, null); + } + // Recalculate blocked buildings + const allowedBuildings = override + ? gameAllowedBuildings ?? [] + : gameAllowedBuildings ?? []; + const blockedBuildings = FactoryBuildingsForRecipes.filter( + b => !allowedBuildings.includes(b.id), + ).map(b => b.id); + useStore.getState().updateSolver(id!, solver => { + solver.request.blockedBuildings = blockedBuildings; + }); + }} /> - ))} + + {useFactoryOverride && ( + + This factory has custom building settings that override the global + game settings. + + )} + {!useFactoryOverride && ( + + Using global game building settings. Enable override to customize + for this factory. + + )} + {FactoryBuildingsForRecipes.map(building => { + const isChecked = useFactoryOverride + ? factory?.allowedBuildings?.includes(building.id) ?? false + : !request?.blockedBuildings?.includes(building.id); + + return ( + + + {building.name} + + } + checked={isChecked} + disabled={!useFactoryOverride} + onChange={e => { + if (useFactoryOverride) { + // Update factory's allowedBuildings + useStore + .getState() + .toggleFactoryBuilding( + id!, + building.id, + e.currentTarget.checked, + ); + // Recalculate blocked buildings for solver + const updatedFactory = + useStore.getState().factories.factories[id!]; + const blockedBuildings = FactoryBuildingsForRecipes.filter( + b => !updatedFactory.allowedBuildings?.includes(b.id), + ).map(b => b.id); + useStore.getState().updateSolver(id!, solver => { + solver.request.blockedBuildings = blockedBuildings; + }); + } + }} + /> + ); + })} Logistics From eb652bde6201a593917705c55741a52d783d37f4 Mon Sep 17 00:00:00 2001 From: Jacob Christian Date: Sat, 15 Nov 2025 15:40:07 -0600 Subject: [PATCH 8/8] ran npm run format --- package.json | 2 +- src/factories/store/factoriesSlice.ts | 5 +- src/games/gamesSlice.ts | 29 +- src/games/settings/GameSettingsModal.tsx | 3 +- src/games/store/gameFactoriesActions.ts | 9 +- src/recipes/FactoryRecipeId.ts | 310 +++++++++++++++++- src/recipes/graph/SchematicGraph.ts | 5 +- .../layout/nodes/machine-node/MachineNode.tsx | 5 +- .../SolverLimitationsDrawer.tsx | 40 ++- src/solver/share/SolverShareButton.tsx | 5 +- 10 files changed, 367 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 73dca938..b10b332a 100644 --- a/package.json +++ b/package.json @@ -95,4 +95,4 @@ "vitest": "^2.1.4" }, "packageManager": "npm@10.8.3" -} \ No newline at end of file +} diff --git a/src/factories/store/factoriesSlice.ts b/src/factories/store/factoriesSlice.ts index 04061a17..c855387c 100644 --- a/src/factories/store/factoriesSlice.ts +++ b/src/factories/store/factoriesSlice.ts @@ -44,7 +44,10 @@ export const factoriesSlice = createSlice({ if (!factory) return; // Initialize with empty array if not set - if (factory.allowedBuildings === undefined || factory.allowedBuildings === null) { + if ( + factory.allowedBuildings === undefined || + factory.allowedBuildings === null + ) { factory.allowedBuildings = []; } diff --git a/src/games/gamesSlice.ts b/src/games/gamesSlice.ts index 414fcf2a..1965ba04 100644 --- a/src/games/gamesSlice.ts +++ b/src/games/gamesSlice.ts @@ -79,24 +79,23 @@ export const gamesSlice = createSlice({ } state.games[targetId].allowedBuildings = allowedBuildings; }, - toggleGameBuilding: - (buildingId: string, enabled?: boolean) => state => { - const game = state.games[state.selected ?? '']; - if (!game) return; + toggleGameBuilding: (buildingId: string, enabled?: boolean) => state => { + const game = state.games[state.selected ?? '']; + if (!game) return; - if (!game.allowedBuildings) { - game.allowedBuildings = []; - } + if (!game.allowedBuildings) { + game.allowedBuildings = []; + } - const index = game.allowedBuildings.indexOf(buildingId); - const shouldAdd = enabled ?? index === -1; + const index = game.allowedBuildings.indexOf(buildingId); + const shouldAdd = enabled ?? index === -1; - if (shouldAdd && index === -1) { - game.allowedBuildings.push(buildingId); - } else if (!shouldAdd && index !== -1) { - game.allowedBuildings.splice(index, 1); - } - }, + if (shouldAdd && index === -1) { + game.allowedBuildings.push(buildingId); + } else if (!shouldAdd && index !== -1) { + game.allowedBuildings.splice(index, 1); + } + }, enableAllGameBuildings: () => state => { const game = state.games[state.selected ?? '']; if (!game) return; diff --git a/src/games/settings/GameSettingsModal.tsx b/src/games/settings/GameSettingsModal.tsx index d4aedb31..4c7d885e 100644 --- a/src/games/settings/GameSettingsModal.tsx +++ b/src/games/settings/GameSettingsModal.tsx @@ -145,7 +145,8 @@ export function GameSettingsModal(props: IGameSettingsModalProps) { Disable All - {FactoryBuildingsForRecipes.map(building => ( + + {FactoryBuildingsForRecipes.map(building => ( { const factory = state.factories.factories[factoryId]; const solver = state.solvers.instances[factoryId]; - + // Skip if factory has its own building overrides - if (factory?.allowedBuildings !== undefined && factory?.allowedBuildings !== null) { + if ( + factory?.allowedBuildings !== undefined && + factory?.allowedBuildings !== null + ) { return; } - + if (solver) { solver.request.blockedBuildings = blockedBuildings; } diff --git a/src/recipes/FactoryRecipeId.ts b/src/recipes/FactoryRecipeId.ts index b6f85824..e19ed9f3 100644 --- a/src/recipes/FactoryRecipeId.ts +++ b/src/recipes/FactoryRecipeId.ts @@ -1,2 +1,310 @@ /** Automatically generated */ -export type FactoryRecipeId = 'Recipe_IronPlate_C' | 'Recipe_IronRod_C' | 'Recipe_IngotIron_C' | 'Recipe_Alternate_RocketFuel_Nitro_C' | 'Recipe_RocketFuel_C' | 'Recipe_PackagedRocketFuel_C' | 'Recipe_UnpackageRocketFuel_C' | 'Recipe_Alternate_IonizedFuel_Dark_C' | 'Recipe_DarkEnergy_C' | 'Recipe_QuantumEnergy_C' | 'Recipe_DarkMatter_C' | 'Recipe_SuperpositionOscillator_C' | 'Recipe_TemporalProcessor_C' | 'Recipe_SpaceElevatorPart_12_C' | 'Recipe_IonizedFuel_C' | 'Recipe_PackagedIonizedFuel_C' | 'Recipe_UnpackageIonizedFuel_C' | 'Recipe_Alternate_Diamond_Turbo_C' | 'Recipe_SAMFluctuator_C' | 'Recipe_FicsiteMesh_C' | 'Recipe_FicsiteIngot_Iron_C' | 'Recipe_TimeCrystal_C' | 'Recipe_Diamond_C' | 'Recipe_IngotSAM_C' | 'Recipe_SpaceElevatorPart_10_C' | 'Recipe_FicsiteIngot_AL_C' | 'Recipe_FicsiteIngot_CAT_C' | 'Recipe_Bauxite_Caterium_C' | 'Recipe_Bauxite_Copper_C' | 'Recipe_Caterium_Copper_C' | 'Recipe_Caterium_Quartz_C' | 'Recipe_Coal_Iron_C' | 'Recipe_Coal_Limestone_C' | 'Recipe_Copper_Quartz_C' | 'Recipe_Copper_Sulfur_C' | 'Recipe_Iron_Limestone_C' | 'Recipe_Limestone_Sulfur_C' | 'Recipe_Nitrogen_Bauxite_C' | 'Recipe_Nitrogen_Caterium_C' | 'Recipe_Quartz_Bauxite_C' | 'Recipe_Quartz_Coal_C' | 'Recipe_Sulfur_Coal_C' | 'Recipe_Sulfur_Iron_C' | 'Recipe_Uranium_Bauxite_C' | 'Recipe_Alternate_Turbofuel_C' | 'Recipe_PackagedTurboFuel_C' | 'Recipe_UnpackageTurboFuel_C' | 'Recipe_Alternate_Coal_1_C' | 'Recipe_Alternate_Coal_2_C' | 'Recipe_Alternate_EnrichedCoal_C' | 'Recipe_CircuitBoard_C' | 'Recipe_LiquidFuel_C' | 'Recipe_PetroleumCoke_C' | 'Recipe_Plastic_C' | 'Recipe_Rubber_C' | 'Recipe_ResidualFuel_C' | 'Recipe_ResidualPlastic_C' | 'Recipe_ResidualRubber_C' | 'Recipe_Alternate_Diamond_Pink_C' | 'Recipe_Alternate_Diamond_Petroleum_C' | 'Recipe_Alternate_Diamond_OilBased_C' | 'Recipe_Alternate_Diamond_Cloudy_C' | 'Recipe_Alternate_DarkMatter_Trap_C' | 'Recipe_Alternate_DarkMatter_Crystallization_C' | 'Recipe_Alternate_WetConcrete_C' | 'Recipe_Alternate_TurboHeavyFuel_C' | 'Recipe_Alternate_SteelRod_C' | 'Recipe_SteelBeam_C' | 'Recipe_SteelPipe_C' | 'Recipe_IngotSteel_C' | 'Recipe_SpaceElevatorPart_2_C' | 'Recipe_Alternate_SteelCanister_C' | 'Recipe_FluidCanister_C' | 'Recipe_Fuel_C' | 'Recipe_LiquidBiofuel_C' | 'Recipe_PackagedBiofuel_C' | 'Recipe_PackagedCrudeOil_C' | 'Recipe_PackagedOilResidue_C' | 'Recipe_PackagedWater_C' | 'Recipe_UnpackageBioFuel_C' | 'Recipe_UnpackageFuel_C' | 'Recipe_UnpackageOil_C' | 'Recipe_UnpackageOilResidue_C' | 'Recipe_UnpackageWater_C' | 'Recipe_Alternate_SteamedCopperSheet_C' | 'Recipe_Alternate_RubberConcrete_C' | 'Recipe_Alternate_RecycledRubber_C' | 'Recipe_Alternate_PureQuartzCrystal_C' | 'Recipe_QuartzCrystal_C' | 'Recipe_Alternate_PureIronIngot_C' | 'Recipe_Alternate_PureCopperIngot_C' | 'Recipe_Alternate_PureCateriumIngot_C' | 'Recipe_PureAluminumIngot_C' | 'Recipe_AluminumCasing_C' | 'Recipe_AluminumSheet_C' | 'Recipe_AluminaSolution_C' | 'Recipe_AluminumScrap_C' | 'Recipe_PackagedAlumina_C' | 'Recipe_IngotAluminum_C' | 'Recipe_Silica_C' | 'Recipe_CrystalOscillator_C' | 'Recipe_UnpackageAlumina_C' | 'Recipe_Alternate_PolymerResin_C' | 'Recipe_Alternate_PlasticSmartPlating_C' | 'Recipe_Alternate_HighSpeedWiring_C' | 'Recipe_EncasedIndustrialBeam_C' | 'Recipe_Motor_C' | 'Recipe_Stator_C' | 'Recipe_SpaceElevatorPart_3_C' | 'Recipe_AILimiter_C' | 'Recipe_Alternate_HeavyOilResidue_C' | 'Recipe_Alternate_HeavyFlexibleFrame_C' | 'Recipe_Computer_C' | 'Recipe_ModularFrameHeavy_C' | 'Recipe_SpaceElevatorPart_4_C' | 'Recipe_SpaceElevatorPart_5_C' | 'Recipe_Alternate_FusedWire_C' | 'Recipe_Alternate_FlexibleFramework_C' | 'Recipe_Alternate_ElectrodeCircuitBoard_C' | 'Recipe_Alternate_ElectroAluminumScrap_C' | 'Recipe_Alternate_DilutedPackagedFuel_C' | 'Recipe_Alternate_CopperRotor_C' | 'Recipe_ModularFrame_C' | 'Recipe_Rotor_C' | 'Recipe_CopperSheet_C' | 'Recipe_SpaceElevatorPart_1_C' | 'Recipe_Alternate_CopperAlloyIngot_C' | 'Recipe_Alternate_CokeSteelIngot_C' | 'Recipe_Alternate_CoatedIronPlate_C' | 'Recipe_Alternate_CoatedIronCanister_C' | 'Recipe_Alternate_CoatedCable_C' | 'Recipe_Alternate_BoltedFrame_C' | 'Recipe_Alternate_AdheredIronPlate_C' | 'Recipe_Alternate_TurboPressureMotor_C' | 'Recipe_PlutoniumCell_C' | 'Recipe_PressureConversionCube_C' | 'Recipe_NitricAcid_C' | 'Recipe_NonFissileUranium_C' | 'Recipe_CopperDust_C' | 'Recipe_Plutonium_C' | 'Recipe_PlutoniumFuelRod_C' | 'Recipe_PackagedNitricAcid_C' | 'Recipe_SpaceElevatorPart_9_C' | 'Recipe_UnpackageNitricAcid_C' | 'Recipe_Alternate_TurboBlendFuel_C' | 'Recipe_UraniumCell_C' | 'Recipe_CoolingSystem_C' | 'Recipe_Battery_C' | 'Recipe_ComputerSuper_C' | 'Recipe_RadioControlUnit_C' | 'Recipe_SulfuricAcid_C' | 'Recipe_PackagedSulfuricAcid_C' | 'Recipe_SpaceElevatorPart_7_C' | 'Recipe_HighSpeedConnector_C' | 'Recipe_UnpackageSulfuricAcid_C' | 'Recipe_Alternate_SuperStateComputer_C' | 'Recipe_ElectromagneticControlRod_C' | 'Recipe_NuclearFuelRod_C' | 'Recipe_SpaceElevatorPart_6_C' | 'Recipe_Alternate_SloppyAlumina_C' | 'Recipe_Alternate_RadioControlSystem_C' | 'Recipe_Alternate_PlutoniumFuelUnit_C' | 'Recipe_Alternate_OCSupercomputer_C' | 'Recipe_HeatSink_C' | 'Recipe_FusedModularFrame_C' | 'Recipe_GasTank_C' | 'Recipe_PackagedNitrogen_C' | 'Recipe_UnpackageNitrogen_C' | 'Recipe_Alternate_InstantScrap_C' | 'Recipe_Alternate_InstantPlutoniumCell_C' | 'Recipe_Alternate_HeatFusedFrame_C' | 'Recipe_Alternate_FertileUranium_C' | 'Recipe_Alternate_ElectricMotor_C' | 'Recipe_Alternate_DilutedFuel_C' | 'Recipe_Alternate_CoolingDevice_C' | 'Recipe_Alternate_ClassicBattery_C' | 'Recipe_Alternate_AutomatedMiner_C' | 'Recipe_Alternate_AlcladCasing_C' | 'Recipe_Alternate_SteelPipe_Molded_C' | 'Recipe_Alternate_SteelPipe_Iron_C' | 'Recipe_Alternate_SteelCastedPlate_C' | 'Recipe_Alternate_SteelBeam_Molded_C' | 'Recipe_Alternate_SteelBeam_Aluminum_C' | 'Recipe_Alternate_AluminumRod_C' | 'Recipe_Alternate_AILimiter_Plastic_C' | 'Recipe_Alternate_Silica_Distilled_C' | 'Recipe_Alternate_Quartz_Purified_C' | 'Recipe_Alternate_Quartz_Fused_C' | 'Recipe_Alternate_IronIngot_Leached_C' | 'Recipe_Alternate_IronIngot_Basic_C' | 'Recipe_Alternate_CopperIngot_Tempered_C' | 'Recipe_Alternate_CopperIngot_Leached_C' | 'Recipe_Alternate_CateriumIngot_Tempered_C' | 'Recipe_Alternate_CateriumIngot_Leached_C' | 'Recipe_Alternate_Wire_2_C' | 'Recipe_Alternate_Wire_1_C' | 'Recipe_Alternate_UraniumCell_1_C' | 'Recipe_IngotCaterium_C' | 'Recipe_Alternate_TurboMotor_1_C' | 'Recipe_MotorTurbo_C' | 'Recipe_SpaceElevatorPart_8_C' | 'Recipe_Alternate_Stator_C' | 'Recipe_Alternate_Silica_C' | 'Recipe_Alternate_Screw_2_C' | 'Recipe_Alternate_Screw_C' | 'Recipe_Alternate_Rotor_C' | 'Recipe_Alternate_EncasedIndustrialBeam_C' | 'Recipe_Alternate_ReinforcedIronPlate_2_C' | 'Recipe_Alternate_ReinforcedIronPlate_1_C' | 'Recipe_Alternate_RadioControlUnit_1_C' | 'Recipe_Alternate_Quickwire_C' | 'Recipe_Alternate_Plastic_1_C' | 'Recipe_Alternate_NuclearFuelRod_1_C' | 'Recipe_Alternate_Motor_1_C' | 'Recipe_Alternate_ModularFrame_C' | 'Recipe_Alternate_IngotSteel_2_C' | 'Recipe_Alternate_IngotSteel_1_C' | 'Recipe_Alternate_IngotIron_C' | 'Recipe_Alternate_HighSpeedConnector_C' | 'Recipe_Alternate_ModularFrameHeavy_C' | 'Recipe_Alternate_HeatSink_1_C' | 'Recipe_Alternate_Gunpowder_1_C' | 'Recipe_Alternate_ElectromagneticControlRod_1_C' | 'Recipe_Alternate_CrystalOscillator_C' | 'Recipe_Alternate_Concrete_C' | 'Recipe_Alternate_Computer_2_C' | 'Recipe_Alternate_Computer_1_C' | 'Recipe_Alternate_CircuitBoard_2_C' | 'Recipe_Alternate_CircuitBoard_1_C' | 'Recipe_Alternate_Cable_2_C' | 'Recipe_Alternate_Cable_1_C' | 'Recipe_Ficsonium_C' | 'Recipe_FicsoniumFuelRod_C' | 'Recipe_SingularityCell_C' | 'Recipe_SpaceElevatorPart_11_C' | 'Recipe_FilterHazmat_C' | 'Recipe_Quickwire_C' | 'Recipe_Biofuel_C' | 'Recipe_Protein_Hog_C' | 'Recipe_Protein_Spitter_C' | 'Recipe_Biomass_Mycelia_C' | 'Recipe_PowerCrystalShard_1_C' | 'Recipe_Gunpowder_C' | 'Recipe_AlienPowerFuel_C' | 'Recipe_Protein_Stinger_C' | 'Recipe_Protein_Crab_C' | 'Recipe_AlienDNACapsule_C' | 'Recipe_Biomass_AlienProtein_C' | 'Recipe_SpikedRebar_C' | 'Recipe_CartridgeSmart_C' | 'Recipe_Rebar_Stunshot_C' | 'Recipe_FilterGasMask_C' | 'Recipe_NobeliskGas_C' | 'Recipe_Alternate_PolyesterFabric_C' | 'Recipe_Fabric_C' | 'Recipe_SyntheticPowerShard_C' | 'Recipe_PowerCrystalShard_3_C' | 'Recipe_PowerCrystalShard_2_C' | 'Recipe_NobeliskShockwave_C' | 'Recipe_Rebar_Spreadshot_C' | 'Recipe_CartridgeChaos_Packaged_C' | 'Recipe_CartridgeChaos_C' | 'Recipe_NobeliskNuke_C' | 'Recipe_Cartridge_C' | 'Recipe_Rebar_Explosive_C' | 'Recipe_NobeliskCluster_C' | 'Recipe_Nobelisk_C' | 'Recipe_GunpowderMK2_C' | 'Recipe_Snowball_C' | 'Recipe_XmasStar_C' | 'Recipe_XmasWreath_C' | 'Recipe_XmasBallCluster_C' | 'Recipe_XmasBall1_C' | 'Recipe_XmasBall2_C' | 'Recipe_XmasBall3_C' | 'Recipe_XmasBall4_C' | 'Recipe_Snow_C' | 'Recipe_XmasBranch_C' | 'Recipe_XmasBow_C' | 'Recipe_CandyCane_C' | 'Recipe_Biomass_Leaves_C' | 'Recipe_Biomass_Wood_C' | 'Recipe_IronPlateReinforced_C' | 'Recipe_Concrete_C' | 'Recipe_Screw_C' | 'Recipe_Cable_C' | 'Recipe_Wire_C' | 'Recipe_IngotCopper_C' | 'Recipe_Fireworks_01_C' | 'Recipe_Fireworks_02_C' | 'Recipe_Fireworks_03_C' | 'RecipeCustom_Build_GeneratorCoal_C_Desc_Coal_C' | 'RecipeCustom_Build_GeneratorCoal_C_Desc_CompactedCoal_C' | 'RecipeCustom_Build_GeneratorCoal_C_Desc_PetroleumCoke_C' | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidFuel_C' | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidTurboFuel_C' | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidBiofuel_C' | 'RecipeCustom_Build_GeneratorFuel_C_Desc_RocketFuel_C' | 'RecipeCustom_Build_GeneratorFuel_C_Desc_IonizedFuel_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Leaves_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Wood_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Mycelia_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_GenericBiomass_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Biofuel_C' | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_PackagedBiofuel_C' | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_NuclearFuelRod_C' | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_PlutoniumFuelRod_C' | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_FicsoniumFuelRod_C'; \ No newline at end of file +export type FactoryRecipeId = + | 'Recipe_IronPlate_C' + | 'Recipe_IronRod_C' + | 'Recipe_IngotIron_C' + | 'Recipe_Alternate_RocketFuel_Nitro_C' + | 'Recipe_RocketFuel_C' + | 'Recipe_PackagedRocketFuel_C' + | 'Recipe_UnpackageRocketFuel_C' + | 'Recipe_Alternate_IonizedFuel_Dark_C' + | 'Recipe_DarkEnergy_C' + | 'Recipe_QuantumEnergy_C' + | 'Recipe_DarkMatter_C' + | 'Recipe_SuperpositionOscillator_C' + | 'Recipe_TemporalProcessor_C' + | 'Recipe_SpaceElevatorPart_12_C' + | 'Recipe_IonizedFuel_C' + | 'Recipe_PackagedIonizedFuel_C' + | 'Recipe_UnpackageIonizedFuel_C' + | 'Recipe_Alternate_Diamond_Turbo_C' + | 'Recipe_SAMFluctuator_C' + | 'Recipe_FicsiteMesh_C' + | 'Recipe_FicsiteIngot_Iron_C' + | 'Recipe_TimeCrystal_C' + | 'Recipe_Diamond_C' + | 'Recipe_IngotSAM_C' + | 'Recipe_SpaceElevatorPart_10_C' + | 'Recipe_FicsiteIngot_AL_C' + | 'Recipe_FicsiteIngot_CAT_C' + | 'Recipe_Bauxite_Caterium_C' + | 'Recipe_Bauxite_Copper_C' + | 'Recipe_Caterium_Copper_C' + | 'Recipe_Caterium_Quartz_C' + | 'Recipe_Coal_Iron_C' + | 'Recipe_Coal_Limestone_C' + | 'Recipe_Copper_Quartz_C' + | 'Recipe_Copper_Sulfur_C' + | 'Recipe_Iron_Limestone_C' + | 'Recipe_Limestone_Sulfur_C' + | 'Recipe_Nitrogen_Bauxite_C' + | 'Recipe_Nitrogen_Caterium_C' + | 'Recipe_Quartz_Bauxite_C' + | 'Recipe_Quartz_Coal_C' + | 'Recipe_Sulfur_Coal_C' + | 'Recipe_Sulfur_Iron_C' + | 'Recipe_Uranium_Bauxite_C' + | 'Recipe_Alternate_Turbofuel_C' + | 'Recipe_PackagedTurboFuel_C' + | 'Recipe_UnpackageTurboFuel_C' + | 'Recipe_Alternate_Coal_1_C' + | 'Recipe_Alternate_Coal_2_C' + | 'Recipe_Alternate_EnrichedCoal_C' + | 'Recipe_CircuitBoard_C' + | 'Recipe_LiquidFuel_C' + | 'Recipe_PetroleumCoke_C' + | 'Recipe_Plastic_C' + | 'Recipe_Rubber_C' + | 'Recipe_ResidualFuel_C' + | 'Recipe_ResidualPlastic_C' + | 'Recipe_ResidualRubber_C' + | 'Recipe_Alternate_Diamond_Pink_C' + | 'Recipe_Alternate_Diamond_Petroleum_C' + | 'Recipe_Alternate_Diamond_OilBased_C' + | 'Recipe_Alternate_Diamond_Cloudy_C' + | 'Recipe_Alternate_DarkMatter_Trap_C' + | 'Recipe_Alternate_DarkMatter_Crystallization_C' + | 'Recipe_Alternate_WetConcrete_C' + | 'Recipe_Alternate_TurboHeavyFuel_C' + | 'Recipe_Alternate_SteelRod_C' + | 'Recipe_SteelBeam_C' + | 'Recipe_SteelPipe_C' + | 'Recipe_IngotSteel_C' + | 'Recipe_SpaceElevatorPart_2_C' + | 'Recipe_Alternate_SteelCanister_C' + | 'Recipe_FluidCanister_C' + | 'Recipe_Fuel_C' + | 'Recipe_LiquidBiofuel_C' + | 'Recipe_PackagedBiofuel_C' + | 'Recipe_PackagedCrudeOil_C' + | 'Recipe_PackagedOilResidue_C' + | 'Recipe_PackagedWater_C' + | 'Recipe_UnpackageBioFuel_C' + | 'Recipe_UnpackageFuel_C' + | 'Recipe_UnpackageOil_C' + | 'Recipe_UnpackageOilResidue_C' + | 'Recipe_UnpackageWater_C' + | 'Recipe_Alternate_SteamedCopperSheet_C' + | 'Recipe_Alternate_RubberConcrete_C' + | 'Recipe_Alternate_RecycledRubber_C' + | 'Recipe_Alternate_PureQuartzCrystal_C' + | 'Recipe_QuartzCrystal_C' + | 'Recipe_Alternate_PureIronIngot_C' + | 'Recipe_Alternate_PureCopperIngot_C' + | 'Recipe_Alternate_PureCateriumIngot_C' + | 'Recipe_PureAluminumIngot_C' + | 'Recipe_AluminumCasing_C' + | 'Recipe_AluminumSheet_C' + | 'Recipe_AluminaSolution_C' + | 'Recipe_AluminumScrap_C' + | 'Recipe_PackagedAlumina_C' + | 'Recipe_IngotAluminum_C' + | 'Recipe_Silica_C' + | 'Recipe_CrystalOscillator_C' + | 'Recipe_UnpackageAlumina_C' + | 'Recipe_Alternate_PolymerResin_C' + | 'Recipe_Alternate_PlasticSmartPlating_C' + | 'Recipe_Alternate_HighSpeedWiring_C' + | 'Recipe_EncasedIndustrialBeam_C' + | 'Recipe_Motor_C' + | 'Recipe_Stator_C' + | 'Recipe_SpaceElevatorPart_3_C' + | 'Recipe_AILimiter_C' + | 'Recipe_Alternate_HeavyOilResidue_C' + | 'Recipe_Alternate_HeavyFlexibleFrame_C' + | 'Recipe_Computer_C' + | 'Recipe_ModularFrameHeavy_C' + | 'Recipe_SpaceElevatorPart_4_C' + | 'Recipe_SpaceElevatorPart_5_C' + | 'Recipe_Alternate_FusedWire_C' + | 'Recipe_Alternate_FlexibleFramework_C' + | 'Recipe_Alternate_ElectrodeCircuitBoard_C' + | 'Recipe_Alternate_ElectroAluminumScrap_C' + | 'Recipe_Alternate_DilutedPackagedFuel_C' + | 'Recipe_Alternate_CopperRotor_C' + | 'Recipe_ModularFrame_C' + | 'Recipe_Rotor_C' + | 'Recipe_CopperSheet_C' + | 'Recipe_SpaceElevatorPart_1_C' + | 'Recipe_Alternate_CopperAlloyIngot_C' + | 'Recipe_Alternate_CokeSteelIngot_C' + | 'Recipe_Alternate_CoatedIronPlate_C' + | 'Recipe_Alternate_CoatedIronCanister_C' + | 'Recipe_Alternate_CoatedCable_C' + | 'Recipe_Alternate_BoltedFrame_C' + | 'Recipe_Alternate_AdheredIronPlate_C' + | 'Recipe_Alternate_TurboPressureMotor_C' + | 'Recipe_PlutoniumCell_C' + | 'Recipe_PressureConversionCube_C' + | 'Recipe_NitricAcid_C' + | 'Recipe_NonFissileUranium_C' + | 'Recipe_CopperDust_C' + | 'Recipe_Plutonium_C' + | 'Recipe_PlutoniumFuelRod_C' + | 'Recipe_PackagedNitricAcid_C' + | 'Recipe_SpaceElevatorPart_9_C' + | 'Recipe_UnpackageNitricAcid_C' + | 'Recipe_Alternate_TurboBlendFuel_C' + | 'Recipe_UraniumCell_C' + | 'Recipe_CoolingSystem_C' + | 'Recipe_Battery_C' + | 'Recipe_ComputerSuper_C' + | 'Recipe_RadioControlUnit_C' + | 'Recipe_SulfuricAcid_C' + | 'Recipe_PackagedSulfuricAcid_C' + | 'Recipe_SpaceElevatorPart_7_C' + | 'Recipe_HighSpeedConnector_C' + | 'Recipe_UnpackageSulfuricAcid_C' + | 'Recipe_Alternate_SuperStateComputer_C' + | 'Recipe_ElectromagneticControlRod_C' + | 'Recipe_NuclearFuelRod_C' + | 'Recipe_SpaceElevatorPart_6_C' + | 'Recipe_Alternate_SloppyAlumina_C' + | 'Recipe_Alternate_RadioControlSystem_C' + | 'Recipe_Alternate_PlutoniumFuelUnit_C' + | 'Recipe_Alternate_OCSupercomputer_C' + | 'Recipe_HeatSink_C' + | 'Recipe_FusedModularFrame_C' + | 'Recipe_GasTank_C' + | 'Recipe_PackagedNitrogen_C' + | 'Recipe_UnpackageNitrogen_C' + | 'Recipe_Alternate_InstantScrap_C' + | 'Recipe_Alternate_InstantPlutoniumCell_C' + | 'Recipe_Alternate_HeatFusedFrame_C' + | 'Recipe_Alternate_FertileUranium_C' + | 'Recipe_Alternate_ElectricMotor_C' + | 'Recipe_Alternate_DilutedFuel_C' + | 'Recipe_Alternate_CoolingDevice_C' + | 'Recipe_Alternate_ClassicBattery_C' + | 'Recipe_Alternate_AutomatedMiner_C' + | 'Recipe_Alternate_AlcladCasing_C' + | 'Recipe_Alternate_SteelPipe_Molded_C' + | 'Recipe_Alternate_SteelPipe_Iron_C' + | 'Recipe_Alternate_SteelCastedPlate_C' + | 'Recipe_Alternate_SteelBeam_Molded_C' + | 'Recipe_Alternate_SteelBeam_Aluminum_C' + | 'Recipe_Alternate_AluminumRod_C' + | 'Recipe_Alternate_AILimiter_Plastic_C' + | 'Recipe_Alternate_Silica_Distilled_C' + | 'Recipe_Alternate_Quartz_Purified_C' + | 'Recipe_Alternate_Quartz_Fused_C' + | 'Recipe_Alternate_IronIngot_Leached_C' + | 'Recipe_Alternate_IronIngot_Basic_C' + | 'Recipe_Alternate_CopperIngot_Tempered_C' + | 'Recipe_Alternate_CopperIngot_Leached_C' + | 'Recipe_Alternate_CateriumIngot_Tempered_C' + | 'Recipe_Alternate_CateriumIngot_Leached_C' + | 'Recipe_Alternate_Wire_2_C' + | 'Recipe_Alternate_Wire_1_C' + | 'Recipe_Alternate_UraniumCell_1_C' + | 'Recipe_IngotCaterium_C' + | 'Recipe_Alternate_TurboMotor_1_C' + | 'Recipe_MotorTurbo_C' + | 'Recipe_SpaceElevatorPart_8_C' + | 'Recipe_Alternate_Stator_C' + | 'Recipe_Alternate_Silica_C' + | 'Recipe_Alternate_Screw_2_C' + | 'Recipe_Alternate_Screw_C' + | 'Recipe_Alternate_Rotor_C' + | 'Recipe_Alternate_EncasedIndustrialBeam_C' + | 'Recipe_Alternate_ReinforcedIronPlate_2_C' + | 'Recipe_Alternate_ReinforcedIronPlate_1_C' + | 'Recipe_Alternate_RadioControlUnit_1_C' + | 'Recipe_Alternate_Quickwire_C' + | 'Recipe_Alternate_Plastic_1_C' + | 'Recipe_Alternate_NuclearFuelRod_1_C' + | 'Recipe_Alternate_Motor_1_C' + | 'Recipe_Alternate_ModularFrame_C' + | 'Recipe_Alternate_IngotSteel_2_C' + | 'Recipe_Alternate_IngotSteel_1_C' + | 'Recipe_Alternate_IngotIron_C' + | 'Recipe_Alternate_HighSpeedConnector_C' + | 'Recipe_Alternate_ModularFrameHeavy_C' + | 'Recipe_Alternate_HeatSink_1_C' + | 'Recipe_Alternate_Gunpowder_1_C' + | 'Recipe_Alternate_ElectromagneticControlRod_1_C' + | 'Recipe_Alternate_CrystalOscillator_C' + | 'Recipe_Alternate_Concrete_C' + | 'Recipe_Alternate_Computer_2_C' + | 'Recipe_Alternate_Computer_1_C' + | 'Recipe_Alternate_CircuitBoard_2_C' + | 'Recipe_Alternate_CircuitBoard_1_C' + | 'Recipe_Alternate_Cable_2_C' + | 'Recipe_Alternate_Cable_1_C' + | 'Recipe_Ficsonium_C' + | 'Recipe_FicsoniumFuelRod_C' + | 'Recipe_SingularityCell_C' + | 'Recipe_SpaceElevatorPart_11_C' + | 'Recipe_FilterHazmat_C' + | 'Recipe_Quickwire_C' + | 'Recipe_Biofuel_C' + | 'Recipe_Protein_Hog_C' + | 'Recipe_Protein_Spitter_C' + | 'Recipe_Biomass_Mycelia_C' + | 'Recipe_PowerCrystalShard_1_C' + | 'Recipe_Gunpowder_C' + | 'Recipe_AlienPowerFuel_C' + | 'Recipe_Protein_Stinger_C' + | 'Recipe_Protein_Crab_C' + | 'Recipe_AlienDNACapsule_C' + | 'Recipe_Biomass_AlienProtein_C' + | 'Recipe_SpikedRebar_C' + | 'Recipe_CartridgeSmart_C' + | 'Recipe_Rebar_Stunshot_C' + | 'Recipe_FilterGasMask_C' + | 'Recipe_NobeliskGas_C' + | 'Recipe_Alternate_PolyesterFabric_C' + | 'Recipe_Fabric_C' + | 'Recipe_SyntheticPowerShard_C' + | 'Recipe_PowerCrystalShard_3_C' + | 'Recipe_PowerCrystalShard_2_C' + | 'Recipe_NobeliskShockwave_C' + | 'Recipe_Rebar_Spreadshot_C' + | 'Recipe_CartridgeChaos_Packaged_C' + | 'Recipe_CartridgeChaos_C' + | 'Recipe_NobeliskNuke_C' + | 'Recipe_Cartridge_C' + | 'Recipe_Rebar_Explosive_C' + | 'Recipe_NobeliskCluster_C' + | 'Recipe_Nobelisk_C' + | 'Recipe_GunpowderMK2_C' + | 'Recipe_Snowball_C' + | 'Recipe_XmasStar_C' + | 'Recipe_XmasWreath_C' + | 'Recipe_XmasBallCluster_C' + | 'Recipe_XmasBall1_C' + | 'Recipe_XmasBall2_C' + | 'Recipe_XmasBall3_C' + | 'Recipe_XmasBall4_C' + | 'Recipe_Snow_C' + | 'Recipe_XmasBranch_C' + | 'Recipe_XmasBow_C' + | 'Recipe_CandyCane_C' + | 'Recipe_Biomass_Leaves_C' + | 'Recipe_Biomass_Wood_C' + | 'Recipe_IronPlateReinforced_C' + | 'Recipe_Concrete_C' + | 'Recipe_Screw_C' + | 'Recipe_Cable_C' + | 'Recipe_Wire_C' + | 'Recipe_IngotCopper_C' + | 'Recipe_Fireworks_01_C' + | 'Recipe_Fireworks_02_C' + | 'Recipe_Fireworks_03_C' + | 'RecipeCustom_Build_GeneratorCoal_C_Desc_Coal_C' + | 'RecipeCustom_Build_GeneratorCoal_C_Desc_CompactedCoal_C' + | 'RecipeCustom_Build_GeneratorCoal_C_Desc_PetroleumCoke_C' + | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidFuel_C' + | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidTurboFuel_C' + | 'RecipeCustom_Build_GeneratorFuel_C_Desc_LiquidBiofuel_C' + | 'RecipeCustom_Build_GeneratorFuel_C_Desc_RocketFuel_C' + | 'RecipeCustom_Build_GeneratorFuel_C_Desc_IonizedFuel_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Leaves_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Wood_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Mycelia_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_GenericBiomass_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_Biofuel_C' + | 'RecipeCustom_Build_GeneratorBiomass_Automated_C_Desc_PackagedBiofuel_C' + | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_NuclearFuelRod_C' + | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_PlutoniumFuelRod_C' + | 'RecipeCustom_Build_GeneratorNuclear_C_Desc_FicsoniumFuelRod_C'; diff --git a/src/recipes/graph/SchematicGraph.ts b/src/recipes/graph/SchematicGraph.ts index 6ad2023a..175f14ff 100644 --- a/src/recipes/graph/SchematicGraph.ts +++ b/src/recipes/graph/SchematicGraph.ts @@ -1,6 +1,9 @@ import Graph from 'graphology'; import { bfsFromNode } from 'graphology-traversal'; -import { AllFactoryRecipesMap, type FactoryRecipe } from '@/recipes/FactoryRecipe'; +import { + AllFactoryRecipesMap, + type FactoryRecipe, +} from '@/recipes/FactoryRecipe'; import { AllFactorySchematics, type FactorySchematic, diff --git a/src/solver/layout/nodes/machine-node/MachineNode.tsx b/src/solver/layout/nodes/machine-node/MachineNode.tsx index 4cb38aa4..5ae59c89 100644 --- a/src/solver/layout/nodes/machine-node/MachineNode.tsx +++ b/src/solver/layout/nodes/machine-node/MachineNode.tsx @@ -31,10 +31,7 @@ import { FactoryItemImage } from '@/recipes/ui/FactoryItemImage'; import { RepeatingNumber } from '@/core/intl/NumberFormatter'; import { useStore } from '@/core/zustand'; import { AllFactoryBuildingsMap } from '@/recipes/FactoryBuilding'; -import { - AllFactoryItemsMap, - type FactoryItem, -} from '@/recipes/FactoryItem'; +import { AllFactoryItemsMap, type FactoryItem } from '@/recipes/FactoryItem'; import { FactoryRecipe, getRecipeDisplayName, diff --git a/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx b/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx index 53971478..de574389 100644 --- a/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx +++ b/src/solver/page/request-drawer/SolverLimitationsDrawer.tsx @@ -3,9 +3,9 @@ import { useStore } from '@/core/zustand'; import { useFactory } from '@/factories/store/factoriesSlice'; import { useGameAllowedBuildings, useGameSetting } from '@/games/gamesSlice.ts'; import { - FactoryBuildingsForRecipes, - FactoryConveyorBelts, - FactoryPipelinesExclAlternates, + FactoryBuildingsForRecipes, + FactoryConveyorBelts, + FactoryPipelinesExclAlternates, } from '@/recipes/FactoryBuilding'; import { AllFactoryItemsMap } from '@/recipes/FactoryItem'; import { FactoryItemImage } from '@/recipes/ui/FactoryItemImage'; @@ -13,16 +13,16 @@ import { WorldResourcesList } from '@/recipes/WorldResources'; import type { SolverInstance } from '@/solver/store/Solver'; import { usePathSolverRequest } from '@/solver/store/solverSelectors'; import { - Alert, - Checkbox, - Group, - Image, - List, - Radio, - SimpleGrid, - Stack, - Switch, - Text + Alert, + Checkbox, + Group, + Image, + List, + Radio, + SimpleGrid, + Stack, + Switch, + Text, } from '@mantine/core'; import { IconInfoCircleFilled } from '@tabler/icons-react'; import { useState } from 'react'; @@ -46,7 +46,8 @@ export function SolverLimitationsDrawer( const [advanced, setAdvanced] = useState(false); const [useFactoryOverride, setUseFactoryOverride] = useState( - factory?.allowedBuildings !== undefined && factory?.allowedBuildings !== null + factory?.allowedBuildings !== undefined && + factory?.allowedBuildings !== null, ); const showAdvanced = @@ -133,15 +134,18 @@ export function SolverLimitationsDrawer( // Initialize with current game settings useStore .getState() - .setFactoryAllowedBuildings(id!, gameAllowedBuildings ?? []); + .setFactoryAllowedBuildings( + id!, + gameAllowedBuildings ?? [], + ); } else { // Clear factory override, use game settings useStore.getState().setFactoryAllowedBuildings(id!, null); } // Recalculate blocked buildings const allowedBuildings = override - ? gameAllowedBuildings ?? [] - : gameAllowedBuildings ?? []; + ? (gameAllowedBuildings ?? []) + : (gameAllowedBuildings ?? []); const blockedBuildings = FactoryBuildingsForRecipes.filter( b => !allowedBuildings.includes(b.id), ).map(b => b.id); @@ -165,7 +169,7 @@ export function SolverLimitationsDrawer( )} {FactoryBuildingsForRecipes.map(building => { const isChecked = useFactoryOverride - ? factory?.allowedBuildings?.includes(building.id) ?? false + ? (factory?.allowedBuildings?.includes(building.id) ?? false) : !request?.blockedBuildings?.includes(building.id); return ( diff --git a/src/solver/share/SolverShareButton.tsx b/src/solver/share/SolverShareButton.tsx index 1d8c9ee5..51191f83 100644 --- a/src/solver/share/SolverShareButton.tsx +++ b/src/solver/share/SolverShareButton.tsx @@ -20,7 +20,10 @@ import { LoginModal } from '@/auth/LoginModal'; import { Json } from '@/core/database.types'; import { supabaseClient } from '@/core/supabase'; import { useStore } from '@/core/zustand'; -import { sharedSolverUUIDTranslator, SolverInstance } from '@/solver/store/Solver'; +import { + sharedSolverUUIDTranslator, + SolverInstance, +} from '@/solver/store/Solver'; import { usePathSolverInstance } from '@/solver/store/solverSelectors'; export interface ISharedSolverData {