incanto 0.52.0 → 0.53.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 (58) hide show
  1. package/dist/2d.d.ts +51 -3
  2. package/dist/2d.js +3 -3
  3. package/dist/3d.d.ts +9 -3
  4. package/dist/3d.js +4 -4
  5. package/dist/{behavior-uPEuZrUB.d.ts → behavior-Do0Da56m.d.ts} +98 -0
  6. package/dist/{create-game-B_e9hJf7.js → create-game-9D87XaiX.js} +26 -11
  7. package/dist/{create-game-CGnoypjL.js → create-game-CDJ1lVqK.js} +21 -13
  8. package/dist/debug.d.ts +1 -1
  9. package/dist/{duplicate-B-OtSRFL.js → duplicate-MNLMAcbz.js} +1 -1
  10. package/dist/editor.js +14 -0
  11. package/dist/{environment-presets-DSZwsKPs.js → environment-presets-SkGanr2s.js} +2 -2
  12. package/dist/{gameplay-B6jqvYeM.js → gameplay-CRYw_Q-T.js} +2 -2
  13. package/dist/gameplay.d.ts +1 -1
  14. package/dist/gameplay.js +1 -1
  15. package/dist/index.d.ts +177 -5
  16. package/dist/index.js +8 -8
  17. package/dist/{loader-B-Gft32x.js → loader-BTkHYrQn.js} +54 -18
  18. package/dist/{loader-B9iTqs27.d.ts → loader-Cu_7kJDy.d.ts} +1 -1
  19. package/dist/{log-report-lxrQY9cH.js → log-report-CPFm4OXf.js} +0 -0
  20. package/dist/net.d.ts +2 -2
  21. package/dist/net.js +1 -1
  22. package/dist/{pathfinding-CAR9DjQQ.d.ts → pathfinding-HNGFqGUZ.d.ts} +24 -1
  23. package/dist/{physics-2d-Dns-oZlE.js → physics-2d-BhZZ-HAp.js} +2 -2
  24. package/dist/{physics-3d-BhI0ehpe.js → physics-3d-DmyO2oaN.js} +3 -3
  25. package/dist/react.d.ts +1 -1
  26. package/dist/react.js +1 -1
  27. package/dist/{register-DVwlnZAZ.js → register-BTomIiYG.js} +304 -24
  28. package/dist/{register-Trx7WHnD.js → register-DROK2l7J.js} +2 -2
  29. package/dist/{replay-BU1CCM15.d.ts → replay-9Fy6C10F.d.ts} +1 -1
  30. package/dist/{replay-BicPOMX0.js → replay-DYNUL4BU.js} +2 -2
  31. package/dist/{split-screen-CZ9ccBBQ.js → split-screen-CaF9hO7g.js} +2 -2
  32. package/dist/{split-screen-paxkQs_q.d.ts → split-screen-DNmcX1Pz.d.ts} +1 -1
  33. package/dist/{src-5gbZO47I.js → src-C9xyZW7M.js} +1 -1
  34. package/dist/{teardown-ks3d5W9n.js → teardown-Bw2aeyGI.js} +30 -1
  35. package/dist/{test-DAojuFdb.js → test-CJRsciFk.js} +11 -11
  36. package/dist/test.d.ts +4 -4
  37. package/dist/test.js +2 -2
  38. package/dist/{touch-BoNg_MnF.js → touch-BnMyy9tr.js} +4 -4
  39. package/dist/vite.js +2 -2
  40. package/editor/assets/{agent8-CCvckvbw.js → agent8-PlFHzJsh.js} +1 -1
  41. package/editor/assets/{debug-CLNCOnbc.js → debug-CebV7CDW.js} +1 -1
  42. package/editor/assets/{index-Cb5Brupb.js → index-CdbsY31G.js} +91 -91
  43. package/editor/index.html +1 -1
  44. package/package.json +1 -1
  45. package/schemas/scene.schema.json +213 -0
  46. package/skills/incanto-audio.md +97 -10
  47. package/skills/incanto-building-2d-games.md +20 -3
  48. package/skills/incanto-hud.md +7 -0
  49. package/skills/incanto-node-reference.md +34 -0
  50. package/skills/incanto-physics-and-input.md +38 -0
  51. package/skills/incanto-verifying-your-game.md +19 -1
  52. package/skills/incanto-web-integration.md +1 -0
  53. package/templates-app/beacon-isle-3d/index.html +3 -3
  54. package/templates-app/beacon-isle-3d/package.json +1 -1
  55. package/templates-app/tps-3d/index.html +3 -3
  56. package/templates-app/tps-3d/package.json +1 -1
  57. package/templates-app/village-quest-3d/index.html +3 -3
  58. package/templates-app/village-quest-3d/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { $ as T_PREFIX, A as SettingsValues, At as LogEntry, B as captureBehaviors, C as EngineStats, Ct as MusicTrack, Dt as Node, E as DeviceHints, Et as BusName, F as BehaviorState, G as ORDER_GROUP_BASE, H as savesWithoutUid, I as RestoreReport, J as effectiveOrder, K as OrderGroup, L as SaveSlot, M as readDeviceHints, Mt as LogManager, N as suggestQuality, Nt as Signal, O as QualityTier, Ot as NodeLifecycle, P as Scene, Pt as SignalListener, Q as Localization, R as SaveSlots, S as Scheduler, St as MusicManager, T as RendererStats, Tt as AudioBuses, U as SaveStore, V as restoreBehaviors, W as createSaveStore, X as BASE_LOCALE, Y as resolveOrderGroups, Z as LocaleTables, _ as mergeStaticSignals, _t as SfxParams, a as clearBehaviors, at as isAudioContextAvailable, b as Engine, bt as synthSfx, c as registeredBehaviors, ct as Listener, d as PropSchema, dt as SpatialParams, et as suggestLocale, f as clearRegistry, ft as Vec3, g as getNodeType, gt as SFX_PRESET_NAMES, h as getNodeSignals, ht as SFX_PRESETS, i as behaviorSignals, it as SfxPlayOptions, j as qualityEnvironment, jt as LogLevel, k as Settings, kt as SceneTree, l as NodeCtor, lt as ROLLOFF_MODELS, m as getNodeSchema, mt as spatialPan, n as BehaviorCtor, nt as InputMap, o as getBehavior, ot as Voice, p as createNode, pt as spatialGain, q as OrderGroupTable, r as behaviorSchema, rt as SfxEngine, s as registerBehavior, st as VoicePreset, t as Behavior, tt as translationKey, u as PropDef, ut as RolloffModel, v as registerNode, vt as SfxWave, w as GameStats, wt as PlayMusicOptions, x as EngineOptions, xt as MusicBackend, y as registeredTypes, yt as SynthOptions, z as behaviorsWithoutSave } from "./behavior-uPEuZrUB.js";
1
+ import { $ as T_PREFIX, A as SettingsValues, At as LogEntry, B as captureBehaviors, C as EngineStats, Ct as MusicTrack, Dt as Node, E as DeviceHints, Et as BusName, F as BehaviorState, G as ORDER_GROUP_BASE, H as savesWithoutUid, I as RestoreReport, J as effectiveOrder, K as OrderGroup, L as SaveSlot, M as readDeviceHints, Mt as LogManager, N as suggestQuality, Nt as Signal, O as QualityTier, Ot as NodeLifecycle, P as Scene, Pt as SignalListener, Q as Localization, R as SaveSlots, S as Scheduler, St as MusicManager, T as RendererStats, Tt as AudioBuses, U as SaveStore, V as restoreBehaviors, W as createSaveStore, X as BASE_LOCALE, Y as resolveOrderGroups, Z as LocaleTables, _ as mergeStaticSignals, _t as SfxParams, a as clearBehaviors, at as isAudioContextAvailable, b as Engine, bt as synthSfx, c as registeredBehaviors, ct as Listener, d as PropSchema, dt as SpatialParams, et as suggestLocale, f as clearRegistry, ft as Vec3, g as getNodeType, gt as SFX_PRESET_NAMES, h as getNodeSignals, ht as SFX_PRESETS, i as behaviorSignals, it as SfxPlayOptions, j as qualityEnvironment, jt as LogLevel, k as Settings, kt as SceneTree, l as NodeCtor, lt as ROLLOFF_MODELS, m as getNodeSchema, mt as spatialPan, n as BehaviorCtor, nt as InputMap, o as getBehavior, ot as Voice, p as createNode, pt as spatialGain, q as OrderGroupTable, r as behaviorSchema, rt as SfxEngine, s as registerBehavior, st as VoicePreset, t as Behavior, tt as translationKey, u as PropDef, ut as RolloffModel, v as registerNode, vt as SfxWave, w as GameStats, wt as PlayMusicOptions, x as EngineOptions, xt as MusicBackend, y as registeredTypes, yt as SynthOptions, z as behaviorsWithoutSave } from "./behavior-Do0Da56m.js";
2
2
  import { a as Rng, c as JsonValue, d as jsonKind, i as SceneJson, l as jsonClone, n as NodeJson, o as JsonKind, r as SCENE_FORMAT, s as JsonObject, t as ConnectionJson, u as jsonEquals } from "./schema-CFeioQRE.js";
3
- import { n as loadScene, t as LoadSceneOptions } from "./loader-B9iTqs27.js";
3
+ import { n as loadScene, t as LoadSceneOptions } from "./loader-Cu_7kJDy.js";
4
4
  import { i as resolveFrames, n as AnimationEntry, r as resolveAnimation, t as AnimationDef } from "./sprite-animation-CMr6f1K2.js";
5
5
  import { n as ParticleSimConfig, r as ParticleView, t as ParticleSim } from "./particle-sim-BzJ1yxoE.js";
6
- import { a as AudioElementLike, i as gridFromRows, n as PathGrid, o as AudioPlayer, r as findPath, t as FindPathOptions } from "./pathfinding-CAR9DjQQ.js";
7
- import { a as startRecording, c as IncantoErrorDetails, i as replay, l as auditScene, n as ReplayEvent, o as IncantoError, r as ReplayJson, s as IncantoErrorCode, t as Recorder } from "./replay-BU1CCM15.js";
6
+ import { a as AudioElementLike, i as gridFromRows, n as PathGrid, o as AudioPlayer, r as findPath, t as FindPathOptions } from "./pathfinding-HNGFqGUZ.js";
7
+ import { a as startRecording, c as IncantoErrorDetails, i as replay, l as auditScene, n as ReplayEvent, o as IncantoError, r as ReplayJson, s as IncantoErrorCode, t as Recorder } from "./replay-9Fy6C10F.js";
8
8
 
9
9
  //#region src/core/audio/crossfade.d.ts
10
10
  /**
@@ -38,6 +38,7 @@ declare class WebAudioMusicBackend implements MusicBackend {
38
38
  private ensure;
39
39
  createTrack(src: string): MusicTrack;
40
40
  unlock(): void;
41
+ dispose(): void;
41
42
  }
42
43
  //#endregion
43
44
  //#region src/core/debug-draw.d.ts
@@ -697,6 +698,177 @@ declare class UiSelect extends HudWidgetBase {
697
698
  private fillOptions;
698
699
  protected override _sync(): void;
699
700
  }
701
+ /**
702
+ * The language picker, done — because every game needs the same one.
703
+ *
704
+ * A plain `UiSelect` bound to the locale would take a behavior, a signal
705
+ * connection, and the knowledge that `Settings` persists it: three things an
706
+ * agent has to get right to ship a feature the engine already has. This is one
707
+ * node.
708
+ *
709
+ * ```json
710
+ * { "name": "Language", "type": "UiLanguageSelect",
711
+ * "props": { "label": "@t:settings.language" } }
712
+ * ```
713
+ *
714
+ * Options are the locales the SCENE declares, so a game shipping only English
715
+ * shows only English and the widget quietly costs nothing. Each is labeled with
716
+ * its own endonym, because a player who cannot read the language currently on
717
+ * screen still has to be able to find theirs.
718
+ */
719
+ declare class UiLanguageSelect extends UiSelect {
720
+ static override readonly typeName: string;
721
+ static override readonly props: PropSchema;
722
+ override label: string;
723
+ /** Last locale we PUSHED into `value`, to tell an engine change from a player one. */
724
+ private lastLocale;
725
+ protected override _sync(): void;
726
+ protected override _optionLabel(value: string): string;
727
+ }
728
+ /**
729
+ * A select bound to one persisted setting — the shape all three graphics
730
+ * controls share.
731
+ *
732
+ * The engine owns quality tiers, the frame cap and the resolution scale, and
733
+ * every one of them was reachable only from TypeScript. A vibe-coded game whose
734
+ * whole world is JSON could not put a graphics menu on screen without a
735
+ * behavior, a signal connection, and the knowledge that `Settings` persists —
736
+ * which is how "supports low-end devices" quietly becomes "does not".
737
+ *
738
+ * Subclasses say which setting, what the options are, and what they read as.
739
+ */
740
+ declare abstract class UiSettingSelect extends UiSelect {
741
+ /** Last value we PUSHED into the select, to tell an engine change from a player one. */
742
+ private lastPushed;
743
+ /** The settings key this control owns. */
744
+ protected abstract _key(): string;
745
+ /** The stored value, as the string the select carries. */
746
+ protected abstract _read(engine: NonNullable<ReturnType<UiSettingSelect["_engine"]>>): string;
747
+ /** Apply a player's pick. */
748
+ protected abstract _write(engine: NonNullable<ReturnType<UiSettingSelect["_engine"]>>, value: string): void;
749
+ protected _engine(): Engine | null;
750
+ /**
751
+ * The translated option label, or the English one.
752
+ *
753
+ * `locale.t` returns the KEY when nothing declares it, and a menu reading
754
+ * `settings.quality.high` is worse than one reading `High`. English is the
755
+ * base language and the fallback, always.
756
+ */
757
+ protected _tOr(key: string, fallback: string): string;
758
+ protected override _sync(): void;
759
+ }
760
+ /**
761
+ * The graphics quality picker.
762
+ *
763
+ * ```json
764
+ * { "name": "Quality", "type": "UiQualitySelect" }
765
+ * ```
766
+ *
767
+ * Writes through `chooseQuality`, NOT `set('quality')`: a tier a person picked
768
+ * has to survive the next launch's device detection, and the two are
769
+ * indistinguishable afterwards unless the choice is recorded as one.
770
+ *
771
+ * Shadows, bloom, post and clouds follow immediately. Antialiasing follows on
772
+ * the next launch — it is a WebGL context attribute and cannot change while a
773
+ * context exists.
774
+ */
775
+ declare class UiQualitySelect extends UiSettingSelect {
776
+ static override readonly typeName: string;
777
+ static override readonly props: PropSchema;
778
+ override label: string;
779
+ override options: string;
780
+ protected override _key(): string;
781
+ protected override _read(engine: Engine): string;
782
+ protected override _write(engine: Engine, value: string): void;
783
+ protected override _optionLabel(value: string): string;
784
+ }
785
+ /**
786
+ * The frame-rate cap: fewer frames, a cooler phone, a longer battery.
787
+ *
788
+ * ```json
789
+ * { "name": "FrameCap", "type": "UiFrameCapSelect" }
790
+ * ```
791
+ *
792
+ * `0` is uncapped and is the default — a cap nobody asked for is a downgrade.
793
+ * The cap gates the whole frame, so it saves the CPU as well as the GPU.
794
+ */
795
+ declare class UiFrameCapSelect extends UiSettingSelect {
796
+ static override readonly typeName: string;
797
+ static override readonly props: PropSchema;
798
+ override label: string;
799
+ override options: string;
800
+ protected override _key(): string;
801
+ protected override _read(engine: Engine): string;
802
+ protected override _write(engine: Engine, value: string): void;
803
+ protected override _optionLabel(value: string): string;
804
+ }
805
+ /**
806
+ * The resolution scale — the cheapest frames on a weak GPU.
807
+ *
808
+ * ```json
809
+ * { "name": "Resolution", "type": "UiRenderScaleSelect" }
810
+ * ```
811
+ *
812
+ * At 75% the fragment shaders run over 56% of the pixels for a slightly softer
813
+ * image and nothing else, where dropping a quality tier costs the shadows
814
+ * outright. Reads as a percentage, because `0.75` means nothing to a player.
815
+ */
816
+ declare class UiRenderScaleSelect extends UiSettingSelect {
817
+ static override readonly typeName: string;
818
+ static override readonly props: PropSchema;
819
+ override label: string;
820
+ override options: string;
821
+ protected override _key(): string;
822
+ protected override _read(engine: Engine): string;
823
+ protected override _write(engine: Engine, value: string): void;
824
+ protected override _optionLabel(value: string): string;
825
+ }
826
+ /** The three buses a player is ever offered a slider for. */
827
+ declare const VOLUME_BUSES: readonly ["master", "sfx", "music"];
828
+ type VolumeBus = (typeof VOLUME_BUSES)[number];
829
+ /**
830
+ * The volume slider — the settings row every game has.
831
+ *
832
+ * ```json
833
+ * { "name": "Music", "type": "UiVolumeSlider", "props": { "bus": "music" } }
834
+ * ```
835
+ *
836
+ * The graphics controls above became nodes because a game whose whole world is
837
+ * JSON could not put a menu on screen without a behavior, a signal connection
838
+ * and the knowledge that `Settings` persists. All of that was just as true of
839
+ * volume, which is the control a player looks for FIRST and the only one some
840
+ * games need at all — so an audio menu meant hand-rolled DOM, and hand-rolled
841
+ * DOM is out of scene JSON, out of the editor, and out of every headless check.
842
+ *
843
+ * It writes the bus; the bus persists itself (`bindAudio`, which
844
+ * `createGame2D/3D` wire), so there is nothing to save.
845
+ */
846
+ declare class UiVolumeSlider extends UiSlider {
847
+ static override readonly typeName: string;
848
+ static override readonly props: PropSchema;
849
+ bus: VolumeBus;
850
+ /** Last value we PUSHED in, to tell an engine-side change from a player drag. */
851
+ private lastPushed;
852
+ protected override _build(): HTMLElement;
853
+ protected override _sync(): void;
854
+ }
855
+ /**
856
+ * The mute switch.
857
+ *
858
+ * ```json
859
+ * { "name": "Mute", "type": "UiMuteToggle" }
860
+ * ```
861
+ *
862
+ * Checked means silent. Like the slider it writes `engine.audio`, which
863
+ * persists itself.
864
+ */
865
+ declare class UiMuteToggle extends UiToggle {
866
+ static override readonly typeName: string;
867
+ static override readonly props: PropSchema;
868
+ private lastPushed;
869
+ protected override _build(): HTMLElement;
870
+ protected override _sync(): void;
871
+ }
700
872
  //#endregion
701
873
  //#region src/core/noise.d.ts
702
874
  /**
@@ -917,4 +1089,4 @@ declare function computeViewport(canvasW: number, canvasH: number, viewport: {
917
1089
  /** Engine version. Kept in sync with package.json by the release pipeline. */
918
1090
  declare const VERSION: string;
919
1091
  //#endregion
920
- export { type AnimationDef, type AnimationEntry, type AssetFailure, AudioBuses, type AudioElementLike, AudioPlayer, BASE_LOCALE, Behavior, type BehaviorCtor, type BehaviorState, type BusName, CONST_REF_KEY, type ComputedViewport, type ConnectionJson, type CrossfadeGains, type DebugLineSource, type DeviceHints, type DriveScript, type DriveStep, Engine, type EngineOptions, type EngineStats, type FindPathOptions, type GameStats, type GroupedLog, type HudAnchor, HudLayer, IncantoError, type IncantoErrorCode, type IncantoErrorDetails, InputMap, type JsonKind, type JsonObject, type JsonValue, type Listener, type LiveInput, type LiveReport, type LoadSceneOptions, type LocaleTables, Localization, type LogEntry, type LogLevel, LogManager, type MusicBackend, MusicManager, type MusicTrack, Node, type NodeCtor, type NodeJson, type NodeLifecycle, ORDER_GROUP_BASE, type OrderGroup, type OrderGroupTable, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, type ParsedNodePath, type ParticlePresetValues, ParticleSim, type ParticleSimConfig, type ParticleView, type PathGrid, type PlayMusicOptions, type PreloadResult, type PropDef, type PropSchema, type QualityTier, ROLLOFF_MODELS, type Recorder, type RefNode, type RefProblem, type RefResult, type RendererStats, type ReplayEvent, type ReplayJson, type ResolvedRendering, type ResolvedViewport, type RestoreReport, Rng, type RolloffModel, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, type SaveSlot, SaveSlots, type SaveStore, Scene, type SceneJson, SceneTree, type Scheduler, Settings, type SettingsValues, SfxEngine, type SfxParams, type SfxPlayOptions, type SfxWave, Signal, type SignalListener, type SpatialParams, type SynthOptions, T_PREFIX, Timer, TouchControls, type TouchControlsOptions, UiBanner, UiBar, UiButton, UiDialogue, UiImage, UiPanel, UiSelect, UiSlider, UiText, UiToggle, VERSION, type Vec3, type ViewportFit, type Voice, type VoicePreset, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, describeRefProblem, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, logReport, logText, mergeStaticSignals, newUid, nodeRefWarnings, parseDrive, parseNodePath, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveAnimation, resolveConstants, resolveFrames, resolveOrderGroups, resolveRefInJson, resolveRendering, resolveViewport, restoreBehaviors, savesWithoutUid, serializeNode, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
1092
+ export { type AnimationDef, type AnimationEntry, type AssetFailure, AudioBuses, type AudioElementLike, AudioPlayer, BASE_LOCALE, Behavior, type BehaviorCtor, type BehaviorState, type BusName, CONST_REF_KEY, type ComputedViewport, type ConnectionJson, type CrossfadeGains, type DebugLineSource, type DeviceHints, type DriveScript, type DriveStep, Engine, type EngineOptions, type EngineStats, type FindPathOptions, type GameStats, type GroupedLog, type HudAnchor, HudLayer, IncantoError, type IncantoErrorCode, type IncantoErrorDetails, InputMap, type JsonKind, type JsonObject, type JsonValue, type Listener, type LiveInput, type LiveReport, type LoadSceneOptions, type LocaleTables, Localization, type LogEntry, type LogLevel, LogManager, type MusicBackend, MusicManager, type MusicTrack, Node, type NodeCtor, type NodeJson, type NodeLifecycle, ORDER_GROUP_BASE, type OrderGroup, type OrderGroupTable, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, type ParsedNodePath, type ParticlePresetValues, ParticleSim, type ParticleSimConfig, type ParticleView, type PathGrid, type PlayMusicOptions, type PreloadResult, type PropDef, type PropSchema, type QualityTier, ROLLOFF_MODELS, type Recorder, type RefNode, type RefProblem, type RefResult, type RendererStats, type ReplayEvent, type ReplayJson, type ResolvedRendering, type ResolvedViewport, type RestoreReport, Rng, type RolloffModel, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, type SaveSlot, SaveSlots, type SaveStore, Scene, type SceneJson, SceneTree, type Scheduler, Settings, type SettingsValues, SfxEngine, type SfxParams, type SfxPlayOptions, type SfxWave, Signal, type SignalListener, type SpatialParams, type SynthOptions, T_PREFIX, Timer, TouchControls, type TouchControlsOptions, UiBanner, UiBar, UiButton, UiDialogue, UiFrameCapSelect, UiImage, UiLanguageSelect, UiMuteToggle, UiPanel, UiQualitySelect, UiRenderScaleSelect, UiSelect, UiSlider, UiText, UiToggle, UiVolumeSlider, VERSION, type Vec3, type ViewportFit, type Voice, type VoicePreset, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, describeRefProblem, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, logReport, logText, mergeStaticSignals, newUid, nodeRefWarnings, parseDrive, parseNodePath, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveAnimation, resolveConstants, resolveFrames, resolveOrderGroups, resolveRefInJson, resolveRendering, resolveViewport, restoreBehaviors, savesWithoutUid, serializeNode, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
- import { A as registerBehavior, D as behaviorSignals, E as behaviorSchema, M as Signal, O as clearBehaviors, S as InputMap, T as Behavior, _ as savesWithoutUid, a as SCENE_FORMAT, b as effectiveOrder, c as SceneTree, d as resolveConstants, f as Node, g as restoreBehaviors, h as captureBehaviors, i as serializeNode, j as registeredBehaviors, k as getBehavior, l as CONST_REF_KEY, m as behaviorsWithoutSave, n as loadScene, o as computeViewport, p as SaveSlots, r as Scene, s as resolveViewport, u as isConstRef, v as createSaveStore, w as parseNodePath, x as resolveOrderGroups, y as ORDER_GROUP_BASE } from "./loader-B-Gft32x.js";
2
- import { A as ROLLOFF_MODELS, B as AudioBuses, C as BASE_LOCALE, D as translationKey, E as suggestLocale, F as synthSfx, I as MusicManager, L as WebAudioMusicBackend, M as spatialPan, N as SFX_PRESETS, O as SfxEngine, P as SFX_PRESET_NAMES, R as crossfadeGains, S as LogManager, T as T_PREFIX, a as UiSlider, b as readDeviceHints, c as UiButton, d as UiBanner, f as UiBar, g as Settings, h as Engine, i as UiSelect, j as spatialGain, k as isAudioContextAvailable, l as UiDialogue, m as AudioPlayer, n as UiImage, o as UiToggle, p as UiText, r as UiPanel, s as Timer, t as registerCoreNodes, u as HudLayer, v as qualityEnvironment, w as Localization, x as suggestQuality, z as fadeGain } from "./register-DVwlnZAZ.js";
1
+ import { A as registerBehavior, D as behaviorSignals, E as behaviorSchema, M as Signal, O as clearBehaviors, S as InputMap, T as Behavior, _ as savesWithoutUid, a as SCENE_FORMAT, b as effectiveOrder, c as SceneTree, d as resolveConstants, f as Node, g as restoreBehaviors, h as captureBehaviors, i as serializeNode, j as registeredBehaviors, k as getBehavior, l as CONST_REF_KEY, m as behaviorsWithoutSave, n as loadScene, o as computeViewport, p as SaveSlots, r as Scene, s as resolveViewport, u as isConstRef, v as createSaveStore, w as parseNodePath, x as resolveOrderGroups, y as ORDER_GROUP_BASE } from "./loader-BTkHYrQn.js";
2
+ import { A as Localization, B as SFX_PRESET_NAMES, D as suggestQuality, E as readDeviceHints, F as isAudioContextAvailable, G as fadeGain, H as MusicManager, I as ROLLOFF_MODELS, K as AudioBuses, L as spatialGain, M as suggestLocale, N as translationKey, O as LogManager, P as SfxEngine, R as spatialPan, S as Settings, U as WebAudioMusicBackend, V as synthSfx, W as crossfadeGains, _ as UiBanner, a as UiMuteToggle, b as AudioPlayer, c as UiRenderScaleSelect, d as UiToggle, f as UiVolumeSlider, g as HudLayer, h as UiDialogue, i as UiLanguageSelect, j as T_PREFIX, k as BASE_LOCALE, l as UiSelect, m as UiButton, n as UiFrameCapSelect, o as UiPanel, p as Timer, r as UiImage, s as UiQualitySelect, t as registerCoreNodes, u as UiSlider, v as UiBar, w as qualityEnvironment, x as Engine, y as UiText, z as SFX_PRESETS } from "./register-BTomIiYG.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
4
  import { t as Rng } from "./rng-DP-SR7eg.js";
5
5
  import { n as jsonEquals, r as jsonKind, t as jsonClone } from "./json-BLk7H2Qa.js";
6
6
  import { a as getNodeSignals, c as mergeStaticSignals, i as getNodeSchema, l as registerNode, n as clearRegistry, o as getNodeType, r as createNode, u as registeredTypes } from "./registry-C7u42TID.js";
7
- import { a as nodeRefWarnings, i as describeRefProblem, n as startRecording, o as resolveRefInJson, r as auditScene, t as replay } from "./replay-BicPOMX0.js";
8
- import { n as logText, r as parseDrive, t as logReport } from "./log-report-lxrQY9cH.js";
7
+ import { a as nodeRefWarnings, i as describeRefProblem, n as startRecording, o as resolveRefInJson, r as auditScene, t as replay } from "./replay-DYNUL4BU.js";
8
+ import { n as logText, r as parseDrive, t as logReport } from "./log-report-CPFm4OXf.js";
9
9
  import { t as createNoise2D } from "./noise-CGUMx44x.js";
10
10
  import { a as PARTICLE_PRESETS, i as ParticleSim, n as resolveFrames, o as PARTICLE_PRESET_NAMES, s as applyParticlePreset, t as resolveAnimation } from "./sprite-animation-D_p28jwU.js";
11
- import { a as findPath, i as preloadUrls, n as newUid, o as gridFromRows, r as assetUrls, t as VERSION } from "./src-5gbZO47I.js";
12
- import { i as resolveRendering, n as attachTouchControls, r as joystickVector, t as TouchControls } from "./touch-BoNg_MnF.js";
13
- import { t as duplicateNode } from "./duplicate-B-OtSRFL.js";
14
- export { AudioBuses, AudioPlayer, BASE_LOCALE, Behavior, CONST_REF_KEY, Engine, HudLayer, IncantoError, InputMap, Localization, LogManager, MusicManager, Node, ORDER_GROUP_BASE, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, ParticleSim, ROLLOFF_MODELS, Rng, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, SaveSlots, Scene, SceneTree, Settings, SfxEngine, Signal, T_PREFIX, Timer, TouchControls, UiBanner, UiBar, UiButton, UiDialogue, UiImage, UiPanel, UiSelect, UiSlider, UiText, UiToggle, VERSION, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, describeRefProblem, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, logReport, logText, mergeStaticSignals, newUid, nodeRefWarnings, parseDrive, parseNodePath, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveAnimation, resolveConstants, resolveFrames, resolveOrderGroups, resolveRefInJson, resolveRendering, resolveViewport, restoreBehaviors, savesWithoutUid, serializeNode, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
11
+ import { a as findPath, i as preloadUrls, n as newUid, o as gridFromRows, r as assetUrls, t as VERSION } from "./src-C9xyZW7M.js";
12
+ import { i as resolveRendering, n as attachTouchControls, r as joystickVector, t as TouchControls } from "./touch-BnMyy9tr.js";
13
+ import { t as duplicateNode } from "./duplicate-MNLMAcbz.js";
14
+ export { AudioBuses, AudioPlayer, BASE_LOCALE, Behavior, CONST_REF_KEY, Engine, HudLayer, IncantoError, InputMap, Localization, LogManager, MusicManager, Node, ORDER_GROUP_BASE, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, ParticleSim, ROLLOFF_MODELS, Rng, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, SaveSlots, Scene, SceneTree, Settings, SfxEngine, Signal, T_PREFIX, Timer, TouchControls, UiBanner, UiBar, UiButton, UiDialogue, UiFrameCapSelect, UiImage, UiLanguageSelect, UiMuteToggle, UiPanel, UiQualitySelect, UiRenderScaleSelect, UiSelect, UiSlider, UiText, UiToggle, UiVolumeSlider, VERSION, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, auditScene, behaviorSchema, behaviorSignals, behaviorsWithoutSave, captureBehaviors, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, createSaveStore, crossfadeGains, describeRefProblem, duplicateNode, effectiveOrder, fadeGain, findPath, getBehavior, getNodeSchema, getNodeSignals, getNodeType, gridFromRows, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, logReport, logText, mergeStaticSignals, newUid, nodeRefWarnings, parseDrive, parseNodePath, preloadUrls, qualityEnvironment, readDeviceHints, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, replay, resolveAnimation, resolveConstants, resolveFrames, resolveOrderGroups, resolveRefInJson, resolveRendering, resolveViewport, restoreBehaviors, savesWithoutUid, serializeNode, spatialGain, spatialPan, startRecording, suggestLocale, suggestQuality, synthSfx, translationKey };
@@ -221,12 +221,9 @@ var InputMap = class {
221
221
  };
222
222
  return;
223
223
  }
224
- const el = target;
225
- const scaleX = typeof el.width === "number" && el.width > 0 ? el.width / rect.width : 1;
226
- const scaleY = typeof el.height === "number" && el.height > 0 ? el.height / rect.height : 1;
227
224
  this.pointerPos = {
228
- x: (clientX - rect.left) * scaleX,
229
- y: (clientY - rect.top) * scaleY
225
+ x: clientX - rect.left,
226
+ y: clientY - rect.top
230
227
  };
231
228
  }
232
229
  pointerPos = null;
@@ -418,36 +415,69 @@ var InputMap = class {
418
415
  };
419
416
  return disconnect;
420
417
  }
418
+ /**
419
+ * Pointer input from a mouse, a FINGER or a pen — one code path.
420
+ *
421
+ * This used to bind `mousedown`/`mousemove`/`mouseup`, which on a phone only
422
+ * arrive as COMPATIBILITY events: delayed until the browser has decided the
423
+ * touch is not a scroll, never fired for drags or multi-touch, and suppressed
424
+ * outright once the surface claims its gestures with `touch-action: none`.
425
+ * So every genre the comment below lists — match-3, tower defense, card,
426
+ * point-and-click, RTS — was mouse-only on the device most of them are played
427
+ * on. Pointer events cover all three input kinds and fire immediately.
428
+ *
429
+ * Only the PRIMARY pointer drives it: a second finger (the one on the virtual
430
+ * stick) must not also swing the camera.
431
+ */
421
432
  attachPointer(target, opts) {
422
433
  let buttonsHeld = 0;
434
+ /** The pointer that pressed on THIS target; others are somebody else's. */
435
+ let activeId = null;
423
436
  const onDown = (e) => {
437
+ if (!e.isPrimary) return;
438
+ activeId = e.pointerId;
424
439
  buttonsHeld++;
425
440
  this.setPointerPosition(e.clientX, e.clientY, target);
426
441
  this.handleMouseButton(e.button, true);
427
442
  if (opts?.lockOnClick && document.pointerLockElement !== target) target.requestPointerLock?.();
428
443
  };
429
444
  const onUp = (e) => {
445
+ if (activeId !== null && e.pointerId !== activeId) return;
446
+ activeId = null;
430
447
  buttonsHeld = Math.max(0, buttonsHeld - 1);
431
448
  this.handleMouseButton(e.button, false);
432
449
  };
433
450
  const onMove = (e) => {
451
+ if (activeId !== null && e.pointerId !== activeId) return;
434
452
  this.setPointerPosition(e.clientX, e.clientY, target);
435
- if (document.pointerLockElement === target || buttonsHeld > 0) this.handlePointerMove(e.movementX, e.movementY);
453
+ if (document.pointerLockElement === target || buttonsHeld > 0) {
454
+ const dx = e.movementX || this.pointerDelta().x;
455
+ const dy = e.movementY || this.pointerDelta().y;
456
+ this.handlePointerMove(dx, dy);
457
+ }
458
+ };
459
+ const onCancel = (e) => {
460
+ if (activeId !== null && e.pointerId !== activeId) return;
461
+ activeId = null;
462
+ buttonsHeld = 0;
463
+ this.handleMouseButton(0, false);
436
464
  };
437
465
  const onWheel = (e) => {
438
466
  e.preventDefault();
439
467
  this.handleWheel(e.deltaY);
440
468
  };
441
469
  const onContext = (e) => e.preventDefault();
442
- target.addEventListener("mousedown", onDown);
443
- window.addEventListener("mouseup", onUp);
444
- window.addEventListener("mousemove", onMove);
470
+ target.addEventListener("pointerdown", onDown);
471
+ window.addEventListener("pointerup", onUp);
472
+ window.addEventListener("pointermove", onMove);
473
+ window.addEventListener("pointercancel", onCancel);
445
474
  target.addEventListener("wheel", onWheel, { passive: false });
446
475
  target.addEventListener("contextmenu", onContext);
447
476
  const detach = () => {
448
- target.removeEventListener("mousedown", onDown);
449
- window.removeEventListener("mouseup", onUp);
450
- window.removeEventListener("mousemove", onMove);
477
+ target.removeEventListener("pointerdown", onDown);
478
+ window.removeEventListener("pointerup", onUp);
479
+ window.removeEventListener("pointermove", onMove);
480
+ window.removeEventListener("pointercancel", onCancel);
451
481
  target.removeEventListener("wheel", onWheel);
452
482
  target.removeEventListener("contextmenu", onContext);
453
483
  };
@@ -604,6 +634,12 @@ var InputMap = class {
604
634
  * never looked at `input` at all. A typo there ("keys": "KeyW" instead of
605
635
  * ["KeyW"]) passed the check and threw in the browser at boot.
606
636
  */
637
+ const DIRECTIONS = [
638
+ "up",
639
+ "down",
640
+ "left",
641
+ "right"
642
+ ];
607
643
  function parseInputDecls(decls) {
608
644
  const out = /* @__PURE__ */ new Map();
609
645
  for (const [name, raw] of Object.entries(decls)) {
@@ -619,12 +655,12 @@ function parseInputDecls(decls) {
619
655
  });
620
656
  } else if (decl.type === "vector2") {
621
657
  const dirs = decl.keys;
622
- for (const dir of [
623
- "up",
624
- "down",
625
- "left",
626
- "right"
627
- ]) if (!Array.isArray(dirs?.[dir])) throw new IncantoError("BAD_FORMAT", `Input action '${name}': vector2 "keys" needs arrays for up/down/left/right.`);
658
+ const missing = DIRECTIONS.filter((dir) => !Array.isArray(dirs?.[dir]));
659
+ if (missing.length > 0) {
660
+ const atTopLevel = DIRECTIONS.filter((dir) => Array.isArray(decl[dir]));
661
+ const where = atTopLevel.length > 0 ? ` — ${atTopLevel.join(", ")} ${atTopLevel.length === 1 ? "is" : "are"} at the top level, not under "keys"` : "";
662
+ throw new IncantoError("BAD_FORMAT", `Input action '${name}': a vector2 needs ${missing.join(", ")} as arrays of KeyboardEvent.code strings under "keys"${where}. Like this: { "type": "vector2", "keys": { "up": ["KeyW"], "down": ["KeyS"], "left": ["KeyA"], "right": ["KeyD"] } }`);
663
+ }
628
664
  if (decl.touch !== void 0 && decl.touch !== "joystick") throw new IncantoError("BAD_FORMAT", `Input action '${name}': vector2 "touch" must be 'joystick', got ${JSON.stringify(decl.touch)}.`);
629
665
  const d = dirs;
630
666
  out.set(name, {
@@ -1,4 +1,4 @@
1
- import { P as Scene, b as Engine } from "./behavior-uPEuZrUB.js";
1
+ import { P as Scene, b as Engine } from "./behavior-Do0Da56m.js";
2
2
  import { i as SceneJson } from "./schema-CFeioQRE.js";
3
3
 
4
4
  //#region src/core/scene/loader.d.ts
package/dist/net.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Dt as Node, d as PropSchema } from "./behavior-uPEuZrUB.js";
2
- import { a as NetworkManagerOptions, c as LocalGameServer, d as ServerClass, f as createLocalGameServer, g as Unsubscribe, h as NetworkTransport, i as NetworkManager, l as LocalGameServerOptions, m as LoopbackTransport, n as SplitScreenPlayer, o as applySyncPatch, p as LoopbackHub, r as createSplitScreen, s as CollectionOptions, t as SplitScreenOptions, u as LocalGameServerTransport } from "./split-screen-paxkQs_q.js";
1
+ import { Dt as Node, d as PropSchema } from "./behavior-Do0Da56m.js";
2
+ import { a as NetworkManagerOptions, c as LocalGameServer, d as ServerClass, f as createLocalGameServer, g as Unsubscribe, h as NetworkTransport, i as NetworkManager, l as LocalGameServerOptions, m as LoopbackTransport, n as SplitScreenPlayer, o as applySyncPatch, p as LoopbackHub, r as createSplitScreen, s as CollectionOptions, t as SplitScreenOptions, u as LocalGameServerTransport } from "./split-screen-DNmcX1Pz.js";
3
3
 
4
4
  //#region src/net/agent8.d.ts
5
5
  /**
package/dist/net.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { n as createAgent8Server } from "./agent8-CvsfVskX.js";
2
- import { a as applySyncPatch, c as createLocalGameServer, i as NetworkManager, l as LoopbackHub, n as registerNodesNet, o as LocalGameServer, r as NetworkSpawner, s as LocalGameServerTransport, t as createSplitScreen, u as LoopbackTransport } from "./split-screen-CZ9ccBBQ.js";
2
+ import { a as applySyncPatch, c as createLocalGameServer, i as NetworkManager, l as LoopbackHub, n as registerNodesNet, o as LocalGameServer, r as NetworkSpawner, s as LocalGameServerTransport, t as createSplitScreen, u as LoopbackTransport } from "./split-screen-CaF9hO7g.js";
3
3
  export { LocalGameServer, LocalGameServerTransport, LoopbackHub, LoopbackTransport, NetworkManager, NetworkSpawner, applySyncPatch, createAgent8Server, createLocalGameServer, createSplitScreen, registerNodesNet };
@@ -1,4 +1,4 @@
1
- import { Dt as Node, ct as Listener, d as PropSchema } from "./behavior-uPEuZrUB.js";
1
+ import { Dt as Node, ct as Listener, d as PropSchema } from "./behavior-Do0Da56m.js";
2
2
 
3
3
  //#region src/core/nodes/audio-player.d.ts
4
4
  /**
@@ -74,6 +74,11 @@ declare class AudioPlayer extends Node {
74
74
  static validateJson(node: Node): void;
75
75
  /** A play() was blocked by the browser's autoplay policy. */
76
76
  pendingGesture: boolean;
77
+ /**
78
+ * Why this player is silent, when the reason is the FILE rather than the
79
+ * autoplay gate. Read by `game.assetErrors()`.
80
+ */
81
+ loadError: string | null;
77
82
  private element;
78
83
  private _playing;
79
84
  private autoplayed;
@@ -86,6 +91,14 @@ declare class AudioPlayer extends Node {
86
91
  * unless `spatial` is on. Headless / 2D scenes never call this.
87
92
  */
88
93
  _setSpatialPose(pose: SpatialPose): void;
94
+ /**
95
+ * Write this sound into the engine's audio record.
96
+ *
97
+ * The CALL happens even where the backend does not (headless, the verify VM),
98
+ * which is exactly why the record is worth keeping: it answers "did the coin
99
+ * sound fire when the coin was collected" in places no sound can be heard.
100
+ */
101
+ private note;
89
102
  /** Final gain = engine buses × this volume (1 when not in a tree). */
90
103
  private gain;
91
104
  /** Distance gain for the src/element path (1 when not spatial / no pose). */
@@ -101,6 +114,16 @@ declare class AudioPlayer extends Node {
101
114
  * a suspended context is resumed by the same unlock listener as `src` players.
102
115
  */
103
116
  private playPreset;
117
+ /**
118
+ * A destroyed node goes SILENT.
119
+ *
120
+ * Nothing used to stop a sound on teardown, so a level's looping background
121
+ * clip kept playing over the level after it — the node was freed, so nobody
122
+ * had a handle to stop it with either. Being MOVED is deliberately not this:
123
+ * reparenting a node is not destroying it, and a sound that survives the move
124
+ * is what a scene graph should do.
125
+ */
126
+ override free(): void;
104
127
  stop(): void;
105
128
  /** Replay a gesture-blocked play (wired to the first user gesture). */
106
129
  retryPending(): void;
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { C as diagnose } from "./loader-B-Gft32x.js";
2
+ import { C as diagnose } from "./loader-BTkHYrQn.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
- import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-Trx7WHnD.js";
4
+ import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-DROK2l7J.js";
5
5
  import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
6
6
  //#region src/2d/physics/physics-2d.ts
7
7
  var physics_2d_exports = /* @__PURE__ */ __exportAll({
@@ -1,9 +1,9 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { C as diagnose } from "./loader-B-Gft32x.js";
2
+ import { C as diagnose } from "./loader-BTkHYrQn.js";
3
3
  import { t as IncantoError } from "./errors-BpWbnbb_.js";
4
- import { B as validateCollider3D, F as CharacterBody3D, I as PhysicsBody3D, L as RigidBody3D, P as Area3D, z as Node3D } from "./gameplay-B6jqvYeM.js";
4
+ import { B as validateCollider3D, F as CharacterBody3D, I as PhysicsBody3D, L as RigidBody3D, P as Area3D, z as Node3D } from "./gameplay-CRYw_Q-T.js";
5
5
  import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
6
- import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-DSZwsKPs.js";
6
+ import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-SkGanr2s.js";
7
7
  import { Euler, Matrix4, Quaternion, Vector3 } from "three";
8
8
  //#region src/3d/physics/collider-lines.ts
9
9
  /**
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as Scene, b as Engine, n as BehaviorCtor } from "./behavior-uPEuZrUB.js";
1
+ import { P as Scene, b as Engine, n as BehaviorCtor } from "./behavior-Do0Da56m.js";
2
2
  import { c as JsonValue } from "./schema-CFeioQRE.js";
3
3
  import { CSSProperties, ReactNode } from "react";
4
4
 
package/dist/react.js CHANGED
@@ -156,7 +156,7 @@ function IncantoCanvas(props) {
156
156
  pointer: latest.pointer,
157
157
  ...keyboard !== void 0 ? { keyboard } : {}
158
158
  };
159
- const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-CGnoypjL.js").then((n) => n.n)).createGame3D(o) : async (o) => (await import("./create-game-B_e9hJf7.js").then((n) => n.n)).createGame2D(o)))(opts);
159
+ const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-CDJ1lVqK.js").then((n) => n.n)).createGame3D(o) : async (o) => (await import("./create-game-9D87XaiX.js").then((n) => n.n)).createGame2D(o)))(opts);
160
160
  if (disposed) {
161
161
  next.dispose();
162
162
  return;