@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,409 +0,0 @@
1
- // Tangram's rules, with no React or engine: the seven tans, each level's silhouette and tray (built from
2
- // a seeded generator, so a level looks the same every time it's played), and where a dropped tan may
3
- // snap. Ported from the original version (games/tangram/TangramConstants.ts and its board's claimTarget):
4
- // levels stay deterministic, with the original large tray pieces arranged so none are buried.
5
- //
6
- // Board points: x right, y down, from the board's top-left, as the original board laid them out.
7
-
8
- export type PieceType = 'large' | 'medium' | 'small' | 'square' | 'para';
9
- export type Pt = { x: number; y: number };
10
-
11
- export type TanTarget = {
12
- id: number;
13
- type: PieceType;
14
- color: string;
15
- /** The tan's shape, centred on its centroid (board points at full size, unrotated). */
16
- localPoints: Pt[];
17
- /** Where it goes when solved, and at what turn (degrees, clockwise on screen). */
18
- targetCx: number;
19
- targetCy: number;
20
- targetRot: number;
21
- /** Its rotational symmetry (degrees). */
22
- symmetry: number;
23
- /** Its solved outline, in board points. */
24
- silPoints: Pt[];
25
- /** Where it starts, in the tray. */
26
- initialRot: number;
27
- scatterCx: number;
28
- scatterCy: number;
29
- };
30
-
31
- export type TangramLevel = { pieces: TanTarget[]; mirror: boolean; silhouetteRect: { x: number; y: number; w: number; h: number } };
32
-
33
- /** The board, in tan units: the 4 x 4 square silhouette with the tray in the strip under it. */
34
- export const TOTAL_BOARD_UNITS = 6;
35
- export const TRAY_SCALE = 0.4;
36
- export const RIM_RADIUS = 0.024;
37
- export const ROT_TOL = 30; // degrees
38
- export const SNAP_UNITS = 1.8; // a drop this near (in units) a free matching slot snaps
39
- export const TOTAL_PIECES = 7;
40
-
41
- const TAN_COLORS = {
42
- blue: '#4A90E2',
43
- red: '#E24A4A',
44
- green: '#5BB749',
45
- orange: '#F5A623',
46
- purple: '#9B59B6',
47
- yellow: '#F4C724',
48
- teal: '#26C6DA'
49
- };
50
-
51
- /** The classic square, side 4 units, cut into its seven tans (areas 4 + 4 + 2 + 1 + 1 + 2 + 2 = 16). */
52
- const BASE_TANS: { type: PieceType; color: string; pts: [number, number][] }[] = [
53
- {
54
- type: 'large',
55
- color: TAN_COLORS.blue,
56
- pts: [
57
- [0, 0],
58
- [0, 4],
59
- [2, 2]
60
- ]
61
- },
62
- {
63
- type: 'large',
64
- color: TAN_COLORS.red,
65
- pts: [
66
- [0, 0],
67
- [4, 0],
68
- [2, 2]
69
- ]
70
- },
71
- {
72
- type: 'medium',
73
- color: TAN_COLORS.green,
74
- pts: [
75
- [4, 4],
76
- [2, 4],
77
- [4, 2]
78
- ]
79
- },
80
- {
81
- type: 'small',
82
- color: TAN_COLORS.orange,
83
- pts: [
84
- [0, 4],
85
- [2, 4],
86
- [1, 3]
87
- ]
88
- },
89
- {
90
- type: 'small',
91
- color: TAN_COLORS.purple,
92
- pts: [
93
- [2, 2],
94
- [3, 3],
95
- [3, 1]
96
- ]
97
- },
98
- {
99
- type: 'square',
100
- color: TAN_COLORS.yellow,
101
- pts: [
102
- [1, 3],
103
- [2, 4],
104
- [3, 3],
105
- [2, 2]
106
- ]
107
- },
108
- {
109
- type: 'para',
110
- color: TAN_COLORS.teal,
111
- pts: [
112
- [3, 3],
113
- [4, 2],
114
- [4, 0],
115
- [3, 1]
116
- ]
117
- }
118
- ];
119
-
120
- const SYMMETRY: Record<PieceType, number> = { large: 360, medium: 360, small: 360, square: 90, para: 180 };
121
- const LEVEL_ROTATIONS = [0, 90, 180, 270];
122
- const PIVOT = { x: 2, y: 2 };
123
- const FIT_STEPS = [0, 45, 90, 135, 180, 225, 270, 315];
124
-
125
- export const rotatePt = (x: number, y: number, deg: number, ox: number, oy: number): Pt => {
126
- const rad = (deg * Math.PI) / 180;
127
- const cos = Math.cos(rad);
128
- const sin = Math.sin(rad);
129
- const dx = x - ox;
130
- const dy = y - oy;
131
- return { x: ox + dx * cos - dy * sin, y: oy + dx * sin + dy * cos };
132
- };
133
-
134
- const centroidOf = (pts: Pt[]): Pt => {
135
- let sx = 0;
136
- let sy = 0;
137
- for (const p of pts) {
138
- sx += p.x;
139
- sy += p.y;
140
- }
141
- return { x: sx / pts.length, y: sy / pts.length };
142
- };
143
-
144
- /** Deterministic PRNG, so each level is stable across replays. */
145
- const mulberry32 = (seed: number) => {
146
- let a = seed >>> 0;
147
- return () => {
148
- a |= 0;
149
- a = (a + 0x6d2b79f5) | 0;
150
- let t = Math.imul(a ^ (a >>> 15), 1 | a);
151
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
152
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
153
- };
154
- };
155
-
156
- const polysMatch = (a: Pt[], b: Pt[], eps: number): boolean => {
157
- if (a.length !== b.length) return false;
158
- const used = new Array(b.length).fill(false);
159
- for (const p of a) {
160
- let ok = false;
161
- for (let j = 0; j < b.length; j++) {
162
- if (!used[j] && Math.hypot(p.x - b[j]!.x, p.y - b[j]!.y) <= eps) {
163
- used[j] = true;
164
- ok = true;
165
- break;
166
- }
167
- }
168
- if (!ok) return false;
169
- }
170
- return true;
171
- };
172
-
173
- // A rectangle assembled from all seven tans, in a 45-degree basis (one unit here is sqrt(2)
174
- // tan units). Expanding the centres slightly opens gaps while keeping the original piece sizes.
175
- const TRAY_TANS: [number, number][][] = [
176
- [
177
- [2, 0],
178
- [0, 2],
179
- [2, 2]
180
- ],
181
- [
182
- [2, 0],
183
- [0, 2],
184
- [0, 0]
185
- ],
186
- [
187
- [3, 1],
188
- [2, 0],
189
- [4, 0]
190
- ],
191
- [
192
- [4, 0],
193
- [3, 1],
194
- [4, 1]
195
- ],
196
- [
197
- [2, 2],
198
- [3, 2],
199
- [2, 1]
200
- ],
201
- [
202
- [3, 1],
203
- [3, 2],
204
- [4, 2],
205
- [4, 1]
206
- ],
207
- [
208
- [2, 0],
209
- [2, 1],
210
- [3, 2],
211
- [3, 1]
212
- ]
213
- ];
214
-
215
- /** The tan shapes in units (unrotated, centred), for a level mirrored or not: one mesh each. */
216
- const canonicalCache = new Map<boolean, Record<PieceType, Pt[]>>();
217
- export function canonicalShapes(mirror: boolean): Record<PieceType, Pt[]> {
218
- const cached = canonicalCache.get(mirror);
219
- if (cached) return cached;
220
- const mx = (x: number) => (mirror ? 4 - x : x);
221
- const canon: Partial<Record<PieceType, Pt[]>> = {};
222
- for (const t of BASE_TANS) {
223
- if (canon[t.type]) continue;
224
- const raw = t.pts.map(([x, y]) => ({ x: mx(x), y }));
225
- const c = centroidOf(raw);
226
- canon[t.type] = raw.map((p) => ({ x: p.x - c.x, y: p.y - c.y }));
227
- }
228
- const result = canon as Record<PieceType, Pt[]>;
229
- canonicalCache.set(mirror, result);
230
- return result;
231
- }
232
-
233
- /** A level: its silhouette (centred across the board, near its top) and its tray, for a board `unit` points to the tan unit. */
234
- export function generateLevel(levelIndex: number, unit: number, boardW: number, boardH: number): TangramLevel {
235
- const UNIT = unit;
236
- const SIL_TOP = UNIT * 0.1;
237
- const rnd = mulberry32(levelIndex * 2654435761 + 0x9e37);
238
- const rotationDeg = LEVEL_ROTATIONS[Math.floor(rnd() * LEVEL_ROTATIONS.length)]!;
239
- const mirror = rnd() < 0.5;
240
- const mx = (x: number) => (mirror ? 4 - x : x);
241
-
242
- const solvedPx: Pt[][] = BASE_TANS.map((t) =>
243
- t.pts.map(([x, y]) => {
244
- const r = rotatePt(mx(x), y, rotationDeg, PIVOT.x, PIVOT.y);
245
- return { x: r.x * UNIT, y: r.y * UNIT };
246
- })
247
- );
248
- let minX = Infinity;
249
- let minY = Infinity;
250
- let maxX = -Infinity;
251
- let maxY = -Infinity;
252
- for (const poly of solvedPx)
253
- for (const p of poly) {
254
- if (p.x < minX) minX = p.x;
255
- if (p.y < minY) minY = p.y;
256
- if (p.x > maxX) maxX = p.x;
257
- if (p.y > maxY) maxY = p.y;
258
- }
259
- const offsetX = (boardW - (maxX - minX)) / 2 - minX;
260
- const offsetY = SIL_TOP - minY;
261
-
262
- // One shape per type (congruent tans are interchangeable), in points
263
- const units = canonicalShapes(mirror);
264
- const canon = Object.fromEntries(Object.entries(units).map(([k, pts]) => [k, pts.map((p) => ({ x: p.x * UNIT, y: p.y * UNIT }))])) as Record<
265
- PieceType,
266
- Pt[]
267
- >;
268
-
269
- const findFitRot = (type: PieceType, tgtLocal: Pt[]): number => {
270
- const shape = canon[type];
271
- const eps = UNIT * 0.08;
272
- for (const r of FIT_STEPS) {
273
- if (
274
- polysMatch(
275
- shape.map((p) => rotatePt(p.x, p.y, r, 0, 0)),
276
- tgtLocal,
277
- eps
278
- )
279
- )
280
- return r;
281
- }
282
- return rotationDeg;
283
- };
284
-
285
- // Compact previews in a slightly fanned packing expose every shape.
286
- const trayCentre = { x: 2 * Math.SQRT2 * UNIT, y: Math.SQRT2 * UNIT };
287
- const spread = 1.1;
288
- const trayOffsets = TRAY_TANS.flatMap((points) => {
289
- const centreX = points.reduce((sum, [x]) => sum + x, 0) / points.length;
290
- const centreY = points.reduce((sum, [, y]) => sum + y, 0) / points.length;
291
- return points.map(([x, y]) => ({
292
- x: ((centreX - 2) * spread + x - centreX) * Math.SQRT2 * UNIT * TRAY_SCALE,
293
- y: ((centreY - 1) * spread + y - centreY) * Math.SQRT2 * UNIT * TRAY_SCALE
294
- }));
295
- });
296
- const trayMinY = Math.min(...trayOffsets.map((p) => p.y));
297
- const trayMaxY = Math.max(...trayOffsets.map((p) => p.y));
298
- const trayCentreX = (Math.min(...trayOffsets.map((p) => p.x)) + Math.max(...trayOffsets.map((p) => p.x))) / 2;
299
- const trayTop = SIL_TOP + (maxY - minY) + Math.max(12, UNIT * 0.12);
300
- const trayCy = trayTop - trayMinY;
301
- // Centre the visible grid and previews as one group, including their outlines.
302
- const contentTop = SIL_TOP - UNIT * RIM_RADIUS;
303
- const contentBottom = trayCy + trayMaxY + UNIT * TRAY_SCALE * RIM_RADIUS;
304
- const centreShiftY = (boardH - contentTop - contentBottom) / 2;
305
-
306
- const pieces: TanTarget[] = BASE_TANS.map((t, idx) => {
307
- const solvedC = centroidOf(solvedPx[idx]!);
308
- const tgtLocal = solvedPx[idx]!.map((p) => ({ x: p.x - solvedC.x, y: p.y - solvedC.y }));
309
- const targetRot = findFitRot(t.type, tgtLocal);
310
- const sym = SYMMETRY[t.type];
311
- const trayPoints = TRAY_TANS[idx]!.map(([x, y]) => ({ x: (mirror ? 4 - x : x) * Math.SQRT2 * UNIT, y: y * Math.SQRT2 * UNIT }));
312
- const trayC = centroidOf(trayPoints);
313
- const trayRot = findFitRot(
314
- t.type,
315
- trayPoints.map((p) => ({ x: p.x - trayC.x, y: p.y - trayC.y }))
316
- );
317
- const slot = {
318
- x: boardW / 2 + (trayC.x - trayCentre.x) * TRAY_SCALE * spread - (mirror ? -trayCentreX : trayCentreX),
319
- y: trayCy + (trayC.y - trayCentre.y) * TRAY_SCALE * spread + centreShiftY
320
- };
321
- return {
322
- id: idx,
323
- type: t.type,
324
- color: t.color,
325
- localPoints: canon[t.type],
326
- targetCx: solvedC.x + offsetX,
327
- targetCy: solvedC.y + offsetY + centreShiftY,
328
- targetRot,
329
- symmetry: sym,
330
- silPoints: solvedPx[idx]!.map((p) => ({ x: p.x + offsetX, y: p.y + offsetY + centreShiftY })),
331
- initialRot: trayRot,
332
- scatterCx: slot.x,
333
- scatterCy: slot.y
334
- };
335
- });
336
-
337
- return { pieces, mirror, silhouetteRect: { x: minX + offsetX, y: minY + offsetY + centreShiftY, w: maxX - minX, h: maxY - minY } };
338
- }
339
-
340
- /** Whether a turn matches a target within tolerance, allowing for the tan's symmetry. */
341
- export const isRotationMatched = (cur: number, target: number, sym: number): boolean => {
342
- let d = (((cur - target) % sym) + sym) % sym;
343
- d = Math.min(d, sym - d);
344
- return d <= ROT_TOL;
345
- };
346
-
347
- /** The turn nearest `cur` that equals the target (modulo symmetry), to snap smoothly to. */
348
- export const snappedRotation = (cur: number, target: number, sym: number): number => target + Math.round((cur - target) / sym) * sym;
349
-
350
- /**
351
- * Where a tan dropped at (x, y) at turn `rot` goes: the nearest free slot of its type within reach at
352
- * a matching turn (claimed), 'nudge' if it's over one at the wrong turn, or null. As the original board.
353
- */
354
- export function claimSlot(
355
- level: TangramLevel,
356
- occupied: boolean[],
357
- unit: number,
358
- type: PieceType,
359
- x: number,
360
- y: number,
361
- rot: number
362
- ): { slot: number; cx: number; cy: number; rot: number } | 'nudge' | null {
363
- let best = -1;
364
- let bestDist = Infinity;
365
- let nearWrongAngle = false;
366
- level.pieces.forEach((t, i) => {
367
- if (occupied[i] || t.type !== type) return;
368
- const dist = Math.hypot(x - t.targetCx, y - t.targetCy);
369
- if (dist > unit * SNAP_UNITS) return;
370
- if (!isRotationMatched(rot, t.targetRot, t.symmetry)) {
371
- nearWrongAngle = true;
372
- return;
373
- }
374
- if (dist < bestDist) {
375
- bestDist = dist;
376
- best = i;
377
- }
378
- });
379
- if (best < 0) return nearWrongAngle ? 'nudge' : null;
380
- occupied[best] = true;
381
- const t = level.pieces[best]!;
382
- return { slot: best, cx: t.targetCx, cy: t.targetCy, rot: snappedRotation(rot, t.targetRot, t.symmetry) };
383
- }
384
-
385
- /** Whether a board point lies inside a tan drawn at (cx, cy), turned `rot`, at `scale`, give or take `margin`. */
386
- export function insidePiece(local: Pt[], cx: number, cy: number, rot: number, scale: number, px: number, py: number, margin = 0): boolean {
387
- // Into the tan's own frame
388
- const q = rotatePt(px - cx, py - cy, -rot, 0, 0);
389
- const x = q.x / scale;
390
- const y = q.y / scale;
391
- let inside = false;
392
- for (let i = 0, j = local.length - 1; i < local.length; j = i++) {
393
- const a = local[i]!;
394
- const b = local[j]!;
395
- if (a.y > y !== b.y > y && x < ((b.x - a.x) * (y - a.y)) / (b.y - a.y) + a.x) inside = !inside;
396
- }
397
- if (inside || margin <= 0) return inside;
398
- // Near an edge counts too (fingers are wide)
399
- const m = margin / scale;
400
- for (let i = 0, j = local.length - 1; i < local.length; j = i++) {
401
- const a = local[i]!;
402
- const b = local[j]!;
403
- const ex = b.x - a.x;
404
- const ey = b.y - a.y;
405
- const t = Math.max(0, Math.min(1, ((x - a.x) * ex + (y - a.y) * ey) / (ex * ex + ey * ey || 1)));
406
- if (Math.hypot(x - (a.x + ex * t), y - (a.y + ey * t)) <= m) return true;
407
- }
408
- return false;
409
- }
@@ -1,203 +0,0 @@
1
- // Everything Tangram draws: the silhouette as sunken slots with faint
2
- // outlines (themed, as the original silhouette), and the seven tans as solid coloured slabs with a darker
3
- // rim, resting small in the tray and growing to full size when picked up or placed. Seen
4
- // straight overhead, with one world unit per view point.
5
- //
6
- // Every tan is a root (moved, turned and scaled as one) carrying its slab and its rim. Meshes are one
7
- // unit across per tan shape and mirror (at most 20, built once), so no level adds mesh ids.
8
- import { type Color, effects, type Entity, extrude, type Model, Path, type Quat, quat, tube, type Vec3, type World } from '@nayan-ui/engine';
9
- import { darken } from '../../services/GamesConstants';
10
- import type { GameTheme } from '../../services/ThemeService';
11
- import { setBackdropTheme, spawnBackdrop } from '../shared/EngineBackdrop';
12
- import { cacheGameAsset, createGameMesh as createShape } from '../shared/EngineMeshes';
13
- import { placeTiltedBackdrop } from '../shared/EngineTilt';
14
- import { toColor } from '../shared/EngineUtils';
15
- import { COLORS, type Layout, PIECE_DEPTH, RIM_RADIUS, toWorld } from './TangramConstants';
16
- import { canonicalShapes, type PieceType, type Pt, type TangramLevel } from './TangramRules';
17
-
18
- const meshes = new Map<string, Model>();
19
- const cached = (key: string, build: () => Model) => {
20
- let m = meshes.get(key);
21
- if (!m) {
22
- m = cacheGameAsset('tangram/TangramScene:' + key, build);
23
- meshes.set(key, m);
24
- }
25
- return m;
26
- };
27
- const BACKDROP_DEPTH = 30;
28
- const SLOT_Z = 0.3; // the slots' surface above the backdrop
29
-
30
- const polygon = (pts: Pt[]) => new Path().addPolygon(pts.map((p) => [p.x, p.y] as [number, number]));
31
- /** A closed loop through a polygon's corners (y flipped up into the world), at height z. */
32
- const loop = (pts: Pt[], z: number): Vec3[] => [...pts, pts[0]!].map((p) => [p.x, -p.y, z] as Vec3);
33
-
34
- /** A tan's slab, one unit to the tan unit, its bottom on z = 0. */
35
- const slabMesh = (type: PieceType, mirror: boolean) =>
36
- cached(`tg-slab:${type}:${mirror}`, () =>
37
- createShape(extrude(polygon(canonicalShapes(mirror)[type]), { depth: PIECE_DEPTH }), { center: false, shine: 0.45 })
38
- );
39
- /** Its rim: a thin bead round its top edge. */
40
- const rimMesh = (type: PieceType, mirror: boolean) =>
41
- cached(`tg-rim:${type}:${mirror}`, () =>
42
- createShape(tube(loop(canonicalShapes(mirror)[type], 0), { radius: RIM_RADIUS, sides: 8, smoothness: 1, caps: false }), {
43
- center: false,
44
- shine: 0.3
45
- })
46
- );
47
- /** A slot: the tan's shape, flat. */
48
- const slotMesh = (type: PieceType, mirror: boolean) =>
49
- cached(`tg-slot:${type}:${mirror}`, () => createShape(extrude(polygon(canonicalShapes(mirror)[type]), { depth: 0 }), { center: false }));
50
- // ── Spawning ──────────────────────────────────────────────────────────
51
-
52
- /** Where a tan is drawn: its centre (board points), turn (degrees, clockwise on screen), size and height (tan units). */
53
- export type Pose = { x: number; y: number; rot: number; scale: number; lift: number };
54
- type TanView = { root: Entity; slab: Entity; rim: Entity };
55
- export type Scene = { backdrop: Entity; slots: Entity[]; tans: TanView[] };
56
-
57
- /** A turn clockwise on screen (y down) is a turn the other way in the world (y up). */
58
- export const turn = (deg: number): Quat => quat.z((-deg * Math.PI) / 180);
59
- const slotFill = (theme: GameTheme): Color => toColor(theme.mode === 'classic' ? COLORS.CLASSIC_SLOT : theme.BOARD.CELL_EMPTY);
60
- const slotEdge = (theme: GameTheme): Color => toColor(theme.mode === 'classic' ? COLORS.CLASSIC_SLOT_EDGE : theme.BOARD.BORDER);
61
-
62
- const rootPosition = (l: Layout, p: Pose): Vec3 => {
63
- const [x, y] = toWorld(l, p.x, p.y);
64
- return [x, y, SLOT_Z + p.lift * l.unit];
65
- };
66
-
67
- function spawnSlots(world: World, l: Layout, level: TangramLevel, theme: GameTheme): Entity[] {
68
- const out: Entity[] = [];
69
- for (const t of level.pieces) {
70
- const [x, y] = toWorld(l, t.targetCx, t.targetCy);
71
- const rotation = turn(t.targetRot);
72
- out.push(
73
- world.spawn({
74
- mesh: slotMesh(t.type, level.mirror),
75
- position: [x, y, SLOT_Z],
76
- rotation,
77
- scale: l.unit,
78
- color: slotFill(theme),
79
- pickable: false
80
- })
81
- );
82
- out.push(
83
- world.spawn({
84
- mesh: rimMesh(t.type, level.mirror),
85
- position: [x, y, SLOT_Z],
86
- rotation,
87
- scale: [l.unit, l.unit, 0.2 * l.unit],
88
- color: slotEdge(theme),
89
- pickable: false
90
- })
91
- );
92
- }
93
- return out;
94
- }
95
-
96
- export function buildScene(world: World, l: Layout, theme: GameTheme, level: TangramLevel, poses: Pose[]): Scene {
97
- const backdrop = spawnBackdrop(world, l.width, l.height, -BACKDROP_DEPTH, theme);
98
- placeTiltedBackdrop(world, backdrop, l, BACKDROP_DEPTH);
99
- const s: Scene = { backdrop, slots: spawnSlots(world, l, level, theme), tans: [] };
100
- level.pieces.forEach((t, i) => {
101
- const p = poses[i]!;
102
- const root = world.spawn({ mesh: 'none', position: rootPosition(l, p), rotation: turn(p.rot), scale: l.unit * p.scale, pickable: false });
103
- const slab = world.spawn({
104
- mesh: slabMesh(t.type, level.mirror),
105
- parent: root,
106
- position: [0, 0, PIECE_DEPTH / 2],
107
- color: toColor(t.color),
108
- pickable: false
109
- });
110
- const rim = world.spawn({
111
- mesh: rimMesh(t.type, level.mirror),
112
- parent: root,
113
- position: [0, 0, PIECE_DEPTH],
114
- color: toColor(darken(t.color, 0.28)),
115
- pickable: false
116
- });
117
- s.tans.push({ root, slab, rim });
118
- });
119
- return s;
120
- }
121
-
122
- export function removeScene(world: World, s: Scene) {
123
- for (const e of [s.backdrop, ...s.slots, ...s.tans.map((t) => t.root)]) world.despawn(e);
124
- }
125
-
126
- export function setSceneTheme(world: World, s: Scene, theme: GameTheme) {
127
- setBackdropTheme(world, s.backdrop, theme);
128
- s.slots.forEach((e, i) => world.set(e, { color: i % 2 ? slotEdge(theme) : slotFill(theme) }));
129
- }
130
-
131
- // ── Motion ────────────────────────────────────────────────────────────
132
-
133
- /** Puts a tan at a pose at once (following the finger). */
134
- export function setPose(world: World, l: Layout, s: Scene, id: number, p: Pose) {
135
- const v = s.tans[id];
136
- if (!v) return;
137
- world.stopAnimation(v.root);
138
- world.set(v.root, { position: rootPosition(l, p), rotation: turn(p.rot), scale: l.unit * p.scale });
139
- }
140
-
141
- /** Glides a tan to a pose. */
142
- export function moveTo(world: World, l: Layout, s: Scene, id: number, p: Pose, duration: number, easing: 'easeOut' | 'back' = 'easeOut') {
143
- const v = s.tans[id];
144
- if (v) world.animate(v.root, { position: rootPosition(l, p), rotation: turn(p.rot), scale: l.unit * p.scale }, { duration, easing });
145
- }
146
-
147
- /** A new level: every tan grows in on its tray spot, one after another. */
148
- export function enter(world: World, l: Layout, s: Scene, poses: Pose[], stagger: number) {
149
- poses.forEach((p, id) => {
150
- const v = s.tans[id];
151
- if (!v) return;
152
- world.stopAnimation(v.root);
153
- world.set(v.root, { position: rootPosition(l, p), rotation: turn(p.rot), scale: l.unit * p.scale * 0.4 });
154
- world.animate(v.root, { scale: l.unit * p.scale }, { duration: 0.26, delay: id * stagger, easing: 'back' });
155
- });
156
- }
157
-
158
- /** A tan snapped into its slot: a small pop as it lands. */
159
- export function pop(world: World, l: Layout, s: Scene, id: number, delay: number) {
160
- const v = s.tans[id];
161
- if (v) world.animate(v.root, [{ scale: l.unit * 1.08, at: 0.3 }, { scale: l.unit }], { duration: 0.29, delay, easing: 'easeOut' });
162
- }
163
-
164
- /** Over a matching slot at the wrong turn: a wiggle. */
165
- export function wiggle(world: World, s: Scene, id: number, rot: number) {
166
- const v = s.tans[id];
167
- if (!v) return;
168
- world.animate(v.root, [{ rotation: turn(rot + 7) }, { rotation: turn(rot - 7) }, { rotation: turn(rot + 4) }, { rotation: turn(rot) }], {
169
- duration: 0.26
170
- });
171
- }
172
-
173
- /** Solved: a wave of pops round the shape, and confetti over it. */
174
- export function celebrate(world: World, l: Layout, s: Scene, level: TangramLevel, delay: number, stagger: number) {
175
- s.tans.forEach((v, id) => {
176
- world.animate(v.root, [{ scale: l.unit * 1.1, at: 0.5 }, { scale: l.unit }], {
177
- duration: 0.27,
178
- delay: delay + id * stagger,
179
- easing: 'easeInOut'
180
- });
181
- });
182
- const r = level.silhouetteRect;
183
- const [cx, cy] = toWorld(l, r.x + r.w / 2, r.y + r.h / 2);
184
- effects.confetti(world, {
185
- position: [cx, cy, l.unit],
186
- count: 60,
187
- size: l.unit * 0.1,
188
- speed: r.w * 1.4,
189
- lifetime: 1.3,
190
- gravity: -r.w * 2.4,
191
- colors: level.pieces.slice(0, 4).map((t) => toColor(t.color))
192
- });
193
- }
194
-
195
- /** Out of time: the tans still in the tray dim. */
196
- export function dim(world: World, s: Scene, ids: number[], colors: string[]) {
197
- for (const id of ids) {
198
- const v = s.tans[id];
199
- if (!v) continue;
200
- const c = toColor(colors[id]!);
201
- world.animate(v.slab, { color: [c[0] * 0.45, c[1] * 0.45, c[2] * 0.5, 1] }, { duration: 0.4 });
202
- }
203
- }
@@ -1,78 +0,0 @@
1
- // Tank 1990's screen, on the Nayan engine: the battlefield, its walls, the tanks and the shells are one
2
- // 3D scene (an orthographic camera leaning back over the field), under Playtura's scoreboard, controls
3
- // and modals. The battle is in Tank1990Game.ts (its rules in Tank1990Rules.ts), what it draws in
4
- // Tank1990Scene.ts.
5
- //
6
- // One world serves the whole visit: Start, Stop and Play Again reset it in place and a theme change
7
- // repaints the field, so the GPU view is never rebuilt. JS steps the battle (a few tanks and shells) and
8
- // the world once a frame; turns, shields, flashes and explosions animate in the engine's Rust core.
9
- import { HapticType } from '../../services/HapticsService';
10
- import { GAME_SOUNDS } from '../../services/SoundsService';
11
- import { GAME_IDS } from '../../services/UtilsService';
12
- import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
13
- import { livesColumn, scoreColumn, textColumn } from '../shared/EngineHud';
14
- import { useEngineGame } from '../shared/useEngineGame';
15
- import { useLiveState } from '../shared/useLiveState';
16
- import { ENEMIES_PER_LEVEL, FRAME, getLayout, LIGHT, LIVES } from './Tank1990Constants';
17
- import { createGame, dispose, drag, reset, setLayout, setTheme, start, tick } from './Tank1990Game';
18
-
19
- const SOUNDS = GAME_SOUNDS.TANK_1990;
20
- const ENEMIES_CLASSIC_COLOR = '#FFFFFF';
21
- const scoreFormatter = (s: number) => s.toLocaleString();
22
-
23
- export const Tank1990 = engineGame(GAME_IDS.TANK_1990, (props) => {
24
- const [score, setScore] = useLiveState(0);
25
- const [lives, setLives] = useLiveState(LIVES);
26
- const [enemies, setEnemies] = useLiveState(ENEMIES_PER_LEVEL);
27
-
28
- // Win or lose when the battle ends
29
- const { theme, status, screen, gameOver } = useEngineGame(props, {
30
- gameId: GAME_IDS.TANK_1990,
31
- create: createGame,
32
- start,
33
- reset,
34
- dispose,
35
- tick,
36
- setTheme,
37
- resize: (g, width, height, offset) => {
38
- const l = getLayout(width, height, offset);
39
- setLayout(g, l);
40
- return l.boardWidth + Math.min(FRAME, l.cell * 0.5) * 2;
41
- },
42
- drag,
43
- sounds: SOUNDS,
44
- onStart: (fx) => fx(SOUNDS.START, HapticType.MEDIUM),
45
- onOver: (fx, s) => fx(s === 'win' ? SOUNDS.WIN : SOUNDS.GAME_OVER, s === 'win' ? HapticType.SUCCESS : HapticType.HEAVY),
46
- wire: (g, fx) => {
47
- g.onScore = setScore;
48
- g.onLives = setLives;
49
- g.onEnemies = setEnemies;
50
- g.onEvent = (event) => {
51
- if (event === 'fire') fx(SOUNDS.FIRE);
52
- else if (event === 'kill') fx(SOUNDS.DESTROY, HapticType.SUCCESS);
53
- else fx(SOUNDS.DAMAGE, HapticType.ERROR);
54
- };
55
- }
56
- });
57
-
58
- return (
59
- <EngineGameScreen
60
- {...screen}
61
- light={LIGHT}
62
- columns={[
63
- scoreColumn(score, 'SCORE'),
64
- livesColumn(lives, LIVES),
65
- textColumn('ENEMIES', enemies, theme.mode === 'classic' ? ENEMIES_CLASSIC_COLOR : undefined)
66
- ]}
67
- subtext="Defend your base!"
68
- gameOver={gameOver({
69
- title: status === 'win' ? 'LEVEL COMPLETE!' : 'GAME OVER',
70
- message: status === 'win' ? 'All enemies destroyed!' : 'Your base was destroyed!',
71
- scoreLabel: status === 'win' ? 'Level Complete!' : 'Final Score',
72
- score,
73
- formatter: scoreFormatter,
74
- buttonText: status === 'win' ? 'Next Level!' : 'Try Again!'
75
- })}
76
- />
77
- );
78
- });