@nayan-ui/games 1.20.0 → 1.21.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/lib/module/games/arrows/Arrows.js +1 -1
- package/lib/module/games/arrows/ArrowsScene.js +1 -1
- package/lib/module/games/balloon-blaster/BalloonBlaster.js +1 -1
- package/lib/module/games/balloon-blaster/BalloonBlasterScene.js +1 -1
- package/lib/module/games/bike-racing/BikeMeshes.js +1 -1
- package/lib/module/games/bike-racing/BikeRacing.js +1 -1
- package/lib/module/games/bike-racing/BikeRacingConstants.js +1 -1
- package/lib/module/games/bike-racing/BikeRacingScene.js +1 -1
- package/lib/module/games/block-blast/BlockBlast.js +1 -1
- package/lib/module/games/block-blast/BlockBlastScene.js +1 -1
- package/lib/module/games/block-breaker/BlockBreaker.js +1 -1
- package/lib/module/games/block-breaker/BlockBreakerScene.js +1 -1
- package/lib/module/games/bluk/Bluk.js +1 -1
- package/lib/module/games/bluk/BlukScene.js +1 -1
- package/lib/module/games/bubble-shooter/BubbleShooter.js +1 -1
- package/lib/module/games/bubble-shooter/BubbleShooterScene.js +1 -1
- package/lib/module/games/candy-crush/CandyCrush.js +1 -1
- package/lib/module/games/candy-crush/CandyCrushScene.js +1 -1
- package/lib/module/games/car-racing/CarMeshes.js +1 -1
- package/lib/module/games/car-racing/CarRacing.js +1 -1
- package/lib/module/games/car-racing/CarRacingScene.js +1 -1
- package/lib/module/games/chameleon-run/ChameleonRun.js +1 -1
- package/lib/module/games/chameleon-run/ChameleonRunBackdrop.js +1 -1
- package/lib/module/games/chameleon-run/ChameleonRunMeshes.js +1 -1
- package/lib/module/games/checkers/Checkers.js +1 -1
- package/lib/module/games/checkers/CheckersScene.js +1 -1
- package/lib/module/games/color-switch/ColorSwitch.js +1 -1
- package/lib/module/games/color-switch/ColorSwitchScene.js +1 -1
- package/lib/module/games/colors-sort/ColorsSort.js +1 -1
- package/lib/module/games/colors-sort/ColorsSortScene.js +1 -1
- package/lib/module/games/connect-em-all/ConnectEmAll.js +1 -1
- package/lib/module/games/connect-em-all/ConnectEmAllScene.js +1 -1
- package/lib/module/games/crossy-road/CrossyRoad.js +1 -1
- package/lib/module/games/crossy-road/CrossyRoadMeshes.js +1 -1
- package/lib/module/games/crossy-road/CrossyRoadPerson.js +1 -1
- package/lib/module/games/dino-jump/DinoJump.js +1 -1
- package/lib/module/games/dino-jump/DinoJumpScene.js +1 -1
- package/lib/module/games/dots-and-boxes/DotsAndBoxes.js +1 -1
- package/lib/module/games/dots-and-boxes/DotsAndBoxesScene.js +1 -1
- package/lib/module/games/falling-sticks/FallingSticks.js +1 -1
- package/lib/module/games/falling-sticks/FallingSticksScene.js +1 -1
- package/lib/module/games/find-different-number/FindDifferentNumber.js +1 -1
- package/lib/module/games/find-different-number/FindDifferentNumberScene.js +1 -1
- package/lib/module/games/flappy-bird/FlappyBird.js +1 -1
- package/lib/module/games/flappy-bird/FlappyBirdScene.js +1 -1
- package/lib/module/games/fruit-merger/FruitMerger.js +1 -1
- package/lib/module/games/fruit-merger/FruitMergerScene.js +1 -1
- package/lib/module/games/fruit-ninja/FruitNinja.js +1 -1
- package/lib/module/games/fruit-ninja/FruitNinjaScene.js +1 -1
- package/lib/module/games/fruit-ninja/FruitNinjaWorld.js +1 -1
- package/lib/module/games/game-2048/Game2048.js +1 -1
- package/lib/module/games/game-2048/Game2048Scene.js +1 -1
- package/lib/module/games/knife-hit/KnifeHit.js +1 -1
- package/lib/module/games/knife-hit/KnifeHitScene.js +1 -1
- package/lib/module/games/ludo-king/LudoKing.js +1 -1
- package/lib/module/games/ludo-king/LudoKingScene.js +1 -1
- package/lib/module/games/maze-runner/MazeRunner.js +1 -1
- package/lib/module/games/maze-runner/MazeRunnerScene.js +1 -1
- package/lib/module/games/memory-match/MemoryMatch.js +1 -1
- package/lib/module/games/memory-match/MemoryMatchScene.js +1 -1
- package/lib/module/games/mine-sweeper/MineSweeper.js +1 -1
- package/lib/module/games/mine-sweeper/MineSweeperScene.js +1 -1
- package/lib/module/games/mob-control/MobControl.js +1 -1
- package/lib/module/games/mob-control/MobControlGame.js +1 -1
- package/lib/module/games/mob-control/MobControlMeshes.js +1 -1
- package/lib/module/games/mob-control/MobControlRenderer.js +1 -1
- package/lib/module/games/mob-control/MobControlRules.js +1 -1
- package/lib/module/games/mob-control/MobControlScene.js +1 -1
- package/lib/module/games/nuts-and-bolts/NutsAndBolts.js +1 -1
- package/lib/module/games/nuts-and-bolts/NutsAndBoltsScene.js +1 -1
- package/lib/module/games/pac-man/PacMan.js +1 -1
- package/lib/module/games/pac-man/PacManGame.js +1 -1
- package/lib/module/games/pac-man/PacManScene.js +1 -1
- package/lib/module/games/paper-io/PaperIo.js +1 -1
- package/lib/module/games/paper-io/PaperIoMeshes.js +1 -1
- package/lib/module/games/paper-io/PaperIoScene.js +1 -1
- package/lib/module/games/penguin-run/PenguinMeshes.js +1 -1
- package/lib/module/games/penguin-run/PenguinRun.js +1 -1
- package/lib/module/games/penguin-run/PenguinRunScene.js +1 -1
- package/lib/module/games/perfect-circle/PerfectCircle.js +1 -1
- package/lib/module/games/perfect-circle/PerfectCircleScene.js +1 -1
- package/lib/module/games/pipe-connect/PipeConnect.js +1 -1
- package/lib/module/games/pipe-connect/PipeConnectScene.js +1 -1
- package/lib/module/games/play-with-tua/PlayWithTua.js +1 -1
- package/lib/module/games/popit-fidget/PopitFidget.js +1 -1
- package/lib/module/games/popit-fidget/PopitFidgetScene.js +1 -1
- package/lib/module/games/reversi/Reversi.js +1 -1
- package/lib/module/games/reversi/ReversiScene.js +1 -1
- package/lib/module/games/search-grid/SearchGrid.js +1 -1
- package/lib/module/games/search-grid/SearchGridScene.js +1 -1
- package/lib/module/games/shared/BackdropCard.js +1 -1
- package/lib/module/games/shared/EngineBackdrop.js +1 -1
- package/lib/module/games/shared/EngineBlasts.js +1 -1
- package/lib/module/games/shared/EngineBlocks.js +1 -1
- package/lib/module/games/shared/EngineDice.js +1 -1
- package/lib/module/games/shared/EngineFruits.js +1 -1
- package/lib/module/games/shared/EngineGameLoader.js +1 -1
- package/lib/module/games/shared/EngineGameScreen.js +1 -1
- package/lib/module/games/shared/EngineGlyphs.js +1 -1
- package/lib/module/games/shared/EngineHud.js +1 -1
- package/lib/module/games/shared/EngineMeadow.js +1 -1
- package/lib/module/games/shared/EngineTouchSurface.js +1 -1
- package/lib/module/games/shared/GameActivity.js +1 -1
- package/lib/module/games/shared/GameLoading.js +1 -1
- package/lib/module/games/shared/GameLoadingTransition.js +1 -1
- package/lib/module/games/sliding-numbers/SlidingNumbers.js +1 -1
- package/lib/module/games/sliding-numbers/SlidingNumbersScene.js +1 -1
- package/lib/module/games/snake-3d/Snake3D.js +1 -1
- package/lib/module/games/snake-3d/Snake3DScene.js +1 -1
- package/lib/module/games/snakes-and-ladders/SnakesAndLadders.js +1 -1
- package/lib/module/games/snakes-and-ladders/SnakesAndLaddersScene.js +1 -1
- package/lib/module/games/space-fighter/SpaceFighter.js +1 -1
- package/lib/module/games/space-fighter/SpaceFighterScene.js +1 -1
- package/lib/module/games/spider-solitaire/SpiderSolitaire.js +1 -1
- package/lib/module/games/spider-solitaire/SpiderSolitaireScene.js +1 -1
- package/lib/module/games/stack-tower/StackTower.js +1 -1
- package/lib/module/games/stack-tower/StackTowerScene.js +1 -1
- package/lib/module/games/sudoku/Sudoku.js +1 -1
- package/lib/module/games/sudoku/SudokuScene.js +1 -1
- package/lib/module/games/tangram/Tangram.js +1 -1
- package/lib/module/games/tangram/TangramScene.js +1 -1
- package/lib/module/games/tank-1990/Tank1990.js +1 -1
- package/lib/module/games/tank-1990/Tank1990Scene.js +1 -1
- package/lib/module/games/tic-tac-toe/TicTacToe.js +1 -1
- package/lib/module/games/tic-tac-toe/TicTacToeScene.js +1 -1
- package/lib/module/games/tile-home/TileHome.js +1 -1
- package/lib/module/games/tile-home/TileHomeScene.js +1 -1
- package/lib/module/games/treasure-hunt/TreasureHunt.js +1 -1
- package/lib/module/games/treasure-hunt/TreasureHuntConstants.js +1 -1
- package/lib/module/games/treasure-hunt/TreasureHuntModel.js +1 -1
- package/lib/module/games/treasure-hunt/TreasureHuntScene.js +1 -1
- package/lib/module/games/whack-a-mole/WhackAMole.js +1 -1
- package/lib/module/games/whack-a-mole/WhackAMoleScene.js +1 -1
- package/lib/module/helpers/GameSettingsModal.js +1 -1
- package/lib/module/helpers/GameTheme.js +1 -1
- package/package.json +1 -2
- package/src/assets/fonts/Inter-SemiBold.ttf +0 -0
- package/src/assets/models/explorer/explorer.glb +0 -0
- package/src/assets/models/explorer/params.json +0 -51
- package/src/assets/models/explorer/source.json +0 -222
- package/src/assets/models/play-with-tua/play-with-tua.glb +0 -0
- package/src/assets/models/play-with-tua/sources.json +0 -141
- package/src/assets/sfx/balloon_pop.wav +0 -0
- package/src/assets/sfx/blocked.wav +0 -0
- package/src/assets/sfx/boing.wav +0 -0
- package/src/assets/sfx/bonus.wav +0 -0
- package/src/assets/sfx/boom.wav +0 -0
- package/src/assets/sfx/bump.wav +0 -0
- package/src/assets/sfx/cannon.wav +0 -0
- package/src/assets/sfx/capture.wav +0 -0
- package/src/assets/sfx/card_flip.wav +0 -0
- package/src/assets/sfx/card_place.wav +0 -0
- package/src/assets/sfx/catch.wav +0 -0
- package/src/assets/sfx/chime.wav +0 -0
- package/src/assets/sfx/chomp.wav +0 -0
- package/src/assets/sfx/chomp_alt.wav +0 -0
- package/src/assets/sfx/clack.wav +0 -0
- package/src/assets/sfx/clang.wav +0 -0
- package/src/assets/sfx/clash.wav +0 -0
- package/src/assets/sfx/click.wav +0 -0
- package/src/assets/sfx/coin.wav +0 -0
- package/src/assets/sfx/combo.wav +0 -0
- package/src/assets/sfx/crash.wav +0 -0
- package/src/assets/sfx/crunch.wav +0 -0
- package/src/assets/sfx/dance.wav +0 -0
- package/src/assets/sfx/deselect.wav +0 -0
- package/src/assets/sfx/dice_roll.wav +0 -0
- package/src/assets/sfx/die.wav +0 -0
- package/src/assets/sfx/draw.wav +0 -0
- package/src/assets/sfx/drop.wav +0 -0
- package/src/assets/sfx/eat.wav +0 -0
- package/src/assets/sfx/engine.wav +0 -0
- package/src/assets/sfx/error.wav +0 -0
- package/src/assets/sfx/flag.wav +0 -0
- package/src/assets/sfx/flap.wav +0 -0
- package/src/assets/sfx/flip_disc.wav +0 -0
- package/src/assets/sfx/footstep_run.wav +0 -0
- package/src/assets/sfx/footstep_walk.wav +0 -0
- package/src/assets/sfx/game_over.wav +0 -0
- package/src/assets/sfx/gate.wav +0 -0
- package/src/assets/sfx/hit.wav +0 -0
- package/src/assets/sfx/hop.wav +0 -0
- package/src/assets/sfx/hurt.wav +0 -0
- package/src/assets/sfx/invalid.wav +0 -0
- package/src/assets/sfx/jump.wav +0 -0
- package/src/assets/sfx/ladder.wav +0 -0
- package/src/assets/sfx/land.wav +0 -0
- package/src/assets/sfx/laugh.wav +0 -0
- package/src/assets/sfx/lose.wav +0 -0
- package/src/assets/sfx/merge.wav +0 -0
- package/src/assets/sfx/miss.wav +0 -0
- package/src/assets/sfx/nitro.wav +0 -0
- package/src/assets/sfx/pew.wav +0 -0
- package/src/assets/sfx/place.wav +0 -0
- package/src/assets/sfx/pling.wav +0 -0
- package/src/assets/sfx/point.wav +0 -0
- package/src/assets/sfx/pop.wav +0 -0
- package/src/assets/sfx/pop_soft.wav +0 -0
- package/src/assets/sfx/power_up.wav +0 -0
- package/src/assets/sfx/reveal.wav +0 -0
- package/src/assets/sfx/robot.wav +0 -0
- package/src/assets/sfx/rotate.wav +0 -0
- package/src/assets/sfx/run_steps.wav +0 -0
- package/src/assets/sfx/select.wav +0 -0
- package/src/assets/sfx/shuffle.wav +0 -0
- package/src/assets/sfx/six.wav +0 -0
- package/src/assets/sfx/slice.wav +0 -0
- package/src/assets/sfx/slide.wav +0 -0
- package/src/assets/sfx/snake.wav +0 -0
- package/src/assets/sfx/snap.wav +0 -0
- package/src/assets/sfx/splash.wav +0 -0
- package/src/assets/sfx/star.wav +0 -0
- package/src/assets/sfx/start.wav +0 -0
- package/src/assets/sfx/swoosh.wav +0 -0
- package/src/assets/sfx/tap.wav +0 -0
- package/src/assets/sfx/thud.wav +0 -0
- package/src/assets/sfx/thunk.wav +0 -0
- package/src/assets/sfx/tick.wav +0 -0
- package/src/assets/sfx/time_up.wav +0 -0
- package/src/assets/sfx/tock.wav +0 -0
- package/src/assets/sfx/walk_steps.wav +0 -0
- package/src/assets/sfx/warning.wav +0 -0
- package/src/assets/sfx/whack.wav +0 -0
- package/src/assets/sfx/whoosh.wav +0 -0
- package/src/assets/sfx/win.wav +0 -0
- package/src/assets/sfx/zap.wav +0 -0
- package/src/assets/textures/ad_bolt.png +0 -0
- package/src/assets/textures/ad_bubbles.png +0 -0
- package/src/assets/textures/ad_chevrons.png +0 -0
- package/src/assets/textures/asphalt.png +0 -0
- package/src/assets/textures/bark.jpg +0 -0
- package/src/assets/textures/explorer-atlas.png +0 -0
- package/src/assets/textures/facade.png +0 -0
- package/src/assets/textures/grass.png +0 -0
- package/src/assets/textures/leaves.png +0 -0
- package/src/assets/textures/limestone.jpg +0 -0
- package/src/assets/textures/meadow.jpg +0 -0
- package/src/assets/textures/nature-sources.json +0 -87
- package/src/assets/textures/pine.png +0 -0
- package/src/assets/textures/river.jpg +0 -0
- package/src/assets/textures/soft_glow.png +0 -0
- package/src/games/arrows/Arrows.tsx +0 -69
- package/src/games/arrows/ArrowsConstants.ts +0 -107
- package/src/games/arrows/ArrowsGame.ts +0 -735
- package/src/games/arrows/ArrowsScene.ts +0 -395
- package/src/games/balloon-blaster/BalloonBlaster.tsx +0 -75
- package/src/games/balloon-blaster/BalloonBlasterConstants.ts +0 -79
- package/src/games/balloon-blaster/BalloonBlasterGame.ts +0 -287
- package/src/games/balloon-blaster/BalloonBlasterPhysics.ts +0 -95
- package/src/games/balloon-blaster/BalloonBlasterScene.ts +0 -225
- package/src/games/bike-racing/BikeMeshes.ts +0 -273
- package/src/games/bike-racing/BikeRacing.tsx +0 -211
- package/src/games/bike-racing/BikeRacingConstants.ts +0 -103
- package/src/games/bike-racing/BikeRacingGame.ts +0 -557
- package/src/games/bike-racing/BikeRacingScene.ts +0 -119
- package/src/games/block-blast/BlockBlast.tsx +0 -73
- package/src/games/block-blast/BlockBlastConstants.ts +0 -179
- package/src/games/block-blast/BlockBlastGame.ts +0 -471
- package/src/games/block-blast/BlockBlastScene.ts +0 -156
- package/src/games/block-breaker/BlockBreaker.tsx +0 -79
- package/src/games/block-breaker/BlockBreakerConstants.ts +0 -139
- package/src/games/block-breaker/BlockBreakerGame.ts +0 -459
- package/src/games/block-breaker/BlockBreakerScene.ts +0 -257
- package/src/games/bluk/Bluk.tsx +0 -82
- package/src/games/bluk/BlukConstants.ts +0 -121
- package/src/games/bluk/BlukGame.ts +0 -323
- package/src/games/bluk/BlukRules.ts +0 -154
- package/src/games/bluk/BlukScene.ts +0 -514
- package/src/games/bubble-shooter/BubbleShooter.tsx +0 -76
- package/src/games/bubble-shooter/BubbleShooterConstants.ts +0 -103
- package/src/games/bubble-shooter/BubbleShooterGame.ts +0 -459
- package/src/games/bubble-shooter/BubbleShooterScene.ts +0 -158
- package/src/games/candy-crush/CandyCrush.tsx +0 -77
- package/src/games/candy-crush/CandyCrushConstants.ts +0 -94
- package/src/games/candy-crush/CandyCrushGame.ts +0 -477
- package/src/games/candy-crush/CandyCrushScene.ts +0 -209
- package/src/games/car-racing/CarMeshes.ts +0 -440
- package/src/games/car-racing/CarRacing.tsx +0 -211
- package/src/games/car-racing/CarRacingConstants.ts +0 -167
- package/src/games/car-racing/CarRacingFacade.ts +0 -40
- package/src/games/car-racing/CarRacingGame.ts +0 -539
- package/src/games/car-racing/CarRacingScene.ts +0 -1026
- package/src/games/car-racing/CarRacingScenery.ts +0 -265
- package/src/games/chameleon-run/ChameleonRun.tsx +0 -96
- package/src/games/chameleon-run/ChameleonRunBackdrop.ts +0 -186
- package/src/games/chameleon-run/ChameleonRunConstants.ts +0 -47
- package/src/games/chameleon-run/ChameleonRunGame.ts +0 -309
- package/src/games/chameleon-run/ChameleonRunMeshes.ts +0 -305
- package/src/games/chameleon-run/ChameleonRunRules.ts +0 -252
- package/src/games/chameleon-run/ChameleonRunScene.ts +0 -310
- package/src/games/checkers/Checkers.tsx +0 -83
- package/src/games/checkers/CheckersAI.ts +0 -255
- package/src/games/checkers/CheckersConstants.ts +0 -68
- package/src/games/checkers/CheckersGame.ts +0 -322
- package/src/games/checkers/CheckersRules.ts +0 -167
- package/src/games/checkers/CheckersScene.ts +0 -308
- package/src/games/color-switch/ColorSwitch.tsx +0 -75
- package/src/games/color-switch/ColorSwitchConstants.ts +0 -61
- package/src/games/color-switch/ColorSwitchGame.ts +0 -329
- package/src/games/color-switch/ColorSwitchScene.ts +0 -220
- package/src/games/colors-sort/ColorsSort.tsx +0 -82
- package/src/games/colors-sort/ColorsSortConstants.ts +0 -119
- package/src/games/colors-sort/ColorsSortGame.ts +0 -246
- package/src/games/colors-sort/ColorsSortScene.ts +0 -315
- package/src/games/connect-em-all/ConnectEmAll.tsx +0 -70
- package/src/games/connect-em-all/ConnectEmAllConstants.ts +0 -77
- package/src/games/connect-em-all/ConnectEmAllGame.ts +0 -401
- package/src/games/connect-em-all/ConnectEmAllScene.ts +0 -235
- package/src/games/crossy-road/CrossyRoad.tsx +0 -74
- package/src/games/crossy-road/CrossyRoadCamera.ts +0 -59
- package/src/games/crossy-road/CrossyRoadConstants.ts +0 -132
- package/src/games/crossy-road/CrossyRoadGame.ts +0 -293
- package/src/games/crossy-road/CrossyRoadMeshes.ts +0 -195
- package/src/games/crossy-road/CrossyRoadPerson.ts +0 -198
- package/src/games/crossy-road/CrossyRoadRules.ts +0 -99
- package/src/games/crossy-road/CrossyRoadScene.ts +0 -355
- package/src/games/dino-jump/DinoJump.tsx +0 -77
- package/src/games/dino-jump/DinoJumpConstants.ts +0 -80
- package/src/games/dino-jump/DinoJumpGame.ts +0 -344
- package/src/games/dino-jump/DinoJumpScene.ts +0 -686
- package/src/games/dots-and-boxes/DotsAndBoxes.tsx +0 -83
- package/src/games/dots-and-boxes/DotsAndBoxesConstants.ts +0 -77
- package/src/games/dots-and-boxes/DotsAndBoxesGame.ts +0 -271
- package/src/games/dots-and-boxes/DotsAndBoxesScene.ts +0 -249
- package/src/games/falling-sticks/FallingSticks.tsx +0 -72
- package/src/games/falling-sticks/FallingSticksConstants.ts +0 -62
- package/src/games/falling-sticks/FallingSticksGame.ts +0 -220
- package/src/games/falling-sticks/FallingSticksRules.ts +0 -145
- package/src/games/falling-sticks/FallingSticksScene.ts +0 -245
- package/src/games/find-different-number/FindDifferentNumber.tsx +0 -74
- package/src/games/find-different-number/FindDifferentNumberConstants.ts +0 -74
- package/src/games/find-different-number/FindDifferentNumberGame.ts +0 -174
- package/src/games/find-different-number/FindDifferentNumberRules.ts +0 -43
- package/src/games/find-different-number/FindDifferentNumberScene.ts +0 -193
- package/src/games/flappy-bird/FlappyBird.tsx +0 -73
- package/src/games/flappy-bird/FlappyBirdConstants.ts +0 -95
- package/src/games/flappy-bird/FlappyBirdGame.ts +0 -375
- package/src/games/flappy-bird/FlappyBirdScene.ts +0 -630
- package/src/games/fruit-merger/FruitMerger.tsx +0 -73
- package/src/games/fruit-merger/FruitMergerConstants.ts +0 -102
- package/src/games/fruit-merger/FruitMergerGame.ts +0 -285
- package/src/games/fruit-merger/FruitMergerRules.ts +0 -286
- package/src/games/fruit-merger/FruitMergerScene.ts +0 -498
- package/src/games/fruit-ninja/FruitNinja.tsx +0 -129
- package/src/games/fruit-ninja/FruitNinjaConstants.ts +0 -107
- package/src/games/fruit-ninja/FruitNinjaGame.ts +0 -391
- package/src/games/fruit-ninja/FruitNinjaScene.ts +0 -319
- package/src/games/fruit-ninja/FruitNinjaWorld.ts +0 -17
- package/src/games/game-2048/Game2048.tsx +0 -84
- package/src/games/game-2048/Game2048Constants.ts +0 -68
- package/src/games/game-2048/Game2048Game.ts +0 -181
- package/src/games/game-2048/Game2048Rules.ts +0 -101
- package/src/games/game-2048/Game2048Scene.ts +0 -206
- package/src/games/knife-hit/KnifeHit.tsx +0 -78
- package/src/games/knife-hit/KnifeHitConstants.ts +0 -89
- package/src/games/knife-hit/KnifeHitGame.ts +0 -264
- package/src/games/knife-hit/KnifeHitScene.ts +0 -360
- package/src/games/ludo-king/LudoKing.tsx +0 -86
- package/src/games/ludo-king/LudoKingConstants.ts +0 -212
- package/src/games/ludo-king/LudoKingGame.ts +0 -326
- package/src/games/ludo-king/LudoKingRules.ts +0 -143
- package/src/games/ludo-king/LudoKingScene.ts +0 -397
- package/src/games/maze-runner/MazeRunner.tsx +0 -88
- package/src/games/maze-runner/MazeRunnerConstants.ts +0 -65
- package/src/games/maze-runner/MazeRunnerGame.ts +0 -176
- package/src/games/maze-runner/MazeRunnerRules.ts +0 -161
- package/src/games/maze-runner/MazeRunnerScene.ts +0 -245
- package/src/games/memory-match/MemoryMatch.tsx +0 -77
- package/src/games/memory-match/MemoryMatchConstants.ts +0 -105
- package/src/games/memory-match/MemoryMatchGame.ts +0 -222
- package/src/games/memory-match/MemoryMatchRules.ts +0 -38
- package/src/games/memory-match/MemoryMatchScene.ts +0 -268
- package/src/games/mine-sweeper/MineSweeper.tsx +0 -77
- package/src/games/mine-sweeper/MineSweeperConstants.ts +0 -94
- package/src/games/mine-sweeper/MineSweeperGame.ts +0 -234
- package/src/games/mine-sweeper/MineSweeperRules.ts +0 -67
- package/src/games/mine-sweeper/MineSweeperScene.ts +0 -262
- package/src/games/mob-control/MobControl.tsx +0 -73
- package/src/games/mob-control/MobControlConstants.ts +0 -106
- package/src/games/mob-control/MobControlGame.ts +0 -176
- package/src/games/mob-control/MobControlMeshes.ts +0 -85
- package/src/games/mob-control/MobControlRenderer.ts +0 -108
- package/src/games/mob-control/MobControlRules.ts +0 -522
- package/src/games/mob-control/MobControlScene.ts +0 -399
- package/src/games/number-search/NumberSearch.tsx +0 -18
- package/src/games/number-search/NumberSearchNumbers.ts +0 -623
- package/src/games/nuts-and-bolts/NutsAndBolts.tsx +0 -85
- package/src/games/nuts-and-bolts/NutsAndBoltsConstants.ts +0 -75
- package/src/games/nuts-and-bolts/NutsAndBoltsGame.ts +0 -298
- package/src/games/nuts-and-bolts/NutsAndBoltsRules.ts +0 -474
- package/src/games/nuts-and-bolts/NutsAndBoltsScene.ts +0 -498
- package/src/games/pac-man/PacMan.tsx +0 -86
- package/src/games/pac-man/PacManConstants.ts +0 -169
- package/src/games/pac-man/PacManGame.ts +0 -406
- package/src/games/pac-man/PacManRules.ts +0 -255
- package/src/games/pac-man/PacManScene.ts +0 -387
- package/src/games/paper-io/PaperIo.tsx +0 -91
- package/src/games/paper-io/PaperIoConstants.ts +0 -86
- package/src/games/paper-io/PaperIoGame.ts +0 -193
- package/src/games/paper-io/PaperIoMeshes.ts +0 -233
- package/src/games/paper-io/PaperIoRules.ts +0 -315
- package/src/games/paper-io/PaperIoScene.ts +0 -310
- package/src/games/penguin-run/PenguinMeshes.ts +0 -269
- package/src/games/penguin-run/PenguinModel.ts +0 -712
- package/src/games/penguin-run/PenguinRun.tsx +0 -77
- package/src/games/penguin-run/PenguinRunConstants.ts +0 -69
- package/src/games/penguin-run/PenguinRunGame.ts +0 -406
- package/src/games/penguin-run/PenguinRunScene.ts +0 -949
- package/src/games/perfect-circle/PerfectCircle.tsx +0 -74
- package/src/games/perfect-circle/PerfectCircleConstants.ts +0 -52
- package/src/games/perfect-circle/PerfectCircleGame.ts +0 -153
- package/src/games/perfect-circle/PerfectCircleRules.ts +0 -111
- package/src/games/perfect-circle/PerfectCircleScene.ts +0 -176
- package/src/games/pipe-connect/PipeConnect.tsx +0 -69
- package/src/games/pipe-connect/PipeConnectConstants.ts +0 -101
- package/src/games/pipe-connect/PipeConnectGame.ts +0 -179
- package/src/games/pipe-connect/PipeConnectRules.ts +0 -326
- package/src/games/pipe-connect/PipeConnectScene.ts +0 -271
- package/src/games/play-with-tua/PlayWithTua.tsx +0 -123
- package/src/games/play-with-tua/PlayWithTuaConstants.ts +0 -70
- package/src/games/play-with-tua/PlayWithTuaGame.ts +0 -167
- package/src/games/play-with-tua/PlayWithTuaModel.ts +0 -42
- package/src/games/play-with-tua/PlayWithTuaScene.ts +0 -36
- package/src/games/popit-fidget/PopitFidget.tsx +0 -72
- package/src/games/popit-fidget/PopitFidgetConstants.ts +0 -71
- package/src/games/popit-fidget/PopitFidgetGame.ts +0 -148
- package/src/games/popit-fidget/PopitFidgetScene.ts +0 -242
- package/src/games/reversi/Reversi.tsx +0 -94
- package/src/games/reversi/ReversiConstants.ts +0 -67
- package/src/games/reversi/ReversiGame.ts +0 -266
- package/src/games/reversi/ReversiRules.ts +0 -176
- package/src/games/reversi/ReversiScene.ts +0 -240
- package/src/games/search-grid/SearchGrid.tsx +0 -92
- package/src/games/search-grid/SearchGridConstants.ts +0 -178
- package/src/games/search-grid/SearchGridGame.ts +0 -209
- package/src/games/search-grid/SearchGridScene.ts +0 -301
- package/src/games/shared/BackdropCard.tsx +0 -54
- package/src/games/shared/EngineBackdrop.ts +0 -300
- package/src/games/shared/EngineBlasts.ts +0 -136
- package/src/games/shared/EngineBlocks.ts +0 -91
- package/src/games/shared/EngineControlText.ts +0 -17
- package/src/games/shared/EngineDice.ts +0 -250
- package/src/games/shared/EngineFootprint.ts +0 -35
- package/src/games/shared/EngineFruits.ts +0 -1435
- package/src/games/shared/EngineGameLoader.tsx +0 -88
- package/src/games/shared/EngineGameScreen.tsx +0 -325
- package/src/games/shared/EngineGameWidth.ts +0 -3
- package/src/games/shared/EngineGameWidth.web.ts +0 -3
- package/src/games/shared/EngineGlyphs.ts +0 -178
- package/src/games/shared/EngineHud.ts +0 -815
- package/src/games/shared/EngineLoading.ts +0 -477
- package/src/games/shared/EngineMeadow.ts +0 -725
- package/src/games/shared/EngineMeshCache.ts +0 -15
- package/src/games/shared/EngineMeshes.ts +0 -10
- package/src/games/shared/EngineRacingChase.ts +0 -21
- package/src/games/shared/EngineRacingHandling.ts +0 -48
- package/src/games/shared/EngineReadyContext.ts +0 -4
- package/src/games/shared/EngineTilt.ts +0 -44
- package/src/games/shared/EngineTouchSurface.tsx +0 -103
- package/src/games/shared/EngineUtils.ts +0 -52
- package/src/games/shared/GameActivity.ts +0 -13
- package/src/games/shared/GameLoading.tsx +0 -202
- package/src/games/shared/GameLoadingTransition.tsx +0 -61
- package/src/games/shared/ProceduralCacheVersion.ts +0 -2
- package/src/games/shared/useEngineGame.ts +0 -240
- package/src/games/shared/useGameResource.ts +0 -21
- package/src/games/shared/useLiveState.ts +0 -58
- package/src/games/sliding-numbers/SlidingNumbers.tsx +0 -71
- package/src/games/sliding-numbers/SlidingNumbersConstants.ts +0 -65
- package/src/games/sliding-numbers/SlidingNumbersGame.ts +0 -192
- package/src/games/sliding-numbers/SlidingNumbersRules.ts +0 -79
- package/src/games/sliding-numbers/SlidingNumbersScene.ts +0 -193
- package/src/games/snake-3d/Snake3D.tsx +0 -76
- package/src/games/snake-3d/Snake3DConstants.ts +0 -61
- package/src/games/snake-3d/Snake3DGame.ts +0 -192
- package/src/games/snake-3d/Snake3DMotion.ts +0 -22
- package/src/games/snake-3d/Snake3DRules.ts +0 -116
- package/src/games/snake-3d/Snake3DScene.ts +0 -322
- package/src/games/snakes-and-ladders/SnakesAndLadders.tsx +0 -87
- package/src/games/snakes-and-ladders/SnakesAndLaddersConstants.ts +0 -136
- package/src/games/snakes-and-ladders/SnakesAndLaddersGame.ts +0 -310
- package/src/games/snakes-and-ladders/SnakesAndLaddersScene.ts +0 -515
- package/src/games/space-fighter/SpaceFighter.tsx +0 -74
- package/src/games/space-fighter/SpaceFighterConstants.ts +0 -86
- package/src/games/space-fighter/SpaceFighterGame.ts +0 -292
- package/src/games/space-fighter/SpaceFighterScene.ts +0 -550
- package/src/games/spider-solitaire/SpiderSolitaire.tsx +0 -80
- package/src/games/spider-solitaire/SpiderSolitaireConstants.ts +0 -107
- package/src/games/spider-solitaire/SpiderSolitaireGame.ts +0 -387
- package/src/games/spider-solitaire/SpiderSolitaireRules.ts +0 -123
- package/src/games/spider-solitaire/SpiderSolitaireScene.ts +0 -352
- package/src/games/stack-tower/StackTower.tsx +0 -76
- package/src/games/stack-tower/StackTowerConstants.ts +0 -74
- package/src/games/stack-tower/StackTowerGame.ts +0 -236
- package/src/games/stack-tower/StackTowerScene.ts +0 -186
- package/src/games/sudoku/Sudoku.tsx +0 -73
- package/src/games/sudoku/SudokuConstants.ts +0 -127
- package/src/games/sudoku/SudokuGame.ts +0 -250
- package/src/games/sudoku/SudokuRules.ts +0 -125
- package/src/games/sudoku/SudokuScene.ts +0 -304
- package/src/games/tangram/Tangram.tsx +0 -79
- package/src/games/tangram/TangramConstants.ts +0 -64
- package/src/games/tangram/TangramGame.ts +0 -356
- package/src/games/tangram/TangramRules.ts +0 -409
- package/src/games/tangram/TangramScene.ts +0 -203
- package/src/games/tank-1990/Tank1990.tsx +0 -78
- package/src/games/tank-1990/Tank1990Constants.ts +0 -81
- package/src/games/tank-1990/Tank1990Game.ts +0 -331
- package/src/games/tank-1990/Tank1990Rules.ts +0 -390
- package/src/games/tank-1990/Tank1990Scene.ts +0 -434
- package/src/games/tic-tac-toe/TicTacToe.tsx +0 -98
- package/src/games/tic-tac-toe/TicTacToeConstants.ts +0 -69
- package/src/games/tic-tac-toe/TicTacToeGame.ts +0 -200
- package/src/games/tic-tac-toe/TicTacToeRules.ts +0 -103
- package/src/games/tic-tac-toe/TicTacToeScene.ts +0 -245
- package/src/games/tile-home/TileHome.tsx +0 -92
- package/src/games/tile-home/TileHomeConstants.ts +0 -139
- package/src/games/tile-home/TileHomeGame.ts +0 -435
- package/src/games/tile-home/TileHomeScene.ts +0 -154
- package/src/games/treasure-hunt/TreasureHunt.tsx +0 -206
- package/src/games/treasure-hunt/TreasureHuntConstants.ts +0 -266
- package/src/games/treasure-hunt/TreasureHuntControls.ts +0 -280
- package/src/games/treasure-hunt/TreasureHuntGame.ts +0 -402
- package/src/games/treasure-hunt/TreasureHuntMeshes.ts +0 -422
- package/src/games/treasure-hunt/TreasureHuntModel.ts +0 -506
- package/src/games/treasure-hunt/TreasureHuntRules.ts +0 -1210
- package/src/games/treasure-hunt/TreasureHuntScene.ts +0 -586
- package/src/games/whack-a-mole/WhackAMole.tsx +0 -79
- package/src/games/whack-a-mole/WhackAMoleConstants.ts +0 -94
- package/src/games/whack-a-mole/WhackAMoleGame.ts +0 -233
- package/src/games/whack-a-mole/WhackAMoleScene.ts +0 -349
- package/src/games/word-search/WordSearch.tsx +0 -18
- package/src/games/word-search/WordSearchWords.ts +0 -1642
- package/src/helpers/GamePatternData.ts +0 -120
- package/src/helpers/GameSettingsModal.tsx +0 -384
- package/src/helpers/GameTheme.tsx +0 -37
- package/src/helpers/IconPaths.ts +0 -6
- package/src/helpers/index.ts +0 -2
- package/src/index.tsx +0 -60
- package/src/services/GameAssetLoader.ts +0 -111
- package/src/services/GameAssets.ts +0 -149
- package/src/services/GameLoaders.ts +0 -93
- package/src/services/GamesConstants.ts +0 -193
- package/src/services/GamesMetadata.ts +0 -711
- package/src/services/GamesService.ts +0 -116
- package/src/services/HapticsService.ts +0 -48
- package/src/services/ScoringService.ts +0 -19
- package/src/services/SfxSources.ts +0 -81
- package/src/services/SoundsService.ts +0 -582
- package/src/services/ThemeService.ts +0 -281
- package/src/services/UtilsService.ts +0 -134
- package/src/services/index.ts +0 -6
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// Crossy Road's rules, with no React or engine: the fixed board (its lanes and the traffic on each road),
|
|
2
|
-
// the traffic's motion (wrapping round the full width), forgiving swept hop hitboxes, and progress.
|
|
3
|
-
import { CAR_SPEED_MAX, CAR_SPEED_MIN, COLORS, COLS, colX, GOAL_ROW, LANE_TYPES, type Layout, speedScale } from './CrossyRoadConstants';
|
|
4
|
-
import type { VehicleStyle } from './CrossyRoadMeshes';
|
|
5
|
-
|
|
6
|
-
export type Vehicle = { id: number; row: number; x: number; width: number; speed: number; colorIndex: number; style: VehicleStyle };
|
|
7
|
-
|
|
8
|
-
const rnd = (min: number, max: number) => min + Math.random() * (max - min);
|
|
9
|
-
|
|
10
|
-
/** Every road's traffic: one bus (sometimes two) or two cars (sometimes three), evenly spaced, all one way. */
|
|
11
|
-
export function buildTraffic(l: Layout, firstId = 0): Vehicle[] {
|
|
12
|
-
const out: Vehicle[] = [];
|
|
13
|
-
let id = firstId;
|
|
14
|
-
let paints: number[] = [];
|
|
15
|
-
let lastPaint = -1;
|
|
16
|
-
const nextPaint = () => {
|
|
17
|
-
if (!paints.length) {
|
|
18
|
-
paints = COLORS.CAR_COLORS.map((_, index) => index);
|
|
19
|
-
for (let i = paints.length - 1; i > 0; i--) {
|
|
20
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
21
|
-
[paints[i], paints[j]] = [paints[j]!, paints[i]!];
|
|
22
|
-
}
|
|
23
|
-
if (paints[paints.length - 1] === lastPaint) [paints[0], paints[paints.length - 1]] = [paints[paints.length - 1]!, paints[0]!];
|
|
24
|
-
}
|
|
25
|
-
lastPaint = paints.pop()!;
|
|
26
|
-
return lastPaint;
|
|
27
|
-
};
|
|
28
|
-
LANE_TYPES.forEach((type, row) => {
|
|
29
|
-
if (type !== 'road') return;
|
|
30
|
-
const dir = Math.random() < 0.5 ? 1 : -1;
|
|
31
|
-
const bus = Math.random() < 0.35;
|
|
32
|
-
const style: VehicleStyle = bus ? 'bus' : (['compact', 'taxi', 'pickup'] as const)[Math.floor(Math.random() * 3)]!;
|
|
33
|
-
const speed = rnd(CAR_SPEED_MIN, CAR_SPEED_MAX) * (bus ? 0.8 : 1) * dir;
|
|
34
|
-
const count = (bus ? 1 : 2) + (Math.random() < 0.3 ? 1 : 0);
|
|
35
|
-
const width = l.tile * { compact: 1.4, taxi: 1.5, pickup: 1.7, bus: 2.4 }[style];
|
|
36
|
-
const spacing = l.width / count + width;
|
|
37
|
-
const startOffset = rnd(0, spacing);
|
|
38
|
-
for (let i = 0; i < count; i++) out.push({ id: id++, row, x: -width + startOffset + i * spacing, width, speed, colorIndex: nextPaint(), style });
|
|
39
|
-
});
|
|
40
|
-
return out;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** One 60 Hz frame of traffic, wrapping off one side onto the other. */
|
|
44
|
-
export function moveTraffic(l: Layout, vs: Vehicle[], scale: number) {
|
|
45
|
-
const pad = l.tile * 2;
|
|
46
|
-
for (const v of vs) {
|
|
47
|
-
let x = v.x + v.speed * scale;
|
|
48
|
-
const margin = v.width + pad;
|
|
49
|
-
if (v.speed > 0 && x - v.width / 2 > l.width + margin) x = -margin - v.width / 2;
|
|
50
|
-
else if (v.speed < 0 && x + v.width / 2 < -margin) x = l.width + margin + v.width / 2;
|
|
51
|
-
v.x = x;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** Whether traffic overlaps the pedestrian, including fractional rows while a step is in progress. */
|
|
56
|
-
export function hit(l: Layout, vs: Vehicle[], row: number, x: number) {
|
|
57
|
-
const half = l.tile * 0.4 * 0.65;
|
|
58
|
-
return vs.some((v) => Math.abs(v.row - row) * l.laneH < l.tile * 0.53 && Math.abs(v.x - x) < v.width / 2 + half);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** The player: its lane and column, the furthest lane it's reached, and the roads crossed. */
|
|
62
|
-
export type Player = { row: number; col: number; maxRow: number; crossings: number };
|
|
63
|
-
export const startPlayer = (): Player => ({ row: 0, col: Math.floor(COLS / 2), maxRow: 0, crossings: 0 });
|
|
64
|
-
|
|
65
|
-
/** A hop's outcome: whether it moved, whether it crossed a road, whether it reached the goal. */
|
|
66
|
-
export type Hop = { moved: boolean; crossed: boolean; goal: boolean };
|
|
67
|
-
const NO_HOP: Hop = { moved: false, crossed: false, goal: false };
|
|
68
|
-
|
|
69
|
-
export function hopForward(p: Player): Hop {
|
|
70
|
-
const prev = p.row;
|
|
71
|
-
const row = Math.min(prev + 1, GOAL_ROW);
|
|
72
|
-
if (row === prev) return NO_HOP;
|
|
73
|
-
p.row = row;
|
|
74
|
-
let crossed = false;
|
|
75
|
-
if (row > p.maxRow) {
|
|
76
|
-
p.maxRow = row;
|
|
77
|
-
if (LANE_TYPES[prev] === 'road') {
|
|
78
|
-
p.crossings++;
|
|
79
|
-
crossed = true;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return { moved: true, crossed, goal: row === GOAL_ROW };
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export function hopBack(p: Player): Hop {
|
|
86
|
-
if (p.row <= 0) return NO_HOP;
|
|
87
|
-
p.row -= 1;
|
|
88
|
-
return { moved: true, crossed: false, goal: false };
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function hopSide(p: Player, dir: -1 | 1): Hop {
|
|
92
|
-
const col = p.col + dir;
|
|
93
|
-
if (col < 0 || col >= COLS) return NO_HOP;
|
|
94
|
-
p.col = col;
|
|
95
|
-
return { moved: true, crossed: false, goal: false };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export const playerX = (l: Layout, p: Player) => colX(l, p.col);
|
|
99
|
-
export const scaleFor = (p: Player) => speedScale(p.crossings);
|
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { type Color, effects, type Entity, type Quat, quat, type Vec3, type World } from '@nayan-ui/engine';
|
|
2
|
-
// Crossy Road's own low-poly world: blocky vehicles, faceted trees, bright grass and clean asphalt.
|
|
3
|
-
// Everything is code-built and cached; the scene has no racing-game models or texture downloads.
|
|
4
|
-
// The rules use points; a shared root scales them into compact world units for the camera.
|
|
5
|
-
import { toColor } from '../shared/EngineUtils';
|
|
6
|
-
import { COLORS, COLS, colX, LANE_TYPES, type Layout, MOVE_TIME, PERSON, TOTAL_LANES, WORLD_SCALE } from './CrossyRoadConstants';
|
|
7
|
-
import type { CrossyMeshes } from './CrossyRoadMeshes';
|
|
8
|
-
import { pedestrianMeshes } from './CrossyRoadPerson';
|
|
9
|
-
import type { Vehicle } from './CrossyRoadRules';
|
|
10
|
-
|
|
11
|
-
const GROUND_DEPTH = 8;
|
|
12
|
-
const ROAD_DROP = 1.6; // roads sit this far below the grass
|
|
13
|
-
const FACE_RIGHT: Quat = [0, 0, 0, 1];
|
|
14
|
-
const FACE_LEFT = quat.z(Math.PI);
|
|
15
|
-
const STAND_UP = quat.x(Math.PI / 2); // a y-up model stood up off the board (z up)
|
|
16
|
-
const k = WORLD_SCALE;
|
|
17
|
-
/** A point in the scene (view points) as a world point, for bursts (which are in world space). */
|
|
18
|
-
const world3 = (p: Vec3): Vec3 => [p[0] * k, p[1] * k, p[2] * k];
|
|
19
|
-
|
|
20
|
-
/** A deterministic pseudo-random number in [0, 1) (decorations never shift between builds), as the original board's. */
|
|
21
|
-
const seeded = (n: number) => {
|
|
22
|
-
const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;
|
|
23
|
-
return x - Math.floor(x);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/** A color, a little lighter or darker (the night's moonlight dims the whole scene). */
|
|
27
|
-
const shade = (css: string, _night: boolean, f = 1): Color => {
|
|
28
|
-
const [r, g, b, a] = toColor(css);
|
|
29
|
-
return [r * f, g * f, b * f, a ?? 1];
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/** A lane's centre (world y) and its surface height. */
|
|
33
|
-
export const laneY = (l: Layout, row: number) => (row - (TOTAL_LANES - 1) / 2) * l.laneH;
|
|
34
|
-
export const laneTop = (row: number) => (LANE_TYPES[Math.round(row)] === 'road' ? -ROAD_DROP : 0);
|
|
35
|
-
/** A view x on the board as world x. */
|
|
36
|
-
export const worldX = (l: Layout, x: number) => x - l.width / 2;
|
|
37
|
-
|
|
38
|
-
export type Scene = {
|
|
39
|
-
/** Everything hangs off this root, scaled to the world. */
|
|
40
|
-
root: Entity;
|
|
41
|
-
ground: Entity[];
|
|
42
|
-
vehicles: Map<number, Entity>;
|
|
43
|
-
player: { root: Entity; body: Entity; arms: [Entity, Entity]; legs: [Entity, Entity]; feet: [Entity, Entity] };
|
|
44
|
-
night: boolean;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// ── The ground ────────────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
function spawnGround(world: World, l: Layout, a: CrossyMeshes, night: boolean, root: Entity): Entity[] {
|
|
50
|
-
const out: Entity[] = [];
|
|
51
|
-
const add = (o: Parameters<World['spawn']>[0]) => out.push(world.spawn({ pickable: false, parent: root, ...o }));
|
|
52
|
-
// Wider than the view ever shows, past where the traffic wraps round
|
|
53
|
-
const cols = Math.ceil((l.width + l.tile * 12) / l.tile / 2) * 2;
|
|
54
|
-
const span = cols * l.tile;
|
|
55
|
-
const boardH = TOTAL_LANES * l.laneH;
|
|
56
|
-
// Grass all round the board, its top below the sunken roads (so it never covers them)
|
|
57
|
-
add({
|
|
58
|
-
mesh: 'cube',
|
|
59
|
-
position: [0, 0, -ROAD_DROP - 0.6 - GROUND_DEPTH / 2],
|
|
60
|
-
scale: [span * 3, boardH * 4, GROUND_DEPTH],
|
|
61
|
-
color: shade(COLORS.GRASS_DARK, night, 0.9)
|
|
62
|
-
});
|
|
63
|
-
const xAt = (c: number) => -span / 2 + c * l.tile + l.tile / 2;
|
|
64
|
-
for (let row = 0; row < TOTAL_LANES; row++) {
|
|
65
|
-
const y = laneY(l, row);
|
|
66
|
-
if (LANE_TYPES[row] === 'road') {
|
|
67
|
-
// Broad asphalt panels, with subtle color variation instead of image textures
|
|
68
|
-
for (let c = 0; c < cols; c += 2)
|
|
69
|
-
add({
|
|
70
|
-
mesh: 'cube',
|
|
71
|
-
position: [xAt(c) + l.tile / 2, y, -ROAD_DROP - GROUND_DEPTH / 2],
|
|
72
|
-
scale: [l.tile * 2 + 0.2, l.laneH, GROUND_DEPTH],
|
|
73
|
-
color: shade(COLORS.ROAD, night, 0.96 + seeded(row * 3.1 + c) * 0.06)
|
|
74
|
-
});
|
|
75
|
-
// Solid white edge lines, and the dashed centre line
|
|
76
|
-
for (const e of [-1, 1])
|
|
77
|
-
add({
|
|
78
|
-
mesh: 'cube',
|
|
79
|
-
position: [0, y + e * (l.laneH / 2 - 3), -ROAD_DROP + 0.05],
|
|
80
|
-
scale: [span, 1.6, 0.1],
|
|
81
|
-
color: shade(COLORS.LINE, night, 0.9)
|
|
82
|
-
});
|
|
83
|
-
for (let c = 0; c < cols; c++)
|
|
84
|
-
add({ mesh: 'cube', position: [xAt(c), y, -ROAD_DROP + 0.06], scale: [l.tile * 0.45, 1.8, 0.12], color: shade(COLORS.LINE, night, 0.85) });
|
|
85
|
-
// Concrete curbs where it meets grass, standing a little proud of the grass
|
|
86
|
-
for (const e of [-1, 1]) {
|
|
87
|
-
if (LANE_TYPES[row + e] !== 'grass') continue;
|
|
88
|
-
add({
|
|
89
|
-
mesh: 'cube',
|
|
90
|
-
position: [0, y + e * (l.laneH / 2 - 0.4), (0.9 - ROAD_DROP) / 2],
|
|
91
|
-
scale: [span, 3.6, ROAD_DROP + 0.9],
|
|
92
|
-
color: shade(COLORS.CURB, night)
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
// Grass, two tiles at a time, the lanes in two shades and a little variation along them
|
|
98
|
-
const base = row % 2 === 0 ? COLORS.GRASS_LIGHT : COLORS.GRASS_DARK;
|
|
99
|
-
for (let c = 0; c < cols; c += 2)
|
|
100
|
-
add({
|
|
101
|
-
mesh: 'cube',
|
|
102
|
-
position: [xAt(c) + l.tile / 2, y, -GROUND_DEPTH / 2],
|
|
103
|
-
scale: [l.tile * 2 + 0.2, l.laneH, GROUND_DEPTH],
|
|
104
|
-
color: shade(base, night, 0.95 + seeded(row * 7.7 + c * 1.3) * 0.12)
|
|
105
|
-
});
|
|
106
|
-
// Stepping stones identify safe lanes; the checkered strip marks the finish.
|
|
107
|
-
for (let col = 0; col < COLS; col++)
|
|
108
|
-
add({
|
|
109
|
-
mesh: 'cube',
|
|
110
|
-
position: [worldX(l, colX(l, col)), y, 0.08],
|
|
111
|
-
scale: [l.tile * 0.42, l.laneH * 0.34, 0.16],
|
|
112
|
-
color: shade('#C8DF99', night, 0.94)
|
|
113
|
-
});
|
|
114
|
-
if (row === TOTAL_LANES - 1) {
|
|
115
|
-
for (let col = 0; col < COLS * 2; col++)
|
|
116
|
-
for (let stripe = 0; stripe < 2; stripe++)
|
|
117
|
-
add({
|
|
118
|
-
mesh: 'cube',
|
|
119
|
-
position: [-l.gridW / 2 + ((col + 0.5) * l.tile) / 2, y - l.laneH * 0.36 + stripe * l.laneH * 0.12, 0.15],
|
|
120
|
-
scale: [l.tile / 2, l.laneH * 0.12, 0.2],
|
|
121
|
-
color: shade((col + stripe) % 2 ? '#F8F6E9' : '#34434A', night)
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
// Street lamps stay outside the playable columns.
|
|
125
|
-
for (const side of [-1, 1]) {
|
|
126
|
-
const x = side * (l.gridW / 2 + l.tile * 0.85);
|
|
127
|
-
const post = l.tile * 0.075;
|
|
128
|
-
add({ mesh: 'cube', position: [x, y, l.tile * 0.65], scale: [post, post, l.tile * 1.3], color: shade('#56676A', night) });
|
|
129
|
-
add({
|
|
130
|
-
mesh: 'cube',
|
|
131
|
-
position: [x, y, l.tile * 1.33],
|
|
132
|
-
scale: [l.tile * 0.26, l.tile * 0.26, l.tile * 0.13],
|
|
133
|
-
color: night ? [2, 1.65, 0.9, 1] : [0.98, 0.92, 0.71, 1]
|
|
134
|
-
});
|
|
135
|
-
add({ mesh: 'cube', position: [x, y, l.tile * 1.44], scale: [l.tile * 0.34, l.tile * 0.34, l.tile * 0.08], color: shade('#45565A', night) });
|
|
136
|
-
}
|
|
137
|
-
for (let c = 0; c < cols; c++) {
|
|
138
|
-
const x = xAt(c);
|
|
139
|
-
const offGrid = Math.abs(x) > l.gridW / 2 + l.tile * 0.2;
|
|
140
|
-
// Pine trees (and now and then a bush or a rock) off the player's columns
|
|
141
|
-
if (offGrid && seeded(row * 5.3 + c * 1.7) > 0.4) {
|
|
142
|
-
const pick = seeded(row * 2.9 + c * 4.1);
|
|
143
|
-
const jx = (seeded(c * 3 + row) - 0.5) * l.tile * 0.3;
|
|
144
|
-
const jy = (seeded(row * 5 + c) - 0.5) * l.laneH * 0.3;
|
|
145
|
-
if (pick < 0.7) {
|
|
146
|
-
add({
|
|
147
|
-
mesh: a.tree,
|
|
148
|
-
position: [x + jx, y + jy, 0],
|
|
149
|
-
rotation: quat.z((seeded(c + row * 9) * Math.PI) / 2),
|
|
150
|
-
scale: l.tile * (0.95 + seeded(row + c * 2.1) * 0.45),
|
|
151
|
-
color: shade('#FFFFFF', night, 0.9 + seeded(c + row) * 0.15)
|
|
152
|
-
});
|
|
153
|
-
} else if (pick < 0.88) {
|
|
154
|
-
add({ mesh: a.bush, position: [x + jx, y + jy, 0], scale: l.tile * 0.85, color: shade(COLORS.BUSH, night) });
|
|
155
|
-
} else {
|
|
156
|
-
add({
|
|
157
|
-
mesh: a.rock,
|
|
158
|
-
position: [x + jx, y + jy, 0],
|
|
159
|
-
rotation: quat.z(seeded(row + c * 7) * 3),
|
|
160
|
-
scale: [l.tile * 0.7, l.tile * 0.5, l.tile * 0.75],
|
|
161
|
-
color: shade(COLORS.ROCK, night, 0.85 + seeded(c * 5 + row) * 0.2)
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
if (seeded(row * 13.1 + c * 3.7) > 0.62) {
|
|
167
|
-
const t = l.tile * 0.14;
|
|
168
|
-
add({
|
|
169
|
-
mesh: 'cone',
|
|
170
|
-
position: [x + (seeded(c * 2 + row) - 0.5) * l.tile * 0.3, y + (seeded(row + c) - 0.5) * l.laneH * 0.5, t / 2],
|
|
171
|
-
rotation: STAND_UP,
|
|
172
|
-
scale: [t, t, t],
|
|
173
|
-
color: shade(COLORS.GRASS_TUFT, night)
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
if (seeded(row * 7.3 + c * 9.1 + 5) > 0.9) {
|
|
177
|
-
const petal = COLORS.FLOWERS[Math.floor(seeded(row + c * 2) * COLORS.FLOWERS.length)]!;
|
|
178
|
-
const fx = x + (seeded(row + c * 3) - 0.5) * l.tile * 0.2;
|
|
179
|
-
const fy = y + (seeded(row * 2 + c) - 0.5) * l.laneH * 0.5;
|
|
180
|
-
add({ mesh: 'sphere', position: [fx, fy, 1.5], scale: 4.6, color: shade(petal, night) });
|
|
181
|
-
add({ mesh: 'sphere', position: [fx, fy, 2.6], scale: 2.4, color: shade('#FFD93D', night) });
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return out;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// ── Vehicles ──────────────────────────────────────────────────────────
|
|
189
|
-
|
|
190
|
-
/** Each vehicle is just a root and three instanced meshes: paint, fixed trim, and lamps. */
|
|
191
|
-
function spawnVehicle(world: World, l: Layout, a: CrossyMeshes, v: Vehicle, night: boolean, parent: Entity): Entity {
|
|
192
|
-
const root = world.spawn({
|
|
193
|
-
mesh: 'none',
|
|
194
|
-
parent,
|
|
195
|
-
rotation: v.speed >= 0 ? FACE_RIGHT : FACE_LEFT,
|
|
196
|
-
scale: [v.width, l.tile * 0.66, l.tile],
|
|
197
|
-
pickable: false
|
|
198
|
-
});
|
|
199
|
-
const meshes = a.vehicles[v.style];
|
|
200
|
-
const color = toColor(COLORS.CAR_COLORS[v.colorIndex] ?? COLORS.CAR_COLORS[0]);
|
|
201
|
-
world.spawn({ mesh: meshes.body, parent: root, color, pickable: false });
|
|
202
|
-
world.spawn({ mesh: meshes.details, parent: root, pickable: false });
|
|
203
|
-
world.spawn({ mesh: meshes.lights, parent: root, color: night ? [1.8, 1.8, 1.8, 1] : [1, 1, 1, 1], pickable: false });
|
|
204
|
-
return root;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** Keeps every vehicle where the rules have it. */
|
|
208
|
-
export function placeVehicles(world: World, l: Layout, s: Scene, vs: Vehicle[]) {
|
|
209
|
-
const updates = world.transforms;
|
|
210
|
-
for (const v of vs) {
|
|
211
|
-
const e = s.vehicles.get(v.id);
|
|
212
|
-
if (e != null) updates.position(e, worldX(l, v.x), laneY(l, v.row), laneTop(v.row));
|
|
213
|
-
}
|
|
214
|
-
updates.flush();
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// ── The pedestrian ────────────────────────────────────────────────────
|
|
218
|
-
|
|
219
|
-
function spawnPlayer(world: World, l: Layout, parent: Entity): Scene['player'] {
|
|
220
|
-
const root = world.spawn({ mesh: 'none', parent, pickable: false });
|
|
221
|
-
const body = world.spawn({ mesh: 'none', parent: root, pickable: false });
|
|
222
|
-
const visual = world.spawn({ mesh: 'none', parent: body, scale: l.tile * PERSON.SCALE, pickable: false });
|
|
223
|
-
const meshes = pedestrianMeshes();
|
|
224
|
-
world.spawn({ mesh: meshes.torso, parent: visual, pickable: false });
|
|
225
|
-
const arms = [-1, 1].map((side) => world.spawn({ mesh: meshes.arm, parent: visual, position: [side * 0.235, 0, 1.4], pickable: false })) as [
|
|
226
|
-
Entity,
|
|
227
|
-
Entity
|
|
228
|
-
];
|
|
229
|
-
const legs = [-1, 1].map((side) => world.spawn({ mesh: meshes.leg, parent: visual, position: [side * 0.105, 0, 0.87], pickable: false })) as [
|
|
230
|
-
Entity,
|
|
231
|
-
Entity
|
|
232
|
-
];
|
|
233
|
-
const feet = legs.map((leg) => world.spawn({ mesh: meshes.shoe, parent: leg, position: [0, -0.01, -0.72], pickable: false })) as [Entity, Entity];
|
|
234
|
-
return { root, body, arms, legs, feet };
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function restLimbs(world: World, player: Scene['player']) {
|
|
238
|
-
for (const joint of [...player.arms, ...player.legs, ...player.feet]) {
|
|
239
|
-
world.stopAnimation(joint);
|
|
240
|
-
world.set(joint, { rotation: FACE_RIGHT });
|
|
241
|
-
}
|
|
242
|
-
player.legs.forEach((leg, i) => world.set(leg, { position: [(i === 0 ? -1 : 1) * 0.105, 0, 0.87] }));
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/** The pedestrian on a lane and column, at once (a new board). */
|
|
246
|
-
export function placePlayer(world: World, l: Layout, s: Scene, row: number, col: number) {
|
|
247
|
-
world.stopAnimation(s.player.root);
|
|
248
|
-
world.stopAnimation(s.player.body);
|
|
249
|
-
restLimbs(world, s.player);
|
|
250
|
-
world.set(s.player.root, { position: [worldX(l, colX(l, col)), laneY(l, row), laneTop(row)], rotation: FACE_RIGHT });
|
|
251
|
-
world.set(s.player.body, { scale: 1, rotation: [0, 0, 0, 1], position: [0, 0, 0] });
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/** Grounded translation with alternating strides. Ankles counter-rotate so shoes stay level. */
|
|
255
|
-
export function hop(world: World, l: Layout, s: Scene, from: [number, number], to: [number, number], facing: 'up' | 'down' | 'left' | 'right') {
|
|
256
|
-
const a: Vec3 = [worldX(l, colX(l, from[1])), laneY(l, from[0]), laneTop(from[0])];
|
|
257
|
-
const b: Vec3 = [worldX(l, colX(l, to[1])), laneY(l, to[0]), laneTop(to[0])];
|
|
258
|
-
const turn = { up: 0, down: Math.PI, left: Math.PI / 2, right: -Math.PI / 2 }[facing];
|
|
259
|
-
world.stopAnimation(s.player.root);
|
|
260
|
-
world.set(s.player.root, { position: a, rotation: quat.z(turn) });
|
|
261
|
-
world.animate(s.player.root, { position: b }, { duration: MOVE_TIME, easing: 'linear' });
|
|
262
|
-
const timing = { duration: MOVE_TIME, easing: 'linear' as const };
|
|
263
|
-
s.player.legs.forEach((leg, i) => {
|
|
264
|
-
const angle = PERSON.STRIDE * (i === 0 ? 1 : -1);
|
|
265
|
-
const x = (i === 0 ? -1 : 1) * 0.105;
|
|
266
|
-
const base: Vec3 = [x, 0, 0.87];
|
|
267
|
-
world.animate(
|
|
268
|
-
leg,
|
|
269
|
-
[
|
|
270
|
-
{ rotation: quat.x(angle), position: [x, 0, 0.87 + (angle > 0 ? 0.12 : 0)], at: 0.25 },
|
|
271
|
-
{ rotation: FACE_RIGHT, position: base, at: 0.5 },
|
|
272
|
-
{ rotation: quat.x(-angle), position: [x, 0, 0.87 + (angle < 0 ? 0.12 : 0)], at: 0.75 },
|
|
273
|
-
{ rotation: FACE_RIGHT, position: base }
|
|
274
|
-
],
|
|
275
|
-
timing
|
|
276
|
-
);
|
|
277
|
-
world.animate(
|
|
278
|
-
s.player.feet[i]!,
|
|
279
|
-
[{ rotation: quat.x(-angle), at: 0.25 }, { rotation: FACE_RIGHT, at: 0.5 }, { rotation: quat.x(angle), at: 0.75 }, { rotation: FACE_RIGHT }],
|
|
280
|
-
timing
|
|
281
|
-
);
|
|
282
|
-
});
|
|
283
|
-
s.player.arms.forEach((arm, i) => {
|
|
284
|
-
const angle = -PERSON.STRIDE * (i === 0 ? 1 : -1) * 0.8;
|
|
285
|
-
world.animate(
|
|
286
|
-
arm,
|
|
287
|
-
[{ rotation: quat.x(angle), at: 0.25 }, { rotation: FACE_RIGHT, at: 0.5 }, { rotation: quat.x(-angle), at: 0.75 }, { rotation: FACE_RIGHT }],
|
|
288
|
-
timing
|
|
289
|
-
);
|
|
290
|
-
});
|
|
291
|
-
// Lower the hips as the stance leg extends, keeping its foot on the ground instead of bouncing up.
|
|
292
|
-
const drop = 0.72 * (1 - Math.cos(PERSON.STRIDE)) * l.tile * PERSON.SCALE;
|
|
293
|
-
world.animate(
|
|
294
|
-
s.player.body,
|
|
295
|
-
[{ position: [0, 0, -drop], at: 0.25 }, { position: [0, 0, 0], at: 0.5 }, { position: [0, 0, -drop], at: 0.75 }, { position: [0, 0, 0] }],
|
|
296
|
-
timing
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/** Run over: a non-graphic stumble and a small puff of road dust. */
|
|
301
|
-
export function stumble(world: World, l: Layout, s: Scene, row: number, col: number) {
|
|
302
|
-
restLimbs(world, s.player);
|
|
303
|
-
world.animate(s.player.body, { rotation: quat.x(1.25), position: [0, 0, l.tile * 0.05] }, { duration: 0.24, easing: 'easeOut' });
|
|
304
|
-
effects.shatter(world, {
|
|
305
|
-
position: world3([worldX(l, colX(l, col)), laneY(l, row), laneTop(row) + l.tile * 0.3]),
|
|
306
|
-
count: 10,
|
|
307
|
-
size: l.tile * 0.08 * k,
|
|
308
|
-
speed: l.tile * 3 * k,
|
|
309
|
-
lifetime: 0.6,
|
|
310
|
-
gravity: -l.tile * 6 * k,
|
|
311
|
-
colors: [toColor(COLORS.ROAD_LINE), toColor(COLORS.CURB)]
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/** Made it across: a wave and confetti, standing on the finish lane. */
|
|
316
|
-
export function celebrate(world: World, l: Layout, s: Scene, row: number, col: number) {
|
|
317
|
-
const p: Vec3 = [worldX(l, colX(l, col)), laneY(l, row), laneTop(row)];
|
|
318
|
-
restLimbs(world, s.player);
|
|
319
|
-
world.animate(s.player.arms[0], [{ rotation: quat.x(-2.5), at: 0.3 }, { rotation: quat.x(-2), at: 0.65 }, { rotation: FACE_RIGHT }], {
|
|
320
|
-
duration: 0.96
|
|
321
|
-
});
|
|
322
|
-
world.set(s.player.root, { position: p });
|
|
323
|
-
world.set(s.player.body, { position: [0, 0, 0] });
|
|
324
|
-
effects.confetti(world, {
|
|
325
|
-
position: world3([p[0], p[1], l.tile]),
|
|
326
|
-
count: 50,
|
|
327
|
-
size: l.tile * 0.12 * k,
|
|
328
|
-
speed: l.tile * 6 * k,
|
|
329
|
-
lifetime: 1.2,
|
|
330
|
-
gravity: -l.tile * 10 * k,
|
|
331
|
-
colors: COLORS.CAR_COLORS.slice(0, 4).map((c) => toColor(c))
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// ── The whole scene ───────────────────────────────────────────────────
|
|
336
|
-
|
|
337
|
-
export function buildScene(world: World, l: Layout, a: CrossyMeshes, night: boolean, vs: Vehicle[]): Scene {
|
|
338
|
-
const root = world.spawn({ mesh: 'none', scale: k, pickable: false });
|
|
339
|
-
const s: Scene = { root, ground: spawnGround(world, l, a, night, root), vehicles: new Map(), player: spawnPlayer(world, l, root), night };
|
|
340
|
-
setTraffic(world, l, a, s, vs);
|
|
341
|
-
return s;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/** Replaces the traffic with a new board's (its vehicles are new ones, so recolored and resized). */
|
|
345
|
-
export function setTraffic(world: World, l: Layout, a: CrossyMeshes, s: Scene, vs: Vehicle[]) {
|
|
346
|
-
for (const e of s.vehicles.values()) world.despawn(e);
|
|
347
|
-
s.vehicles.clear();
|
|
348
|
-
for (const v of vs) s.vehicles.set(v.id, spawnVehicle(world, l, a, v, s.night, s.root));
|
|
349
|
-
placeVehicles(world, l, s, vs);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/** Everything goes with the root. */
|
|
353
|
-
export function removeScene(world: World, s: Scene) {
|
|
354
|
-
world.despawn(s.root);
|
|
355
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// Dino Jump's screen, on the Nayan engine: a 3D dino running across a 3D desert seen through a low
|
|
2
|
-
// perspective camera, under Playtura's scoreboard, controls and modals. The rules are in
|
|
3
|
-
// DinoJumpGame.ts, the sky and far mesas in shared/EngineMeadow.ts, the dino, obstacles and the
|
|
4
|
-
// scrolling desert in DinoJumpScene.ts.
|
|
5
|
-
//
|
|
6
|
-
// One world serves the whole visit: Start, Stop and Play Again reset it in place and a theme change
|
|
7
|
-
// swaps day for night, so the GPU view is never rebuilt. JS steps the jump and the obstacles in fixed
|
|
8
|
-
// 60 Hz steps once a frame; the running legs, bob, dust and bursts move in the engine's Rust core.
|
|
9
|
-
import { useMemo } from 'react';
|
|
10
|
-
import { HapticType } from '../../services/HapticsService';
|
|
11
|
-
import { GAME_SOUNDS } from '../../services/SoundsService';
|
|
12
|
-
import { GAME_IDS } from '../../services/UtilsService';
|
|
13
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
14
|
-
import { livesColumn, scoreColumn, timerColumn } from '../shared/EngineHud';
|
|
15
|
-
import { backgroundFor, lightFor } from '../shared/EngineMeadow';
|
|
16
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
17
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
18
|
-
import { getLayout, LIVES, TIME_LIMIT } from './DinoJumpConstants';
|
|
19
|
-
import { createGame, dispose, jump, reset, setLayout, setTheme, start, tick } from './DinoJumpGame';
|
|
20
|
-
|
|
21
|
-
const SFX = GAME_SOUNDS.DINO_JUMP;
|
|
22
|
-
const formatScore = (value: number) => value.toLocaleString();
|
|
23
|
-
|
|
24
|
-
export const DinoJump = engineGame(GAME_IDS.DINO_JUMP, (props) => {
|
|
25
|
-
const [score, setScore] = useLiveState(0);
|
|
26
|
-
const [lives, setLives] = useLiveState(LIVES);
|
|
27
|
-
const [timeLeft, setTimeLeft] = useLiveState(TIME_LIMIT);
|
|
28
|
-
|
|
29
|
-
// Surviving the timer is a win, losing every life a loss
|
|
30
|
-
const { theme, status, screen, gameOver } = useEngineGame(props, {
|
|
31
|
-
gameId: GAME_IDS.DINO_JUMP,
|
|
32
|
-
create: createGame,
|
|
33
|
-
start,
|
|
34
|
-
reset,
|
|
35
|
-
dispose,
|
|
36
|
-
tick,
|
|
37
|
-
setTheme,
|
|
38
|
-
resize: (g, width, height, offset) => setLayout(g, getLayout(width, height, offset)),
|
|
39
|
-
// Jumps as the finger lands (the original version waited for it to lift)
|
|
40
|
-
drag: (g, { phase }) => {
|
|
41
|
-
if (phase === 'start') jump(g);
|
|
42
|
-
},
|
|
43
|
-
sounds: SFX,
|
|
44
|
-
onStart: (fx) => fx(SFX.START, HapticType.MEDIUM),
|
|
45
|
-
onPlayAgain: (fx) => fx(null, HapticType.LIGHT),
|
|
46
|
-
onOver: (fx, status) => fx(status === 'win' ? SFX.WIN : SFX.GAME_OVER, status === 'win' ? HapticType.SUCCESS : HapticType.ERROR),
|
|
47
|
-
wire: (g, fx) => {
|
|
48
|
-
g.onScore = setScore;
|
|
49
|
-
g.onLives = setLives;
|
|
50
|
-
g.onTime = setTimeLeft;
|
|
51
|
-
g.onJump = () => fx(SFX.JUMP, HapticType.LIGHT);
|
|
52
|
-
g.onCollect = () => fx(SFX.COLLECT, HapticType.SUCCESS);
|
|
53
|
-
g.onHit = () => fx(SFX.HIT, HapticType.HEAVY);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// Sunlight by day, moonlight at night (the world's colors follow the theme too)
|
|
58
|
-
const light = useMemo(() => lightFor(theme), [theme]);
|
|
59
|
-
const background = useMemo(() => backgroundFor(theme), [theme]);
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<EngineGameScreen
|
|
63
|
-
{...screen}
|
|
64
|
-
light={light}
|
|
65
|
-
background={background}
|
|
66
|
-
columns={[scoreColumn(score, 'SCORE', formatScore), livesColumn(lives, LIVES), timerColumn(timeLeft, theme)]}
|
|
67
|
-
subtext="Jump over the cacti!"
|
|
68
|
-
gameOver={gameOver({
|
|
69
|
-
title: status === 'win' ? 'YOU SURVIVED!' : 'GAME OVER',
|
|
70
|
-
message: status === 'win' ? 'Great running!' : 'You hit an obstacle!',
|
|
71
|
-
scoreLabel: 'Final Score',
|
|
72
|
-
score,
|
|
73
|
-
buttonText: 'Run Again!'
|
|
74
|
-
})}
|
|
75
|
-
/>
|
|
76
|
-
);
|
|
77
|
-
});
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// Dino Jump's rules, physics, timings and layout. Rules, scoring, physics and layout match the original
|
|
2
|
-
// version (games/dino-jump), so scores and feel carry over.
|
|
3
|
-
import type { MeadowOptions, Rig } from '../shared/EngineMeadow';
|
|
4
|
-
|
|
5
|
-
// ── Rules ─────────────────────────────────────────────────────────────
|
|
6
|
-
|
|
7
|
-
export const TIME_LIMIT = 120; // seconds; surviving them wins
|
|
8
|
-
export const LIVES = 3;
|
|
9
|
-
export const POINTS_PER_SECOND = 200;
|
|
10
|
-
export const MUSHROOM_POINTS = 1000; // and a life back
|
|
11
|
-
|
|
12
|
-
export type ObstacleKind = 'cactus_small' | 'cactus_large' | 'mushroom';
|
|
13
|
-
/** Each obstacle's size in screen points (its collision box, and what's drawn). */
|
|
14
|
-
export const OBSTACLE_SIZE: Record<ObstacleKind, { width: number; height: number }> = {
|
|
15
|
-
cactus_small: { width: 35, height: 65 },
|
|
16
|
-
cactus_large: { width: 45, height: 85 },
|
|
17
|
-
mushroom: { width: 45, height: 65 }
|
|
18
|
-
};
|
|
19
|
-
export const MUSHROOM_CHANCE = 0.05;
|
|
20
|
-
export const SMALL_CHANCE = 0.5; // of the rest's roll: below this small, above large
|
|
21
|
-
|
|
22
|
-
// ── Physics (points per 60 Hz step, as the original version) ─────────────
|
|
23
|
-
|
|
24
|
-
export const STEP = 1 / 60;
|
|
25
|
-
export const STEP_TOLERANCE = 0.002;
|
|
26
|
-
export const MAX_PENDING = 0.05;
|
|
27
|
-
export const GRAVITY = 1.4;
|
|
28
|
-
export const JUMP_FORCE = -28;
|
|
29
|
-
export const RUN_SPEED = 6; // the obstacles' and the ground's scroll
|
|
30
|
-
export const DINO_X = 50;
|
|
31
|
-
export const DINO_WIDTH = 70; // drawn
|
|
32
|
-
export const DINO_HEIGHT = 75;
|
|
33
|
-
export const DINO_HIT_WIDTH = 50; // collides
|
|
34
|
-
export const DINO_HIT_HEIGHT = 60;
|
|
35
|
-
export const MAX_OBSTACLES = 5;
|
|
36
|
-
export const MIN_OBSTACLE_GAP = 300; // the rightmost obstacle must be this far in before the next spawns
|
|
37
|
-
export const REMOVE_X = -100;
|
|
38
|
-
|
|
39
|
-
// ── Spawning (seconds) ────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
export const FIRST_OBSTACLE = 1.5;
|
|
42
|
-
export const SPAWN_MIN = 2.5;
|
|
43
|
-
export const SPAWN_SPREAD = 2;
|
|
44
|
-
|
|
45
|
-
// ── Feel ──────────────────────────────────────────────────────────────
|
|
46
|
-
|
|
47
|
-
export const STRIDE_TIME = 0.16; // one leg swing
|
|
48
|
-
export const DUST_INTERVAL = 0.24; // a puff of dust off the feet while running
|
|
49
|
-
|
|
50
|
-
// ── The world ─────────────────────────────────────────────────────────
|
|
51
|
-
|
|
52
|
-
const FOV = 0.9;
|
|
53
|
-
const HORIZON = 0.6;
|
|
54
|
-
const PLAY_DEPTH = 9;
|
|
55
|
-
|
|
56
|
-
/** The screen line the dino runs on: higher with no header, as the original ground strip was. */
|
|
57
|
-
export const groundLine = (height: number, offset: number) => height - (offset > 0 ? 150 : 250);
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* A low camera over the desert floor, at the height that puts the real ground under the play plane
|
|
61
|
-
* exactly on the original game's ground line: the dino runs on the sand, which runs on to the horizon.
|
|
62
|
-
*/
|
|
63
|
-
export function rigFor(height: number, offset: number): Rig {
|
|
64
|
-
const tanHalf = Math.tan(FOV / 2);
|
|
65
|
-
const pitch = Math.atan((HORIZON - 0.5) * 2 * tanHalf);
|
|
66
|
-
const k = (2 * PLAY_DEPTH * tanHalf) / height;
|
|
67
|
-
const eyeHeight = -PLAY_DEPTH * Math.sin(pitch) - (height / 2 - groundLine(height, offset)) * k * Math.cos(pitch);
|
|
68
|
-
return { eyeHeight, horizon: HORIZON, playDepth: PLAY_DEPTH };
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export const MEADOW: MeadowOptions = { biome: 'desert', near: false, sun: [0.8, 0.22], clouds: [0.1, 0.42] };
|
|
72
|
-
|
|
73
|
-
/** The scrolling desert floor comes in tiles this many metres wide (three cover any view). */
|
|
74
|
-
export const TILE = 80;
|
|
75
|
-
|
|
76
|
-
// ── Layout (screen points) ────────────────────────────────────────────
|
|
77
|
-
|
|
78
|
-
export type Layout = { width: number; height: number; offset: number; groundY: number };
|
|
79
|
-
|
|
80
|
-
export const getLayout = (width: number, height: number, offset: number): Layout => ({ width, height, offset, groundY: groundLine(height, offset) });
|