@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,79 +0,0 @@
|
|
|
1
|
-
// Tangram's screen, on the Nayan engine: the silhouette and the seven tans are one 3D scene
|
|
2
|
-
// (an orthographic camera directly over the board), under Playtura's scoreboard, controls and
|
|
3
|
-
// modals. The play is in TangramGame.ts (the levels and snapping in TangramRules.ts), what it draws in
|
|
4
|
-
// TangramScene.ts.
|
|
5
|
-
//
|
|
6
|
-
// One world serves the whole visit: Start, Stop and Play Again set the level out in place and a theme
|
|
7
|
-
// change repaints the board, so the GPU view is never rebuilt. Tans glide, turn and pop in the engine's
|
|
8
|
-
// Rust core; JS reads the finger and steps the clock and the world once a frame.
|
|
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, textColumn, timerColumn } from '../shared/EngineHud';
|
|
14
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
15
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
16
|
-
import { GAME_DURATION, getLayout, LIGHT } from './TangramConstants';
|
|
17
|
-
import { createGame, dispose, drag, type GameEvent, playAgain, setLayout, setTheme, start, stop, tick } from './TangramGame';
|
|
18
|
-
import { TOTAL_PIECES } from './TangramRules';
|
|
19
|
-
|
|
20
|
-
const SOUNDS = GAME_SOUNDS.TANGRAM;
|
|
21
|
-
|
|
22
|
-
/** Each event's sound and haptic, as the original version played them. */
|
|
23
|
-
const FEEDBACK: Record<GameEvent, { sound: (typeof SOUNDS)[keyof typeof SOUNDS]; haptic: HapticType }> = {
|
|
24
|
-
rotate: { sound: SOUNDS.ROTATE, haptic: HapticType.LIGHT },
|
|
25
|
-
place: { sound: SOUNDS.PLACE, haptic: HapticType.SUCCESS },
|
|
26
|
-
wrong: { sound: SOUNDS.WRONG, haptic: HapticType.WARNING },
|
|
27
|
-
win: { sound: SOUNDS.WIN, haptic: HapticType.SUCCESS },
|
|
28
|
-
lose: { sound: SOUNDS.GAME_OVER, haptic: HapticType.ERROR }
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export const Tangram = engineGame(GAME_IDS.TANGRAM, (props) => {
|
|
32
|
-
const [score, setScore] = useLiveState(0);
|
|
33
|
-
const [placed, setPlaced] = useLiveState(0);
|
|
34
|
-
const [time, setTime] = useLiveState(GAME_DURATION);
|
|
35
|
-
|
|
36
|
-
// Win or lose as the puzzle ends, with the score so far
|
|
37
|
-
const { game, theme, status, screen, gameOver } = useEngineGame(props, {
|
|
38
|
-
gameId: GAME_IDS.TANGRAM,
|
|
39
|
-
create: createGame,
|
|
40
|
-
start,
|
|
41
|
-
// Stop: back to the first silhouette
|
|
42
|
-
reset: stop,
|
|
43
|
-
// Play Again: the next silhouette after a win, the same one after running out of time
|
|
44
|
-
replay: playAgain,
|
|
45
|
-
dispose,
|
|
46
|
-
tick,
|
|
47
|
-
setTheme,
|
|
48
|
-
resize: (g, width, height, offset) => {
|
|
49
|
-
const l = getLayout(width, height, offset);
|
|
50
|
-
setLayout(g, l);
|
|
51
|
-
return l.boardW;
|
|
52
|
-
},
|
|
53
|
-
drag,
|
|
54
|
-
sounds: SOUNDS,
|
|
55
|
-
onStart: (fx) => fx(SOUNDS.START),
|
|
56
|
-
wire: (g, fx) => {
|
|
57
|
-
g.onScore = setScore;
|
|
58
|
-
g.onPlaced = setPlaced;
|
|
59
|
-
g.onTime = setTime;
|
|
60
|
-
g.onEvent = (event) => fx(FEEDBACK[event].sound, FEEDBACK[event].haptic);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return (
|
|
65
|
-
<EngineGameScreen
|
|
66
|
-
{...screen}
|
|
67
|
-
light={LIGHT}
|
|
68
|
-
columns={[scoreColumn(score), textColumn('PIECES', `${placed}/${TOTAL_PIECES}`), timerColumn(time, theme)]}
|
|
69
|
-
subtext="Fit all seven pieces!"
|
|
70
|
-
gameOver={gameOver({
|
|
71
|
-
title: status === 'win' ? 'PUZZLE SOLVED!' : 'TIME UP!',
|
|
72
|
-
message: status === 'win' ? 'You reassembled the shape!' : 'You ran out of time!',
|
|
73
|
-
scoreLabel: 'Score',
|
|
74
|
-
score: game.score,
|
|
75
|
-
buttonText: status === 'win' ? 'Next Puzzle!' : 'Try Again!'
|
|
76
|
-
})}
|
|
77
|
-
/>
|
|
78
|
-
);
|
|
79
|
-
});
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Tangram's rules, timings, colors and layout. The rules and scoring match the original version
|
|
2
|
-
// (games/tangram), so scores carry over; the levels themselves are in TangramRules.ts.
|
|
3
|
-
import { getScoreBoardTop } from '../shared/EngineHud';
|
|
4
|
-
import type { TiltView } from '../shared/EngineTilt';
|
|
5
|
-
import { frontLight, gameWidthFor } from '../shared/EngineUtils';
|
|
6
|
-
import { RIM_RADIUS, TOTAL_BOARD_UNITS } from './TangramRules';
|
|
7
|
-
|
|
8
|
-
// ── Rules ─────────────────────────────────────────────────────────────
|
|
9
|
-
|
|
10
|
-
export const GAME_DURATION = 120; // seconds per silhouette
|
|
11
|
-
export const POINTS_PER_PIECE = 1000;
|
|
12
|
-
|
|
13
|
-
// ── Touch and feel (as the original board) ────────────────────────────────
|
|
14
|
-
|
|
15
|
-
export { TRAY_SCALE, RIM_RADIUS } from './TangramRules'; // compact previews; selected pieces grow to full size
|
|
16
|
-
export const TAP_MAX = 0.25; // seconds: a quick touch that doesn't wander turns a tan 45°
|
|
17
|
-
export const TAP_SLOP = 10; // points a finger may wander and still tap
|
|
18
|
-
export const ROTATE_STEP = 45; // degrees per tap
|
|
19
|
-
export const ROTATE_TIME = 0.18;
|
|
20
|
-
export const SNAP_TIME = 0.16;
|
|
21
|
-
export const ENTRY_STAGGER = 0.045; // between the tans growing in at the start of a level
|
|
22
|
-
export const WIN_DELAY = 0.22; // the solved shape's wave starts after the last tan lands
|
|
23
|
-
export const WIN_STAGGER = 0.09; // between each tan's pop in the wave
|
|
24
|
-
|
|
25
|
-
// ── Colors ────────────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
export const COLORS = {
|
|
28
|
-
CLASSIC_SLOT: 'rgba(255, 255, 255, 0.12)',
|
|
29
|
-
CLASSIC_SLOT_EDGE: 'rgba(255, 255, 255, 0.30)'
|
|
30
|
-
} as const;
|
|
31
|
-
|
|
32
|
-
// ── The scene ─────────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
/** A directly overhead camera and light keep shapes and finger positions aligned. */
|
|
35
|
-
export const TILT = 0;
|
|
36
|
-
export const LIGHT = frontLight([0, 0, 1], 0.45);
|
|
37
|
-
/** A tan's thickness, and the gap between stacked tans in the tray, in tan units. */
|
|
38
|
-
export const PIECE_DEPTH = 0.2;
|
|
39
|
-
export const STACK_STEP = 0.14;
|
|
40
|
-
/** How high a tan rises off the board while held. */
|
|
41
|
-
export const HELD_HEIGHT = 1.2;
|
|
42
|
-
|
|
43
|
-
// ── Layout (view points; the world is one unit per point) ─────────────
|
|
44
|
-
|
|
45
|
-
const SCOREBOARD_HEIGHT = 82;
|
|
46
|
-
const CONTROLS_HEIGHT = 88; // the controls occupy the bottom 80 points; keep an 8-point gap
|
|
47
|
-
|
|
48
|
-
export type Layout = TiltView & { unit: number; boardW: number; boardH: number };
|
|
49
|
-
|
|
50
|
-
/** Fit the entire grid, including its outline, inside the game width. */
|
|
51
|
-
export function getLayout(width: number, height: number, offset: number): Layout {
|
|
52
|
-
const top = getScoreBoardTop(offset) + SCOREBOARD_HEIGHT;
|
|
53
|
-
const room = Math.max(240, height - top - CONTROLS_HEIGHT);
|
|
54
|
-
const gameWidth = gameWidthFor(width);
|
|
55
|
-
const byWidth = gameWidth / (4 + RIM_RADIUS * 2);
|
|
56
|
-
const byHeight = room / Math.cos(TILT) / TOTAL_BOARD_UNITS;
|
|
57
|
-
const unit = Math.min(byWidth, byHeight);
|
|
58
|
-
return { width, height, tilt: TILT, centerY: top + room / 2, unit, boardW: gameWidth, boardH: unit * TOTAL_BOARD_UNITS };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** A board point (x right, y down from the board's top-left) in the world (the board centred on the origin, y up). */
|
|
62
|
-
export const toWorld = (l: Layout, x: number, y: number): [number, number] => [x - l.boardW / 2, l.boardH / 2 - y];
|
|
63
|
-
/** And back. */
|
|
64
|
-
export const toBoard = (l: Layout, wx: number, wy: number): [number, number] => [wx + l.boardW / 2, l.boardH / 2 - wy];
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
// Tangram's play, with no React: build a game with `createGame`, give it a layout, `start` it and `tick`
|
|
2
|
-
// it every frame. Drag the seven tans from the tray into the silhouette; tap one to turn it 45°. A tan
|
|
3
|
-
// dropped near a free slot of its shape at a close enough turn snaps in (1,000 points); near one at the
|
|
4
|
-
// wrong turn, it wiggles. Fill the shape inside two minutes to win; a win's Next Puzzle moves on a level.
|
|
5
|
-
//
|
|
6
|
-
// The levels and the snap are the original version's (TangramRules.ts); every touch does what it did there.
|
|
7
|
-
import { type Camera, type DragEvent, World } from '@nayan-ui/engine';
|
|
8
|
-
import { calculateTimeBasedScore } from '../../services/ScoringService';
|
|
9
|
-
import type { GameTheme } from '../../services/ThemeService';
|
|
10
|
-
import { aimTilted, unproject } from '../shared/EngineTilt';
|
|
11
|
-
import {
|
|
12
|
-
ENTRY_STAGGER,
|
|
13
|
-
GAME_DURATION,
|
|
14
|
-
HELD_HEIGHT,
|
|
15
|
-
type Layout,
|
|
16
|
-
PIECE_DEPTH,
|
|
17
|
-
POINTS_PER_PIECE,
|
|
18
|
-
RIM_RADIUS,
|
|
19
|
-
ROTATE_STEP,
|
|
20
|
-
ROTATE_TIME,
|
|
21
|
-
SNAP_TIME,
|
|
22
|
-
STACK_STEP,
|
|
23
|
-
TAP_MAX,
|
|
24
|
-
TAP_SLOP,
|
|
25
|
-
toBoard,
|
|
26
|
-
TRAY_SCALE,
|
|
27
|
-
WIN_DELAY,
|
|
28
|
-
WIN_STAGGER
|
|
29
|
-
} from './TangramConstants';
|
|
30
|
-
import { claimSlot, generateLevel, insidePiece, rotatePt, type TangramLevel, TOTAL_PIECES } from './TangramRules';
|
|
31
|
-
import { buildScene, celebrate, dim, enter, moveTo, pop, type Pose, removeScene, type Scene, setPose, setSceneTheme, wiggle } from './TangramScene';
|
|
32
|
-
|
|
33
|
-
export type Phase = 'ready' | 'playing' | 'over';
|
|
34
|
-
/** rotate: a tan turned; place: one snapped in; wrong: dropped over its slot at the wrong turn; win / lose: how it ended. */
|
|
35
|
-
export type GameEvent = 'rotate' | 'place' | 'wrong' | 'win' | 'lose';
|
|
36
|
-
|
|
37
|
-
const WORLD_CAPACITY = 200; // backdrop, 14 slot parts, 7 tans with rims, and confetti
|
|
38
|
-
|
|
39
|
-
/** A tan's state: its centre (board points), its turn (degrees, clockwise), and whether it's in a slot. */
|
|
40
|
-
type Tan = { x: number; y: number; rot: number; placed: boolean };
|
|
41
|
-
|
|
42
|
-
export function createGame(theme: GameTheme) {
|
|
43
|
-
const world = new World(WORLD_CAPACITY);
|
|
44
|
-
const camera: Camera = { eye: [0, 0, 240], target: [0, 0, 0], fov: 1, ortho: 1 };
|
|
45
|
-
const g = {
|
|
46
|
-
world,
|
|
47
|
-
camera,
|
|
48
|
-
theme,
|
|
49
|
-
layout: null as Layout | null,
|
|
50
|
-
scene: null as Scene | null,
|
|
51
|
-
phase: 'ready' as Phase,
|
|
52
|
-
level: 0,
|
|
53
|
-
data: null as TangramLevel | null,
|
|
54
|
-
tans: [] as Tan[],
|
|
55
|
-
occupied: [] as boolean[],
|
|
56
|
-
/** The tan last picked up (shown full size, on top), or -1. */
|
|
57
|
-
active: -1,
|
|
58
|
-
/** A finger on a tan: where it went down (view and board points), when, and whether it's dragging. */
|
|
59
|
-
held: null as { id: number; sx: number; sy: number; bx: number; by: number; ox: number; oy: number; at: number; moved: boolean } | null,
|
|
60
|
-
placed: 0,
|
|
61
|
-
/** Score and the countdown live in the engine (Rust), advanced by world.update. */
|
|
62
|
-
get score() {
|
|
63
|
-
return world.scoreboard.score;
|
|
64
|
-
},
|
|
65
|
-
get timeLeft() {
|
|
66
|
-
return world.scoreboard.shownSeconds;
|
|
67
|
-
},
|
|
68
|
-
won: false,
|
|
69
|
-
/** Seconds since the game was made, for telling taps from holds. */
|
|
70
|
-
clock: 0,
|
|
71
|
-
// UI hooks, set by the screen.
|
|
72
|
-
onPhase: (_p: Phase) => {},
|
|
73
|
-
onScore: (_s: number) => {},
|
|
74
|
-
onPlaced: (_n: number) => {},
|
|
75
|
-
onTime: (_t: number) => {},
|
|
76
|
-
onEvent: (_e: GameEvent) => {}
|
|
77
|
-
};
|
|
78
|
-
world.scoreboard.reset(0, GAME_DURATION);
|
|
79
|
-
world.scoreboard.handlers = {
|
|
80
|
-
onSecond: (t) => g.onTime(t),
|
|
81
|
-
onTimeUp: () => g.phase === 'playing' && end(g, false)
|
|
82
|
-
};
|
|
83
|
-
return g;
|
|
84
|
-
}
|
|
85
|
-
export type Game = ReturnType<typeof createGame>;
|
|
86
|
-
|
|
87
|
-
// ── Poses ─────────────────────────────────────────────────────────────
|
|
88
|
-
|
|
89
|
-
/** How a tan is drawn: placed ones lie in their slot, the active one on top at full size, the rest small in the tray (higher ids above). */
|
|
90
|
-
function poseOf(g: Game, id: number): Pose {
|
|
91
|
-
const t = g.tans[id]!;
|
|
92
|
-
const held = g.held?.id === id && g.held.moved;
|
|
93
|
-
if (t.placed) return { x: t.x, y: t.y, rot: t.rot, scale: 1, lift: 0 };
|
|
94
|
-
if (held) return { x: t.x, y: t.y, rot: t.rot, scale: 1.05, lift: HELD_HEIGHT };
|
|
95
|
-
if (g.active === id) return { x: t.x, y: t.y, rot: t.rot, scale: 1, lift: STACK_STEP * (TOTAL_PIECES + 2) };
|
|
96
|
-
return { x: t.x, y: t.y, rot: t.rot, scale: TRAY_SCALE, lift: STACK_STEP * (id + 1) };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const allPoses = (g: Game) => g.tans.map((_, i) => poseOf(g, i));
|
|
100
|
-
|
|
101
|
-
// ── Scene ─────────────────────────────────────────────────────────────
|
|
102
|
-
|
|
103
|
-
/** Lays the board out for the view (first layout, header height, rotation): the level is rebuilt for its size. */
|
|
104
|
-
export function setLayout(g: Game, l: Layout) {
|
|
105
|
-
const first = !g.layout;
|
|
106
|
-
if (g.held) {
|
|
107
|
-
g.held = null;
|
|
108
|
-
g.active = -1;
|
|
109
|
-
}
|
|
110
|
-
g.layout = l;
|
|
111
|
-
aimTilted(g.camera, l);
|
|
112
|
-
if (first) setupLevel(g, g.level);
|
|
113
|
-
else rebuild(g, false);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function setTheme(g: Game, theme: GameTheme) {
|
|
117
|
-
g.theme = theme;
|
|
118
|
-
if (g.scene) setSceneTheme(g.world, g.scene, theme);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** The scene for the current level (after a level change or a new layout); tans in the tray, placed ones in their slots. */
|
|
122
|
-
function rebuild(g: Game, entering: boolean) {
|
|
123
|
-
const l = g.layout;
|
|
124
|
-
if (!l) return;
|
|
125
|
-
const old = g.data;
|
|
126
|
-
g.data = generateLevel(g.level, l.unit, l.boardW, l.boardH);
|
|
127
|
-
if (old && old.pieces.length === g.data.pieces.length && !entering) {
|
|
128
|
-
// Same level at a new size: tans keep their slot or tray spot
|
|
129
|
-
g.tans = g.tans.map((t, i) => {
|
|
130
|
-
const p = g.data!.pieces[i]!;
|
|
131
|
-
if (!t.placed) return { ...t, x: p.scatterCx, y: p.scatterCy };
|
|
132
|
-
const slot = g.occupied.findIndex((o, k) => o && Math.hypot(old.pieces[k]!.targetCx - t.x, old.pieces[k]!.targetCy - t.y) < 1);
|
|
133
|
-
const s = g.data!.pieces[slot] ?? p;
|
|
134
|
-
return { ...t, x: s.targetCx, y: s.targetCy };
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
if (g.scene) removeScene(g.world, g.scene);
|
|
138
|
-
g.scene = buildScene(g.world, l, g.theme, g.data, allPoses(g));
|
|
139
|
-
if (entering) enter(g.world, l, g.scene, allPoses(g), ENTRY_STAGGER);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ── Run ───────────────────────────────────────────────────────────────
|
|
143
|
-
|
|
144
|
-
/** A level set out, not started: its silhouette, and every tan in the tray. */
|
|
145
|
-
function setupLevel(g: Game, level: number) {
|
|
146
|
-
const l = g.layout;
|
|
147
|
-
g.world.cancelTimers();
|
|
148
|
-
g.level = level;
|
|
149
|
-
g.held = null;
|
|
150
|
-
g.active = -1;
|
|
151
|
-
g.placed = 0;
|
|
152
|
-
g.world.scoreboard.reset(0, GAME_DURATION);
|
|
153
|
-
g.won = false;
|
|
154
|
-
if (l) {
|
|
155
|
-
g.data = generateLevel(level, l.unit, l.boardW, l.boardH);
|
|
156
|
-
g.tans = g.data.pieces.map((p) => ({ x: p.scatterCx, y: p.scatterCy, rot: p.initialRot, placed: false }));
|
|
157
|
-
g.occupied = g.data.pieces.map(() => false);
|
|
158
|
-
rebuild(g, true);
|
|
159
|
-
}
|
|
160
|
-
g.onScore(0);
|
|
161
|
-
g.onPlaced(0);
|
|
162
|
-
g.onTime(GAME_DURATION);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export function start(g: Game) {
|
|
166
|
-
if (g.phase !== 'ready') return;
|
|
167
|
-
g.phase = 'playing';
|
|
168
|
-
g.world.scoreboard.startCountdown(GAME_DURATION);
|
|
169
|
-
g.onPhase('playing');
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** Stop: back to the first silhouette, set out afresh (as the original game). */
|
|
173
|
-
export function stop(g: Game) {
|
|
174
|
-
g.phase = 'ready';
|
|
175
|
-
setupLevel(g, 0);
|
|
176
|
-
g.onPhase('ready');
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/** Play Again: the next silhouette after a win, the same one again after running out of time. */
|
|
180
|
-
export function playAgain(g: Game) {
|
|
181
|
-
const next = g.won ? g.level + 1 : g.level;
|
|
182
|
-
g.phase = 'ready';
|
|
183
|
-
setupLevel(g, next);
|
|
184
|
-
g.onPhase('ready');
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export function dispose(g: Game) {
|
|
188
|
-
g.world.dispose();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function tick(g: Game, dt: number) {
|
|
192
|
-
if (g.world.isDisposed) return;
|
|
193
|
-
g.clock += Math.min(dt, 0.25);
|
|
194
|
-
g.world.update(dt);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function end(g: Game, won: boolean) {
|
|
198
|
-
g.world.scoreboard.stop();
|
|
199
|
-
g.won = won;
|
|
200
|
-
g.phase = 'over';
|
|
201
|
-
const { layout: l, scene: s, data } = g;
|
|
202
|
-
const heldId = g.held?.id;
|
|
203
|
-
g.held = null;
|
|
204
|
-
if (heldId !== undefined) settle(g, heldId);
|
|
205
|
-
if (l && s && data) {
|
|
206
|
-
if (won) celebrate(g.world, l, s, data, SNAP_TIME + WIN_DELAY, WIN_STAGGER);
|
|
207
|
-
else
|
|
208
|
-
dim(
|
|
209
|
-
g.world,
|
|
210
|
-
s,
|
|
211
|
-
g.tans.flatMap((t, i) => (t.placed ? [] : [i])),
|
|
212
|
-
data.pieces.map((p) => p.color)
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
g.onPhase('over');
|
|
216
|
-
g.onEvent(won ? 'win' : 'lose');
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// ── The finger ────────────────────────────────────────────────────────
|
|
220
|
-
|
|
221
|
-
/** The board point under a view point, on the tans' tops. */
|
|
222
|
-
function boardPoint(g: Game, sx: number, sy: number): [number, number] {
|
|
223
|
-
const l = g.layout!;
|
|
224
|
-
const [wx, wy] = unproject(l, sx, sy, 0.3 + l.unit * PIECE_DEPTH * 2);
|
|
225
|
-
return toBoard(l, wx, wy);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/** The tan under a board point: the active one first, then the higher ids (drawn above), never a placed one. */
|
|
229
|
-
export function tanAt(g: Game, bx: number, by: number): number {
|
|
230
|
-
const { data, layout: l } = g;
|
|
231
|
-
if (!data || !l) return -1;
|
|
232
|
-
const order = [g.active, ...[6, 5, 4, 3, 2, 1, 0].filter((i) => i !== g.active)].filter((i) => i >= 0);
|
|
233
|
-
// An exact shape hit wins before finger padding is considered; a neighbour's margin cannot steal it.
|
|
234
|
-
for (const margin of [0, l.unit * 0.15]) {
|
|
235
|
-
for (const id of order) {
|
|
236
|
-
const t = g.tans[id]!;
|
|
237
|
-
if (t.placed) continue;
|
|
238
|
-
const scale = g.held?.id === id && g.held.moved ? 1.05 : g.active === id ? 1 : TRAY_SCALE;
|
|
239
|
-
if (insidePiece(data.pieces[id]!.localPoints, t.x, t.y, t.rot, scale, bx, by, margin)) return id;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return -1;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export function drag(g: Game, e: DragEvent) {
|
|
246
|
-
const { layout: l, scene: s } = g;
|
|
247
|
-
if (!l || !s) return;
|
|
248
|
-
if (e.phase === 'start') {
|
|
249
|
-
if (g.phase !== 'playing') return;
|
|
250
|
-
const [bx, by] = boardPoint(g, e.x, e.y);
|
|
251
|
-
const id = tanAt(g, bx, by);
|
|
252
|
-
if (id < 0) return;
|
|
253
|
-
const t = g.tans[id]!;
|
|
254
|
-
const prev = g.active;
|
|
255
|
-
g.held = { id, sx: e.x, sy: e.y, bx, by, ox: t.x, oy: t.y, at: g.clock, moved: false };
|
|
256
|
-
// Picking a tan up grows it to full size and brings it to the front; the one before goes back down
|
|
257
|
-
g.active = id;
|
|
258
|
-
if (prev >= 0 && prev !== id && !g.tans[prev]!.placed) moveTo(g.world, l, s, prev, poseOf(g, prev), 0.14);
|
|
259
|
-
moveTo(g.world, l, s, id, poseOf(g, id), 0.14);
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
const h = g.held;
|
|
263
|
-
if (!h) return;
|
|
264
|
-
const t = g.tans[h.id]!;
|
|
265
|
-
if (e.phase === 'end' && e.cancelled) {
|
|
266
|
-
t.x = h.ox;
|
|
267
|
-
t.y = h.oy;
|
|
268
|
-
g.held = null;
|
|
269
|
-
return settle(g, h.id);
|
|
270
|
-
}
|
|
271
|
-
if (!h.moved && Math.hypot(e.x - h.sx, e.y - h.sy) > TAP_SLOP) {
|
|
272
|
-
h.moved = true;
|
|
273
|
-
moveTo(g.world, l, s, h.id, poseOf(g, h.id), 0.1);
|
|
274
|
-
}
|
|
275
|
-
if (h.moved) {
|
|
276
|
-
const [bx, by] = boardPoint(g, e.x, e.y);
|
|
277
|
-
t.x = h.ox + (bx - h.bx);
|
|
278
|
-
t.y = h.oy + (by - h.by);
|
|
279
|
-
if (e.phase !== 'end') {
|
|
280
|
-
setPose(g.world, l, s, h.id, poseOf(g, h.id));
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
g.held = null;
|
|
284
|
-
return drop(g, h.id);
|
|
285
|
-
}
|
|
286
|
-
if (e.phase !== 'end') return;
|
|
287
|
-
g.held = null;
|
|
288
|
-
if (g.clock - h.at < TAP_MAX) rotate(g, h.id);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/** A tap: the tan turns 45° (it's already been picked up, so it's full size). */
|
|
292
|
-
function rotate(g: Game, id: number) {
|
|
293
|
-
const { layout: l, scene: s } = g;
|
|
294
|
-
const t = g.tans[id]!;
|
|
295
|
-
t.rot += ROTATE_STEP;
|
|
296
|
-
keepInView(g, id);
|
|
297
|
-
if (l && s) moveTo(g.world, l, s, id, poseOf(g, id), ROTATE_TIME, 'back');
|
|
298
|
-
g.onEvent('rotate');
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/** A tan let go where it is (no slot): it settles down onto the board there. */
|
|
302
|
-
function settle(g: Game, id: number) {
|
|
303
|
-
keepInView(g, id);
|
|
304
|
-
if (g.layout && g.scene) moveTo(g.world, g.layout, g.scene, id, poseOf(g, id), 0.12);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/** Loose pieces can still be arranged freely, but cannot be lost beyond the visible board. */
|
|
308
|
-
function keepInView(g: Game, id: number) {
|
|
309
|
-
const l = g.layout,
|
|
310
|
-
data = g.data;
|
|
311
|
-
if (!l || !data) return;
|
|
312
|
-
const t = g.tans[id]!,
|
|
313
|
-
scale = poseOf(g, id).scale;
|
|
314
|
-
const points = data.pieces[id]!.localPoints.map((p) => rotatePt(p.x * scale, p.y * scale, t.rot, 0, 0));
|
|
315
|
-
const xs = points.map((p) => p.x),
|
|
316
|
-
ys = points.map((p) => p.y);
|
|
317
|
-
const rim = l.unit * scale * RIM_RADIUS;
|
|
318
|
-
t.x = Math.max(rim - Math.min(...xs), Math.min(l.boardW - rim - Math.max(...xs), t.x));
|
|
319
|
-
t.y = Math.max(rim - Math.min(...ys), Math.min(l.boardH - rim - Math.max(...ys), t.y));
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/** A tan let go: into the nearest free slot of its shape if it's close and turned right; a wiggle if it's turned wrong. */
|
|
323
|
-
function drop(g: Game, id: number) {
|
|
324
|
-
const { layout: l, scene: s, data } = g;
|
|
325
|
-
if (!l || !s || !data || g.phase !== 'playing') return settle(g, id);
|
|
326
|
-
const t = g.tans[id]!;
|
|
327
|
-
const claimed = claimSlot(data, g.occupied, l.unit, data.pieces[id]!.type, t.x, t.y, t.rot);
|
|
328
|
-
if (claimed && claimed !== 'nudge') {
|
|
329
|
-
t.placed = true;
|
|
330
|
-
t.x = claimed.cx;
|
|
331
|
-
t.y = claimed.cy;
|
|
332
|
-
t.rot = claimed.rot;
|
|
333
|
-
if (g.active === id) g.active = -1;
|
|
334
|
-
moveTo(g.world, l, s, id, poseOf(g, id), SNAP_TIME);
|
|
335
|
-
pop(g.world, l, s, id, 0.14);
|
|
336
|
-
g.onEvent('place');
|
|
337
|
-
placePiece(g);
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
settle(g, id);
|
|
341
|
-
if (claimed === 'nudge') {
|
|
342
|
-
wiggle(g.world, s, id, t.rot);
|
|
343
|
-
g.onEvent('wrong');
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/** A tan placed: 1,000 points; the seventh wins, scored by the time it took (as the original store). */
|
|
348
|
-
function placePiece(g: Game) {
|
|
349
|
-
g.placed += 1;
|
|
350
|
-
g.world.scoreboard.add(POINTS_PER_PIECE);
|
|
351
|
-
const won = g.placed >= TOTAL_PIECES;
|
|
352
|
-
if (won) g.world.scoreboard.set(calculateTimeBasedScore(GAME_DURATION - g.timeLeft, GAME_DURATION, g.score));
|
|
353
|
-
g.onPlaced(g.placed);
|
|
354
|
-
g.onScore(g.score);
|
|
355
|
-
if (won) end(g, true);
|
|
356
|
-
}
|