Home Reference Source

js/modloader/mod.js

/**
 * @typedef {{
 * title: String,
 * id: String,
 * description: String,
 * authors: Array<String>,
 * version: String,
 * gameVersion: number,
 * dependencies: Array<String>,
 * incompatible: Array<String>,
 * translations: {},
 * settings: {},
 * updateStaticSettings: Function,
 * updateStaticTranslations: Function,
 * gameInitializedRootClasses: Function,
 * gameInitializedRootManagers: Function,
 * gameBeforeFirstUpdate: Function,
 * main: Function,
 * }} ModInfo
 */
import { Signal, STOP_PROPAGATION } from "../core/signal";
import { Application } from "../application";
import { cachebust } from "../core/cachebust";
import { ClickDetector, clickDetectorGlobals, MAX_MOVE_DISTANCE_PX } from "../core/click_detector";
import { GameState } from "../core/game_state";
import { Loader } from "../core/loader";
import {
    AtlasSprite,
    BaseSprite,
    FULL_CLIP_RECT,
    ORIGINAL_SPRITE_SCALE,
    RegularSprite,
    SpriteAtlasLink,
} from "../core/sprites";
import { TextualGameState } from "../core/textual_game_state";
import {
    accessNestedPropertyReverse,
    arrayDelete,
    arrayDeleteValue,
    clamp,
    epsilonCompare,
    fastArrayDelete,
    fastArrayDeleteValue,
    fastArrayDeleteValueIfContained,
    fillInLinkIntoTranslation,
    findNiceIntegerValue,
    findNiceValue,
    formatBigNumber,
    formatBigNumberFull,
    formatItemsPerSecond,
    formatSeconds,
    formatSecondsToTimeAgo,
    generateFileDownload,
    generateMatrixRotations,
    getIPCRenderer,
    getPlatformName,
    getRomanNumber,
    isAndroid,
    isIos,
    isSupportedBrowser,
    lerp,
    make2DUndefinedArray,
    makeButton,
    makeButtonElement,
    makeDiv,
    newEmptyMap,
    randomChoice,
    randomInt,
    removeAllChildren,
    rotateDirectionalObject,
    rotateFlatMatrix3x3,
    round1Digit,
    round1DigitLocalized,
    round2Digits,
    round3Digits,
    round4Digits,
    safeModulo,
    smoothPulse,
    startFileChoose,
    waitNextFrame,
} from "../core/utils";
import {
    arrayAllDirections,
    enumAngleToDirection,
    enumDirection,
    enumDirectionToAngle,
    enumDirectionToVector,
    enumInvertedDirections,
    mixVector,
    Vector,
} from "../core/vector";
import { AutomaticSave, enumSavePriority } from "../game/automatic_save";
import { BaseItem } from "../game/base_item";
import {
    Camera,
    enumMouseButton,
    USER_INTERACT_MOVE,
    USER_INTERACT_TOUCHEND,
    USER_INTERACT_ZOOM,
} from "../game/camera";
import {
    enumColorMixingResults,
    enumColors,
    enumColorsToHexCode,
    enumColorToShortcode,
} from "../game/colors";
import { Component } from "../game/component";
import { BeltComponent } from "../game/components/belt";
import { BeltReaderComponent } from "../game/components/belt_reader";
import { BeltUnderlaysComponent, enumClippedBeltUnderlayType } from "../game/components/belt_underlays";
import { ConstantSignalComponent } from "../game/components/constant_signal";
import { DisplayComponent } from "../game/components/display";
import { FilterComponent } from "../game/components/filter";
import { HubComponent } from "../game/components/hub";
import { ItemAcceptorComponent } from "../game/components/item_acceptor";
import { ItemEjectorComponent } from "../game/components/item_ejector";
import {
    enumItemProcessorRequirements,
    enumItemProcessorTypes,
    ItemProcessorComponent,
} from "../game/components/item_processor";
import { ItemProducerComponent } from "../game/components/item_producer";
import { LeverComponent } from "../game/components/lever";
import { LogicGateComponent } from "../game/components/logic_gate";
import { MinerComponent } from "../game/components/miner";
import { StaticMapEntityComponent } from "../game/components/static_map_entity";
import { StorageComponent } from "../game/components/storage";
import { UndergroundBeltComponent } from "../game/components/underground_belt";
import { WireComponent } from "../game/components/wire";
import { WiredPinsComponent } from "../game/components/wired_pins";
import { WireTunnelComponent } from "../game/components/wire_tunnel";
import { GameMode } from "../game/game_mode";
import { GameSystem } from "../game/game_system";
import { GameSystemWithFilter } from "../game/game_system_with_filter";
import { HubGoals } from "../game/hub_goals";
import { HUDBaseToolbar } from "../game/hud/parts/base_toolbar";
import { HUDBuildingsToolbar } from "../game/hud/parts/buildings_toolbar";
import { enumNotificationType, HUDNotifications } from "../game/hud/parts/notifications";
import { enumDisplayMode, HUDShapeStatisticsHandle } from "../game/hud/parts/statistics_handle";
import { HUDWiresToolbar } from "../game/hud/parts/wires_toolbar";
import { BooleanItem, BOOL_FALSE_SINGLETON, BOOL_TRUE_SINGLETON } from "../game/items/boolean_item";
import { ColorItem } from "../game/items/color_item";
import { ShapeItem } from "../game/items/shape_item";
import { KeyActionMapper, Keybinding, KEYMAPPINGS } from "../game/key_action_mapper";
import { MapChunk } from "../game/map_chunk";
import { defaultBuildingVariant, MetaBuilding } from "../game/meta_building";
import { RegularGameMode } from "../game/modes/regular";
import { enumAnalyticsDataSource, ProductionAnalytics } from "../game/production_analytics";
import { BeltSystem } from "../game/systems/belt";
import { BeltReaderSystem } from "../game/systems/belt_reader";
import { BeltUnderlaysSystem } from "../game/systems/belt_underlays";
import { ConstantSignalSystem } from "../game/systems/constant_signal";
import { DisplaySystem } from "../game/systems/display";
import { FilterSystem } from "../game/systems/filter";
import { HubSystem } from "../game/systems/hub";
import { ItemAcceptorSystem } from "../game/systems/item_acceptor";
import { ItemEjectorSystem } from "../game/systems/item_ejector";
import { ItemProcessorSystem } from "../game/systems/item_processor";
import { ItemProcessorOverlaysSystem } from "../game/systems/item_processor_overlays";
import { ItemProducerSystem } from "../game/systems/item_producer";
import { LeverSystem } from "../game/systems/lever";
import { LogicGateSystem } from "../game/systems/logic_gate";
import { MapResourcesSystem } from "../game/systems/map_resources";
import { MinerSystem } from "../game/systems/miner";
import { StaticMapEntitySystem } from "../game/systems/static_map_entity";
import { StorageSystem } from "../game/systems/storage";
import { UndergroundBeltSystem } from "../game/systems/underground_belt";
import { WireSystem } from "../game/systems/wire";
import { WiredPinsSystem } from "../game/systems/wired_pins";
import { applyGameTheme, VANILLA_THEMES } from "../game/theme";
import { BaseGameSpeed } from "../game/time/base_game_speed";
import { FastForwardGameSpeed } from "../game/time/fast_forward_game_speed";
import { PausedGameSpeed } from "../game/time/paused_game_speed";
import { RegularGameSpeed } from "../game/time/regular_game_speed";
import { enumHubGoalRewards } from "../game/tutorial_goals";
import { enumHubGoalRewardsToContentUnlocked } from "../game/tutorial_goals_mappings";
import {
    allApplicationSettings,
    ApplicationSettings,
    autosaveIntervals,
    enumCategories,
    getApplicationSettingById,
    movementSpeeds,
    scrollWheelSensitivities,
    uiScales,
} from "../profile/application_settings";
import { EnumSetting, BoolSetting, RangeSetting, BaseSetting } from "../profile/setting_types";
import { enumLocalSavegameStatus, SavegameManager } from "../savegame/savegame_manager";
import {
    BasicSerializableObject,
    deserializeSchema,
    extendSchema,
    serializeSchema,
    types,
    verifySchema,
} from "../savegame/serialization";
import { AboutState } from "../states/about";
import { ChangelogState } from "../states/changelog";
import { InGameState } from "../states/ingame";
import { KeybindingsState } from "../states/keybindings";
import { MainMenuState } from "../states/main_menu";
import { MobileWarningState } from "../states/mobile_warning";
import { PreloadState } from "../states/preload";
import { SettingsState } from "../states/settings";
import { T } from "../translations";
import {
    MUSIC,
    MusicInstanceInterface,
    SoundInstanceInterface,
    SoundInterface,
    SOUNDS,
} from "../platform/sound";
import { HUDSettingsMenu } from "../game/hud/parts/settings_menu";
import { HUDBetaOverlay } from "../game/hud/parts/beta_overlay";
import { HUDBlueprintPlacer } from "../game/hud/parts/blueprint_placer";
import { HUDBuildingPlacer } from "../game/hud/parts/building_placer";
import { HUDBuildingPlacerLogic } from "../game/hud/parts/building_placer_logic";
import { HUDCatMemes } from "../game/hud/parts/cat_memes";
import { HUDChangesDebugger } from "../game/hud/parts/debug_changes";
import { HUDColorBlindHelper } from "../game/hud/parts/color_blind_helper";
import { HUDConstantSignalEdit } from "../game/hud/parts/constant_signal_edit";
import { HUDDebugInfo } from "../game/hud/parts/debug_info";
import { HUDEntityDebugger } from "../game/hud/parts/entity_debugger";
import { HUDGameMenu } from "../game/hud/parts/game_menu";
import { HUDInteractiveTutorial } from "../game/hud/parts/interactive_tutorial";
import { HUDKeybindingOverlay } from "../game/hud/parts/keybinding_overlay";
import { HUDLayerPreview } from "../game/hud/parts/layer_preview";
import { HUDLeverToggle } from "../game/hud/parts/lever_toggle";
import { HUDMassSelector } from "../game/hud/parts/mass_selector";
import { HUDMinerHighlight } from "../game/hud/parts/miner_highlight";
import { HUDModalDialogs } from "../game/hud/parts/modal_dialogs";
import { HUDPartTutorialHints } from "../game/hud/parts/tutorial_hints";
import { HUDPinnedShapes } from "../game/hud/parts/pinned_shapes";
import { HUDSandboxController } from "../game/hud/parts/sandbox_controller";
import { HUDScreenshotExporter } from "../game/hud/parts/screenshot_exporter";
import { HUDShapeViewer } from "../game/hud/parts/shape_viewer";
import { HUDShop } from "../game/hud/parts/shop";
import { HUDStandaloneAdvantages } from "../game/hud/parts/standalone_advantages";
import { HUDStatistics } from "../game/hud/parts/statistics";
import { HUDTutorialVideoOffer } from "../game/hud/parts/tutorial_video_offer";
import { HUDUnlockNotification } from "../game/hud/parts/unlock_notification";
import { HUDVignetteOverlay } from "../game/hud/parts/vignette_overlay";
import { HUDWatermark } from "../game/hud/parts/watermark";
import { HUDWaypoints } from "../game/hud/parts/waypoints";
import { HUDWireInfo } from "../game/hud/parts/wire_info";
import { HUDWiresOverlay } from "../game/hud/parts/wires_overlay";
import { BaseHUDPart } from "../game/hud/base_hud_part";
import { GameHUD } from "../game/hud/hud";
import { matchOverwriteRecursiveSettings } from "./overwrite";
import { AtlasDefinition, atlasFiles } from "../core/atlas_definitions";
import { BackgroundResourcesLoader } from "../core/background_resources_loader";
import {
    clearBufferBacklog,
    disableImageSmoothing,
    enableImageSmoothing,
    freeCanvas,
    getBufferStats,
    getBufferVramUsageBytes,
    makeOffscreenBuffer,
    registerCanvas,
} from "../core/buffer_utils";
import {
    IS_DEBUG,
    SUPPORT_TOUCH,
    IS_MAC,
    THIRDPARTY_URLS,
    A_B_TESTING_LINK_TYPE,
    globalConfig,
    IS_MOBILE,
} from "../core/config";
import {
    getDeviceDPI,
    smoothenDpi,
    prepareHighDPIContext,
    resizeHighDPICanvas,
    resizeCanvas,
    resizeCanvasAndClear,
} from "../core/dpi_manager";
import { DrawParameters } from "../core/draw_parameters";
import { initDrawUtils, drawRotatedSprite, drawSpriteClipped } from "../core/draw_utils";
import { APPLICATION_ERROR_OCCURED } from "../core/error_handler";
import { ExplainedResult } from "../core/explained_result";
import { Factory } from "../core/factory";
import {
    gMetaBuildingRegistry,
    gBuildingsByCategory,
    gComponentRegistry,
    gGameModeRegistry,
    gGameSpeedRegistry,
    gItemRegistry,
    initBuildingsByCategory,
} from "../core/global_registries";
import { GLOBAL_APP, setGlobalApp } from "../core/globals";
import { InputDistributor } from "../core/input_distributor";
import { InputReceiver } from "../core/input_receiver";
import {
    createLogger,
    serializeError,
    stringifyObjectContainingErrors,
    globalDebug,
    globalLog,
    globalWarn,
    globalError,
    logSection,
} from "../core/logging";
import {
    compressU8,
    compressU8WHeader,
    decompressU8WHeader,
    compressX64,
    decompressX64,
} from "../core/lzstring";
import { Dialog, DialogOptionChooser, DialogLoading, DialogWithForm } from "../core/modal_dialog_elements";
import {
    FormElement,
    FormElementInput,
    FormElementCheckbox,
    FormElementItemChooser,
} from "../core/modal_dialog_forms";
import { queryParamOptions } from "../core/query_parameters";
import { ReadWriteProxy } from "../core/read_write_proxy";
import { Rectangle } from "../core/rectangle";
import { PROMISE_ABORTED, RequestChannel } from "../core/request_channel";
import { RestrictionManager } from "../core/restriction_manager";
import { RandomNumberGenerator } from "../core/rng";
import { sha1, getNameOfProvider, CRC_PREFIX, computeCrc } from "../core/sensitive_utils.encrypt";
import { SingletonFactory } from "../core/singleton_factory";
import { StaleAreaDetector } from "../core/stale_area_detector";
import { StateManager } from "../core/state_manager";
import { TrackedState } from "../core/tracked_state";
import { BeltPath } from "../game/belt_path";
import { Blueprint } from "../game/blueprint";
import {
    gBuildingVariants,
    registerBuildingVariant,
    getBuildingDataFromCode,
    getCodeFromBuildingData,
} from "../game/building_codes";
import { GameCore } from "../game/core";
import { DynamicTickrate } from "../game/dynamic_tickrate";
import { Entity } from "../game/entity";
import { EntityManager } from "../game/entity_manager";
import { GameLoadingOverlay } from "../game/game_loading_overlay";
import { GameSystemManager } from "../game/game_system_manager";
import { getRandomHint } from "../game/hints";
import { typeItemSingleton, itemResolverSingleton } from "../game/item_resolver";
import { GameLogic } from "../game/logic";
import { BaseMap } from "../game/map";
import { MapChunkView } from "../game/map_chunk_view";
import { MapView } from "../game/map_view";
import { GameRoot } from "../game/root";
import {
    createSimpleShape,
    enumShortcodeToSubShape,
    enumSubShapeToShortcode,
    enumSubShape,
    ShapeDefinition,
} from "../game/shape_definition";
import { ShapeDefinitionManager } from "../game/shape_definition_manager";
import { SoundProxy } from "../game/sound_proxy";
import { AdProviderInterface } from "../platform/ad_provider";
import { AdinplayAdProvider } from "../platform/ad_providers/adinplay";
import { GamedistributionAdProvider } from "../platform/ad_providers/gamedistribution";
import { NoAdProvider } from "../platform/ad_providers/no_ad_provider";
import { AnalyticsInterface } from "../platform/analytics";
import { ShapezGameAnalytics } from "../platform/browser/game_analytics";
import { GoogleAnalyticsImpl } from "../platform/browser/google_analytics";
import { NoGameAnalytics } from "../platform/browser/no_game_analytics";
import { SoundImplBrowser } from "../platform/browser/sound";
import { StorageImplBrowser } from "../platform/browser/storage";
import { StorageImplBrowserIndexedDB } from "../platform/browser/storage_indexed_db";
import { PlatformWrapperImplBrowser } from "../platform/browser/wrapper";
import { StorageImplElectron } from "../platform/electron/storage";
import { PlatformWrapperImplElectron } from "../platform/electron/wrapper";
import { GameAnalyticsInterface } from "../platform/game_analytics";
import { StorageInterface } from "../platform/storage";
import { PlatformWrapperInterface } from "../platform/wrapper";
import { SavegameInterface_ML01 } from "../savegame/schemas/ML01";
import { BaseSavegameInterface } from "../savegame/savegame_interface";
import { SavegameInterface_V1000 } from "../savegame/schemas/1000";
import { SavegameInterface_V1001 } from "../savegame/schemas/1001";
import { SavegameInterface_V1002 } from "../savegame/schemas/1002";
import { SavegameInterface_V1003 } from "../savegame/schemas/1003";
import { SavegameInterface_V1004 } from "../savegame/schemas/1004";
import { SavegameInterface_V1005 } from "../savegame/schemas/1005";
import { SavegameInterface_V1006 } from "../savegame/schemas/1006";
import { SavegameInterface_V1007 } from "../savegame/schemas/1007";
import { Savegame } from "../savegame/savegame";
import { compressObject, decompressObject } from "../savegame/savegame_compressor";
import { savegameInterfaces, getSavegameInterface } from "../savegame/savegame_interface_registry";
import { SavegameSerializer } from "../savegame/savegame_serializer";
import {
    schemaToJsonSchema,
    BaseDataType,
    TypeInteger,
    TypeBoolean,
    TypePositiveInteger,
    TypeString,
    TypeVector,
    TypeTileVector,
    TypeNumber,
    TypePositiveNumber,
    TypeEnum,
    TypeEntity,
    TypeEntityWeakref,
    TypeClass,
    TypeClassData,
    TypeClassFromMetaclass,
    TypeMetaClass,
    TypeArray,
    TypeFixedClass,
    TypeKeyValueMap,
    TypeClassId,
    TypePair,
    TypeNullable,
    TypeStructuredObject,
} from "../savegame/serialization_data_types";
import { SerializerInternal } from "../savegame/serializer_internal";

export class ShapezAPI {
    constructor(user) {
        this.user = user;

        this.exports = {
            //Core
            AtlasDefinition,
            BackgroundResourcesLoader,
            ClickDetector,
            DrawParameters,
            ExplainedResult,
            Factory,
            InputDistributor,
            InputReceiver,
            Dialog,
            DialogOptionChooser,
            DialogLoading,
            DialogWithForm,
            FormElement,
            FormElementInput,
            FormElementCheckbox,
            FormElementItemChooser,
            ReadWriteProxy,
            Rectangle,
            RequestChannel,
            RestrictionManager,
            RandomNumberGenerator,
            Signal,
            SingletonFactory,
            BaseSprite,
            SpriteAtlasLink,
            AtlasSprite,
            RegularSprite,
            StaleAreaDetector,
            StateManager,
            TextualGameState,
            TrackedState,
            Vector,
            GameState,
            enableImageSmoothing,
            disableImageSmoothing,
            getBufferVramUsageBytes,
            getBufferStats,
            clearBufferBacklog,
            makeOffscreenBuffer,
            registerCanvas,
            freeCanvas,
            getDeviceDPI,
            smoothenDpi,
            prepareHighDPIContext,
            resizeHighDPICanvas,
            resizeCanvas,
            resizeCanvasAndClear,
            initDrawUtils,
            drawRotatedSprite,
            drawSpriteClipped,
            initBuildingsByCategory,
            setGlobalApp,
            createLogger,
            serializeError,
            stringifyObjectContainingErrors,
            globalDebug,
            globalLog,
            globalWarn,
            globalError,
            logSection,
            compressU8,
            compressU8WHeader,
            decompressU8WHeader,
            compressX64,
            decompressX64,
            sha1,
            getNameOfProvider,
            computeCrc,
            isAndroid,
            isIos,
            getPlatformName,
            getIPCRenderer,
            make2DUndefinedArray,
            newEmptyMap,
            randomInt,
            accessNestedPropertyReverse,
            randomChoice,
            fastArrayDelete,
            fastArrayDeleteValue,
            fastArrayDeleteValueIfContained,
            arrayDelete,
            arrayDeleteValue,
            epsilonCompare,
            lerp,
            findNiceValue,
            findNiceIntegerValue,
            formatBigNumber,
            formatBigNumberFull,
            waitNextFrame,
            round1Digit,
            round2Digits,
            round3Digits,
            round4Digits,
            clamp,
            makeDiv,
            makeButtonElement,
            makeButton,
            removeAllChildren,
            isSupportedBrowser,
            formatSecondsToTimeAgo,
            formatSeconds,
            round1DigitLocalized,
            formatItemsPerSecond,
            rotateFlatMatrix3x3,
            generateMatrixRotations,
            rotateDirectionalObject,
            safeModulo,
            smoothPulse,
            fillInLinkIntoTranslation,
            generateFileDownload,
            startFileChoose,
            getRomanNumber,
            mixVector,
            queryParamOptions,
            PROMISE_ABORTED,
            CRC_PREFIX,
            ORIGINAL_SPRITE_SCALE,
            FULL_CLIP_RECT,
            enumDirection,
            enumInvertedDirections,
            enumDirectionToAngle,
            enumAngleToDirection,
            arrayAllDirections,
            enumDirectionToVector,
            atlasFiles,
            MAX_MOVE_DISTANCE_PX,
            clickDetectorGlobals,
            IS_DEBUG,
            SUPPORT_TOUCH,
            IS_MAC,
            THIRDPARTY_URLS,
            A_B_TESTING_LINK_TYPE,
            globalConfig,
            IS_MOBILE,
            APPLICATION_ERROR_OCCURED,
            gMetaBuildingRegistry,
            gBuildingsByCategory,
            gComponentRegistry,
            gGameModeRegistry,
            gGameSpeedRegistry,
            gItemRegistry,
            GLOBAL_APP,
            Loader,

            //Platform
            AdinplayAdProvider,
            GamedistributionAdProvider,
            NoAdProvider,
            AdProviderInterface,
            ShapezGameAnalytics,
            GoogleAnalyticsImpl,
            NoGameAnalytics,
            SoundImplBrowser,
            StorageImplBrowserIndexedDB,
            StorageImplBrowser,
            PlatformWrapperImplBrowser,
            StorageImplElectron,
            PlatformWrapperImplElectron,
            AnalyticsInterface,
            GameAnalyticsInterface,
            SoundInstanceInterface,
            MusicInstanceInterface,
            SoundInterface,
            StorageInterface,
            PlatformWrapperInterface,
            MUSIC,

            //Profiles
            ApplicationSettings,
            allApplicationSettings,
            getApplicationSettingById,
            uiScales,
            scrollWheelSensitivities,
            movementSpeeds,
            autosaveIntervals,

            //Savegame
            BaseSavegameInterface,
            SavegameInterface_V1000,
            SavegameInterface_V1001,
            SavegameInterface_V1002,
            SavegameInterface_V1003,
            SavegameInterface_V1004,
            SavegameInterface_V1005,
            SavegameInterface_V1006,
            SavegameInterface_V1007,
            SavegameInterface_ML01,
            SerializerInternal,
            SavegameManager,
            SavegameSerializer,
            Savegame,
            BaseDataType,
            TypeInteger,
            TypeBoolean,
            TypePositiveInteger,
            TypeString,
            TypeVector,
            TypeTileVector,
            TypeNumber,
            TypePositiveNumber,
            TypeEnum,
            TypeEntity,
            TypeEntityWeakref,
            TypeClass,
            TypeClassData,
            TypeClassFromMetaclass,
            TypeMetaClass,
            TypeArray,
            TypeFixedClass,
            TypeKeyValueMap,
            TypeClassId,
            TypePair,
            TypeNullable,
            TypeStructuredObject,
            BasicSerializableObject,
            getSavegameInterface,
            compressObject,
            decompressObject,
            schemaToJsonSchema,
            serializeSchema,
            deserializeSchema,
            verifySchema,
            extendSchema,
            savegameInterfaces,

            //Game
            AutomaticSave,
            BeltPath,
            Blueprint,
            Camera,
            GameCore,
            DynamicTickrate,
            EntityManager,
            Entity,
            GameLoadingOverlay,
            GameSystemManager,
            Keybinding,
            KeyActionMapper,
            GameLogic,
            MapChunkView,
            MapView,
            BaseMap,
            ProductionAnalytics,
            GameRoot,
            ShapeDefinitionManager,
            enumShortcodeToSubShape,
            enumSubShapeToShortcode,
            enumSubShape,
            ShapeDefinition,
            SoundProxy,
            itemResolverSingleton,
            createSimpleShape,
            applyGameTheme,
            getRandomHint,
            registerBuildingVariant,
            getBuildingDataFromCode,
            getCodeFromBuildingData,
            typeItemSingleton,
            gBuildingVariants,
            USER_INTERACT_MOVE,
            USER_INTERACT_ZOOM,
            USER_INTERACT_TOUCHEND,

            MetaBuilding,
            Component,
            BaseItem,
            BaseGameSpeed,
            GameSystemWithFilter,
            GameSystem,
            GameMode,
            HUDBaseToolbar,
            BaseHUDPart,
            GameHUD,

            //HUD
            HUDSettingsMenu,
            HUDBetaOverlay,
            HUDBlueprintPlacer,
            HUDBuildingPlacer,
            HUDBuildingPlacerLogic,
            HUDCatMemes,
            HUDChangesDebugger,
            HUDColorBlindHelper,
            HUDConstantSignalEdit,
            HUDDebugInfo,
            HUDEntityDebugger,
            HUDGameMenu,
            HUDInteractiveTutorial,
            HUDKeybindingOverlay,
            HUDLayerPreview,
            HUDLeverToggle,
            HUDMassSelector,
            HUDMinerHighlight,
            HUDModalDialogs,
            HUDNotifications,
            HUDPartTutorialHints,
            HUDPinnedShapes,
            HUDSandboxController,
            HUDScreenshotExporter,
            HUDShapeStatisticsHandle,
            HUDShapeViewer,
            HUDShop,
            HUDStandaloneAdvantages,
            HUDStatistics,
            HUDTutorialVideoOffer,
            HUDUnlockNotification,
            HUDVignetteOverlay,
            HUDWatermark,
            HUDWaypoints,
            HUDWireInfo,
            HUDWiresOverlay,

            //Settings
            EnumSetting,
            BoolSetting,
            RangeSetting,
            BaseSetting,

            //Functions,
            cachebust,
            matchOverwriteRecursiveSettings,

            //Variables
            defaultBuildingVariant,
            types,
            STOP_PROPAGATION,
            SOUNDS,
            BOOL_TRUE_SINGLETON,
            BOOL_FALSE_SINGLETON,

            //Gamemodes
            RegularGameMode,

            //Gamespeed
            PausedGameSpeed,
            FastForwardGameSpeed,
            RegularGameSpeed,

            //Items
            ShapeItem,
            BooleanItem,
            ColorItem,

            //States
            InGameState,
            SettingsState,
            AboutState,
            MainMenuState,
            ChangelogState,
            KeybindingsState,
            PreloadState,
            MobileWarningState,

            //Systems
            ItemAcceptorSystem,
            BeltSystem,
            UndergroundBeltSystem,
            MinerSystem,
            StorageSystem,
            ItemProcessorSystem,
            FilterSystem,
            ItemProducerSystem,
            ItemEjectorSystem,
            HubSystem,
            StaticMapEntitySystem,
            WiredPinsSystem,
            BeltUnderlaysSystem,
            ConstantSignalSystem,
            LeverSystem,
            WireSystem,
            LogicGateSystem,
            BeltReaderSystem,
            DisplaySystem,
            ItemProcessorOverlaysSystem,

            //Components
            BeltReaderComponent,
            BeltUnderlaysComponent,
            BeltComponent,
            ConstantSignalComponent,
            DisplayComponent,
            FilterComponent,
            HubComponent,
            ItemAcceptorComponent,
            ItemEjectorComponent,
            ItemProcessorComponent,
            ItemProducerComponent,
            LeverComponent,
            LogicGateComponent,
            MinerComponent,
            StaticMapEntityComponent,
            StorageComponent,
            UndergroundBeltComponent,
            WireTunnelComponent,
            WireComponent,
            WiredPinsComponent,

            //Enums
            enumHubGoalRewards,
            enumAnalyticsDataSource,
            enumCategories,
            enumClippedBeltUnderlayType,
            enumColorMixingResults,
            enumColors,
            enumColorsToHexCode,
            enumColorToShortcode,
            enumDisplayMode,
            enumHubGoalRewardsToContentUnlocked,
            enumItemProcessorRequirements,
            enumItemProcessorTypes,
            enumLocalSavegameStatus,
            enumMouseButton,
            enumNotificationType,
            enumSavePriority,
        };

        this.firstState = "MainMenuState";
        this.KEYMAPPINGS = KEYMAPPINGS;
        this.KEYMAPPINGS.key = str => str.toUpperCase().charCodeAt(0);

        this.mods = new Map();
        this.modOrder = [];

        this.translations = T;

        this.map = {
            MapChunk,
            MapResourcesSystem,
        };

        this.ingame = {
            buildings: {},
            components: {},
            //Must be array because of update order
            systems: [],
            items: {},
            gamemodes: {},
            gamespeed: {},
            //List of layer names
            layers: [],
            hub_goals: HubGoals,
        };

        this.toolbars = {
            buildings: HUDBuildingsToolbar.bar,
            wires: HUDWiresToolbar.bar,
        };

        this.themes = VANILLA_THEMES;

        this.states = Application.states;

        this.clickDetectors = [];
    }

    /**
     * Generates rotated variants of the matrix
     * @param {Array<number>} originalMatrix
     * @returns {Object<number, Array<number>>}
     */
    generateMatrixRotations(originalMatrix) {
        return generateMatrixRotations(originalMatrix);
    }

    /**
     * Registers a new sprite
     * @param {string} spriteId
     * @param {HTMLImageElement|HTMLCanvasElement} sourceImage
     * @returns {RegularSprite}
     */
    registerSprite(spriteId, sourceImage) {
        const sprite = new RegularSprite(sourceImage, sourceImage.width, sourceImage.height);
        assertAlways(!Loader.sprites[spriteId], "Can not override builtin sprite: " + spriteId);
        Loader.sprites[spriteId] = sprite;
        return sprite;
    }

    /**
     * Returns a regular sprite by its id
     * @param {string} id
     * @returns {RegularSprite}
     */
    getRegularSprite(id) {
        return Loader.getRegularSprite(id);
    }

    /**
     * Returns a regular sprite by its id
     * @param {string} id
     * @returns {AtlasSprite}
     */
    getSprite(id) {
        return Loader.getSprite(id);
    }

    /**
     * Registers a new atlas
     * @param {string} atlasDataString
     */
    registerAtlas(atlasDataString) {
        var atlasData = JSON.parse(atlasDataString);
        var sourceImage = new Image();
        sourceImage.crossOrigin = "anonymous";
        sourceImage.onload = () => {
            // @ts-ignore
            Loader.internalParseAtlas({
                    meta: atlasData.atlasData.meta,
                    sourceData: atlasData.atlasData.frames,
                },
                sourceImage
            );
        };
        sourceImage.src = atlasData.src;
    }

    /**
     * Registers a new atlases
     * @param {string[]} atlasDataStrings
     */
    registerAtlases(...atlasDataStrings) {
        for (let i = 0; i < atlasDataStrings.length; i++) {
            this.registerAtlas(atlasDataStrings[i]);
        }
    }

    /**
     * Adds css to the page
     * @param {string} css
     */
    injectCss(css, id) {
        var head = document.head || document.getElementsByTagName("head")[0];
        var style = document.createElement("style");
        style.id = id;

        head.appendChild(style);

        style.appendChild(document.createTextNode(css));
    }

    /**
     * Registers a new icon
     * @param {string} id
     * @param {string} iconDataURL
     */
    registerIcon(id, iconDataURL) {
        var css = ``;
        var style = undefined;
        if (!(style = document.getElementById("mod-loader-icons"))) {
            var head = document.head || document.getElementsByTagName("head")[0];
            style = document.createElement("style");
            style.id = "mod-loader-icons";
            style.appendChild(document.createTextNode(css));
            head.appendChild(style);
        }
        css = `
            [data-icon="${id}.png"] {
                background-image: url(${iconDataURL}) !important;
            }
        `;
        style.appendChild(document.createTextNode(css));
    }

    registerBuilding(buildingClass, iconDataURL, key) {
        var id = new buildingClass().getId();
        this.ingame.buildings[id] = buildingClass;
        this.registerIcon("building_icons/" + id, iconDataURL);
        this.KEYMAPPINGS.buildings[id] = { keyCode: this.KEYMAPPINGS.key(key), id: id };
    }

    /**
     * Tracks clicks on a element (e.g. button). Useful because you should both support
     * touch and mouse events.
     * @param {HTMLElement} element
     * @param {function} clickHandler
     */
    trackClicks(element, clickHandler) {
        const clickDetector = new ClickDetector(element, {
            consumeEvents: true,
            preventDefault: true,
        });
        clickDetector.click.add(clickHandler);
        this.clickDetectors.push(clickDetector);
    }
}