@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,77 +0,0 @@
1
- // Penguin Run's screen, on the Nayan engine: the penguin dashing down an ancient jungle causeway seen
2
- // from a low chase camera, under Playtura's scoreboard, controls and modals. The rules are in
3
- // PenguinRunGame.ts, the world in PenguinRunScene.ts, the penguin and its animations in PenguinModel.ts.
4
- import { useMemo } from 'react';
5
- import { HapticType } from '../../services/HapticsService';
6
- import { GAME_SOUNDS } from '../../services/SoundsService';
7
- import { GAME_IDS } from '../../services/UtilsService';
8
- import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
9
- import { livesColumn, scoreColumn, textColumn } from '../shared/EngineHud';
10
- import { useEngineGame } from '../shared/useEngineGame';
11
- import { useLiveState } from '../shared/useLiveState';
12
- import { MAX_LIVES, RESULTS_DELAY_LOSE, RESULTS_DELAY_WIN, TRACK_LENGTH } from './PenguinRunConstants';
13
- import { createGame, dispose, reset, setLayout, setTheme, start, steer, tick } from './PenguinRunGame';
14
- import { backgroundFor, FOG, lightFor } from './PenguinRunScene';
15
-
16
- const SFX = GAME_SOUNDS.PENGUIN_RUN;
17
-
18
- export const PenguinRun = engineGame(GAME_IDS.PENGUIN_RUN, (props) => {
19
- const [score, setScore] = useLiveState(0);
20
- const [coins, setCoins] = useLiveState(0);
21
- const [lives, setLives] = useLiveState(MAX_LIVES);
22
- const [distance, setDistance] = useLiveState(0);
23
-
24
- const { theme, status, screen, gameOver } = useEngineGame(props, {
25
- gameId: GAME_IDS.PENGUIN_RUN,
26
- create: createGame,
27
- start,
28
- reset,
29
- dispose,
30
- tick,
31
- setTheme,
32
- resize: (g, width, height) => setLayout(g, width, height),
33
- drag: (g, { phase, x, y }) => steer(g, phase, x, y),
34
- sounds: SFX,
35
- // The fall or the dance plays out before the results card covers it
36
- resultsDelay: (s) => (s === 'win' ? RESULTS_DELAY_WIN : RESULTS_DELAY_LOSE),
37
- onStart: (fx) => fx(SFX.START),
38
- wire: (g, fx) => {
39
- g.onScore = setScore;
40
- g.onCoins = setCoins;
41
- g.onLives = setLives;
42
- g.onDistance = setDistance;
43
- g.onCoin = (gem) => fx(gem ? SFX.GEM : SFX.COIN, gem ? HapticType.LIGHT : null);
44
- g.onJump = () => fx(SFX.JUMP);
45
- g.onSlide = () => fx(SFX.SLIDE);
46
- g.onLane = () => fx(SFX.LANE_SWITCH, HapticType.LIGHT);
47
- g.onHurt = () => fx(SFX.CRASH, HapticType.HEAVY);
48
- g.onCrash = () => {
49
- fx(SFX.CRASH, HapticType.HEAVY);
50
- g.world.after(0.5, () => fx(SFX.GAME_OVER));
51
- };
52
- g.onWin = () => fx(GAME_SOUNDS.WELL_DONE, HapticType.SUCCESS);
53
- }
54
- });
55
-
56
- const light = useMemo(() => lightFor(theme), [theme]);
57
- const background = useMemo(() => backgroundFor(theme), [theme]);
58
-
59
- return (
60
- <EngineGameScreen
61
- {...screen}
62
- light={light}
63
- background={background}
64
- fog={FOG}
65
- columns={[scoreColumn(score), livesColumn(lives, MAX_LIVES), textColumn('TRACK', `${TRACK_LENGTH - distance} m`)]}
66
- subtext="Swipe, jump and slide!"
67
- gameOver={gameOver({
68
- title: status === 'win' ? 'YOU MADE IT!' : 'OUCH!',
69
- message:
70
- status === 'win' ? `Made it to the finish with ${coins} coins!` : `Out of lives after ${distance} of ${TRACK_LENGTH} m. Try a new track!`,
71
- scoreLabel: 'Score',
72
- score,
73
- buttonText: status === 'win' ? 'Run Again!' : 'Try Again!'
74
- })}
75
- />
76
- );
77
- });
@@ -1,69 +0,0 @@
1
- // Penguin Run's tuning. Distances are metres, times seconds. The penguin runs toward -z.
2
-
3
- export const PENGUIN_SIZE = 1.2;
4
-
5
- /** Lane centres across the temple causeway. */
6
- export const LANE_X = [-1.7, 0, 1.7] as const;
7
- /** Lane changes follow a critically damped spring (higher = snappier), leaning into the move. */
8
- export const LANE_STIFFNESS = 14;
9
- export const LEAN_ROLL = 0.045;
10
- export const LEAN_YAW = 0.035;
11
- export const MAX_LEAN = 0.32;
12
- /** How quickly the camera drifts after the penguin's lane. */
13
- export const CAMERA_FOLLOW = 6;
14
-
15
- /** Run speed, held for the whole track. */
16
- export const SPEED_START = 7;
17
-
18
- /** The track is this long; crossing the finish line wins. */
19
- export const TRACK_LENGTH = 1000;
20
- /** Clear running at the start and before the finish. */
21
- export const START_CLEAR = 14;
22
- export const FINISH_CLEAR = 6;
23
- /** Paving rows are this long; a gap is one missing slab. */
24
- export const SLAB = 2;
25
- /** After a crash or a win, the scene plays (fall, dance) for this long before the results card. */
26
- export const RESULTS_DELAY_LOSE = 1700;
27
- export const RESULTS_DELAY_WIN = 2600;
28
-
29
- /** The causeway is built from tiles this long; this many stay ahead of the penguin. */
30
- export const TILE_LENGTH = 12;
31
- export const TILES_AHEAD = 9;
32
- export const TILES_BEHIND = 2;
33
- /** Causeway laid behind the start line (ending at a temple), so the start screen has scenery all round. */
34
- export const TILES_BEFORE_START = 3;
35
- /** Causeway past the finish line before the far temple. */
36
- export const TILES_PAST_FINISH = 3;
37
-
38
- /**
39
- * Jumps and slides cover a set distance rather than a set time: the clips play faster as the run
40
- * speeds up, so a jump timed the same way always clears a gap. Metres spent airborne / ducked, and
41
- * the clip-length limits that keep them from feeling floaty when slow or frantic when fast.
42
- */
43
- export const JUMP_AIR_METRES = 5.5;
44
- export const SLIDE_LOW_METRES = 7;
45
- export const JUMP_TIME: [number, number] = [0.7, 1.15];
46
- export const SLIDE_TIME: [number, number] = [0.8, 1.25];
47
- /**
48
- * Fractions of each clip during which the penguin counts as off the ground (clears a gap) or low
49
- * enough to pass under a gateway: generous, from just after it springs or drops to just before it lands
50
- * or rises.
51
- */
52
- export const GAP_WINDOW: [number, number] = [0.15, 0.9];
53
- export const LOW_WINDOW: [number, number] = [0.08, 0.94];
54
- /** How far from a gap's centre the penguin falls in (the slab is SLAB long; the broken edges forgive). */
55
- export const GAP_HALF = 0.45;
56
-
57
- /** Hits the penguin can take; after one it stumbles on and can't be hurt again for a moment. */
58
- export const MAX_LIVES = 3;
59
- export const HURT_INVULNERABLE = 2.2;
60
-
61
- /** How deep (along z) an obstacle is for collisions, and how close in x counts as the same lane. */
62
- export const HIT_DEPTH = 0.3;
63
- export const LANE_TOLERANCE = 0.7;
64
- export const COIN_RADIUS = 1.1;
65
-
66
- // Points
67
- export const POINTS_PER_METRE = 2;
68
- export const POINTS_COIN = 20;
69
- export const POINTS_GEM = 200;
@@ -1,406 +0,0 @@
1
- // Penguin Run's rules: a TRACK_LENGTH dash down an ancient jungle causeway, laid out fresh by
2
- // `generateTrack` for every attempt. The penguin runs on its own, faster and faster; swipe left/right
3
- // to change lane (and chase the coin trail), up to jump broken gaps, down to slide under spiked
4
- // gateways. Coins add to the score. A mistake costs one of three lives (the
5
- // penguin stumbles on, briefly untouchable); losing the last ends the run with a fall or crash played
6
- // out before the results. Reaching the finish line wins and the penguin dances.
7
- //
8
- // The world stays put and the penguin (and camera) run toward -z; tiles are built ahead and cleared
9
- // behind, so only the penguin and camera move every frame.
10
- import { type Camera, type MutableQuat, quat, World } from '@nayan-ui/engine';
11
- import type { GameTheme } from '../../services/ThemeService';
12
- import { CLIP_TIME, placePenguin, playPenguin, preparePenguin, spawnPenguin } from './PenguinModel';
13
- import {
14
- CAMERA_FOLLOW,
15
- COIN_RADIUS,
16
- GAP_HALF,
17
- GAP_WINDOW,
18
- HIT_DEPTH,
19
- HURT_INVULNERABLE,
20
- JUMP_AIR_METRES,
21
- JUMP_TIME,
22
- LANE_STIFFNESS,
23
- LANE_TOLERANCE,
24
- LANE_X,
25
- LEAN_ROLL,
26
- LEAN_YAW,
27
- LOW_WINDOW,
28
- MAX_LEAN,
29
- MAX_LIVES,
30
- PENGUIN_SIZE,
31
- POINTS_COIN,
32
- POINTS_GEM,
33
- POINTS_PER_METRE,
34
- SLIDE_LOW_METRES,
35
- SLIDE_TIME,
36
- SPEED_START,
37
- TILE_LENGTH,
38
- TILES_AHEAD,
39
- TILES_BEFORE_START,
40
- TILES_BEHIND,
41
- TRACK_LENGTH
42
- } from './PenguinRunConstants';
43
- import {
44
- coinSparkle,
45
- crashDust,
46
- despawnTile,
47
- generateTrack,
48
- LAST_TILE,
49
- prepareRunMeshes,
50
- spawnTile,
51
- type Tile,
52
- type TrackPlan
53
- } from './PenguinRunScene';
54
-
55
- export type Phase = 'ready' | 'playing' | 'over';
56
- type Action = 'jump' | 'slide' | 'hit' | null;
57
-
58
- const noop = () => {};
59
- const newSeed = () => Math.floor(Math.random() * 1e9);
60
-
61
- export function createGame(theme: GameTheme) {
62
- preparePenguin();
63
- prepareRunMeshes();
64
- const world = new World(1800);
65
- const g = {
66
- world,
67
- theme,
68
- penguin: spawnPenguin(world, [0, 0, 0], PENGUIN_SIZE),
69
- camera: { eye: [0, 3.1, 5.4], target: [0, 1.1, -6], fov: 0.9 } as Camera,
70
- phase: 'ready' as Phase,
71
- won: false,
72
- plan: generateTrack(newSeed()) as TrackPlan,
73
- tiles: [] as Tile[],
74
- nextTile: 0,
75
- lane: 1,
76
- x: 0,
77
- vx: 0,
78
- camX: 0,
79
- z: 0,
80
- speed: SPEED_START,
81
- distance: 0,
82
- lastDistance: 0,
83
- coins: 0,
84
- gems: 0,
85
- score: 0,
86
- lives: MAX_LIVES,
87
- invulnerable: 0,
88
- action: null as Action,
89
- /** A jump / slide swiped while the same one was still playing: it goes as soon as that one ends, if within QUEUE_TIME. */
90
- queued: null as 'jump' | 'slide' | null,
91
- queuedT: 0,
92
- actionT: 0,
93
- actionDur: 0,
94
- orbit: 0,
95
- onPhase: noop as (phase: Phase) => void,
96
- onScore: noop as (score: number) => void,
97
- onCoins: noop as (coins: number) => void,
98
- onLives: noop as (lives: number) => void,
99
- onHurt: noop,
100
- onDistance: noop as (metres: number) => void,
101
- onCoin: noop as (gem: boolean) => void,
102
- onJump: noop,
103
- onSlide: noop,
104
- onLane: noop,
105
- onCrash: noop,
106
- onWin: noop
107
- };
108
- reset(g);
109
- return g;
110
- }
111
- export type Game = ReturnType<typeof createGame>;
112
-
113
- const runPace = (g: Game) => Math.min(1.7, Math.max(1, g.speed / SPEED_START));
114
-
115
- /** Builds tiles out to TILES_AHEAD in front of the penguin and clears those well behind it. */
116
- function keepTiles(g: Game) {
117
- while (g.nextTile <= LAST_TILE && g.nextTile * TILE_LENGTH < -g.z + TILES_AHEAD * TILE_LENGTH) {
118
- g.tiles.push(spawnTile(g.world, g.nextTile, g.theme, g.plan));
119
- g.nextTile++;
120
- }
121
- while (g.tiles.length && g.tiles[0]!.z - TILE_LENGTH > g.z + TILES_BEHIND * TILE_LENGTH) despawnTile(g.world, g.tiles.shift()!);
122
- }
123
-
124
- // Scratch for the per-frame root rotation (world.set copies it).
125
- const LEAN_Q: MutableQuat = [0, 0, 0, 1];
126
- const TURN_Q: MutableQuat = [0, 0, 0, 1];
127
- const ROOT_Q: MutableQuat = [0, 0, 0, 1];
128
-
129
- function place(g: Game) {
130
- // Facing down the causeway, turned and banked a little into a lane change
131
- const lean = Math.max(-MAX_LEAN, Math.min(MAX_LEAN, g.vx * LEAN_ROLL));
132
- const turn = Math.max(-MAX_LEAN, Math.min(MAX_LEAN, g.vx * LEAN_YAW));
133
- g.world.set(g.penguin.root, { position: [g.x, 0, g.z], rotation: quat.multiply(quat.z(-lean, LEAN_Q), quat.y(Math.PI - turn, TURN_Q), ROOT_Q) });
134
- g.penguin.x = g.x;
135
- g.penguin.yaw = Math.PI - turn;
136
- aimCamera(g);
137
- }
138
-
139
- /** Chase camera: low behind the penguin, drifting after its lane, looking down the causeway. */
140
- function aimCamera(g: Game) {
141
- g.camera.eye = [g.camX, 3.1, g.z + 5.4];
142
- g.camera.target = [g.camX, 1.1, g.z - 6];
143
- }
144
-
145
- /** Start screen: circling the waiting penguin, as Car Racing circles its car. */
146
- function orbitCamera(g: Game, dt: number) {
147
- g.orbit += dt * 0.35;
148
- const a = g.orbit + 0.9;
149
- g.camera.eye = [g.x + Math.sin(a) * 4.2, 1.9, g.z + Math.cos(a) * 4.2];
150
- g.camera.target = [g.x, 0.8, g.z];
151
- }
152
-
153
- /** A fresh attempt: a newly generated track, the penguin waiting at the start. */
154
- export function reset(g: Game) {
155
- g.world.cancelTimers();
156
- for (const t of g.tiles) despawnTile(g.world, t);
157
- g.tiles = [];
158
- g.nextTile = -TILES_BEFORE_START;
159
- g.plan = generateTrack(newSeed());
160
- g.won = false;
161
- g.lane = 1;
162
- g.x = LANE_X[1];
163
- g.vx = 0;
164
- g.camX = 0;
165
- g.z = 0;
166
- g.speed = SPEED_START;
167
- g.distance = g.coins = g.gems = g.score = 0;
168
- g.lives = MAX_LIVES;
169
- g.invulnerable = 0;
170
- g.action = null;
171
- g.queued = null;
172
- g.orbit = 0;
173
- g.world.stopAnimation(g.penguin.root);
174
- placePenguin(g.world, g.penguin, 0, Math.PI);
175
- keepTiles(g);
176
- place(g);
177
- playPenguin(g.world, g.penguin, 'idle');
178
- setPhase(g, 'ready');
179
- g.onScore(0);
180
- g.onCoins(0);
181
- g.onLives(MAX_LIVES);
182
- g.lastDistance = 0;
183
- g.onDistance(0);
184
- }
185
-
186
- function setPhase(g: Game, phase: Phase) {
187
- g.phase = phase;
188
- g.onPhase(phase);
189
- }
190
-
191
- export function start(g: Game) {
192
- if (g.phase === 'over') reset(g);
193
- playPenguin(g.world, g.penguin, 'run');
194
- aimCamera(g);
195
- setPhase(g, 'playing');
196
- }
197
-
198
- export function swipe(g: Game, direction: 'left' | 'right' | 'up' | 'down') {
199
- if (g.phase !== 'playing') return;
200
- if (direction === 'left' || direction === 'right') {
201
- const lane = Math.max(0, Math.min(2, g.lane + (direction === 'left' ? -1 : 1)));
202
- if (lane === g.lane) return;
203
- g.lane = lane;
204
- g.onLane();
205
- return;
206
- }
207
- const action = direction === 'up' ? 'jump' : 'slide';
208
- if (g.action === action) {
209
- g.queued = action;
210
- g.queuedT = QUEUE_TIME;
211
- return;
212
- }
213
- g.queued = null;
214
- g.action = action;
215
- g.actionT = 0;
216
- // Long enough to stay airborne / low for a set distance at the current speed, within limits
217
- const [metres, window, [minT, maxT]] = action === 'jump' ? [JUMP_AIR_METRES, GAP_WINDOW, JUMP_TIME] : [SLIDE_LOW_METRES, LOW_WINDOW, SLIDE_TIME];
218
- g.actionDur = Math.min(maxT, Math.max(minT, metres / ((window[1] - window[0]) * g.speed)));
219
- playPenguin(g.world, g.penguin, action, CLIP_TIME[action] / g.actionDur);
220
- if (action === 'jump') g.onJump();
221
- else g.onSlide();
222
- }
223
-
224
- const DRAG_THRESHOLD = 18;
225
- /** How long a jump / slide swiped too early is kept for (seconds). */
226
- const QUEUE_TIME = 0.35;
227
- const drag = { x: 0, y: 0, fired: false };
228
-
229
- /**
230
- * Drag controls, as in the other engine games: a move fires mid-stroke as soon as the finger has
231
- * travelled DRAG_THRESHOLD points (no waiting for release), one move per stroke.
232
- */
233
- export function steer(g: Game, phase: 'start' | 'move' | 'end', x: number, y: number) {
234
- if (phase === 'start') {
235
- drag.x = x;
236
- drag.y = y;
237
- drag.fired = false;
238
- return;
239
- }
240
- if (phase === 'end' || drag.fired) return;
241
- const dx = x - drag.x;
242
- const dy = y - drag.y;
243
- if (Math.max(Math.abs(dx), Math.abs(dy)) < DRAG_THRESHOLD) return;
244
- drag.fired = true;
245
- if (Math.abs(dx) > Math.abs(dy)) swipe(g, dx < 0 ? 'left' : 'right');
246
- else swipe(g, dy < 0 ? 'up' : 'down');
247
- }
248
-
249
- /** Where the penguin is in its jump or slide, 0..1 (the clip starts after a short blend). */
250
- const actionFrac = (g: Game) => Math.max(0, g.actionT - 0.06) / g.actionDur;
251
- const airborne = (g: Game) => g.action === 'jump' && actionFrac(g) >= GAP_WINDOW[0] && actionFrac(g) <= GAP_WINDOW[1];
252
- const ducking = (g: Game) => g.action === 'slide' && actionFrac(g) >= LOW_WINDOW[0] && actionFrac(g) <= LOW_WINDOW[1];
253
-
254
- /** A hit with lives to spare: a life lost, a stumble, and a moment when nothing can hurt it. */
255
- function hurt(g: Game) {
256
- g.lives--;
257
- g.onLives(g.lives);
258
- g.invulnerable = HURT_INVULNERABLE;
259
- g.action = 'hit';
260
- g.actionT = 0;
261
- g.actionDur = CLIP_TIME.hit / 1.3;
262
- playPenguin(g.world, g.penguin, 'hit', 1.3);
263
- crashDust(g.world, [g.x, 0.5, g.z - 0.4]);
264
- g.camera.shake = 0.22;
265
- g.onHurt();
266
- }
267
-
268
- /** Smacked into a gateway: knocked down where it stands, then the results. */
269
- function crash(g: Game) {
270
- g.lives = 0;
271
- g.onLives(0);
272
- g.action = null;
273
- playPenguin(g.world, g.penguin, 'dead');
274
- crashDust(g.world, [g.x, 0.6, g.z - 0.4]);
275
- g.camera.shake = 0.35;
276
- g.onCrash();
277
- setPhase(g, 'over');
278
- }
279
-
280
- /** Ran into a gap: tumbles down into the chasm as it topples, the camera watching from the edge. */
281
- function fall(g: Game) {
282
- g.lives = 0;
283
- g.onLives(0);
284
- g.action = null;
285
- playPenguin(g.world, g.penguin, 'dead', 1.4);
286
- g.world.animate(g.penguin.root, { position: [g.x, -7, g.z - 1.2] }, { duration: 1.3, easing: 'easeIn' });
287
- crashDust(g.world, [g.x, 0, g.z - 0.6]);
288
- g.camera.shake = 0.15;
289
- g.onCrash();
290
- setPhase(g, 'over');
291
- }
292
-
293
- /** Crossed the finish line: slows to a stop, turns to the camera and dances. */
294
- function win(g: Game) {
295
- g.won = true;
296
- g.action = null;
297
- g.world.animate(g.penguin.root, { rotation: quat.y(0) }, { duration: 0.5, delay: 0.5, easing: 'easeInOut' });
298
- playPenguin(g.world, g.penguin, 'dance');
299
- g.onWin();
300
- setPhase(g, 'over');
301
- }
302
-
303
- export function tick(g: Game, dt: number) {
304
- if (g.world.isDisposed) return;
305
- if (g.phase === 'playing') {
306
- g.speed = SPEED_START;
307
- const step = g.speed * dt;
308
- g.z -= step;
309
- g.distance += step;
310
-
311
- // Lane change: a critically damped spring toward the lane (smooth, and a second swipe mid-move
312
- // just retargets it); sub-stepped so it stays stable on long frames
313
- const w = LANE_STIFFNESS;
314
- const steps = Math.max(1, Math.ceil(dt / 0.008));
315
- const h = dt / steps;
316
- for (let i = 0; i < steps; i++) {
317
- g.vx += (w * w * (LANE_X[g.lane]! - g.x) - 2 * w * g.vx) * h;
318
- g.x += g.vx * h;
319
- }
320
- g.camX += (g.x * 0.4 - g.camX) * (1 - Math.exp(-dt * CAMERA_FOLLOW));
321
- g.invulnerable = Math.max(0, g.invulnerable - dt);
322
-
323
- // Jump / slide timing; back to running when it ends
324
- g.queuedT = Math.max(0, g.queuedT - dt);
325
- if (g.action) {
326
- g.actionT += dt;
327
- if (g.actionT >= g.actionDur + 0.06) {
328
- g.action = null;
329
- const next = g.queuedT > 0 ? g.queued : null;
330
- g.queued = null;
331
- if (next) swipe(g, next === 'jump' ? 'up' : 'down');
332
- else playPenguin(g.world, g.penguin, 'run', runPace(g));
333
- }
334
- }
335
-
336
- keepTiles(g);
337
- place(g);
338
-
339
- // Obstacles and coins level with the penguin
340
- for (const tile of g.tiles) {
341
- if (tile.z < g.z - TILE_LENGTH || tile.z - TILE_LENGTH > g.z + TILE_LENGTH) continue;
342
- for (const o of tile.obstacles) {
343
- if (g.invulnerable > 0 || Math.abs(LANE_X[o.lane]! - g.x) > LANE_TOLERANCE) continue;
344
- const hit =
345
- o.kind === 'gap' ? Math.abs(o.z - g.z) < GAP_HALF && !airborne(g) : Math.abs(o.z - g.z) < HIT_DEPTH && !(o.kind === 'beam' && ducking(g));
346
- if (!hit) continue;
347
- if (g.lives > 1) {
348
- hurt(g);
349
- break;
350
- }
351
- return finish(g, dt, o.kind === 'gap' ? fall : crash);
352
- }
353
- for (const p of tile.pickups) {
354
- if (p.taken || Math.abs(p.z - g.z) > COIN_RADIUS || Math.abs(LANE_X[p.lane]! - g.x) > LANE_TOLERANCE) continue;
355
- p.taken = true;
356
- g.world.despawn(p.e);
357
- coinSparkle(g.world, [LANE_X[p.lane]!, p.y, p.z], p.gem);
358
- if (p.gem) g.gems++;
359
- else g.coins++;
360
- g.onCoins(g.coins + g.gems * 10);
361
- g.onCoin(p.gem);
362
- }
363
- }
364
-
365
- const metres = Math.min(TRACK_LENGTH, Math.floor(g.distance));
366
- const score = metres * POINTS_PER_METRE + g.coins * POINTS_COIN + g.gems * POINTS_GEM;
367
- if (score !== g.score) {
368
- g.score = score;
369
- g.onScore(score);
370
- }
371
- if (metres !== g.lastDistance) {
372
- g.lastDistance = metres;
373
- g.onDistance(metres);
374
- }
375
- if (g.distance >= TRACK_LENGTH) return finish(g, dt, win);
376
- } else if (g.phase === 'over' && g.won && g.speed > 0) {
377
- // Running on past the line, slowing to a stop
378
- g.speed = Math.max(0, g.speed - 22 * dt);
379
- g.z -= g.speed * dt;
380
- g.world.set(g.penguin.root, { position: [g.x, 0, g.z] });
381
- aimCamera(g);
382
- } else if (g.phase === 'ready') orbitCamera(g, dt);
383
- g.world.update(dt);
384
- }
385
-
386
- function finish(g: Game, dt: number, end: (g: Game) => void) {
387
- end(g);
388
- g.world.update(dt);
389
- }
390
-
391
- export function setLayout(g: Game, width: number, height: number) {
392
- g.camera.fov = width / Math.max(1, height) < 0.7 ? 1.0 : 0.85;
393
- }
394
-
395
- /** Day or night: rebuilds the tiles in view with the new lighting tint (the run carries on). */
396
- export function setTheme(g: Game, theme: GameTheme) {
397
- if (theme === g.theme || g.world.isDisposed) return;
398
- g.theme = theme;
399
- const indices = g.tiles.map((t) => t.index);
400
- for (const t of g.tiles) despawnTile(g.world, t);
401
- g.tiles = indices.map((i) => spawnTile(g.world, i, theme, g.plan));
402
- }
403
-
404
- export function dispose(g: Game) {
405
- g.world.dispose();
406
- }