@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,73 +0,0 @@
1
- // Fruit Merger's screen, on the Nayan engine: the glass, the fruits and the drop guide are one 3D scene,
2
- // under Playtura's scoreboard (the score and the clock), controls and modals.
3
- // The play is in FruitMergerGame.ts (the physics in FruitMergerRules.ts), what it draws in
4
- // FruitMergerScene.ts.
5
- //
6
- // One world serves the whole visit: Start, Stop and Play Again reset it in place and a theme change
7
- // repaints the glass, so the GPU view is never rebuilt. JS steps the pile (the original version's fixed 60 Hz
8
- // physics) and the world once a frame; pops, rings and bursts animate in the engine's Rust core.
9
- import { HapticType } from '../../services/HapticsService';
10
- import { GAME_SOUNDS } from '../../services/SoundsService';
11
- import { GAME_IDS } from '../../services/UtilsService';
12
- import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
13
- import { scoreColumn, timerColumn } from '../shared/EngineHud';
14
- import { useEngineGame } from '../shared/useEngineGame';
15
- import { useLiveState } from '../shared/useLiveState';
16
- import { GAME_TIME, getLayout, LIGHT } from './FruitMergerConstants';
17
- import { createGame, dispose, drag, finalScore, type GameEvent, type Outcome, reset, setLayout, setTheme, start, tick } from './FruitMergerGame';
18
-
19
- const SOUNDS = GAME_SOUNDS.FRUIT_MERGER;
20
- /** Each event's sound and haptic, as the original version played them. */
21
- const FEEDBACK: Record<GameEvent, { sound: (typeof SOUNDS)[keyof typeof SOUNDS]; haptic: HapticType }> = {
22
- drop: { sound: SOUNDS.DROP, haptic: HapticType.LIGHT },
23
- merge: { sound: SOUNDS.MERGE, haptic: HapticType.MEDIUM },
24
- win: { sound: SOUNDS.COMPLETE, haptic: HapticType.SUCCESS }
25
- };
26
-
27
- const MESSAGES: Record<Outcome, string> = { win: 'You reached the Pumpkin!', time: 'You ran out of time!', overflow: 'Fruits overflowed!' };
28
-
29
- export const FruitMerger = engineGame(GAME_IDS.FRUIT_MERGER, (props) => {
30
- const [time, setTime] = useLiveState(GAME_TIME);
31
- const [score, setScore] = useLiveState(0);
32
-
33
- // A win (scored by its time) or a loss
34
- const { game, theme, status, screen, gameOver } = useEngineGame(props, {
35
- gameId: GAME_IDS.FRUIT_MERGER,
36
- create: createGame,
37
- start,
38
- reset,
39
- dispose,
40
- tick,
41
- setTheme,
42
- resize: (g, width, height, offset) => setLayout(g, getLayout(width, height, offset)),
43
- drag,
44
- outcome: (g) => (g.outcome === 'win' ? 'win' : 'lose'),
45
- reportScore: (g) => finalScore(g),
46
- sounds: SOUNDS,
47
- onStart: (fx) => fx(SOUNDS.START, HapticType.MEDIUM),
48
- onOver: (fx, s) => {
49
- if (s !== 'win') fx(SOUNDS.GAME_OVER, HapticType.HEAVY);
50
- },
51
- wire: (g, fx) => {
52
- g.onTime = setTime;
53
- g.onScore = setScore;
54
- g.onEvent = (event) => fx(FEEDBACK[event].sound, FEEDBACK[event].haptic);
55
- }
56
- });
57
-
58
- return (
59
- <EngineGameScreen
60
- {...screen}
61
- light={LIGHT}
62
- columns={[scoreColumn(score), timerColumn(time, theme, 0)]}
63
- subtext="Merge fruits!"
64
- gameOver={gameOver({
65
- title: status === 'win' ? 'YOU WON!' : 'GAME OVER',
66
- message: MESSAGES[game.outcome ?? 'overflow'],
67
- scoreLabel: 'Score',
68
- score: finalScore(game),
69
- buttonText: 'Merge Again!'
70
- })}
71
- />
72
- );
73
- });
@@ -1,102 +0,0 @@
1
- import { getGameDimensions } from '../../services/UtilsService';
2
- // Fruit Merger's rules, tuning, colors and layout. The fruit chain, sizes and physics constants are the
3
- // original version's (games/fruit-merger), scaled by the same game width, so the pile behaves the same.
4
- import { getScoreBoardTop } from '../shared/EngineHud';
5
- import { frontLight } from '../shared/EngineUtils';
6
-
7
- const { width: GAME_WIDTH } = getGameDimensions();
8
- const SCALE = GAME_WIDTH / 360; // relative to the 360-point design width, as the original game
9
-
10
- // ── Rules ─────────────────────────────────────────────────────────────
11
-
12
- /**
13
- * The merge chain, in order of real size (round fruits that stack and roll): two of a kind make the
14
- * next, up to the pumpkin (the win). Sizes and scores step up evenly, as the original chain did.
15
- */
16
- export const FRUIT_TYPES = [
17
- { id: 0, name: 'strawberry', size: Math.round(40 * SCALE), color: '#FFCDD2', score: 10 },
18
- { id: 1, name: 'kiwi', size: Math.round(52 * SCALE), color: '#DCEDC8', score: 20 },
19
- { id: 2, name: 'lemon', size: Math.round(64 * SCALE), color: '#FFF9C4', score: 40 },
20
- { id: 3, name: 'peach', size: Math.round(76 * SCALE), color: '#FFE4E1', score: 80 },
21
- { id: 4, name: 'orange', size: Math.round(88 * SCALE), color: '#FFE0B2', score: 160 },
22
- { id: 5, name: 'apple', size: Math.round(100 * SCALE), color: '#FFCDD2', score: 320 },
23
- { id: 6, name: 'pomegranate', size: Math.round(112 * SCALE), color: '#F8BBD0', score: 640 },
24
- { id: 7, name: 'papaya', size: Math.round(124 * SCALE), color: '#FFE0B2', score: 1280 },
25
- { id: 8, name: 'watermelon', size: Math.round(136 * SCALE), color: '#C8E6C9', score: 2560 },
26
- { id: 9, name: 'pumpkin', size: Math.round(148 * SCALE), color: '#FFCC80', score: 5120 }
27
- ] as const;
28
- export type FruitName = (typeof FRUIT_TYPES)[number]['name'];
29
- export const LAST_TYPE = FRUIT_TYPES.length - 1;
30
-
31
- export const GAME_TIME = 900; // 15 minutes
32
- /** A win scores by its time against two minutes, as the original game did. */
33
- export const EXPECTED_TIME = 120;
34
- export const BASE_SCORE = 100;
35
- export const MAX_DROP_TYPE = 4; // the first four fruits are dropped
36
-
37
- // ── Physics (per 60 Hz step, in play-area points) ─────────────────────
38
-
39
- export const CONTAINER_WIDTH = GAME_WIDTH;
40
- export const CONTAINER_HEIGHT = Math.round(480 * SCALE);
41
- export const PLAY_WIDTH = GAME_WIDTH - 8; // inside the side walls
42
- export const PLAY_HEIGHT = CONTAINER_HEIGHT - 4; // above the floor
43
- export const GRAVITY = 0.5 * SCALE;
44
- export const BOUNCE = 0.3;
45
- export const FRICTION = 0.99;
46
- export const MERGE_DISTANCE = Math.round(10 * SCALE);
47
- export const COLLISION_SCALE = 0.96; // fruits fill nearly their whole circle: they touch where they look to
48
- /** Passes over the fruit pairs each step, so a pile settles without fruits sinking into each other. */
49
- export const SOLVER_PASSES = 24;
50
- /** Overflow: a settled fruit's top above 5% of the height, for a second's worth of steps, loses. */
51
- export const OVERFLOW_Y = PLAY_HEIGHT * 0.05;
52
- export const OVERFLOW_STEPS = 60;
53
- /** The danger line warms from here up to the overflow line. */
54
- export const DANGER_START_Y = PLAY_HEIGHT * 0.28;
55
- export const DANGER_SETTLE_MS = 1000;
56
- export const SPAWN_DELAY_MS = 300; // after a drop, the next fruit
57
- export const STEP_MS = 1000 / 60;
58
- export const STEP_TOLERANCE_MS = 2;
59
- export const MAX_PENDING_MS = 50;
60
-
61
- // ── The scene ─────────────────────────────────────────────────────────
62
-
63
- /** The camera looks straight at the tank: only its front shows, so its outline reads as single clean lines. */
64
- export const TILT = 0;
65
- /** Lit from the upper left, in front. */
66
- export const LIGHT = frontLight([-0.4, 0.55, 1], 0.5);
67
- /** The glass is as deep as the biggest fruit. */
68
- export const JAR_DEPTH = FRUIT_TYPES[9].size + 12;
69
- export const WALL = 4; // the glass's walls and floor, as the original borders
70
- /** The glass's bottom corners are rounded this much (inside), and the fruits roll round them. */
71
- export const CORNER = Math.round(44 * SCALE);
72
-
73
- export const COLORS = {
74
- DANGER_SAFE: 'rgba(255, 255, 255, 0.28)',
75
- DANGER_HOT: 'rgba(255, 77, 77, 0.95)'
76
- } as const;
77
-
78
- // ── Layout (view points) ──────────────────────────────────────────────
79
-
80
- const SCOREBOARD_HEIGHT = 82;
81
- const CONTROLS_HEIGHT = 110;
82
-
83
- /**
84
- * Where the glass sits: centred below the header as the original glass was, or, on a screen too short for
85
- * it, scaled down (by `k`, view points per play-area point) to fit between the scoreboard and controls.
86
- */
87
- export type Layout = { width: number; height: number; k: number; centerX: number; centerY: number; tilt: number };
88
-
89
- export function getLayout(width: number, height: number, offset: number): Layout {
90
- const top = getScoreBoardTop(offset) + SCOREBOARD_HEIGHT;
91
- const room = height - top - CONTROLS_HEIGHT;
92
- const fitsWidth = Math.min(1, width / CONTAINER_WIDTH);
93
- if (room >= CONTAINER_HEIGHT * fitsWidth)
94
- return { width, height, k: fitsWidth, centerX: width / 2, centerY: offset + (height - offset) / 2, tilt: TILT };
95
- const k = Math.max(0.4, room / CONTAINER_HEIGHT);
96
- return { width, height, k, centerX: width / 2, centerY: top + room / 2, tilt: TILT };
97
- }
98
-
99
- /** A play-area point (x right, y down from the top-left, z out of the glass) in the world. */
100
- export const toWorld = (x: number, y: number, z = 0): [number, number, number] => [x - PLAY_WIDTH / 2, PLAY_HEIGHT / 2 - y, z];
101
- /** The play-area x under a view x. */
102
- export const playX = (l: Layout, sx: number) => (sx - l.centerX) / l.k + PLAY_WIDTH / 2;
@@ -1,285 +0,0 @@
1
- // Fruit Merger's play, with no React: build a game with `createGame`, give it a layout, `start` it and
2
- // `tick` it every frame. Drag to aim the fruit at the top, let go (or tap) to drop it; two of a kind
3
- // that touch merge into the next fruit up the chain. Make the pumpkin inside fifteen minutes to win; the
4
- // pile staying over the top line, or the clock running out, loses.
5
- //
6
- // The physics is the original version's (FruitMergerRules.ts), stepped at the same fixed 60 Hz on the
7
- // game's own clock; the rest is its store: the same drops, previews, next fruit and timer.
8
- import { type Camera, type DragEvent, World } from '@nayan-ui/engine';
9
- import { calculateTimeBasedScore } from '../../services/ScoringService';
10
- import type { GameTheme } from '../../services/ThemeService';
11
- import {
12
- BASE_SCORE,
13
- EXPECTED_TIME,
14
- FRUIT_TYPES,
15
- GAME_TIME,
16
- type Layout,
17
- MAX_DROP_TYPE,
18
- MAX_PENDING_MS,
19
- PLAY_WIDTH,
20
- SPAWN_DELAY_MS,
21
- STEP_MS,
22
- STEP_TOLERANCE_MS
23
- } from './FruitMergerConstants';
24
- import { type Body, makeBody, radiusOf, step, type StepState } from './FruitMergerRules';
25
- import {
26
- aim,
27
- buildScene,
28
- celebrate,
29
- clearFruits,
30
- drawFruits,
31
- drawPreview,
32
- jolt,
33
- mergeFx,
34
- removeScene,
35
- type Scene,
36
- setDanger,
37
- setSceneTheme
38
- } from './FruitMergerScene';
39
-
40
- export type Phase = 'ready' | 'playing' | 'over';
41
- /** drop: a fruit let go; merge: two became one; win: the pumpkin (its own sound, before the result's). */
42
- export type GameEvent = 'drop' | 'merge' | 'win';
43
- /** How a game ended. */
44
- export type Outcome = 'win' | 'overflow' | 'time';
45
-
46
- const WORLD_CAPACITY = 500; // the glass, the guide, up to a few dozen fruits, and the bursts
47
-
48
- type Aimed = { id: string; typeId: number; x: number; y: number };
49
- const randomType = () => Math.floor(Math.random() * MAX_DROP_TYPE);
50
- /** A fresh fruit id (the original store drew one random number for each, so the random draws line up). */
51
- const newId = (clock: number) => `fruit-${Math.round(clock)}-${Math.random()}`;
52
- const aimedFruit = (typeId: number, clock: number): Aimed => ({ id: newId(clock), typeId, x: PLAY_WIDTH / 2, y: radiusOf(typeId) + 10 });
53
-
54
- export function createGame(theme: GameTheme) {
55
- const world = new World(WORLD_CAPACITY);
56
- const camera: Camera = { eye: [0, 0, 260], target: [0, 0, 0], fov: 1, ortho: 1 };
57
- const g = {
58
- world,
59
- camera,
60
- theme,
61
- layout: null as Layout | null,
62
- scene: null as Scene | null,
63
- phase: 'ready' as Phase,
64
- bodies: [] as Body[],
65
- current: null as Aimed | null,
66
- nextType: 0,
67
- bestType: -1,
68
- /** Seconds left: the countdown lives in the engine (Rust), advanced by world.update. */
69
- get time() {
70
- return world.scoreboard.shownSeconds;
71
- },
72
- /** Points from merges (each worth the fruit it makes, so higher fruits score far more): in the engine's scoreboard. */
73
- get score() {
74
- return world.scoreboard.score;
75
- },
76
- outcome: null as Outcome | null,
77
- /** The physics' carried state, and the step clock. */
78
- st: { overflowSteps: 0, danger: 0, merges: 0, generation: 0 } as StepState,
79
- pending: 0,
80
- spawnAt: 0,
81
- /** Where the drag started the aim from. */
82
- dragFrom: PLAY_WIDTH / 2,
83
- clock: 0,
84
- // UI hooks, set by the screen.
85
- onPhase: (_p: Phase) => {},
86
- onTime: (_t: number) => {},
87
- onScore: (_s: number) => {},
88
- onNext: (_type: number) => {},
89
- onBest: (_type: number) => {},
90
- onEvent: (_e: GameEvent) => {}
91
- };
92
- world.scoreboard.handlers = {
93
- onSecond: (t) => g.onTime(t),
94
- onTimeUp: () => g.phase === 'playing' && end(g, 'time')
95
- };
96
- initialize(g);
97
- return g;
98
- }
99
- export type Game = ReturnType<typeof createGame>;
100
- const nowMs = (g: Game) => g.clock * 1000;
101
-
102
- // ── Scene ─────────────────────────────────────────────────────────────
103
-
104
- /** Lays the glass out for the view (first layout, header height, rotation): rebuilt where things stand. */
105
- export function setLayout(g: Game, l: Layout) {
106
- if (g.scene) removeScene(g.world, g.scene);
107
- g.layout = l;
108
- aim(g.camera, l);
109
- g.scene = buildScene(g.world, l, g.theme);
110
- setDanger(g.world, g.scene, g.theme, g.st.danger);
111
- draw(g);
112
- }
113
-
114
- export function setTheme(g: Game, theme: GameTheme) {
115
- g.theme = theme;
116
- if (g.scene) setSceneTheme(g.world, g.scene, theme);
117
- }
118
-
119
- function draw(g: Game) {
120
- const s = g.scene;
121
- if (!s) return;
122
- drawFruits(g.world, s, g.bodies);
123
- drawPreview(g.world, s, g.phase === 'over' ? null : g.current, g.nextType);
124
- }
125
-
126
- // ── Run ───────────────────────────────────────────────────────────────
127
-
128
- /** A fresh glass with a fruit waiting to be aimed (the start, Stop and Play Again). */
129
- function initialize(g: Game) {
130
- g.st.generation += 1;
131
- g.bodies = [];
132
- g.pending = 0;
133
- g.spawnAt = 0;
134
- g.st.overflowSteps = 0;
135
- g.bestType = -1;
136
- const type = randomType();
137
- g.current = aimedFruit(type, nowMs(g));
138
- g.nextType = randomType();
139
- g.world.scoreboard.reset(0, GAME_TIME);
140
- g.outcome = null;
141
- g.phase = 'ready';
142
- if (g.scene) clearFruits(g.world, g.scene);
143
- draw(g);
144
- g.onTime(GAME_TIME);
145
- g.onScore(0);
146
- g.onNext(g.nextType);
147
- g.onBest(-1);
148
- }
149
-
150
- /** Starts on the glass already shown (keeping the waiting fruit). */
151
- export function start(g: Game) {
152
- if (g.phase !== 'ready') return;
153
- g.st.generation += 1;
154
- g.bodies = [];
155
- g.pending = 0;
156
- g.spawnAt = 0;
157
- g.st.overflowSteps = 0;
158
- g.st.danger = 0;
159
- g.bestType = -1;
160
- g.phase = 'playing';
161
- g.world.scoreboard.reset();
162
- g.world.scoreboard.startCountdown(GAME_TIME);
163
- g.onScore(0);
164
- if (g.scene) {
165
- clearFruits(g.world, g.scene);
166
- setDanger(g.world, g.scene, g.theme, 0);
167
- }
168
- if (!g.current) spawnAimed(g);
169
- draw(g);
170
- g.onTime(GAME_TIME);
171
- g.onBest(-1);
172
- g.onPhase('playing');
173
- }
174
-
175
- /** Stop and Play Again: a fresh glass, not started. */
176
- export function reset(g: Game) {
177
- initialize(g);
178
- g.onPhase('ready');
179
- }
180
-
181
- export function dispose(g: Game) {
182
- g.world.dispose();
183
- }
184
-
185
- /** The next fruit comes up to be aimed, and the one after it is picked (and shown as next). */
186
- function spawnAimed(g: Game) {
187
- g.current = aimedFruit(g.nextType, nowMs(g));
188
- g.nextType = randomType();
189
- g.onNext(g.nextType);
190
- }
191
-
192
- function end(g: Game, outcome: Outcome) {
193
- g.world.scoreboard.stop();
194
- g.outcome = outcome;
195
- g.phase = 'over';
196
- if (outcome === 'win') celebrate(g.world);
197
- else jolt(g.camera);
198
- draw(g);
199
- g.onPhase('over');
200
- }
201
-
202
- /** The final score: the merges' points, plus (for a win) a bonus by its time against two minutes. */
203
- export const finalScore = (g: Game) => g.score + (g.outcome === 'win' ? calculateTimeBasedScore(GAME_TIME - g.time, EXPECTED_TIME, BASE_SCORE) : 0);
204
-
205
- export function tick(g: Game, dt: number) {
206
- if (g.world.isDisposed) return;
207
- g.clock += Math.min(dt, 0.25);
208
- if (g.phase === 'playing') physics(g, dt * 1000);
209
- draw(g);
210
- g.world.update(dt);
211
- }
212
-
213
- /** This frame's fixed 60 Hz steps (none while the glass is empty), and what they did. */
214
- function physics(g: Game, frameMs: number) {
215
- let pending = Math.min(g.pending + frameMs, MAX_PENDING_MS);
216
- if (pending < STEP_MS - STEP_TOLERANCE_MS) {
217
- g.pending = pending;
218
- return;
219
- }
220
- const now = nowMs(g);
221
- const out: { outcome: 'win' | 'lose' | null } = { outcome: null };
222
- let spawn = false;
223
- while (pending >= STEP_MS - STEP_TOLERANCE_MS) {
224
- pending -= STEP_MS;
225
- if (g.bodies.length === 0) continue;
226
- const m = step(g.bodies, now, g.st, out);
227
- if (m) {
228
- if (g.scene) mergeFx(g.world, g.scene, m.a, m.b, m.made);
229
- g.onScore(g.world.scoreboard.add(FRUIT_TYPES[m.made.typeId]!.score));
230
- if (m.made.typeId > g.bestType) {
231
- g.bestType = m.made.typeId;
232
- g.onBest(g.bestType);
233
- }
234
- g.onEvent('merge');
235
- }
236
- if (out.outcome) break;
237
- if (g.spawnAt > 0 && now >= g.spawnAt) {
238
- g.spawnAt = 0;
239
- spawn = true;
240
- }
241
- }
242
- g.pending = pending;
243
- if (g.scene) setDanger(g.world, g.scene, g.theme, g.st.danger);
244
- if (out.outcome === 'win') {
245
- g.onEvent('win');
246
- end(g, 'win');
247
- return;
248
- }
249
- if (out.outcome === 'lose') {
250
- end(g, 'overflow');
251
- return;
252
- }
253
- if (spawn && !g.current) spawnAimed(g);
254
- }
255
-
256
- // ── The finger ────────────────────────────────────────────────────────
257
-
258
- /** Drags the aimed fruit by how far the finger moves (kept inside the glass); lifting drops it. */
259
- export function drag(g: Game, { phase, dx, cancelled }: DragEvent) {
260
- const l = g.layout;
261
- const c = g.current;
262
- if (!l || !c) return;
263
- if (phase === 'start') {
264
- g.dragFrom = c.x;
265
- return;
266
- }
267
- const r = radiusOf(c.typeId);
268
- c.x = Math.max(r, Math.min(PLAY_WIDTH - r, g.dragFrom + dx / l.k));
269
- if (phase === 'end' && !cancelled) drop(g);
270
- }
271
-
272
- /** Lets the aimed fruit go: it joins the glass, and the next one is aimed a moment later. */
273
- export function drop(g: Game) {
274
- const c = g.current;
275
- if (g.phase !== 'playing' || !c) return;
276
- const born = nowMs(g);
277
- g.bodies.push(makeBody(c.id, c.typeId, c.x, c.y, 0, born));
278
- if (c.typeId > g.bestType) {
279
- g.bestType = c.typeId;
280
- g.onBest(g.bestType);
281
- }
282
- g.current = null;
283
- g.spawnAt = born + SPAWN_DELAY_MS;
284
- g.onEvent('drop');
285
- }