@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,474 +0,0 @@
|
|
|
1
|
-
// Nuts and Bolts' puzzles and moves, as plain functions: the planks laid across a 5 x 5 grid of points,
|
|
2
|
-
// a bolt wherever two or more cross, three swap holes below, and what moving a bolt frees. The original
|
|
3
|
-
// version's service (games/nuts-and-bolts), unchanged, so every puzzle plays the same.
|
|
4
|
-
import { BOARD_COLS, BOARD_ROWS, EXTRA_HOLES } from './NutsAndBoltsConstants';
|
|
5
|
-
|
|
6
|
-
export interface Hole {
|
|
7
|
-
id: string;
|
|
8
|
-
row: number;
|
|
9
|
-
col: number;
|
|
10
|
-
boltId: string | null; // null means empty hole
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface Bolt {
|
|
14
|
-
id: string;
|
|
15
|
-
row: number;
|
|
16
|
-
col: number;
|
|
17
|
-
originalRow: number; // Original position where bolt started (never changes)
|
|
18
|
-
originalCol: number;
|
|
19
|
-
holeId: string | null; // null means bolt is at a grid position
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface Plank {
|
|
23
|
-
id: string;
|
|
24
|
-
orientation: 'horizontal' | 'vertical';
|
|
25
|
-
startRow: number;
|
|
26
|
-
startCol: number;
|
|
27
|
-
length: number;
|
|
28
|
-
color: string;
|
|
29
|
-
zIndex: number; // for layering - higher = on top
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface PuzzleState {
|
|
33
|
-
holes: Hole[]; // only the 3 extra holes at bottom
|
|
34
|
-
bolts: Bolt[];
|
|
35
|
-
planks: Plank[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const PLANK_COLORS = {
|
|
39
|
-
horizontal: '#8B4513', // Brown for horizontal planks
|
|
40
|
-
vertical: '#C0C0C0' // Silver/Gray for vertical planks
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// Get all grid positions a plank covers
|
|
44
|
-
export const getPlankPositions = (plank: Plank): { row: number; col: number }[] => {
|
|
45
|
-
const positions: { row: number; col: number }[] = [];
|
|
46
|
-
for (let i = 0; i < plank.length; i++) {
|
|
47
|
-
if (plank.orientation === 'horizontal') {
|
|
48
|
-
positions.push({ row: plank.startRow, col: plank.startCol + i });
|
|
49
|
-
} else {
|
|
50
|
-
positions.push({ row: plank.startRow + i, col: plank.startCol });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return positions;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Check if a plank covers a specific position - optimized to avoid array creation
|
|
57
|
-
export const plankCoversPosition = (plank: Plank, row: number, col: number): boolean => {
|
|
58
|
-
const offset = plank.orientation === 'horizontal' ? col - plank.startCol : row - plank.startRow;
|
|
59
|
-
const aligned = plank.orientation === 'horizontal' ? row === plank.startRow : col === plank.startCol;
|
|
60
|
-
return aligned && Number.isInteger(offset) && offset >= 0 && offset < plank.length;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// Helper to generate random integer in range [min, max]
|
|
64
|
-
const randomInt = (min: number, max: number): number => {
|
|
65
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// Helper to shuffle array
|
|
69
|
-
const shuffleArray = <T>(array: T[]): T[] => {
|
|
70
|
-
const shuffled = [...array];
|
|
71
|
-
for (let i = shuffled.length - 1; i > 0; i--) {
|
|
72
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
73
|
-
[shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];
|
|
74
|
-
}
|
|
75
|
-
return shuffled;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export const generatePuzzle = (): PuzzleState => {
|
|
79
|
-
const holes: Hole[] = [];
|
|
80
|
-
const bolts: Bolt[] = [];
|
|
81
|
-
let planks: Plank[] = [];
|
|
82
|
-
|
|
83
|
-
// Hard: four planks each way over the 5 x 5 grid
|
|
84
|
-
const numHorizontal = 4;
|
|
85
|
-
const numVertical = 4;
|
|
86
|
-
|
|
87
|
-
let plankId = 0;
|
|
88
|
-
let boltId = 0;
|
|
89
|
-
|
|
90
|
-
// Keep trying until we get a valid puzzle
|
|
91
|
-
let validPuzzle = false;
|
|
92
|
-
let attempts = 0;
|
|
93
|
-
|
|
94
|
-
while (!validPuzzle && attempts < 500) {
|
|
95
|
-
attempts++;
|
|
96
|
-
planks = [];
|
|
97
|
-
plankId = 0;
|
|
98
|
-
|
|
99
|
-
// Randomly decide pattern type for variety
|
|
100
|
-
const patternType = randomInt(0, 3);
|
|
101
|
-
|
|
102
|
-
if (patternType === 0) {
|
|
103
|
-
// Pattern 1: Grid pattern - horizontal and vertical planks at random positions
|
|
104
|
-
const availableRows = shuffleArray([...Array(BOARD_ROWS).keys()]).slice(0, numHorizontal);
|
|
105
|
-
const availableCols = shuffleArray([...Array(BOARD_COLS).keys()]).slice(0, numVertical);
|
|
106
|
-
|
|
107
|
-
for (const row of availableRows) {
|
|
108
|
-
const startCol = randomInt(0, 1);
|
|
109
|
-
const length = BOARD_COLS - startCol - randomInt(0, 1);
|
|
110
|
-
planks.push({
|
|
111
|
-
id: `plank-${plankId++}`,
|
|
112
|
-
orientation: 'horizontal',
|
|
113
|
-
startRow: row,
|
|
114
|
-
startCol,
|
|
115
|
-
length: Math.max(2, length),
|
|
116
|
-
color: PLANK_COLORS.horizontal,
|
|
117
|
-
zIndex: plankId
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
for (const col of availableCols) {
|
|
122
|
-
const startRow = randomInt(0, 1);
|
|
123
|
-
const length = BOARD_ROWS - startRow - randomInt(0, 1);
|
|
124
|
-
planks.push({
|
|
125
|
-
id: `plank-${plankId++}`,
|
|
126
|
-
orientation: 'vertical',
|
|
127
|
-
startRow,
|
|
128
|
-
startCol: col,
|
|
129
|
-
length: Math.max(2, length),
|
|
130
|
-
color: PLANK_COLORS.vertical,
|
|
131
|
-
zIndex: plankId
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
} else if (patternType === 1) {
|
|
135
|
-
// Pattern 2: Cross pattern - planks crossing at center
|
|
136
|
-
const centerRow = Math.floor(BOARD_ROWS / 2);
|
|
137
|
-
const centerCol = Math.floor(BOARD_COLS / 2);
|
|
138
|
-
|
|
139
|
-
// Add horizontal planks around center
|
|
140
|
-
for (let i = 0; i < numHorizontal; i++) {
|
|
141
|
-
const row = (centerRow - 1 + i) % BOARD_ROWS;
|
|
142
|
-
planks.push({
|
|
143
|
-
id: `plank-${plankId++}`,
|
|
144
|
-
orientation: 'horizontal',
|
|
145
|
-
startRow: row,
|
|
146
|
-
startCol: randomInt(0, 1),
|
|
147
|
-
length: BOARD_COLS - randomInt(0, 1),
|
|
148
|
-
color: PLANK_COLORS.horizontal,
|
|
149
|
-
zIndex: plankId
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Add vertical planks around center
|
|
154
|
-
for (let i = 0; i < numVertical; i++) {
|
|
155
|
-
const col = (centerCol - 1 + i) % BOARD_COLS;
|
|
156
|
-
planks.push({
|
|
157
|
-
id: `plank-${plankId++}`,
|
|
158
|
-
orientation: 'vertical',
|
|
159
|
-
startRow: randomInt(0, 1),
|
|
160
|
-
startCol: col,
|
|
161
|
-
length: BOARD_ROWS - randomInt(0, 1),
|
|
162
|
-
color: PLANK_COLORS.vertical,
|
|
163
|
-
zIndex: plankId
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
} else if (patternType === 2) {
|
|
167
|
-
// Pattern 3: Staggered pattern
|
|
168
|
-
for (let i = 0; i < numHorizontal; i++) {
|
|
169
|
-
const row = randomInt(0, BOARD_ROWS - 1);
|
|
170
|
-
const startCol = i % 2 === 0 ? 0 : randomInt(0, 1);
|
|
171
|
-
const endCol = i % 2 === 0 ? BOARD_COLS - randomInt(0, 1) : BOARD_COLS;
|
|
172
|
-
planks.push({
|
|
173
|
-
id: `plank-${plankId++}`,
|
|
174
|
-
orientation: 'horizontal',
|
|
175
|
-
startRow: row,
|
|
176
|
-
startCol,
|
|
177
|
-
length: Math.max(2, endCol - startCol),
|
|
178
|
-
color: PLANK_COLORS.horizontal,
|
|
179
|
-
zIndex: plankId
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
for (let i = 0; i < numVertical; i++) {
|
|
184
|
-
const col = randomInt(0, BOARD_COLS - 1);
|
|
185
|
-
const startRow = i % 2 === 0 ? 0 : randomInt(0, 1);
|
|
186
|
-
const endRow = i % 2 === 0 ? BOARD_ROWS - randomInt(0, 1) : BOARD_ROWS;
|
|
187
|
-
planks.push({
|
|
188
|
-
id: `plank-${plankId++}`,
|
|
189
|
-
orientation: 'vertical',
|
|
190
|
-
startRow,
|
|
191
|
-
startCol: col,
|
|
192
|
-
length: Math.max(2, endRow - startRow),
|
|
193
|
-
color: PLANK_COLORS.vertical,
|
|
194
|
-
zIndex: plankId
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
} else {
|
|
198
|
-
// Pattern 4: Random lengths and positions
|
|
199
|
-
for (let i = 0; i < numHorizontal; i++) {
|
|
200
|
-
const row = randomInt(0, BOARD_ROWS - 1);
|
|
201
|
-
const length = randomInt(2, BOARD_COLS);
|
|
202
|
-
const startCol = randomInt(0, Math.max(0, BOARD_COLS - length));
|
|
203
|
-
planks.push({
|
|
204
|
-
id: `plank-${plankId++}`,
|
|
205
|
-
orientation: 'horizontal',
|
|
206
|
-
startRow: row,
|
|
207
|
-
startCol,
|
|
208
|
-
length,
|
|
209
|
-
color: PLANK_COLORS.horizontal,
|
|
210
|
-
zIndex: plankId
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
for (let i = 0; i < numVertical; i++) {
|
|
215
|
-
const col = randomInt(0, BOARD_COLS - 1);
|
|
216
|
-
const length = randomInt(2, BOARD_ROWS);
|
|
217
|
-
const startRow = randomInt(0, Math.max(0, BOARD_ROWS - length));
|
|
218
|
-
planks.push({
|
|
219
|
-
id: `plank-${plankId++}`,
|
|
220
|
-
orientation: 'vertical',
|
|
221
|
-
startRow,
|
|
222
|
-
startCol: col,
|
|
223
|
-
length,
|
|
224
|
-
color: PLANK_COLORS.vertical,
|
|
225
|
-
zIndex: plankId
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Trim planks so each has at most 3 bolt holes (intersections)
|
|
231
|
-
const MAX_HOLES_PER_PLANK = 3;
|
|
232
|
-
for (let p = 0; p < planks.length; p++) {
|
|
233
|
-
const plank = planks[p]!;
|
|
234
|
-
const positions = getPlankPositions(plank);
|
|
235
|
-
const holePositions: number[] = [];
|
|
236
|
-
|
|
237
|
-
for (let i = 0; i < positions.length; i++) {
|
|
238
|
-
const pos = positions[i]!;
|
|
239
|
-
// Check if this position intersects with any other plank
|
|
240
|
-
for (let q = 0; q < planks.length; q++) {
|
|
241
|
-
if (q === p) continue;
|
|
242
|
-
if (plankCoversPosition(planks[q]!, pos.row, pos.col)) {
|
|
243
|
-
holePositions.push(i);
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (holePositions.length > MAX_HOLES_PER_PLANK) {
|
|
250
|
-
// Keep only the first MAX_HOLES_PER_PLANK intersections by trimming the plank
|
|
251
|
-
const lastKeptIndex = holePositions[MAX_HOLES_PER_PLANK - 1]!;
|
|
252
|
-
plank.length = lastKeptIndex + 1;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Validate: every plank must have at least one intersection
|
|
257
|
-
const intersections = getPlankIntersections(planks);
|
|
258
|
-
|
|
259
|
-
// Need minimum intersections for a valid puzzle (hard: 8 bolts). Planks keep at most 3 bolts
|
|
260
|
-
// (MAX_HOLES_PER_PLANK), so the 3 swap holes can always free some plank: every puzzle stays solvable.
|
|
261
|
-
const minIntersections = 8;
|
|
262
|
-
|
|
263
|
-
if (intersections.length < minIntersections) {
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
let allPlanksHaveBolts = true;
|
|
268
|
-
for (const plank of planks) {
|
|
269
|
-
const plankPositions = getPlankPositions(plank);
|
|
270
|
-
const hasIntersection = plankPositions.some((pos) => intersections.some((int) => int.row === pos.row && int.col === pos.col));
|
|
271
|
-
if (!hasIntersection) {
|
|
272
|
-
allPlanksHaveBolts = false;
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Need all planks to have bolts and minimum intersections
|
|
278
|
-
if (allPlanksHaveBolts && intersections.length >= minIntersections && planks.length >= 3) {
|
|
279
|
-
validPuzzle = true;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Find all intersection points and create bolts
|
|
284
|
-
const intersections = getPlankIntersections(planks);
|
|
285
|
-
|
|
286
|
-
for (const pos of intersections) {
|
|
287
|
-
bolts.push({
|
|
288
|
-
id: `bolt-${boltId++}`,
|
|
289
|
-
row: pos.row,
|
|
290
|
-
col: pos.col,
|
|
291
|
-
originalRow: pos.row,
|
|
292
|
-
originalCol: pos.col,
|
|
293
|
-
holeId: null
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Create extra holes at the bottom for swapping
|
|
298
|
-
for (let i = 0; i < EXTRA_HOLES; i++) {
|
|
299
|
-
holes.push({
|
|
300
|
-
id: `hole-${i}`,
|
|
301
|
-
row: BOARD_ROWS,
|
|
302
|
-
col: i + Math.floor((BOARD_COLS - EXTRA_HOLES) / 2),
|
|
303
|
-
boltId: null
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return { holes, bolts, planks };
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
export const getBoltById = (boltId: string, bolts: Bolt[]): Bolt | null => {
|
|
311
|
-
return bolts.find((b) => b.id === boltId) || null;
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
export const getBoltAtPosition = (row: number, col: number, bolts: Bolt[]): Bolt | null => {
|
|
315
|
-
return bolts.find((b) => b.row === row && b.col === col && b.holeId === null) || null;
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
export const getHoleById = (holeId: string, holes: Hole[]): Hole | null => {
|
|
319
|
-
return holes.find((h) => h.id === holeId) || null;
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
// Get planks that a bolt is holding (at a specific position)
|
|
323
|
-
export const getPlanksAtPosition = (row: number, col: number, planks: Plank[]): Plank[] => {
|
|
324
|
-
return planks.filter((plank) => plankCoversPosition(plank, row, col));
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
// Get all intersection points where bolts can be placed (where 2+ planks overlap)
|
|
328
|
-
export const getPlankIntersections = (planks: Plank[]): { row: number; col: number }[] => {
|
|
329
|
-
const positionCount = new Map<string, number>();
|
|
330
|
-
|
|
331
|
-
for (const plank of planks) {
|
|
332
|
-
const positions = getPlankPositions(plank);
|
|
333
|
-
for (const pos of positions) {
|
|
334
|
-
const key = `${pos.row}-${pos.col}`;
|
|
335
|
-
positionCount.set(key, (positionCount.get(key) || 0) + 1);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Return positions where 2+ planks overlap
|
|
340
|
-
const intersections: { row: number; col: number }[] = [];
|
|
341
|
-
for (const [key, count] of positionCount) {
|
|
342
|
-
if (count >= 2) {
|
|
343
|
-
const [row, col] = key.split('-').map(Number);
|
|
344
|
-
intersections.push({ row: row!, col: col! });
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return intersections;
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
// Get all valid bolt positions (where bolts can be placed)
|
|
352
|
-
// This includes all intersection points on remaining planks
|
|
353
|
-
export const getValidBoltPositions = (planks: Plank[]): { row: number; col: number }[] => {
|
|
354
|
-
return getPlankIntersections(planks);
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
// Get empty grid holes (original bolt positions that don't have a bolt on them)
|
|
358
|
-
// Simple logic: show hole at every original position that has no bolt currently there
|
|
359
|
-
export const getEmptyGridHoles = (_planks: Plank[], bolts: Bolt[]): { row: number; col: number }[] => {
|
|
360
|
-
// Get all positions where bolts are currently on the grid
|
|
361
|
-
const boltCurrentPositions = new Set(bolts.filter((b) => b.holeId === null).map((b) => `${b.row}-${b.col}`));
|
|
362
|
-
|
|
363
|
-
// Get all original bolt positions
|
|
364
|
-
const originalPositions = new Map<string, { row: number; col: number }>();
|
|
365
|
-
for (const bolt of bolts) {
|
|
366
|
-
const key = `${bolt.originalRow}-${bolt.originalCol}`;
|
|
367
|
-
originalPositions.set(key, { row: bolt.originalRow, col: bolt.originalCol });
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// Show hole at every original position that doesn't have a bolt currently
|
|
371
|
-
const emptyHoles: { row: number; col: number }[] = [];
|
|
372
|
-
for (const [key, pos] of originalPositions) {
|
|
373
|
-
// If no bolt is currently at this original position, show a hole
|
|
374
|
-
if (!boltCurrentPositions.has(key)) {
|
|
375
|
-
emptyHoles.push(pos);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
return emptyHoles;
|
|
380
|
-
};
|
|
381
|
-
|
|
382
|
-
// Check if a bolt can be moved (tapped to select)
|
|
383
|
-
export const canSelectBolt = (bolt: Bolt, planks: Plank[]): boolean => {
|
|
384
|
-
// Bolt must be on the grid (not in a hole)
|
|
385
|
-
if (bolt.holeId !== null) return false;
|
|
386
|
-
|
|
387
|
-
// Get planks at this bolt position
|
|
388
|
-
const planksAtBolt = getPlanksAtPosition(bolt.row, bolt.col, planks);
|
|
389
|
-
if (planksAtBolt.length === 0) return true; // Free bolt
|
|
390
|
-
|
|
391
|
-
// Bolt can be selected if it's on the topmost plank (highest zIndex)
|
|
392
|
-
const maxZIndex = Math.max(...planksAtBolt.map((p) => p.zIndex));
|
|
393
|
-
const topPlank = planksAtBolt.find((p) => p.zIndex === maxZIndex);
|
|
394
|
-
|
|
395
|
-
return topPlank !== undefined;
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
// Check if a hole can receive a bolt
|
|
399
|
-
export const canPlaceBoltInHole = (hole: Hole): boolean => {
|
|
400
|
-
return hole.boltId === null;
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
// Move bolt to a hole
|
|
404
|
-
export const moveBoltToHole = (boltId: string, holeId: string, bolts: Bolt[], holes: Hole[]): { bolts: Bolt[]; holes: Hole[] } => {
|
|
405
|
-
const newBolts = bolts.map((b) => ({ ...b }));
|
|
406
|
-
const newHoles = holes.map((h) => ({ ...h }));
|
|
407
|
-
|
|
408
|
-
const bolt = newBolts.find((b) => b.id === boltId);
|
|
409
|
-
const hole = newHoles.find((h) => h.id === holeId);
|
|
410
|
-
|
|
411
|
-
if (!bolt || !hole) return { bolts, holes };
|
|
412
|
-
|
|
413
|
-
// If bolt was in another hole, clear it
|
|
414
|
-
if (bolt.holeId) {
|
|
415
|
-
const oldHole = newHoles.find((h) => h.id === bolt.holeId);
|
|
416
|
-
if (oldHole) oldHole.boltId = null;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// Move bolt to new hole
|
|
420
|
-
hole.boltId = boltId;
|
|
421
|
-
bolt.holeId = holeId;
|
|
422
|
-
|
|
423
|
-
return { bolts: newBolts, holes: newHoles };
|
|
424
|
-
};
|
|
425
|
-
|
|
426
|
-
// Move bolt from hole back to grid position
|
|
427
|
-
export const moveBoltToGrid = (boltId: string, row: number, col: number, bolts: Bolt[], holes: Hole[]): { bolts: Bolt[]; holes: Hole[] } => {
|
|
428
|
-
const newBolts = bolts.map((b) => ({ ...b }));
|
|
429
|
-
const newHoles = holes.map((h) => ({ ...h }));
|
|
430
|
-
|
|
431
|
-
const bolt = newBolts.find((b) => b.id === boltId);
|
|
432
|
-
if (!bolt) return { bolts, holes };
|
|
433
|
-
|
|
434
|
-
// Clear the hole the bolt was in
|
|
435
|
-
if (bolt.holeId) {
|
|
436
|
-
const oldHole = newHoles.find((h) => h.id === bolt.holeId);
|
|
437
|
-
if (oldHole) oldHole.boltId = null;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Move bolt to grid position
|
|
441
|
-
bolt.row = row;
|
|
442
|
-
bolt.col = col;
|
|
443
|
-
bolt.holeId = null;
|
|
444
|
-
|
|
445
|
-
return { bolts: newBolts, holes: newHoles };
|
|
446
|
-
};
|
|
447
|
-
|
|
448
|
-
// Check which planks should fall (no bolts holding them)
|
|
449
|
-
export const checkPlankRemoval = (planks: Plank[], bolts: Bolt[]): { removedPlanks: Plank[]; remainingPlanks: Plank[] } => {
|
|
450
|
-
const removedPlanks: Plank[] = [];
|
|
451
|
-
const remainingPlanks: Plank[] = [];
|
|
452
|
-
|
|
453
|
-
// Get all bolt positions on the grid (not in holes)
|
|
454
|
-
const boltPositions = new Set(bolts.filter((b) => b.holeId === null).map((b) => `${b.row}-${b.col}`));
|
|
455
|
-
|
|
456
|
-
for (const plank of planks) {
|
|
457
|
-
const plankPositions = getPlankPositions(plank);
|
|
458
|
-
|
|
459
|
-
// A plank is held if ANY of its positions has a bolt
|
|
460
|
-
const isHeld = plankPositions.some((pos) => boltPositions.has(`${pos.row}-${pos.col}`));
|
|
461
|
-
|
|
462
|
-
if (!isHeld) {
|
|
463
|
-
removedPlanks.push(plank);
|
|
464
|
-
} else {
|
|
465
|
-
remainingPlanks.push(plank);
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
return { removedPlanks, remainingPlanks };
|
|
470
|
-
};
|
|
471
|
-
|
|
472
|
-
export const isPuzzleComplete = (planks: Plank[]): boolean => {
|
|
473
|
-
return planks.length === 0;
|
|
474
|
-
};
|