@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,143 +0,0 @@
1
- // Ludo King's rules, with no React or engine. A token's `progress` tells the whole story: -1 in the
2
- // yard, 0..50 round the shared track (from the player's entry), 51..56 up its home column, 56 home.
3
- // A six brings a token out; you must land on 56 exactly to finish; landing on an opponent off a safe
4
- // cell sends it back. Scoring (3,000 a finished token plus its progress) matches the original version.
5
- import {
6
- CENTER,
7
- ENTRY,
8
- HOME_STRETCH,
9
- HOME_YARDS,
10
- MAIN_PATH,
11
- type PlayerColor,
12
- SAFE_POSITIONS,
13
- TOKENS_PER_PLAYER,
14
- TRACK_LENGTH
15
- } from './LudoKingConstants';
16
-
17
- export type Token = {
18
- id: string;
19
- player: PlayerColor;
20
- /** -1 yard, 0..56 along the route (56 = home). */
21
- progress: number;
22
- };
23
-
24
- export type Player = { color: PlayerColor; tokens: Token[]; isAI: boolean; finishedTokens: number };
25
- export type GamePhase = 'rolling' | 'moving' | 'ai_turn' | 'over';
26
-
27
- export const isInYard = (t: Token) => t.progress < 0;
28
- export const isFinished = (t: Token) => t.progress >= TRACK_LENGTH;
29
-
30
- export const rollDice = () => Math.floor(Math.random() * 6) + 1;
31
-
32
- export function createPlayers(you: PlayerColor, ai: PlayerColor[]): Player[] {
33
- const make = (color: PlayerColor, isAI: boolean): Player => ({
34
- color,
35
- isAI,
36
- finishedTokens: 0,
37
- tokens: Array.from({ length: TOKENS_PER_PLAYER }, (_, i) => ({ id: `${color}-${i}`, player: color, progress: -1 }))
38
- });
39
- return [make(you, false), ...ai.map((c) => make(c, true))];
40
- }
41
-
42
- /** The absolute index on the shared track for a token `steps` from its entry (0..50). */
43
- export const mainIndexAt = (player: PlayerColor, steps: number) => (ENTRY[player] + steps) % 52;
44
-
45
- export function canMove(token: Token, dice: number): boolean {
46
- if (isFinished(token)) return false;
47
- if (isInYard(token)) return dice === 6;
48
- return token.progress + dice <= TRACK_LENGTH;
49
- }
50
-
51
- export const movableTokens = (player: Player, dice: number) => player.tokens.filter((t) => canMove(t, dice));
52
-
53
- /** The grid cell a token stands on now. */
54
- export function tokenCell(token: Token): { row: number; col: number } {
55
- if (isFinished(token)) return CENTER;
56
- if (isInYard(token)) {
57
- const i = Number(token.id.split('-')[1]);
58
- return HOME_YARDS[token.player][i] ?? CENTER;
59
- }
60
- if (token.progress <= 50) return MAIN_PATH[mainIndexAt(token.player, token.progress)]!;
61
- return HOME_STRETCH[token.player][token.progress - 51]!;
62
- }
63
-
64
- /** The cells a token passes through for a move of `dice` (for the hop animation), start included. */
65
- export function journey(token: Token, dice: number): { row: number; col: number }[] {
66
- const cells = [tokenCell(token)];
67
- if (isInYard(token)) {
68
- cells.push(MAIN_PATH[ENTRY[token.player]]!);
69
- return cells;
70
- }
71
- for (let k = 1; k <= dice; k++) {
72
- const p = token.progress + k;
73
- cells.push(p >= TRACK_LENGTH ? CENTER : p <= 50 ? MAIN_PATH[mainIndexAt(token.player, p)]! : HOME_STRETCH[token.player][p - 51]!);
74
- }
75
- return cells;
76
- }
77
-
78
- /** Applies a move, returning the moved token and any opponent token it captured. */
79
- export function moveToken(token: Token, dice: number, players: Player[]): { moved: Token; captured: Token | null } {
80
- const moved: Token = { ...token };
81
- if (isInYard(token)) {
82
- moved.progress = 0; // onto the entry cell
83
- } else {
84
- moved.progress = token.progress + dice;
85
- }
86
- let captured: Token | null = null;
87
- // Capture only on the shared track, off a safe cell
88
- if (moved.progress >= 0 && moved.progress <= 50) {
89
- const landed = mainIndexAt(moved.player, moved.progress);
90
- if (!SAFE_POSITIONS.includes(landed)) {
91
- for (const p of players) {
92
- if (p.color === token.player) continue;
93
- for (const other of p.tokens) {
94
- if (!isInYard(other) && !isFinished(other) && other.progress <= 50 && mainIndexAt(other.player, other.progress) === landed) {
95
- captured = other;
96
- break;
97
- }
98
- }
99
- if (captured) break;
100
- }
101
- }
102
- }
103
- return { moved, captured };
104
- }
105
-
106
- export const isGameOver = (players: Player[]) => players.some((p) => p.finishedTokens === TOKENS_PER_PLAYER);
107
- export const getWinner = (players: Player[]) => players.find((p) => p.finishedTokens === TOKENS_PER_PLAYER) ?? null;
108
-
109
- /** The AI's pick: a weighted score per move, best 70% of the time (as the original medium AI). */
110
- export function selectAIMove(player: Player, dice: number, players: Player[]): Token | null {
111
- const options = movableTokens(player, dice);
112
- if (!options.length) return null;
113
- const scored = options.map((token) => {
114
- let score = 0;
115
- const { moved, captured } = moveToken(token, dice, players);
116
- if (captured) score += 100;
117
- if (isInYard(token) && dice === 6) score += 50;
118
- if (isFinished(moved)) score += 200;
119
- if (!isInYard(token) && !isFinished(token)) score += moved.progress;
120
- if (!isFinished(moved) && moved.progress <= 50 && SAFE_POSITIONS.includes(mainIndexAt(moved.player, moved.progress))) score += 30;
121
- if (!isFinished(moved) && moved.progress <= 50 && !SAFE_POSITIONS.includes(mainIndexAt(moved.player, moved.progress))) {
122
- const landed = mainIndexAt(moved.player, moved.progress);
123
- for (const opp of players) {
124
- if (opp.color === player.color) continue;
125
- for (const t of opp.tokens) {
126
- if (isInYard(t) || isFinished(t) || t.progress > 50) continue;
127
- const dist = (landed - mainIndexAt(t.player, t.progress) + 52) % 52;
128
- if (dist <= 6) score -= 20;
129
- }
130
- }
131
- }
132
- return { token, score };
133
- });
134
- scored.sort((a, b) => b.score - a.score);
135
- if (Math.random() < 0.3 && scored.length > 1) return scored[Math.floor(Math.random() * scored.length)]!.token;
136
- return scored[0]!.token;
137
- }
138
-
139
- export function calculateScore(player: Player): number {
140
- let score = player.finishedTokens * 3000;
141
- for (const t of player.tokens) if (!isInYard(t) && !isFinished(t)) score += Math.round(t.progress * 30);
142
- return score;
143
- }
@@ -1,397 +0,0 @@
1
- // Everything Ludo King draws, on the Nayan engine. An orthographic camera leans back over the classic
2
- // cross board, which lies in the world's XY plane (x right, y up, z up off it), one board unit (its
3
- // width) to `layout.size` view points. The board — frame, four homes, the cross of path tiles, the
4
- // coloured home columns and the centre star — is one static mesh; the eight pawns and the die are
5
- // their own entities. Every mesh is built once (mesh ids are app-wide and limited).
6
- import {
7
- type Camera,
8
- type Color,
9
- effects,
10
- type Entity,
11
- extrude,
12
- type GeometryPart,
13
- lathe,
14
- merge,
15
- type Model,
16
- Path,
17
- type Quat,
18
- quat,
19
- shapeGeometry,
20
- type Vec3,
21
- type World
22
- } from '@nayan-ui/engine';
23
- import type { GameTheme } from '../../services/ThemeService';
24
- import { setBackdropTheme, spawnBackdrop } from '../shared/EngineBackdrop';
25
- import { dieMesh, dieRotation as sharedDieRotation, rollDie as rollSharedDie } from '../shared/EngineDice';
26
- import { cacheGameAsset, createGameMesh as createShape } from '../shared/EngineMeshes';
27
- import { aimTilted, placeTiltedBackdrop, type TiltView } from '../shared/EngineTilt';
28
- import { toColor } from '../shared/EngineUtils';
29
- import {
30
- AI_COLOR,
31
- BOARD_FRAME,
32
- BOARD_WHITE,
33
- cellPoint,
34
- CENTER,
35
- DIE_SIZE,
36
- DIE_Y,
37
- ENTRY,
38
- GRID,
39
- HOME_STRETCH,
40
- HOME_YARDS,
41
- type Layout,
42
- MAIN_PATH,
43
- PLAYER_COLOR,
44
- PLAYER_COLORS,
45
- type PlayerColor,
46
- RIM,
47
- SAFE_POSITIONS,
48
- STAR_COLOR,
49
- TILE_TOP,
50
- TILT,
51
- TOKEN_HEIGHT
52
- } from './LudoKingConstants';
53
-
54
- // ── Helpers ───────────────────────────────────────────────────────────
55
-
56
- const meshes = new Map<string, Model>();
57
- const cached = (key: string, build: () => Model) => {
58
- let m = meshes.get(key);
59
- if (!m) {
60
- m = cacheGameAsset('ludo-king/LudoKingScene:' + key, build);
61
- meshes.set(key, m);
62
- }
63
- return m;
64
- };
65
- const rgb = (css: string): [number, number, number] => {
66
- const [r, g, b] = toColor(css);
67
- return [r, g, b];
68
- };
69
- const cube = () => shapeGeometry('cube');
70
- const sphere = () => shapeGeometry('sphere');
71
- const STAND_UP = quat.x(Math.PI / 2);
72
- const CELL = 1 / GRID;
73
-
74
- // ── The board (board units; spawned at scale = size) ──────────────────
75
-
76
- const HOME_CORNER: { color: PlayerColor; row: number; col: number }[] = [
77
- { color: 'blue', row: 0, col: 0 },
78
- { color: 'red', row: 0, col: 9 },
79
- { color: 'green', row: 9, col: 0 },
80
- { color: 'yellow', row: 9, col: 9 }
81
- ];
82
-
83
- // The board is flat, like a printed board (only the pawns and the die stand up in 3D): thin layers at
84
- // heights just far enough apart that the depth test always knows which is on top, yet well under a
85
- // pixel on screen. From the bottom: the frame, the white board, the home squares, the track tiles and
86
- // the centre, then the yards' rings and stars, then their white centres.
87
- const SKIN = 0.0004;
88
- const LAYER = 0.002;
89
- const layerZ = (k: number) => TILE_TOP - LAYER * 4 + LAYER * k;
90
- /** Above every layer of the board: pawn shadows, then the pawns and hint rings over them. */
91
- export const SHADOW_Z = layerZ(6);
92
- export const PAWN_Z = layerZ(7);
93
-
94
- /** The lines between cells: each cell sits on a square of this colour, a little bigger, showing round its edge. */
95
- const GRID_LINE: [number, number, number] = [0.55, 0.53, 0.62];
96
-
97
- function tile(parts: GeometryPart[], row: number, col: number, color: [number, number, number], inset = 0.92) {
98
- const [x, y] = cellPoint(row, col);
99
- parts.push({ geometry: cube(), position: [x, y, layerZ(2)], scale: [CELL, CELL, SKIN], color: [...GRID_LINE, 1] });
100
- parts.push({ geometry: cube(), position: [x, y, layerZ(3)], scale: [CELL * inset, CELL * inset, SKIN], color: [...color, 1] });
101
- }
102
-
103
- const disc = (r: number) => extrude(new Path().addCircle(0, 0, r), { depth: SKIN });
104
-
105
- function boardMesh(): Model {
106
- return cached('ludo-board', () => {
107
- const outer = 1 + RIM * 2;
108
- const frame = rgb(BOARD_FRAME);
109
- const white = rgb(BOARD_WHITE);
110
- const parts: GeometryPart[] = [
111
- { geometry: cube(), position: [0, 0, layerZ(0)], scale: [outer, outer, SKIN], color: [...frame, 1] },
112
- { geometry: cube(), position: [0, 0, layerZ(1)], scale: [1, 1, SKIN], color: [...white, 1] }
113
- ];
114
- // Four home bases: a coloured square, a white yard inside it, and four rings where the pawns wait
115
- for (const { color, row, col } of HOME_CORNER) {
116
- const c = rgb(PLAYER_COLORS[color]);
117
- const [cx, cy] = cellPoint(row + 2.5, col + 2.5);
118
- const size = 6 * CELL;
119
- parts.push({ geometry: cube(), position: [cx, cy, layerZ(2)], scale: [size, size, SKIN], color: [...c, 1] });
120
- parts.push({ geometry: cube(), position: [cx, cy, layerZ(3)], scale: [size * 0.68, size * 0.68, SKIN], color: [...white, 1] });
121
- for (const yard of HOME_YARDS[color]) {
122
- const [yx, yy] = cellPoint(yard.row, yard.col);
123
- parts.push({ geometry: disc(0.5), position: [yx, yy, layerZ(4)], scale: [CELL * 1.5, CELL * 1.5, 1], color: [...c, 1] });
124
- parts.push({ geometry: disc(0.5), position: [yx, yy, layerZ(5)], scale: [CELL * 0.9, CELL * 0.9, 1], color: [...white, 1] });
125
- }
126
- }
127
- // The 52 shared track cells, a star on the safe ones
128
- MAIN_PATH.forEach((cell, i) => {
129
- const owner = (Object.keys(ENTRY) as PlayerColor[]).find((p) => ENTRY[p] === i);
130
- const color = owner ? rgb(PLAYER_COLORS[owner]) : white;
131
- tile(parts, cell.row, cell.col, color);
132
- if (SAFE_POSITIONS.includes(i) && !owner) {
133
- const [x, y] = cellPoint(cell.row, cell.col);
134
- parts.push({
135
- geometry: extrude(new Path().addStar(0, 0, 0.5, 0.22), { depth: SKIN }),
136
- position: [x, y, layerZ(4)],
137
- scale: [CELL * 0.7, CELL * 0.7, 1],
138
- color: [...rgb(STAR_COLOR), 1]
139
- });
140
- }
141
- });
142
- // Coloured home columns, in exactly the player's colour (as their home, start cell and centre triangle)
143
- for (const color of ['blue', 'red', 'green', 'yellow'] as PlayerColor[]) {
144
- const c = rgb(PLAYER_COLORS[color]);
145
- for (const cell of HOME_STRETCH[color]) tile(parts, cell.row, cell.col, c);
146
- }
147
- // The centre: four triangles meeting at the origin, each a player's colour (path y is drawn down)
148
- // Its corners are the cell edges round the middle 3 x 3 (rows and columns 6 to 8): cellPoint gives
149
- // a cell's centre, so half a cell out from the corner cells' centres
150
- const corners = {
151
- tl: cellPoint(5.5, 5.5),
152
- tr: cellPoint(5.5, 8.5),
153
- bl: cellPoint(8.5, 5.5),
154
- br: cellPoint(8.5, 8.5)
155
- };
156
- const tri = (a: [number, number], b: [number, number], color: string) =>
157
- parts.push({
158
- geometry: extrude(
159
- new Path().addPolygon([
160
- [0, 0],
161
- [a[0], -a[1]],
162
- [b[0], -b[1]]
163
- ]),
164
- { depth: SKIN }
165
- ),
166
- position: [0, 0, layerZ(3)],
167
- color: [...rgb(color), 1]
168
- });
169
- tri(corners.tl, corners.tr, PLAYER_COLORS.red); // top
170
- tri(corners.tr, corners.br, PLAYER_COLORS.yellow); // right
171
- tri(corners.br, corners.bl, PLAYER_COLORS.green); // bottom
172
- tri(corners.bl, corners.tl, PLAYER_COLORS.blue); // left
173
- // Matte, like printed card: no glossy highlight on the board (the pawns and die keep theirs)
174
- return createShape(merge(parts), { center: false, shine: 0 });
175
- });
176
- }
177
-
178
- // ── Pawn and die meshes ───────────────────────────────────────────────
179
-
180
- const pawnMesh = () =>
181
- cached('ludo-pawn', () =>
182
- createShape(
183
- merge([
184
- {
185
- geometry: lathe(
186
- [
187
- [0.001, 0],
188
- [0.42, 0],
189
- [0.44, 0.04],
190
- [0.42, 0.1],
191
- [0.3, 0.14],
192
- [0.24, 0.2],
193
- [0.18, 0.44],
194
- [0.15, 0.58],
195
- [0.27, 0.61],
196
- [0.27, 0.66],
197
- [0.14, 0.69]
198
- ],
199
- { segments: 28 }
200
- )
201
- },
202
- { geometry: sphere(), position: [0, 0.84, 0], scale: 0.42 }
203
- ]),
204
- { center: false, shine: 0.6 }
205
- )
206
- );
207
-
208
- /** The die showing `value` toward the camera (shared/EngineDice), turned `twist` round its up axis. */
209
- export const dieRotation = (value: number, twist = 0): Quat => sharedDieRotation(TILT, value, twist);
210
-
211
- const discMesh = () => cached('ludo-disc', () => createShape(extrude(new Path().addCircle(0, 0, 0.5), { depth: 0 })));
212
- const ringMesh = () =>
213
- cached('ludo-ring', () => createShape(extrude(new Path().addCircle(0, 0, 0.5).addCircle(0, 0, 0.4), { depth: 0, fillRule: 'evenodd' })));
214
-
215
- // ── Scene ─────────────────────────────────────────────────────────────
216
-
217
- const SHADOW: Color = [0, 0, 0, 0.22];
218
- const BACKDROP_DEPTH = 25;
219
-
220
- export type Scene = {
221
- backdrop: Entity;
222
- board: Entity;
223
- tokens: Map<string, Entity>;
224
- tokenAt: Map<Entity, string>;
225
- bobbing: Set<string>;
226
- shadows: Map<string, Entity>;
227
- die: Entity;
228
- dieShadow: Entity;
229
- ring: Entity;
230
- hints: Entity[];
231
- };
232
-
233
- export const toWorld = (l: Layout, x: number, y: number, z: number): Vec3 => [x * l.size, y * l.size, z * l.size];
234
- const tiltView = (l: Layout): TiltView => ({ width: l.width, height: l.height, centerY: l.centerY, tilt: TILT });
235
- export const aimCamera = (camera: Camera, l: Layout) => aimTilted(camera, tiltView(l));
236
- export const dieRest = (l: Layout): Vec3 => toWorld(l, 0, DIE_Y, DIE_SIZE / 2);
237
-
238
- export function buildScene(world: World, l: Layout, theme: GameTheme, tokenIds: { id: string; color: PlayerColor }[]): Scene {
239
- const backdrop = spawnBackdrop(world, l.width, l.height, -BACKDROP_DEPTH, theme);
240
- placeTiltedBackdrop(world, backdrop, tiltView(l), BACKDROP_DEPTH);
241
- const board = world.spawn({ mesh: boardMesh(), scale: l.size, color: [1, 1, 1, 1], pickable: false });
242
- const tokens = new Map<string, Entity>();
243
- const tokenAt = new Map<Entity, string>();
244
- const shadows = new Map<string, Entity>();
245
- for (const { id, color } of tokenIds) {
246
- const e = world.spawn({ mesh: pawnMesh(), rotation: STAND_UP, scale: TOKEN_HEIGHT * l.size, color: toColor(PLAYER_COLORS[color]) });
247
- tokens.set(id, e);
248
- tokenAt.set(e, id);
249
- shadows.set(id, world.spawn({ mesh: discMesh(), scale: 0.05 * l.size, color: SHADOW, pickable: false }));
250
- }
251
- const dieShadow = world.spawn({
252
- mesh: discMesh(),
253
- position: toWorld(l, 0.012, DIE_Y - 0.01, 0.001),
254
- scale: [DIE_SIZE * 1.25 * l.size, DIE_SIZE * 1.1 * l.size, 1],
255
- color: SHADOW,
256
- pickable: false
257
- });
258
- const ring = world.spawn({ mesh: ringMesh(), position: toWorld(l, 0, DIE_Y, 0.002), scale: 0, color: [1, 0.78, 0.15, 0.85], pickable: false });
259
- const die = world.spawn({ mesh: dieMesh(), position: dieRest(l), rotation: dieRotation(1), scale: DIE_SIZE * l.size });
260
- const hints = Array.from({ length: 4 }, () => world.spawn({ mesh: ringMesh(), scale: 0, color: [1, 0.85, 0.2, 0.9], pickable: false }));
261
- return { backdrop, board, tokens, tokenAt, bobbing: new Set(), shadows, die, dieShadow, ring, hints };
262
- }
263
-
264
- export function removeScene(world: World, s: Scene) {
265
- world.despawn(s.backdrop);
266
- world.despawn(s.board);
267
- for (const e of s.tokens.values()) world.despawn(e);
268
- for (const e of s.shadows.values()) world.despawn(e);
269
- world.despawn(s.die);
270
- world.despawn(s.dieShadow);
271
- world.despawn(s.ring);
272
- for (const e of s.hints) world.despawn(e);
273
- }
274
-
275
- export function setSceneTheme(world: World, s: Scene, theme: GameTheme) {
276
- setBackdropTheme(world, s.backdrop, theme);
277
- }
278
-
279
- // ── Tokens ────────────────────────────────────────────────────────────
280
-
281
- /** When players share a cell they shoulder apart a little. */
282
- export function placeToken(world: World, l: Layout, s: Scene, id: string, cell: { row: number; col: number }, offset = 0) {
283
- const [x, y] = cellPoint(cell.row, cell.col);
284
- const token = s.tokens.get(id)!;
285
- const shadow = s.shadows.get(id)!;
286
- world.stopAnimation(token);
287
- world.stopAnimation(shadow);
288
- world.set(token, { position: toWorld(l, x + offset, y, PAWN_Z) });
289
- world.set(shadow, { position: toWorld(l, x + offset + 0.006, y - 0.006, SHADOW_Z) });
290
- }
291
-
292
- /** Hops a token through a run of cells. */
293
- export function hopToken(world: World, l: Layout, s: Scene, id: string, cells: { row: number; col: number }[], time: number) {
294
- const token = s.tokens.get(id)!;
295
- const shadow = s.shadows.get(id)!;
296
- const pts = cells.map((c) => cellPoint(c.row, c.col));
297
- const keys = pts.slice(1).map((p, i) => ({ position: toWorld(l, p[0], p[1], PAWN_Z + 0.03), at: (i + 1) / (pts.length - 1) }));
298
- const last = pts[pts.length - 1]!;
299
- world.stopAnimation(token);
300
- world.stopAnimation(shadow);
301
- world.animate(token, keys, { duration: time, path: 'smooth', easing: 'easeInOut' });
302
- world.animate(shadow, { position: toWorld(l, last[0] + 0.006, last[1] - 0.006, SHADOW_Z) }, { duration: time });
303
- }
304
-
305
- export function bobToken(world: World, l: Layout, s: Scene, ids: string[]) {
306
- const next = new Set(ids);
307
- for (const [id, e] of s.tokens)
308
- if (next.has(id) !== s.bobbing.has(id)) world.set(e, { bob: next.has(id) ? { amplitude: [0, 0, 0.01 * l.size], speed: 6 } : null });
309
- s.bobbing = next;
310
- }
311
-
312
- export function showHints(world: World, l: Layout, s: Scene, cells: { row: number; col: number }[]) {
313
- const size = CELL * 1.5 * l.size;
314
- s.hints.forEach((e, i) => {
315
- const cell = cells[i];
316
- if (!cell) {
317
- world.stopAnimation(e);
318
- world.set(e, { scale: 0 });
319
- return;
320
- }
321
- const [x, y] = cellPoint(cell.row, cell.col);
322
- world.set(e, { position: toWorld(l, x, y, PAWN_Z), scale: size });
323
- world.stopAnimation(e);
324
- world.animate(e, { scale: size * 1.2 }, { duration: 0.6, easing: 'easeInOut', repeat: 'forever', yoyo: true });
325
- });
326
- }
327
-
328
- // ── The die ───────────────────────────────────────────────────────────
329
-
330
- /** The die is tossed, tumbles and bounces to rest showing `value` (shared/EngineDice). */
331
- export function rollDie(world: World, l: Layout, s: Scene, value: number, time: number, disposed?: () => boolean) {
332
- rollSharedDie(world, {
333
- die: s.die,
334
- shadow: s.dieShadow,
335
- rest: dieRest(l),
336
- shadowAt: toWorld(l, 0.012, DIE_Y - 0.01, 0.001),
337
- shadowScale: [DIE_SIZE * 1.25 * l.size, DIE_SIZE * 1.1 * l.size, 1],
338
- size: DIE_SIZE * l.size,
339
- tilt: TILT,
340
- value,
341
- duration: time,
342
- disposed
343
- });
344
- }
345
-
346
- export function showRollHint(world: World, l: Layout, s: Scene, on: boolean) {
347
- world.stopAnimation(s.ring);
348
- if (!on) {
349
- world.set(s.ring, { scale: 0 });
350
- return;
351
- }
352
- const size = DIE_SIZE * 1.55 * l.size;
353
- world.set(s.ring, { scale: size });
354
- world.animate(s.ring, { scale: size * 1.15 }, { duration: 0.6, easing: 'easeInOut', repeat: 'forever', yoyo: true });
355
- }
356
-
357
- // ── Bursts ────────────────────────────────────────────────────────────
358
-
359
- export function captureBurst(world: World, l: Layout, cell: { row: number; col: number }) {
360
- const [x, y] = cellPoint(cell.row, cell.col);
361
- effects.sparkle(world, {
362
- position: toWorld(l, x, y, TILE_TOP + 0.03),
363
- count: 18,
364
- size: 0.01 * l.size,
365
- speed: 0.4 * l.size,
366
- lifetime: 0.5,
367
- gravity: -0.6 * l.size,
368
- colors: [toColor('#FFF59D'), toColor('#FF7043'), [1, 1, 1, 1]]
369
- });
370
- }
371
-
372
- export function finishBurst(world: World, l: Layout) {
373
- const [x, y] = cellPoint(CENTER.row, CENTER.col);
374
- effects.sparkle(world, {
375
- position: toWorld(l, x, y, TILE_TOP + 0.04),
376
- count: 20,
377
- size: 0.011 * l.size,
378
- speed: 0.4 * l.size,
379
- lifetime: 0.6,
380
- colors: [toColor('#FFD54F'), toColor('#FFF59D'), [1, 1, 1, 1]]
381
- });
382
- }
383
-
384
- export function confetti(world: World, l: Layout, winner: PlayerColor) {
385
- const [x, y] = cellPoint(CENTER.row, CENTER.col);
386
- effects.confetti(world, {
387
- position: toWorld(l, x, y, TILE_TOP + 0.08),
388
- count: 48,
389
- size: 0.012 * l.size,
390
- speed: 0.7 * l.size,
391
- lifetime: 1.3,
392
- gravity: -1.2 * l.size,
393
- colors: [winner === 'green' ? PLAYER_COLOR : AI_COLOR, PLAYER_COLORS.yellow, PLAYER_COLORS.green, PLAYER_COLORS.blue, '#FFFFFF'].map((c) =>
394
- toColor(c)
395
- )
396
- });
397
- }
@@ -1,88 +0,0 @@
1
- // Maze Runner's screen, on the Nayan engine: the board, walls, pads and rolling ball are one 3D scene
2
- // (an orthographic camera directly above the maze), under Playtura's scoreboard, controls and
3
- // modals. The play is in MazeRunnerGame.ts (the maze and the roll in MazeRunnerRules.ts), what it
4
- // draws in MazeRunnerScene.ts.
5
- //
6
- // One world serves the whole visit: Start, Stop and Play Again reset it in place (a new maze's walls
7
- // rise in place) and a theme change repaints the board, so the GPU view is never rebuilt. JS rolls the
8
- // ball (a few numbers) and steps the world once a frame; the walls, pads and bursts animate in the
9
- // engine's Rust core.
10
- import { HapticType } from '../../services/HapticsService';
11
- import { GAME_SOUNDS } from '../../services/SoundsService';
12
- import { GAME_IDS } from '../../services/UtilsService';
13
- import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
14
- import { timerColumn } from '../shared/EngineHud';
15
- import { useEngineGame } from '../shared/useEngineGame';
16
- import { useLiveState } from '../shared/useLiveState';
17
- import { BORDER, GAME_DURATION, getLayout, LIGHT, WALL_THICKNESS } from './MazeRunnerConstants';
18
- import { createGame, dispose, drag, type GameEvent, newMaze, setLayout, setTheme, start, stop, tick } from './MazeRunnerGame';
19
-
20
- const SOUNDS = GAME_SOUNDS.MAZE_RUNNER;
21
-
22
- /** Quiet turns and bounded collision feedback, with separate completion and timeout cues. */
23
- const FEEDBACK: Record<GameEvent, { sound?: (typeof SOUNDS)[keyof typeof SOUNDS]; haptic: HapticType }> = {
24
- turn: { sound: SOUNDS.TURN, haptic: HapticType.LIGHT },
25
- bump: { sound: SOUNDS.BUMP, haptic: HapticType.MEDIUM },
26
- win: { sound: SOUNDS.COMPLETE, haptic: HapticType.SUCCESS },
27
- lose: { sound: SOUNDS.GAME_OVER, haptic: HapticType.ERROR }
28
- };
29
-
30
- const timeUpText = () => 'You ran out of time!';
31
-
32
- export const MazeRunner = engineGame(GAME_IDS.MAZE_RUNNER, (props) => {
33
- const [time, setTime] = useLiveState(GAME_DURATION);
34
- const [showCard, setShowCard] = useLiveState(false);
35
-
36
- // Win or lose as the run ends; the card comes up a beat later, through `onCard`
37
- const { game, theme, status, screen, gameOver } = useEngineGame(props, {
38
- gameId: GAME_IDS.MAZE_RUNNER,
39
- create: createGame,
40
- start,
41
- // Stop: the same maze, the ball back at the start
42
- reset: stop,
43
- // Play Again: a new maze, waiting for Start
44
- replay: newMaze,
45
- dispose,
46
- tick,
47
- setTheme,
48
- resize: (g, width, height, offset) => {
49
- const l = getLayout(width, height, offset);
50
- setLayout(g, l);
51
- return l.size + l.cell * WALL_THICKNESS + BORDER * 2;
52
- },
53
- drag,
54
- sounds: SOUNDS,
55
- onStart: (fx) => {
56
- setShowCard(false);
57
- fx(SOUNDS.START, HapticType.MEDIUM);
58
- },
59
- onStop: (fx) => fx(null),
60
- onPlayAgain: () => setShowCard(false),
61
- wire: (g, fx) => {
62
- g.onCard = () => setShowCard(true);
63
- g.onTime = setTime;
64
- g.onEvent = (event) => fx(FEEDBACK[event].sound, FEEDBACK[event].haptic);
65
- }
66
- });
67
-
68
- return (
69
- <EngineGameScreen
70
- {...screen}
71
- light={LIGHT}
72
- columns={[timerColumn(time, theme)]}
73
- subtext="Swipe to roll!"
74
- gameOver={
75
- showCard
76
- ? gameOver({
77
- title: status === 'win' ? 'MAZE COMPLETE!' : 'TIME UP!',
78
- message: status === 'win' ? 'You found the exit!' : 'You ran out of time!',
79
- scoreLabel: status === 'win' ? 'Score' : "Time's Up!",
80
- score: game.score,
81
- formatter: status === 'win' ? undefined : timeUpText,
82
- buttonText: status === 'win' ? 'Navigate Again!' : 'Try Again!'
83
- })
84
- : null
85
- }
86
- />
87
- );
88
- });