@caperjs/core 0.1.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.
- package/LICENSE +22 -0
- package/README.md +62 -0
- package/cli/add.mjs +197 -0
- package/cli/audio/cc.mjs +128 -0
- package/cli/audio/index.mjs +42 -0
- package/cli/audio/utils.mjs +56 -0
- package/cli/create-caper.mjs +8 -0
- package/cli/create.mjs +351 -0
- package/cli/install-peerdeps.mjs +57 -0
- package/cli/update.mjs +9 -0
- package/cli/utils.mjs +81 -0
- package/cli/vite.mjs +55 -0
- package/cli/voiceover/generateVoiceoverCSV.mjs +158 -0
- package/cli/voiceover/index.mjs +1 -0
- package/cli.mjs +157 -0
- package/client.d.ts +7 -0
- package/config/assetpack.mjs +212 -0
- package/config/tsconfig.base.json +28 -0
- package/config/vite.mjs +2464 -0
- package/extras/css/accessibility.css +9 -0
- package/extras/css/fullscreen.css +28 -0
- package/extras/css/loader.css +67 -0
- package/extras/llms.txt +1602 -0
- package/lib/CaptionsPlugin-Dc8fIrjy.js +277 -0
- package/lib/CaptionsPlugin-Dc8fIrjy.js.map +1 -0
- package/lib/DataAdapter-BY2114sp.js +84 -0
- package/lib/DataAdapter-BY2114sp.js.map +1 -0
- package/lib/DebugRenderer-BJMLILqI.js +1385 -0
- package/lib/DebugRenderer-BJMLILqI.js.map +1 -0
- package/lib/DevToolsPlugin-wQ5rOkn0.js +31 -0
- package/lib/DevToolsPlugin-wQ5rOkn0.js.map +1 -0
- package/lib/GSAPPlugin-DHhSZKv8.js +350 -0
- package/lib/GSAPPlugin-DHhSZKv8.js.map +1 -0
- package/lib/LayoutPlugin-B-DF9SYM.js +1271 -0
- package/lib/LayoutPlugin-B-DF9SYM.js.map +1 -0
- package/lib/SpinePlugin-Dz_3dljz.js +6077 -0
- package/lib/SpinePlugin-Dz_3dljz.js.map +1 -0
- package/lib/StatsPlugin-Cg82JMBD.js +70 -0
- package/lib/StatsPlugin-Cg82JMBD.js.map +1 -0
- package/lib/VoiceOverPlugin-BR3ImT8C.js +114 -0
- package/lib/VoiceOverPlugin-BR3ImT8C.js.map +1 -0
- package/lib/caper.mjs +1233 -0
- package/lib/caper.mjs.map +1 -0
- package/lib/core/Application.d.ts +268 -0
- package/lib/core/Application.d.ts.map +1 -0
- package/lib/core/config.d.ts +39 -0
- package/lib/core/config.d.ts.map +1 -0
- package/lib/core/create.d.ts +41 -0
- package/lib/core/create.d.ts.map +1 -0
- package/lib/core/globals.d.ts +51 -0
- package/lib/core/globals.d.ts.map +1 -0
- package/lib/core/index.d.ts +7 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/interfaces/IApplication.d.ts +566 -0
- package/lib/core/interfaces/IApplication.d.ts.map +1 -0
- package/lib/core/interfaces/IApplicationOptions.d.ts +65 -0
- package/lib/core/interfaces/IApplicationOptions.d.ts.map +1 -0
- package/lib/core/interfaces/ICoreFunctions.d.ts +49 -0
- package/lib/core/interfaces/ICoreFunctions.d.ts.map +1 -0
- package/lib/core/interfaces/ICoreSignals.d.ts +57 -0
- package/lib/core/interfaces/ICoreSignals.d.ts.map +1 -0
- package/lib/core/interfaces/IStorageCapability.d.ts +20 -0
- package/lib/core/interfaces/IStorageCapability.d.ts.map +1 -0
- package/lib/core/interfaces/IStorageCapability.test.d.ts +2 -0
- package/lib/core/interfaces/IStorageCapability.test.d.ts.map +1 -0
- package/lib/core/interfaces/index.d.ts +7 -0
- package/lib/core/interfaces/index.d.ts.map +1 -0
- package/lib/core/registries.d.ts +8 -0
- package/lib/core/registries.d.ts.map +1 -0
- package/lib/core/types.d.ts +12 -0
- package/lib/core/types.d.ts.map +1 -0
- package/lib/display/AnimatedSprite.d.ts +40 -0
- package/lib/display/AnimatedSprite.d.ts.map +1 -0
- package/lib/display/Camera.d.ts +102 -0
- package/lib/display/Camera.d.ts.map +1 -0
- package/lib/display/Container.d.ts +115 -0
- package/lib/display/Container.d.ts.map +1 -0
- package/lib/display/Entity.d.ts +46 -0
- package/lib/display/Entity.d.ts.map +1 -0
- package/lib/display/ParticleContainer.d.ts +58 -0
- package/lib/display/ParticleContainer.d.ts.map +1 -0
- package/lib/display/Scene.d.ts +250 -0
- package/lib/display/Scene.d.ts.map +1 -0
- package/lib/display/SceneTransition.d.ts +41 -0
- package/lib/display/SceneTransition.d.ts.map +1 -0
- package/lib/display/SpineAnimation.d.ts +76 -0
- package/lib/display/SpineAnimation.d.ts.map +1 -0
- package/lib/display/Svg.d.ts +5 -0
- package/lib/display/Svg.d.ts.map +1 -0
- package/lib/display/index.d.ts +10 -0
- package/lib/display/index.d.ts.map +1 -0
- package/lib/env.d.ts +6 -0
- package/lib/hello.d.ts +2 -0
- package/lib/hello.d.ts.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/mixins/animated.d.ts +53 -0
- package/lib/mixins/animated.d.ts.map +1 -0
- package/lib/mixins/factory/Factory.d.ts +8 -0
- package/lib/mixins/factory/Factory.d.ts.map +1 -0
- package/lib/mixins/factory/const.d.ts +67 -0
- package/lib/mixins/factory/const.d.ts.map +1 -0
- package/lib/mixins/factory/index.d.ts +8 -0
- package/lib/mixins/factory/index.d.ts.map +1 -0
- package/lib/mixins/factory/methods.d.ts +3 -0
- package/lib/mixins/factory/methods.d.ts.map +1 -0
- package/lib/mixins/factory/props.d.ts +160 -0
- package/lib/mixins/factory/props.d.ts.map +1 -0
- package/lib/mixins/factory/registry.d.ts +27 -0
- package/lib/mixins/factory/registry.d.ts.map +1 -0
- package/lib/mixins/factory/registry.test.d.ts +2 -0
- package/lib/mixins/factory/registry.test.d.ts.map +1 -0
- package/lib/mixins/factory/schema.d.ts +71 -0
- package/lib/mixins/factory/schema.d.ts.map +1 -0
- package/lib/mixins/factory/ui-registry.d.ts +20 -0
- package/lib/mixins/factory/ui-registry.d.ts.map +1 -0
- package/lib/mixins/factory/utils.d.ts +11 -0
- package/lib/mixins/factory/utils.d.ts.map +1 -0
- package/lib/mixins/focus.d.ts +15 -0
- package/lib/mixins/focus.d.ts.map +1 -0
- package/lib/mixins/index.d.ts +6 -0
- package/lib/mixins/index.d.ts.map +1 -0
- package/lib/mixins/interaction.d.ts +20 -0
- package/lib/mixins/interaction.d.ts.map +1 -0
- package/lib/mixins/signals.d.ts +15 -0
- package/lib/mixins/signals.d.ts.map +1 -0
- package/lib/plugins/AssetsPlugin.d.ts +79 -0
- package/lib/plugins/AssetsPlugin.d.ts.map +1 -0
- package/lib/plugins/DataAdapter.d.ts +95 -0
- package/lib/plugins/DataAdapter.d.ts.map +1 -0
- package/lib/plugins/DevToolsPlugin.d.ts +97 -0
- package/lib/plugins/DevToolsPlugin.d.ts.map +1 -0
- package/lib/plugins/FullScreenPlugin.d.ts +240 -0
- package/lib/plugins/FullScreenPlugin.d.ts.map +1 -0
- package/lib/plugins/GSAPPlugin.d.ts +634 -0
- package/lib/plugins/GSAPPlugin.d.ts.map +1 -0
- package/lib/plugins/KeyboardPlugin.d.ts +53 -0
- package/lib/plugins/KeyboardPlugin.d.ts.map +1 -0
- package/lib/plugins/LayoutPlugin.d.ts +100 -0
- package/lib/plugins/LayoutPlugin.d.ts.map +1 -0
- package/lib/plugins/LookupPlugin.d.ts +223 -0
- package/lib/plugins/LookupPlugin.d.ts.map +1 -0
- package/lib/plugins/Plugin.d.ts +132 -0
- package/lib/plugins/Plugin.d.ts.map +1 -0
- package/lib/plugins/Plugin.test.d.ts +2 -0
- package/lib/plugins/Plugin.test.d.ts.map +1 -0
- package/lib/plugins/PopupManagerPlugin.d.ts +108 -0
- package/lib/plugins/PopupManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/ResizerPlugin.d.ts +62 -0
- package/lib/plugins/ResizerPlugin.d.ts.map +1 -0
- package/lib/plugins/SceneManagerPlugin.d.ts +122 -0
- package/lib/plugins/SceneManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/StatsPlugin.d.ts +8 -0
- package/lib/plugins/StatsPlugin.d.ts.map +1 -0
- package/lib/plugins/TimerPlugin.d.ts +401 -0
- package/lib/plugins/TimerPlugin.d.ts.map +1 -0
- package/lib/plugins/WebEventsPlugin.d.ts +60 -0
- package/lib/plugins/WebEventsPlugin.d.ts.map +1 -0
- package/lib/plugins/actions/ActionsPlugin.d.ts +39 -0
- package/lib/plugins/actions/ActionsPlugin.d.ts.map +1 -0
- package/lib/plugins/actions/constants.d.ts +52 -0
- package/lib/plugins/actions/constants.d.ts.map +1 -0
- package/lib/plugins/actions/index.d.ts +5 -0
- package/lib/plugins/actions/index.d.ts.map +1 -0
- package/lib/plugins/actions/methods.d.ts +11 -0
- package/lib/plugins/actions/methods.d.ts.map +1 -0
- package/lib/plugins/actions/types.d.ts +25 -0
- package/lib/plugins/actions/types.d.ts.map +1 -0
- package/lib/plugins/audio/AudioChannel.d.ts +46 -0
- package/lib/plugins/audio/AudioChannel.d.ts.map +1 -0
- package/lib/plugins/audio/AudioChannel.test.d.ts +2 -0
- package/lib/plugins/audio/AudioChannel.test.d.ts.map +1 -0
- package/lib/plugins/audio/AudioInstance.d.ts +79 -0
- package/lib/plugins/audio/AudioInstance.d.ts.map +1 -0
- package/lib/plugins/audio/AudioManagerPlugin.d.ts +323 -0
- package/lib/plugins/audio/AudioManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/audio/VoiceOverPlugin.d.ts +69 -0
- package/lib/plugins/audio/VoiceOverPlugin.d.ts.map +1 -0
- package/lib/plugins/audio/index.d.ts +4 -0
- package/lib/plugins/audio/index.d.ts.map +1 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.d.ts +109 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.d.ts.map +1 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts +2 -0
- package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts.map +1 -0
- package/lib/plugins/breakpoints/evaluate.d.ts +53 -0
- package/lib/plugins/breakpoints/evaluate.d.ts.map +1 -0
- package/lib/plugins/breakpoints/evaluate.test.d.ts +2 -0
- package/lib/plugins/breakpoints/evaluate.test.d.ts.map +1 -0
- package/lib/plugins/breakpoints/index.d.ts +4 -0
- package/lib/plugins/breakpoints/index.d.ts.map +1 -0
- package/lib/plugins/breakpoints/methods.d.ts +23 -0
- package/lib/plugins/breakpoints/methods.d.ts.map +1 -0
- package/lib/plugins/breakpoints/types.d.ts +70 -0
- package/lib/plugins/breakpoints/types.d.ts.map +1 -0
- package/lib/plugins/captions/CaptionsPlugin.d.ts +150 -0
- package/lib/plugins/captions/CaptionsPlugin.d.ts.map +1 -0
- package/lib/plugins/captions/CaptionsRenderer.d.ts +37 -0
- package/lib/plugins/captions/CaptionsRenderer.d.ts.map +1 -0
- package/lib/plugins/captions/index.d.ts +3 -0
- package/lib/plugins/captions/index.d.ts.map +1 -0
- package/lib/plugins/defaults.d.ts +4 -0
- package/lib/plugins/defaults.d.ts.map +1 -0
- package/lib/plugins/focus/FocusManagerPlugin.d.ts +148 -0
- package/lib/plugins/focus/FocusManagerPlugin.d.ts.map +1 -0
- package/lib/plugins/focus/FocusOutliner.d.ts +32 -0
- package/lib/plugins/focus/FocusOutliner.d.ts.map +1 -0
- package/lib/plugins/focus/index.d.ts +3 -0
- package/lib/plugins/focus/index.d.ts.map +1 -0
- package/lib/plugins/i18nPlugin.d.ts +128 -0
- package/lib/plugins/i18nPlugin.d.ts.map +1 -0
- package/lib/plugins/index.d.ts +18 -0
- package/lib/plugins/index.d.ts.map +1 -0
- package/lib/plugins/input/AbstractControls.d.ts +8 -0
- package/lib/plugins/input/AbstractControls.d.ts.map +1 -0
- package/lib/plugins/input/Controls.d.ts +16 -0
- package/lib/plugins/input/Controls.d.ts.map +1 -0
- package/lib/plugins/input/InputPlugin.d.ts +52 -0
- package/lib/plugins/input/InputPlugin.d.ts.map +1 -0
- package/lib/plugins/input/constants.d.ts +8 -0
- package/lib/plugins/input/constants.d.ts.map +1 -0
- package/lib/plugins/input/index.d.ts +10 -0
- package/lib/plugins/input/index.d.ts.map +1 -0
- package/lib/plugins/input/interfaces.d.ts +30 -0
- package/lib/plugins/input/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/KeyboardContols.d.ts +28 -0
- package/lib/plugins/input/keyboard/KeyboardContols.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/index.d.ts +3 -0
- package/lib/plugins/input/keyboard/index.d.ts.map +1 -0
- package/lib/plugins/input/keyboard/interfaces.d.ts +18 -0
- package/lib/plugins/input/keyboard/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/methods.d.ts +4 -0
- package/lib/plugins/input/methods.d.ts.map +1 -0
- package/lib/plugins/input/touch/TouchControls.d.ts +35 -0
- package/lib/plugins/input/touch/TouchControls.d.ts.map +1 -0
- package/lib/plugins/input/touch/constants.d.ts +14 -0
- package/lib/plugins/input/touch/constants.d.ts.map +1 -0
- package/lib/plugins/input/touch/index.d.ts +4 -0
- package/lib/plugins/input/touch/index.d.ts.map +1 -0
- package/lib/plugins/input/touch/interfaces.d.ts +15 -0
- package/lib/plugins/input/touch/interfaces.d.ts.map +1 -0
- package/lib/plugins/input/types.d.ts +32 -0
- package/lib/plugins/input/types.d.ts.map +1 -0
- package/lib/plugins/input/utils.d.ts +23 -0
- package/lib/plugins/input/utils.d.ts.map +1 -0
- package/lib/plugins/spine/SpinePlugin.d.ts +6 -0
- package/lib/plugins/spine/SpinePlugin.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts +31 -0
- package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/Spine.d.ts +211 -0
- package/lib/plugins/spine/pixi-spine/Spine.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts +81 -0
- package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts +21 -0
- package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts +16 -0
- package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts +10 -0
- package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts +6 -0
- package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts +5 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts +22 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts +5 -0
- package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts +51 -0
- package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/index.d.ts +9 -0
- package/lib/plugins/spine/pixi-spine/index.d.ts.map +1 -0
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts +34 -0
- package/lib/plugins/spine/pixi-spine/require-shim.d.ts.map +1 -0
- package/lib/registries-CYCaYKZI.js +6885 -0
- package/lib/registries-CYCaYKZI.js.map +1 -0
- package/lib/signals/Signal.d.ts +16 -0
- package/lib/signals/Signal.d.ts.map +1 -0
- package/lib/signals/Signal.test.d.ts +2 -0
- package/lib/signals/Signal.test.d.ts.map +1 -0
- package/lib/signals/index.d.ts +3 -0
- package/lib/signals/index.d.ts.map +1 -0
- package/lib/store/Store.d.ts +56 -0
- package/lib/store/Store.d.ts.map +1 -0
- package/lib/store/Store.test.d.ts +2 -0
- package/lib/store/Store.test.d.ts.map +1 -0
- package/lib/store/index.d.ts +2 -0
- package/lib/store/index.d.ts.map +1 -0
- package/lib/types/framework.d.ts +46 -0
- package/lib/types/gsap.d.ts +23 -0
- package/lib/ui/Button.d.ts +162 -0
- package/lib/ui/Button.d.ts.map +1 -0
- package/lib/ui/FlexContainer.d.ts +109 -0
- package/lib/ui/FlexContainer.d.ts.map +1 -0
- package/lib/ui/Input.d.ts +384 -0
- package/lib/ui/Input.d.ts.map +1 -0
- package/lib/ui/Joystick.d.ts +61 -0
- package/lib/ui/Joystick.d.ts.map +1 -0
- package/lib/ui/Popup.d.ts +109 -0
- package/lib/ui/Popup.d.ts.map +1 -0
- package/lib/ui/Toast.d.ts +131 -0
- package/lib/ui/Toast.d.ts.map +1 -0
- package/lib/ui/Toaster.d.ts +188 -0
- package/lib/ui/Toaster.d.ts.map +1 -0
- package/lib/ui/UICanvas.d.ts +155 -0
- package/lib/ui/UICanvas.d.ts.map +1 -0
- package/lib/ui/index.d.ts +9 -0
- package/lib/ui/index.d.ts.map +1 -0
- package/lib/utils/array.d.ts +11 -0
- package/lib/utils/array.d.ts.map +1 -0
- package/lib/utils/bind.d.ts +21 -0
- package/lib/utils/bind.d.ts.map +1 -0
- package/lib/utils/canvas.d.ts +2 -0
- package/lib/utils/canvas.d.ts.map +1 -0
- package/lib/utils/color.d.ts +66 -0
- package/lib/utils/color.d.ts.map +1 -0
- package/lib/utils/console/Logger.d.ts +15 -0
- package/lib/utils/console/Logger.d.ts.map +1 -0
- package/lib/utils/console/index.d.ts +2 -0
- package/lib/utils/console/index.d.ts.map +1 -0
- package/lib/utils/debug.d.ts +34 -0
- package/lib/utils/debug.d.ts.map +1 -0
- package/lib/utils/define.d.ts +100 -0
- package/lib/utils/define.d.ts.map +1 -0
- package/lib/utils/env.d.ts +4 -0
- package/lib/utils/env.d.ts.map +1 -0
- package/lib/utils/events.d.ts +12 -0
- package/lib/utils/events.d.ts.map +1 -0
- package/lib/utils/framework.d.ts +12 -0
- package/lib/utils/framework.d.ts.map +1 -0
- package/lib/utils/index.d.ts +28 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/map.d.ts +31 -0
- package/lib/utils/map.d.ts.map +1 -0
- package/lib/utils/math.d.ts +15 -0
- package/lib/utils/math.d.ts.map +1 -0
- package/lib/utils/misc.d.ts +13 -0
- package/lib/utils/misc.d.ts.map +1 -0
- package/lib/utils/number.d.ts +2 -0
- package/lib/utils/number.d.ts.map +1 -0
- package/lib/utils/object.d.ts +21 -0
- package/lib/utils/object.d.ts.map +1 -0
- package/lib/utils/padding.d.ts +4 -0
- package/lib/utils/padding.d.ts.map +1 -0
- package/lib/utils/pixi.d.ts +42 -0
- package/lib/utils/pixi.d.ts.map +1 -0
- package/lib/utils/platform.d.ts +20 -0
- package/lib/utils/platform.d.ts.map +1 -0
- package/lib/utils/point.d.ts +66 -0
- package/lib/utils/point.d.ts.map +1 -0
- package/lib/utils/promise/Queue.d.ts +60 -0
- package/lib/utils/promise/Queue.d.ts.map +1 -0
- package/lib/utils/promise/functions.d.ts +14 -0
- package/lib/utils/promise/functions.d.ts.map +1 -0
- package/lib/utils/promise/index.d.ts +3 -0
- package/lib/utils/promise/index.d.ts.map +1 -0
- package/lib/utils/random.d.ts +42 -0
- package/lib/utils/random.d.ts.map +1 -0
- package/lib/utils/rect.d.ts +26 -0
- package/lib/utils/rect.d.ts.map +1 -0
- package/lib/utils/set.d.ts +15 -0
- package/lib/utils/set.d.ts.map +1 -0
- package/lib/utils/string.d.ts +3 -0
- package/lib/utils/string.d.ts.map +1 -0
- package/lib/utils/text.d.ts +3 -0
- package/lib/utils/text.d.ts.map +1 -0
- package/lib/utils/typefilters.d.ts +4 -0
- package/lib/utils/typefilters.d.ts.map +1 -0
- package/lib/utils/types.d.ts +209 -0
- package/lib/utils/types.d.ts.map +1 -0
- package/lib/utils/vite.d.ts +25 -0
- package/lib/utils/vite.d.ts.map +1 -0
- package/lib/utils/web.d.ts +3 -0
- package/lib/utils/web.d.ts.map +1 -0
- package/lib/version.d.ts +3 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/webgl-check.d.ts +2 -0
- package/lib/webgl-check.d.ts.map +1 -0
- package/package.json +138 -0
- package/src/core/Application.ts +1091 -0
- package/src/core/config.ts +168 -0
- package/src/core/create.ts +186 -0
- package/src/core/globals.ts +299 -0
- package/src/core/index.ts +6 -0
- package/src/core/interfaces/IApplication.ts +628 -0
- package/src/core/interfaces/IApplicationOptions.ts +81 -0
- package/src/core/interfaces/ICoreFunctions.ts +86 -0
- package/src/core/interfaces/ICoreSignals.ts +77 -0
- package/src/core/interfaces/IStorageCapability.test.ts +27 -0
- package/src/core/interfaces/IStorageCapability.ts +26 -0
- package/src/core/interfaces/index.ts +6 -0
- package/src/core/registries.ts +7 -0
- package/src/core/types.ts +13 -0
- package/src/display/AnimatedSprite.ts +227 -0
- package/src/display/Camera.ts +371 -0
- package/src/display/Container.ts +240 -0
- package/src/display/Entity.ts +50 -0
- package/src/display/ParticleContainer.ts +107 -0
- package/src/display/Scene.ts +305 -0
- package/src/display/SceneTransition.ts +108 -0
- package/src/display/SpineAnimation.ts +170 -0
- package/src/display/Svg.ts +9 -0
- package/src/display/index.ts +11 -0
- package/src/env.d.ts +6 -0
- package/src/hello.ts +20 -0
- package/src/index.ts +17 -0
- package/src/mixins/animated.ts +340 -0
- package/src/mixins/factory/Factory.ts +24 -0
- package/src/mixins/factory/const.ts +363 -0
- package/src/mixins/factory/index.ts +7 -0
- package/src/mixins/factory/methods.ts +21 -0
- package/src/mixins/factory/props.ts +207 -0
- package/src/mixins/factory/registry.test.ts +83 -0
- package/src/mixins/factory/registry.ts +61 -0
- package/src/mixins/factory/schema.ts +153 -0
- package/src/mixins/factory/ui-registry.ts +54 -0
- package/src/mixins/factory/utils.ts +130 -0
- package/src/mixins/focus.ts +124 -0
- package/src/mixins/index.ts +5 -0
- package/src/mixins/interaction.ts +74 -0
- package/src/mixins/signals.ts +49 -0
- package/src/plugins/AssetsPlugin.ts +407 -0
- package/src/plugins/DataAdapter.ts +259 -0
- package/src/plugins/DevToolsPlugin.ts +103 -0
- package/src/plugins/FullScreenPlugin.ts +359 -0
- package/src/plugins/GSAPPlugin.ts +811 -0
- package/src/plugins/KeyboardPlugin.ts +160 -0
- package/src/plugins/LayoutPlugin.ts +127 -0
- package/src/plugins/LookupPlugin.ts +308 -0
- package/src/plugins/Plugin.test.ts +73 -0
- package/src/plugins/Plugin.ts +200 -0
- package/src/plugins/PopupManagerPlugin.ts +263 -0
- package/src/plugins/ResizerPlugin.ts +220 -0
- package/src/plugins/SceneManagerPlugin.ts +669 -0
- package/src/plugins/StatsPlugin.ts +24 -0
- package/src/plugins/TimerPlugin.ts +841 -0
- package/src/plugins/WebEventsPlugin.ts +132 -0
- package/src/plugins/actions/ActionsPlugin.ts +113 -0
- package/src/plugins/actions/constants.ts +45 -0
- package/src/plugins/actions/index.ts +4 -0
- package/src/plugins/actions/methods.ts +28 -0
- package/src/plugins/actions/types.ts +47 -0
- package/src/plugins/audio/AudioChannel.test.ts +101 -0
- package/src/plugins/audio/AudioChannel.ts +164 -0
- package/src/plugins/audio/AudioInstance.ts +228 -0
- package/src/plugins/audio/AudioManagerPlugin.ts +903 -0
- package/src/plugins/audio/VoiceOverPlugin.ts +354 -0
- package/src/plugins/audio/index.ts +3 -0
- package/src/plugins/breakpoints/BreakpointPlugin.test.ts +228 -0
- package/src/plugins/breakpoints/BreakpointPlugin.ts +293 -0
- package/src/plugins/breakpoints/evaluate.test.ts +239 -0
- package/src/plugins/breakpoints/evaluate.ts +201 -0
- package/src/plugins/breakpoints/index.ts +3 -0
- package/src/plugins/breakpoints/methods.ts +22 -0
- package/src/plugins/breakpoints/types.ts +86 -0
- package/src/plugins/captions/CaptionsPlugin.ts +468 -0
- package/src/plugins/captions/CaptionsRenderer.ts +184 -0
- package/src/plugins/captions/font/Sans.fnt +116 -0
- package/src/plugins/captions/font/Sans.png +0 -0
- package/src/plugins/captions/index.ts +2 -0
- package/src/plugins/defaults.ts +95 -0
- package/src/plugins/focus/FocusManagerPlugin.ts +773 -0
- package/src/plugins/focus/FocusOutliner.ts +111 -0
- package/src/plugins/focus/index.ts +2 -0
- package/src/plugins/i18nPlugin.ts +284 -0
- package/src/plugins/index.ts +17 -0
- package/src/plugins/input/AbstractControls.ts +15 -0
- package/src/plugins/input/Controls.ts +55 -0
- package/src/plugins/input/InputPlugin.ts +168 -0
- package/src/plugins/input/constants.ts +12 -0
- package/src/plugins/input/index.ts +9 -0
- package/src/plugins/input/interfaces.ts +37 -0
- package/src/plugins/input/keyboard/KeyboardContols.ts +182 -0
- package/src/plugins/input/keyboard/index.ts +2 -0
- package/src/plugins/input/keyboard/interfaces.ts +21 -0
- package/src/plugins/input/methods.ts +9 -0
- package/src/plugins/input/touch/TouchControls.ts +237 -0
- package/src/plugins/input/touch/constants.ts +34 -0
- package/src/plugins/input/touch/index.ts +3 -0
- package/src/plugins/input/touch/interfaces.ts +15 -0
- package/src/plugins/input/types.ts +41 -0
- package/src/plugins/input/utils.ts +10 -0
- package/src/plugins/spine/SpinePlugin.ts +14 -0
- package/src/plugins/spine/pixi-spine/BatchableSpineSlot.ts +138 -0
- package/src/plugins/spine/pixi-spine/Spine.ts +897 -0
- package/src/plugins/spine/pixi-spine/SpineDebugRenderer.ts +615 -0
- package/src/plugins/spine/pixi-spine/SpinePipe.ts +197 -0
- package/src/plugins/spine/pixi-spine/SpineTexture.ts +143 -0
- package/src/plugins/spine/pixi-spine/assets/atlasLoader.ts +156 -0
- package/src/plugins/spine/pixi-spine/assets/skeletonLoader.ts +80 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.ts +92 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintBatcher.ts +186 -0
- package/src/plugins/spine/pixi-spine/darktint/DarkTintShader.ts +74 -0
- package/src/plugins/spine/pixi-spine/darktint/darkTintBit.ts +77 -0
- package/src/plugins/spine/pixi-spine/index.ts +43 -0
- package/src/plugins/spine/pixi-spine/require-shim.ts +43 -0
- package/src/signals/Signal.test.ts +54 -0
- package/src/signals/Signal.ts +68 -0
- package/src/signals/index.ts +10 -0
- package/src/store/Store.test.ts +146 -0
- package/src/store/Store.ts +192 -0
- package/src/store/index.ts +1 -0
- package/src/types/framework.d.ts +47 -0
- package/src/types/gsap.d.ts +26 -0
- package/src/ui/Button.ts +454 -0
- package/src/ui/FlexContainer.ts +526 -0
- package/src/ui/Input.ts +1274 -0
- package/src/ui/Joystick.ts +288 -0
- package/src/ui/Popup.ts +242 -0
- package/src/ui/Toast.ts +399 -0
- package/src/ui/Toaster.ts +409 -0
- package/src/ui/UICanvas.ts +812 -0
- package/src/ui/index.ts +8 -0
- package/src/utils/array.ts +24 -0
- package/src/utils/bind.ts +79 -0
- package/src/utils/canvas.ts +26 -0
- package/src/utils/color.ts +126 -0
- package/src/utils/console/Logger.ts +86 -0
- package/src/utils/console/index.ts +1 -0
- package/src/utils/debug.ts +69 -0
- package/src/utils/define.ts +120 -0
- package/src/utils/env.ts +3 -0
- package/src/utils/events.ts +10 -0
- package/src/utils/framework.ts +45 -0
- package/src/utils/index.ts +27 -0
- package/src/utils/map.ts +59 -0
- package/src/utils/math.ts +19 -0
- package/src/utils/misc.ts +45 -0
- package/src/utils/number.ts +3 -0
- package/src/utils/object.ts +43 -0
- package/src/utils/padding.ts +43 -0
- package/src/utils/pixi.ts +116 -0
- package/src/utils/platform.ts +33 -0
- package/src/utils/point.ts +123 -0
- package/src/utils/promise/Queue.ts +125 -0
- package/src/utils/promise/functions.ts +16 -0
- package/src/utils/promise/index.ts +2 -0
- package/src/utils/random.ts +69 -0
- package/src/utils/rect.ts +50 -0
- package/src/utils/set.ts +32 -0
- package/src/utils/string.ts +9 -0
- package/src/utils/text.ts +30 -0
- package/src/utils/typefilters.ts +29 -0
- package/src/utils/types.ts +426 -0
- package/src/utils/vite.ts +41 -0
- package/src/utils/web.ts +7 -0
- package/src/version.ts +3 -0
- package/src/webgl-check.ts +12 -0
- package/templates/app/default/.eslintrc.json +21 -0
- package/templates/app/default/.meta.json +4 -0
- package/templates/app/default/.nvmrc +1 -0
- package/templates/app/default/.prettierrc.json +7 -0
- package/templates/app/default/README.md +8 -0
- package/templates/app/default/assets/audio{m}/music/Cheerful Annoyance.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Drumming Sticks.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Game Over.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Mishief Stroll.ogg +0 -0
- package/templates/app/default/assets/audio{m}/music/Night at the Beach.ogg +0 -0
- package/templates/app/default/assets/audio{m}/sfx/click.ogg +0 -0
- package/templates/app/default/assets/audio{m}/sfx/hover.ogg +0 -0
- package/templates/app/default/assets/required{m}/caper.png +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Bold{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Medium{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Regular{family=Space Grotesk}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/fonts{fix}/Syncopate-Bold{family=Syncopate}{wf}.ttf +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/blue.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/green.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/grey.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/orange.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/purple.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/red.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn/yellow.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/down.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/over.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_a/up.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/down.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/over.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/btn_b/up.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/joystick/base.png +0 -0
- package/templates/app/default/assets/required{m}/ui{tps}/joystick/handle.png +0 -0
- package/templates/app/default/assets/required{m}/wordmark.svg +1 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro.png +0 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro.skel +0 -0
- package/templates/app/default/assets/spine{m}/spineboy-pro{fix}.atlas +94 -0
- package/templates/app/default/caper.config.ts +60 -0
- package/templates/app/default/index.html +23 -0
- package/templates/app/default/package.template.json +17 -0
- package/templates/app/default/public/favicon.ico +0 -0
- package/templates/app/default/src/__APPLICATION_NAME__.ts +3 -0
- package/templates/app/default/src/main.ts +9 -0
- package/templates/app/default/src/scenes/Base.ts +39 -0
- package/templates/app/default/src/scenes/Game.ts +34 -0
- package/templates/app/default/src/scenes/Splash.ts +70 -0
- package/templates/app/default/src/scenes/Start.ts +90 -0
- package/templates/app/default/src/utils/Constants.ts +3 -0
- package/templates/app/default/tsconfig.json +1 -0
- package/templates/plugin/package.template.json +33 -0
- package/templates/plugin/src/Plugin.template.ts +24 -0
- package/templates/plugin/src/index.template.ts +3 -0
- package/templates/plugin/tsconfig.template.json +43 -0
- package/templates/plugin/vite-env.template.d.ts +16 -0
- package/templates/plugin/vite.config.template.ts +19 -0
|
@@ -0,0 +1,1091 @@
|
|
|
1
|
+
import { gsap } from 'gsap';
|
|
2
|
+
import type {
|
|
3
|
+
AppConfig,
|
|
4
|
+
IApplication,
|
|
5
|
+
IApplicationOptions,
|
|
6
|
+
ICaperAutomation,
|
|
7
|
+
ICoreFunctions,
|
|
8
|
+
ICoreSignals,
|
|
9
|
+
PauseConfig,
|
|
10
|
+
} from '.';
|
|
11
|
+
import { coreFunctionRegistry, coreSignalRegistry, generatePluginList, sortPluginsByRequires } from '.';
|
|
12
|
+
import type {
|
|
13
|
+
ActionSignal,
|
|
14
|
+
AppScenes,
|
|
15
|
+
IAssetsPlugin,
|
|
16
|
+
IAudioManagerPlugin,
|
|
17
|
+
IBreakpointPlugin,
|
|
18
|
+
IControls,
|
|
19
|
+
IFocusManagerPlugin,
|
|
20
|
+
Ii18nPlugin,
|
|
21
|
+
IInputPlugin,
|
|
22
|
+
IKeyboardPlugin,
|
|
23
|
+
IPlugin,
|
|
24
|
+
IPopupManagerPlugin,
|
|
25
|
+
IResizerPlugin,
|
|
26
|
+
ISceneManagerPlugin,
|
|
27
|
+
IWebEventsPlugin,
|
|
28
|
+
LoadSceneConfig,
|
|
29
|
+
} from '../plugins';
|
|
30
|
+
|
|
31
|
+
import type {
|
|
32
|
+
AssetInitOptions,
|
|
33
|
+
AssetsManifest,
|
|
34
|
+
DestroyOptions,
|
|
35
|
+
RendererDestroyOptions,
|
|
36
|
+
} from 'pixi.js';
|
|
37
|
+
import { Assets, Container as PIXIContainer, isMobile, Application as PIXIPApplication, Point, TextStyle } from 'pixi.js';
|
|
38
|
+
import type { IDataAdapter } from '../plugins/DataAdapter';
|
|
39
|
+
import type { IStore } from '../store';
|
|
40
|
+
import { Store } from '../store';
|
|
41
|
+
import type {
|
|
42
|
+
AppTypeOverrides,
|
|
43
|
+
Eases,
|
|
44
|
+
ImportList,
|
|
45
|
+
ImportListItem,
|
|
46
|
+
SceneId,
|
|
47
|
+
SceneLoadArgs,
|
|
48
|
+
Size,
|
|
49
|
+
} from '../utils';
|
|
50
|
+
import { bindAllMethods, deepMerge, getDynamicModuleFromImportListItem, isDev, isPromise, Logger } from '../utils';
|
|
51
|
+
import { triggerViteError } from '../utils/vite';
|
|
52
|
+
|
|
53
|
+
import { createFactoryMethods, defaultFactoryMethods } from '../mixins';
|
|
54
|
+
import type { IActionsPlugin } from '../plugins/actions';
|
|
55
|
+
import type { IVoiceOverPlugin } from '../plugins/audio/VoiceOverPlugin';
|
|
56
|
+
import type { ICaptionsPlugin } from '../plugins/captions';
|
|
57
|
+
import { defaultPlugins } from '../plugins/defaults';
|
|
58
|
+
import { type IDevToolsPlugin } from '../plugins/DevToolsPlugin';
|
|
59
|
+
import { IFullScreenPlugin } from '../plugins/FullScreenPlugin';
|
|
60
|
+
import { type IGSAPPlugin } from '../plugins/GSAPPlugin';
|
|
61
|
+
import { ILookupPlugin } from '../plugins/LookupPlugin';
|
|
62
|
+
import { ITimerPlugin } from '../plugins/TimerPlugin';
|
|
63
|
+
import { Signal } from '../signals';
|
|
64
|
+
|
|
65
|
+
type App = AppTypeOverrides['App'];
|
|
66
|
+
type AppContexts = AppTypeOverrides['Contexts'];
|
|
67
|
+
type AppActions = AppTypeOverrides['Actions'];
|
|
68
|
+
type AppPlugins = AppTypeOverrides['Plugins'];
|
|
69
|
+
|
|
70
|
+
function getDefaultResolution() {
|
|
71
|
+
return typeof window !== 'undefined' ? (window.devicePixelRatio > 1 ? 2 : 1) : 2;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const defaultApplicationOptions: Partial<IApplicationOptions> = {
|
|
75
|
+
antialias: false,
|
|
76
|
+
autoStart: true,
|
|
77
|
+
resizeToContainer: true,
|
|
78
|
+
backgroundColor: 0x0,
|
|
79
|
+
backgroundAlpha: 1,
|
|
80
|
+
clearBeforeRender: false,
|
|
81
|
+
context: null,
|
|
82
|
+
eventFeatures: undefined,
|
|
83
|
+
eventMode: undefined,
|
|
84
|
+
hello: false,
|
|
85
|
+
powerPreference: 'high-performance',
|
|
86
|
+
premultipliedAlpha: false,
|
|
87
|
+
preserveDrawingBuffer: false,
|
|
88
|
+
resizeTo: undefined,
|
|
89
|
+
sharedTicker: true,
|
|
90
|
+
view: undefined,
|
|
91
|
+
autoDensity: false,
|
|
92
|
+
defaultTextStyle: {
|
|
93
|
+
fontFamily: 'Arial',
|
|
94
|
+
fontSize: 20,
|
|
95
|
+
fontWeight: 'normal',
|
|
96
|
+
fontStyle: 'normal',
|
|
97
|
+
align: 'left',
|
|
98
|
+
breakWords: false,
|
|
99
|
+
fill: 0,
|
|
100
|
+
fontVariant: 'normal',
|
|
101
|
+
leading: 0,
|
|
102
|
+
letterSpacing: 0,
|
|
103
|
+
lineHeight: 0,
|
|
104
|
+
padding: 0,
|
|
105
|
+
stroke: undefined,
|
|
106
|
+
textBaseline: 'alphabetic',
|
|
107
|
+
trim: false,
|
|
108
|
+
whiteSpace: 'pre',
|
|
109
|
+
wordWrap: false,
|
|
110
|
+
wordWrapWidth: 100,
|
|
111
|
+
},
|
|
112
|
+
resolution: getDefaultResolution(), // must be 1 or 2
|
|
113
|
+
useHash: isDev,
|
|
114
|
+
showSceneDebugMenu: isDev,
|
|
115
|
+
showStats: isDev,
|
|
116
|
+
useStore: true,
|
|
117
|
+
useSpine: false,
|
|
118
|
+
useLayout: false,
|
|
119
|
+
useVoiceover: false,
|
|
120
|
+
plugins: [],
|
|
121
|
+
scenes: [],
|
|
122
|
+
defaultSceneLoadMethod: 'immediate',
|
|
123
|
+
assets: {
|
|
124
|
+
manifest: './assets.json',
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const defaultPauseConfig: PauseConfig = {
|
|
129
|
+
pauseAudio: false,
|
|
130
|
+
pauseAnimations: false,
|
|
131
|
+
pauseTicker: false,
|
|
132
|
+
pauseTimers: false,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export class Application extends PIXIPApplication implements IApplication {
|
|
136
|
+
// static properties
|
|
137
|
+
public static containerElement: HTMLElement;
|
|
138
|
+
|
|
139
|
+
// singleton instance
|
|
140
|
+
public static instance: IApplication;
|
|
141
|
+
|
|
142
|
+
// method binding root
|
|
143
|
+
private readonly __caper_method_binding_root = true;
|
|
144
|
+
|
|
145
|
+
// debug overlay (lazy, see getter)
|
|
146
|
+
private _debugContainer: PIXIContainer;
|
|
147
|
+
|
|
148
|
+
// config
|
|
149
|
+
public config: Partial<IApplicationOptions>;
|
|
150
|
+
/**
|
|
151
|
+
* Automation facade for Playwright / agent drivers. Only assigned when
|
|
152
|
+
* automation is enabled (dev env, `config.automation === true`, or
|
|
153
|
+
* `VITE_CAPER_AUTOMATION === 'true'`); otherwise undefined.
|
|
154
|
+
*/
|
|
155
|
+
public automation?: ICaperAutomation;
|
|
156
|
+
public plugins: ImportList<IPlugin>;
|
|
157
|
+
public manifest: string | AssetsManifest | undefined;
|
|
158
|
+
public onPause = new Signal<(config: PauseConfig) => void>();
|
|
159
|
+
public onResume = new Signal<(config: PauseConfig) => void>();
|
|
160
|
+
// signals
|
|
161
|
+
public onResize = new Signal<(size: Size) => void>();
|
|
162
|
+
/**
|
|
163
|
+
* Emitted when a plugin throws during initialize/postInitialize. Previously
|
|
164
|
+
* these failures bricked the app silently.
|
|
165
|
+
*/
|
|
166
|
+
public onPluginError = new Signal<
|
|
167
|
+
(detail: { id: string; phase: 'initialize' | 'postInitialize'; error: unknown }) => void
|
|
168
|
+
>();
|
|
169
|
+
// plugins
|
|
170
|
+
public readonly _plugins: Map<string, IPlugin> = new Map();
|
|
171
|
+
// default plugins
|
|
172
|
+
protected _assetManager: IAssetsPlugin;
|
|
173
|
+
protected _lookup: ILookupPlugin;
|
|
174
|
+
protected _sceneManager: ISceneManagerPlugin;
|
|
175
|
+
protected _webEventsManager: IWebEventsPlugin;
|
|
176
|
+
protected _fullScreenPlugin: IFullScreenPlugin;
|
|
177
|
+
protected _keyboardManager: IKeyboardPlugin;
|
|
178
|
+
protected _focusManager: IFocusManagerPlugin;
|
|
179
|
+
protected _popupManager: IPopupManagerPlugin;
|
|
180
|
+
protected _timerPlugin: ITimerPlugin;
|
|
181
|
+
protected _audioManager: IAudioManagerPlugin;
|
|
182
|
+
protected _voiceoverPlugin: IVoiceOverPlugin;
|
|
183
|
+
protected _captionsPlugin: ICaptionsPlugin;
|
|
184
|
+
protected _actions: ActionSignal;
|
|
185
|
+
protected _isBooting: boolean = true;
|
|
186
|
+
|
|
187
|
+
protected _env: Record<string, string> = (import.meta as any).env || {};
|
|
188
|
+
protected _makeFactory: typeof defaultFactoryMethods;
|
|
189
|
+
|
|
190
|
+
protected _isFullScreen: boolean = false;
|
|
191
|
+
protected _fullScreenElement: HTMLElement | Window | null = null;
|
|
192
|
+
|
|
193
|
+
get make(): typeof defaultFactoryMethods {
|
|
194
|
+
if (!this._makeFactory) {
|
|
195
|
+
this._makeFactory = createFactoryMethods(defaultFactoryMethods, this, false);
|
|
196
|
+
}
|
|
197
|
+
return this._makeFactory;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
get env() {
|
|
201
|
+
return this._env;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
get debugContainer(): PIXIContainer {
|
|
205
|
+
if (!this._debugContainer) {
|
|
206
|
+
this._debugContainer = new PIXIContainer();
|
|
207
|
+
this._debugContainer.label = 'DebugOverlay';
|
|
208
|
+
this._debugContainer.eventMode = 'none';
|
|
209
|
+
this._debugContainer.interactiveChildren = false;
|
|
210
|
+
this.stage.addChild(this._debugContainer);
|
|
211
|
+
}
|
|
212
|
+
return this._debugContainer;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
protected _paused: boolean = false;
|
|
216
|
+
protected _pauseConfig: Partial<PauseConfig> = {};
|
|
217
|
+
|
|
218
|
+
public get paused(): boolean {
|
|
219
|
+
return this._paused;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public pause(config?: Partial<PauseConfig>) {
|
|
223
|
+
this._paused = true;
|
|
224
|
+
this._pauseConfig = { ...defaultPauseConfig, ...config };
|
|
225
|
+
if (config?.pauseAudio) {
|
|
226
|
+
this.audio.pause();
|
|
227
|
+
}
|
|
228
|
+
if (config?.pauseAnimations) {
|
|
229
|
+
gsap?.globalTimeline?.pause();
|
|
230
|
+
}
|
|
231
|
+
if (config?.pauseTicker) {
|
|
232
|
+
this.ticker.stop();
|
|
233
|
+
}
|
|
234
|
+
if (config?.pauseTimers) {
|
|
235
|
+
this.timers.pauseAllTimers();
|
|
236
|
+
}
|
|
237
|
+
if (config?.pauseOther) {
|
|
238
|
+
config.pauseOther.forEach((thing) => {
|
|
239
|
+
if (typeof thing?.pause === 'function') {
|
|
240
|
+
thing.pause();
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
this.onPause.emit(this._pauseConfig);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public resume() {
|
|
248
|
+
this._paused = false;
|
|
249
|
+
if (this._pauseConfig.pauseAudio) {
|
|
250
|
+
if (this.audio.paused) {
|
|
251
|
+
this.audio.resume();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (this._pauseConfig.pauseAnimations) {
|
|
255
|
+
if (gsap?.globalTimeline?.paused()) {
|
|
256
|
+
gsap?.globalTimeline?.resume();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (this._pauseConfig.pauseTicker) {
|
|
260
|
+
if (!this.ticker.started) {
|
|
261
|
+
this.ticker.start();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (this._pauseConfig.pauseTimers) {
|
|
265
|
+
this.timers.resumeAllTimers();
|
|
266
|
+
}
|
|
267
|
+
if (this._pauseConfig.pauseOther) {
|
|
268
|
+
this._pauseConfig.pauseOther.forEach((thing) => {
|
|
269
|
+
if (typeof thing?.resume === 'function') {
|
|
270
|
+
thing.resume();
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
if (this._pauseConfig.clearOnResume) {
|
|
275
|
+
this._pauseConfig = {};
|
|
276
|
+
}
|
|
277
|
+
this.onResume.emit(this._pauseConfig);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
public togglePause(config?: Partial<PauseConfig>) {
|
|
281
|
+
this._paused = !this._paused;
|
|
282
|
+
if (this._paused) {
|
|
283
|
+
this.pause(config);
|
|
284
|
+
} else {
|
|
285
|
+
this.resume();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
constructor() {
|
|
290
|
+
super();
|
|
291
|
+
bindAllMethods(this);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
protected _appVersion: string | number;
|
|
295
|
+
|
|
296
|
+
public get appVersion() {
|
|
297
|
+
try {
|
|
298
|
+
this._appVersion = __CAPER_APP_VERSION;
|
|
299
|
+
} catch (e) {
|
|
300
|
+
this._appVersion = -1;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return this._appVersion;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
protected _appName: string;
|
|
307
|
+
|
|
308
|
+
public get appName(): string {
|
|
309
|
+
if (!this._appName) {
|
|
310
|
+
try {
|
|
311
|
+
this._appName = __CAPER_APP_NAME;
|
|
312
|
+
} catch (e) {
|
|
313
|
+
this._appName = 'n/a';
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return this._appName;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
protected _i18n: Ii18nPlugin;
|
|
320
|
+
|
|
321
|
+
public get i18n(): Ii18nPlugin {
|
|
322
|
+
if (!this._i18n) {
|
|
323
|
+
this._i18n = this.getPlugin<Ii18nPlugin>('i18n');
|
|
324
|
+
}
|
|
325
|
+
return this._i18n;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
protected _resizer: IResizerPlugin;
|
|
329
|
+
|
|
330
|
+
public get resizer(): IResizerPlugin {
|
|
331
|
+
if (!this._resizer) {
|
|
332
|
+
this._resizer = this.getPlugin<IResizerPlugin>('resizer');
|
|
333
|
+
}
|
|
334
|
+
return this._resizer;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
protected _breakpoints: IBreakpointPlugin;
|
|
338
|
+
|
|
339
|
+
public get breakpoints(): IBreakpointPlugin {
|
|
340
|
+
if (!this._breakpoints) {
|
|
341
|
+
this._breakpoints = this.getPlugin<IBreakpointPlugin>('breakpoints');
|
|
342
|
+
}
|
|
343
|
+
return this._breakpoints;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// actions
|
|
347
|
+
protected _actionsPlugin: IActionsPlugin<AppContexts>;
|
|
348
|
+
|
|
349
|
+
public get actionsPlugin(): IActionsPlugin<AppContexts> {
|
|
350
|
+
if (!this._actionsPlugin) {
|
|
351
|
+
this._actionsPlugin = this.getPlugin<IActionsPlugin<AppContexts>>('actions');
|
|
352
|
+
}
|
|
353
|
+
return this._actionsPlugin;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// input
|
|
357
|
+
protected _input: IInputPlugin;
|
|
358
|
+
|
|
359
|
+
public get input(): IInputPlugin {
|
|
360
|
+
if (!this._input) {
|
|
361
|
+
this._input = this.getPlugin<IInputPlugin>('input');
|
|
362
|
+
}
|
|
363
|
+
return this._input;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// controls
|
|
367
|
+
public get controls(): IControls {
|
|
368
|
+
if (!this._input) {
|
|
369
|
+
this._input = this.getPlugin<IInputPlugin>('input');
|
|
370
|
+
}
|
|
371
|
+
return this._input.controls;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// animation
|
|
375
|
+
/**
|
|
376
|
+
* The GSAP plugin.
|
|
377
|
+
* @returns The GSAP plugin.
|
|
378
|
+
*/
|
|
379
|
+
public get animation(): IGSAPPlugin {
|
|
380
|
+
return this.getPlugin<IGSAPPlugin>('GSAPPlugin');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* The GSAP instance.
|
|
385
|
+
* @returns The GSAP instance.
|
|
386
|
+
*/
|
|
387
|
+
public get anim(): typeof gsap {
|
|
388
|
+
return this.getPlugin<IGSAPPlugin>('GSAPPlugin').anim;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Adds one or more GSAP tweens or timelines to a specified animation context.
|
|
392
|
+
* This uses the GSAPPlugin's custom animation context (a Set of tweens/timelines),
|
|
393
|
+
* not a `gsap.Context` instance. If no contextId is provided, animations are added
|
|
394
|
+
* to the plugin's global collection.
|
|
395
|
+
* @param animation - A single GSAP tween/timeline or an array of them.
|
|
396
|
+
* @param contextId - Optional ID of the animation context. Defaults to the global context.
|
|
397
|
+
* @returns The animation(s) that were added.
|
|
398
|
+
*/
|
|
399
|
+
public addAnimation(
|
|
400
|
+
animation: gsap.core.Tween | gsap.core.Timeline | (gsap.core.Tween | gsap.core.Timeline)[],
|
|
401
|
+
contextId?: string,
|
|
402
|
+
): gsap.core.Tween | gsap.core.Timeline | (gsap.core.Tween | gsap.core.Timeline)[] {
|
|
403
|
+
return this.getPlugin<IGSAPPlugin>('GSAPPlugin').addAnimation(animation, contextId);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Returns the registered eases or ease names.
|
|
408
|
+
* @param namesOnly - If true, returns only the ease names.
|
|
409
|
+
* @returns The registered eases or ease names.
|
|
410
|
+
*/
|
|
411
|
+
public eases(namesOnly: boolean = false): Eases | string[] {
|
|
412
|
+
const plugin = this.getPlugin<IGSAPPlugin>('GSAPPlugin');
|
|
413
|
+
return namesOnly ? plugin.easeNames : plugin.eases;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// store
|
|
417
|
+
protected _store: IStore;
|
|
418
|
+
|
|
419
|
+
public get store(): IStore {
|
|
420
|
+
return this._store;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// size
|
|
424
|
+
protected _center = new Point(0, 0);
|
|
425
|
+
public get center(): Point {
|
|
426
|
+
return this._center;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
get lookup(): ILookupPlugin {
|
|
430
|
+
if (!this._lookup) {
|
|
431
|
+
this._lookup = this.getPlugin<ILookupPlugin>('lookup');
|
|
432
|
+
}
|
|
433
|
+
return this._lookup;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
public getChildAtPath(path: string): PIXIContainer | undefined {
|
|
437
|
+
return this.lookup.getChildAtPath(path);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
public getPathForChild(container: PIXIContainer): string {
|
|
441
|
+
return this.lookup.getPathForChild(container);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
public getChildrenAtPaths(...paths: string[]): PIXIContainer[] {
|
|
445
|
+
return this.lookup.getChildrenAtPaths(...paths);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
public getPathsForChildren(...containers: PIXIContainer[]): string[] {
|
|
449
|
+
return this.lookup.getPathsForChildren(...containers);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
public getAllPaths(): string[] {
|
|
453
|
+
return this.lookup.getAllPaths();
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
public get assets(): IAssetsPlugin {
|
|
457
|
+
if (!this._assetManager) {
|
|
458
|
+
this._assetManager = this.getPlugin<IAssetsPlugin>('assets');
|
|
459
|
+
}
|
|
460
|
+
return this._assetManager;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
public get scenes(): ISceneManagerPlugin {
|
|
464
|
+
if (!this._sceneManager) {
|
|
465
|
+
this._sceneManager = this.getPlugin<ISceneManagerPlugin>('scenes');
|
|
466
|
+
}
|
|
467
|
+
return this._sceneManager;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
public loadScene<K extends SceneId>(id: K, ...args: SceneLoadArgs<K>): void;
|
|
471
|
+
public loadScene(scene: LoadSceneConfig | AppScenes): void;
|
|
472
|
+
public loadScene(sceneOrId: LoadSceneConfig | AppScenes | SceneId, ...args: unknown[]): void {
|
|
473
|
+
// The plugin's `loadScene` is overloaded — forward args directly.
|
|
474
|
+
(this.scenes.loadScene as (...a: unknown[]) => unknown)(sceneOrId, ...args);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
public get webEvents(): IWebEventsPlugin {
|
|
478
|
+
if (!this._webEventsManager) {
|
|
479
|
+
this._webEventsManager = this.getPlugin<IWebEventsPlugin>('webEvents');
|
|
480
|
+
}
|
|
481
|
+
return this._webEventsManager;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
public get keyboard(): IKeyboardPlugin {
|
|
485
|
+
if (!this._keyboardManager) {
|
|
486
|
+
this._keyboardManager = this.getPlugin<IKeyboardPlugin>('keyboard');
|
|
487
|
+
}
|
|
488
|
+
return this._keyboardManager;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
public get focus(): IFocusManagerPlugin {
|
|
492
|
+
if (!this._focusManager) {
|
|
493
|
+
this._focusManager = this.getPlugin<IFocusManagerPlugin>('focus');
|
|
494
|
+
}
|
|
495
|
+
return this._focusManager;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
get size() {
|
|
499
|
+
return this.resizer.size;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
public get popups(): IPopupManagerPlugin {
|
|
503
|
+
if (!this._popupManager) {
|
|
504
|
+
this._popupManager = this.getPlugin<IPopupManagerPlugin>('popups');
|
|
505
|
+
}
|
|
506
|
+
return this._popupManager;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
public get timers(): ITimerPlugin {
|
|
510
|
+
if (!this._timerPlugin) {
|
|
511
|
+
this._timerPlugin = this.getPlugin<ITimerPlugin>('timers');
|
|
512
|
+
}
|
|
513
|
+
return this._timerPlugin;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
public get audio(): IAudioManagerPlugin {
|
|
517
|
+
if (!this._audioManager) {
|
|
518
|
+
this._audioManager = this.getPlugin<IAudioManagerPlugin>('audio');
|
|
519
|
+
}
|
|
520
|
+
return this._audioManager;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
public get actionContext(): AppContexts {
|
|
524
|
+
return this.actionsPlugin.context;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
public set actionContext(context: AppContexts) {
|
|
528
|
+
this.actionsPlugin.context = context;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
public get voiceover(): IVoiceOverPlugin {
|
|
532
|
+
if (!this._voiceoverPlugin) {
|
|
533
|
+
this._voiceoverPlugin = this.getPlugin<IVoiceOverPlugin>('voiceover', this.config.useVoiceover);
|
|
534
|
+
}
|
|
535
|
+
return this._voiceoverPlugin;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
public get captions(): ICaptionsPlugin {
|
|
539
|
+
if (!this._captionsPlugin) {
|
|
540
|
+
this._captionsPlugin = this.getPlugin<ICaptionsPlugin>('captions', this.config.useVoiceover);
|
|
541
|
+
}
|
|
542
|
+
return this._captionsPlugin;
|
|
543
|
+
}
|
|
544
|
+
/** Fullscreen plugin */
|
|
545
|
+
public get fullScreen(): IFullScreenPlugin {
|
|
546
|
+
if (!this._fullScreenPlugin) {
|
|
547
|
+
this._fullScreenPlugin = this.getPlugin<IFullScreenPlugin>('fullscreen');
|
|
548
|
+
}
|
|
549
|
+
return this._fullScreenPlugin;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
get fullScreenElement(): HTMLElement | Window | null {
|
|
553
|
+
return this.fullScreen.fullScreenElement;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
get isFullScreen(): boolean {
|
|
557
|
+
return this.fullScreen.isFullScreen;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
get canFullscreen(): boolean {
|
|
561
|
+
return this.fullScreen.canFullscreen;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
public setFullScreenElement(value: HTMLElement | Window | null) {
|
|
565
|
+
this.fullScreen.setFullScreenElement(value);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
public setFullScreen(value: boolean) {
|
|
569
|
+
this.fullScreen.setFullScreen(value);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
public toggleFullScreen() {
|
|
573
|
+
this.fullScreen.toggleFullScreen();
|
|
574
|
+
}
|
|
575
|
+
/** End Fullscreen plugin */
|
|
576
|
+
|
|
577
|
+
get isMobile() {
|
|
578
|
+
return isMobile.any;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
get isTouch() {
|
|
582
|
+
return 'ontouchstart' in window || navigator.maxTouchPoints > 0;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
get signal(): ICoreSignals {
|
|
586
|
+
return coreSignalRegistry;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
get signals(): ICoreSignals {
|
|
590
|
+
return this.signal;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
get func(): ICoreFunctions {
|
|
594
|
+
return coreFunctionRegistry;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
get exec(): ICoreFunctions {
|
|
598
|
+
return this.func;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// views
|
|
602
|
+
protected _views: any[];
|
|
603
|
+
|
|
604
|
+
public get views(): any[] {
|
|
605
|
+
if (!this._views) {
|
|
606
|
+
this._views = [this.scenes.view, this.popups.view];
|
|
607
|
+
if (this.scenes.splash.view) {
|
|
608
|
+
this._views.push(this.scenes.splash.view);
|
|
609
|
+
}
|
|
610
|
+
if (this.scenes.transition) {
|
|
611
|
+
this._views.push(this.scenes.transition);
|
|
612
|
+
}
|
|
613
|
+
if (this.captions?.view) {
|
|
614
|
+
this._views.push(this.captions.view);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return this._views;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
public static getInstance<T extends App = App>(): T {
|
|
622
|
+
if (!Application.instance) {
|
|
623
|
+
Logger.warn('Application not created yet');
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
return Application.instance as T;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Destroy the application
|
|
631
|
+
* This will destroy all plugins and the store
|
|
632
|
+
* @param {RendererDestroyOptions} rendererDestroyOptions
|
|
633
|
+
* @param {DestroyOptions} options
|
|
634
|
+
*/
|
|
635
|
+
public destroy(rendererDestroyOptions?: RendererDestroyOptions, options?: DestroyOptions) {
|
|
636
|
+
this._plugins.forEach((plugin) => {
|
|
637
|
+
plugin.destroy();
|
|
638
|
+
});
|
|
639
|
+
this.store.destroy();
|
|
640
|
+
super.destroy(rendererDestroyOptions, options);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
public setContainer(container: HTMLElement) {
|
|
644
|
+
Application.containerElement = container;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
public async initialize(config: Partial<AppConfig>, el?: HTMLElement): Promise<AppTypeOverrides['App']> {
|
|
648
|
+
if (Application.instance) {
|
|
649
|
+
throw new Error('Application is already initialized');
|
|
650
|
+
}
|
|
651
|
+
Application.instance = this as unknown as IApplication;
|
|
652
|
+
|
|
653
|
+
this.config = deepMerge(defaultApplicationOptions, config);
|
|
654
|
+
this.signals.onResize = this.onResize;
|
|
655
|
+
|
|
656
|
+
if (config.container) {
|
|
657
|
+
Application.containerElement = config.container;
|
|
658
|
+
}
|
|
659
|
+
// initialize the logger
|
|
660
|
+
Logger.initialize(this.config.logger);
|
|
661
|
+
|
|
662
|
+
// ensure the resolution is 1 or 2
|
|
663
|
+
if (this.config.resolution !== 1 && this.config.resolution !== 2) {
|
|
664
|
+
const userResolution = this.config.resolution;
|
|
665
|
+
this.config.resolution = getDefaultResolution();
|
|
666
|
+
Logger.warn(
|
|
667
|
+
`App resolution must be 1 or 2, setting to ${this.config.resolution} instead of ${userResolution}. Modify your app config to set the resolution to 1 or 2.`,
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
await this.boot(this.config);
|
|
672
|
+
await this.initAssets();
|
|
673
|
+
|
|
674
|
+
// initialize the pixi application
|
|
675
|
+
await this.init(this.config);
|
|
676
|
+
this.stage.label = 'Stage';
|
|
677
|
+
|
|
678
|
+
if (this.config.defaultTextStyle) {
|
|
679
|
+
const style = { ...defaultApplicationOptions.defaultTextStyle, ...this.config.defaultTextStyle };
|
|
680
|
+
TextStyle.defaultTextStyle = style;
|
|
681
|
+
}
|
|
682
|
+
if (this.config.defaultDropShadow) {
|
|
683
|
+
TextStyle.defaultDropShadow = this.config.defaultDropShadow;
|
|
684
|
+
}
|
|
685
|
+
if (el) {
|
|
686
|
+
el.appendChild(this.canvas as HTMLCanvasElement);
|
|
687
|
+
this.setContainer(el);
|
|
688
|
+
} else {
|
|
689
|
+
throw new Error('No element found to append the view to.');
|
|
690
|
+
}
|
|
691
|
+
await this.registerDefaultPlugins();
|
|
692
|
+
|
|
693
|
+
if (isDev) {
|
|
694
|
+
this.getPlugin<IDevToolsPlugin>('DevToolsPlugin').initializeDevTools(this);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
this.signals.onLoadRequiredComplete.connectOnce(this.requiredAssetsLoaded);
|
|
698
|
+
|
|
699
|
+
// internal setup
|
|
700
|
+
await this._setup();
|
|
701
|
+
|
|
702
|
+
this.plugins = await generatePluginList(this.config.plugins || []);
|
|
703
|
+
|
|
704
|
+
// register the applications custom plugins (storage-capable or not — one pipeline)
|
|
705
|
+
await this.registerPlugins();
|
|
706
|
+
|
|
707
|
+
await this.setup();
|
|
708
|
+
await this.loadDefaultScene();
|
|
709
|
+
|
|
710
|
+
// focus the canvas
|
|
711
|
+
this.renderer.canvas.focus();
|
|
712
|
+
|
|
713
|
+
if (this.config.container) {
|
|
714
|
+
this.config.container.classList.add('loaded');
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
this._isBooting = false;
|
|
718
|
+
// return the Application instance to the create method, if needed
|
|
719
|
+
return Application.instance as unknown as App;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
public getPlugin<T extends IPlugin>(pluginName: AppPlugins, debug: boolean = false): T {
|
|
723
|
+
const plugin = this._plugins.get(pluginName) as T;
|
|
724
|
+
if (!plugin && debug) {
|
|
725
|
+
Logger.warn(`Plugin with name "${pluginName}" not found.`);
|
|
726
|
+
}
|
|
727
|
+
return plugin;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/**
|
|
731
|
+
* Framework post-initialization. Always runs the plugin `postInitialize` loop and
|
|
732
|
+
* core wiring, then invokes the user-overridable {@link postInitialize} hook last.
|
|
733
|
+
* The runtime (`create()`) calls this — apps should not call it directly, and must
|
|
734
|
+
* NOT need to call `super` from their own `postInitialize` override to get wired up.
|
|
735
|
+
*/
|
|
736
|
+
async _postInitialize(): Promise<void> {
|
|
737
|
+
// start plugins
|
|
738
|
+
for (const plugin of this._plugins.values()) {
|
|
739
|
+
try {
|
|
740
|
+
await plugin.postInitialize(this as unknown as IApplication);
|
|
741
|
+
} catch (error) {
|
|
742
|
+
// Surfaced (not just logged) so a plugin that silently fails to wire up —
|
|
743
|
+
// e.g. InputPlugin's controls.connect() — is visible in dev, not invisible.
|
|
744
|
+
triggerViteError({
|
|
745
|
+
message: `Plugin "${plugin.id}" failed in postInitialize: ${error instanceof Error ? error.message : String(error)}`,
|
|
746
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
747
|
+
});
|
|
748
|
+
this.onPluginError.emit({ id: plugin.id, phase: 'postInitialize', error });
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
this.webEvents.onVisibilityChanged.connect((visible) => {
|
|
753
|
+
if (visible) {
|
|
754
|
+
this.audio.restore();
|
|
755
|
+
this.timers.resumeAllTimers();
|
|
756
|
+
} else {
|
|
757
|
+
this.audio.suspend();
|
|
758
|
+
this.timers.pauseAllTimers();
|
|
759
|
+
}
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
// User hook, run last. Framework wiring above always runs regardless of whether
|
|
763
|
+
// a subclass override calls super, so overriding `postInitialize` is footgun-free.
|
|
764
|
+
await this.postInitialize();
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* User-overridable post-initialization hook, invoked after all framework wiring is
|
|
769
|
+
* complete. Override to perform app setup that depends on a fully initialized
|
|
770
|
+
* environment. Safe to override WITHOUT calling `super` — framework post-init lives
|
|
771
|
+
* in {@link _postInitialize}, which the runtime calls.
|
|
772
|
+
*/
|
|
773
|
+
async postInitialize(): Promise<void> {}
|
|
774
|
+
|
|
775
|
+
public getUnloadedPlugin(id: string): ImportListItem<IPlugin> | undefined {
|
|
776
|
+
return this.plugins.find((pluginItem) => pluginItem.id === id);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
async loadPlugin(listItem: ImportListItem, isDefault: boolean = false) {
|
|
780
|
+
if (this._plugins.has(listItem.id)) {
|
|
781
|
+
return await this.registerPlugin(this._plugins.get(listItem.id)!, listItem.options);
|
|
782
|
+
}
|
|
783
|
+
const plugin = await getDynamicModuleFromImportListItem(listItem);
|
|
784
|
+
const pluginInstance = new plugin(listItem.id);
|
|
785
|
+
if (pluginInstance.id !== listItem.id) {
|
|
786
|
+
pluginInstance.id = listItem.id;
|
|
787
|
+
}
|
|
788
|
+
let opts = listItem.options;
|
|
789
|
+
if (isDefault && !opts) {
|
|
790
|
+
opts = this.config[pluginInstance.id as keyof IApplicationOptions];
|
|
791
|
+
}
|
|
792
|
+
return await this.registerPlugin(pluginInstance, opts);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/**
|
|
796
|
+
* Gets an ActionSignal for the specified action type
|
|
797
|
+
* @template TActionData - The type of data associated with the action
|
|
798
|
+
* @param {A} action - The action to get the signal for
|
|
799
|
+
* @returns {ActionSignal<TActionData>} A signal that can be used to listen for the action
|
|
800
|
+
* @example
|
|
801
|
+
* // Listen for a 'jump' action
|
|
802
|
+
* app.actions('jump').connect((data) => {
|
|
803
|
+
* player.jump(data.power);
|
|
804
|
+
* });
|
|
805
|
+
*/
|
|
806
|
+
public actions<TActionData = any>(action: AppActions): ActionSignal<TActionData> {
|
|
807
|
+
return this.actionsPlugin.getAction<TActionData>(action as string);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Dispatches an action with optional data
|
|
812
|
+
* @template TActionData - The type of data to send with the action
|
|
813
|
+
* @param {A} action - The action to dispatch
|
|
814
|
+
* @param {TActionData} [data] - Optional data to send with the action
|
|
815
|
+
* @example
|
|
816
|
+
* // Send a 'jump' action with power data
|
|
817
|
+
* app.sendAction('jump', { power: 100 });
|
|
818
|
+
*/
|
|
819
|
+
public sendAction<TActionData = any>(action: AppActions, data?: TActionData) {
|
|
820
|
+
this.actionsPlugin.sendAction<TActionData>(action as string, data);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Dispatches an action with optional data
|
|
825
|
+
* alias for sendAction
|
|
826
|
+
* @template TActionData - The type of data to send with the action
|
|
827
|
+
* @param {A} action - The action to dispatch
|
|
828
|
+
* @param {TActionData} [data] - Optional data to send with the action
|
|
829
|
+
* @example
|
|
830
|
+
* // Send a 'jump' action with power data
|
|
831
|
+
* app.action('jump', { power: 100 });
|
|
832
|
+
*/
|
|
833
|
+
public action<TActionData = any>(action: AppActions, data?: TActionData) {
|
|
834
|
+
this.sendAction(action, data);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* Checks if an action is currently active
|
|
839
|
+
* @param {A} action - The action to check
|
|
840
|
+
* @returns {boolean} True if the action is active, false otherwise
|
|
841
|
+
* @example
|
|
842
|
+
* // Check if the 'run' action is active
|
|
843
|
+
* if (app.isActionActive('run')) {
|
|
844
|
+
* player.updateSpeed(runningSpeed);
|
|
845
|
+
* }
|
|
846
|
+
*/
|
|
847
|
+
public isActionActive(action: AppActions): boolean {
|
|
848
|
+
return this.actionsPlugin.getActions()[action as string] !== undefined;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* The built-in DataAdapter plugin (in-memory game data with optional
|
|
853
|
+
* localStorage backup). Routed through the plugin registry, not `store` —
|
|
854
|
+
* its API is richer than generic save/load.
|
|
855
|
+
*/
|
|
856
|
+
public get data(): IDataAdapter {
|
|
857
|
+
return this.getPlugin<IPlugin & IDataAdapter>('data');
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
protected async boot(config?: Partial<IApplicationOptions>): Promise<void> {
|
|
861
|
+
this.config = { ...defaultApplicationOptions, ...config };
|
|
862
|
+
await this.preInitialize(this.config);
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
protected async preInitialize(config: Partial<IApplicationOptions>): Promise<void> {
|
|
866
|
+
const { id } = config;
|
|
867
|
+
this._appName = id!;
|
|
868
|
+
|
|
869
|
+
if (isDev) {
|
|
870
|
+
await this.loadPlugin({
|
|
871
|
+
id: 'DevToolsPlugin',
|
|
872
|
+
module: () => import('../plugins/DevToolsPlugin'),
|
|
873
|
+
namedExport: 'DevToolsPlugin',
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
if (config.useLayout) {
|
|
878
|
+
await this.loadPlugin({
|
|
879
|
+
id: 'LayoutPlugin',
|
|
880
|
+
module: () => import('../plugins/LayoutPlugin'),
|
|
881
|
+
namedExport: 'LayoutPlugin',
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
await this.loadPlugin({
|
|
885
|
+
id: 'GSAPPlugin',
|
|
886
|
+
module: () => import('../plugins/GSAPPlugin'),
|
|
887
|
+
namedExport: 'GSAPPlugin',
|
|
888
|
+
});
|
|
889
|
+
if (config.useSpine) {
|
|
890
|
+
await this.loadPlugin({
|
|
891
|
+
id: 'SpinePlugin',
|
|
892
|
+
module: () => import('../plugins/spine/SpinePlugin'),
|
|
893
|
+
namedExport: 'SpinePlugin',
|
|
894
|
+
});
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
if (this.config.useStore) {
|
|
898
|
+
this._store = new Store();
|
|
899
|
+
this._store.initialize(this as unknown as IApplication);
|
|
900
|
+
// Register the built-in DataAdapter as a normal plugin so it lives in
|
|
901
|
+
// `_plugins` alongside everything else.
|
|
902
|
+
await this.loadPlugin({
|
|
903
|
+
id: 'data',
|
|
904
|
+
module: () => import('../plugins/DataAdapter'),
|
|
905
|
+
namedExport: 'DataAdapter',
|
|
906
|
+
options: this.config.data,
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
// plugins
|
|
912
|
+
protected async registerPlugin(plugin: IPlugin, options?: any) {
|
|
913
|
+
if (this._plugins.has(plugin.id)) {
|
|
914
|
+
Logger.warn(`Plugin with id "${plugin.id}" already registered. Not registering.`);
|
|
915
|
+
return plugin.initialize(options, this as unknown as IApplication);
|
|
916
|
+
}
|
|
917
|
+
plugin.registerCoreFunctions();
|
|
918
|
+
plugin.registerCoreSignals();
|
|
919
|
+
this._plugins.set(plugin.id, plugin);
|
|
920
|
+
try {
|
|
921
|
+
return await plugin.initialize(options, this as unknown as IApplication);
|
|
922
|
+
} catch (error) {
|
|
923
|
+
triggerViteError({
|
|
924
|
+
message: `Plugin "${plugin.id}" failed to initialize: ${error instanceof Error ? error.message : String(error)}`,
|
|
925
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
926
|
+
});
|
|
927
|
+
this.onPluginError.emit({ id: plugin.id, phase: 'initialize', error });
|
|
928
|
+
return undefined;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
protected async registerDefaultPlugins() {
|
|
933
|
+
for (let i = 0; i < defaultPlugins.length; i++) {
|
|
934
|
+
const listItem = defaultPlugins[i];
|
|
935
|
+
await this.loadPlugin(listItem, true);
|
|
936
|
+
}
|
|
937
|
+
const showStats = this.config.showStats === true || (isDev && this.config.showStats !== false);
|
|
938
|
+
if (showStats) {
|
|
939
|
+
await this.loadPlugin({
|
|
940
|
+
id: 'stats',
|
|
941
|
+
module: () => import('../plugins/StatsPlugin'),
|
|
942
|
+
namedExport: 'StatsPlugin',
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
if (this.config.useVoiceover) {
|
|
946
|
+
await this.loadPlugin({
|
|
947
|
+
id: 'voiceover',
|
|
948
|
+
module: () => import('../plugins/audio/VoiceOverPlugin'),
|
|
949
|
+
namedExport: 'VoiceOverPlugin',
|
|
950
|
+
options: this.config['voiceover' as keyof IApplicationOptions] || undefined,
|
|
951
|
+
});
|
|
952
|
+
await this.loadPlugin({
|
|
953
|
+
id: 'captions',
|
|
954
|
+
module: () => import('../plugins/captions/CaptionsPlugin'),
|
|
955
|
+
namedExport: 'CaptionsPlugin',
|
|
956
|
+
options: this.config['captions' as keyof IApplicationOptions] || undefined,
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
protected async registerPlugins() {
|
|
962
|
+
if (!this.plugins?.length) {
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// Topologically sort by `requires` so a plugin's dependencies always
|
|
967
|
+
// initialize first, regardless of the order in caper.config.ts. Fails
|
|
968
|
+
// bootstrap loudly on missing required plugins or dependency cycles —
|
|
969
|
+
// see Plugin docs for the rationale (we want the config file to be
|
|
970
|
+
// the single source of truth for active plugins, not auto-resolve).
|
|
971
|
+
const sorted = sortPluginsByRequires(this.plugins);
|
|
972
|
+
|
|
973
|
+
for (const p of sorted) {
|
|
974
|
+
if (p.autoLoad) {
|
|
975
|
+
await this.loadPlugin(p);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
/**
|
|
981
|
+
* This is called after the required assets are loaded
|
|
982
|
+
* You can be sure that all the assets on the assets.preload from caper.config are loaded
|
|
983
|
+
* @protected
|
|
984
|
+
*/
|
|
985
|
+
protected requiredAssetsLoaded(): Promise<void> | void;
|
|
986
|
+
|
|
987
|
+
protected async requiredAssetsLoaded(): Promise<void> {
|
|
988
|
+
// override me
|
|
989
|
+
}
|
|
990
|
+
/**
|
|
991
|
+
* This is called after the application is initialized
|
|
992
|
+
* You can be sure that
|
|
993
|
+
* - all plugins are registered
|
|
994
|
+
* - the store is created, with all storage adapters registered
|
|
995
|
+
* @protected
|
|
996
|
+
*/
|
|
997
|
+
protected setup(): Promise<void> | void;
|
|
998
|
+
|
|
999
|
+
protected async setup(): Promise<void> {
|
|
1000
|
+
// override me to set up application specific stuff
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
protected async initAssets(): Promise<void> {
|
|
1004
|
+
const opts: Partial<AssetInitOptions> = this.config.assets?.initOptions || {};
|
|
1005
|
+
let manifest = this.config.assets?.manifest || opts.manifest;
|
|
1006
|
+
if (isPromise(manifest)) {
|
|
1007
|
+
manifest = await manifest;
|
|
1008
|
+
}
|
|
1009
|
+
opts.manifest = manifest as AssetsManifest;
|
|
1010
|
+
opts.basePath = opts.basePath || './assets';
|
|
1011
|
+
await Assets.init(opts);
|
|
1012
|
+
/** @ts-expect-error manifest is not a public property */
|
|
1013
|
+
this.manifest = Assets.resolver._manifest;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
protected async loadDefaultScene(): Promise<void> {
|
|
1017
|
+
return this.scenes.loadDefaultScene();
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
private async _resize(): Promise<Size> {
|
|
1021
|
+
// Wait for DOM content to be loaded
|
|
1022
|
+
if (document.readyState !== 'complete') {
|
|
1023
|
+
await new Promise<void>((resolve) => {
|
|
1024
|
+
window.addEventListener('load', () => resolve(), { once: true });
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Add a small delay to ensure canvas dimensions are set
|
|
1029
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1030
|
+
|
|
1031
|
+
return new Promise((resolve) => {
|
|
1032
|
+
this.resizer.resize().then((size) => {
|
|
1033
|
+
this._center.set(size.width * 0.5, size.height * 0.5);
|
|
1034
|
+
|
|
1035
|
+
this.views.forEach((view) => {
|
|
1036
|
+
if (!view || !view.position) {
|
|
1037
|
+
return;
|
|
1038
|
+
}
|
|
1039
|
+
view.position.set(this._center.x, this._center.y);
|
|
1040
|
+
});
|
|
1041
|
+
this.onResize.emit(this.size);
|
|
1042
|
+
resolve(size);
|
|
1043
|
+
});
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
/**
|
|
1047
|
+
* Called after the application is initialized
|
|
1048
|
+
* Here we add application specific signal listeners, etc
|
|
1049
|
+
* @returns {Promise<void>}
|
|
1050
|
+
* @private
|
|
1051
|
+
*/
|
|
1052
|
+
private async _setup(): Promise<void> {
|
|
1053
|
+
// connect onResize signal
|
|
1054
|
+
this.webEvents.onResize.connect(this._resize, -1);
|
|
1055
|
+
|
|
1056
|
+
await this._resize();
|
|
1057
|
+
|
|
1058
|
+
if (this.scenes.splash?.view && this.scenes.splash.zOrder === 'bottom') {
|
|
1059
|
+
this._addSplash();
|
|
1060
|
+
}
|
|
1061
|
+
// scene manager
|
|
1062
|
+
this.scenes.view.label = 'SceneManager';
|
|
1063
|
+
this.stage.addChild(this.scenes.view);
|
|
1064
|
+
|
|
1065
|
+
if (this.scenes.splash?.view && this.scenes.splash.zOrder === 'top') {
|
|
1066
|
+
this._addSplash();
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
if (this.scenes.transition) {
|
|
1070
|
+
this.scenes.transition.label = 'Transition';
|
|
1071
|
+
this.stage.addChild(this.scenes.transition);
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
// popup manager
|
|
1075
|
+
this.stage.addChild(this.popups.view);
|
|
1076
|
+
|
|
1077
|
+
// focus manager
|
|
1078
|
+
this.focus.view.label = 'FocusManager';
|
|
1079
|
+
this.stage.addChild(this.focus.view);
|
|
1080
|
+
|
|
1081
|
+
// is touch device
|
|
1082
|
+
return Promise.resolve();
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
private _addSplash() {
|
|
1086
|
+
if (this.scenes.splash.view) {
|
|
1087
|
+
this.scenes.splash.view.label = 'Splash';
|
|
1088
|
+
this.stage.addChild(this.scenes.splash.view);
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
}
|