@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 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,lathe,merge,Path,quat,tube}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{getFruits}from"../shared/EngineFruits.js";import{noise}from"../shared/EngineMeadow.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,lathe,merge,Path,quat,tube}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{getFruits}from"../shared/EngineFruits.js";import{noise}from"../shared/EngineMeadow.js";import{cacheGameAsset,createGameMesh as _0x4d9d49}from"../shared/EngineMeshes.js";import{toColor}from"../shared/EngineUtils.js";import{COLLISION_SCALE,COLORS,CORNER,FRUIT_TYPES,JAR_DEPTH,OVERFLOW_Y,PLAY_HEIGHT,PLAY_WIDTH,toWorld,WALL}from"./FruitMergerConstants.js";const EYE_DISTANCE=260,BACKDROP_DEPTH=220,DASHES=24,DOTS=12,WHITE=[1,1,1,1];let pumpkin,lemon;function pumpkinModel(){return cacheGameAsset("fruit-merger/FruitMergerScene:pumpkinModel",()=>pumpkinModelUncached())}function pumpkinModelUncached(){if(pumpkin)return pumpkin;const e=Array.from({length:41},(e,t)=>{const o=Math.PI*t/40,n=.5*Math.sin(o),r=.4*Math.cos(o)-.06*Math.exp(-Math.pow(o/.45,2))+.04*Math.exp(-Math.pow((Math.PI-o)/.45,2));return[Math.max(5e-4,n),r]}),t=e=>1-Math.pow(Math.abs(Math.sin(e*Math.PI*8)),.4),o=lathe(e,{segments:64,displace:(e,o)=>-.045*t(e)*Math.sin(Math.PI*o),color:({u:e,v:o})=>{const n=t(e),r=1-.35*n-.12*Math.pow(2*Math.abs(o-.5),3);return[.98*r,(.52-.08*n)*r,.08*r,1]}}),n=tube([[0,.3,0],[.01,.4,0],[.05,.48,0],[.09,.5,0]],{radius:e=>.05*(1-.45*e),sides:10,color:[.36,.42,.16,1]}),r=merge([{geometry:o},{geometry:n}]);return pumpkin={model:_0x4d9d49(r,{center:!1,shine:.55}),center:[0,.04,0]},pumpkin}function lemonModel(){return cacheGameAsset("fruit-merger/FruitMergerScene:lemonModel",()=>lemonModelUncached())}function lemonModelUncached(){if(lemon)return lemon;const e=Array.from({length:49},(e,t)=>{const o=Math.PI*t/48,n=.07*(Math.exp(-Math.pow(o/.22,2))+Math.exp(-Math.pow((Math.PI-o)/.22,2)));return[Math.max(5e-4,.47*Math.sin(o)),(.45+n)*Math.cos(o)]}),t=lathe(e,{segments:56,displace:(e,t)=>.006*noise(40*e,30*t)*Math.sin(Math.PI*t),color:({v:e,position:t})=>{const o=Math.pow(2*Math.abs(e-.5),3),n=1-.18*o+.05*noise(30*t[0],30*t[1]);return[.99*n,(.84-.1*o)*n,.18*n,1]}}),o=tube([[0,.5,0],[.02,.56,0]],{radius:.025,sides:8,color:[.38,.45,.16,1]}),n=lathe([[5e-4,0],[.05,.03],[.06,.1],[.03,.17],[5e-4,.2]],{segments:10,color:[.25,.55,.2,1]}),r=merge([{geometry:t},{geometry:o},{geometry:n,position:[.03,.53,0],rotation:quat.z(-1.1),scale:[1,1,.35]}]);return lemon={model:_0x4d9d49(r,{center:!1,shine:.6}),center:[0,.02,0]},lemon}function fruitModel(e){const t=FRUIT_TYPES[e].name;if("pumpkin"===t)return pumpkinModel();if("lemon"===t)return lemonModel();const o=getFruits()[t];return{model:o.whole,center:o.center}}const ROUNDER=new Set(["papaya"]);function spawnFruit(e,t,o,n=1){const r=FRUIT_TYPES[t].size,{model:s,center:a}=fruitModel(t),[i,l]=s.size,p=(i+l)/2,d=r*COLLISION_SCALE*.97/p,u=ROUNDER.has(FRUIT_TYPES[t].name)?[d*(i+p)/2/i,d*(l+p)/2/l,d]:[d,d,d],h=e.spawn({mesh:"none",position:o,scale:n,pickable:!1});return e.spawn({mesh:s,parent:h,position:[-a[0]*u[0],-a[1]*u[1],-a[2]*u[2]],scale:u,color:WHITE,pickable:!1}),h}const guideColor=e=>"light"===e.mode?toColor(e.TEXT):[1,1,1,1];export function aim(e,t){const o=Math.cos(t.tilt),n=Math.sin(t.tilt),r=(t.centerY-2*t.k-t.height/2)/(t.k*o);e.target=[-(t.centerX-t.width/2)/t.k,r,0],e.eye=[e.target[0],r+260*n,260*o],e.ortho=t.height/(2*t.k)}const meshes=new Map,cached=(e,t)=>{let o=meshes.get(e);return!o&&(o=cacheGameAsset("fruit-merger/FruitMergerScene:"+e,t),meshes.set(e,o)),o};function outline(e){const t=PLAY_WIDTH,o=PLAY_HEIGHT,n=CORNER+e,r=[[-e,0]],s=(e,t,s)=>{for(let a=0;a<=12;a++){const i=t+(s-t)*a/12;r.push([e+Math.cos(i)*n,o-CORNER+Math.sin(i)*n])}};return s(CORNER,Math.PI,Math.PI/2),s(t-CORNER,Math.PI/2,0),r.push([t+e,0]),r.map(([e,n])=>[e-t/2,n-o/2])}const bandMesh=(e,t,o,n)=>cached("fm-band:"+e+":"+t+":"+o.toFixed(1)+":"+n,()=>{const r=[...outline(t),...outline(e).reverse()];return _0x4d9d49(extrude((new Path).addPolygon(r),{depth:o}),{center:!1,shine:n})}),backMesh=()=>cached("fm-back",()=>_0x4d9d49(extrude((new Path).addPolygon(outline(WALL)),{depth:1.5}),{center:!1,shine:.1})),CLASSIC_BACK=[1,1,1,.3],CLASSIC_WALL=[1,1,1,.35],backColor=e=>"classic"===e.mode?CLASSIC_BACK:toColor(e.BOARD.SURFACE),wallColor=e=>"classic"===e.mode?CLASSIC_WALL:toColor(e.BOARD.BORDER);function spawnJar(e,t){const o=JAR_DEPTH/2,n=backColor(t),r=wallColor(t);return[e.spawn({mesh:backMesh(),position:[0,0,-o-1],color:n,pickable:!1}),e.spawn({mesh:bandMesh(0,WALL,JAR_DEPTH,0),position:[0,0,0],color:n,pickable:!1}),e.spawn({mesh:bandMesh(0,1.6,.6,0),position:[0,0,o+.3],color:r,pickable:!1})]}export function buildScene(e,t,o){const n=spawnBackdrop(e,t.width,t.height,-220,o);placeBackdrop(e,n,t);const r=(PLAY_WIDTH-8)/42,s=Array.from({length:24},(t,n)=>e.spawn({mesh:"cube",position:toWorld(4+r/2+n*r*1.75,OVERFLOW_Y,-JAR_DEPTH/2+1.2),scale:[r,1.5,.6],color:dangerColor(o,0),pickable:!1})),a=guideColor(o),i=Array.from({length:12},(t,o)=>e.spawn({mesh:"sphere",scale:0,color:[a[0],a[1],a[2],Math.max(.6-.04*o,.15)],pickable:!1}));return{backdrop:n,jar:spawnJar(e,o),dashes:s,dots:i,preview:null,previewId:null,previewX:NaN,previewY:NaN,next:null,nextType:-1,fruits:new Map,danger:0,hot:!1}}function placeBackdrop(e,t,o){const n=Math.cos(o.tilt),r=(o.centerY-2*o.k-o.height/2)/(o.k*n);e.set(t,{position:[-(o.centerX-o.width/2)/o.k-o.width/(2*o.k),r+(o.height/(2*o.k)-220*Math.sin(o.tilt))/n,-220],scale:[1/o.k,1/(o.k*n),1]})}export function removeScene(e,t){for(const o of[t.backdrop,...t.jar,...t.dashes,...t.dots,t.preview,t.next,...t.fruits.values()])null!=o&&e.despawn(o)}export function setSceneTheme(e,t,o){setBackdropTheme(e,t.backdrop,o);for(const o of t.jar)e.despawn(o);t.jar=spawnJar(e,o);for(const n of t.dashes)e.set(n,{color:dangerColor(o,t.danger)});const n=guideColor(o);t.dots.forEach((t,o)=>e.set(t,{color:[n[0],n[1],n[2],Math.max(.6-.04*o,.15)]}))}function dangerColor(e,t){const o=guideColor(e),n="light"===e.mode?[o[0],o[1],o[2],.28]:toColor(COLORS.DANGER_SAFE),r=toColor(COLORS.DANGER_HOT),s=e=>(n[e]??1)+((r[e]??1)-(n[e]??1))*t;return[s(0),s(1),s(2),s(3)]}export function setDanger(e,t,o,n){if(n===t.danger)return;t.danger=n;const r=dangerColor(o,n),s=n>.35;for(const o of t.dashes)e.stopAnimation(o),e.set(o,{color:r,scale:[(PLAY_WIDTH-8)/42,1.5+1.5*n,.6]}),s&&e.animate(o,{color:[r[0],r[1],r[2],.35*(r[3]??1)]},{duration:.38,easing:"easeInOut",repeat:"forever",yoyo:!0});t.hot=s}const SPIN=[0,0,0,1];export function drawFruits(e,t,o){const n=e.transforms;for(const r of o){let o=t.fruits.get(r.id);null==o&&(o=spawnFruit(e,r.typeId,toWorld(r.x,r.y)),t.fruits.set(r.id,o)),quat.z(-r.angle,SPIN),n.transform(o,r.x-PLAY_WIDTH/2,PLAY_HEIGHT/2-r.y,0,SPIN[0],SPIN[1],SPIN[2],SPIN[3])}n.flush()}export function mergeFx(e,t,o,n,r){const s=toWorld(r.x,r.y);for(const r of[o,n]){const o=t.fruits.get(r.id);null!=o&&(t.fruits.delete(r.id),e.animate(o,{position:s,scale:.2},{duration:.12,easing:"easeIn"}).then(()=>{e.has(o)&&e.despawn(o)}))}const a=spawnFruit(e,r.typeId,s,.5);e.animate(a,{scale:1},{spring:"bouncy"}),t.fruits.set(r.id,a);const i=FRUIT_TYPES[r.typeId],l=toColor(i.color),p=e.spawn({mesh:"torus",position:[s[0],s[1],JAR_DEPTH/2-2],rotation:quat.x(Math.PI/2),scale:.6*i.size,color:[l[0],l[1],l[2],.9],pickable:!1});e.animate(p,{scale:1.5*i.size,color:[l[0],l[1],l[2],0]},{duration:.42,easing:"easeOut"}).then(()=>{e.has(p)&&e.despawn(p)}),effects.sparkle(e,{position:[s[0],s[1],10],count:18,size:.08*i.size,speed:2.2*i.size,lifetime:.5,gravity:3*-i.size,colors:[l,[1,1,1,1]],flash:!1})}export function clearFruits(e,t){for(const o of t.fruits.values())e.despawn(o);t.fruits.clear()}const NEXT_SCALE=.4;export function drawPreview(e,t,o,n=-1){if(!o&&null===t.previewId&&-1===t.nextType)return;if(o&&t.previewId===o.id&&t.previewX===o.x&&t.previewY===o.y&&t.nextType===n)return;if(o&&(t.previewX=o.x,t.previewY=o.y),!o){null!=t.preview&&e.despawn(t.preview),t.preview=null,t.previewId=null,null!=t.next&&e.despawn(t.next),t.next=null,t.nextType=-1;for(const o of t.dots)e.set(o,{scale:0});return}if(t.previewId!==o.id&&(null!=t.preview&&e.despawn(t.preview),t.preview=spawnFruit(e,o.typeId,toWorld(o.x,o.y,4),.3),e.animate(t.preview,{scale:1},{spring:{stiffness:240,damping:11}}),t.previewId=o.id),e.set(t.preview,{position:toWorld(o.x,o.y,4)}),n!==t.nextType&&(null!=t.next&&e.despawn(t.next),t.next=n>=0?spawnFruit(e,n,[0,0,4],.4*.4):null,null!=t.next&&e.animate(t.next,{scale:.4},{spring:{stiffness:240,damping:12}}),t.nextType=n),null!=t.next){const r=o.y-FRUIT_TYPES[o.typeId].size/2-.4*FRUIT_TYPES[n].size/2-4;e.set(t.next,{position:toWorld(PLAY_WIDTH/2,r,4)})}const r=o.y+FRUIT_TYPES[o.typeId].size/2+15,s=(PLAY_HEIGHT-10-r)/12;t.dots.forEach((t,n)=>e.set(t,{position:toWorld(o.x,r+n*s,2),scale:2*Math.max(4-.2*n,1.5)}))}export function celebrate(e){effects.confetti(e,{position:toWorld(PLAY_WIDTH/2,.35*PLAY_HEIGHT,20),count:70,size:7,speed:1.3*PLAY_WIDTH,lifetime:1.4,gravity:2*-PLAY_WIDTH,colors:["#FFD700","#FF9800","#4CAF50","#E91E63"].map(e=>toColor(e))})}export function jolt(e){e.shake=6}export function*warmAssets(){yield backMesh;for(let e=0;e<FRUIT_TYPES.length;e++)yield()=>fruitModel(e);yield()=>bandMesh(0,WALL,JAR_DEPTH,0),yield()=>bandMesh(0,1.6,.6,0)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{useMemo}from"react";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{getFruit,isFruitBuilt}from"../shared/EngineFruits.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{livesColumn,scoreColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{FIRST_FRUITS,FRUIT_BUILD_GAP,FRUIT_DETAIL,FRUIT_KINDS,getLayout,MAX_LIVES,TIME_LIMIT}from"./FruitNinjaConstants.js";import{addFruit,createGame,dispose,reset,setLayout,setModels,setTheme,start,tick,touchEnd,touchMove,touchStart}from"./FruitNinjaGame.js";import{backgroundFor,lightFor}from"./FruitNinjaWorld.js";import{jsx as
|
|
1
|
+
"use strict";import{useMemo}from"react";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{getFruit,isFruitBuilt}from"../shared/EngineFruits.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{livesColumn,scoreColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{FIRST_FRUITS,FRUIT_BUILD_GAP,FRUIT_DETAIL,FRUIT_KINDS,getLayout,MAX_LIVES,TIME_LIMIT}from"./FruitNinjaConstants.js";import{addFruit,createGame,dispose,reset,setLayout,setModels,setTheme,start,tick,touchEnd,touchMove,touchStart}from"./FruitNinjaGame.js";import{backgroundFor,lightFor}from"./FruitNinjaWorld.js";import{jsx as _0x1914d2}from"react/jsx-runtime";const SFX=GAME_SOUNDS.FRUIT_NINJA;export const FruitNinja=engineGame(GAME_IDS.FRUIT_NINJA,e=>{const[t,r]=useLiveState(0),[i,o]=useLiveState(MAX_LIVES),[s,n]=useLiveState(TIME_LIMIT),{theme:a,screen:u,gameOver:m}=useEngineGame(e,{gameId:GAME_IDS.FRUIT_NINJA,create:createGame,start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,r,i)=>{const o=getLayout(t,r,i);return setLayout(e,o),o.fieldWidth},drag:(e,{phase:t,x:r,y:i})=>{"start"===t?touchStart(e,r,i):"move"===t?touchMove(e,r,i):touchEnd(e)},tap:(e,t,r)=>{touchStart(e,t,r),touchEnd(e)},sounds:SFX,onStart:e=>e(SFX.START),wire:(e,t)=>{e.onScore=r,e.onLives=o,e.onTime=n,e.onTouch=()=>t(null,HapticType.LIGHT),e.onSlice=()=>t(SFX.SLICE,HapticType.LIGHT),e.onBomb=()=>t(SFX.BOMB,HapticType.HEAVY),e.onWin=()=>t(GAME_SOUNDS.WELL_DONE),e.onLose=()=>t(SFX.GAME_OVER);const i={};for(const t of FRUIT_KINDS)isFruitBuilt(t,FRUIT_DETAIL,!0)&&(i[t]=getFruit(t,FRUIT_DETAIL),addFruit(e,t));e.kinds.length&&setModels(e,i);const s=FRUIT_KINDS.filter(e=>!isFruitBuilt(e,FRUIT_DETAIL,!0));let a,u=0,m=s.length>0&&isFruitBuilt(s[0],FRUIT_DETAIL),F=0;const I=()=>{if(e.world.isDisposed)return;const t=s[u],r=getFruit(t,FRUIT_DETAIL);m?(r.pieces,i[t]=r,e.models||setModels(e,i),addFruit(e,t),u++):r.whole,m=!m,u>=s.length||(m||(m=isFruitBuilt(s[u],FRUIT_DETAIL)),m||u<FIRST_FRUITS?F=requestAnimationFrame(I):a=setTimeout(()=>F=requestAnimationFrame(I),FRUIT_BUILD_GAP))};return s.length&&(F=requestAnimationFrame(I)),()=>{cancelAnimationFrame(F),clearTimeout(a)}}}),F=useMemo(()=>lightFor(a),[a]),I=useMemo(()=>backgroundFor(a),[a]);return _0x1914d2(EngineGameScreen,{...u,light:F,background:I,columns:[scoreColumn(t),livesColumn(i,MAX_LIVES),timerColumn(s,a)],subtext:"Slice fruits to score!",gameOver:m({title:"GAME OVER",message:"You ran out of lives!",scoreLabel:"Final Score",score:t,buttonText:"Slice Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,merge,Path,quat,shapeGeometry,tube}from"@nayan-ui/engine";import{lighten}from"../../services/GamesConstants.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,merge,Path,quat,shapeGeometry,tube}from"@nayan-ui/engine";import{lighten}from"../../services/GamesConstants.js";import{cacheGameAsset,createGameMesh as _0x2ae645}from"../shared/EngineMeshes.js";import{toColor}from"../shared/EngineUtils.js";import{BLADE_POINTS,BOMB_COLORS,FRAME_TIME,PIECE_LIFETIME,PIECE_SPREAD,SPAWN_FROM,SPAWN_SPRING,STAR_COLORS,TRAIL_FADE}from"./FruitNinjaConstants.js";import{at,facing,planeVector,PLAY_DEPTH,pointSize}from"./FruitNinjaWorld.js";const HIDDEN=0,PER_SECOND=1/FRAME_TIME,TRAIL_DEPTH=PLAY_DEPTH-.35;let extras;export function buildModels(e){return extras??=cacheGameAsset("fruit-ninja/extras",()=>({bomb:_0x2ae645(merge([{geometry:shapeGeometry("sphere"),color:[.13,.14,.17]},{geometry:shapeGeometry("cylinder"),position:[0,.5,0],scale:[.26,.14,.26],color:[.35,.37,.42]},{geometry:tube([[0,.55,0],[.04,.7,0],[.14,.78,0],[.22,.76,0]],{radius:.035}),color:[.76,.6,.38]}]),{fit:1,shine:.7}),spark:_0x2ae645(shapeGeometry("sphere")),star:_0x2ae645(extrude((new Path).addStar(0,0,.5,.22,5),{depth:.22,color:toColor(STAR_COLORS[0])}),{fit:1,shine:.6}),disc:_0x2ae645(extrude((new Path).addCircle(0,0,.5),{depth:0}))})),{fruits:e,...extras}}const SPARK=[3,2.1,.6],WHITE=[1,1,1,1];function fitted(e,t,o=[0,0,0]){const i=t/Math.max(e.size[0],e.size[1]);return{scale:i,position:[-o[0]*i,-o[1]*i,-o[2]*i]}}export function spawnItem(e,t,o,i,s,n,a,r){const p=3*(Math.random()-.5),l=o.size*pointSize(t),f=e.spawn({mesh:"none",position:at(t,n,a),scale:SPAWN_FROM,spin:[.4*p,p,-r*PER_SECOND],pickable:!1});e.animate(f,{scale:1},{spring:SPAWN_SPRING});const h=(t,o,i=WHITE)=>e.spawn({mesh:t,parent:f,position:o.position,scale:o.scale,color:i,pickable:!1});if("fruit"===s.kind){const e=i.fruits[s.fruit];h(e.whole,fitted(e.whole,l,e.center))}else if("bomb"===s.kind){h(i.bomb,fitted(i.bomb,.92*l));const t=e.spawn({mesh:i.spark,parent:f,position:[.2*l,.36*l,0],scale:.1*l,color:SPARK,pickable:!1});e.animate(t,{scale:.16*l},{duration:.12,repeat:"forever",yoyo:!0})}else h(i.star,fitted(i.star,.95*l),toColor(STAR_COLORS[0]));return f}const itemPosition=[0,0,0];export function placeItem(e,t,o,i,s,n){const a=pointSize(t),r=(t.height/2-s)*a;itemPosition[0]=t.eye[0]+t.forward[0]*t.playDepth+(i-t.width/2)*a,itemPosition[1]=t.eye[1]+t.forward[1]*t.playDepth+r*t.up[1],itemPosition[2]=t.eye[2]+t.forward[2]*t.playDepth+r*t.up[2],n?n.position(o,itemPosition[0],itemPosition[1],itemPosition[2]):e.set(o,{position:itemPosition})}const SPLASH_FRUIT=e=>[e,[Math.min(1,e[0]+.25),Math.min(1,e[1]+.25),Math.min(1,e[2]+.25)]],BOMB_BURST=BOMB_COLORS.map(e=>toColor(e)),STAR_BURST=STAR_COLORS.map(e=>toColor(e)),STAR_SPARK=toColor(lighten(STAR_COLORS[0],.5));export function sliceItem(e,t,o,i,s,n,a,r,p,l,f,h){e.despawn(s);const m=pointSize(t),d=o.size*m,E=at(t,a,r),A=at(t,a,r,PLAY_DEPTH-.5*d),S=o.gravity*PER_SECOND*PER_SECOND,P=planeVector(t,0,S);if("fruit"===n.kind){const o=i.fruits[n.fruit],s=Math.hypot(f,h)||1,a=h/s,r=-f/s,u=facing(t,Math.atan2(-r,a)),_=fitted(o.whole,d,o.center);return[-1,1].forEach((i,s)=>{const n=e.spawn({mesh:"none",position:E,rotation:quat.multiply(u,quat.y(i<0?Math.PI/2:-Math.PI/2)),velocity:planeVector(t,(p+i*a*PIECE_SPREAD)*PER_SECOND,(l+i*r*PIECE_SPREAD)*PER_SECOND),acceleration:P,spin:[0,0,2.5*i],lifetime:PIECE_LIFETIME,pickable:!1});e.spawn({mesh:o.pieces[s],parent:n,position:_.position,scale:_.scale,color:WHITE,pickable:!1})}),void effects.splash(e,{position:A,count:14,size:.09*d,speed:5*d,lifetime:.55,gravity:-S*m*.6,colors:SPLASH_FRUIT(o.juice)})}const u="bomb"===n.kind;u?effects.explosion(e,{position:A,count:16,size:.7*d,speed:2.6*d,lifetime:.6,gravity:-S*m*.5,debris:BOMB_BURST,flash:!1}):effects.sparkle(e,{position:A,count:16,size:.1*d,speed:6*d,lifetime:.6,gravity:-S*m*.3,colors:STAR_BURST,flash:!1});const _=e.spawn({mesh:i.disc,position:at(t,a,r,PLAY_DEPTH-d),rotation:facing(t),scale:d,color:u?[2,1.1,.3,.85]:[2*STAR_SPARK[0],2*STAR_SPARK[1],2*STAR_SPARK[2],.8],pickable:!1});e.animate(_,{scale:d*(u?3.2:2.2),color:[2,u?.8:1.8,.2,0]},{duration:u?.4:.3}).then(()=>{e.has(_)&&e.despawn(_)})}const BEAD_SIZE=7,BEAD=[1.6,1.6,1.6,.75],FADED=[1.6,1.6,1.6,0];export function spawnTrail(e){return{beads:Array.from({length:BLADE_POINTS},()=>e.spawn({mesh:"sphere",scale:0,color:BEAD,pickable:!1})),shown:0,fading:!1}}export function drawTrail(e,t,o,i,s,n){const a=e.transforms,r=Math.min(n,o.beads.length);if(o.fading){for(let t=0;t<o.shown;t++)e.stopAnimation(o.beads[t]);o.fading=!1}const p=pointSize(t,TRAIL_DEPTH),l=at(t,t.width/2,t.height/2,TRAIL_DEPTH),f=7*p;for(let e=0;e<r;e++){const r=n-1-e,h=(i[r]-t.width/2)*p,m=(t.height/2-s[r])*p,d=o.beads[e];a.position(d,l[0]+h,l[1]+m*t.up[1],l[2]+m*t.up[2]),a.scale(d,f*(1-e/BLADE_POINTS)),a.color(d,BEAD[0],BEAD[1],BEAD[2],BEAD[3]??1)}for(let e=r;e<o.shown;e++)a.scale(o.beads[e],0);o.shown=r,a.flush()}export function fadeTrail(e,t){t.shown&&(e.animate(t.beads.slice(0,t.shown),{color:FADED,scale:0},{duration:TRAIL_FADE}),t.fading=!0)}export function hideTrail(e,t){const o=e.transforms;for(let i=0;i<t.shown;i++)t.fading&&e.stopAnimation(t.beads[i]),o.scale(t.beads[i],0);o.flush(),t.shown=0,t.fading=!1}export function removeTrail(e,t){for(const o of t.beads)e.despawn(o)}export function*warmAssets(){yield()=>buildModels({})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{makeView as
|
|
1
|
+
"use strict";import{makeView as _0x136602,spawnWorld as _0x4a7c9f}from"../shared/EngineMeadow.js";export{at,backgroundFor,cameraFor,facing,lightFor,planeVector,pointSize}from"../shared/EngineMeadow.js";export const PLAY_DEPTH=3.6;export const makeView=(e,o)=>_0x136602(e,o,{eyeHeight:1.6,horizon:.62,playDepth:3.6});export const spawnWorld=(e,o,a)=>_0x4a7c9f(e,o,a);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{GAME_TIME,getLayout,LIGHT}from"./Game2048Constants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./Game2048Game.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{GAME_TIME,getLayout,LIGHT}from"./Game2048Constants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./Game2048Game.js";import{jsx as _0x36b417}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.GAME_2048,FEEDBACK={move:{sound:SOUNDS.TILE_MOVE,haptic:HapticType.LIGHT},merge:{sound:SOUNDS.TILE_MERGE,haptic:HapticType.MEDIUM},invalid:{sound:SOUNDS.INVALID_MOVE,haptic:HapticType.WARNING},win:{sound:SOUNDS.WIN,haptic:HapticType.SUCCESS},stuck:{sound:SOUNDS.GAME_OVER,haptic:HapticType.ERROR}},CARDS={win:{title:"YOU WON!",message:"You reached 1024!",label:"Score",button:"Continue Playing!"},timeout:{title:"TIME UP!",message:"You ran out of time!",label:"Time's Up!",button:"Play Again!"},stuck:{title:"NO MOVES LEFT!",message:"The board is full!",label:"Board Full!",button:"Play Again!"}};export const Game2048=engineGame(GAME_IDS.GAME_2048,e=>{const[t,s]=useLiveState(GAME_TIME),{game:i,theme:a,status:o,screen:r,gameOver:n}=useEngineGame(e,{gameId:GAME_IDS.GAME_2048,create:createGame,start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,i)=>{const a=getLayout(t,s,i,isTablet);return setLayout(e,a),a.size+2*a.pad},drag:drag,outcome:e=>"win"===e.result?"win":"lose",sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.SELECTION),onStop:e=>e(null,HapticType.SELECTION),onOver:(e,t,s)=>{"timeout"===s.result&&e(SOUNDS.TIME_UP,HapticType.ERROR)},wire:(e,t)=>{e.onTime=s,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}}),m=CARDS[i.result??"timeout"];return _0x36b417(EngineGameScreen,{...r,light:LIGHT,columns:[timerColumn(t,a,0)],subtext:"Swipe to play",gameOver:n({title:m.title,message:m.message,scoreLabel:m.label,score:"win"===o?i.score:0,buttonText:m.button})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,Path}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{spawnRaisedBlock}from"../shared/EngineBlocks.js";import{flatGlyphMesh,GLYPH_ADVANCE}from"../shared/EngineGlyphs.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,Path}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{spawnRaisedBlock}from"../shared/EngineBlocks.js";import{flatGlyphMesh,GLYPH_ADVANCE}from"../shared/EngineGlyphs.js";import{cacheGameAsset,createGameMesh as _0x35e479}from"../shared/EngineMeshes.js";import{placeTiltedBackdrop}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{cellCentre,COLORS,MERGE_POP,SLIDE_TIME,TILE_HEIGHT,tileColors}from"./Game2048Constants.js";import{GRID}from"./Game2048Rules.js";const meshes=new Map,cached=(e,o)=>{let t=meshes.get(e);return!t&&(t=cacheGameAsset("game-2048/Game2048Scene:"+e,o),meshes.set(e,t)),t},BOARD_DEPTH=12,BACKDROP_DEPTH=30,SURFACE=1,SPAWN_FROM=.2,panelMesh=(e,o,t)=>cached("g2048-panel:"+e+":"+o+":"+t,()=>_0x35e479(extrude((new Path).addRoundedRect(-e/2,-e/2,e,e,o),{depth:t}),{shine:0})),at=(e,o,t)=>{const[s,a]=cellCentre(e,o,t);return[s,a,1]};function spawnBoard(e,o,t){const s=[],a=o=>s.push(e.spawn({pickable:!1,...o})),i="classic"===t.mode;a({mesh:panelMesh(o.size+2*o.pad,i?14:8,12),position:[0,0,-6],color:toColor(i?COLORS.FRAME:t.BOARD.SURFACE)});for(let e=0;e<GRID;e++)for(let s=0;s<GRID;s++){const[n,r]=cellCentre(o,e,s);a({mesh:panelMesh(o.tile,Math.min(8,.12*o.tile),1),position:[n,r,.5],color:toColor(i?COLORS.SLOT:t.BOARD.CELL_EMPTY)})}return s}function spawnDigits(e,o,t,s){const a=String(s),i=a.length,n=o.tile*(i<=2?.29:3===i?.24:4===i?.19:.155),r=n*GLYPH_ADVANCE,l=toColor(tileColors(s)[1]),p=o.tile*TILE_HEIGHT+.6;return[...a].map((o,s)=>e.spawn({mesh:flatGlyphMesh(o),parent:t,position:[(s-(i-1)/2)*r,0,p],scale:n,color:l,pickable:!1}))}function spawnTile(e,o,t){const s=o.tile*TILE_HEIGHT,a=e.spawn({mesh:"none",position:at(o,t.row,t.col),pickable:!1});return{root:a,block:spawnRaisedBlock(e,{parent:a,position:[0,0,s/2],size:[o.tile,o.tile,s],color:toColor(tileColors(t.value)[0]),gloss:!1,shadow:!1}),digits:spawnDigits(e,o,a,t.value),value:t.value,row:t.row,col:t.col}}export function buildScene(e,o,t,s){const a=spawnBackdrop(e,o.width,o.height,-30,t);placeTiltedBackdrop(e,a,o,30);const i={backdrop:a,board:spawnBoard(e,o,t),tiles:new Map};for(const t of s)i.tiles.set(t.id,spawnTile(e,o,t));return i}export function removeScene(e,o){for(const t of[o.backdrop,...o.board,...Array.from(o.tiles.values(),e=>e.root)])e.despawn(t)}export function setSceneTheme(e,o,t,s){setBackdropTheme(e,t.backdrop,s);for(const o of t.board)e.despawn(o);t.board=spawnBoard(e,o,s)}export function resetTiles(e,o,t,s){for(const o of t.tiles.values())e.despawn(o.root);t.tiles.clear();for(const a of s)grow(e,t,a,spawnTile(e,o,a),0)}function grow(e,o,t,s,a){o.tiles.set(t.id,s),e.set(s.root,{scale:.2}),e.animate(s.root,{scale:1},{duration:.18,delay:a,easing:"back"})}export function slideTiles(e,o,t,s,a){for(const s of a){const a=t.tiles.get(s.id);a&&(t.tiles.delete(s.id),e.animate(a.root,{position:at(o,s.toRow,s.toCol)},{duration:SLIDE_TIME,easing:"easeOut"}).then(()=>{e.has(a.root)&&e.despawn(a.root)}).catch(()=>{}))}for(const a of s){const s=t.tiles.get(a.id);if(s){if((s.row!==a.row||s.col!==a.col)&&(e.animate(s.root,{position:at(o,a.row,a.col)},{duration:SLIDE_TIME,easing:"easeOut"}),s.row=a.row,s.col=a.col),s.value!==a.value){for(const o of s.digits)e.despawn(o);s.digits=spawnDigits(e,o,s.root,a.value),s.value=a.value,e.animate(s.block,{color:toColor(tileColors(a.value)[0])},{duration:.08,delay:.6*SLIDE_TIME}),e.animate(s.root,[{scale:MERGE_POP,at:.35},{scale:1}],{duration:.22,delay:SLIDE_TIME,easing:"easeOut"})}}else grow(e,t,a,spawnTile(e,o,a),SLIDE_TIME)}}export function bump(e,o,t){e.animate(Array.from(t.tiles.values(),e=>e.root),{shake:.04*o.tile},{duration:.2})}export function celebrate(e,o,t){for(const s of t.tiles.values()){const[t,a,i]=at(o,s.row,s.col);e.animate(s.root,[{position:[t,a,i+.3*o.tile],scale:1.05,at:.4},{position:[t,a,i],scale:1}],{duration:.45,delay:SLIDE_TIME+.15+.05*(s.row+s.col),easing:"easeOut"})}effects.confetti(e,{position:[0,0,o.tile],count:70,size:.1*o.tile,speed:1.4*o.size,lifetime:1.3,gravity:2.4*-o.size,colors:["#edc22e","#f67c5f","#f2b179","#FFFFFF"].map(e=>toColor(e))})}export function dim(e,o){for(const t of o.tiles.values()){const o=toColor(tileColors(t.value)[0]);e.animate(t.block,{color:[.55*o[0],.55*o[1],.6*o[2],1]},{duration:.4,delay:SLIDE_TIME})}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{getLayout,KNIVES_PER_ROUND,LIGHT,TIME_LIMIT}from"./KnifeHitConstants.js";import{createGame,dispose,reset,setLayout,setTheme,start,throwKnife,tick}from"./KnifeHitGame.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{getLayout,KNIVES_PER_ROUND,LIGHT,TIME_LIMIT}from"./KnifeHitConstants.js";import{createGame,dispose,reset,setLayout,setTheme,start,throwKnife,tick}from"./KnifeHitGame.js";import{jsx as _0x940ec0}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.KNIFE_HIT,FEEDBACK={throw:{sound:SOUNDS.THROW,haptic:HapticType.LIGHT},stick:{sound:SOUNDS.STICK,haptic:HapticType.MEDIUM},apple:{sound:SOUNDS.APPLE,haptic:HapticType.SUCCESS},clash:{sound:SOUNDS.HIT,haptic:HapticType.ERROR}};export const KnifeHit=engineGame(GAME_IDS.KNIFE_HIT,e=>{const[t,s]=useLiveState(0),[i,r]=useLiveState(TIME_LIMIT),[n,o]=useLiveState(KNIVES_PER_ROUND),{theme:a,status:S,screen:m,gameOver:E}=useEngineGame(e,{gameId:GAME_IDS.KNIFE_HIT,create:createGame,start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,i)=>{const r=getLayout(t,s,i);return setLayout(e,r),r.gameWidth},drag:(e,t)=>{"start"===t.phase&&throwKnife(e)},sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.SUCCESS),onStop:e=>e(null,HapticType.MEDIUM),onOver:(e,t)=>e("win"===t?GAME_SOUNDS.WELL_DONE:SOUNDS.GAME_OVER,"win"===t?HapticType.SUCCESS:HapticType.ERROR),wire:(e,t)=>{e.onScore=s,e.onTime=r,e.onKnives=o,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}});return _0x940ec0(EngineGameScreen,{...m,light:LIGHT,columns:[scoreColumn(t),textColumn("KNIVES",n),timerColumn(i,a)],subtext:"Tap to throw knives!",gameOver:E({title:"win"===S?"PERFECT!":"GAME OVER",message:"win"===S?"All knives stuck!":"Hit another knife!",scoreLabel:"Final Score",score:t,buttonText:"Throw Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{getFruits}from"../shared/EngineFruits.js";import{noise}from"../shared/EngineMeadow.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{getFruits}from"../shared/EngineFruits.js";import{noise}from"../shared/EngineMeadow.js";import{cacheGameAsset,createGameMesh as _0x3a8955}from"../shared/EngineMeshes.js";import{placeTiltedBackdrop,unproject}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{BOUNCE_TIME,KICK_POINTS,KNIVES_PER_ROUND}from"./KnifeHitConstants.js";const meshes=new Map,cached=(o,e)=>{let t=meshes.get(o);return!t&&(t=cacheGameAsset("knife-hit/KnifeHitScene:"+o,e),meshes.set(o,t)),t},rgb=o=>{const[e,t,n]=toColor(o);return[e,t,n]},mix=(o,e,t)=>[o[0]+(e[0]-o[0])*t,o[1]+(e[1]-o[1])*t,o[2]+(e[2]-o[2])*t],STAND_UP=quat.x(Math.PI/2),BACKDROP_DEPTH=80,KNIFE_SCALE=1.15;export function toWorld(o,e,t,n=0){const[i,s]=unproject(o,e,o.top+t,n);return[i,s,n]}const onLog=(o,e,t=0)=>[Math.cos(o)*e,-Math.sin(o)*e,t],inward=o=>quat.z(Math.PI/2-o),logMesh=()=>cached("kh-log",()=>{const o=rgb("#795548"),e=rgb("#6D4C41"),t=rgb("#8D6E63"),n=rgb("#4E342E"),i=rgb("#3E2723");return _0x3a8955(lathe([[.001,.3],[.25,.3],[.44,.3],[.47,.29],[.5,.25],[.5,-.25],[.47,-.29],[.44,-.3],[.001,-.3]],{segments:48,color:({position:s,normal:r})=>{const a=Math.hypot(s[0],s[2]);if(Math.abs(r[1])<.6){const o=.5+.5*Math.sin(26*Math.atan2(s[2],s[0])+4*noise(9*s[0],9*s[2]));return mix(i,n,.8*o)}if(a>.45)return n;const l=.5+.5*Math.sin(70*a+2*noise(6*s[0],6*s[2]));return mix(mix(t,o,Math.min(1,3*a)),e,.55*l)}}),{shine:.1})}),knifeMesh=()=>cached("kh-knife-v2",()=>{const o=extrude((new Path).moveTo(0,0).quadraticTo(.1,.12,.1,.3).lineTo(.1,.6).lineTo(-.08,.6).lineTo(-.08,.24).quadraticTo(-.07,.09,0,0).close(),{depth:.05}),e=extrude((new Path).moveTo(.008,.03).quadraticTo(.1,.13,.1,.3).lineTo(.1,.58).lineTo(.068,.58).lineTo(.068,.3).quadraticTo(.066,.16,.008,.03).close(),{depth:.056}),t=rgb("#FFC400"),n=rgb("#8D5A32"),i=rgb("#3E2A1C");return _0x3a8955(merge([{geometry:o,color:[...rgb("#9EADB8"),1]},{geometry:e,color:[...rgb("#F3F7FA"),1]},{geometry:shapeGeometry("cube"),position:[-.025,-.4,.027],scale:[.025,.34,.005],color:[...rgb("#6F7F8A"),1]},{geometry:shapeGeometry("roundedBox"),position:[0,-.625,0],scale:[.3,.055,.11],color:[...t,1]},{geometry:shapeGeometry("roundedBox"),position:[0,-.8,0],scale:[.15,.3,.12],color:[...n,1]},...[-.7,-.78,-.86,-.94].map(o=>({geometry:shapeGeometry("roundedBox"),position:[0,o,0],scale:[.162,.025,.13],color:[...i,1]})),{geometry:shapeGeometry("sphere"),position:[0,-.97,0],scale:[.17,.08,.13],color:[...t,1]}]),{center:!1,shine:.75})});export function buildScene(o,e,t){const n=spawnBackdrop(o,e.width,e.height,-80,t);placeTiltedBackdrop(o,n,e,80);const i=o.spawn({mesh:"none",position:toWorld(e,e.logX,e.logY),pickable:!1}),s=o.spawn({mesh:logMesh(),parent:i,rotation:STAND_UP,scale:2*e.logRadius,pickable:!1}),r=o.spawn({mesh:knifeMesh(),position:toWorld(e,e.logX,e.knifeStartY),scale:1.15*e.knifeLength,pickable:!1}),a=(e.width-e.gameWidth)/2+22;return{backdrop:n,pivot:i,log:s,stuck:[],apple:null,knife:r,counters:Array.from({length:KNIVES_PER_ROUND},(t,n)=>o.spawn({mesh:knifeMesh(),position:toWorld(e,a,e.areaHeight-26-20*n),scale:18,color:[1,1,1,1],pickable:!1}))}}export function removeScene(o,e){for(const t of[e.backdrop,e.pivot,e.knife,...e.counters])o.despawn(t)}export function setSceneTheme(o,e,t){setBackdropTheme(o,e.backdrop,t)}export function dressLog(o,e,t,n,i){for(const e of t.stuck)o.despawn(e);if(null!=t.apple&&o.despawn(t.apple),o.stopAnimation(t.pivot),o.set(t.pivot,{position:toWorld(e,e.logX,e.logY),rotation:quat.z(0)}),t.stuck=n.map(n=>stickKnife(o,e,t,n)),t.apple=null,null!==i){const n=getFruits().apple,s=2*e.appleRadius,r=onLog(i,e.logRadius+e.appleRadius+4);t.apple=o.spawn({mesh:n.whole,parent:t.pivot,position:[r[0]-n.center[0]*s,r[1]-n.center[1]*s,r[2]-n.center[2]*s],scale:s,pickable:!1})}}function stickKnife(o,e,t,n){return o.spawn({mesh:knifeMesh(),parent:t.pivot,position:onLog(n,e.logRadius-.5*e.tipLength),rotation:inward(n),scale:1.15*e.knifeLength,pickable:!1})}const SPIN=[0,0,0,1];export function spinLog(o,e,t){o.set(e.pivot,{rotation:quat.z(-t,SPIN)})}export function placeKnife(o,e,t,n,i){o.stopAnimation(t.knife),o.set(t.knife,{position:toWorld(e,e.logX,n),rotation:quat.z(0),scale:i?1.15*e.knifeLength:0,color:[1,1,1,1]})}export function showCount(o,e,t){e.countShown!==t&&(e.countShown=t,e.counters.forEach((e,n)=>o.set(e,{color:n<t?[1,1,1,1]:[.35,.35,.38,.45]})))}export function stick(o,e,t,n){const i=stickKnife(o,e,t,n);t.stuck.push(i),o.animate(i,[{turn:[0,0,.12],at:.15},{turn:[0,0,-.2],at:.4},{turn:[0,0,.11],at:.65},{turn:[0,0,-.03],at:1}],{duration:.32,easing:"linear"}),o.animate(t.log,[{color:[1.25,1.18,1.1,1],at:.15},{color:[1,1,1,1]}],{duration:.22});const s=toWorld(e,e.logX,e.logY);o.animate(t.pivot,[{position:[s[0],s[1]+KICK_POINTS,s[2]],at:.3},{position:s}],{duration:.18}),effects.shatter(o,{position:toWorld(e,e.logX,e.logY+e.logRadius,4),count:7,size:3.5,speed:120,direction:[0,-1,.6],spread:1.1,lifetime:.4,gravity:-900,colors:[toColor("#C68A5B"),toColor("#8D6E63"),toColor("#5D4037")],flash:!1}),effects.dust(o,{position:toWorld(e,e.logX,e.logY+e.logRadius,6),count:5,size:9,speed:60,direction:[0,-1,.5],spread:1.4,lifetime:.45,color:[.93,.8,.62,.6],endSize:2.2})}export function clash(o,e,t,n){const i=toWorld(e,e.logX,n,4);effects.sparks(o,{position:i,count:16,size:3,speed:220,direction:[0,-1,.4],spread:1.3,lifetime:.35,gravity:-600,colors:[[1,.92,.6],[1,.7,.25]]}),o.animate(t.pivot,{shake:6},{duration:.25}),effects.flash(o,{position:i,mesh:"sphere",size:22,lifetime:.14,color:[2.2,2,1.5,.9],endSize:1.8,endColor:[2,1.6,.8,0]});const s=Math.random()<.5?-1:1;o.animate(t.knife,{position:toWorld(e,e.logX+70*s,n+220,30)},{duration:BOUNCE_TIME,easing:"easeOut"}),o.animate(t.knife,{turn:[0,0,s*Math.PI*3]},{duration:BOUNCE_TIME,easing:"easeOut"}),o.animate(t.knife,{color:[1,1,1,0]},{duration:BOUNCE_TIME,easing:"easeIn"})}export function burstApple(o,e,t){const n=t.apple;if(null==n)return;t.apple=null;const i=2*e.appleRadius;o.animate(n,{scale:1.7*i},{duration:.32,easing:"easeOut"}),o.animate(n,{color:[1,1,1,0]},{duration:.32}),effects.splash(o,{position:toWorld(e,e.logX,e.logY+e.logRadius+e.appleRadius,6),count:16,size:3.5,speed:160,lifetime:.5,gravity:-500,colors:[toColor("#D32F2F"),toColor("#EF5350"),toColor("#FFF3E0")]})}export function celebrate(o,e){effects.confetti(o,{position:toWorld(e,e.logX,e.logY,20),count:50,size:5,speed:320,lifetime:1.2,gravity:-600,colors:["#FFD600","#D32F2F","#4CAF50","#90A4AE"].map(o=>toColor(o))})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{textColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{AI_COLOR,getLayout,LIGHT,PLAYER_COLOR,RIM}from"./LudoKingConstants.js";import{createGame,dispose,reset,setLayout,setTheme,start,tap,tick}from"./LudoKingGame.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{textColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{AI_COLOR,getLayout,LIGHT,PLAYER_COLOR,RIM}from"./LudoKingConstants.js";import{createGame,dispose,reset,setLayout,setTheme,start,tap,tick}from"./LudoKingGame.js";import{jsx as _0x4bc19a}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.LUDO_KING,FEEDBACK={tap:{sound:"TAP",haptic:HapticType.MEDIUM},roll:{sound:"ROLL"},six:{sound:"SIX",haptic:HapticType.SUCCESS},penalty:{sound:"PENALTY",haptic:HapticType.ERROR},cantMove:{sound:"CANT_MOVE",haptic:HapticType.WARNING,youOnly:!0},move:{sound:"MOVE",haptic:HapticType.LIGHT},capture:{sound:"CAPTURE",haptic:HapticType.SUCCESS},finish:{sound:"FINISH",haptic:HapticType.SUCCESS}};export const LudoKing=engineGame(GAME_IDS.LUDO_KING,e=>{const[t,s]=useLiveState([0,0]),[i,o]=useLiveState(0),[n,a]=useLiveState(0),{status:r,screen:S,gameOver:p}=useEngineGame(e,{gameId:GAME_IDS.LUDO_KING,create:createGame,start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,i)=>{const o=getLayout(t,s,i);return setLayout(e,o),o.size*(1+2*RIM)},tap:tap,sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.MEDIUM),onOver:(e,t)=>e("win"===t?SOUNDS.WIN:SOUNDS.GAME_OVER,"win"===t?HapticType.SUCCESS:HapticType.HEAVY),wire:(e,t)=>{e.onFinished=(e,t)=>s([e,t]),e.onScore=a,e.onTurn=o,e.onEvent=(e,s)=>{const i=FEEDBACK[e];i.youOnly&&0!==s||t(i.sound?SOUNDS[i.sound]:null,i.haptic)}}});return _0x4bc19a(EngineGameScreen,{...S,light:LIGHT,columns:[textColumn("YOU",String(t[0]),PLAYER_COLOR),textColumn(0===i?"YOUR TURN":"AI TURN",n.toLocaleString()),textColumn("AI",String(t[1]),AI_COLOR)],subtext:"Roll dice, move tokens!",gameOver:p({title:"win"===r?"YOU WON!":"YOU LOST!",message:"win"===r?"All your tokens made it home!":"The AI got all four home first!",scoreLabel:"win"===r?"You Won!":"You Lost",score:n,buttonText:"win"===r?"Play Again!":"Try Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{dieMesh,dieRotation as
|
|
1
|
+
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{dieMesh,dieRotation as _0x2d0286,rollDie as _0x382f19}from"../shared/EngineDice.js";import{cacheGameAsset,createGameMesh as _0x2d5cb8}from"../shared/EngineMeshes.js";import{aimTilted,placeTiltedBackdrop}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{AI_COLOR,BOARD_FRAME,BOARD_WHITE,cellPoint,CENTER,DIE_SIZE,DIE_Y,ENTRY,GRID,HOME_STRETCH,HOME_YARDS,MAIN_PATH,PLAYER_COLOR,PLAYER_COLORS,RIM,SAFE_POSITIONS,STAR_COLOR,TILE_TOP,TILT,TOKEN_HEIGHT}from"./LudoKingConstants.js";const meshes=new Map,cached=(e,o)=>{let t=meshes.get(e);return!t&&(t=cacheGameAsset("ludo-king/LudoKingScene:"+e,o),meshes.set(e,t)),t},rgb=e=>{const[o,t,s]=toColor(e);return[o,t,s]},cube=()=>shapeGeometry("cube"),sphere=()=>shapeGeometry("sphere"),STAND_UP=quat.x(Math.PI/2),CELL=1/GRID,HOME_CORNER=[{color:"blue",row:0,col:0},{color:"red",row:0,col:9},{color:"green",row:9,col:0},{color:"yellow",row:9,col:9}],SKIN=4e-4,LAYER=.002,layerZ=e=>TILE_TOP-.008+.002*e;export const SHADOW_Z=layerZ(6);export const PAWN_Z=layerZ(7);const GRID_LINE=[.55,.53,.62];function tile(e,o,t,s,n=.92){const[i,r]=cellPoint(o,t);e.push({geometry:cube(),position:[i,r,layerZ(2)],scale:[CELL,CELL,SKIN],color:[...GRID_LINE,1]}),e.push({geometry:cube(),position:[i,r,layerZ(3)],scale:[CELL*n,CELL*n,SKIN],color:[...s,1]})}const disc=e=>extrude((new Path).addCircle(0,0,e),{depth:SKIN});function boardMesh(){return cached("ludo-board",()=>{const e=1+2*RIM,o=rgb(BOARD_FRAME),t=rgb(BOARD_WHITE),s=[{geometry:cube(),position:[0,0,layerZ(0)],scale:[e,e,SKIN],color:[...o,1]},{geometry:cube(),position:[0,0,layerZ(1)],scale:[1,1,SKIN],color:[...t,1]}];for(const{color:e,row:o,col:n}of HOME_CORNER){const i=rgb(PLAYER_COLORS[e]),[r,l]=cellPoint(o+2.5,n+2.5),a=6*CELL;s.push({geometry:cube(),position:[r,l,layerZ(2)],scale:[a,a,SKIN],color:[...i,1]}),s.push({geometry:cube(),position:[r,l,layerZ(3)],scale:[.68*a,.68*a,SKIN],color:[...t,1]});for(const o of HOME_YARDS[e]){const[e,n]=cellPoint(o.row,o.col);s.push({geometry:disc(.5),position:[e,n,layerZ(4)],scale:[1.5*CELL,1.5*CELL,1],color:[...i,1]}),s.push({geometry:disc(.5),position:[e,n,layerZ(5)],scale:[.9*CELL,.9*CELL,1],color:[...t,1]})}}MAIN_PATH.forEach((e,o)=>{const n=Object.keys(ENTRY).find(e=>ENTRY[e]===o),i=n?rgb(PLAYER_COLORS[n]):t;if(tile(s,e.row,e.col,i),SAFE_POSITIONS.includes(o)&&!n){const[o,t]=cellPoint(e.row,e.col);s.push({geometry:extrude((new Path).addStar(0,0,.5,.22),{depth:SKIN}),position:[o,t,layerZ(4)],scale:[.7*CELL,.7*CELL,1],color:[...rgb(STAR_COLOR),1]})}});for(const e of["blue","red","green","yellow"]){const o=rgb(PLAYER_COLORS[e]);for(const t of HOME_STRETCH[e])tile(s,t.row,t.col,o)}const n={tl:cellPoint(5.5,5.5),tr:cellPoint(5.5,8.5),bl:cellPoint(8.5,5.5),br:cellPoint(8.5,8.5)},i=(e,o,t)=>s.push({geometry:extrude((new Path).addPolygon([[0,0],[e[0],-e[1]],[o[0],-o[1]]]),{depth:SKIN}),position:[0,0,layerZ(3)],color:[...rgb(t),1]});return i(n.tl,n.tr,PLAYER_COLORS.red),i(n.tr,n.br,PLAYER_COLORS.yellow),i(n.br,n.bl,PLAYER_COLORS.green),i(n.bl,n.tl,PLAYER_COLORS.blue),_0x2d5cb8(merge(s),{center:!1,shine:0})})}const pawnMesh=()=>cached("ludo-pawn",()=>_0x2d5cb8(merge([{geometry:lathe([[.001,0],[.42,0],[.44,.04],[.42,.1],[.3,.14],[.24,.2],[.18,.44],[.15,.58],[.27,.61],[.27,.66],[.14,.69]],{segments:28})},{geometry:sphere(),position:[0,.84,0],scale:.42}]),{center:!1,shine:.6}));export const dieRotation=(e,o=0)=>_0x2d0286(TILT,e,o);const discMesh=()=>cached("ludo-disc",()=>_0x2d5cb8(extrude((new Path).addCircle(0,0,.5),{depth:0}))),ringMesh=()=>cached("ludo-ring",()=>_0x2d5cb8(extrude((new Path).addCircle(0,0,.5).addCircle(0,0,.4),{depth:0,fillRule:"evenodd"}))),SHADOW=[0,0,0,.22],BACKDROP_DEPTH=25;export const toWorld=(e,o,t,s)=>[o*e.size,t*e.size,s*e.size];const tiltView=e=>({width:e.width,height:e.height,centerY:e.centerY,tilt:TILT});export const aimCamera=(e,o)=>aimTilted(e,tiltView(o));export const dieRest=e=>toWorld(e,0,DIE_Y,DIE_SIZE/2);export function buildScene(e,o,t,s){const n=spawnBackdrop(e,o.width,o.height,-25,t);placeTiltedBackdrop(e,n,tiltView(o),25);const i=e.spawn({mesh:boardMesh(),scale:o.size,color:[1,1,1,1],pickable:!1}),r=new Map,l=new Map,a=new Map;for(const{id:t,color:n}of s){const s=e.spawn({mesh:pawnMesh(),rotation:STAND_UP,scale:TOKEN_HEIGHT*o.size,color:toColor(PLAYER_COLORS[n])});r.set(t,s),l.set(s,t),a.set(t,e.spawn({mesh:discMesh(),scale:.05*o.size,color:SHADOW,pickable:!1}))}const d=e.spawn({mesh:discMesh(),position:toWorld(o,.012,DIE_Y-.01,.001),scale:[1.25*DIE_SIZE*o.size,1.1*DIE_SIZE*o.size,1],color:SHADOW,pickable:!1}),p=e.spawn({mesh:ringMesh(),position:toWorld(o,0,DIE_Y,.002),scale:0,color:[1,.78,.15,.85],pickable:!1}),h=e.spawn({mesh:dieMesh(),position:dieRest(o),rotation:dieRotation(1),scale:DIE_SIZE*o.size}),E=Array.from({length:4},()=>e.spawn({mesh:ringMesh(),scale:0,color:[1,.85,.2,.9],pickable:!1}));return{backdrop:n,board:i,tokens:r,tokenAt:l,bobbing:new Set,shadows:a,die:h,dieShadow:d,ring:p,hints:E}}export function removeScene(e,o){e.despawn(o.backdrop),e.despawn(o.board);for(const t of o.tokens.values())e.despawn(t);for(const t of o.shadows.values())e.despawn(t);e.despawn(o.die),e.despawn(o.dieShadow),e.despawn(o.ring);for(const t of o.hints)e.despawn(t)}export function setSceneTheme(e,o,t){setBackdropTheme(e,o.backdrop,t)}export function placeToken(e,o,t,s,n,i=0){const[r,l]=cellPoint(n.row,n.col),a=t.tokens.get(s),d=t.shadows.get(s);e.stopAnimation(a),e.stopAnimation(d),e.set(a,{position:toWorld(o,r+i,l,PAWN_Z)}),e.set(d,{position:toWorld(o,r+i+.006,l-.006,SHADOW_Z)})}export function hopToken(e,o,t,s,n,i){const r=t.tokens.get(s),l=t.shadows.get(s),a=n.map(e=>cellPoint(e.row,e.col)),d=a.slice(1).map((e,t)=>({position:toWorld(o,e[0],e[1],PAWN_Z+.03),at:(t+1)/(a.length-1)})),p=a[a.length-1];e.stopAnimation(r),e.stopAnimation(l),e.animate(r,d,{duration:i,path:"smooth",easing:"easeInOut"}),e.animate(l,{position:toWorld(o,p[0]+.006,p[1]-.006,SHADOW_Z)},{duration:i})}export function bobToken(e,o,t,s){const n=new Set(s);for(const[s,i]of t.tokens)n.has(s)!==t.bobbing.has(s)&&e.set(i,{bob:n.has(s)?{amplitude:[0,0,.01*o.size],speed:6}:null});t.bobbing=n}export function showHints(e,o,t,s){const n=1.5*CELL*o.size;t.hints.forEach((t,i)=>{const r=s[i];if(!r)return e.stopAnimation(t),void e.set(t,{scale:0});const[l,a]=cellPoint(r.row,r.col);e.set(t,{position:toWorld(o,l,a,PAWN_Z),scale:n}),e.stopAnimation(t),e.animate(t,{scale:1.2*n},{duration:.6,easing:"easeInOut",repeat:"forever",yoyo:!0})})}export function rollDie(e,o,t,s,n,i){_0x382f19(e,{die:t.die,shadow:t.dieShadow,rest:dieRest(o),shadowAt:toWorld(o,.012,DIE_Y-.01,.001),shadowScale:[1.25*DIE_SIZE*o.size,1.1*DIE_SIZE*o.size,1],size:DIE_SIZE*o.size,tilt:TILT,value:s,duration:n,disposed:i})}export function showRollHint(e,o,t,s){if(e.stopAnimation(t.ring),!s)return void e.set(t.ring,{scale:0});const n=1.55*DIE_SIZE*o.size;e.set(t.ring,{scale:n}),e.animate(t.ring,{scale:1.15*n},{duration:.6,easing:"easeInOut",repeat:"forever",yoyo:!0})}export function captureBurst(e,o,t){const[s,n]=cellPoint(t.row,t.col);effects.sparkle(e,{position:toWorld(o,s,n,TILE_TOP+.03),count:18,size:.01*o.size,speed:.4*o.size,lifetime:.5,gravity:-.6*o.size,colors:[toColor("#FFF59D"),toColor("#FF7043"),[1,1,1,1]]})}export function finishBurst(e,o){const[t,s]=cellPoint(CENTER.row,CENTER.col);effects.sparkle(e,{position:toWorld(o,t,s,TILE_TOP+.04),count:20,size:.011*o.size,speed:.4*o.size,lifetime:.6,colors:[toColor("#FFD54F"),toColor("#FFF59D"),[1,1,1,1]]})}export function confetti(e,o,t){const[s,n]=cellPoint(CENTER.row,CENTER.col);effects.confetti(e,{position:toWorld(o,s,n,TILE_TOP+.08),count:48,size:.012*o.size,speed:.7*o.size,lifetime:1.3,gravity:-1.2*o.size,colors:["green"===t?PLAYER_COLOR:AI_COLOR,PLAYER_COLORS.yellow,PLAYER_COLORS.green,PLAYER_COLORS.blue,"#FFFFFF"].map(e=>toColor(e))})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{BORDER,GAME_DURATION,getLayout,LIGHT,WALL_THICKNESS}from"./MazeRunnerConstants.js";import{createGame,dispose,drag,newMaze,setLayout,setTheme,start,stop,tick}from"./MazeRunnerGame.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{BORDER,GAME_DURATION,getLayout,LIGHT,WALL_THICKNESS}from"./MazeRunnerConstants.js";import{createGame,dispose,drag,newMaze,setLayout,setTheme,start,stop,tick}from"./MazeRunnerGame.js";import{jsx as _0x1407e2}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.MAZE_RUNNER,FEEDBACK={turn:{sound:SOUNDS.TURN,haptic:HapticType.LIGHT},bump:{sound:SOUNDS.BUMP,haptic:HapticType.MEDIUM},win:{sound:SOUNDS.COMPLETE,haptic:HapticType.SUCCESS},lose:{sound:SOUNDS.GAME_OVER,haptic:HapticType.ERROR}},timeUpText=()=>"You ran out of time!";export const MazeRunner=engineGame(GAME_IDS.MAZE_RUNNER,e=>{const[t,s]=useLiveState(GAME_DURATION),[i,r]=useLiveState(!1),{game:n,theme:a,status:o,screen:m,gameOver:S}=useEngineGame(e,{gameId:GAME_IDS.MAZE_RUNNER,create:createGame,start:start,reset:stop,replay:newMaze,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,i)=>{const r=getLayout(t,s,i);return setLayout(e,r),r.size+r.cell*WALL_THICKNESS+2*BORDER},drag:drag,sounds:SOUNDS,onStart:e=>{r(!1),e(SOUNDS.START,HapticType.MEDIUM)},onStop:e=>e(null),onPlayAgain:()=>r(!1),wire:(e,t)=>{e.onCard=()=>r(!0),e.onTime=s,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}});return _0x1407e2(EngineGameScreen,{...m,light:LIGHT,columns:[timerColumn(t,a)],subtext:"Swipe to roll!",gameOver:i?S({title:"win"===o?"MAZE COMPLETE!":"TIME UP!",message:"win"===o?"You found the exit!":"You ran out of time!",scoreLabel:"win"===o?"Score":"Time's Up!",score:n.score,formatter:"win"===o?void 0:timeUpText,buttonText:"win"===o?"Navigate Again!":"Try Again!"}):null})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,Path,quat,recolor,shapeGeometry}from"@nayan-ui/engine";import{PRIMARY_COLOR}from"../../services/GamesConstants.js";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,Path,quat,recolor,shapeGeometry}from"@nayan-ui/engine";import{PRIMARY_COLOR}from"../../services/GamesConstants.js";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{cacheGameAsset,createGameMesh as _0x129230}from"../shared/EngineMeshes.js";import{placeTiltedBackdrop}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{BALL_SIZE,BORDER,cellPoint,COLORS,WALL_HEIGHT,WALL_THICKNESS}from"./MazeRunnerConstants.js";import{DOWN,isOpen,RIGHT}from"./MazeRunnerRules.js";const meshes=new Map,cached=(e,o)=>{let l=meshes.get(e);return!l&&(l=cacheGameAsset("maze-runner/MazeRunnerScene:"+e,o),meshes.set(e,l)),l},STAND_UP=quat.x(Math.PI/2),BOARD_DEPTH=8,BACKDROP_DEPTH=25,PAD_HEIGHT=.05,WIN_GLOW=[1.3,1.15,.55,1],RISE_STEP=.012,ballMesh=()=>cached("mr-ball",()=>{const e=toColor(COLORS.BALL),o=toColor(COLORS.BALL_BAND),l=toColor(COLORS.BALL_DOT);return _0x129230(recolor(shapeGeometry("sphere"),({position:[s,t,n]})=>{const a=Math.hypot(s,t,n)||1;return Math.abs(n/a)<.2?o:Math.abs(s/a)>.86?l:e}),{shine:.9})}),panelMesh=(e,o)=>cached("mr-panel:"+e+":"+o,()=>_0x129230(extrude((new Path).addRoundedRect(-e/2,-e/2,e,e,o),{depth:8}),{shine:.2})),floorColor=e=>toColor("classic"===e.mode?PRIMARY_COLOR+"30":e.BOARD.SURFACE),pad=(e,o,l,s,t,n,a=0)=>{const[r,i]=cellPoint(o,l+.5,s+.5),p=.05*o.cell;return e.spawn({mesh:"cylinder",position:[r,i,p/2+a],rotation:STAND_UP,scale:[o.cell*t,p,o.cell*t],color:toColor(n),pickable:!1})};export function buildScene(e,o,l,s){const t=spawnBackdrop(e,o.width,o.height,-25,l);placeTiltedBackdrop(e,t,o,25);const n="classic"===l.mode,a=e.spawn({mesh:panelMesh(o.size+2*BORDER,n?12:8),position:[0,0,-4],color:floorColor(l),pickable:!1}),r=n?e.spawn({mesh:panelMesh(o.size,8),position:[0,0,-3.7],color:toColor(PRIMARY_COLOR+"25"),pickable:!1}):null,i=o.n-1,p=[pad(e,o,0,0,.72,COLORS.START),pad(e,o,0,0,.32,COLORS.START_INNER,.05*o.cell),pad(e,o,i,i,.72,COLORS.GOAL),pad(e,o,i,i,.32,COLORS.GOAL_INNER,.05*o.cell)],[m,h]=cellPoint(o,i+.5,i+.5),d=e.spawn({mesh:"torus",position:[m,h,.22*o.cell],rotation:STAND_UP,scale:.62*o.cell,color:toColor(COLORS.GOAL),pickable:!1});e.animate(d,{scale:.62*o.cell*1.12},{duration:.9,easing:"easeInOut",repeat:"forever",yoyo:!0});const u=o.cell*BALL_SIZE,f={backdrop:t,floor:a,inner:r,walls:[],pads:p,ring:d,ball:e.spawn({mesh:ballMesh(),scale:u,pickable:!1}),spin:[0,0,0,1]};return setMaze(e,o,f,s,!1),f}export function removeScene(e,o){for(const l of[o.backdrop,o.floor,o.inner,...o.walls,...o.pads,o.ring,o.ball])null!=l&&e.despawn(l)}export function setSceneTheme(e,o,l,s){setBackdropTheme(e,l.backdrop,s);const t="classic"===s.mode;e.set(l.floor,{mesh:panelMesh(o.size+2*BORDER,t?12:8),color:floorColor(s)}),null!=l.inner&&e.set(l.inner,{scale:t?1:0})}function wallRuns(e,o){const l=[],s=(l,s,t)=>0===s||s===o||(l?!isOpen(e,o,t,s-1,DOWN):!isOpen(e,o,s-1,t,RIGHT));for(const e of[!0,!1])for(let t=0;t<=o;t++){let n=-1;for(let a=0;a<=o;a++){const r=a<o&&s(e,t,a);r&&n<0&&(n=a),!r&&n>=0&&(l.push({across:e,line:t,from:n,to:a}),n=-1)}}return l}export function setMaze(e,o,l,s,t){for(const o of l.walls)e.despawn(o);l.walls=[];const n=o.cell*WALL_THICKNESS,a=o.cell*WALL_HEIGHT;wallRuns(s,o.n).forEach((s,r)=>{const i=(s.from+s.to)/2,[p,m]=s.across?cellPoint(o,i,s.line):cellPoint(o,s.line,i),h=(s.to-s.from)*o.cell+n,d=s.across?[h,n,a]:[n,h,a],u=toColor(COLORS.WALLS[r%COLORS.WALLS.length]),f=e.spawn({mesh:"roundedBox",position:[p,m,t?0:a/2],scale:t?[d[0],d[1],.01]:d,color:u,pickable:!1});if(t){const l=.012*Math.hypot(s.across?i:s.line,s.across?s.line:i)*o.n;e.animate(f,{position:[p,m,a/2],scale:d},{duration:.28,delay:.25*l,easing:"back"})}l.walls.push(f)})}export function placeBall(e,o,l,s,t,n,a){const r=o.cell*BALL_SIZE/2,[i,p]=cellPoint(o,s,t),[m,h]=cellPoint(o,n,a),d=i-m,u=p-h,f=Math.hypot(d,u);f>1e-6&&(l.spin=quat.multiply(quat.axisAngle(-u/f,d/f,0,f/r),l.spin)),e.set(l.ball,{position:[i,p,r],rotation:l.spin})}export function resetBall(e,o,l){e.stopAnimation(l.ball),e.set(l.ball,{scale:o.cell*BALL_SIZE,color:[1,1,1,1]})}export function bump(e,o,l){e.animate(l.ball,{shake:.06*o.cell},{duration:.18})}export function celebrate(e,o,l){const s=o.cell*BALL_SIZE;e.set(l.ball,{color:WIN_GLOW}),e.animate(l.ball,[{scale:1.5*s,at:.4},{scale:1.15*s}],{duration:.5,easing:"easeOut"});const[t,n]=cellPoint(o,o.n-.5,o.n-.5);effects.sparkle(e,{position:[t,n,o.cell],count:30,size:.12*o.cell,speed:5*o.cell,lifetime:1,gravity:6*-o.cell,colors:["#FFD700","#4CAF50","#2196F3","#FF5722"].map(e=>toColor(e))}),effects.confetti(e,{position:[0,0,o.cell],count:50,size:.14*o.cell,speed:1.3*o.size,lifetime:1.3,gravity:2.2*-o.size,colors:["#FFD700","#E91E63","#4ECDC4","#FFEB3B"].map(e=>toColor(e))})}export function timeUp(e,o){e.animate(o.ball,{color:[.55,.55,.6,1]},{duration:.4})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{GAME_DURATION,getLayout,LIGHT}from"./MemoryMatchConstants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./MemoryMatchGame.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{GAME_DURATION,getLayout,LIGHT}from"./MemoryMatchConstants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./MemoryMatchGame.js";import{jsx as _0x2b9053}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.MEMORY_MATCH,FEEDBACK={flip:{sound:SOUNDS.FLIP,haptic:HapticType.LIGHT},match:{sound:SOUNDS.MATCH,haptic:HapticType.SUCCESS},wrong:{sound:SOUNDS.WRONG,haptic:HapticType.WARNING},win:{sound:SOUNDS.WIN,haptic:HapticType.SUCCESS},lose:{sound:SOUNDS.GAME_OVER,haptic:HapticType.ERROR}};export const MemoryMatch=engineGame(GAME_IDS.MEMORY_MATCH,e=>{const[t,s]=useLiveState(0),[a,r]=useLiveState(null),[o,i]=useLiveState(GAME_DURATION),{game:n,theme:m,status:S,screen:u,gameOver:p}=useEngineGame(e,{gameId:GAME_IDS.MEMORY_MATCH,create:createGame,start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,a)=>{const r=getLayout(t,s,a,isTablet);return setLayout(e,r),r.boardW},drag:drag,sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.MEDIUM),wire:(e,t)=>{e.onScore=s,e.onPairs=(e,t)=>r({matched:e,total:t}),e.onTime=i,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}}),{matched:E,total:M}=a??{matched:0,total:n.totalPairs};return _0x2b9053(EngineGameScreen,{...u,light:LIGHT,columns:[scoreColumn(t),textColumn("PAIRS",E+"/"+M),timerColumn(o,m)],subtext:"Find every matching pair!",gameOver:p({title:"win"===S?"ALL MATCHED!":"TIME UP!",message:"win"===S?"You found every pair!":"You ran out of time!",scoreLabel:"Score",score:t,buttonText:"Play Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,merge,Path,quat,recolor}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{spawnRaisedBlock}from"../shared/EngineBlocks.js";import{getFruit}from"../shared/EngineFruits.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,merge,Path,quat,recolor}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{spawnRaisedBlock}from"../shared/EngineBlocks.js";import{getFruit}from"../shared/EngineFruits.js";import{cacheGameAsset,createGameMesh as _0x2c1a6e}from"../shared/EngineMeshes.js";import{placeTiltedBackdrop}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{cardCentre,COLORS,FACE_SIZE,FLIP_TIME,FRUIT_DETAIL,FRUIT_SIZE,THICKNESS}from"./MemoryMatchConstants.js";import{FRUIT_SYMBOLS}from"./MemoryMatchRules.js";const meshes=new Map,cached=(e,o)=>{let t=meshes.get(e);return!t&&(t=cacheGameAsset("memory-match/MemoryMatchScene:"+e,o),meshes.set(e,t)),t},BACKDROP_DEPTH=30,RADIUS=.16,FACE_UP=[0,0,0,1],FACE_DOWN=quat.y(Math.PI),EDGE_ON=quat.y(Math.PI/2),square=(e,o=new Path)=>o.addRoundedRect(-.5+e,-.5+e,1-2*e,1-2*e,Math.max(.01,.16-e)),flat=(e,o,t)=>({geometry:extrude(e,{depth:0,fillRule:"evenodd"}),position:[0,0,o],color:t}),outline=(e,o)=>square(e+o,square(e)),backMesh=()=>cached("mm-back",()=>{const e=toColor(COLORS.BACK_TOP),o=toColor(COLORS.BACK_BOTTOM),t=recolor(extrude(square(.012),{depth:0}),({position:[t,a]})=>{const r=Math.max(0,Math.min(1,(t+.5+(.5-a))/2));return[e[0]+(o[0]-e[0])*r,e[1]+(o[1]-e[1])*r,e[2]+(o[2]-e[2])*r,1]}),a=extrude((new Path).addRoundedRect(-.12,-.165,.24,.33,.04),{depth:.008}),r=new Path;for(const e of[-.35,.35])for(const o of[-.35,.35])r.addCircle(e,o,.012);const s=merge([{geometry:t},flat(outline(.065,.009),.002,toColor(COLORS.BACK_BORDER)),flat((new Path).addCircle(0,0,.275),.003,toColor(COLORS.BACK_HALO)),flat(r,.003,toColor(COLORS.BACK_BORDER)),{geometry:a,position:[-.065,.025,.009],rotation:quat.z(.2),color:toColor(COLORS.BACK_PAIR)},{geometry:a,position:[.065,-.025,.022],rotation:quat.z(-.18),color:toColor(COLORS.BACK_MOTIF)},flat((new Path).addCircle(.065,.025,.035),.028,toColor(COLORS.BACK_TOP))]);return _0x2c1a6e(merge([{geometry:s,rotation:FACE_DOWN,position:[0,0,-THICKNESS/2-.002]}]),{center:!1,shine:0})}),frontMesh=()=>cached("mm-front",()=>_0x2c1a6e(extrude(outline(.065,.01),{depth:0,fillRule:"evenodd"}),{center:!1,shine:0})),sealMesh=()=>cached("mm-seal",()=>_0x2c1a6e(merge([flat((new Path).addCircle(0,0,.075),0,toColor(COLORS.MATCHED_BADGE)),flat((new Path).addPolygon([[-.037,0],[-.012,.025],[.04,-.027],[.029,-.038],[-.012,.003],[-.026,-.011]]),.002,[1,1,1,1])]),{center:!1,shine:0})),SURFACE=0,restZ=e=>0+e.card*THICKNESS/2,frontColor=e=>toColor("matched"===e?COLORS.CARD_MATCHED:COLORS.CARD_FRONT),borderColor=e=>toColor("matched"===e?COLORS.MATCHED_BORDER:COLORS.FRONT_BORDER);function fruitFit(e,o){const t=getFruit(FRUIT_SYMBOLS[e],FRUIT_DETAIL),a=Math.tan(o),r=FRUIT_SIZE/Math.max(t.whole.size[0],t.whole.size[1]+t.whole.size[2]*a),s=t.whole.size[2]*r/2+.01;return{model:t.whole,scale:r,position:[-t.center[0]*r,-t.center[1]*r-s*a,THICKNESS/2+s-t.center[2]*r]}}function spawnCard(e,o,t,a){const[r,s]=cardCentre(o,t),n="down"!==a.state,i=e.spawn({mesh:"none",position:[r,s,restZ(o)],rotation:n?FACE_UP:FACE_DOWN,scale:o.card,pickable:!1}),d=spawnRaisedBlock(e,{parent:i,position:[0,0,THICKNESS/4],size:[1,1,THICKNESS/2],color:frontColor(a.state),gloss:!1,shadow:!1}),l=spawnRaisedBlock(e,{parent:i,position:[0,0,-THICKNESS/4],size:[1,1,THICKNESS/2],color:toColor(COLORS.BACK_BOTTOM),gloss:!1,shadow:!1});e.set(l,{rotation:FACE_DOWN});const C=e.spawn({mesh:backMesh(),parent:i,scale:[FACE_SIZE,FACE_SIZE,1],pickable:!1}),m=e.spawn({mesh:frontMesh(),parent:i,position:[0,0,THICKNESS/2+.002],scale:[FACE_SIZE,FACE_SIZE,1],color:borderColor(a.state),pickable:!1}),p=e.spawn({mesh:sealMesh(),parent:i,position:[.34*FACE_SIZE,.34*FACE_SIZE,THICKNESS/2+.006],scale:"matched"===a.state?FACE_SIZE:0,pickable:!1}),h=fruitFit(a.symbol,o.tilt);return{root:i,body:d,backBody:l,back:C,front:m,seal:p,fruit:e.spawn({mesh:h.model,parent:i,position:h.position,scale:n?h.scale:0,pickable:!1}),fruitScale:h.scale}}export function buildScene(e,o,t,a){const r=spawnBackdrop(e,o.width,o.height,-30,t);return placeTiltedBackdrop(e,r,o,30),{backdrop:r,cards:a.map((t,a)=>spawnCard(e,o,a,t))}}export function removeScene(e,o){for(const t of[o.backdrop,...o.cards.map(e=>e.root)])e.despawn(t)}export function setSceneTheme(e,o,t){setBackdropTheme(e,o.backdrop,t)}export function deal(e,o,t,a){a.forEach((a,r)=>{const s=t.cards[r];s&&e.despawn(s.root);const n=spawnCard(e,o,r,a);t.cards[r]=n,e.set(n.root,{scale:.01}),e.animate(n.root,{scale:o.card},{duration:.26,delay:.022*r,easing:"back"})})}export function flip(e,o,t,a,r){const s=t.cards[a];if(!s)return;const[n,i]=cardCentre(o,a),d=restZ(o);e.stopAnimation(s.root),e.animate(s.root,[{rotation:EDGE_ON,position:[n,i,d+.28*o.card],at:.5},{rotation:r?FACE_UP:FACE_DOWN,position:[n,i,d]}],{duration:FLIP_TIME,easing:"easeInOut"}),e.stopAnimation(s.fruit),r?(e.set(s.fruit,{scale:0}),e.animate(s.fruit,{scale:s.fruitScale},{duration:FLIP_TIME/2,delay:FLIP_TIME/2,easing:"easeOut"})):e.animate(s.fruit,{scale:0},{duration:FLIP_TIME/2,easing:"easeIn"})}export function matched(e,o,t,a){const r=t.cards[a];r&&(e.set(r.body,{color:frontColor("matched")}),e.set(r.front,{color:borderColor("matched")}),e.animate(r.seal,{scale:FACE_SIZE},{duration:.18,delay:FLIP_TIME,easing:"back"}),e.animate(r.root,[{scale:1.04*o.card,at:.4},{scale:o.card}],{duration:.32,delay:FLIP_TIME,easing:"easeOut"}))}export function mismatch(e,o,t,a){const r=t.cards[a];r&&e.animate(r.root,{shake:.06*o.card},{duration:.26,delay:FLIP_TIME})}export function celebrate(e,o,t){e.animate(t.cards.map(e=>e.root),[{scale:1.05*o.card,at:.4},{scale:o.card}],{duration:.32,delay:.25,stagger:.035,easing:"easeOut"}),effects.confetti(e,{position:[0,0,o.card],count:70,size:.08*o.card,speed:1.4*o.boardW,lifetime:1.3,gravity:2.4*-o.boardW,colors:["#FFD700","#4CAF50","#5b7cfa","#FF6B6B"].map(e=>toColor(e))})}export function timeUp(e,o,t){const a=[];t.forEach((e,t)=>{const r=o.cards[t];r&&"matched"!==e.state&&a.push(r.body,r.backBody,r.back)}),e.animate(a,{color:[.55,.55,.6,1]},{duration:.4})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{boardFor,getLayout,LIGHT,TIME_LIMIT}from"./MineSweeperConstants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./MineSweeperGame.js";import{jsx as
|
|
1
|
+
"use strict";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS,isTablet}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn,timerColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{boardFor,getLayout,LIGHT,TIME_LIMIT}from"./MineSweeperConstants.js";import{createGame,dispose,drag,reset,setLayout,setTheme,start,tick}from"./MineSweeperGame.js";import{jsx as _0x3b76ba}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.MINE_SWEEPER,BOARD=boardFor(isTablet),FEEDBACK={reveal:{sound:SOUNDS.REVEAL,haptic:HapticType.LIGHT},flag:{sound:SOUNDS.FLAG,haptic:HapticType.MEDIUM},mine:{sound:SOUNDS.MINE_HIT,haptic:HapticType.ERROR}};export const MineSweeper=engineGame(GAME_IDS.MINE_SWEEPER,e=>{const[t,s]=useLiveState(0),[i,r]=useLiveState(TIME_LIMIT),[a,n]=useLiveState(BOARD.mines),{theme:o,status:m,screen:S,gameOver:E}=useEngineGame(e,{gameId:GAME_IDS.MINE_SWEEPER,create:e=>createGame(e,BOARD),start:start,reset:reset,dispose:dispose,tick:tick,setTheme:setTheme,resize:(e,t,s,i)=>{const r=getLayout(t,s,i,BOARD);return setLayout(e,r),r.boardWidth},drag:drag,sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.SUCCESS),onStop:e=>e(null,HapticType.MEDIUM),onOver:(e,t)=>e("win"===t?SOUNDS.WIN:SOUNDS.GAME_OVER,"win"===t?HapticType.SUCCESS:HapticType.ERROR),wire:(e,t)=>{e.onScore=s,e.onTime=r,e.onMines=n,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}});return _0x3b76ba(EngineGameScreen,{...S,light:LIGHT,columns:[scoreColumn(t),textColumn("MINES",a),timerColumn(i,o)],subtext:"Reveal cells, flag mines!",gameOver:E({title:"win"===m?"YOU WON!":"BOOM!",message:"win"===m?"All mines cleared!":"You hit a mine!",scoreLabel:"Final Score",score:t,buttonText:"Sweep Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry,tube}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{GLYPH_RADIUS,glyphMesh}from"../shared/EngineGlyphs.js";import{cacheGameAsset,createGameMesh as
|
|
1
|
+
"use strict";import{effects,extrude,lathe,merge,Path,quat,shapeGeometry,tube}from"@nayan-ui/engine";import{setBackdropTheme,spawnBackdrop}from"../shared/EngineBackdrop.js";import{GLYPH_RADIUS,glyphMesh}from"../shared/EngineGlyphs.js";import{cacheGameAsset,createGameMesh as _0x38f695}from"../shared/EngineMeshes.js";import{placeTiltedBackdrop}from"../shared/EngineTilt.js";import{toColor}from"../shared/EngineUtils.js";import{cellCentre,COLORS,NUMBER_COLORS,REVEAL_STEP}from"./MineSweeperConstants.js";import{CellState}from"./MineSweeperRules.js";const meshes=new Map,cached=(e,o)=>{let t=meshes.get(e);return!t&&(t=cacheGameAsset("mine-sweeper/MineSweeperScene:"+e,o),meshes.set(e,t)),t},STAND_UP=quat.x(Math.PI/2),BOARD_DEPTH=10,BACKDROP_DEPTH=25,RAISED=.32,SUNK=.08,mineMesh=()=>cached("ms-mine",()=>{const e=lathe([[.07,0],[.04,.14],[.001,.2]],{segments:10}),o=[{geometry:shapeGeometry("sphere"),position:[0,0,.32],scale:.48,color:[.12,.12,.14,1]}];for(let t=0;t<8;t++){const l=t/8*Math.PI*2,s=t%2?.45:-.45,a=quat.multiply(quat.z(l),quat.multiply(quat.y(Math.PI/2+s),STAND_UP));o.push({geometry:e,position:[.2*Math.cos(l),.2*Math.sin(l),.32+.3*s],rotation:a,color:[.2,.2,.22,1]})}return o.push({geometry:shapeGeometry("sphere"),position:[-.08,.08,.5],scale:.09,color:[.9,.9,.95,1]}),_0x38f695(merge(o),{center:!1,shine:.8})}),flagMesh=()=>cached("ms-flag",()=>{const e=extrude((new Path).moveTo(0,0).lineTo(.36,.12).lineTo(0,.26).close(),{depth:.03});return _0x38f695(merge([{geometry:lathe([[.001,.05],[.18,.05],[.2,0],[.001,0]],{segments:18}),rotation:STAND_UP,color:[.33,.33,.33,1]},{geometry:tube([[-.06,0,.04],[-.06,0,.72]],{radius:.03,sides:8}),color:toColor("#8B4513")},{geometry:e,position:[-.06,0,.72],rotation:STAND_UP,color:toColor("#E74C3C")}]),{center:!1,shine:.4})}),panelMesh=(e,o,t)=>cached("ms-panel:"+e+"x"+o+":"+t,()=>_0x38f695(extrude((new Path).addRoundedRect(-e/2,-o/2,e,o,t),{depth:10}),{shine:.2})),alt=(e,o)=>(e+o)%2==1,hiddenColor=(e,o)=>toColor(alt(e,o)?COLORS.HIDDEN_ALT:COLORS.HIDDEN),revealedColor=e=>toColor(e.isMine?COLORS.MINE:alt(e.row,e.col)?COLORS.REVEALED_ALT:COLORS.REVEALED),panelColor=e=>toColor("classic"===e.mode?COLORS.CLASSIC_BOARD:e.BOARD.SURFACE);export function buildScene(e,o,t,l){const s=spawnBackdrop(e,o.width,o.height,-25,t);placeTiltedBackdrop(e,s,o,25);const a="classic"===t.mode,r=e.spawn({mesh:panelMesh(o.boardWidth,o.boardHeight,a?12:8),position:[0,0,-5],color:panelColor(t),pickable:!1}),n=a?e.spawn({mesh:panelMesh(o.gridWidth,o.gridHeight,8),position:[0,0,-4.7],color:toColor(COLORS.CLASSIC_GRID),pickable:!1}):null,i=[],p=[];for(const t of l)for(const l of t){const[t,s]=cellCentre(o,l.row,l.col),a=l.state===CellState.REVEALED,r=o.cell*(a?.08:.32);i.push(e.spawn({mesh:"roundedBox",position:[t,s,r/2],scale:[o.cell,o.cell,r],color:a?revealedColor(l):hiddenColor(l.row,l.col),pickable:!1})),p.push(null)}const h={backdrop:s,panel:r,grid:n,tiles:i,marks:p};for(const t of l)for(const l of t)mark(e,o,h,l,!1);return h}export function removeScene(e,o){for(const t of[o.backdrop,o.panel,o.grid,...o.tiles,...o.marks])null!=t&&e.despawn(t)}export function setSceneTheme(e,o,t,l){setBackdropTheme(e,t.backdrop,l),e.set(t.panel,{mesh:panelMesh(o.boardWidth,o.boardHeight,"classic"===l.mode?12:8),color:panelColor(l)}),null!=t.grid&&e.set(t.grid,{scale:"classic"===l.mode?1:0})}const at=(e,o,t)=>{const[l,s]=cellCentre(e,o.row,o.col);return[l,s,t]};function mark(e,o,t,l,s,a=0){const r=l.row*o.cols+l.col,n=t.marks[r];null!=n&&e.despawn(n),t.marks[r]=null;let i=null;if(l.state===CellState.FLAGGED)i=e.spawn({mesh:flagMesh(),position:at(o,l,.32*o.cell),scale:.8*o.cell,pickable:!1});else if(l.state===CellState.REVEALED&&l.isMine)i=e.spawn({mesh:mineMesh(),position:at(o,l,.08*o.cell),scale:.85*o.cell,pickable:!1});else if(l.state===CellState.REVEALED&&l.adjacentMines>0){const t=.56*o.cell;i=e.spawn({mesh:glyphMesh(String(l.adjacentMines)),position:at(o,l,.08*o.cell+GLYPH_RADIUS*t),scale:t,color:toColor(NUMBER_COLORS[l.adjacentMines]),pickable:!1})}if(t.marks[r]=i,null!=i&&s){const t=l.state===CellState.FLAGGED?.8*o.cell:l.state===CellState.REVEALED&&l.isMine?.85*o.cell:.56*o.cell;e.set(i,{scale:.01}),e.animate(i,{scale:t},{duration:.22,delay:a,easing:"back"})}}export function reveal(e,o,t,l,s){for(const a of l){const l=Math.hypot(a.row-s.row,a.col-s.col)*REVEAL_STEP,r=t.tiles[a.row*o.cols+a.col],n=.08*o.cell;e.animate(r,{position:at(o,a,n/2),scale:[o.cell,o.cell,n],color:revealedColor(a)},{duration:.16,delay:l,easing:"easeIn"}),mark(e,o,t,a,!0,l+.1)}}export function flag(e,o,t,l){mark(e,o,t,l,!0)}export function explode(e,o,t,l,s,a){reveal(e,o,t,a,s);const[r,n]=cellCentre(o,s.row,s.col);effects.explosion(e,{position:[r,n,.4*o.cell],count:28,size:.9*o.cell,speed:4*o.cell,lifetime:.6,direction:[0,0,1],spread:1.4,debris:[toColor("#3E4A58"),toColor("#8D6E63"),toColor("#5A5A5A")]}),l.shake=.25*o.cell}export function celebrate(e,o){effects.confetti(e,{position:[0,0,o.cell],count:60,size:.2*o.cell,speed:1.4*o.boardWidth,lifetime:1.3,gravity:2.4*-o.boardWidth,colors:["#FFD700","#4CAF50","#2196F3","#E74C3C"].map(e=>toColor(e))})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{useMemo}from"react";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{DAY_LIGHT,MOB_COLORS,MOB_CONFIG as
|
|
1
|
+
"use strict";import{useMemo}from"react";import{HapticType}from"../../services/HapticsService.js";import{GAME_SOUNDS}from"../../services/SoundsService.js";import{GAME_IDS}from"../../services/UtilsService.js";import{engineGame,EngineGameScreen}from"../shared/EngineGameScreen.js";import{scoreColumn,textColumn}from"../shared/EngineHud.js";import{useEngineGame}from"../shared/useEngineGame.js";import{useLiveState}from"../shared/useLiveState.js";import{DAY_LIGHT,MOB_COLORS,MOB_CONFIG as _0x35f15e,NIGHT_LIGHT,SKY_DAY,SKY_NIGHT}from"./MobControlConstants.js";import{aim,createGame,dispose,INITIAL_HUD,replay,reset,setActive,setLayout,setTheme,start,tick}from"./MobControlGame.js";import{jsx as _0x508bef}from"react/jsx-runtime";const SOUNDS=GAME_SOUNDS.MOB_CONTROL,FEEDBACK={shoot:{sound:SOUNDS.SHOOT},gate:{sound:SOUNDS.GATE,haptic:HapticType.LIGHT},hit:{sound:SOUNDS.HIT},clash:{sound:SOUNDS.CLASH,haptic:HapticType.LIGHT},boss:{sound:SOUNDS.LEVEL_UP,haptic:HapticType.SUCCESS},damage:{sound:SOUNDS.DAMAGE,haptic:HapticType.WARNING},champion:{sound:SOUNDS.LEVEL_UP,haptic:HapticType.HEAVY},win:{sound:GAME_SOUNDS.WELL_DONE,haptic:HapticType.SUCCESS},lose:{sound:SOUNDS.GAME_OVER,haptic:HapticType.ERROR}};export const MobControl=engineGame(GAME_IDS.MOB_CONTROL,e=>{const[t,s]=useLiveState(INITIAL_HUD,0),{game:o,theme:r,status:a,screen:i,gameOver:n}=useEngineGame(e,{gameId:GAME_IDS.MOB_CONTROL,create:createGame,start:start,reset:reset,replay:replay,dispose:dispose,tick:tick,setTheme:setTheme,setActive:setActive,resize:setLayout,drag:(e,t)=>{t.cancelled||"end"===t.phase||aim(e,t.x)},sounds:SOUNDS,onStart:e=>e(SOUNDS.START,HapticType.SUCCESS),resultsDelay:e=>"win"===e?1300:650,wire:(e,t)=>{e.onHud=s,e.onEvent=e=>t(FEEDBACK[e].sound,FEEDBACK[e].haptic)}}),m="dark"===r.mode,S=Math.ceil(t.hp/_0x35f15e.PLAYER_HP*100),p=useMemo(()=>m?NIGHT_LIGHT:DAY_LIGHT,[m]);return _0x508bef(EngineGameScreen,{...i,source:o.renderer,light:p,background:m?SKY_NIGHT:SKY_DAY,fog:.007,columns:[scoreColumn(t.score),textColumn("SHIELD",S+"%",MOB_COLORS.HP_PLAYER),textColumn("ARMY",t.army)],subtext:"Aim and grow mobs!",gameOver:n({title:"win"===a?"LEVEL CLEARED!":"DEFENSE BREACHED",message:"win"===a?"Level "+t.level+" conquered! "+S+"% shield remaining.":"Your cannon fell in level "+t.level+". Chain multiplier gates and use your champion to stop the red mob.",scoreLabel:"Battle Score",score:t.score,buttonText:"win"===a?"Next Level!":"Try Again!"})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{World}from"@nayan-ui/engine";import{MOB_CONFIG as
|
|
1
|
+
"use strict";import{World}from"@nayan-ui/engine";import{MOB_CONFIG as _0x3e8f88}from"./MobControlConstants.js";import{unitMeshes}from"./MobControlMeshes.js";import{MobControlRenderer}from"./MobControlRenderer.js";import{createSim,step}from"./MobControlRules.js";import{battleEffect,buildScene,captured,celebrate,makeView,recoil,removeScene,syncScene}from"./MobControlScene.js";export const INITIAL_HUD={score:0,hp:_0x3e8f88.PLAYER_HP,army:0,level:1};export function createGame(e){const n=new World(_0x3e8f88.WORLD_CAPACITY);return{world:n,renderer:new MobControlRenderer(n,unitMeshes()),sim:createSim(),camera:{eye:[0,19,15],target:[0,0,-13],fov:.9},night:"dark"===e.mode,view:null,scene:null,phase:"ready",won:!1,active:!0,pending:0,clock:0,lastHud:-1,lastEffect:-1,hudKey:"",feedback:{},get score(){return this.sim.score},onPhase:e=>{},onHud:e=>{},onEvent:e=>{}}}export function setLayout(e,n,o){e.world.isDisposed||n<=0||o<=0||(e.view=makeView(n,o,e.camera),e.scene||(e.scene=buildScene(e.world,e.night,e.sim)),syncScene(e.world,e.scene,e.sim,!0),e.world.update(0),e.renderer.sync(e.sim,1,e.clock))}export function setTheme(e,n){const o="dark"===n.mode;e.world.isDisposed||o===e.night||(e.night=o,e.scene&&(removeScene(e.world,e.scene),e.scene=buildScene(e.world,e.night,e.sim)))}function publish(e,n=!1){if(!n&&e.clock-e.lastHud<_0x3e8f88.HUD_INTERVAL)return!1;e.lastHud=e.clock;const o=e.sim,s=o.score+"/"+o.hp+"/"+o.playerStrength+"/"+o.level;return s!==e.hudKey&&(e.hudKey=s,e.onHud({score:o.score,hp:o.hp,army:o.playerStrength,level:o.level})),!0}export function reset(e){resetLevel(e,e.sim.level)}export function replay(e){resetLevel(e,e.sim.level+(e.won?1:0))}function resetLevel(e,n){e.world.isDisposed||(e.sim=createSim(void 0,n),e.won=!1,e.pending=0,e.camera.shake=0,e.hudKey="",e.feedback={},e.world.cancelTimers(),e.scene&&(e.world.stopAnimation(e.scene.barrel),e.world.set(e.scene.barrel,{position:[0,.92,-.1]}),syncScene(e.world,e.scene,e.sim,!0)),e.phase="ready",publish(e,!0),e.onPhase("ready"),e.world.update(0),e.renderer.sync(e.sim,1,e.clock))}export function start(e){!e.world.isDisposed&&e.scene&&"ready"===e.phase&&(e.pending=0,e.phase="playing",e.onPhase("playing"))}export function aim(e,n){!e.world.isDisposed&&e.active&&"playing"===e.phase&&e.view&&(e.sim.targetX=Math.max(-_0x3e8f88.CANNON_LIMIT,Math.min(_0x3e8f88.CANNON_LIMIT,(n-e.view.width/2)/e.view.k)))}export function setActive(e,n){e.active=n,e.pending=0}export function dispose(e){e.world.isDisposed||(e.renderer.dispose(),e.world.dispose())}function emit(e,n,o=0){e.clock-(e.feedback[n]??-100)<o||(e.feedback[n]=e.clock,e.onEvent(n))}export function tick(e,n){if(e.world.isDisposed||!e.active||!Number.isFinite(n)||n<0)return;if(n=Math.min(n,_0x3e8f88.MAX_FRAME),e.clock+=n,"playing"===e.phase)for(e.pending=Math.min(e.pending+n,_0x3e8f88.MAX_FRAME+_0x3e8f88.STEP);"playing"===e.phase&&e.pending+1e-9>=_0x3e8f88.STEP;)e.pending=Math.max(0,e.pending-_0x3e8f88.STEP),apply(e);const o=publish(e);e.scene&&syncScene(e.world,e.scene,e.sim,o),e.world.update(n),e.renderer.sync(e.sim,"playing"===e.phase?Math.min(1,e.pending/_0x3e8f88.STEP):1,e.clock)}function apply(e){const n=step(e.sim,_0x3e8f88.STEP),o=e.scene;if(n.shots&&(emit(e,"shoot"),o&&recoil(e.world,o)),n.gates&&emit(e,"gate",.14),n.champion&&emit(e,"champion"),n.bossDefeated&&!n.won&&(emit(e,"boss"),celebrate(e.world)),n.clashes&&emit(e,"clash",.15),n.hits&&emit(e,"hit",.13),n.breaches&&(e.camera.shake=.18,emit(e,"damage",.35)),o&&n.captured)for(let n=0;n<e.sim.bases.length;n++)0!==e.sim.bases[n].hp||o.bases[n].captured||captured(e.world,e.sim.bases[n].x,e.sim.bases[n].z);if(n.won&&celebrate(e.world),n.effectCount&&e.clock-e.lastEffect>=_0x3e8f88.EFFECT_INTERVAL){e.lastEffect=e.clock;for(let o=0;o<Math.min(2,n.effectCount);o++)battleEffect(e.world,n.effectX[o],n.effectZ[o],1===n.effectTeam[o])}(n.won||n.lost)&&(e.won=n.won,e.phase="over",publish(e,!0),emit(e,n.won?"win":"lose"),e.onPhase("over"))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{merge,tube}from"@nayan-ui/engine";import{createGameMesh as
|
|
1
|
+
"use strict";import{merge,tube}from"@nayan-ui/engine";import{createGameMesh as _0x4b6864}from"../shared/EngineMeshes.js";const PHI=(1+Math.sqrt(5))/2,POINTS=[[-1,PHI,0],[1,PHI,0],[-1,-PHI,0],[1,-PHI,0],[0,-1,PHI],[0,1,PHI],[0,-1,-PHI],[0,1,-PHI],[PHI,0,-1],[PHI,0,1],[-PHI,0,-1],[-PHI,0,1]],FACES=[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1];function pebble(e){const s=new Float32Array(11*POINTS.length);return POINTS.forEach((o,t)=>{const r=Math.hypot(...o),n=o[0]/r,i=o[1]/r,p=o[2]/r,a=Math.hypot(n/e[0],i/e[1],p/e[2]);s.set([n*e[0],i*e[1],p*e[2],n/e[0]/a,i/e[1]/a,p/e[2]/a,1,1,1,0,0],11*t)}),{vertices:s,indices:Uint32Array.from(FACES)}}let poses=null;export function unitMeshes(){if(poses)return poses;const e=e=>{const s=[{geometry:pebble([.15,.23,.11]),position:[0,.4,0]},{geometry:pebble([.145,.15,.135]),position:[0,.73,0]},{geometry:pebble([.025,.035,.014]),position:[-.05,.75,.122],color:[.08,.13,.2,1]},{geometry:pebble([.025,.035,.014]),position:[.05,.75,.122],color:[.08,.13,.2,1]}];for(const o of[-1,1])s.push({geometry:tube([[.08*o,.25,0],[.11*o,.055,o*e*.13]],{radius:.055,sides:5,smoothness:1,caps:!0})}),s.push({geometry:tube([[.13*o,.53,0],[.22*o,.31,-o*e*.13]],{radius:.043,sides:5,smoothness:1,caps:!0})});return _0x4b6864(merge(s),{center:!1,shine:.22})};return poses=[e(-1),e(1)],poses}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{getMeshIdLimit}from"@nayan-ui/engine";import{MOB_CONFIG as
|
|
1
|
+
"use strict";import{getMeshIdLimit}from"@nayan-ui/engine";import{MOB_CONFIG as _0x5d8971}from"./MobControlConstants.js";export class MobControlRenderer{count=0;disposed=!1;sizeStrength=new Float64Array(_0x5d8971.CAPACITY).fill(NaN);sizeKind=new Int8Array(_0x5d8971.CAPACITY).fill(-1);sizes=new Float64Array(_0x5d8971.CAPACITY);constructor(s,t){this.world=s,this.poses=t,this.capacity=s.capacity+_0x5d8971.CAPACITY,this.matrices=new Float32Array(16*this.capacity),this.colors=new Float32Array(4*this.capacity),this.regions=new Float32Array(4*this.capacity),this.ranges=new Uint32Array(s.ranges.length)}sync(s,t,i){if(this.disposed)return;this.ranges.fill(0);const e=this.ranges.length/4,r=Math.min(e,Math.max(getMeshIdLimit(),this.poses[0].id+1,this.poses[1].id+1));let h=0;const a=Math.floor(8*i);for(let o=0;o<2;o++)for(let n=0;n<r;n++){const r=o*e*2+2*n,l=h,d=this.world.ranges[r],g=this.world.ranges[r+1];g&&(this.matrices.set(this.world.matrices.subarray(16*d,16*(d+g)),16*h),this.colors.set(this.world.colors.subarray(4*d,4*(d+g)),4*h),this.regions.set(this.world.regions.subarray(4*d,4*(d+g)),4*h),h+=g);const m=n===this.poses[0].id?0:n===this.poses[1].id?1:-1;if(0===o&&m>=0)for(let e=0;e<_0x5d8971.CAPACITY;e++){if(!s.alive[e]||(a+s.ticket[e]&1)!==m)continue;const r=e<_0x5d8971.PLAYER_SLOTS,o=s.x[e]-s.previousX[e],n=s.z[e]-s.previousZ[e],l=Math.abs(o)+Math.abs(n)>1e-5?Math.atan2(o,n):r?Math.PI:0,d=s.kind[e],g=0!==d;(this.sizeStrength[e]!==s.strength[e]||this.sizeKind[e]!==d)&&(this.sizeStrength[e]=s.strength[e],this.sizeKind[e]=d,this.sizes[e]=g?.76*(1===d?2.65:3.5):1.2*(1+Math.min(.42,.055*Math.log2(s.strength[e]))));const p=this.sizes[e],M=Math.sin(l)*p,A=Math.cos(l)*p,y=16*h,w=4*h;this.matrices[y]=A,this.matrices[y+1]=0,this.matrices[y+2]=-M,this.matrices[y+3]=0,this.matrices[y+4]=0,this.matrices[y+5]=p,this.matrices[y+6]=0,this.matrices[y+7]=0,this.matrices[y+8]=M,this.matrices[y+9]=0,this.matrices[y+10]=A,this.matrices[y+11]=0,this.matrices[y+12]=s.previousX[e]+o*t;const f=s.flight[e]>0?Math.min(_0x5d8971.FLIGHT_DURATION,s.flight[e]+(1-t)*_0x5d8971.STEP)/_0x5d8971.FLIGHT_DURATION:0;this.matrices[y+13]=.05+.8*f+.55*Math.sin(f*Math.PI)+.045*Math.abs(Math.sin(12*i+1.7*s.ticket[e])),this.matrices[y+14]=s.previousZ[e]+n*t,this.matrices[y+15]=1,this.colors[w]=1===d?1:r?s.boost[e]>0?.35:.1:.98,this.colors[w+1]=1===d?.78:r?s.boost[e]>0?.95:.63:2===d?.15:.22,this.colors[w+2]=1===d?.22:r?1:.27,this.colors[w+3]=1,this.regions[w]=this.regions[w+1]=0,this.regions[w+2]=this.regions[w+3]=1,h++}h>l&&(this.ranges[r]=l,this.ranges[r+1]=h-l)}this.count=h}setView(s,t,i){this.disposed||this.world.setView(s,t,i)}dispose(){this.disposed=!0,this.count=0,this.ranges.fill(0)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{MOB_CONFIG as _0xc529f1}from"./MobControlConstants.js";const clamp=(e,t,n)=>Math.max(t,Math.min(n,e));function random(e){return e.seed=Math.imul(e.seed,1664525)+1013904223>>>0,e.seed/4294967296}export const isPlayer=e=>e<_0xc529f1.PLAYER_SLOTS;export function createSim(e=Math.floor(4294967295*Math.random()),t=1){const n={alive:new Uint8Array(_0xc529f1.CAPACITY),x:new Float32Array(_0xc529f1.CAPACITY),z:new Float32Array(_0xc529f1.CAPACITY),previousX:new Float32Array(_0xc529f1.CAPACITY),previousZ:new Float32Array(_0xc529f1.CAPACITY),strength:new Uint16Array(_0xc529f1.CAPACITY),gatesPassed:new Uint8Array(_0xc529f1.CAPACITY),ticket:new Uint32Array(_0xc529f1.CAPACITY),kind:new Uint8Array(_0xc529f1.CAPACITY),boost:new Float32Array(_0xc529f1.CAPACITY),flight:new Float32Array(_0xc529f1.CAPACITY),next:new Int16Array(_0xc529f1.CAPACITY),playerGrid:new Int16Array(_0xc529f1.GRID_COLUMNS*_0xc529f1.GRID_ROWS),enemyGrid:new Int16Array(_0xc529f1.GRID_COLUMNS*_0xc529f1.GRID_ROWS),freePlayer:new Uint16Array(_0xc529f1.PLAYER_SLOTS),freeEnemy:new Uint16Array(_0xc529f1.ENEMY_SLOTS),freePlayerCount:0,freeEnemyCount:0,playerCount:0,enemyCount:0,playerStrength:0,enemyStrength:0,championCount:0,bossCount:0,charge:0,serial:0,seed:e>>>0,level:Math.max(1,Math.floor(Number.isFinite(t)?t:1)),elapsed:0,battleClock:0,fireClock:0,cannonX:0,targetX:0,hp:_0xc529f1.PLAYER_HP,score:0,finished:!1,won:!1,gates:[],bases:[],barriers:[],boostPad:null,collisionVisits:0,events:{shots:0,gates:0,clashes:0,hits:0,breaches:0,captured:0,champion:!1,barrierBroken:0,bossDefeated:!1,won:!1,lost:!1,effectCount:0,effectX:new Float32Array(_0xc529f1.MAX_EFFECTS),effectZ:new Float32Array(_0xc529f1.MAX_EFFECTS),effectTeam:new Uint8Array(_0xc529f1.MAX_EFFECTS)}};return prepareLevel(n),n}function clearUnits(e){e.alive.fill(0),e.strength.fill(0),e.kind.fill(0),e.boost.fill(0),e.flight.fill(0),e.freePlayerCount=_0xc529f1.PLAYER_SLOTS,e.freeEnemyCount=_0xc529f1.ENEMY_SLOTS,e.playerCount=e.enemyCount=e.playerStrength=e.enemyStrength=0,e.championCount=e.bossCount=0;for(let t=0;t<_0xc529f1.PLAYER_SLOTS;t++)e.freePlayer[t]=_0xc529f1.PLAYER_SLOTS-1-t;for(let t=0;t<_0xc529f1.ENEMY_SLOTS;t++)e.freeEnemy[t]=_0xc529f1.CAPACITY-1-t}function prepareLevel(e){clearUnits(e),e.battleClock=0,e.fireClock=_0xc529f1.FIRE_INTERVAL,e.charge=0;const t=random(e)>.5,n=(e.level-1)%3+1,r=1===n?1:2===n?2.5:3,o=1===n?[1,2,3,4]:2===n?[3,4,-2,5]:[4,3,6,5];e.gates=o.map((e,r)=>{const o=2.35*(r%2==0!==t?-1:1);return{id:r,x:o,originX:o,z:r<2?-8.5:-16,halfWidth:1.95,factor:e,operation:1===n&&0===r?"add":e<0?"divide":"multiply",moving:n>1&&r>=2,hits:0,remainder:0}}),e.bases=[-3.1,0,3.1].map((e,t)=>{const n=(1===t?_0xc529f1.CORE_HP:_0xc529f1.BASE_HP)*r;return{x:e,z:_0xc529f1.BASE_Z-(1===t?1.2:0),hp:n,maxHp:n,spawnClock:-.4-.32*t}}),e.barriers=1===n?[]:[-2.35,2.35].map(e=>({x:e,z:-22.5,halfWidth:1.5,hp:18*n,maxHp:18*n})),e.boostPad=1===n?null:{x:t?2.35:-2.35,z:-19.1,halfWidth:1.55,halfLength:1.15},3===n&&spawn(e,!1,0,-26.5,_0xc529f1.BOSS_STRENGTH,0,2)}export function spawn(e,t,n,r,o=1,a=0,s=0,f=!1){const i=_0xc529f1.MAX_STRENGTH-(t?e.playerStrength:e.enemyStrength),_=Math.max(0,Math.min(o,i));if(0===_)return-1;const l=t?e.freePlayer:e.freeEnemy,h=t?e.freePlayerCount:e.freeEnemyCount;let x;if(0===h||t&&0===s&&1===h&&0===e.championCount){let o=-1,f=1/0;const i=t?0:_0xc529f1.PLAYER_SLOTS,l=t?_0xc529f1.PLAYER_SLOTS:_0xc529f1.CAPACITY;for(let t=i;t<l;t++){if(!e.alive[t]||e.gatesPassed[t]!==a||e.kind[t]!==s)continue;const i=(e.x[t]-n)**2+(e.z[t]-r)**2;i<f&&(f=i,o=t)}return o<0?-1:(e.strength[o]=e.strength[o]+_,t?e.playerStrength+=_:e.enemyStrength+=_,o)}return x=l[h-1],t?(e.freePlayerCount--,e.playerCount++,e.playerStrength+=_):(e.freeEnemyCount--,e.enemyCount++,e.enemyStrength+=_),e.alive[x]=1,e.strength[x]=_,e.gatesPassed[x]=a,e.kind[x]=s,e.boost[x]=0,e.flight[x]=f?_0xc529f1.FLIGHT_DURATION:0,1===s&&e.championCount++,2===s&&e.bossCount++,e.ticket[x]=++e.serial,e.x[x]=e.previousX[x]=clamp(n,.3-_0xc529f1.HALF_WIDTH,_0xc529f1.HALF_WIDTH-.3),e.z[x]=e.previousZ[x]=r,x}function remove(e,t){e.alive[t]&&(e.alive[t]=0,1===e.kind[t]&&e.championCount--,2===e.kind[t]&&(e.bossCount--,0===e.strength[t]&&(e.events.bossDefeated=!0)),isPlayer(t)?(e.playerStrength-=e.strength[t],e.freePlayer[e.freePlayerCount++]=t,e.playerCount--):(e.enemyStrength-=e.strength[t],e.freeEnemy[e.freeEnemyCount++]=t,e.enemyCount--),e.strength[t]=0)}function effect(e,t,n,r){const o=e.events;if(o.effectCount>=_0xc529f1.MAX_EFFECTS)return;const a=o.effectCount++;o.effectX[a]=t,o.effectZ[a]=n,o.effectTeam[a]=r?1:0}function gridX(e){return clamp(Math.floor((e+_0xc529f1.HALF_WIDTH)/_0xc529f1.GRID_SIZE),0,_0xc529f1.GRID_COLUMNS-1)}function gridZ(e){return clamp(Math.floor(-e/_0xc529f1.GRID_SIZE),0,_0xc529f1.GRID_ROWS-1)}function grid(e){e.playerGrid.fill(-1),e.enemyGrid.fill(-1);for(let t=0;t<_0xc529f1.CAPACITY;t++)if(e.alive[t]){const n=isPlayer(t)?e.playerGrid:e.enemyGrid,r=gridZ(e.z[t])*_0xc529f1.GRID_COLUMNS+gridX(e.x[t]);e.next[t]=n[r],n[r]=t}}function move(e,t){grid(e);let n=-1;if(e.bossCount>0)for(let t=_0xc529f1.PLAYER_SLOTS;t<_0xc529f1.CAPACITY;t++)if(e.alive[t]&&2===e.kind[t]){n=t;break}const r=e.bases.some(e=>e.hp>0);for(let o=0;o<_0xc529f1.CAPACITY;o++){if(!e.alive[o])continue;const a=isPlayer(o),s=e.x[o],f=e.z[o];e.previousX[o]=s,e.previousZ[o]=f,e.flight[o]=Math.max(0,e.flight[o]-t);let i=s,_=a?_0xc529f1.TARGET_LINE-3:_0xc529f1.BREACH_Z+1;const l=n<0?1/0:Math.hypot(e.x[n]-s,e.z[n]-f);if(a&&(f<-18||l<8||!r)){let t=1/0;for(const n of e.bases)if(n.hp>0){const e=Math.abs(n.x-s)+.15*Math.abs(n.z-f);e<t&&(t=e,i=n.x,_=n.z)}n>=0&&(l<8||!r||1===e.kind[o])&&(i=e.x[n],_=e.z[n])}else a||(i=.65*e.cannonX);const h=i-s,x=_-f,A=Math.hypot(h,x)||1,C=e.boostPad;a&&C&&Math.abs(s-C.x)<=C.halfWidth&&Math.abs(f-C.z)<=C.halfLength?e.boost[o]=_0xc529f1.BOOST_DURATION:e.boost[o]=Math.max(0,e.boost[o]-t);const S=(1===e.kind[o]?_0xc529f1.CHAMPION_SPEED:2===e.kind[o]?_0xc529f1.BOSS_SPEED:a?_0xc529f1.PLAYER_SPEED:_0xc529f1.ENEMY_SPEED)*(e.boost[o]>0?_0xc529f1.BOOST_SPEED:1);let g=0,p=0,u=0;const I=a?e.playerGrid:e.enemyGrid,m=gridX(s),E=gridZ(f);for(let t=-1;t<=1&&u<_0xc529f1.MAX_SEPARATION_VISITS;t++)for(let n=-1;n<=1&&u<_0xc529f1.MAX_SEPARATION_VISITS;n++){const r=m+n,a=E+t;if(!(r<0||r>=_0xc529f1.GRID_COLUMNS||a<0||a>=_0xc529f1.GRID_ROWS))for(let t=I[a*_0xc529f1.GRID_COLUMNS+r];t>=0&&u<_0xc529f1.MAX_SEPARATION_VISITS;t=e.next[t]){if(t===o||!e.alive[t])continue;u++;const n=s-e.x[t],r=f-e.z[t],a=n*n+r*r;if(a>1e-5&&a<.24){const e=2.2*(.49-Math.sqrt(a)),t=1/Math.sqrt(a);g+=n*t*e,p+=r*t*e}}}e.x[o]=clamp(s+(h/A*S+clamp(g,-1.1,1.1))*t,.3-_0xc529f1.HALF_WIDTH,_0xc529f1.HALF_WIDTH-.3),e.z[o]=f+(x/A*S+clamp(p,-.5,.5))*t}}function gates(e){for(let t=0;t<_0xc529f1.PLAYER_SLOTS;t++)if(e.alive[t]&&1!==e.kind[t])for(const n of e.gates){const r=1<<n.id;if(e.gatesPassed[t]&r||e.previousZ[t]<n.z||e.z[t]>n.z||Math.abs(e.x[t]-n.x)>n.halfWidth)continue;e.gatesPassed[t]=e.gatesPassed[t]|r;const o=e.strength[t];if(n.hits++,e.events.gates++,n.factor<0){n.remainder+=o/-n.factor;const r=Math.floor(n.remainder);n.remainder-=r,e.playerStrength+=r-o,e.strength[t]=r,r||remove(e,t)}else{const r=Math.min("add"===n.operation?n.factor:o*(n.factor-1),_0xc529f1.MAX_STRENGTH-e.playerStrength);for(let o=0;o<r;o++){if(e.freePlayerCount<=(0===e.championCount?1:0)){e.strength[t]=e.strength[t]+r-o,e.playerStrength+=r-o;break}const a=2.39996*(e.serial+o),s=.16+.11*Math.sqrt(o+1);spawn(e,!0,e.x[t]+Math.cos(a)*s,n.z-.12-Math.abs(Math.sin(a)*s),1,e.gatesPassed[t])}}}}function fight(e){grid(e),e.collisionVisits=0;const t=_0xc529f1.COLLISION_RADIUS*_0xc529f1.COLLISION_RADIUS;for(let n=0;n<_0xc529f1.PLAYER_SLOTS;n++){if(!e.alive[n])continue;const r=gridX(e.x[n]),o=gridZ(e.z[n]);let a=0;for(let s=-1;s<=1&&e.alive[n]&&a<_0xc529f1.MAX_COLLISION_VISITS;s++)for(let f=-1;f<=1&&e.alive[n]&&a<_0xc529f1.MAX_COLLISION_VISITS;f++){const i=r+f,_=o+s;if(!(i<0||i>=_0xc529f1.GRID_COLUMNS||_<0||_>=_0xc529f1.GRID_ROWS))for(let r=e.enemyGrid[_*_0xc529f1.GRID_COLUMNS+i];r>=0&&e.alive[n]&&a<_0xc529f1.MAX_COLLISION_VISITS;r=e.next[r]){if(a++,e.collisionVisits++,!e.alive[r])continue;const o=e.x[n]-e.x[r],s=e.z[n]-e.z[r];if(o*o+s*s>(1===e.kind[n]||2===e.kind[r]?.5625:t))continue;const f=Math.min(e.strength[n],e.strength[r]);e.strength[n]=e.strength[n]-f,e.strength[r]=e.strength[r]-f,e.playerStrength-=f,e.enemyStrength-=f,e.score+=f*_0xc529f1.KILL_POINTS,e.events.clashes+=f,e.charge=Math.min(_0xc529f1.CHAMPION_CHARGE,e.charge+.12*f),effect(e,(e.x[n]+e.x[r])/2,(e.z[n]+e.z[r])/2,!1),e.strength[r]||remove(e,r),e.strength[n]||remove(e,n)}}}}function outcomes(e){for(let t=0;t<_0xc529f1.CAPACITY;t++)if(e.alive[t]){if(isPlayer(t)){for(const n of e.barriers){if(n.hp<=0||e.previousZ[t]<n.z||e.z[t]>n.z||Math.abs(e.x[t]-n.x)>n.halfWidth)continue;const r=Math.min(n.hp,e.strength[t]);n.hp-=r,e.strength[t]=e.strength[t]-r,e.playerStrength-=r,e.events.hits+=r,e.score+=2*r,effect(e,n.x,n.z,!0),0===n.hp&&e.events.barrierBroken++,0===e.strength[t]&&remove(e,t)}if(!e.alive[t])continue}if(isPlayer(t)&&e.z[t]<=_0xc529f1.TARGET_LINE){let n=null,r=1/0;for(const o of e.bases)if(o.hp>0){const a=Math.abs(o.x-e.x[t]);a<r&&(n=o,r=a)}if(!n)continue;if(r>.9||e.z[t]>n.z+1.25)continue;const o=Math.min(n.hp,e.strength[t]);n.hp-=o,e.score+=2*o,e.events.hits+=o,effect(e,n.x,n.z,!0),e.strength[t]=e.strength[t]-o,e.playerStrength-=o,e.strength[t]||remove(e,t),0===n.hp&&(e.score+=_0xc529f1.BASE_POINTS,e.events.captured++)}else!isPlayer(t)&&e.z[t]>=_0xc529f1.BREACH_Z&&(e.hp=2===e.kind[t]?0:Math.max(0,e.hp-e.strength[t]),e.events.breaches+=e.strength[t],effect(e,e.x[t],0,!1),remove(e,t))}}export function step(e,t){const n=e.events;if(n.shots=n.gates=n.clashes=n.hits=n.breaches=n.captured=n.effectCount=n.barrierBroken=0,n.won=n.lost=n.champion=n.bossDefeated=!1,e.finished||t<=0||!Number.isFinite(t))return n;const r=(e.level-1)%3+1;t=Math.min(t,_0xc529f1.STEP),e.elapsed+=t,e.battleClock+=t,e.cannonX+=(e.targetX-e.cannonX)*(1-Math.exp(15*-t)),e.fireClock+=t,e.fireClock>=_0xc529f1.FIRE_INTERVAL&&(e.fireClock-=_0xc529f1.FIRE_INTERVAL,spawn(e,!0,e.cannonX+.22*(random(e)-.5),_0xc529f1.SPAWN_Z,1,0,0,!0),e.charge=Math.min(_0xc529f1.CHAMPION_CHARGE,e.charge+_0xc529f1.CHAMPION_PER_SHOT),n.shots++),e.charge>=_0xc529f1.CHAMPION_CHARGE&&0===e.championCount&&spawn(e,!0,e.cannonX,_0xc529f1.SPAWN_Z,_0xc529f1.CHAMPION_STRENGTH+12*r,0,1,!0)>=0&&(e.charge=0,n.champion=!0);for(const t of e.gates)t.x=t.originX+(t.moving?.28*Math.sin(.65*e.battleClock+t.id):0);for(const n of e.bases)if(n.hp>0){n.spawnClock+=t;const o=_0xc529f1.ENEMY_WAVE_INTERVAL-.12*(r-1);if(n.spawnClock>=o){n.spawnClock-=o;const t=_0xc529f1.ENEMY_WAVE_SIZE+3*r+Math.min(_0xc529f1.ENEMY_MAX_SURGE,2*Math.floor(e.battleClock/_0xc529f1.ENEMY_SURGE_INTERVAL));for(let r=0;r<t;r++){const t=2.39996*e.serial,o=.2*Math.sqrt(r+.5);spawn(e,!1,n.x+Math.cos(t)*o,n.z+1.1+Math.sin(t)*o)}}}return move(e,t),gates(e),fight(e),outcomes(e),0===e.hp?(e.finished=!0,n.lost=!0):0===e.bossCount&&e.bases.every(e=>0===e.hp)&&(e.score+=_0xc529f1.LEVEL_POINTS,clearUnits(e),e.finished=e.won=n.won=!0),n}
|
|
1
|
+
"use strict";import{MOB_CONFIG as _0x413050}from"./MobControlConstants.js";const clamp=(e,t,n)=>Math.max(t,Math.min(n,e));function random(e){return e.seed=Math.imul(e.seed,1664525)+1013904223>>>0,e.seed/4294967296}export const isPlayer=e=>e<_0x413050.PLAYER_SLOTS;export function createSim(e=Math.floor(4294967295*Math.random()),t=1){const n={alive:new Uint8Array(_0x413050.CAPACITY),x:new Float32Array(_0x413050.CAPACITY),z:new Float32Array(_0x413050.CAPACITY),previousX:new Float32Array(_0x413050.CAPACITY),previousZ:new Float32Array(_0x413050.CAPACITY),strength:new Uint16Array(_0x413050.CAPACITY),gatesPassed:new Uint8Array(_0x413050.CAPACITY),ticket:new Uint32Array(_0x413050.CAPACITY),kind:new Uint8Array(_0x413050.CAPACITY),boost:new Float32Array(_0x413050.CAPACITY),flight:new Float32Array(_0x413050.CAPACITY),next:new Int16Array(_0x413050.CAPACITY),playerGrid:new Int16Array(_0x413050.GRID_COLUMNS*_0x413050.GRID_ROWS),enemyGrid:new Int16Array(_0x413050.GRID_COLUMNS*_0x413050.GRID_ROWS),freePlayer:new Uint16Array(_0x413050.PLAYER_SLOTS),freeEnemy:new Uint16Array(_0x413050.ENEMY_SLOTS),freePlayerCount:0,freeEnemyCount:0,playerCount:0,enemyCount:0,playerStrength:0,enemyStrength:0,championCount:0,bossCount:0,charge:0,serial:0,seed:e>>>0,level:Math.max(1,Math.floor(Number.isFinite(t)?t:1)),elapsed:0,battleClock:0,fireClock:0,cannonX:0,targetX:0,hp:_0x413050.PLAYER_HP,score:0,finished:!1,won:!1,gates:[],bases:[],barriers:[],boostPad:null,collisionVisits:0,events:{shots:0,gates:0,clashes:0,hits:0,breaches:0,captured:0,champion:!1,barrierBroken:0,bossDefeated:!1,won:!1,lost:!1,effectCount:0,effectX:new Float32Array(_0x413050.MAX_EFFECTS),effectZ:new Float32Array(_0x413050.MAX_EFFECTS),effectTeam:new Uint8Array(_0x413050.MAX_EFFECTS)}};return prepareLevel(n),n}function clearUnits(e){e.alive.fill(0),e.strength.fill(0),e.kind.fill(0),e.boost.fill(0),e.flight.fill(0),e.freePlayerCount=_0x413050.PLAYER_SLOTS,e.freeEnemyCount=_0x413050.ENEMY_SLOTS,e.playerCount=e.enemyCount=e.playerStrength=e.enemyStrength=0,e.championCount=e.bossCount=0;for(let t=0;t<_0x413050.PLAYER_SLOTS;t++)e.freePlayer[t]=_0x413050.PLAYER_SLOTS-1-t;for(let t=0;t<_0x413050.ENEMY_SLOTS;t++)e.freeEnemy[t]=_0x413050.CAPACITY-1-t}function prepareLevel(e){clearUnits(e),e.battleClock=0,e.fireClock=_0x413050.FIRE_INTERVAL,e.charge=0;const t=random(e)>.5,n=(e.level-1)%3+1,r=1===n?1:2===n?2.5:3,o=1===n?[1,2,3,4]:2===n?[3,4,-2,5]:[4,3,6,5];e.gates=o.map((e,r)=>{const o=2.35*(r%2==0!==t?-1:1);return{id:r,x:o,originX:o,z:r<2?-8.5:-16,halfWidth:1.95,factor:e,operation:1===n&&0===r?"add":e<0?"divide":"multiply",moving:n>1&&r>=2,hits:0,remainder:0}}),e.bases=[-3.1,0,3.1].map((e,t)=>{const n=(1===t?_0x413050.CORE_HP:_0x413050.BASE_HP)*r;return{x:e,z:_0x413050.BASE_Z-(1===t?1.2:0),hp:n,maxHp:n,spawnClock:-.4-.32*t}}),e.barriers=1===n?[]:[-2.35,2.35].map(e=>({x:e,z:-22.5,halfWidth:1.5,hp:18*n,maxHp:18*n})),e.boostPad=1===n?null:{x:t?2.35:-2.35,z:-19.1,halfWidth:1.55,halfLength:1.15},3===n&&spawn(e,!1,0,-26.5,_0x413050.BOSS_STRENGTH,0,2)}export function spawn(e,t,n,r,o=1,a=0,s=0,i=!1){const _=_0x413050.MAX_STRENGTH-(t?e.playerStrength:e.enemyStrength),l=Math.max(0,Math.min(o,_));if(0===l)return-1;const h=t?e.freePlayer:e.freeEnemy,f=t?e.freePlayerCount:e.freeEnemyCount;let x;if(0===f||t&&0===s&&1===f&&0===e.championCount){let o=-1,i=1/0;const _=t?0:_0x413050.PLAYER_SLOTS,h=t?_0x413050.PLAYER_SLOTS:_0x413050.CAPACITY;for(let t=_;t<h;t++){if(!e.alive[t]||e.gatesPassed[t]!==a||e.kind[t]!==s)continue;const _=(e.x[t]-n)**2+(e.z[t]-r)**2;_<i&&(i=_,o=t)}return o<0?-1:(e.strength[o]=e.strength[o]+l,t?e.playerStrength+=l:e.enemyStrength+=l,o)}return x=h[f-1],t?(e.freePlayerCount--,e.playerCount++,e.playerStrength+=l):(e.freeEnemyCount--,e.enemyCount++,e.enemyStrength+=l),e.alive[x]=1,e.strength[x]=l,e.gatesPassed[x]=a,e.kind[x]=s,e.boost[x]=0,e.flight[x]=i?_0x413050.FLIGHT_DURATION:0,1===s&&e.championCount++,2===s&&e.bossCount++,e.ticket[x]=++e.serial,e.x[x]=e.previousX[x]=clamp(n,.3-_0x413050.HALF_WIDTH,_0x413050.HALF_WIDTH-.3),e.z[x]=e.previousZ[x]=r,x}function remove(e,t){e.alive[t]&&(e.alive[t]=0,1===e.kind[t]&&e.championCount--,2===e.kind[t]&&(e.bossCount--,0===e.strength[t]&&(e.events.bossDefeated=!0)),isPlayer(t)?(e.playerStrength-=e.strength[t],e.freePlayer[e.freePlayerCount++]=t,e.playerCount--):(e.enemyStrength-=e.strength[t],e.freeEnemy[e.freeEnemyCount++]=t,e.enemyCount--),e.strength[t]=0)}function effect(e,t,n,r){const o=e.events;if(o.effectCount>=_0x413050.MAX_EFFECTS)return;const a=o.effectCount++;o.effectX[a]=t,o.effectZ[a]=n,o.effectTeam[a]=r?1:0}function gridX(e){return clamp(Math.floor((e+_0x413050.HALF_WIDTH)/_0x413050.GRID_SIZE),0,_0x413050.GRID_COLUMNS-1)}function gridZ(e){return clamp(Math.floor(-e/_0x413050.GRID_SIZE),0,_0x413050.GRID_ROWS-1)}function grid(e){e.playerGrid.fill(-1),e.enemyGrid.fill(-1);for(let t=0;t<_0x413050.CAPACITY;t++)if(e.alive[t]){const n=isPlayer(t)?e.playerGrid:e.enemyGrid,r=gridZ(e.z[t])*_0x413050.GRID_COLUMNS+gridX(e.x[t]);e.next[t]=n[r],n[r]=t}}function move(e,t){grid(e);let n=-1;if(e.bossCount>0)for(let t=_0x413050.PLAYER_SLOTS;t<_0x413050.CAPACITY;t++)if(e.alive[t]&&2===e.kind[t]){n=t;break}const r=e.bases.some(e=>e.hp>0);for(let o=0;o<_0x413050.CAPACITY;o++){if(!e.alive[o])continue;const a=isPlayer(o),s=e.x[o],i=e.z[o];e.previousX[o]=s,e.previousZ[o]=i,e.flight[o]=Math.max(0,e.flight[o]-t);let _=s,l=a?_0x413050.TARGET_LINE-3:_0x413050.BREACH_Z+1;const h=n<0?1/0:Math.hypot(e.x[n]-s,e.z[n]-i);if(a&&(i<-18||h<8||!r)){let t=1/0;for(const n of e.bases)if(n.hp>0){const e=Math.abs(n.x-s)+.15*Math.abs(n.z-i);e<t&&(t=e,_=n.x,l=n.z)}n>=0&&(h<8||!r||1===e.kind[o])&&(_=e.x[n],l=e.z[n])}else a||(_=.65*e.cannonX);const f=_-s,x=l-i,A=Math.hypot(f,x)||1,C=e.boostPad;a&&C&&Math.abs(s-C.x)<=C.halfWidth&&Math.abs(i-C.z)<=C.halfLength?e.boost[o]=_0x413050.BOOST_DURATION:e.boost[o]=Math.max(0,e.boost[o]-t);const S=(1===e.kind[o]?_0x413050.CHAMPION_SPEED:2===e.kind[o]?_0x413050.BOSS_SPEED:a?_0x413050.PLAYER_SPEED:_0x413050.ENEMY_SPEED)*(e.boost[o]>0?_0x413050.BOOST_SPEED:1);let g=0,p=0,u=0;const I=a?e.playerGrid:e.enemyGrid,m=gridX(s),E=gridZ(i);for(let t=-1;t<=1&&u<_0x413050.MAX_SEPARATION_VISITS;t++)for(let n=-1;n<=1&&u<_0x413050.MAX_SEPARATION_VISITS;n++){const r=m+n,a=E+t;if(!(r<0||r>=_0x413050.GRID_COLUMNS||a<0||a>=_0x413050.GRID_ROWS))for(let t=I[a*_0x413050.GRID_COLUMNS+r];t>=0&&u<_0x413050.MAX_SEPARATION_VISITS;t=e.next[t]){if(t===o||!e.alive[t])continue;u++;const n=s-e.x[t],r=i-e.z[t],a=n*n+r*r;if(a>1e-5&&a<.24){const e=2.2*(.49-Math.sqrt(a)),t=1/Math.sqrt(a);g+=n*t*e,p+=r*t*e}}}e.x[o]=clamp(s+(f/A*S+clamp(g,-1.1,1.1))*t,.3-_0x413050.HALF_WIDTH,_0x413050.HALF_WIDTH-.3),e.z[o]=i+(x/A*S+clamp(p,-.5,.5))*t}}function gates(e){for(let t=0;t<_0x413050.PLAYER_SLOTS;t++)if(e.alive[t]&&1!==e.kind[t])for(const n of e.gates){const r=1<<n.id;if(e.gatesPassed[t]&r||e.previousZ[t]<n.z||e.z[t]>n.z||Math.abs(e.x[t]-n.x)>n.halfWidth)continue;e.gatesPassed[t]=e.gatesPassed[t]|r;const o=e.strength[t];if(n.hits++,e.events.gates++,n.factor<0){n.remainder+=o/-n.factor;const r=Math.floor(n.remainder);n.remainder-=r,e.playerStrength+=r-o,e.strength[t]=r,r||remove(e,t)}else{const r=Math.min("add"===n.operation?n.factor:o*(n.factor-1),_0x413050.MAX_STRENGTH-e.playerStrength);for(let o=0;o<r;o++){if(e.freePlayerCount<=(0===e.championCount?1:0)){e.strength[t]=e.strength[t]+r-o,e.playerStrength+=r-o;break}const a=2.39996*(e.serial+o),s=.16+.11*Math.sqrt(o+1);spawn(e,!0,e.x[t]+Math.cos(a)*s,n.z-.12-Math.abs(Math.sin(a)*s),1,e.gatesPassed[t])}}}}function fight(e){grid(e),e.collisionVisits=0;const t=_0x413050.COLLISION_RADIUS*_0x413050.COLLISION_RADIUS;for(let n=0;n<_0x413050.PLAYER_SLOTS;n++){if(!e.alive[n])continue;const r=gridX(e.x[n]),o=gridZ(e.z[n]);let a=0;for(let s=-1;s<=1&&e.alive[n]&&a<_0x413050.MAX_COLLISION_VISITS;s++)for(let i=-1;i<=1&&e.alive[n]&&a<_0x413050.MAX_COLLISION_VISITS;i++){const _=r+i,l=o+s;if(!(_<0||_>=_0x413050.GRID_COLUMNS||l<0||l>=_0x413050.GRID_ROWS))for(let r=e.enemyGrid[l*_0x413050.GRID_COLUMNS+_];r>=0&&e.alive[n]&&a<_0x413050.MAX_COLLISION_VISITS;r=e.next[r]){if(a++,e.collisionVisits++,!e.alive[r])continue;const o=e.x[n]-e.x[r],s=e.z[n]-e.z[r];if(o*o+s*s>(1===e.kind[n]||2===e.kind[r]?.5625:t))continue;const i=Math.min(e.strength[n],e.strength[r]);e.strength[n]=e.strength[n]-i,e.strength[r]=e.strength[r]-i,e.playerStrength-=i,e.enemyStrength-=i,e.score+=i*_0x413050.KILL_POINTS,e.events.clashes+=i,e.charge=Math.min(_0x413050.CHAMPION_CHARGE,e.charge+.12*i),effect(e,(e.x[n]+e.x[r])/2,(e.z[n]+e.z[r])/2,!1),e.strength[r]||remove(e,r),e.strength[n]||remove(e,n)}}}}function outcomes(e){for(let t=0;t<_0x413050.CAPACITY;t++)if(e.alive[t]){if(isPlayer(t)){for(const n of e.barriers){if(n.hp<=0||e.previousZ[t]<n.z||e.z[t]>n.z||Math.abs(e.x[t]-n.x)>n.halfWidth)continue;const r=Math.min(n.hp,e.strength[t]);n.hp-=r,e.strength[t]=e.strength[t]-r,e.playerStrength-=r,e.events.hits+=r,e.score+=2*r,effect(e,n.x,n.z,!0),0===n.hp&&e.events.barrierBroken++,0===e.strength[t]&&remove(e,t)}if(!e.alive[t])continue}if(isPlayer(t)&&e.z[t]<=_0x413050.TARGET_LINE){let n=null,r=1/0;for(const o of e.bases)if(o.hp>0){const a=Math.abs(o.x-e.x[t]);a<r&&(n=o,r=a)}if(!n)continue;if(r>.9||e.z[t]>n.z+1.25)continue;const o=Math.min(n.hp,e.strength[t]);n.hp-=o,e.score+=2*o,e.events.hits+=o,effect(e,n.x,n.z,!0),e.strength[t]=e.strength[t]-o,e.playerStrength-=o,e.strength[t]||remove(e,t),0===n.hp&&(e.score+=_0x413050.BASE_POINTS,e.events.captured++)}else!isPlayer(t)&&e.z[t]>=_0x413050.BREACH_Z&&(e.hp=2===e.kind[t]?0:Math.max(0,e.hp-e.strength[t]),e.events.breaches+=e.strength[t],effect(e,e.x[t],0,!1),remove(e,t))}}export function step(e,t){const n=e.events;if(n.shots=n.gates=n.clashes=n.hits=n.breaches=n.captured=n.effectCount=n.barrierBroken=0,n.won=n.lost=n.champion=n.bossDefeated=!1,e.finished||t<=0||!Number.isFinite(t))return n;const r=(e.level-1)%3+1;t=Math.min(t,_0x413050.STEP),e.elapsed+=t,e.battleClock+=t,e.cannonX+=(e.targetX-e.cannonX)*(1-Math.exp(15*-t)),e.fireClock+=t,e.fireClock>=_0x413050.FIRE_INTERVAL&&(e.fireClock-=_0x413050.FIRE_INTERVAL,spawn(e,!0,e.cannonX+.22*(random(e)-.5),_0x413050.SPAWN_Z,1,0,0,!0),e.charge=Math.min(_0x413050.CHAMPION_CHARGE,e.charge+_0x413050.CHAMPION_PER_SHOT),n.shots++),e.charge>=_0x413050.CHAMPION_CHARGE&&0===e.championCount&&spawn(e,!0,e.cannonX,_0x413050.SPAWN_Z,_0x413050.CHAMPION_STRENGTH+12*r,0,1,!0)>=0&&(e.charge=0,n.champion=!0);for(const t of e.gates)t.x=t.originX+(t.moving?.28*Math.sin(.65*e.battleClock+t.id):0);for(const n of e.bases)if(n.hp>0){n.spawnClock+=t;const o=_0x413050.ENEMY_WAVE_INTERVAL-.12*(r-1);if(n.spawnClock>=o){n.spawnClock-=o;const t=_0x413050.ENEMY_WAVE_SIZE+3*r+Math.min(_0x413050.ENEMY_MAX_SURGE,2*Math.floor(e.battleClock/_0x413050.ENEMY_SURGE_INTERVAL));for(let r=0;r<t;r++){const t=2.39996*e.serial,o=.2*Math.sqrt(r+.5);spawn(e,!1,n.x+Math.cos(t)*o,n.z+1.1+Math.sin(t)*o)}}}return move(e,t),gates(e),fight(e),outcomes(e),0===e.hp?(e.finished=!0,n.lost=!0):0===e.bossCount&&e.bases.every(e=>0===e.hp)&&(e.score+=_0x413050.LEVEL_POINTS,clearUnits(e),e.finished=e.won=n.won=!0),n}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{effects,quat,tube}from"@nayan-ui/engine";import{glyphMesh}from"../shared/EngineGlyphs.js";import{createGameMesh as
|
|
1
|
+
"use strict";import{effects,quat,tube}from"@nayan-ui/engine";import{glyphMesh}from"../shared/EngineGlyphs.js";import{createGameMesh as _0x4490f3}from"../shared/EngineMeshes.js";import{toColor}from"../shared/EngineUtils.js";import{MOB_COLORS,MOB_CONFIG as _0x221750}from"./MobControlConstants.js";const WHITE=[1,1,1,1];export function makeView(o,t,e){const r=Math.max(1,.5/(o/Math.max(t,1)));e.eye=[0,19*r,15*r],e.target=[0,0,t<550?-9:-13],e.fov=.9;const n=e.target[1]-e.eye[1],a=e.target[2]-e.eye[2],s=Math.hypot(n,a),i=(-e.eye[1]*n-e.eye[2]*a)/s;return{width:o,height:t,k:t/(2*Math.tan(e.fov/2)*i)}}const gateColor=o=>toColor(o.factor<0?MOB_COLORS.GATE_DANGER:o.factor>=3?MOB_COLORS.GATE_HIGH:MOB_COLORS.GATE);function part(o,t,e,r,n,a,s){return o.spawn({mesh:e,parent:t,position:r,scale:n,color:a,rotation:s,pickable:!1})}function number(o,t,e,r,n,a){return[...e].map((s,i)=>o.spawn({mesh:glyphMesh(s),parent:t,position:[(i-(e.length-1)/2)*a*.7,r,n],scale:a,color:WHITE,pickable:!1}))}function spawnBase(o,t,e,r,n){const a=o.spawn({mesh:"none",parent:t,position:[e.x,0,e.z],pickable:!1}),s=toColor(MOB_COLORS.ENEMY),i=toColor(MOB_COLORS.ENEMY_DARK),p=part(o,a,"roundedBox",[0,1.5,0],[2.45,3,2.5],s);part(o,a,"roundedBox",[0,.18,0],[2.8,.36,2.9],i),part(o,a,"roundedBox",[0,3.05,0],[2.65,.3,2.7],n?[.6,.31,.45,1]:[1,.62,.65,1]);for(const t of[-1,1])part(o,a,"cylinder",[1.1*t,2.1,.65],[.62,4.2,.62],s),part(o,a,"cone",[1.1*t,4.45,.65],[.9,.8,.9],i);part(o,a,"roundedBox",[0,.9,1.27],[.9,1.8,.08],i),part(o,a,"cube",[0,1,1.32],[.53,1.2,.04],[.1,.16,.23,1]),part(o,a,"cylinder",[0,3.9,-.65],[.08,1.7,.08],[.85,.87,.84,1]),part(o,a,"cube",[.4,4.45,-.65],[.8,.5,.055],s);const l=(r-1)%3+1;for(let t=0;t<l;t++)part(o,a,"roundedBox",[.32*(t-(l-1)/2),2,1.3],[.2,.35,.07],[1.25,1.08,.5,1]);return part(o,a,"roundedBox",[0,3.5,1.45],[2.3,.24,.14],[.17,.23,.29,1]),{root:a,body:p,bar:part(o,a,"roundedBox",[0,3.5,1.54],[2.15,.14,.08],toColor("#FFC66E")),digits:number(o,a,String(e.hp),2.75,1.5,.5),shown:String(e.hp),hp:e.hp,captured:!1}}let bow=null;function portalBow(){return bow||(bow=_0x4490f3(tube([[-1.86,1.65,0],[-1.65,.3,0],[0,.16,0],[1.65,.3,0],[1.86,1.65,0]],{radius:.045,sides:6,smoothness:5}),{center:!1,shine:.1})),bow}function spawnGate(o,t,e){const r=o.spawn({mesh:"none",parent:t,position:[e.x,0,e.z],pickable:!1}),n=toColor(MOB_COLORS.FRAME),a=gateColor(e),s=2*e.halfWidth;for(const t of[-1,1])part(o,r,"roundedBox",[t*e.halfWidth,.94,0],[.21,1.88,.32],n),part(o,r,"cube",[t*e.halfWidth,1.92,0],[.22,.11,.33],[1,.8,.24,1]);part(o,r,"roundedBox",[0,.03,0],[s,.06,.38],[1.3*a[0],1.3*a[1],1.3*a[2],1]);const i=part(o,r,"cube",[0,.92,0],[s-.12,1.7,.035],[a[0],a[1],a[2],.48]);if(o.spawn({mesh:portalBow(),parent:r,position:[0,0,.06],color:[.8,1.3,1.5,1],pickable:!1}),part(o,r,"roundedBox",[0,1.03,.06],[1.65,1.1,.04],[.38*a[0],.38*a[1],.38*a[2],1]),e.factor<0||"add"===e.operation){if(part(o,r,"roundedBox",[-.43,1.03,.15],[.51,.1,.05],WHITE),e.factor<0)for(const t of[-.23,.23])part(o,r,"sphere",[-.43,1.03+t,.15],.1,WHITE);else part(o,r,"roundedBox",[-.43,1.03,.15],[.1,.51,.05],WHITE);o.spawn({mesh:glyphMesh(String(Math.abs(e.factor))),parent:r,position:[.3,1.03,.18],scale:.85,color:WHITE,pickable:!1})}else number(o,r,"X"+e.factor,1.03,.18,.85);return{root:r,panel:i,hits:e.hits,factor:e.factor}}function spawnBarrier(o,t,e){const r=o.spawn({mesh:"none",parent:t,position:[e.x,0,e.z],pickable:!1});part(o,r,"roundedBox",[0,.75,0],[2*e.halfWidth,1.5,.7],[.92,.62,.23,1]);for(const t of[-1.2,0,1.2])part(o,r,"cube",[t,.75,.39],[.1,1.5,.1],[1,.8,.41,1]);for(const t of[.15,1.35])part(o,r,"cube",[0,t,.4],[2*e.halfWidth,.12,.12],[.52,.31,.12,1]);return part(o,r,"roundedBox",[0,.8,.47],[1.3,1.05,.08],[.2,.17,.13,1]),{root:r,digits:number(o,r,String(e.hp),.8,.54,.65),shown:e.hp,broken:!1}}function spawnBoost(o,t,e){const r=e.boostPad;if(!r)return;const n=o.spawn({mesh:"none",parent:t,position:[r.x,.06,r.z],pickable:!1});part(o,n,"roundedBox",[0,0,0],[2*r.halfWidth,.07,2*r.halfLength],[.13,.56,.65,1]);for(let t=0;t<3;t++)for(const e of[-1,1])part(o,n,"cube",[.3*e,.05,.6*t-.65],[.12,.03,.8],[.65,1.3,1.4,1],quat.y(e*Math.PI/4))}function spawnBossBar(o,t){const e=o.spawn({mesh:"none",parent:t,pickable:!1});return part(o,e,"roundedBox",[0,2.9,0],[2.15,.3,.1],[.18,.1,.14,1]),{root:e,bar:part(o,e,"roundedBox",[0,2.9,.07],[2,.18,.08],[1.1,.2,.25,1]),digits:number(o,e,String(_0x221750.BOSS_STRENGTH),3.4,.1,.65),shown:_0x221750.BOSS_STRENGTH,visible:!0}}export function buildScene(o,t,e){for(const o of"0123456789X")glyphMesh(o);const r=o.spawn({mesh:"none",pickable:!1}),n=t?[.12,.13,.18,1]:toColor(MOB_COLORS.GROUND),a=_0x221750.TRACK_NEAR_Z-_0x221750.TRACK_FAR_Z,s=(_0x221750.TRACK_NEAR_Z+_0x221750.TRACK_FAR_Z)/2;part(o,r,"cube",[0,-1.5,-18],[250,.3,240],n),part(o,r,"roundedBox",[0,-.55,s],[2*_0x221750.HALF_WIDTH+1.2,.9,a+.5],t?[.25,.31,.37,1]:toColor(MOB_COLORS.ROAD_EDGE)),part(o,r,"cube",[0,-.04,s],[2*_0x221750.HALF_WIDTH,.13,a],t?[.38,.43,.46,1]:toColor(MOB_COLORS.ROAD));for(const e of[-1,1])part(o,r,"roundedBox",[e*(_0x221750.HALF_WIDTH+.1),.04,s],[.18,.22,a],t?[.52,.65,.73,1]:[.95,.94,.86,1]);for(let e=0,n=_0x221750.TRACK_NEAR_Z-1.5;n>_0x221750.TRACK_FAR_Z;e++,n-=2.3)if(part(o,r,"cube",[0,.032,n],[.07,.012,.9],t?[.51,.57,.6,1]:[.96,.96,.92,1]),e%2==0)for(const e of[-1,1])part(o,r,"cylinder",[e*(_0x221750.HALF_WIDTH+.4),.23,n],[.13,.9,.13],t?[.35,.31,.28,1]:[.55,.35,.18,1]);for(const e of[-1,1])part(o,r,"cube",[e*(_0x221750.HALF_WIDTH+.4),.4,s],[.09,.13,a],t?[.35,.31,.28,1]:[.67,.43,.22,1]);part(o,r,"roundedBox",[0,.06,.35],[2*_0x221750.HALF_WIDTH,.1,.2],toColor(MOB_COLORS.PLAYER));const i=o.spawn({mesh:"none",parent:r,position:[0,0,_0x221750.CANNON_Z],pickable:!1}),p=toColor(MOB_COLORS.PLAYER),l=toColor(MOB_COLORS.PLAYER_DARK);part(o,i,"roundedBox",[0,.38,0],[1.6,.4,1.65],[.8,.18,.21,1]),part(o,i,"sphere",[0,.86,0],[1.18,.9,1.2],p);for(const t of[-1,1])for(const e of[-.48,.5])part(o,i,"cylinder",[.83*t,.31,e],[.6,.24,.6],[.1,.13,.18,1],quat.z(Math.PI/2)),part(o,i,"cylinder",[.96*t,.31,e],[.25,.03,.25],[.77,.83,.87,1],quat.z(Math.PI/2));const h=o.spawn({mesh:"none",parent:i,position:[0,.92,-.1],pickable:!1});part(o,h,"cylinder",[0,0,-.7],[.62,1.6,.62],l,quat.x(Math.PI/2)),part(o,h,"cylinder",[0,0,-1.52],[.76,.22,.76],p,quat.x(Math.PI/2)),part(o,h,"cylinder",[0,0,-1.65],[.49,.025,.49],[.06,.11,.17,1],quat.x(Math.PI/2)),part(o,i,"roundedBox",[0,.4,1.05],[1.65,.15,.26],[.16,.24,.31,1]);const f=part(o,i,"roundedBox",[-.76,.5,1.05],[.01,.1,.2],toColor(MOB_COLORS.CHAMPION)),u={root:r,battleRoot:o.spawn({mesh:"none",parent:r,pickable:!1}),cannon:i,barrel:h,chargeBar:f,chargeShown:-1,battle:null,bases:[],gates:[],barriers:[],boss:null,night:t};return syncBattle(o,u,e),u}function syncBattle(o,t,e){t.battle!==e&&(o.despawn(t.battleRoot),t.battleRoot=o.spawn({mesh:"none",parent:t.root,pickable:!1}),t.battle=e,t.bases=e.bases.map(r=>spawnBase(o,t.battleRoot,r,e.level,t.night)),t.gates=e.gates.map(e=>spawnGate(o,t.battleRoot,e)),t.barriers=e.barriers.map(e=>spawnBarrier(o,t.battleRoot,e)),spawnBoost(o,t.battleRoot,e),t.boss=e.bossCount>0?spawnBossBar(o,t.battleRoot):null)}export function syncScene(o,t,e,r){syncBattle(o,t,e),o.set(t.cannon,{position:[e.cannonX,0,_0x221750.CANNON_Z]});const n=5*Math.floor(e.charge/5);if(n!==t.chargeShown){t.chargeShown=n;const e=n/_0x221750.CHAMPION_CHARGE;o.set(t.chargeBar,{scale:[Math.max(.01,1.5*e),.1,.2],position:[.75*e-.75,.5,1.05]})}for(let r=0;r<e.gates.length;r++){const n=e.gates[r],a=t.gates[r];if(n.moving&&o.set(a.root,{position:[n.x,0,n.z]}),a.hits!==n.hits){a.hits=n.hits;const t=gateColor(n);o.set(a.panel,{color:[1.3*t[0],1.3*t[1],1.3*t[2],.65]}),o.animate(a.panel,{color:[t[0],t[1],t[2],.48]},{duration:.18})}}for(let n=0;n<e.bases.length;n++){const a=e.bases[n],s=t.bases[n];if(a.hp!==s.hp){s.hp=a.hp;const t=a.hp/a.maxHp;o.set(s.bar,{scale:[Math.max(.001,2.15*t),.14,.08],position:[1.075*-(1-t),3.5,1.54]})}0===a.hp&&!s.captured&&(s.captured=!0,o.set(s.body,{color:toColor(MOB_COLORS.PLAYER)}),o.animate(s.root,{scale:[1,.25,1]},{duration:.55,easing:"bounce"}));const i=String(a.hp);if(r&&i!==s.shown){for(const t of s.digits)o.despawn(t);s.digits=number(o,s.root,i,2.75,1.5,.5),s.shown=i}}for(let n=0;n<e.barriers.length;n++){const a=e.barriers[n],s=t.barriers[n];if(0===a.hp&&!s.broken&&(s.broken=!0,effects.shatter(o,{position:[a.x,.65,a.z],colors:[.92,.62,.23,1],count:9,size:.13,speed:2,lifetime:.4,gravity:-7}),o.animate(s.root,{scale:[1,.001,1]},{duration:.25})),r&&a.hp!==s.shown){for(const t of s.digits)o.despawn(t);s.digits=a.hp>0?number(o,s.root,String(a.hp),.8,.54,.65):[],s.shown=a.hp}}if(t.boss){const n=t.boss;let a=-1;for(let o=_0x221750.PLAYER_SLOTS;o<_0x221750.CAPACITY;o++)if(e.alive[o]&&2===e.kind[o]){a=o;break}if(a>=0){o.set(n.root,{position:[e.previousX[a],0,e.previousZ[a]]});const t=e.strength[a];if(t!==n.shown){const e=t/_0x221750.BOSS_STRENGTH;if(o.set(n.bar,{scale:[Math.max(.001,2*e),.18,.08],position:[-(1-e),2.9,.07]}),r){for(const t of n.digits)o.despawn(t);n.digits=number(o,n.root,String(t),3.4,.1,.65),n.shown=t}}}else n.visible&&(n.visible=!1,o.set(n.root,{scale:.001}))}}export function recoil(o,t){o.animate(t.barrel,[{position:[0,.92,.1],at:.2},{position:[0,.92,-.1]}],{duration:.09})}export function battleEffect(o,t,e,r){effects.sparkle(o,{position:[t,.4,e],colors:toColor(r?MOB_COLORS.PLAYER:MOB_COLORS.ENEMY),count:5,size:.07,speed:1.5,lifetime:.24,flash:!1})}export function captured(o,t,e){effects.shatter(o,{position:[t,1.2,e],colors:toColor(MOB_COLORS.ENEMY),count:12,size:.14,speed:3,lifetime:.5,gravity:-7})}export function celebrate(o){effects.confetti(o,{position:[0,2,-12],colors:[toColor(MOB_COLORS.PLAYER),[1,.82,.35,1],WHITE],count:35,size:.1,speed:5,lifetime:1.2,gravity:-4})}export function removeScene(o,t){o.despawn(t.root)}
|