@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,235 +0,0 @@
|
|
|
1
|
-
// Everything Connect Em All draws. Orthographic camera, one world unit per point, looking down -z:
|
|
2
|
-
// x right and y up from the view's centre. Depth (toward the camera): the game background, board, line
|
|
3
|
-
// shadows, lines, dot glows, dots. The engine doesn't clip, so what the original board's overflow: hidden
|
|
4
|
-
// cut off is kept inside instead: new dots drop in from just above their row, the trail stops at the edge.
|
|
5
|
-
import {
|
|
6
|
-
type Color,
|
|
7
|
-
type Entity,
|
|
8
|
-
extrude,
|
|
9
|
-
loadTexture,
|
|
10
|
-
type Model,
|
|
11
|
-
type MutableQuat,
|
|
12
|
-
Path,
|
|
13
|
-
quat,
|
|
14
|
-
shapeGeometry,
|
|
15
|
-
type Texture,
|
|
16
|
-
type TransformBatch,
|
|
17
|
-
type Vec3,
|
|
18
|
-
type World
|
|
19
|
-
} from '@nayan-ui/engine';
|
|
20
|
-
import { lighten } from '../../services/GamesConstants';
|
|
21
|
-
import type { GameTheme } from '../../services/ThemeService';
|
|
22
|
-
import { spawnBackdrop } from '../shared/EngineBackdrop';
|
|
23
|
-
import type { PopBurstOptions } from '../shared/EngineBlasts';
|
|
24
|
-
import { cacheGameAsset, createGameMesh as createShape } from '../shared/EngineMeshes';
|
|
25
|
-
import { toColor } from '../shared/EngineUtils';
|
|
26
|
-
import {
|
|
27
|
-
BOARD_RADIUS,
|
|
28
|
-
DOT_COLORS,
|
|
29
|
-
DOT_SHINE,
|
|
30
|
-
GLOW_ALPHA,
|
|
31
|
-
GLOW_IN_TIME,
|
|
32
|
-
GLOW_OUT_TIME,
|
|
33
|
-
GLOW_SIZE,
|
|
34
|
-
GRID_SIZE,
|
|
35
|
-
type Layout
|
|
36
|
-
} from './ConnectEmAllConstants';
|
|
37
|
-
|
|
38
|
-
const Z_BOARD = 0;
|
|
39
|
-
const Z_BACKDROP = -20;
|
|
40
|
-
const HIDDEN = 0;
|
|
41
|
-
|
|
42
|
-
/** A view point (from the top-left) at depth `z`, in world space. */
|
|
43
|
-
export const toWorld = (l: Layout, x: number, y: number, z = 0): Vec3 => [x - l.width / 2, l.height / 2 - y, z];
|
|
44
|
-
|
|
45
|
-
/** Centre of the dot at (row, col), in view points. `row` may be negative: above the board, falling in. */
|
|
46
|
-
export const dotPoint = (l: Layout, row: number, col: number): [number, number] => [
|
|
47
|
-
l.boardLeft + l.padding + col * l.spacing,
|
|
48
|
-
l.boardTop + l.padding + row * l.spacing
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
const dotZ = (l: Layout) => l.radius * 2;
|
|
52
|
-
const lineZ = (l: Layout) => l.radius * 0.5;
|
|
53
|
-
const shadowZ = (l: Layout) => l.radius * 0.4;
|
|
54
|
-
export const dotPosition = (l: Layout, row: number, col: number): Vec3 => {
|
|
55
|
-
const [x, y] = dotPoint(l, row, col);
|
|
56
|
-
return toWorld(l, x, y, dotZ(l));
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
// ── Meshes (registered once per size: mesh ids are app-wide and limited) ──
|
|
60
|
-
|
|
61
|
-
const meshes = new Map<string, Model>();
|
|
62
|
-
const mesh = (key: string, build: () => Model) => {
|
|
63
|
-
let m = meshes.get(key);
|
|
64
|
-
if (!m) {
|
|
65
|
-
m = cacheGameAsset('connect-em-all/ConnectEmAllScene:' + key, build);
|
|
66
|
-
meshes.set(key, m);
|
|
67
|
-
}
|
|
68
|
-
return m;
|
|
69
|
-
};
|
|
70
|
-
/** A glossy unit sphere. */
|
|
71
|
-
const dotMesh = () => mesh('dot', () => createShape(shapeGeometry('sphere'), { shine: DOT_SHINE }));
|
|
72
|
-
/** A flat unit disc facing the camera. */
|
|
73
|
-
const discMesh = () => mesh('disc', () => createShape(extrude(new Path().addCircle(0, 0, 0.5), { depth: 0 })));
|
|
74
|
-
/** A flat rounded square; with `rim`, only its outline. */
|
|
75
|
-
const panelMesh = (size: number, radius: number, rim = 0) =>
|
|
76
|
-
mesh(`panel:${size}:${radius}:${rim}`, () => {
|
|
77
|
-
const path = new Path().addRoundedRect(0, 0, size, size, radius);
|
|
78
|
-
if (rim > 0) path.addRoundedRect(rim, rim, size - rim * 2, size - rim * 2, radius - rim);
|
|
79
|
-
return createShape(extrude(path, { depth: 0, fillRule: 'evenodd' }));
|
|
80
|
-
});
|
|
81
|
-
// ── Board ─────────────────────────────────────────────────────────────
|
|
82
|
-
|
|
83
|
-
export type Board = { backdrop: Entity; panel: Entity; rim: Entity };
|
|
84
|
-
|
|
85
|
-
/** The game background, and behind the whole grid the board panel and its rim, as Block Blast's: in the theme's board colors. */
|
|
86
|
-
export function buildBoard(world: World, l: Layout, theme: GameTheme): Board {
|
|
87
|
-
loadGlowTexture();
|
|
88
|
-
const centre = toWorld(l, l.boardLeft + l.boardSize / 2, l.boardTop + l.boardSize / 2);
|
|
89
|
-
const panel = world.spawn({
|
|
90
|
-
mesh: panelMesh(l.boardSize, BOARD_RADIUS),
|
|
91
|
-
position: [centre[0], centre[1], Z_BOARD],
|
|
92
|
-
color: toColor(theme.BOARD.SURFACE),
|
|
93
|
-
pickable: false
|
|
94
|
-
});
|
|
95
|
-
const rim = world.spawn({
|
|
96
|
-
mesh: panelMesh(l.boardSize, BOARD_RADIUS, 1),
|
|
97
|
-
position: [centre[0], centre[1], Z_BOARD + 0.2],
|
|
98
|
-
color: toColor(theme.BOARD.BORDER),
|
|
99
|
-
pickable: false
|
|
100
|
-
});
|
|
101
|
-
return { backdrop: spawnBackdrop(world, l.width, l.height, Z_BACKDROP, theme), panel, rim };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function removeBoard(world: World, b: Board) {
|
|
105
|
-
world.despawn(b.panel);
|
|
106
|
-
world.despawn(b.rim);
|
|
107
|
-
world.despawn(b.backdrop);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// ── Dots ──────────────────────────────────────────────────────────────
|
|
111
|
-
|
|
112
|
-
// Per color: the dot, its chain line (a little lighter) and its burst's highlight
|
|
113
|
-
const DOTS = DOT_COLORS.map((c) => toColor(c));
|
|
114
|
-
const LINES = DOT_COLORS.map((c) => toColor(lighten(c, 0.15)));
|
|
115
|
-
export const dotColor = (colorIndex: number) => DOTS[colorIndex]!;
|
|
116
|
-
export const lineColor = (colorIndex: number) => LINES[colorIndex]!;
|
|
117
|
-
|
|
118
|
-
// The halo's texture: white, its opacity full under the dot and easing off smoothly to nothing at the
|
|
119
|
-
// rim, so the halo reads as light spilling from the dot. Loaded once; drawn blended (alpha below 1).
|
|
120
|
-
let glowTexture: Texture | null = null;
|
|
121
|
-
let glowLoading: Promise<void> | null = null;
|
|
122
|
-
export function loadGlowTexture() {
|
|
123
|
-
glowLoading ??= loadTexture(require('../../assets/textures/soft_glow.png'))
|
|
124
|
-
.then((t) => {
|
|
125
|
-
glowTexture = t;
|
|
126
|
-
})
|
|
127
|
-
.catch(() => {
|
|
128
|
-
glowLoading = null; // retried with the next board
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** A dot and its glow: a soft halo behind it, shown while it's in the chain. */
|
|
133
|
-
export function spawnDot(world: World, l: Layout, row: number, col: number, colorIndex: number): { entity: Entity; glow: Entity } {
|
|
134
|
-
const color = dotColor(colorIndex);
|
|
135
|
-
const entity = world.spawn({ mesh: dotMesh(), position: dotPosition(l, row, col), scale: l.radius * 2, color, pickable: false });
|
|
136
|
-
const glow = world.spawn({
|
|
137
|
-
mesh: discMesh(),
|
|
138
|
-
texture: glowTexture,
|
|
139
|
-
parent: entity,
|
|
140
|
-
// Parent units: the dot is 1 across. Behind the sphere, so only the fading part shows around it.
|
|
141
|
-
position: [0, 0, -0.55],
|
|
142
|
-
scale: HIDDEN,
|
|
143
|
-
color: [color[0], color[1], color[2], GLOW_ALPHA],
|
|
144
|
-
pickable: false
|
|
145
|
-
});
|
|
146
|
-
return { entity, glow };
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** The halo blooms in (overshooting a touch) and stays steady while the dot is in the chain, or fades away. */
|
|
150
|
-
export function showGlow(world: World, glow: Entity, on: boolean) {
|
|
151
|
-
// Dots made before the texture arrived pick it up the first time they glow
|
|
152
|
-
if (on && glowTexture) world.set(glow, { mesh: discMesh(), texture: glowTexture });
|
|
153
|
-
world.stopAnimation(glow);
|
|
154
|
-
world.animate(
|
|
155
|
-
glow,
|
|
156
|
-
{ scale: on ? GLOW_SIZE : HIDDEN },
|
|
157
|
-
on ? { duration: GLOW_IN_TIME, easing: 'back' } : { duration: GLOW_OUT_TIME, easing: 'easeIn' }
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/** Where a cleared dot's burst flies from (in front of it) and glows (behind it, over the chain lines). */
|
|
162
|
-
export function dotBurst(l: Layout, row: number, col: number, colorIndex: number): PopBurstOptions {
|
|
163
|
-
const at = dotPosition(l, row, col);
|
|
164
|
-
return { position: [at[0], at[1], at[2] + l.radius], size: l.radius * 2, color: dotColor(colorIndex), glowZ: l.radius * 0.8 };
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** A dot's scale at rest (for popping it away). */
|
|
168
|
-
export const dotScale = (l: Layout) => l.radius * 2;
|
|
169
|
-
|
|
170
|
-
// ── Lines ─────────────────────────────────────────────────────────────
|
|
171
|
-
|
|
172
|
-
/** A chain segment: its drop shadow and the line itself. */
|
|
173
|
-
export type Segment = { shadow: Entity; line: Entity };
|
|
174
|
-
|
|
175
|
-
export function spawnSegment(world: World): Segment {
|
|
176
|
-
const bar = () => world.spawn({ mesh: 'cube', scale: HIDDEN, pickable: false });
|
|
177
|
-
return { shadow: bar(), line: bar() };
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const SHADOW: Color = [0, 0, 0, 0.3];
|
|
181
|
-
const scratch: MutableQuat = [0, 0, 0, 1];
|
|
182
|
-
|
|
183
|
-
/** Places a bar from a to b (view points), `width` thick. Its ends sit under the dots it joins. */
|
|
184
|
-
function placeBar(updates: TransformBatch, l: Layout, bar: Entity, a: [number, number], b: [number, number], width: number, z: number, color: Color) {
|
|
185
|
-
const dx = b[0] - a[0];
|
|
186
|
-
const dy = a[1] - b[1]; // world y runs up
|
|
187
|
-
const position = toWorld(l, (a[0] + b[0]) / 2, (a[1] + b[1]) / 2, z);
|
|
188
|
-
const rotation = quat.z(Math.atan2(dy, dx), scratch);
|
|
189
|
-
updates.transform(bar, position[0], position[1], position[2], rotation[0], rotation[1], rotation[2], rotation[3]);
|
|
190
|
-
updates.scale(bar, Math.hypot(dx, dy), width, 0.5);
|
|
191
|
-
updates.color(bar, color[0], color[1], color[2], color[3] ?? 1);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export const lineWidth = (l: Layout) => l.radius * 0.45;
|
|
195
|
-
|
|
196
|
-
export function showSegment(world: World, l: Layout, s: Segment, a: [number, number], b: [number, number], color: Color) {
|
|
197
|
-
const updates = world.transforms;
|
|
198
|
-
const w = lineWidth(l);
|
|
199
|
-
placeBar(updates, l, s.shadow, [a[0] + 1, a[1] + 2], [b[0] + 1, b[1] + 2], w + 2, shadowZ(l), SHADOW);
|
|
200
|
-
placeBar(updates, l, s.line, a, b, w, lineZ(l), color);
|
|
201
|
-
updates.flush();
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function hideSegment(world: World, s: Segment) {
|
|
205
|
-
world.set(s.shadow, { scale: HIDDEN });
|
|
206
|
-
world.set(s.line, { scale: HIDDEN });
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/** The line from the chain's last dot to the finger, with a round end at the finger. */
|
|
210
|
-
export type Trail = { line: Entity; cap: Entity };
|
|
211
|
-
|
|
212
|
-
export function spawnTrail(world: World): Trail {
|
|
213
|
-
return {
|
|
214
|
-
line: world.spawn({ mesh: 'cube', scale: HIDDEN, pickable: false }),
|
|
215
|
-
cap: world.spawn({ mesh: discMesh(), scale: HIDDEN, pickable: false })
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function showTrail(world: World, l: Layout, t: Trail, from: [number, number], to: [number, number], color: Color) {
|
|
220
|
-
const updates = world.transforms;
|
|
221
|
-
const w = lineWidth(l);
|
|
222
|
-
placeBar(updates, l, t.line, from, to, w, lineZ(l), color);
|
|
223
|
-
const position = toWorld(l, to[0], to[1], lineZ(l));
|
|
224
|
-
updates.position(t.cap, position[0], position[1], position[2]);
|
|
225
|
-
updates.scale(t.cap, w);
|
|
226
|
-
updates.color(t.cap, color[0], color[1], color[2], color[3] ?? 1);
|
|
227
|
-
updates.flush();
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export function hideTrail(world: World, t: Trail) {
|
|
231
|
-
world.set(t.line, { scale: HIDDEN });
|
|
232
|
-
world.set(t.cap, { scale: HIDDEN });
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export const DOT_COUNT = GRID_SIZE * GRID_SIZE;
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// Crossy Road's code-built low-poly scene, shared game HUD and native hop animations.
|
|
2
|
-
import { HapticType } from '../../services/HapticsService';
|
|
3
|
-
import { GAME_SOUNDS } from '../../services/SoundsService';
|
|
4
|
-
import { GAME_IDS } from '../../services/UtilsService';
|
|
5
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
6
|
-
import { scoreColumn, textColumn, timerColumn } from '../shared/EngineHud';
|
|
7
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
8
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
9
|
-
import { DAY_LIGHT, GAME_DURATION, getLayout, LOW_TIME, NIGHT_LIGHT, SKY_DAY, SKY_NIGHT, TOTAL_ROADS } from './CrossyRoadConstants';
|
|
10
|
-
import { createGame, dispose, drag, reset, setLayout, setNight, start, tick } from './CrossyRoadGame';
|
|
11
|
-
|
|
12
|
-
const SOUNDS = GAME_SOUNDS.CROSSY_ROAD;
|
|
13
|
-
|
|
14
|
-
export const CrossyRoad = engineGame(GAME_IDS.CROSSY_ROAD, (props) => {
|
|
15
|
-
const [score, setScore] = useLiveState(0);
|
|
16
|
-
const [crossings, setCrossings] = useLiveState(0);
|
|
17
|
-
const [time, setTime] = useLiveState(GAME_DURATION);
|
|
18
|
-
const { theme, status, screen, gameOver } = useEngineGame(props, {
|
|
19
|
-
gameId: GAME_IDS.CROSSY_ROAD,
|
|
20
|
-
create: (theme) => createGame(theme.isDark),
|
|
21
|
-
start,
|
|
22
|
-
reset,
|
|
23
|
-
dispose,
|
|
24
|
-
tick,
|
|
25
|
-
setTheme: (g, theme) => setNight(g, theme.isDark),
|
|
26
|
-
resize: (g, width, height, offset) => {
|
|
27
|
-
const l = getLayout(width, height, offset);
|
|
28
|
-
setLayout(g, l);
|
|
29
|
-
return l.gridW;
|
|
30
|
-
},
|
|
31
|
-
drag,
|
|
32
|
-
sounds: SOUNDS,
|
|
33
|
-
resultsDelay: (status) => (status === 'win' ? 1050 : 450),
|
|
34
|
-
onStart: (fx) => fx(SOUNDS.START, HapticType.SUCCESS),
|
|
35
|
-
onStop: (fx) => fx(null, HapticType.MEDIUM),
|
|
36
|
-
onOver: (fx, status) => {
|
|
37
|
-
if (status === 'win') fx(SOUNDS.WIN, HapticType.SUCCESS);
|
|
38
|
-
},
|
|
39
|
-
wire: (g, fx) => {
|
|
40
|
-
g.onScore = (value, roads) => {
|
|
41
|
-
setScore(value);
|
|
42
|
-
setCrossings(roads);
|
|
43
|
-
};
|
|
44
|
-
g.onTime = setTime;
|
|
45
|
-
g.onEvent = (event) => {
|
|
46
|
-
if (event === 'hop') fx(SOUNDS.HOP, HapticType.LIGHT);
|
|
47
|
-
else if (event === 'cross') fx(SOUNDS.CROSS, HapticType.SUCCESS);
|
|
48
|
-
else if (event === 'crash') fx(SOUNDS.CRASH, HapticType.ERROR);
|
|
49
|
-
else fx(SOUNDS.TIME_UP, HapticType.ERROR);
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
const night = theme.isDark;
|
|
54
|
-
return (
|
|
55
|
-
<EngineGameScreen
|
|
56
|
-
{...screen}
|
|
57
|
-
light={night ? NIGHT_LIGHT : DAY_LIGHT}
|
|
58
|
-
background={night ? SKY_NIGHT : SKY_DAY}
|
|
59
|
-
fog={0.0015}
|
|
60
|
-
columns={[scoreColumn(score), textColumn('CROSSINGS', `${crossings}/${TOTAL_ROADS}`), timerColumn(time, theme, LOW_TIME)]}
|
|
61
|
-
subtext="Cross roads, dodge traffic!"
|
|
62
|
-
gameOver={gameOver({
|
|
63
|
-
title: status === 'win' ? 'YOU WIN!' : 'GAME OVER',
|
|
64
|
-
message:
|
|
65
|
-
status === 'win'
|
|
66
|
-
? `You crossed all ${crossings} roads with time to spare!`
|
|
67
|
-
: `You crossed ${crossings} ${crossings === 1 ? 'road' : 'roads'}!`,
|
|
68
|
-
scoreLabel: 'Score',
|
|
69
|
-
score,
|
|
70
|
-
buttonText: 'Play Again!'
|
|
71
|
-
})}
|
|
72
|
-
/>
|
|
73
|
-
);
|
|
74
|
-
});
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// Crossy Road's camera: a perspective camera behind and above the start lane, looking up the board,
|
|
2
|
-
// placed so the whole board (all 13 lanes) fills the band between the scoreboard and the controls and
|
|
3
|
-
// its nine columns fit across. Worked out once per layout by projecting the board's corners, as the
|
|
4
|
-
// renderer will (vertical field of view, the view's aspect, +y up the board, +z up off it).
|
|
5
|
-
import type { Camera } from '@nayan-ui/engine';
|
|
6
|
-
import { CAMERA_FOV, CAMERA_PITCH, type Layout, PERSON, TOTAL_LANES, WORLD_SCALE } from './CrossyRoadConstants';
|
|
7
|
-
|
|
8
|
-
type V3 = [number, number, number];
|
|
9
|
-
const dot = (a: V3, b: V3) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
10
|
-
|
|
11
|
-
/** The view point of a world point, for a camera at `eye` looking along +y tilted down by the pitch. */
|
|
12
|
-
export function viewPoint(l: Layout, eye: V3, p: V3): [number, number] {
|
|
13
|
-
const f: V3 = [0, Math.cos(CAMERA_PITCH), -Math.sin(CAMERA_PITCH)];
|
|
14
|
-
const u: V3 = [0, Math.sin(CAMERA_PITCH), Math.cos(CAMERA_PITCH)];
|
|
15
|
-
const v: V3 = [p[0] - eye[0], p[1] - eye[1], p[2] - eye[2]];
|
|
16
|
-
const depth = dot(v, f);
|
|
17
|
-
const t = Math.tan(CAMERA_FOV / 2);
|
|
18
|
-
const aspect = l.width / l.height;
|
|
19
|
-
return [(l.width / 2) * (1 + v[0] / (depth * t * aspect)), (l.height / 2) * (1 - dot(v, u) / (depth * t))];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Places the camera to frame the board (world units, a tenth of view points). With the pitch fixed, a
|
|
24
|
-
* board point a distance `a` ahead of the eye shows at view height n (-1 bottom .. 1 top) when
|
|
25
|
-
* a = h * g(n), h the eye's height; so the near and far edges' wanted heights give h and the eye's place
|
|
26
|
-
* exactly. The far constraint includes the pedestrian's head, so the scoreboard cannot hide them at
|
|
27
|
-
* the goal. If the nine columns wouldn't fit across the nearest lane, the band is narrowed until they do.
|
|
28
|
-
*/
|
|
29
|
-
export function frameCamera(camera: Camera, l: Layout) {
|
|
30
|
-
const k = WORLD_SCALE;
|
|
31
|
-
const half = (TOTAL_LANES * l.laneH * k) / 2;
|
|
32
|
-
const goalY = half - (l.laneH * k) / 2;
|
|
33
|
-
const headHeight = PERSON.HEIGHT * PERSON.SCALE * l.tile * k;
|
|
34
|
-
const c = Math.cos(CAMERA_PITCH);
|
|
35
|
-
const s = Math.sin(CAMERA_PITCH);
|
|
36
|
-
const t = Math.tan(CAMERA_FOV / 2);
|
|
37
|
-
const aspect = l.width / l.height;
|
|
38
|
-
const g = (n: number) => (c + n * t * s) / (s - n * t * c);
|
|
39
|
-
const ndc = (y: number) => 1 - (2 * y) / l.height;
|
|
40
|
-
const mid = (l.top + l.bottom) / 2;
|
|
41
|
-
let span = l.bottom - l.top;
|
|
42
|
-
let eye: V3 = [0, 0, 0];
|
|
43
|
-
for (let i = 0; i < 80; i++) {
|
|
44
|
-
const nNear = ndc(mid + span / 2);
|
|
45
|
-
const nFar = ndc(mid - span / 2);
|
|
46
|
-
const h = (goalY + half + headHeight * g(nFar)) / (g(nFar) - g(nNear));
|
|
47
|
-
const ey = -half - h * g(nNear);
|
|
48
|
-
eye = [0, ey, h];
|
|
49
|
-
// The nearest lane's half-width in view, at its depth
|
|
50
|
-
const depth = (-half - ey) * c + h * s;
|
|
51
|
-
if (depth * t * aspect >= (l.gridW / 2 + l.tile * 0.3) * k) break;
|
|
52
|
-
span *= 0.97;
|
|
53
|
-
}
|
|
54
|
-
// Looking along the pitch from the eye: the target where the view's axis meets the board
|
|
55
|
-
camera.eye = eye;
|
|
56
|
-
camera.target = [0, eye[1] + eye[2] / Math.tan(CAMERA_PITCH), 0];
|
|
57
|
-
camera.fov = CAMERA_FOV;
|
|
58
|
-
delete camera.ortho;
|
|
59
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import type { Light } from '@nayan-ui/engine';
|
|
2
|
-
import { isTablet } from '../../services/UtilsService';
|
|
3
|
-
// Crossy Road's rules, tuning, colors and layout. The board, traffic and scoring match the original version
|
|
4
|
-
// (games/crossy-road): rules are in view points (one world unit per point), sized from the view's width
|
|
5
|
-
// exactly as the original board sized itself from the window, so traffic moves as it did.
|
|
6
|
-
import { getScoreBoardTop } from '../shared/EngineHud';
|
|
7
|
-
import { gameWidthFor } from '../shared/EngineUtils';
|
|
8
|
-
|
|
9
|
-
// ── Rules ─────────────────────────────────────────────────────────────
|
|
10
|
-
|
|
11
|
-
export const COLS = 9;
|
|
12
|
-
export const TOTAL_ROADS = 9;
|
|
13
|
-
const ROADS_PER_REST = 3;
|
|
14
|
-
export type LaneType = 'grass' | 'road';
|
|
15
|
-
|
|
16
|
-
/** A grass start lane, nine roads with a grass rest lane after every three, a grass goal lane (bottom to top). */
|
|
17
|
-
export const LANE_TYPES: LaneType[] = (() => {
|
|
18
|
-
const pattern: LaneType[] = ['grass'];
|
|
19
|
-
let roads = 0;
|
|
20
|
-
let since = 0;
|
|
21
|
-
while (roads < TOTAL_ROADS) {
|
|
22
|
-
pattern.push('road');
|
|
23
|
-
roads++;
|
|
24
|
-
since++;
|
|
25
|
-
if (since === ROADS_PER_REST && roads < TOTAL_ROADS) {
|
|
26
|
-
pattern.push('grass');
|
|
27
|
-
since = 0;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
pattern.push('grass');
|
|
31
|
-
return pattern;
|
|
32
|
-
})();
|
|
33
|
-
export const TOTAL_LANES = LANE_TYPES.length;
|
|
34
|
-
export const GOAL_ROW = TOTAL_LANES - 1;
|
|
35
|
-
|
|
36
|
-
export const GAME_DURATION = 120; // seconds
|
|
37
|
-
export const SCORE_PER_CROSS = 2000;
|
|
38
|
-
export const LOW_TIME = 10;
|
|
39
|
-
|
|
40
|
-
// Traffic, in points per 60 Hz frame (as the original game moved it)
|
|
41
|
-
export const CAR_SPEED_MIN = isTablet ? 2.0 : 1.55;
|
|
42
|
-
export const CAR_SPEED_MAX = isTablet ? 4.15 : 3.25;
|
|
43
|
-
export const STEP_MS = 1000 / 60;
|
|
44
|
-
export const MAX_PENDING_MS = 50;
|
|
45
|
-
/** Traffic speeds up a little with every road crossed. */
|
|
46
|
-
export const speedScale = (crossings: number) => Math.min(1 + crossings * 0.065, 1.9);
|
|
47
|
-
|
|
48
|
-
// ── Touch and feel ────────────────────────────────────────────────────
|
|
49
|
-
|
|
50
|
-
export const MOVE_TIME = 0.2; // seconds per grid move, with two alternating running footfalls
|
|
51
|
-
export const SWIPE = 18; // points a finger travels for a swipe
|
|
52
|
-
export const TAP_MAX = 0.25; // seconds a tap may take
|
|
53
|
-
|
|
54
|
-
// ── Colors ────────────────────────────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
export const COLORS = {
|
|
57
|
-
GRASS_LIGHT: '#95CF69',
|
|
58
|
-
GRASS_DARK: '#83BF5C',
|
|
59
|
-
GRASS_TUFT: '#4E9A2E',
|
|
60
|
-
ROAD: '#4B5667',
|
|
61
|
-
ROAD_EDGE: '#3C3C46',
|
|
62
|
-
ROAD_LINE: '#C9C9CF',
|
|
63
|
-
CAR_COLORS: ['#FF5C5C', '#FFD93D', '#6BCB77', '#A66CFF', '#FF9F45', '#4D96FF', '#37C7C2', '#F2EEE2', '#EF7CAB'],
|
|
64
|
-
WHEEL: '#15151A',
|
|
65
|
-
WINDOW: '#2A3442',
|
|
66
|
-
PLAYER: '#3B82C4',
|
|
67
|
-
TRUNK: '#7A4E2D',
|
|
68
|
-
LEAVES: '#3FA34D',
|
|
69
|
-
FLOWERS: ['#FFFFFF', '#FFD1EC', '#C7B3FF', '#FFF2B0'],
|
|
70
|
-
CURB: '#C9C6BE',
|
|
71
|
-
LINE: '#F2F2EE',
|
|
72
|
-
BUSH: '#3E8E3A',
|
|
73
|
-
ROCK: '#8E8C88'
|
|
74
|
-
} as const;
|
|
75
|
-
export const PERSON = { SCALE: 0.82, HEIGHT: 1.817, STRIDE: 0.5 } as const;
|
|
76
|
-
export const PERSON_COLORS = {
|
|
77
|
-
SKIN: '#DCA67D',
|
|
78
|
-
JACKET: COLORS.PLAYER,
|
|
79
|
-
PANTS: '#3B4558',
|
|
80
|
-
HAIR: '#352B27',
|
|
81
|
-
SHOE: '#39434C',
|
|
82
|
-
SOLE: '#F0ECE1',
|
|
83
|
-
BACKPACK: '#CE8248',
|
|
84
|
-
STRAP: '#72513A'
|
|
85
|
-
} as const;
|
|
86
|
-
// ── The scene ─────────────────────────────────────────────────────────
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* The rules are in view points (a lane is about 40 of them), but the engine draws only what's within
|
|
90
|
-
* 500 units of the camera and shadows a few dozen units round it, so the whole scene hangs off a root
|
|
91
|
-
* scaled to a tenth: one world unit is ten points.
|
|
92
|
-
*/
|
|
93
|
-
export const WORLD_SCALE = 0.1;
|
|
94
|
-
/** A perspective camera behind and above the start lane, looking up the board at this angle below level. */
|
|
95
|
-
export const CAMERA_PITCH = 0.92;
|
|
96
|
-
export const CAMERA_FOV = 0.7;
|
|
97
|
-
export const SKY_DAY = [0.62, 0.78, 0.95] as const;
|
|
98
|
-
export const SKY_NIGHT = [0.227, 0.192, 0.376] as const;
|
|
99
|
-
/** The sun high to the front left (z is up off the board), shadows falling up and right; the night's dim bluish moonlight. */
|
|
100
|
-
export const DAY_LIGHT: Light = { direction: [-0.45, -0.55, 1], ambient: 0.5, shadowExtent: 40 };
|
|
101
|
-
export const NIGHT_LIGHT: Light = { direction: [-0.3, -0.5, 1], ambient: 0.66, shadowExtent: 40, color: [0.84, 0.88, 1] };
|
|
102
|
-
|
|
103
|
-
// ── Layout (view points) ──────────────────────────────────────────────
|
|
104
|
-
|
|
105
|
-
const SCOREBOARD_HEIGHT = 82;
|
|
106
|
-
const CONTROLS_HEIGHT = 110;
|
|
107
|
-
|
|
108
|
-
export type Layout = {
|
|
109
|
-
width: number;
|
|
110
|
-
height: number;
|
|
111
|
-
/** A column's width, a lane's depth, the player grid's width and its left edge (view x). */
|
|
112
|
-
tile: number;
|
|
113
|
-
laneH: number;
|
|
114
|
-
gridW: number;
|
|
115
|
-
gridLeft: number;
|
|
116
|
-
/** The view's band between the scoreboard and the controls, where the board is framed (view y). */
|
|
117
|
-
top: number;
|
|
118
|
-
bottom: number;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
/** Wider lanes fill more of the view while the camera keeps all nine columns reachable. */
|
|
122
|
-
export function getLayout(width: number, height: number, offset: number): Layout {
|
|
123
|
-
const playWidth = gameWidthFor(width);
|
|
124
|
-
const tile = Math.floor(playWidth / COLS);
|
|
125
|
-
const gridW = COLS * tile;
|
|
126
|
-
const top = getScoreBoardTop(offset) + SCOREBOARD_HEIGHT;
|
|
127
|
-
const bottom = Math.max(top + 200, height - CONTROLS_HEIGHT);
|
|
128
|
-
return { width, height, tile, laneH: tile * 1.25, gridW, gridLeft: Math.round((width - gridW) / 2), top, bottom };
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/** A column's centre (view x). */
|
|
132
|
-
export const colX = (l: Layout, col: number) => l.gridLeft + col * l.tile + l.tile / 2;
|