@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,73 +0,0 @@
|
|
|
1
|
-
// Fruit Merger's screen, on the Nayan engine: the glass, the fruits and the drop guide are one 3D scene,
|
|
2
|
-
// under Playtura's scoreboard (the score and the clock), controls and modals.
|
|
3
|
-
// The play is in FruitMergerGame.ts (the physics in FruitMergerRules.ts), what it draws in
|
|
4
|
-
// FruitMergerScene.ts.
|
|
5
|
-
//
|
|
6
|
-
// One world serves the whole visit: Start, Stop and Play Again reset it in place and a theme change
|
|
7
|
-
// repaints the glass, so the GPU view is never rebuilt. JS steps the pile (the original version's fixed 60 Hz
|
|
8
|
-
// physics) and the world once a frame; pops, rings and bursts animate in the engine's Rust core.
|
|
9
|
-
import { HapticType } from '../../services/HapticsService';
|
|
10
|
-
import { GAME_SOUNDS } from '../../services/SoundsService';
|
|
11
|
-
import { GAME_IDS } from '../../services/UtilsService';
|
|
12
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
13
|
-
import { scoreColumn, timerColumn } from '../shared/EngineHud';
|
|
14
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
15
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
16
|
-
import { GAME_TIME, getLayout, LIGHT } from './FruitMergerConstants';
|
|
17
|
-
import { createGame, dispose, drag, finalScore, type GameEvent, type Outcome, reset, setLayout, setTheme, start, tick } from './FruitMergerGame';
|
|
18
|
-
|
|
19
|
-
const SOUNDS = GAME_SOUNDS.FRUIT_MERGER;
|
|
20
|
-
/** Each event's sound and haptic, as the original version played them. */
|
|
21
|
-
const FEEDBACK: Record<GameEvent, { sound: (typeof SOUNDS)[keyof typeof SOUNDS]; haptic: HapticType }> = {
|
|
22
|
-
drop: { sound: SOUNDS.DROP, haptic: HapticType.LIGHT },
|
|
23
|
-
merge: { sound: SOUNDS.MERGE, haptic: HapticType.MEDIUM },
|
|
24
|
-
win: { sound: SOUNDS.COMPLETE, haptic: HapticType.SUCCESS }
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const MESSAGES: Record<Outcome, string> = { win: 'You reached the Pumpkin!', time: 'You ran out of time!', overflow: 'Fruits overflowed!' };
|
|
28
|
-
|
|
29
|
-
export const FruitMerger = engineGame(GAME_IDS.FRUIT_MERGER, (props) => {
|
|
30
|
-
const [time, setTime] = useLiveState(GAME_TIME);
|
|
31
|
-
const [score, setScore] = useLiveState(0);
|
|
32
|
-
|
|
33
|
-
// A win (scored by its time) or a loss
|
|
34
|
-
const { game, theme, status, screen, gameOver } = useEngineGame(props, {
|
|
35
|
-
gameId: GAME_IDS.FRUIT_MERGER,
|
|
36
|
-
create: createGame,
|
|
37
|
-
start,
|
|
38
|
-
reset,
|
|
39
|
-
dispose,
|
|
40
|
-
tick,
|
|
41
|
-
setTheme,
|
|
42
|
-
resize: (g, width, height, offset) => setLayout(g, getLayout(width, height, offset)),
|
|
43
|
-
drag,
|
|
44
|
-
outcome: (g) => (g.outcome === 'win' ? 'win' : 'lose'),
|
|
45
|
-
reportScore: (g) => finalScore(g),
|
|
46
|
-
sounds: SOUNDS,
|
|
47
|
-
onStart: (fx) => fx(SOUNDS.START, HapticType.MEDIUM),
|
|
48
|
-
onOver: (fx, s) => {
|
|
49
|
-
if (s !== 'win') fx(SOUNDS.GAME_OVER, HapticType.HEAVY);
|
|
50
|
-
},
|
|
51
|
-
wire: (g, fx) => {
|
|
52
|
-
g.onTime = setTime;
|
|
53
|
-
g.onScore = setScore;
|
|
54
|
-
g.onEvent = (event) => fx(FEEDBACK[event].sound, FEEDBACK[event].haptic);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<EngineGameScreen
|
|
60
|
-
{...screen}
|
|
61
|
-
light={LIGHT}
|
|
62
|
-
columns={[scoreColumn(score), timerColumn(time, theme, 0)]}
|
|
63
|
-
subtext="Merge fruits!"
|
|
64
|
-
gameOver={gameOver({
|
|
65
|
-
title: status === 'win' ? 'YOU WON!' : 'GAME OVER',
|
|
66
|
-
message: MESSAGES[game.outcome ?? 'overflow'],
|
|
67
|
-
scoreLabel: 'Score',
|
|
68
|
-
score: finalScore(game),
|
|
69
|
-
buttonText: 'Merge Again!'
|
|
70
|
-
})}
|
|
71
|
-
/>
|
|
72
|
-
);
|
|
73
|
-
});
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { getGameDimensions } from '../../services/UtilsService';
|
|
2
|
-
// Fruit Merger's rules, tuning, colors and layout. The fruit chain, sizes and physics constants are the
|
|
3
|
-
// original version's (games/fruit-merger), scaled by the same game width, so the pile behaves the same.
|
|
4
|
-
import { getScoreBoardTop } from '../shared/EngineHud';
|
|
5
|
-
import { frontLight } from '../shared/EngineUtils';
|
|
6
|
-
|
|
7
|
-
const { width: GAME_WIDTH } = getGameDimensions();
|
|
8
|
-
const SCALE = GAME_WIDTH / 360; // relative to the 360-point design width, as the original game
|
|
9
|
-
|
|
10
|
-
// ── Rules ─────────────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* The merge chain, in order of real size (round fruits that stack and roll): two of a kind make the
|
|
14
|
-
* next, up to the pumpkin (the win). Sizes and scores step up evenly, as the original chain did.
|
|
15
|
-
*/
|
|
16
|
-
export const FRUIT_TYPES = [
|
|
17
|
-
{ id: 0, name: 'strawberry', size: Math.round(40 * SCALE), color: '#FFCDD2', score: 10 },
|
|
18
|
-
{ id: 1, name: 'kiwi', size: Math.round(52 * SCALE), color: '#DCEDC8', score: 20 },
|
|
19
|
-
{ id: 2, name: 'lemon', size: Math.round(64 * SCALE), color: '#FFF9C4', score: 40 },
|
|
20
|
-
{ id: 3, name: 'peach', size: Math.round(76 * SCALE), color: '#FFE4E1', score: 80 },
|
|
21
|
-
{ id: 4, name: 'orange', size: Math.round(88 * SCALE), color: '#FFE0B2', score: 160 },
|
|
22
|
-
{ id: 5, name: 'apple', size: Math.round(100 * SCALE), color: '#FFCDD2', score: 320 },
|
|
23
|
-
{ id: 6, name: 'pomegranate', size: Math.round(112 * SCALE), color: '#F8BBD0', score: 640 },
|
|
24
|
-
{ id: 7, name: 'papaya', size: Math.round(124 * SCALE), color: '#FFE0B2', score: 1280 },
|
|
25
|
-
{ id: 8, name: 'watermelon', size: Math.round(136 * SCALE), color: '#C8E6C9', score: 2560 },
|
|
26
|
-
{ id: 9, name: 'pumpkin', size: Math.round(148 * SCALE), color: '#FFCC80', score: 5120 }
|
|
27
|
-
] as const;
|
|
28
|
-
export type FruitName = (typeof FRUIT_TYPES)[number]['name'];
|
|
29
|
-
export const LAST_TYPE = FRUIT_TYPES.length - 1;
|
|
30
|
-
|
|
31
|
-
export const GAME_TIME = 900; // 15 minutes
|
|
32
|
-
/** A win scores by its time against two minutes, as the original game did. */
|
|
33
|
-
export const EXPECTED_TIME = 120;
|
|
34
|
-
export const BASE_SCORE = 100;
|
|
35
|
-
export const MAX_DROP_TYPE = 4; // the first four fruits are dropped
|
|
36
|
-
|
|
37
|
-
// ── Physics (per 60 Hz step, in play-area points) ─────────────────────
|
|
38
|
-
|
|
39
|
-
export const CONTAINER_WIDTH = GAME_WIDTH;
|
|
40
|
-
export const CONTAINER_HEIGHT = Math.round(480 * SCALE);
|
|
41
|
-
export const PLAY_WIDTH = GAME_WIDTH - 8; // inside the side walls
|
|
42
|
-
export const PLAY_HEIGHT = CONTAINER_HEIGHT - 4; // above the floor
|
|
43
|
-
export const GRAVITY = 0.5 * SCALE;
|
|
44
|
-
export const BOUNCE = 0.3;
|
|
45
|
-
export const FRICTION = 0.99;
|
|
46
|
-
export const MERGE_DISTANCE = Math.round(10 * SCALE);
|
|
47
|
-
export const COLLISION_SCALE = 0.96; // fruits fill nearly their whole circle: they touch where they look to
|
|
48
|
-
/** Passes over the fruit pairs each step, so a pile settles without fruits sinking into each other. */
|
|
49
|
-
export const SOLVER_PASSES = 24;
|
|
50
|
-
/** Overflow: a settled fruit's top above 5% of the height, for a second's worth of steps, loses. */
|
|
51
|
-
export const OVERFLOW_Y = PLAY_HEIGHT * 0.05;
|
|
52
|
-
export const OVERFLOW_STEPS = 60;
|
|
53
|
-
/** The danger line warms from here up to the overflow line. */
|
|
54
|
-
export const DANGER_START_Y = PLAY_HEIGHT * 0.28;
|
|
55
|
-
export const DANGER_SETTLE_MS = 1000;
|
|
56
|
-
export const SPAWN_DELAY_MS = 300; // after a drop, the next fruit
|
|
57
|
-
export const STEP_MS = 1000 / 60;
|
|
58
|
-
export const STEP_TOLERANCE_MS = 2;
|
|
59
|
-
export const MAX_PENDING_MS = 50;
|
|
60
|
-
|
|
61
|
-
// ── The scene ─────────────────────────────────────────────────────────
|
|
62
|
-
|
|
63
|
-
/** The camera looks straight at the tank: only its front shows, so its outline reads as single clean lines. */
|
|
64
|
-
export const TILT = 0;
|
|
65
|
-
/** Lit from the upper left, in front. */
|
|
66
|
-
export const LIGHT = frontLight([-0.4, 0.55, 1], 0.5);
|
|
67
|
-
/** The glass is as deep as the biggest fruit. */
|
|
68
|
-
export const JAR_DEPTH = FRUIT_TYPES[9].size + 12;
|
|
69
|
-
export const WALL = 4; // the glass's walls and floor, as the original borders
|
|
70
|
-
/** The glass's bottom corners are rounded this much (inside), and the fruits roll round them. */
|
|
71
|
-
export const CORNER = Math.round(44 * SCALE);
|
|
72
|
-
|
|
73
|
-
export const COLORS = {
|
|
74
|
-
DANGER_SAFE: 'rgba(255, 255, 255, 0.28)',
|
|
75
|
-
DANGER_HOT: 'rgba(255, 77, 77, 0.95)'
|
|
76
|
-
} as const;
|
|
77
|
-
|
|
78
|
-
// ── Layout (view points) ──────────────────────────────────────────────
|
|
79
|
-
|
|
80
|
-
const SCOREBOARD_HEIGHT = 82;
|
|
81
|
-
const CONTROLS_HEIGHT = 110;
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Where the glass sits: centred below the header as the original glass was, or, on a screen too short for
|
|
85
|
-
* it, scaled down (by `k`, view points per play-area point) to fit between the scoreboard and controls.
|
|
86
|
-
*/
|
|
87
|
-
export type Layout = { width: number; height: number; k: number; centerX: number; centerY: number; tilt: number };
|
|
88
|
-
|
|
89
|
-
export function getLayout(width: number, height: number, offset: number): Layout {
|
|
90
|
-
const top = getScoreBoardTop(offset) + SCOREBOARD_HEIGHT;
|
|
91
|
-
const room = height - top - CONTROLS_HEIGHT;
|
|
92
|
-
const fitsWidth = Math.min(1, width / CONTAINER_WIDTH);
|
|
93
|
-
if (room >= CONTAINER_HEIGHT * fitsWidth)
|
|
94
|
-
return { width, height, k: fitsWidth, centerX: width / 2, centerY: offset + (height - offset) / 2, tilt: TILT };
|
|
95
|
-
const k = Math.max(0.4, room / CONTAINER_HEIGHT);
|
|
96
|
-
return { width, height, k, centerX: width / 2, centerY: top + room / 2, tilt: TILT };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/** A play-area point (x right, y down from the top-left, z out of the glass) in the world. */
|
|
100
|
-
export const toWorld = (x: number, y: number, z = 0): [number, number, number] => [x - PLAY_WIDTH / 2, PLAY_HEIGHT / 2 - y, z];
|
|
101
|
-
/** The play-area x under a view x. */
|
|
102
|
-
export const playX = (l: Layout, sx: number) => (sx - l.centerX) / l.k + PLAY_WIDTH / 2;
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
// Fruit Merger's play, with no React: build a game with `createGame`, give it a layout, `start` it and
|
|
2
|
-
// `tick` it every frame. Drag to aim the fruit at the top, let go (or tap) to drop it; two of a kind
|
|
3
|
-
// that touch merge into the next fruit up the chain. Make the pumpkin inside fifteen minutes to win; the
|
|
4
|
-
// pile staying over the top line, or the clock running out, loses.
|
|
5
|
-
//
|
|
6
|
-
// The physics is the original version's (FruitMergerRules.ts), stepped at the same fixed 60 Hz on the
|
|
7
|
-
// game's own clock; the rest is its store: the same drops, previews, next fruit and timer.
|
|
8
|
-
import { type Camera, type DragEvent, World } from '@nayan-ui/engine';
|
|
9
|
-
import { calculateTimeBasedScore } from '../../services/ScoringService';
|
|
10
|
-
import type { GameTheme } from '../../services/ThemeService';
|
|
11
|
-
import {
|
|
12
|
-
BASE_SCORE,
|
|
13
|
-
EXPECTED_TIME,
|
|
14
|
-
FRUIT_TYPES,
|
|
15
|
-
GAME_TIME,
|
|
16
|
-
type Layout,
|
|
17
|
-
MAX_DROP_TYPE,
|
|
18
|
-
MAX_PENDING_MS,
|
|
19
|
-
PLAY_WIDTH,
|
|
20
|
-
SPAWN_DELAY_MS,
|
|
21
|
-
STEP_MS,
|
|
22
|
-
STEP_TOLERANCE_MS
|
|
23
|
-
} from './FruitMergerConstants';
|
|
24
|
-
import { type Body, makeBody, radiusOf, step, type StepState } from './FruitMergerRules';
|
|
25
|
-
import {
|
|
26
|
-
aim,
|
|
27
|
-
buildScene,
|
|
28
|
-
celebrate,
|
|
29
|
-
clearFruits,
|
|
30
|
-
drawFruits,
|
|
31
|
-
drawPreview,
|
|
32
|
-
jolt,
|
|
33
|
-
mergeFx,
|
|
34
|
-
removeScene,
|
|
35
|
-
type Scene,
|
|
36
|
-
setDanger,
|
|
37
|
-
setSceneTheme
|
|
38
|
-
} from './FruitMergerScene';
|
|
39
|
-
|
|
40
|
-
export type Phase = 'ready' | 'playing' | 'over';
|
|
41
|
-
/** drop: a fruit let go; merge: two became one; win: the pumpkin (its own sound, before the result's). */
|
|
42
|
-
export type GameEvent = 'drop' | 'merge' | 'win';
|
|
43
|
-
/** How a game ended. */
|
|
44
|
-
export type Outcome = 'win' | 'overflow' | 'time';
|
|
45
|
-
|
|
46
|
-
const WORLD_CAPACITY = 500; // the glass, the guide, up to a few dozen fruits, and the bursts
|
|
47
|
-
|
|
48
|
-
type Aimed = { id: string; typeId: number; x: number; y: number };
|
|
49
|
-
const randomType = () => Math.floor(Math.random() * MAX_DROP_TYPE);
|
|
50
|
-
/** A fresh fruit id (the original store drew one random number for each, so the random draws line up). */
|
|
51
|
-
const newId = (clock: number) => `fruit-${Math.round(clock)}-${Math.random()}`;
|
|
52
|
-
const aimedFruit = (typeId: number, clock: number): Aimed => ({ id: newId(clock), typeId, x: PLAY_WIDTH / 2, y: radiusOf(typeId) + 10 });
|
|
53
|
-
|
|
54
|
-
export function createGame(theme: GameTheme) {
|
|
55
|
-
const world = new World(WORLD_CAPACITY);
|
|
56
|
-
const camera: Camera = { eye: [0, 0, 260], target: [0, 0, 0], fov: 1, ortho: 1 };
|
|
57
|
-
const g = {
|
|
58
|
-
world,
|
|
59
|
-
camera,
|
|
60
|
-
theme,
|
|
61
|
-
layout: null as Layout | null,
|
|
62
|
-
scene: null as Scene | null,
|
|
63
|
-
phase: 'ready' as Phase,
|
|
64
|
-
bodies: [] as Body[],
|
|
65
|
-
current: null as Aimed | null,
|
|
66
|
-
nextType: 0,
|
|
67
|
-
bestType: -1,
|
|
68
|
-
/** Seconds left: the countdown lives in the engine (Rust), advanced by world.update. */
|
|
69
|
-
get time() {
|
|
70
|
-
return world.scoreboard.shownSeconds;
|
|
71
|
-
},
|
|
72
|
-
/** Points from merges (each worth the fruit it makes, so higher fruits score far more): in the engine's scoreboard. */
|
|
73
|
-
get score() {
|
|
74
|
-
return world.scoreboard.score;
|
|
75
|
-
},
|
|
76
|
-
outcome: null as Outcome | null,
|
|
77
|
-
/** The physics' carried state, and the step clock. */
|
|
78
|
-
st: { overflowSteps: 0, danger: 0, merges: 0, generation: 0 } as StepState,
|
|
79
|
-
pending: 0,
|
|
80
|
-
spawnAt: 0,
|
|
81
|
-
/** Where the drag started the aim from. */
|
|
82
|
-
dragFrom: PLAY_WIDTH / 2,
|
|
83
|
-
clock: 0,
|
|
84
|
-
// UI hooks, set by the screen.
|
|
85
|
-
onPhase: (_p: Phase) => {},
|
|
86
|
-
onTime: (_t: number) => {},
|
|
87
|
-
onScore: (_s: number) => {},
|
|
88
|
-
onNext: (_type: number) => {},
|
|
89
|
-
onBest: (_type: number) => {},
|
|
90
|
-
onEvent: (_e: GameEvent) => {}
|
|
91
|
-
};
|
|
92
|
-
world.scoreboard.handlers = {
|
|
93
|
-
onSecond: (t) => g.onTime(t),
|
|
94
|
-
onTimeUp: () => g.phase === 'playing' && end(g, 'time')
|
|
95
|
-
};
|
|
96
|
-
initialize(g);
|
|
97
|
-
return g;
|
|
98
|
-
}
|
|
99
|
-
export type Game = ReturnType<typeof createGame>;
|
|
100
|
-
const nowMs = (g: Game) => g.clock * 1000;
|
|
101
|
-
|
|
102
|
-
// ── Scene ─────────────────────────────────────────────────────────────
|
|
103
|
-
|
|
104
|
-
/** Lays the glass out for the view (first layout, header height, rotation): rebuilt where things stand. */
|
|
105
|
-
export function setLayout(g: Game, l: Layout) {
|
|
106
|
-
if (g.scene) removeScene(g.world, g.scene);
|
|
107
|
-
g.layout = l;
|
|
108
|
-
aim(g.camera, l);
|
|
109
|
-
g.scene = buildScene(g.world, l, g.theme);
|
|
110
|
-
setDanger(g.world, g.scene, g.theme, g.st.danger);
|
|
111
|
-
draw(g);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function setTheme(g: Game, theme: GameTheme) {
|
|
115
|
-
g.theme = theme;
|
|
116
|
-
if (g.scene) setSceneTheme(g.world, g.scene, theme);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function draw(g: Game) {
|
|
120
|
-
const s = g.scene;
|
|
121
|
-
if (!s) return;
|
|
122
|
-
drawFruits(g.world, s, g.bodies);
|
|
123
|
-
drawPreview(g.world, s, g.phase === 'over' ? null : g.current, g.nextType);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// ── Run ───────────────────────────────────────────────────────────────
|
|
127
|
-
|
|
128
|
-
/** A fresh glass with a fruit waiting to be aimed (the start, Stop and Play Again). */
|
|
129
|
-
function initialize(g: Game) {
|
|
130
|
-
g.st.generation += 1;
|
|
131
|
-
g.bodies = [];
|
|
132
|
-
g.pending = 0;
|
|
133
|
-
g.spawnAt = 0;
|
|
134
|
-
g.st.overflowSteps = 0;
|
|
135
|
-
g.bestType = -1;
|
|
136
|
-
const type = randomType();
|
|
137
|
-
g.current = aimedFruit(type, nowMs(g));
|
|
138
|
-
g.nextType = randomType();
|
|
139
|
-
g.world.scoreboard.reset(0, GAME_TIME);
|
|
140
|
-
g.outcome = null;
|
|
141
|
-
g.phase = 'ready';
|
|
142
|
-
if (g.scene) clearFruits(g.world, g.scene);
|
|
143
|
-
draw(g);
|
|
144
|
-
g.onTime(GAME_TIME);
|
|
145
|
-
g.onScore(0);
|
|
146
|
-
g.onNext(g.nextType);
|
|
147
|
-
g.onBest(-1);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** Starts on the glass already shown (keeping the waiting fruit). */
|
|
151
|
-
export function start(g: Game) {
|
|
152
|
-
if (g.phase !== 'ready') return;
|
|
153
|
-
g.st.generation += 1;
|
|
154
|
-
g.bodies = [];
|
|
155
|
-
g.pending = 0;
|
|
156
|
-
g.spawnAt = 0;
|
|
157
|
-
g.st.overflowSteps = 0;
|
|
158
|
-
g.st.danger = 0;
|
|
159
|
-
g.bestType = -1;
|
|
160
|
-
g.phase = 'playing';
|
|
161
|
-
g.world.scoreboard.reset();
|
|
162
|
-
g.world.scoreboard.startCountdown(GAME_TIME);
|
|
163
|
-
g.onScore(0);
|
|
164
|
-
if (g.scene) {
|
|
165
|
-
clearFruits(g.world, g.scene);
|
|
166
|
-
setDanger(g.world, g.scene, g.theme, 0);
|
|
167
|
-
}
|
|
168
|
-
if (!g.current) spawnAimed(g);
|
|
169
|
-
draw(g);
|
|
170
|
-
g.onTime(GAME_TIME);
|
|
171
|
-
g.onBest(-1);
|
|
172
|
-
g.onPhase('playing');
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/** Stop and Play Again: a fresh glass, not started. */
|
|
176
|
-
export function reset(g: Game) {
|
|
177
|
-
initialize(g);
|
|
178
|
-
g.onPhase('ready');
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export function dispose(g: Game) {
|
|
182
|
-
g.world.dispose();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** The next fruit comes up to be aimed, and the one after it is picked (and shown as next). */
|
|
186
|
-
function spawnAimed(g: Game) {
|
|
187
|
-
g.current = aimedFruit(g.nextType, nowMs(g));
|
|
188
|
-
g.nextType = randomType();
|
|
189
|
-
g.onNext(g.nextType);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function end(g: Game, outcome: Outcome) {
|
|
193
|
-
g.world.scoreboard.stop();
|
|
194
|
-
g.outcome = outcome;
|
|
195
|
-
g.phase = 'over';
|
|
196
|
-
if (outcome === 'win') celebrate(g.world);
|
|
197
|
-
else jolt(g.camera);
|
|
198
|
-
draw(g);
|
|
199
|
-
g.onPhase('over');
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/** The final score: the merges' points, plus (for a win) a bonus by its time against two minutes. */
|
|
203
|
-
export const finalScore = (g: Game) => g.score + (g.outcome === 'win' ? calculateTimeBasedScore(GAME_TIME - g.time, EXPECTED_TIME, BASE_SCORE) : 0);
|
|
204
|
-
|
|
205
|
-
export function tick(g: Game, dt: number) {
|
|
206
|
-
if (g.world.isDisposed) return;
|
|
207
|
-
g.clock += Math.min(dt, 0.25);
|
|
208
|
-
if (g.phase === 'playing') physics(g, dt * 1000);
|
|
209
|
-
draw(g);
|
|
210
|
-
g.world.update(dt);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** This frame's fixed 60 Hz steps (none while the glass is empty), and what they did. */
|
|
214
|
-
function physics(g: Game, frameMs: number) {
|
|
215
|
-
let pending = Math.min(g.pending + frameMs, MAX_PENDING_MS);
|
|
216
|
-
if (pending < STEP_MS - STEP_TOLERANCE_MS) {
|
|
217
|
-
g.pending = pending;
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
const now = nowMs(g);
|
|
221
|
-
const out: { outcome: 'win' | 'lose' | null } = { outcome: null };
|
|
222
|
-
let spawn = false;
|
|
223
|
-
while (pending >= STEP_MS - STEP_TOLERANCE_MS) {
|
|
224
|
-
pending -= STEP_MS;
|
|
225
|
-
if (g.bodies.length === 0) continue;
|
|
226
|
-
const m = step(g.bodies, now, g.st, out);
|
|
227
|
-
if (m) {
|
|
228
|
-
if (g.scene) mergeFx(g.world, g.scene, m.a, m.b, m.made);
|
|
229
|
-
g.onScore(g.world.scoreboard.add(FRUIT_TYPES[m.made.typeId]!.score));
|
|
230
|
-
if (m.made.typeId > g.bestType) {
|
|
231
|
-
g.bestType = m.made.typeId;
|
|
232
|
-
g.onBest(g.bestType);
|
|
233
|
-
}
|
|
234
|
-
g.onEvent('merge');
|
|
235
|
-
}
|
|
236
|
-
if (out.outcome) break;
|
|
237
|
-
if (g.spawnAt > 0 && now >= g.spawnAt) {
|
|
238
|
-
g.spawnAt = 0;
|
|
239
|
-
spawn = true;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
g.pending = pending;
|
|
243
|
-
if (g.scene) setDanger(g.world, g.scene, g.theme, g.st.danger);
|
|
244
|
-
if (out.outcome === 'win') {
|
|
245
|
-
g.onEvent('win');
|
|
246
|
-
end(g, 'win');
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
if (out.outcome === 'lose') {
|
|
250
|
-
end(g, 'overflow');
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
if (spawn && !g.current) spawnAimed(g);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// ── The finger ────────────────────────────────────────────────────────
|
|
257
|
-
|
|
258
|
-
/** Drags the aimed fruit by how far the finger moves (kept inside the glass); lifting drops it. */
|
|
259
|
-
export function drag(g: Game, { phase, dx, cancelled }: DragEvent) {
|
|
260
|
-
const l = g.layout;
|
|
261
|
-
const c = g.current;
|
|
262
|
-
if (!l || !c) return;
|
|
263
|
-
if (phase === 'start') {
|
|
264
|
-
g.dragFrom = c.x;
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
const r = radiusOf(c.typeId);
|
|
268
|
-
c.x = Math.max(r, Math.min(PLAY_WIDTH - r, g.dragFrom + dx / l.k));
|
|
269
|
-
if (phase === 'end' && !cancelled) drop(g);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/** Lets the aimed fruit go: it joins the glass, and the next one is aimed a moment later. */
|
|
273
|
-
export function drop(g: Game) {
|
|
274
|
-
const c = g.current;
|
|
275
|
-
if (g.phase !== 'playing' || !c) return;
|
|
276
|
-
const born = nowMs(g);
|
|
277
|
-
g.bodies.push(makeBody(c.id, c.typeId, c.x, c.y, 0, born));
|
|
278
|
-
if (c.typeId > g.bestType) {
|
|
279
|
-
g.bestType = c.typeId;
|
|
280
|
-
g.onBest(g.bestType);
|
|
281
|
-
}
|
|
282
|
-
g.current = null;
|
|
283
|
-
g.spawnAt = born + SPAWN_DELAY_MS;
|
|
284
|
-
g.onEvent('drop');
|
|
285
|
-
}
|