@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,169 +0,0 @@
1
- // Pac-Man's maze, rules, timings and layout, on the Nayan engine. The maze, scoring and lives match
2
- // the original version (games/pac-man), so scores carry over: 100 a dot, 500 a power pellet, 500 a ghost
3
- // (doubling in a chain), 300 the fruit, three lives, clear every dot within five minutes to win.
4
- import { getScoreBoardTop } from '../shared/EngineHud';
5
- import type { TiltView } from '../shared/EngineTilt';
6
- import { frontLight, gameWidthFor } from '../shared/EngineUtils';
7
-
8
- // ── Grid ──────────────────────────────────────────────────────────────
9
-
10
- export const COLS = 19;
11
- export const ROWS = 21;
12
-
13
- // ── Rules / scoring (as the original version) ─────────────────────────────
14
-
15
- export const POINTS_PER_DOT = 100;
16
- export const POINTS_PER_POWER_PELLET = 500;
17
- export const POINTS_PER_GHOST = 500; // doubles for each ghost eaten in a chain
18
- export const POINTS_PER_FRUIT = 300;
19
- export const INITIAL_LIVES = 3;
20
- export const TIME_LIMIT = 300; // seconds; clear every dot in this time or lose
21
-
22
- // ── Timings (seconds) ─────────────────────────────────────────────────
23
-
24
- export const PAC_STEP = 0.16; // seconds Pac-Man takes to cross a cell
25
- export const GHOST_STEP = 0.25; // slightly slower pursuit gives the player more room to react
26
- export const GHOST_EATEN_STEP = 0.1; // eyes race back to the house
27
- export const POWER_PELLET_TIME = 7; // ghosts frightened this long
28
- export const FLASH_TIME = 2; // frightened ghosts flash for the last of it
29
- export const SCATTER_TIME = 7;
30
- export const CHASE_TIME = 20;
31
- export const FRUIT_TIME = 10; // the fruit waits this long
32
- export const FRUIT_SPAWN_DOTS = [70, 170]; // dots eaten when the fruit appears
33
- export const CHOMP_TIME = 0.16; // one open/close of the mouth
34
-
35
- // ── Cells, ghosts ─────────────────────────────────────────────────────
36
-
37
- export enum CellType {
38
- EMPTY = 0,
39
- WALL = 1,
40
- DOT = 2,
41
- POWER_PELLET = 3,
42
- GHOST_HOUSE = 4,
43
- GHOST_DOOR = 5,
44
- TUNNEL = 6
45
- }
46
-
47
- export enum GhostMode {
48
- SCATTER = 'scatter',
49
- CHASE = 'chase',
50
- FRIGHTENED = 'frightened',
51
- EATEN = 'eaten',
52
- IN_HOUSE = 'in_house',
53
- LEAVING_HOUSE = 'leaving_house'
54
- }
55
-
56
- export enum GhostName {
57
- BLINKY = 'blinky',
58
- PINKY = 'pinky',
59
- INKY = 'inky',
60
- CLYDE = 'clyde'
61
- }
62
-
63
- export type Direction = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT' | 'NONE';
64
- export const DIRECTIONS: Record<Direction, { x: number; y: number }> = {
65
- UP: { x: 0, y: -1 },
66
- DOWN: { x: 0, y: 1 },
67
- LEFT: { x: -1, y: 0 },
68
- RIGHT: { x: 1, y: 0 },
69
- NONE: { x: 0, y: 0 }
70
- };
71
- export const OPPOSITE: Record<Direction, Direction> = { UP: 'DOWN', DOWN: 'UP', LEFT: 'RIGHT', RIGHT: 'LEFT', NONE: 'NONE' };
72
-
73
- export const GHOST_LIST = [GhostName.BLINKY, GhostName.PINKY, GhostName.INKY, GhostName.CLYDE] as const;
74
-
75
- export const GHOST_COLORS: Record<GhostName, string> = {
76
- [GhostName.BLINKY]: '#FF2E2E',
77
- [GhostName.PINKY]: '#FFB8FF',
78
- [GhostName.INKY]: '#36E2FF',
79
- [GhostName.CLYDE]: '#FFB852'
80
- };
81
-
82
- export const COLORS = {
83
- BOARD: '#0A0A2E',
84
- WALL: '#2742F0',
85
- WALL_EDGE: '#5A72FF',
86
- DOT: '#FFE2B0',
87
- PELLET: '#FFF4D6',
88
- PACMAN: '#FFE000',
89
- FRUIT: '#FF4040',
90
- FRUIT_STEM: '#4CAF50',
91
- FRIGHTENED: '#2334E8',
92
- FRIGHTENED_FLASH: '#F4F4FF',
93
- EYE: '#FFFFFF',
94
- PUPIL: '#1A1A6E'
95
- } as const;
96
-
97
- // Lit from the upper left; surfaces facing up off the board keep their exact color.
98
- export const LIGHT = frontLight([-0.35, 0.5, 1], 0.5);
99
- export const TILT = 0.34;
100
-
101
- // ── Classic maze (0 empty, 1 wall, 2 dot, 3 pellet, 4 house, 5 door, 6 tunnel) ──
102
-
103
- export const PACMAN_MAZE: number[][] = [
104
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
105
- [1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1],
106
- [1, 3, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 3, 1],
107
- [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
108
- [1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1],
109
- [1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1],
110
- [1, 1, 1, 1, 2, 1, 1, 1, 0, 1, 0, 1, 1, 1, 2, 1, 1, 1, 1],
111
- [0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0],
112
- [1, 1, 1, 1, 2, 1, 0, 1, 1, 5, 1, 1, 0, 1, 2, 1, 1, 1, 1],
113
- [6, 0, 0, 0, 2, 0, 0, 1, 4, 4, 4, 1, 0, 0, 2, 0, 0, 0, 6],
114
- [1, 1, 1, 1, 2, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2, 1, 1, 1, 1],
115
- [0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0],
116
- [1, 1, 1, 1, 2, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2, 1, 1, 1, 1],
117
- [1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1],
118
- [1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1],
119
- [1, 3, 2, 1, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 1, 2, 3, 1],
120
- [1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 1],
121
- [1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1],
122
- [1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1],
123
- [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
124
- [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
125
- ];
126
-
127
- export const PACMAN_START = { x: 9, y: 15 };
128
- export const GHOST_START: Record<GhostName, { x: number; y: number }> = {
129
- [GhostName.BLINKY]: { x: 9, y: 7 },
130
- [GhostName.PINKY]: { x: 9, y: 9 },
131
- [GhostName.INKY]: { x: 8, y: 9 },
132
- [GhostName.CLYDE]: { x: 10, y: 9 }
133
- };
134
- export const GHOST_SCATTER: Record<GhostName, { x: number; y: number }> = {
135
- [GhostName.BLINKY]: { x: 17, y: 0 },
136
- [GhostName.PINKY]: { x: 1, y: 0 },
137
- [GhostName.INKY]: { x: 17, y: 20 },
138
- [GhostName.CLYDE]: { x: 1, y: 20 }
139
- };
140
- /** Seconds after the game starts before each ghost leaves the house. */
141
- export const GHOST_RELEASE: Record<GhostName, number> = {
142
- [GhostName.BLINKY]: 0,
143
- [GhostName.PINKY]: 2,
144
- [GhostName.INKY]: 5,
145
- [GhostName.CLYDE]: 8
146
- };
147
- export const HOUSE_DOOR = { x: 9, y: 9 }; // where eaten ghosts return
148
-
149
- // ── Layout (view points) ──────────────────────────────────────────────
150
-
151
- const SCOREBOARD_HEIGHT = 82;
152
- const CONTROLS_HEIGHT = 120;
153
- const RIM = 0; // no frame round the maze: it fills the game width
154
- const WALL_STAND = 1.4; // how much the raised walls add to the board's height on screen
155
-
156
- export type Layout = TiltView & { cell: number; sizeX: number; sizeY: number };
157
-
158
- /** The maze as wide as the game area, centred between the scoreboard and the controls. */
159
- export function getLayout(width: number, height: number, offset: number): Layout {
160
- const top = getScoreBoardTop(offset) + SCOREBOARD_HEIGHT;
161
- const room = Math.max(200, height - top - CONTROLS_HEIGHT);
162
- const fromWidth = gameWidthFor(width) / (COLS + RIM * 2);
163
- const fromHeight = room / (Math.cos(TILT) * (ROWS + RIM * 2) + Math.sin(TILT) * WALL_STAND);
164
- const cell = Math.max(6, Math.floor(Math.min(fromWidth, fromHeight)));
165
- return { width, height, tilt: TILT, centerY: top + room / 2, cell, sizeX: cell * COLS, sizeY: cell * ROWS };
166
- }
167
-
168
- /** A grid point (cell units, 0.5 = a cell's centre) on the maze, in world units. Row 0 is the top. */
169
- export const gridPoint = (l: Layout, x: number, y: number): [number, number] => [x * l.cell - l.sizeX / 2, l.sizeY / 2 - y * l.cell];
@@ -1,406 +0,0 @@
1
- // Pac-Man's play, with no React: build a game with `createGame`, give it a layout, `start` it and
2
- // `tick` it every frame. Pac-Man creeps a cell every PAC_STEP on the game's own clock; the ghosts step
3
- // on theirs, leave the house on a timer, chase or scatter, and turn blue when a power pellet is eaten.
4
- // Eat every dot to win; lose all three lives or run the five minutes out to lose.
5
- import { type Camera, type DragEvent, World } from '@nayan-ui/engine';
6
- import type { GameTheme } from '../../services/ThemeService';
7
- import { aimTilted } from '../shared/EngineTilt';
8
- import {
9
- CHASE_TIME,
10
- CHOMP_TIME,
11
- type Direction,
12
- FLASH_TIME,
13
- FRUIT_SPAWN_DOTS,
14
- FRUIT_TIME,
15
- GHOST_LIST,
16
- GHOST_RELEASE,
17
- GHOST_STEP,
18
- GhostMode,
19
- GhostName,
20
- INITIAL_LIVES,
21
- type Layout,
22
- PAC_STEP,
23
- POINTS_PER_FRUIT,
24
- POINTS_PER_GHOST,
25
- POWER_PELLET_TIME,
26
- SCATTER_TIME,
27
- TIME_LIMIT
28
- } from './PacManConstants';
29
- import {
30
- collides,
31
- eatAt,
32
- frightenGhosts,
33
- initGhosts,
34
- initMaze,
35
- initPacman,
36
- moveGhost as aiMoveGhost,
37
- reachedHouse,
38
- releaseGhost,
39
- stepPacman
40
- } from './PacManRules';
41
- import {
42
- buildScene,
43
- clearDots,
44
- dressGhost,
45
- eatDot,
46
- fruitEaten,
47
- ghostEaten,
48
- moveGhost as sceneMoveGhost,
49
- movePacman,
50
- pacmanHit,
51
- placeFruit,
52
- removeScene,
53
- type Scene,
54
- setPacman,
55
- setSceneTheme,
56
- startChomp,
57
- stopChomp
58
- } from './PacManScene';
59
-
60
- export type Phase = 'ready' | 'playing' | 'over';
61
- export type GameEvent = 'chomp' | 'pellet' | 'fruit' | 'eatGhost' | 'eatGhostCombo' | 'lifeLost';
62
-
63
- const WORLD_CAPACITY = 500;
64
- const MAX_STEP = 0.1;
65
- const SWIPE = 15;
66
-
67
- export function createGame(theme: GameTheme) {
68
- const world = new World(WORLD_CAPACITY);
69
- const camera: Camera = { eye: [0, 0, 240], target: [0, 0, 0], fov: 1, ortho: 1 };
70
- const maze = initMaze();
71
- const g = {
72
- world,
73
- camera,
74
- theme,
75
- layout: null as Layout | null,
76
- scene: null as Scene | null,
77
- phase: 'ready' as Phase,
78
- maze,
79
- pacman: initPacman(),
80
- ghosts: initGhosts(),
81
- fruit: null as { x: number; y: number } | null,
82
- fruitExpireAt: 0,
83
- /** Score, lives and the countdown live in the engine (Rust), advanced by world.update. */
84
- get score() {
85
- return world.scoreboard.score;
86
- },
87
- get lives() {
88
- return world.scoreboard.lives;
89
- },
90
- won: false,
91
- combo: 0,
92
- mode: GhostMode.SCATTER as GhostMode.SCATTER | GhostMode.CHASE,
93
- modeTimer: SCATTER_TIME,
94
- elapsed: 0, // seconds this life has been running (for ghost release)
95
- get timeLeft() {
96
- return world.scoreboard.shownSeconds;
97
- },
98
- clock: 0,
99
- pacPending: 0,
100
- ghostPending: 0,
101
- anchor: null as [number, number] | null,
102
- // UI hooks, set by the screen.
103
- onPhase: (_p: Phase) => {},
104
- onScore: (_s: number) => {},
105
- onLives: (_l: number) => {},
106
- onTime: (_t: number) => {},
107
- onEvent: (_e: GameEvent) => {}
108
- };
109
- world.scoreboard.reset(INITIAL_LIVES, TIME_LIMIT);
110
- world.scoreboard.handlers = {
111
- onScore: (s) => g.onScore(s),
112
- onSecond: (t) => g.onTime(t),
113
- onTimeUp: () => g.phase === 'playing' && lose(g)
114
- };
115
- return g;
116
- }
117
- export type Game = ReturnType<typeof createGame>;
118
-
119
- // ── Scene ─────────────────────────────────────────────────────────────
120
-
121
- export function setLayout(g: Game, l: Layout) {
122
- if (g.scene) removeScene(g.world, g.scene);
123
- g.layout = l;
124
- aimTilted(g.camera, l);
125
- g.scene = buildScene(g.world, l, g.theme);
126
- redraw(g);
127
- // A rebuilt scene (a new layout mid-game) picks the chomping back up
128
- if (g.phase === 'playing') startChomp(g.world, g.scene, CHOMP_TIME);
129
- else stopChomp(g.world, g.scene);
130
- }
131
-
132
- export function setTheme(g: Game, theme: GameTheme) {
133
- g.theme = theme;
134
- if (g.scene) setSceneTheme(g.world, g.scene, theme);
135
- }
136
-
137
- /** Puts every piece where the state says, with no gliding (first layout, resets). */
138
- function redraw(g: Game) {
139
- const { layout: l, scene: s } = g;
140
- if (!l || !s) return;
141
- setPacman(g.world, l, s, g.pacman.x, g.pacman.y, g.pacman.direction);
142
- for (const name of GHOST_LIST) {
143
- const gh = g.ghosts.find((x) => x.name === name)!;
144
- sceneMoveGhost(g.world, l, s, name, gh.x, gh.y, 0, true);
145
- dressGhost(g.world, l, s, name, gh.mode, gh.isFlashing);
146
- }
147
- placeFruit(g.world, l, s, g.fruit);
148
- }
149
-
150
- // ── Run ───────────────────────────────────────────────────────────────
151
-
152
- function home(g: Game) {
153
- g.maze = initMaze();
154
- g.pacman = initPacman();
155
- g.ghosts = initGhosts();
156
- g.fruit = null;
157
- g.won = false;
158
- g.combo = 0;
159
- g.mode = GhostMode.SCATTER;
160
- g.modeTimer = SCATTER_TIME;
161
- g.elapsed = 0;
162
- g.pacPending = 0;
163
- g.ghostPending = 0;
164
- g.world.scoreboard.reset(INITIAL_LIVES, TIME_LIMIT);
165
- if (g.scene) {
166
- clearDots(g.world, g.scene);
167
- removeScene(g.world, g.scene);
168
- g.scene = g.layout ? buildScene(g.world, g.layout, g.theme) : null;
169
- }
170
- redraw(g);
171
- }
172
-
173
- export function start(g: Game) {
174
- if (g.phase !== 'ready') return;
175
- home(g);
176
- g.world.scoreboard.startCountdown(TIME_LIMIT);
177
- g.phase = 'playing';
178
- if (g.scene) startChomp(g.world, g.scene, CHOMP_TIME);
179
- g.onScore(0);
180
- g.onLives(INITIAL_LIVES);
181
- g.onTime(TIME_LIMIT);
182
- g.onPhase('playing');
183
- }
184
-
185
- export function reset(g: Game) {
186
- home(g);
187
- g.phase = 'ready';
188
- g.anchor = null;
189
- if (g.scene) stopChomp(g.world, g.scene);
190
- g.onScore(0);
191
- g.onLives(INITIAL_LIVES);
192
- g.onTime(TIME_LIMIT);
193
- g.onPhase('ready');
194
- }
195
-
196
- export function dispose(g: Game) {
197
- g.world.dispose();
198
- }
199
-
200
- // ── The finger ────────────────────────────────────────────────────────
201
-
202
- export function drag(g: Game, { phase, x, y }: DragEvent) {
203
- if (phase === 'start') {
204
- g.anchor = [x, y];
205
- return;
206
- }
207
- const a = g.anchor;
208
- if (!a || g.phase !== 'playing') return;
209
- const dx = x - a[0];
210
- const dy = y - a[1];
211
- if (Math.abs(dx) <= SWIPE && Math.abs(dy) <= SWIPE) return;
212
- // The board is seen from the front, so a swipe up the screen heads up the maze (toward row 0).
213
- const dir: Direction = Math.abs(dx) > Math.abs(dy) ? (dx > 0 ? 'RIGHT' : 'LEFT') : dy > 0 ? 'DOWN' : 'UP';
214
- g.pacman.nextDirection = dir;
215
- g.anchor = phase === 'end' ? null : [x, y];
216
- }
217
-
218
- // ── Tick ──────────────────────────────────────────────────────────────
219
-
220
- export function tick(g: Game, dt: number) {
221
- if (g.world.isDisposed) return;
222
- const step = Math.min(dt, MAX_STEP);
223
- g.clock += step;
224
- if (g.phase === 'playing') {
225
- g.elapsed += step;
226
- {
227
- advanceModes(g, step);
228
- advanceFright(g, step);
229
- g.pacPending += step;
230
- while (g.phase === 'playing' && g.pacPending >= PAC_STEP) {
231
- g.pacPending -= PAC_STEP;
232
- pacStep(g);
233
- }
234
- g.ghostPending += step;
235
- while (g.phase === 'playing' && g.ghostPending >= GHOST_STEP) {
236
- g.ghostPending -= GHOST_STEP;
237
- ghostStep(g);
238
- }
239
- // The fruit waits its turn, then goes
240
- if (g.fruit && g.clock >= g.fruitExpireAt) {
241
- g.fruit = null;
242
- if (g.layout && g.scene) placeFruit(g.world, g.layout, g.scene, null);
243
- }
244
- }
245
- }
246
- g.world.update(dt);
247
- }
248
-
249
- /** Scatter and chase take turns; the ghosts not frightened or eaten switch with them. */
250
- function advanceModes(g: Game, dt: number) {
251
- g.modeTimer -= dt;
252
- if (g.modeTimer > 0) return;
253
- const next = g.mode === GhostMode.SCATTER ? GhostMode.CHASE : GhostMode.SCATTER;
254
- g.mode = next;
255
- g.modeTimer = next === GhostMode.SCATTER ? SCATTER_TIME : CHASE_TIME;
256
- for (const gh of g.ghosts) if (gh.mode === GhostMode.SCATTER || gh.mode === GhostMode.CHASE) gh.mode = next;
257
- dressAll(g);
258
- }
259
-
260
- /** Frightened ghosts count down, flash near the end, then go back to what they were doing. */
261
- function advanceFright(g: Game, dt: number) {
262
- let changed = false;
263
- for (const gh of g.ghosts) {
264
- if (gh.mode !== GhostMode.FRIGHTENED) continue;
265
- gh.frightenedTimer -= dt;
266
- const flashing = gh.frightenedTimer < FLASH_TIME;
267
- if (flashing !== gh.isFlashing) {
268
- gh.isFlashing = flashing;
269
- changed = true;
270
- }
271
- if (gh.frightenedTimer <= 0) {
272
- gh.mode = g.mode;
273
- gh.isFlashing = false;
274
- changed = true;
275
- }
276
- }
277
- if (changed) dressAll(g);
278
- }
279
-
280
- function pacStep(g: Game) {
281
- const { layout: l, scene: s } = g;
282
- if (!l || !s) return;
283
- const { moved, wrapped } = stepPacman(g.pacman, g.maze.cells);
284
- if (moved) movePacman(g.world, l, s, g.pacman.x, g.pacman.y, g.pacman.direction, PAC_STEP, wrapped);
285
-
286
- // Eat whatever is here
287
- const bite = eatAt(g.maze, g.pacman.x, g.pacman.y);
288
- if (bite) {
289
- g.world.scoreboard.add(bite.points);
290
- eatDot(g.world, s, g.pacman.x, g.pacman.y);
291
- if (bite.pellet) {
292
- g.ghosts = frightenGhosts(g.ghosts, POWER_PELLET_TIME);
293
- g.combo = 0;
294
- dressAll(g);
295
- g.onEvent('pellet');
296
- } else {
297
- g.onEvent('chomp');
298
- }
299
- const eaten = g.maze.totalDots - g.maze.dotsRemaining;
300
- if (!g.fruit && FRUIT_SPAWN_DOTS.includes(eaten)) {
301
- g.fruit = { x: 9, y: 11 };
302
- g.fruitExpireAt = g.clock + FRUIT_TIME;
303
- placeFruit(g.world, l, s, g.fruit);
304
- }
305
- }
306
-
307
- // The fruit
308
- if (g.fruit && g.pacman.x === g.fruit.x && g.pacman.y === g.fruit.y) {
309
- g.world.scoreboard.add(POINTS_PER_FRUIT);
310
- fruitEaten(g.world, l, s, g.fruit.x, g.fruit.y);
311
- g.fruit = null;
312
- g.onEvent('fruit');
313
- }
314
-
315
- if (checkCollisions(g)) return;
316
-
317
- if (g.maze.dotsRemaining === 0) win(g);
318
- }
319
-
320
- function ghostStep(g: Game) {
321
- const { layout: l, scene: s } = g;
322
- if (!l || !s) return;
323
- // Release any whose time has come
324
- for (let i = 0; i < g.ghosts.length; i++) {
325
- const gh = g.ghosts[i]!;
326
- if (gh.mode === GhostMode.IN_HOUSE && g.elapsed >= GHOST_RELEASE[gh.name]) g.ghosts[i] = releaseGhost(gh);
327
- }
328
- const blinky = g.ghosts.find((x) => x.name === GhostName.BLINKY) ?? null;
329
- const blinkyPos = blinky ? { x: blinky.x, y: blinky.y } : null;
330
- for (let i = 0; i < g.ghosts.length; i++) {
331
- let gh = reachedHouse(g.ghosts[i]!);
332
- const beforeX = gh.x;
333
- gh = aiMoveGhost(g.maze.cells, gh, g.pacman, blinkyPos);
334
- g.ghosts[i] = gh;
335
- const wrapped = Math.abs(gh.x - beforeX) > 1;
336
- sceneMoveGhost(g.world, l, s, gh.name, gh.x, gh.y, GHOST_STEP, wrapped);
337
- }
338
- dressAll(g);
339
- checkCollisions(g);
340
- }
341
-
342
- /** Pac-Man and a ghost on the same cell: eats a frightened one, otherwise loses a life. Returns true if a life was lost. */
343
- function checkCollisions(g: Game): boolean {
344
- const { layout: l, scene: s } = g;
345
- if (!l || !s) return false;
346
- for (let i = 0; i < g.ghosts.length; i++) {
347
- const gh = g.ghosts[i]!;
348
- if (!collides(g.pacman, gh)) continue;
349
- if (gh.mode === GhostMode.FRIGHTENED) {
350
- g.combo++;
351
- g.world.scoreboard.add(POINTS_PER_GHOST * Math.pow(2, g.combo - 1));
352
- gh.mode = GhostMode.EATEN;
353
- gh.isFlashing = false;
354
- dressGhost(g.world, l, s, gh.name, gh.mode, false);
355
- ghostEaten(g.world, l, gh.x, gh.y);
356
- g.onEvent(g.combo > 1 ? 'eatGhostCombo' : 'eatGhost');
357
- } else if (gh.mode !== GhostMode.EATEN && gh.mode !== GhostMode.IN_HOUSE && gh.mode !== GhostMode.LEAVING_HOUSE) {
358
- loseLife(g);
359
- return true;
360
- }
361
- }
362
- return false;
363
- }
364
-
365
- function loseLife(g: Game) {
366
- const { layout: l, scene: s } = g;
367
- g.onLives(Math.max(0, g.world.scoreboard.addLives(-1)));
368
- if (l && s) pacmanHit(g.world, l, g.pacman.x, g.pacman.y);
369
- if (g.lives <= 0) {
370
- lose(g);
371
- return;
372
- }
373
- g.onEvent('lifeLost');
374
- // Back to the start cells; the maze, dots and score stay
375
- g.pacman = { ...initPacman(), direction: 'NONE', nextDirection: 'NONE' };
376
- g.ghosts = initGhosts();
377
- g.combo = 0;
378
- g.elapsed = 0;
379
- g.pacPending = 0;
380
- g.ghostPending = 0;
381
- redraw(g);
382
- }
383
-
384
- function win(g: Game) {
385
- g.won = true;
386
- end(g);
387
- }
388
-
389
- function lose(g: Game) {
390
- g.won = false;
391
- end(g);
392
- }
393
-
394
- function end(g: Game) {
395
- g.world.scoreboard.stop();
396
- g.phase = 'over';
397
- g.anchor = null;
398
- if (g.scene) stopChomp(g.world, g.scene);
399
- g.onPhase('over');
400
- }
401
-
402
- function dressAll(g: Game) {
403
- const { layout: l, scene: s } = g;
404
- if (!l || !s) return;
405
- for (const gh of g.ghosts) dressGhost(g.world, l, s, gh.name, gh.mode, gh.isFlashing);
406
- }