@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,99 +0,0 @@
1
- // Crossy Road's rules, with no React or engine: the fixed board (its lanes and the traffic on each road),
2
- // the traffic's motion (wrapping round the full width), forgiving swept hop hitboxes, and progress.
3
- import { CAR_SPEED_MAX, CAR_SPEED_MIN, COLORS, COLS, colX, GOAL_ROW, LANE_TYPES, type Layout, speedScale } from './CrossyRoadConstants';
4
- import type { VehicleStyle } from './CrossyRoadMeshes';
5
-
6
- export type Vehicle = { id: number; row: number; x: number; width: number; speed: number; colorIndex: number; style: VehicleStyle };
7
-
8
- const rnd = (min: number, max: number) => min + Math.random() * (max - min);
9
-
10
- /** Every road's traffic: one bus (sometimes two) or two cars (sometimes three), evenly spaced, all one way. */
11
- export function buildTraffic(l: Layout, firstId = 0): Vehicle[] {
12
- const out: Vehicle[] = [];
13
- let id = firstId;
14
- let paints: number[] = [];
15
- let lastPaint = -1;
16
- const nextPaint = () => {
17
- if (!paints.length) {
18
- paints = COLORS.CAR_COLORS.map((_, index) => index);
19
- for (let i = paints.length - 1; i > 0; i--) {
20
- const j = Math.floor(Math.random() * (i + 1));
21
- [paints[i], paints[j]] = [paints[j]!, paints[i]!];
22
- }
23
- if (paints[paints.length - 1] === lastPaint) [paints[0], paints[paints.length - 1]] = [paints[paints.length - 1]!, paints[0]!];
24
- }
25
- lastPaint = paints.pop()!;
26
- return lastPaint;
27
- };
28
- LANE_TYPES.forEach((type, row) => {
29
- if (type !== 'road') return;
30
- const dir = Math.random() < 0.5 ? 1 : -1;
31
- const bus = Math.random() < 0.35;
32
- const style: VehicleStyle = bus ? 'bus' : (['compact', 'taxi', 'pickup'] as const)[Math.floor(Math.random() * 3)]!;
33
- const speed = rnd(CAR_SPEED_MIN, CAR_SPEED_MAX) * (bus ? 0.8 : 1) * dir;
34
- const count = (bus ? 1 : 2) + (Math.random() < 0.3 ? 1 : 0);
35
- const width = l.tile * { compact: 1.4, taxi: 1.5, pickup: 1.7, bus: 2.4 }[style];
36
- const spacing = l.width / count + width;
37
- const startOffset = rnd(0, spacing);
38
- for (let i = 0; i < count; i++) out.push({ id: id++, row, x: -width + startOffset + i * spacing, width, speed, colorIndex: nextPaint(), style });
39
- });
40
- return out;
41
- }
42
-
43
- /** One 60 Hz frame of traffic, wrapping off one side onto the other. */
44
- export function moveTraffic(l: Layout, vs: Vehicle[], scale: number) {
45
- const pad = l.tile * 2;
46
- for (const v of vs) {
47
- let x = v.x + v.speed * scale;
48
- const margin = v.width + pad;
49
- if (v.speed > 0 && x - v.width / 2 > l.width + margin) x = -margin - v.width / 2;
50
- else if (v.speed < 0 && x + v.width / 2 < -margin) x = l.width + margin + v.width / 2;
51
- v.x = x;
52
- }
53
- }
54
-
55
- /** Whether traffic overlaps the pedestrian, including fractional rows while a step is in progress. */
56
- export function hit(l: Layout, vs: Vehicle[], row: number, x: number) {
57
- const half = l.tile * 0.4 * 0.65;
58
- return vs.some((v) => Math.abs(v.row - row) * l.laneH < l.tile * 0.53 && Math.abs(v.x - x) < v.width / 2 + half);
59
- }
60
-
61
- /** The player: its lane and column, the furthest lane it's reached, and the roads crossed. */
62
- export type Player = { row: number; col: number; maxRow: number; crossings: number };
63
- export const startPlayer = (): Player => ({ row: 0, col: Math.floor(COLS / 2), maxRow: 0, crossings: 0 });
64
-
65
- /** A hop's outcome: whether it moved, whether it crossed a road, whether it reached the goal. */
66
- export type Hop = { moved: boolean; crossed: boolean; goal: boolean };
67
- const NO_HOP: Hop = { moved: false, crossed: false, goal: false };
68
-
69
- export function hopForward(p: Player): Hop {
70
- const prev = p.row;
71
- const row = Math.min(prev + 1, GOAL_ROW);
72
- if (row === prev) return NO_HOP;
73
- p.row = row;
74
- let crossed = false;
75
- if (row > p.maxRow) {
76
- p.maxRow = row;
77
- if (LANE_TYPES[prev] === 'road') {
78
- p.crossings++;
79
- crossed = true;
80
- }
81
- }
82
- return { moved: true, crossed, goal: row === GOAL_ROW };
83
- }
84
-
85
- export function hopBack(p: Player): Hop {
86
- if (p.row <= 0) return NO_HOP;
87
- p.row -= 1;
88
- return { moved: true, crossed: false, goal: false };
89
- }
90
-
91
- export function hopSide(p: Player, dir: -1 | 1): Hop {
92
- const col = p.col + dir;
93
- if (col < 0 || col >= COLS) return NO_HOP;
94
- p.col = col;
95
- return { moved: true, crossed: false, goal: false };
96
- }
97
-
98
- export const playerX = (l: Layout, p: Player) => colX(l, p.col);
99
- export const scaleFor = (p: Player) => speedScale(p.crossings);
@@ -1,355 +0,0 @@
1
- import { type Color, effects, type Entity, type Quat, quat, type Vec3, type World } from '@nayan-ui/engine';
2
- // Crossy Road's own low-poly world: blocky vehicles, faceted trees, bright grass and clean asphalt.
3
- // Everything is code-built and cached; the scene has no racing-game models or texture downloads.
4
- // The rules use points; a shared root scales them into compact world units for the camera.
5
- import { toColor } from '../shared/EngineUtils';
6
- import { COLORS, COLS, colX, LANE_TYPES, type Layout, MOVE_TIME, PERSON, TOTAL_LANES, WORLD_SCALE } from './CrossyRoadConstants';
7
- import type { CrossyMeshes } from './CrossyRoadMeshes';
8
- import { pedestrianMeshes } from './CrossyRoadPerson';
9
- import type { Vehicle } from './CrossyRoadRules';
10
-
11
- const GROUND_DEPTH = 8;
12
- const ROAD_DROP = 1.6; // roads sit this far below the grass
13
- const FACE_RIGHT: Quat = [0, 0, 0, 1];
14
- const FACE_LEFT = quat.z(Math.PI);
15
- const STAND_UP = quat.x(Math.PI / 2); // a y-up model stood up off the board (z up)
16
- const k = WORLD_SCALE;
17
- /** A point in the scene (view points) as a world point, for bursts (which are in world space). */
18
- const world3 = (p: Vec3): Vec3 => [p[0] * k, p[1] * k, p[2] * k];
19
-
20
- /** A deterministic pseudo-random number in [0, 1) (decorations never shift between builds), as the original board's. */
21
- const seeded = (n: number) => {
22
- const x = Math.sin(n * 127.1 + 311.7) * 43758.5453;
23
- return x - Math.floor(x);
24
- };
25
-
26
- /** A color, a little lighter or darker (the night's moonlight dims the whole scene). */
27
- const shade = (css: string, _night: boolean, f = 1): Color => {
28
- const [r, g, b, a] = toColor(css);
29
- return [r * f, g * f, b * f, a ?? 1];
30
- };
31
-
32
- /** A lane's centre (world y) and its surface height. */
33
- export const laneY = (l: Layout, row: number) => (row - (TOTAL_LANES - 1) / 2) * l.laneH;
34
- export const laneTop = (row: number) => (LANE_TYPES[Math.round(row)] === 'road' ? -ROAD_DROP : 0);
35
- /** A view x on the board as world x. */
36
- export const worldX = (l: Layout, x: number) => x - l.width / 2;
37
-
38
- export type Scene = {
39
- /** Everything hangs off this root, scaled to the world. */
40
- root: Entity;
41
- ground: Entity[];
42
- vehicles: Map<number, Entity>;
43
- player: { root: Entity; body: Entity; arms: [Entity, Entity]; legs: [Entity, Entity]; feet: [Entity, Entity] };
44
- night: boolean;
45
- };
46
-
47
- // ── The ground ────────────────────────────────────────────────────────
48
-
49
- function spawnGround(world: World, l: Layout, a: CrossyMeshes, night: boolean, root: Entity): Entity[] {
50
- const out: Entity[] = [];
51
- const add = (o: Parameters<World['spawn']>[0]) => out.push(world.spawn({ pickable: false, parent: root, ...o }));
52
- // Wider than the view ever shows, past where the traffic wraps round
53
- const cols = Math.ceil((l.width + l.tile * 12) / l.tile / 2) * 2;
54
- const span = cols * l.tile;
55
- const boardH = TOTAL_LANES * l.laneH;
56
- // Grass all round the board, its top below the sunken roads (so it never covers them)
57
- add({
58
- mesh: 'cube',
59
- position: [0, 0, -ROAD_DROP - 0.6 - GROUND_DEPTH / 2],
60
- scale: [span * 3, boardH * 4, GROUND_DEPTH],
61
- color: shade(COLORS.GRASS_DARK, night, 0.9)
62
- });
63
- const xAt = (c: number) => -span / 2 + c * l.tile + l.tile / 2;
64
- for (let row = 0; row < TOTAL_LANES; row++) {
65
- const y = laneY(l, row);
66
- if (LANE_TYPES[row] === 'road') {
67
- // Broad asphalt panels, with subtle color variation instead of image textures
68
- for (let c = 0; c < cols; c += 2)
69
- add({
70
- mesh: 'cube',
71
- position: [xAt(c) + l.tile / 2, y, -ROAD_DROP - GROUND_DEPTH / 2],
72
- scale: [l.tile * 2 + 0.2, l.laneH, GROUND_DEPTH],
73
- color: shade(COLORS.ROAD, night, 0.96 + seeded(row * 3.1 + c) * 0.06)
74
- });
75
- // Solid white edge lines, and the dashed centre line
76
- for (const e of [-1, 1])
77
- add({
78
- mesh: 'cube',
79
- position: [0, y + e * (l.laneH / 2 - 3), -ROAD_DROP + 0.05],
80
- scale: [span, 1.6, 0.1],
81
- color: shade(COLORS.LINE, night, 0.9)
82
- });
83
- for (let c = 0; c < cols; c++)
84
- add({ mesh: 'cube', position: [xAt(c), y, -ROAD_DROP + 0.06], scale: [l.tile * 0.45, 1.8, 0.12], color: shade(COLORS.LINE, night, 0.85) });
85
- // Concrete curbs where it meets grass, standing a little proud of the grass
86
- for (const e of [-1, 1]) {
87
- if (LANE_TYPES[row + e] !== 'grass') continue;
88
- add({
89
- mesh: 'cube',
90
- position: [0, y + e * (l.laneH / 2 - 0.4), (0.9 - ROAD_DROP) / 2],
91
- scale: [span, 3.6, ROAD_DROP + 0.9],
92
- color: shade(COLORS.CURB, night)
93
- });
94
- }
95
- continue;
96
- }
97
- // Grass, two tiles at a time, the lanes in two shades and a little variation along them
98
- const base = row % 2 === 0 ? COLORS.GRASS_LIGHT : COLORS.GRASS_DARK;
99
- for (let c = 0; c < cols; c += 2)
100
- add({
101
- mesh: 'cube',
102
- position: [xAt(c) + l.tile / 2, y, -GROUND_DEPTH / 2],
103
- scale: [l.tile * 2 + 0.2, l.laneH, GROUND_DEPTH],
104
- color: shade(base, night, 0.95 + seeded(row * 7.7 + c * 1.3) * 0.12)
105
- });
106
- // Stepping stones identify safe lanes; the checkered strip marks the finish.
107
- for (let col = 0; col < COLS; col++)
108
- add({
109
- mesh: 'cube',
110
- position: [worldX(l, colX(l, col)), y, 0.08],
111
- scale: [l.tile * 0.42, l.laneH * 0.34, 0.16],
112
- color: shade('#C8DF99', night, 0.94)
113
- });
114
- if (row === TOTAL_LANES - 1) {
115
- for (let col = 0; col < COLS * 2; col++)
116
- for (let stripe = 0; stripe < 2; stripe++)
117
- add({
118
- mesh: 'cube',
119
- position: [-l.gridW / 2 + ((col + 0.5) * l.tile) / 2, y - l.laneH * 0.36 + stripe * l.laneH * 0.12, 0.15],
120
- scale: [l.tile / 2, l.laneH * 0.12, 0.2],
121
- color: shade((col + stripe) % 2 ? '#F8F6E9' : '#34434A', night)
122
- });
123
- }
124
- // Street lamps stay outside the playable columns.
125
- for (const side of [-1, 1]) {
126
- const x = side * (l.gridW / 2 + l.tile * 0.85);
127
- const post = l.tile * 0.075;
128
- add({ mesh: 'cube', position: [x, y, l.tile * 0.65], scale: [post, post, l.tile * 1.3], color: shade('#56676A', night) });
129
- add({
130
- mesh: 'cube',
131
- position: [x, y, l.tile * 1.33],
132
- scale: [l.tile * 0.26, l.tile * 0.26, l.tile * 0.13],
133
- color: night ? [2, 1.65, 0.9, 1] : [0.98, 0.92, 0.71, 1]
134
- });
135
- add({ mesh: 'cube', position: [x, y, l.tile * 1.44], scale: [l.tile * 0.34, l.tile * 0.34, l.tile * 0.08], color: shade('#45565A', night) });
136
- }
137
- for (let c = 0; c < cols; c++) {
138
- const x = xAt(c);
139
- const offGrid = Math.abs(x) > l.gridW / 2 + l.tile * 0.2;
140
- // Pine trees (and now and then a bush or a rock) off the player's columns
141
- if (offGrid && seeded(row * 5.3 + c * 1.7) > 0.4) {
142
- const pick = seeded(row * 2.9 + c * 4.1);
143
- const jx = (seeded(c * 3 + row) - 0.5) * l.tile * 0.3;
144
- const jy = (seeded(row * 5 + c) - 0.5) * l.laneH * 0.3;
145
- if (pick < 0.7) {
146
- add({
147
- mesh: a.tree,
148
- position: [x + jx, y + jy, 0],
149
- rotation: quat.z((seeded(c + row * 9) * Math.PI) / 2),
150
- scale: l.tile * (0.95 + seeded(row + c * 2.1) * 0.45),
151
- color: shade('#FFFFFF', night, 0.9 + seeded(c + row) * 0.15)
152
- });
153
- } else if (pick < 0.88) {
154
- add({ mesh: a.bush, position: [x + jx, y + jy, 0], scale: l.tile * 0.85, color: shade(COLORS.BUSH, night) });
155
- } else {
156
- add({
157
- mesh: a.rock,
158
- position: [x + jx, y + jy, 0],
159
- rotation: quat.z(seeded(row + c * 7) * 3),
160
- scale: [l.tile * 0.7, l.tile * 0.5, l.tile * 0.75],
161
- color: shade(COLORS.ROCK, night, 0.85 + seeded(c * 5 + row) * 0.2)
162
- });
163
- }
164
- continue;
165
- }
166
- if (seeded(row * 13.1 + c * 3.7) > 0.62) {
167
- const t = l.tile * 0.14;
168
- add({
169
- mesh: 'cone',
170
- position: [x + (seeded(c * 2 + row) - 0.5) * l.tile * 0.3, y + (seeded(row + c) - 0.5) * l.laneH * 0.5, t / 2],
171
- rotation: STAND_UP,
172
- scale: [t, t, t],
173
- color: shade(COLORS.GRASS_TUFT, night)
174
- });
175
- }
176
- if (seeded(row * 7.3 + c * 9.1 + 5) > 0.9) {
177
- const petal = COLORS.FLOWERS[Math.floor(seeded(row + c * 2) * COLORS.FLOWERS.length)]!;
178
- const fx = x + (seeded(row + c * 3) - 0.5) * l.tile * 0.2;
179
- const fy = y + (seeded(row * 2 + c) - 0.5) * l.laneH * 0.5;
180
- add({ mesh: 'sphere', position: [fx, fy, 1.5], scale: 4.6, color: shade(petal, night) });
181
- add({ mesh: 'sphere', position: [fx, fy, 2.6], scale: 2.4, color: shade('#FFD93D', night) });
182
- }
183
- }
184
- }
185
- return out;
186
- }
187
-
188
- // ── Vehicles ──────────────────────────────────────────────────────────
189
-
190
- /** Each vehicle is just a root and three instanced meshes: paint, fixed trim, and lamps. */
191
- function spawnVehicle(world: World, l: Layout, a: CrossyMeshes, v: Vehicle, night: boolean, parent: Entity): Entity {
192
- const root = world.spawn({
193
- mesh: 'none',
194
- parent,
195
- rotation: v.speed >= 0 ? FACE_RIGHT : FACE_LEFT,
196
- scale: [v.width, l.tile * 0.66, l.tile],
197
- pickable: false
198
- });
199
- const meshes = a.vehicles[v.style];
200
- const color = toColor(COLORS.CAR_COLORS[v.colorIndex] ?? COLORS.CAR_COLORS[0]);
201
- world.spawn({ mesh: meshes.body, parent: root, color, pickable: false });
202
- world.spawn({ mesh: meshes.details, parent: root, pickable: false });
203
- world.spawn({ mesh: meshes.lights, parent: root, color: night ? [1.8, 1.8, 1.8, 1] : [1, 1, 1, 1], pickable: false });
204
- return root;
205
- }
206
-
207
- /** Keeps every vehicle where the rules have it. */
208
- export function placeVehicles(world: World, l: Layout, s: Scene, vs: Vehicle[]) {
209
- const updates = world.transforms;
210
- for (const v of vs) {
211
- const e = s.vehicles.get(v.id);
212
- if (e != null) updates.position(e, worldX(l, v.x), laneY(l, v.row), laneTop(v.row));
213
- }
214
- updates.flush();
215
- }
216
-
217
- // ── The pedestrian ────────────────────────────────────────────────────
218
-
219
- function spawnPlayer(world: World, l: Layout, parent: Entity): Scene['player'] {
220
- const root = world.spawn({ mesh: 'none', parent, pickable: false });
221
- const body = world.spawn({ mesh: 'none', parent: root, pickable: false });
222
- const visual = world.spawn({ mesh: 'none', parent: body, scale: l.tile * PERSON.SCALE, pickable: false });
223
- const meshes = pedestrianMeshes();
224
- world.spawn({ mesh: meshes.torso, parent: visual, pickable: false });
225
- const arms = [-1, 1].map((side) => world.spawn({ mesh: meshes.arm, parent: visual, position: [side * 0.235, 0, 1.4], pickable: false })) as [
226
- Entity,
227
- Entity
228
- ];
229
- const legs = [-1, 1].map((side) => world.spawn({ mesh: meshes.leg, parent: visual, position: [side * 0.105, 0, 0.87], pickable: false })) as [
230
- Entity,
231
- Entity
232
- ];
233
- const feet = legs.map((leg) => world.spawn({ mesh: meshes.shoe, parent: leg, position: [0, -0.01, -0.72], pickable: false })) as [Entity, Entity];
234
- return { root, body, arms, legs, feet };
235
- }
236
-
237
- function restLimbs(world: World, player: Scene['player']) {
238
- for (const joint of [...player.arms, ...player.legs, ...player.feet]) {
239
- world.stopAnimation(joint);
240
- world.set(joint, { rotation: FACE_RIGHT });
241
- }
242
- player.legs.forEach((leg, i) => world.set(leg, { position: [(i === 0 ? -1 : 1) * 0.105, 0, 0.87] }));
243
- }
244
-
245
- /** The pedestrian on a lane and column, at once (a new board). */
246
- export function placePlayer(world: World, l: Layout, s: Scene, row: number, col: number) {
247
- world.stopAnimation(s.player.root);
248
- world.stopAnimation(s.player.body);
249
- restLimbs(world, s.player);
250
- world.set(s.player.root, { position: [worldX(l, colX(l, col)), laneY(l, row), laneTop(row)], rotation: FACE_RIGHT });
251
- world.set(s.player.body, { scale: 1, rotation: [0, 0, 0, 1], position: [0, 0, 0] });
252
- }
253
-
254
- /** Grounded translation with alternating strides. Ankles counter-rotate so shoes stay level. */
255
- export function hop(world: World, l: Layout, s: Scene, from: [number, number], to: [number, number], facing: 'up' | 'down' | 'left' | 'right') {
256
- const a: Vec3 = [worldX(l, colX(l, from[1])), laneY(l, from[0]), laneTop(from[0])];
257
- const b: Vec3 = [worldX(l, colX(l, to[1])), laneY(l, to[0]), laneTop(to[0])];
258
- const turn = { up: 0, down: Math.PI, left: Math.PI / 2, right: -Math.PI / 2 }[facing];
259
- world.stopAnimation(s.player.root);
260
- world.set(s.player.root, { position: a, rotation: quat.z(turn) });
261
- world.animate(s.player.root, { position: b }, { duration: MOVE_TIME, easing: 'linear' });
262
- const timing = { duration: MOVE_TIME, easing: 'linear' as const };
263
- s.player.legs.forEach((leg, i) => {
264
- const angle = PERSON.STRIDE * (i === 0 ? 1 : -1);
265
- const x = (i === 0 ? -1 : 1) * 0.105;
266
- const base: Vec3 = [x, 0, 0.87];
267
- world.animate(
268
- leg,
269
- [
270
- { rotation: quat.x(angle), position: [x, 0, 0.87 + (angle > 0 ? 0.12 : 0)], at: 0.25 },
271
- { rotation: FACE_RIGHT, position: base, at: 0.5 },
272
- { rotation: quat.x(-angle), position: [x, 0, 0.87 + (angle < 0 ? 0.12 : 0)], at: 0.75 },
273
- { rotation: FACE_RIGHT, position: base }
274
- ],
275
- timing
276
- );
277
- world.animate(
278
- s.player.feet[i]!,
279
- [{ rotation: quat.x(-angle), at: 0.25 }, { rotation: FACE_RIGHT, at: 0.5 }, { rotation: quat.x(angle), at: 0.75 }, { rotation: FACE_RIGHT }],
280
- timing
281
- );
282
- });
283
- s.player.arms.forEach((arm, i) => {
284
- const angle = -PERSON.STRIDE * (i === 0 ? 1 : -1) * 0.8;
285
- world.animate(
286
- arm,
287
- [{ rotation: quat.x(angle), at: 0.25 }, { rotation: FACE_RIGHT, at: 0.5 }, { rotation: quat.x(-angle), at: 0.75 }, { rotation: FACE_RIGHT }],
288
- timing
289
- );
290
- });
291
- // Lower the hips as the stance leg extends, keeping its foot on the ground instead of bouncing up.
292
- const drop = 0.72 * (1 - Math.cos(PERSON.STRIDE)) * l.tile * PERSON.SCALE;
293
- world.animate(
294
- s.player.body,
295
- [{ position: [0, 0, -drop], at: 0.25 }, { position: [0, 0, 0], at: 0.5 }, { position: [0, 0, -drop], at: 0.75 }, { position: [0, 0, 0] }],
296
- timing
297
- );
298
- }
299
-
300
- /** Run over: a non-graphic stumble and a small puff of road dust. */
301
- export function stumble(world: World, l: Layout, s: Scene, row: number, col: number) {
302
- restLimbs(world, s.player);
303
- world.animate(s.player.body, { rotation: quat.x(1.25), position: [0, 0, l.tile * 0.05] }, { duration: 0.24, easing: 'easeOut' });
304
- effects.shatter(world, {
305
- position: world3([worldX(l, colX(l, col)), laneY(l, row), laneTop(row) + l.tile * 0.3]),
306
- count: 10,
307
- size: l.tile * 0.08 * k,
308
- speed: l.tile * 3 * k,
309
- lifetime: 0.6,
310
- gravity: -l.tile * 6 * k,
311
- colors: [toColor(COLORS.ROAD_LINE), toColor(COLORS.CURB)]
312
- });
313
- }
314
-
315
- /** Made it across: a wave and confetti, standing on the finish lane. */
316
- export function celebrate(world: World, l: Layout, s: Scene, row: number, col: number) {
317
- const p: Vec3 = [worldX(l, colX(l, col)), laneY(l, row), laneTop(row)];
318
- restLimbs(world, s.player);
319
- world.animate(s.player.arms[0], [{ rotation: quat.x(-2.5), at: 0.3 }, { rotation: quat.x(-2), at: 0.65 }, { rotation: FACE_RIGHT }], {
320
- duration: 0.96
321
- });
322
- world.set(s.player.root, { position: p });
323
- world.set(s.player.body, { position: [0, 0, 0] });
324
- effects.confetti(world, {
325
- position: world3([p[0], p[1], l.tile]),
326
- count: 50,
327
- size: l.tile * 0.12 * k,
328
- speed: l.tile * 6 * k,
329
- lifetime: 1.2,
330
- gravity: -l.tile * 10 * k,
331
- colors: COLORS.CAR_COLORS.slice(0, 4).map((c) => toColor(c))
332
- });
333
- }
334
-
335
- // ── The whole scene ───────────────────────────────────────────────────
336
-
337
- export function buildScene(world: World, l: Layout, a: CrossyMeshes, night: boolean, vs: Vehicle[]): Scene {
338
- const root = world.spawn({ mesh: 'none', scale: k, pickable: false });
339
- const s: Scene = { root, ground: spawnGround(world, l, a, night, root), vehicles: new Map(), player: spawnPlayer(world, l, root), night };
340
- setTraffic(world, l, a, s, vs);
341
- return s;
342
- }
343
-
344
- /** Replaces the traffic with a new board's (its vehicles are new ones, so recolored and resized). */
345
- export function setTraffic(world: World, l: Layout, a: CrossyMeshes, s: Scene, vs: Vehicle[]) {
346
- for (const e of s.vehicles.values()) world.despawn(e);
347
- s.vehicles.clear();
348
- for (const v of vs) s.vehicles.set(v.id, spawnVehicle(world, l, a, v, s.night, s.root));
349
- placeVehicles(world, l, s, vs);
350
- }
351
-
352
- /** Everything goes with the root. */
353
- export function removeScene(world: World, s: Scene) {
354
- world.despawn(s.root);
355
- }
@@ -1,77 +0,0 @@
1
- // Dino Jump's screen, on the Nayan engine: a 3D dino running across a 3D desert seen through a low
2
- // perspective camera, under Playtura's scoreboard, controls and modals. The rules are in
3
- // DinoJumpGame.ts, the sky and far mesas in shared/EngineMeadow.ts, the dino, obstacles and the
4
- // scrolling desert in DinoJumpScene.ts.
5
- //
6
- // One world serves the whole visit: Start, Stop and Play Again reset it in place and a theme change
7
- // swaps day for night, so the GPU view is never rebuilt. JS steps the jump and the obstacles in fixed
8
- // 60 Hz steps once a frame; the running legs, bob, dust and bursts move in the engine's Rust core.
9
- import { useMemo } from 'react';
10
- import { HapticType } from '../../services/HapticsService';
11
- import { GAME_SOUNDS } from '../../services/SoundsService';
12
- import { GAME_IDS } from '../../services/UtilsService';
13
- import { engineGame, EngineGameScreen } from '../shared/EngineGameScreen';
14
- import { livesColumn, scoreColumn, timerColumn } from '../shared/EngineHud';
15
- import { backgroundFor, lightFor } from '../shared/EngineMeadow';
16
- import { useEngineGame } from '../shared/useEngineGame';
17
- import { useLiveState } from '../shared/useLiveState';
18
- import { getLayout, LIVES, TIME_LIMIT } from './DinoJumpConstants';
19
- import { createGame, dispose, jump, reset, setLayout, setTheme, start, tick } from './DinoJumpGame';
20
-
21
- const SFX = GAME_SOUNDS.DINO_JUMP;
22
- const formatScore = (value: number) => value.toLocaleString();
23
-
24
- export const DinoJump = engineGame(GAME_IDS.DINO_JUMP, (props) => {
25
- const [score, setScore] = useLiveState(0);
26
- const [lives, setLives] = useLiveState(LIVES);
27
- const [timeLeft, setTimeLeft] = useLiveState(TIME_LIMIT);
28
-
29
- // Surviving the timer is a win, losing every life a loss
30
- const { theme, status, screen, gameOver } = useEngineGame(props, {
31
- gameId: GAME_IDS.DINO_JUMP,
32
- create: createGame,
33
- start,
34
- reset,
35
- dispose,
36
- tick,
37
- setTheme,
38
- resize: (g, width, height, offset) => setLayout(g, getLayout(width, height, offset)),
39
- // Jumps as the finger lands (the original version waited for it to lift)
40
- drag: (g, { phase }) => {
41
- if (phase === 'start') jump(g);
42
- },
43
- sounds: SFX,
44
- onStart: (fx) => fx(SFX.START, HapticType.MEDIUM),
45
- onPlayAgain: (fx) => fx(null, HapticType.LIGHT),
46
- onOver: (fx, status) => fx(status === 'win' ? SFX.WIN : SFX.GAME_OVER, status === 'win' ? HapticType.SUCCESS : HapticType.ERROR),
47
- wire: (g, fx) => {
48
- g.onScore = setScore;
49
- g.onLives = setLives;
50
- g.onTime = setTimeLeft;
51
- g.onJump = () => fx(SFX.JUMP, HapticType.LIGHT);
52
- g.onCollect = () => fx(SFX.COLLECT, HapticType.SUCCESS);
53
- g.onHit = () => fx(SFX.HIT, HapticType.HEAVY);
54
- }
55
- });
56
-
57
- // Sunlight by day, moonlight at night (the world's colors follow the theme too)
58
- const light = useMemo(() => lightFor(theme), [theme]);
59
- const background = useMemo(() => backgroundFor(theme), [theme]);
60
-
61
- return (
62
- <EngineGameScreen
63
- {...screen}
64
- light={light}
65
- background={background}
66
- columns={[scoreColumn(score, 'SCORE', formatScore), livesColumn(lives, LIVES), timerColumn(timeLeft, theme)]}
67
- subtext="Jump over the cacti!"
68
- gameOver={gameOver({
69
- title: status === 'win' ? 'YOU SURVIVED!' : 'GAME OVER',
70
- message: status === 'win' ? 'Great running!' : 'You hit an obstacle!',
71
- scoreLabel: 'Final Score',
72
- score,
73
- buttonText: 'Run Again!'
74
- })}
75
- />
76
- );
77
- });
@@ -1,80 +0,0 @@
1
- // Dino Jump's rules, physics, timings and layout. Rules, scoring, physics and layout match the original
2
- // version (games/dino-jump), so scores and feel carry over.
3
- import type { MeadowOptions, Rig } from '../shared/EngineMeadow';
4
-
5
- // ── Rules ─────────────────────────────────────────────────────────────
6
-
7
- export const TIME_LIMIT = 120; // seconds; surviving them wins
8
- export const LIVES = 3;
9
- export const POINTS_PER_SECOND = 200;
10
- export const MUSHROOM_POINTS = 1000; // and a life back
11
-
12
- export type ObstacleKind = 'cactus_small' | 'cactus_large' | 'mushroom';
13
- /** Each obstacle's size in screen points (its collision box, and what's drawn). */
14
- export const OBSTACLE_SIZE: Record<ObstacleKind, { width: number; height: number }> = {
15
- cactus_small: { width: 35, height: 65 },
16
- cactus_large: { width: 45, height: 85 },
17
- mushroom: { width: 45, height: 65 }
18
- };
19
- export const MUSHROOM_CHANCE = 0.05;
20
- export const SMALL_CHANCE = 0.5; // of the rest's roll: below this small, above large
21
-
22
- // ── Physics (points per 60 Hz step, as the original version) ─────────────
23
-
24
- export const STEP = 1 / 60;
25
- export const STEP_TOLERANCE = 0.002;
26
- export const MAX_PENDING = 0.05;
27
- export const GRAVITY = 1.4;
28
- export const JUMP_FORCE = -28;
29
- export const RUN_SPEED = 6; // the obstacles' and the ground's scroll
30
- export const DINO_X = 50;
31
- export const DINO_WIDTH = 70; // drawn
32
- export const DINO_HEIGHT = 75;
33
- export const DINO_HIT_WIDTH = 50; // collides
34
- export const DINO_HIT_HEIGHT = 60;
35
- export const MAX_OBSTACLES = 5;
36
- export const MIN_OBSTACLE_GAP = 300; // the rightmost obstacle must be this far in before the next spawns
37
- export const REMOVE_X = -100;
38
-
39
- // ── Spawning (seconds) ────────────────────────────────────────────────
40
-
41
- export const FIRST_OBSTACLE = 1.5;
42
- export const SPAWN_MIN = 2.5;
43
- export const SPAWN_SPREAD = 2;
44
-
45
- // ── Feel ──────────────────────────────────────────────────────────────
46
-
47
- export const STRIDE_TIME = 0.16; // one leg swing
48
- export const DUST_INTERVAL = 0.24; // a puff of dust off the feet while running
49
-
50
- // ── The world ─────────────────────────────────────────────────────────
51
-
52
- const FOV = 0.9;
53
- const HORIZON = 0.6;
54
- const PLAY_DEPTH = 9;
55
-
56
- /** The screen line the dino runs on: higher with no header, as the original ground strip was. */
57
- export const groundLine = (height: number, offset: number) => height - (offset > 0 ? 150 : 250);
58
-
59
- /**
60
- * A low camera over the desert floor, at the height that puts the real ground under the play plane
61
- * exactly on the original game's ground line: the dino runs on the sand, which runs on to the horizon.
62
- */
63
- export function rigFor(height: number, offset: number): Rig {
64
- const tanHalf = Math.tan(FOV / 2);
65
- const pitch = Math.atan((HORIZON - 0.5) * 2 * tanHalf);
66
- const k = (2 * PLAY_DEPTH * tanHalf) / height;
67
- const eyeHeight = -PLAY_DEPTH * Math.sin(pitch) - (height / 2 - groundLine(height, offset)) * k * Math.cos(pitch);
68
- return { eyeHeight, horizon: HORIZON, playDepth: PLAY_DEPTH };
69
- }
70
-
71
- export const MEADOW: MeadowOptions = { biome: 'desert', near: false, sun: [0.8, 0.22], clouds: [0.1, 0.42] };
72
-
73
- /** The scrolling desert floor comes in tiles this many metres wide (three cover any view). */
74
- export const TILE = 80;
75
-
76
- // ── Layout (screen points) ────────────────────────────────────────────
77
-
78
- export type Layout = { width: number; height: number; offset: number; groundY: number };
79
-
80
- export const getLayout = (width: number, height: number, offset: number): Layout => ({ width, height, offset, groundY: groundLine(height, offset) });