@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,139 +0,0 @@
1
- // Tile Home's rules, tiles, timings and layout. Rules, scoring and layout match the original version
2
- // (games/tile-home), so scores and feel carry over.
3
- import type { FruitKind } from '../shared/EngineFruits';
4
- import { frontLight, gameWidthFor } from '../shared/EngineUtils';
5
-
6
- // ── Rules ─────────────────────────────────────────────────────────────
7
-
8
- export const BOARD_COLS = 6;
9
- export const BOARD_ROWS = 7;
10
- export const LAYER_COUNT = 3; // each layer up is one smaller each way, offset half a cell
11
- export const TILES_PER_TYPE = 6;
12
- export const SLOT_CAPACITY = 7;
13
- export const MATCH_COUNT = 3;
14
- export const TIME_LIMIT = 300; // seconds
15
- export const POINTS_PER_SET = 500;
16
-
17
- /** The 12 fruits, by tile type id (the original version's order), with each one's burst color. */
18
- export const TILE_TYPES: readonly { fruit: FruitKind; color: string }[] = [
19
- { fruit: 'apple', color: '#dc2626' },
20
- { fruit: 'orange', color: '#f97316' },
21
- { fruit: 'banana', color: '#fbbf24' },
22
- { fruit: 'grapes', color: '#7c3aed' },
23
- { fruit: 'kiwi', color: '#84cc16' },
24
- { fruit: 'strawberry', color: '#ef4444' },
25
- { fruit: 'mango', color: '#f59e0b' },
26
- { fruit: 'cherries', color: '#be123c' },
27
- { fruit: 'pineapple', color: '#eab308' },
28
- { fruit: 'watermelon', color: '#22c55e' },
29
- { fruit: 'peach', color: '#fda4af' },
30
- { fruit: 'pomegranate', color: '#9f1239' }
31
- ];
32
-
33
- /** Sets of three in a board: 24. */
34
- export const TOTAL_SETS = (TILE_TYPES.length * TILES_PER_TYPE) / MATCH_COUNT;
35
-
36
- // ── Feel (seconds) ────────────────────────────────────────────────────
37
-
38
- export const FLY_TIME = 0.25; // board to tray
39
- export const LIFT_AT = 0.28; // the flying tile peaks at LIFT_SCALE this far through, then shrinks to tray size
40
- export const LIFT_SCALE = 1.08;
41
- export const MATCH_CHECK_DELAY = 0.3; // after a tile lands
42
- export const MATCH_REMOVE_DELAY = 0.4; // after a match shows
43
- export const MATCH_BURST_TIME = 0.55;
44
- export const SHADE_TIME = 0.22; // a covered tile's shade lifting as it's revealed
45
- export const SHIFT_SPRING = { stiffness: 200, damping: 15 }; // tray tiles stepping aside
46
- export const LAND_SPRING = { stiffness: 260, damping: 9 }; // a landing's squash
47
- export const LAND_SQUASH = 1.12;
48
- // Board intro: tiles spring up rippling out from the centre, each layer a beat after the one below
49
- // (an underdamped spring: damping ratio 0.45 at 20 rad/s).
50
- export const INTRO_SPRING = { stiffness: 400, damping: 18, mass: 1 };
51
- export const RIPPLE_TIME = 0.3;
52
- export const LAYER_STAGGER = 0.07;
53
-
54
- /** How dark a covered tile is: more tiles over it, darker. */
55
- export const shadeFor = (blockingCount: number) => (blockingCount > 0 ? Math.min(0.2 + blockingCount * 0.15, 0.6) : 0);
56
-
57
- // ── Look ──────────────────────────────────────────────────────────────
58
-
59
- // Same top-left lighting and raised profile as Candy Crush's blocks.
60
- export const LIGHT = frontLight([-0.35, 0.6, 1], 0.5);
61
- export const TILE_FACE = '#fffdf7';
62
- export const TILE_THICKNESS = 0.4;
63
-
64
- // Classic (no host theme) board and tray colors
65
- export const CLASSIC_BOARD = 'rgba(255, 255, 255, 0.35)';
66
- export const CLASSIC_TRAY = 'rgba(255, 255, 255, 0.45)';
67
- export const CLASSIC_TRAY_BORDER = 'rgba(255, 255, 255, 0.6)';
68
- export const CLASSIC_SLOT = 'rgba(255, 255, 255, 0.25)';
69
- export const CLASSIC_SLOT_BORDER = 'rgba(255, 255, 255, 0.5)';
70
-
71
- // ── Layout (points; same arithmetic as the original version) ──────────────
72
-
73
- const BOARD_PADDING = 8;
74
- const TRAY_PADDING = 8;
75
- const TRAY_BORDER = 1;
76
- const SLOT_GAP = 4;
77
- const TRAY_BOARD_GAP = 10;
78
-
79
- export type Layout = {
80
- /** The GameView's size. */
81
- width: number;
82
- height: number;
83
- boardLeft: number;
84
- boardTop: number;
85
- boardWidth: number;
86
- boardHeight: number;
87
- cell: number;
88
- /** A board tile's side. */
89
- tile: number;
90
- /** The fruit's size on a board tile. */
91
- fruit: number;
92
- trayLeft: number;
93
- trayTop: number;
94
- trayWidth: number;
95
- trayHeight: number;
96
- /** A tray tile's side. */
97
- slot: number;
98
- };
99
-
100
- export function getLayout(width: number, height: number, offset: number): Layout {
101
- const gameWidth = gameWidthFor(width);
102
- const cell = (gameWidth - BOARD_PADDING * 2) / BOARD_COLS;
103
- const tile = cell - 2;
104
- const boardHeight = BOARD_ROWS * cell + BOARD_PADDING * 2;
105
- const slot = Math.floor((gameWidth - TRAY_PADDING * 2 - (SLOT_CAPACITY - 1) * SLOT_GAP) / SLOT_CAPACITY);
106
- const trayHeight = slot + TRAY_PADDING * 2;
107
- // The tray above the board, the pair centred in the space under the header
108
- const total = trayHeight + TRAY_BOARD_GAP + boardHeight;
109
- const top = offset + (height - offset - total) / 2;
110
- const left = (width - gameWidth) / 2;
111
- return {
112
- width,
113
- height,
114
- boardLeft: left,
115
- boardTop: top + trayHeight + TRAY_BOARD_GAP,
116
- boardWidth: gameWidth,
117
- boardHeight,
118
- cell,
119
- tile,
120
- fruit: tile - 12,
121
- trayLeft: left,
122
- trayTop: top,
123
- trayWidth: gameWidth,
124
- trayHeight,
125
- slot
126
- };
127
- }
128
-
129
- /** A board tile's top-left, in view points. */
130
- export const tileOrigin = (l: Layout, col: number, row: number, layer: number): [number, number] => [
131
- l.boardLeft + BOARD_PADDING + col * l.cell + layer * (l.cell / 2),
132
- l.boardTop + BOARD_PADDING + row * l.cell + layer * (l.cell / 2)
133
- ];
134
-
135
- /** Tray slot `index`'s top-left, in view points. */
136
- export const slotOrigin = (l: Layout, index: number): [number, number] => [
137
- l.trayLeft + TRAY_BORDER + TRAY_PADDING + index * (l.slot + SLOT_GAP),
138
- l.trayTop + TRAY_BORDER + TRAY_PADDING
139
- ];
@@ -1,435 +0,0 @@
1
- // Tile Home's rules, with no React: build a run with `createGame`, hand it the fruit models and a
2
- // layout, `start` it and `tick` it every frame. Tap an uncovered tile to send it to the tray, next to
3
- // its kind; three of a kind clear for 500. Clear the board to win (with a time bonus); fill the tray
4
- // without a match, or run out of time, and it's over.
5
- import { type Camera, type Entity, World } from '@nayan-ui/engine';
6
- import { TIME_BONUS_PER_SECOND } from '../../services/ScoringService';
7
- import type { GameTheme } from '../../services/ThemeService';
8
- import { popAndBurst } from '../shared/EngineBlasts';
9
- import type { Fruit, FruitKind } from '../shared/EngineFruits';
10
- import { introPlayed, toColor } from '../shared/EngineUtils';
11
- import {
12
- BOARD_COLS,
13
- BOARD_ROWS,
14
- FLY_TIME,
15
- INTRO_SPRING,
16
- LAND_SPRING,
17
- LAND_SQUASH,
18
- LAYER_COUNT,
19
- LAYER_STAGGER,
20
- type Layout,
21
- LIFT_AT,
22
- LIFT_SCALE,
23
- MATCH_BURST_TIME,
24
- MATCH_CHECK_DELAY,
25
- MATCH_COUNT,
26
- MATCH_REMOVE_DELAY,
27
- POINTS_PER_SET,
28
- RIPPLE_TIME,
29
- SHADE_TIME,
30
- shadeFor,
31
- SHIFT_SPRING,
32
- SLOT_CAPACITY,
33
- slotOrigin,
34
- TILE_TYPES,
35
- tileOrigin,
36
- TILES_PER_TYPE,
37
- TIME_LIMIT
38
- } from './TileHomeConstants';
39
- import { addTileFruit, buildScenery, type FruitModels, layerZ, spawnTile, toWorld, trayZ, Z_FLYING } from './TileHomeScene';
40
-
41
- export type Phase = 'ready' | 'playing' | 'over';
42
-
43
- type Tile = {
44
- typeId: number;
45
- col: number;
46
- row: number;
47
- layer: number;
48
- /** Tiles on higher layers covering this one (0 = free to pick). */
49
- blocking: number;
50
- /** Lower tiles uncovered when this tile leaves the board (computed once per deal). */
51
- covers: Tile[];
52
- root: Entity | null;
53
- shade: Entity | null;
54
- /** Its fruit, once that model is built (the tile shows before it). */
55
- fruit: Entity | null;
56
- parts: Entity[];
57
- };
58
-
59
- const WORLD_CAPACITY = 900; // 72 tiles x 4 entities (root, body, fruit, shade), scenery, bursts
60
-
61
- const shuffle = <T>(items: T[]) => {
62
- for (let i = items.length - 1; i > 0; i--) {
63
- const j = Math.floor(Math.random() * (i + 1));
64
- [items[i], items[j]] = [items[j]!, items[i]!];
65
- }
66
- return items;
67
- };
68
-
69
- /** Six of each fruit on shuffled spots across the three layers (as many spots as there are tiles). */
70
- function generateBoard(): Tile[] {
71
- const pool = shuffle(TILE_TYPES.flatMap((_, type) => Array.from({ length: TILES_PER_TYPE }, () => type)));
72
- const spots: { col: number; row: number; layer: number }[] = [];
73
- for (let layer = 0; layer < LAYER_COUNT; layer++) {
74
- for (let row = 0; row < BOARD_ROWS - layer; row++) for (let col = 0; col < BOARD_COLS - layer; col++) spots.push({ col, row, layer });
75
- }
76
- shuffle(spots);
77
- return pool
78
- .slice(0, spots.length)
79
- .map((typeId, i) => ({ typeId, ...spots[i]!, blocking: 0, covers: [], root: null, shade: null, fruit: null, parts: [] }));
80
- }
81
-
82
- /** How many higher tiles overlap each tile (layers sit half a cell apart, so a tile can cover up to four). */
83
- function countBlocking(board: Tile[]) {
84
- for (const t of board) {
85
- t.blocking = 0;
86
- t.covers.length = 0;
87
- }
88
- for (const t of board) {
89
- const x = t.col + t.layer * 0.5;
90
- const y = t.row + t.layer * 0.5;
91
- for (const o of board) {
92
- if (o.layer <= t.layer) continue;
93
- if (Math.abs(o.col + o.layer * 0.5 - x) < 1 && Math.abs(o.row + o.layer * 0.5 - y) < 1) {
94
- t.blocking++;
95
- o.covers.push(t);
96
- }
97
- }
98
- }
99
- }
100
-
101
- const introDelay = (t: Tile) => {
102
- const cc = (BOARD_COLS - 1) / 2;
103
- const cr = (BOARD_ROWS - 1) / 2;
104
- const max = Math.hypot(cc + 1, cr + 1);
105
- const dist = Math.hypot(t.col + t.layer * 0.5 - cc, t.row + t.layer * 0.5 - cr);
106
- return (Math.min(dist, max) / max) * RIPPLE_TIME + t.layer * LAYER_STAGGER;
107
- };
108
-
109
- export function createGame(theme: GameTheme) {
110
- const world = new World(WORLD_CAPACITY);
111
- const camera: Camera = { eye: [0, 0, 500], target: [0, 0, 0], fov: 1, ortho: 1 };
112
- const board = generateBoard();
113
- countBlocking(board);
114
- const g = {
115
- world,
116
- camera,
117
- theme,
118
- layout: null as Layout | null,
119
- fruits: {} as FruitModels,
120
- scenery: [] as Entity[],
121
- phase: 'ready' as Phase,
122
- /** Score and the countdown live in the engine (Rust), advanced by world.update. */
123
- get score() {
124
- return world.scoreboard.score;
125
- },
126
- won: false,
127
- board,
128
- /** The tray, in order. */
129
- slot: [] as Tile[],
130
- /** The tile on its way to the tray, and the slot it's headed for. */
131
- flying: null as { tile: Tile; index: number } | null,
132
- /** Tray tiles bursting, removed when the burst has shown. */
133
- matching: [] as Tile[],
134
- /** The next board to appear plays the intro. */
135
- intro: true,
136
- /** Game seconds the current intro has been playing (-1 until its board spawns). */
137
- introAge: -1,
138
- // UI hooks, set by the screen.
139
- onPhase: (_p: Phase) => {},
140
- onScore: (_s: number) => {},
141
- onTime: (_t: number) => {},
142
- onPick: () => {},
143
- onMatch: () => {},
144
- onWin: () => {},
145
- onLose: () => {}
146
- };
147
- showFullTime(g);
148
- world.scoreboard.handlers = {
149
- onScore: (s) => g.onScore(s),
150
- onSecond: (t) => g.onTime(t),
151
- onTimeUp: () => g.phase === 'playing' && end(g, false)
152
- };
153
- return g;
154
- }
155
- export type Game = ReturnType<typeof createGame>;
156
-
157
- const after = (g: Game, seconds: number, run: () => void) => g.world.after(seconds, run);
158
-
159
- /** Score 0 and the full time on the clock, waiting for Start. */
160
- function showFullTime(g: { world: World }) {
161
- const sb = g.world.scoreboard;
162
- sb.reset();
163
- sb.startCountdown(TIME_LIMIT);
164
- sb.stop();
165
- }
166
-
167
- // ── Scene ─────────────────────────────────────────────────────────────
168
-
169
- /**
170
- * One kind of fruit's model is ready (they're built once per app, one per frame after the screen
171
- * opens): it pops onto every tile of that kind already showing, and is used for any made from now on.
172
- */
173
- export function addFruit(g: Game, kind: FruitKind, fruit: Fruit) {
174
- if (g.world.isDisposed || g.fruits[kind]) return;
175
- g.fruits[kind] = fruit;
176
- const l = g.layout;
177
- if (!l) return;
178
- const tiles = [...g.board, ...g.slot, ...(g.flying ? [g.flying.tile] : [])];
179
- for (const t of tiles) {
180
- if (t.root == null || t.fruit != null || TILE_TYPES[t.typeId]!.fruit !== kind) continue;
181
- t.fruit = addTileFruit(g.world, l, t.root, fruit, true);
182
- t.parts.push(t.fruit);
183
- }
184
- }
185
-
186
- /** Lays the scene out for the view and header. Same tile size: everything just moves; else it's rebuilt. */
187
- export function setLayout(g: Game, l: Layout) {
188
- const old = g.layout;
189
- g.layout = l;
190
- g.camera.ortho = l.height / 2;
191
- for (const e of g.scenery) g.world.despawn(e);
192
- g.scenery = buildScenery(g.world, l, g.theme);
193
- if (old && old.tile === l.tile && old.slot === l.slot) {
194
- const updates = g.world.transforms;
195
- for (const t of g.board) {
196
- if (t.root == null) continue;
197
- const [x, y, z] = boardPosition(l, t);
198
- updates.position(t.root, x, y, z);
199
- }
200
- g.slot.forEach((t, i) => {
201
- if (t.root == null) return;
202
- const [x, y, z] = slotPosition(l, i);
203
- updates.position(t.root, x, y, z);
204
- });
205
- updates.flush();
206
- } else {
207
- spawnAll(g);
208
- }
209
- }
210
-
211
- /** A new theme: the background, board and tray are rebuilt; the tiles and the run carry on. */
212
- export function setTheme(g: Game, theme: GameTheme) {
213
- g.theme = theme;
214
- const l = g.layout;
215
- if (!l || g.world.isDisposed) return;
216
- for (const e of g.scenery) g.world.despawn(e);
217
- g.scenery = buildScenery(g.world, l, theme);
218
- }
219
-
220
- const boardPosition = (l: Layout, t: Tile) => {
221
- const [x, y] = tileOrigin(l, t.col, t.row, t.layer);
222
- return toWorld(l, x + l.tile / 2, y + l.tile / 2, layerZ(t.layer));
223
- };
224
- const slotPosition = (l: Layout, index: number, z = trayZ) => {
225
- const [x, y] = slotOrigin(l, index);
226
- return toWorld(l, x + l.slot / 2, y + l.slot / 2, z);
227
- };
228
- const slotScale = (l: Layout) => l.slot / l.tile;
229
-
230
- function despawnTile(g: Game, t: Tile) {
231
- if (t.root != null) g.world.despawn(t.root); // body, fruit and shade go with it
232
- t.root = null;
233
- t.shade = null;
234
- t.fruit = null;
235
- t.parts = [];
236
- }
237
-
238
- /**
239
- * (Re)creates every tile's entities from the run's state; the board springs in if it's new. Tiles whose
240
- * fruit isn't built yet show without it and get it when it arrives (addFruit).
241
- */
242
- function spawnAll(g: Game) {
243
- const l = g.layout;
244
- const fruits = g.fruits;
245
- if (!l) return;
246
- if (g.flying) land(g);
247
- for (const t of [...g.board, ...g.slot]) despawnTile(g, t);
248
- const intro = g.intro;
249
- if (intro) g.introAge = 0;
250
- for (const t of g.board) {
251
- const [x, y] = tileOrigin(l, t.col, t.row, t.layer);
252
- const e = spawnTile(g.world, l, fruits[TILE_TYPES[t.typeId]!.fruit], x + l.tile / 2, y + l.tile / 2, layerZ(t.layer), intro ? 0 : 1);
253
- t.root = e.root;
254
- t.shade = e.shade;
255
- t.fruit = e.fruit;
256
- t.parts = e.parts;
257
- g.world.set(e.shade, { color: [0, 0, 0, shadeFor(t.blocking)] });
258
- if (intro) g.world.animate(e.root, { scale: 1 }, { spring: INTRO_SPRING, delay: introDelay(t) });
259
- }
260
- g.slot.forEach((t, i) => {
261
- if (g.matching.includes(t)) return; // bursting: its burst finishes it
262
- const [x, y] = slotOrigin(l, i);
263
- const e = spawnTile(g.world, l, fruits[TILE_TYPES[t.typeId]!.fruit], x + l.slot / 2, y + l.slot / 2, trayZ, slotScale(l));
264
- t.root = e.root;
265
- t.shade = e.shade;
266
- t.fruit = e.fruit;
267
- t.parts = e.parts;
268
- });
269
- }
270
-
271
- // ── Run ───────────────────────────────────────────────────────────────
272
-
273
- export function start(g: Game) {
274
- if (g.phase !== 'ready') return;
275
- g.phase = 'playing';
276
- g.world.scoreboard.startCountdown(TIME_LIMIT);
277
- g.onPhase('playing');
278
- }
279
-
280
- /** A new board and timer (Stop, Play Again), springing in. The world and its GPU view are kept. */
281
- export function reset(g: Game) {
282
- g.world.cancelTimers();
283
- if (g.flying) despawnTile(g, g.flying.tile);
284
- g.flying = null;
285
- for (const t of [...g.board, ...g.slot, ...g.matching]) despawnTile(g, t);
286
- g.board = generateBoard();
287
- countBlocking(g.board);
288
- g.slot = [];
289
- g.matching = [];
290
- g.intro = true;
291
- spawnAll(g);
292
- showFullTime(g);
293
- g.won = false;
294
- g.phase = 'ready';
295
- g.onScore(0);
296
- g.onTime(TIME_LIMIT);
297
- g.onPhase('ready');
298
- }
299
-
300
- export function dispose(g: Game) {
301
- g.world.cancelTimers();
302
- g.world.dispose();
303
- }
304
-
305
- function end(g: Game, won: boolean) {
306
- g.world.cancelTimers();
307
- g.world.scoreboard.stop();
308
- g.won = won;
309
- g.phase = 'over';
310
- if (won) g.onWin();
311
- else g.onLose();
312
- g.onPhase('over');
313
- }
314
-
315
- export function tick(g: Game, dt: number) {
316
- if (g.world.isDisposed) return;
317
- introPlayed(g, dt);
318
- g.world.update(dt);
319
- }
320
-
321
- // ── Picking ───────────────────────────────────────────────────────────
322
-
323
- /** A tap: sends the uncovered tile under it to the tray. */
324
- export function tap(g: Game, x: number, y: number) {
325
- const l = g.layout;
326
- if (!l || g.phase !== 'playing' || g.flying) return;
327
- const index = g.board.findIndex((t) => {
328
- if (t.blocking > 0) return false;
329
- const [ox, oy] = tileOrigin(l, t.col, t.row, t.layer);
330
- return x >= ox && x <= ox + l.tile && y >= oy && y <= oy + l.tile;
331
- });
332
- if (index < 0) return;
333
- const tile = g.board.splice(index, 1)[0]!;
334
-
335
- // Uncovering: the tiles it covered lighten (the shade eases off).
336
- for (const t of tile.covers) {
337
- t.blocking--;
338
- if (t.shade != null) g.world.animate(t.shade, { color: [0, 0, 0, shadeFor(t.blocking)] }, { duration: SHADE_TIME });
339
- }
340
-
341
- // Next to its kind, or at the end; tiles from there step aside so it lands in a gap.
342
- const same = g.slot.findIndex((t) => t.typeId === tile.typeId);
343
- const to = same >= 0 ? same + 1 : g.slot.length;
344
- g.flying = { tile, index: to };
345
- arrangeSlot(g);
346
-
347
- if (tile.root != null) {
348
- const start = boardPosition(l, tile);
349
- g.world.set(tile.root, { position: [start[0], start[1], Z_FLYING] });
350
- g.world.animate(tile.root, { position: slotPosition(l, to, Z_FLYING) }, { duration: FLY_TIME });
351
- g.world.animate(tile.root, [{ scale: LIFT_SCALE, at: LIFT_AT }, { scale: slotScale(l) }], { duration: FLY_TIME });
352
- }
353
- after(g, FLY_TIME, () => land(g));
354
- g.onPick();
355
- }
356
-
357
- /** The flying tile joins the tray (next to its kind, as things are now) and squashes as it lands. */
358
- function land(g: Game) {
359
- const f = g.flying;
360
- const l = g.layout;
361
- if (!f || !l) return;
362
- g.flying = null;
363
- const tile = f.tile;
364
- const same = g.slot.findIndex((t) => t.typeId === tile.typeId);
365
- const at = same >= 0 ? same + 1 : g.slot.length;
366
- g.slot.splice(at, 0, tile);
367
- if (tile.root != null) {
368
- const s = slotScale(l);
369
- g.world.stopAnimation(tile.root);
370
- g.world.set(tile.root, { position: slotPosition(l, at), scale: s * LAND_SQUASH });
371
- g.world.animate(tile.root, { scale: s }, { spring: LAND_SPRING });
372
- }
373
- arrangeSlot(g, tile);
374
- after(g, MATCH_CHECK_DELAY, () => checkMatches(g));
375
- }
376
-
377
- /** Slides tray tiles to their places, leaving a gap where the flying tile will land. */
378
- function arrangeSlot(g: Game, skip?: Tile) {
379
- const l = g.layout;
380
- if (!l) return;
381
- const gap = g.flying?.index ?? -1;
382
- g.slot.forEach((t, i) => {
383
- if (t === skip || t.root == null) return;
384
- g.world.animate(t.root, { position: slotPosition(l, gap >= 0 && i >= gap ? i + 1 : i) }, { spring: SHIFT_SPRING });
385
- });
386
- }
387
-
388
- function checkMatches(g: Game) {
389
- if (g.phase !== 'playing' || g.matching.length) return;
390
- // The lowest fruit type with three in the tray (the original version checked types in that order)
391
- for (let type = 0; type < TILE_TYPES.length; type++) {
392
- const of = g.slot.filter((t) => t.typeId === type);
393
- if (of.length < MATCH_COUNT) continue;
394
- g.matching = of.slice(0, MATCH_COUNT);
395
- burstMatch(g);
396
- g.onMatch();
397
- after(g, MATCH_REMOVE_DELAY, () => removeMatch(g));
398
- return;
399
- }
400
- if (g.slot.length >= SLOT_CAPACITY) end(g, false);
401
- }
402
-
403
- /** Matched tiles pop, flash white and shrink away, with a glow and sparks (the shared pop). */
404
- function burstMatch(g: Game) {
405
- const l = g.layout!;
406
- g.matching.forEach((t, i) => {
407
- const root = t.root;
408
- if (root == null) return;
409
- const at = slotPosition(l, g.slot.indexOf(t));
410
- const color = toColor(TILE_TYPES[t.typeId]!.color);
411
- popAndBurst(
412
- g.world,
413
- root,
414
- { scale: slotScale(l), flash: t.parts, delay: (i / g.matching.length) * 0.1 * MATCH_BURST_TIME, duration: MATCH_BURST_TIME },
415
- { position: [at[0], at[1], at[2] + 40], size: l.slot, color, glowZ: at[2] - 2 }
416
- ).then(() => {
417
- g.world.despawn(root);
418
- });
419
- t.root = null; // the burst owns it now
420
- t.parts = [];
421
- });
422
- }
423
-
424
- function removeMatch(g: Game) {
425
- if (g.phase !== 'playing') return;
426
- const gone = new Set(g.matching);
427
- g.slot = g.slot.filter((t) => !gone.has(t));
428
- g.matching = [];
429
- g.world.scoreboard.add(POINTS_PER_SET);
430
- arrangeSlot(g);
431
- if (g.board.length === 0 && g.slot.length === 0 && !g.flying) {
432
- g.world.scoreboard.awardTimeBonus(TIME_BONUS_PER_SECOND);
433
- end(g, true);
434
- }
435
- }