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 @@
|
|
|
1
|
+
{"version":3,"file":"WeatherLayer.js","sources":["../../src/ambient/WeatherLayer.ts"],"sourcesContent":["import { Sprite, Texture } from 'pixi.js';\nimport type { ViewRect } from '../core/Camera';\nimport type { Image } from '../core/Image';\nimport type { Stage } from '../core/Stage';\nimport type { WeatherState } from './weather';\n\n/**\n * How one kind of weather moves:\n * - `fall`: streaks falling at a slant onto a ground line somewhere in view, half of them leaving a two-frame splash\n * (rain);\n * - `flake`: bits drifting down and swaying as they fall, each on its own phase (snow, ash, petals);\n * - `bank`: a few wide sprites drifting slowly sideways, laid over the bodies (fog, mist, smoke).\n */\nexport type WeatherMotion = 'fall' | 'flake' | 'bank';\n\nexport interface WeatherLook {\n motion: WeatherMotion;\n /** Particles at full strength; fewer show as the weather thins. Keep it in the low hundreds on a phone. */\n max: number;\n /** Texture keys, handed out in turn (repeat a key to make it commoner). */\n keys: readonly string[];\n /** `fall` only: the splash's two frames. Without them a drop simply vanishes where it lands. */\n splash?: readonly [string, string];\n /** World px a second, [lo, hi] each (defaults suit each motion). */\n vx?: readonly [number, number];\n vy?: readonly [number, number];\n /** `flake` only: how far (px) a flake sways either side as it falls (default 4). */\n sway?: number;\n /** A screen-wide tint the kind lays over everything (fog is mostly tint), at `tintAlpha` × strength. */\n tint?: number;\n tintAlpha?: number;\n}\n\nexport interface WeatherLayerOptions<K extends string> {\n looks: Readonly<Partial<Record<K, WeatherLook>>>;\n /** Depth of falling particles in the world layer: over the bodies, under the names (default 900_001). */\n depth?: number;\n /** Depth of fog banks (default 900_010). */\n bankDepth?: number;\n /** Depth of splashes: with the ground effects, so a body standing in the rain is not splashed over (default 0). */\n splashDepth?: number;\n /** Round positions to whole world pixels (default true): pixel art wants it, smooth art may not. */\n snap?: boolean;\n /** Where randomness comes from (default `Math.random`); the look of a shower need not be shared between clients. */\n random?: () => number;\n}\n\ninterface Drop {\n img: Image;\n key: string;\n x: number;\n y: number;\n vx: number;\n vy: number;\n /** `fall`: the ground line it lands on. `flake`: its sway's phase. */\n ground: number;\n /** `fall`: when its splash began (0 while it still falls). */\n splashAt: number;\n}\n\nconst SPLASH_MS = 80;\nconst DEFAULT_V: Record<WeatherMotion, { vx: readonly [number, number]; vy: readonly [number, number] }> = {\n fall: { vx: [-48, -38], vy: [250, 320] },\n flake: { vx: [4, 12], vy: [14, 30] },\n bank: { vx: [3, 8], vy: [0, 0] },\n};\n\n/**\n * The weather on screen: a capped pool of particles that lives only inside the camera's view, plus a light screen\n * tint for the kinds that change the air. Feed it a `WeatherState` each frame (from `weatherAt`, so it fades in and\n * out exactly when every other client's does); the pool is rebuilt only when the kind changes, and a thinning shower\n * hides particles rather than freeing them.\n *\n * The art is the game's: name texture keys per kind (the pixel module's `paintWeatherArt` paints a set in whole\n * pixels).\n */\nexport class WeatherLayer<K extends string> {\n private readonly drops: Drop[] = [];\n private kind: K | 'clear' = 'clear';\n private look: WeatherLook | undefined;\n private readonly tint = new Sprite({ texture: Texture.WHITE });\n private readonly depth: number;\n private readonly bankDepth: number;\n private readonly splashDepth: number;\n private readonly snap: boolean;\n private readonly random: () => number;\n\n constructor(\n private readonly stage: Stage,\n private readonly options: WeatherLayerOptions<K>,\n ) {\n this.depth = options.depth ?? 900_001;\n this.bankDepth = options.bankDepth ?? 900_010;\n this.splashDepth = options.splashDepth ?? 0;\n this.snap = options.snap ?? true;\n this.random = options.random ?? Math.random;\n this.tint.visible = false;\n stage.screen.addChild(this.tint);\n }\n\n /**\n * `now` in ms, `dt` the frame's ms, `view` the camera's world view. `share` (0..1) thins the pool on top of the\n * weather's own strength (a reduced-effects setting keeps half).\n */\n update(now: number, dt: number, view: ViewRect, weather: WeatherState<K>, share = 1): void {\n if (weather.kind !== this.kind) this.rebuild(weather.kind, view);\n const look = this.look;\n const tintAlpha = (look?.tintAlpha ?? 0) * weather.intensity;\n this.tint.visible = tintAlpha > 0.004;\n if (this.tint.visible) {\n this.tint.tint = look?.tint ?? 0xffffff;\n this.tint.alpha = tintAlpha;\n this.tint.width = this.stage.width;\n this.tint.height = this.stage.height;\n }\n if (!look) return;\n const active = Math.round(this.drops.length * weather.intensity * Math.max(0, Math.min(1, share)));\n const s = dt / 1000;\n for (let i = 0; i < this.drops.length; i++) {\n const d = this.drops[i]!;\n if (i >= active) {\n if (d.img.visible) d.img.setVisible(false);\n continue;\n }\n if (!d.img.visible) this.spawn(d, look, view, false);\n if (look.motion === 'fall') this.stepFall(d, look, now, s, view);\n else if (look.motion === 'bank') this.stepBank(d, look, s, view, weather.intensity);\n else this.stepFlake(d, look, now, s, view);\n }\n }\n\n private rebuild(kind: K | 'clear', view: ViewRect): void {\n for (const d of this.drops) d.img.destroy();\n this.drops.length = 0;\n this.kind = kind;\n this.look = kind === 'clear' ? undefined : this.options.looks[kind];\n const look = this.look;\n if (!look || !look.keys.length) return;\n for (let i = 0; i < look.max; i++) {\n const key = look.keys[i % look.keys.length]!;\n const img = this.stage.add.image(0, 0, key).setOrigin(0, 0).setVisible(false);\n const d: Drop = { img, key, x: 0, y: 0, vx: 0, vy: 0, ground: 0, splashAt: 0 };\n this.drops.push(d);\n // the first fill is spread over the whole view, so a shower starting does not arrive as one falling sheet\n this.spawn(d, look, view, true);\n img.setVisible(false);\n }\n }\n\n private between(r: readonly [number, number]): number {\n return r[0] + (r[1] - r[0]) * this.random();\n }\n\n private place(d: Drop): void {\n d.img.setPosition(this.snap ? Math.round(d.x) : d.x, this.snap ? Math.round(d.y) : d.y);\n }\n\n private spawn(d: Drop, look: WeatherLook, view: ViewRect, anywhere: boolean): void {\n const r = this.random;\n const v = DEFAULT_V[look.motion];\n const x = view.x - 30 + r() * (view.width + 60);\n d.vx = this.between(look.vx ?? v.vx);\n d.vy = this.between(look.vy ?? v.vy);\n if (look.motion === 'fall') {\n d.ground = view.y + r() * (view.height + 12);\n d.y = anywhere ? view.y - 10 + r() * (d.ground - view.y + 10) : d.ground - 30 - r() * view.height;\n d.x = x;\n d.splashAt = 0;\n d.img.setTexture(d.key).setDepth(this.depth).setAlpha(1);\n } else if (look.motion === 'bank') {\n d.x = anywhere ? x : view.x - d.img.width;\n d.y = view.y + r() * view.height;\n d.img.setDepth(this.bankDepth);\n } else {\n d.x = x;\n d.y = anywhere ? view.y + r() * view.height : view.y - 4 - r() * 20;\n d.ground = r() * Math.PI * 2;\n d.img.setDepth(this.depth);\n }\n d.img.setVisible(true);\n }\n\n private stepFall(d: Drop, look: WeatherLook, now: number, s: number, view: ViewRect): void {\n if (d.splashAt) {\n const t = now - d.splashAt;\n if (t > SPLASH_MS * 2) this.spawn(d, look, view, false);\n else if (t > SPLASH_MS && look.splash) d.img.setTexture(look.splash[1]);\n return;\n }\n d.x += d.vx * s;\n d.y += d.vy * s;\n if (d.y >= d.ground) {\n // every other drop splashes on the ground it hit; the rest vanish into it\n if (look.splash && this.random() < 0.5) {\n d.splashAt = now;\n d.img.setTexture(look.splash[0]).setDepth(this.splashDepth);\n d.x -= d.img.width / 2;\n d.y = d.ground - 1;\n this.place(d);\n } else this.spawn(d, look, view, false);\n return;\n }\n this.place(d);\n }\n\n private stepFlake(d: Drop, look: WeatherLook, now: number, s: number, view: ViewRect): void {\n d.x += d.vx * s;\n d.y += d.vy * s;\n if (d.y > view.bottom + 4 || d.x > view.right + 30 || d.x < view.x - 40) {\n this.spawn(d, look, view, false);\n return;\n }\n // the sway is added at draw time, so it never drifts the flake off its line\n const sway = Math.sin(now / 900 + d.ground) * (look.sway ?? 4);\n const x = d.x + sway;\n d.img.setPosition(this.snap ? Math.round(x) : x, this.snap ? Math.round(d.y) : d.y);\n }\n\n private stepBank(d: Drop, look: WeatherLook, s: number, view: ViewRect, intensity: number): void {\n d.x += d.vx * s;\n if (d.x > view.right + 10 || d.y < view.y - 20 || d.y > view.bottom + 10) this.spawn(d, look, view, d.x <= view.right + 10);\n d.img.setAlpha(0.35 + 0.5 * intensity);\n this.place(d);\n }\n\n destroy(): void {\n for (const d of this.drops) d.img.destroy();\n this.drops.length = 0;\n this.tint.destroy();\n }\n}\n"],"names":["SPLASH_MS","DEFAULT_V","WeatherLayer","stage","options","Sprite","Texture","now","dt","view","weather","share","look","tintAlpha","active","s","i","d","kind","key","img","r","anywhere","v","x","t","sway","intensity"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function c(t, a, o = 0.14) {
|
|
2
|
+
const n = Math.max(0, Math.min(1, a));
|
|
3
|
+
return { color: t.color, alpha: Math.max(0, Math.min(o, t.day + (t.night - t.day) * n)) };
|
|
4
|
+
}
|
|
5
|
+
function i(t, a) {
|
|
6
|
+
const o = Math.max(0, Math.min(1, a)), n = (h) => Math.round(255 - (255 - (t >> h & 255)) * o) << h;
|
|
7
|
+
return n(16) | n(8) | n(0);
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
c as gradeAt,
|
|
11
|
+
i as mixToWhite
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=grade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grade.js","sources":["../../src/ambient/grade.ts"],"sourcesContent":["/**\n * The pure half of a colour grade: how strong a place's colour is laid at a point of the day, and the multiply colour\n * that leaves the same result. `ColorGrade` draws it.\n */\n\n/** A place's grade: its colour (0xRRGGBB) and how strongly it is laid by day and by night (0..1). */\nexport interface Grade {\n color: number;\n day: number;\n night: number;\n}\n\nexport interface GradeState {\n color: number;\n alpha: number;\n}\n\n/**\n * The grade at `night` (0 by day, 1 at full night, `DayClock`'s `night`), never past `max`: a grade is a light\n * tint, and one laid too strong washes every sprite toward one colour.\n */\nexport function gradeAt(grade: Grade, night: number, max = 0.14): GradeState {\n const n = Math.max(0, Math.min(1, night));\n return { color: grade.color, alpha: Math.max(0, Math.min(max, grade.day + (grade.night - grade.day) * n)) };\n}\n\n/** `color` taken `share` of the way from white: what a multiply sheet of that colour at that opacity leaves. */\nexport function mixToWhite(color: number, share: number): number {\n const s = Math.max(0, Math.min(1, share));\n const ch = (shift: number) => Math.round(255 - (255 - ((color >> shift) & 255)) * s) << shift;\n return ch(16) | ch(8) | ch(0);\n}\n"],"names":["gradeAt","grade","night","max","mixToWhite","color","share","s","ch","shift"],"mappings":"AAqBO,SAASA,EAAQC,GAAcC,GAAeC,IAAM,MAAkB;AAC3E,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGD,CAAK,CAAC;AACxC,SAAO,EAAE,OAAOD,EAAM,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,IAAIE,GAAKF,EAAM,OAAOA,EAAM,QAAQA,EAAM,OAAO,CAAC,CAAC,EAAA;AAC1G;AAGO,SAASG,EAAWC,GAAeC,GAAuB;AAC/D,QAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGD,CAAK,CAAC,GAClCE,IAAK,CAACC,MAAkB,KAAK,MAAM,OAAO,OAAQJ,KAASI,IAAS,QAAQF,CAAC,KAAKE;AACxF,SAAOD,EAAG,EAAE,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC;AAC9B;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const u = { kind: "clear", intensity: 0 };
|
|
2
|
+
function l(t) {
|
|
3
|
+
let i = 2166136261;
|
|
4
|
+
for (let n = 0; n < t.length; n++)
|
|
5
|
+
i ^= t.charCodeAt(n), i = Math.imul(i, 16777619);
|
|
6
|
+
return i ^= i >>> 16, i = Math.imul(i, 2246822507), i ^= i >>> 13, (i >>> 0) / 4294967296;
|
|
7
|
+
}
|
|
8
|
+
const M = /* @__PURE__ */ new WeakMap();
|
|
9
|
+
function y(t, i) {
|
|
10
|
+
if (!t.skies) return;
|
|
11
|
+
let n = M.get(t);
|
|
12
|
+
if (!n) {
|
|
13
|
+
n = /* @__PURE__ */ new Map();
|
|
14
|
+
for (const [r, s] of Object.entries(t.skies)) for (const o of s.places) n.set(o, r);
|
|
15
|
+
M.set(t, n);
|
|
16
|
+
}
|
|
17
|
+
return n.get(i);
|
|
18
|
+
}
|
|
19
|
+
function a(t, i, n) {
|
|
20
|
+
const r = i.reduce((e, k) => e + k.weight, 0);
|
|
21
|
+
if (r <= 0) return u;
|
|
22
|
+
let s = l(`${t}:${n}`) * r, o = i[i.length - 1];
|
|
23
|
+
for (const e of i)
|
|
24
|
+
if (s -= e.weight, s < 0) {
|
|
25
|
+
o = e;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
if (o.kind === "clear") return u;
|
|
29
|
+
const [f, c] = o.intensity ?? [1, 1];
|
|
30
|
+
return { kind: o.kind, intensity: f + (c - f) * l(`${t}:${n}:i`) };
|
|
31
|
+
}
|
|
32
|
+
function w(t, i, n) {
|
|
33
|
+
const r = n.places[t] ?? [];
|
|
34
|
+
if (!r.length) return u;
|
|
35
|
+
const s = y(n, t), o = s === void 0 ? t : `sky:${s}`, f = s === void 0 ? r : n.skies[s].entries;
|
|
36
|
+
if (!f.length) return u;
|
|
37
|
+
const c = Math.floor(i / n.slotMs);
|
|
38
|
+
let e = a(o, f, c);
|
|
39
|
+
if (e.kind === "clear") return e;
|
|
40
|
+
if (s !== void 0) {
|
|
41
|
+
const h = r.find((p) => p.kind === e.kind)?.intensity;
|
|
42
|
+
h && (e = { kind: e.kind, intensity: h[0] + (h[1] - h[0]) * l(`${o}:${c}:i`) });
|
|
43
|
+
}
|
|
44
|
+
const k = i - c * n.slotMs, g = n.slotMs - k;
|
|
45
|
+
let d = 1;
|
|
46
|
+
return n.fadeMs > 0 && (a(o, f, c - 1).kind !== e.kind && (d = Math.min(d, k / n.fadeMs)), a(o, f, c + 1).kind !== e.kind && (d = Math.min(d, g / n.fadeMs))), { kind: e.kind, intensity: e.intensity * Math.max(0, Math.min(1, d)) };
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
l as hash01,
|
|
50
|
+
w as weatherAt
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=weather.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weather.js","sources":["../../src/ambient/weather.ts"],"sourcesContent":["/**\n * Weather rolled from wall time alone, so two players standing in the same place are rained on together without a\n * packet between them. Pure and deterministic: the same key, time and table give the same sky on every machine.\n *\n * Time is cut into slots; each slot rolls one entry of a weighted list from a hash of the key and the slot number,\n * and a change of kind fades out at the end of its slot and in at the start of the next. Places can share one sky:\n * a key listed in a `skies` group takes its kind from the group's roll (so the rain does not stop at a map's edge)\n * and only its strength from its own list. The kind `'clear'` means no weather and has no strength.\n *\n * ```ts\n * const TABLE: WeatherTable = {\n * slotMs: 12 * 60_000,\n * fadeMs: 40_000,\n * places: { meadow: [{ kind: 'clear', weight: 4 }, { kind: 'rain', weight: 3, intensity: [0.4, 1] }] },\n * };\n * const w = weatherAt('meadow', serverNow(), TABLE); // { kind: 'rain', intensity: 0.7 }\n * ```\n */\n\nexport interface WeatherEntry<K extends string = string> {\n kind: K | 'clear';\n weight: number;\n /** The strength range rolled for this kind, [lo, hi] in 0..1 (default [1, 1]). */\n intensity?: readonly [number, number];\n}\n\nexport interface WeatherSky<K extends string = string> {\n /** The place keys under this sky. */\n places: readonly string[];\n entries: readonly WeatherEntry<K>[];\n}\n\nexport interface WeatherTable<K extends string = string> {\n /** How long one roll of the sky lasts. */\n slotMs: number;\n /** How long a change of kind takes to fade out and in. */\n fadeMs: number;\n /** Each place's own list; a place with none (a cave) has no weather, even inside a sky. */\n places: Readonly<Record<string, readonly WeatherEntry<K>[]>>;\n /** Groups of neighbouring places that share one sky, by group id. */\n skies?: Readonly<Record<string, WeatherSky<K>>>;\n}\n\nexport interface WeatherState<K extends string = string> {\n kind: K | 'clear';\n /** 0..1, already faded round a change of kind; 0 when clear. */\n intensity: number;\n}\n\nconst CLEAR: WeatherState<never> = { kind: 'clear', intensity: 0 };\n\n/** FNV-1a over the text, then an avalanche: a stable number in [0, 1). */\nexport function hash01(text: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n h ^= h >>> 16;\n h = Math.imul(h, 0x85ebca6b);\n h ^= h >>> 13;\n return (h >>> 0) / 4294967296;\n}\n\n/** The sky group each place belongs to, worked out once per table. */\nconst SKY_OF = new WeakMap<object, Map<string, string>>();\n\nfunction skyOf(table: WeatherTable<string>, key: string): string | undefined {\n if (!table.skies) return undefined;\n let map = SKY_OF.get(table);\n if (!map) {\n map = new Map();\n for (const [id, sky] of Object.entries(table.skies)) for (const p of sky.places) map.set(p, id);\n SKY_OF.set(table, map);\n }\n return map.get(key);\n}\n\nfunction roll<K extends string>(seed: string, entries: readonly WeatherEntry<K>[], slot: number): WeatherState<K> {\n const total = entries.reduce((s, e) => s + e.weight, 0);\n if (total <= 0) return CLEAR;\n let r = hash01(`${seed}:${slot}`) * total;\n let pick = entries[entries.length - 1]!;\n for (const e of entries) {\n r -= e.weight;\n if (r < 0) {\n pick = e;\n break;\n }\n }\n if (pick.kind === 'clear') return CLEAR;\n const [lo, hi] = pick.intensity ?? [1, 1];\n return { kind: pick.kind, intensity: lo + (hi - lo) * hash01(`${seed}:${slot}:i`) };\n}\n\n/** The weather over place `key` at wall time `ms`. */\nexport function weatherAt<K extends string>(key: string, ms: number, table: WeatherTable<K>): WeatherState<K> {\n const own = table.places[key] ?? [];\n if (!own.length) return CLEAR;\n const group = skyOf(table, key);\n const seed = group === undefined ? key : `sky:${group}`;\n const entries = group === undefined ? own : table.skies![group]!.entries;\n if (!entries.length) return CLEAR;\n const slot = Math.floor(ms / table.slotMs);\n let now = roll(seed, entries, slot);\n if (now.kind === 'clear') return now;\n // a shared sky's kind at the strength this place feels it: its own range for that kind when its list has one\n if (group !== undefined) {\n const range = own.find((e) => e.kind === now.kind)?.intensity;\n if (range) now = { kind: now.kind, intensity: range[0] + (range[1] - range[0]) * hash01(`${seed}:${slot}:i`) };\n }\n const into = ms - slot * table.slotMs;\n const left = table.slotMs - into;\n let fade = 1;\n if (table.fadeMs > 0) {\n if (roll(seed, entries, slot - 1).kind !== now.kind) fade = Math.min(fade, into / table.fadeMs);\n if (roll(seed, entries, slot + 1).kind !== now.kind) fade = Math.min(fade, left / table.fadeMs);\n }\n return { kind: now.kind, intensity: now.intensity * Math.max(0, Math.min(1, fade)) };\n}\n"],"names":["CLEAR","hash01","text","h","i","SKY_OF","skyOf","table","key","map","id","sky","p","roll","seed","entries","slot","total","s","e","r","pick","lo","hi","weatherAt","ms","own","group","now","range","into","left","fade"],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Animator as o } from "./Animator.js";
|
|
2
|
+
import { compileParams as m, compileStates as c, compileTransitions as d, PARAM_TRIGGER as h, PARAM_BOOL as p, OP_LE as l, OP_LT as g, OP_GE as f, OP_GT as u, OP_NE as x, OP_EQ as k } from "./animStateCompile.js";
|
|
3
|
+
class v {
|
|
4
|
+
/** The animator it drives; read `frame` off it (or off the machine). */
|
|
5
|
+
animator;
|
|
6
|
+
/** Fired for every marker playback reaches, the state's first frame's on entering it. */
|
|
7
|
+
onEvent = null;
|
|
8
|
+
/** Fired after each change of state. */
|
|
9
|
+
onStateChange = null;
|
|
10
|
+
params;
|
|
11
|
+
states;
|
|
12
|
+
tr;
|
|
13
|
+
keepTriggers;
|
|
14
|
+
stateIndex;
|
|
15
|
+
/** Time played in this state, ms, scaled by speed as the animator scales it. */
|
|
16
|
+
time = 0;
|
|
17
|
+
constructor(t, s) {
|
|
18
|
+
const e = s;
|
|
19
|
+
this.params = m(s.params ?? {}), this.states = c(e, t, this.params), this.tr = d(e, this.states, this.params), this.keepTriggers = s.keepTriggers === !0, this.stateIndex = this.states.index.get(s.initial), this.animator = new o(t, this.states.clips[this.stateIndex]), this.applySpeed();
|
|
20
|
+
}
|
|
21
|
+
/** The state playing. */
|
|
22
|
+
get state() {
|
|
23
|
+
return this.states.names[this.stateIndex];
|
|
24
|
+
}
|
|
25
|
+
/** The frame to show now (a sheet frame index or name, as the clip lists it). */
|
|
26
|
+
get frame() {
|
|
27
|
+
return this.animator.frame;
|
|
28
|
+
}
|
|
29
|
+
/** How much of this state's clip has played: 0 at entry, 1 after one pass, 2 after two loops. */
|
|
30
|
+
get normalizedTime() {
|
|
31
|
+
return this.time / this.states.lengths[this.stateIndex];
|
|
32
|
+
}
|
|
33
|
+
/** Sets a bool or number parameter. */
|
|
34
|
+
set(t, s) {
|
|
35
|
+
const e = this.paramIndex(t);
|
|
36
|
+
if (this.params.kinds[e] === h) throw new Error(`AnimStateMachine: "${t}" is a trigger; use trigger()`);
|
|
37
|
+
return this.params.values[e] = typeof s == "boolean" ? s ? 1 : 0 : s, this;
|
|
38
|
+
}
|
|
39
|
+
/** A parameter's value: bools as booleans, triggers as whether they are set. */
|
|
40
|
+
get(t) {
|
|
41
|
+
const s = this.paramIndex(t), e = this.params.values[s];
|
|
42
|
+
return this.params.kinds[s] === p || this.params.kinds[s] === h ? e !== 0 : e;
|
|
43
|
+
}
|
|
44
|
+
/** Fires a trigger: the next update's transitions see it once. */
|
|
45
|
+
trigger(t) {
|
|
46
|
+
return this.params.values[this.triggerIndex(t)] = 1, this;
|
|
47
|
+
}
|
|
48
|
+
resetTrigger(t) {
|
|
49
|
+
return this.params.values[this.triggerIndex(t)] = 0, this;
|
|
50
|
+
}
|
|
51
|
+
/** Goes to `state` now, whatever the transitions say (a respawn, a cut scene). */
|
|
52
|
+
play(t) {
|
|
53
|
+
const s = this.states.index.get(t);
|
|
54
|
+
if (s === void 0) throw new Error(`AnimStateMachine: no state "${t}"`);
|
|
55
|
+
return this.enter(s), this;
|
|
56
|
+
}
|
|
57
|
+
/** Back to the initial values of every parameter (triggers cleared). */
|
|
58
|
+
resetParams() {
|
|
59
|
+
return this.params.values.set(this.params.initial), this;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Advances the clip by `dt` seconds, fires the markers it passed, then takes at most one transition (so a chain of
|
|
63
|
+
* them never runs through several states in one frame). `update(0)` only checks the transitions.
|
|
64
|
+
*/
|
|
65
|
+
update(t) {
|
|
66
|
+
const s = this.stateIndex;
|
|
67
|
+
this.applySpeed();
|
|
68
|
+
const e = this.animator, n = e.frameIndex, a = e.finished;
|
|
69
|
+
if (e.update(t), t > 0 && e.speed > 0) {
|
|
70
|
+
const r = t * 1e3 * e.speed;
|
|
71
|
+
this.time += r, a || this.firePassed(s, n, e.frameIndex, r);
|
|
72
|
+
}
|
|
73
|
+
const i = this.pick(this.stateIndex);
|
|
74
|
+
i >= 0 && (this.consumeTriggers(i), this.enter(this.tr.to[i])), this.keepTriggers || this.clearTriggers();
|
|
75
|
+
}
|
|
76
|
+
pick(t) {
|
|
77
|
+
const s = this.states.candidates[t], e = this.tr, n = this.animator.finished || this.time >= this.states.lengths[t];
|
|
78
|
+
for (let a = 0; a < s.length; a++) {
|
|
79
|
+
const i = s[a];
|
|
80
|
+
if (!(e.to[i] === t && e.anyState[i] && !e.self[i]) && !(e.onEnd[i] && !n) && !(e.exitTime[i] >= 0 && this.normalizedTime < e.exitTime[i]) && this.holds(i))
|
|
81
|
+
return i;
|
|
82
|
+
}
|
|
83
|
+
return -1;
|
|
84
|
+
}
|
|
85
|
+
holds(t) {
|
|
86
|
+
const s = this.tr, e = this.params.values;
|
|
87
|
+
for (let n = s.condStart[t]; n < s.condEnd[t]; n++) {
|
|
88
|
+
const a = e[s.condParam[n]], i = s.condValue[n];
|
|
89
|
+
let r;
|
|
90
|
+
switch (s.condOp[n]) {
|
|
91
|
+
case k:
|
|
92
|
+
r = a === i;
|
|
93
|
+
break;
|
|
94
|
+
case x:
|
|
95
|
+
r = a !== i;
|
|
96
|
+
break;
|
|
97
|
+
case u:
|
|
98
|
+
r = a > i;
|
|
99
|
+
break;
|
|
100
|
+
case f:
|
|
101
|
+
r = a >= i;
|
|
102
|
+
break;
|
|
103
|
+
case g:
|
|
104
|
+
r = a < i;
|
|
105
|
+
break;
|
|
106
|
+
case l:
|
|
107
|
+
r = a <= i;
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
r = !1;
|
|
111
|
+
}
|
|
112
|
+
if (!r) return !1;
|
|
113
|
+
}
|
|
114
|
+
return !0;
|
|
115
|
+
}
|
|
116
|
+
enter(t) {
|
|
117
|
+
const s = this.stateIndex;
|
|
118
|
+
this.stateIndex = t, this.time = 0, this.animator.play(this.states.clips[t], !0), this.applySpeed(), this.onStateChange?.(this.states.names[s], this.states.names[t]), this.fire(t, 0);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Fires the markers of every frame after `from` up to `to`. The animator skips frames on a long step, so they are
|
|
122
|
+
* walked rather than only the one landed on; a step long enough to loop the whole clip fires each frame once.
|
|
123
|
+
*/
|
|
124
|
+
firePassed(t, s, e, n) {
|
|
125
|
+
const a = this.states.frameCounts[t];
|
|
126
|
+
let i = (e - s + a) % a;
|
|
127
|
+
i === 0 && n >= this.states.lengths[t] && (i = a);
|
|
128
|
+
for (let r = 1; r <= i; r++)
|
|
129
|
+
if (this.fire(t, (s + r) % a), this.stateIndex !== t) return;
|
|
130
|
+
}
|
|
131
|
+
fire(t, s) {
|
|
132
|
+
const e = this.states.markers[t][s];
|
|
133
|
+
if (!e || !this.onEvent) return;
|
|
134
|
+
const n = this.states.names[t];
|
|
135
|
+
for (let a = 0; a < e.length; a++) this.onEvent(e[a], n, s);
|
|
136
|
+
}
|
|
137
|
+
applySpeed() {
|
|
138
|
+
const t = this.stateIndex, s = this.states.speedParams[t];
|
|
139
|
+
this.animator.speed = this.states.speeds[t] * (s >= 0 ? Math.abs(this.params.values[s]) : 1);
|
|
140
|
+
}
|
|
141
|
+
consumeTriggers(t) {
|
|
142
|
+
const s = this.tr;
|
|
143
|
+
for (let e = s.condStart[t]; e < s.condEnd[t]; e++)
|
|
144
|
+
this.params.kinds[s.condParam[e]] === h && (this.params.values[s.condParam[e]] = 0);
|
|
145
|
+
}
|
|
146
|
+
clearTriggers() {
|
|
147
|
+
const { kinds: t, values: s } = this.params;
|
|
148
|
+
for (let e = 0; e < t.length; e++) t[e] === h && (s[e] = 0);
|
|
149
|
+
}
|
|
150
|
+
paramIndex(t) {
|
|
151
|
+
const s = this.params.index.get(t);
|
|
152
|
+
if (s === void 0) throw new Error(`AnimStateMachine: no parameter "${t}"`);
|
|
153
|
+
return s;
|
|
154
|
+
}
|
|
155
|
+
triggerIndex(t) {
|
|
156
|
+
const s = this.paramIndex(t);
|
|
157
|
+
if (this.params.kinds[s] !== h) throw new Error(`AnimStateMachine: "${t}" is not a trigger`);
|
|
158
|
+
return s;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
export {
|
|
162
|
+
v as AnimStateMachine
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=AnimStateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimStateMachine.js","sources":["../../src/anim/AnimStateMachine.ts"],"sourcesContent":["import { Animator, type AnimationClip } from './Animator';\nimport {\n OP_EQ,\n OP_GE,\n OP_GT,\n OP_LE,\n OP_LT,\n OP_NE,\n PARAM_BOOL,\n PARAM_TRIGGER,\n compileParams,\n compileStates,\n compileTransitions,\n type CompiledParams,\n type CompiledStates,\n type CompiledTransitions,\n} from './animStateCompile';\nimport type { AnimParams, AnimStateMachineOptions } from './animStateTypes';\n\n/**\n * Chooses which clip an `Animator` plays from named states and the transitions between them, the way an animation\n * graph in a larger engine does: the game sets parameters (a bool, a number, a one-shot trigger) and the machine\n * moves between states when a transition's conditions hold, when a clip has played through, or from any state at\n * all by priority. Frame markers fire events (a footstep on frame 3) for the game to hang sounds and effects on.\n *\n * Pure and driven by `update(dt)`, so it runs under node with a fake clock. The definition is compiled into typed\n * arrays once; an update allocates nothing.\n *\n * ```ts\n * const sm = new AnimStateMachine(sheet.clips, {\n * initial: 'idle',\n * params: { speed: 0, grounded: true, jump: 'trigger' },\n * states: { idle: { clip: 'idle' }, run: { clip: 'run', markers: [{ frame: 2, name: 'step' }] }, jump: { clip: 'jump' } },\n * transitions: [\n * { from: 'idle', to: 'run', when: { speed: ['>', 0] } },\n * { from: 'run', to: 'idle', when: { speed: 0 } },\n * { from: '*', to: 'jump', when: { jump: true, grounded: true }, priority: 10 },\n * ],\n * });\n * sm.onEvent = (name) => name === 'step' && sound.play('step');\n * sm.set('speed', 3);\n * sm.update(dt); // seconds; then show sm.frame\n * ```\n */\nexport class AnimStateMachine<State extends string = string, Clip extends string = string, P extends AnimParams = AnimParams> {\n /** The animator it drives; read `frame` off it (or off the machine). */\n readonly animator: Animator<Clip>;\n /** Fired for every marker playback reaches, the state's first frame's on entering it. */\n onEvent: ((event: string, state: State, frame: number) => void) | null = null;\n /** Fired after each change of state. */\n onStateChange: ((from: State, to: State) => void) | null = null;\n\n private readonly params: CompiledParams;\n private readonly states: CompiledStates;\n private readonly tr: CompiledTransitions;\n private readonly keepTriggers: boolean;\n private stateIndex: number;\n /** Time played in this state, ms, scaled by speed as the animator scales it. */\n private time = 0;\n\n constructor(clips: Record<Clip, AnimationClip>, options: AnimStateMachineOptions<State, Clip, P>) {\n const opts = options as unknown as AnimStateMachineOptions<string, string, AnimParams>;\n this.params = compileParams(options.params ?? {});\n this.states = compileStates(opts, clips, this.params);\n this.tr = compileTransitions(opts, this.states, this.params);\n this.keepTriggers = options.keepTriggers === true;\n this.stateIndex = this.states.index.get(options.initial)!;\n this.animator = new Animator(clips, this.states.clips[this.stateIndex] as Clip);\n this.applySpeed();\n }\n\n /** The state playing. */\n get state(): State {\n return this.states.names[this.stateIndex] as State;\n }\n\n /** The frame to show now (a sheet frame index or name, as the clip lists it). */\n get frame(): string | number {\n return this.animator.frame;\n }\n\n /** How much of this state's clip has played: 0 at entry, 1 after one pass, 2 after two loops. */\n get normalizedTime(): number {\n return this.time / this.states.lengths[this.stateIndex]!;\n }\n\n /** Sets a bool or number parameter. */\n set(name: keyof P & string, value: boolean | number): this {\n const i = this.paramIndex(name);\n if (this.params.kinds[i] === PARAM_TRIGGER) throw new Error(`AnimStateMachine: \"${name}\" is a trigger; use trigger()`);\n this.params.values[i] = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n return this;\n }\n\n /** A parameter's value: bools as booleans, triggers as whether they are set. */\n get(name: keyof P & string): boolean | number {\n const i = this.paramIndex(name);\n const v = this.params.values[i]!;\n return this.params.kinds[i] === PARAM_BOOL || this.params.kinds[i] === PARAM_TRIGGER ? v !== 0 : v;\n }\n\n /** Fires a trigger: the next update's transitions see it once. */\n trigger(name: keyof P & string): this {\n this.params.values[this.triggerIndex(name)] = 1;\n return this;\n }\n\n resetTrigger(name: keyof P & string): this {\n this.params.values[this.triggerIndex(name)] = 0;\n return this;\n }\n\n /** Goes to `state` now, whatever the transitions say (a respawn, a cut scene). */\n play(state: State): this {\n const i = this.states.index.get(state);\n if (i === undefined) throw new Error(`AnimStateMachine: no state \"${state}\"`);\n this.enter(i);\n return this;\n }\n\n /** Back to the initial values of every parameter (triggers cleared). */\n resetParams(): this {\n this.params.values.set(this.params.initial);\n return this;\n }\n\n /**\n * Advances the clip by `dt` seconds, fires the markers it passed, then takes at most one transition (so a chain of\n * them never runs through several states in one frame). `update(0)` only checks the transitions.\n */\n update(dt: number): void {\n const s = this.stateIndex;\n this.applySpeed();\n const a = this.animator;\n const before = a.frameIndex;\n const wasFinished = a.finished;\n a.update(dt);\n if (dt > 0 && a.speed > 0) {\n const delta = dt * 1000 * a.speed;\n this.time += delta;\n if (!wasFinished) this.firePassed(s, before, a.frameIndex, delta);\n }\n // a marker's listener may have changed state: the transitions are the state's now playing\n const t = this.pick(this.stateIndex);\n if (t >= 0) {\n this.consumeTriggers(t);\n this.enter(this.tr.to[t]!);\n }\n if (!this.keepTriggers) this.clearTriggers();\n }\n\n private pick(s: number): number {\n const cands = this.states.candidates[s]!;\n const tr = this.tr;\n const ended = this.animator.finished || this.time >= this.states.lengths[s]!;\n for (let k = 0; k < cands.length; k++) {\n const t = cands[k]!;\n if (tr.to[t] === s && tr.anyState[t] && !tr.self[t]) continue;\n if (tr.onEnd[t] && !ended) continue;\n if (tr.exitTime[t]! >= 0 && this.normalizedTime < tr.exitTime[t]!) continue;\n if (this.holds(t)) return t;\n }\n return -1;\n }\n\n private holds(t: number): boolean {\n const tr = this.tr;\n const values = this.params.values;\n for (let c = tr.condStart[t]!; c < tr.condEnd[t]!; c++) {\n const v = values[tr.condParam[c]!]!;\n const want = tr.condValue[c]!;\n let ok: boolean;\n switch (tr.condOp[c]) {\n case OP_EQ: ok = v === want; break;\n case OP_NE: ok = v !== want; break;\n case OP_GT: ok = v > want; break;\n case OP_GE: ok = v >= want; break;\n case OP_LT: ok = v < want; break;\n case OP_LE: ok = v <= want; break;\n default: ok = false;\n }\n if (!ok) return false;\n }\n return true;\n }\n\n private enter(i: number): void {\n const from = this.stateIndex;\n this.stateIndex = i;\n this.time = 0;\n this.animator.play(this.states.clips[i] as Clip, true);\n this.applySpeed();\n this.onStateChange?.(this.states.names[from] as State, this.states.names[i] as State);\n // a marker on the first frame (a jump's whoosh) belongs to entering the state\n this.fire(i, 0);\n }\n\n /**\n * Fires the markers of every frame after `from` up to `to`. The animator skips frames on a long step, so they are\n * walked rather than only the one landed on; a step long enough to loop the whole clip fires each frame once.\n */\n private firePassed(s: number, from: number, to: number, deltaMs: number): void {\n const n = this.states.frameCounts[s]!;\n let steps = (to - from + n) % n;\n if (steps === 0 && deltaMs >= this.states.lengths[s]!) steps = n;\n for (let k = 1; k <= steps; k++) {\n this.fire(s, (from + k) % n);\n if (this.stateIndex !== s) return; // a listener changed state: the rest belong to a clip no longer playing\n }\n }\n\n private fire(s: number, frame: number): void {\n const names = this.states.markers[s]![frame];\n if (!names || !this.onEvent) return;\n const state = this.states.names[s] as State;\n for (let i = 0; i < names.length; i++) this.onEvent(names[i]!, state, frame);\n }\n\n private applySpeed(): void {\n const s = this.stateIndex;\n const p = this.states.speedParams[s]!;\n this.animator.speed = this.states.speeds[s]! * (p >= 0 ? Math.abs(this.params.values[p]!) : 1);\n }\n\n private consumeTriggers(t: number): void {\n const tr = this.tr;\n for (let c = tr.condStart[t]!; c < tr.condEnd[t]!; c++) {\n if (this.params.kinds[tr.condParam[c]!] === PARAM_TRIGGER) this.params.values[tr.condParam[c]!] = 0;\n }\n }\n\n private clearTriggers(): void {\n const { kinds, values } = this.params;\n for (let i = 0; i < kinds.length; i++) if (kinds[i] === PARAM_TRIGGER) values[i] = 0;\n }\n\n private paramIndex(name: string): number {\n const i = this.params.index.get(name);\n if (i === undefined) throw new Error(`AnimStateMachine: no parameter \"${name}\"`);\n return i;\n }\n\n private triggerIndex(name: string): number {\n const i = this.paramIndex(name);\n if (this.params.kinds[i] !== PARAM_TRIGGER) throw new Error(`AnimStateMachine: \"${name}\" is not a trigger`);\n return i;\n }\n}\n"],"names":["AnimStateMachine","clips","options","opts","compileParams","compileStates","compileTransitions","Animator","name","value","i","PARAM_TRIGGER","v","PARAM_BOOL","state","dt","a","before","wasFinished","delta","t","s","cands","tr","ended","k","values","c","want","ok","OP_EQ","OP_NE","OP_GT","OP_GE","OP_LT","OP_LE","from","to","deltaMs","n","steps","frame","names","p","kinds"],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
class r {
|
|
2
|
+
constructor(e, t) {
|
|
3
|
+
this.clips = e;
|
|
4
|
+
const s = e[t];
|
|
5
|
+
if (!s) throw new Error(`Animator: no clip "${t}"`);
|
|
6
|
+
if (s.frames.length === 0) throw new Error(`Animator: clip "${t}" has no frames`);
|
|
7
|
+
this.clip = s, this.name = t;
|
|
8
|
+
}
|
|
9
|
+
clips;
|
|
10
|
+
clip;
|
|
11
|
+
index = 0;
|
|
12
|
+
elapsed = 0;
|
|
13
|
+
ended = !1;
|
|
14
|
+
name;
|
|
15
|
+
/** Called when a clip that does not loop reaches its last frame. */
|
|
16
|
+
onComplete = null;
|
|
17
|
+
/** Playback speed multiplier (1 normal, 0 paused). */
|
|
18
|
+
speed = 1;
|
|
19
|
+
/** The clip playing. */
|
|
20
|
+
get current() {
|
|
21
|
+
return this.name;
|
|
22
|
+
}
|
|
23
|
+
/** The frame to show now. */
|
|
24
|
+
get frame() {
|
|
25
|
+
return this.clip.frames[this.index];
|
|
26
|
+
}
|
|
27
|
+
/** Which frame of the clip (0-based). */
|
|
28
|
+
get frameIndex() {
|
|
29
|
+
return this.index;
|
|
30
|
+
}
|
|
31
|
+
/** A non-looping clip has reached its last frame. */
|
|
32
|
+
get finished() {
|
|
33
|
+
return this.ended;
|
|
34
|
+
}
|
|
35
|
+
/** Plays `name`. The clip already playing keeps its place unless `restart`. */
|
|
36
|
+
play(e, t = !1) {
|
|
37
|
+
if (e === this.name && !t) return this;
|
|
38
|
+
const s = this.clips[e];
|
|
39
|
+
if (!s) throw new Error(`Animator: no clip "${e}"`);
|
|
40
|
+
if (s.frames.length === 0) throw new Error(`Animator: clip "${e}" has no frames`);
|
|
41
|
+
return this.clip = s, this.name = e, this.index = 0, this.elapsed = 0, this.ended = !1, this;
|
|
42
|
+
}
|
|
43
|
+
/** Advances by `dt` seconds; returns true when the frame changed. */
|
|
44
|
+
update(e) {
|
|
45
|
+
if (this.ended || !(e > 0) || this.speed <= 0) return !1;
|
|
46
|
+
this.elapsed += e * 1e3 * this.speed;
|
|
47
|
+
const t = this.index, s = this.clip.frames.length;
|
|
48
|
+
for (let i = this.lengthOf(this.index); this.elapsed >= i; i = this.lengthOf(this.index))
|
|
49
|
+
if (this.elapsed -= i, this.index < s - 1)
|
|
50
|
+
this.index++;
|
|
51
|
+
else if (this.clip.loop !== !1)
|
|
52
|
+
this.index = 0;
|
|
53
|
+
else {
|
|
54
|
+
this.ended = !0, this.elapsed = 0, this.onComplete?.(this.name);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
return this.index !== t;
|
|
58
|
+
}
|
|
59
|
+
lengthOf(e) {
|
|
60
|
+
const t = this.clip.durations?.[e] ?? 1e3 / (this.clip.fps ?? 10);
|
|
61
|
+
return Math.max(1, t);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
r as Animator
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=Animator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Animator.js","sources":["../../src/anim/Animator.ts"],"sourcesContent":["/**\n * Frame animation of one sprite: which clip plays, which frame it is on. Pure state, advanced by time; a system copies\n * `frame` onto the sprite (`animationSystem`).\n *\n * ```ts\n * const clips = { idle: { frames: [0, 1], fps: 2 }, walk: { frames: [2, 3, 4, 5], fps: 10 }, die: { frames: [6, 7, 8], fps: 8, loop: false } };\n * const a = new Animator(clips, 'idle');\n * a.play('walk'); // switching to the clip already playing keeps its place\n * a.update(dt); // seconds\n * sprite.setFrame(a.frame);\n * ```\n */\nexport interface AnimationClip {\n /** Frame names or indices of the sprite sheet, in order. */\n frames: readonly (string | number)[];\n /** Frames per second (default 10). Pixel art usually wants 8–12. */\n fps?: number;\n /** Start over at the end (default true); otherwise hold the last frame and report it finished. */\n loop?: boolean;\n /** Per-frame lengths in ms, overriding `fps` (a held key pose, a quick smear). */\n durations?: readonly number[];\n}\n\nexport type AnimationClips = Record<string, AnimationClip>;\n\nexport class Animator<Name extends string = string> {\n private clip: AnimationClip;\n private index = 0;\n private elapsed = 0;\n private ended = false;\n private name: Name;\n /** Called when a clip that does not loop reaches its last frame. */\n onComplete: ((clip: Name) => void) | null = null;\n /** Playback speed multiplier (1 normal, 0 paused). */\n speed = 1;\n\n constructor(\n private readonly clips: Record<Name, AnimationClip>,\n initial: NoInfer<Name>,\n ) {\n const clip = clips[initial];\n if (!clip) throw new Error(`Animator: no clip \"${initial}\"`);\n if (clip.frames.length === 0) throw new Error(`Animator: clip \"${initial}\" has no frames`);\n this.clip = clip;\n this.name = initial;\n }\n\n /** The clip playing. */\n get current(): Name {\n return this.name;\n }\n\n /** The frame to show now. */\n get frame(): string | number {\n return this.clip.frames[this.index]!;\n }\n\n /** Which frame of the clip (0-based). */\n get frameIndex(): number {\n return this.index;\n }\n\n /** A non-looping clip has reached its last frame. */\n get finished(): boolean {\n return this.ended;\n }\n\n /** Plays `name`. The clip already playing keeps its place unless `restart`. */\n play(name: Name, restart = false): this {\n if (name === this.name && !restart) return this;\n const clip = this.clips[name];\n if (!clip) throw new Error(`Animator: no clip \"${name}\"`);\n if (clip.frames.length === 0) throw new Error(`Animator: clip \"${name}\" has no frames`);\n this.clip = clip;\n this.name = name;\n this.index = 0;\n this.elapsed = 0;\n this.ended = false;\n return this;\n }\n\n /** Advances by `dt` seconds; returns true when the frame changed. */\n update(dt: number): boolean {\n if (this.ended || !(dt > 0) || this.speed <= 0) return false;\n this.elapsed += dt * 1000 * this.speed;\n const before = this.index;\n const n = this.clip.frames.length;\n for (let len = this.lengthOf(this.index); this.elapsed >= len; len = this.lengthOf(this.index)) {\n this.elapsed -= len;\n if (this.index < n - 1) {\n this.index++;\n } else if (this.clip.loop !== false) {\n this.index = 0;\n } else {\n this.ended = true;\n this.elapsed = 0;\n this.onComplete?.(this.name);\n break;\n }\n }\n return this.index !== before;\n }\n\n private lengthOf(i: number): number {\n const ms = this.clip.durations?.[i] ?? 1000 / (this.clip.fps ?? 10);\n return Math.max(1, ms);\n }\n}\n"],"names":["Animator","clips","initial","clip","name","restart","dt","before","n","len","i","ms"],"mappings":"AAyBO,MAAMA,EAAuC;AAAA,EAWlD,YACmBC,GACjBC,GACA;AAFiB,SAAA,QAAAD;AAGjB,UAAME,IAAOF,EAAMC,CAAO;AAC1B,QAAI,CAACC,EAAM,OAAM,IAAI,MAAM,sBAAsBD,CAAO,GAAG;AAC3D,QAAIC,EAAK,OAAO,WAAW,SAAS,IAAI,MAAM,mBAAmBD,CAAO,iBAAiB;AACzF,SAAK,OAAOC,GACZ,KAAK,OAAOD;AAAA,EACd;AAAA,EARmB;AAAA,EAXX;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA;AAAA,EAER,aAA4C;AAAA;AAAA,EAE5C,QAAQ;AAAA;AAAA,EAcR,IAAI,UAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,QAAyB;AAC3B,WAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,KAAKE,GAAYC,IAAU,IAAa;AACtC,QAAID,MAAS,KAAK,QAAQ,CAACC,EAAS,QAAO;AAC3C,UAAMF,IAAO,KAAK,MAAMC,CAAI;AAC5B,QAAI,CAACD,EAAM,OAAM,IAAI,MAAM,sBAAsBC,CAAI,GAAG;AACxD,QAAID,EAAK,OAAO,WAAW,SAAS,IAAI,MAAM,mBAAmBC,CAAI,iBAAiB;AACtF,gBAAK,OAAOD,GACZ,KAAK,OAAOC,GACZ,KAAK,QAAQ,GACb,KAAK,UAAU,GACf,KAAK,QAAQ,IACN;AAAA,EACT;AAAA;AAAA,EAGA,OAAOE,GAAqB;AAC1B,QAAI,KAAK,SAAS,EAAEA,IAAK,MAAM,KAAK,SAAS,EAAG,QAAO;AACvD,SAAK,WAAWA,IAAK,MAAO,KAAK;AACjC,UAAMC,IAAS,KAAK,OACdC,IAAI,KAAK,KAAK,OAAO;AAC3B,aAASC,IAAM,KAAK,SAAS,KAAK,KAAK,GAAG,KAAK,WAAWA,GAAKA,IAAM,KAAK,SAAS,KAAK,KAAK;AAE3F,UADA,KAAK,WAAWA,GACZ,KAAK,QAAQD,IAAI;AACnB,aAAK;AAAA,eACI,KAAK,KAAK,SAAS;AAC5B,aAAK,QAAQ;AAAA,WACR;AACL,aAAK,QAAQ,IACb,KAAK,UAAU,GACf,KAAK,aAAa,KAAK,IAAI;AAC3B;AAAA,MACF;AAEF,WAAO,KAAK,UAAUD;AAAA,EACxB;AAAA,EAEQ,SAASG,GAAmB;AAClC,UAAMC,IAAK,KAAK,KAAK,YAAYD,CAAC,KAAK,OAAQ,KAAK,KAAK,OAAO;AAChE,WAAO,KAAK,IAAI,GAAGC,CAAE;AAAA,EACvB;AACF;"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const _ = 0, $ = 1, R = 2, b = 0, S = 1, x = 2, v = 3, I = 4, U = 5, E = { "==": 0, "!=": 1, ">": 2, ">=": 3, "<": 4, "<=": 5 };
|
|
2
|
+
function M(t) {
|
|
3
|
+
let n = 0;
|
|
4
|
+
for (let r = 0; r < t.frames.length; r++) n += Math.max(1, t.durations?.[r] ?? 1e3 / (t.fps ?? 10));
|
|
5
|
+
return n;
|
|
6
|
+
}
|
|
7
|
+
function T(t) {
|
|
8
|
+
const n = Object.keys(t), r = new Uint8Array(n.length), s = new Float64Array(n.length);
|
|
9
|
+
return n.forEach((e, a) => {
|
|
10
|
+
const c = t[e];
|
|
11
|
+
if (c === "trigger") r[a] = 2;
|
|
12
|
+
else if (typeof c == "boolean")
|
|
13
|
+
r[a] = 0, s[a] = c ? 1 : 0;
|
|
14
|
+
else if (typeof c == "number" && Number.isFinite(c))
|
|
15
|
+
r[a] = 1, s[a] = c;
|
|
16
|
+
else throw new Error(`AnimStateMachine: parameter "${e}" must start as a boolean, a number or 'trigger'`);
|
|
17
|
+
}), { names: n, index: new Map(n.map((e, a) => [e, a])), kinds: r, values: s.slice(), initial: s };
|
|
18
|
+
}
|
|
19
|
+
function F(t, n, r) {
|
|
20
|
+
const s = Object.keys(t.states);
|
|
21
|
+
if (!s.includes(t.initial)) throw new Error(`AnimStateMachine: no state "${t.initial}"`);
|
|
22
|
+
const e = s.length, a = {
|
|
23
|
+
names: s,
|
|
24
|
+
index: new Map(s.map((c, h) => [c, h])),
|
|
25
|
+
clips: [],
|
|
26
|
+
speeds: new Float64Array(e),
|
|
27
|
+
speedParams: new Int32Array(e),
|
|
28
|
+
lengths: new Float64Array(e),
|
|
29
|
+
frameCounts: new Int32Array(e),
|
|
30
|
+
markers: [],
|
|
31
|
+
candidates: []
|
|
32
|
+
};
|
|
33
|
+
return s.forEach((c, h) => {
|
|
34
|
+
const o = t.states[c], f = n[o.clip];
|
|
35
|
+
if (!f) throw new Error(`AnimStateMachine: state "${c}" plays clip "${o.clip}", which does not exist`);
|
|
36
|
+
if (f.frames.length === 0) throw new Error(`AnimStateMachine: clip "${o.clip}" has no frames`);
|
|
37
|
+
a.clips.push(o.clip), a.speeds[h] = o.speed ?? 1, a.speedParams[h] = o.speedParam === void 0 ? -1 : g(r, o.speedParam, 1, `state "${c}"`), a.lengths[h] = M(f), a.frameCounts[h] = f.frames.length;
|
|
38
|
+
const u = new Array(f.frames.length).fill(void 0);
|
|
39
|
+
for (const A of o.markers ?? []) {
|
|
40
|
+
if (!(A.frame >= 0 && A.frame < f.frames.length)) throw new Error(`AnimStateMachine: marker "${A.name}" of state "${c}" is past its clip`);
|
|
41
|
+
(u[A.frame] ??= []).push(A.name);
|
|
42
|
+
}
|
|
43
|
+
a.markers.push(u);
|
|
44
|
+
}), a;
|
|
45
|
+
}
|
|
46
|
+
function N(t, n, r) {
|
|
47
|
+
const s = t.transitions ?? [], e = s.length, a = [], c = [], h = [], o = {
|
|
48
|
+
to: new Int32Array(e),
|
|
49
|
+
anyState: new Uint8Array(e),
|
|
50
|
+
self: new Uint8Array(e),
|
|
51
|
+
onEnd: new Uint8Array(e),
|
|
52
|
+
exitTime: new Float64Array(e),
|
|
53
|
+
condStart: new Int32Array(e),
|
|
54
|
+
condEnd: new Int32Array(e),
|
|
55
|
+
condParam: new Int32Array(0),
|
|
56
|
+
condOp: new Uint8Array(0),
|
|
57
|
+
condValue: new Float64Array(0)
|
|
58
|
+
}, f = n.names.map(() => []), u = (i, m) => {
|
|
59
|
+
const l = n.index.get(i);
|
|
60
|
+
if (l === void 0) throw new Error(`AnimStateMachine: ${m} names no state "${i}"`);
|
|
61
|
+
return l;
|
|
62
|
+
};
|
|
63
|
+
s.forEach((i, m) => {
|
|
64
|
+
const l = `transition ${m} (→ ${i.to})`;
|
|
65
|
+
if (o.to[m] = u(i.to, l), o.anyState[m] = i.from === "*" ? 1 : 0, o.self[m] = i.self ? 1 : 0, o.onEnd[m] = i.onEnd ? 1 : 0, o.exitTime[m] = i.exitTime ?? -1, i.from === "*") n.names.forEach((p, w) => f[w].push(m));
|
|
66
|
+
else for (const p of typeof i.from == "string" ? [i.from] : i.from) f[u(p, l)].push(m);
|
|
67
|
+
o.condStart[m] = a.length;
|
|
68
|
+
for (const [p, w] of Object.entries(i.when ?? {})) {
|
|
69
|
+
const d = r.index.get(p);
|
|
70
|
+
if (d === void 0) throw new Error(`AnimStateMachine: ${l} asks for parameter "${p}", which is not declared`);
|
|
71
|
+
const [y, P] = O(r.kinds[d], w, `${l}, parameter "${p}"`);
|
|
72
|
+
a.push(d), c.push(y), h.push(P);
|
|
73
|
+
}
|
|
74
|
+
o.condEnd[m] = a.length;
|
|
75
|
+
}), o.condParam = Int32Array.from(a), o.condOp = Uint8Array.from(c), o.condValue = Float64Array.from(h);
|
|
76
|
+
const A = (i) => s[i].priority ?? 0;
|
|
77
|
+
return n.candidates = f.map((i) => Int32Array.from(i.sort((m, l) => A(l) - A(m) || m - l))), o;
|
|
78
|
+
}
|
|
79
|
+
function O(t, n, r) {
|
|
80
|
+
if (Array.isArray(n)) {
|
|
81
|
+
const [s, e] = n;
|
|
82
|
+
if (t !== 1) throw new Error(`AnimStateMachine: ${r} compares a parameter that is not a number`);
|
|
83
|
+
if (!(s in E) || !Number.isFinite(e)) throw new Error(`AnimStateMachine: ${r} has a bad comparison`);
|
|
84
|
+
return [E[s], e];
|
|
85
|
+
}
|
|
86
|
+
if (t === 1) {
|
|
87
|
+
if (typeof n != "number") throw new Error(`AnimStateMachine: ${r} is a number; give a number or [op, number]`);
|
|
88
|
+
return [0, n];
|
|
89
|
+
}
|
|
90
|
+
if (typeof n != "boolean") throw new Error(`AnimStateMachine: ${r} is a ${t === 0 ? "bool" : "trigger"}; give true or false`);
|
|
91
|
+
return [0, n ? 1 : 0];
|
|
92
|
+
}
|
|
93
|
+
function g(t, n, r, s) {
|
|
94
|
+
const e = t.index.get(n);
|
|
95
|
+
if (e === void 0 || t.kinds[e] !== r) throw new Error(`AnimStateMachine: ${s} names "${n}", which is not a number parameter`);
|
|
96
|
+
return e;
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
b as OP_EQ,
|
|
100
|
+
v as OP_GE,
|
|
101
|
+
x as OP_GT,
|
|
102
|
+
U as OP_LE,
|
|
103
|
+
I as OP_LT,
|
|
104
|
+
S as OP_NE,
|
|
105
|
+
_ as PARAM_BOOL,
|
|
106
|
+
$ as PARAM_NUMBER,
|
|
107
|
+
R as PARAM_TRIGGER,
|
|
108
|
+
M as clipLength,
|
|
109
|
+
T as compileParams,
|
|
110
|
+
F as compileStates,
|
|
111
|
+
N as compileTransitions
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=animStateCompile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animStateCompile.js","sources":["../../src/anim/animStateCompile.ts"],"sourcesContent":["import type { AnimationClip } from './Animator';\nimport type { AnimCondition, AnimParams, AnimStateMachineOptions, CompareOp } from './animStateTypes';\n\n/*\n * The state machine's definition turned once, at construction, into flat typed arrays, so an update walks numbers and\n * allocates nothing: parameter values by index, every transition's conditions in one run of arrays, and each state's\n * candidate transitions (its own and the any-state ones) already sorted by priority.\n */\n\nexport const PARAM_BOOL = 0;\nexport const PARAM_NUMBER = 1;\nexport const PARAM_TRIGGER = 2;\n\nexport const OP_EQ = 0;\nexport const OP_NE = 1;\nexport const OP_GT = 2;\nexport const OP_GE = 3;\nexport const OP_LT = 4;\nexport const OP_LE = 5;\n\nconst OPS: Record<CompareOp, number> = { '==': OP_EQ, '!=': OP_NE, '>': OP_GT, '>=': OP_GE, '<': OP_LT, '<=': OP_LE };\n\nexport interface CompiledParams {\n names: string[];\n index: Map<string, number>;\n kinds: Uint8Array;\n values: Float64Array;\n initial: Float64Array;\n}\n\nexport interface CompiledStates {\n names: string[];\n index: Map<string, number>;\n clips: string[];\n speeds: Float64Array;\n /** Index of the speed parameter, or -1. */\n speedParams: Int32Array;\n /** Total length of each state's clip in ms, at speed 1. */\n lengths: Float64Array;\n frameCounts: Int32Array;\n /** Per state, per clip frame: the event names fired there (undefined: none). */\n markers: (readonly (readonly string[] | undefined)[])[];\n /** Per state: transition indices to try, best first. */\n candidates: Int32Array[];\n}\n\nexport interface CompiledTransitions {\n to: Int32Array;\n anyState: Uint8Array;\n self: Uint8Array;\n onEnd: Uint8Array;\n /** -1: none. */\n exitTime: Float64Array;\n condStart: Int32Array;\n condEnd: Int32Array;\n condParam: Int32Array;\n condOp: Uint8Array;\n condValue: Float64Array;\n}\n\n/** The length of a clip in ms, frame by frame exactly as `Animator` times it. */\nexport function clipLength(clip: AnimationClip): number {\n let ms = 0;\n for (let i = 0; i < clip.frames.length; i++) ms += Math.max(1, clip.durations?.[i] ?? 1000 / (clip.fps ?? 10));\n return ms;\n}\n\nexport function compileParams(decl: AnimParams): CompiledParams {\n const names = Object.keys(decl);\n const kinds = new Uint8Array(names.length);\n const initial = new Float64Array(names.length);\n names.forEach((n, i) => {\n const v = decl[n];\n if (v === 'trigger') kinds[i] = PARAM_TRIGGER;\n else if (typeof v === 'boolean') {\n kinds[i] = PARAM_BOOL;\n initial[i] = v ? 1 : 0;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n kinds[i] = PARAM_NUMBER;\n initial[i] = v;\n } else throw new Error(`AnimStateMachine: parameter \"${n}\" must start as a boolean, a number or 'trigger'`);\n });\n return { names, index: new Map(names.map((n, i) => [n, i])), kinds, values: initial.slice(), initial };\n}\n\nexport function compileStates(\n options: AnimStateMachineOptions<string, string, AnimParams>,\n clips: Record<string, AnimationClip>,\n params: CompiledParams,\n): CompiledStates {\n const names = Object.keys(options.states);\n if (!names.includes(options.initial)) throw new Error(`AnimStateMachine: no state \"${options.initial}\"`);\n const n = names.length;\n const out: CompiledStates = {\n names,\n index: new Map(names.map((s, i) => [s, i])),\n clips: [],\n speeds: new Float64Array(n),\n speedParams: new Int32Array(n),\n lengths: new Float64Array(n),\n frameCounts: new Int32Array(n),\n markers: [],\n candidates: [],\n };\n names.forEach((s, i) => {\n const def = options.states[s]!;\n const clip = clips[def.clip];\n if (!clip) throw new Error(`AnimStateMachine: state \"${s}\" plays clip \"${def.clip}\", which does not exist`);\n if (clip.frames.length === 0) throw new Error(`AnimStateMachine: clip \"${def.clip}\" has no frames`);\n out.clips.push(def.clip);\n out.speeds[i] = def.speed ?? 1;\n out.speedParams[i] = def.speedParam === undefined ? -1 : paramIndex(params, def.speedParam, PARAM_NUMBER, `state \"${s}\"`);\n out.lengths[i] = clipLength(clip);\n out.frameCounts[i] = clip.frames.length;\n const byFrame: (string[] | undefined)[] = new Array(clip.frames.length).fill(undefined);\n for (const m of def.markers ?? []) {\n if (!(m.frame >= 0 && m.frame < clip.frames.length)) throw new Error(`AnimStateMachine: marker \"${m.name}\" of state \"${s}\" is past its clip`);\n (byFrame[m.frame] ??= []).push(m.name);\n }\n out.markers.push(byFrame);\n });\n return out;\n}\n\nexport function compileTransitions(\n options: AnimStateMachineOptions<string, string, AnimParams>,\n states: CompiledStates,\n params: CompiledParams,\n): CompiledTransitions {\n const list = options.transitions ?? [];\n const n = list.length;\n const condParam: number[] = [];\n const condOp: number[] = [];\n const condValue: number[] = [];\n const t: CompiledTransitions = {\n to: new Int32Array(n),\n anyState: new Uint8Array(n),\n self: new Uint8Array(n),\n onEnd: new Uint8Array(n),\n exitTime: new Float64Array(n),\n condStart: new Int32Array(n),\n condEnd: new Int32Array(n),\n condParam: new Int32Array(0),\n condOp: new Uint8Array(0),\n condValue: new Float64Array(0),\n };\n const sources: number[][] = states.names.map(() => []);\n const stateOf = (s: string, where: string) => {\n const i = states.index.get(s);\n if (i === undefined) throw new Error(`AnimStateMachine: ${where} names no state \"${s}\"`);\n return i;\n };\n list.forEach((tr, i) => {\n const where = `transition ${i} (→ ${tr.to})`;\n t.to[i] = stateOf(tr.to, where);\n t.anyState[i] = tr.from === '*' ? 1 : 0;\n t.self[i] = tr.self ? 1 : 0;\n t.onEnd[i] = tr.onEnd ? 1 : 0;\n t.exitTime[i] = tr.exitTime ?? -1;\n if (tr.from === '*') states.names.forEach((_s, si) => sources[si]!.push(i));\n else for (const s of typeof tr.from === 'string' ? [tr.from] : tr.from) sources[stateOf(s, where)]!.push(i);\n t.condStart[i] = condParam.length;\n for (const [name, cond] of Object.entries(tr.when ?? {}) as [string, AnimCondition][]) {\n const p = params.index.get(name);\n if (p === undefined) throw new Error(`AnimStateMachine: ${where} asks for parameter \"${name}\", which is not declared`);\n const [op, value] = conditionOf(params.kinds[p]!, cond, `${where}, parameter \"${name}\"`);\n condParam.push(p);\n condOp.push(op);\n condValue.push(value);\n }\n t.condEnd[i] = condParam.length;\n });\n t.condParam = Int32Array.from(condParam);\n t.condOp = Uint8Array.from(condOp);\n t.condValue = Float64Array.from(condValue);\n const priority = (i: number) => list[i]!.priority ?? 0;\n // a stable sort: equal priorities keep the order they were written in\n states.candidates = sources.map((ids) => Int32Array.from(ids.sort((a, b) => priority(b) - priority(a) || a - b)));\n return t;\n}\n\nfunction conditionOf(kind: number, cond: AnimCondition, where: string): [number, number] {\n if (Array.isArray(cond)) {\n const [op, value] = cond as readonly [CompareOp, number];\n if (kind !== PARAM_NUMBER) throw new Error(`AnimStateMachine: ${where} compares a parameter that is not a number`);\n if (!(op in OPS) || !Number.isFinite(value)) throw new Error(`AnimStateMachine: ${where} has a bad comparison`);\n return [OPS[op], value];\n }\n if (kind === PARAM_NUMBER) {\n if (typeof cond !== 'number') throw new Error(`AnimStateMachine: ${where} is a number; give a number or [op, number]`);\n return [OP_EQ, cond];\n }\n if (typeof cond !== 'boolean') throw new Error(`AnimStateMachine: ${where} is a ${kind === PARAM_BOOL ? 'bool' : 'trigger'}; give true or false`);\n return [OP_EQ, cond ? 1 : 0];\n}\n\nfunction paramIndex(params: CompiledParams, name: string, kind: number, where: string): number {\n const i = params.index.get(name);\n if (i === undefined || params.kinds[i] !== kind) throw new Error(`AnimStateMachine: ${where} names \"${name}\", which is not a number parameter`);\n return i;\n}\n"],"names":["PARAM_BOOL","PARAM_NUMBER","PARAM_TRIGGER","OP_EQ","OP_NE","OP_GT","OP_GE","OP_LT","OP_LE","OPS","clipLength","clip","ms","i","compileParams","decl","names","kinds","initial","n","v","compileStates","options","clips","params","out","s","def","paramIndex","byFrame","m","compileTransitions","states","list","condParam","condOp","condValue","t","sources","stateOf","where","tr","_s","si","name","cond","p","op","value","conditionOf","priority","ids","a","b","kind"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineComponent as r, system as i } from "../ecs/World.js";
|
|
2
|
+
import { SpriteComponent as f } from "./animationSystem.js";
|
|
3
|
+
const p = r("AnimState");
|
|
4
|
+
function u(n = "anim-state") {
|
|
5
|
+
return i(n, "frame", ({ world: a, dt: o }) => {
|
|
6
|
+
a.each(f, p, (S, e, t) => {
|
|
7
|
+
t.update(o);
|
|
8
|
+
const m = t.frame;
|
|
9
|
+
e.frameName !== String(m) && e.setFrame(m);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
p as AnimStateComponent,
|
|
15
|
+
u as animStateSystem
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=animStateSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animStateSystem.js","sources":["../../src/anim/animStateSystem.ts"],"sourcesContent":["import { defineComponent, system, type ComponentType, type System } from '../ecs/World';\nimport { SpriteComponent } from './animationSystem';\nimport type { AnimStateMachine } from './AnimStateMachine';\n\n/** An entity's animation state machine. Give an entity this instead of `AnimationComponent`: the machine owns its animator. */\nexport const AnimStateComponent: ComponentType<AnimStateMachine> = defineComponent<AnimStateMachine>('AnimState');\n\n/**\n * Updates every `AnimStateMachine` each frame and shows its frame on the entity's sprite (only when it changed).\n * Add it after the systems that set the machines' parameters, so a change shows the same frame.\n */\nexport function animStateSystem(name = 'anim-state'): System {\n return system(name, 'frame', ({ world, dt }) => {\n world.each(SpriteComponent, AnimStateComponent, (_e, sprite, sm) => {\n sm.update(dt);\n const frame = sm.frame;\n if (sprite.frameName !== String(frame)) sprite.setFrame(frame);\n });\n });\n}\n"],"names":["AnimStateComponent","defineComponent","animStateSystem","name","system","world","dt","SpriteComponent","_e","sprite","sm","frame"],"mappings":";;AAKO,MAAMA,IAAsDC,EAAkC,WAAW;AAMzG,SAASC,EAAgBC,IAAO,cAAsB;AAC3D,SAAOC,EAAOD,GAAM,SAAS,CAAC,EAAE,OAAAE,GAAO,IAAAC,QAAS;AAC9C,IAAAD,EAAM,KAAKE,GAAiBP,GAAoB,CAACQ,GAAIC,GAAQC,MAAO;AAClE,MAAAA,EAAG,OAAOJ,CAAE;AACZ,YAAMK,IAAQD,EAAG;AACjB,MAAID,EAAO,cAAc,OAAOE,CAAK,KAAGF,EAAO,SAASE,CAAK;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACH;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { defineComponent as t, system as i } from "../ecs/World.js";
|
|
2
|
+
const r = t("Sprite"), f = t("Animation");
|
|
3
|
+
function d(o = "animation") {
|
|
4
|
+
return i(o, "frame", ({ world: m, dt: a }) => {
|
|
5
|
+
m.each(r, f, (c, n, e) => {
|
|
6
|
+
(e.update(a) || n.frameName !== String(e.frame)) && n.setFrame(e.frame);
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
f as AnimationComponent,
|
|
12
|
+
r as SpriteComponent,
|
|
13
|
+
d as animationSystem
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=animationSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationSystem.js","sources":["../../src/anim/animationSystem.ts"],"sourcesContent":["import type { Image } from '../core/Image';\nimport { defineComponent, system, type ComponentType, type System } from '../ecs/World';\nimport type { Animator } from './Animator';\n\n/** The engine's sprite component: the `Image` an entity is drawn as. */\nexport const SpriteComponent: ComponentType<Image> = defineComponent<Image>('Sprite');\n\n/** The engine's animation component: the `Animator` choosing the sprite's frame. */\nexport const AnimationComponent: ComponentType<Animator> = defineComponent<Animator>('Animation');\n\n/**\n * Advances every `Animator` each frame and shows its frame on the entity's sprite (only when it changed, so an idle\n * crowd costs no texture swaps).\n */\nexport function animationSystem(name = 'animation'): System {\n return system(name, 'frame', ({ world, dt }) => {\n world.each(SpriteComponent, AnimationComponent, (_e, sprite, anim) => {\n const changed = anim.update(dt);\n if (changed || sprite.frameName !== String(anim.frame)) sprite.setFrame(anim.frame);\n });\n });\n}\n"],"names":["SpriteComponent","defineComponent","AnimationComponent","animationSystem","name","system","world","dt","_e","sprite","anim"],"mappings":";AAKO,MAAMA,IAAwCC,EAAuB,QAAQ,GAGvEC,IAA8CD,EAA0B,WAAW;AAMzF,SAASE,EAAgBC,IAAO,aAAqB;AAC1D,SAAOC,EAAOD,GAAM,SAAS,CAAC,EAAE,OAAAE,GAAO,IAAAC,QAAS;AAC9C,IAAAD,EAAM,KAAKN,GAAiBE,GAAoB,CAACM,GAAIC,GAAQC,MAAS;AAEpE,OADgBA,EAAK,OAAOH,CAAE,KACfE,EAAO,cAAc,OAAOC,EAAK,KAAK,MAAGD,EAAO,SAASC,EAAK,KAAK;AAAA,IACpF,CAAC;AAAA,EACH,CAAC;AACH;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function r(t, n) {
|
|
2
|
+
return t.slices.find((e) => e.name === n);
|
|
3
|
+
}
|
|
4
|
+
function i(t, n = 0) {
|
|
5
|
+
let e;
|
|
6
|
+
for (const o of t.keys) {
|
|
7
|
+
if (o.frame > n) break;
|
|
8
|
+
e = o;
|
|
9
|
+
}
|
|
10
|
+
return e;
|
|
11
|
+
}
|
|
12
|
+
function c(t) {
|
|
13
|
+
const n = t.center;
|
|
14
|
+
if (n)
|
|
15
|
+
return { left: n.x, top: n.y, right: t.bounds.w - n.x - n.w, bottom: t.bounds.h - n.y - n.h };
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
i as sliceAt,
|
|
19
|
+
c as sliceBorders,
|
|
20
|
+
r as sliceNamed
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=asepriteSlices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asepriteSlices.js","sources":["../../src/anim/asepriteSlices.ts"],"sourcesContent":["import type { AsepriteSheet, AsepriteSlice, AsepriteSliceKey } from './asepriteTypes';\n\n/** A slice by name, or undefined. */\nexport function sliceNamed(sheet: AsepriteSheet, name: string): AsepriteSlice | undefined {\n return sheet.slices.find((s) => s.name === name);\n}\n\n/**\n * The key of `slice` in effect on sprite frame `frame`: Aseprite keys a slice on the frame it changes and holds it\n * until the next key, so the last key at or before the frame. Before the first key the slice is not there (undefined).\n */\nexport function sliceAt(slice: AsepriteSlice, frame = 0): AsepriteSliceKey | undefined {\n let found: AsepriteSliceKey | undefined;\n for (const k of slice.keys) {\n if (k.frame > frame) break;\n found = k;\n }\n return found;\n}\n\n/**\n * The 9-slice borders of a key with a centre — how far in from each edge the stretchable middle starts — in the shape\n * Pixi's `NineSliceSprite` and `Texture.defaultBorders` take. Undefined for a key with no centre.\n */\nexport function sliceBorders(key: AsepriteSliceKey): { left: number; top: number; right: number; bottom: number } | undefined {\n const c = key.center;\n if (!c) return undefined;\n return { left: c.x, top: c.y, right: key.bounds.w - c.x - c.w, bottom: key.bounds.h - c.y - c.h };\n}\n"],"names":["sliceNamed","sheet","name","s","sliceAt","slice","frame","found","k","sliceBorders","key","c"],"mappings":"AAGO,SAASA,EAAWC,GAAsBC,GAAyC;AACxF,SAAOD,EAAM,OAAO,KAAK,CAACE,MAAMA,EAAE,SAASD,CAAI;AACjD;AAMO,SAASE,EAAQC,GAAsBC,IAAQ,GAAiC;AACrF,MAAIC;AACJ,aAAWC,KAAKH,EAAM,MAAM;AAC1B,QAAIG,EAAE,QAAQF,EAAO;AACrB,IAAAC,IAAQC;AAAA,EACV;AACA,SAAOD;AACT;AAMO,SAASE,EAAaC,GAAiG;AAC5H,QAAMC,IAAID,EAAI;AACd,MAAKC;AACL,WAAO,EAAE,MAAMA,EAAE,GAAG,KAAKA,EAAE,GAAG,OAAOD,EAAI,OAAO,IAAIC,EAAE,IAAIA,EAAE,GAAG,QAAQD,EAAI,OAAO,IAAIC,EAAE,IAAIA,EAAE,EAAA;AAChG;"}
|