@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,77 +0,0 @@
|
|
|
1
|
-
// Penguin Run's screen, on the Nayan engine: the penguin dashing down an ancient jungle causeway seen
|
|
2
|
-
// from a low chase camera, under Playtura's scoreboard, controls and modals. The rules are in
|
|
3
|
-
// PenguinRunGame.ts, the world in PenguinRunScene.ts, the penguin and its animations in PenguinModel.ts.
|
|
4
|
-
import { useMemo } from 'react';
|
|
5
|
-
import { HapticType } from '../../services/HapticsService';
|
|
6
|
-
import { GAME_SOUNDS } from '../../services/SoundsService';
|
|
7
|
-
import { GAME_IDS } from '../../services/UtilsService';
|
|
8
|
-
import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
|
|
9
|
-
import { livesColumn, scoreColumn, textColumn } from '../shared/EngineHud';
|
|
10
|
-
import { useEngineGame } from '../shared/useEngineGame';
|
|
11
|
-
import { useLiveState } from '../shared/useLiveState';
|
|
12
|
-
import { MAX_LIVES, RESULTS_DELAY_LOSE, RESULTS_DELAY_WIN, TRACK_LENGTH } from './PenguinRunConstants';
|
|
13
|
-
import { createGame, dispose, reset, setLayout, setTheme, start, steer, tick } from './PenguinRunGame';
|
|
14
|
-
import { backgroundFor, FOG, lightFor } from './PenguinRunScene';
|
|
15
|
-
|
|
16
|
-
const SFX = GAME_SOUNDS.PENGUIN_RUN;
|
|
17
|
-
|
|
18
|
-
export const PenguinRun = engineGame(GAME_IDS.PENGUIN_RUN, (props) => {
|
|
19
|
-
const [score, setScore] = useLiveState(0);
|
|
20
|
-
const [coins, setCoins] = useLiveState(0);
|
|
21
|
-
const [lives, setLives] = useLiveState(MAX_LIVES);
|
|
22
|
-
const [distance, setDistance] = useLiveState(0);
|
|
23
|
-
|
|
24
|
-
const { theme, status, screen, gameOver } = useEngineGame(props, {
|
|
25
|
-
gameId: GAME_IDS.PENGUIN_RUN,
|
|
26
|
-
create: createGame,
|
|
27
|
-
start,
|
|
28
|
-
reset,
|
|
29
|
-
dispose,
|
|
30
|
-
tick,
|
|
31
|
-
setTheme,
|
|
32
|
-
resize: (g, width, height) => setLayout(g, width, height),
|
|
33
|
-
drag: (g, { phase, x, y }) => steer(g, phase, x, y),
|
|
34
|
-
sounds: SFX,
|
|
35
|
-
// The fall or the dance plays out before the results card covers it
|
|
36
|
-
resultsDelay: (s) => (s === 'win' ? RESULTS_DELAY_WIN : RESULTS_DELAY_LOSE),
|
|
37
|
-
onStart: (fx) => fx(SFX.START),
|
|
38
|
-
wire: (g, fx) => {
|
|
39
|
-
g.onScore = setScore;
|
|
40
|
-
g.onCoins = setCoins;
|
|
41
|
-
g.onLives = setLives;
|
|
42
|
-
g.onDistance = setDistance;
|
|
43
|
-
g.onCoin = (gem) => fx(gem ? SFX.GEM : SFX.COIN, gem ? HapticType.LIGHT : null);
|
|
44
|
-
g.onJump = () => fx(SFX.JUMP);
|
|
45
|
-
g.onSlide = () => fx(SFX.SLIDE);
|
|
46
|
-
g.onLane = () => fx(SFX.LANE_SWITCH, HapticType.LIGHT);
|
|
47
|
-
g.onHurt = () => fx(SFX.CRASH, HapticType.HEAVY);
|
|
48
|
-
g.onCrash = () => {
|
|
49
|
-
fx(SFX.CRASH, HapticType.HEAVY);
|
|
50
|
-
g.world.after(0.5, () => fx(SFX.GAME_OVER));
|
|
51
|
-
};
|
|
52
|
-
g.onWin = () => fx(GAME_SOUNDS.WELL_DONE, HapticType.SUCCESS);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const light = useMemo(() => lightFor(theme), [theme]);
|
|
57
|
-
const background = useMemo(() => backgroundFor(theme), [theme]);
|
|
58
|
-
|
|
59
|
-
return (
|
|
60
|
-
<EngineGameScreen
|
|
61
|
-
{...screen}
|
|
62
|
-
light={light}
|
|
63
|
-
background={background}
|
|
64
|
-
fog={FOG}
|
|
65
|
-
columns={[scoreColumn(score), livesColumn(lives, MAX_LIVES), textColumn('TRACK', `${TRACK_LENGTH - distance} m`)]}
|
|
66
|
-
subtext="Swipe, jump and slide!"
|
|
67
|
-
gameOver={gameOver({
|
|
68
|
-
title: status === 'win' ? 'YOU MADE IT!' : 'OUCH!',
|
|
69
|
-
message:
|
|
70
|
-
status === 'win' ? `Made it to the finish with ${coins} coins!` : `Out of lives after ${distance} of ${TRACK_LENGTH} m. Try a new track!`,
|
|
71
|
-
scoreLabel: 'Score',
|
|
72
|
-
score,
|
|
73
|
-
buttonText: status === 'win' ? 'Run Again!' : 'Try Again!'
|
|
74
|
-
})}
|
|
75
|
-
/>
|
|
76
|
-
);
|
|
77
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
// Penguin Run's tuning. Distances are metres, times seconds. The penguin runs toward -z.
|
|
2
|
-
|
|
3
|
-
export const PENGUIN_SIZE = 1.2;
|
|
4
|
-
|
|
5
|
-
/** Lane centres across the temple causeway. */
|
|
6
|
-
export const LANE_X = [-1.7, 0, 1.7] as const;
|
|
7
|
-
/** Lane changes follow a critically damped spring (higher = snappier), leaning into the move. */
|
|
8
|
-
export const LANE_STIFFNESS = 14;
|
|
9
|
-
export const LEAN_ROLL = 0.045;
|
|
10
|
-
export const LEAN_YAW = 0.035;
|
|
11
|
-
export const MAX_LEAN = 0.32;
|
|
12
|
-
/** How quickly the camera drifts after the penguin's lane. */
|
|
13
|
-
export const CAMERA_FOLLOW = 6;
|
|
14
|
-
|
|
15
|
-
/** Run speed, held for the whole track. */
|
|
16
|
-
export const SPEED_START = 7;
|
|
17
|
-
|
|
18
|
-
/** The track is this long; crossing the finish line wins. */
|
|
19
|
-
export const TRACK_LENGTH = 1000;
|
|
20
|
-
/** Clear running at the start and before the finish. */
|
|
21
|
-
export const START_CLEAR = 14;
|
|
22
|
-
export const FINISH_CLEAR = 6;
|
|
23
|
-
/** Paving rows are this long; a gap is one missing slab. */
|
|
24
|
-
export const SLAB = 2;
|
|
25
|
-
/** After a crash or a win, the scene plays (fall, dance) for this long before the results card. */
|
|
26
|
-
export const RESULTS_DELAY_LOSE = 1700;
|
|
27
|
-
export const RESULTS_DELAY_WIN = 2600;
|
|
28
|
-
|
|
29
|
-
/** The causeway is built from tiles this long; this many stay ahead of the penguin. */
|
|
30
|
-
export const TILE_LENGTH = 12;
|
|
31
|
-
export const TILES_AHEAD = 9;
|
|
32
|
-
export const TILES_BEHIND = 2;
|
|
33
|
-
/** Causeway laid behind the start line (ending at a temple), so the start screen has scenery all round. */
|
|
34
|
-
export const TILES_BEFORE_START = 3;
|
|
35
|
-
/** Causeway past the finish line before the far temple. */
|
|
36
|
-
export const TILES_PAST_FINISH = 3;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Jumps and slides cover a set distance rather than a set time: the clips play faster as the run
|
|
40
|
-
* speeds up, so a jump timed the same way always clears a gap. Metres spent airborne / ducked, and
|
|
41
|
-
* the clip-length limits that keep them from feeling floaty when slow or frantic when fast.
|
|
42
|
-
*/
|
|
43
|
-
export const JUMP_AIR_METRES = 5.5;
|
|
44
|
-
export const SLIDE_LOW_METRES = 7;
|
|
45
|
-
export const JUMP_TIME: [number, number] = [0.7, 1.15];
|
|
46
|
-
export const SLIDE_TIME: [number, number] = [0.8, 1.25];
|
|
47
|
-
/**
|
|
48
|
-
* Fractions of each clip during which the penguin counts as off the ground (clears a gap) or low
|
|
49
|
-
* enough to pass under a gateway: generous, from just after it springs or drops to just before it lands
|
|
50
|
-
* or rises.
|
|
51
|
-
*/
|
|
52
|
-
export const GAP_WINDOW: [number, number] = [0.15, 0.9];
|
|
53
|
-
export const LOW_WINDOW: [number, number] = [0.08, 0.94];
|
|
54
|
-
/** How far from a gap's centre the penguin falls in (the slab is SLAB long; the broken edges forgive). */
|
|
55
|
-
export const GAP_HALF = 0.45;
|
|
56
|
-
|
|
57
|
-
/** Hits the penguin can take; after one it stumbles on and can't be hurt again for a moment. */
|
|
58
|
-
export const MAX_LIVES = 3;
|
|
59
|
-
export const HURT_INVULNERABLE = 2.2;
|
|
60
|
-
|
|
61
|
-
/** How deep (along z) an obstacle is for collisions, and how close in x counts as the same lane. */
|
|
62
|
-
export const HIT_DEPTH = 0.3;
|
|
63
|
-
export const LANE_TOLERANCE = 0.7;
|
|
64
|
-
export const COIN_RADIUS = 1.1;
|
|
65
|
-
|
|
66
|
-
// Points
|
|
67
|
-
export const POINTS_PER_METRE = 2;
|
|
68
|
-
export const POINTS_COIN = 20;
|
|
69
|
-
export const POINTS_GEM = 200;
|
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
// Penguin Run's rules: a TRACK_LENGTH dash down an ancient jungle causeway, laid out fresh by
|
|
2
|
-
// `generateTrack` for every attempt. The penguin runs on its own, faster and faster; swipe left/right
|
|
3
|
-
// to change lane (and chase the coin trail), up to jump broken gaps, down to slide under spiked
|
|
4
|
-
// gateways. Coins add to the score. A mistake costs one of three lives (the
|
|
5
|
-
// penguin stumbles on, briefly untouchable); losing the last ends the run with a fall or crash played
|
|
6
|
-
// out before the results. Reaching the finish line wins and the penguin dances.
|
|
7
|
-
//
|
|
8
|
-
// The world stays put and the penguin (and camera) run toward -z; tiles are built ahead and cleared
|
|
9
|
-
// behind, so only the penguin and camera move every frame.
|
|
10
|
-
import { type Camera, type MutableQuat, quat, World } from '@nayan-ui/engine';
|
|
11
|
-
import type { GameTheme } from '../../services/ThemeService';
|
|
12
|
-
import { CLIP_TIME, placePenguin, playPenguin, preparePenguin, spawnPenguin } from './PenguinModel';
|
|
13
|
-
import {
|
|
14
|
-
CAMERA_FOLLOW,
|
|
15
|
-
COIN_RADIUS,
|
|
16
|
-
GAP_HALF,
|
|
17
|
-
GAP_WINDOW,
|
|
18
|
-
HIT_DEPTH,
|
|
19
|
-
HURT_INVULNERABLE,
|
|
20
|
-
JUMP_AIR_METRES,
|
|
21
|
-
JUMP_TIME,
|
|
22
|
-
LANE_STIFFNESS,
|
|
23
|
-
LANE_TOLERANCE,
|
|
24
|
-
LANE_X,
|
|
25
|
-
LEAN_ROLL,
|
|
26
|
-
LEAN_YAW,
|
|
27
|
-
LOW_WINDOW,
|
|
28
|
-
MAX_LEAN,
|
|
29
|
-
MAX_LIVES,
|
|
30
|
-
PENGUIN_SIZE,
|
|
31
|
-
POINTS_COIN,
|
|
32
|
-
POINTS_GEM,
|
|
33
|
-
POINTS_PER_METRE,
|
|
34
|
-
SLIDE_LOW_METRES,
|
|
35
|
-
SLIDE_TIME,
|
|
36
|
-
SPEED_START,
|
|
37
|
-
TILE_LENGTH,
|
|
38
|
-
TILES_AHEAD,
|
|
39
|
-
TILES_BEFORE_START,
|
|
40
|
-
TILES_BEHIND,
|
|
41
|
-
TRACK_LENGTH
|
|
42
|
-
} from './PenguinRunConstants';
|
|
43
|
-
import {
|
|
44
|
-
coinSparkle,
|
|
45
|
-
crashDust,
|
|
46
|
-
despawnTile,
|
|
47
|
-
generateTrack,
|
|
48
|
-
LAST_TILE,
|
|
49
|
-
prepareRunMeshes,
|
|
50
|
-
spawnTile,
|
|
51
|
-
type Tile,
|
|
52
|
-
type TrackPlan
|
|
53
|
-
} from './PenguinRunScene';
|
|
54
|
-
|
|
55
|
-
export type Phase = 'ready' | 'playing' | 'over';
|
|
56
|
-
type Action = 'jump' | 'slide' | 'hit' | null;
|
|
57
|
-
|
|
58
|
-
const noop = () => {};
|
|
59
|
-
const newSeed = () => Math.floor(Math.random() * 1e9);
|
|
60
|
-
|
|
61
|
-
export function createGame(theme: GameTheme) {
|
|
62
|
-
preparePenguin();
|
|
63
|
-
prepareRunMeshes();
|
|
64
|
-
const world = new World(1800);
|
|
65
|
-
const g = {
|
|
66
|
-
world,
|
|
67
|
-
theme,
|
|
68
|
-
penguin: spawnPenguin(world, [0, 0, 0], PENGUIN_SIZE),
|
|
69
|
-
camera: { eye: [0, 3.1, 5.4], target: [0, 1.1, -6], fov: 0.9 } as Camera,
|
|
70
|
-
phase: 'ready' as Phase,
|
|
71
|
-
won: false,
|
|
72
|
-
plan: generateTrack(newSeed()) as TrackPlan,
|
|
73
|
-
tiles: [] as Tile[],
|
|
74
|
-
nextTile: 0,
|
|
75
|
-
lane: 1,
|
|
76
|
-
x: 0,
|
|
77
|
-
vx: 0,
|
|
78
|
-
camX: 0,
|
|
79
|
-
z: 0,
|
|
80
|
-
speed: SPEED_START,
|
|
81
|
-
distance: 0,
|
|
82
|
-
lastDistance: 0,
|
|
83
|
-
coins: 0,
|
|
84
|
-
gems: 0,
|
|
85
|
-
score: 0,
|
|
86
|
-
lives: MAX_LIVES,
|
|
87
|
-
invulnerable: 0,
|
|
88
|
-
action: null as Action,
|
|
89
|
-
/** A jump / slide swiped while the same one was still playing: it goes as soon as that one ends, if within QUEUE_TIME. */
|
|
90
|
-
queued: null as 'jump' | 'slide' | null,
|
|
91
|
-
queuedT: 0,
|
|
92
|
-
actionT: 0,
|
|
93
|
-
actionDur: 0,
|
|
94
|
-
orbit: 0,
|
|
95
|
-
onPhase: noop as (phase: Phase) => void,
|
|
96
|
-
onScore: noop as (score: number) => void,
|
|
97
|
-
onCoins: noop as (coins: number) => void,
|
|
98
|
-
onLives: noop as (lives: number) => void,
|
|
99
|
-
onHurt: noop,
|
|
100
|
-
onDistance: noop as (metres: number) => void,
|
|
101
|
-
onCoin: noop as (gem: boolean) => void,
|
|
102
|
-
onJump: noop,
|
|
103
|
-
onSlide: noop,
|
|
104
|
-
onLane: noop,
|
|
105
|
-
onCrash: noop,
|
|
106
|
-
onWin: noop
|
|
107
|
-
};
|
|
108
|
-
reset(g);
|
|
109
|
-
return g;
|
|
110
|
-
}
|
|
111
|
-
export type Game = ReturnType<typeof createGame>;
|
|
112
|
-
|
|
113
|
-
const runPace = (g: Game) => Math.min(1.7, Math.max(1, g.speed / SPEED_START));
|
|
114
|
-
|
|
115
|
-
/** Builds tiles out to TILES_AHEAD in front of the penguin and clears those well behind it. */
|
|
116
|
-
function keepTiles(g: Game) {
|
|
117
|
-
while (g.nextTile <= LAST_TILE && g.nextTile * TILE_LENGTH < -g.z + TILES_AHEAD * TILE_LENGTH) {
|
|
118
|
-
g.tiles.push(spawnTile(g.world, g.nextTile, g.theme, g.plan));
|
|
119
|
-
g.nextTile++;
|
|
120
|
-
}
|
|
121
|
-
while (g.tiles.length && g.tiles[0]!.z - TILE_LENGTH > g.z + TILES_BEHIND * TILE_LENGTH) despawnTile(g.world, g.tiles.shift()!);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Scratch for the per-frame root rotation (world.set copies it).
|
|
125
|
-
const LEAN_Q: MutableQuat = [0, 0, 0, 1];
|
|
126
|
-
const TURN_Q: MutableQuat = [0, 0, 0, 1];
|
|
127
|
-
const ROOT_Q: MutableQuat = [0, 0, 0, 1];
|
|
128
|
-
|
|
129
|
-
function place(g: Game) {
|
|
130
|
-
// Facing down the causeway, turned and banked a little into a lane change
|
|
131
|
-
const lean = Math.max(-MAX_LEAN, Math.min(MAX_LEAN, g.vx * LEAN_ROLL));
|
|
132
|
-
const turn = Math.max(-MAX_LEAN, Math.min(MAX_LEAN, g.vx * LEAN_YAW));
|
|
133
|
-
g.world.set(g.penguin.root, { position: [g.x, 0, g.z], rotation: quat.multiply(quat.z(-lean, LEAN_Q), quat.y(Math.PI - turn, TURN_Q), ROOT_Q) });
|
|
134
|
-
g.penguin.x = g.x;
|
|
135
|
-
g.penguin.yaw = Math.PI - turn;
|
|
136
|
-
aimCamera(g);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** Chase camera: low behind the penguin, drifting after its lane, looking down the causeway. */
|
|
140
|
-
function aimCamera(g: Game) {
|
|
141
|
-
g.camera.eye = [g.camX, 3.1, g.z + 5.4];
|
|
142
|
-
g.camera.target = [g.camX, 1.1, g.z - 6];
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/** Start screen: circling the waiting penguin, as Car Racing circles its car. */
|
|
146
|
-
function orbitCamera(g: Game, dt: number) {
|
|
147
|
-
g.orbit += dt * 0.35;
|
|
148
|
-
const a = g.orbit + 0.9;
|
|
149
|
-
g.camera.eye = [g.x + Math.sin(a) * 4.2, 1.9, g.z + Math.cos(a) * 4.2];
|
|
150
|
-
g.camera.target = [g.x, 0.8, g.z];
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** A fresh attempt: a newly generated track, the penguin waiting at the start. */
|
|
154
|
-
export function reset(g: Game) {
|
|
155
|
-
g.world.cancelTimers();
|
|
156
|
-
for (const t of g.tiles) despawnTile(g.world, t);
|
|
157
|
-
g.tiles = [];
|
|
158
|
-
g.nextTile = -TILES_BEFORE_START;
|
|
159
|
-
g.plan = generateTrack(newSeed());
|
|
160
|
-
g.won = false;
|
|
161
|
-
g.lane = 1;
|
|
162
|
-
g.x = LANE_X[1];
|
|
163
|
-
g.vx = 0;
|
|
164
|
-
g.camX = 0;
|
|
165
|
-
g.z = 0;
|
|
166
|
-
g.speed = SPEED_START;
|
|
167
|
-
g.distance = g.coins = g.gems = g.score = 0;
|
|
168
|
-
g.lives = MAX_LIVES;
|
|
169
|
-
g.invulnerable = 0;
|
|
170
|
-
g.action = null;
|
|
171
|
-
g.queued = null;
|
|
172
|
-
g.orbit = 0;
|
|
173
|
-
g.world.stopAnimation(g.penguin.root);
|
|
174
|
-
placePenguin(g.world, g.penguin, 0, Math.PI);
|
|
175
|
-
keepTiles(g);
|
|
176
|
-
place(g);
|
|
177
|
-
playPenguin(g.world, g.penguin, 'idle');
|
|
178
|
-
setPhase(g, 'ready');
|
|
179
|
-
g.onScore(0);
|
|
180
|
-
g.onCoins(0);
|
|
181
|
-
g.onLives(MAX_LIVES);
|
|
182
|
-
g.lastDistance = 0;
|
|
183
|
-
g.onDistance(0);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function setPhase(g: Game, phase: Phase) {
|
|
187
|
-
g.phase = phase;
|
|
188
|
-
g.onPhase(phase);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function start(g: Game) {
|
|
192
|
-
if (g.phase === 'over') reset(g);
|
|
193
|
-
playPenguin(g.world, g.penguin, 'run');
|
|
194
|
-
aimCamera(g);
|
|
195
|
-
setPhase(g, 'playing');
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function swipe(g: Game, direction: 'left' | 'right' | 'up' | 'down') {
|
|
199
|
-
if (g.phase !== 'playing') return;
|
|
200
|
-
if (direction === 'left' || direction === 'right') {
|
|
201
|
-
const lane = Math.max(0, Math.min(2, g.lane + (direction === 'left' ? -1 : 1)));
|
|
202
|
-
if (lane === g.lane) return;
|
|
203
|
-
g.lane = lane;
|
|
204
|
-
g.onLane();
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
const action = direction === 'up' ? 'jump' : 'slide';
|
|
208
|
-
if (g.action === action) {
|
|
209
|
-
g.queued = action;
|
|
210
|
-
g.queuedT = QUEUE_TIME;
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
g.queued = null;
|
|
214
|
-
g.action = action;
|
|
215
|
-
g.actionT = 0;
|
|
216
|
-
// Long enough to stay airborne / low for a set distance at the current speed, within limits
|
|
217
|
-
const [metres, window, [minT, maxT]] = action === 'jump' ? [JUMP_AIR_METRES, GAP_WINDOW, JUMP_TIME] : [SLIDE_LOW_METRES, LOW_WINDOW, SLIDE_TIME];
|
|
218
|
-
g.actionDur = Math.min(maxT, Math.max(minT, metres / ((window[1] - window[0]) * g.speed)));
|
|
219
|
-
playPenguin(g.world, g.penguin, action, CLIP_TIME[action] / g.actionDur);
|
|
220
|
-
if (action === 'jump') g.onJump();
|
|
221
|
-
else g.onSlide();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
const DRAG_THRESHOLD = 18;
|
|
225
|
-
/** How long a jump / slide swiped too early is kept for (seconds). */
|
|
226
|
-
const QUEUE_TIME = 0.35;
|
|
227
|
-
const drag = { x: 0, y: 0, fired: false };
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Drag controls, as in the other engine games: a move fires mid-stroke as soon as the finger has
|
|
231
|
-
* travelled DRAG_THRESHOLD points (no waiting for release), one move per stroke.
|
|
232
|
-
*/
|
|
233
|
-
export function steer(g: Game, phase: 'start' | 'move' | 'end', x: number, y: number) {
|
|
234
|
-
if (phase === 'start') {
|
|
235
|
-
drag.x = x;
|
|
236
|
-
drag.y = y;
|
|
237
|
-
drag.fired = false;
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
if (phase === 'end' || drag.fired) return;
|
|
241
|
-
const dx = x - drag.x;
|
|
242
|
-
const dy = y - drag.y;
|
|
243
|
-
if (Math.max(Math.abs(dx), Math.abs(dy)) < DRAG_THRESHOLD) return;
|
|
244
|
-
drag.fired = true;
|
|
245
|
-
if (Math.abs(dx) > Math.abs(dy)) swipe(g, dx < 0 ? 'left' : 'right');
|
|
246
|
-
else swipe(g, dy < 0 ? 'up' : 'down');
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** Where the penguin is in its jump or slide, 0..1 (the clip starts after a short blend). */
|
|
250
|
-
const actionFrac = (g: Game) => Math.max(0, g.actionT - 0.06) / g.actionDur;
|
|
251
|
-
const airborne = (g: Game) => g.action === 'jump' && actionFrac(g) >= GAP_WINDOW[0] && actionFrac(g) <= GAP_WINDOW[1];
|
|
252
|
-
const ducking = (g: Game) => g.action === 'slide' && actionFrac(g) >= LOW_WINDOW[0] && actionFrac(g) <= LOW_WINDOW[1];
|
|
253
|
-
|
|
254
|
-
/** A hit with lives to spare: a life lost, a stumble, and a moment when nothing can hurt it. */
|
|
255
|
-
function hurt(g: Game) {
|
|
256
|
-
g.lives--;
|
|
257
|
-
g.onLives(g.lives);
|
|
258
|
-
g.invulnerable = HURT_INVULNERABLE;
|
|
259
|
-
g.action = 'hit';
|
|
260
|
-
g.actionT = 0;
|
|
261
|
-
g.actionDur = CLIP_TIME.hit / 1.3;
|
|
262
|
-
playPenguin(g.world, g.penguin, 'hit', 1.3);
|
|
263
|
-
crashDust(g.world, [g.x, 0.5, g.z - 0.4]);
|
|
264
|
-
g.camera.shake = 0.22;
|
|
265
|
-
g.onHurt();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/** Smacked into a gateway: knocked down where it stands, then the results. */
|
|
269
|
-
function crash(g: Game) {
|
|
270
|
-
g.lives = 0;
|
|
271
|
-
g.onLives(0);
|
|
272
|
-
g.action = null;
|
|
273
|
-
playPenguin(g.world, g.penguin, 'dead');
|
|
274
|
-
crashDust(g.world, [g.x, 0.6, g.z - 0.4]);
|
|
275
|
-
g.camera.shake = 0.35;
|
|
276
|
-
g.onCrash();
|
|
277
|
-
setPhase(g, 'over');
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/** Ran into a gap: tumbles down into the chasm as it topples, the camera watching from the edge. */
|
|
281
|
-
function fall(g: Game) {
|
|
282
|
-
g.lives = 0;
|
|
283
|
-
g.onLives(0);
|
|
284
|
-
g.action = null;
|
|
285
|
-
playPenguin(g.world, g.penguin, 'dead', 1.4);
|
|
286
|
-
g.world.animate(g.penguin.root, { position: [g.x, -7, g.z - 1.2] }, { duration: 1.3, easing: 'easeIn' });
|
|
287
|
-
crashDust(g.world, [g.x, 0, g.z - 0.6]);
|
|
288
|
-
g.camera.shake = 0.15;
|
|
289
|
-
g.onCrash();
|
|
290
|
-
setPhase(g, 'over');
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/** Crossed the finish line: slows to a stop, turns to the camera and dances. */
|
|
294
|
-
function win(g: Game) {
|
|
295
|
-
g.won = true;
|
|
296
|
-
g.action = null;
|
|
297
|
-
g.world.animate(g.penguin.root, { rotation: quat.y(0) }, { duration: 0.5, delay: 0.5, easing: 'easeInOut' });
|
|
298
|
-
playPenguin(g.world, g.penguin, 'dance');
|
|
299
|
-
g.onWin();
|
|
300
|
-
setPhase(g, 'over');
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
export function tick(g: Game, dt: number) {
|
|
304
|
-
if (g.world.isDisposed) return;
|
|
305
|
-
if (g.phase === 'playing') {
|
|
306
|
-
g.speed = SPEED_START;
|
|
307
|
-
const step = g.speed * dt;
|
|
308
|
-
g.z -= step;
|
|
309
|
-
g.distance += step;
|
|
310
|
-
|
|
311
|
-
// Lane change: a critically damped spring toward the lane (smooth, and a second swipe mid-move
|
|
312
|
-
// just retargets it); sub-stepped so it stays stable on long frames
|
|
313
|
-
const w = LANE_STIFFNESS;
|
|
314
|
-
const steps = Math.max(1, Math.ceil(dt / 0.008));
|
|
315
|
-
const h = dt / steps;
|
|
316
|
-
for (let i = 0; i < steps; i++) {
|
|
317
|
-
g.vx += (w * w * (LANE_X[g.lane]! - g.x) - 2 * w * g.vx) * h;
|
|
318
|
-
g.x += g.vx * h;
|
|
319
|
-
}
|
|
320
|
-
g.camX += (g.x * 0.4 - g.camX) * (1 - Math.exp(-dt * CAMERA_FOLLOW));
|
|
321
|
-
g.invulnerable = Math.max(0, g.invulnerable - dt);
|
|
322
|
-
|
|
323
|
-
// Jump / slide timing; back to running when it ends
|
|
324
|
-
g.queuedT = Math.max(0, g.queuedT - dt);
|
|
325
|
-
if (g.action) {
|
|
326
|
-
g.actionT += dt;
|
|
327
|
-
if (g.actionT >= g.actionDur + 0.06) {
|
|
328
|
-
g.action = null;
|
|
329
|
-
const next = g.queuedT > 0 ? g.queued : null;
|
|
330
|
-
g.queued = null;
|
|
331
|
-
if (next) swipe(g, next === 'jump' ? 'up' : 'down');
|
|
332
|
-
else playPenguin(g.world, g.penguin, 'run', runPace(g));
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
keepTiles(g);
|
|
337
|
-
place(g);
|
|
338
|
-
|
|
339
|
-
// Obstacles and coins level with the penguin
|
|
340
|
-
for (const tile of g.tiles) {
|
|
341
|
-
if (tile.z < g.z - TILE_LENGTH || tile.z - TILE_LENGTH > g.z + TILE_LENGTH) continue;
|
|
342
|
-
for (const o of tile.obstacles) {
|
|
343
|
-
if (g.invulnerable > 0 || Math.abs(LANE_X[o.lane]! - g.x) > LANE_TOLERANCE) continue;
|
|
344
|
-
const hit =
|
|
345
|
-
o.kind === 'gap' ? Math.abs(o.z - g.z) < GAP_HALF && !airborne(g) : Math.abs(o.z - g.z) < HIT_DEPTH && !(o.kind === 'beam' && ducking(g));
|
|
346
|
-
if (!hit) continue;
|
|
347
|
-
if (g.lives > 1) {
|
|
348
|
-
hurt(g);
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
return finish(g, dt, o.kind === 'gap' ? fall : crash);
|
|
352
|
-
}
|
|
353
|
-
for (const p of tile.pickups) {
|
|
354
|
-
if (p.taken || Math.abs(p.z - g.z) > COIN_RADIUS || Math.abs(LANE_X[p.lane]! - g.x) > LANE_TOLERANCE) continue;
|
|
355
|
-
p.taken = true;
|
|
356
|
-
g.world.despawn(p.e);
|
|
357
|
-
coinSparkle(g.world, [LANE_X[p.lane]!, p.y, p.z], p.gem);
|
|
358
|
-
if (p.gem) g.gems++;
|
|
359
|
-
else g.coins++;
|
|
360
|
-
g.onCoins(g.coins + g.gems * 10);
|
|
361
|
-
g.onCoin(p.gem);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
const metres = Math.min(TRACK_LENGTH, Math.floor(g.distance));
|
|
366
|
-
const score = metres * POINTS_PER_METRE + g.coins * POINTS_COIN + g.gems * POINTS_GEM;
|
|
367
|
-
if (score !== g.score) {
|
|
368
|
-
g.score = score;
|
|
369
|
-
g.onScore(score);
|
|
370
|
-
}
|
|
371
|
-
if (metres !== g.lastDistance) {
|
|
372
|
-
g.lastDistance = metres;
|
|
373
|
-
g.onDistance(metres);
|
|
374
|
-
}
|
|
375
|
-
if (g.distance >= TRACK_LENGTH) return finish(g, dt, win);
|
|
376
|
-
} else if (g.phase === 'over' && g.won && g.speed > 0) {
|
|
377
|
-
// Running on past the line, slowing to a stop
|
|
378
|
-
g.speed = Math.max(0, g.speed - 22 * dt);
|
|
379
|
-
g.z -= g.speed * dt;
|
|
380
|
-
g.world.set(g.penguin.root, { position: [g.x, 0, g.z] });
|
|
381
|
-
aimCamera(g);
|
|
382
|
-
} else if (g.phase === 'ready') orbitCamera(g, dt);
|
|
383
|
-
g.world.update(dt);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
function finish(g: Game, dt: number, end: (g: Game) => void) {
|
|
387
|
-
end(g);
|
|
388
|
-
g.world.update(dt);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
export function setLayout(g: Game, width: number, height: number) {
|
|
392
|
-
g.camera.fov = width / Math.max(1, height) < 0.7 ? 1.0 : 0.85;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/** Day or night: rebuilds the tiles in view with the new lighting tint (the run carries on). */
|
|
396
|
-
export function setTheme(g: Game, theme: GameTheme) {
|
|
397
|
-
if (theme === g.theme || g.world.isDisposed) return;
|
|
398
|
-
g.theme = theme;
|
|
399
|
-
const indices = g.tiles.map((t) => t.index);
|
|
400
|
-
for (const t of g.tiles) despawnTile(g.world, t);
|
|
401
|
-
g.tiles = indices.map((i) => spawnTile(g.world, i, theme, g.plan));
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
export function dispose(g: Game) {
|
|
405
|
-
g.world.dispose();
|
|
406
|
-
}
|