/// declare namespace mGBA { /** * Common filesystem paths for the embedded virtual file system (IDBFS). * * These are the mount points/directories created by `FSInit` (ex. `/data/*`, `/autosave`, etc), * these are needed for building paths when you’re reading/writing files via `Module.FS`. */ export interface filePaths { root: string; cheatsPath: string; gamePath: string; savePath: string; saveStatePath: string; screenshotsPath: string; patchPath: string; autosave: string; } export type coreCallbacks = { /** * Callback fired when the emulation core has triggered an alarm. */ alarmCallback?: (() => void) | null; /** * Callback fired when the emulation core has crashed. */ coreCrashedCallback?: (() => void) | null; /** * Callback fired when the emulation core has read input keys. */ keysReadCallback?: (() => void) | null; /** * Callback fired when the emulation core has updated its save data. */ saveDataUpdatedCallback?: (() => void) | null; /** * Callback fired when the emulation core has finished rendering a video frame. */ videoFrameEndedCallback?: (() => void) | null; /** * Callback fired when the emulation core has started rendering a video frame. */ videoFrameStartedCallback?: (() => void) | null; /** * Callback fired when the emulation core has captured an auto save state. */ autoSaveStateCapturedCallback?: (() => void) | null; /** * Callback fired when the emulation core has finished loading an auto save state. */ autoSaveStateLoadedCallback?: (() => void) | null; }; export type coreSettings = { /** * Number of frames to skip rendering between screen paints. * * Typical values: `0..10` * * Default: 0 */ frameSkip?: number; /** * Target base frames-per-second for the emulation core. Used by timing * and frame-rate calculations. * * Typical values: 60, 30 * * Default: 60 */ baseFpsTarget?: number; /** * Maximum number of rewind states to keep in memory. Larger values allow * longer rewind history at the cost of consumed memory. Value is a count of * historical entries in the buffer. * * Typical values: `100..10000` is reasonable depending on memory pressure and * the rewind interval. * * Default: 600 */ rewindBufferCapacity?: number; /** * The speed at which rewind snapshots are taken. Larger numbers mean rewind happens faster. * * Typical values: `1..10` * * Default: 1 */ rewindBufferInterval?: number; /** * Requested audio sample rate in Hz for the audio output. * The core will attempt to use this rate, actual output depends on * the host audio device (best effort). * * Typical values: 22050, 32000, 44100, 48000 * * Default: 48000 */ audioSampleRate?: number; /** * Preferred size, in samples, of the audio buffer. Smaller buffers reduce * latency but increase the chance of underruns, larger buffers increase * latency but are more stable. * * Typical values: `256..4096` * * Default: 1024 */ audioBufferSize?: number; /** * Interval in seconds between periodic auto save state captures. * * Typical values: `10..30` * * Default: 30 */ autoSaveStateTimerIntervalSeconds?: number; /** * If true, allows opposing directional inputs (ex. left + right) to be * accepted simultaneously. When false, only a single directional input * is accepted at a time. * * Default: true */ allowOpposingDirections?: boolean; /** * If true, synchronize the video frame rate to the host display refresh rate (vsync). * * Default: false */ videoSync?: boolean; /** * If true, synchronizes the video frame rate to the audio output speed. * * Default: false */ audioSync?: boolean; /** * If true, render video on a separate thread (if supported). * * Default: false */ threadedVideo?: boolean; /** * Enable/disable rewind support. * * Default: true */ rewindEnable?: boolean; /** * If true, the core will sync using discrete timestep increments based on * the baseFpsTarget value rather than variable-step delta timing (audio/video). * * Default: true */ timestepSync?: boolean; /** * If true, show an on-screen true FPS counter overlay. * * Default: false */ showFpsCounter?: boolean; /** * Enable/disable periodic auto save state capture. * * Default: true */ autoSaveStateEnable?: boolean; /** * If true, attempts to load the latest auto save state after a game load/reset. * * Default: true */ restoreAutoSaveStateOnLoad?: boolean; }; export interface mGBAEmulator extends EmscriptenModule { // custom methods from preamble /** * Attempts to automatically load cheats for the currently loaded game. * * @returns True if cheats were loaded successfully, otherwise false. */ autoLoadCheats(): boolean; /** * Binds a physical key (SDL key name) to a GBA input action. * * @param bindingName - SDL key name (ex. "Return", "Left", "Keypad X"). * @param inputName - GBA input/action (ex. "A", "B", "Start", "Up"). */ bindKey(bindingName: string, inputName: string): void; /** * Presses a named emulated button. * * @param name - Button name to press (ex. "A", "B", "Start", "Select", "Up"). */ buttonPress(name: string): void; /** * Releases (unpress) a named emulated button. * * @param name - Button name to release (ex. "A", "B", "Start", "Select", "Up"). */ buttonUnpress(name: string): void; /** * Initializes the Emscripten filesystem and any runtime FS mounts needed by the emulator. */ FSInit(): Promise; /** * Synchronizes filesystem state to the backing store (IDBFS). */ FSSync(): Promise; /** * Gets the current fast forward multiplier. * * - `multiplier = 1` = normal speed * - `multiplier > 1` = fast forward (`xN`) * - `multiplier < 0` = slow down (`1/abs(N)`) * * @returns Current fast forward multiplier. */ getFastForwardMultiplier(): number; /** * Gets the current main loop timing mode. * * @returns Current timing mode value. */ getMainLoopTimingMode(): number; /** * Gets the current main loop timing value for the current mode. * * @returns Current timing value. */ getMainLoopTimingValue(): number; /** * Reads the currently loaded game save data. * * @returns Save data as bytes, or null if no save exists. */ getSave(): Uint8Array | null; /** * Gets the current audio volume multiplier. * * - `1.0` = 100% * - Range is `0.0..2.0` (0%..200%) * * @returns Current volume multiplier. */ getVolume(): number; /** * Lists ROM file names under the game directory. * * @returns Directory entries from `filePaths().gamePath`. */ listRoms(): string[]; /** * Lists save file names under the save directory. * * @returns Directory entries from `filePaths().savePath`. */ listSaves(): string[]; /** * Loads a rom into the emulator and runs the game, optionally overriding the save path used. * * @param romPath - Path to the rom file within the emulated filesystem. * @param savePathOverride - Optional override for the save path. * @returns True if the game loaded successfully, otherwise false. */ loadGame(romPath: string, savePathOverride?: string): boolean; /** * Loads a save state from a given slot. * * @param slot - State slot index. * @returns True if the state loaded successfully, otherwise false. */ loadState(slot: number): boolean; /** * Forces an auto save state capture immediately. * * @returns True if the auto save state was captured successfully, otherwise false. */ forceAutoSaveState(): boolean; /** * Loads the current auto save state (if present). * * @returns True if the auto save state loaded successfully, otherwise false. */ loadAutoSaveState(): boolean; /** * Reads the current auto save state from the filesystem (if present). * * @returns The auto save state name and bytes, or null if none exists. */ getAutoSaveState(): { autoSaveStateName: string; data: Uint8Array } | null; /** * Uploads auto save state data into the emulator filesystem. * * @param autoSaveStateName - Full auto save path to write to. * @param data - Raw auto save state bytes. */ uploadAutoSaveState( autoSaveStateName: string, data: Uint8Array, ): Promise; /** * Pauses audio output without pausing emulation. */ pauseAudio(): void; /** * Pauses the game emulation. */ pauseGame(): void; /** * Performs a quick reload of the current ROM file. */ quickReload(): void; /** * Quits the currently running game session. */ quitGame(): void; /** * Exits the emulator runtime. */ quitMgba(): void; /** * Resumes audio output. */ resumeAudio(): void; /** * Resumes game emulation and audio. */ resumeGame(): void; /** * Saves a save state to a given slot. * * @param slot - State slot index. * @returns True if the state saved successfully, otherwise false. */ saveState(slot: number): boolean; /** * Captures a screenshot and writes it to the screenshots directory. * * @param fileName - Optional custom screenshot file name. * @returns True if screenshot was captured successfully, otherwise false. */ screenshot(fileName?: string): boolean; /** * Sets the current fast forward multiplier. * * - `multiplier = 1` = normal speed * - `multiplier > 1` = fast forward (`xN`) * - `multiplier < 0` = slow down (`1/abs(N)`) * * @param multiplier - The fast forward multiplier to apply. */ setFastForwardMultiplier(multiplier: number): void; /** * Sets the main loop timing mode and value. * * See: https://emscripten.org/docs/api_reference/emscripten.h.html#c.emscripten_set_main_loop_timing * * @param mode - Timing mode identifier. * @param value - Timing value associated with the mode. */ setMainLoopTiming(mode: number, value: number): void; /** * Sets the audio volume multiplier. * * - `1.0` = 100% * - Range is `0.0..2.0` (0%..200%) * * @param percent - Volume multiplier to apply. */ setVolume(percent: number): void; /** * Enables or disables keyboard input handling. * * @param enabled - If true input is accepted, if false input is ignored. */ toggleInput(enabled: boolean): void; /** * Uploads a cheats file into the emulator filesystem. * * @param file - Cheats file to upload. * @param callback - Optional callback fired after upload completes. */ uploadCheats(file: File, callback?: () => void): void; /** * Uploads a patch file into the emulator filesystem. * * @param file - Patch file to upload. * @param callback - Optional callback fired after upload completes. */ uploadPatch(file: File, callback?: () => void): void; /** * Uploads a ROM file into the emulator filesystem. * * @param file - ROM file to upload. * @param callback - Optional callback fired after upload completes. */ uploadRom(file: File, callback?: () => void): void; /** * Uploads a save or save state file into the emulator filesystem. * * @param file - Save or state file to upload. * @param callback - Optional callback fired after upload completes. */ uploadSaveOrSaveState(file: File, callback?: () => void): void; /** * Uploads a screenshot file into the emulator filesystem. * * @param file - Screenshot file to upload. * @param callback - Optional callback fired after upload completes. */ uploadScreenshot(file: File, callback?: () => void): void; /** * Registers core callbacks for emulator lifecycle and custom events. * * @param coreCallbacks - Callback object to register. */ addCoreCallbacks(coreCallbacks: coreCallbacks): void; /** * Enables/disables active rewinding while the core is running. * * @param enabled - If true the core rewinds, if false rewind stops. */ toggleRewind(enabled: boolean): void; /** * Applies core settings to the emulator runtime. * * @param coreSettings - Settings object to apply. */ setCoreSettings(coreSettings: coreSettings): void; // custom variables version: { projectName: string; projectVersion: string; }; /** * Returns common filesystem path strings used by this build. */ filePaths(): filePaths; /** * Last loaded ROM path set after `loadGame` succeeds. */ gameName?: string; /** * Save path used for the current game set after `loadGame` succeeds. */ saveName?: string; /** * Auto save state path and file name used for the current game set after `loadGame` succeeds. */ autoSaveStateName?: string; // extra exported runtime methods FS: typeof FS; // SDL2 SDL2: { audio: { currentOutputBuffer: AudioBuffer; scriptProcessorNode: ScriptProcessorNode; }; audioContext: AudioContext; }; } /** * Generates a web assembly mGBA module for the browser. * * This emulator core is meant to be used like a controlled frontend component: * it bootstraps the emulator runtime, canvas wiring, keyboard events, and other autonomous * functions using emscripten, exposing an imperative API used to control the core. * * The consuming UI then drives all actions after initialization using the API above, such as * loading ROM/save files, pausing/resuming, settings, saves, etc. * * **Initialization flow:** * - create a `` * - call `mGBA({ canvas })` to get the `Module` * - call `await Module.FSInit()` once to mount + load persisted file system data * - keep the `Module` accessible and call methods on it from your UI * * This core uses threads, your app must be served with cross-origin isolation enabled * (`COOP: same-origin` + `COEP: require-corp`), otherwise it will not run correctly. * * @param options - Module options. * @param options.canvas - Canvas used for video output. * @returns The initialized emulator `Module`. */ // eslint-disable-next-line import/no-default-export export default function mGBA(options: { canvas: HTMLCanvasElement; }): Promise; } export = mGBA;