@drincs/pixi-vn-json
Version:
Pixi'VN can be integrated with JSON files to create a visual novel.
1,067 lines (1,047 loc) • 36.2 kB
TypeScript
import { StorageElementType, CanvasBaseInterface, ImageSprite, ShakeEffectProps, ShowWithDissolveTransitionProps, ShowWithFadeTransitionProps, MoveInOutProps, ZoomInOutProps, PushInOutProps, ImageContainerOptions, ImageSpriteOptions, TextOptions, ImageSpriteMemory, VideoSpriteMemory, ImageContainerMemory, TextMemory, ContainerOptions, ContainerMemory, SoundPlayOptionsWithChannel, MediaInterface, LabelRunModeType, StorageObjectType, StepLabelPropsType } from '@drincs/pixi-vn';
import { KeyframesType, AnimationOptions, ObjectSegment, ObjectSegmentWithTransition, SequenceOptions } from '@drincs/pixi-vn/motion';
import { UPDATE_PRIORITY } from 'pixi.js';
/**
* A single element that can appear inside a step-switch, which may be a direct value,
* a conditional statement, or a result-to-combine.
*/
type PixiVNJsonStepSwitchElementType<Then> = Then | PixiVNJsonConditionalStatements<Then> | PixiVNJsonConditionalResultToCombine<Then>;
/**
* The elements collection of a step-switch — either a plain array or a conditional that produces an array.
*/
type PixiVNJsonStepSwitchElementsType<Then> = PixiVNJsonStepSwitchElementType<Then>[] | PixiVNJsonConditionalStatements<Then[]>;
/**
* Picks one element at random each time the step is visited.
*/
interface PixiVNJsonRandom<Then> {
type: "stepswitch";
choiceType: "random";
/**
* The pool of elements to choose from randomly.
*/
elements: PixiVNJsonStepSwitchElementsType<Then>;
}
/**
* Picks elements in a random order, advancing through the list across visits (no repeats until exhausted).
*/
interface PixiVNJsonSequentialRandom<Then> {
type: "stepswitch";
choiceType: "sequentialrandom";
/**
* The pool of elements to iterate through in randomised order.
*/
elements: PixiVNJsonStepSwitchElementsType<Then>;
/**
* When the sequential ends, what should be the value? If undefined, it will return undefined.
* If "lastItem", it will return the last item in the array.
*/
end: undefined | "lastItem";
/**
* The subId is used for managing nested switches
*/
nestedId?: string;
}
/**
* Advances through the elements list one by one on each visit (in order).
*/
interface PixiVNJsonSequential<Then> {
type: "stepswitch";
choiceType: "sequential";
/**
* The ordered list of elements to iterate through.
*/
elements: PixiVNJsonStepSwitchElementsType<Then>;
/**
* When the sequential ends, what should be the value? If undefined, it will return undefined.
* If "lastItem", it will return the last item in the array.
*/
end: undefined | "lastItem";
/**
* The subId is used for managing nested switches
*/
nestedId?: string;
}
/**
* Loops through the elements list indefinitely, cycling back to the first element after the last.
*/
interface PixiVNJsonLoop<Then> {
type: "stepswitch";
choiceType: "loop";
/**
* The list of elements to cycle through.
*/
elements: PixiVNJsonStepSwitchElementsType<Then>;
/**
* The subId is used for managing nested switches
*/
nestedId?: string;
}
/**
* A step-switch selects one element from a list using a defined strategy (random, sequential, loop, or sequential-random).
*/
type PixiVNJsonStepSwitch<Then> = PixiVNJsonRandom<Then> | PixiVNJsonSequential<Then> | PixiVNJsonLoop<Then> | PixiVNJsonSequentialRandom<Then>;
/**
* This element is used in case a {@link PixiVNJsonConditionalStatements} gives a result that must be combined with another calculated through other {@link PixiVNJsonConditionalStatements}.
* in case this possibility is not managed, it will be taken into consideration {@link PixiVNJsonConditionalResultToCombine.firstItem}
*/
type PixiVNJsonConditionalResultToCombine<T> = {
type: "resulttocombine";
/**
* Defines how the two results are combined:
* - `"cross"` — cartesian product / pairwise combination of both results
* - `"union"` — concatenation / merge of both results into a single collection
*/
combine: "cross" | "union";
/**
* The first (primary) result item, used as a fallback if the second conditional produces no result.
*/
firstItem?: T;
/**
* The second conditional item(s) whose result will be combined with {@link firstItem}.
*/
secondConditionalItem?: PixiVNJsonStepSwitchElementType<T>[];
};
/**
* A conditional statement that evaluates to a value of type `Then`.
* It can be either:
* - a {@link PixiVNJsonStepSwitch} — selects a result from a list based on a strategy (random, sequential, loop)
* - a {@link PixiVNJsonIfElse} — evaluates a condition and returns the matching branch result,
* which may itself be another conditional or a {@link PixiVNJsonConditionalResultToCombine}
*/
type PixiVNJsonConditionalStatements<Then> = PixiVNJsonStepSwitch<Then> | PixiVNJsonIfElse<Then | PixiVNJsonConditionalStatements<Then> | PixiVNJsonConditionalResultToCombine<Then>>;
/**
* Retrieves a value from the persistent storage, flag storage, or temporary storage.
*/
type PixiVNJsonStorageGet = {
type: "value";
storageOperationType: "get";
/**
* Key of the storage
*/
key: string;
/**
* Type of the storage, if it is a flagStorage or a storage.
* If it is a flagStorage, the value will be get with the function {@link getFlag}
*/
storageType: "storage" | "flagStorage" | "tempstorage";
};
type PixiVNJsonParamGet = {
type: "value";
storageOperationType: "get";
/**
* Index of the parameter in the params array.
*/
key: number;
storageType: "params";
};
/**
* Retrieves the number of times a label has been opened.
*/
type PixiVNJsonLabelGet = {
type: "value";
storageOperationType: "get";
/**
* Id of the label
*/
label: string;
/**
* If it is a label, the value will be get with the function {@link narration.getTimesLabelOpened}
*/
storageType: "label";
};
/**
* Retrieves the number of times a specific choice has been selected.
*/
type PixiVNJsonChoiceGet = {
type: "value";
storageOperationType: "get";
/**
* index of the choice
*/
index: number;
/**
* If it is a choice, the value will be get with the function {@link narration.getTimesChoiceOpened}
*/
storageType: "choice";
};
/**
* Retrieves a value from the logic/arithmetic layer (result of a computation or condition).
*/
type PixiVNJsonLogicGet = {
type: "value";
storageOperationType: "get";
/**
* The arithmetic or conditional operation whose result is the retrieved value.
*/
operation: PixiVNJsonArithmeticOperations | PixiVNJsonConditions;
storageType: "logic";
};
/**
* Union of all "get value" operations — reads from storage, params, labels, choices, or a logic expression.
*/
type PixiVNJsonValueGet = PixiVNJsonStorageGet | PixiVNJsonParamGet | PixiVNJsonLabelGet | PixiVNJsonChoiceGet | PixiVNJsonLogicGet | PixiVNJsonFunction;
/**
* Invokes a named function and returns its result.
* Functions are registered in the Pixi'VN runtime and can receive typed arguments.
*/
type PixiVNJsonFunction = {
type: "function";
/**
* The name of the registered function to call.
*/
functionName: string;
/**
* Arguments to pass to the function. Each argument can be a condition, a raw value,
* a value-get operation, or an arithmetic expression.
*/
args: (PixiVNJsonConditions | StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations)[];
};
/**
* Sets a value in either the persistent storage or the temporary (session) storage.
*/
type PixiVNJsonOnlyStorageSet = {
type: "value";
storageOperationType: "set";
/**
* Key of the storage
*/
key: string;
/**
* Value to be set in the storage
*/
value: StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations | PixiVNJsonConditionalStatements<StorageElementType>;
/**
* Type of the storage, if it is a flagStorage or a storage.
*/
storageType: "storage" | "tempstorage";
};
/**
* Sets a positional parameter value in the params temporary storage.
*/
type PixiVNJsonOnlyParamSet = {
type: "value";
storageOperationType: "set";
/**
* Index of the parameter in the params array to set.
*/
key: number;
/**
* Value to be set at the given param index.
*/
value: StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations | PixiVNJsonConditionalStatements<StorageElementType>;
storageType: "params";
};
/**
* Sets a boolean flag in the flag storage.
* Flag storage is a dedicated boolean key-value store queried with {@link getFlag}.
*/
type PixiVNJsonFlagSet = {
type: "value";
storageOperationType: "set";
/**
* Key of the storage
*/
key: string;
/**
* Value to be set in the storage
*/
value: boolean;
/**
* Type of the storage, if it is a flagStorage or a storage.
*/
storageType: "flagStorage";
};
/**
* Union of all "set value" operations — writes to storage, flag storage, or params.
*/
type PixiVNJsonValueSet = PixiVNJsonOnlyStorageSet | PixiVNJsonFlagSet | PixiVNJsonOnlyParamSet;
/**
* Binary arithmetic operation between two values (left OP right).
*/
interface PixiVNJsonArithmeticOperationsArithmetic {
type: "arithmetic";
/**
* Left value of the arithmetic operation
*/
leftValue: StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations | PixiVNJsonConditionalStatements<StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations>;
/**
* Right value of the arithmetic operation
*/
rightValue: StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations | PixiVNJsonConditionalStatements<StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations>;
/**
* Operator of the arithmetic operation:
* - `"*"` multiplication
* - `"/"` division
* - `"+"` addition (concatenation for strings and arrays)
* - `"-"` subtraction (removal of elements for arrays)
* - `"%"` modulo
* - `"POW"` exponentiation
* - `"RANDOM"` random integer between leftValue and rightValue (inclusive)
* - `"INTERSECTION"` intersection of two arrays (only elements present in both arrays are included in the result)
*/
operator: "*" | "/" | "+" | "-" | "%" | "POW" | "RANDOM" | "INTERSECTION";
}
/**
* Unary arithmetic operation applied to a single value (e.g. INT, FLOOR, FLOAT).
*/
interface PixiVNJsonArithmeticOperationsArithmeticSingle {
type: "arithmeticsingle";
/**
* Left value of the arithmetic operation
*/
leftValue: StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations | PixiVNJsonConditionalStatements<StorageElementType | PixiVNJsonValueGet | PixiVNJsonArithmeticOperations>;
/**
* Operator of the arithmetic operation:
* - `"INT"` truncates the value to an integer (removes the decimal part)
* - `"FLOOR"` rounds down to the nearest integer
* - `"FLOAT"` converts the value to a floating-point number
*/
operator: "INT" | "FLOOR" | "FLOAT";
}
/**
* Arithmetic operations for the PixiVNJson
*/
type PixiVNJsonArithmeticOperations = PixiVNJsonArithmeticOperationsArithmeticSingle | PixiVNJsonArithmeticOperationsArithmetic;
/**
* Combines multiple conditions with a logical AND or OR.
*/
type PixiVNJsonUnionConditionAndOr = {
type: "union";
/**
* The list of conditions to combine.
*/
conditions: PixiVNJsonConditions[];
/**
* - `"and"` — all conditions must be true
* - `"or"` — at least one condition must be true
*/
unionType: "and" | "or";
};
/**
* Negates a single condition with a logical NOT.
*/
type PixiVNJsonUnionConditionNot = {
type: "union";
/**
* The condition to negate.
*/
condition: PixiVNJsonConditions;
unionType: "not";
};
/**
* Union of AND/OR and NOT logical operators over conditions.
*/
type PixiVNJsonUnionCondition = PixiVNJsonUnionConditionAndOr | PixiVNJsonUnionConditionNot;
/**
* Supported comparison operators.
* - `"=="` equal
* - `"!="` not equal
* - `"<"` less than
* - `"<="` less than or equal
* - `">"` greater than
* - `">="` greater than or equal
* - `"CONTAINS"` checks whether the left string/array contains the right value, if left and right are arrays, checks if all items in right are included in left
*/
type PixiVNJsonComparationOperatorsType = "==" | "!=" | "<" | "<=" | ">" | ">=" | "CONTAINS";
/**
* Comparation for PixiVNJson.
* In this comparation, the values to be converted to string and compared.
*/
type PixiVNJsonComparation = {
type: "compare";
/**
* Left value of the comparation
*/
leftValue: StorageElementType | PixiVNJsonValueGet | PixiVNJsonConditions;
/**
* Right value of the comparation
*/
rightValue: StorageElementType | PixiVNJsonValueGet | PixiVNJsonConditions;
/**
* Operator of the comparation
*/
operator: PixiVNJsonComparationOperatorsType;
};
/**
* A plain value condition — truthy/falsy evaluation of a raw value or a value-get result.
*/
type PixiVNJsonValueCondition = StorageElementType | PixiVNJsonValueGet;
/**
* Union of all condition types supported by PixiVNJson:
* - {@link PixiVNJsonComparation} — binary comparison between two values
* - {@link PixiVNJsonValueCondition} — truthy/falsy check on a plain value
* - {@link PixiVNJsonUnionCondition} — logical AND, OR, or NOT of other conditions
* - {@link PixiVNJsonArithmeticOperations} — arithmetic result used as a boolean (non-zero = true)
*/
type PixiVNJsonConditions = PixiVNJsonComparation | PixiVNJsonValueCondition | PixiVNJsonUnionCondition | PixiVNJsonArithmeticOperations;
/**
* If-Else condition for PixiVNJson
*/
interface PixiVNJsonIfElse<Then> {
type: "ifelse";
/**
* The list of conditions to be checked.
*
* if is a {@link StorageElementType} or a {@link PixiVNJsonValueGet}:
* - if is a array or object, the condition is true if not empty
* - if is a string, the condition is true if not empty
* - if is a number, the condition is true if not zero
* - if is a boolean, the condition is true if true
* - if is null or undefined, the condition is false
*/
condition: PixiVNJsonConditions;
/**
* The value to be returned if the condition is true.
*/
then: Then | PixiVNJsonIfElse<Then>;
/**
* The value to be returned if the condition is false.
*/
else?: Then | PixiVNJsonIfElse<Then>;
}
/**
* Animates one or more canvas elements simultaneously using keyframe-based animation.
*/
type PixiVNJsonAnimateBase<T extends CanvasBaseInterface<any>> = {
type: "animate";
/**
* Alias (or list of aliases) of the canvas elements to animate.
*/
alias: string | string[];
/**
* The keyframes that define the animation values over time.
*/
keyframes: KeyframesType<T>;
/**
* Additional options controlling the animation (duration, easing, repeat, etc.).
*/
options?: AnimationOptions;
/**
* Pixi.js update priority for this animation ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Animates a canvas element using a sequence of segments (timeline-based animation).
*/
type PixiVNJsonAnimateSequence<T extends CanvasBaseInterface<any>> = {
type: "animate-sequence";
/**
* Alias of the canvas element to animate.
*/
alias: string;
/**
* Ordered list of animation segments, each optionally including a transition.
*/
sequence: (ObjectSegment<T> | ObjectSegmentWithTransition<T>)[];
/**
* Additional options controlling the sequence playback.
*/
options?: SequenceOptions;
/**
* Pixi.js update priority for this animation ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Union of all canvas animation operations — keyframe-based or sequence-based.
*/
type PixiVNJsonCanvasAnimate<T extends CanvasBaseInterface<any> = ImageSprite> = PixiVNJsonAnimateBase<T> | PixiVNJsonAnimateSequence<T>;
/**
* Applies a shake effect to a canvas element.
*/
type PixiVNJsonEffectShake = {
type: "shake";
/**
* Alias of the canvas element to apply the shake effect to.
*/
alias: string;
/**
* Configuration properties for the shake effect (amplitude, duration, etc.).
*/
props: ShakeEffectProps;
/**
* Pixi.js update priority for the effect ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Union of all canvas visual effects.
*/
type PixiVNJsonCanvasEffect = PixiVNJsonEffectShake;
/**
* Cross-dissolve transition — blends the element in or out by gradually changing its opacity.
*/
type DissolveTransition = {
type: "dissolve";
/**
* Configuration options for the dissolve transition.
*/
props?: ShowWithDissolveTransitionProps;
/**
* Pixi.js update priority for the transition ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Fade transition — fades the element in or out by animating its alpha value.
*/
type FadeTransition = {
type: "fade";
/**
* Configuration options for the fade transition.
*/
props?: ShowWithFadeTransitionProps;
/**
* Pixi.js update priority for the transition ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Move-in / Move-out transition — slides the element into or out of the viewport.
*/
type MoveInOutTransition = {
type: "movein" | "moveout";
/**
* Configuration options for the move transition (direction, duration, easing, etc.).
*/
props?: MoveInOutProps;
/**
* Pixi.js update priority for the transition ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Zoom-in / Zoom-out transition — scales the element into or out of view.
*/
type ZoomInOutTransition = {
type: "zoomin" | "zoomout";
/**
* Configuration options for the zoom transition (scale, duration, easing, etc.).
*/
props?: ZoomInOutProps;
/**
* Pixi.js update priority for the transition ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Push-in / Push-out transition — pushes the element onto or off the viewport, displacing the current content.
*/
type PushInOutTransition = {
type: "pushin" | "pushout";
/**
* Configuration options for the push transition (direction, duration, easing, etc.).
*/
props?: PushInOutProps;
/**
* Pixi.js update priority for the transition ticker callback.
*/
priority?: UPDATE_PRIORITY;
};
/**
* Union of all supported canvas media transitions.
*/
type PixiVNJsonMediaTransiotions = DissolveTransition | FadeTransition | MoveInOutTransition | ZoomInOutTransition | PushInOutTransition;
/**
* Shows an image or video asset on the canvas.
*/
type PixiVNJsonCanvasImageVideoShow = {
type: "image" | "video";
operationType: "show";
/**
* Unique identifier (alias) used to reference this element on the canvas.
*/
alias: string;
/**
* The url of the image or video.
* If the url is not provided, the url will be set to the alias.
*/
url?: string;
/**
* Display options (position, scale, alpha, etc.) for the image or video sprite.
*/
props?: ImageSpriteOptions;
/**
* Optional transition effect applied when the element appears on screen.
*/
transition?: PixiVNJsonMediaTransiotions;
};
/**
* Shows an image container (a group of layered images) on the canvas.
*/
type PixiVNJsonCanvasImageContainerShow = {
type: "imagecontainer";
operationType: "show";
/**
* Unique identifier (alias) used to reference this element on the canvas.
*/
alias: string;
/**
* The ordered list of image URLs that compose the container layers.
*/
urls: string[];
/**
* Display options for the image container.
*/
props?: ImageContainerOptions<ImageSprite>;
/**
* Optional transition effect applied when the element appears on screen.
*/
transition?: PixiVNJsonMediaTransiotions;
};
/**
* Shows a text element on the canvas.
*/
type PixiVNJsonCanvasTextShow = {
type: "text";
operationType: "show";
/**
* Unique identifier (alias) used to reference this element on the canvas.
*/
alias: string;
/**
* The string content to display.
*/
text: string;
/**
* Display options (font, style, position, etc.) for the text element.
*/
props?: TextOptions;
/**
* Optional transition effect applied when the element appears on screen.
*/
transition?: PixiVNJsonMediaTransiotions;
};
/**
* Edits the properties of an existing image sprite on the canvas.
*/
type PixiVNJsonImageEdit = {
type: "image";
operationType: "edit";
/**
* Alias of the canvas element to edit.
*/
alias: string;
/**
* Partial memory/state properties to update on the image sprite.
*/
props?: Partial<ImageSpriteMemory>;
};
/**
* Edits the properties of an existing video sprite on the canvas.
*/
type PixiVNJsonVideoEdit = {
type: "video";
operationType: "edit";
/**
* Alias of the canvas element to edit.
*/
alias: string;
/**
* Partial memory/state properties to update on the video sprite.
*/
props?: Partial<VideoSpriteMemory>;
};
/**
* Edits the properties of an existing image container on the canvas.
*/
type PixiVNJsonImageContainerEdit = {
type: "imagecontainer";
operationType: "edit";
/**
* Alias of the canvas element to edit.
*/
alias: string;
/**
* Partial memory/state properties to update on the image container.
*/
props?: Partial<ImageContainerMemory>;
};
/**
* Edits the properties of an existing text element on the canvas.
*/
type PixiVNJsonTextEdit = {
type: "text";
operationType: "edit";
/**
* Alias of the canvas element to edit.
*/
alias: string;
/**
* Partial memory/state properties to update on the text element.
*/
props?: Partial<TextMemory>;
};
/**
* Edits the properties of an unknown/generic canvas element.
* Use this when the specific element type is not one of the built-in kinds.
*/
type PixiVNJsonUnknownEdit<T extends ContainerOptions<any>> = {
type: "canvaselement";
operationType: "edit";
/**
* Alias of the canvas element to edit.
*/
alias: string;
/**
* Partial options/properties to update on the canvas element.
*/
props?: Partial<T>;
};
/**
* Removes a canvas element from the stage, optionally with a transition.
*/
type PixiVNJsonCanvasRemove = {
type: "image" | "video" | "imagecontainer" | "canvaselement" | "text";
operationType: "remove";
/**
* Alias of the canvas element to remove.
*/
alias: string;
/**
* Optional transition effect applied while the element disappears.
*/
transition?: PixiVNJsonMediaTransiotions;
};
/**
* Pauses or resumes playback of a video sprite on the canvas.
*/
type PixiVNJsonVideoPauseResume = {
type: "video";
operationType: "pause" | "resume";
/**
* Alias of the video element to pause or resume.
*/
alias: string;
};
/**
* Loads or lazy-loads asset bundles or individual assets into memory.
*/
type PixiVNJsonAssetsLoad = {
type: "assets" | "bundle";
operationType: "load" | "lazyload";
/**
* List of asset aliases (or bundle names) to load.
*/
aliases: string[];
};
type PixiVNJsonCanvasShow = PixiVNJsonCanvasImageContainerShow | PixiVNJsonCanvasImageVideoShow | PixiVNJsonCanvasTextShow;
/**
* Union of all canvas-element edit operations.
*/
type PixiVNJsonCanvasEdit = PixiVNJsonImageEdit | PixiVNJsonVideoEdit | PixiVNJsonImageContainerEdit | PixiVNJsonTextEdit | PixiVNJsonUnknownEdit<ImageSpriteMemory | VideoSpriteMemory | ContainerMemory | TextMemory>;
/**
* Union of all canvas operations — show, edit, remove, animate, apply effects, and asset loading.
*/
type PixiVNJsonCanvas = PixiVNJsonCanvasShow | PixiVNJsonCanvasEdit | PixiVNJsonCanvasRemove | PixiVNJsonVideoPauseResume | PixiVNJsonAssetsLoad | PixiVNJsonCanvasAnimate | PixiVNJsonCanvasEffect;
/**
* Requests user input during the narrative.
* When this operation is encountered, the engine pauses and waits for the player to provide a value.
*/
type PixiVNJsonInputRequest = {
type: "input";
operationType: "request";
/**
* The expected value type for the input (e.g. `"string"`, `"number"`, `"boolean"`).
* Used by the engine to validate or cast the player's answer.
*/
valueType?: string;
/**
* A default value that will be used if the player does not provide any input.
*/
defaultValue?: any;
};
/**
* Clears (resets) the current dialogue state.
* This is typically used to wipe any displayed text before showing new content.
*/
type PixiVNJsonDialogue = {
type: "dialogue";
operationType: "clean";
};
/**
* Narration operation — either a dialogue clear or a user-input request.
*/
type PixiVNJsonNarration = PixiVNJsonDialogue | PixiVNJsonInputRequest;
/**
* Starts playback of a sound asset.
*/
type PixiVNJsonSoundPlay = {
type: "sound";
operationType: "play";
/**
* Unique identifier (alias) used to reference this sound.
*/
alias: string;
/**
* URL of the sound file. If omitted, the alias is used as the URL.
*/
url?: string;
/**
* Playback options such as volume, loop, channel, and start offset.
*/
props?: SoundPlayOptionsWithChannel;
};
/**
* Stops a playing sound and removes it from the audio context.
*/
type PixiVNJsonSoundRemove = {
type: "sound";
operationType: "stop";
/**
* Alias of the sound to stop.
*/
alias: string;
};
/**
* Pauses or resumes a sound, a channel, or all audio.
*/
type PixiVNJsonSoundPauseResume = {
type: "sound" | "channel";
operationType: "pause" | "resume";
/**
* Alias of the sound or channel to pause/resume.
*/
alias: string;
} | {
type: "all";
operationType: "pause" | "resume" | "stop";
};
/**
* Edits the properties of a currently playing sound (volume, speed, muted, loop, etc.).
*/
type PixiVNJsonSoundEdit = {
type: "sound";
operationType: "edit";
/**
* Alias of the sound to edit.
*/
alias: string;
/**
* Partial set of properties to apply to the sound.
*/
props: Partial<Pick<MediaInterface, "speed" | "muted" | "loop" | "paused"> & Pick<SoundPlayOptionsWithChannel, "volume">>;
};
/**
* Union of all sound operations — play, stop, pause/resume, and edit.
*/
type PixiVNJsonSound = PixiVNJsonSoundPlay | PixiVNJsonSoundRemove | PixiVNJsonSoundPauseResume | PixiVNJsonSoundEdit;
/**
* An operation string that holds a list of string/value fragments to be concatenated at runtime.
* Used internally to represent string interpolation expressions before they are fully resolved.
*/
type PixiVNJsonOperationString = {
type: "operationtoconvert";
/**
* The ordered list of string fragments and/or value-get expressions to concatenate.
*/
values: (string | PixiVNJsonValueGet | PixiVNJsonConditionalStatements<string | PixiVNJsonValueGet>)[];
};
/**
* A single resolved operation — a value set, canvas operation, sound operation,
* narration operation, or function call — optionally annotated with an origin string.
*/
type PixiVNJsonOperation = (PixiVNJsonValueSet | PixiVNJsonCanvas | PixiVNJsonSound | PixiVNJsonNarration | PixiVNJsonFunction) & {
/**
* This value is used by the system to know where this operation is from, for example, if is generated from a string operation.
*/
$origin?: string;
};
/**
* A conditional operation — either a plain operation, an if-else that resolves to one,
* or an operation-string (string interpolation expression).
*/
type PixiVNJsonConditionalOperation = PixiVNJsonOperation | PixiVNJsonIfElse<PixiVNJsonOperation> | PixiVNJsonOperationString;
/**
* A player-presentable choice in a menu.
*/
type PixiVNJsonChoice = {
/**
* The text to be displayed.
*/
text: PixiVNJsonDialogText;
/**
* The label id to be opened.
*/
label: string;
/**
* Label opening mode
*/
type: LabelRunModeType;
/**
* The properties to be passed to the label.
*/
props: StorageObjectType;
/**
* If this is true, the choice can only be made once.
*/
oneTime?: boolean;
/**
* If this is true, the choice can see only if there are no other choices. For example, all choices are one-time choices and they are already selected.
*/
onlyHaveNoChoice?: boolean;
/**
* If this is true and if is the only choice, it will be automatically selected, and call/jump to the label.
*/
autoSelect?: boolean;
};
/**
* A list of choices (possibly conditional) that are shown to the player as a menu.
*/
type PixiVNJsonChoices = (PixiVNJsonChoice | PixiVNJsonConditionalStatements<PixiVNJsonChoice>)[];
/**
* The text content of a dialogue line.
* Can be a plain string, a dynamic value-get, a conditional expression, or an array of any of these
* (which will be concatenated into a single string at runtime).
*/
type PixiVNJsonDialogText = string | PixiVNJsonValueGet | PixiVNJsonConditionalStatements<string | PixiVNJsonValueGet | string[]> | (string | PixiVNJsonValueGet | PixiVNJsonConditionalStatements<string | PixiVNJsonValueGet | string[]>)[];
/**
* A dialogue line, optionally attributed to a character.
* When a plain `Text` value is used, no character attribution is included.
*/
type PixiVNJsonDialog<Text = string> = {
/**
* The character id that will speak.
*/
character: string;
/**
* The text to be displayed.
*/
text: Text;
} | Text;
/**
* Describes a label that should be opened (called or jumped to) during a step.
*/
type PixiVNJsonLabelToOpen<T extends {} = object> = {
/**
* The id of the label to open.
*/
label: string | PixiVNJsonValueGet;
/**
* Label opening mode
*/
type: LabelRunModeType;
/**
* The properties to be passed to the label. if you don't want to pass a object, but a list of parameters, you can use the {@link PixiVNJsonLabelToOpen.params} attribute.
*/
props?: StepLabelPropsType<T>;
/**
* **It is not recommended to use it, use it only if necessary**. The parameters to be passed to the label. If you want to pass an object, use the {@link PixiVNJsonLabelToOpen.props} attribute.
* "params" attribute will be stored in the temp storage with the key: {@link PIXIVNJSON_PARAM_ID} + ({@link narration.openedLabels.length} - 1).
*/
params?: unknown[];
};
/**
* Steps of a label.
* Order of operations:
* 1. run all {@link PixiVNJsonLabelStep.operations}
* 2. set {@link PixiVNJsonLabelStep.choices}, {@link PixiVNJsonLabelStep.dialogue}, {@link PixiVNJsonLabelStep.glueEnabled}
* 3. open {@link PixiVNJsonLabelStep.labelToOpen}
* 4. go to next step if {@link PixiVNJsonLabelStep.goNextStep} is true
* 5. end the label if {@link PixiVNJsonLabelStep.end} is "label_end"
*/
type PixiVNJsonLabelStep = {
/**
* Operations to execute at the start of this step (storage writes, canvas updates, sound, etc.).
*/
operations?: PixiVNJsonConditionalOperation[];
/**
* Variable used to display a choice menu.
*/
choices?: PixiVNJsonChoices | PixiVNJsonConditionalStatements<PixiVNJsonChoices>;
/**
* Variable used to display a dialog.
*/
dialogue?: PixiVNJsonDialog<PixiVNJsonDialogText> | PixiVNJsonConditionalStatements<PixiVNJsonDialog<PixiVNJsonDialogText>>;
/**
* 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
*/
glueEnabled?: boolean | PixiVNJsonConditionalStatements<boolean>;
/**
* Variable used to open a label.
*/
labelToOpen?: PixiVNJsonLabelToOpen | PixiVNJsonConditionalStatements<PixiVNJsonLabelToOpen> | (PixiVNJsonLabelToOpen | PixiVNJsonConditionalStatements<PixiVNJsonLabelToOpen>)[];
/**
* If is true, the next step will be executed automatically.
*/
goNextStep?: boolean | PixiVNJsonConditionalStatements<boolean>;
/**
* Variable used to end some elements of the narrative.
* - game_end: ends the game
* - label_end: ends the label
*/
end?: "game_end" | "label_end" | PixiVNJsonConditionalStatements<"game_end" | "label_end">;
/**
* If set, this step is replaced by the result of evaluating the given conditional statement.
* Allows an entire step to be chosen at runtime based on a condition or step-switch strategy.
*/
conditionalStep?: PixiVNJsonConditionalStatements<PixiVNJsonLabelStep | PixiVNJsonLabelStep[]>;
};
/**
* Manages the translation pipeline for all text displayed by pixi-vn-json.
*
* The pipeline applies three optional hooks in order:
* 1. `beforeToTranslate` – pre-processes the key before translation.
* 2. `translate` – the main translation function (identity by default).
* 3. `afterToTranslate` – post-processes the translated string.
*
* Use {@link TranslatorManager.t} to translate a key or array of keys.
*/
declare class TranslatorManager {
private static _beforeToTranslate;
private static _translate;
private static _afterToTranslate;
/**
* Translates a single key or an array of keys using the registered pipeline.
* Returns the same type (`string` or `string[]`) as the input.
*
* @param key - The string key or array of string keys to translate.
* @returns The translated string(s).
*/
static t<T = string | string[]>(key: T): T;
/**
* Sets a hook that runs **before** the main translation function.
* Useful for key normalization (e.g. trimming, lowercasing).
*/
static set beforeToTranslate(value: (key: string) => string);
/**
* Sets the main translation function.
* Defaults to an identity function (returns the key unchanged).
*
* @example
* ```ts
* translator.translate = (key) => i18n.t(key);
* ```
*/
static set translate(value: (key: string) => string);
/** Returns the composed translation pipeline (before → translate → after). */
static get translate(): (key: string) => string;
/**
* Sets a hook that runs **after** the main translation function.
* Useful for post-processing translated strings (e.g. replacing placeholders).
*/
static set afterToTranslate(value: (key: string) => string);
private static addKey;
private static getConditionalsThenElse;
/**
* Generates a JSON translation object from the provided labels.
* @param labels The labels to translate.
* @param json The JSON object to populate with translations.
* @param options Options for translation, including default value handling.
* @returns The populated JSON object with translations.
*/
static generateJsonTranslation(labels: PixiVNJsonLabelStep[], json?: object, options?: {
/**
* Default value to use when a key is not found.
* - "empty_string": Use an empty string as the default value.
* - "copy_key": Use the key itself as the default value.
* @default "copy_key"
*/
defaultValue?: "empty_string" | "copy_key";
operationStringConvert?: (value: string, step: PixiVNJsonLabelStep, props: StepLabelPropsType | {}) => Promise<PixiVNJsonOperation | undefined>;
}): Promise<object>;
}
declare const translator: typeof TranslatorManager;
export { translator };