1681-engine 0.0.0-stage → 0.5.8
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/CHANGELOG.md +304 -0
- package/LICENSE +21 -0
- package/README.md +164 -2
- package/dist/1681-engine.js +417 -0
- package/dist/1681-engine.js.map +1 -0
- package/dist/ambient/ColorGrade.js +41 -0
- package/dist/ambient/ColorGrade.js.map +1 -0
- package/dist/ambient/DayClock.js +57 -0
- package/dist/ambient/DayClock.js.map +1 -0
- package/dist/ambient/WeatherLayer.js +91 -0
- package/dist/ambient/WeatherLayer.js.map +1 -0
- package/dist/ambient/grade.js +13 -0
- package/dist/ambient/grade.js.map +1 -0
- package/dist/ambient/weather.js +52 -0
- package/dist/ambient/weather.js.map +1 -0
- package/dist/anim/AnimStateMachine.js +164 -0
- package/dist/anim/AnimStateMachine.js.map +1 -0
- package/dist/anim/Animator.js +67 -0
- package/dist/anim/Animator.js.map +1 -0
- package/dist/anim/animStateCompile.js +113 -0
- package/dist/anim/animStateCompile.js.map +1 -0
- package/dist/anim/animStateSystem.js +17 -0
- package/dist/anim/animStateSystem.js.map +1 -0
- package/dist/anim/animationSystem.js +15 -0
- package/dist/anim/animationSystem.js.map +1 -0
- package/dist/anim/asepriteSlices.js +22 -0
- package/dist/anim/asepriteSlices.js.map +1 -0
- package/dist/anim/asepriteTags.js +35 -0
- package/dist/anim/asepriteTags.js.map +1 -0
- package/dist/anim/parseAseprite.js +83 -0
- package/dist/anim/parseAseprite.js.map +1 -0
- package/dist/assets/AssetLoader.js +104 -0
- package/dist/assets/AssetLoader.js.map +1 -0
- package/dist/assets/loadAseprite.js +50 -0
- package/dist/assets/loadAseprite.js.map +1 -0
- package/dist/assets/takeCleanerWorker-DTcI_Jqr.js +31 -0
- package/dist/assets/takeCleanerWorker-DTcI_Jqr.js.map +1 -0
- package/dist/audio/Footsteps.js +26 -0
- package/dist/audio/Footsteps.js.map +1 -0
- package/dist/audio/MusicPlayer.js +78 -0
- package/dist/audio/MusicPlayer.js.map +1 -0
- package/dist/audio/SoundEngine.js +119 -0
- package/dist/audio/SoundEngine.js.map +1 -0
- package/dist/audio/cleanTake.js +30 -0
- package/dist/audio/cleanTake.js.map +1 -0
- package/dist/audio/music/ElementVoice.js +35 -0
- package/dist/audio/music/ElementVoice.js.map +1 -0
- package/dist/audio/music/GraphVoice.js +39 -0
- package/dist/audio/music/GraphVoice.js.map +1 -0
- package/dist/audio/music/MusicChannel.js +58 -0
- package/dist/audio/music/MusicChannel.js.map +1 -0
- package/dist/audio/music/musicVoice.js +13 -0
- package/dist/audio/music/musicVoice.js.map +1 -0
- package/dist/audio/sampleBank.js +82 -0
- package/dist/audio/sampleBank.js.map +1 -0
- package/dist/audio/soundTable.js +9 -0
- package/dist/audio/soundTable.js.map +1 -0
- package/dist/audio/synth.js +36 -0
- package/dist/audio/synth.js.map +1 -0
- package/dist/core/BitmapLabel.js +49 -0
- package/dist/core/BitmapLabel.js.map +1 -0
- package/dist/core/Camera.js +150 -0
- package/dist/core/Camera.js.map +1 -0
- package/dist/core/Clock.js +30 -0
- package/dist/core/Clock.js.map +1 -0
- package/dist/core/Graphics.js +69 -0
- package/dist/core/Graphics.js.map +1 -0
- package/dist/core/Group.js +29 -0
- package/dist/core/Group.js.map +1 -0
- package/dist/core/Image.js +51 -0
- package/dist/core/Image.js.map +1 -0
- package/dist/core/ObjectFactory.js +55 -0
- package/dist/core/ObjectFactory.js.map +1 -0
- package/dist/core/Pointer.js +58 -0
- package/dist/core/Pointer.js.map +1 -0
- package/dist/core/Rectangle.js +51 -0
- package/dist/core/Rectangle.js.map +1 -0
- package/dist/core/Stage.js +86 -0
- package/dist/core/Stage.js.map +1 -0
- package/dist/core/Text.js +22 -0
- package/dist/core/Text.js.map +1 -0
- package/dist/core/TextureRegistry.js +111 -0
- package/dist/core/TextureRegistry.js.map +1 -0
- package/dist/core/Timeline.js +211 -0
- package/dist/core/Timeline.js.map +1 -0
- package/dist/core/TimelineBuilder.js +73 -0
- package/dist/core/TimelineBuilder.js.map +1 -0
- package/dist/core/TimelineChild.js +84 -0
- package/dist/core/TimelineChild.js.map +1 -0
- package/dist/core/Tweener.js +136 -0
- package/dist/core/Tweener.js.map +1 -0
- package/dist/core/atlas.js +38 -0
- package/dist/core/atlas.js.map +1 -0
- package/dist/core/atlasPlan.js +22 -0
- package/dist/core/atlasPlan.js.map +1 -0
- package/dist/core/eases.js +21 -0
- package/dist/core/eases.js.map +1 -0
- package/dist/core/gameObject.js +115 -0
- package/dist/core/gameObject.js.map +1 -0
- package/dist/core/pixiPatches.js +18 -0
- package/dist/core/pixiPatches.js.map +1 -0
- package/dist/core/timelinePlace.js +24 -0
- package/dist/core/timelinePlace.js.map +1 -0
- package/dist/core/tweenProps.js +12 -0
- package/dist/core/tweenProps.js.map +1 -0
- package/dist/debug/DebugOverlay.js +94 -0
- package/dist/debug/DebugOverlay.js.map +1 -0
- package/dist/debug/DrawCallCounter.js +41 -0
- package/dist/debug/DrawCallCounter.js.map +1 -0
- package/dist/debug/ErrorLog.js +22 -0
- package/dist/debug/ErrorLog.js.map +1 -0
- package/dist/debug/FrameStats.js +42 -0
- package/dist/debug/FrameStats.js.map +1 -0
- package/dist/debug/inspectWorld.js +29 -0
- package/dist/debug/inspectWorld.js.map +1 -0
- package/dist/diagnostics/ErrorDeduper.js +27 -0
- package/dist/diagnostics/ErrorDeduper.js.map +1 -0
- package/dist/diagnostics/FrameSampler.js +42 -0
- package/dist/diagnostics/FrameSampler.js.map +1 -0
- package/dist/diagnostics/bootWatch.js +21 -0
- package/dist/diagnostics/bootWatch.js.map +1 -0
- package/dist/diagnostics/captureErrors.js +27 -0
- package/dist/diagnostics/captureErrors.js.map +1 -0
- package/dist/diagnostics/contextLoss.js +25 -0
- package/dist/diagnostics/contextLoss.js.map +1 -0
- package/dist/diagnostics/frameStats.js +31 -0
- package/dist/diagnostics/frameStats.js.map +1 -0
- package/dist/diagnostics/gpuInfo.js +22 -0
- package/dist/diagnostics/gpuInfo.js.map +1 -0
- package/dist/diagnostics/renderGuard.js +24 -0
- package/dist/diagnostics/renderGuard.js.map +1 -0
- package/dist/ecs/SparseSet.js +55 -0
- package/dist/ecs/SparseSet.js.map +1 -0
- package/dist/ecs/World.js +307 -0
- package/dist/ecs/World.js.map +1 -0
- package/dist/ecs/fields.js +26 -0
- package/dist/ecs/fields.js.map +1 -0
- package/dist/engine/Engine.js +82 -0
- package/dist/engine/Engine.js.map +1 -0
- package/dist/engine/FixedLoop.js +37 -0
- package/dist/engine/FixedLoop.js.map +1 -0
- package/dist/engine/Scene.js +79 -0
- package/dist/engine/Scene.js.map +1 -0
- package/dist/engine/SceneManager.js +73 -0
- package/dist/engine/SceneManager.js.map +1 -0
- package/dist/events/EventBus.js +42 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/fx/FloatingText.js +72 -0
- package/dist/fx/FloatingText.js.map +1 -0
- package/dist/fx/hitStop.js +28 -0
- package/dist/fx/hitStop.js.map +1 -0
- package/dist/fx/viewCull.js +10 -0
- package/dist/fx/viewCull.js.map +1 -0
- package/dist/i18n/Translator.js +72 -0
- package/dist/i18n/Translator.js.map +1 -0
- package/dist/i18n/extractStrings.js +58 -0
- package/dist/i18n/extractStrings.js.map +1 -0
- package/dist/i18n/formatMessage.js +19 -0
- package/dist/i18n/formatMessage.js.map +1 -0
- package/dist/input/Actions.js +131 -0
- package/dist/input/Actions.js.map +1 -0
- package/dist/input/AimGesture.js +75 -0
- package/dist/input/AimGesture.js.map +1 -0
- package/dist/input/Keyboard.js +54 -0
- package/dist/input/Keyboard.js.map +1 -0
- package/dist/input/Keymap.js +171 -0
- package/dist/input/Keymap.js.map +1 -0
- package/dist/input/TargetLock.js +73 -0
- package/dist/input/TargetLock.js.map +1 -0
- package/dist/input/aimAxis.js +8 -0
- package/dist/input/aimAxis.js.map +1 -0
- package/dist/input/keyChord.js +29 -0
- package/dist/input/keyChord.js.map +1 -0
- package/dist/input/longPress.js +32 -0
- package/dist/input/longPress.js.map +1 -0
- package/dist/input/stickAxis.js +23 -0
- package/dist/input/stickAxis.js.map +1 -0
- package/dist/input/touchDetect.js +7 -0
- package/dist/input/touchDetect.js.map +1 -0
- package/dist/light/LightLayer.js +84 -0
- package/dist/light/LightLayer.js.map +1 -0
- package/dist/nav/MinHeap.js +39 -0
- package/dist/nav/MinHeap.js.map +1 -0
- package/dist/nav/findPath.js +78 -0
- package/dist/nav/findPath.js.map +1 -0
- package/dist/nav/navGrid.js +36 -0
- package/dist/nav/navGrid.js.map +1 -0
- package/dist/nav/nearestOpen.js +19 -0
- package/dist/nav/nearestOpen.js.map +1 -0
- package/dist/nav/straightenPath.js +51 -0
- package/dist/nav/straightenPath.js.map +1 -0
- package/dist/net/Connection.js +84 -0
- package/dist/net/Connection.js.map +1 -0
- package/dist/net/InterpolationBuffer.js +57 -0
- package/dist/net/InterpolationBuffer.js.map +1 -0
- package/dist/net/PredictedMover.js +61 -0
- package/dist/net/PredictedMover.js.map +1 -0
- package/dist/net/Room.js +92 -0
- package/dist/net/Room.js.map +1 -0
- package/dist/net/RoomHost.js +101 -0
- package/dist/net/RoomHost.js.map +1 -0
- package/dist/net/cadence.js +22 -0
- package/dist/net/cadence.js.map +1 -0
- package/dist/net/constants.js +11 -0
- package/dist/net/constants.js.map +1 -0
- package/dist/net/lobby/LobbyClient.js +124 -0
- package/dist/net/lobby/LobbyClient.js.map +1 -0
- package/dist/net/lobby/LobbyHost.js +366 -0
- package/dist/net/lobby/LobbyHost.js.map +1 -0
- package/dist/net/lobby/LobbyRooms.js +66 -0
- package/dist/net/lobby/LobbyRooms.js.map +1 -0
- package/dist/net/lobby/Matchmaker.js +106 -0
- package/dist/net/lobby/Matchmaker.js.map +1 -0
- package/dist/net/movement.js +83 -0
- package/dist/net/movement.js.map +1 -0
- package/dist/net/protocol.js +11 -0
- package/dist/net/protocol.js.map +1 -0
- package/dist/net/serverClock.js +22 -0
- package/dist/net/serverClock.js.map +1 -0
- package/dist/net/snapshotCodec.js +92 -0
- package/dist/net/snapshotCodec.js.map +1 -0
- package/dist/parallax/Parallax.js +32 -0
- package/dist/parallax/Parallax.js.map +1 -0
- package/dist/parallax/ParallaxLayer.js +70 -0
- package/dist/parallax/ParallaxLayer.js.map +1 -0
- package/dist/parallax/parallaxMath.js +27 -0
- package/dist/parallax/parallaxMath.js.map +1 -0
- package/dist/particles/Emitter.js +108 -0
- package/dist/particles/Emitter.js.map +1 -0
- package/dist/particles/ParticleBudget.js +32 -0
- package/dist/particles/ParticleBudget.js.map +1 -0
- package/dist/particles/ParticleSim.js +60 -0
- package/dist/particles/ParticleSim.js.map +1 -0
- package/dist/particles/particleCurves.js +48 -0
- package/dist/particles/particleCurves.js.map +1 -0
- package/dist/particles/particleSampling.js +30 -0
- package/dist/particles/particleSampling.js.map +1 -0
- package/dist/physics/Body.js +202 -0
- package/dist/physics/Body.js.map +1 -0
- package/dist/physics/BroadPhase.js +56 -0
- package/dist/physics/BroadPhase.js.map +1 -0
- package/dist/physics/Contact.js +76 -0
- package/dist/physics/Contact.js.map +1 -0
- package/dist/physics/ContactSolver.js +70 -0
- package/dist/physics/ContactSolver.js.map +1 -0
- package/dist/physics/PhysicsWorld.js +221 -0
- package/dist/physics/PhysicsWorld.js.map +1 -0
- package/dist/physics/SpatialHash.js +39 -0
- package/dist/physics/SpatialHash.js.map +1 -0
- package/dist/physics/collide.js +76 -0
- package/dist/physics/collide.js.map +1 -0
- package/dist/physics/collidePolygon.js +94 -0
- package/dist/physics/collidePolygon.js.map +1 -0
- package/dist/physics/contactReport.js +14 -0
- package/dist/physics/contactReport.js.map +1 -0
- package/dist/physics/drawColliders.js +31 -0
- package/dist/physics/drawColliders.js.map +1 -0
- package/dist/physics/physicsSystem.js +8 -0
- package/dist/physics/physicsSystem.js.map +1 -0
- package/dist/physics/polygon.js +80 -0
- package/dist/physics/polygon.js.map +1 -0
- package/dist/physics/raycast.js +62 -0
- package/dist/physics/raycast.js.map +1 -0
- package/dist/physics/syncToBody.js +19 -0
- package/dist/physics/syncToBody.js.map +1 -0
- package/dist/physics/tileBodies.js +59 -0
- package/dist/physics/tileBodies.js.map +1 -0
- package/dist/physics/types.js +8 -0
- package/dist/physics/types.js.map +1 -0
- package/dist/pixel/Darkness.js +166 -0
- package/dist/pixel/Darkness.js.map +1 -0
- package/dist/pixel/DitherVignette.js +57 -0
- package/dist/pixel/DitherVignette.js.map +1 -0
- package/dist/pixel/Evaporation.js +85 -0
- package/dist/pixel/Evaporation.js.map +1 -0
- package/dist/pixel/NightShade.js +34 -0
- package/dist/pixel/NightShade.js.map +1 -0
- package/dist/pixel/PixelLayer.js +211 -0
- package/dist/pixel/PixelLayer.js.map +1 -0
- package/dist/pixel/SwayProp.js +75 -0
- package/dist/pixel/SwayProp.js.map +1 -0
- package/dist/pixel/lights.js +44 -0
- package/dist/pixel/lights.js.map +1 -0
- package/dist/pixel/nineSlice.js +62 -0
- package/dist/pixel/nineSlice.js.map +1 -0
- package/dist/pixel/paintLayer.js +36 -0
- package/dist/pixel/paintLayer.js.map +1 -0
- package/dist/pixel/palette.js +57 -0
- package/dist/pixel/palette.js.map +1 -0
- package/dist/pixel/pixel.js +278 -0
- package/dist/pixel/pixel.js.map +1 -0
- package/dist/pixel/pixelPaint.js +194 -0
- package/dist/pixel/pixelPaint.js.map +1 -0
- package/dist/pixel/pixelTone.js +164 -0
- package/dist/pixel/pixelTone.js.map +1 -0
- package/dist/pixel/propKit.js +41 -0
- package/dist/pixel/propKit.js.map +1 -0
- package/dist/pixel/ramp.js +102 -0
- package/dist/pixel/ramp.js.map +1 -0
- package/dist/pixel/selout.js +35 -0
- package/dist/pixel/selout.js.map +1 -0
- package/dist/pixel/spritePixels.js +59 -0
- package/dist/pixel/spritePixels.js.map +1 -0
- package/dist/pixel/swayRig.js +87 -0
- package/dist/pixel/swayRig.js.map +1 -0
- package/dist/pixel/vignetteMask.js +24 -0
- package/dist/pixel/vignetteMask.js.map +1 -0
- package/dist/pixel/weatherArt.js +61 -0
- package/dist/pixel/weatherArt.js.map +1 -0
- package/dist/pixel.js +90 -0
- package/dist/pixel.js.map +1 -0
- package/dist/platform/touch.js +33 -0
- package/dist/platform/touch.js.map +1 -0
- package/dist/postfx/BloomFilter.js +65 -0
- package/dist/postfx/BloomFilter.js.map +1 -0
- package/dist/postfx/ChromaticAberrationFilter.js +25 -0
- package/dist/postfx/ChromaticAberrationFilter.js.map +1 -0
- package/dist/postfx/ColorAdjustFilter.js +76 -0
- package/dist/postfx/ColorAdjustFilter.js.map +1 -0
- package/dist/postfx/CrtFilter.js +42 -0
- package/dist/postfx/CrtFilter.js.map +1 -0
- package/dist/postfx/PixelateFilter.js +27 -0
- package/dist/postfx/PixelateFilter.js.map +1 -0
- package/dist/postfx/PostFx.js +123 -0
- package/dist/postfx/PostFx.js.map +1 -0
- package/dist/postfx/ShockwaveFilter.js +49 -0
- package/dist/postfx/ShockwaveFilter.js.map +1 -0
- package/dist/postfx/VignetteFilter.js +37 -0
- package/dist/postfx/VignetteFilter.js.map +1 -0
- package/dist/postfx/fxAnimator.js +38 -0
- package/dist/postfx/fxAnimator.js.map +1 -0
- package/dist/postfx/fxShader.js +128 -0
- package/dist/postfx/fxShader.js.map +1 -0
- package/dist/postfx.js +26 -0
- package/dist/postfx.js.map +1 -0
- package/dist/react/ChoiceDialog.js +51 -0
- package/dist/react/ChoiceDialog.js.map +1 -0
- package/dist/react/ConfirmDialog.js +53 -0
- package/dist/react/ConfirmDialog.js.map +1 -0
- package/dist/react/Glyph.js +63 -0
- package/dist/react/Glyph.js.map +1 -0
- package/dist/react/Modal.js +38 -0
- package/dist/react/Modal.js.map +1 -0
- package/dist/react/Panel.js +24 -0
- package/dist/react/Panel.js.map +1 -0
- package/dist/react/PixelImage.js +24 -0
- package/dist/react/PixelImage.js.map +1 -0
- package/dist/react/Select.js +99 -0
- package/dist/react/Select.js.map +1 -0
- package/dist/react/Slider.js +62 -0
- package/dist/react/Slider.js.map +1 -0
- package/dist/react/SplitPane.js +24 -0
- package/dist/react/SplitPane.js.map +1 -0
- package/dist/react/TabStrip.js +32 -0
- package/dist/react/TabStrip.js.map +1 -0
- package/dist/react/TitleTips.js +42 -0
- package/dist/react/TitleTips.js.map +1 -0
- package/dist/react/Tooltip.js +28 -0
- package/dist/react/Tooltip.js.map +1 -0
- package/dist/react/UiProvider.js +50 -0
- package/dist/react/UiProvider.js.map +1 -0
- package/dist/react/baseCss.js +222 -0
- package/dist/react/baseCss.js.map +1 -0
- package/dist/react/choiceStore.js +23 -0
- package/dist/react/choiceStore.js.map +1 -0
- package/dist/react/classNames.js +19 -0
- package/dist/react/classNames.js.map +1 -0
- package/dist/react/confirmStore.js +30 -0
- package/dist/react/confirmStore.js.map +1 -0
- package/dist/react/labels.js +18 -0
- package/dist/react/labels.js.map +1 -0
- package/dist/react/placement.js +49 -0
- package/dist/react/placement.js.map +1 -0
- package/dist/react/useFillSheet.js +23 -0
- package/dist/react/useFillSheet.js.map +1 -0
- package/dist/react/useFitToViewport.js +29 -0
- package/dist/react/useFitToViewport.js.map +1 -0
- package/dist/react/usePicked.js +13 -0
- package/dist/react/usePicked.js.map +1 -0
- package/dist/react/useStore.js +9 -0
- package/dist/react/useStore.js.map +1 -0
- package/dist/react/useViewport.js +17 -0
- package/dist/react/useViewport.js.map +1 -0
- package/dist/react.js +78 -0
- package/dist/react.js.map +1 -0
- package/dist/rig/PosePlayer.js +92 -0
- package/dist/rig/PosePlayer.js.map +1 -0
- package/dist/rig/RigView.js +125 -0
- package/dist/rig/RigView.js.map +1 -0
- package/dist/rig/Skeleton.js +31 -0
- package/dist/rig/Skeleton.js.map +1 -0
- package/dist/rig/humanoid.js +6 -0
- package/dist/rig/humanoid.js.map +1 -0
- package/dist/rig/humanoid.json.js +30 -0
- package/dist/rig/humanoid.json.js.map +1 -0
- package/dist/rig/humanoidPoses.js +30 -0
- package/dist/rig/humanoidPoses.js.map +1 -0
- package/dist/rig/poseMath.js +54 -0
- package/dist/rig/poseMath.js.map +1 -0
- package/dist/rig/poses.json.js +150 -0
- package/dist/rig/poses.json.js.map +1 -0
- package/dist/save/Autosaver.js +54 -0
- package/dist/save/Autosaver.js.map +1 -0
- package/dist/save/MemoryBackend.js +19 -0
- package/dist/save/MemoryBackend.js.map +1 -0
- package/dist/save/SaveStore.js +103 -0
- package/dist/save/SaveStore.js.map +1 -0
- package/dist/save/WebStorageBackend.js +27 -0
- package/dist/save/WebStorageBackend.js.map +1 -0
- package/dist/save/checksum.js +10 -0
- package/dist/save/checksum.js.map +1 -0
- package/dist/save/migrateSave.js +27 -0
- package/dist/save/migrateSave.js.map +1 -0
- package/dist/settings.js +27 -0
- package/dist/settings.js.map +1 -0
- package/dist/tilemap/TilemapView.js +69 -0
- package/dist/tilemap/TilemapView.js.map +1 -0
- package/dist/tilemap/collision.js +25 -0
- package/dist/tilemap/collision.js.map +1 -0
- package/dist/tilemap/tiled.js +138 -0
- package/dist/tilemap/tiled.js.map +1 -0
- package/dist/transitions/CrossfadeTransition.js +24 -0
- package/dist/transitions/CrossfadeTransition.js.map +1 -0
- package/dist/transitions/DitherWipeTransition.js +70 -0
- package/dist/transitions/DitherWipeTransition.js.map +1 -0
- package/dist/transitions/FadeTransition.js +34 -0
- package/dist/transitions/FadeTransition.js.map +1 -0
- package/dist/transitions/Letterbox.js +42 -0
- package/dist/transitions/Letterbox.js.map +1 -0
- package/dist/transitions/ditherMask.js +15 -0
- package/dist/transitions/ditherMask.js.map +1 -0
- package/dist/transitions/transitionTo.js +28 -0
- package/dist/transitions/transitionTo.js.map +1 -0
- package/dist/transitions/tweenDone.js +15 -0
- package/dist/transitions/tweenDone.js.map +1 -0
- package/dist/types/ambient/ColorGrade.d.ts +41 -0
- package/dist/types/ambient/ColorGrade.d.ts.map +1 -0
- package/dist/types/ambient/DayClock.d.ts +80 -0
- package/dist/types/ambient/DayClock.d.ts.map +1 -0
- package/dist/types/ambient/WeatherLayer.d.ts +78 -0
- package/dist/types/ambient/WeatherLayer.d.ts.map +1 -0
- package/dist/types/ambient/grade.d.ts +22 -0
- package/dist/types/ambient/grade.d.ts.map +1 -0
- package/dist/types/ambient/weather.d.ts +49 -0
- package/dist/types/ambient/weather.d.ts.map +1 -0
- package/dist/types/anim/AnimStateMachine.d.ts +80 -0
- package/dist/types/anim/AnimStateMachine.d.ts.map +1 -0
- package/dist/types/anim/Animator.d.ts +50 -0
- package/dist/types/anim/Animator.d.ts.map +1 -0
- package/dist/types/anim/animStateCompile.d.ts +52 -0
- package/dist/types/anim/animStateCompile.d.ts.map +1 -0
- package/dist/types/anim/animStateSystem.d.ts +10 -0
- package/dist/types/anim/animStateSystem.d.ts.map +1 -0
- package/dist/types/anim/animStateTypes.d.ts +50 -0
- package/dist/types/anim/animStateTypes.d.ts.map +1 -0
- package/dist/types/anim/animationSystem.d.ts +13 -0
- package/dist/types/anim/animationSystem.d.ts.map +1 -0
- package/dist/types/anim/asepriteSlices.d.ts +19 -0
- package/dist/types/anim/asepriteSlices.d.ts.map +1 -0
- package/dist/types/anim/asepriteTags.d.ts +16 -0
- package/dist/types/anim/asepriteTags.d.ts.map +1 -0
- package/dist/types/anim/asepriteTypes.d.ts +159 -0
- package/dist/types/anim/asepriteTypes.d.ts.map +1 -0
- package/dist/types/anim/parseAseprite.d.ts +21 -0
- package/dist/types/anim/parseAseprite.d.ts.map +1 -0
- package/dist/types/assets/AssetLoader.d.ts +85 -0
- package/dist/types/assets/AssetLoader.d.ts.map +1 -0
- package/dist/types/assets/loadAseprite.d.ts +27 -0
- package/dist/types/assets/loadAseprite.d.ts.map +1 -0
- package/dist/types/audio/Footsteps.d.ts +33 -0
- package/dist/types/audio/Footsteps.d.ts.map +1 -0
- package/dist/types/audio/MusicPlayer.d.ts +65 -0
- package/dist/types/audio/MusicPlayer.d.ts.map +1 -0
- package/dist/types/audio/SoundEngine.d.ts +42 -0
- package/dist/types/audio/SoundEngine.d.ts.map +1 -0
- package/dist/types/audio/cleanTake.d.ts +3 -0
- package/dist/types/audio/cleanTake.d.ts.map +1 -0
- package/dist/types/audio/music/ElementVoice.d.ts +14 -0
- package/dist/types/audio/music/ElementVoice.d.ts.map +1 -0
- package/dist/types/audio/music/GraphVoice.d.ts +22 -0
- package/dist/types/audio/music/GraphVoice.d.ts.map +1 -0
- package/dist/types/audio/music/MusicChannel.d.ts +35 -0
- package/dist/types/audio/music/MusicChannel.d.ts.map +1 -0
- package/dist/types/audio/music/musicVoice.d.ts +26 -0
- package/dist/types/audio/music/musicVoice.d.ts.map +1 -0
- package/dist/types/audio/sampleBank.d.ts +27 -0
- package/dist/types/audio/sampleBank.d.ts.map +1 -0
- package/dist/types/audio/soundTable.d.ts +14 -0
- package/dist/types/audio/soundTable.d.ts.map +1 -0
- package/dist/types/audio/synth.d.ts +34 -0
- package/dist/types/audio/synth.d.ts.map +1 -0
- package/dist/types/audio/takeCleanerWorker.d.ts +2 -0
- package/dist/types/audio/takeCleanerWorker.d.ts.map +1 -0
- package/dist/types/core/BitmapLabel.d.ts +36 -0
- package/dist/types/core/BitmapLabel.d.ts.map +1 -0
- package/dist/types/core/Camera.d.ts +115 -0
- package/dist/types/core/Camera.d.ts.map +1 -0
- package/dist/types/core/Clock.d.ts +11 -0
- package/dist/types/core/Clock.d.ts.map +1 -0
- package/dist/types/core/Graphics.d.ts +37 -0
- package/dist/types/core/Graphics.d.ts.map +1 -0
- package/dist/types/core/Group.d.ts +15 -0
- package/dist/types/core/Group.d.ts.map +1 -0
- package/dist/types/core/Image.d.ts +25 -0
- package/dist/types/core/Image.d.ts.map +1 -0
- package/dist/types/core/ObjectFactory.d.ts +34 -0
- package/dist/types/core/ObjectFactory.d.ts.map +1 -0
- package/dist/types/core/Pointer.d.ts +27 -0
- package/dist/types/core/Pointer.d.ts.map +1 -0
- package/dist/types/core/Rectangle.d.ts +26 -0
- package/dist/types/core/Rectangle.d.ts.map +1 -0
- package/dist/types/core/Stage.d.ts +58 -0
- package/dist/types/core/Stage.d.ts.map +1 -0
- package/dist/types/core/Text.d.ts +22 -0
- package/dist/types/core/Text.d.ts.map +1 -0
- package/dist/types/core/TextureRegistry.d.ts +51 -0
- package/dist/types/core/TextureRegistry.d.ts.map +1 -0
- package/dist/types/core/Timeline.d.ts +115 -0
- package/dist/types/core/Timeline.d.ts.map +1 -0
- package/dist/types/core/TimelineBuilder.d.ts +53 -0
- package/dist/types/core/TimelineBuilder.d.ts.map +1 -0
- package/dist/types/core/TimelineChild.d.ts +51 -0
- package/dist/types/core/TimelineChild.d.ts.map +1 -0
- package/dist/types/core/Tweener.d.ts +70 -0
- package/dist/types/core/Tweener.d.ts.map +1 -0
- package/dist/types/core/atlas.d.ts +16 -0
- package/dist/types/core/atlas.d.ts.map +1 -0
- package/dist/types/core/atlasPlan.d.ts +34 -0
- package/dist/types/core/atlasPlan.d.ts.map +1 -0
- package/dist/types/core/eases.d.ts +3 -0
- package/dist/types/core/eases.d.ts.map +1 -0
- package/dist/types/core/gameObject.d.ts +42 -0
- package/dist/types/core/gameObject.d.ts.map +1 -0
- package/dist/types/core/pixiPatches.d.ts +9 -0
- package/dist/types/core/pixiPatches.d.ts.map +1 -0
- package/dist/types/core/timelinePlace.d.ts +23 -0
- package/dist/types/core/timelinePlace.d.ts.map +1 -0
- package/dist/types/core/tweenProps.d.ts +8 -0
- package/dist/types/core/tweenProps.d.ts.map +1 -0
- package/dist/types/core/types.d.ts +4 -0
- package/dist/types/core/types.d.ts.map +1 -0
- package/dist/types/debug/DebugOverlay.d.ts +63 -0
- package/dist/types/debug/DebugOverlay.d.ts.map +1 -0
- package/dist/types/debug/DrawCallCounter.d.ts +20 -0
- package/dist/types/debug/DrawCallCounter.d.ts.map +1 -0
- package/dist/types/debug/ErrorLog.d.ts +20 -0
- package/dist/types/debug/ErrorLog.d.ts.map +1 -0
- package/dist/types/debug/FrameStats.d.ts +21 -0
- package/dist/types/debug/FrameStats.d.ts.map +1 -0
- package/dist/types/debug/inspectWorld.d.ts +14 -0
- package/dist/types/debug/inspectWorld.d.ts.map +1 -0
- package/dist/types/diagnostics/ErrorDeduper.d.ts +17 -0
- package/dist/types/diagnostics/ErrorDeduper.d.ts.map +1 -0
- package/dist/types/diagnostics/FrameSampler.d.ts +37 -0
- package/dist/types/diagnostics/FrameSampler.d.ts.map +1 -0
- package/dist/types/diagnostics/bootWatch.d.ts +25 -0
- package/dist/types/diagnostics/bootWatch.d.ts.map +1 -0
- package/dist/types/diagnostics/captureErrors.d.ts +24 -0
- package/dist/types/diagnostics/captureErrors.d.ts.map +1 -0
- package/dist/types/diagnostics/contextLoss.d.ts +35 -0
- package/dist/types/diagnostics/contextLoss.d.ts.map +1 -0
- package/dist/types/diagnostics/frameStats.d.ts +30 -0
- package/dist/types/diagnostics/frameStats.d.ts.map +1 -0
- package/dist/types/diagnostics/gpuInfo.d.ts +9 -0
- package/dist/types/diagnostics/gpuInfo.d.ts.map +1 -0
- package/dist/types/diagnostics/renderGuard.d.ts +12 -0
- package/dist/types/diagnostics/renderGuard.d.ts.map +1 -0
- package/dist/types/ecs/SparseSet.d.ts +25 -0
- package/dist/types/ecs/SparseSet.d.ts.map +1 -0
- package/dist/types/ecs/World.d.ts +137 -0
- package/dist/types/ecs/World.d.ts.map +1 -0
- package/dist/types/ecs/fields.d.ts +34 -0
- package/dist/types/ecs/fields.d.ts.map +1 -0
- package/dist/types/engine/Engine.d.ts +80 -0
- package/dist/types/engine/Engine.d.ts.map +1 -0
- package/dist/types/engine/FixedLoop.d.ts +32 -0
- package/dist/types/engine/FixedLoop.d.ts.map +1 -0
- package/dist/types/engine/Scene.d.ts +67 -0
- package/dist/types/engine/Scene.d.ts.map +1 -0
- package/dist/types/engine/SceneManager.d.ts +36 -0
- package/dist/types/engine/SceneManager.d.ts.map +1 -0
- package/dist/types/events/EventBus.d.ts +20 -0
- package/dist/types/events/EventBus.d.ts.map +1 -0
- package/dist/types/fx/FloatingText.d.ts +71 -0
- package/dist/types/fx/FloatingText.d.ts.map +1 -0
- package/dist/types/fx/hitStop.d.ts +20 -0
- package/dist/types/fx/hitStop.d.ts.map +1 -0
- package/dist/types/fx/viewCull.d.ts +14 -0
- package/dist/types/fx/viewCull.d.ts.map +1 -0
- package/dist/types/i18n/Translator.d.ts +52 -0
- package/dist/types/i18n/Translator.d.ts.map +1 -0
- package/dist/types/i18n/extractStrings.d.ts +25 -0
- package/dist/types/i18n/extractStrings.d.ts.map +1 -0
- package/dist/types/i18n/formatMessage.d.ts +10 -0
- package/dist/types/i18n/formatMessage.d.ts.map +1 -0
- package/dist/types/index.d.ts +149 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/input/Actions.d.ts +94 -0
- package/dist/types/input/Actions.d.ts.map +1 -0
- package/dist/types/input/AimGesture.d.ts +106 -0
- package/dist/types/input/AimGesture.d.ts.map +1 -0
- package/dist/types/input/Keyboard.d.ts +30 -0
- package/dist/types/input/Keyboard.d.ts.map +1 -0
- package/dist/types/input/Keymap.d.ts +85 -0
- package/dist/types/input/Keymap.d.ts.map +1 -0
- package/dist/types/input/TargetLock.d.ts +56 -0
- package/dist/types/input/TargetLock.d.ts.map +1 -0
- package/dist/types/input/aimAxis.d.ts +9 -0
- package/dist/types/input/aimAxis.d.ts.map +1 -0
- package/dist/types/input/keyChord.d.ts +15 -0
- package/dist/types/input/keyChord.d.ts.map +1 -0
- package/dist/types/input/longPress.d.ts +21 -0
- package/dist/types/input/longPress.d.ts.map +1 -0
- package/dist/types/input/stickAxis.d.ts +26 -0
- package/dist/types/input/stickAxis.d.ts.map +1 -0
- package/dist/types/input/touchDetect.d.ts +18 -0
- package/dist/types/input/touchDetect.d.ts.map +1 -0
- package/dist/types/light/LightLayer.d.ts +65 -0
- package/dist/types/light/LightLayer.d.ts.map +1 -0
- package/dist/types/nav/MinHeap.d.ts +15 -0
- package/dist/types/nav/MinHeap.d.ts.map +1 -0
- package/dist/types/nav/findPath.d.ts +38 -0
- package/dist/types/nav/findPath.d.ts.map +1 -0
- package/dist/types/nav/navGrid.d.ts +48 -0
- package/dist/types/nav/navGrid.d.ts.map +1 -0
- package/dist/types/nav/nearestOpen.d.ts +8 -0
- package/dist/types/nav/nearestOpen.d.ts.map +1 -0
- package/dist/types/nav/straightenPath.d.ts +13 -0
- package/dist/types/nav/straightenPath.d.ts.map +1 -0
- package/dist/types/net/Connection.d.ts +66 -0
- package/dist/types/net/Connection.d.ts.map +1 -0
- package/dist/types/net/InterpolationBuffer.d.ts +36 -0
- package/dist/types/net/InterpolationBuffer.d.ts.map +1 -0
- package/dist/types/net/PredictedMover.d.ts +43 -0
- package/dist/types/net/PredictedMover.d.ts.map +1 -0
- package/dist/types/net/Room.d.ts +69 -0
- package/dist/types/net/Room.d.ts.map +1 -0
- package/dist/types/net/RoomHost.d.ts +74 -0
- package/dist/types/net/RoomHost.d.ts.map +1 -0
- package/dist/types/net/cadence.d.ts +22 -0
- package/dist/types/net/cadence.d.ts.map +1 -0
- package/dist/types/net/constants.d.ts +24 -0
- package/dist/types/net/constants.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyClient.d.ts +107 -0
- package/dist/types/net/lobby/LobbyClient.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyHost.d.ts +147 -0
- package/dist/types/net/lobby/LobbyHost.d.ts.map +1 -0
- package/dist/types/net/lobby/LobbyRooms.d.ts +56 -0
- package/dist/types/net/lobby/LobbyRooms.d.ts.map +1 -0
- package/dist/types/net/lobby/Matchmaker.d.ts +57 -0
- package/dist/types/net/lobby/Matchmaker.d.ts.map +1 -0
- package/dist/types/net/lobby/index.d.ts +6 -0
- package/dist/types/net/lobby/index.d.ts.map +1 -0
- package/dist/types/net/lobby/lobbyProtocol.d.ts +143 -0
- package/dist/types/net/lobby/lobbyProtocol.d.ts.map +1 -0
- package/dist/types/net/movement.d.ts +50 -0
- package/dist/types/net/movement.d.ts.map +1 -0
- package/dist/types/net/protocol.d.ts +59 -0
- package/dist/types/net/protocol.d.ts.map +1 -0
- package/dist/types/net/serverClock.d.ts +14 -0
- package/dist/types/net/serverClock.d.ts.map +1 -0
- package/dist/types/net/snapshotCodec.d.ts +55 -0
- package/dist/types/net/snapshotCodec.d.ts.map +1 -0
- package/dist/types/parallax/Parallax.d.ts +37 -0
- package/dist/types/parallax/Parallax.d.ts.map +1 -0
- package/dist/types/parallax/ParallaxLayer.d.ts +80 -0
- package/dist/types/parallax/ParallaxLayer.d.ts.map +1 -0
- package/dist/types/parallax/parallaxMath.d.ts +50 -0
- package/dist/types/parallax/parallaxMath.d.ts.map +1 -0
- package/dist/types/particles/Emitter.d.ts +97 -0
- package/dist/types/particles/Emitter.d.ts.map +1 -0
- package/dist/types/particles/ParticleBudget.d.ts +28 -0
- package/dist/types/particles/ParticleBudget.d.ts.map +1 -0
- package/dist/types/particles/ParticleSim.d.ts +38 -0
- package/dist/types/particles/ParticleSim.d.ts.map +1 -0
- package/dist/types/particles/particleCurves.d.ts +21 -0
- package/dist/types/particles/particleCurves.d.ts.map +1 -0
- package/dist/types/particles/particleSampling.d.ts +20 -0
- package/dist/types/particles/particleSampling.d.ts.map +1 -0
- package/dist/types/physics/Body.d.ts +130 -0
- package/dist/types/physics/Body.d.ts.map +1 -0
- package/dist/types/physics/BroadPhase.d.ts +26 -0
- package/dist/types/physics/BroadPhase.d.ts.map +1 -0
- package/dist/types/physics/Contact.d.ts +62 -0
- package/dist/types/physics/Contact.d.ts.map +1 -0
- package/dist/types/physics/ContactSolver.d.ts +29 -0
- package/dist/types/physics/ContactSolver.d.ts.map +1 -0
- package/dist/types/physics/PhysicsWorld.d.ts +78 -0
- package/dist/types/physics/PhysicsWorld.d.ts.map +1 -0
- package/dist/types/physics/PhysicsWorldOptions.d.ts +24 -0
- package/dist/types/physics/PhysicsWorldOptions.d.ts.map +1 -0
- package/dist/types/physics/SpatialHash.d.ts +23 -0
- package/dist/types/physics/SpatialHash.d.ts.map +1 -0
- package/dist/types/physics/collide.d.ts +27 -0
- package/dist/types/physics/collide.d.ts.map +1 -0
- package/dist/types/physics/collidePolygon.d.ts +14 -0
- package/dist/types/physics/collidePolygon.d.ts.map +1 -0
- package/dist/types/physics/contactReport.d.ts +8 -0
- package/dist/types/physics/contactReport.d.ts.map +1 -0
- package/dist/types/physics/drawColliders.d.ts +43 -0
- package/dist/types/physics/drawColliders.d.ts.map +1 -0
- package/dist/types/physics/physicsSystem.d.ts +5 -0
- package/dist/types/physics/physicsSystem.d.ts.map +1 -0
- package/dist/types/physics/polygon.d.ts +28 -0
- package/dist/types/physics/polygon.d.ts.map +1 -0
- package/dist/types/physics/raycast.d.ts +19 -0
- package/dist/types/physics/raycast.d.ts.map +1 -0
- package/dist/types/physics/syncToBody.d.ts +16 -0
- package/dist/types/physics/syncToBody.d.ts.map +1 -0
- package/dist/types/physics/tileBodies.d.ts +36 -0
- package/dist/types/physics/tileBodies.d.ts.map +1 -0
- package/dist/types/physics/types.d.ts +116 -0
- package/dist/types/physics/types.d.ts.map +1 -0
- package/dist/types/pixel/Darkness.d.ts +78 -0
- package/dist/types/pixel/Darkness.d.ts.map +1 -0
- package/dist/types/pixel/DitherVignette.d.ts +35 -0
- package/dist/types/pixel/DitherVignette.d.ts.map +1 -0
- package/dist/types/pixel/Evaporation.d.ts +30 -0
- package/dist/types/pixel/Evaporation.d.ts.map +1 -0
- package/dist/types/pixel/NightShade.d.ts +38 -0
- package/dist/types/pixel/NightShade.d.ts.map +1 -0
- package/dist/types/pixel/PixelLayer.d.ts +85 -0
- package/dist/types/pixel/PixelLayer.d.ts.map +1 -0
- package/dist/types/pixel/SwayProp.d.ts +52 -0
- package/dist/types/pixel/SwayProp.d.ts.map +1 -0
- package/dist/types/pixel/index.d.ts +31 -0
- package/dist/types/pixel/index.d.ts.map +1 -0
- package/dist/types/pixel/lights.d.ts +34 -0
- package/dist/types/pixel/lights.d.ts.map +1 -0
- package/dist/types/pixel/nineSlice.d.ts +71 -0
- package/dist/types/pixel/nineSlice.d.ts.map +1 -0
- package/dist/types/pixel/paintLayer.d.ts +35 -0
- package/dist/types/pixel/paintLayer.d.ts.map +1 -0
- package/dist/types/pixel/palette.d.ts +58 -0
- package/dist/types/pixel/palette.d.ts.map +1 -0
- package/dist/types/pixel/pixel.d.ts +80 -0
- package/dist/types/pixel/pixel.d.ts.map +1 -0
- package/dist/types/pixel/pixelPaint.d.ts +43 -0
- package/dist/types/pixel/pixelPaint.d.ts.map +1 -0
- package/dist/types/pixel/pixelTone.d.ts +51 -0
- package/dist/types/pixel/pixelTone.d.ts.map +1 -0
- package/dist/types/pixel/propKit.d.ts +26 -0
- package/dist/types/pixel/propKit.d.ts.map +1 -0
- package/dist/types/pixel/ramp.d.ts +57 -0
- package/dist/types/pixel/ramp.d.ts.map +1 -0
- package/dist/types/pixel/selout.d.ts +3 -0
- package/dist/types/pixel/selout.d.ts.map +1 -0
- package/dist/types/pixel/spritePixels.d.ts +29 -0
- package/dist/types/pixel/spritePixels.d.ts.map +1 -0
- package/dist/types/pixel/swayRig.d.ts +72 -0
- package/dist/types/pixel/swayRig.d.ts.map +1 -0
- package/dist/types/pixel/vignetteMask.d.ts +16 -0
- package/dist/types/pixel/vignetteMask.d.ts.map +1 -0
- package/dist/types/pixel/weatherArt.d.ts +29 -0
- package/dist/types/pixel/weatherArt.d.ts.map +1 -0
- package/dist/types/platform/touch.d.ts +10 -0
- package/dist/types/platform/touch.d.ts.map +1 -0
- package/dist/types/postfx/BloomFilter.d.ts +33 -0
- package/dist/types/postfx/BloomFilter.d.ts.map +1 -0
- package/dist/types/postfx/ChromaticAberrationFilter.d.ts +11 -0
- package/dist/types/postfx/ChromaticAberrationFilter.d.ts.map +1 -0
- package/dist/types/postfx/ColorAdjustFilter.d.ts +32 -0
- package/dist/types/postfx/ColorAdjustFilter.d.ts.map +1 -0
- package/dist/types/postfx/CrtFilter.d.ts +16 -0
- package/dist/types/postfx/CrtFilter.d.ts.map +1 -0
- package/dist/types/postfx/PixelateFilter.d.ts +8 -0
- package/dist/types/postfx/PixelateFilter.d.ts.map +1 -0
- package/dist/types/postfx/PostFx.d.ts +92 -0
- package/dist/types/postfx/PostFx.d.ts.map +1 -0
- package/dist/types/postfx/ShockwaveFilter.d.ts +20 -0
- package/dist/types/postfx/ShockwaveFilter.d.ts.map +1 -0
- package/dist/types/postfx/VignetteFilter.d.ts +19 -0
- package/dist/types/postfx/VignetteFilter.d.ts.map +1 -0
- package/dist/types/postfx/fxAnimator.d.ts +32 -0
- package/dist/types/postfx/fxAnimator.d.ts.map +1 -0
- package/dist/types/postfx/fxShader.d.ts +49 -0
- package/dist/types/postfx/fxShader.d.ts.map +1 -0
- package/dist/types/postfx/index.d.ts +11 -0
- package/dist/types/postfx/index.d.ts.map +1 -0
- package/dist/types/react/ChoiceDialog.d.ts +8 -0
- package/dist/types/react/ChoiceDialog.d.ts.map +1 -0
- package/dist/types/react/ConfirmDialog.d.ts +9 -0
- package/dist/types/react/ConfirmDialog.d.ts.map +1 -0
- package/dist/types/react/Glyph.d.ts +54 -0
- package/dist/types/react/Glyph.d.ts.map +1 -0
- package/dist/types/react/Modal.d.ts +22 -0
- package/dist/types/react/Modal.d.ts.map +1 -0
- package/dist/types/react/Panel.d.ts +29 -0
- package/dist/types/react/Panel.d.ts.map +1 -0
- package/dist/types/react/PixelImage.d.ts +19 -0
- package/dist/types/react/PixelImage.d.ts.map +1 -0
- package/dist/types/react/Select.d.ts +27 -0
- package/dist/types/react/Select.d.ts.map +1 -0
- package/dist/types/react/Slider.d.ts +24 -0
- package/dist/types/react/Slider.d.ts.map +1 -0
- package/dist/types/react/SplitPane.d.ts +26 -0
- package/dist/types/react/SplitPane.d.ts.map +1 -0
- package/dist/types/react/TabStrip.d.ts +31 -0
- package/dist/types/react/TabStrip.d.ts.map +1 -0
- package/dist/types/react/TitleTips.d.ts +15 -0
- package/dist/types/react/TitleTips.d.ts.map +1 -0
- package/dist/types/react/Tooltip.d.ts +22 -0
- package/dist/types/react/Tooltip.d.ts.map +1 -0
- package/dist/types/react/UiProvider.d.ts +52 -0
- package/dist/types/react/UiProvider.d.ts.map +1 -0
- package/dist/types/react/baseCss.d.ts +27 -0
- package/dist/types/react/baseCss.d.ts.map +1 -0
- package/dist/types/react/choiceStore.d.ts +34 -0
- package/dist/types/react/choiceStore.d.ts.map +1 -0
- package/dist/types/react/classNames.d.ts +12 -0
- package/dist/types/react/classNames.d.ts.map +1 -0
- package/dist/types/react/confirmStore.d.ts +30 -0
- package/dist/types/react/confirmStore.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +33 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/react/labels.d.ts +24 -0
- package/dist/types/react/labels.d.ts.map +1 -0
- package/dist/types/react/placement.d.ts +59 -0
- package/dist/types/react/placement.d.ts.map +1 -0
- package/dist/types/react/useFillSheet.d.ts +9 -0
- package/dist/types/react/useFillSheet.d.ts.map +1 -0
- package/dist/types/react/useFitToViewport.d.ts +20 -0
- package/dist/types/react/useFitToViewport.d.ts.map +1 -0
- package/dist/types/react/usePicked.d.ts +9 -0
- package/dist/types/react/usePicked.d.ts.map +1 -0
- package/dist/types/react/useStore.d.ts +8 -0
- package/dist/types/react/useStore.d.ts.map +1 -0
- package/dist/types/react/useViewport.d.ts +4 -0
- package/dist/types/react/useViewport.d.ts.map +1 -0
- package/dist/types/rig/PosePlayer.d.ts +64 -0
- package/dist/types/rig/PosePlayer.d.ts.map +1 -0
- package/dist/types/rig/RigView.d.ts +68 -0
- package/dist/types/rig/RigView.d.ts.map +1 -0
- package/dist/types/rig/Skeleton.d.ts +14 -0
- package/dist/types/rig/Skeleton.d.ts.map +1 -0
- package/dist/types/rig/humanoid.d.ts +4 -0
- package/dist/types/rig/humanoid.d.ts.map +1 -0
- package/dist/types/rig/humanoidPoses.d.ts +117 -0
- package/dist/types/rig/humanoidPoses.d.ts.map +1 -0
- package/dist/types/rig/poseMath.d.ts +14 -0
- package/dist/types/rig/poseMath.d.ts.map +1 -0
- package/dist/types/rig/rigTypes.d.ts +82 -0
- package/dist/types/rig/rigTypes.d.ts.map +1 -0
- package/dist/types/save/Autosaver.d.ts +43 -0
- package/dist/types/save/Autosaver.d.ts.map +1 -0
- package/dist/types/save/MemoryBackend.d.ts +10 -0
- package/dist/types/save/MemoryBackend.d.ts.map +1 -0
- package/dist/types/save/SaveBackend.d.ts +14 -0
- package/dist/types/save/SaveBackend.d.ts.map +1 -0
- package/dist/types/save/SaveStore.d.ts +73 -0
- package/dist/types/save/SaveStore.d.ts.map +1 -0
- package/dist/types/save/WebStorageBackend.d.ts +14 -0
- package/dist/types/save/WebStorageBackend.d.ts.map +1 -0
- package/dist/types/save/checksum.d.ts +7 -0
- package/dist/types/save/checksum.d.ts.map +1 -0
- package/dist/types/save/migrateSave.d.ts +17 -0
- package/dist/types/save/migrateSave.d.ts.map +1 -0
- package/dist/types/settings.d.ts +25 -0
- package/dist/types/settings.d.ts.map +1 -0
- package/dist/types/tilemap/TilemapView.d.ts +42 -0
- package/dist/types/tilemap/TilemapView.d.ts.map +1 -0
- package/dist/types/tilemap/collision.d.ts +16 -0
- package/dist/types/tilemap/collision.d.ts.map +1 -0
- package/dist/types/tilemap/tiled.d.ts +104 -0
- package/dist/types/tilemap/tiled.d.ts.map +1 -0
- package/dist/types/transitions/CrossfadeTransition.d.ts +20 -0
- package/dist/types/transitions/CrossfadeTransition.d.ts.map +1 -0
- package/dist/types/transitions/DitherWipeTransition.d.ts +35 -0
- package/dist/types/transitions/DitherWipeTransition.d.ts.map +1 -0
- package/dist/types/transitions/FadeTransition.d.ts +20 -0
- package/dist/types/transitions/FadeTransition.d.ts.map +1 -0
- package/dist/types/transitions/Letterbox.d.ts +33 -0
- package/dist/types/transitions/Letterbox.d.ts.map +1 -0
- package/dist/types/transitions/Transition.d.ts +22 -0
- package/dist/types/transitions/Transition.d.ts.map +1 -0
- package/dist/types/transitions/ditherMask.d.ts +13 -0
- package/dist/types/transitions/ditherMask.d.ts.map +1 -0
- package/dist/types/transitions/transitionTo.d.ts +16 -0
- package/dist/types/transitions/transitionTo.d.ts.map +1 -0
- package/dist/types/transitions/tweenDone.d.ts +5 -0
- package/dist/types/transitions/tweenDone.d.ts.map +1 -0
- package/dist/types/ui/Bar.d.ts +41 -0
- package/dist/types/ui/Bar.d.ts.map +1 -0
- package/dist/types/ui/Button.d.ts +47 -0
- package/dist/types/ui/Button.d.ts.map +1 -0
- package/dist/types/ui/Dialog.d.ts +47 -0
- package/dist/types/ui/Dialog.d.ts.map +1 -0
- package/dist/types/ui/FocusManager.d.ts +53 -0
- package/dist/types/ui/FocusManager.d.ts.map +1 -0
- package/dist/types/ui/Label.d.ts +24 -0
- package/dist/types/ui/Label.d.ts.map +1 -0
- package/dist/types/ui/List.d.ts +23 -0
- package/dist/types/ui/List.d.ts.map +1 -0
- package/dist/types/ui/Panel.d.ts +38 -0
- package/dist/types/ui/Panel.d.ts.map +1 -0
- package/dist/types/ui/ScrollView.d.ts +56 -0
- package/dist/types/ui/ScrollView.d.ts.map +1 -0
- package/dist/types/ui/Slider.d.ts +47 -0
- package/dist/types/ui/Slider.d.ts.map +1 -0
- package/dist/types/ui/Stack.d.ts +16 -0
- package/dist/types/ui/Stack.d.ts.map +1 -0
- package/dist/types/ui/Toggle.d.ts +31 -0
- package/dist/types/ui/Toggle.d.ts.map +1 -0
- package/dist/types/ui/UiHost.d.ts +18 -0
- package/dist/types/ui/UiHost.d.ts.map +1 -0
- package/dist/types/ui/UiPointerGate.d.ts +17 -0
- package/dist/types/ui/UiPointerGate.d.ts.map +1 -0
- package/dist/types/ui/UiRoot.d.ts +73 -0
- package/dist/types/ui/UiRoot.d.ts.map +1 -0
- package/dist/types/ui/Widget.d.ts +56 -0
- package/dist/types/ui/Widget.d.ts.map +1 -0
- package/dist/types/ui/dom/DomOverlay.d.ts +52 -0
- package/dist/types/ui/dom/DomOverlay.d.ts.map +1 -0
- package/dist/types/ui/dom/DomWorldAnchors.d.ts +50 -0
- package/dist/types/ui/dom/DomWorldAnchors.d.ts.map +1 -0
- package/dist/types/ui/dom/InputShield.d.ts +20 -0
- package/dist/types/ui/dom/InputShield.d.ts.map +1 -0
- package/dist/types/ui/dom/createStore.d.ts +22 -0
- package/dist/types/ui/dom/createStore.d.ts.map +1 -0
- package/dist/types/ui/dom/shieldDecision.d.ts +34 -0
- package/dist/types/ui/dom/shieldDecision.d.ts.map +1 -0
- package/dist/types/ui/dom/worldToScreen.d.ts +24 -0
- package/dist/types/ui/dom/worldToScreen.d.ts.map +1 -0
- package/dist/types/ui/index.d.ts +38 -0
- package/dist/types/ui/index.d.ts.map +1 -0
- package/dist/types/ui/layout/anchor.d.ts +9 -0
- package/dist/types/ui/layout/anchor.d.ts.map +1 -0
- package/dist/types/ui/layout/barDrain.d.ts +25 -0
- package/dist/types/ui/layout/barDrain.d.ts.map +1 -0
- package/dist/types/ui/layout/fitToViewport.d.ts +32 -0
- package/dist/types/ui/layout/fitToViewport.d.ts.map +1 -0
- package/dist/types/ui/layout/focusNav.d.ts +13 -0
- package/dist/types/ui/layout/focusNav.d.ts.map +1 -0
- package/dist/types/ui/layout/geometry.d.ts +35 -0
- package/dist/types/ui/layout/geometry.d.ts.map +1 -0
- package/dist/types/ui/layout/listWidth.d.ts +13 -0
- package/dist/types/ui/layout/listWidth.d.ts.map +1 -0
- package/dist/types/ui/layout/placeTooltip.d.ts +23 -0
- package/dist/types/ui/layout/placeTooltip.d.ts.map +1 -0
- package/dist/types/ui/layout/scroll.d.ts +17 -0
- package/dist/types/ui/layout/scroll.d.ts.map +1 -0
- package/dist/types/ui/layout/slider.d.ts +7 -0
- package/dist/types/ui/layout/slider.d.ts.map +1 -0
- package/dist/types/ui/layout/stack.d.ts +26 -0
- package/dist/types/ui/layout/stack.d.ts.map +1 -0
- package/dist/types/ui/layout/wrapRow.d.ts +6 -0
- package/dist/types/ui/layout/wrapRow.d.ts.map +1 -0
- package/dist/ui/Bar.js +54 -0
- package/dist/ui/Bar.js.map +1 -0
- package/dist/ui/Button.js +58 -0
- package/dist/ui/Button.js.map +1 -0
- package/dist/ui/Dialog.js +56 -0
- package/dist/ui/Dialog.js.map +1 -0
- package/dist/ui/FocusManager.js +97 -0
- package/dist/ui/FocusManager.js.map +1 -0
- package/dist/ui/Label.js +36 -0
- package/dist/ui/Label.js.map +1 -0
- package/dist/ui/List.js +45 -0
- package/dist/ui/List.js.map +1 -0
- package/dist/ui/Panel.js +38 -0
- package/dist/ui/Panel.js.map +1 -0
- package/dist/ui/ScrollView.js +96 -0
- package/dist/ui/ScrollView.js.map +1 -0
- package/dist/ui/Slider.js +55 -0
- package/dist/ui/Slider.js.map +1 -0
- package/dist/ui/Stack.js +28 -0
- package/dist/ui/Stack.js.map +1 -0
- package/dist/ui/Toggle.js +37 -0
- package/dist/ui/Toggle.js.map +1 -0
- package/dist/ui/UiHost.js +9 -0
- package/dist/ui/UiHost.js.map +1 -0
- package/dist/ui/UiPointerGate.js +25 -0
- package/dist/ui/UiPointerGate.js.map +1 -0
- package/dist/ui/UiRoot.js +93 -0
- package/dist/ui/UiRoot.js.map +1 -0
- package/dist/ui/Widget.js +90 -0
- package/dist/ui/Widget.js.map +1 -0
- package/dist/ui/dom/DomOverlay.js +59 -0
- package/dist/ui/dom/DomOverlay.js.map +1 -0
- package/dist/ui/dom/DomWorldAnchors.js +59 -0
- package/dist/ui/dom/DomWorldAnchors.js.map +1 -0
- package/dist/ui/dom/InputShield.js +27 -0
- package/dist/ui/dom/InputShield.js.map +1 -0
- package/dist/ui/dom/createStore.js +42 -0
- package/dist/ui/dom/createStore.js.map +1 -0
- package/dist/ui/dom/shieldDecision.js +36 -0
- package/dist/ui/dom/shieldDecision.js.map +1 -0
- package/dist/ui/dom/worldToScreen.js +11 -0
- package/dist/ui/dom/worldToScreen.js.map +1 -0
- package/dist/ui/layout/anchor.js +20 -0
- package/dist/ui/layout/anchor.js.map +1 -0
- package/dist/ui/layout/barDrain.js +25 -0
- package/dist/ui/layout/barDrain.js.map +1 -0
- package/dist/ui/layout/fitToViewport.js +17 -0
- package/dist/ui/layout/fitToViewport.js.map +1 -0
- package/dist/ui/layout/focusNav.js +42 -0
- package/dist/ui/layout/focusNav.js.map +1 -0
- package/dist/ui/layout/geometry.js +21 -0
- package/dist/ui/layout/geometry.js.map +1 -0
- package/dist/ui/layout/listWidth.js +10 -0
- package/dist/ui/layout/listWidth.js.map +1 -0
- package/dist/ui/layout/placeTooltip.js +28 -0
- package/dist/ui/layout/placeTooltip.js.map +1 -0
- package/dist/ui/layout/scroll.js +24 -0
- package/dist/ui/layout/scroll.js.map +1 -0
- package/dist/ui/layout/slider.js +20 -0
- package/dist/ui/layout/slider.js.map +1 -0
- package/dist/ui/layout/stack.js +27 -0
- package/dist/ui/layout/stack.js.map +1 -0
- package/dist/ui/layout/wrapRow.js +13 -0
- package/dist/ui/layout/wrapRow.js.map +1 -0
- package/dist/ui.js +85 -0
- package/dist/ui.js.map +1 -0
- package/package.json +115 -4
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const h = ["forward", "reverse", "pingpong", "pingpong_reverse"];
|
|
2
|
+
function v(e) {
|
|
3
|
+
return h.includes(e) ? e : "forward";
|
|
4
|
+
}
|
|
5
|
+
function m(e) {
|
|
6
|
+
const o = typeof e == "number" ? e : e === void 0 ? 0 : Number.parseInt(e, 10);
|
|
7
|
+
return Number.isFinite(o) && o > 0 ? Math.floor(o) : 0;
|
|
8
|
+
}
|
|
9
|
+
function b(e, o, c, i) {
|
|
10
|
+
const l = Math.min(e, o), a = Math.max(e, o), t = [];
|
|
11
|
+
for (let n = l; n <= a; n++) t.push(n);
|
|
12
|
+
const p = t.slice().reverse(), u = c === "reverse" || c === "pingpong_reverse", s = u ? p : t, g = c === "pingpong" || c === "pingpong_reverse";
|
|
13
|
+
if (i === 0) {
|
|
14
|
+
if (!g || t.length <= 2) return s;
|
|
15
|
+
const n = u ? t : p;
|
|
16
|
+
return s.concat(n.slice(1, -1));
|
|
17
|
+
}
|
|
18
|
+
if (!g) {
|
|
19
|
+
const n = [];
|
|
20
|
+
for (let r = 0; r < i; r++) n.push(...s);
|
|
21
|
+
return n;
|
|
22
|
+
}
|
|
23
|
+
const f = s.slice();
|
|
24
|
+
for (let n = 1; n < i; n++) {
|
|
25
|
+
const r = n % 2 === 0 ? s : u ? t : p;
|
|
26
|
+
f.push(...t.length > 1 ? r.slice(1) : r);
|
|
27
|
+
}
|
|
28
|
+
return f;
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
v as tagDirection,
|
|
32
|
+
b as tagFrames,
|
|
33
|
+
m as tagRepeat
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=asepriteTags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteTags.js","sources":["../../src/anim/asepriteTags.ts"],"sourcesContent":["import type { AsepriteDirection } from './asepriteTypes';\n\nconst DIRECTIONS: readonly AsepriteDirection[] = ['forward', 'reverse', 'pingpong', 'pingpong_reverse'];\n\n/** Aseprite's direction name, or forward for anything unknown (older files write none). */\nexport function tagDirection(raw: string | undefined): AsepriteDirection {\n return DIRECTIONS.includes(raw as AsepriteDirection) ? (raw as AsepriteDirection) : 'forward';\n}\n\n/** Aseprite writes the repeat count as a string; absent, 0 or nonsense is forever. */\nexport function tagRepeat(raw: string | number | undefined): number {\n const n = typeof raw === 'number' ? raw : raw === undefined ? 0 : Number.parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : 0;\n}\n\n/**\n * The sheet frames a tag plays, in playing order, unrolled so the engine's `Animator` (which only ever plays a list\n * forward) shows exactly what Aseprite's own player shows.\n *\n * - forever (`repeat` 0): forward and reverse are one pass, looped; a ping-pong is one round trip without its two\n * ends doubled (a b c d c b, then a again), so a loop never stutters on the turn.\n * - `repeat` n: n passes, played once. A ping-pong counts each pass in one direction as one, as Aseprite does, and two\n * passes share their turning frame (repeat 2 of a b c is a b c b a).\n */\nexport function tagFrames(from: number, to: number, direction: AsepriteDirection, repeat: number): number[] {\n const lo = Math.min(from, to);\n const hi = Math.max(from, to);\n const up: number[] = [];\n for (let i = lo; i <= hi; i++) up.push(i);\n const down = up.slice().reverse();\n const backward = direction === 'reverse' || direction === 'pingpong_reverse';\n const first = backward ? down : up;\n const pingpong = direction === 'pingpong' || direction === 'pingpong_reverse';\n\n if (repeat === 0) {\n if (!pingpong || up.length <= 2) return first;\n const second = backward ? up : down;\n return first.concat(second.slice(1, -1));\n }\n if (!pingpong) {\n const out: number[] = [];\n for (let r = 0; r < repeat; r++) out.push(...first);\n return out;\n }\n const out = first.slice();\n for (let r = 1; r < repeat; r++) {\n const pass = r % 2 === 0 ? first : backward ? up : down;\n // the turning frame closes one pass and opens the next: shown once, as Aseprite shows it\n out.push(...(up.length > 1 ? pass.slice(1) : pass));\n }\n return out;\n}\n"],"names":["DIRECTIONS","tagDirection","raw","tagRepeat","n","tagFrames","from","to","direction","repeat","lo","hi","up","i","down","backward","first","pingpong","second","out","r","pass"],"mappings":"AAEA,MAAMA,IAA2C,CAAC,WAAW,WAAW,YAAY,kBAAkB;AAG/F,SAASC,EAAaC,GAA4C;AACvE,SAAOF,EAAW,SAASE,CAAwB,IAAKA,IAA4B;AACtF;AAGO,SAASC,EAAUD,GAA0C;AAClE,QAAME,IAAI,OAAOF,KAAQ,WAAWA,IAAMA,MAAQ,SAAY,IAAI,OAAO,SAASA,GAAK,EAAE;AACzF,SAAO,OAAO,SAASE,CAAC,KAAKA,IAAI,IAAI,KAAK,MAAMA,CAAC,IAAI;AACvD;AAWO,SAASC,EAAUC,GAAcC,GAAYC,GAA8BC,GAA0B;AAC1G,QAAMC,IAAK,KAAK,IAAIJ,GAAMC,CAAE,GACtBI,IAAK,KAAK,IAAIL,GAAMC,CAAE,GACtBK,IAAe,CAAA;AACrB,WAASC,IAAIH,GAAIG,KAAKF,GAAIE,IAAK,CAAAD,EAAG,KAAKC,CAAC;AACxC,QAAMC,IAAOF,EAAG,MAAA,EAAQ,QAAA,GAClBG,IAAWP,MAAc,aAAaA,MAAc,oBACpDQ,IAAQD,IAAWD,IAAOF,GAC1BK,IAAWT,MAAc,cAAcA,MAAc;AAE3D,MAAIC,MAAW,GAAG;AAChB,QAAI,CAACQ,KAAYL,EAAG,UAAU,EAAG,QAAOI;AACxC,UAAME,IAASH,IAAWH,IAAKE;AAC/B,WAAOE,EAAM,OAAOE,EAAO,MAAM,GAAG,EAAE,CAAC;AAAA,EACzC;AACA,MAAI,CAACD,GAAU;AACb,UAAME,IAAgB,CAAA;AACtB,aAAS,IAAI,GAAG,IAAIV,GAAQ,IAAKU,CAAAA,EAAI,KAAK,GAAGH,CAAK;AAClD,WAAOG;AAAAA,EACT;AACA,QAAMA,IAAMH,EAAM,MAAA;AAClB,WAASI,IAAI,GAAGA,IAAIX,GAAQW,KAAK;AAC/B,UAAMC,IAAOD,IAAI,MAAM,IAAIJ,IAAQD,IAAWH,IAAKE;AAEnD,IAAAK,EAAI,KAAK,GAAIP,EAAG,SAAS,IAAIS,EAAK,MAAM,CAAC,IAAIA,CAAK;AAAA,EACpD;AACA,SAAOF;AACT;"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { tagRepeat as w, tagDirection as y, tagFrames as v } from "./asepriteTags.js";
|
|
2
|
+
const A = 100;
|
|
3
|
+
function S(s) {
|
|
4
|
+
if (!s || typeof s != "object") throw new Error("parseAseprite: not an Aseprite JSON object");
|
|
5
|
+
const r = s;
|
|
6
|
+
if (!r.frames || typeof r.frames != "object") throw new Error('parseAseprite: no "frames"');
|
|
7
|
+
const n = r.meta ?? {}, a = (Array.isArray(r.frames) ? r.frames.map((e, o) => [e.filename ?? String(o), e]) : Object.entries(r.frames)).map(([e, o], t) => b(e, o, t));
|
|
8
|
+
if (a.length === 0) throw new Error("parseAseprite: the sheet has no frames");
|
|
9
|
+
const i = (n.frameTags ?? []).map((e) => {
|
|
10
|
+
if (!(e.from >= 0 && e.to < a.length && e.from <= e.to))
|
|
11
|
+
throw new Error(`parseAseprite: tag "${e.name}" spans frames ${e.from}–${e.to} of ${a.length}`);
|
|
12
|
+
const o = { name: e.name, from: e.from, to: e.to, direction: y(e.direction), repeat: w(e.repeat) };
|
|
13
|
+
return e.color !== void 0 && (o.color = e.color), e.data !== void 0 && (o.data = e.data), o;
|
|
14
|
+
}), c = {};
|
|
15
|
+
for (const e of i) {
|
|
16
|
+
let o = e.name;
|
|
17
|
+
for (let t = 2; o in c; t++) o = `${e.name}#${t}`;
|
|
18
|
+
c[o] = h(a, v(e.from, e.to, e.direction, e.repeat), e.repeat === 0);
|
|
19
|
+
}
|
|
20
|
+
const f = h(a, a.map((e) => e.index), !0), p = (n.slices ?? []).map((e) => {
|
|
21
|
+
const o = {
|
|
22
|
+
name: e.name,
|
|
23
|
+
keys: (e.keys ?? []).map((t) => ({
|
|
24
|
+
frame: t.frame,
|
|
25
|
+
bounds: { ...t.bounds },
|
|
26
|
+
...t.center ? { center: { ...t.center } } : {},
|
|
27
|
+
...t.pivot ? { pivot: { ...t.pivot } } : {}
|
|
28
|
+
})).sort((t, g) => t.frame - g.frame)
|
|
29
|
+
};
|
|
30
|
+
return e.color !== void 0 && (o.color = e.color), e.data !== void 0 && (o.data = e.data), o;
|
|
31
|
+
}), d = [], u = [];
|
|
32
|
+
for (const e of n.layers ?? []) {
|
|
33
|
+
const o = { name: e.name, opacity: e.opacity ?? 255, blendMode: e.blendMode ?? "normal" };
|
|
34
|
+
e.group !== void 0 && (o.group = e.group), e.color !== void 0 && (o.color = e.color), e.data !== void 0 && (o.data = e.data), d.push(o);
|
|
35
|
+
for (const t of e.cels ?? []) t.data && u.push({ layer: e.name, frame: t.frame, data: t.data });
|
|
36
|
+
}
|
|
37
|
+
const l = n.size ?? { w: 0, h: 0 };
|
|
38
|
+
return { image: n.image ?? "", width: l.w, height: l.h, frames: a, tags: i, clips: c, all: f, slices: p, layers: d, cues: u };
|
|
39
|
+
}
|
|
40
|
+
function b(s, r, n) {
|
|
41
|
+
if (!r || !r.frame) throw new Error(`parseAseprite: frame "${s}" has no rect`);
|
|
42
|
+
if (r.rotated) throw new Error(`parseAseprite: frame "${s}" is rotated, which is not supported`);
|
|
43
|
+
const { x: m, y: a, w: i, h: c } = r.frame, f = r.sourceSize ?? { w: i, h: c }, p = r.trimmed && r.spriteSourceSize ? r.spriteSourceSize : { x: 0, y: 0 };
|
|
44
|
+
return {
|
|
45
|
+
index: n,
|
|
46
|
+
name: s,
|
|
47
|
+
rect: { x: m, y: a, w: i, h: c },
|
|
48
|
+
duration: r.duration !== void 0 && r.duration > 0 ? r.duration : A,
|
|
49
|
+
sourceW: f.w,
|
|
50
|
+
sourceH: f.h,
|
|
51
|
+
offsetX: p.x,
|
|
52
|
+
offsetY: p.y,
|
|
53
|
+
trimmed: r.trimmed === !0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function h(s, r, n) {
|
|
57
|
+
return { frames: r.slice(), durations: r.map((m) => s[m].duration), loop: n };
|
|
58
|
+
}
|
|
59
|
+
function $(s, r) {
|
|
60
|
+
return s.frames.findIndex((n) => n.name === r);
|
|
61
|
+
}
|
|
62
|
+
function x(s, r) {
|
|
63
|
+
const n = /* @__PURE__ */ new Map();
|
|
64
|
+
for (const a of s.cues) {
|
|
65
|
+
if (r !== void 0 && a.layer !== r) continue;
|
|
66
|
+
const i = n.get(a.frame) ?? [];
|
|
67
|
+
i.push(a.data), n.set(a.frame, i);
|
|
68
|
+
}
|
|
69
|
+
const m = {};
|
|
70
|
+
for (const [a, i] of Object.entries(s.clips)) {
|
|
71
|
+
const c = [];
|
|
72
|
+
i.frames.forEach((f, p) => {
|
|
73
|
+
for (const d of n.get(Number(f)) ?? []) c.push({ frame: p, name: d });
|
|
74
|
+
}), c.length && (m[a] = c);
|
|
75
|
+
}
|
|
76
|
+
return m;
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
x as clipMarkers,
|
|
80
|
+
$ as frameNamed,
|
|
81
|
+
S as parseAseprite
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=parseAseprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseAseprite.js","sources":["../../src/anim/parseAseprite.ts"],"sourcesContent":["import type { AnimationClip } from './Animator';\nimport { tagDirection, tagFrames, tagRepeat } from './asepriteTags';\nimport type {\n AsepriteCue,\n AsepriteFrame,\n AsepriteJson,\n AsepriteJsonFrame,\n AsepriteLayer,\n AsepriteSheet,\n AsepriteSlice,\n AsepriteTag,\n ClipMarker,\n} from './asepriteTypes';\n\n// Aseprite's default when a frame has no duration of its own (its \"Frame Duration\" default)\nconst DEFAULT_DURATION_MS = 100;\n\n/**\n * Reads Aseprite's exported sprite-sheet JSON — either frame layout, \"hash\" (frames keyed by file name) or \"array\" —\n * into frames, one `Animator` clip per tag, slices, layers and cel cues. Pure: no image is touched, so it runs under\n * node and in a worker; `addAsepriteTextures` / `loadAseprite` cut the sheet image by the frames it returns.\n *\n * ```ts\n * const sheet = parseAseprite(json);\n * const anim = new Animator(sheet.clips, 'idle'); // tag names are clip names; frames are sheet frame indices\n * ```\n */\nexport function parseAseprite(json: unknown): AsepriteSheet {\n if (!json || typeof json !== 'object') throw new Error('parseAseprite: not an Aseprite JSON object');\n const doc = json as AsepriteJson;\n if (!doc.frames || typeof doc.frames !== 'object') throw new Error('parseAseprite: no \"frames\"');\n const meta = doc.meta ?? {};\n\n const rawFrames: [string, AsepriteJsonFrame][] = Array.isArray(doc.frames)\n ? doc.frames.map((f, i) => [f.filename ?? String(i), f])\n : Object.entries(doc.frames);\n const frames = rawFrames.map(([name, f], index) => toFrame(name, f, index));\n if (frames.length === 0) throw new Error('parseAseprite: the sheet has no frames');\n\n const tags: AsepriteTag[] = (meta.frameTags ?? []).map((t) => {\n if (!(t.from >= 0 && t.to < frames.length && t.from <= t.to)) {\n throw new Error(`parseAseprite: tag \"${t.name}\" spans frames ${t.from}–${t.to} of ${frames.length}`);\n }\n const tag: AsepriteTag = { name: t.name, from: t.from, to: t.to, direction: tagDirection(t.direction), repeat: tagRepeat(t.repeat) };\n if (t.color !== undefined) tag.color = t.color;\n if (t.data !== undefined) tag.data = t.data;\n return tag;\n });\n\n const clips: Record<string, AnimationClip> = {};\n for (const tag of tags) {\n // Aseprite allows two tags of one name; the second must not silently replace the first\n let name = tag.name;\n for (let n = 2; name in clips; n++) name = `${tag.name}#${n}`;\n clips[name] = clipOf(frames, tagFrames(tag.from, tag.to, tag.direction, tag.repeat), tag.repeat === 0);\n }\n\n const all = clipOf(frames, frames.map((f) => f.index), true);\n const slices: AsepriteSlice[] = (meta.slices ?? []).map((s) => {\n const slice: AsepriteSlice = {\n name: s.name,\n keys: (s.keys ?? [])\n .map((k) => ({\n frame: k.frame,\n bounds: { ...k.bounds },\n ...(k.center ? { center: { ...k.center } } : {}),\n ...(k.pivot ? { pivot: { ...k.pivot } } : {}),\n }))\n .sort((a, b) => a.frame - b.frame),\n };\n if (s.color !== undefined) slice.color = s.color;\n if (s.data !== undefined) slice.data = s.data;\n return slice;\n });\n\n const layers: AsepriteLayer[] = [];\n const cues: AsepriteCue[] = [];\n for (const l of meta.layers ?? []) {\n const layer: AsepriteLayer = { name: l.name, opacity: l.opacity ?? 255, blendMode: l.blendMode ?? 'normal' };\n if (l.group !== undefined) layer.group = l.group;\n if (l.color !== undefined) layer.color = l.color;\n if (l.data !== undefined) layer.data = l.data;\n layers.push(layer);\n for (const c of l.cels ?? []) if (c.data) cues.push({ layer: l.name, frame: c.frame, data: c.data });\n }\n\n const size = meta.size ?? { w: 0, h: 0 };\n return { image: meta.image ?? '', width: size.w, height: size.h, frames, tags, clips, all, slices, layers, cues };\n}\n\nfunction toFrame(name: string, f: AsepriteJsonFrame, index: number): AsepriteFrame {\n if (!f || !f.frame) throw new Error(`parseAseprite: frame \"${name}\" has no rect`);\n // Aseprite never rotates frames; a packer that did would need its rect read sideways, which nothing here does\n if (f.rotated) throw new Error(`parseAseprite: frame \"${name}\" is rotated, which is not supported`);\n const { x, y, w, h } = f.frame;\n const src = f.sourceSize ?? { w, h };\n const off = f.trimmed && f.spriteSourceSize ? f.spriteSourceSize : { x: 0, y: 0 };\n return {\n index,\n name,\n rect: { x, y, w, h },\n duration: f.duration !== undefined && f.duration > 0 ? f.duration : DEFAULT_DURATION_MS,\n sourceW: src.w,\n sourceH: src.h,\n offsetX: off.x,\n offsetY: off.y,\n trimmed: f.trimmed === true,\n };\n}\n\nfunction clipOf(frames: readonly AsepriteFrame[], order: readonly number[], loop: boolean): AnimationClip {\n return { frames: order.slice(), durations: order.map((i) => frames[i]!.duration), loop };\n}\n\n/** The index of the frame Aseprite named `name`, or -1. */\nexport function frameNamed(sheet: AsepriteSheet, name: string): number {\n return sheet.frames.findIndex((f) => f.name === name);\n}\n\n/**\n * Markers for every clip from the sheet's cel cues: wherever a clip shows a sheet frame whose cel carries user data,\n * a marker of that data at that position of the clip. A ping-pong shows a frame twice a round trip, so it fires twice,\n * as a footstep should. `layer` keeps only the cues of one layer (a layer kept for marks, say \"events\").\n */\nexport function clipMarkers(sheet: AsepriteSheet, layer?: string): Record<string, ClipMarker[]> {\n const byFrame = new Map<number, string[]>();\n for (const c of sheet.cues) {\n if (layer !== undefined && c.layer !== layer) continue;\n const list = byFrame.get(c.frame) ?? [];\n list.push(c.data);\n byFrame.set(c.frame, list);\n }\n const out: Record<string, ClipMarker[]> = {};\n for (const [name, clip] of Object.entries(sheet.clips)) {\n const markers: ClipMarker[] = [];\n clip.frames.forEach((f, i) => {\n for (const data of byFrame.get(Number(f)) ?? []) markers.push({ frame: i, name: data });\n });\n if (markers.length) out[name] = markers;\n }\n return out;\n}\n"],"names":["DEFAULT_DURATION_MS","parseAseprite","json","doc","meta","frames","f","i","name","index","toFrame","tags","t","tag","tagDirection","tagRepeat","clips","n","clipOf","tagFrames","all","slices","s","slice","k","a","b","layers","cues","l","layer","c","size","x","y","w","h","src","off","order","loop","frameNamed","sheet","clipMarkers","byFrame","list","out","clip","markers","data"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { parseTiled as h } from "../tilemap/tiled.js";
|
|
2
|
+
function n(r, t) {
|
|
3
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(r) || r.startsWith("/")) return r;
|
|
4
|
+
const a = (t.slice(0, t.lastIndexOf("/") + 1) + r).split("/"), s = [];
|
|
5
|
+
for (const o of a)
|
|
6
|
+
o === ".." && s.length && s[s.length - 1] !== ".." && s[s.length - 1] !== "" ? s.pop() : o !== "." && s.push(o);
|
|
7
|
+
return s.join("/");
|
|
8
|
+
}
|
|
9
|
+
async function c(r) {
|
|
10
|
+
const t = await createImageBitmap(r), e = document.createElement("canvas");
|
|
11
|
+
e.width = t.width, e.height = t.height;
|
|
12
|
+
const a = e.getContext("2d");
|
|
13
|
+
if (!a) throw new Error("AssetLoader: no 2D context (out of canvas memory?)");
|
|
14
|
+
return a.drawImage(t, 0, 0), t.close(), e;
|
|
15
|
+
}
|
|
16
|
+
class u {
|
|
17
|
+
constructor(t, e = {}) {
|
|
18
|
+
this.textures = t, this.options = e, this.fetcher = e.fetch ?? ((a) => fetch(a)), this.toCanvas = e.toCanvas ?? c;
|
|
19
|
+
}
|
|
20
|
+
textures;
|
|
21
|
+
options;
|
|
22
|
+
queue = [];
|
|
23
|
+
data = /* @__PURE__ */ new Map();
|
|
24
|
+
maps = /* @__PURE__ */ new Map();
|
|
25
|
+
fetcher;
|
|
26
|
+
toCanvas;
|
|
27
|
+
total = 0;
|
|
28
|
+
done = 0;
|
|
29
|
+
image(t, e) {
|
|
30
|
+
return this.add(t, async () => {
|
|
31
|
+
this.textures.addCanvas(t, await this.toCanvas(await this.blob(e)));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** An image cut into equal frames named 0, 1, 2…, left to right, then row by row. */
|
|
35
|
+
spritesheet(t, e, a) {
|
|
36
|
+
return this.add(t, async () => {
|
|
37
|
+
this.textures.addSpriteSheet(t, await this.toCanvas(await this.blob(e)), a);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
json(t, e) {
|
|
41
|
+
return this.add(t, async () => {
|
|
42
|
+
this.data.set(t, await (await this.request(e)).json());
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
text(t, e) {
|
|
46
|
+
return this.add(t, async () => {
|
|
47
|
+
this.data.set(t, await (await this.request(e)).text());
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** A Tiled JSON map, then every tileset image it names (resolved beside the map file). */
|
|
51
|
+
tilemap(t, e, a = {}) {
|
|
52
|
+
return this.add(t, async () => {
|
|
53
|
+
const s = h(await (await this.request(e)).json());
|
|
54
|
+
this.maps.set(t, s);
|
|
55
|
+
const o = a.textureKey ?? ((i) => i.name);
|
|
56
|
+
for (const i of s.tilesets) this.image(o(i), n(i.image, e));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** Runs everything queued; `onProgress` after each asset. Safe to call again after queueing more. */
|
|
60
|
+
async load(t) {
|
|
61
|
+
const e = Math.max(1, this.options.concurrency ?? 6), a = async () => {
|
|
62
|
+
for (let s = this.queue.shift(); s; s = this.queue.shift())
|
|
63
|
+
await s.run(), this.done++, t?.({ done: this.done, total: this.total, key: s.key });
|
|
64
|
+
};
|
|
65
|
+
for (; this.queue.length; ) await Promise.all(Array.from({ length: e }, a));
|
|
66
|
+
}
|
|
67
|
+
/** A loaded JSON value. */
|
|
68
|
+
getJson(t) {
|
|
69
|
+
if (!this.data.has(t)) throw new Error(`AssetLoader: no JSON or text loaded as "${t}"`);
|
|
70
|
+
return this.data.get(t);
|
|
71
|
+
}
|
|
72
|
+
/** A loaded text file. */
|
|
73
|
+
getText(t) {
|
|
74
|
+
return this.getJson(t);
|
|
75
|
+
}
|
|
76
|
+
/** A loaded Tiled map. */
|
|
77
|
+
map(t) {
|
|
78
|
+
const e = this.maps.get(t);
|
|
79
|
+
if (!e) throw new Error(`AssetLoader: no tilemap loaded as "${t}"`);
|
|
80
|
+
return e;
|
|
81
|
+
}
|
|
82
|
+
add(t, e) {
|
|
83
|
+
return this.queue.push({ key: t, run: e }), this.total++, this;
|
|
84
|
+
}
|
|
85
|
+
async request(t) {
|
|
86
|
+
const e = n(t, this.options.baseUrl ?? "");
|
|
87
|
+
let a;
|
|
88
|
+
try {
|
|
89
|
+
a = await this.fetcher(e);
|
|
90
|
+
} catch (s) {
|
|
91
|
+
throw new Error(`AssetLoader: could not fetch ${e}: ${s instanceof Error ? s.message : String(s)}`);
|
|
92
|
+
}
|
|
93
|
+
if (!a.ok) throw new Error(`AssetLoader: ${e} answered ${a.status}`);
|
|
94
|
+
return a;
|
|
95
|
+
}
|
|
96
|
+
async blob(t) {
|
|
97
|
+
return (await this.request(t)).blob();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
u as AssetLoader,
|
|
102
|
+
n as resolveUrl
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=AssetLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetLoader.js","sources":["../../src/assets/AssetLoader.ts"],"sourcesContent":["import { parseTiled, type TileMap, type Tileset } from '../tilemap/tiled';\n\n/** Where loaded images go: the stage's `TextureRegistry` satisfies it. */\nexport interface TextureSink {\n addCanvas(key: string, canvas: HTMLCanvasElement): unknown;\n addSpriteSheet(key: string, canvas: HTMLCanvasElement, size: { frameWidth: number; frameHeight: number }): unknown;\n}\n\nexport interface AssetLoaderOptions {\n /** Prefix for relative URLs (default: none, so relative to the page). */\n baseUrl?: string;\n /** Requests running at once (default 6). */\n concurrency?: number;\n /** For tests and custom transports: defaults to the global `fetch`. */\n fetch?: (url: string) => Promise<{ ok: boolean; status: number; blob(): Promise<Blob>; json(): Promise<unknown>; text(): Promise<string> }>;\n /** Turns image bytes into a canvas; defaults to `createImageBitmap` drawn onto a new canvas. */\n toCanvas?: (blob: Blob) => Promise<HTMLCanvasElement>;\n}\n\nexport interface TilemapAssetOptions {\n /** The texture key a tileset's image is loaded under (default: the tileset's name). */\n textureKey?: (tileset: Tileset) => string;\n}\n\nexport interface LoadProgress {\n done: number;\n total: number;\n /** The asset that just finished. */\n key: string;\n}\n\ntype Job = { key: string; run: () => Promise<void> };\n\n/** `url` resolved against `base` the way a browser would (a bare file name sits beside its map). */\nexport function resolveUrl(url: string, base: string): string {\n if (/^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith('/')) return url;\n const dir = base.slice(0, base.lastIndexOf('/') + 1);\n const parts = (dir + url).split('/');\n const out: string[] = [];\n for (const p of parts) {\n if (p === '..' && out.length && out[out.length - 1] !== '..' && out[out.length - 1] !== '') out.pop();\n else if (p !== '.') out.push(p);\n }\n return out.join('/');\n}\n\nasync function defaultToCanvas(blob: Blob): Promise<HTMLCanvasElement> {\n const bitmap = await createImageBitmap(blob);\n const canvas = document.createElement('canvas');\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('AssetLoader: no 2D context (out of canvas memory?)');\n ctx.drawImage(bitmap, 0, 0);\n bitmap.close();\n return canvas;\n}\n\n/**\n * Loads a scene's assets before it starts: queue them, then `await load()`. Images become textures in the stage's\n * registry (frames of a sprite sheet named 0, 1, 2…); JSON, text and Tiled maps are kept here by key. A failed asset\n * fails the whole load with its URL in the message.\n *\n * ```ts\n * override async onEnter() {\n * const assets = new AssetLoader(this.engine.stage.textures);\n * assets.spritesheet('hero', 'art/hero.png', { frameWidth: 20, frameHeight: 24 }).tilemap('level', 'maps/level.tmj');\n * await assets.load(({ done, total }) => bar.set(done / total));\n * const map = assets.map('level');\n * }\n * ```\n */\nexport class AssetLoader {\n private readonly queue: Job[] = [];\n private readonly data = new Map<string, unknown>();\n private readonly maps = new Map<string, TileMap>();\n private readonly fetcher: NonNullable<AssetLoaderOptions['fetch']>;\n private readonly toCanvas: (blob: Blob) => Promise<HTMLCanvasElement>;\n private total = 0;\n private done = 0;\n\n constructor(\n private readonly textures: TextureSink,\n private readonly options: AssetLoaderOptions = {},\n ) {\n this.fetcher = options.fetch ?? ((url) => fetch(url));\n this.toCanvas = options.toCanvas ?? defaultToCanvas;\n }\n\n image(key: string, url: string): this {\n return this.add(key, async () => {\n this.textures.addCanvas(key, await this.toCanvas(await this.blob(url)));\n });\n }\n\n /** An image cut into equal frames named 0, 1, 2…, left to right, then row by row. */\n spritesheet(key: string, url: string, size: { frameWidth: number; frameHeight: number }): this {\n return this.add(key, async () => {\n this.textures.addSpriteSheet(key, await this.toCanvas(await this.blob(url)), size);\n });\n }\n\n json(key: string, url: string): this {\n return this.add(key, async () => {\n this.data.set(key, await (await this.request(url)).json());\n });\n }\n\n text(key: string, url: string): this {\n return this.add(key, async () => {\n this.data.set(key, await (await this.request(url)).text());\n });\n }\n\n /** A Tiled JSON map, then every tileset image it names (resolved beside the map file). */\n tilemap(key: string, url: string, options: TilemapAssetOptions = {}): this {\n return this.add(key, async () => {\n const map = parseTiled(await (await this.request(url)).json());\n this.maps.set(key, map);\n const textureKey = options.textureKey ?? ((ts: Tileset) => ts.name);\n for (const ts of map.tilesets) this.image(textureKey(ts), resolveUrl(ts.image, url));\n });\n }\n\n /** Runs everything queued; `onProgress` after each asset. Safe to call again after queueing more. */\n async load(onProgress?: (p: LoadProgress) => void): Promise<void> {\n const limit = Math.max(1, this.options.concurrency ?? 6);\n const worker = async (): Promise<void> => {\n for (let job = this.queue.shift(); job; job = this.queue.shift()) {\n await job.run();\n this.done++;\n onProgress?.({ done: this.done, total: this.total, key: job.key });\n }\n };\n // a finished tilemap queues its tilesets: keep draining until nothing is left\n while (this.queue.length) await Promise.all(Array.from({ length: limit }, worker));\n }\n\n /** A loaded JSON value. */\n getJson<T = unknown>(key: string): T {\n if (!this.data.has(key)) throw new Error(`AssetLoader: no JSON or text loaded as \"${key}\"`);\n return this.data.get(key) as T;\n }\n\n /** A loaded text file. */\n getText(key: string): string {\n return this.getJson<string>(key);\n }\n\n /** A loaded Tiled map. */\n map(key: string): TileMap {\n const m = this.maps.get(key);\n if (!m) throw new Error(`AssetLoader: no tilemap loaded as \"${key}\"`);\n return m;\n }\n\n private add(key: string, run: () => Promise<void>): this {\n this.queue.push({ key, run });\n this.total++;\n return this;\n }\n\n private async request(url: string) {\n const full = resolveUrl(url, this.options.baseUrl ?? '');\n let res;\n try {\n res = await this.fetcher(full);\n } catch (err) {\n throw new Error(`AssetLoader: could not fetch ${full}: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (!res.ok) throw new Error(`AssetLoader: ${full} answered ${res.status}`);\n return res;\n }\n\n private async blob(url: string): Promise<Blob> {\n return (await this.request(url)).blob();\n }\n}\n"],"names":["resolveUrl","url","base","parts","out","p","defaultToCanvas","blob","bitmap","canvas","ctx","AssetLoader","textures","options","key","size","map","parseTiled","textureKey","ts","onProgress","limit","worker","job","m","run","full","res","err"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Texture as u, Rectangle as g } from "pixi.js";
|
|
2
|
+
import { parseAseprite as l } from "../anim/parseAseprite.js";
|
|
3
|
+
import { resolveUrl as h } from "./AssetLoader.js";
|
|
4
|
+
function p(i, t, r, a) {
|
|
5
|
+
const o = i.addCanvas(t, r);
|
|
6
|
+
for (const e of a.frames) {
|
|
7
|
+
const { x: s, y: n, w: c, h: m } = e.rect;
|
|
8
|
+
if (!e.trimmed) {
|
|
9
|
+
o.add(String(e.index), 0, s, n, c, m);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
o.frames.get(String(e.index))?.destroy(), o.frames.set(
|
|
13
|
+
String(e.index),
|
|
14
|
+
new u({
|
|
15
|
+
source: o.source,
|
|
16
|
+
frame: new g(s, n, c, m),
|
|
17
|
+
orig: new g(0, 0, e.sourceW, e.sourceH),
|
|
18
|
+
trim: new g(e.offsetX, e.offsetY, c, m)
|
|
19
|
+
})
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
return o;
|
|
23
|
+
}
|
|
24
|
+
async function A(i, t, r, a = {}) {
|
|
25
|
+
const o = a.fetch ?? ((f) => fetch(f)), e = async (f) => {
|
|
26
|
+
let w;
|
|
27
|
+
try {
|
|
28
|
+
w = await o(f);
|
|
29
|
+
} catch (d) {
|
|
30
|
+
throw new Error(`loadAseprite: could not fetch ${f}: ${d instanceof Error ? d.message : String(d)}`);
|
|
31
|
+
}
|
|
32
|
+
if (!w.ok) throw new Error(`loadAseprite: ${f} answered ${w.status}`);
|
|
33
|
+
return w;
|
|
34
|
+
}, s = h(r, a.baseUrl ?? ""), n = l(await (await e(s)).json());
|
|
35
|
+
if (!n.image) throw new Error(`loadAseprite: ${s} names no sheet image (meta.image)`);
|
|
36
|
+
const c = await (await e(h(n.image, s))).blob(), m = await (a.toCanvas ?? x)(c);
|
|
37
|
+
return p(i, t, m, n), n;
|
|
38
|
+
}
|
|
39
|
+
async function x(i) {
|
|
40
|
+
const t = await createImageBitmap(i), r = document.createElement("canvas");
|
|
41
|
+
r.width = t.width, r.height = t.height;
|
|
42
|
+
const a = r.getContext("2d");
|
|
43
|
+
if (!a) throw new Error("loadAseprite: no 2D context (out of canvas memory?)");
|
|
44
|
+
return a.drawImage(t, 0, 0), t.close(), r;
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
p as addAsepriteTextures,
|
|
48
|
+
A as loadAseprite
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=loadAseprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadAseprite.js","sources":["../../src/assets/loadAseprite.ts"],"sourcesContent":["import { Rectangle, Texture } from 'pixi.js';\nimport { parseAseprite } from '../anim/parseAseprite';\nimport type { AsepriteSheet } from '../anim/asepriteTypes';\nimport type { CanvasTexture } from '../core/TextureRegistry';\nimport { resolveUrl, type AssetLoaderOptions } from './AssetLoader';\n\n/** Where an Aseprite sheet's texture goes: the stage's `TextureRegistry` satisfies it. */\nexport interface AsepriteTextureSink {\n addCanvas(key: string, canvas: HTMLCanvasElement): CanvasTexture;\n}\n\n/** Fetch and decode hooks, as `AssetLoader` takes them (tests, custom transports, a base URL). */\nexport type AsepriteLoadOptions = Pick<AssetLoaderOptions, 'baseUrl' | 'fetch' | 'toCanvas'>;\n\n/**\n * Registers `canvas` (the sheet image) under `key` with one frame per sheet frame, named by its index (\"0\", \"1\"…), so\n * the clips `parseAseprite` returns play on an `Image` of that key as they are. A trimmed frame keeps its untrimmed\n * size and offset (Pixi's `orig` and `trim`), so a sprite anchored at its feet does not jump as the trim changes.\n */\nexport function addAsepriteTextures(textures: AsepriteTextureSink, key: string, canvas: HTMLCanvasElement, sheet: AsepriteSheet): CanvasTexture {\n const tex = textures.addCanvas(key, canvas);\n for (const f of sheet.frames) {\n const { x, y, w, h } = f.rect;\n if (!f.trimmed) {\n tex.add(String(f.index), 0, x, y, w, h);\n continue;\n }\n tex.frames.get(String(f.index))?.destroy();\n tex.frames.set(\n String(f.index),\n new Texture({\n source: tex.source,\n frame: new Rectangle(x, y, w, h),\n orig: new Rectangle(0, 0, f.sourceW, f.sourceH),\n trim: new Rectangle(f.offsetX, f.offsetY, w, h),\n }),\n );\n }\n return tex;\n}\n\n/**\n * Loads an Aseprite export — the JSON, then the sheet image it names (resolved beside the JSON) — registers its\n * frames under `key` and returns the parsed sheet (clips, slices, layers, cues).\n *\n * ```ts\n * const [hero] = await Promise.all([loadAseprite(stage.textures, 'hero', 'art/hero.json'), assets.load()]);\n * const sprite = stage.add.image(0, 0, 'hero', 0);\n * const anim = new Animator(hero.clips, 'idle');\n * ```\n */\nexport async function loadAseprite(textures: AsepriteTextureSink, key: string, jsonUrl: string, options: AsepriteLoadOptions = {}): Promise<AsepriteSheet> {\n const fetcher = options.fetch ?? ((url: string) => fetch(url));\n const get = async (url: string) => {\n let res;\n try {\n res = await fetcher(url);\n } catch (err) {\n throw new Error(`loadAseprite: could not fetch ${url}: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (!res.ok) throw new Error(`loadAseprite: ${url} answered ${res.status}`);\n return res;\n };\n const jsonFull = resolveUrl(jsonUrl, options.baseUrl ?? '');\n const sheet = parseAseprite(await (await get(jsonFull)).json());\n if (!sheet.image) throw new Error(`loadAseprite: ${jsonFull} names no sheet image (meta.image)`);\n const blob = await (await get(resolveUrl(sheet.image, jsonFull))).blob();\n const canvas = await (options.toCanvas ?? blobToCanvas)(blob);\n addAsepriteTextures(textures, key, canvas, sheet);\n return sheet;\n}\n\nasync function blobToCanvas(blob: Blob): Promise<HTMLCanvasElement> {\n const bitmap = await createImageBitmap(blob);\n const canvas = document.createElement('canvas');\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('loadAseprite: no 2D context (out of canvas memory?)');\n ctx.drawImage(bitmap, 0, 0);\n bitmap.close();\n return canvas;\n}\n"],"names":["addAsepriteTextures","textures","key","canvas","sheet","tex","f","x","y","w","h","Texture","Rectangle","loadAseprite","jsonUrl","options","fetcher","url","get","res","err","jsonFull","resolveUrl","parseAseprite","blob","blobToCanvas","bitmap","ctx"],"mappings":";;;AAmBO,SAASA,EAAoBC,GAA+BC,GAAaC,GAA2BC,GAAqC;AAC9I,QAAMC,IAAMJ,EAAS,UAAUC,GAAKC,CAAM;AAC1C,aAAWG,KAAKF,EAAM,QAAQ;AAC5B,UAAM,EAAE,GAAAG,GAAG,GAAAC,GAAG,GAAAC,GAAG,GAAAC,EAAA,IAAMJ,EAAE;AACzB,QAAI,CAACA,EAAE,SAAS;AACd,MAAAD,EAAI,IAAI,OAAOC,EAAE,KAAK,GAAG,GAAGC,GAAGC,GAAGC,GAAGC,CAAC;AACtC;AAAA,IACF;AACA,IAAAL,EAAI,OAAO,IAAI,OAAOC,EAAE,KAAK,CAAC,GAAG,QAAA,GACjCD,EAAI,OAAO;AAAA,MACT,OAAOC,EAAE,KAAK;AAAA,MACd,IAAIK,EAAQ;AAAA,QACV,QAAQN,EAAI;AAAA,QACZ,OAAO,IAAIO,EAAUL,GAAGC,GAAGC,GAAGC,CAAC;AAAA,QAC/B,MAAM,IAAIE,EAAU,GAAG,GAAGN,EAAE,SAASA,EAAE,OAAO;AAAA,QAC9C,MAAM,IAAIM,EAAUN,EAAE,SAASA,EAAE,SAASG,GAAGC,CAAC;AAAA,MAAA,CAC/C;AAAA,IAAA;AAAA,EAEL;AACA,SAAOL;AACT;AAYA,eAAsBQ,EAAaZ,GAA+BC,GAAaY,GAAiBC,IAA+B,CAAA,GAA4B;AACzJ,QAAMC,IAAUD,EAAQ,UAAU,CAACE,MAAgB,MAAMA,CAAG,IACtDC,IAAM,OAAOD,MAAgB;AACjC,QAAIE;AACJ,QAAI;AACF,MAAAA,IAAM,MAAMH,EAAQC,CAAG;AAAA,IACzB,SAASG,GAAK;AACZ,YAAM,IAAI,MAAM,iCAAiCH,CAAG,KAAKG,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,CAAC,EAAE;AAAA,IAC7G;AACA,QAAI,CAACD,EAAI,GAAI,OAAM,IAAI,MAAM,iBAAiBF,CAAG,aAAaE,EAAI,MAAM,EAAE;AAC1E,WAAOA;AAAA,EACT,GACME,IAAWC,EAAWR,GAASC,EAAQ,WAAW,EAAE,GACpDX,IAAQmB,EAAc,OAAO,MAAML,EAAIG,CAAQ,GAAG,MAAM;AAC9D,MAAI,CAACjB,EAAM,MAAO,OAAM,IAAI,MAAM,iBAAiBiB,CAAQ,oCAAoC;AAC/F,QAAMG,IAAO,OAAO,MAAMN,EAAII,EAAWlB,EAAM,OAAOiB,CAAQ,CAAC,GAAG,KAAA,GAC5DlB,IAAS,OAAOY,EAAQ,YAAYU,GAAcD,CAAI;AAC5D,SAAAxB,EAAoBC,GAAUC,GAAKC,GAAQC,CAAK,GACzCA;AACT;AAEA,eAAeqB,EAAaD,GAAwC;AAClE,QAAME,IAAS,MAAM,kBAAkBF,CAAI,GACrCrB,IAAS,SAAS,cAAc,QAAQ;AAC9C,EAAAA,EAAO,QAAQuB,EAAO,OACtBvB,EAAO,SAASuB,EAAO;AACvB,QAAMC,IAAMxB,EAAO,WAAW,IAAI;AAClC,MAAI,CAACwB,EAAK,OAAM,IAAI,MAAM,qDAAqD;AAC/E,SAAAA,EAAI,UAAUD,GAAQ,GAAG,CAAC,GAC1BA,EAAO,MAAA,GACAvB;AACT;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function m(l, h) {
|
|
2
|
+
const a = l[0]?.length ?? 0, f = 1 / Math.max(1, l.length), e = new Float32Array(a);
|
|
3
|
+
for (const t of l) for (let n = 0; n < a; n++) e[n] += t[n] * f;
|
|
4
|
+
let r = 0;
|
|
5
|
+
for (let t = 0; t < a; t++) {
|
|
6
|
+
const n = Math.abs(e[t]);
|
|
7
|
+
n > r && (r = n);
|
|
8
|
+
}
|
|
9
|
+
if (r < 5e-3) return null;
|
|
10
|
+
const i = r * 0.01;
|
|
11
|
+
let s = 0;
|
|
12
|
+
for (; s < a && Math.abs(e[s]) < i; ) s++;
|
|
13
|
+
let c = a;
|
|
14
|
+
for (; c > s && Math.abs(e[c - 1]) < i; ) c--;
|
|
15
|
+
if (c <= s) return null;
|
|
16
|
+
s = Math.max(0, s - Math.round(2e-3 * h));
|
|
17
|
+
const o = e.slice(s, c);
|
|
18
|
+
let M = 0;
|
|
19
|
+
for (let t = 0; t < o.length; t++) M += o[t] * o[t];
|
|
20
|
+
const d = Math.sqrt(M / o.length), g = Math.min(0.16 / Math.max(d, 1e-6), 0.95 / r), E = Math.min(o.length, Math.round(0.01 * h));
|
|
21
|
+
for (let t = 0; t < o.length; t++) {
|
|
22
|
+
const n = o.length - t;
|
|
23
|
+
o[t] *= g * (n < E ? n / E : 1);
|
|
24
|
+
}
|
|
25
|
+
return o;
|
|
26
|
+
}
|
|
27
|
+
self.onmessage = (l) => {
|
|
28
|
+
const { id: h, channels: a, sampleRate: f } = l.data, e = m(a, f);
|
|
29
|
+
self.postMessage({ id: h, data: e }, e ? { transfer: [e.buffer] } : void 0);
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=takeCleanerWorker-DTcI_Jqr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeCleanerWorker-DTcI_Jqr.js","sources":["../src/audio/cleanTake.ts","../src/audio/takeCleanerWorker.ts"],"sourcesContent":["/*\n * Cleans one recorded take (`SampleBank`): folded to mono, the silence an encoder or the model leaves at the start cut\n * (a swing heard 30 ms late reads as lag) and at the end trimmed, and brought to one loudness (`LOUDNESS`, RMS of what\n * is left, never past `PEAK`), so takes from different prompts sit at one level. Pure: run in `takeCleanerWorker.ts`,\n * because on the main thread the first blows of a fight froze the game 70–170 ms a take on a Mac and several times\n * that on a phone (profiled).\n */\n\n/** Below this share of the take's own peak a sample counts as silence when trimming (-40 dB). */\nconst FLOOR = 0.01;\n/** A take whose peak is under this is treated as empty (about -46 dBFS): the model returned near-silence. */\nconst EMPTY = 0.005;\n/** Target RMS of a cleaned take (-16 dBFS) and the peak it may not pass. */\nconst LOUDNESS = 0.16;\nconst PEAK = 0.95;\n/** Kept before the first loud sample, so the attack is not clipped into a click (s). */\nconst LEAD = 0.002;\n/** A short fade over the cut end, so a trimmed tail does not click (s). */\nconst TAIL_FADE = 0.01;\n\n/** The cleaned mono samples, or null for a take that is silence. */\nexport function cleanSamples(channels: Float32Array[], sampleRate: number): Float32Array | null {\n const n = channels[0]?.length ?? 0;\n const k0 = 1 / Math.max(1, channels.length);\n const mono = new Float32Array(n);\n for (const ch of channels) for (let i = 0; i < n; i++) mono[i]! += ch[i]! * k0;\n let top = 0;\n for (let i = 0; i < n; i++) {\n const a = Math.abs(mono[i]!);\n if (a > top) top = a;\n }\n if (top < EMPTY) return null;\n const floor = top * FLOOR;\n let start = 0;\n while (start < n && Math.abs(mono[start]!) < floor) start++;\n let end = n;\n while (end > start && Math.abs(mono[end - 1]!) < floor) end--;\n if (end <= start) return null;\n start = Math.max(0, start - Math.round(LEAD * sampleRate));\n const data = mono.slice(start, end);\n let power = 0;\n for (let i = 0; i < data.length; i++) power += data[i]! * data[i]!;\n const rms = Math.sqrt(power / data.length);\n const k = Math.min(LOUDNESS / Math.max(rms, 1e-6), PEAK / top);\n const fade = Math.min(data.length, Math.round(TAIL_FADE * sampleRate));\n for (let i = 0; i < data.length; i++) {\n const left = data.length - i;\n data[i]! *= k * (left < fade ? left / fade : 1);\n }\n return data;\n}\n","import { cleanSamples } from './cleanTake';\n\n/* Cleans recorded takes off the main thread (`SampleBank`); one message per take, answered with its id. */\nself.onmessage = (e: MessageEvent<{ id: number; channels: Float32Array[]; sampleRate: number }>) => {\n const { id, channels, sampleRate } = e.data;\n const data = cleanSamples(channels, sampleRate);\n self.postMessage({ id, data }, data ? { transfer: [data.buffer as ArrayBuffer] } : undefined);\n};\n"],"names":["cleanSamples","channels","sampleRate","n","k0","mono","ch","i","top","a","floor","start","end","data","power","rms","k","fade","left","e","id"],"mappings":"AAqBO,SAASA,EAAaC,GAA0BC,GAAyC;AAC9F,QAAMC,IAAIF,EAAS,CAAC,GAAG,UAAU,GAC3BG,IAAK,IAAI,KAAK,IAAI,GAAGH,EAAS,MAAM,GACpCI,IAAO,IAAI,aAAaF,CAAC;AAC/B,aAAWG,KAAML,EAAU,UAASM,IAAI,GAAGA,IAAIJ,GAAGI,IAAK,CAAAF,EAAKE,CAAC,KAAMD,EAAGC,CAAC,IAAKH;AAC5E,MAAII,IAAM;AACV,WAASD,IAAI,GAAGA,IAAIJ,GAAGI,KAAK;AAC1B,UAAME,IAAI,KAAK,IAAIJ,EAAKE,CAAC,CAAE;AAC3B,IAAIE,IAAID,MAAKA,IAAMC;AAAA,EACrB;AACA,MAAID,IAAM,KAAO,QAAO;AACxB,QAAME,IAAQF,IAAM;AACpB,MAAIG,IAAQ;AACZ,SAAOA,IAAQR,KAAK,KAAK,IAAIE,EAAKM,CAAK,CAAE,IAAID,IAAO,CAAAC;AACpD,MAAIC,IAAMT;AACV,SAAOS,IAAMD,KAAS,KAAK,IAAIN,EAAKO,IAAM,CAAC,CAAE,IAAIF,IAAO,CAAAE;AACxD,MAAIA,KAAOD,EAAO,QAAO;AACzB,EAAAA,IAAQ,KAAK,IAAI,GAAGA,IAAQ,KAAK,MAAM,OAAOT,CAAU,CAAC;AACzD,QAAMW,IAAOR,EAAK,MAAMM,GAAOC,CAAG;AAClC,MAAIE,IAAQ;AACZ,WAASP,IAAI,GAAGA,IAAIM,EAAK,QAAQN,IAAK,CAAAO,KAASD,EAAKN,CAAC,IAAKM,EAAKN,CAAC;AAChE,QAAMQ,IAAM,KAAK,KAAKD,IAAQD,EAAK,MAAM,GACnCG,IAAI,KAAK,IAAI,OAAW,KAAK,IAAID,GAAK,IAAI,GAAG,OAAOP,CAAG,GACvDS,IAAO,KAAK,IAAIJ,EAAK,QAAQ,KAAK,MAAM,OAAYX,CAAU,CAAC;AACrE,WAASK,IAAI,GAAGA,IAAIM,EAAK,QAAQN,KAAK;AACpC,UAAMW,IAAOL,EAAK,SAASN;AAC3B,IAAAM,EAAKN,CAAC,KAAMS,KAAKE,IAAOD,IAAOC,IAAOD,IAAO;AAAA,EAC/C;AACA,SAAOJ;AACT;AC/CA,KAAK,YAAY,CAACM,MAAkF;AAClG,QAAM,EAAE,IAAAC,GAAI,UAAAnB,GAAU,YAAAC,EAAA,IAAeiB,EAAE,MACjCN,IAAOb,EAAaC,GAAUC,CAAU;AAC9C,OAAK,YAAY,EAAE,IAAAkB,GAAI,MAAAP,EAAA,GAAQA,IAAO,EAAE,UAAU,CAACA,EAAK,MAAqB,EAAA,IAAM,MAAS;AAC9F;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { sound as n } from "./SoundEngine.js";
|
|
2
|
+
class u {
|
|
3
|
+
constructor(s) {
|
|
4
|
+
this.options = s;
|
|
5
|
+
}
|
|
6
|
+
options;
|
|
7
|
+
surfaceAt = () => {
|
|
8
|
+
};
|
|
9
|
+
/** Where the surface of a world point comes from; `undefined` is the fallback surface. */
|
|
10
|
+
setSurfaceAt(s) {
|
|
11
|
+
this.surfaceAt = s;
|
|
12
|
+
}
|
|
13
|
+
/** The surface at a world point. */
|
|
14
|
+
surface(s, o) {
|
|
15
|
+
return this.surfaceAt(s, o) ?? this.options.fallback;
|
|
16
|
+
}
|
|
17
|
+
/** One step (or a beat of hooves when `mounted`) at the feet, world x/y; `local` is the player's own. */
|
|
18
|
+
step(s, o, e, a = !1) {
|
|
19
|
+
const t = this.options, r = t.sounds[this.surface(s, o)] ?? t.sounds[t.fallback];
|
|
20
|
+
r && n.play(a ? r.hoof ?? r.step : r.step, { x: s, y: o, local: e, gain: t.gain ?? 0.5, range: t.range ?? 200, minor: !0 });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
u as Footsteps
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=Footsteps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footsteps.js","sources":["../../src/audio/Footsteps.ts"],"sourcesContent":["import { sound } from './SoundEngine';\n\n/** What a surface sounds like underfoot: a step, and a beat of hooves (a mount) if it differs. */\nexport interface SurfaceSounds {\n step: string;\n hoof?: string;\n}\n\nexport interface FootstepOptions {\n /** Per surface name (`'grass'`, `'stone'`, `'wood'`…), the sounds a foot makes on it. */\n sounds: Record<string, SurfaceSounds>;\n /** The surface of anywhere `surfaceAt` does not name. */\n fallback: string;\n /** Weight of a step against other sounds (default 0.5). */\n gain?: number;\n /** Beyond this (world px) nobody else's steps are heard (default 200). */\n range?: number;\n}\n\n/**\n * Footsteps by the ground under the feet. The game says what a point is made of (`surfaceAt`: a tile's surface, a\n * Tiled property, a floor collider), and calls `step` on each beat of a walk or a gait; the sound is the surface's,\n * through `sound` at the feet, quieter and muffled with distance like every other sound, and dropped first when too\n * many sounds play at once.\n */\nexport class Footsteps {\n private surfaceAt: (x: number, y: number) => string | undefined = () => undefined;\n\n constructor(private readonly options: FootstepOptions) {}\n\n /** Where the surface of a world point comes from; `undefined` is the fallback surface. */\n setSurfaceAt(surfaceAt: (x: number, y: number) => string | undefined): void {\n this.surfaceAt = surfaceAt;\n }\n\n /** The surface at a world point. */\n surface(x: number, y: number): string {\n return this.surfaceAt(x, y) ?? this.options.fallback;\n }\n\n /** One step (or a beat of hooves when `mounted`) at the feet, world x/y; `local` is the player's own. */\n step(x: number, y: number, local: boolean, mounted = false): void {\n const o = this.options;\n const s = o.sounds[this.surface(x, y)] ?? o.sounds[o.fallback];\n if (!s) return;\n sound.play(mounted ? (s.hoof ?? s.step) : s.step, { x, y, local, gain: o.gain ?? 0.5, range: o.range ?? 200, minor: true });\n }\n}\n"],"names":["Footsteps","options","surfaceAt","x","y","local","mounted","o","s","sound"],"mappings":";AAyBO,MAAMA,EAAU;AAAA,EAGrB,YAA6BC,GAA0B;AAA1B,SAAA,UAAAA;AAAA,EAA2B;AAAA,EAA3B;AAAA,EAFrB,YAA0D,MAAA;AAAA;AAAA;AAAA,EAKlE,aAAaC,GAA+D;AAC1E,SAAK,YAAYA;AAAA,EACnB;AAAA;AAAA,EAGA,QAAQC,GAAWC,GAAmB;AACpC,WAAO,KAAK,UAAUD,GAAGC,CAAC,KAAK,KAAK,QAAQ;AAAA,EAC9C;AAAA;AAAA,EAGA,KAAKD,GAAWC,GAAWC,GAAgBC,IAAU,IAAa;AAChE,UAAMC,IAAI,KAAK,SACTC,IAAID,EAAE,OAAO,KAAK,QAAQJ,GAAGC,CAAC,CAAC,KAAKG,EAAE,OAAOA,EAAE,QAAQ;AAC7D,IAAKC,KACLC,EAAM,KAAKH,IAAWE,EAAE,QAAQA,EAAE,OAAQA,EAAE,MAAM,EAAE,GAAAL,GAAG,GAAAC,GAAG,OAAAC,GAAO,MAAME,EAAE,QAAQ,KAAK,OAAOA,EAAE,SAAS,KAAK,OAAO,GAAA,CAAM;AAAA,EAC5H;AACF;"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { engineSettings as n } from "../settings.js";
|
|
2
|
+
import { isTouchUi as r } from "../platform/touch.js";
|
|
3
|
+
import { ElementVoice as i } from "./music/ElementVoice.js";
|
|
4
|
+
import { GraphVoice as o } from "./music/GraphVoice.js";
|
|
5
|
+
import { MusicChannel as h } from "./music/MusicChannel.js";
|
|
6
|
+
import { elementVolumeLocked as u } from "./music/musicVoice.js";
|
|
7
|
+
class a {
|
|
8
|
+
channels = /* @__PURE__ */ new Map();
|
|
9
|
+
route = "auto";
|
|
10
|
+
graph = null;
|
|
11
|
+
graphLocked = null;
|
|
12
|
+
pauseInBackground = null;
|
|
13
|
+
installed = !1;
|
|
14
|
+
/** Picks the route and background behaviour; call before the first track for the route to apply to every track. */
|
|
15
|
+
configure(e) {
|
|
16
|
+
return e.route && (this.route = e.route), e.pauseInBackground !== void 0 && (this.pauseInBackground = e.pauseInBackground), this;
|
|
17
|
+
}
|
|
18
|
+
/** The channel named `name`, made on first use. */
|
|
19
|
+
channel(e = "music") {
|
|
20
|
+
let t = this.channels.get(e);
|
|
21
|
+
return t || (this.install(), t = new h(() => n.getState().musicVolume, (s) => this.voiceFor(s)), this.channels.set(e, t)), t;
|
|
22
|
+
}
|
|
23
|
+
/** The url the `'music'` channel plays, if any. */
|
|
24
|
+
get current() {
|
|
25
|
+
return this.channels.get("music")?.current ?? null;
|
|
26
|
+
}
|
|
27
|
+
/** Plays `url` on the `'music'` channel. */
|
|
28
|
+
play(e, t) {
|
|
29
|
+
this.channel().play(e, t);
|
|
30
|
+
}
|
|
31
|
+
/** Fades every channel out. */
|
|
32
|
+
stop(e = 1200) {
|
|
33
|
+
for (const t of this.channels.values()) t.stop(e);
|
|
34
|
+
}
|
|
35
|
+
pause() {
|
|
36
|
+
for (const e of this.channels.values()) e.pause();
|
|
37
|
+
}
|
|
38
|
+
resume() {
|
|
39
|
+
this.wake();
|
|
40
|
+
}
|
|
41
|
+
destroy() {
|
|
42
|
+
for (const e of this.channels.values()) e.dispose();
|
|
43
|
+
this.channels.clear(), this.graph?.close(), this.graph = null;
|
|
44
|
+
}
|
|
45
|
+
voiceFor(e) {
|
|
46
|
+
const t = this.throughGraph() ? this.context() : null;
|
|
47
|
+
return t ? new o(e, t) : new i(e);
|
|
48
|
+
}
|
|
49
|
+
throughGraph() {
|
|
50
|
+
return this.route !== "auto" ? this.route === "graph" : this.graphLocked ??= u();
|
|
51
|
+
}
|
|
52
|
+
context() {
|
|
53
|
+
if (this.graph) return this.graph;
|
|
54
|
+
const e = globalThis.AudioContext ?? globalThis.webkitAudioContext;
|
|
55
|
+
return e ? (this.graph = new e(), this.graph) : null;
|
|
56
|
+
}
|
|
57
|
+
/** Retries every refused start and follows the volume; the graph's context resumes inside the gesture that called it. */
|
|
58
|
+
wake() {
|
|
59
|
+
if (this.graph && this.graph.state !== "running" && this.graph.resume().catch(() => {
|
|
60
|
+
}), !(typeof document < "u" && document.hidden))
|
|
61
|
+
for (const e of this.channels.values()) e.refresh();
|
|
62
|
+
}
|
|
63
|
+
install() {
|
|
64
|
+
if (this.installed || typeof window > "u") return;
|
|
65
|
+
this.installed = !0;
|
|
66
|
+
const e = () => this.wake();
|
|
67
|
+
for (const t of ["pointerdown", "touchend", "keydown"]) window.addEventListener(t, e, { capture: !0 });
|
|
68
|
+
n.subscribe(e), document.addEventListener("visibilitychange", () => {
|
|
69
|
+
(this.pauseInBackground ?? r()) && (document.hidden ? this.pause() : e());
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const w = new a();
|
|
74
|
+
export {
|
|
75
|
+
a as MusicPlayer,
|
|
76
|
+
w as music
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=MusicPlayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MusicPlayer.js","sources":["../../src/audio/MusicPlayer.ts"],"sourcesContent":["import { engineSettings } from '../settings';\nimport { isTouchUi } from '../platform/touch';\nimport { ElementVoice } from './music/ElementVoice';\nimport { GraphVoice } from './music/GraphVoice';\nimport { MusicChannel, type PlayOptions } from './music/MusicChannel';\nimport { elementVolumeLocked, type MusicVoice } from './music/musicVoice';\n\nexport type { PlayOptions } from './music/MusicChannel';\n\n/**\n * How music reaches the speaker: `'element'` on the `<audio>` element's own volume (nothing in between; a file from\n * another origin plays as it is), `'graph'` through a Web Audio gain (the only way where that volume is read-only),\n * `'auto'` (default) the graph only where it has to be (iOS).\n */\nexport type MusicRoute = 'auto' | 'element' | 'graph';\n\nexport interface MusicOptions {\n route?: MusicRoute;\n /** Stop the music while the page is hidden (an app sent to the background). Default: on touch devices. */\n pauseInBackground?: boolean;\n}\n\n/**\n * Background music in layers: each named channel (`'music'` by default, `'ambience'`, any other) plays one looping\n * track at a time, crossfaded when it changes, all at `engineSettings.musicVolume`. Tracks stream through `<audio>`\n * elements (no decoding a whole song into memory).\n *\n * Browsers start sound only after a user gesture: a track played before one starts on the first tap or key. On iOS the\n * graph's context is woken inside that gesture too, and again after the app comes back from the background.\n *\n * ```ts\n * music.play('music/forest.ogg'); // the 'music' channel\n * music.channel('ambience').play('amb/wind.ogg', { volume: 0.5 }); // a second layer under it\n * music.play('music/boss.ogg', { fadeMs: 600 }); // crossfades the first only\n * music.stop(2000);\n * ```\n */\nexport class MusicPlayer {\n private readonly channels = new Map<string, MusicChannel>();\n private route: MusicRoute = 'auto';\n private graph: AudioContext | null = null;\n private graphLocked: boolean | null = null;\n private pauseInBackground: boolean | null = null;\n private installed = false;\n\n /** Picks the route and background behaviour; call before the first track for the route to apply to every track. */\n configure(options: MusicOptions): this {\n if (options.route) this.route = options.route;\n if (options.pauseInBackground !== undefined) this.pauseInBackground = options.pauseInBackground;\n return this;\n }\n\n /** The channel named `name`, made on first use. */\n channel(name = 'music'): MusicChannel {\n let ch = this.channels.get(name);\n if (!ch) {\n this.install();\n ch = new MusicChannel(() => engineSettings.getState().musicVolume, (el) => this.voiceFor(el));\n this.channels.set(name, ch);\n }\n return ch;\n }\n\n /** The url the `'music'` channel plays, if any. */\n get current(): string | null {\n return this.channels.get('music')?.current ?? null;\n }\n\n /** Plays `url` on the `'music'` channel. */\n play(url: string, options?: PlayOptions): void {\n this.channel().play(url, options);\n }\n\n /** Fades every channel out. */\n stop(fadeMs = 1200): void {\n for (const ch of this.channels.values()) ch.stop(fadeMs);\n }\n\n pause(): void {\n for (const ch of this.channels.values()) ch.pause();\n }\n\n resume(): void {\n this.wake();\n }\n\n destroy(): void {\n for (const ch of this.channels.values()) ch.dispose();\n this.channels.clear();\n void this.graph?.close();\n this.graph = null;\n }\n\n private voiceFor(el: HTMLAudioElement): MusicVoice {\n const graph = this.throughGraph() ? this.context() : null;\n return graph ? new GraphVoice(el, graph) : new ElementVoice(el);\n }\n\n private throughGraph(): boolean {\n if (this.route !== 'auto') return this.route === 'graph';\n return (this.graphLocked ??= elementVolumeLocked());\n }\n\n private context(): AudioContext | null {\n if (this.graph) return this.graph;\n const Ctor = (globalThis as { AudioContext?: typeof AudioContext; webkitAudioContext?: typeof AudioContext }).AudioContext ?? (globalThis as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Ctor) return null;\n this.graph = new Ctor();\n return this.graph;\n }\n\n /** Retries every refused start and follows the volume; the graph's context resumes inside the gesture that called it. */\n private wake(): void {\n if (this.graph && this.graph.state !== 'running') void this.graph.resume().catch(() => {});\n if (typeof document !== 'undefined' && document.hidden) return;\n for (const ch of this.channels.values()) ch.refresh();\n }\n\n private install(): void {\n if (this.installed || typeof window === 'undefined') return;\n this.installed = true;\n const wake = () => this.wake();\n // `touchend` is the gesture iOS accepts for starting media; the others are the desktop's\n for (const type of ['pointerdown', 'touchend', 'keydown'] as const) window.addEventListener(type, wake, { capture: true });\n engineSettings.subscribe(wake);\n document.addEventListener('visibilitychange', () => {\n if (!(this.pauseInBackground ?? isTouchUi())) return;\n if (document.hidden) this.pause();\n else wake();\n });\n }\n}\n\n/** A fade's value at `now`: linear from `from` to `to` over `ms`. */\nexport function fadeValue(f: { from: number; to: number; start: number; ms: number }, now: number): number {\n if (f.ms <= 0 || now >= f.start + f.ms) return f.to;\n if (now <= f.start) return f.from;\n return f.from + ((f.to - f.from) * (now - f.start)) / f.ms;\n}\n\n/** The shared music player. */\nexport const music = new MusicPlayer();\n"],"names":["MusicPlayer","options","name","ch","MusicChannel","engineSettings","el","url","fadeMs","graph","GraphVoice","ElementVoice","elementVolumeLocked","Ctor","wake","type","isTouchUi","music"],"mappings":";;;;;;AAqCO,MAAMA,EAAY;AAAA,EACN,+BAAe,IAAA;AAAA,EACxB,QAAoB;AAAA,EACpB,QAA6B;AAAA,EAC7B,cAA8B;AAAA,EAC9B,oBAAoC;AAAA,EACpC,YAAY;AAAA;AAAA,EAGpB,UAAUC,GAA6B;AACrC,WAAIA,EAAQ,UAAO,KAAK,QAAQA,EAAQ,QACpCA,EAAQ,sBAAsB,WAAW,KAAK,oBAAoBA,EAAQ,oBACvE;AAAA,EACT;AAAA;AAAA,EAGA,QAAQC,IAAO,SAAuB;AACpC,QAAIC,IAAK,KAAK,SAAS,IAAID,CAAI;AAC/B,WAAKC,MACH,KAAK,QAAA,GACLA,IAAK,IAAIC,EAAa,MAAMC,EAAe,SAAA,EAAW,aAAa,CAACC,MAAO,KAAK,SAASA,CAAE,CAAC,GAC5F,KAAK,SAAS,IAAIJ,GAAMC,CAAE,IAErBA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,UAAyB;AAC3B,WAAO,KAAK,SAAS,IAAI,OAAO,GAAG,WAAW;AAAA,EAChD;AAAA;AAAA,EAGA,KAAKI,GAAaN,GAA6B;AAC7C,SAAK,QAAA,EAAU,KAAKM,GAAKN,CAAO;AAAA,EAClC;AAAA;AAAA,EAGA,KAAKO,IAAS,MAAY;AACxB,eAAWL,KAAM,KAAK,SAAS,SAAU,CAAAA,EAAG,KAAKK,CAAM;AAAA,EACzD;AAAA,EAEA,QAAc;AACZ,eAAWL,KAAM,KAAK,SAAS,OAAA,KAAa,MAAA;AAAA,EAC9C;AAAA,EAEA,SAAe;AACb,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,UAAgB;AACd,eAAWA,KAAM,KAAK,SAAS,OAAA,KAAa,QAAA;AAC5C,SAAK,SAAS,MAAA,GACT,KAAK,OAAO,MAAA,GACjB,KAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,SAASG,GAAkC;AACjD,UAAMG,IAAQ,KAAK,aAAA,IAAiB,KAAK,YAAY;AACrD,WAAOA,IAAQ,IAAIC,EAAWJ,GAAIG,CAAK,IAAI,IAAIE,EAAaL,CAAE;AAAA,EAChE;AAAA,EAEQ,eAAwB;AAC9B,WAAI,KAAK,UAAU,SAAe,KAAK,UAAU,UACzC,KAAK,gBAAgBM,EAAA;AAAA,EAC/B;AAAA,EAEQ,UAA+B;AACrC,QAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,UAAMC,IAAQ,WAAgG,gBAAiB,WAA4D;AAC3L,WAAKA,KACL,KAAK,QAAQ,IAAIA,EAAA,GACV,KAAK,SAFM;AAAA,EAGpB;AAAA;AAAA,EAGQ,OAAa;AAEnB,QADI,KAAK,SAAS,KAAK,MAAM,UAAU,aAAgB,KAAK,MAAM,OAAA,EAAS,MAAM,MAAM;AAAA,IAAC,CAAC,GACrF,SAAO,WAAa,OAAe,SAAS;AAChD,iBAAWV,KAAM,KAAK,SAAS,OAAA,KAAa,QAAA;AAAA,EAC9C;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,aAAa,OAAO,SAAW,IAAa;AACrD,SAAK,YAAY;AACjB,UAAMW,IAAO,MAAM,KAAK,KAAA;AAExB,eAAWC,KAAQ,CAAC,eAAe,YAAY,SAAS,EAAY,QAAO,iBAAiBA,GAAMD,GAAM,EAAE,SAAS,IAAM;AACzH,IAAAT,EAAe,UAAUS,CAAI,GAC7B,SAAS,iBAAiB,oBAAoB,MAAM;AAClD,OAAM,KAAK,qBAAqBE,EAAA,OAC5B,SAAS,SAAQ,KAAK,MAAA,IACrBF,EAAA;AAAA,IACP,CAAC;AAAA,EACH;AACF;AAUO,MAAMG,IAAQ,IAAIjB,EAAA;"}
|