@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.
Files changed (552) hide show
  1. package/lib/module/games/arrows/Arrows.js +1 -1
  2. package/lib/module/games/arrows/ArrowsScene.js +1 -1
  3. package/lib/module/games/balloon-blaster/BalloonBlaster.js +1 -1
  4. package/lib/module/games/balloon-blaster/BalloonBlasterScene.js +1 -1
  5. package/lib/module/games/bike-racing/BikeMeshes.js +1 -1
  6. package/lib/module/games/bike-racing/BikeRacing.js +1 -1
  7. package/lib/module/games/bike-racing/BikeRacingConstants.js +1 -1
  8. package/lib/module/games/bike-racing/BikeRacingScene.js +1 -1
  9. package/lib/module/games/block-blast/BlockBlast.js +1 -1
  10. package/lib/module/games/block-blast/BlockBlastScene.js +1 -1
  11. package/lib/module/games/block-breaker/BlockBreaker.js +1 -1
  12. package/lib/module/games/block-breaker/BlockBreakerScene.js +1 -1
  13. package/lib/module/games/bluk/Bluk.js +1 -1
  14. package/lib/module/games/bluk/BlukScene.js +1 -1
  15. package/lib/module/games/bubble-shooter/BubbleShooter.js +1 -1
  16. package/lib/module/games/bubble-shooter/BubbleShooterScene.js +1 -1
  17. package/lib/module/games/candy-crush/CandyCrush.js +1 -1
  18. package/lib/module/games/candy-crush/CandyCrushScene.js +1 -1
  19. package/lib/module/games/car-racing/CarMeshes.js +1 -1
  20. package/lib/module/games/car-racing/CarRacing.js +1 -1
  21. package/lib/module/games/car-racing/CarRacingScene.js +1 -1
  22. package/lib/module/games/chameleon-run/ChameleonRun.js +1 -1
  23. package/lib/module/games/chameleon-run/ChameleonRunBackdrop.js +1 -1
  24. package/lib/module/games/chameleon-run/ChameleonRunMeshes.js +1 -1
  25. package/lib/module/games/checkers/Checkers.js +1 -1
  26. package/lib/module/games/checkers/CheckersScene.js +1 -1
  27. package/lib/module/games/color-switch/ColorSwitch.js +1 -1
  28. package/lib/module/games/color-switch/ColorSwitchScene.js +1 -1
  29. package/lib/module/games/colors-sort/ColorsSort.js +1 -1
  30. package/lib/module/games/colors-sort/ColorsSortScene.js +1 -1
  31. package/lib/module/games/connect-em-all/ConnectEmAll.js +1 -1
  32. package/lib/module/games/connect-em-all/ConnectEmAllScene.js +1 -1
  33. package/lib/module/games/crossy-road/CrossyRoad.js +1 -1
  34. package/lib/module/games/crossy-road/CrossyRoadMeshes.js +1 -1
  35. package/lib/module/games/crossy-road/CrossyRoadPerson.js +1 -1
  36. package/lib/module/games/dino-jump/DinoJump.js +1 -1
  37. package/lib/module/games/dino-jump/DinoJumpScene.js +1 -1
  38. package/lib/module/games/dots-and-boxes/DotsAndBoxes.js +1 -1
  39. package/lib/module/games/dots-and-boxes/DotsAndBoxesScene.js +1 -1
  40. package/lib/module/games/falling-sticks/FallingSticks.js +1 -1
  41. package/lib/module/games/falling-sticks/FallingSticksScene.js +1 -1
  42. package/lib/module/games/find-different-number/FindDifferentNumber.js +1 -1
  43. package/lib/module/games/find-different-number/FindDifferentNumberScene.js +1 -1
  44. package/lib/module/games/flappy-bird/FlappyBird.js +1 -1
  45. package/lib/module/games/flappy-bird/FlappyBirdScene.js +1 -1
  46. package/lib/module/games/fruit-merger/FruitMerger.js +1 -1
  47. package/lib/module/games/fruit-merger/FruitMergerScene.js +1 -1
  48. package/lib/module/games/fruit-ninja/FruitNinja.js +1 -1
  49. package/lib/module/games/fruit-ninja/FruitNinjaScene.js +1 -1
  50. package/lib/module/games/fruit-ninja/FruitNinjaWorld.js +1 -1
  51. package/lib/module/games/game-2048/Game2048.js +1 -1
  52. package/lib/module/games/game-2048/Game2048Scene.js +1 -1
  53. package/lib/module/games/knife-hit/KnifeHit.js +1 -1
  54. package/lib/module/games/knife-hit/KnifeHitScene.js +1 -1
  55. package/lib/module/games/ludo-king/LudoKing.js +1 -1
  56. package/lib/module/games/ludo-king/LudoKingScene.js +1 -1
  57. package/lib/module/games/maze-runner/MazeRunner.js +1 -1
  58. package/lib/module/games/maze-runner/MazeRunnerScene.js +1 -1
  59. package/lib/module/games/memory-match/MemoryMatch.js +1 -1
  60. package/lib/module/games/memory-match/MemoryMatchScene.js +1 -1
  61. package/lib/module/games/mine-sweeper/MineSweeper.js +1 -1
  62. package/lib/module/games/mine-sweeper/MineSweeperScene.js +1 -1
  63. package/lib/module/games/mob-control/MobControl.js +1 -1
  64. package/lib/module/games/mob-control/MobControlGame.js +1 -1
  65. package/lib/module/games/mob-control/MobControlMeshes.js +1 -1
  66. package/lib/module/games/mob-control/MobControlRenderer.js +1 -1
  67. package/lib/module/games/mob-control/MobControlRules.js +1 -1
  68. package/lib/module/games/mob-control/MobControlScene.js +1 -1
  69. package/lib/module/games/nuts-and-bolts/NutsAndBolts.js +1 -1
  70. package/lib/module/games/nuts-and-bolts/NutsAndBoltsScene.js +1 -1
  71. package/lib/module/games/pac-man/PacMan.js +1 -1
  72. package/lib/module/games/pac-man/PacManGame.js +1 -1
  73. package/lib/module/games/pac-man/PacManScene.js +1 -1
  74. package/lib/module/games/paper-io/PaperIo.js +1 -1
  75. package/lib/module/games/paper-io/PaperIoMeshes.js +1 -1
  76. package/lib/module/games/paper-io/PaperIoScene.js +1 -1
  77. package/lib/module/games/penguin-run/PenguinMeshes.js +1 -1
  78. package/lib/module/games/penguin-run/PenguinRun.js +1 -1
  79. package/lib/module/games/penguin-run/PenguinRunScene.js +1 -1
  80. package/lib/module/games/perfect-circle/PerfectCircle.js +1 -1
  81. package/lib/module/games/perfect-circle/PerfectCircleScene.js +1 -1
  82. package/lib/module/games/pipe-connect/PipeConnect.js +1 -1
  83. package/lib/module/games/pipe-connect/PipeConnectScene.js +1 -1
  84. package/lib/module/games/play-with-tua/PlayWithTua.js +1 -1
  85. package/lib/module/games/popit-fidget/PopitFidget.js +1 -1
  86. package/lib/module/games/popit-fidget/PopitFidgetScene.js +1 -1
  87. package/lib/module/games/reversi/Reversi.js +1 -1
  88. package/lib/module/games/reversi/ReversiScene.js +1 -1
  89. package/lib/module/games/search-grid/SearchGrid.js +1 -1
  90. package/lib/module/games/search-grid/SearchGridScene.js +1 -1
  91. package/lib/module/games/shared/BackdropCard.js +1 -1
  92. package/lib/module/games/shared/EngineBackdrop.js +1 -1
  93. package/lib/module/games/shared/EngineBlasts.js +1 -1
  94. package/lib/module/games/shared/EngineBlocks.js +1 -1
  95. package/lib/module/games/shared/EngineDice.js +1 -1
  96. package/lib/module/games/shared/EngineFruits.js +1 -1
  97. package/lib/module/games/shared/EngineGameLoader.js +1 -1
  98. package/lib/module/games/shared/EngineGameScreen.js +1 -1
  99. package/lib/module/games/shared/EngineGlyphs.js +1 -1
  100. package/lib/module/games/shared/EngineHud.js +1 -1
  101. package/lib/module/games/shared/EngineMeadow.js +1 -1
  102. package/lib/module/games/shared/EngineTouchSurface.js +1 -1
  103. package/lib/module/games/shared/GameActivity.js +1 -1
  104. package/lib/module/games/shared/GameLoading.js +1 -1
  105. package/lib/module/games/shared/GameLoadingTransition.js +1 -1
  106. package/lib/module/games/sliding-numbers/SlidingNumbers.js +1 -1
  107. package/lib/module/games/sliding-numbers/SlidingNumbersScene.js +1 -1
  108. package/lib/module/games/snake-3d/Snake3D.js +1 -1
  109. package/lib/module/games/snake-3d/Snake3DScene.js +1 -1
  110. package/lib/module/games/snakes-and-ladders/SnakesAndLadders.js +1 -1
  111. package/lib/module/games/snakes-and-ladders/SnakesAndLaddersScene.js +1 -1
  112. package/lib/module/games/space-fighter/SpaceFighter.js +1 -1
  113. package/lib/module/games/space-fighter/SpaceFighterScene.js +1 -1
  114. package/lib/module/games/spider-solitaire/SpiderSolitaire.js +1 -1
  115. package/lib/module/games/spider-solitaire/SpiderSolitaireScene.js +1 -1
  116. package/lib/module/games/stack-tower/StackTower.js +1 -1
  117. package/lib/module/games/stack-tower/StackTowerScene.js +1 -1
  118. package/lib/module/games/sudoku/Sudoku.js +1 -1
  119. package/lib/module/games/sudoku/SudokuScene.js +1 -1
  120. package/lib/module/games/tangram/Tangram.js +1 -1
  121. package/lib/module/games/tangram/TangramScene.js +1 -1
  122. package/lib/module/games/tank-1990/Tank1990.js +1 -1
  123. package/lib/module/games/tank-1990/Tank1990Scene.js +1 -1
  124. package/lib/module/games/tic-tac-toe/TicTacToe.js +1 -1
  125. package/lib/module/games/tic-tac-toe/TicTacToeScene.js +1 -1
  126. package/lib/module/games/tile-home/TileHome.js +1 -1
  127. package/lib/module/games/tile-home/TileHomeScene.js +1 -1
  128. package/lib/module/games/treasure-hunt/TreasureHunt.js +1 -1
  129. package/lib/module/games/treasure-hunt/TreasureHuntConstants.js +1 -1
  130. package/lib/module/games/treasure-hunt/TreasureHuntModel.js +1 -1
  131. package/lib/module/games/treasure-hunt/TreasureHuntScene.js +1 -1
  132. package/lib/module/games/whack-a-mole/WhackAMole.js +1 -1
  133. package/lib/module/games/whack-a-mole/WhackAMoleScene.js +1 -1
  134. package/lib/module/helpers/GameSettingsModal.js +1 -1
  135. package/lib/module/helpers/GameTheme.js +1 -1
  136. package/package.json +1 -2
  137. package/src/assets/fonts/Inter-SemiBold.ttf +0 -0
  138. package/src/assets/models/explorer/explorer.glb +0 -0
  139. package/src/assets/models/explorer/params.json +0 -51
  140. package/src/assets/models/explorer/source.json +0 -222
  141. package/src/assets/models/play-with-tua/play-with-tua.glb +0 -0
  142. package/src/assets/models/play-with-tua/sources.json +0 -141
  143. package/src/assets/sfx/balloon_pop.wav +0 -0
  144. package/src/assets/sfx/blocked.wav +0 -0
  145. package/src/assets/sfx/boing.wav +0 -0
  146. package/src/assets/sfx/bonus.wav +0 -0
  147. package/src/assets/sfx/boom.wav +0 -0
  148. package/src/assets/sfx/bump.wav +0 -0
  149. package/src/assets/sfx/cannon.wav +0 -0
  150. package/src/assets/sfx/capture.wav +0 -0
  151. package/src/assets/sfx/card_flip.wav +0 -0
  152. package/src/assets/sfx/card_place.wav +0 -0
  153. package/src/assets/sfx/catch.wav +0 -0
  154. package/src/assets/sfx/chime.wav +0 -0
  155. package/src/assets/sfx/chomp.wav +0 -0
  156. package/src/assets/sfx/chomp_alt.wav +0 -0
  157. package/src/assets/sfx/clack.wav +0 -0
  158. package/src/assets/sfx/clang.wav +0 -0
  159. package/src/assets/sfx/clash.wav +0 -0
  160. package/src/assets/sfx/click.wav +0 -0
  161. package/src/assets/sfx/coin.wav +0 -0
  162. package/src/assets/sfx/combo.wav +0 -0
  163. package/src/assets/sfx/crash.wav +0 -0
  164. package/src/assets/sfx/crunch.wav +0 -0
  165. package/src/assets/sfx/dance.wav +0 -0
  166. package/src/assets/sfx/deselect.wav +0 -0
  167. package/src/assets/sfx/dice_roll.wav +0 -0
  168. package/src/assets/sfx/die.wav +0 -0
  169. package/src/assets/sfx/draw.wav +0 -0
  170. package/src/assets/sfx/drop.wav +0 -0
  171. package/src/assets/sfx/eat.wav +0 -0
  172. package/src/assets/sfx/engine.wav +0 -0
  173. package/src/assets/sfx/error.wav +0 -0
  174. package/src/assets/sfx/flag.wav +0 -0
  175. package/src/assets/sfx/flap.wav +0 -0
  176. package/src/assets/sfx/flip_disc.wav +0 -0
  177. package/src/assets/sfx/footstep_run.wav +0 -0
  178. package/src/assets/sfx/footstep_walk.wav +0 -0
  179. package/src/assets/sfx/game_over.wav +0 -0
  180. package/src/assets/sfx/gate.wav +0 -0
  181. package/src/assets/sfx/hit.wav +0 -0
  182. package/src/assets/sfx/hop.wav +0 -0
  183. package/src/assets/sfx/hurt.wav +0 -0
  184. package/src/assets/sfx/invalid.wav +0 -0
  185. package/src/assets/sfx/jump.wav +0 -0
  186. package/src/assets/sfx/ladder.wav +0 -0
  187. package/src/assets/sfx/land.wav +0 -0
  188. package/src/assets/sfx/laugh.wav +0 -0
  189. package/src/assets/sfx/lose.wav +0 -0
  190. package/src/assets/sfx/merge.wav +0 -0
  191. package/src/assets/sfx/miss.wav +0 -0
  192. package/src/assets/sfx/nitro.wav +0 -0
  193. package/src/assets/sfx/pew.wav +0 -0
  194. package/src/assets/sfx/place.wav +0 -0
  195. package/src/assets/sfx/pling.wav +0 -0
  196. package/src/assets/sfx/point.wav +0 -0
  197. package/src/assets/sfx/pop.wav +0 -0
  198. package/src/assets/sfx/pop_soft.wav +0 -0
  199. package/src/assets/sfx/power_up.wav +0 -0
  200. package/src/assets/sfx/reveal.wav +0 -0
  201. package/src/assets/sfx/robot.wav +0 -0
  202. package/src/assets/sfx/rotate.wav +0 -0
  203. package/src/assets/sfx/run_steps.wav +0 -0
  204. package/src/assets/sfx/select.wav +0 -0
  205. package/src/assets/sfx/shuffle.wav +0 -0
  206. package/src/assets/sfx/six.wav +0 -0
  207. package/src/assets/sfx/slice.wav +0 -0
  208. package/src/assets/sfx/slide.wav +0 -0
  209. package/src/assets/sfx/snake.wav +0 -0
  210. package/src/assets/sfx/snap.wav +0 -0
  211. package/src/assets/sfx/splash.wav +0 -0
  212. package/src/assets/sfx/star.wav +0 -0
  213. package/src/assets/sfx/start.wav +0 -0
  214. package/src/assets/sfx/swoosh.wav +0 -0
  215. package/src/assets/sfx/tap.wav +0 -0
  216. package/src/assets/sfx/thud.wav +0 -0
  217. package/src/assets/sfx/thunk.wav +0 -0
  218. package/src/assets/sfx/tick.wav +0 -0
  219. package/src/assets/sfx/time_up.wav +0 -0
  220. package/src/assets/sfx/tock.wav +0 -0
  221. package/src/assets/sfx/walk_steps.wav +0 -0
  222. package/src/assets/sfx/warning.wav +0 -0
  223. package/src/assets/sfx/whack.wav +0 -0
  224. package/src/assets/sfx/whoosh.wav +0 -0
  225. package/src/assets/sfx/win.wav +0 -0
  226. package/src/assets/sfx/zap.wav +0 -0
  227. package/src/assets/textures/ad_bolt.png +0 -0
  228. package/src/assets/textures/ad_bubbles.png +0 -0
  229. package/src/assets/textures/ad_chevrons.png +0 -0
  230. package/src/assets/textures/asphalt.png +0 -0
  231. package/src/assets/textures/bark.jpg +0 -0
  232. package/src/assets/textures/explorer-atlas.png +0 -0
  233. package/src/assets/textures/facade.png +0 -0
  234. package/src/assets/textures/grass.png +0 -0
  235. package/src/assets/textures/leaves.png +0 -0
  236. package/src/assets/textures/limestone.jpg +0 -0
  237. package/src/assets/textures/meadow.jpg +0 -0
  238. package/src/assets/textures/nature-sources.json +0 -87
  239. package/src/assets/textures/pine.png +0 -0
  240. package/src/assets/textures/river.jpg +0 -0
  241. package/src/assets/textures/soft_glow.png +0 -0
  242. package/src/games/arrows/Arrows.tsx +0 -69
  243. package/src/games/arrows/ArrowsConstants.ts +0 -107
  244. package/src/games/arrows/ArrowsGame.ts +0 -735
  245. package/src/games/arrows/ArrowsScene.ts +0 -395
  246. package/src/games/balloon-blaster/BalloonBlaster.tsx +0 -75
  247. package/src/games/balloon-blaster/BalloonBlasterConstants.ts +0 -79
  248. package/src/games/balloon-blaster/BalloonBlasterGame.ts +0 -287
  249. package/src/games/balloon-blaster/BalloonBlasterPhysics.ts +0 -95
  250. package/src/games/balloon-blaster/BalloonBlasterScene.ts +0 -225
  251. package/src/games/bike-racing/BikeMeshes.ts +0 -273
  252. package/src/games/bike-racing/BikeRacing.tsx +0 -211
  253. package/src/games/bike-racing/BikeRacingConstants.ts +0 -103
  254. package/src/games/bike-racing/BikeRacingGame.ts +0 -557
  255. package/src/games/bike-racing/BikeRacingScene.ts +0 -119
  256. package/src/games/block-blast/BlockBlast.tsx +0 -73
  257. package/src/games/block-blast/BlockBlastConstants.ts +0 -179
  258. package/src/games/block-blast/BlockBlastGame.ts +0 -471
  259. package/src/games/block-blast/BlockBlastScene.ts +0 -156
  260. package/src/games/block-breaker/BlockBreaker.tsx +0 -79
  261. package/src/games/block-breaker/BlockBreakerConstants.ts +0 -139
  262. package/src/games/block-breaker/BlockBreakerGame.ts +0 -459
  263. package/src/games/block-breaker/BlockBreakerScene.ts +0 -257
  264. package/src/games/bluk/Bluk.tsx +0 -82
  265. package/src/games/bluk/BlukConstants.ts +0 -121
  266. package/src/games/bluk/BlukGame.ts +0 -323
  267. package/src/games/bluk/BlukRules.ts +0 -154
  268. package/src/games/bluk/BlukScene.ts +0 -514
  269. package/src/games/bubble-shooter/BubbleShooter.tsx +0 -76
  270. package/src/games/bubble-shooter/BubbleShooterConstants.ts +0 -103
  271. package/src/games/bubble-shooter/BubbleShooterGame.ts +0 -459
  272. package/src/games/bubble-shooter/BubbleShooterScene.ts +0 -158
  273. package/src/games/candy-crush/CandyCrush.tsx +0 -77
  274. package/src/games/candy-crush/CandyCrushConstants.ts +0 -94
  275. package/src/games/candy-crush/CandyCrushGame.ts +0 -477
  276. package/src/games/candy-crush/CandyCrushScene.ts +0 -209
  277. package/src/games/car-racing/CarMeshes.ts +0 -440
  278. package/src/games/car-racing/CarRacing.tsx +0 -211
  279. package/src/games/car-racing/CarRacingConstants.ts +0 -167
  280. package/src/games/car-racing/CarRacingFacade.ts +0 -40
  281. package/src/games/car-racing/CarRacingGame.ts +0 -539
  282. package/src/games/car-racing/CarRacingScene.ts +0 -1026
  283. package/src/games/car-racing/CarRacingScenery.ts +0 -265
  284. package/src/games/chameleon-run/ChameleonRun.tsx +0 -96
  285. package/src/games/chameleon-run/ChameleonRunBackdrop.ts +0 -186
  286. package/src/games/chameleon-run/ChameleonRunConstants.ts +0 -47
  287. package/src/games/chameleon-run/ChameleonRunGame.ts +0 -309
  288. package/src/games/chameleon-run/ChameleonRunMeshes.ts +0 -305
  289. package/src/games/chameleon-run/ChameleonRunRules.ts +0 -252
  290. package/src/games/chameleon-run/ChameleonRunScene.ts +0 -310
  291. package/src/games/checkers/Checkers.tsx +0 -83
  292. package/src/games/checkers/CheckersAI.ts +0 -255
  293. package/src/games/checkers/CheckersConstants.ts +0 -68
  294. package/src/games/checkers/CheckersGame.ts +0 -322
  295. package/src/games/checkers/CheckersRules.ts +0 -167
  296. package/src/games/checkers/CheckersScene.ts +0 -308
  297. package/src/games/color-switch/ColorSwitch.tsx +0 -75
  298. package/src/games/color-switch/ColorSwitchConstants.ts +0 -61
  299. package/src/games/color-switch/ColorSwitchGame.ts +0 -329
  300. package/src/games/color-switch/ColorSwitchScene.ts +0 -220
  301. package/src/games/colors-sort/ColorsSort.tsx +0 -82
  302. package/src/games/colors-sort/ColorsSortConstants.ts +0 -119
  303. package/src/games/colors-sort/ColorsSortGame.ts +0 -246
  304. package/src/games/colors-sort/ColorsSortScene.ts +0 -315
  305. package/src/games/connect-em-all/ConnectEmAll.tsx +0 -70
  306. package/src/games/connect-em-all/ConnectEmAllConstants.ts +0 -77
  307. package/src/games/connect-em-all/ConnectEmAllGame.ts +0 -401
  308. package/src/games/connect-em-all/ConnectEmAllScene.ts +0 -235
  309. package/src/games/crossy-road/CrossyRoad.tsx +0 -74
  310. package/src/games/crossy-road/CrossyRoadCamera.ts +0 -59
  311. package/src/games/crossy-road/CrossyRoadConstants.ts +0 -132
  312. package/src/games/crossy-road/CrossyRoadGame.ts +0 -293
  313. package/src/games/crossy-road/CrossyRoadMeshes.ts +0 -195
  314. package/src/games/crossy-road/CrossyRoadPerson.ts +0 -198
  315. package/src/games/crossy-road/CrossyRoadRules.ts +0 -99
  316. package/src/games/crossy-road/CrossyRoadScene.ts +0 -355
  317. package/src/games/dino-jump/DinoJump.tsx +0 -77
  318. package/src/games/dino-jump/DinoJumpConstants.ts +0 -80
  319. package/src/games/dino-jump/DinoJumpGame.ts +0 -344
  320. package/src/games/dino-jump/DinoJumpScene.ts +0 -686
  321. package/src/games/dots-and-boxes/DotsAndBoxes.tsx +0 -83
  322. package/src/games/dots-and-boxes/DotsAndBoxesConstants.ts +0 -77
  323. package/src/games/dots-and-boxes/DotsAndBoxesGame.ts +0 -271
  324. package/src/games/dots-and-boxes/DotsAndBoxesScene.ts +0 -249
  325. package/src/games/falling-sticks/FallingSticks.tsx +0 -72
  326. package/src/games/falling-sticks/FallingSticksConstants.ts +0 -62
  327. package/src/games/falling-sticks/FallingSticksGame.ts +0 -220
  328. package/src/games/falling-sticks/FallingSticksRules.ts +0 -145
  329. package/src/games/falling-sticks/FallingSticksScene.ts +0 -245
  330. package/src/games/find-different-number/FindDifferentNumber.tsx +0 -74
  331. package/src/games/find-different-number/FindDifferentNumberConstants.ts +0 -74
  332. package/src/games/find-different-number/FindDifferentNumberGame.ts +0 -174
  333. package/src/games/find-different-number/FindDifferentNumberRules.ts +0 -43
  334. package/src/games/find-different-number/FindDifferentNumberScene.ts +0 -193
  335. package/src/games/flappy-bird/FlappyBird.tsx +0 -73
  336. package/src/games/flappy-bird/FlappyBirdConstants.ts +0 -95
  337. package/src/games/flappy-bird/FlappyBirdGame.ts +0 -375
  338. package/src/games/flappy-bird/FlappyBirdScene.ts +0 -630
  339. package/src/games/fruit-merger/FruitMerger.tsx +0 -73
  340. package/src/games/fruit-merger/FruitMergerConstants.ts +0 -102
  341. package/src/games/fruit-merger/FruitMergerGame.ts +0 -285
  342. package/src/games/fruit-merger/FruitMergerRules.ts +0 -286
  343. package/src/games/fruit-merger/FruitMergerScene.ts +0 -498
  344. package/src/games/fruit-ninja/FruitNinja.tsx +0 -129
  345. package/src/games/fruit-ninja/FruitNinjaConstants.ts +0 -107
  346. package/src/games/fruit-ninja/FruitNinjaGame.ts +0 -391
  347. package/src/games/fruit-ninja/FruitNinjaScene.ts +0 -319
  348. package/src/games/fruit-ninja/FruitNinjaWorld.ts +0 -17
  349. package/src/games/game-2048/Game2048.tsx +0 -84
  350. package/src/games/game-2048/Game2048Constants.ts +0 -68
  351. package/src/games/game-2048/Game2048Game.ts +0 -181
  352. package/src/games/game-2048/Game2048Rules.ts +0 -101
  353. package/src/games/game-2048/Game2048Scene.ts +0 -206
  354. package/src/games/knife-hit/KnifeHit.tsx +0 -78
  355. package/src/games/knife-hit/KnifeHitConstants.ts +0 -89
  356. package/src/games/knife-hit/KnifeHitGame.ts +0 -264
  357. package/src/games/knife-hit/KnifeHitScene.ts +0 -360
  358. package/src/games/ludo-king/LudoKing.tsx +0 -86
  359. package/src/games/ludo-king/LudoKingConstants.ts +0 -212
  360. package/src/games/ludo-king/LudoKingGame.ts +0 -326
  361. package/src/games/ludo-king/LudoKingRules.ts +0 -143
  362. package/src/games/ludo-king/LudoKingScene.ts +0 -397
  363. package/src/games/maze-runner/MazeRunner.tsx +0 -88
  364. package/src/games/maze-runner/MazeRunnerConstants.ts +0 -65
  365. package/src/games/maze-runner/MazeRunnerGame.ts +0 -176
  366. package/src/games/maze-runner/MazeRunnerRules.ts +0 -161
  367. package/src/games/maze-runner/MazeRunnerScene.ts +0 -245
  368. package/src/games/memory-match/MemoryMatch.tsx +0 -77
  369. package/src/games/memory-match/MemoryMatchConstants.ts +0 -105
  370. package/src/games/memory-match/MemoryMatchGame.ts +0 -222
  371. package/src/games/memory-match/MemoryMatchRules.ts +0 -38
  372. package/src/games/memory-match/MemoryMatchScene.ts +0 -268
  373. package/src/games/mine-sweeper/MineSweeper.tsx +0 -77
  374. package/src/games/mine-sweeper/MineSweeperConstants.ts +0 -94
  375. package/src/games/mine-sweeper/MineSweeperGame.ts +0 -234
  376. package/src/games/mine-sweeper/MineSweeperRules.ts +0 -67
  377. package/src/games/mine-sweeper/MineSweeperScene.ts +0 -262
  378. package/src/games/mob-control/MobControl.tsx +0 -73
  379. package/src/games/mob-control/MobControlConstants.ts +0 -106
  380. package/src/games/mob-control/MobControlGame.ts +0 -176
  381. package/src/games/mob-control/MobControlMeshes.ts +0 -85
  382. package/src/games/mob-control/MobControlRenderer.ts +0 -108
  383. package/src/games/mob-control/MobControlRules.ts +0 -522
  384. package/src/games/mob-control/MobControlScene.ts +0 -399
  385. package/src/games/number-search/NumberSearch.tsx +0 -18
  386. package/src/games/number-search/NumberSearchNumbers.ts +0 -623
  387. package/src/games/nuts-and-bolts/NutsAndBolts.tsx +0 -85
  388. package/src/games/nuts-and-bolts/NutsAndBoltsConstants.ts +0 -75
  389. package/src/games/nuts-and-bolts/NutsAndBoltsGame.ts +0 -298
  390. package/src/games/nuts-and-bolts/NutsAndBoltsRules.ts +0 -474
  391. package/src/games/nuts-and-bolts/NutsAndBoltsScene.ts +0 -498
  392. package/src/games/pac-man/PacMan.tsx +0 -86
  393. package/src/games/pac-man/PacManConstants.ts +0 -169
  394. package/src/games/pac-man/PacManGame.ts +0 -406
  395. package/src/games/pac-man/PacManRules.ts +0 -255
  396. package/src/games/pac-man/PacManScene.ts +0 -387
  397. package/src/games/paper-io/PaperIo.tsx +0 -91
  398. package/src/games/paper-io/PaperIoConstants.ts +0 -86
  399. package/src/games/paper-io/PaperIoGame.ts +0 -193
  400. package/src/games/paper-io/PaperIoMeshes.ts +0 -233
  401. package/src/games/paper-io/PaperIoRules.ts +0 -315
  402. package/src/games/paper-io/PaperIoScene.ts +0 -310
  403. package/src/games/penguin-run/PenguinMeshes.ts +0 -269
  404. package/src/games/penguin-run/PenguinModel.ts +0 -712
  405. package/src/games/penguin-run/PenguinRun.tsx +0 -77
  406. package/src/games/penguin-run/PenguinRunConstants.ts +0 -69
  407. package/src/games/penguin-run/PenguinRunGame.ts +0 -406
  408. package/src/games/penguin-run/PenguinRunScene.ts +0 -949
  409. package/src/games/perfect-circle/PerfectCircle.tsx +0 -74
  410. package/src/games/perfect-circle/PerfectCircleConstants.ts +0 -52
  411. package/src/games/perfect-circle/PerfectCircleGame.ts +0 -153
  412. package/src/games/perfect-circle/PerfectCircleRules.ts +0 -111
  413. package/src/games/perfect-circle/PerfectCircleScene.ts +0 -176
  414. package/src/games/pipe-connect/PipeConnect.tsx +0 -69
  415. package/src/games/pipe-connect/PipeConnectConstants.ts +0 -101
  416. package/src/games/pipe-connect/PipeConnectGame.ts +0 -179
  417. package/src/games/pipe-connect/PipeConnectRules.ts +0 -326
  418. package/src/games/pipe-connect/PipeConnectScene.ts +0 -271
  419. package/src/games/play-with-tua/PlayWithTua.tsx +0 -123
  420. package/src/games/play-with-tua/PlayWithTuaConstants.ts +0 -70
  421. package/src/games/play-with-tua/PlayWithTuaGame.ts +0 -167
  422. package/src/games/play-with-tua/PlayWithTuaModel.ts +0 -42
  423. package/src/games/play-with-tua/PlayWithTuaScene.ts +0 -36
  424. package/src/games/popit-fidget/PopitFidget.tsx +0 -72
  425. package/src/games/popit-fidget/PopitFidgetConstants.ts +0 -71
  426. package/src/games/popit-fidget/PopitFidgetGame.ts +0 -148
  427. package/src/games/popit-fidget/PopitFidgetScene.ts +0 -242
  428. package/src/games/reversi/Reversi.tsx +0 -94
  429. package/src/games/reversi/ReversiConstants.ts +0 -67
  430. package/src/games/reversi/ReversiGame.ts +0 -266
  431. package/src/games/reversi/ReversiRules.ts +0 -176
  432. package/src/games/reversi/ReversiScene.ts +0 -240
  433. package/src/games/search-grid/SearchGrid.tsx +0 -92
  434. package/src/games/search-grid/SearchGridConstants.ts +0 -178
  435. package/src/games/search-grid/SearchGridGame.ts +0 -209
  436. package/src/games/search-grid/SearchGridScene.ts +0 -301
  437. package/src/games/shared/BackdropCard.tsx +0 -54
  438. package/src/games/shared/EngineBackdrop.ts +0 -300
  439. package/src/games/shared/EngineBlasts.ts +0 -136
  440. package/src/games/shared/EngineBlocks.ts +0 -91
  441. package/src/games/shared/EngineControlText.ts +0 -17
  442. package/src/games/shared/EngineDice.ts +0 -250
  443. package/src/games/shared/EngineFootprint.ts +0 -35
  444. package/src/games/shared/EngineFruits.ts +0 -1435
  445. package/src/games/shared/EngineGameLoader.tsx +0 -88
  446. package/src/games/shared/EngineGameScreen.tsx +0 -325
  447. package/src/games/shared/EngineGameWidth.ts +0 -3
  448. package/src/games/shared/EngineGameWidth.web.ts +0 -3
  449. package/src/games/shared/EngineGlyphs.ts +0 -178
  450. package/src/games/shared/EngineHud.ts +0 -815
  451. package/src/games/shared/EngineLoading.ts +0 -477
  452. package/src/games/shared/EngineMeadow.ts +0 -725
  453. package/src/games/shared/EngineMeshCache.ts +0 -15
  454. package/src/games/shared/EngineMeshes.ts +0 -10
  455. package/src/games/shared/EngineRacingChase.ts +0 -21
  456. package/src/games/shared/EngineRacingHandling.ts +0 -48
  457. package/src/games/shared/EngineReadyContext.ts +0 -4
  458. package/src/games/shared/EngineTilt.ts +0 -44
  459. package/src/games/shared/EngineTouchSurface.tsx +0 -103
  460. package/src/games/shared/EngineUtils.ts +0 -52
  461. package/src/games/shared/GameActivity.ts +0 -13
  462. package/src/games/shared/GameLoading.tsx +0 -202
  463. package/src/games/shared/GameLoadingTransition.tsx +0 -61
  464. package/src/games/shared/ProceduralCacheVersion.ts +0 -2
  465. package/src/games/shared/useEngineGame.ts +0 -240
  466. package/src/games/shared/useGameResource.ts +0 -21
  467. package/src/games/shared/useLiveState.ts +0 -58
  468. package/src/games/sliding-numbers/SlidingNumbers.tsx +0 -71
  469. package/src/games/sliding-numbers/SlidingNumbersConstants.ts +0 -65
  470. package/src/games/sliding-numbers/SlidingNumbersGame.ts +0 -192
  471. package/src/games/sliding-numbers/SlidingNumbersRules.ts +0 -79
  472. package/src/games/sliding-numbers/SlidingNumbersScene.ts +0 -193
  473. package/src/games/snake-3d/Snake3D.tsx +0 -76
  474. package/src/games/snake-3d/Snake3DConstants.ts +0 -61
  475. package/src/games/snake-3d/Snake3DGame.ts +0 -192
  476. package/src/games/snake-3d/Snake3DMotion.ts +0 -22
  477. package/src/games/snake-3d/Snake3DRules.ts +0 -116
  478. package/src/games/snake-3d/Snake3DScene.ts +0 -322
  479. package/src/games/snakes-and-ladders/SnakesAndLadders.tsx +0 -87
  480. package/src/games/snakes-and-ladders/SnakesAndLaddersConstants.ts +0 -136
  481. package/src/games/snakes-and-ladders/SnakesAndLaddersGame.ts +0 -310
  482. package/src/games/snakes-and-ladders/SnakesAndLaddersScene.ts +0 -515
  483. package/src/games/space-fighter/SpaceFighter.tsx +0 -74
  484. package/src/games/space-fighter/SpaceFighterConstants.ts +0 -86
  485. package/src/games/space-fighter/SpaceFighterGame.ts +0 -292
  486. package/src/games/space-fighter/SpaceFighterScene.ts +0 -550
  487. package/src/games/spider-solitaire/SpiderSolitaire.tsx +0 -80
  488. package/src/games/spider-solitaire/SpiderSolitaireConstants.ts +0 -107
  489. package/src/games/spider-solitaire/SpiderSolitaireGame.ts +0 -387
  490. package/src/games/spider-solitaire/SpiderSolitaireRules.ts +0 -123
  491. package/src/games/spider-solitaire/SpiderSolitaireScene.ts +0 -352
  492. package/src/games/stack-tower/StackTower.tsx +0 -76
  493. package/src/games/stack-tower/StackTowerConstants.ts +0 -74
  494. package/src/games/stack-tower/StackTowerGame.ts +0 -236
  495. package/src/games/stack-tower/StackTowerScene.ts +0 -186
  496. package/src/games/sudoku/Sudoku.tsx +0 -73
  497. package/src/games/sudoku/SudokuConstants.ts +0 -127
  498. package/src/games/sudoku/SudokuGame.ts +0 -250
  499. package/src/games/sudoku/SudokuRules.ts +0 -125
  500. package/src/games/sudoku/SudokuScene.ts +0 -304
  501. package/src/games/tangram/Tangram.tsx +0 -79
  502. package/src/games/tangram/TangramConstants.ts +0 -64
  503. package/src/games/tangram/TangramGame.ts +0 -356
  504. package/src/games/tangram/TangramRules.ts +0 -409
  505. package/src/games/tangram/TangramScene.ts +0 -203
  506. package/src/games/tank-1990/Tank1990.tsx +0 -78
  507. package/src/games/tank-1990/Tank1990Constants.ts +0 -81
  508. package/src/games/tank-1990/Tank1990Game.ts +0 -331
  509. package/src/games/tank-1990/Tank1990Rules.ts +0 -390
  510. package/src/games/tank-1990/Tank1990Scene.ts +0 -434
  511. package/src/games/tic-tac-toe/TicTacToe.tsx +0 -98
  512. package/src/games/tic-tac-toe/TicTacToeConstants.ts +0 -69
  513. package/src/games/tic-tac-toe/TicTacToeGame.ts +0 -200
  514. package/src/games/tic-tac-toe/TicTacToeRules.ts +0 -103
  515. package/src/games/tic-tac-toe/TicTacToeScene.ts +0 -245
  516. package/src/games/tile-home/TileHome.tsx +0 -92
  517. package/src/games/tile-home/TileHomeConstants.ts +0 -139
  518. package/src/games/tile-home/TileHomeGame.ts +0 -435
  519. package/src/games/tile-home/TileHomeScene.ts +0 -154
  520. package/src/games/treasure-hunt/TreasureHunt.tsx +0 -206
  521. package/src/games/treasure-hunt/TreasureHuntConstants.ts +0 -266
  522. package/src/games/treasure-hunt/TreasureHuntControls.ts +0 -280
  523. package/src/games/treasure-hunt/TreasureHuntGame.ts +0 -402
  524. package/src/games/treasure-hunt/TreasureHuntMeshes.ts +0 -422
  525. package/src/games/treasure-hunt/TreasureHuntModel.ts +0 -506
  526. package/src/games/treasure-hunt/TreasureHuntRules.ts +0 -1210
  527. package/src/games/treasure-hunt/TreasureHuntScene.ts +0 -586
  528. package/src/games/whack-a-mole/WhackAMole.tsx +0 -79
  529. package/src/games/whack-a-mole/WhackAMoleConstants.ts +0 -94
  530. package/src/games/whack-a-mole/WhackAMoleGame.ts +0 -233
  531. package/src/games/whack-a-mole/WhackAMoleScene.ts +0 -349
  532. package/src/games/word-search/WordSearch.tsx +0 -18
  533. package/src/games/word-search/WordSearchWords.ts +0 -1642
  534. package/src/helpers/GamePatternData.ts +0 -120
  535. package/src/helpers/GameSettingsModal.tsx +0 -384
  536. package/src/helpers/GameTheme.tsx +0 -37
  537. package/src/helpers/IconPaths.ts +0 -6
  538. package/src/helpers/index.ts +0 -2
  539. package/src/index.tsx +0 -60
  540. package/src/services/GameAssetLoader.ts +0 -111
  541. package/src/services/GameAssets.ts +0 -149
  542. package/src/services/GameLoaders.ts +0 -93
  543. package/src/services/GamesConstants.ts +0 -193
  544. package/src/services/GamesMetadata.ts +0 -711
  545. package/src/services/GamesService.ts +0 -116
  546. package/src/services/HapticsService.ts +0 -48
  547. package/src/services/ScoringService.ts +0 -19
  548. package/src/services/SfxSources.ts +0 -81
  549. package/src/services/SoundsService.ts +0 -582
  550. package/src/services/ThemeService.ts +0 -281
  551. package/src/services/UtilsService.ts +0 -134
  552. package/src/services/index.ts +0 -6
@@ -1,471 +0,0 @@
1
- // Block Blast's rules, with no React: build a run with `createGame`, give it a layout, `start` it and
2
- // `tick` it every frame. Drag a tray piece onto the 9x9 board; full rows and columns clear. Survive the
3
- // timer to win; run out of room for every tray piece and it's over. The screen listens through `on…`.
4
- import { type Camera, type Color, type Entity, World } from '@nayan-ui/engine';
5
- import type { GameTheme } from '../../services/ThemeService';
6
- import { setBackdropTheme } from '../shared/EngineBackdrop';
7
- import { popAndBurst } from '../shared/EngineBlasts';
8
- import {
9
- BLOCK_COLORS,
10
- BLOCK_SHAPES,
11
- CELL_GAP,
12
- CLEAR_RIPPLE,
13
- CLEAR_TIME,
14
- DEAL_TIME,
15
- DRAG_LIFT,
16
- FLASH_AMOUNT,
17
- FLASH_TIME,
18
- flat,
19
- GAME_DURATION,
20
- GRID_SIZE,
21
- type Layout,
22
- LIFT_TIME,
23
- NEXT_PIECES_COUNT,
24
- PICKUP_SPRING,
25
- POINTS_PER_BLOCK,
26
- POINTS_PER_LINE,
27
- RETURN_TIME,
28
- tint,
29
- toColor,
30
- TRAY_SCALE
31
- } from './BlockBlastConstants';
32
- import {
33
- blockBurst,
34
- blockScale,
35
- type Board,
36
- type BoardColors,
37
- buildBoard,
38
- colorBoard,
39
- dragZ,
40
- setOverlay,
41
- spawnBlock,
42
- spawnPiece,
43
- toWorld,
44
- trayZ
45
- } from './BlockBlastScene';
46
-
47
- export type Phase = 'ready' | 'playing' | 'over';
48
-
49
- type Shape = readonly (readonly number[])[];
50
- type Piece = { shape: Shape; css: string; color: Color; root: Entity | null };
51
- type Drag = {
52
- slot: number;
53
- /** Finger offset from the piece's centre at pickup, so the piece doesn't jump to the finger. */
54
- offsetX: number;
55
- offsetY: number;
56
- x: number;
57
- y: number;
58
- liftedAt: number;
59
- /** Drop target: top-left cell, or null when not over the board. */
60
- row: number | null;
61
- col: number | null;
62
- valid: boolean;
63
- returning: boolean;
64
- drawnX?: number;
65
- drawnY?: number;
66
- };
67
-
68
- const CELLS = GRID_SIZE * GRID_SIZE;
69
- const WORLD_CAPACITY = 1600; // board + overlays (~330), blocks (81), tray, and blast particles
70
-
71
- const randomPiece = (): Piece => {
72
- const shape = BLOCK_SHAPES[Math.floor(Math.random() * BLOCK_SHAPES.length)]!;
73
- const css = BLOCK_COLORS[Math.floor(Math.random() * BLOCK_COLORS.length)]!;
74
- return { shape, css, color: toColor(css), root: null };
75
- };
76
-
77
- const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3);
78
-
79
- export function createGame(theme: GameTheme) {
80
- const world = new World(WORLD_CAPACITY);
81
- const camera: Camera = { eye: [0, 0, 200], target: [0, 0, 0], fov: 1, ortho: 1 };
82
- const g = {
83
- world,
84
- camera,
85
- colors: theme.BOARD as BoardColors,
86
- /** For the screen background (theme color and pattern, see EngineBackdrop). */
87
- theme,
88
- layout: null as Layout | null,
89
- board: null as Board | null,
90
- phase: 'ready' as Phase,
91
- time: 0,
92
- /** Score and the countdown live in the engine (Rust), advanced by world.update. */
93
- get score() {
94
- return world.scoreboard.score;
95
- },
96
- get timeLeft() {
97
- return world.scoreboard.shownSeconds;
98
- },
99
- won: false,
100
- /** Each cell's color (css, for the line-clear sound check), or null. */
101
- grid: new Array<string | null>(CELLS).fill(null),
102
- gridColors: new Array<Color | null>(CELLS).fill(null),
103
- blocks: new Array<Entity | null>(CELLS).fill(null),
104
- pieces: Array.from({ length: NEXT_PIECES_COUNT }, randomPiece),
105
- drag: null as Drag | null,
106
- /** What each preview overlay shows, so a hover only touches the cells that changed. */
107
- ghostShown: new Array<Color | null>(CELLS).fill(null),
108
- previewColors: new Map<string, Color>(),
109
- highlightShown: new Array<boolean>(CELLS).fill(false),
110
- // UI hooks, set by the screen.
111
- onPhase: (_p: Phase) => {},
112
- onScore: (_s: number) => {},
113
- onTime: (_t: number) => {},
114
- onPick: () => {},
115
- onInvalid: () => {},
116
- onPlace: () => {},
117
- onClear: (_lines: number) => {},
118
- onGameOver: () => {}
119
- };
120
- world.scoreboard.reset(0, GAME_DURATION);
121
- world.scoreboard.handlers = {
122
- onSecond: (t) => g.onTime(t),
123
- onTimeUp: () => g.phase === 'playing' && end(g, true)
124
- };
125
- return g;
126
- }
127
- export type Game = ReturnType<typeof createGame>;
128
-
129
- // ── Scene ─────────────────────────────────────────────────────────────
130
-
131
- /** Lays the scene out for the view (first layout, rotation, header height): rebuilt from the run's state. */
132
- export function setLayout(g: Game, l: Layout) {
133
- const w = g.world;
134
- cancelDrag(g);
135
- if (g.board) {
136
- const b = g.board;
137
- for (const e of [b.backdrop, b.rim, b.panel, ...b.empties, ...b.highlights, ...b.ghosts]) w.despawn(e);
138
- }
139
- for (let i = 0; i < CELLS; i++) {
140
- if (g.blocks[i] != null) w.despawn(g.blocks[i]!);
141
- const color = g.gridColors[i];
142
- g.blocks[i] = color ? spawnBlock(w, l, Math.floor(i / GRID_SIZE), i % GRID_SIZE, color) : null;
143
- }
144
- g.layout = l;
145
- g.camera.ortho = l.height / 2;
146
- g.board = buildBoard(w, l, g.colors, g.theme);
147
- g.ghostShown.fill(null);
148
- g.highlightShown.fill(false);
149
- g.pieces.forEach((p, slot) => placeInTray(g, p, slot, false));
150
- }
151
-
152
- /** Repaints the board and background for a new theme without touching the run. */
153
- export function setTheme(g: Game, theme: GameTheme) {
154
- g.colors = theme.BOARD;
155
- g.theme = theme;
156
- if (g.board) {
157
- colorBoard(g.world, g.board, g.colors);
158
- setBackdropTheme(g.world, g.board.backdrop, theme);
159
- }
160
- }
161
-
162
- function placeInTray(g: Game, p: Piece, slot: number, pop: boolean) {
163
- const l = g.layout;
164
- if (!l) return;
165
- if (p.root != null) g.world.despawn(p.root);
166
- p.root = spawnPiece(g.world, l, p.shape, p.color, l.slots[slot]!, pop ? 0 : TRAY_SCALE);
167
- if (pop) g.world.animate(p.root, { scale: TRAY_SCALE }, { duration: DEAL_TIME, easing: 'back' });
168
- }
169
-
170
- // ── Run ───────────────────────────────────────────────────────────────
171
-
172
- export function start(g: Game) {
173
- if (g.phase !== 'ready') return;
174
- g.phase = 'playing';
175
- g.world.scoreboard.startCountdown(GAME_DURATION);
176
- g.onPhase('playing');
177
- }
178
-
179
- /** A fresh board and tray (Stop, Play Again). The world, and the GPU view drawing it, are kept. */
180
- export function reset(g: Game) {
181
- cancelDrag(g);
182
- for (let i = 0; i < CELLS; i++) {
183
- if (g.blocks[i] != null) g.world.despawn(g.blocks[i]!);
184
- g.blocks[i] = null;
185
- g.grid[i] = null;
186
- g.gridColors[i] = null;
187
- }
188
- for (const p of g.pieces) if (p.root != null) g.world.despawn(p.root);
189
- g.pieces = Array.from({ length: NEXT_PIECES_COUNT }, randomPiece);
190
- g.pieces.forEach((p, slot) => placeInTray(g, p, slot, true));
191
- g.world.scoreboard.reset(0, GAME_DURATION);
192
- g.won = false;
193
- g.phase = 'ready';
194
- g.onScore(0);
195
- g.onTime(GAME_DURATION);
196
- g.onPhase('ready');
197
- }
198
-
199
- export function dispose(g: Game) {
200
- g.world.dispose();
201
- }
202
-
203
- function end(g: Game, won: boolean) {
204
- g.world.scoreboard.stop();
205
- cancelDrag(g);
206
- g.won = won;
207
- g.phase = 'over';
208
- if (!won) g.onGameOver();
209
- g.onPhase('over');
210
- }
211
-
212
- export function tick(g: Game, dt: number) {
213
- if (g.world.isDisposed) return;
214
- g.time += dt;
215
- // The held piece follows the finger, lifting above it just after pickup.
216
- const d = g.drag;
217
- const l = g.layout;
218
- const root = d ? g.pieces[d.slot]?.root : null;
219
- if (d && l && root != null && !d.returning) {
220
- const lift = DRAG_LIFT * easeOutCubic(Math.min(1, (g.time - d.liftedAt) / LIFT_TIME));
221
- const x = d.x - d.offsetX,
222
- y = d.y - d.offsetY - lift;
223
- if (x !== d.drawnX || y !== d.drawnY) {
224
- d.drawnX = x;
225
- d.drawnY = y;
226
- g.world.set(root, { position: toWorld(l, x, y, dragZ) });
227
- }
228
- }
229
- g.world.update(dt);
230
- }
231
-
232
- // ── Rules ─────────────────────────────────────────────────────────────
233
-
234
- function fits(g: Game, shape: Shape, row: number, col: number) {
235
- for (let r = 0; r < shape.length; r++) {
236
- const line = shape[r]!;
237
- for (let c = 0; c < line.length; c++) {
238
- if (line[c] !== 1) continue;
239
- const gr = row + r;
240
- const gc = col + c;
241
- if (gr < 0 || gr >= GRID_SIZE || gc < 0 || gc >= GRID_SIZE || g.grid[gr * GRID_SIZE + gc] !== null) return false;
242
- }
243
- }
244
- return true;
245
- }
246
-
247
- function anyMoveLeft(g: Game) {
248
- for (const p of g.pieces) {
249
- for (let row = 0; row < GRID_SIZE; row++) for (let col = 0; col < GRID_SIZE; col++) if (fits(g, p.shape, row, col)) return true;
250
- }
251
- return false;
252
- }
253
-
254
- /** Rows and columns that would be full with `extra` cells filled too. */
255
- function fullLines(g: Game, extra?: Set<number>) {
256
- const filled = (i: number) => g.grid[i] !== null || !!extra?.has(i);
257
- const rows: number[] = [];
258
- const cols: number[] = [];
259
- for (let i = 0; i < GRID_SIZE; i++) {
260
- let row = true;
261
- let col = true;
262
- for (let j = 0; j < GRID_SIZE && (row || col); j++) {
263
- if (row && !filled(i * GRID_SIZE + j)) row = false;
264
- if (col && !filled(j * GRID_SIZE + i)) col = false;
265
- }
266
- if (row) rows.push(i);
267
- if (col) cols.push(i);
268
- }
269
- return { rows, cols };
270
- }
271
-
272
- function cellsOf(shape: Shape, row: number, col: number) {
273
- const cells: number[] = [];
274
- shape.forEach((line, r) => line.forEach((v, c) => v === 1 && cells.push((row + r) * GRID_SIZE + col + c)));
275
- return cells;
276
- }
277
-
278
- function place(g: Game, slot: number, row: number, col: number) {
279
- const l = g.layout!;
280
- const w = g.world;
281
- const piece = g.pieces[slot]!;
282
- const cells = cellsOf(piece.shape, row, col);
283
- // The piece lands as board blocks, with a short white glint.
284
- const placed: Entity[] = [];
285
- for (const i of cells) {
286
- g.grid[i] = piece.css;
287
- g.gridColors[i] = piece.color;
288
- const block = spawnBlock(w, l, Math.floor(i / GRID_SIZE), i % GRID_SIZE, tint(piece.color, FLASH_AMOUNT));
289
- g.blocks[i] = block;
290
- placed.push(block);
291
- }
292
- w.animate(placed, { color: piece.color }, { duration: FLASH_TIME });
293
- g.world.scoreboard.add(cells.length * POINTS_PER_BLOCK);
294
- // Refill the slot in place, so the other pieces stay where the player left them.
295
- if (piece.root != null) w.despawn(piece.root);
296
- g.pieces[slot] = randomPiece();
297
- placeInTray(g, g.pieces[slot]!, slot, true);
298
- g.onPlace();
299
-
300
- const { rows, cols } = fullLines(g);
301
- const lines = rows.length + cols.length;
302
- if (lines > 0) {
303
- const clearing = new Set<number>();
304
- for (const r of rows) for (let c = 0; c < GRID_SIZE; c++) clearing.add(r * GRID_SIZE + c);
305
- for (const c of cols) for (let r = 0; r < GRID_SIZE; r++) clearing.add(r * GRID_SIZE + c);
306
- // Each block pops and bursts in turn, rippling out from where the piece landed (as Tile Home's matches)
307
- const landedRow = cells.reduce((sum, i) => sum + Math.floor(i / GRID_SIZE), 0) / cells.length;
308
- const landedCol = cells.reduce((sum, i) => sum + (i % GRID_SIZE), 0) / cells.length;
309
- for (const i of clearing) {
310
- const row = Math.floor(i / GRID_SIZE);
311
- const col = i % GRID_SIZE;
312
- const delay = Math.hypot(row - landedRow, col - landedCol) * CLEAR_RIPPLE;
313
- const color = g.gridColors[i];
314
- const block = g.blocks[i];
315
- if (block != null && color) {
316
- popAndBurst(w, block, { scale: blockScale(l), color, delay, duration: CLEAR_TIME }, blockBurst(l, row, col, color)).then(() =>
317
- w.despawn(block)
318
- );
319
- }
320
- g.blocks[i] = null;
321
- g.grid[i] = null;
322
- g.gridColors[i] = null;
323
- }
324
- g.world.scoreboard.add(lines * POINTS_PER_LINE);
325
- g.onClear(lines);
326
- }
327
- g.onScore(g.score);
328
- if (!anyMoveLeft(g)) end(g, false);
329
- }
330
-
331
- // ── Dragging ──────────────────────────────────────────────────────────
332
-
333
- /** Finger down: picks up the tray piece under it (anywhere in its slot). */
334
- export function dragStart(g: Game, x: number, y: number) {
335
- const l = g.layout;
336
- if (!l || g.phase !== 'playing' || g.drag) return;
337
- if (y < l.trayTop - 20 || y > l.trayTop + l.trayHeight + 20) return;
338
- const slot = l.slots.findIndex(([sx]) => Math.abs(x - sx) <= l.slotWidth / 2);
339
- const root = slot >= 0 ? g.pieces[slot]?.root : null;
340
- if (root == null) return;
341
- const [sx, sy] = l.slots[slot]!;
342
- g.onPick();
343
- g.drag = { slot, offsetX: x - sx, offsetY: y - sy, x, y, liftedAt: g.time, row: null, col: null, valid: false, returning: false };
344
- g.world.stopAnimation(root);
345
- g.world.animate(root, { scale: 1 }, { spring: PICKUP_SPRING });
346
- }
347
-
348
- export function dragMove(g: Game, x: number, y: number) {
349
- const d = g.drag;
350
- const l = g.layout;
351
- if (!d || !l || d.returning) return;
352
- d.x = x;
353
- d.y = y;
354
- // The drop target is where the lifted piece is drawn: its top-left cell, snapped to the nearest.
355
- const shape = g.pieces[d.slot]!.shape;
356
- const rows = shape.length;
357
- const cols = shape[0]?.length ?? 0;
358
- const cx = x - d.offsetX;
359
- const cy = y - d.offsetY - DRAG_LIFT;
360
- const half = l.step / 2;
361
- const over = cx > l.boardLeft - half && cx < l.boardLeft + l.boardSize + half && cy > l.boardTop - half && cy < l.boardTop + l.boardSize + half;
362
- // First cell's centre (cx - (cols - 1) / 2 * step) against cell 0's centre (boardLeft + gap + cell / 2)
363
- const col = over ? Math.round((cx - (cols * l.step) / 2 - CELL_GAP / 2 - l.boardLeft) / l.step) : null;
364
- const row = over ? Math.round((cy - (rows * l.step) / 2 - CELL_GAP / 2 - l.boardTop) / l.step) : null;
365
- if (row === d.row && col === d.col) return;
366
- d.row = row;
367
- d.col = col;
368
- d.valid = row !== null && col !== null && fits(g, shape, row, col);
369
- showPreview(g);
370
- }
371
-
372
- /** Finger up: drops the piece if it fits, otherwise it flies back to its slot. */
373
- export function dragEnd(g: Game) {
374
- const d = g.drag;
375
- const l = g.layout;
376
- if (!d || !l || d.returning) return;
377
- if (d.valid && d.row !== null && d.col !== null && g.phase === 'playing') {
378
- g.drag = null;
379
- clearPreview(g);
380
- place(g, d.slot, d.row, d.col);
381
- return;
382
- }
383
- if (g.phase === 'playing' && d.row !== null && d.col !== null) g.onInvalid();
384
- d.returning = true;
385
- clearPreview(g);
386
- const root = g.pieces[d.slot]?.root;
387
- if (root == null) {
388
- g.drag = null;
389
- return;
390
- }
391
- const [sx, sy] = l.slots[d.slot]!;
392
- g.world.animate(root, { position: toWorld(l, sx, sy, trayZ(l)), scale: TRAY_SCALE }, { duration: RETURN_TIME }).then(() => {
393
- if (g.drag === d) g.drag = null;
394
- });
395
- }
396
-
397
- /** Puts a held piece straight back (game over, Stop, relayout). */
398
- function cancelDrag(g: Game) {
399
- const d = g.drag;
400
- if (!d) return;
401
- g.drag = null;
402
- clearPreview(g);
403
- const l = g.layout;
404
- const root = g.pieces[d.slot]?.root;
405
- if (!l || root == null) return;
406
- const [sx, sy] = l.slots[d.slot]!;
407
- g.world.stopAnimation(root);
408
- g.world.set(root, { position: toWorld(l, sx, sy, trayZ(l)), scale: TRAY_SCALE });
409
- }
410
-
411
- // ── Drop preview ──────────────────────────────────────────────────────
412
-
413
- // Scratch for the next preview; applyPreview only touches overlays whose content changed (a hover
414
- // changes a handful of cells, not all 81).
415
- const ghosts = new Array<Color | null>(CELLS);
416
- const highlights = new Array<boolean>(CELLS);
417
-
418
- function showPreview(g: Game) {
419
- const d = g.drag;
420
- ghosts.fill(null);
421
- highlights.fill(false);
422
- if (d && d.row !== null && d.col !== null) {
423
- const piece = g.pieces[d.slot]!;
424
- const css = d.valid ? piece.css : g.colors.CELL_INVALID;
425
- const key = `${css}:${d.valid}`;
426
- let ghost = g.previewColors.get(key);
427
- if (!ghost) {
428
- ghost = flat(toColor(css, d.valid ? 0.5 : 0.3));
429
- g.previewColors.set(key, ghost);
430
- }
431
- const covered = new Set<number>();
432
- piece.shape.forEach((line, r) =>
433
- line.forEach((v, c) => {
434
- const gr = d.row! + r;
435
- const gc = d.col! + c;
436
- if (v !== 1 || gr < 0 || gr >= GRID_SIZE || gc < 0 || gc >= GRID_SIZE) return;
437
- ghosts[gr * GRID_SIZE + gc] = ghost;
438
- covered.add(gr * GRID_SIZE + gc);
439
- })
440
- );
441
- // Light up the lines this drop would complete, so the player sees the clear coming.
442
- if (d.valid) {
443
- const { rows, cols } = fullLines(g, covered);
444
- for (const r of rows) for (let c = 0; c < GRID_SIZE; c++) highlights[r * GRID_SIZE + c] = true;
445
- for (const c of cols) for (let r = 0; r < GRID_SIZE; r++) highlights[r * GRID_SIZE + c] = true;
446
- }
447
- }
448
- applyPreview(g);
449
- }
450
-
451
- function clearPreview(g: Game) {
452
- ghosts.fill(null);
453
- highlights.fill(false);
454
- applyPreview(g);
455
- }
456
-
457
- function applyPreview(g: Game) {
458
- const b = g.board;
459
- if (!b) return;
460
- const highlight = flat(toColor(g.colors.CELL_HIGHLIGHT));
461
- for (let i = 0; i < CELLS; i++) {
462
- if (ghosts[i] !== g.ghostShown[i]) {
463
- g.ghostShown[i] = ghosts[i]!;
464
- setOverlay(g.world, b.ghosts[i]!, ghosts[i]!);
465
- }
466
- if (highlights[i] !== g.highlightShown[i]) {
467
- g.highlightShown[i] = highlights[i]!;
468
- setOverlay(g.world, b.highlights[i]!, highlights[i] ? highlight : null);
469
- }
470
- }
471
- }
@@ -1,156 +0,0 @@
1
- // Everything Block Blast draws. The camera is orthographic with one world unit per point, looking
2
- // down -z: x runs right and y runs up from the view's centre, so layout maths stays in screen points.
3
- // Depth comes from the glossy bevelled pieces, lit directly overhead without drop shadows.
4
- import { type Color, type Entity, extrude, type Model, Path, type Vec3, type World } from '@nayan-ui/engine';
5
- import type { GameTheme } from '../../services/ThemeService';
6
- import { spawnBackdrop } from '../shared/EngineBackdrop';
7
- import type { PopBurstOptions } from '../shared/EngineBlasts';
8
- import { raisedBlockScale, spawnRaisedBlock } from '../shared/EngineBlocks';
9
- import { createGameMesh as createShape } from '../shared/EngineMeshes';
10
- import { CELL_GAP, flat, GRID_SIZE, type Layout, toColor } from './BlockBlastConstants';
11
-
12
- // Depth order toward the camera
13
- const Z_BACKDROP = -20;
14
- const Z_BOARD = 0;
15
- const Z_EMPTY = 1.2;
16
- const Z_TRAY = 2;
17
- const Z_DRAG = 80;
18
-
19
- /** A view point (from the top-left) at depth `z`, in world space. */
20
- export const toWorld = (l: Layout, x: number, y: number, z = 0): Vec3 => [x - l.width / 2, l.height / 2 - y, z];
21
-
22
- /** Centre of a board cell, in view points. */
23
- export const cellCenter = (l: Layout, row: number, col: number): [number, number] => [
24
- l.boardLeft + CELL_GAP + col * l.step + l.cell / 2,
25
- l.boardTop + CELL_GAP + row * l.step + l.cell / 2
26
- ];
27
-
28
- const blockZ = (l: Layout) => Z_EMPTY + l.depth / 2 + 0.4;
29
- const highlightZ = (l: Layout) => Z_EMPTY + l.depth + 2;
30
- const ghostZ = (l: Layout) => Z_EMPTY + l.depth + 3;
31
- export const trayZ = (l: Layout) => Z_TRAY + l.depth / 2;
32
- export const dragZ = Z_DRAG;
33
-
34
- export type BoardColors = GameTheme['BOARD'];
35
-
36
- /** The board: its panel and rim, the empty slots, and per-cell overlays for the drop preview. */
37
- export type Board = {
38
- /** The game background (theme color and pattern), behind everything. */
39
- backdrop: Entity;
40
- rim: Entity;
41
- panel: Entity;
42
- empties: Entity[];
43
- /** Lines the hovered drop would complete. */
44
- highlights: Entity[];
45
- /** The hovered piece's cells (its color, or the invalid color). */
46
- ghosts: Entity[];
47
- };
48
-
49
- const HIDDEN = 0;
50
- const SHOWN = 1;
51
- // Corner radii, as the original board drew them
52
- const BOARD_RADIUS = 8;
53
- const CELL_RADIUS = 4;
54
- const RIM_WIDTH = 1;
55
-
56
- // Flat rounded rectangles in points (one-sided, facing the camera), made once per size: mesh ids are
57
- // app-wide and limited, and a device only ever needs one board size.
58
- const panels = new Map<string, Model>();
59
- function roundedPanel(size: number, radius: number, rim = 0): Model {
60
- const key = `${size}:${radius}:${rim}`;
61
- let mesh = panels.get(key);
62
- if (!mesh) {
63
- const path = new Path().addRoundedRect(0, 0, size, size, radius);
64
- // A rim is the outline only: the inner rounded rect cuts it out.
65
- if (rim > 0) path.addRoundedRect(rim, rim, size - rim * 2, size - rim * 2, radius - rim);
66
- mesh = createShape(extrude(path, { depth: 0, fillRule: 'evenodd' }));
67
- panels.set(key, mesh);
68
- }
69
- return mesh;
70
- }
71
-
72
- export function buildBoard(world: World, l: Layout, colors: BoardColors, theme: GameTheme): Board {
73
- const centre = toWorld(l, l.boardLeft + l.boardSize / 2, l.boardTop + l.boardSize / 2);
74
- const cellMesh = roundedPanel(l.cell, CELL_RADIUS);
75
- const flatCell = (position: Vec3, scale: number) => world.spawn({ mesh: cellMesh, position, scale, color: [1, 1, 1, 0], pickable: false });
76
- // The panel covers every cell plus the gap around them; the rim is drawn over its edge, like a stroke.
77
- const panel = world.spawn({ mesh: roundedPanel(l.boardSize, BOARD_RADIUS), position: [centre[0], centre[1], Z_BOARD], pickable: false });
78
- const rim = world.spawn({
79
- mesh: roundedPanel(l.boardSize, BOARD_RADIUS, RIM_WIDTH),
80
- position: [centre[0], centre[1], Z_BOARD + 0.5],
81
- pickable: false
82
- });
83
- const empties: Entity[] = [];
84
- const highlights: Entity[] = [];
85
- const ghosts: Entity[] = [];
86
- for (let row = 0; row < GRID_SIZE; row++) {
87
- for (let col = 0; col < GRID_SIZE; col++) {
88
- const [x, y] = cellCenter(l, row, col);
89
- empties.push(flatCell(toWorld(l, x, y, Z_EMPTY), SHOWN));
90
- highlights.push(flatCell(toWorld(l, x, y, highlightZ(l)), HIDDEN));
91
- ghosts.push(flatCell(toWorld(l, x, y, ghostZ(l)), HIDDEN));
92
- }
93
- }
94
- const backdrop = spawnBackdrop(world, l.width, l.height, Z_BACKDROP, theme);
95
- const board = { backdrop, rim, panel, empties, highlights, ghosts };
96
- colorBoard(world, board, colors);
97
- return board;
98
- }
99
-
100
- /** Repaints the board for a theme (the run carries on). */
101
- export function colorBoard(world: World, b: Board, colors: BoardColors) {
102
- world.set(b.rim, { color: flat(toColor(colors.BORDER)) });
103
- world.set(b.panel, { color: flat(toColor(colors.SURFACE)) });
104
- const empty = flat(toColor(colors.CELL_EMPTY));
105
- for (const e of b.empties) world.set(e, { color: empty });
106
- }
107
-
108
- /** Shows or hides a preview overlay (`null` hides it). */
109
- export function setOverlay(world: World, overlay: Entity, color: Color | null) {
110
- world.set(overlay, color ? { scale: SHOWN, color } : { scale: HIDDEN });
111
- }
112
-
113
- // ── Blocks (shared/EngineBlocks: glossy and bevelled, without drop shadows) ─────────
114
-
115
- const blockSize = (l: Layout): Vec3 => [l.cell, l.cell, l.depth];
116
-
117
- /** A block at `position`, under `parent` if given. */
118
- const spawnBlockAt = (world: World, l: Layout, position: Vec3, color: Color, parent?: Entity) =>
119
- spawnRaisedBlock(world, { position, size: blockSize(l), color, parent, shadow: false });
120
-
121
- /** A placed block on the board. */
122
- export function spawnBlock(world: World, l: Layout, row: number, col: number, color: Color): Entity {
123
- const [x, y] = cellCenter(l, row, col);
124
- return spawnBlockAt(world, l, toWorld(l, x, y, blockZ(l)), color);
125
- }
126
-
127
- /** A piece: an invisible root at its centre with one block per cell, at `scale` of board size. */
128
- export function spawnPiece(
129
- world: World,
130
- l: Layout,
131
- shape: readonly (readonly number[])[],
132
- color: Color,
133
- at: [number, number],
134
- scale: number
135
- ): Entity {
136
- const rows = shape.length;
137
- const cols = shape[0]?.length ?? 0;
138
- const root = world.spawn({ mesh: 'none', position: toWorld(l, at[0], at[1], trayZ(l)), scale, pickable: false });
139
- for (let r = 0; r < rows; r++) {
140
- for (let c = 0; c < cols; c++) {
141
- if (shape[r]?.[c] !== 1) continue;
142
- spawnBlockAt(world, l, [(c - (cols - 1) / 2) * l.step, -(r - (rows - 1) / 2) * l.step, 0], color, root);
143
- }
144
- }
145
- return root;
146
- }
147
-
148
- /** A board block's scale (for popping it away). */
149
- export const blockScale = (l: Layout): Vec3 => raisedBlockScale(blockSize(l));
150
-
151
- /** Where a cleared block's burst flies from (just in front of it) and glows (behind it, over its cell). */
152
- export function blockBurst(l: Layout, row: number, col: number, color: Color): PopBurstOptions {
153
- const [x, y] = cellCenter(l, row, col);
154
- const at = toWorld(l, x, y, blockZ(l));
155
- return { position: [at[0], at[1], at[2] + l.depth * 2], size: l.cell, color, glowZ: Z_EMPTY + 0.3 };
156
- }