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,79 @@
|
|
|
1
|
+
import { Container as o } from "pixi.js";
|
|
2
|
+
import { World as s } from "../ecs/World.js";
|
|
3
|
+
class u {
|
|
4
|
+
world = new s();
|
|
5
|
+
/** Everything the scene draws in the world goes under this (the camera moves it). */
|
|
6
|
+
root = new o({ sortableChildren: !0 });
|
|
7
|
+
/** Everything the scene draws on the screen (HUD) goes under this. */
|
|
8
|
+
hud = new o();
|
|
9
|
+
bound = null;
|
|
10
|
+
timers = /* @__PURE__ */ new Set();
|
|
11
|
+
inputs = [];
|
|
12
|
+
/** The engine running this scene; only valid between `enter` and `exit`. */
|
|
13
|
+
get engine() {
|
|
14
|
+
if (!this.bound) throw new Error(`${this.constructor.name}: not running in an engine`);
|
|
15
|
+
return this.bound;
|
|
16
|
+
}
|
|
17
|
+
/** Called once when the scene becomes active. May be async: the scene starts updating when it resolves. */
|
|
18
|
+
onEnter() {
|
|
19
|
+
}
|
|
20
|
+
/** Called when the scene is removed. The world and containers are cleared after it returns. */
|
|
21
|
+
onExit() {
|
|
22
|
+
}
|
|
23
|
+
/** Called when another scene is pushed over this one. */
|
|
24
|
+
onPause() {
|
|
25
|
+
}
|
|
26
|
+
/** Called when the scene over this one is popped. */
|
|
27
|
+
onResume() {
|
|
28
|
+
}
|
|
29
|
+
/** Once per simulation step, `dt` in seconds. */
|
|
30
|
+
fixedUpdate(t) {
|
|
31
|
+
}
|
|
32
|
+
/** Once per rendered frame, `dt` in seconds; `alpha` is the share of a step since the last one (0–1). */
|
|
33
|
+
update(t, e) {
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Calls `fn` after `ms` on the stage's clock, unless the scene has left by then: its timers are cancelled when it
|
|
37
|
+
* exits. Only valid while the scene is running (between `enter` and `exit`).
|
|
38
|
+
*/
|
|
39
|
+
delay(t, e) {
|
|
40
|
+
const n = this.engine.stage.time.delayedCall(t, () => {
|
|
41
|
+
this.timers.delete(r), e();
|
|
42
|
+
}), r = {
|
|
43
|
+
remove: () => {
|
|
44
|
+
this.timers.delete(r), n.remove();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return this.timers.add(r), r;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Registers input the scene reads (an `Actions`) and returns it, so a field can be written in one line:
|
|
51
|
+
* `private readonly input = this.useInput(new Actions(keyboard, bindings));`. When a scene pushed over this one
|
|
52
|
+
* pops, every registered input is flushed before `onResume`, so a key pressed in the menu is not a press here.
|
|
53
|
+
*/
|
|
54
|
+
useInput(t) {
|
|
55
|
+
return this.inputs.push(t), t;
|
|
56
|
+
}
|
|
57
|
+
/** @internal Called by the scene manager before `onResume`. */
|
|
58
|
+
flushInput() {
|
|
59
|
+
for (const t of this.inputs) t.flush();
|
|
60
|
+
}
|
|
61
|
+
/** @internal Engine-side wiring; games call `engine.scenes`. */
|
|
62
|
+
attach(t) {
|
|
63
|
+
this.bound = t, t.stage.world.addChild(this.root), t.stage.screen.addChild(this.hud);
|
|
64
|
+
}
|
|
65
|
+
/** @internal Clears what the scene made but keeps its containers, so the same scene may be entered again. */
|
|
66
|
+
detach() {
|
|
67
|
+
for (const t of [...this.timers]) t.remove();
|
|
68
|
+
this.world.clear();
|
|
69
|
+
for (const t of [this.root, this.hud]) {
|
|
70
|
+
for (const e of t.removeChildren()) e.destroy({ children: !0 });
|
|
71
|
+
t.removeFromParent();
|
|
72
|
+
}
|
|
73
|
+
this.bound = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
u as Scene
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=Scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scene.js","sources":["../../src/engine/Scene.ts"],"sourcesContent":["import { Container } from 'pixi.js';\nimport { World } from '../ecs/World';\nimport type { Engine } from './Engine';\n\n/** Input a scene can be told to forget its pending presses on (an `Actions`). */\nexport interface FlushableInput {\n flush(): void;\n}\n\n/** A timer `Scene.delay` started; `remove` cancels it. */\nexport interface SceneTimer {\n remove(): void;\n}\n\n/**\n * One screen of the game: a title, a level, a pause menu. A scene owns a `World` of entities and systems and a\n * `root` container in the engine's world layer; both are cleared when it leaves, so nothing it made outlives it.\n *\n * Override the hooks you need. `fixedUpdate` runs once per simulation step, `update` once per rendered frame, both\n * after the world's own systems of that phase.\n *\n * Two things a scene should hand the engine so they end with it: timers (`delay`, not `stage.time.delayedCall`, whose\n * timers belong to the stage and fire after the scene has gone) and its input (`useInput`, flushed when a scene pushed\n * over this one pops, so presses made in a pause menu are not read again by the level under it).\n *\n * Names taken: `world`, `root` and `hud` are the scene's own fields, so a subclass cannot declare a field of those\n * names for something else (a HUD class of the game's is best kept as `display`, `overlay`, …).\n */\nexport abstract class Scene {\n readonly world = new World();\n /** Everything the scene draws in the world goes under this (the camera moves it). */\n readonly root = new Container({ sortableChildren: true });\n /** Everything the scene draws on the screen (HUD) goes under this. */\n readonly hud = new Container();\n private bound: Engine | null = null;\n private readonly timers = new Set<SceneTimer>();\n private readonly inputs: FlushableInput[] = [];\n\n /** The engine running this scene; only valid between `enter` and `exit`. */\n get engine(): Engine {\n if (!this.bound) throw new Error(`${this.constructor.name}: not running in an engine`);\n return this.bound;\n }\n\n /** Called once when the scene becomes active. May be async: the scene starts updating when it resolves. */\n onEnter(): void | Promise<void> {}\n /** Called when the scene is removed. The world and containers are cleared after it returns. */\n onExit(): void {}\n /** Called when another scene is pushed over this one. */\n onPause(): void {}\n /** Called when the scene over this one is popped. */\n onResume(): void {}\n /** Once per simulation step, `dt` in seconds. */\n fixedUpdate(_dt: number): void {}\n /** Once per rendered frame, `dt` in seconds; `alpha` is the share of a step since the last one (0–1). */\n update(_dt: number, _alpha: number): void {}\n\n /**\n * Calls `fn` after `ms` on the stage's clock, unless the scene has left by then: its timers are cancelled when it\n * exits. Only valid while the scene is running (between `enter` and `exit`).\n */\n delay(ms: number, fn: () => void): SceneTimer {\n const handle = this.engine.stage.time.delayedCall(ms, () => {\n this.timers.delete(timer);\n fn();\n });\n const timer: SceneTimer = {\n remove: () => {\n this.timers.delete(timer);\n handle.remove();\n },\n };\n this.timers.add(timer);\n return timer;\n }\n\n /**\n * Registers input the scene reads (an `Actions`) and returns it, so a field can be written in one line:\n * `private readonly input = this.useInput(new Actions(keyboard, bindings));`. When a scene pushed over this one\n * pops, every registered input is flushed before `onResume`, so a key pressed in the menu is not a press here.\n */\n useInput<T extends FlushableInput>(input: T): T {\n this.inputs.push(input);\n return input;\n }\n\n /** @internal Called by the scene manager before `onResume`. */\n flushInput(): void {\n for (const i of this.inputs) i.flush();\n }\n\n /** @internal Engine-side wiring; games call `engine.scenes`. */\n attach(engine: Engine): void {\n this.bound = engine;\n engine.stage.world.addChild(this.root);\n engine.stage.screen.addChild(this.hud);\n }\n\n /** @internal Clears what the scene made but keeps its containers, so the same scene may be entered again. */\n detach(): void {\n for (const t of [...this.timers]) t.remove();\n this.world.clear();\n for (const c of [this.root, this.hud]) {\n for (const child of c.removeChildren()) child.destroy({ children: true });\n c.removeFromParent();\n }\n this.bound = null;\n }\n}\n"],"names":["Scene","World","Container","_dt","_alpha","ms","fn","handle","timer","input","i","engine","c","child"],"mappings":";;AA4BO,MAAeA,EAAM;AAAA,EACjB,QAAQ,IAAIC,EAAA;AAAA;AAAA,EAEZ,OAAO,IAAIC,EAAU,EAAE,kBAAkB,IAAM;AAAA;AAAA,EAE/C,MAAM,IAAIA,EAAA;AAAA,EACX,QAAuB;AAAA,EACd,6BAAa,IAAA;AAAA,EACb,SAA2B,CAAA;AAAA;AAAA,EAG5C,IAAI,SAAiB;AACnB,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,GAAG,KAAK,YAAY,IAAI,4BAA4B;AACrF,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,UAAgC;AAAA,EAAC;AAAA;AAAA,EAEjC,SAAe;AAAA,EAAC;AAAA;AAAA,EAEhB,UAAgB;AAAA,EAAC;AAAA;AAAA,EAEjB,WAAiB;AAAA,EAAC;AAAA;AAAA,EAElB,YAAYC,GAAmB;AAAA,EAAC;AAAA;AAAA,EAEhC,OAAOA,GAAaC,GAAsB;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3C,MAAMC,GAAYC,GAA4B;AAC5C,UAAMC,IAAS,KAAK,OAAO,MAAM,KAAK,YAAYF,GAAI,MAAM;AAC1D,WAAK,OAAO,OAAOG,CAAK,GACxBF,EAAA;AAAA,IACF,CAAC,GACKE,IAAoB;AAAA,MACxB,QAAQ,MAAM;AACZ,aAAK,OAAO,OAAOA,CAAK,GACxBD,EAAO,OAAA;AAAA,MACT;AAAA,IAAA;AAEF,gBAAK,OAAO,IAAIC,CAAK,GACdA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAmCC,GAAa;AAC9C,gBAAK,OAAO,KAAKA,CAAK,GACfA;AAAA,EACT;AAAA;AAAA,EAGA,aAAmB;AACjB,eAAWC,KAAK,KAAK,OAAQ,CAAAA,EAAE,MAAA;AAAA,EACjC;AAAA;AAAA,EAGA,OAAOC,GAAsB;AAC3B,SAAK,QAAQA,GACbA,EAAO,MAAM,MAAM,SAAS,KAAK,IAAI,GACrCA,EAAO,MAAM,OAAO,SAAS,KAAK,GAAG;AAAA,EACvC;AAAA;AAAA,EAGA,SAAe;AACb,eAAW,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,OAAA;AACpC,SAAK,MAAM,MAAA;AACX,eAAWC,KAAK,CAAC,KAAK,MAAM,KAAK,GAAG,GAAG;AACrC,iBAAWC,KAASD,EAAE,eAAA,KAAwB,QAAQ,EAAE,UAAU,IAAM;AACxE,MAAAA,EAAE,iBAAA;AAAA,IACJ;AACA,SAAK,QAAQ;AAAA,EACf;AACF;"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
class i {
|
|
2
|
+
constructor(t) {
|
|
3
|
+
this.engine = t;
|
|
4
|
+
}
|
|
5
|
+
engine;
|
|
6
|
+
stack = [];
|
|
7
|
+
queue = Promise.resolve();
|
|
8
|
+
/** True while an async `onEnter` is running: nothing updates until it is done. */
|
|
9
|
+
entering = !1;
|
|
10
|
+
/** The scene that updates, if any. */
|
|
11
|
+
get current() {
|
|
12
|
+
return this.entering ? void 0 : this.stack[this.stack.length - 1];
|
|
13
|
+
}
|
|
14
|
+
/** Every scene on the stack, bottom first. */
|
|
15
|
+
get all() {
|
|
16
|
+
return this.stack;
|
|
17
|
+
}
|
|
18
|
+
/** Removes every scene and enters `scene`. */
|
|
19
|
+
replace(t) {
|
|
20
|
+
return this.enqueue(async () => {
|
|
21
|
+
for (; this.stack.length; ) this.exitTop();
|
|
22
|
+
this.engine.stage.cameras.main.reset(), await this.enter(t);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Pauses the current scene and enters `scene` over it. */
|
|
26
|
+
push(t) {
|
|
27
|
+
return this.enqueue(async () => {
|
|
28
|
+
this.stack[this.stack.length - 1]?.onPause(), await this.enter(t);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** Leaves the current scene and resumes the one under it. */
|
|
32
|
+
pop() {
|
|
33
|
+
return this.enqueue(async () => {
|
|
34
|
+
if (!this.stack.length) return;
|
|
35
|
+
this.exitTop();
|
|
36
|
+
const t = this.stack[this.stack.length - 1];
|
|
37
|
+
t && (t.flushInput(), t.onResume());
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Leaves every scene (the engine is shutting down). */
|
|
41
|
+
clear() {
|
|
42
|
+
return this.enqueue(async () => {
|
|
43
|
+
for (; this.stack.length; ) this.exitTop();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async enter(t) {
|
|
47
|
+
if (this.stack.includes(t)) throw new Error(`${t.constructor.name} is already on the scene stack`);
|
|
48
|
+
t.attach(this.engine), this.stack.push(t), this.entering = !0;
|
|
49
|
+
try {
|
|
50
|
+
await t.onEnter();
|
|
51
|
+
} finally {
|
|
52
|
+
this.entering = !1;
|
|
53
|
+
}
|
|
54
|
+
this.engine.loop.reset();
|
|
55
|
+
}
|
|
56
|
+
exitTop() {
|
|
57
|
+
const t = this.stack.pop();
|
|
58
|
+
if (t)
|
|
59
|
+
try {
|
|
60
|
+
t.onExit();
|
|
61
|
+
} finally {
|
|
62
|
+
t.detach();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
enqueue(t) {
|
|
66
|
+
const e = this.queue.then(t);
|
|
67
|
+
return this.queue = e.catch((s) => this.engine.reportError("scene", s)), e;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
i as SceneManager
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=SceneManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneManager.js","sources":["../../src/engine/SceneManager.ts"],"sourcesContent":["import type { Engine } from './Engine';\nimport type { Scene } from './Scene';\n\n/**\n * A stack of scenes. Only the top one updates; the ones under it are paused but still drawn (a pause menu over the\n * level). Changes are queued and applied one at a time, so a scene that replaces itself from inside its own update,\n * or an async `onEnter` still loading, never leaves two scenes half entered.\n *\n * The camera is the engine's, not a scene's: `replace` resets it (`Camera.reset`: no target, no bounds, the default\n * zoom) after the old scenes leave and before the new one enters, so a level's follow and bounds never hold over a\n * title screen. `push` and `pop` leave it as it is: the scene under a pause menu keeps its view. `pop` flushes the\n * resumed scene's input (`Scene.useInput`) before its `onResume`.\n */\nexport class SceneManager {\n private readonly stack: Scene[] = [];\n private queue: Promise<void> = Promise.resolve();\n /** True while an async `onEnter` is running: nothing updates until it is done. */\n private entering = false;\n\n constructor(private readonly engine: Engine) {}\n\n /** The scene that updates, if any. */\n get current(): Scene | undefined {\n return this.entering ? undefined : this.stack[this.stack.length - 1];\n }\n\n /** Every scene on the stack, bottom first. */\n get all(): readonly Scene[] {\n return this.stack;\n }\n\n /** Removes every scene and enters `scene`. */\n replace(scene: Scene): Promise<void> {\n return this.enqueue(async () => {\n while (this.stack.length) this.exitTop();\n this.engine.stage.cameras.main.reset();\n await this.enter(scene);\n });\n }\n\n /** Pauses the current scene and enters `scene` over it. */\n push(scene: Scene): Promise<void> {\n return this.enqueue(async () => {\n this.stack[this.stack.length - 1]?.onPause();\n await this.enter(scene);\n });\n }\n\n /** Leaves the current scene and resumes the one under it. */\n pop(): Promise<void> {\n return this.enqueue(async () => {\n if (!this.stack.length) return;\n this.exitTop();\n const under = this.stack[this.stack.length - 1];\n if (!under) return;\n under.flushInput();\n under.onResume();\n });\n }\n\n /** Leaves every scene (the engine is shutting down). */\n clear(): Promise<void> {\n return this.enqueue(async () => {\n while (this.stack.length) this.exitTop();\n });\n }\n\n private async enter(scene: Scene): Promise<void> {\n if (this.stack.includes(scene)) throw new Error(`${scene.constructor.name} is already on the scene stack`);\n scene.attach(this.engine);\n this.stack.push(scene);\n this.entering = true;\n try {\n await scene.onEnter();\n } finally {\n this.entering = false;\n }\n this.engine.loop.reset();\n }\n\n private exitTop(): void {\n const scene = this.stack.pop();\n if (!scene) return;\n try {\n scene.onExit();\n } finally {\n scene.detach();\n }\n }\n\n private enqueue(job: () => Promise<void>): Promise<void> {\n const run = this.queue.then(job);\n // a failed change must not wedge every change after it\n this.queue = run.catch((err) => this.engine.reportError('scene', err));\n return run;\n }\n}\n"],"names":["SceneManager","engine","scene","under","job","run","err"],"mappings":"AAaO,MAAMA,EAAa;AAAA,EAMxB,YAA6BC,GAAgB;AAAhB,SAAA,SAAAA;AAAA,EAAiB;AAAA,EAAjB;AAAA,EALZ,QAAiB,CAAA;AAAA,EAC1B,QAAuB,QAAQ,QAAA;AAAA;AAAA,EAE/B,WAAW;AAAA;AAAA,EAKnB,IAAI,UAA6B;AAC/B,WAAO,KAAK,WAAW,SAAY,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,IAAI,MAAwB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,QAAQC,GAA6B;AACnC,WAAO,KAAK,QAAQ,YAAY;AAC9B,aAAO,KAAK,MAAM,SAAQ,MAAK,QAAA;AAC/B,WAAK,OAAO,MAAM,QAAQ,KAAK,MAAA,GAC/B,MAAM,KAAK,MAAMA,CAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,KAAKA,GAA6B;AAChC,WAAO,KAAK,QAAQ,YAAY;AAC9B,WAAK,MAAM,KAAK,MAAM,SAAS,CAAC,GAAG,QAAA,GACnC,MAAM,KAAK,MAAMA,CAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAqB;AACnB,WAAO,KAAK,QAAQ,YAAY;AAC9B,UAAI,CAAC,KAAK,MAAM,OAAQ;AACxB,WAAK,QAAA;AACL,YAAMC,IAAQ,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC9C,MAAKA,MACLA,EAAM,WAAA,GACNA,EAAM,SAAA;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAuB;AACrB,WAAO,KAAK,QAAQ,YAAY;AAC9B,aAAO,KAAK,MAAM,SAAQ,MAAK,QAAA;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,MAAMD,GAA6B;AAC/C,QAAI,KAAK,MAAM,SAASA,CAAK,EAAG,OAAM,IAAI,MAAM,GAAGA,EAAM,YAAY,IAAI,gCAAgC;AACzG,IAAAA,EAAM,OAAO,KAAK,MAAM,GACxB,KAAK,MAAM,KAAKA,CAAK,GACrB,KAAK,WAAW;AAChB,QAAI;AACF,YAAMA,EAAM,QAAA;AAAA,IACd,UAAA;AACE,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,OAAO,KAAK,MAAA;AAAA,EACnB;AAAA,EAEQ,UAAgB;AACtB,UAAMA,IAAQ,KAAK,MAAM,IAAA;AACzB,QAAKA;AACL,UAAI;AACF,QAAAA,EAAM,OAAA;AAAA,MACR,UAAA;AACE,QAAAA,EAAM,OAAA;AAAA,MACR;AAAA,EACF;AAAA,EAEQ,QAAQE,GAAyC;AACvD,UAAMC,IAAM,KAAK,MAAM,KAAKD,CAAG;AAE/B,gBAAK,QAAQC,EAAI,MAAM,CAACC,MAAQ,KAAK,OAAO,YAAY,SAASA,CAAG,CAAC,GAC9DD;AAAA,EACT;AACF;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class o {
|
|
2
|
+
constructor(e = (t, s) => console.error(`[events] ${String(t)} listener failed`, s)) {
|
|
3
|
+
this.onError = e;
|
|
4
|
+
}
|
|
5
|
+
onError;
|
|
6
|
+
listeners = /* @__PURE__ */ new Map();
|
|
7
|
+
/** Subscribes to `type`; returns the unsubscribe function. */
|
|
8
|
+
on(e, t) {
|
|
9
|
+
return this.listeners.set(e, [...this.listeners.get(e) ?? [], t]), () => this.off(e, t);
|
|
10
|
+
}
|
|
11
|
+
/** Subscribes for the next `type` only. */
|
|
12
|
+
once(e, t) {
|
|
13
|
+
const s = this.on(e, (r) => {
|
|
14
|
+
s(), t(r);
|
|
15
|
+
});
|
|
16
|
+
return s;
|
|
17
|
+
}
|
|
18
|
+
off(e, t) {
|
|
19
|
+
const s = this.listeners.get(e);
|
|
20
|
+
if (!s) return;
|
|
21
|
+
const r = s.filter((n) => n !== t);
|
|
22
|
+
r.length ? this.listeners.set(e, r) : this.listeners.delete(e);
|
|
23
|
+
}
|
|
24
|
+
emit(e, t) {
|
|
25
|
+
for (const s of this.listeners.get(e) ?? [])
|
|
26
|
+
try {
|
|
27
|
+
s(t);
|
|
28
|
+
} catch (r) {
|
|
29
|
+
this.onError(e, r);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
listenerCount(e) {
|
|
33
|
+
return this.listeners.get(e)?.length ?? 0;
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this.listeners.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
o as EventBus
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sources":["../../src/events/EventBus.ts"],"sourcesContent":["/**\n * Typed observer: listeners subscribe per event name and run in subscription order.\n * `Events` maps each event name to its payload, e.g. `EventBus<{ enemyKilled: { id: number } }>`.\n *\n * A listener that throws does not stop the ones after it; the error is handed to `onError` (the console by default).\n */\nexport class EventBus<Events extends object> {\n private readonly listeners = new Map<keyof Events, ((payload: never) => void)[]>();\n\n constructor(private readonly onError: (type: keyof Events, err: unknown) => void = (type, err) => console.error(`[events] ${String(type)} listener failed`, err)) {}\n\n /** Subscribes to `type`; returns the unsubscribe function. */\n on<K extends keyof Events>(type: K, fn: (payload: Events[K]) => void): () => void {\n this.listeners.set(type, [...(this.listeners.get(type) ?? []), fn]);\n return () => this.off(type, fn);\n }\n\n /** Subscribes for the next `type` only. */\n once<K extends keyof Events>(type: K, fn: (payload: Events[K]) => void): () => void {\n const off = this.on(type, (payload) => {\n off();\n fn(payload);\n });\n return off;\n }\n\n off<K extends keyof Events>(type: K, fn: (payload: Events[K]) => void): void {\n const list = this.listeners.get(type);\n if (!list) return;\n const left = list.filter((f) => f !== fn);\n if (left.length) this.listeners.set(type, left);\n else this.listeners.delete(type);\n }\n\n emit<K extends keyof Events>(type: K, payload: Events[K]): void {\n // the list is replaced, never mutated, on every (un)subscribe: walking this one is safe while listeners change it\n for (const fn of this.listeners.get(type) ?? []) {\n try {\n (fn as (payload: Events[K]) => void)(payload);\n } catch (err) {\n this.onError(type, err);\n }\n }\n }\n\n listenerCount(type: keyof Events): number {\n return this.listeners.get(type)?.length ?? 0;\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n"],"names":["EventBus","onError","type","err","fn","off","payload","list","left","f"],"mappings":"AAMO,MAAMA,EAAgC;AAAA,EAG3C,YAA6BC,IAAsD,CAACC,GAAMC,MAAQ,QAAQ,MAAM,YAAY,OAAOD,CAAI,CAAC,oBAAoBC,CAAG,GAAG;AAArI,SAAA,UAAAF;AAAA,EAAsI;AAAA,EAAtI;AAAA,EAFZ,gCAAgB,IAAA;AAAA;AAAA,EAKjC,GAA2BC,GAASE,GAA8C;AAChF,gBAAK,UAAU,IAAIF,GAAM,CAAC,GAAI,KAAK,UAAU,IAAIA,CAAI,KAAK,CAAA,GAAKE,CAAE,CAAC,GAC3D,MAAM,KAAK,IAAIF,GAAME,CAAE;AAAA,EAChC;AAAA;AAAA,EAGA,KAA6BF,GAASE,GAA8C;AAClF,UAAMC,IAAM,KAAK,GAAGH,GAAM,CAACI,MAAY;AACrC,MAAAD,EAAA,GACAD,EAAGE,CAAO;AAAA,IACZ,CAAC;AACD,WAAOD;AAAA,EACT;AAAA,EAEA,IAA4BH,GAASE,GAAwC;AAC3E,UAAMG,IAAO,KAAK,UAAU,IAAIL,CAAI;AACpC,QAAI,CAACK,EAAM;AACX,UAAMC,IAAOD,EAAK,OAAO,CAACE,MAAMA,MAAML,CAAE;AACxC,IAAII,EAAK,SAAQ,KAAK,UAAU,IAAIN,GAAMM,CAAI,IACzC,KAAK,UAAU,OAAON,CAAI;AAAA,EACjC;AAAA,EAEA,KAA6BA,GAASI,GAA0B;AAE9D,eAAWF,KAAM,KAAK,UAAU,IAAIF,CAAI,KAAK;AAC3C,UAAI;AACD,QAAAE,EAAoCE,CAAO;AAAA,MAC9C,SAASH,GAAK;AACZ,aAAK,QAAQD,GAAMC,CAAG;AAAA,MACxB;AAAA,EAEJ;AAAA,EAEA,cAAcD,GAA4B;AACxC,WAAO,KAAK,UAAU,IAAIA,CAAI,GAAG,UAAU;AAAA,EAC7C;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAA;AAAA,EACjB;AACF;"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { installLabelFont as k } from "../core/BitmapLabel.js";
|
|
2
|
+
const d = (n) => `${n.size}|${n.color}`;
|
|
3
|
+
class m {
|
|
4
|
+
constructor(t, s) {
|
|
5
|
+
this.stage = t, this.options = s, this.stroke = s.stroke ?? "#140e18", this.strokeWidth = s.strokeWidth ?? ((i) => Math.max(2, Math.round(i / 5))), this.resolution = s.resolution ?? 4, this.keep = s.keepPerStyle ?? 24;
|
|
6
|
+
}
|
|
7
|
+
stage;
|
|
8
|
+
options;
|
|
9
|
+
pools = /* @__PURE__ */ new Map();
|
|
10
|
+
stroke;
|
|
11
|
+
strokeWidth;
|
|
12
|
+
resolution;
|
|
13
|
+
keep;
|
|
14
|
+
/**
|
|
15
|
+
* Bakes the fonts of `styles`, one a task starting `delayMs` from now, so no frame pays for them all at once — ten
|
|
16
|
+
* at once froze a world's first frame half a second (each font measures and kerns every glyph). Returns a cancel.
|
|
17
|
+
*/
|
|
18
|
+
warm(t, s = 1e3, i = 50) {
|
|
19
|
+
const o = [...t];
|
|
20
|
+
let r;
|
|
21
|
+
const e = () => {
|
|
22
|
+
const h = o.shift();
|
|
23
|
+
h && (this.install(h), r = setTimeout(e, i));
|
|
24
|
+
};
|
|
25
|
+
return r = setTimeout(e, s), () => clearTimeout(r);
|
|
26
|
+
}
|
|
27
|
+
/** Bakes one style's font now. */
|
|
28
|
+
install(t) {
|
|
29
|
+
k(this.options.fontFamily, t.size, t.color, this.stroke, this.strokeWidth(t.size), this.resolution, this.options.glyphs);
|
|
30
|
+
}
|
|
31
|
+
/** A label ready to animate: shown, opaque, unscaled, anchored at its bottom centre on (x, y). */
|
|
32
|
+
take(t, s, i, o) {
|
|
33
|
+
const r = this.pools.get(d(o));
|
|
34
|
+
let e = r?.pop();
|
|
35
|
+
for (; e && e.destroyed; ) e = r?.pop();
|
|
36
|
+
return e ? (e.setText(i), e.position.set(t, s), e.alpha = 1, e.setScale(1), e.visible = !0) : (e = this.stage.add.label(t, s, i, this.options.fontFamily, o.size, o.color, this.stroke, this.strokeWidth(o.size), this.resolution, this.options.glyphs).setOrigin(0.5, 1), this.options.parent && this.options.parent.addChild(e)), this.options.depth !== void 0 && e.setDepth(this.options.depth), e;
|
|
37
|
+
}
|
|
38
|
+
/** Hands a finished label back for reuse. */
|
|
39
|
+
release(t, s) {
|
|
40
|
+
if (t.destroyed) return;
|
|
41
|
+
const i = d(s);
|
|
42
|
+
let o = this.pools.get(i);
|
|
43
|
+
if (o || this.pools.set(i, o = []), o.length >= this.keep) {
|
|
44
|
+
t.destroy();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
t.visible = !1, o.push(t);
|
|
48
|
+
}
|
|
49
|
+
/** A label that pops, rises, fades and goes back to the pool by itself, on the stage's own tweens. */
|
|
50
|
+
float(t, s, i, o, r = {}) {
|
|
51
|
+
const { rise: e = 16, driftX: h = 0, pop: a = 1.4, popMs: c = 120, holdMs: f = 350, fadeMs: u = 500 } = r, l = this.take(t, s, i, o), p = this.stage.tweens;
|
|
52
|
+
return a !== 1 && (l.setScale(a), p.add({ targets: l, scale: 1, duration: c, ease: "Back.Out" })), p.add({
|
|
53
|
+
targets: l,
|
|
54
|
+
x: t + h,
|
|
55
|
+
y: s - e,
|
|
56
|
+
alpha: 0,
|
|
57
|
+
delay: f,
|
|
58
|
+
duration: u,
|
|
59
|
+
ease: "Sine.In",
|
|
60
|
+
onComplete: () => this.release(l, o)
|
|
61
|
+
}), l;
|
|
62
|
+
}
|
|
63
|
+
/** Destroys every pooled label (a scene ending); labels still out are the scene's to free. */
|
|
64
|
+
clear() {
|
|
65
|
+
for (const t of this.pools.values()) for (const s of t) s.destroyed || s.destroy();
|
|
66
|
+
this.pools.clear();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
m as FloatingText
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=FloatingText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FloatingText.js","sources":["../../src/fx/FloatingText.ts"],"sourcesContent":["import { type BitmapLabel, installLabelFont } from '../core/BitmapLabel';\nimport type { Container } from 'pixi.js';\nimport type { Stage } from '../core/Stage';\n\n/** One look of floating text: a size and a fill colour. Each look is its own baked font. */\nexport interface FloatingTextStyle {\n size: number;\n color: string;\n}\n\nexport interface FloatingTextOptions {\n /** A font already loaded (`document.fonts.load`), or the glyphs bake in the fallback. */\n fontFamily: string;\n /** Outline colour (default near-black). */\n stroke?: string;\n /** Outline width for a size (default a fifth of it, at least 2). */\n strokeWidth?: (size: number) => number;\n /** Rasterising resolution (default 4, crisp under a zoomed camera). */\n resolution?: number;\n /** Spent labels of one style kept for reuse; the rest are destroyed (default 24). */\n keepPerStyle?: number;\n /** Letters beyond ASCII the labels print (see `installLabelFont`), baked with each style's font. */\n glyphs?: string;\n /** Depth given to every label taken (default: left as made). */\n depth?: number;\n /**\n * Where new labels are added (default the stage's world layer). Give a scene's `root` and the labels live and die\n * with the scene: on the world layer they outlive it, and a label still floating when the scene changes stays.\n */\n parent?: Container;\n}\n\n/** How `float` moves a label: pops from `pop`× to 1, holds, then rises `rise` px while fading out. */\nexport interface FloatOptions {\n rise?: number;\n /** Sideways drift over the fade, px (pass a random one for a crowd of numbers that do not stack). */\n driftX?: number;\n pop?: number;\n popMs?: number;\n holdMs?: number;\n fadeMs?: number;\n}\n\nconst keyOf = (s: FloatingTextStyle) => `${s.size}|${s.color}`;\n\n/**\n * Floating text — damage numbers, pickups, \"+1\" — drawn from bitmap fonts and reused rather than created and\n * destroyed each time: a crowded fight throws dozens a second, and as canvas text each one repainted a canvas at\n * resolution 4 and uploaded it. A label keeps its font, so spent ones are pooled per style and only their string\n * changes. Fonts are baked ahead (`warm`): a style first met mid-fight baked its glyph pages on that frame.\n */\nexport class FloatingText {\n private readonly pools = new Map<string, BitmapLabel[]>();\n private readonly stroke: string;\n private readonly strokeWidth: (size: number) => number;\n private readonly resolution: number;\n private readonly keep: number;\n\n constructor(\n private readonly stage: Stage,\n private readonly options: FloatingTextOptions,\n ) {\n this.stroke = options.stroke ?? '#140e18';\n this.strokeWidth = options.strokeWidth ?? ((size) => Math.max(2, Math.round(size / 5)));\n this.resolution = options.resolution ?? 4;\n this.keep = options.keepPerStyle ?? 24;\n }\n\n /**\n * Bakes the fonts of `styles`, one a task starting `delayMs` from now, so no frame pays for them all at once — ten\n * at once froze a world's first frame half a second (each font measures and kerns every glyph). Returns a cancel.\n */\n warm(styles: readonly FloatingTextStyle[], delayMs = 1000, gapMs = 50): () => void {\n const todo = [...styles];\n let timer: ReturnType<typeof setTimeout> | undefined;\n const next = () => {\n const s = todo.shift();\n if (!s) return;\n this.install(s);\n timer = setTimeout(next, gapMs);\n };\n timer = setTimeout(next, delayMs);\n return () => clearTimeout(timer);\n }\n\n /** Bakes one style's font now. */\n install(style: FloatingTextStyle): void {\n installLabelFont(this.options.fontFamily, style.size, style.color, this.stroke, this.strokeWidth(style.size), this.resolution, this.options.glyphs);\n }\n\n /** A label ready to animate: shown, opaque, unscaled, anchored at its bottom centre on (x, y). */\n take(x: number, y: number, text: string, style: FloatingTextStyle): BitmapLabel {\n const pool = this.pools.get(keyOf(style));\n let t = pool?.pop();\n while (t && t.destroyed) t = pool?.pop();\n if (!t) {\n t = this.stage.add\n .label(x, y, text, this.options.fontFamily, style.size, style.color, this.stroke, this.strokeWidth(style.size), this.resolution, this.options.glyphs)\n .setOrigin(0.5, 1);\n // made on the world layer by the factory; moved under the game's own container when it named one\n if (this.options.parent) this.options.parent.addChild(t);\n } else {\n t.setText(text);\n t.position.set(x, y);\n t.alpha = 1;\n t.setScale(1);\n t.visible = true;\n }\n if (this.options.depth !== undefined) t.setDepth(this.options.depth);\n return t;\n }\n\n /** Hands a finished label back for reuse. */\n release(t: BitmapLabel, style: FloatingTextStyle): void {\n if (t.destroyed) return;\n const key = keyOf(style);\n let pool = this.pools.get(key);\n if (!pool) this.pools.set(key, (pool = []));\n if (pool.length >= this.keep) {\n t.destroy();\n return;\n }\n t.visible = false;\n pool.push(t);\n }\n\n /** A label that pops, rises, fades and goes back to the pool by itself, on the stage's own tweens. */\n float(x: number, y: number, text: string, style: FloatingTextStyle, options: FloatOptions = {}): BitmapLabel {\n const { rise = 16, driftX = 0, pop = 1.4, popMs = 120, holdMs = 350, fadeMs = 500 } = options;\n const t = this.take(x, y, text, style);\n const tweens = this.stage.tweens;\n if (pop !== 1) {\n t.setScale(pop);\n tweens.add({ targets: t, scale: 1, duration: popMs, ease: 'Back.Out' });\n }\n tweens.add({\n targets: t,\n x: x + driftX,\n y: y - rise,\n alpha: 0,\n delay: holdMs,\n duration: fadeMs,\n ease: 'Sine.In',\n onComplete: () => this.release(t, style),\n });\n return t;\n }\n\n /** Destroys every pooled label (a scene ending); labels still out are the scene's to free. */\n clear(): void {\n for (const pool of this.pools.values()) for (const t of pool) if (!t.destroyed) t.destroy();\n this.pools.clear();\n }\n}\n"],"names":["keyOf","s","FloatingText","stage","options","size","styles","delayMs","gapMs","todo","timer","next","style","installLabelFont","x","y","text","pool","t","key","rise","driftX","pop","popMs","holdMs","fadeMs","tweens"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
function o(n, r) {
|
|
2
|
+
const t = Math.min(140, 40 + Math.max(0, n) * 400);
|
|
3
|
+
return Math.round(t + (r ? 40 : 0));
|
|
4
|
+
}
|
|
5
|
+
function e(n, r, t) {
|
|
6
|
+
return n ? t ? 2 : 1 : Math.min(3, 2 + (r > 0.2 ? 1 : 0) + (t ? 1 : 0));
|
|
7
|
+
}
|
|
8
|
+
const i = 120;
|
|
9
|
+
function h(n, r) {
|
|
10
|
+
return r >= 1 || n <= 0 ? 0 : Math.round(n * (1 - r) * (1 - r));
|
|
11
|
+
}
|
|
12
|
+
const u = 400;
|
|
13
|
+
function M(n, r, t) {
|
|
14
|
+
return t ? 0 : n ? r ? 60 : 0 : r ? 140 : 70;
|
|
15
|
+
}
|
|
16
|
+
function a(n) {
|
|
17
|
+
return n ? u : 0;
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
u as HEAVY_FLASH_GAP_MS,
|
|
21
|
+
i as RECOIL_MS,
|
|
22
|
+
o as hitStopMs,
|
|
23
|
+
a as hurtFlashGapMs,
|
|
24
|
+
M as hurtFlashMs,
|
|
25
|
+
h as recoilAt,
|
|
26
|
+
e as recoilPx
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=hitStop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hitStop.js","sources":["../../src/fx/hitStop.ts"],"sourcesContent":["/*\n * How hard a landed blow feels. Pure, so the numbers\n * can be pinned: the freeze-frame grows with the share of the body's health the blow took, a crit holds longer, and the\n * body struck is knocked a pixel or three away from whoever struck it — less the bigger it is.\n */\n\n/** The freeze-frame of a blow (ms): 40 for a scratch, up to 140 for one that took a third of the body; a crit +40. */\nexport function hitStopMs(share: number, crit: boolean): number {\n const base = Math.min(140, 40 + Math.max(0, share) * 400);\n return Math.round(base + (crit ? 40 : 0));\n}\n\n/** How far the body struck recoils away from the blow (whole world px): a heavy body barely, a crit a pixel further. */\nexport function recoilPx(heavy: boolean, share: number, crit: boolean): number {\n if (heavy) return crit ? 2 : 1;\n return Math.min(3, 2 + (share > 0.2 ? 1 : 0) + (crit ? 1 : 0));\n}\n\n/** How long a recoil takes to settle back (ms). */\nexport const RECOIL_MS = 120;\n\n/** The recoil left at `t` (0 the blow, 1 settled): out at once, eased back, whole pixels only. */\nexport function recoilAt(px: number, t: number): number {\n if (t >= 1 || px <= 0) return 0;\n return Math.round(px * (1 - t) * (1 - t));\n}\n\n/** The least time between two white flashes on a heavy body (ms). */\nexport const HEAVY_FLASH_GAP_MS = 400;\n\n/**\n * How long the body struck flashes white (ms), 0 for none: 70, a crit of one's own 140 (the impact frame), nothing with\n * `reduce` (a \"reduce flashes\" setting). A heavy body (a boss, anything drawn large) flashes only for the local\n * player's own crit, 60 ms, `HEAVY_FLASH_GAP_MS` apart: a sheet covering most of the screen turning white on every\n * blow, beat and tick is a strobe. Sparks, numbers and the recoil still mark every blow.\n */\nexport function hurtFlashMs(heavy: boolean, impact: boolean, reduce: boolean): number {\n if (reduce) return 0;\n if (heavy) return impact ? 60 : 0;\n return impact ? 140 : 70;\n}\n\n/** The gap a body keeps between two flashes (ms). */\nexport function hurtFlashGapMs(heavy: boolean): number {\n return heavy ? HEAVY_FLASH_GAP_MS : 0;\n}\n"],"names":["hitStopMs","share","crit","base","recoilPx","heavy","RECOIL_MS","recoilAt","px","t","HEAVY_FLASH_GAP_MS","hurtFlashMs","impact","reduce","hurtFlashGapMs"],"mappings":"AAOO,SAASA,EAAUC,GAAeC,GAAuB;AAC9D,QAAMC,IAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAGF,CAAK,IAAI,GAAG;AACxD,SAAO,KAAK,MAAME,KAAQD,IAAO,KAAK,EAAE;AAC1C;AAGO,SAASE,EAASC,GAAgBJ,GAAeC,GAAuB;AAC7E,SAAIG,IAAcH,IAAO,IAAI,IACtB,KAAK,IAAI,GAAG,KAAKD,IAAQ,MAAM,IAAI,MAAMC,IAAO,IAAI,EAAE;AAC/D;AAGO,MAAMI,IAAY;AAGlB,SAASC,EAASC,GAAYC,GAAmB;AACtD,SAAIA,KAAK,KAAKD,KAAM,IAAU,IACvB,KAAK,MAAMA,KAAM,IAAIC,MAAM,IAAIA,EAAE;AAC1C;AAGO,MAAMC,IAAqB;AAQ3B,SAASC,EAAYN,GAAgBO,GAAiBC,GAAyB;AACpF,SAAIA,IAAe,IACfR,IAAcO,IAAS,KAAK,IACzBA,IAAS,MAAM;AACxB;AAGO,SAASE,EAAeT,GAAwB;AACrD,SAAOA,IAAQK,IAAqB;AACtC;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function u(o, e, n, t) {
|
|
2
|
+
const s = o.width, l = o.height;
|
|
3
|
+
if (!s || !l || !(o.zoom > 0)) return !0;
|
|
4
|
+
const r = o.scrollX ?? 0, h = o.scrollY ?? 0;
|
|
5
|
+
return e >= r - t && n >= h - t && e <= r + s / o.zoom + t && n <= h + l / o.zoom + t;
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
u as inView
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=viewCull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewCull.js","sources":["../../src/fx/viewCull.ts"],"sourcesContent":["/** What `inView` reads off the main camera (Camera's own fields; a fake stage may lack them). */\nexport interface CameraLike {\n zoom: number;\n scrollX?: number;\n scrollY?: number;\n width?: number;\n height?: number;\n}\n\n/**\n * Whether the world point (x, y) lies within `margin` world pixels of the screen. Effects use it to skip painting what\n * nobody can see. A camera that has no size yet (a tool's fake stage, before the first resize) counts everything in.\n */\nexport function inView(cam: CameraLike, x: number, y: number, margin: number): boolean {\n const w = cam.width;\n const h = cam.height;\n if (!w || !h || !(cam.zoom > 0)) return true;\n const left = cam.scrollX ?? 0;\n const top = cam.scrollY ?? 0;\n return x >= left - margin && y >= top - margin && x <= left + w / cam.zoom + margin && y <= top + h / cam.zoom + margin;\n}\n"],"names":["inView","cam","x","y","margin","w","h","left","top"],"mappings":"AAaO,SAASA,EAAOC,GAAiBC,GAAWC,GAAWC,GAAyB;AACrF,QAAMC,IAAIJ,EAAI,OACRK,IAAIL,EAAI;AACd,MAAI,CAACI,KAAK,CAACC,KAAK,EAAEL,EAAI,OAAO,GAAI,QAAO;AACxC,QAAMM,IAAON,EAAI,WAAW,GACtBO,IAAMP,EAAI,WAAW;AAC3B,SAAOC,KAAKK,IAAOH,KAAUD,KAAKK,IAAMJ,KAAUF,KAAKK,IAAOF,IAAIJ,EAAI,OAAOG,KAAUD,KAAKK,IAAMF,IAAIL,EAAI,OAAOG;AACnH;"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { sourceText as n, formatMessage as o } from "./formatMessage.js";
|
|
2
|
+
class c {
|
|
3
|
+
source;
|
|
4
|
+
lang;
|
|
5
|
+
catalogs = /* @__PURE__ */ new Map();
|
|
6
|
+
listeners = /* @__PURE__ */ new Set();
|
|
7
|
+
rules = /* @__PURE__ */ new Map();
|
|
8
|
+
reported = /* @__PURE__ */ new Set();
|
|
9
|
+
onMissing;
|
|
10
|
+
constructor(t = {}) {
|
|
11
|
+
this.source = t.source ?? "en", this.lang = t.language ?? this.source, this.onMissing = t.onMissing;
|
|
12
|
+
}
|
|
13
|
+
get language() {
|
|
14
|
+
return this.lang;
|
|
15
|
+
}
|
|
16
|
+
/** Languages with a catalog, plus the source. */
|
|
17
|
+
get languages() {
|
|
18
|
+
return [.../* @__PURE__ */ new Set([this.source, ...this.catalogs.keys()])];
|
|
19
|
+
}
|
|
20
|
+
/** Adds (or merges into) a language's catalog; subscribers hear of it when it is the language shown. */
|
|
21
|
+
addCatalog(t, e) {
|
|
22
|
+
const s = this.catalogs.get(t);
|
|
23
|
+
this.catalogs.set(t, s ? { ...s, ...e } : e), t === this.lang && this.notify();
|
|
24
|
+
}
|
|
25
|
+
setLanguage(t) {
|
|
26
|
+
t !== this.lang && (this.lang = t, this.notify());
|
|
27
|
+
}
|
|
28
|
+
/** Calls `fn` with the language after every switch; the returned function stops it. */
|
|
29
|
+
subscribe(t) {
|
|
30
|
+
return this.listeners.add(t), () => this.listeners.delete(t);
|
|
31
|
+
}
|
|
32
|
+
/** Whether the current language has its own line for `key`. */
|
|
33
|
+
has(t) {
|
|
34
|
+
return this.catalogs.get(this.lang)?.[t] !== void 0;
|
|
35
|
+
}
|
|
36
|
+
tr = (t, ...e) => {
|
|
37
|
+
const s = this.lookup(t);
|
|
38
|
+
let i;
|
|
39
|
+
return s === void 0 ? i = n(t) : typeof s == "string" ? i = s : i = s.other ?? n(t), o(i, e);
|
|
40
|
+
};
|
|
41
|
+
trn = (t, e, s, ...i) => {
|
|
42
|
+
const r = this.lookup(e), a = [s, ...i];
|
|
43
|
+
if (r === void 0) return o(n(this.category(this.source, s) === "one" ? t : e), a);
|
|
44
|
+
if (typeof r == "string") return o(r, a);
|
|
45
|
+
const l = r[this.category(this.lang, s)] ?? r.other ?? n(e);
|
|
46
|
+
return o(l, a);
|
|
47
|
+
};
|
|
48
|
+
lookup(t) {
|
|
49
|
+
const e = this.catalogs.get(this.lang)?.[t];
|
|
50
|
+
if (e === void 0 && this.lang !== this.source && this.onMissing) {
|
|
51
|
+
const s = `${this.lang}\0${t}`;
|
|
52
|
+
this.reported.has(s) || (this.reported.add(s), this.onMissing(t, this.lang));
|
|
53
|
+
}
|
|
54
|
+
return e;
|
|
55
|
+
}
|
|
56
|
+
category(t, e) {
|
|
57
|
+
let s = this.rules.get(t);
|
|
58
|
+
return s || (s = new Intl.PluralRules(t), this.rules.set(t, s)), s.select(e);
|
|
59
|
+
}
|
|
60
|
+
notify() {
|
|
61
|
+
for (const t of [...this.listeners])
|
|
62
|
+
try {
|
|
63
|
+
t(this.lang);
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.error("[i18n] a language listener failed", e);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
c as Translator
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=Translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Translator.js","sources":["../../src/i18n/Translator.ts"],"sourcesContent":["import { formatMessage, sourceText } from './formatMessage';\n\n/** A translation that changes with a count, by the plural categories of the language (`one`, `few`, `many`, `other`…). */\nexport type PluralForms = Partial<Record<Intl.LDMLPluralRule, string>>;\n\n/** A language's translations, keyed by the English source (with its `|context`, if any). */\nexport type Catalog = Readonly<Record<string, string | PluralForms>>;\n\nexport interface TranslatorOptions {\n /** The language strings are written in (default 'en'): shown as written, never reported missing. */\n source?: string;\n /** The language to start in (default the source). */\n language?: string;\n /** Told once per key and language of every string with no translation, for tooling or a log. */\n onMissing?: (key: string, language: string) => void;\n}\n\n/**\n * Translation with the English source as the key: `tr('Open the gate')` shows the English until a catalog for the\n * current language has a line for it, so writing a new string never breaks the game, it only shows untranslated.\n *\n * - Placeholders are positional: `tr('{0} joined', name)`.\n * - The same English with two meanings gets a context after `|`: `tr('Close|window')`, `tr('Close|near')`. The\n * context is a separate key for translators and never shown.\n * - Counts: `trn('{0} coin', '{0} coins', n)` picks a form by `Intl.PluralRules`; the key is the plural form, and\n * a catalog may give every category its language has (`{ one, few, many, other }`). `{0}` is the count.\n * - `setLanguage` switches at once and tells subscribers, so a UI re-renders instead of reloading: read labels when\n * they are shown, never once at import.\n *\n * `tr` and `trn` are bound, so they can be handed around (`const { tr } = translator`).\n */\nexport class Translator {\n readonly source: string;\n private lang: string;\n private readonly catalogs = new Map<string, Catalog>();\n private readonly listeners = new Set<(language: string) => void>();\n private readonly rules = new Map<string, Intl.PluralRules>();\n private readonly reported = new Set<string>();\n private readonly onMissing: ((key: string, language: string) => void) | undefined;\n\n constructor(options: TranslatorOptions = {}) {\n this.source = options.source ?? 'en';\n this.lang = options.language ?? this.source;\n this.onMissing = options.onMissing;\n }\n\n get language(): string {\n return this.lang;\n }\n\n /** Languages with a catalog, plus the source. */\n get languages(): string[] {\n return [...new Set([this.source, ...this.catalogs.keys()])];\n }\n\n /** Adds (or merges into) a language's catalog; subscribers hear of it when it is the language shown. */\n addCatalog(language: string, catalog: Catalog): void {\n const had = this.catalogs.get(language);\n this.catalogs.set(language, had ? { ...had, ...catalog } : catalog);\n if (language === this.lang) this.notify();\n }\n\n setLanguage(language: string): void {\n if (language === this.lang) return;\n this.lang = language;\n this.notify();\n }\n\n /** Calls `fn` with the language after every switch; the returned function stops it. */\n subscribe(fn: (language: string) => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n /** Whether the current language has its own line for `key`. */\n has(key: string): boolean {\n return this.catalogs.get(this.lang)?.[key] !== undefined;\n }\n\n readonly tr = (key: string, ...args: unknown[]): string => {\n const entry = this.lookup(key);\n let text: string;\n if (entry === undefined) text = sourceText(key);\n else if (typeof entry === 'string') text = entry;\n else text = entry.other ?? sourceText(key);\n return formatMessage(text, args);\n };\n\n readonly trn = (one: string, other: string, count: number, ...args: unknown[]): string => {\n const entry = this.lookup(other);\n const all = [count, ...args];\n if (entry === undefined) return formatMessage(sourceText(this.category(this.source, count) === 'one' ? one : other), all);\n if (typeof entry === 'string') return formatMessage(entry, all);\n const text = entry[this.category(this.lang, count)] ?? entry.other ?? sourceText(other);\n return formatMessage(text, all);\n };\n\n private lookup(key: string): string | PluralForms | undefined {\n const entry = this.catalogs.get(this.lang)?.[key];\n if (entry === undefined && this.lang !== this.source && this.onMissing) {\n const id = `${this.lang}\\u0000${key}`;\n if (!this.reported.has(id)) {\n this.reported.add(id);\n this.onMissing(key, this.lang);\n }\n }\n return entry;\n }\n\n private category(language: string, count: number): Intl.LDMLPluralRule {\n let r = this.rules.get(language);\n if (!r) {\n r = new Intl.PluralRules(language);\n this.rules.set(language, r);\n }\n return r.select(count);\n }\n\n private notify(): void {\n for (const fn of [...this.listeners]) {\n try {\n fn(this.lang);\n } catch (err) {\n console.error('[i18n] a language listener failed', err);\n }\n }\n }\n}\n"],"names":["Translator","options","language","catalog","had","fn","key","args","entry","text","sourceText","formatMessage","one","other","count","all","id","r","err"],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function v(n, i = {}) {
|
|
2
|
+
const f = i.single ?? ["tr"], u = i.plural ?? ["trn"], o = [...f, ...u].map((l) => l.replace(/[$.*+?^()[\]{}|\\]/g, "\\$&"));
|
|
3
|
+
if (o.length === 0) return [];
|
|
4
|
+
const e = new RegExp(`(?<![\\w$])(${o.join("|")})\\s*\\(`, "g"), c = [];
|
|
5
|
+
let r = 1, t = 0;
|
|
6
|
+
for (const l of n.matchAll(e)) {
|
|
7
|
+
const s = l[1], a = h(n, l.index + l[0].length);
|
|
8
|
+
if (!a) continue;
|
|
9
|
+
for (; t < l.index; t++) n.charCodeAt(t) === 10 && r++;
|
|
10
|
+
if (!u.includes(s)) {
|
|
11
|
+
c.push({ key: a.value, fn: s, line: r });
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
let d = p(n, a.end);
|
|
15
|
+
if (n[d] !== ",") continue;
|
|
16
|
+
const g = h(n, d + 1);
|
|
17
|
+
g && c.push({ key: g.value, one: a.value, fn: s, line: r });
|
|
18
|
+
}
|
|
19
|
+
return c;
|
|
20
|
+
}
|
|
21
|
+
function p(n, i) {
|
|
22
|
+
for (; i < n.length && /\s/.test(n[i]); ) i++;
|
|
23
|
+
return i;
|
|
24
|
+
}
|
|
25
|
+
const m = { n: `
|
|
26
|
+
`, t: " ", r: "\r", b: "\b", f: "\f", v: "\v", 0: "\0" };
|
|
27
|
+
function h(n, i) {
|
|
28
|
+
const f = p(n, i), u = n[f];
|
|
29
|
+
if (u !== "'" && u !== '"' && u !== "`") return null;
|
|
30
|
+
let o = "";
|
|
31
|
+
for (let e = f + 1; e < n.length; e++) {
|
|
32
|
+
const c = n[e];
|
|
33
|
+
if (c === u) return { value: o, end: e + 1 };
|
|
34
|
+
if (u !== "`" && c === `
|
|
35
|
+
` || u === "`" && c === "$" && n[e + 1] === "{") return null;
|
|
36
|
+
if (c !== "\\") {
|
|
37
|
+
o += c;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const r = n[++e];
|
|
41
|
+
if (r === void 0) return null;
|
|
42
|
+
if (r !== `
|
|
43
|
+
`) {
|
|
44
|
+
if (r === "u" || r === "x") {
|
|
45
|
+
const t = r === "u" && n[e + 1] === "{", l = t ? n.slice(e + 2, n.indexOf("}", e)) : n.slice(e + 1, e + (r === "u" ? 5 : 3)), s = Number.parseInt(l, 16);
|
|
46
|
+
if (Number.isNaN(s)) return null;
|
|
47
|
+
o += String.fromCodePoint(s), e += t ? l.length + 2 : l.length;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
o += m[r] ?? r;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
v as extractStrings
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=extractStrings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractStrings.js","sources":["../../src/i18n/extractStrings.ts"],"sourcesContent":["/** One translatable string found in source text. */\nexport interface ExtractedString {\n /** The catalog key: the string as written, `|context` included. */\n key: string;\n /** For a plural call, the singular form written beside the key. */\n one?: string;\n /** The function it was passed to. */\n fn: string;\n /** 1-based line of the call. */\n line: number;\n}\n\nexport interface ExtractOptions {\n /** Functions whose first argument is a key (default `['tr']`). */\n single?: readonly string[];\n /** Functions called `(one, other, count…)`, keyed by `other` (default `['trn']`). */\n plural?: readonly string[];\n}\n\n/**\n * Finds the strings passed to `tr('…')` (and `trn('…', '…', n)`) in a file's text, for a tool that lists keys\n * missing from a catalog or drops unused ones. A plain scanner, not a parser: it reads a string literal straight\n * after the call's parenthesis (quotes of any kind, escapes decoded) and skips a template literal with `${…}` in it\n * or a call whose key is not a literal, since neither can be a catalog key. A call inside a comment is still found.\n */\nexport function extractStrings(text: string, options: ExtractOptions = {}): ExtractedString[] {\n const single = options.single ?? ['tr'];\n const plural = options.plural ?? ['trn'];\n const names = [...single, ...plural].map((n) => n.replace(/[$.*+?^()[\\]{}|\\\\]/g, '\\\\$&'));\n if (names.length === 0) return [];\n const call = new RegExp(`(?<![\\\\w$])(${names.join('|')})\\\\s*\\\\(`, 'g');\n const out: ExtractedString[] = [];\n let line = 1;\n let scanned = 0;\n for (const m of text.matchAll(call)) {\n const fn = m[1]!;\n const first = readString(text, m.index + m[0].length);\n if (!first) continue;\n for (; scanned < m.index; scanned++) if (text.charCodeAt(scanned) === 10) line++;\n if (!plural.includes(fn)) {\n out.push({ key: first.value, fn, line });\n continue;\n }\n let i = skipSpace(text, first.end);\n if (text[i] !== ',') continue;\n const second = readString(text, i + 1);\n if (second) out.push({ key: second.value, one: first.value, fn, line });\n }\n return out;\n}\n\nfunction skipSpace(text: string, i: number): number {\n while (i < text.length && /\\s/.test(text[i]!)) i++;\n return i;\n}\n\nconst ESCAPES: Record<string, string> = { n: '\\n', t: '\\t', r: '\\r', b: '\\b', f: '\\f', v: '\\v', '0': '\\0' };\n\n/** The string literal starting at `from` (after spaces), decoded, and the index after its closing quote. */\nfunction readString(text: string, from: number): { value: string; end: number } | null {\n const start = skipSpace(text, from);\n const quote = text[start];\n if (quote !== \"'\" && quote !== '\"' && quote !== '`') return null;\n let value = '';\n for (let i = start + 1; i < text.length; i++) {\n const c = text[i]!;\n if (c === quote) return { value, end: i + 1 };\n if (quote !== '`' && c === '\\n') return null;\n if (quote === '`' && c === '$' && text[i + 1] === '{') return null;\n if (c !== '\\\\') {\n value += c;\n continue;\n }\n const e = text[++i];\n if (e === undefined) return null;\n if (e === '\\n') continue; // a line continuation\n if (e === 'u' || e === 'x') {\n const braced = e === 'u' && text[i + 1] === '{';\n const hex = braced ? text.slice(i + 2, text.indexOf('}', i)) : text.slice(i + 1, i + (e === 'u' ? 5 : 3));\n const code = Number.parseInt(hex, 16);\n if (Number.isNaN(code)) return null;\n value += String.fromCodePoint(code);\n i += braced ? hex.length + 2 : hex.length;\n continue;\n }\n value += ESCAPES[e] ?? e;\n }\n return null;\n}\n"],"names":["extractStrings","text","options","single","plural","names","n","call","out","line","scanned","m","fn","first","readString","i","skipSpace","second","ESCAPES","from","start","quote","value","e","braced","hex","code"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const u = "|";
|
|
2
|
+
function f(n) {
|
|
3
|
+
const r = n.lastIndexOf("|");
|
|
4
|
+
return r < 0 ? n : n.slice(0, r);
|
|
5
|
+
}
|
|
6
|
+
function c(n, r) {
|
|
7
|
+
return n.indexOf("{") < 0 && n.indexOf("}") < 0 ? n : n.replace(/\{\{|\}\}|\{(\d+)\}/g, (e, t) => {
|
|
8
|
+
if (e === "{{") return "{";
|
|
9
|
+
if (e === "}}") return "}";
|
|
10
|
+
const i = Number(t);
|
|
11
|
+
return i < r.length ? String(r[i]) : e;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
u as CONTEXT_MARK,
|
|
16
|
+
c as formatMessage,
|
|
17
|
+
f as sourceText
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=formatMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatMessage.js","sources":["../../src/i18n/formatMessage.ts"],"sourcesContent":["/** The separator between a source string and its context: `'Open|door'` and `'Open|file'` are two keys. */\nexport const CONTEXT_MARK = '|';\n\n/** The text a key shows untranslated: the source without its `|context`. */\nexport function sourceText(key: string): string {\n const i = key.lastIndexOf(CONTEXT_MARK);\n return i < 0 ? key : key.slice(0, i);\n}\n\n/**\n * Fills `{0}`, `{1}`… with `args`. A placeholder with no argument is left as written, so a missing argument shows\n * where it is instead of printing \"undefined\". `{{` and `}}` print a literal brace.\n */\nexport function formatMessage(text: string, args: readonly unknown[]): string {\n if (text.indexOf('{') < 0 && text.indexOf('}') < 0) return text;\n return text.replace(/\\{\\{|\\}\\}|\\{(\\d+)\\}/g, (m, index: string | undefined) => {\n if (m === '{{') return '{';\n if (m === '}}') return '}';\n const i = Number(index);\n return i < args.length ? String(args[i]) : m;\n });\n}\n"],"names":["CONTEXT_MARK","sourceText","key","i","formatMessage","text","args","m","index"],"mappings":"AACO,MAAMA,IAAe;AAGrB,SAASC,EAAWC,GAAqB;AAC9C,QAAMC,IAAID,EAAI,YAAY,GAAY;AACtC,SAAOC,IAAI,IAAID,IAAMA,EAAI,MAAM,GAAGC,CAAC;AACrC;AAMO,SAASC,EAAcC,GAAcC,GAAkC;AAC5E,SAAID,EAAK,QAAQ,GAAG,IAAI,KAAKA,EAAK,QAAQ,GAAG,IAAI,IAAUA,IACpDA,EAAK,QAAQ,wBAAwB,CAACE,GAAGC,MAA8B;AAC5E,QAAID,MAAM,KAAM,QAAO;AACvB,QAAIA,MAAM,KAAM,QAAO;AACvB,UAAM,IAAI,OAAOC,CAAK;AACtB,WAAO,IAAIF,EAAK,SAAS,OAAOA,EAAK,CAAC,CAAC,IAAIC;AAAA,EAC7C,CAAC;AACH;"}
|