rn-gamekit 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +95 -14
- 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 +94 -4
- 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
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { cellsInAabb, cellsInSweptBounds } from "./queries.js";
|
|
4
|
+
import { tileError } from "./errors.js";
|
|
5
|
+
import { assertValidAabb2D, assertValidVector2D } from "../geometry/validation.js";
|
|
6
|
+
|
|
7
|
+
/** Frozen v1 movement semantics (T16.0). */
|
|
8
|
+
export const PLATFORMER_MAX_ITERATIONS = 4;
|
|
9
|
+
export const PLATFORMER_SKIN = 1e-6;
|
|
10
|
+
/** Previous-bottom must be at or above the platform top by this tolerance. */
|
|
11
|
+
export const ONE_WAY_TOLERANCE = 1e-4;
|
|
12
|
+
function isSolid(kind) {
|
|
13
|
+
return kind === 'solid';
|
|
14
|
+
}
|
|
15
|
+
function isOneWay(kind) {
|
|
16
|
+
return kind === 'one-way-up';
|
|
17
|
+
}
|
|
18
|
+
function overlaps(a, b) {
|
|
19
|
+
return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Pure fixed-step AABB platformer movement (T16.3, T16-F5).
|
|
24
|
+
*
|
|
25
|
+
* Frozen semantics:
|
|
26
|
+
* - Axis order X then Y.
|
|
27
|
+
* - Solid tiles block both axes; one-way tiles block descent only when the
|
|
28
|
+
* previous bottom was at/above the platform top (ONE_WAY_TOLERANCE) and
|
|
29
|
+
* `dropThroughOneWay` is not set.
|
|
30
|
+
* - Starting overlap resolves along the least-penetration face preferring UP
|
|
31
|
+
* on ties (up = negative y in y-down space), up to PLATFORMER_MAX_ITERATIONS;
|
|
32
|
+
* unresolved spawn overlap throws deterministically. The reported contact is
|
|
33
|
+
* always the tile that supplied the winning face.
|
|
34
|
+
* - Each axis resolves against the NEAREST blocking plane and reports contacts
|
|
35
|
+
* ONLY for tiles touching that winning plane — farther crossed rows/columns
|
|
36
|
+
* are never reported.
|
|
37
|
+
* - Floor snap pulls a falling/resting body down onto tops within
|
|
38
|
+
* `floorSnapDistance`.
|
|
39
|
+
* - Candidate order is layer order then row-major cell order; equal physical
|
|
40
|
+
* candidates preserve that deterministic order.
|
|
41
|
+
*
|
|
42
|
+
* Displacement contract (GS-TILE-03): `displacement` reports requested-motion
|
|
43
|
+
* resolution only — starting-overlap recovery moves the body and reports its
|
|
44
|
+
* contact, but never contributes to displacement. The caller's body object is
|
|
45
|
+
* never mutated or frozen; every returned body/contact/normal is an owned
|
|
46
|
+
* frozen value.
|
|
47
|
+
*/
|
|
48
|
+
export function movePlatformerBody2D(options) {
|
|
49
|
+
const {
|
|
50
|
+
map,
|
|
51
|
+
deltaSeconds,
|
|
52
|
+
collisionLayers
|
|
53
|
+
} = options;
|
|
54
|
+
// GS-TILE-03: validate author inputs once at the public boundary, and
|
|
55
|
+
// copy the body — the caller's object is never mutated or frozen.
|
|
56
|
+
assertValidAabb2D(options.body, 'body');
|
|
57
|
+
assertValidVector2D(options.velocity, 'velocity');
|
|
58
|
+
let body = {
|
|
59
|
+
...options.body
|
|
60
|
+
};
|
|
61
|
+
let vx = options.velocity.x;
|
|
62
|
+
let vy = options.velocity.y;
|
|
63
|
+
if (!Number.isFinite(deltaSeconds) || deltaSeconds < 0) {
|
|
64
|
+
throw tileError('deltaSeconds', `must be a finite number >= 0; got ${String(deltaSeconds)}`);
|
|
65
|
+
}
|
|
66
|
+
const dropThrough = options.dropThroughOneWay ?? false;
|
|
67
|
+
if (typeof dropThrough !== 'boolean') {
|
|
68
|
+
throw tileError('dropThroughOneWay', `must be a boolean or omitted; got ${String(options.dropThroughOneWay)}`);
|
|
69
|
+
}
|
|
70
|
+
const snapDistance = options.floorSnapDistance ?? 0;
|
|
71
|
+
if (typeof snapDistance !== 'number' || !Number.isFinite(snapDistance) || snapDistance < 0) {
|
|
72
|
+
throw tileError('floorSnapDistance', `must be a finite number >= 0 or omitted; got ${String(options.floorSnapDistance)}`);
|
|
73
|
+
}
|
|
74
|
+
// GS-TILE-02: layer selection is explicit and exact — unknown ids fail
|
|
75
|
+
// here instead of silently colliding with nothing (a typo would otherwise
|
|
76
|
+
// drop the player through the world). Duplicates are harmless: queries
|
|
77
|
+
// iterate map layers, so an id can never report twice.
|
|
78
|
+
if (!Array.isArray(collisionLayers)) {
|
|
79
|
+
throw tileError('collisionLayers', `must be an array of layer ids; got ${String(collisionLayers)}`);
|
|
80
|
+
}
|
|
81
|
+
for (const layerId of collisionLayers) {
|
|
82
|
+
if (typeof layerId !== 'string' || map.layerById[layerId] === undefined) {
|
|
83
|
+
throw tileError('collisionLayers', `unknown collision layer ${JSON.stringify(layerId)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const intendedX = vx * deltaSeconds;
|
|
87
|
+
const intendedY = vy * deltaSeconds;
|
|
88
|
+
const contacts = [];
|
|
89
|
+
let appliedX = 0;
|
|
90
|
+
let appliedY = 0;
|
|
91
|
+
|
|
92
|
+
/** Report one owned frozen contact (GS-TILE-03: nested values immutable). */
|
|
93
|
+
const report = (cell, normal) => {
|
|
94
|
+
contacts.push(Object.freeze({
|
|
95
|
+
cell,
|
|
96
|
+
normal: Object.freeze({
|
|
97
|
+
...normal
|
|
98
|
+
})
|
|
99
|
+
}));
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// --- Starting-overlap recovery ---
|
|
103
|
+
// Track the winning tile TOGETHER with its face so the reported contact
|
|
104
|
+
// always names the tile that supplied the resolved plane (T16-F5).
|
|
105
|
+
for (let iter = 0; iter < PLATFORMER_MAX_ITERATIONS; iter++) {
|
|
106
|
+
const overlapping = cellsInAabb(map, body, collisionLayers).filter(c => isSolid(c.collision) && overlaps(body, c.aabb));
|
|
107
|
+
if (overlapping.length === 0) break;
|
|
108
|
+
// Least-penetration FACE wins; ties prefer pushing UP (negative y).
|
|
109
|
+
let bestAxis = 'y';
|
|
110
|
+
let bestSign = -1;
|
|
111
|
+
let bestDepth = Number.POSITIVE_INFINITY;
|
|
112
|
+
let bestCell;
|
|
113
|
+
const consider = (axis, sign, depth, cell) => {
|
|
114
|
+
// Deterministic tie rule: prefer y over x, and prefer negative-y (up)
|
|
115
|
+
// over positive-y. Otherwise first-evaluated (row-major) wins.
|
|
116
|
+
const better = depth < bestDepth || depth === bestDepth && (axis === 'y' ? bestAxis !== 'y' || sign === -1 : false);
|
|
117
|
+
if (better) {
|
|
118
|
+
bestAxis = axis;
|
|
119
|
+
bestSign = sign;
|
|
120
|
+
bestDepth = depth;
|
|
121
|
+
bestCell = cell;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
for (const c of overlapping) {
|
|
125
|
+
const pushLeft = c.aabb.x - body.width - body.x;
|
|
126
|
+
const pushRight = c.aabb.x + c.aabb.width - body.x;
|
|
127
|
+
const pushUp = c.aabb.y - body.height - body.y;
|
|
128
|
+
const pushDown = c.aabb.y + c.aabb.height - body.y;
|
|
129
|
+
consider('x', -1, Math.abs(pushLeft), c);
|
|
130
|
+
consider('x', 1, Math.abs(pushRight), c);
|
|
131
|
+
consider('y', -1, Math.abs(pushUp), c);
|
|
132
|
+
consider('y', 1, Math.abs(pushDown), c);
|
|
133
|
+
}
|
|
134
|
+
if (bestCell === undefined) break;
|
|
135
|
+
// Closure mutation defeats TS narrowing here; assert the union.
|
|
136
|
+
const axis = bestAxis;
|
|
137
|
+
body = axis === 'x' ? {
|
|
138
|
+
...body,
|
|
139
|
+
x: body.x + bestSign * bestDepth
|
|
140
|
+
} : {
|
|
141
|
+
...body,
|
|
142
|
+
y: body.y + bestSign * bestDepth
|
|
143
|
+
};
|
|
144
|
+
// Negative-y push lands the body ON a tile top (floor); positive-y hits
|
|
145
|
+
// a ceiling. The contact names the winning tile.
|
|
146
|
+
if (axis === 'y') {
|
|
147
|
+
report(bestCell, {
|
|
148
|
+
x: 0,
|
|
149
|
+
y: bestSign
|
|
150
|
+
});
|
|
151
|
+
vy = 0;
|
|
152
|
+
} else {
|
|
153
|
+
report(bestCell, {
|
|
154
|
+
x: bestSign,
|
|
155
|
+
y: 0
|
|
156
|
+
});
|
|
157
|
+
vx = 0;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Final check: unresolved spawn overlap is a deterministic error.
|
|
161
|
+
const stillOverlapping = cellsInAabb(map, body, collisionLayers).some(c => isSolid(c.collision) && overlaps(body, c.aabb));
|
|
162
|
+
if (stillOverlapping) {
|
|
163
|
+
throw tileError('body', 'starting overlap could not be resolved within PLATFORMER_MAX_ITERATIONS');
|
|
164
|
+
}
|
|
165
|
+
const prevBottom = body.y + body.height;
|
|
166
|
+
// --- X axis sweep ---
|
|
167
|
+
{
|
|
168
|
+
const dx = intendedX;
|
|
169
|
+
if (dx !== 0) {
|
|
170
|
+
const newX = body.x + dx;
|
|
171
|
+
let clamped = newX;
|
|
172
|
+
const yOverlap = aabb => body.y < aabb.y + aabb.height && body.y + body.height > aabb.y;
|
|
173
|
+
const solids = cellsInSweptBounds(map, body, {
|
|
174
|
+
x: dx,
|
|
175
|
+
y: 0
|
|
176
|
+
}, collisionLayers).filter(c => isSolid(c.collision));
|
|
177
|
+
// Phase 1: resolve against the NEAREST blocking plane only.
|
|
178
|
+
if (dx > 0) {
|
|
179
|
+
let planeX = Number.POSITIVE_INFINITY;
|
|
180
|
+
for (const c of solids) {
|
|
181
|
+
if (!yOverlap(c.aabb)) continue;
|
|
182
|
+
if (body.x + body.width > c.aabb.x + PLATFORMER_SKIN) continue;
|
|
183
|
+
if (c.aabb.x < planeX) planeX = c.aabb.x;
|
|
184
|
+
}
|
|
185
|
+
if (planeX !== Number.POSITIVE_INFINITY) {
|
|
186
|
+
clamped = Math.min(clamped, planeX - body.width);
|
|
187
|
+
// Phase 2: emit contacts ONLY for tiles touching the winning plane.
|
|
188
|
+
for (const c of solids) {
|
|
189
|
+
if (!yOverlap(c.aabb)) continue;
|
|
190
|
+
if (Math.abs(c.aabb.x - planeX) > PLATFORMER_SKIN) continue;
|
|
191
|
+
report(c, {
|
|
192
|
+
x: -1,
|
|
193
|
+
y: 0
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
198
|
+
let planeX = Number.NEGATIVE_INFINITY;
|
|
199
|
+
for (const c of solids) {
|
|
200
|
+
if (!yOverlap(c.aabb)) continue;
|
|
201
|
+
if (body.x < c.aabb.x + c.aabb.width - PLATFORMER_SKIN) continue;
|
|
202
|
+
if (c.aabb.x + c.aabb.width > planeX) planeX = c.aabb.x + c.aabb.width;
|
|
203
|
+
}
|
|
204
|
+
if (planeX !== Number.NEGATIVE_INFINITY) {
|
|
205
|
+
clamped = Math.max(clamped, planeX);
|
|
206
|
+
for (const c of solids) {
|
|
207
|
+
if (!yOverlap(c.aabb)) continue;
|
|
208
|
+
if (Math.abs(c.aabb.x + c.aabb.width - planeX) > PLATFORMER_SKIN) continue;
|
|
209
|
+
report(c, {
|
|
210
|
+
x: 1,
|
|
211
|
+
y: 0
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (clamped !== newX) vx = 0;
|
|
217
|
+
appliedX = clamped - body.x;
|
|
218
|
+
body = {
|
|
219
|
+
...body,
|
|
220
|
+
x: clamped
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// --- Y axis sweep ---
|
|
225
|
+
{
|
|
226
|
+
const dy = intendedY;
|
|
227
|
+
if (dy !== 0) {
|
|
228
|
+
const newY = body.y + dy;
|
|
229
|
+
let clamped = newY;
|
|
230
|
+
const prevBottomY = body.y + body.height;
|
|
231
|
+
const prevTop = body.y;
|
|
232
|
+
const xOverlap = aabb => body.x < aabb.x + aabb.width && body.x + body.width > aabb.x;
|
|
233
|
+
const candidates = cellsInSweptBounds(map, body, {
|
|
234
|
+
x: 0,
|
|
235
|
+
y: dy
|
|
236
|
+
}, collisionLayers);
|
|
237
|
+
const floors = [];
|
|
238
|
+
const ceilings = [];
|
|
239
|
+
for (const c of candidates) {
|
|
240
|
+
const solid = isSolid(c.collision);
|
|
241
|
+
const oneWay = isOneWay(c.collision);
|
|
242
|
+
if (!solid && !oneWay) continue;
|
|
243
|
+
if (!xOverlap(c.aabb)) continue;
|
|
244
|
+
if (dy > 0) {
|
|
245
|
+
// Descending: floor candidate.
|
|
246
|
+
if (oneWay && (dropThrough || prevBottomY > c.aabb.y + ONE_WAY_TOLERANCE)) continue;
|
|
247
|
+
// Swept crossing: started above/on the top and reached past it.
|
|
248
|
+
if (prevBottomY <= c.aabb.y + PLATFORMER_SKIN && newY + body.height >= c.aabb.y) {
|
|
249
|
+
floors.push({
|
|
250
|
+
cell: c
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
// Ascending: only solids block ceilings.
|
|
255
|
+
if (!solid) continue;
|
|
256
|
+
if (prevTop >= c.aabb.y + c.aabb.height - PLATFORMER_SKIN && newY <= c.aabb.y + c.aabb.height) {
|
|
257
|
+
ceilings.push(c);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (dy > 0 && floors.length > 0) {
|
|
262
|
+
// Nearest plane wins; report only tiles touching it.
|
|
263
|
+
let planeY = Number.POSITIVE_INFINITY;
|
|
264
|
+
for (const f of floors) {
|
|
265
|
+
if (f.cell.aabb.y < planeY) planeY = f.cell.aabb.y;
|
|
266
|
+
}
|
|
267
|
+
clamped = Math.min(clamped, planeY - body.height);
|
|
268
|
+
for (const f of floors) {
|
|
269
|
+
if (f.cell.aabb.y !== planeY) continue;
|
|
270
|
+
report(f.cell, {
|
|
271
|
+
x: 0,
|
|
272
|
+
y: -1
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
} else if (dy < 0 && ceilings.length > 0) {
|
|
276
|
+
let planeBottom = Number.NEGATIVE_INFINITY;
|
|
277
|
+
for (const c of ceilings) {
|
|
278
|
+
if (c.aabb.y + c.aabb.height > planeBottom) planeBottom = c.aabb.y + c.aabb.height;
|
|
279
|
+
}
|
|
280
|
+
clamped = Math.max(clamped, planeBottom);
|
|
281
|
+
for (const c of ceilings) {
|
|
282
|
+
if (Math.abs(c.aabb.y + c.aabb.height - planeBottom) > PLATFORMER_SKIN) continue;
|
|
283
|
+
report(c, {
|
|
284
|
+
x: 0,
|
|
285
|
+
y: 1
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (clamped !== newY) vy = 0;
|
|
290
|
+
appliedY = clamped - body.y;
|
|
291
|
+
body = {
|
|
292
|
+
...body,
|
|
293
|
+
y: clamped
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// --- Floor snap ---
|
|
299
|
+
// GS-TILE-03: drop-through suppresses one-way floors without disabling
|
|
300
|
+
// snap onto solid floors.
|
|
301
|
+
{
|
|
302
|
+
const hasFloor = contacts.some(c => c.normal.y === -1);
|
|
303
|
+
if (!hasFloor && vy >= 0 && snapDistance > 0) {
|
|
304
|
+
const probeBottom = body.y + body.height + snapDistance;
|
|
305
|
+
const probe = {
|
|
306
|
+
x: body.x,
|
|
307
|
+
y: body.y + body.height,
|
|
308
|
+
width: body.width,
|
|
309
|
+
height: snapDistance
|
|
310
|
+
};
|
|
311
|
+
const near = cellsInAabb(map, probe, collisionLayers);
|
|
312
|
+
let bestTop = Number.POSITIVE_INFINITY;
|
|
313
|
+
let bestCell;
|
|
314
|
+
for (const c of near) {
|
|
315
|
+
const top = c.aabb.y;
|
|
316
|
+
if (top < body.y + body.height - PLATFORMER_SKIN) continue;
|
|
317
|
+
if (top > probeBottom) continue;
|
|
318
|
+
const ok = isSolid(c.collision) || !dropThrough && isOneWay(c.collision) && prevBottom <= top + ONE_WAY_TOLERANCE;
|
|
319
|
+
if (!ok) continue;
|
|
320
|
+
if (top < bestTop) {
|
|
321
|
+
bestTop = top;
|
|
322
|
+
bestCell = c;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (bestCell !== undefined && bestTop < Number.POSITIVE_INFINITY) {
|
|
326
|
+
const snapDelta = bestTop - body.height - body.y;
|
|
327
|
+
body = {
|
|
328
|
+
...body,
|
|
329
|
+
y: bestTop - body.height
|
|
330
|
+
};
|
|
331
|
+
report(bestCell, {
|
|
332
|
+
x: 0,
|
|
333
|
+
y: -1
|
|
334
|
+
});
|
|
335
|
+
vy = 0;
|
|
336
|
+
appliedY += snapDelta;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
const classified = classify(contacts);
|
|
341
|
+
return Object.freeze({
|
|
342
|
+
body: Object.freeze(body),
|
|
343
|
+
velocity: Object.freeze({
|
|
344
|
+
x: vx,
|
|
345
|
+
y: vy
|
|
346
|
+
}),
|
|
347
|
+
displacement: Object.freeze({
|
|
348
|
+
x: appliedX,
|
|
349
|
+
y: appliedY
|
|
350
|
+
}),
|
|
351
|
+
remainingDisplacement: Object.freeze({
|
|
352
|
+
x: intendedX - appliedX,
|
|
353
|
+
y: intendedY - appliedY
|
|
354
|
+
}),
|
|
355
|
+
contacts: Object.freeze({
|
|
356
|
+
floor: classified.floor,
|
|
357
|
+
ceiling: classified.ceiling,
|
|
358
|
+
leftWall: classified.leftWall,
|
|
359
|
+
rightWall: classified.rightWall,
|
|
360
|
+
all: Object.freeze(contacts)
|
|
361
|
+
})
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
function classify(contacts) {
|
|
365
|
+
let floor;
|
|
366
|
+
let ceiling;
|
|
367
|
+
let leftWall;
|
|
368
|
+
let rightWall;
|
|
369
|
+
for (const c of contacts) {
|
|
370
|
+
if (c.normal.y === -1 && floor === undefined) floor = c;else if (c.normal.y === 1 && ceiling === undefined) ceiling = c;else if (c.normal.x === 1 && leftWall === undefined) leftWall = c;else if (c.normal.x === -1 && rightWall === undefined) rightWall = c;
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
floor,
|
|
374
|
+
ceiling,
|
|
375
|
+
leftWall,
|
|
376
|
+
rightWall
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=movement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["cellsInAabb","cellsInSweptBounds","tileError","assertValidAabb2D","assertValidVector2D","PLATFORMER_MAX_ITERATIONS","PLATFORMER_SKIN","ONE_WAY_TOLERANCE","isSolid","kind","isOneWay","overlaps","a","b","x","width","y","height","movePlatformerBody2D","options","map","deltaSeconds","collisionLayers","body","velocity","vx","vy","Number","isFinite","String","dropThrough","dropThroughOneWay","snapDistance","floorSnapDistance","Array","isArray","layerId","layerById","undefined","JSON","stringify","intendedX","intendedY","contacts","appliedX","appliedY","report","cell","normal","push","Object","freeze","iter","overlapping","filter","c","collision","aabb","length","bestAxis","bestSign","bestDepth","POSITIVE_INFINITY","bestCell","consider","axis","sign","depth","better","pushLeft","pushRight","pushUp","pushDown","Math","abs","stillOverlapping","some","prevBottom","dx","newX","clamped","yOverlap","solids","planeX","min","NEGATIVE_INFINITY","max","dy","newY","prevBottomY","prevTop","xOverlap","candidates","floors","ceilings","solid","oneWay","planeY","f","planeBottom","hasFloor","probeBottom","probe","near","bestTop","top","ok","snapDelta","classified","classify","displacement","remainingDisplacement","floor","ceiling","leftWall","rightWall","all"],"sourceRoot":"../../../src","sources":["tilemap/movement.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { forEachCellInSpan, makeCell } from "./definitions.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Bounded cell queries (T16.2, T16-F6).
|
|
7
|
+
*
|
|
8
|
+
* Deterministic order: layer order (map declaration), then row-major within
|
|
9
|
+
* a layer. Spans are clamped to the finite map before iteration; queries
|
|
10
|
+
* outside the map return an empty frozen array. All reads flow through the
|
|
11
|
+
* private chunk index — each overlapped 16x16 chunk region is fetched once.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
function clampSpan(layer, minCx, minCy, maxCx, maxCy) {
|
|
15
|
+
const x0 = Math.max(0, minCx);
|
|
16
|
+
const y0 = Math.max(0, minCy);
|
|
17
|
+
const x1 = Math.min(layer.width - 1, maxCx);
|
|
18
|
+
const y1 = Math.min(layer.height - 1, maxCy);
|
|
19
|
+
if (x0 > x1 || y0 > y1) return undefined;
|
|
20
|
+
return {
|
|
21
|
+
x0,
|
|
22
|
+
y0,
|
|
23
|
+
x1,
|
|
24
|
+
y1
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function collectSpan(map, layerId, span, out) {
|
|
28
|
+
forEachCellInSpan(map, layerId, span.x0, span.y0, span.x1, span.y1, (cx, cy, id) => {
|
|
29
|
+
out.push(makeCell(map, layerId, cx, cy, id));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** All non-empty cells in the given layers overlapping the point. */
|
|
34
|
+
export function cellsAtPoint(map, point, layerIds) {
|
|
35
|
+
const out = [];
|
|
36
|
+
const cx = Math.floor((point.x - map.origin.x) / map.cellSize.width);
|
|
37
|
+
const cy = Math.floor((point.y - map.origin.y) / map.cellSize.height);
|
|
38
|
+
for (const layer of map.layers) {
|
|
39
|
+
if (layerIds !== undefined && !layerIds.includes(layer.id)) continue;
|
|
40
|
+
const span = clampSpan(layer, cx, cy, cx, cy);
|
|
41
|
+
if (span === undefined) continue;
|
|
42
|
+
collectSpan(map, layer.id, span, out);
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze(out);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** All non-empty cells whose AABBs intersect the query AABB. */
|
|
48
|
+
export function cellsInAabb(map, aabb, layerIds) {
|
|
49
|
+
const out = [];
|
|
50
|
+
const minCx = Math.floor((aabb.x - map.origin.x) / map.cellSize.width);
|
|
51
|
+
const minCy = Math.floor((aabb.y - map.origin.y) / map.cellSize.height);
|
|
52
|
+
// GS-TILE-05: half-open tile areas, exact arithmetic — no shared epsilon.
|
|
53
|
+
// The maximum corner selects ceil(max/cell) - 1, so exact boundaries
|
|
54
|
+
// exclude the next cell and tiny positive extents still select their
|
|
55
|
+
// own. A zero/negative extent is a point query for the cell containing
|
|
56
|
+
// the minimum corner (documented divergence from inclusive contact).
|
|
57
|
+
const maxCx = maxCellIndex(aabb.x, aabb.width, map.origin.x, map.cellSize.width);
|
|
58
|
+
const maxCy = maxCellIndex(aabb.y, aabb.height, map.origin.y, map.cellSize.height);
|
|
59
|
+
for (const layer of map.layers) {
|
|
60
|
+
if (layerIds !== undefined && !layerIds.includes(layer.id)) continue;
|
|
61
|
+
const span = clampSpan(layer, minCx, minCy, maxCx, maxCy);
|
|
62
|
+
if (span === undefined) continue;
|
|
63
|
+
collectSpan(map, layer.id, span, out);
|
|
64
|
+
}
|
|
65
|
+
return Object.freeze(out);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Last cell index covered by the half-open span [min, min + extent).
|
|
70
|
+
* Exact boundaries exclude the next cell; zero/negative extents fall back
|
|
71
|
+
* to the cell containing the minimum corner (point-query semantics).
|
|
72
|
+
*/
|
|
73
|
+
function maxCellIndex(min, extent, origin, cell) {
|
|
74
|
+
if (!(min + extent > min)) {
|
|
75
|
+
return Math.floor((min - origin) / cell);
|
|
76
|
+
}
|
|
77
|
+
return Math.ceil((min + extent - origin) / cell) - 1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Cells overlapped by the swept bounds of a body moving by `displacement`.
|
|
82
|
+
* The swept bounds are the union AABB of start and end positions — bounded,
|
|
83
|
+
* never unbounded even for very large displacements (clamped to the map).
|
|
84
|
+
*/
|
|
85
|
+
export function cellsInSweptBounds(map, body, displacement, layerIds) {
|
|
86
|
+
const minX = Math.min(body.x, body.x + displacement.x);
|
|
87
|
+
const minY = Math.min(body.y, body.y + displacement.y);
|
|
88
|
+
return cellsInAabb(map, {
|
|
89
|
+
x: minX,
|
|
90
|
+
y: minY,
|
|
91
|
+
width: body.width + Math.abs(displacement.x),
|
|
92
|
+
height: body.height + Math.abs(displacement.y)
|
|
93
|
+
}, layerIds);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Non-empty cells inside the visible region (camera bounds + overscan).
|
|
98
|
+
* Same deterministic ordering as `cellsInAabb`.
|
|
99
|
+
*/
|
|
100
|
+
export function visibleCells(map, visibleBounds, overscanCells, layerIds) {
|
|
101
|
+
const out = [];
|
|
102
|
+
const minCx = Math.floor((visibleBounds.x - map.origin.x) / map.cellSize.width) - overscanCells;
|
|
103
|
+
const minCy = Math.floor((visibleBounds.y - map.origin.y) / map.cellSize.height) - overscanCells;
|
|
104
|
+
const maxCx = Math.ceil((visibleBounds.x + visibleBounds.width - map.origin.x) / map.cellSize.width) - 1 + overscanCells;
|
|
105
|
+
const maxCy = Math.ceil((visibleBounds.y + visibleBounds.height - map.origin.y) / map.cellSize.height) - 1 + overscanCells;
|
|
106
|
+
for (const layer of map.layers) {
|
|
107
|
+
if (layerIds !== undefined && !layerIds.includes(layer.id)) continue;
|
|
108
|
+
const span = clampSpan(layer, minCx, minCy, maxCx, maxCy);
|
|
109
|
+
if (span === undefined) continue;
|
|
110
|
+
collectSpan(map, layer.id, span, out);
|
|
111
|
+
}
|
|
112
|
+
return Object.freeze(out);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["forEachCellInSpan","makeCell","clampSpan","layer","minCx","minCy","maxCx","maxCy","x0","Math","max","y0","x1","min","width","y1","height","undefined","collectSpan","map","layerId","span","out","cx","cy","id","push","cellsAtPoint","point","layerIds","floor","x","origin","cellSize","y","layers","includes","Object","freeze","cellsInAabb","aabb","maxCellIndex","extent","cell","ceil","cellsInSweptBounds","body","displacement","minX","minY","abs","visibleCells","visibleBounds","overscanCells"],"sourceRoot":"../../../src","sources":["tilemap/queries.ts"],"mappings":"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","ignoreList":[]}
|