@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,273 +0,0 @@
|
|
|
1
|
-
// The supersport bike, built in code (as Penguin Run's penguin) rather than loaded from files: one
|
|
2
|
-
// sleek full fairing from a sharp nose (slim LED eyes either side of a ram-air intake) back to a painted
|
|
3
|
-
// belly pan, sweeping down behind the front wheel; a slim tank cut in for the knees; a thin upswept
|
|
4
|
-
// tail; black split-spoke wheels on low-profile tyres; upside-down gold forks over twin drilled discs;
|
|
5
|
-
// an aluminium swingarm with the shock, chain and sprocket; rearsets; and a compact titanium exhaust.
|
|
6
|
-
// Model units are metres: it stands on y = 0 facing -z, 0.7 wide (bars) by about 1.04 tall by 2.04
|
|
7
|
-
// long, its wheels at z = -0.72 and 0.72 (the rear tyre meets the road at REAR_CONTACT). Three meshes,
|
|
8
|
-
// as a model: the bodywork (white, so each bike paints its own color), the screen, and the trim in its
|
|
9
|
-
// own colors. The rider (BikeRacingScene) sits on it: seat, grips and pegs are where it expects them.
|
|
10
|
-
import {
|
|
11
|
-
block,
|
|
12
|
-
type Color,
|
|
13
|
-
ellipsoid,
|
|
14
|
-
type GeometryPart,
|
|
15
|
-
lathe,
|
|
16
|
-
loft,
|
|
17
|
-
type LoftSection as Section,
|
|
18
|
-
merge,
|
|
19
|
-
type Model,
|
|
20
|
-
quat,
|
|
21
|
-
smoothCurve,
|
|
22
|
-
tube,
|
|
23
|
-
type Vec3
|
|
24
|
-
} from '@nayan-ui/engine';
|
|
25
|
-
import { AXLE_X, wheel } from '../car-racing/CarMeshes';
|
|
26
|
-
import type { Footprint } from '../shared/EngineFootprint';
|
|
27
|
-
import { cacheGameAsset, createGameMesh as createShape } from '../shared/EngineMeshes';
|
|
28
|
-
|
|
29
|
-
const TAU = Math.PI * 2;
|
|
30
|
-
const SMOKED: Color = [0.05, 0.065, 0.09];
|
|
31
|
-
const BLACK: Color = [0.02, 0.02, 0.022];
|
|
32
|
-
const SATIN: Color = [0.07, 0.07, 0.08];
|
|
33
|
-
const CARBON: Color = [0.055, 0.055, 0.065];
|
|
34
|
-
const ALUMINIUM: Color = [0.68, 0.7, 0.73];
|
|
35
|
-
const CHROME: Color = [0.82, 0.83, 0.86];
|
|
36
|
-
const GOLD: Color = [0.86, 0.62, 0.16];
|
|
37
|
-
const STEEL: Color = [0.55, 0.56, 0.58];
|
|
38
|
-
const TITANIUM: Color = [0.52, 0.54, 0.58];
|
|
39
|
-
const HEADLIGHT: Color = [0.95, 0.97, 1];
|
|
40
|
-
const DRL: Color = [1.4, 1.4, 1.45];
|
|
41
|
-
const TAIL_LIGHT: Color = [0.85, 0.04, 0.04];
|
|
42
|
-
const AMBER: Color = [1, 0.55, 0.08];
|
|
43
|
-
const PLATE: Color = [0.9, 0.9, 0.88];
|
|
44
|
-
const SPRING: Color = [0.95, 0.75, 0.1];
|
|
45
|
-
const BURNT: Color = [0.3, 0.26, 0.3];
|
|
46
|
-
|
|
47
|
-
const WHEEL_R = 0.3;
|
|
48
|
-
const FRONT = -0.72;
|
|
49
|
-
const REAR = 0.72;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* The full fairing: a sharp nose, flanks wrapping the radiator, the lower edge clear of the front tyre
|
|
53
|
-
* and then sweeping down behind it into the belly pan under the engine.
|
|
54
|
-
*/
|
|
55
|
-
const FAIRING: Section[] = [
|
|
56
|
-
{ z: -0.99, bottom: 0.64, top: 0.72, width: 0.04, square: 2.4 },
|
|
57
|
-
{ z: -0.92, bottom: 0.6, top: 0.8, width: 0.15, square: 2.8 },
|
|
58
|
-
{ z: -0.8, bottom: 0.63, top: 0.87, width: 0.22, square: 3 },
|
|
59
|
-
{ z: -0.68, bottom: 0.66, top: 0.9, width: 0.26, square: 3 },
|
|
60
|
-
{ z: -0.56, bottom: 0.6, top: 0.88, width: 0.27, square: 3 },
|
|
61
|
-
{ z: -0.46, bottom: 0.47, top: 0.8, width: 0.26, square: 3.2 },
|
|
62
|
-
{ z: -0.38, bottom: 0.26, top: 0.74, width: 0.25, square: 3.4 },
|
|
63
|
-
{ z: -0.15, bottom: 0.21, top: 0.66, width: 0.22, square: 3.4 },
|
|
64
|
-
{ z: 0.04, bottom: 0.23, top: 0.62, width: 0.18, square: 3.2 },
|
|
65
|
-
{ z: 0.16, bottom: 0.32, top: 0.58, width: 0.12, square: 3 }
|
|
66
|
-
];
|
|
67
|
-
/** The tank: slim, peaking ahead of the rider, cut in at the knees. */
|
|
68
|
-
const TANK: Section[] = [
|
|
69
|
-
{ z: -0.54, bottom: 0.78, top: 0.86, width: 0.1, square: 3.4 },
|
|
70
|
-
{ z: -0.42, bottom: 0.72, top: 0.915, width: 0.16, square: 3.6 },
|
|
71
|
-
{ z: -0.22, bottom: 0.68, top: 0.915, width: 0.17, square: 3.6 },
|
|
72
|
-
{ z: -0.04, bottom: 0.68, top: 0.87, width: 0.13, square: 3.4 },
|
|
73
|
-
{ z: 0.1, bottom: 0.72, top: 0.83, width: 0.1, square: 3 }
|
|
74
|
-
];
|
|
75
|
-
/** The seat cowl and tail: down to meet the fairing under the seat, then thin and upswept to a sharp tip. */
|
|
76
|
-
const TAIL: Section[] = [
|
|
77
|
-
{ z: 0.02, bottom: 0.5, top: 0.79, width: 0.15, square: 3.4 },
|
|
78
|
-
{ z: 0.2, bottom: 0.56, top: 0.82, width: 0.145, square: 3.4 },
|
|
79
|
-
{ z: 0.4, bottom: 0.68, top: 0.85, width: 0.125, square: 3.2 },
|
|
80
|
-
{ z: 0.6, bottom: 0.77, top: 0.89, width: 0.1, square: 3.2 },
|
|
81
|
-
{ z: 0.85, bottom: 0.84, top: 0.925, width: 0.06, square: 3 },
|
|
82
|
-
{ z: 0.985, bottom: 0.875, top: 0.92, width: 0.02, square: 2.6 }
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
const rod = (a: Vec3, b: Vec3, radius: number, color: Color, sides = 10): GeometryPart => ({
|
|
86
|
-
geometry: tube([a, b], { radius, sides, smoothness: 1 }),
|
|
87
|
-
color
|
|
88
|
-
});
|
|
89
|
-
/** Points on a circle of radius `r` about (y, z), around the x axis at `x`, from angle `a0` to `a1` (0 = forward, -z). */
|
|
90
|
-
const arc = (x: number, y: number, z: number, r: number, a0: number, a1: number, n = 8): Vec3[] =>
|
|
91
|
-
Array.from({ length: n + 1 }, (_, i) => {
|
|
92
|
-
const a = a0 + ((a1 - a0) * i) / n;
|
|
93
|
-
return [x, y + Math.sin(a) * r, z - Math.cos(a) * r];
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
/** A flat steel brake disc `r` across, drilled, on a gold carrier, around the y axis (turn it with AXLE_X). */
|
|
97
|
-
const disc = (r: number, carrier: Color = GOLD) =>
|
|
98
|
-
lathe(
|
|
99
|
-
[
|
|
100
|
-
[0.001, 0.004],
|
|
101
|
-
[r, 0.004],
|
|
102
|
-
[r, -0.004],
|
|
103
|
-
[0.001, -0.004]
|
|
104
|
-
],
|
|
105
|
-
{
|
|
106
|
-
segments: 36,
|
|
107
|
-
color: ({ u, position: [x, , z] }) => {
|
|
108
|
-
const d = Math.hypot(x, z);
|
|
109
|
-
if (d < r * 0.55) return Math.cos(u * TAU * 6) > 0.3 ? carrier : BLACK; // the carrier's arms
|
|
110
|
-
return Math.cos(u * TAU * 20) > 0.85 && d > r * 0.66 && d < r * 0.92 ? BLACK : STEEL;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* The bike's outline from above, with its rider, for collisions: the narrow tyres at each end, the
|
|
117
|
-
* fairing, the bars and grips at their widest, the rider's knees and boots, then the slim tail.
|
|
118
|
-
*/
|
|
119
|
-
export const BIKE_FOOTPRINT: Footprint = {
|
|
120
|
-
length: 2.04,
|
|
121
|
-
halfWidth: smoothCurve([
|
|
122
|
-
[-1.02, 0.06],
|
|
123
|
-
[-0.9, 0.15],
|
|
124
|
-
[-0.7, 0.26],
|
|
125
|
-
[-0.47, 0.34], // the grips
|
|
126
|
-
[-0.3, 0.28],
|
|
127
|
-
[-0.06, 0.3], // knees
|
|
128
|
-
[0.13, 0.28], // boots on the pegs
|
|
129
|
-
[0.4, 0.17],
|
|
130
|
-
[0.7, 0.12],
|
|
131
|
-
[1.02, 0.08]
|
|
132
|
-
])
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
export type BikeMeshes = { body: Model; trim: Model; glass: Model };
|
|
136
|
-
let bike: BikeMeshes | null = null;
|
|
137
|
-
|
|
138
|
-
/** The bike's three meshes, built once per app. */
|
|
139
|
-
export function bikeMeshes(): BikeMeshes {
|
|
140
|
-
return cacheGameAsset('bike-racing/BikeMeshes:bikeMeshes', () => bikeMeshesUncached());
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
function bikeMeshesUncached(): BikeMeshes {
|
|
144
|
-
if (bike) return bike;
|
|
145
|
-
const body = createShape(
|
|
146
|
-
merge([
|
|
147
|
-
{ geometry: loft(FAIRING, { around: 40, smoothness: 5 }) },
|
|
148
|
-
{ geometry: loft(TANK, { around: 32, smoothness: 4 }) },
|
|
149
|
-
{ geometry: loft(TAIL, { around: 28, smoothness: 4 }) }
|
|
150
|
-
]),
|
|
151
|
-
{ center: false, shine: 0.9 }
|
|
152
|
-
);
|
|
153
|
-
// A short screen raked back over the nose
|
|
154
|
-
const glass = createShape(merge([{ geometry: ellipsoid([0.17, 0.2, 0.016], SMOKED, 24), position: [0, 0.93, -0.66], rotation: quat.x(0.95) }]), {
|
|
155
|
-
center: false,
|
|
156
|
-
shine: 0.95
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
const wheelLook = { rim: 0.74, spokes: 5, rimColor: SATIN, spokeColor: SATIN, gapColor: BLACK };
|
|
160
|
-
const parts: GeometryPart[] = [
|
|
161
|
-
{ geometry: wheel(WHEEL_R, 0.12, wheelLook), position: [0, WHEEL_R, FRONT], rotation: AXLE_X },
|
|
162
|
-
{ geometry: wheel(WHEEL_R, 0.19, wheelLook), position: [0, WHEEL_R, REAR], rotation: AXLE_X },
|
|
163
|
-
{ geometry: disc(0.15, STEEL), position: [0.105, WHEEL_R, REAR], rotation: AXLE_X }, // rear disc, right side
|
|
164
|
-
{ geometry: disc(0.1, BLACK), position: [-0.11, WHEEL_R, REAR], rotation: AXLE_X }, // rear sprocket, left side
|
|
165
|
-
// The nose: slim LED eyes either side of the ram-air intake, a daytime-running-light brow over each
|
|
166
|
-
{ geometry: block(0.07, 0.05, 0.04, 6, BLACK), position: [0, 0.665, -0.965] },
|
|
167
|
-
{ geometry: block(0.18, 0.03, 0.12, 6, ALUMINIUM), position: [0, 0.885, -0.5] }, // top triple clamp
|
|
168
|
-
{ geometry: block(0.26, 0.06, 0.4, 5, BLACK), position: [0, 0.83, 0.25] }, // rider's seat
|
|
169
|
-
{ geometry: block(0.016, 0.26, 0.016, 4, CARBON), position: [0, 0.7, 0.95] }, // plate hanger
|
|
170
|
-
{ geometry: block(0.16, 0.1, 0.012, 6, PLATE), position: [0, 0.57, 0.96] },
|
|
171
|
-
{ geometry: block(0.08, 0.025, 0.02, 6, TAIL_LIGHT), position: [0, 0.895, 0.975] }, // tail light
|
|
172
|
-
// Rear shock between the swingarm and the frame: a yellow spring over the damper
|
|
173
|
-
{
|
|
174
|
-
geometry: tube(
|
|
175
|
-
[
|
|
176
|
-
[0, 0.42, 0.2],
|
|
177
|
-
[0, 0.68, 0.12]
|
|
178
|
-
],
|
|
179
|
-
{ radius: 0.038, sides: 12, smoothness: 1, color: ({ v }) => (Math.sin(v * TAU * 9) > 0 ? SPRING : BLACK) }
|
|
180
|
-
)
|
|
181
|
-
},
|
|
182
|
-
// Front mudguard and rear hugger, close over the tyres
|
|
183
|
-
{
|
|
184
|
-
geometry: tube(arc(0, WHEEL_R, FRONT, 0.335, 0.55, 2.3, 8), {
|
|
185
|
-
radius: 0.06,
|
|
186
|
-
shape: (a) => 0.25 + 0.75 * Math.abs(Math.cos(a * TAU)),
|
|
187
|
-
sides: 12,
|
|
188
|
-
smoothness: 3
|
|
189
|
-
}),
|
|
190
|
-
color: CARBON
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
geometry: tube(arc(0, WHEEL_R, REAR, 0.33, 0.6, 1.6, 6), {
|
|
194
|
-
radius: 0.09,
|
|
195
|
-
shape: (a) => 0.22 + 0.78 * Math.abs(Math.cos(a * TAU)),
|
|
196
|
-
sides: 12,
|
|
197
|
-
smoothness: 3
|
|
198
|
-
}),
|
|
199
|
-
color: CARBON
|
|
200
|
-
},
|
|
201
|
-
// Chain run on the left, between the sprockets
|
|
202
|
-
rod([-0.11, 0.37, 0.06], [-0.11, 0.39, REAR], 0.008, BLACK, 6),
|
|
203
|
-
rod([-0.11, 0.25, 0.08], [-0.11, 0.21, REAR], 0.008, BLACK, 6),
|
|
204
|
-
// Exhaust: the header under the belly pan into a short titanium can beside the rear wheel
|
|
205
|
-
{
|
|
206
|
-
geometry: tube(
|
|
207
|
-
[
|
|
208
|
-
[0.05, 0.26, -0.3],
|
|
209
|
-
[0.08, 0.25, 0.0],
|
|
210
|
-
[0.12, 0.26, 0.2],
|
|
211
|
-
[0.16, 0.3, 0.34]
|
|
212
|
-
],
|
|
213
|
-
{ radius: 0.025, sides: 10, smoothness: 4, color: BURNT }
|
|
214
|
-
)
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
geometry: tube(
|
|
218
|
-
[
|
|
219
|
-
[0.16, 0.3, 0.34],
|
|
220
|
-
[0.185, 0.4, 0.52],
|
|
221
|
-
[0.2, 0.47, 0.66]
|
|
222
|
-
],
|
|
223
|
-
{ radius: (t) => 0.048 + 0.008 * t, sides: 16, smoothness: 3, color: TITANIUM, capColor: CARBON }
|
|
224
|
-
)
|
|
225
|
-
}
|
|
226
|
-
];
|
|
227
|
-
for (const s of [-1, 1]) {
|
|
228
|
-
parts.push(
|
|
229
|
-
{ geometry: ellipsoid([0.075, 0.016, 0.05], HEADLIGHT), position: [s * 0.07, 0.705, -0.925], rotation: quat.y(-s * 0.45) },
|
|
230
|
-
{ geometry: block(0.08, 0.008, 0.012, 6, DRL), position: [s * 0.075, 0.726, -0.915], rotation: quat.y(-s * 0.45) },
|
|
231
|
-
// Upside-down forks: slim chrome stanchions into gold outer tubes, clamped at the top
|
|
232
|
-
rod([s * 0.085, WHEEL_R, FRONT], [s * 0.085, 0.56, -0.62], 0.02, CHROME),
|
|
233
|
-
rod([s * 0.085, 0.54, -0.63], [s * 0.085, 0.9, -0.48], 0.03, GOLD),
|
|
234
|
-
{ geometry: disc(0.2), position: [s * 0.075, WHEEL_R, FRONT], rotation: AXLE_X },
|
|
235
|
-
{ geometry: block(0.04, 0.13, 0.07, 6, GOLD), position: [s * 0.11, 0.42, -0.64], rotation: quat.x(0.5) }, // radial calipers
|
|
236
|
-
// Vents in the fairing's flanks
|
|
237
|
-
...[0.46, 0.52, 0.58].map((y): GeometryPart => ({
|
|
238
|
-
geometry: block(0.012, 0.018, 0.16, 6, BLACK),
|
|
239
|
-
position: [s * 0.247, y, -0.33 + (0.52 - y) * 0.5]
|
|
240
|
-
})),
|
|
241
|
-
// The frame's aluminium side plates around the swingarm pivot, under the seat
|
|
242
|
-
{ geometry: block(0.03, 0.26, 0.24, 5, ALUMINIUM), position: [s * 0.135, 0.5, 0.1], rotation: quat.x(-0.25) },
|
|
243
|
-
// Aluminium swingarm to the rear axle
|
|
244
|
-
{
|
|
245
|
-
geometry: tube(
|
|
246
|
-
[
|
|
247
|
-
[s * 0.12, 0.42, 0.1],
|
|
248
|
-
[s * 0.12, 0.37, 0.4],
|
|
249
|
-
[s * 0.115, WHEEL_R, REAR]
|
|
250
|
-
],
|
|
251
|
-
{ radius: 0.035, shape: (a) => 0.6 + 0.4 * Math.abs(Math.sin(a * TAU)), sides: 12, smoothness: 3, color: ALUMINIUM }
|
|
252
|
-
)
|
|
253
|
-
},
|
|
254
|
-
// Clip-on bars and grips where the rider's gloves are
|
|
255
|
-
rod([s * 0.08, 0.86, -0.5], [s * 0.28, 0.79, -0.47], 0.016, ALUMINIUM),
|
|
256
|
-
rod([s * 0.27, 0.79, -0.47], [s * 0.345, 0.785, -0.465], 0.025, BLACK),
|
|
257
|
-
// Rearsets under the boots: peg, heel guard and lever
|
|
258
|
-
rod([s * 0.14, 0.38, 0.12], [s * 0.27, 0.38, 0.12], 0.014, ALUMINIUM),
|
|
259
|
-
{ geometry: block(0.01, 0.12, 0.09, 6, ALUMINIUM), position: [s * 0.19, 0.42, 0.16] },
|
|
260
|
-
rod([s * 0.2, 0.38, 0.1], [s * 0.21, 0.35, -0.04], 0.008, ALUMINIUM, 6),
|
|
261
|
-
// Mirrors on the fairing, with indicators in them
|
|
262
|
-
rod([s * 0.2, 0.84, -0.7], [s * 0.26, 0.9, -0.68], 0.01, BLACK),
|
|
263
|
-
{ geometry: ellipsoid([0.055, 0.03, 0.03], BLACK), position: [s * 0.28, 0.91, -0.68] },
|
|
264
|
-
{ geometry: ellipsoid([0.02, 0.008, 0.01], AMBER), position: [s * 0.3, 0.905, -0.7] },
|
|
265
|
-
// Rear indicators on the plate hanger
|
|
266
|
-
rod([0, 0.64, 0.95], [s * 0.1, 0.64, 0.95], 0.008, BLACK),
|
|
267
|
-
{ geometry: ellipsoid([0.025, 0.012, 0.012], AMBER), position: [s * 0.11, 0.64, 0.95] }
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
const trim = createShape(merge(parts), { center: false, shine: 0.5 });
|
|
271
|
-
bike = { body, trim, glass };
|
|
272
|
-
return bike;
|
|
273
|
-
}
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
// Bike Racing's screen, on the Nayan engine (@nayan-ui/engine): loads the assets, builds a run, and draws
|
|
2
|
-
// Playtura's scoreboard, controls and modals over the 3D view. The rules are in BikeRacingGame.ts, what
|
|
3
|
-
// it draws in BikeRacingScene.ts (on Car Racing's road), tuning and assets in BikeRacingConstants.ts.
|
|
4
|
-
//
|
|
5
|
-
// The engine runs the simulation (physics, particles, audio, haptics) in its Rust core; GameView's
|
|
6
|
-
// `onUpdate` advances the shared engine simulation and HUD once per frame.
|
|
7
|
-
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
8
|
-
import { type DragEvent, haptics } from '@nayan-ui/engine';
|
|
9
|
-
import { resolveGameTheme } from '../../services/ThemeService';
|
|
10
|
-
import { GAME_IDS, type GameProps } from '../../services/UtilsService';
|
|
11
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
12
|
-
import { livesColumn, scoreColumn, textColumn } from '../shared/EngineHud';
|
|
13
|
-
import { GameLoading } from '../shared/GameLoading';
|
|
14
|
-
import { GameLoadingTransition } from '../shared/GameLoadingTransition';
|
|
15
|
-
import { useGameResource } from '../shared/useGameResource';
|
|
16
|
-
import {
|
|
17
|
-
type Assets,
|
|
18
|
-
AUTOPLAY,
|
|
19
|
-
DAY_LIGHT,
|
|
20
|
-
EDGE,
|
|
21
|
-
getCachedAssets,
|
|
22
|
-
LIVES,
|
|
23
|
-
loadAssets,
|
|
24
|
-
NIGHT_LIGHT,
|
|
25
|
-
NIGHT_SKY,
|
|
26
|
-
SKY,
|
|
27
|
-
STEER_WIDTH,
|
|
28
|
-
TRACK_LENGTH
|
|
29
|
-
} from './BikeRacingConstants';
|
|
30
|
-
import { createGame, dispose, type Phase, setAudible, setNight, start, steer, tick } from './BikeRacingGame';
|
|
31
|
-
|
|
32
|
-
export { preloadBikeRacing } from './BikeRacingConstants';
|
|
33
|
-
|
|
34
|
-
const RESULTS_DELAY = 1200; // ms: the crash (or the finish) is seen before the modal covers it
|
|
35
|
-
|
|
36
|
-
type RunProps = GameProps & { assets: Assets; night: boolean; onRestart: () => void };
|
|
37
|
-
|
|
38
|
-
/** One run, from the start screen to the results. Restarting mounts a new one. */
|
|
39
|
-
const Run = React.memo(
|
|
40
|
-
({
|
|
41
|
-
assets,
|
|
42
|
-
night,
|
|
43
|
-
onRestart,
|
|
44
|
-
settings,
|
|
45
|
-
onSettingsChange,
|
|
46
|
-
onEndGame,
|
|
47
|
-
onReplayGame,
|
|
48
|
-
onShare,
|
|
49
|
-
onShareScreenshot,
|
|
50
|
-
onShowLeaderboard,
|
|
51
|
-
bannerAd
|
|
52
|
-
}: RunProps) => {
|
|
53
|
-
const initialNight = useRef(night);
|
|
54
|
-
const game = useGameResource(
|
|
55
|
-
() => createGame(assets, initialNight.current),
|
|
56
|
-
(value) => () => {
|
|
57
|
-
if (value.phase === 'playing') reportGameEnd('cancel');
|
|
58
|
-
dispose(value);
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
setNight(game, night);
|
|
63
|
-
}, [game, night]);
|
|
64
|
-
const width = useRef(1);
|
|
65
|
-
const [phase, setPhase] = useState<Phase>('ready');
|
|
66
|
-
const [showResults, setShowResults] = useState(false);
|
|
67
|
-
const [score, setScore] = useState(0);
|
|
68
|
-
const [lives, setLives] = useState(LIVES);
|
|
69
|
-
const [left, setLeft] = useState(TRACK_LENGTH);
|
|
70
|
-
// Report each run once: win on crossing the finish line, lose on the last crash, cancel on stop.
|
|
71
|
-
const gameReportedRef = useRef(false);
|
|
72
|
-
const onEndGameRef = useRef(onEndGame);
|
|
73
|
-
onEndGameRef.current = onEndGame;
|
|
74
|
-
const reportGameEnd = useCallback(
|
|
75
|
-
(status: 'win' | 'lose' | 'cancel') => {
|
|
76
|
-
if (!onEndGameRef.current || gameReportedRef.current) return;
|
|
77
|
-
gameReportedRef.current = true;
|
|
78
|
-
onEndGameRef.current({ status, score: game.score.toString() });
|
|
79
|
-
},
|
|
80
|
-
[game]
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
useEffect(() => {
|
|
84
|
-
haptics.enabled = settings.enableHaptics;
|
|
85
|
-
}, [settings.enableHaptics]);
|
|
86
|
-
|
|
87
|
-
useEffect(() => {
|
|
88
|
-
game.onPhase = setPhase;
|
|
89
|
-
game.onLives = setLives;
|
|
90
|
-
game.onDistance = setLeft;
|
|
91
|
-
game.onScore = setScore;
|
|
92
|
-
}, [game]);
|
|
93
|
-
|
|
94
|
-
// Game over detection, in its own effect.
|
|
95
|
-
useEffect(() => {
|
|
96
|
-
if (phase !== 'over') return;
|
|
97
|
-
reportGameEnd(game.lives > 0 ? 'win' : 'lose');
|
|
98
|
-
const t = setTimeout(() => setShowResults(true), RESULTS_DELAY);
|
|
99
|
-
return () => clearTimeout(t);
|
|
100
|
-
}, [phase, game, reportGameEnd]);
|
|
101
|
-
|
|
102
|
-
// Autoplay (EXPO_PUBLIC_AUTOPLAY=1): start by itself and restart after a pause.
|
|
103
|
-
useEffect(() => {
|
|
104
|
-
if (!AUTOPLAY || phase === 'playing') return;
|
|
105
|
-
const t = setTimeout(phase === 'ready' ? () => start(game) : onRestart, phase === 'ready' ? 1500 : 3000);
|
|
106
|
-
return () => clearTimeout(t);
|
|
107
|
-
}, [phase, game, onRestart]);
|
|
108
|
-
|
|
109
|
-
const onAudioChange = useCallback((audible: boolean) => setAudible(game, audible), [game]);
|
|
110
|
-
const onUpdate = useCallback((dt: number) => tick(game, dt), [game]);
|
|
111
|
-
|
|
112
|
-
// Relative steering: wherever the swipe starts, the bike moves by how far the finger moves.
|
|
113
|
-
const onDrag = useCallback(({ phase: touch, dx }: DragEvent) => steer(game, touch, dx, (2 * EDGE) / (STEER_WIDTH * width.current)), [game]);
|
|
114
|
-
|
|
115
|
-
const handleStartGame = useCallback(() => {
|
|
116
|
-
gameReportedRef.current = false;
|
|
117
|
-
start(game);
|
|
118
|
-
}, [game]);
|
|
119
|
-
|
|
120
|
-
// Report before resetting, then a fresh run.
|
|
121
|
-
const handleStopGame = useCallback(() => {
|
|
122
|
-
reportGameEnd('cancel');
|
|
123
|
-
onRestart();
|
|
124
|
-
}, [reportGameEnd, onRestart]);
|
|
125
|
-
|
|
126
|
-
const handleResetGame = useCallback(() => {
|
|
127
|
-
onReplayGame?.();
|
|
128
|
-
onRestart();
|
|
129
|
-
}, [onReplayGame, onRestart]);
|
|
130
|
-
|
|
131
|
-
const won = lives > 0;
|
|
132
|
-
return (
|
|
133
|
-
<EngineGameScreen
|
|
134
|
-
onAudioChange={onAudioChange}
|
|
135
|
-
gameId={GAME_IDS.BIKE_RACING}
|
|
136
|
-
settings={settings}
|
|
137
|
-
onSettingsChange={onSettingsChange}
|
|
138
|
-
onShare={onShareScreenshot ?? onShare}
|
|
139
|
-
onShowLeaderboard={onShowLeaderboard}
|
|
140
|
-
bannerAd={bannerAd}
|
|
141
|
-
source={game.world}
|
|
142
|
-
feedback={game.hudFeedback}
|
|
143
|
-
camera={game.camera}
|
|
144
|
-
light={night ? NIGHT_LIGHT : DAY_LIGHT}
|
|
145
|
-
background={night ? NIGHT_SKY : SKY}
|
|
146
|
-
fog={0.0075}
|
|
147
|
-
onUpdate={onUpdate}
|
|
148
|
-
onDrag={onDrag}
|
|
149
|
-
onResize={(value) => {
|
|
150
|
-
width.current = value;
|
|
151
|
-
}}
|
|
152
|
-
columns={[scoreColumn(score), livesColumn(lives, LIVES), textColumn('TRACK', `${left} m`)]}
|
|
153
|
-
playing={phase === 'playing'}
|
|
154
|
-
subtext="Dodge traffic to score!"
|
|
155
|
-
onStart={handleStartGame}
|
|
156
|
-
onStop={handleStopGame}
|
|
157
|
-
gameOver={
|
|
158
|
-
showResults
|
|
159
|
-
? {
|
|
160
|
-
title: won ? 'FINISHED!' : 'CRASHED!',
|
|
161
|
-
message: won
|
|
162
|
-
? `You crossed the finish line! Great riding!`
|
|
163
|
-
: `Out of lives ${TRACK_LENGTH - left} m into the ${TRACK_LENGTH} m race.`,
|
|
164
|
-
scoreLabel: 'Final Score',
|
|
165
|
-
score,
|
|
166
|
-
buttonText: 'Race Again!',
|
|
167
|
-
onPlayAgain: handleResetGame,
|
|
168
|
-
onShare: onShareScreenshot
|
|
169
|
-
}
|
|
170
|
-
: null
|
|
171
|
-
}
|
|
172
|
-
/>
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
Run.displayName = 'BikeRacingRun';
|
|
178
|
-
|
|
179
|
-
export const BikeRacing = engineGame(GAME_IDS.BIKE_RACING, (props) => {
|
|
180
|
-
const settings = props.settings;
|
|
181
|
-
const theme = resolveGameTheme(settings.theme);
|
|
182
|
-
const [run, setRun] = useState(0);
|
|
183
|
-
const [assets, setAssets] = useState<Assets | null>(getCachedAssets);
|
|
184
|
-
const [error, setError] = useState<string | null>(null);
|
|
185
|
-
|
|
186
|
-
useEffect(() => {
|
|
187
|
-
if (assets) return;
|
|
188
|
-
let alive = true;
|
|
189
|
-
// Sounds don't hold up the scene: plays before they're decoded are skipped.
|
|
190
|
-
loadAssets()
|
|
191
|
-
.then((a) => alive && setAssets(a))
|
|
192
|
-
.catch((e: Error) => alive && setError(e.message));
|
|
193
|
-
return () => {
|
|
194
|
-
alive = false;
|
|
195
|
-
};
|
|
196
|
-
}, [assets]);
|
|
197
|
-
|
|
198
|
-
const restart = useCallback(() => setRun((r) => r + 1), []);
|
|
199
|
-
|
|
200
|
-
// Dark mode rides at night. A new theme rebuilds the scene, so it starts a fresh run.
|
|
201
|
-
const night = theme.isDark;
|
|
202
|
-
return (
|
|
203
|
-
<GameLoadingTransition
|
|
204
|
-
ready={!!assets}
|
|
205
|
-
loader={
|
|
206
|
-
<GameLoading gameId={GAME_IDS.BIKE_RACING} theme={settings.theme} offset={settings.offset} error={!!error} message={error ?? undefined} />
|
|
207
|
-
}>
|
|
208
|
-
{assets && <Run key={run} {...props} settings={settings} assets={assets} night={night} onRestart={restart} />}
|
|
209
|
-
</GameLoadingTransition>
|
|
210
|
-
);
|
|
211
|
-
});
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
// Bike Racing's rules, tuning, colors, and its models (loaded once, shared by every run). The road,
|
|
2
|
-
// scenery, sounds and fire are Car Racing's (games/car-racing), shared rather than copied.
|
|
3
|
-
import type { Color, Model, Vec3 } from '@nayan-ui/engine';
|
|
4
|
-
import { type Assets as RoadAssets, loadAssets as loadRoadAssets } from '../car-racing/CarRacingConstants';
|
|
5
|
-
import { bikeMeshes } from './BikeMeshes';
|
|
6
|
-
|
|
7
|
-
export {
|
|
8
|
-
AUTOPLAY,
|
|
9
|
-
CAMERA_FOV,
|
|
10
|
-
DAY_LIGHT,
|
|
11
|
-
EDGE,
|
|
12
|
-
FINISH_CLEAR,
|
|
13
|
-
LANES,
|
|
14
|
-
LATERAL_SPEED,
|
|
15
|
-
NIGHT_LIGHT,
|
|
16
|
-
NIGHT_SKY,
|
|
17
|
-
ROAD_HALF,
|
|
18
|
-
SKY,
|
|
19
|
-
STEER_RESPONSE,
|
|
20
|
-
STEER_WIDTH,
|
|
21
|
-
TRACK_LENGTH,
|
|
22
|
-
getRacingSounds
|
|
23
|
-
} from '../car-racing/CarRacingConstants';
|
|
24
|
-
|
|
25
|
-
// ── Rules and tuning ──────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
// A sprint from the start line to the finish gate (Car Racing's track, as Penguin Run's): 3 lives,
|
|
28
|
-
// 500 points per bike passed, and every bike you run into nose first costs a life. Crossing the finish
|
|
29
|
-
// wins ("FINISHED!"); losing the last life ends it ("CRASHED!").
|
|
30
|
-
export const LIVES = 3;
|
|
31
|
-
export const POINTS_PER_BIKE_PASSED = 500;
|
|
32
|
-
|
|
33
|
-
// Faster than the cars: bikes are light.
|
|
34
|
-
export const START_SPEED = 30; // m/s, held for the whole race
|
|
35
|
-
export const TRAFFIC_SPEED = 16;
|
|
36
|
-
export const SPAWN_AHEAD = 170; // hidden by fog
|
|
37
|
-
export const CRASH_SLOWDOWN = 0.5;
|
|
38
|
-
export const INVULNERABLE = 1.6; // seconds after a crash
|
|
39
|
-
/** Passing a bike with this little between your middles (metres) counts as a near miss. */
|
|
40
|
-
export const NEAR_MISS_GAP = 1.3;
|
|
41
|
-
export const LEAN = 0.045; // radians of lean per m/s sideways
|
|
42
|
-
export const MAX_LEAN = 0.5;
|
|
43
|
-
|
|
44
|
-
/** The original game's bike colors: the player's orange, traffic in blue, green and magenta (and a few more). */
|
|
45
|
-
export const PLAYER_PAINT: Color = [1, 0.4, 0];
|
|
46
|
-
export const PAINTS: Color[] = [
|
|
47
|
-
[0, 0.4, 1],
|
|
48
|
-
[0, 0.85, 0.4],
|
|
49
|
-
[1, 0, 1],
|
|
50
|
-
[0.95, 0.95, 0.97],
|
|
51
|
-
[0.12, 0.12, 0.14],
|
|
52
|
-
[1, 0.82, 0.1]
|
|
53
|
-
];
|
|
54
|
-
export const SUIT: Color = [0.11, 0.12, 0.15];
|
|
55
|
-
export const SUIT_TRIM: Color = [0.3, 0.32, 0.36];
|
|
56
|
-
export const VISOR: Color = [0.05, 0.06, 0.09];
|
|
57
|
-
|
|
58
|
-
// ── Assets ────────────────────────────────────────────────────────────
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* One bike for everyone, built in code (BikeMeshes). Its paint is white so each bike tints its own
|
|
62
|
-
* color; the trim (frame, tyres, wheels, chrome, exhaust) and the smoked windscreen keep theirs. The
|
|
63
|
-
* rider is built from the engine's shapes (BikeRacingScene).
|
|
64
|
-
*/
|
|
65
|
-
export type BikeModel = { body: Model; trim: Model; glass: Model; size: Vec3 };
|
|
66
|
-
export type Assets = RoadAssets & { bike: BikeModel };
|
|
67
|
-
|
|
68
|
-
let assets: Promise<Assets> | undefined;
|
|
69
|
-
let cachedAssets: Assets | null = null;
|
|
70
|
-
export const getCachedAssets = (): Assets | null => cachedAssets;
|
|
71
|
-
export function loadAssets(): Promise<Assets> {
|
|
72
|
-
assets ??= loadRoadAssets().then((road) => {
|
|
73
|
-
const { body, trim, glass } = bikeMeshes();
|
|
74
|
-
return {
|
|
75
|
-
...road,
|
|
76
|
-
bike: {
|
|
77
|
-
body,
|
|
78
|
-
trim,
|
|
79
|
-
glass,
|
|
80
|
-
size: [Math.max(body.size[0], trim.size[0]), Math.max(body.size[1], trim.size[1]), Math.max(body.size[2], trim.size[2])] as Vec3
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
});
|
|
84
|
-
assets.then(
|
|
85
|
-
(value) => {
|
|
86
|
-
cachedAssets = value;
|
|
87
|
-
},
|
|
88
|
-
() => {}
|
|
89
|
-
);
|
|
90
|
-
assets.catch(() => (assets = undefined)); // a failed load is retried next time
|
|
91
|
-
return assets;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** Starts loading the game's textures and building its models (they're cached), so opening it is quick. */
|
|
95
|
-
export function preloadBikeRacing() {
|
|
96
|
-
loadAssets().catch(() => {}); // the game screen reports any error
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/** Road assets are warmed by Car Racing first and reused here. */
|
|
100
|
-
export function* warmAssets(): Iterable<() => unknown> {
|
|
101
|
-
yield bikeMeshes;
|
|
102
|
-
yield loadAssets;
|
|
103
|
-
}
|