UNPKG

@drincs/pixi-vn

Version:

Pixi'VN is a npm package that provides various features for creating visual novels.

978 lines (944 loc) 34.6 kB
import { IMediaInstance as IMediaInstance$1, PlayOptions, Options, SoundLibrary, Sound } from '@pixi/sound'; import * as canvasUtils from '@drincs/pixi-vn/canvas'; import { StoredChoiceInterface, StorageElementType as StorageElementType$1, OpenedLabel as OpenedLabel$1 } from '@drincs/pixi-vn/canvas'; export * from '@drincs/pixi-vn/canvas'; import * as characterUtils from '@drincs/pixi-vn/characters'; export * from '@drincs/pixi-vn/characters'; import { OnErrorHandler, GameUnifier } from '@drincs/pixi-vn/core'; export * from '@drincs/pixi-vn/core'; import * as historyUtils from '@drincs/pixi-vn/history'; export * from '@drincs/pixi-vn/history'; import * as narrationUtils from '@drincs/pixi-vn/narration'; import { NarrationGameState } from '@drincs/pixi-vn/narration'; export * from '@drincs/pixi-vn/narration'; import { UPDATE_PRIORITY, PointData, Container, ContainerOptions, ApplicationOptions } from '@drincs/pixi-vn/pixi.js'; export { AllFederatedEventMap, ApplicationOptions, AssetSrc, AssetsBundle, AssetsManifest, FederatedEvent, LoadParserName, ResolvedAsset, ResolvedSrc, UnresolvedAsset } from '@drincs/pixi-vn/pixi.js'; import * as soundUtils from '@drincs/pixi-vn/sound'; export * from '@drincs/pixi-vn/sound'; import * as storageUtils from '@drincs/pixi-vn/storage'; export * from '@drincs/pixi-vn/storage'; import { LRUCache } from 'lru-cache'; import { CharacterInterface, GameStepState } from '@drincs/pixi-vn'; import { Difference } from 'microdiff'; import { Devtools } from '@pixi/devtools'; type IMediaInstance = Omit<IMediaInstance$1, "on" | "destroy" | "init" | "off" | "once" | "toString">; interface SoundOptions extends Omit<Options, "complete" | "loaded" | "sprites" | "source"> { } interface SoundPlayOptions extends Omit<PlayOptions, "complete" | "loaded"> { /** * The delay in seconds before playback becomes audible or resumes. If specified, the sound will be started immediately but delayed (for example, via pause/unpause) so that it is effectively heard only after the delay. If not specified, the sound will play without any additional delay. */ delay?: number; } interface SoundPlayOptionsWithChannel extends SoundPlayOptions { /** * The alias of the audio channel to play the sound on. If the channel does not exist, it will be created. * If not specified, the sound will be played on the default channel (see `SoundManagerInterface.defaultChannelAlias`). */ channel?: string; } interface ChannelOptions extends Pick<SoundPlayOptions, "filters" | "muted" | "volume"> { /** * Whether this channel is a background channel. * Background channels are special channels. Unlike normal channels, media connected to a background channel does not stop when a scene changes, but continues to play in the background. */ background?: boolean; } interface AudioChannelInterface { /** * The alias of the audio channel. This is used to reference the channel when playing sounds. The alias must be unique among all channels. */ readonly alias: string; /** * Plays a sound. * @param alias The media and sound (asset) alias reference. * @param options The options * @return The sound instance, * this cannot be reused after it is done playing. Returns a Promise if the sound * has not yet loaded. */ play(alias: string, options?: SoundPlayOptions): Promise<IMediaInstance>; /** * Plays a sound. * @param mediaAlias The media alias reference. * @param soundAlias The sound (asset) alias reference. * @param options The options * @return The sound instance, * this cannot be reused after it is done playing. Returns a Promise if the sound * has not yet loaded. */ play(mediaAlias: string, soundAlias: string, options?: SoundPlayOptions): Promise<IMediaInstance>; /** * The volume of the audio channel, between 0 and 1. This is multiplied with the volume of each sound played through this channel. */ volume: number; /** * Whether the audio channel is muted. This is combined with the muted state of each sound played through this channel. */ muted: boolean; /** * The MediaInstances currently playing through this channel. This is read-only and cannot be modified directly. Use the play method to add new MediaInstances to this channel. */ readonly mediaInstances: IMediaInstance[]; /** * Whether this channel is a background channel. * Background channels are special channels. Unlike normal channels, media connected to a background channel does not stop when a scene changes, but continues to play in the background. */ readonly background: boolean; /** * Stops all media currently playing through this channel. * @return Instance for chaining. */ stopAll(): this; /** * Pauses any playing sounds. * @return Instance for chaining. */ pauseAll(): this; /** * Resumes any sounds. * @return Instance for chaining. */ resumeAll(): this; /** * Toggle muted property for all sounds. * @return `true` if all sounds are muted. */ toggleMuteAll(): boolean; } type DistortionFilter = { type: "DistortionFilter"; amount?: number; }; type EqualizerFilter = { type: "EqualizerFilter"; f32?: number; f64?: number; f125?: number; f250?: number; f500?: number; f1k?: number; f2k?: number; f4k?: number; f8k?: number; f16k?: number; }; type MonoFilter = { type: "MonoFilter"; }; type ReverbFilter = { type: "ReverbFilter"; seconds?: number; decay?: number; reverse?: boolean; }; type StereoFilter = { type: "StereoFilter"; pan?: number; }; type StreamFilter = { type: "StreamFilter"; }; type TelephoneFilter = { type: "TelephoneFilter"; }; type SoundFilterMemory = DistortionFilter | EqualizerFilter | MonoFilter | ReverbFilter | StereoFilter | StreamFilter | TelephoneFilter; interface ExportedSound { options: SoundOptions; filters?: SoundFilterMemory[]; } interface SoundPlay { stepIndex: number; paused: boolean; options?: SoundPlayOptions | string; } interface ExportedSoundPlay extends SoundPlay { sound: ExportedSound; } /** * Interface exported sounds */ interface SoundGameState { filters?: SoundFilterMemory[]; /** * @deprecated */ soundsPlaying?: { [key: string]: ExportedSoundPlay; }; mediaInstances: { [key: string]: { channelAlias: string; soundAlias: string; stepCounter: number; options: Omit<SoundPlayOptions, "filters"> & { filters?: SoundFilterMemory[]; }; paused: boolean; }; }; } interface SoundManagerInterface extends Omit<SoundLibrary, "init" | "close" | "add" | "play" | "volume" | "speed" | "remove" | "exists" | "find" | "stop" | "pause" | "resume" | "pauseAll" | "resumeAll" | "muteAll" | "unmuteAll" | "stopAll" | "removeAll" | "togglePauseAll"> { /** * @deprecated You can define sound assets directly in `PIXI.Assets` */ add(alias: string, options: string): Sound; /** * Plays a sound. * @param alias The media and sound (asset) alias reference. * @param options The options * @return The sound instance, * this cannot be reused after it is done playing. Returns a Promise if the sound * has not yet loaded. */ play(alias: string, options?: SoundPlayOptionsWithChannel): Promise<IMediaInstance>; play(mediaAlias: string, soundAlias: string, options?: SoundPlayOptionsWithChannel): Promise<IMediaInstance>; /** * Find a media by alias. * @param alias - The media alias reference. * @return Media object. */ find(alias: string): IMediaInstance | undefined; /** * Stops a media and removes it from the manager. * @param alias - The media alias reference. */ stop(alias: string): void; /** * Pauses a media. * @param alias - The media alias reference. * @return Media object. */ pause(alias: string): IMediaInstance | undefined; /** * Resumes a media. * @param alias - The media alias reference. * @return Media object. */ resume(alias: string): IMediaInstance | undefined; /** * Edits the options of an existing sound (asset). * If the asset is not yet loaded, it will be loaded with the new options. */ edit(alias: string, options: SoundOptions): Promise<void>; /** * Pauses any playing sounds. * @return Instance for chaining. */ pauseAll(): this; /** * Resumes any sounds. * @return Instance for chaining. */ resumeAll(): this; /** * Mutes all playing sounds. * @return Instance for chaining. */ muteAll(): this; /** * Unmutes all playing sounds. * @return Instance for chaining. */ unmuteAll(): this; /** * Stops all sounds. * @return Instance for chaining. */ stopAll(): this; load(alias: string | string[]): Promise<void>; backgroundLoad(alias: string | string[]): Promise<void>; backgroundLoadBundle(alias: string): Promise<void>; clear(): void; /** * Adds a new audio channel with the specified alias(es). * @param alias The alias or aliases for the new channel. * @returns The created AudioChannelInterface instance, or undefined if a channel with the alias already exists. */ addChannel(alias: string | string[], options?: ChannelOptions): AudioChannelInterface | undefined; /** * Finds and returns the audio channel associated with the given alias. If the channel does not exist, it will be created. * @param alias The alias of the audio channel to find. * @returns The AudioChannelInterface instance associated with the alias. */ findChannel(alias: string): AudioChannelInterface; /** * Returns an array of all existing audio channels. */ readonly channels: AudioChannelInterface[]; /** * The default channel alias to use when playing a sound without specifying a channel. * By default, this is set to `GENERAL_CHANNEL` ("general"), but it can be changed to any string; if the channel does not yet exist, it will be created on demand when used. */ defaultChannelAlias: string; export(): SoundGameState; restore(data: object): Promise<void>; } declare class CachedMap<K extends {}, V extends {}> implements Map<K, V> { readonly cache: LRUCache<K, V>; readonly map: Map<K, V>; constructor(options: { cacheSize: number; }); get [Symbol.iterator](): () => MapIterator<[K, V]>; get [Symbol.toStringTag](): string; clear(): void; delete(key: K): boolean; get forEach(): (callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any) => void; get(key: K): V | undefined; has(key: K): boolean; set(key: K, value: V): this; get size(): number; entries(): MapIterator<[K, V]>; keys(): MapIterator<K>; values(): MapIterator<V>; } interface TickerArgs { } interface TickerHistory<TArgs extends TickerArgs> { id: string; args: TArgs; /** * The aliases of the canvas elements that are connected to this ticker */ canvasElementAliases: string[]; priority?: UPDATE_PRIORITY; duration?: number; paused?: boolean; } type PauseType = { /** * The type of the value */ type: "pause"; /** * Duration in seconds */ duration: number; }; type RepeatType = "repeat"; interface TickersStep<TArgs extends TickerArgs> { /** * Ticker class name */ ticker: string; /** * Duration in seconds. If is undefined, the step will end only when the animation is finished. */ duration?: number; /** * Arguments to pass to the ticker */ args: TArgs; /** * Priority of the ticker */ priority?: UPDATE_PRIORITY; } /** * The steps of the tickers */ interface TickersSequence { /** * The step number */ currentStepNumber: number; /** * The steps of the tickers */ steps: (TickersStep<any> | RepeatType | PauseType)[]; } /** * This class is used to create a canvas element to add into a Pixi Application. * You can use {@link canvas.add()} to add this element into the application. * This class should be implemented and the memory method should be overridden. * You must use the {@link canvasComponentDecorator} to register the canvas in the game. * In Ren'Py is a displayable. * @example * ```typescript * const CANVAS_EXAMPLE_ID = "CanvasExample"; * * \@canvasComponentDecorator({ * name: CANVAS_EXAMPLE_ID, * }) * export class CanvasExample extends Container implements CanvasBaseItem<Memory> { * get memory(): Memory { * return { * pixivnId: CANVAS_EXAMPLE_ID, * // ... other properties * } * } * async setMemory(value: Memory) { * // ... set other properties * } * } * ``` */ declare class CanvasBaseItem<T2 extends CanvasBaseItemMemory> { constructor(..._options: any); /** * This method return the memory of the canvas element. * @throws {PixiError} when the method is not overridden in the subclass. */ get memory(): T2; /** * This method set the memory of the canvas element. * @throws {PixiError} when the method is not overridden in the subclass. */ setMemory(_value: T2): Promise<void> | void; /** * Get the id of the canvas element. This variable is used in the system to get the canvas element by id */ pixivnId: string; } /** * Interface for the canvas base memory */ interface CanvasBaseItemMemory { pixivnId: string; /** * The index of the container in its parent, if it has one */ index?: number; /** * The label of the parent container, if it has one */ parentLabel?: string; label?: string; zIndex?: number; } /** * Interface exported canvas */ interface CanvasGameState { tickers: { [id: string]: TickerHistory<any>; }; tickersSteps: { [alias: string]: { [tickerId: string]: TickersSequence; }; }; elements: { [alias: string]: CanvasBaseItemMemory; }; stage: Partial<ContainerMemory>; /** * @deprecated */ elementAliasesOrder: string[]; tickersToCompleteOnStepEnd: { tikersIds: { id: string; }[]; stepAlias: { id: string; alias: string; }[]; }; } interface AdditionalPositionsExtensionProps { /** * is a way to set the position of the element in the canvas. compared to position, align, it is a percentage used to determine the proximity from the edges of the canvas. * For example: * - if you set align to 0.5, the element will be in the center of the canvas. * - if you set align to 0, the left end and a top end of the element will be in the left end and top end of the canvas. * - if you set align to 1, the right end and a bottom end of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does not affect the alignment. */ align?: Partial<PointData> | number; /** * is a way to set the position of the element in the canvas. compared to position, align, it is a percentage used to determine the proximity from the edges of the canvas. * For example: * - if you set align to 0.5, the element will be in the center of the canvas. * - if you set align to 0, the left end and a top end of the element will be in the left end and top end of the canvas. * - if you set align to 1, the right end and a bottom end of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does not affect the alignment. */ xAlign?: number; /** * is a way to set the position of the element in the canvas. compared to position, align, it is a percentage used to determine the proximity from the edges of the canvas. * For example: * - if you set align to 0.5, the element will be in the center of the canvas. * - if you set align to 0, the left end and a top end of the element will be in the left end and top end of the canvas. * - if you set align to 1, the right end and a bottom end of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does not affect the alignment. */ yAlign?: number; /** * is a way to set the position of the element in the canvas calculated in percentage. * For example, if you set the {@link PixiContainer.pivot} to 0.5, and: * - if you set percentagePosition to 0.5, the element will be in the center of the canvas. * - If you set percentagePosition to 0, the center of the element will be in the left end and top end of the canvas. * - If you set percentagePosition to 1, the center of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does affect the percentagePosition. */ percentagePosition?: Partial<PointData> | number; /** * is a way to set the position of the element in the canvas calculated in percentage. * For example, if you set the {@link PixiContainer.pivot} to 0.5, and: * - if you set percentagePosition to 0.5, the element will be in the center of the canvas. * - If you set percentagePosition to 0, the center of the element will be in the left end and top end of the canvas. * - If you set percentagePosition to 1, the center of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does affect the percentagePosition. */ percentageX?: number; /** * is a way to set the position of the element in the canvas calculated in percentage. * For example, if you set the {@link PixiContainer.pivot} to 0.5, and: * - if you set percentagePosition to 0.5, the element will be in the center of the canvas. * - If you set percentagePosition to 0, the center of the element will be in the left end and top end of the canvas. * - If you set percentagePosition to 1, the center of the element will be in the right end and bottom end of the canvas. * * **Important:** The {@link PixiContainer.pivot} field does affect the percentagePosition. */ percentageY?: number; } type ContainerChild = Container & CanvasBaseItem<any>; interface ListenerExtensionMemory { onEvents?: OnEventsHandlers; } interface OnEventsHandlers { [name: string]: string; } /** * Interface for the canvas container memory */ interface ContainerMemory<C extends ContainerChild = ContainerChild> extends ContainerOptions<C>, CanvasBaseItemMemory, ListenerExtensionMemory, AdditionalPositionsExtensionProps { /** * The elements contained in this container */ elements: CanvasBaseItemMemory[]; } var version = "1.6.1"; /** * @deprecated */ declare const Repeat: RepeatType; /** * Pause the tickers for a duration. * @param duration Duration in seconds * @returns The pause object * @deprecated */ declare function Pause(duration: number): PauseType; /** * Is a special alias to indicate the game layer. */ declare const CANVAS_APP_GAME_LAYER_ALIAS = "__game_layer__"; /** * The default audio channel for sounds that don't specify one. */ declare const GENERAL_CHANNEL = "general"; declare const SYSTEM_RESERVED_STORAGE_KEYS: { /** * The key of the current dialogue memory */ CURRENT_DIALOGUE_MEMORY_KEY: string; /** * The key of step counter of the current dialogue memory */ LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY: string; /** * The key of the current menu options memory */ CURRENT_MENU_OPTIONS_MEMORY_KEY: string; /** * The key of the last menu options added in the step memory */ LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY: string; /** * The key of the input memory. This value can be read by pixi-vn json importer */ CURRENT_INPUT_VALUE_MEMORY_KEY: string; /** * The key of the last input added in the step memory */ LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY: string; /** * The key of the current input info */ CURRENT_INPUT_INFO_MEMORY_KEY: string; /** * The key of the characters memory */ CHARACTER_CATEGORY_KEY: string; /** * This variable is used to add the next dialog text into the current dialog memory. * This value was added to introduce Ink Glue functionality https://github.com/inkle/ink/blob/master/Documentation/WritingWithInk.md#glue */ ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY: string; /** * The key of a list of all labels that have been opened during the progression of the steps. */ OPENED_LABELS_COUNTER_KEY: string; /** * The key of a list of all choices that have been made during the progression of the steps. */ ALL_CHOICES_MADE_KEY: string; /** * The key of the current step times counter. * This value was added to introduce Ink Sequences, cycles and other alternatives https://github.com/inkle/ink/blob/master/Documentation/WritingWithInk.md#sequences-cycles-and-other-alternatives */ CURRENT_STEP_TIMES_COUNTER_KEY: string; /** * The key of the last dialogue step glued in the step memory */ LAST_STEP_GLUED: string; }; type StorageElementPrimaryType = string | number | boolean | undefined | null | StorageElementPrimaryType[]; type StorageElementInternalType = StorageElementPrimaryType | Record<string | number | symbol, StorageElementPrimaryType> | StorageElementInternalType[]; /** * StorageElementType are all the types that can be stored in the storage */ type StorageElementType = StorageElementInternalType | Record<string | number | symbol, StorageElementInternalType> | { [key: string | number | symbol]: StorageElementType; } | StorageObjectType[] | (StorageElementPrimaryType | StorageElementInternalType | StorageElementType)[]; /** * StorageObjectType are all the types that can be stored in the storage */ type StorageObjectType = Record<string | number | symbol, StorageElementType>; interface StorageGameStateItem<T = StorageElementType> { key: string; value: T; } /** * Interface exported storage data */ type StorageGameState = { /** * @deprecated */ base?: StorageGameStateItem[]; /** * @deprecated */ temp?: StorageGameStateItem[]; tempDeadlines: StorageGameStateItem<number>[]; /** * @deprecated */ flags?: string[]; main: StorageGameStateItem[]; }; /** * is a string containing the name of the label. * It is used to {@link narration.registeredLabels} to get the label class. */ type LabelIdType = string; interface DialogueInterface { /** * The text of the dialogue. */ text: string | string[]; /** * The id of the character that is speaking. */ character?: CharacterInterface | string; } type StoredDialogue = Omit<DialogueInterface, "character"> & { character: string | undefined; }; interface HistoryStep { /** * The difference between the previous step and the current step. */ diff?: Difference[]; /** * The label id of the current step. */ currentLabel?: LabelIdType; /** * The sha1 of the step function. */ stepSha1: string; /** * Equivalent to the narration.stepCounter */ index: number; /** * The data of the step of the label. */ labelStepIndex: number | null; /** * Dialogue to be shown in the game */ dialogue?: StoredDialogue; /** * List of choices asked of the player */ choices?: StoredChoiceInterface[]; /** * List of choices already made by the player */ alreadyMadeChoices?: number[]; /** * The input value of the player */ inputValue?: StorageElementType$1; /** * The choice made by the player */ choiceIndexMade?: number; /** * If true, the current dialogue will be glued to the previous one. */ isGlued?: boolean; /** * Opened Labels in the current step. */ openedLabels?: OpenedLabel$1[]; } interface OpenedLabel { label: LabelIdType; currentStepIndex: number; } /** * Interface exported step data */ interface HistoryGameState { stepsHistory: HistoryStep[]; originalStepData: GameStepState | undefined; } interface GameState { pixivn_version: string; stepData: NarrationGameState; storageData: StorageGameState; canvasData: CanvasGameState; soundData: SoundGameState; historyData: HistoryGameState; path: string; } /** * It is a interface that contains the information of a step. */ interface GameStepStateData { /** * The browser path that occurred during the progression of the steps. */ path: string; /** * The storage that occurred during the progression of the steps. */ storage: StorageGameState; /** * The index of the label that occurred during the progression of the steps. */ labelIndex: number; /** * The canvas that occurred during the progression of the steps. */ canvas: CanvasGameState; /** * The opened labels that occurred during the progression of the steps. */ openedLabels: OpenedLabel[]; /** * The sound data that occurred during the progression of the steps. */ sound: SoundGameState; } /** * This function is used to create a deep copy of the element * @param element The element to be copied * @returns The copied element * @throws {PixiError} when the element is not JSON serializable (e.g. contains functions or class instances). */ declare function createExportableElement<T>(element: T): T; declare namespace Game { /** * Initialize the Game and PixiJS Application and the interface div. * This method should be called before any other method. * @param element The html element where I will put the canvas. Example: document.body * @param width The width of the canvas * @param height The height of the canvas * @param options The options of PixiJS Application and other options * @param devtoolsOptions The options of the devtools. You can read more about it in the [PixiJS Devtools documentation](https://pixijs.io/devtools/docs/plugin/) * @example * ```typescript * const body = document.body * if (!body) { * throw new Error('body element not found') * } * await Game.initialize(body, { * navigate: (path) => { * // navigate to the path * }, * width: 1920, * height: 1080, * backgroundColor: "#303030" * resizeMode: "contain" * }) * ``` */ function init(element: HTMLElement, options: Partial<ApplicationOptions> & { /** * The id of the canvas element. * @default "pixi-vn-canvas" */ id?: string; /** * The route navigate function. * You can set this function after the initialization using {@link GameUnifier.navigate} * @param path The path to navigate to. * @returns */ navigate?: (path: string) => void | Promise<void>; /** * The resize mode of the canvas. * @default "contain" */ resizeMode?: "contain" | "none"; }, devtoolsOptions?: Devtools): Promise<void>; /** * Initialize only the GameUnifier, and not the PixiJS Application and the interface div. * This method can be used if you want to use only the GameUnifier features, such as save/load game, * without initializing the canvas. */ function init(): Promise<void>; /** * Clear all game data. This function is used to reset the game. */ function clear(): void; /** * Get all the game data. It can be used to save the game. * @returns The game data */ function exportGameState(): GameState; /** * Load the save data * @param data The save data * @param navigate The function to navigate to a path */ function restoreGameState(data: GameState, navigate: (path: string) => void | Promise<void>): Promise<void>; /** * Start the game with a label. This function will clear the canvas, stop all sounds and start the narration with the given label. * @param label The label to start the game with. It can be a string or a LabelAbstract instance. If it is a string, it will be used as the id of the label to start. If it is a LabelAbstract instance, it will be used directly. If the label is not found, an error will be thrown. * @param props The properties to pass to the label. It will be passed to the {@link StepLabelType} of the label when it is executed. * @returns The result of the label execution. It can be a {@link StepLabelResultType} or a Promise that resolves to a {@link StepLabelResultType}. */ function start<T extends {} = {}>(label: narrationUtils.LabelAbstract<any, T> | string, props: narrationUtils.StepLabelPropsType<T>): Promise<narrationUtils.StepLabelResultType>; /** * Convert a JSON string to a save data * @param json The JSON string * @returns The save data */ function jsonToGameState(json: string): GameState; /** * Function to be executed at the end of the game. It should be set in the game initialization. * @example * ```typescript * Game.onEnd(async (props) => { * props.navigate("/end") * }) * ``` */ function onEnd(value: narrationUtils.StepLabelType): void; /** * @deprecated Game.onError is deprecated. Use Game.addOnError / Game.removeOnError to register multiple handlers. */ function onError(handler: (type: "step", error: any, props: narrationUtils.StepLabelPropsType) => void | Promise<void>): () => void; /** * Register an error handler. Multiple handlers can be registered; they * will be executed in registration order. * @example * ```typescript * // Register a synchronous error handler * Game.addOnError((error, props) => { * props.notify("An error occurred") * // send a notification to GlitchTip, Sentry, etc... * }) * * // Register an asynchronous error handler * Game.addOnError(async (error, props) => { * await logErrorToServer(error) * props.notify("An error occurred") * }) * * // Register an error handler with step restoration/rollback * Game.addOnError(async (error, props) => { * // Restore the game state to the previous step * await stepHistory.back(props) * props.notify("An error occurred, returning to previous step") * }) * ``` */ function addOnError(value: OnErrorHandler): () => void; /** * Remove a previously registered error handler. */ function removeOnError(handler: OnErrorHandler): void; /** * Is a function that will be executed before any step is executed. * @param stepId Step id * @param label Label * @returns */ function onStepStart(value: (stepId: number, label: narrationUtils.LabelAbstract<any>) => void | Promise<void>): void; /** * Is a function that will be executed in {@link Game.onStepStart} if the id of the step is 0 * and when the user laods a save file. * When you load a save file, will be executed all onLoadingLabel functions of the {@link narrationUtils.narration}.openedLabels. * It is useful for example to make sure all images used have been cached * @param stepId Step id * @param label Label * @returns * @example * ```typescript * Game.onLoadingLabel(async (stepId, label) => { * await Assets.load('path/to/image1.png') * await Assets.load('path/to/image2.png') * }) * ``` */ function onLoadingLabel(value: (stepId: number, label: narrationUtils.LabelAbstract<any>) => void | Promise<void>): void; /** * Is a function that will be executed when the step ends. * @param stepId Step id * @param label Label * @returns */ function onStepEnd(value: (stepId: number, label: narrationUtils.LabelAbstract<any>) => void | Promise<void>): void; /** * Function to be executed when navigation is requested. * @example * ```typescript * Game.onNavigate(async (path) => { * // custom navigation logic * window.history.pushState({}, "title", path) * }) * ``` */ function onNavigate(value: (path: string) => void | Promise<void>): void; /** * Register a handler to run immediately before a narration "continue" operation. * Handlers are executed in registration order and may be async. Use * `{@link addOnPreContinue}` / `{@link removeOnPreContinue}` to manage them programmatically. */ function addOnPreContinue(handler: () => Promise<void> | void): void; function removeOnPreContinue(handler: () => Promise<void> | void): void; } declare const _default: { canvas: canvasUtils.CanvasManagerInterface; narration: narrationUtils.NarrationManagerInterface; sound: SoundManagerInterface; storage: storageUtils.StorageManagerInterface; history: historyUtils.HistoryManagerInterface; Game: typeof Game; GameUnifier: typeof GameUnifier; createExportableElement: typeof createExportableElement; characterUtils: typeof characterUtils; canvasUtils: typeof canvasUtils; narrationUtils: typeof narrationUtils; soundUtils: typeof soundUtils; CANVAS_APP_GAME_LAYER_ALIAS: string; Pause: typeof Pause; Repeat: "repeat"; PIXIVN_VERSION: string; }; export { CANVAS_APP_GAME_LAYER_ALIAS, CachedMap, GENERAL_CHANNEL, Game, type GameState, type GameStepStateData, version as PIXIVN_VERSION, Pause, Repeat, SYSTEM_RESERVED_STORAGE_KEYS, createExportableElement, _default as default };