@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,352 +0,0 @@
|
|
|
1
|
-
// Everything Spider Solitaire draws: real cards (a thin white card with its rank and suit standing on
|
|
2
|
-
// its face, a blue patterned back) lying on the table in ten piles, the deck to deal from and the
|
|
3
|
-
// finished runs along the bottom, and an outline for every empty place. Seen from a little in front of
|
|
4
|
-
// straight down (shared/EngineTilt: an orthographic camera leaning back, one world unit per point).
|
|
5
|
-
//
|
|
6
|
-
// Every card is one entity (all sharing one mesh), its rank and suit pips attached to it, so it moves,
|
|
7
|
-
// flips and lifts as one piece. Cards glide, arc and turn over in the engine's Rust core; JS only says
|
|
8
|
-
// where each one should be.
|
|
9
|
-
import { type Color, effects, type Entity, extrude, merge, type Model, Path, type Quat, quat, type Vec3, type World } from '@nayan-ui/engine';
|
|
10
|
-
import { COLORS as GAME_COLORS } from '../../services/GamesConstants';
|
|
11
|
-
import type { GameTheme } from '../../services/ThemeService';
|
|
12
|
-
import { setBackdropTheme, spawnBackdrop } from '../shared/EngineBackdrop';
|
|
13
|
-
import { GLYPH_WIDTH, glyphMesh } from '../shared/EngineGlyphs';
|
|
14
|
-
import { cacheGameAsset, createGameMesh as createShape } from '../shared/EngineMeshes';
|
|
15
|
-
import { placeTiltedBackdrop } from '../shared/EngineTilt';
|
|
16
|
-
import { toColor } from '../shared/EngineUtils';
|
|
17
|
-
import { CARD_RATIO, COLORS, FACE_DOWN_STEP, FACE_UP_STEP, type Layout, MOVE_TIME, SMALL, SUIT_COLORS, THICKNESS } from './SpiderSolitaireConstants';
|
|
18
|
-
import { type Board, type Card, PILES, type Suit } from './SpiderSolitaireRules';
|
|
19
|
-
|
|
20
|
-
const meshes = new Map<string, Model>();
|
|
21
|
-
const cached = (key: string, build: () => Model) => {
|
|
22
|
-
let m = meshes.get(key);
|
|
23
|
-
if (!m) {
|
|
24
|
-
m = cacheGameAsset('spider-solitaire/SpiderSolitaireScene:' + key, build);
|
|
25
|
-
meshes.set(key, m);
|
|
26
|
-
}
|
|
27
|
-
return m;
|
|
28
|
-
};
|
|
29
|
-
const BACKDROP_DEPTH = 30;
|
|
30
|
-
const HALF_H = CARD_RATIO / 2;
|
|
31
|
-
const RADIUS = 0.07;
|
|
32
|
-
const FACE_UP: Quat = [0, 0, 0, 1];
|
|
33
|
-
const FACE_DOWN = quat.y(Math.PI);
|
|
34
|
-
const EDGE_ON = quat.y(Math.PI / 2);
|
|
35
|
-
const LIFT = 7; // a picked-up run rises off the table this far
|
|
36
|
-
const HELD = 40; // and a dragged one this far
|
|
37
|
-
|
|
38
|
-
// ── Meshes (one card width across) ────────────────────────────────────
|
|
39
|
-
|
|
40
|
-
const rrect = (inset: number, path = new Path()) =>
|
|
41
|
-
path.addRoundedRect(-0.5 + inset, -HALF_H + inset, 1 - inset * 2, CARD_RATIO - inset * 2, Math.max(0.01, RADIUS - inset));
|
|
42
|
-
|
|
43
|
-
/** A card: a thin white slab, its back (facing -z) blue in a white frame with a lattice of diamonds. */
|
|
44
|
-
const cardMesh = () =>
|
|
45
|
-
cached('ss-card', () => {
|
|
46
|
-
const t = THICKNESS;
|
|
47
|
-
// A flat layer on the back, turned to face -z, just behind the slab
|
|
48
|
-
const back = (path: Path, color: string, k: number) => ({
|
|
49
|
-
geometry: extrude(path, { depth: 0, fillRule: 'evenodd' as const }),
|
|
50
|
-
rotation: FACE_DOWN,
|
|
51
|
-
position: [0, 0, -t / 2 - 0.002 * k] as Vec3,
|
|
52
|
-
color: toColor(color)
|
|
53
|
-
});
|
|
54
|
-
const lattice = new Path();
|
|
55
|
-
for (let r = 0; r < 7; r++)
|
|
56
|
-
for (let c = 0; c < 4; c++) {
|
|
57
|
-
const x = -0.27 + c * 0.18 + (r % 2 ? 0.09 : 0);
|
|
58
|
-
const y = -0.5 + r * 0.166;
|
|
59
|
-
if (x > 0.3) continue;
|
|
60
|
-
lattice.addPolygon([
|
|
61
|
-
[x, y - 0.07],
|
|
62
|
-
[x + 0.06, y],
|
|
63
|
-
[x, y + 0.07],
|
|
64
|
-
[x - 0.06, y]
|
|
65
|
-
]);
|
|
66
|
-
}
|
|
67
|
-
return createShape(
|
|
68
|
-
merge([
|
|
69
|
-
{ geometry: extrude(rrect(0), { depth: t }), color: toColor(COLORS.FACE) },
|
|
70
|
-
back(rrect(0.035), COLORS.BACK, 1),
|
|
71
|
-
back(rrect(0.075, rrect(0.095)), COLORS.BACK_FRAME, 2),
|
|
72
|
-
back(lattice, COLORS.BACK_LIGHT, 2)
|
|
73
|
-
]),
|
|
74
|
-
{ center: false, shine: 0.35 }
|
|
75
|
-
);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const SUIT_PATHS: Record<Suit, string> = {
|
|
79
|
-
hearts:
|
|
80
|
-
'M0.5,0.95 C0.2,0.72 0,0.52 0,0.3 C0,0.12 0.13,0 0.28,0 C0.38,0 0.46,0.06 0.5,0.15 C0.54,0.06 0.62,0 0.72,0 C0.87,0 1,0.12 1,0.3 C1,0.52 0.8,0.72 0.5,0.95 Z',
|
|
81
|
-
diamonds: 'M0.5,0 L0.86,0.5 L0.5,1 L0.14,0.5 Z',
|
|
82
|
-
clubs:
|
|
83
|
-
'M0.5,0 C0.64,0 0.75,0.11 0.75,0.25 C0.75,0.33 0.71,0.4 0.66,0.44 C0.7,0.42 0.74,0.41 0.78,0.41 C0.92,0.41 1,0.52 1,0.65 C1,0.79 0.9,0.89 0.77,0.89 C0.67,0.89 0.58,0.83 0.54,0.75 C0.56,0.86 0.6,0.94 0.68,1 L0.32,1 C0.4,0.94 0.44,0.86 0.46,0.75 C0.42,0.83 0.33,0.89 0.23,0.89 C0.1,0.89 0,0.79 0,0.65 C0,0.52 0.08,0.41 0.22,0.41 C0.26,0.41 0.3,0.42 0.34,0.44 C0.29,0.4 0.25,0.33 0.25,0.25 C0.25,0.11 0.36,0 0.5,0 Z',
|
|
84
|
-
spades:
|
|
85
|
-
'M0.5,0 C0.8,0.25 1,0.42 1,0.6 C1,0.75 0.88,0.84 0.75,0.84 C0.65,0.84 0.57,0.79 0.53,0.72 C0.55,0.84 0.6,0.93 0.68,1 L0.32,1 C0.4,0.93 0.45,0.84 0.47,0.72 C0.43,0.79 0.35,0.84 0.25,0.84 C0.12,0.84 0,0.75 0,0.6 C0,0.42 0.2,0.25 0.5,0 Z'
|
|
86
|
-
};
|
|
87
|
-
/** A suit's pip, one unit across at its widest, with a little depth. */
|
|
88
|
-
const suitMesh = (suit: Suit) =>
|
|
89
|
-
cached(`ss-suit:${suit}`, () => createShape(extrude(Path.fromSVG(SUIT_PATHS[suit]), { depth: 0.08 }), { fit: 1, shine: 0.5 }));
|
|
90
|
-
|
|
91
|
-
/** An empty place's outline, and the faint card-shaped fill inside it. */
|
|
92
|
-
const slotRingMesh = () =>
|
|
93
|
-
cached('ss-slot-ring', () => createShape(extrude(rrect(0, rrect(0.035)), { depth: 0, fillRule: 'evenodd' }), { center: false }));
|
|
94
|
-
const slotFillMesh = () => cached('ss-slot-fill', () => createShape(extrude(rrect(0.035), { depth: 0 }), { center: false }));
|
|
95
|
-
|
|
96
|
-
// ── Spawning ──────────────────────────────────────────────────────────
|
|
97
|
-
|
|
98
|
-
/** Where a card should be: its centre on the table, its height, face up or down, its size, picked up or not. */
|
|
99
|
-
export type Spot = { x: number; y: number; z: number; faceUp: boolean; small: boolean; selected: boolean };
|
|
100
|
-
type CardView = { body: Entity; spot: Spot | null };
|
|
101
|
-
type Slot = { ring: Entity; fill: Entity | null };
|
|
102
|
-
|
|
103
|
-
export type Scene = {
|
|
104
|
-
backdrop: Entity;
|
|
105
|
-
piles: Slot[];
|
|
106
|
-
stock: Slot;
|
|
107
|
-
foundation: Slot;
|
|
108
|
-
cards: Map<string, CardView>;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const slotColor = (theme: GameTheme): Color => toColor(theme.mode === 'classic' ? COLORS.CLASSIC_SLOT : theme.BOARD.BORDER);
|
|
112
|
-
const slotFill = (theme: GameTheme): Color => toColor(theme.mode === 'classic' ? GAME_COLORS.BG_35 : theme.BOARD.CELL_EMPTY);
|
|
113
|
-
|
|
114
|
-
function spawnSlot(world: World, l: Layout, x: number, y: number, small: boolean, filled: boolean, theme: GameTheme): Slot {
|
|
115
|
-
const scale = l.card * (small ? SMALL : 1);
|
|
116
|
-
const ring = world.spawn({ mesh: slotRingMesh(), position: [x, y, 0.1], scale, color: slotColor(theme), pickable: false });
|
|
117
|
-
const fill = filled ? world.spawn({ mesh: slotFillMesh(), position: [x, y, 0.05], scale, color: slotFill(theme), pickable: false }) : null;
|
|
118
|
-
return { ring, fill };
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** The pips on a card's face (attached to it): its rank top left, a small suit top right, a big one in the middle. */
|
|
122
|
-
function spawnFace(world: World, body: Entity, card: Card) {
|
|
123
|
-
const color = toColor(SUIT_COLORS[card.suit]);
|
|
124
|
-
const z = THICKNESS / 2;
|
|
125
|
-
const chars = card.value.split('');
|
|
126
|
-
const size = chars.length > 1 ? 0.27 : 0.32;
|
|
127
|
-
const advance = size * GLYPH_WIDTH * 1.05;
|
|
128
|
-
chars.forEach((ch, i) => {
|
|
129
|
-
const x = -0.33 + (i - (chars.length - 1) / 2) * advance + (chars.length > 1 ? 0.04 : 0);
|
|
130
|
-
world.spawn({ mesh: glyphMesh(ch), parent: body, position: [x, HALF_H - 0.24, z], scale: size, color, pickable: false });
|
|
131
|
-
});
|
|
132
|
-
const suit = suitMesh(card.suit);
|
|
133
|
-
world.spawn({ mesh: suit, parent: body, position: [0.29, HALF_H - 0.24, z + 0.02], scale: 0.26, color, pickable: false });
|
|
134
|
-
world.spawn({ mesh: suit, parent: body, position: [0, -0.16, z + 0.02], scale: 0.56, color, pickable: false });
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/** The table: the backdrop, an outline for each pile, the deck's place and the first run's, and all 104 cards. */
|
|
138
|
-
export function buildScene(world: World, l: Layout, theme: GameTheme, cards: Card[]): Scene {
|
|
139
|
-
const backdrop = spawnBackdrop(world, l.width, l.height, -BACKDROP_DEPTH, theme);
|
|
140
|
-
placeTiltedBackdrop(world, backdrop, l, BACKDROP_DEPTH);
|
|
141
|
-
const pileY = l.pileTop - l.cardH / 2;
|
|
142
|
-
const small = l.card * SMALL;
|
|
143
|
-
const s: Scene = {
|
|
144
|
-
backdrop,
|
|
145
|
-
piles: l.columns.map((x) => spawnSlot(world, l, x, pileY, false, false, theme)),
|
|
146
|
-
stock: spawnSlot(world, l, l.stockRight - small / 2, l.rowY, true, true, theme),
|
|
147
|
-
foundation: spawnSlot(world, l, l.foundationX, l.rowY, true, true, theme),
|
|
148
|
-
cards: new Map()
|
|
149
|
-
};
|
|
150
|
-
for (const card of cards) {
|
|
151
|
-
const body = world.spawn({
|
|
152
|
-
mesh: cardMesh(),
|
|
153
|
-
scale: l.card * SMALL,
|
|
154
|
-
rotation: FACE_DOWN,
|
|
155
|
-
position: [l.stockRight - small / 2, l.rowY, 1],
|
|
156
|
-
pickable: false
|
|
157
|
-
});
|
|
158
|
-
spawnFace(world, body, card);
|
|
159
|
-
s.cards.set(card.id, { body, spot: { x: l.stockRight - small / 2, y: l.rowY, z: 1, faceUp: false, small: true, selected: false } });
|
|
160
|
-
}
|
|
161
|
-
return s;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export function removeScene(world: World, s: Scene) {
|
|
165
|
-
const slots = [...s.piles, s.stock, s.foundation];
|
|
166
|
-
for (const e of [s.backdrop, ...slots.flatMap((x) => [x.ring, x.fill]), ...Array.from(s.cards.values(), (c) => c.body)])
|
|
167
|
-
if (e != null) world.despawn(e);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function setSceneTheme(world: World, s: Scene, theme: GameTheme) {
|
|
171
|
-
setBackdropTheme(world, s.backdrop, theme);
|
|
172
|
-
for (const slot of [...s.piles, s.stock, s.foundation]) {
|
|
173
|
-
world.set(slot.ring, { color: slotColor(theme) });
|
|
174
|
-
if (slot.fill != null) world.set(slot.fill, { color: slotFill(theme) });
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// ── Where every card goes ─────────────────────────────────────────────
|
|
179
|
-
|
|
180
|
-
/** How far down from the pile's top edge each card's top edge is: the original steps, squeezed if the pile would run too long. */
|
|
181
|
-
export function pileOffsets(l: Layout, pile: Card[]): number[] {
|
|
182
|
-
const steps = pile.map((c) => (c.faceUp ? FACE_UP_STEP : FACE_DOWN_STEP) * l.cardH);
|
|
183
|
-
let total = 0;
|
|
184
|
-
for (let i = 0; i < pile.length - 1; i++) total += steps[i]!;
|
|
185
|
-
const room = l.pileTop - l.pileBottom - l.cardH;
|
|
186
|
-
const k = total > room && total > 0 ? Math.max(0, room) / total : 1;
|
|
187
|
-
const out: number[] = [];
|
|
188
|
-
let at = 0;
|
|
189
|
-
for (let i = 0; i < pile.length; i++) {
|
|
190
|
-
out.push(at);
|
|
191
|
-
at += steps[i]! * k;
|
|
192
|
-
}
|
|
193
|
-
return out;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/** A pile card's place: its centre and height (each card a little above the one under it). */
|
|
197
|
-
export function pileSpot(l: Layout, column: number, offset: number, index: number): [number, number, number] {
|
|
198
|
-
return [l.columns[column]!, l.pileTop - offset - l.cardH / 2, l.dz * (index + 1)];
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/** What the player holds: a picked-up run (lifted), or a dragged one (following the finger, its top card's centre at x, y). */
|
|
202
|
-
export type Held = { pile: number; index: number; drag: { x: number; y: number } | null } | null;
|
|
203
|
-
|
|
204
|
-
/** Every card's place on the table, from the board and what's held. */
|
|
205
|
-
export function layoutCards(l: Layout, b: Board, held: Held, onlyHeld = false): Map<string, Spot> {
|
|
206
|
-
const spots = new Map<string, Spot>();
|
|
207
|
-
if (onlyHeld && held?.drag) {
|
|
208
|
-
const pile = b.tableau[held.pile]!;
|
|
209
|
-
const offsets = pileOffsets(l, pile);
|
|
210
|
-
for (let i = held.index; i < pile.length; i++) {
|
|
211
|
-
const card = pile[i]!;
|
|
212
|
-
spots.set(card.id, {
|
|
213
|
-
x: held.drag.x,
|
|
214
|
-
y: held.drag.y - (offsets[i]! - offsets[held.index]!),
|
|
215
|
-
z: HELD + l.dz * (i - held.index),
|
|
216
|
-
faceUp: card.faceUp,
|
|
217
|
-
small: false,
|
|
218
|
-
selected: true
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
return spots;
|
|
222
|
-
}
|
|
223
|
-
b.tableau.forEach((pile, col) => {
|
|
224
|
-
const offsets = pileOffsets(l, pile);
|
|
225
|
-
pile.forEach((card, i) => {
|
|
226
|
-
const lifted = held !== null && held.pile === col && i >= held.index;
|
|
227
|
-
let [x, y, z] = pileSpot(l, col, offsets[i]!, i);
|
|
228
|
-
if (lifted && held.drag) {
|
|
229
|
-
const below = offsets[i]! - offsets[held.index]!;
|
|
230
|
-
x = held.drag.x;
|
|
231
|
-
y = held.drag.y - below;
|
|
232
|
-
z = HELD + l.dz * (i - held.index);
|
|
233
|
-
} else if (lifted) {
|
|
234
|
-
y += 2;
|
|
235
|
-
z += LIFT;
|
|
236
|
-
}
|
|
237
|
-
spots.set(card.id, { x, y, z, faceUp: card.faceUp, small: false, selected: lifted });
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
// The deck: a stack for each deal left, fanned leftward from the deck's place, the next to deal on the right
|
|
241
|
-
const small = l.card * SMALL;
|
|
242
|
-
const deals = Math.ceil(b.stock.length / PILES);
|
|
243
|
-
const thick = small * THICKNESS + 0.15;
|
|
244
|
-
b.stock.forEach((card, i) => {
|
|
245
|
-
const group = Math.floor(i / PILES);
|
|
246
|
-
spots.set(card.id, {
|
|
247
|
-
x: l.stockRight - small / 2 - (deals - 1 - group) * small * 0.22,
|
|
248
|
-
y: l.rowY,
|
|
249
|
-
z: 1 + (group * PILES + (i % PILES)) * thick * 0.3,
|
|
250
|
-
faceUp: false,
|
|
251
|
-
small: true,
|
|
252
|
-
selected: false
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
// The finished runs, fanned rightward from the first's place, each with its King on top
|
|
256
|
-
b.completed.forEach((run, r) => {
|
|
257
|
-
run.forEach((card, j) => {
|
|
258
|
-
spots.set(card.id, {
|
|
259
|
-
x: l.foundationX + r * small * 0.5,
|
|
260
|
-
y: l.rowY,
|
|
261
|
-
z: 1 + r * 3 + (12 - j) * 0.2,
|
|
262
|
-
faceUp: true,
|
|
263
|
-
small: true,
|
|
264
|
-
selected: false
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
return spots;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const scaleOf = (l: Layout, s: Spot) => l.card * (s.small ? SMALL : 1);
|
|
272
|
-
const same = (a: Spot, b: Spot) =>
|
|
273
|
-
a.x === b.x && a.y === b.y && a.z === b.z && a.faceUp === b.faceUp && a.small === b.small && a.selected === b.selected;
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Moves every card that's changed place to its new one: it glides (rising over the cards between and
|
|
277
|
-
* turning over on the way if it flips), after `delay(id)` seconds. `instant` puts them there at once
|
|
278
|
-
* (a dragged run following the finger).
|
|
279
|
-
*/
|
|
280
|
-
export function placeCards(world: World, l: Layout, s: Scene, spots: Map<string, Spot>, delay: (id: string) => number = () => 0, instant = false) {
|
|
281
|
-
for (const [id, spot] of spots) {
|
|
282
|
-
const view = s.cards.get(id);
|
|
283
|
-
if (!view) continue;
|
|
284
|
-
const prev = view.spot;
|
|
285
|
-
if (prev && same(prev, spot)) continue;
|
|
286
|
-
view.spot = spot;
|
|
287
|
-
const position: Vec3 = [spot.x, spot.y, spot.z];
|
|
288
|
-
const rotation = spot.faceUp ? FACE_UP : FACE_DOWN;
|
|
289
|
-
const scale = scaleOf(l, spot);
|
|
290
|
-
const color = toColor(spot.selected ? COLORS.SELECTED : COLORS.FACE);
|
|
291
|
-
if (instant || !prev) {
|
|
292
|
-
world.stopAnimation(view.body);
|
|
293
|
-
world.set(view.body, { position, rotation, scale, color });
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
if (prev.selected !== spot.selected) world.set(view.body, { color });
|
|
297
|
-
const far = Math.hypot(prev.x - spot.x, prev.y - spot.y);
|
|
298
|
-
const flips = prev.faceUp !== spot.faceUp;
|
|
299
|
-
if (far < 1 && !flips) {
|
|
300
|
-
// A lift or a set-down in place
|
|
301
|
-
world.animate(view.body, { position, scale }, { duration: 0.14, delay: delay(id) });
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
// Up over the others, across, and down, turning over at the top if it flips
|
|
305
|
-
const top = Math.max(prev.z, spot.z) + (far > 1 ? 18 + far * 0.05 : 10);
|
|
306
|
-
const mid: Vec3 = [(prev.x + spot.x) / 2, (prev.y + spot.y) / 2, top];
|
|
307
|
-
world.animate(
|
|
308
|
-
view.body,
|
|
309
|
-
[
|
|
310
|
-
{ position: mid, ...(flips ? { rotation: EDGE_ON } : {}), scale: (scale + scaleOf(l, prev)) / 2, at: 0.5 },
|
|
311
|
-
{ position, rotation, scale }
|
|
312
|
-
],
|
|
313
|
-
{ duration: MOVE_TIME + Math.min(0.16, far * 0.0006), delay: delay(id), path: 'smooth', easing: 'easeInOut' }
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// ── Feedback ──────────────────────────────────────────────────────────
|
|
319
|
-
|
|
320
|
-
/** A move that isn't allowed: the cards shake where they are. */
|
|
321
|
-
export function shakeCards(world: World, s: Scene, ids: string[]) {
|
|
322
|
-
for (const id of ids) {
|
|
323
|
-
const v = s.cards.get(id);
|
|
324
|
-
if (v) world.animate(v.body, { shake: 3 }, { duration: 0.25 });
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/** A finished run lifted off: a sparkle where it was. */
|
|
329
|
-
export function sparkle(world: World, l: Layout, x: number, y: number) {
|
|
330
|
-
effects.sparkle(world, {
|
|
331
|
-
position: [x, y, 30],
|
|
332
|
-
count: 26,
|
|
333
|
-
size: l.card * 0.1,
|
|
334
|
-
speed: l.card * 3,
|
|
335
|
-
lifetime: 0.7,
|
|
336
|
-
gravity: -l.card * 3,
|
|
337
|
-
colors: ['#FFD700', '#FFF59D', '#FF8A80', '#FFFFFF'].map((c) => toColor(c))
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/** All eight runs home: confetti over the table. */
|
|
342
|
-
export function celebrate(world: World, l: Layout) {
|
|
343
|
-
effects.confetti(world, {
|
|
344
|
-
position: [0, (l.pileTop + l.pileBottom) / 2, 60],
|
|
345
|
-
count: 80,
|
|
346
|
-
size: l.card * 0.14,
|
|
347
|
-
speed: l.width * 1.2,
|
|
348
|
-
lifetime: 1.4,
|
|
349
|
-
gravity: -l.width * 2,
|
|
350
|
-
colors: ['#FFD700', '#4CAF50', '#2196F3', '#E74C3C'].map((c) => toColor(c))
|
|
351
|
-
});
|
|
352
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// Stack Tower's screen, on the Nayan engine: the tower, the sliding block and the plinth are one 3D
|
|
2
|
-
// scene (an orthographic camera looking down a little from in front), under Playtura's scoreboard,
|
|
3
|
-
// controls and modals. The rules are in StackTowerGame.ts, what it draws in StackTowerScene.ts.
|
|
4
|
-
//
|
|
5
|
-
// One world serves the whole visit: Start, Stop and Play Again reset it in place, so the GPU view is
|
|
6
|
-
// never rebuilt. JS slides the block and steps the clock and the world once a frame; landings and
|
|
7
|
-
// misses animate in the engine's Rust core.
|
|
8
|
-
import { HapticType } from '../../services/HapticsService';
|
|
9
|
-
import { GAME_SOUNDS } from '../../services/SoundsService';
|
|
10
|
-
import { GAME_IDS } from '../../services/UtilsService';
|
|
11
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
12
|
-
import { scoreColumn, timerColumn } from '../shared/EngineHud';
|
|
13
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
14
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
15
|
-
import { getLayout, LIGHT, TIME_LIMIT } from './StackTowerConstants';
|
|
16
|
-
import { createGame, dispose, type GameEvent, reset, setLayout, setTheme, start, tap, tick } from './StackTowerGame';
|
|
17
|
-
|
|
18
|
-
const SOUNDS = GAME_SOUNDS.STACK_TOWER;
|
|
19
|
-
|
|
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
|
-
place: { sound: SOUNDS.PLACE, haptic: HapticType.MEDIUM },
|
|
23
|
-
perfect: { sound: SOUNDS.PERFECT, haptic: HapticType.SUCCESS },
|
|
24
|
-
miss: { sound: SOUNDS.MISS, haptic: HapticType.ERROR }
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export const StackTower = engineGame(GAME_IDS.STACK_TOWER, (props) => {
|
|
28
|
-
const [score, setScore] = useLiveState(0);
|
|
29
|
-
const [timeLeft, setTimeLeft] = useLiveState(TIME_LIMIT);
|
|
30
|
-
|
|
31
|
-
// A win when the clock runs out, a loss on a miss
|
|
32
|
-
const { theme, status, screen, gameOver } = useEngineGame(props, {
|
|
33
|
-
gameId: GAME_IDS.STACK_TOWER,
|
|
34
|
-
create: createGame,
|
|
35
|
-
start,
|
|
36
|
-
reset,
|
|
37
|
-
dispose,
|
|
38
|
-
tick,
|
|
39
|
-
setTheme,
|
|
40
|
-
// Lay the tower out for the view.
|
|
41
|
-
resize: (g, width, height) => {
|
|
42
|
-
const l = getLayout(width, height);
|
|
43
|
-
setLayout(g, l);
|
|
44
|
-
return l.gameWidth;
|
|
45
|
-
},
|
|
46
|
-
// Drops the block the moment a finger touches down, where the player sees it
|
|
47
|
-
drag: (g, e) => {
|
|
48
|
-
if (e.phase === 'start') tap(g);
|
|
49
|
-
},
|
|
50
|
-
sounds: SOUNDS,
|
|
51
|
-
onStart: (fx) => fx(SOUNDS.START, HapticType.SUCCESS),
|
|
52
|
-
onStop: (fx) => fx(null, HapticType.MEDIUM),
|
|
53
|
-
onOver: (fx, s) => fx(s === 'win' ? SOUNDS.WIN : SOUNDS.GAME_OVER, s === 'win' ? HapticType.SUCCESS : HapticType.ERROR),
|
|
54
|
-
wire: (g, fx) => {
|
|
55
|
-
g.onScore = setScore;
|
|
56
|
-
g.onTime = setTimeLeft;
|
|
57
|
-
g.onEvent = (event) => fx(FEEDBACK[event].sound, FEEDBACK[event].haptic);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<EngineGameScreen
|
|
63
|
-
{...screen}
|
|
64
|
-
light={LIGHT}
|
|
65
|
-
columns={[scoreColumn(score), timerColumn(timeLeft, theme)]}
|
|
66
|
-
subtext="Stack blocks with care!"
|
|
67
|
-
gameOver={gameOver({
|
|
68
|
-
title: status === 'win' ? 'AMAZING!' : 'GAME OVER',
|
|
69
|
-
message: status === 'win' ? 'Perfect tower!' : 'Great stacking!',
|
|
70
|
-
scoreLabel: 'Final Score',
|
|
71
|
-
score,
|
|
72
|
-
buttonText: 'Stack Again!'
|
|
73
|
-
})}
|
|
74
|
-
/>
|
|
75
|
-
);
|
|
76
|
-
});
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// Stack Tower's rules, physics, timings and layout. Rules, speeds (points per 60 Hz frame) and scoring
|
|
2
|
-
// match the original version (games/stack-tower), so scores and feel carry over: blocks keep their full
|
|
3
|
-
// width, and the round ends on a miss (a loss) or when the clock runs out (a win).
|
|
4
|
-
import type { TiltView } from '../shared/EngineTilt';
|
|
5
|
-
import { frontLight, gameWidthFor } from '../shared/EngineUtils';
|
|
6
|
-
|
|
7
|
-
// ── Rules ─────────────────────────────────────────────────────────────
|
|
8
|
-
|
|
9
|
-
export const TIME_LIMIT = 120; // seconds
|
|
10
|
-
export const POINTS_PER_BLOCK = 500;
|
|
11
|
-
export const PERFECT_BONUS = 250; // times the perfect streak
|
|
12
|
-
export const PERFECT_THRESHOLD = 3; // points of overhang still counted as perfect
|
|
13
|
-
export const MIN_OVERLAP_RATIO = 0.4;
|
|
14
|
-
|
|
15
|
-
/** Cycled up the tower. */
|
|
16
|
-
export const BLOCK_COLORS = ['#FF4757', '#FFA502', '#2ED573', '#1E90FF', '#FF6BD6', '#A55EEA', '#00D2D3', '#FF6348'] as const;
|
|
17
|
-
|
|
18
|
-
// ── Physics ───────────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
export const FRAME_MS = 16.67; // the slide speed is per this much time
|
|
21
|
-
export const MAX_FRAMES = 2; // a long frame slides at most two frames' worth
|
|
22
|
-
|
|
23
|
-
// ── Timings (seconds) ─────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
export const NEXT_BLOCK_DELAY = 0.2;
|
|
26
|
-
export const MISS_TIME = 0.45; // a missed block tumbles off
|
|
27
|
-
export const GAME_OVER_DELAY = 0.3; // ...and the round ends this long after
|
|
28
|
-
export const SPAWN_FADE = 0.2;
|
|
29
|
-
export const PERFECT_SHOW = 0.6;
|
|
30
|
-
export const CAMERA_TIME = 0.35; // the view scrolls up after a new block
|
|
31
|
-
|
|
32
|
-
// ── The scene ─────────────────────────────────────────────────────────
|
|
33
|
-
|
|
34
|
-
/** The camera looks down a little from in front, so the tower's top and its depth show. */
|
|
35
|
-
export const TILT = -0.24;
|
|
36
|
-
/** Lit from the upper left; faces toward the camera (+z) keep their exact color. */
|
|
37
|
-
export const LIGHT = frontLight([-0.45, 0.6, 1], 0.5);
|
|
38
|
-
|
|
39
|
-
// ── Layout (view points; tower positions are view points with y down, as the original game used) ──
|
|
40
|
-
|
|
41
|
-
const TABLET_WIDTH = 640;
|
|
42
|
-
|
|
43
|
-
export type Layout = TiltView & {
|
|
44
|
-
/** The slide's bounds: the game area, 30 narrower than the screen and at most 500 across. */
|
|
45
|
-
left: number;
|
|
46
|
-
gameWidth: number;
|
|
47
|
-
blockWidth: number;
|
|
48
|
-
blockHeight: number;
|
|
49
|
-
/** Front to back. */
|
|
50
|
-
blockDepth: number;
|
|
51
|
-
speed: number;
|
|
52
|
-
/** The base block's top. */
|
|
53
|
-
baseY: number;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export function getLayout(width: number, height: number): Layout {
|
|
57
|
-
const tablet = width > TABLET_WIDTH;
|
|
58
|
-
const gameWidth = gameWidthFor(width);
|
|
59
|
-
const blockWidth = tablet ? 200 : 160;
|
|
60
|
-
return {
|
|
61
|
-
width,
|
|
62
|
-
height,
|
|
63
|
-
centerY: height / 2,
|
|
64
|
-
tilt: TILT,
|
|
65
|
-
left: (width - gameWidth) / 2,
|
|
66
|
-
gameWidth,
|
|
67
|
-
blockWidth,
|
|
68
|
-
blockHeight: tablet ? 28 : 22,
|
|
69
|
-
// Shallow enough that the sliding block's open top is a slim strip, not twice a stacked block's height
|
|
70
|
-
blockDepth: blockWidth * 0.36,
|
|
71
|
-
speed: tablet ? 4.5 : 3.5,
|
|
72
|
-
baseY: height - (tablet ? 180 : 160)
|
|
73
|
-
};
|
|
74
|
-
}
|