rn-gamekit 0.1.0 → 0.2.1
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 +75 -0
- package/README.md +97 -16
- package/lib/module/assets/defineAssets.js +28 -3
- package/lib/module/assets/defineAssets.js.map +1 -1
- package/lib/module/assets.js +11 -0
- package/lib/module/assets.js.map +1 -0
- package/lib/module/audio/createGameAudio.js +784 -0
- package/lib/module/audio/createGameAudio.js.map +1 -0
- package/lib/module/audio/errors.js +12 -0
- package/lib/module/audio/errors.js.map +1 -0
- package/lib/module/audio/index.js +5 -0
- package/lib/module/audio/index.js.map +1 -0
- package/lib/module/audio/resolver.js +37 -0
- package/lib/module/audio/resolver.js.map +1 -0
- package/lib/module/audio/types.js +4 -0
- package/lib/module/audio/types.js.map +1 -0
- package/lib/module/audio.js +9 -0
- package/lib/module/audio.js.map +1 -0
- package/lib/module/camera2d/bounds.js +59 -0
- package/lib/module/camera2d/bounds.js.map +1 -0
- package/lib/module/camera2d/extents.js +25 -0
- package/lib/module/camera2d/extents.js.map +1 -0
- package/lib/module/camera2d/follow.js +138 -0
- package/lib/module/camera2d/follow.js.map +1 -0
- package/lib/module/camera2d/index.js +20 -0
- package/lib/module/camera2d/index.js.map +1 -0
- package/lib/module/camera2d/interpolation.js +98 -0
- package/lib/module/camera2d/interpolation.js.map +1 -0
- package/lib/module/camera2d/shake.js +85 -0
- package/lib/module/camera2d/shake.js.map +1 -0
- package/lib/module/camera2d/transform.js +151 -0
- package/lib/module/camera2d/transform.js.map +1 -0
- package/lib/module/camera2d/types.js +4 -0
- package/lib/module/camera2d/types.js.map +1 -0
- package/lib/module/camera2d/validation.js +98 -0
- package/lib/module/camera2d/validation.js.map +1 -0
- package/lib/module/camera2d/visibility.js +138 -0
- package/lib/module/camera2d/visibility.js.map +1 -0
- package/lib/module/camera2d.js +9 -0
- package/lib/module/camera2d.js.map +1 -0
- package/lib/module/collision2d/colliders.js +266 -0
- package/lib/module/collision2d/colliders.js.map +1 -0
- package/lib/module/collision2d/debug.js +105 -0
- package/lib/module/collision2d/debug.js.map +1 -0
- package/lib/module/collision2d/filters.js +40 -0
- package/lib/module/collision2d/filters.js.map +1 -0
- package/lib/module/collision2d/index.js +12 -0
- package/lib/module/collision2d/index.js.map +1 -0
- package/lib/module/collision2d/intersections.js +67 -0
- package/lib/module/collision2d/intersections.js.map +1 -0
- package/lib/module/collision2d/manifolds.js +218 -0
- package/lib/module/collision2d/manifolds.js.map +1 -0
- package/lib/module/collision2d/segments.js +187 -0
- package/lib/module/collision2d/segments.js.map +1 -0
- package/lib/module/collision2d/spatialHash.js +167 -0
- package/lib/module/collision2d/spatialHash.js.map +1 -0
- package/lib/module/collision2d/sweeps.js +255 -0
- package/lib/module/collision2d/sweeps.js.map +1 -0
- package/lib/module/collision2d.js +9 -0
- package/lib/module/collision2d.js.map +1 -0
- package/lib/module/core/input/buttonPad.js +214 -0
- package/lib/module/core/input/buttonPad.js.map +1 -0
- package/lib/module/core/input/createInputBuffer.js +66 -14
- package/lib/module/core/input/createInputBuffer.js.map +1 -1
- package/lib/module/core/session/createGameSession.js +454 -50
- package/lib/module/core/session/createGameSession.js.map +1 -1
- package/lib/module/core/session/deepFreeze.js +92 -2
- package/lib/module/core/session/deepFreeze.js.map +1 -1
- package/lib/module/core/session/types.js +12 -0
- package/lib/module/core/session/types.js.map +1 -1
- package/lib/module/definition/defineGame.js +23 -0
- package/lib/module/definition/defineGame.js.map +1 -1
- package/lib/module/events/defineGameEvents.js +46 -0
- package/lib/module/events/defineGameEvents.js.map +1 -0
- package/lib/module/events/errors.js +16 -0
- package/lib/module/events/errors.js.map +1 -0
- package/lib/module/events/index.js +7 -0
- package/lib/module/events/index.js.map +1 -0
- package/lib/module/events/payload.js +219 -0
- package/lib/module/events/payload.js.map +1 -0
- package/lib/module/events/seed.js +33 -0
- package/lib/module/events/seed.js.map +1 -0
- package/lib/module/events/types.js +4 -0
- package/lib/module/events/types.js.map +1 -0
- package/lib/module/events.js +13 -0
- package/lib/module/events.js.map +1 -0
- package/lib/module/geometry/helpers.js +140 -0
- package/lib/module/geometry/helpers.js.map +1 -0
- package/lib/module/geometry/index.js +5 -0
- package/lib/module/geometry/index.js.map +1 -0
- package/lib/module/geometry/validation.js +104 -0
- package/lib/module/geometry/validation.js.map +1 -0
- package/lib/module/geometry.js +9 -0
- package/lib/module/geometry.js.map +1 -0
- package/lib/module/haptics/createGameHaptics.js +214 -0
- package/lib/module/haptics/createGameHaptics.js.map +1 -0
- package/lib/module/haptics/errors.js +12 -0
- package/lib/module/haptics/errors.js.map +1 -0
- package/lib/module/haptics/index.js +5 -0
- package/lib/module/haptics/index.js.map +1 -0
- package/lib/module/haptics/resolver.js +37 -0
- package/lib/module/haptics/resolver.js.map +1 -0
- package/lib/module/haptics/types.js +4 -0
- package/lib/module/haptics/types.js.map +1 -0
- package/lib/module/haptics.js +9 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/index.js +8 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/particles/createParticleSystem.js +481 -0
- package/lib/module/particles/createParticleSystem.js.map +1 -0
- package/lib/module/particles/defineParticleEffect.js +178 -0
- package/lib/module/particles/defineParticleEffect.js.map +1 -0
- package/lib/module/particles/errors.js +9 -0
- package/lib/module/particles/errors.js.map +1 -0
- package/lib/module/particles/index.js +8 -0
- package/lib/module/particles/index.js.map +1 -0
- package/lib/module/particles/sampling.js +121 -0
- package/lib/module/particles/sampling.js.map +1 -0
- package/lib/module/particles/types.js +4 -0
- package/lib/module/particles/types.js.map +1 -0
- package/lib/module/particles.js +4 -0
- package/lib/module/particles.js.map +1 -0
- package/lib/module/react/GameButtonPad.js +344 -0
- package/lib/module/react/GameButtonPad.js.map +1 -0
- package/lib/module/react/GamePointerInput.js +74 -16
- package/lib/module/react/GamePointerInput.js.map +1 -1
- package/lib/module/react/GameView.js +139 -60
- package/lib/module/react/GameView.js.map +1 -1
- package/lib/module/react/assets/createGameAssetStore.js +145 -95
- package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
- package/lib/module/react/assets/useGameAssets.js +60 -35
- package/lib/module/react/assets/useGameAssets.js.map +1 -1
- package/lib/module/react/bindAppLifecycle.js +46 -17
- package/lib/module/react/bindAppLifecycle.js.map +1 -1
- package/lib/module/react/bindGameSession.js +13 -2
- package/lib/module/react/bindGameSession.js.map +1 -1
- package/lib/module/react/camera2d/GameLayer2D.js +50 -0
- package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
- package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
- package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
- package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
- package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
- package/lib/module/react/cleanupList.js +38 -0
- package/lib/module/react/cleanupList.js.map +1 -0
- package/lib/module/react/lifecycleSource.js +49 -0
- package/lib/module/react/lifecycleSource.js.map +1 -0
- package/lib/module/react/particles/ParticleView.js +308 -0
- package/lib/module/react/particles/ParticleView.js.map +1 -0
- package/lib/module/react/particles/culling.js +115 -0
- package/lib/module/react/particles/culling.js.map +1 -0
- package/lib/module/react/particles/index.js +7 -0
- package/lib/module/react/particles/index.js.map +1 -0
- package/lib/module/react/particles/spriteXForm.js +45 -0
- package/lib/module/react/particles/spriteXForm.js.map +1 -0
- package/lib/module/react/particles/useParticlePresentation.js +204 -0
- package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
- package/lib/module/react/pointerBinding.js +55 -17
- package/lib/module/react/pointerBinding.js.map +1 -1
- package/lib/module/react/pointerCamera.js +28 -0
- package/lib/module/react/pointerCamera.js.map +1 -0
- package/lib/module/react/pointerCoalescer.js +16 -9
- package/lib/module/react/pointerCoalescer.js.map +1 -1
- package/lib/module/react/sprites/GameSprite.js +5 -17
- package/lib/module/react/sprites/GameSprite.js.map +1 -1
- package/lib/module/react/sprites/GameWorld2D.js +112 -9
- package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
- package/lib/module/react/sprites/Sprite.js +48 -63
- package/lib/module/react/sprites/Sprite.js.map +1 -1
- package/lib/module/react/sprites/SpriteBatch.js +53 -28
- package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
- package/lib/module/react/sprites/batchVisibility.js +58 -0
- package/lib/module/react/sprites/batchVisibility.js.map +1 -0
- package/lib/module/react/sprites/spriteSelection.js +103 -0
- package/lib/module/react/sprites/spriteSelection.js.map +1 -0
- package/lib/module/react/sprites/spriteTransform.js +46 -25
- package/lib/module/react/sprites/spriteTransform.js.map +1 -1
- package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
- package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
- package/lib/module/react/tilemap/tilePresentation.js +374 -0
- package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
- package/lib/module/react/useGameSession.js +70 -0
- package/lib/module/react/useGameSession.js.map +1 -0
- package/lib/module/react/useGameSessionStatus.js +46 -0
- package/lib/module/react/useGameSessionStatus.js.map +1 -0
- package/lib/module/react/viewportBinding.js +5 -1
- package/lib/module/react/viewportBinding.js.map +1 -1
- package/lib/module/react.js +12 -1
- package/lib/module/react.js.map +1 -1
- package/lib/module/scene/defineScene.js +17 -0
- package/lib/module/scene/defineScene.js.map +1 -1
- package/lib/module/sprites/sampleSpriteClip.js +66 -6
- package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
- package/lib/module/sprites/spriteAnimationState.js +10 -20
- package/lib/module/sprites/spriteAnimationState.js.map +1 -1
- package/lib/module/sprites.js +11 -0
- package/lib/module/sprites.js.map +1 -0
- package/lib/module/storage/adapters/asyncStorage.js +57 -0
- package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
- package/lib/module/storage/adapters/memory.js +50 -0
- package/lib/module/storage/adapters/memory.js.map +1 -0
- package/lib/module/storage/errors.js +34 -0
- package/lib/module/storage/errors.js.map +1 -0
- package/lib/module/storage/index.js +11 -0
- package/lib/module/storage/index.js.map +1 -0
- package/lib/module/storage/schema.js +151 -0
- package/lib/module/storage/schema.js.map +1 -0
- package/lib/module/storage/serialization.js +249 -0
- package/lib/module/storage/serialization.js.map +1 -0
- package/lib/module/storage/store.js +387 -0
- package/lib/module/storage/store.js.map +1 -0
- package/lib/module/storage/types.js +16 -0
- package/lib/module/storage/types.js.map +1 -0
- package/lib/module/storage/validation.js +111 -0
- package/lib/module/storage/validation.js.map +1 -0
- package/lib/module/storage.js +4 -0
- package/lib/module/storage.js.map +1 -0
- package/lib/module/testing.js +4 -0
- package/lib/module/testing.js.map +1 -1
- package/lib/module/tilemap/chunkStats.js +27 -0
- package/lib/module/tilemap/chunkStats.js.map +1 -0
- package/lib/module/tilemap/definitions.js +308 -0
- package/lib/module/tilemap/definitions.js.map +1 -0
- package/lib/module/tilemap/errors.js +13 -0
- package/lib/module/tilemap/errors.js.map +1 -0
- package/lib/module/tilemap/index.js +10 -0
- package/lib/module/tilemap/index.js.map +1 -0
- package/lib/module/tilemap/movement.js +379 -0
- package/lib/module/tilemap/movement.js.map +1 -0
- package/lib/module/tilemap/queries.js +114 -0
- package/lib/module/tilemap/queries.js.map +1 -0
- package/lib/module/tilemap/tiledAdapter.js +141 -0
- package/lib/module/tilemap/tiledAdapter.js.map +1 -0
- package/lib/module/tilemap/types.js +4 -0
- package/lib/module/tilemap/types.js.map +1 -0
- package/lib/module/tilemap.js +4 -0
- package/lib/module/tilemap.js.map +1 -0
- package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
- package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
- package/lib/typescript/src/assets.d.ts +11 -0
- package/lib/typescript/src/assets.d.ts.map +1 -0
- package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
- package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
- package/lib/typescript/src/audio/errors.d.ts +6 -0
- package/lib/typescript/src/audio/errors.d.ts.map +1 -0
- package/lib/typescript/src/audio/index.d.ts +4 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -0
- package/lib/typescript/src/audio/resolver.d.ts +44 -0
- package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
- package/lib/typescript/src/audio/types.d.ts +42 -0
- package/lib/typescript/src/audio/types.d.ts.map +1 -0
- package/lib/typescript/src/audio.d.ts +8 -0
- package/lib/typescript/src/audio.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
- package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/extents.d.ts +17 -0
- package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/follow.d.ts +24 -0
- package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/index.d.ts +19 -0
- package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
- package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/shake.d.ts +20 -0
- package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/transform.d.ts +44 -0
- package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/types.d.ts +74 -0
- package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/validation.d.ts +30 -0
- package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
- package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
- package/lib/typescript/src/camera2d.d.ts +7 -0
- package/lib/typescript/src/camera2d.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
- package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/debug.d.ts +67 -0
- package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/filters.d.ts +28 -0
- package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/index.d.ts +17 -0
- package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
- package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
- package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/segments.d.ts +24 -0
- package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
- package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
- package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
- package/lib/typescript/src/collision2d.d.ts +7 -0
- package/lib/typescript/src/collision2d.d.ts.map +1 -0
- package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
- package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
- package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
- package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
- package/lib/typescript/src/core/input/types.d.ts +7 -0
- package/lib/typescript/src/core/input/types.d.ts.map +1 -1
- package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
- package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
- package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
- package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
- package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
- package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
- package/lib/typescript/src/core/session/types.d.ts +69 -4
- package/lib/typescript/src/core/session/types.d.ts.map +1 -1
- package/lib/typescript/src/definition/defineGame.d.ts +12 -1
- package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
- package/lib/typescript/src/definition/types.d.ts +10 -1
- package/lib/typescript/src/definition/types.d.ts.map +1 -1
- package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
- package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
- package/lib/typescript/src/events/errors.d.ts +12 -0
- package/lib/typescript/src/events/errors.d.ts.map +1 -0
- package/lib/typescript/src/events/index.d.ts +6 -0
- package/lib/typescript/src/events/index.d.ts.map +1 -0
- package/lib/typescript/src/events/payload.d.ts +21 -0
- package/lib/typescript/src/events/payload.d.ts.map +1 -0
- package/lib/typescript/src/events/seed.d.ts +3 -0
- package/lib/typescript/src/events/seed.d.ts.map +1 -0
- package/lib/typescript/src/events/types.d.ts +42 -0
- package/lib/typescript/src/events/types.d.ts.map +1 -0
- package/lib/typescript/src/events.d.ts +12 -0
- package/lib/typescript/src/events.d.ts.map +1 -0
- package/lib/typescript/src/geometry/helpers.d.ts +35 -0
- package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
- package/lib/typescript/src/geometry/index.d.ts +4 -0
- package/lib/typescript/src/geometry/index.d.ts.map +1 -0
- package/lib/typescript/src/geometry/types.d.ts +49 -0
- package/lib/typescript/src/geometry/types.d.ts.map +1 -1
- package/lib/typescript/src/geometry/validation.d.ts +44 -0
- package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
- package/lib/typescript/src/geometry.d.ts +7 -0
- package/lib/typescript/src/geometry.d.ts.map +1 -0
- package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
- package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
- package/lib/typescript/src/haptics/errors.d.ts +6 -0
- package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
- package/lib/typescript/src/haptics/index.d.ts +4 -0
- package/lib/typescript/src/haptics/index.d.ts.map +1 -0
- package/lib/typescript/src/haptics/resolver.d.ts +22 -0
- package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
- package/lib/typescript/src/haptics/types.d.ts +37 -0
- package/lib/typescript/src/haptics/types.d.ts.map +1 -0
- package/lib/typescript/src/haptics.d.ts +8 -0
- package/lib/typescript/src/haptics.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +10 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
- package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
- package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
- package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
- package/lib/typescript/src/particles/errors.d.ts +5 -0
- package/lib/typescript/src/particles/errors.d.ts.map +1 -0
- package/lib/typescript/src/particles/index.d.ts +6 -0
- package/lib/typescript/src/particles/index.d.ts.map +1 -0
- package/lib/typescript/src/particles/sampling.d.ts +54 -0
- package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
- package/lib/typescript/src/particles/types.d.ts +292 -0
- package/lib/typescript/src/particles/types.d.ts.map +1 -0
- package/lib/typescript/src/particles.d.ts +2 -0
- package/lib/typescript/src/particles.d.ts.map +1 -0
- package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
- package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
- package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
- package/lib/typescript/src/react/GameView.d.ts +27 -1
- package/lib/typescript/src/react/GameView.d.ts.map +1 -1
- package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
- package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
- package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
- package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
- package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
- package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
- package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
- package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
- package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
- package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
- package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
- package/lib/typescript/src/react/cleanupList.d.ts +21 -0
- package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
- package/lib/typescript/src/react/instrumentation.d.ts +33 -3
- package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
- package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
- package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
- package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/culling.d.ts +70 -0
- package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/index.d.ts +7 -0
- package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
- package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
- package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
- package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
- package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
- package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
- package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
- package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
- package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
- package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
- package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
- package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
- package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
- package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
- package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
- package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
- package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
- package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
- package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
- package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
- package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
- package/lib/typescript/src/react/useGameSession.d.ts +48 -0
- package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
- package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
- package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
- package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
- package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
- package/lib/typescript/src/react.d.ts +18 -1
- package/lib/typescript/src/react.d.ts.map +1 -1
- package/lib/typescript/src/scene/defineScene.d.ts +22 -2
- package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
- package/lib/typescript/src/scene/types.d.ts +24 -4
- package/lib/typescript/src/scene/types.d.ts.map +1 -1
- package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
- package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
- package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
- package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
- package/lib/typescript/src/sprites.d.ts +10 -0
- package/lib/typescript/src/sprites.d.ts.map +1 -0
- package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
- package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
- package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
- package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
- package/lib/typescript/src/storage/errors.d.ts +37 -0
- package/lib/typescript/src/storage/errors.d.ts.map +1 -0
- package/lib/typescript/src/storage/index.d.ts +11 -0
- package/lib/typescript/src/storage/index.d.ts.map +1 -0
- package/lib/typescript/src/storage/schema.d.ts +22 -0
- package/lib/typescript/src/storage/schema.d.ts.map +1 -0
- package/lib/typescript/src/storage/serialization.d.ts +23 -0
- package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
- package/lib/typescript/src/storage/store.d.ts +3 -0
- package/lib/typescript/src/storage/store.d.ts.map +1 -0
- package/lib/typescript/src/storage/types.d.ts +69 -0
- package/lib/typescript/src/storage/types.d.ts.map +1 -0
- package/lib/typescript/src/storage/validation.d.ts +24 -0
- package/lib/typescript/src/storage/validation.d.ts.map +1 -0
- package/lib/typescript/src/storage.d.ts +2 -0
- package/lib/typescript/src/storage.d.ts.map +1 -0
- package/lib/typescript/src/testing.d.ts +1 -0
- package/lib/typescript/src/testing.d.ts.map +1 -1
- package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
- package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
- package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/errors.d.ts +7 -0
- package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/index.d.ts +8 -0
- package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/movement.d.ts +52 -0
- package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/queries.d.ts +21 -0
- package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
- package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/types.d.ts +127 -0
- package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
- package/lib/typescript/src/tilemap.d.ts +2 -0
- package/lib/typescript/src/tilemap.d.ts.map +1 -0
- package/package.json +100 -10
- package/src/assets/defineAssets.ts +31 -5
- package/src/assets.ts +27 -0
- package/src/audio/createGameAudio.ts +749 -0
- package/src/audio/errors.ts +12 -0
- package/src/audio/index.ts +9 -0
- package/src/audio/resolver.ts +74 -0
- package/src/audio/types.ts +47 -0
- package/src/audio.ts +13 -0
- package/src/camera2d/bounds.ts +69 -0
- package/src/camera2d/extents.ts +25 -0
- package/src/camera2d/follow.ts +165 -0
- package/src/camera2d/index.ts +29 -0
- package/src/camera2d/interpolation.ts +113 -0
- package/src/camera2d/shake.ts +90 -0
- package/src/camera2d/transform.ts +148 -0
- package/src/camera2d/types.ts +73 -0
- package/src/camera2d/validation.ts +126 -0
- package/src/camera2d/visibility.ts +181 -0
- package/src/camera2d.ts +6 -0
- package/src/collision2d/colliders.ts +292 -0
- package/src/collision2d/debug.ts +133 -0
- package/src/collision2d/filters.ts +48 -0
- package/src/collision2d/index.ts +74 -0
- package/src/collision2d/intersections.ts +82 -0
- package/src/collision2d/manifolds.ts +191 -0
- package/src/collision2d/segments.ts +176 -0
- package/src/collision2d/spatialHash.ts +211 -0
- package/src/collision2d/sweeps.ts +269 -0
- package/src/collision2d.ts +6 -0
- package/src/core/input/buttonPad.ts +235 -0
- package/src/core/input/createInputBuffer.ts +95 -14
- package/src/core/input/types.ts +7 -0
- package/src/core/session/createGameSession.ts +480 -53
- package/src/core/session/deepFreeze.ts +104 -3
- package/src/core/session/diagnostics.ts +2 -0
- package/src/core/session/types.ts +77 -4
- package/src/definition/defineGame.ts +61 -3
- package/src/definition/types.ts +10 -0
- package/src/events/defineGameEvents.ts +46 -0
- package/src/events/errors.ts +14 -0
- package/src/events/index.ts +14 -0
- package/src/events/payload.ts +234 -0
- package/src/events/seed.ts +33 -0
- package/src/events/types.ts +53 -0
- package/src/events.ts +20 -0
- package/src/geometry/helpers.ts +136 -0
- package/src/geometry/index.ts +14 -0
- package/src/geometry/types.ts +54 -0
- package/src/geometry/validation.ts +131 -0
- package/src/geometry.ts +6 -0
- package/src/haptics/createGameHaptics.ts +214 -0
- package/src/haptics/errors.ts +12 -0
- package/src/haptics/index.ts +3 -0
- package/src/haptics/resolver.ts +58 -0
- package/src/haptics/types.ts +48 -0
- package/src/haptics.ts +7 -0
- package/src/index.ts +37 -1
- package/src/particles/createParticleSystem.ts +505 -0
- package/src/particles/defineParticleEffect.ts +164 -0
- package/src/particles/errors.ts +6 -0
- package/src/particles/index.ts +5 -0
- package/src/particles/sampling.ts +141 -0
- package/src/particles/types.ts +327 -0
- package/src/particles.ts +1 -0
- package/src/react/GameButtonPad.tsx +436 -0
- package/src/react/GamePointerInput.tsx +73 -8
- package/src/react/GameView.tsx +160 -61
- package/src/react/assets/createGameAssetStore.ts +140 -107
- package/src/react/assets/useGameAssets.ts +63 -31
- package/src/react/bindAppLifecycle.ts +55 -19
- package/src/react/bindGameSession.ts +12 -2
- package/src/react/camera2d/GameLayer2D.tsx +43 -0
- package/src/react/camera2d/defineGameCamera2D.ts +59 -0
- package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
- package/src/react/cleanupList.ts +48 -0
- package/src/react/instrumentation.ts +31 -3
- package/src/react/lifecycleSource.ts +58 -0
- package/src/react/particles/ParticleView.tsx +358 -0
- package/src/react/particles/culling.ts +145 -0
- package/src/react/particles/index.ts +6 -0
- package/src/react/particles/spriteXForm.ts +72 -0
- package/src/react/particles/useParticlePresentation.ts +261 -0
- package/src/react/pointerBinding.ts +74 -16
- package/src/react/pointerCamera.ts +33 -0
- package/src/react/pointerCoalescer.ts +36 -10
- package/src/react/sprites/GameSprite.tsx +4 -33
- package/src/react/sprites/GameWorld2D.tsx +113 -7
- package/src/react/sprites/Sprite.tsx +51 -72
- package/src/react/sprites/SpriteBatch.tsx +74 -22
- package/src/react/sprites/batchVisibility.ts +76 -0
- package/src/react/sprites/spriteSelection.ts +133 -0
- package/src/react/sprites/spriteTransform.ts +46 -26
- package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
- package/src/react/tilemap/tilePresentation.ts +491 -0
- package/src/react/useGameSession.ts +90 -0
- package/src/react/useGameSessionStatus.ts +53 -0
- package/src/react/viewportBinding.ts +5 -1
- package/src/react.ts +18 -1
- package/src/scene/defineScene.ts +47 -5
- package/src/scene/types.ts +37 -3
- package/src/sprites/sampleSpriteClip.ts +82 -14
- package/src/sprites/spriteAnimationState.ts +29 -25
- package/src/sprites.ts +22 -0
- package/src/storage/adapters/asyncStorage.ts +77 -0
- package/src/storage/adapters/memory.ts +58 -0
- package/src/storage/errors.ts +88 -0
- package/src/storage/index.ts +18 -0
- package/src/storage/schema.ts +147 -0
- package/src/storage/serialization.ts +248 -0
- package/src/storage/store.ts +380 -0
- package/src/storage/types.ts +76 -0
- package/src/storage/validation.ts +102 -0
- package/src/storage.ts +1 -0
- package/src/testing.ts +4 -0
- package/src/tilemap/chunkStats.ts +24 -0
- package/src/tilemap/definitions.ts +327 -0
- package/src/tilemap/errors.ts +11 -0
- package/src/tilemap/index.ts +10 -0
- package/src/tilemap/movement.ts +368 -0
- package/src/tilemap/queries.ts +136 -0
- package/src/tilemap/tiledAdapter.ts +165 -0
- package/src/tilemap/types.ts +119 -0
- package/src/tilemap.ts +1 -0
|
@@ -6,25 +6,63 @@
|
|
|
6
6
|
* Pure, allocation-free, worklet-compatible frame selection. The same clip
|
|
7
7
|
* metadata and elapsed time always select the same frame, so equivalent
|
|
8
8
|
* game time produces identical presentation at 30/60/90/120 Hz.
|
|
9
|
+
*
|
|
10
|
+
* Single-contract rule (GS-ANIMATION-01): every renderer path resolves
|
|
11
|
+
* frames through these helpers — never duplicated arithmetic. Negative
|
|
12
|
+
* elapsed clamps uniformly (loops wrap, one-shots pin to frame zero);
|
|
13
|
+
* non-finite elapsed, empty clips, and non-positive durations fail clearly
|
|
14
|
+
* instead of masking invalid data as frame zero. Unknown clip names throw
|
|
15
|
+
* a plain `[ASSET_UNKNOWN_CLIP]` error: the UI-reachable call graph must
|
|
16
|
+
* stay free of error-class construction so failure branches execute on the
|
|
17
|
+
* UI runtime exactly as they do headlessly (GS-ANIMATION-02).
|
|
9
18
|
*/
|
|
10
19
|
|
|
20
|
+
/** Reject elapsed values the sampler cannot define a frame for. */
|
|
21
|
+
function assertFiniteElapsed(elapsedMs) {
|
|
22
|
+
'worklet';
|
|
23
|
+
|
|
24
|
+
if (typeof elapsedMs !== 'number' || !Number.isFinite(elapsedMs)) {
|
|
25
|
+
throw new Error(`sprite clip elapsed time must be a finite number of milliseconds, got ${String(elapsedMs)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Reject clips with no selectable frame or no positive pace. */
|
|
30
|
+
function assertSelectableClip(clip) {
|
|
31
|
+
'worklet';
|
|
32
|
+
|
|
33
|
+
const frameCount = clip.frames.length;
|
|
34
|
+
const duration = clip.frameDurationMs;
|
|
35
|
+
if (frameCount === 0) {
|
|
36
|
+
throw new Error('sprite clip must reference at least one frame');
|
|
37
|
+
}
|
|
38
|
+
if (typeof duration !== 'number' || !Number.isFinite(duration) || duration <= 0) {
|
|
39
|
+
throw new Error(`sprite clip frame duration must be a finite number greater than zero, got ${String(duration)}`);
|
|
40
|
+
}
|
|
41
|
+
return frameCount;
|
|
42
|
+
}
|
|
43
|
+
|
|
11
44
|
/**
|
|
12
45
|
* Select the frame index for `elapsedMs` of playback.
|
|
13
46
|
*
|
|
14
47
|
* Loop clips wrap with modulo — the boundary frame is never duplicated and
|
|
15
|
-
* no zero-length boundary frame exists
|
|
16
|
-
*
|
|
48
|
+
* no zero-length boundary frame exists; negative elapsed wraps into range.
|
|
49
|
+
* One-shot clips clamp to `[0, frameCount - 1]`; completion is reported
|
|
50
|
+
* separately by the playback state.
|
|
17
51
|
*/
|
|
18
52
|
export function sampleSpriteClipFrame(clip, elapsedMs) {
|
|
19
53
|
'worklet';
|
|
20
54
|
|
|
21
|
-
|
|
55
|
+
assertFiniteElapsed(elapsedMs);
|
|
56
|
+
const frameCount = assertSelectableClip(clip);
|
|
22
57
|
const duration = clip.frameDurationMs;
|
|
23
58
|
if (clip.mode === 'loop') {
|
|
24
59
|
const index = Math.floor(elapsedMs / duration) % frameCount;
|
|
25
|
-
return index
|
|
60
|
+
return (index + frameCount) % frameCount;
|
|
26
61
|
}
|
|
27
62
|
const index = Math.floor(elapsedMs / duration);
|
|
63
|
+
if (index < 0) {
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
28
66
|
return index >= frameCount ? frameCount - 1 : index;
|
|
29
67
|
}
|
|
30
68
|
|
|
@@ -37,8 +75,7 @@ export function sampleSpriteClipFrameName(clip, elapsedMs) {
|
|
|
37
75
|
|
|
38
76
|
const frames = clip.frames;
|
|
39
77
|
const index = sampleSpriteClipFrame(clip, elapsedMs);
|
|
40
|
-
|
|
41
|
-
return frame === undefined ? frames[0] ?? '' : frame;
|
|
78
|
+
return frames[index] ?? '';
|
|
42
79
|
}
|
|
43
80
|
|
|
44
81
|
/** Total clip duration in milliseconds (one-shot: its full timeline). */
|
|
@@ -47,4 +84,27 @@ export function spriteClipDurationMs(clip) {
|
|
|
47
84
|
|
|
48
85
|
return clip.frames.length * clip.frameDurationMs;
|
|
49
86
|
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Select the frame name for a clip + elapsed time (loop/once semantics).
|
|
90
|
+
*
|
|
91
|
+
* Reads the descriptor's animation table with the single sampler contract
|
|
92
|
+
* above. An absent clip table entry is an invalid clip — it throws instead
|
|
93
|
+
* of returning the clip string as if it were a frame name. Absent
|
|
94
|
+
* *selection* (no clip chosen yet) is distinct: callers keep that path and
|
|
95
|
+
* present nothing without calling this helper.
|
|
96
|
+
*/
|
|
97
|
+
export function spriteFrameNameForClip(animations, clip, elapsedMs) {
|
|
98
|
+
'worklet';
|
|
99
|
+
|
|
100
|
+
const animation = animations[clip];
|
|
101
|
+
if (animation === undefined) {
|
|
102
|
+
throw new Error(`[ASSET_UNKNOWN_CLIP] unknown animation clip ${JSON.stringify(clip)}`);
|
|
103
|
+
}
|
|
104
|
+
const name = sampleSpriteClipFrameName(animation, elapsedMs);
|
|
105
|
+
if (name === '') {
|
|
106
|
+
throw new Error(`[ASSET_EMPTY_CLIP] clip ${JSON.stringify(clip)} selects no frame`);
|
|
107
|
+
}
|
|
108
|
+
return name;
|
|
109
|
+
}
|
|
50
110
|
//# sourceMappingURL=sampleSpriteClip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["assertFiniteElapsed","elapsedMs","Number","isFinite","Error","String","assertSelectableClip","clip","frameCount","frames","length","duration","frameDurationMs","sampleSpriteClipFrame","mode","index","Math","floor","sampleSpriteClipFrameName","spriteClipDurationMs","spriteFrameNameForClip","animations","animation","undefined","JSON","stringify","name"],"sourceRoot":"../../../src","sources":["sprites/sampleSpriteClip.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
* elapsed game time always select the same presented frame (see
|
|
11
11
|
* `sampleSpriteClip`).
|
|
12
12
|
*
|
|
13
|
+
* Simulation-only execution (GS-ANIMATION-02): these state transitions run
|
|
14
|
+
* on fixed-step game time in the simulation, never on the UI runtime, so
|
|
15
|
+
* they carry no worklet directive — a directive here would promise UI
|
|
16
|
+
* execution the error branches (structured error classes) cannot keep.
|
|
17
|
+
* The UI-reachable frame-selection helpers live in `sampleSpriteClip` and
|
|
18
|
+
* `react/sprites/spriteSelection` with a UI-safe call graph.
|
|
19
|
+
*
|
|
13
20
|
* Separation of concerns: gameplay-significant animation state lives in the
|
|
14
21
|
* scene snapshot and advances from fixed-step game time; a renderer-only
|
|
15
22
|
* loop may interpolate presentation from the latest committed state plus
|
|
@@ -35,8 +42,6 @@ function assertFiniteDelta(deltaSeconds) {
|
|
|
35
42
|
|
|
36
43
|
/** Runtime clip lookup; throws a structured error for unknown clips. */
|
|
37
44
|
function clipOf(descriptor, clip) {
|
|
38
|
-
'worklet';
|
|
39
|
-
|
|
40
45
|
const animation = descriptor.animations[clip];
|
|
41
46
|
if (animation === undefined) {
|
|
42
47
|
throw new GameAssetError('ASSET_UNKNOWN_CLIP', ['animations', clip], `unknown animation clip ${JSON.stringify(clip)}`);
|
|
@@ -45,14 +50,11 @@ function clipOf(descriptor, clip) {
|
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
/**
|
|
48
|
-
* Start playback of `clip` from its beginning. The clip name is
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* names literal via the spriteSheet contract).
|
|
53
|
+
* Start playback of `clip` from its beginning. The clip name is constrained
|
|
54
|
+
* to the descriptor's animation keys, so a misspelled clip fails compilation;
|
|
55
|
+
* untyped callers still hit the runtime check below.
|
|
52
56
|
*/
|
|
53
57
|
export function startSpriteAnimation(descriptor, clip) {
|
|
54
|
-
'worklet';
|
|
55
|
-
|
|
56
58
|
clipOf(descriptor, clip);
|
|
57
59
|
return {
|
|
58
60
|
clip,
|
|
@@ -71,8 +73,6 @@ export function startSpriteAnimation(descriptor, clip) {
|
|
|
71
73
|
* (modulo), so arbitrarily large deltas cost constant arithmetic.
|
|
72
74
|
*/
|
|
73
75
|
export function advanceSpriteAnimation(descriptor, state, deltaSeconds) {
|
|
74
|
-
'worklet';
|
|
75
|
-
|
|
76
76
|
assertFiniteDelta(deltaSeconds);
|
|
77
77
|
if (state.paused || state.completed) {
|
|
78
78
|
return state;
|
|
@@ -106,8 +106,6 @@ export function advanceSpriteAnimation(descriptor, state, deltaSeconds) {
|
|
|
106
106
|
* name is typed against the descriptor's animation table.
|
|
107
107
|
*/
|
|
108
108
|
export function playSpriteAnimation(descriptor, state, clip) {
|
|
109
|
-
'worklet';
|
|
110
|
-
|
|
111
109
|
if (clip === state.clip) {
|
|
112
110
|
return state;
|
|
113
111
|
}
|
|
@@ -123,8 +121,6 @@ export function playSpriteAnimation(descriptor, state, clip) {
|
|
|
123
121
|
|
|
124
122
|
/** Pause playback; `advance` becomes a no-op while paused. */
|
|
125
123
|
export function pauseSpriteAnimation(state) {
|
|
126
|
-
'worklet';
|
|
127
|
-
|
|
128
124
|
return state.paused ? state : {
|
|
129
125
|
...state,
|
|
130
126
|
paused: true
|
|
@@ -133,8 +129,6 @@ export function pauseSpriteAnimation(state) {
|
|
|
133
129
|
|
|
134
130
|
/** Resume playback from the paused position. */
|
|
135
131
|
export function resumeSpriteAnimation(state) {
|
|
136
|
-
'worklet';
|
|
137
|
-
|
|
138
132
|
return state.paused ? {
|
|
139
133
|
...state,
|
|
140
134
|
paused: false
|
|
@@ -143,8 +137,6 @@ export function resumeSpriteAnimation(state) {
|
|
|
143
137
|
|
|
144
138
|
/** Restart the current clip from its beginning. */
|
|
145
139
|
export function resetSpriteAnimation(state) {
|
|
146
|
-
'worklet';
|
|
147
|
-
|
|
148
140
|
return {
|
|
149
141
|
...state,
|
|
150
142
|
elapsedMs: 0,
|
|
@@ -154,8 +146,6 @@ export function resetSpriteAnimation(state) {
|
|
|
154
146
|
|
|
155
147
|
/** Set a finite positive speed multiplier. */
|
|
156
148
|
export function setSpriteAnimationSpeed(state, speed) {
|
|
157
|
-
'worklet';
|
|
158
|
-
|
|
159
149
|
assertFinitePositiveSpeed(speed);
|
|
160
150
|
return state.speed === speed ? state : {
|
|
161
151
|
...state,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GameAssetError","spriteClipDurationMs","assertFinitePositiveSpeed","speed","Number","isFinite","Error","assertFiniteDelta","deltaSeconds","clipOf","descriptor","clip","animation","animations","undefined","JSON","stringify","startSpriteAnimation","elapsedMs","paused","completed","advanceSpriteAnimation","state","totalMs","next","mode","wrapped","playSpriteAnimation","pauseSpriteAnimation","resumeSpriteAnimation","resetSpriteAnimation","setSpriteAnimationSpeed"],"sourceRoot":"../../../src","sources":["sprites/spriteAnimationState.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,cAAc,QAAQ,qBAAkB;AAEjD,SAASC,oBAAoB,QAAQ,uBAAoB;;AAEzD;;AAcA,SAASC,yBAAyBA,CAACC,KAAa,EAAQ;EACtD,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACC,MAAM,CAACC,QAAQ,CAACF,KAAK,CAAC,IAAIA,KAAK,IAAI,CAAC,EAAE;IACtE,MAAM,IAAIG,KAAK,CAAC,kEAAkE,CAAC;EACrF;AACF;AAEA,SAASC,iBAAiBA,CAACC,YAAoB,EAAQ;EACrD,IAAI,OAAOA,YAAY,KAAK,QAAQ,IAAI,CAACJ,MAAM,CAACC,QAAQ,CAACG,YAAY,CAAC,EAAE;IACtE,MAAM,IAAIF,KAAK,CAAC,2DAA2D,CAAC;EAC9E;AACF;AACA;;AAMA;AACA,SAASG,MAAMA,CACbC,UAAiC,EACjCC,IAAY,EACiC;EAC7C,
|
|
1
|
+
{"version":3,"names":["GameAssetError","spriteClipDurationMs","assertFinitePositiveSpeed","speed","Number","isFinite","Error","assertFiniteDelta","deltaSeconds","clipOf","descriptor","clip","animation","animations","undefined","JSON","stringify","startSpriteAnimation","elapsedMs","paused","completed","advanceSpriteAnimation","state","totalMs","next","mode","wrapped","playSpriteAnimation","pauseSpriteAnimation","resumeSpriteAnimation","resetSpriteAnimation","setSpriteAnimationSpeed"],"sourceRoot":"../../../src","sources":["sprites/spriteAnimationState.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Subpath entry for `rn-gamekit/sprites`.
|
|
5
|
+
*
|
|
6
|
+
* Deterministic sprite-clip sampling and immutable playback-state helpers.
|
|
7
|
+
* React components (Sprite, GameSprite, SpriteBatch) remain in `rn-gamekit/react`.
|
|
8
|
+
*/
|
|
9
|
+
export { sampleSpriteClipFrame, sampleSpriteClipFrameName, spriteClipDurationMs, spriteFrameNameForClip } from "./sprites/sampleSpriteClip.js";
|
|
10
|
+
export { advanceSpriteAnimation, pauseSpriteAnimation, playSpriteAnimation, resetSpriteAnimation, resumeSpriteAnimation, setSpriteAnimationSpeed, startSpriteAnimation } from "./sprites/spriteAnimationState.js";
|
|
11
|
+
//# sourceMappingURL=sprites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["sampleSpriteClipFrame","sampleSpriteClipFrameName","spriteClipDurationMs","spriteFrameNameForClip","advanceSpriteAnimation","pauseSpriteAnimation","playSpriteAnimation","resetSpriteAnimation","resumeSpriteAnimation","setSpriteAnimationSpeed","startSpriteAnimation"],"sourceRoot":"../../src","sources":["sprites.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,SACEA,qBAAqB,EACrBC,yBAAyB,EACzBC,oBAAoB,EACpBC,sBAAsB,QACjB,+BAA4B;AACnC,SACEC,sBAAsB,EACtBC,oBAAoB,EACpBC,mBAAmB,EACnBC,oBAAoB,EACpBC,qBAAqB,EACrBC,uBAAuB,EACvBC,oBAAoB,QACf,mCAAgC","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { GameStorageError } from "../errors.js";
|
|
4
|
+
let loader = null;
|
|
5
|
+
export function __setAsyncStorageLoader(fn) {
|
|
6
|
+
loader = fn;
|
|
7
|
+
}
|
|
8
|
+
export function __getAsyncStorageLoader() {
|
|
9
|
+
return loader;
|
|
10
|
+
}
|
|
11
|
+
async function loadAsyncStorage() {
|
|
12
|
+
if (loader) return loader();
|
|
13
|
+
try {
|
|
14
|
+
const mod = await import('@react-native-async-storage/async-storage');
|
|
15
|
+
const resolved = mod.getItem !== undefined ? mod : mod.default?.getItem !== undefined ? mod.default : undefined;
|
|
16
|
+
if (!resolved) {
|
|
17
|
+
throw new Error('AsyncStorage module did not export getItem/setItem/removeItem');
|
|
18
|
+
}
|
|
19
|
+
return resolved;
|
|
20
|
+
} catch (cause) {
|
|
21
|
+
throw new GameStorageError('@react-native-async-storage/async-storage is not installed. Run `npx expo install @react-native-async-storage/async-storage` and rebuild with `npx expo prebuild` (or `expo run:ios` / `expo run:android`). See https://react-native-async-storage.github.io/async-storage/docs/install/', {
|
|
22
|
+
code: 'BACKEND_READ_FAILED',
|
|
23
|
+
cause
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* RN adapter backed by AsyncStorage.
|
|
30
|
+
*
|
|
31
|
+
* Importing `rn-gamekit/storage` does not eagerly import AsyncStorage —
|
|
32
|
+
* the dynamic import happens on the first read/write/remove.
|
|
33
|
+
*/
|
|
34
|
+
export function createGameStorageAdapter() {
|
|
35
|
+
let cached = null;
|
|
36
|
+
const get = async () => {
|
|
37
|
+
if (cached) return cached;
|
|
38
|
+
cached = await loadAsyncStorage();
|
|
39
|
+
return cached;
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
async read(key) {
|
|
43
|
+
const storage = await get();
|
|
44
|
+
const value = await storage.getItem(key);
|
|
45
|
+
return value === null ? undefined : value;
|
|
46
|
+
},
|
|
47
|
+
async write(key, value) {
|
|
48
|
+
const storage = await get();
|
|
49
|
+
await storage.setItem(key, value);
|
|
50
|
+
},
|
|
51
|
+
async remove(key) {
|
|
52
|
+
const storage = await get();
|
|
53
|
+
await storage.removeItem(key);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=asyncStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GameStorageError","loader","__setAsyncStorageLoader","fn","__getAsyncStorageLoader","loadAsyncStorage","mod","resolved","getItem","undefined","default","Error","cause","code","createGameStorageAdapter","cached","get","read","key","storage","value","write","setItem","remove","removeItem"],"sourceRoot":"../../../../src","sources":["storage/adapters/asyncStorage.ts"],"mappings":";;AACA,SAASA,gBAAgB,QAAQ,cAAW;AAS5C,IAAIC,MAAqB,GAAG,IAAI;AAEhC,OAAO,SAASC,uBAAuBA,CAACC,EAAiB,EAAQ;EAC/DF,MAAM,GAAGE,EAAE;AACb;AAEA,OAAO,SAASC,uBAAuBA,CAAA,EAAkB;EACvD,OAAOH,MAAM;AACf;AAEA,eAAeI,gBAAgBA,CAAA,EAAgC;EAC7D,IAAIJ,MAAM,EAAE,OAAOA,MAAM,CAAC,CAAC;EAC3B,IAAI;IACF,MAAMK,GAAG,GAAI,MAAM,MAAM,CAAC,2CAA2C,CAE/C;IACtB,MAAMC,QAAwC,GAC3CD,GAAG,CAAwBE,OAAO,KAAKC,SAAS,GAC5CH,GAAG,GACJA,GAAG,CAACI,OAAO,EAAEF,OAAO,KAAKC,SAAS,GAChCH,GAAG,CAACI,OAAO,GACXD,SAAS;IACjB,IAAI,CAACF,QAAQ,EAAE;MACb,MAAM,IAAII,KAAK,CAAC,+DAA+D,CAAC;IAClF;IACA,OAAOJ,QAAQ;EACjB,CAAC,CAAC,OAAOK,KAAK,EAAE;IACd,MAAM,IAAIZ,gBAAgB,CACxB,0RAA0R,EAC1R;MACEa,IAAI,EAAE,qBAAqB;MAC3BD;IACF,CACF,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,wBAAwBA,CAAA,EAAuB;EAC7D,IAAIC,MAAiC,GAAG,IAAI;EAC5C,MAAMC,GAAG,GAAG,MAAAA,CAAA,KAAyC;IACnD,IAAID,MAAM,EAAE,OAAOA,MAAM;IACzBA,MAAM,GAAG,MAAMV,gBAAgB,CAAC,CAAC;IACjC,OAAOU,MAAM;EACf,CAAC;EAED,OAAO;IACL,MAAME,IAAIA,CAACC,GAAW,EAA+B;MACnD,MAAMC,OAAO,GAAG,MAAMH,GAAG,CAAC,CAAC;MAC3B,MAAMI,KAAK,GAAG,MAAMD,OAAO,CAACX,OAAO,CAACU,GAAG,CAAC;MACxC,OAAOE,KAAK,KAAK,IAAI,GAAGX,SAAS,GAAGW,KAAK;IAC3C,CAAC;IACD,MAAMC,KAAKA,CAACH,GAAW,EAAEE,KAAa,EAAiB;MACrD,MAAMD,OAAO,GAAG,MAAMH,GAAG,CAAC,CAAC;MAC3B,MAAMG,OAAO,CAACG,OAAO,CAACJ,GAAG,EAAEE,KAAK,CAAC;IACnC,CAAC;IACD,MAAMG,MAAMA,CAACL,GAAW,EAAiB;MACvC,MAAMC,OAAO,GAAG,MAAMH,GAAG,CAAC,CAAC;MAC3B,MAAMG,OAAO,CAACK,UAAU,CAACN,GAAG,CAAC;IAC/B;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* In-memory adapter for tests and apps that own storage elsewhere.
|
|
5
|
+
* Each instance owns its map.
|
|
6
|
+
*/
|
|
7
|
+
export function createMemoryStorageAdapter(initial) {
|
|
8
|
+
const map = new Map(initial ? Object.entries(initial) : []);
|
|
9
|
+
return {
|
|
10
|
+
async read(key) {
|
|
11
|
+
return map.get(key);
|
|
12
|
+
},
|
|
13
|
+
async write(key, value) {
|
|
14
|
+
map.set(key, value);
|
|
15
|
+
},
|
|
16
|
+
async remove(key) {
|
|
17
|
+
map.delete(key);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Programmable failure adapter for tests — wraps another adapter and injects failures.
|
|
24
|
+
*/
|
|
25
|
+
export function createFailingStorageAdapter(inner, opts = {}) {
|
|
26
|
+
const delay = async () => {
|
|
27
|
+
if (opts.delayMs) await new Promise(r => setTimeout(r, opts.delayMs));
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
async read(key) {
|
|
31
|
+
await delay();
|
|
32
|
+
const err = opts.failRead?.(key) ?? null;
|
|
33
|
+
if (err) throw err;
|
|
34
|
+
return inner.read(key);
|
|
35
|
+
},
|
|
36
|
+
async write(key, value) {
|
|
37
|
+
await delay();
|
|
38
|
+
const err = opts.failWrite?.(key, value) ?? null;
|
|
39
|
+
if (err) throw err;
|
|
40
|
+
return inner.write(key, value);
|
|
41
|
+
},
|
|
42
|
+
async remove(key) {
|
|
43
|
+
await delay();
|
|
44
|
+
const err = opts.failRemove?.(key) ?? null;
|
|
45
|
+
if (err) throw err;
|
|
46
|
+
return inner.remove(key);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createMemoryStorageAdapter","initial","map","Map","Object","entries","read","key","get","write","value","set","remove","delete","createFailingStorageAdapter","inner","opts","delay","delayMs","Promise","r","setTimeout","err","failRead","failWrite","failRemove"],"sourceRoot":"../../../../src","sources":["storage/adapters/memory.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASA,0BAA0BA,CAACC,OAAgC,EAAsB;EAC/F,MAAMC,GAAG,GAAG,IAAIC,GAAG,CAAiBF,OAAO,GAAGG,MAAM,CAACC,OAAO,CAACJ,OAAO,CAAC,GAAG,EAAE,CAAC;EAE3E,OAAO;IACL,MAAMK,IAAIA,CAACC,GAAW,EAA+B;MACnD,OAAOL,GAAG,CAACM,GAAG,CAACD,GAAG,CAAC;IACrB,CAAC;IACD,MAAME,KAAKA,CAACF,GAAW,EAAEG,KAAa,EAAiB;MACrDR,GAAG,CAACS,GAAG,CAACJ,GAAG,EAAEG,KAAK,CAAC;IACrB,CAAC;IACD,MAAME,MAAMA,CAACL,GAAW,EAAiB;MACvCL,GAAG,CAACW,MAAM,CAACN,GAAG,CAAC;IACjB;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASO,2BAA2BA,CACzCC,KAAyB,EACzBC,IAKC,GAAG,CAAC,CAAC,EACc;EACpB,MAAMC,KAAK,GAAG,MAAAA,CAAA,KAA2B;IACvC,IAAID,IAAI,CAACE,OAAO,EAAE,MAAM,IAAIC,OAAO,CAAEC,CAAC,IAAKC,UAAU,CAACD,CAAC,EAAEJ,IAAI,CAACE,OAAO,CAAC,CAAC;EACzE,CAAC;EACD,OAAO;IACL,MAAMZ,IAAIA,CAACC,GAAW,EAA+B;MACnD,MAAMU,KAAK,CAAC,CAAC;MACb,MAAMK,GAAG,GAAGN,IAAI,CAACO,QAAQ,GAAGhB,GAAG,CAAC,IAAI,IAAI;MACxC,IAAIe,GAAG,EAAE,MAAMA,GAAG;MAClB,OAAOP,KAAK,CAACT,IAAI,CAACC,GAAG,CAAC;IACxB,CAAC;IACD,MAAME,KAAKA,CAACF,GAAW,EAAEG,KAAa,EAAiB;MACrD,MAAMO,KAAK,CAAC,CAAC;MACb,MAAMK,GAAG,GAAGN,IAAI,CAACQ,SAAS,GAAGjB,GAAG,EAAEG,KAAK,CAAC,IAAI,IAAI;MAChD,IAAIY,GAAG,EAAE,MAAMA,GAAG;MAClB,OAAOP,KAAK,CAACN,KAAK,CAACF,GAAG,EAAEG,KAAK,CAAC;IAChC,CAAC;IACD,MAAME,MAAMA,CAACL,GAAW,EAAiB;MACvC,MAAMU,KAAK,CAAC,CAAC;MACb,MAAMK,GAAG,GAAGN,IAAI,CAACS,UAAU,GAAGlB,GAAG,CAAC,IAAI,IAAI;MAC1C,IAAIe,GAAG,EAAE,MAAMA,GAAG;MAClB,OAAOP,KAAK,CAACH,MAAM,CAACL,GAAG,CAAC;IAC1B;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* V1 storage errors — stable codes, operation, namespace/slot, schema context,
|
|
5
|
+
* exact path where relevant, and original cause.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export class GameStorageError extends Error {
|
|
9
|
+
name = 'GameStorageError';
|
|
10
|
+
constructor(message, options) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = options.code;
|
|
13
|
+
this.operation = options.operation;
|
|
14
|
+
this.namespace = options.namespace;
|
|
15
|
+
this.slot = options.slot;
|
|
16
|
+
this.schemaId = options.schemaId;
|
|
17
|
+
this.schemaVersion = options.schemaVersion;
|
|
18
|
+
this.path = options.path;
|
|
19
|
+
this.cause = options.cause;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function storageError(message, code, opts = {}) {
|
|
23
|
+
return new GameStorageError(message, {
|
|
24
|
+
code,
|
|
25
|
+
operation: opts.operation,
|
|
26
|
+
namespace: opts.namespace,
|
|
27
|
+
slot: opts.slot,
|
|
28
|
+
schemaId: opts.schemaId,
|
|
29
|
+
schemaVersion: opts.schemaVersion,
|
|
30
|
+
path: opts.path,
|
|
31
|
+
cause: opts.cause
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GameStorageError","Error","name","constructor","message","options","code","operation","namespace","slot","schemaId","schemaVersion","path","cause","storageError","opts"],"sourceRoot":"../../../src","sources":["storage/errors.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAwBA,OAAO,MAAMA,gBAAgB,SAASC,KAAK,CAAC;EACxBC,IAAI,GAAG,kBAAkB;EAW3CC,WAAWA,CACTC,OAAe,EACfC,OASC,EACD;IACA,KAAK,CAACD,OAAO,CAAC;IACd,IAAI,CAACE,IAAI,GAAGD,OAAO,CAACC,IAAI;IACxB,IAAI,CAACC,SAAS,GAAGF,OAAO,CAACE,SAAS;IAClC,IAAI,CAACC,SAAS,GAAGH,OAAO,CAACG,SAAS;IAClC,IAAI,CAACC,IAAI,GAAGJ,OAAO,CAACI,IAAI;IACxB,IAAI,CAACC,QAAQ,GAAGL,OAAO,CAACK,QAAQ;IAChC,IAAI,CAACC,aAAa,GAAGN,OAAO,CAACM,aAAa;IAC1C,IAAI,CAACC,IAAI,GAAGP,OAAO,CAACO,IAAI;IACxB,IAAI,CAACC,KAAK,GAAGR,OAAO,CAACQ,KAAK;EAC5B;AACF;AAEA,OAAO,SAASC,YAAYA,CAC1BV,OAAe,EACfE,IAA0B,EAC1BS,IAQC,GAAG,CAAC,CAAC,EACY;EAClB,OAAO,IAAIf,gBAAgB,CAACI,OAAO,EAAE;IACnCE,IAAI;IACJC,SAAS,EAAEQ,IAAI,CAACR,SAAS;IACzBC,SAAS,EAAEO,IAAI,CAACP,SAAS;IACzBC,IAAI,EAAEM,IAAI,CAACN,IAAI;IACfC,QAAQ,EAAEK,IAAI,CAACL,QAAQ;IACvBC,aAAa,EAAEI,IAAI,CAACJ,aAAa;IACjCC,IAAI,EAAEG,IAAI,CAACH,IAAI;IACfC,KAAK,EAAEE,IAAI,CAACF;EACd,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export { GameStorageError } from "./errors.js";
|
|
4
|
+
export { defineGameSave } from "./schema.js";
|
|
5
|
+
export { createGameSaveStore } from "./store.js";
|
|
6
|
+
export { createMemoryStorageAdapter } from "./adapters/memory.js";
|
|
7
|
+
export { createGameStorageAdapter } from "./adapters/asyncStorage.js";
|
|
8
|
+
export { __setAsyncStorageLoader, __getAsyncStorageLoader } from "./adapters/asyncStorage.js";
|
|
9
|
+
export { STORAGE_LIMITS } from "./types.js";
|
|
10
|
+
export { STORAGE_ENVELOPE_FORMAT } from "./serialization.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GameStorageError","defineGameSave","createGameSaveStore","createMemoryStorageAdapter","createGameStorageAdapter","__setAsyncStorageLoader","__getAsyncStorageLoader","STORAGE_LIMITS","STORAGE_ENVELOPE_FORMAT"],"sourceRoot":"../../../src","sources":["storage/index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,aAAU;AAE3C,SAASC,cAAc,QAAQ,aAAU;AACzC,SAASC,mBAAmB,QAAQ,YAAS;AAC7C,SAASC,0BAA0B,QAAQ,sBAAmB;AAC9D,SAASC,wBAAwB,QAAQ,4BAAyB;AAClE,SAASC,uBAAuB,EAAEC,uBAAuB,QAAQ,4BAAyB;AAU1F,SAASC,cAAc,QAAQ,YAAS;AACxC,SAASC,uBAAuB,QAAQ,oBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { GameStorageError, storageError } from "./errors.js";
|
|
4
|
+
import { validateMigrations, validateSchemaId, validateVersion } from "./validation.js";
|
|
5
|
+
import { cloneAndValidatePlainData } from "./serialization.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Define a versioned game save schema.
|
|
9
|
+
*
|
|
10
|
+
* Id/version/migrations are validated immediately. `createDefault` and
|
|
11
|
+
* `validate` are stored as-is — they run later per load/save.
|
|
12
|
+
*/
|
|
13
|
+
export function defineGameSave(options) {
|
|
14
|
+
validateSchemaId(options.id);
|
|
15
|
+
validateVersion(options.version);
|
|
16
|
+
if (typeof options.createDefault !== 'function') {
|
|
17
|
+
throw new GameStorageError('createDefault must be a function', {
|
|
18
|
+
code: 'INVALID_SCHEMA_ID',
|
|
19
|
+
schemaId: options.id
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (typeof options.validate !== 'function') {
|
|
23
|
+
throw new GameStorageError('validate must be a function', {
|
|
24
|
+
code: 'VALIDATION_FAILED',
|
|
25
|
+
schemaId: options.id
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const migrations = options.migrations ?? {};
|
|
29
|
+
validateMigrations(migrations, options.version);
|
|
30
|
+
|
|
31
|
+
// Freeze migrations shallowly — migration functions themselves remain.
|
|
32
|
+
const frozenMigrations = Object.freeze({
|
|
33
|
+
...migrations
|
|
34
|
+
});
|
|
35
|
+
const schema = {
|
|
36
|
+
id: options.id,
|
|
37
|
+
version: options.version,
|
|
38
|
+
createDefault: options.createDefault,
|
|
39
|
+
validate: options.validate,
|
|
40
|
+
migrations: frozenMigrations
|
|
41
|
+
};
|
|
42
|
+
return Object.freeze(schema);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Clone/freeze via plain-data path for defaults that are plain; fallback to structured clone for custom validation. */
|
|
46
|
+
function deepFreeze(value) {
|
|
47
|
+
if (value === null || typeof value !== 'object') return value;
|
|
48
|
+
// Use storage-style freeze: we already cloned, just deep freeze.
|
|
49
|
+
const seen = new WeakSet();
|
|
50
|
+
const freeze = node => {
|
|
51
|
+
if (node === null || typeof node !== 'object') return;
|
|
52
|
+
const o = node;
|
|
53
|
+
if (seen.has(o)) return;
|
|
54
|
+
seen.add(o);
|
|
55
|
+
if (Array.isArray(node)) {
|
|
56
|
+
for (const v of node) freeze(v);
|
|
57
|
+
} else {
|
|
58
|
+
for (const v of Object.values(node)) freeze(v);
|
|
59
|
+
}
|
|
60
|
+
Object.freeze(node);
|
|
61
|
+
};
|
|
62
|
+
freeze(value);
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
export function createDefaultData(schema) {
|
|
66
|
+
const raw = schema.createDefault();
|
|
67
|
+
// Validate through schema.validate to enforce domain rules and to
|
|
68
|
+
// ensure we return a newly owned, validated value. If validate does not
|
|
69
|
+
// clone, we still protect via plain-data clone.
|
|
70
|
+
try {
|
|
71
|
+
const validated = schema.validate(raw);
|
|
72
|
+
// Ensure plain-data safe and frozen
|
|
73
|
+
const cloned = cloneAndValidatePlainData(validated, 'createDefault() result');
|
|
74
|
+
return deepFreeze(cloned);
|
|
75
|
+
} catch (cause) {
|
|
76
|
+
if (cause instanceof GameStorageError) throw cause;
|
|
77
|
+
throw storageError(`createDefault() validation failed`, 'VALIDATION_FAILED', {
|
|
78
|
+
schemaId: schema.id,
|
|
79
|
+
schemaVersion: schema.version,
|
|
80
|
+
cause
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function validateCurrentData(schema, value, path = 'data') {
|
|
85
|
+
try {
|
|
86
|
+
const validated = schema.validate(value);
|
|
87
|
+
const cloned = cloneAndValidatePlainData(validated, path);
|
|
88
|
+
return deepFreeze(cloned);
|
|
89
|
+
} catch (cause) {
|
|
90
|
+
if (cause instanceof GameStorageError) throw cause;
|
|
91
|
+
// Preserve original validation error as cause; surface as VALIDATION_FAILED with path if available
|
|
92
|
+
const msg = cause instanceof Error ? cause.message : String(cause);
|
|
93
|
+
throw storageError(msg, 'VALIDATION_FAILED', {
|
|
94
|
+
schemaId: schema.id,
|
|
95
|
+
schemaVersion: schema.version,
|
|
96
|
+
path,
|
|
97
|
+
cause
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function migratePayload(schema, storedVersion, payload) {
|
|
102
|
+
let current = payload;
|
|
103
|
+
let version = storedVersion;
|
|
104
|
+
const target = schema.version;
|
|
105
|
+
if (version > target) {
|
|
106
|
+
throw storageError(`stored version ${version} is newer than schema version ${target}`, 'FUTURE_VERSION', {
|
|
107
|
+
schemaId: schema.id,
|
|
108
|
+
schemaVersion: target
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (version === target) return {
|
|
112
|
+
data: current,
|
|
113
|
+
fromVersion: version,
|
|
114
|
+
toVersion: target
|
|
115
|
+
};
|
|
116
|
+
// Sequential migrations version -> version+1
|
|
117
|
+
for (let v = version; v < target; v += 1) {
|
|
118
|
+
const fn = schema.migrations[v];
|
|
119
|
+
if (typeof fn !== 'function') {
|
|
120
|
+
throw storageError(`missing migration for version ${v} -> ${v + 1}`, 'MISSING_MIGRATION', {
|
|
121
|
+
schemaId: schema.id,
|
|
122
|
+
schemaVersion: target,
|
|
123
|
+
path: `migrations.${v}`
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
// Engine-owned deeply frozen input — migration must be pure and cannot mutate it.
|
|
128
|
+
const frozenInput = deepFreeze(cloneAndValidatePlainData(current, `migrations.${v} input`));
|
|
129
|
+
const output = fn(frozenInput);
|
|
130
|
+
// Bounded-clone and freeze every migration output before the next step, so oversized/deep/unsupported intermediates are rejected at the step.
|
|
131
|
+
const clonedOutput = cloneAndValidatePlainData(output, `migrations.${v} output`);
|
|
132
|
+
deepFreeze(clonedOutput);
|
|
133
|
+
current = clonedOutput;
|
|
134
|
+
version = v + 1;
|
|
135
|
+
} catch (cause) {
|
|
136
|
+
if (cause instanceof GameStorageError) throw cause;
|
|
137
|
+
throw storageError(`migration ${v} -> ${v + 1} failed`, 'MIGRATION_FAILED', {
|
|
138
|
+
schemaId: schema.id,
|
|
139
|
+
schemaVersion: target,
|
|
140
|
+
path: `migrations.${v}`,
|
|
141
|
+
cause
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
data: current,
|
|
147
|
+
fromVersion: storedVersion,
|
|
148
|
+
toVersion: target
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GameStorageError","storageError","validateMigrations","validateSchemaId","validateVersion","cloneAndValidatePlainData","defineGameSave","options","id","version","createDefault","code","schemaId","validate","migrations","frozenMigrations","Object","freeze","schema","deepFreeze","value","seen","WeakSet","node","o","has","add","Array","isArray","v","values","createDefaultData","raw","validated","cloned","cause","schemaVersion","validateCurrentData","path","msg","Error","message","String","migratePayload","storedVersion","payload","current","target","data","fromVersion","toVersion","fn","frozenInput","output","clonedOutput"],"sourceRoot":"../../../src","sources":["storage/schema.ts"],"mappings":"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","ignoreList":[]}
|