narraleaf-studio 1.6.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/_api.d.ts +137 -4
  2. package/package.json +1 -1
package/dist/_api.d.ts CHANGED
@@ -812,13 +812,26 @@ type StoryActionPayload = {
812
812
  transform?: StoryTransformRef;
813
813
  } | {
814
814
  action: "text";
815
- operation: "create" | "setText" | "show" | "hide" | "setFontSize" | "setFontColor";
815
+ /**
816
+ * `setFont` is the combined op: it sets whichever of {@link fontSize}, {@link fontColor} and
817
+ * {@link outline} the row states, so one `/font` line can say all three. The two single ops
818
+ * stay for the rows that hold them and for a line that names one value alone.
819
+ *
820
+ * Additive: no document written before it carries the value, so no schema bump - the same
821
+ * rule `bringToFront` came in under.
822
+ */
823
+ operation: "create" | "setText" | "show" | "hide" | "setFontSize" | "setFontColor" | "setFont";
816
824
  objectName: string;
817
825
  /** Which text a non-`create` op acts on. Same rule as the `image` arm's `target`. */
818
826
  target?: StoryDisplayableTargetRef;
819
827
  text?: string;
820
828
  fontSize?: number;
821
829
  fontColor?: string;
830
+ /**
831
+ * The outline drawn round the glyphs, read by `setFont`. `null` takes an outline away
832
+ * (`outline=0`); absent leaves whatever the text has.
833
+ */
834
+ outline?: StoryTextOutline | null;
822
835
  layer?: StoryLayerRef;
823
836
  transform?: StoryTransformRef;
824
837
  } | {
@@ -1059,7 +1072,29 @@ type StoryActionPayload = {
1059
1072
  params: Record<string, StoryPluginActionParamValue>;
1060
1073
  }
1061
1074
  /** The player's hands: a pad that shakes, a locked passage, a row that waits for a gesture. */
1062
- | StoryInputActionPayload;
1075
+ | StoryInputActionPayload | {
1076
+ /**
1077
+ * Open one of the project's pages over the stage (`/page`), hold the story until the page
1078
+ * closes, and go on from the row after it - a phone, a map, a letter the player reads.
1079
+ *
1080
+ * The page is shown exactly as `Show Layer` shows one from a blueprint, so the page closes
1081
+ * itself with `Close This Layer`, and what it closes with is the row's answer. Unlike
1082
+ * `/quit`, the scene is not left: the story is where it was when the page goes away.
1083
+ */
1084
+ action: "page";
1085
+ /**
1086
+ * The page, by id - never by name, so a rename keeps the row on the same page, as `/quit`
1087
+ * keeps naming its page.
1088
+ */
1089
+ surfaceId: string;
1090
+ /**
1091
+ * A variable to write what the page closed with. A boolean, a number or a text variable
1092
+ * takes the result converted to its own type; a page closed with no result (Back on a
1093
+ * dismissible page, a load, the story rolled back past the row) writes nothing, so the
1094
+ * variable keeps the value it had. Absent writes nothing at all.
1095
+ */
1096
+ resultTarget?: StoryVariableRef;
1097
+ };
1063
1098
  type StoryPluginActionParamValue = string | number | boolean | null | StoryPluginActionParamValue[] | {
1064
1099
  [key: string]: StoryPluginActionParamValue;
1065
1100
  };
@@ -1557,6 +1592,10 @@ declare const STORY_TRANSFORM_REPEAT_TYPES: readonly [
1557
1592
  "mirror"
1558
1593
  ];
1559
1594
  type StoryTransformRepeatType = (typeof STORY_TRANSFORM_REPEAT_TYPES)[number];
1595
+ type StoryTextOutline = {
1596
+ width: number;
1597
+ color: string;
1598
+ };
1560
1599
  type StoryTransformRef = {
1561
1600
  /** Absent means `"props"`. Only a Story Motion has to say which it is. */
1562
1601
  mode?: "props" | "animation";
@@ -1649,6 +1688,11 @@ type StoryAlignPositionValue = {
1649
1688
  xoffset?: number;
1650
1689
  yoffset?: number;
1651
1690
  };
1691
+ interface CharacterFrameSequence {
1692
+ frameAssetIds: string[];
1693
+ fps: number;
1694
+ loop: boolean;
1695
+ }
1652
1696
  type BlueprintOwnerRef = {
1653
1697
  kind: "globalMain";
1654
1698
  } | {
@@ -2305,6 +2349,14 @@ declare const en: {
2305
2349
  readonly command: "Highlight commands";
2306
2350
  };
2307
2351
  };
2352
+ readonly characterListGrouping: {
2353
+ readonly label: "Character lists";
2354
+ readonly description: "How the cast is arranged where a character is picked.";
2355
+ readonly options: {
2356
+ readonly grouped: "Group by cast group";
2357
+ readonly all: "Show all characters";
2358
+ };
2359
+ };
2308
2360
  readonly dictionaries: {
2309
2361
  readonly label: "Spelling dictionaries";
2310
2362
  };
@@ -3106,6 +3158,9 @@ declare const en: {
3106
3158
  readonly auditionFilterAll: "All";
3107
3159
  readonly auditionFilterApproved: "Approved";
3108
3160
  readonly auditionFilterPending: "Pending";
3161
+ readonly filterSpeakerAll: "All speakers";
3162
+ readonly speakerFilterLabel: "Speaker";
3163
+ readonly searchPlaceholder: "Search lines";
3109
3164
  readonly narrationSpeaker: "Narration";
3110
3165
  readonly narrationGroup: "Narration";
3111
3166
  readonly choiceSpeaker: "Choice";
@@ -3498,6 +3553,7 @@ declare const en: {
3498
3553
  readonly playtest_hover: "Hover in the game";
3499
3554
  readonly playtest_key: "Press a key in the game";
3500
3555
  readonly playtest_stop: "Stop playing";
3556
+ readonly playtest_variables: "Read the game's variables";
3501
3557
  readonly console_read: "Read Studio's console";
3502
3558
  readonly build: "Build the game";
3503
3559
  };
@@ -4636,6 +4692,7 @@ declare const en: {
4636
4692
  readonly reason: {
4637
4693
  readonly blueprintAction: "A blueprint runs this row, and a blueprint has no script form.";
4638
4694
  readonly inputAction: "This row works with the player's input or the controller's rumble, and has no script form.";
4695
+ readonly pageAction: "This row opens a page over the story and waits for it, and has no script form.";
4639
4696
  readonly blueprintCondition: "A blueprint decides this condition.";
4640
4697
  readonly blueprintInterpolation: "A blueprint computes a value inside this text.";
4641
4698
  readonly inlineEvent: "The text carries an event that fires while it is being typed out.";
@@ -4662,6 +4719,7 @@ declare const en: {
4662
4719
  readonly badTag: "This line carries a formatting tag that is unknown, or left open.";
4663
4720
  readonly badExpression: "This expression does not resolve.";
4664
4721
  readonly layerDeclaration: "A script cannot declare a layer. Add it to the scene's layers";
4722
+ readonly retiredLead: "Options no longer read \"show if\" or \"enable if\". Write \"hide if\" or \"disable if\" followed by the condition under which the option is hidden or greyed out";
4665
4723
  };
4666
4724
  readonly view: {
4667
4725
  readonly open: "Read as a script";
@@ -5100,6 +5158,8 @@ declare const en: {
5100
5158
  readonly hold: "Hold Seconds";
5101
5159
  readonly opacity: "Opacity";
5102
5160
  readonly size: "Font Size";
5161
+ readonly outline: "Outline px";
5162
+ readonly outlineColor: "Outline Color";
5103
5163
  readonly xOffset: "X Offset px";
5104
5164
  readonly yOffset: "Y Offset px";
5105
5165
  readonly zoom: "Zoom";
@@ -5866,6 +5926,10 @@ declare const en: {
5866
5926
  readonly label: "Quit to page";
5867
5927
  readonly detail: "End this playthrough at this line and show a page. No ending is recorded";
5868
5928
  };
5929
+ readonly page: {
5930
+ readonly label: "Open page";
5931
+ readonly detail: "Open a page over the story and wait until it closes. What the page closes with can be written into a variable";
5932
+ };
5869
5933
  readonly rumble: {
5870
5934
  readonly label: "Rumble";
5871
5935
  readonly detail: "Vibrate the player's controller. Pick a preset, or set each motor";
@@ -5948,6 +6012,7 @@ declare const en: {
5948
6012
  readonly cut: "Cut point";
5949
6013
  readonly ending: "Ending";
5950
6014
  readonly quit: "Quit to page";
6015
+ readonly page: "Page";
5951
6016
  readonly rumble: "Rumble";
5952
6017
  readonly input: "Input";
5953
6018
  readonly jump: "Jump";
@@ -6016,6 +6081,8 @@ declare const en: {
6016
6081
  readonly cutUnknown: "Cut point";
6017
6082
  readonly ending: "Ending {name}";
6018
6083
  readonly quit: "Quit to {page}";
6084
+ readonly page: "Open {page}";
6085
+ readonly pageUnset: "Open page";
6019
6086
  readonly rumble: "Rumble: {shape}";
6020
6087
  readonly rumbleStop: "Stop rumble";
6021
6088
  readonly inputLock: "Lock player input";
@@ -6572,6 +6639,7 @@ declare const en: {
6572
6639
  readonly setText: "Set text";
6573
6640
  readonly setFontSize: "Set font size";
6574
6641
  readonly setFontColor: "Set font color";
6642
+ readonly setFont: "Set font";
6575
6643
  };
6576
6644
  readonly layerOperation: {
6577
6645
  readonly setZIndex: "Set z-index";
@@ -6654,6 +6722,8 @@ declare const en: {
6654
6722
  readonly textName: "Text name";
6655
6723
  readonly fontSize: "Font size";
6656
6724
  readonly fontColor: "Font color";
6725
+ readonly outlineWidth: "Outline width";
6726
+ readonly outlineColor: "Outline color";
6657
6727
  readonly text: "Text";
6658
6728
  };
6659
6729
  readonly layer: {
@@ -6771,6 +6841,8 @@ declare const en: {
6771
6841
  readonly quitPage: "Page shown afterwards";
6772
6842
  readonly quitPageUnset: "Not set";
6773
6843
  readonly quitHint: "This playthrough ends at this line and the page takes the screen. No ending is recorded.";
6844
+ readonly pagePage: "Page";
6845
+ readonly pageHint: "The page opens over the story, and the story waits until the page closes itself with Close This Layer. What it closes with is written into the result variable, converted to the variable's type; a page closed with nothing leaves the variable as it was.";
6774
6846
  readonly branch: "Branch";
6775
6847
  readonly elseHint: "Else branch runs when previous branches do not match.";
6776
6848
  };
@@ -8859,6 +8931,8 @@ declare const en: {
8859
8931
  readonly onFullscreenChanged: "On Fullscreen Changed";
8860
8932
  readonly onWindowCloseRequested: "On Window Close Requested";
8861
8933
  readonly onWindowFocusChanged: "On Window Focus Changed";
8934
+ readonly onSavedVarChanged: "On Saved Var Changed";
8935
+ readonly onPersistentChanged: "On Persistent Changed";
8862
8936
  readonly onAction: "On Action";
8863
8937
  readonly onKeyDown: "On Key Down";
8864
8938
  readonly onKeyUp: "On Key Up";
@@ -9149,6 +9223,15 @@ declare const en: {
9149
9223
  readonly colorReset: "Compute from the name";
9150
9224
  };
9151
9225
  readonly editor: {
9226
+ readonly sequenceTitle: "Frame sequence";
9227
+ readonly sequenceImport: "Import PNG frames";
9228
+ readonly sequenceFps: "Frames per second";
9229
+ readonly sequenceLoop: "Loop";
9230
+ readonly sequenceStatic: "Use first frame only";
9231
+ readonly sequenceMoveUp: "Move frame up";
9232
+ readonly sequenceMoveDown: "Move frame down";
9233
+ readonly sequencePngOnly: "All frames must be PNG images.";
9234
+ readonly sequenceSizeMismatch: "All frames must have the same dimensions.";
9152
9235
  readonly kind: {
9153
9236
  readonly preset: "Preset sprites";
9154
9237
  readonly layered: "Layered sprite";
@@ -9347,6 +9430,12 @@ declare const en: {
9347
9430
  readonly select: "Select";
9348
9431
  readonly thumbnailAlt: "thumbnail";
9349
9432
  readonly color: "Color";
9433
+ readonly aliases: "Aliases";
9434
+ readonly aliasesTip: "A story line whose speaker is written as an alias belongs to this character. The game still shows the character's name.";
9435
+ readonly addAliasPlaceholder: "Add alias\u2026";
9436
+ readonly aliasIsName: "\"{alias}\" is this character's name.";
9437
+ readonly aliasTakenByName: "\"{alias}\" is the name of {names}. Lines spoken as \"{alias}\" belong to {names}.";
9438
+ readonly aliasShared: "\"{alias}\" is also an alias of {names}. Lines spoken as \"{alias}\" cannot be assigned to one character.";
9350
9439
  readonly namePlaceholder: "Character name";
9351
9440
  readonly descriptionPlaceholder: "Character description\u2026";
9352
9441
  readonly tags: "Tags";
@@ -9679,6 +9768,9 @@ declare const en: {
9679
9768
  readonly descriptionPlaceholder: "Enter description\u2026";
9680
9769
  readonly info: {
9681
9770
  readonly dimensions: "Dimensions";
9771
+ readonly animation: "Animation";
9772
+ readonly animationLoops: "{frames} frames, loops forever";
9773
+ readonly animationPlays: "{frames} frames, plays {plays} \u00D7";
9682
9774
  readonly format: "Format";
9683
9775
  readonly size: "Size";
9684
9776
  readonly hash: "Hash";
@@ -11738,7 +11830,7 @@ declare const en: {
11738
11830
  readonly imageWebpQualityTitle: "WebP quality";
11739
11831
  readonly imageWebpQualityDescription: "Quality passed to the WebP encoder, from 1 to 100.";
11740
11832
  readonly imageMaxDimensionTitle: "Maximum image size";
11741
- readonly imageMaxDimensionDescription: "Images longer than this on their longest edge are scaled down. 0 keeps every image at the size it was saved.";
11833
+ readonly imageMaxDimensionDescription: "Backgrounds and interface images longer than this on their longest edge are scaled down. Character sprites and other images drawn at their own pixel size keep their size. 0 keeps every image at the size it was saved.";
11742
11834
  readonly audioModeTitle: "Audio compression settings";
11743
11835
  readonly audioBitrateKbpsTitle: "Audio bitrate";
11744
11836
  readonly audioBitrateKbpsDescription: "AAC bitrate, in kbit/s.";
@@ -11966,6 +12058,8 @@ declare const en: {
11966
12058
  readonly title: "Setup complete";
11967
12059
  readonly expectation: "Every setting asked for here is in Settings. F1 opens help for whatever is under the cursor.";
11968
12060
  readonly docs: "Open the documentation";
12061
+ readonly bilibili: "Follow us on Bilibili";
12062
+ readonly youtube: "Follow us on YouTube";
11969
12063
  };
11970
12064
  readonly skipConfirm: {
11971
12065
  readonly title: "Skip setup?";
@@ -13268,6 +13362,8 @@ declare const en: {
13268
13362
  readonly compressionImages: "Images compressed";
13269
13363
  readonly compressionMedia: "Audio and video compressed";
13270
13364
  readonly compressionMetadata: "Metadata removed";
13365
+ readonly compressionKeptAtSize: "Kept at full size";
13366
+ readonly compressionKeptAtSizeHint: "Drawn at their own pixels";
13271
13367
  readonly includedTitle: "Assets carried";
13272
13368
  readonly includedEmpty: "This run carried no assets.";
13273
13369
  readonly excludedTitle: "Assets left out";
@@ -13515,6 +13611,12 @@ declare const en: {
13515
13611
  readonly message: "{asset} is {size}, over the {limit} a build should carry";
13516
13612
  readonly help: string;
13517
13613
  };
13614
+ readonly assetsSpriteAnimationFinite: {
13615
+ readonly title: "Sprite animation that stops";
13616
+ readonly description: "A character sprite that is an animated PNG set to play a fixed number of times";
13617
+ readonly message: "{asset} is an animated PNG that plays {plays} \u00D7 and then holds its last frame";
13618
+ readonly help: string;
13619
+ };
13518
13620
  readonly assetsGroupIncomplete: {
13519
13621
  readonly title: "Unfinished asset set";
13520
13622
  readonly description: "A set that does not resolve to exactly one file for every variant it declares";
@@ -13628,6 +13730,13 @@ declare const en: {
13628
13730
  readonly message: "This row comes after an ending and is never played. Move it before the ending, or delete it";
13629
13731
  readonly help: string;
13630
13732
  };
13733
+ readonly storyPageMissing: {
13734
+ readonly title: "Open page with no page";
13735
+ readonly description: "A /page row that names no page, or one the project no longer has";
13736
+ readonly message: "This row names no page, so nothing opens and the story goes straight on";
13737
+ readonly deleted: "The page this row names is no longer in the project, so nothing opens and the story goes straight on";
13738
+ readonly help: string;
13739
+ };
13631
13740
  readonly storyQuitPageMissing: {
13632
13741
  readonly title: "Quit with no page";
13633
13742
  readonly description: "A /quit row that names no page, or one the project no longer has";
@@ -13716,6 +13825,12 @@ declare const en: {
13716
13825
  readonly message: "The tag \"{tag}\" is on both \"{first}\" and \"{second}\"";
13717
13826
  readonly help: string;
13718
13827
  };
13828
+ readonly storyParallelSameTarget: {
13829
+ readonly title: "One object in two parallel branches";
13830
+ readonly description: "A /parallel group whose branches act on the same stage object";
13831
+ readonly message: "Another branch of this /parallel group also acts on \"{object}\"";
13832
+ readonly help: string;
13833
+ };
13719
13834
  readonly blueprintReferenceMissing: {
13720
13835
  readonly title: "Missing target";
13721
13836
  readonly description: "A node naming something the project no longer has";
@@ -14286,7 +14401,6 @@ declare const en: {
14286
14401
  readonly groupAdded: "Group added";
14287
14402
  readonly groupRemoved: "Group removed";
14288
14403
  readonly fields: {
14289
- readonly nicknames: "Nicknames";
14290
14404
  readonly group: "Group";
14291
14405
  readonly canvas: "Canvas";
14292
14406
  readonly avatarAxes: "Avatar axes";
@@ -17445,6 +17559,10 @@ export type SearchJumpTarget = {
17445
17559
  storyId: string;
17446
17560
  storyName: string;
17447
17561
  };
17562
+ type PngAnimation = {
17563
+ frames: number;
17564
+ plays: number;
17565
+ };
17448
17566
  type ModelBundleFormat = "live2d-cubism4" | "live2d-cubism2" | "spine-binary" | "spine-json" | "unknown";
17449
17567
  export declare enum AssetType {
17450
17568
  Image = "image",
@@ -17478,6 +17596,8 @@ type ImageAssetMetadata = {
17478
17596
  height: number;
17479
17597
  format: string;
17480
17598
  size: number;
17599
+ /** What an APNG declares about its frames and loops; null for a still image. */
17600
+ animation?: PngAnimation | null;
17481
17601
  };
17482
17602
  type AudioAssetMetadata = {
17483
17603
  duration: number;
@@ -17850,6 +17970,7 @@ interface CharacterNamed {
17850
17970
  name: string;
17851
17971
  }
17852
17972
  interface CharacterPose extends CharacterNamed {
17973
+ sequence?: CharacterFrameSequence;
17853
17974
  /** Groups the list in the editor. Never consulted when resolving. */
17854
17975
  folder?: string;
17855
17976
  assetId: string | null;
@@ -18054,6 +18175,7 @@ declare class CharacterAppearance {
18054
18175
  createPose(name: string, folder?: string): CharacterPose | null;
18055
18176
  removePose(poseId: string): boolean;
18056
18177
  setPoseAsset(poseId: string, assetId: string | null): void;
18178
+ setPoseSequence(poseId: string, input: CharacterFrameSequence): void;
18057
18179
  setPoseFolder(poseId: string, folder: string | undefined): void;
18058
18180
  setPosePortrait(poseId: string, portrait: PortraitCrop | undefined): void;
18059
18181
  /**
@@ -20227,6 +20349,17 @@ interface TagsFieldDefinition<TData = any> extends BaseFieldDefinition<TData> {
20227
20349
  * that are not drawn, and removing a chip removes exactly the tag it stands for.
20228
20350
  */
20229
20351
  formatTag?: (data: TData, tag: string) => string | null;
20352
+ /**
20353
+ * Why a stored tag will not do what it is there for, or null when it will. A tag with an issue
20354
+ * is drawn in the warning tone and the sentence is printed under the field. It is still stored:
20355
+ * the field warns rather than refusing, because the fix may be on another record.
20356
+ */
20357
+ tagIssue?: (data: TData, tag: string) => string | null;
20358
+ /**
20359
+ * A tag the field drops instead of adding, as it drops a repeat. Absent: only repeats are
20360
+ * dropped.
20361
+ */
20362
+ rejectTag?: (data: TData, tag: string) => boolean;
20230
20363
  }
20231
20364
  interface InfoFieldDefinition<TData = any> extends BaseFieldDefinition<TData> {
20232
20365
  type: "info";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "narraleaf-studio",
3
- "version": "1.6.3",
3
+ "version": "1.8.0",
4
4
  "description": "TypeScript declarations for the NarraLeaf Studio plugin API (narraleaf-studio/plugin and narraleaf-studio/runtime).",
5
5
  "license": "MPL-2.0",
6
6
  "type": "module",