brick-engine-js 1.0.1

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 (477) hide show
  1. package/.env.local.example +2 -0
  2. package/.github/workflows/publish.yml +73 -0
  3. package/.prettierignore +2 -0
  4. package/.prettierrc.json +8 -0
  5. package/README.adoc +84 -0
  6. package/dist/8e23286c2fdf41fd795f.svg +32 -0
  7. package/dist/CNAME +1 -0
  8. package/dist/app.js +2 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/brick-engine.js +2 -0
  11. package/dist/brick-engine.js.map +1 -0
  12. package/dist/config/configs.d.ts +180 -0
  13. package/dist/config/configs.test.d.ts +1 -0
  14. package/dist/config/env.d.ts +2 -0
  15. package/dist/config/env.test.d.ts +1 -0
  16. package/dist/config/styles.d.ts +0 -0
  17. package/dist/core/Game.d.ts +107 -0
  18. package/dist/core/Game.test.d.ts +1 -0
  19. package/dist/core/InitialStateSnapshot.d.ts +19 -0
  20. package/dist/core/InitialStateSnapshot.test.d.ts +1 -0
  21. package/dist/core/helpers/CellHelper.d.ts +13 -0
  22. package/dist/core/helpers/CellHelper.test.d.ts +1 -0
  23. package/dist/core/helpers/ControlInputHandlerHelper.d.ts +32 -0
  24. package/dist/core/helpers/ControlInputHandlerHelper.test.d.ts +1 -0
  25. package/dist/core/helpers/CoordinateHelper.d.ts +54 -0
  26. package/dist/core/helpers/CoordinateHelper.test.d.ts +1 -0
  27. package/dist/core/helpers/InterfaceIdentifierHelper.d.ts +7 -0
  28. package/dist/core/helpers/InterfaceIdentifierHelper.test.d.ts +1 -0
  29. package/dist/core/helpers/RelativeValuesHelper.d.ts +23 -0
  30. package/dist/core/helpers/RelativeValuesHelper.test.d.ts +1 -0
  31. package/dist/core/module/control/GameControl.d.ts +62 -0
  32. package/dist/core/module/control/GameControl.test.d.ts +1 -0
  33. package/dist/core/module/control/GameControlKeyBinding.d.ts +36 -0
  34. package/dist/core/module/control/GameControlKeyBinding.test.d.ts +1 -0
  35. package/dist/core/module/grid/GameGrid.d.ts +399 -0
  36. package/dist/core/module/grid/GameGrid.test.d.ts +1 -0
  37. package/dist/core/module/grid/GameHudGrid.d.ts +24 -0
  38. package/dist/core/module/grid/GameHudGrid.test.d.ts +1 -0
  39. package/dist/core/module/grid/engines/GridAnalysisEngine.d.ts +29 -0
  40. package/dist/core/module/grid/engines/GridAnalysisEngine.test.d.ts +1 -0
  41. package/dist/core/module/grid/engines/GridLineEngine.d.ts +56 -0
  42. package/dist/core/module/grid/engines/GridLineEngine.test.d.ts +1 -0
  43. package/dist/core/module/grid/engines/GridMovementEngine.d.ts +29 -0
  44. package/dist/core/module/grid/engines/GridMovementEngine.test.d.ts +1 -0
  45. package/dist/core/module/grid/engines/GridRegionEngine.d.ts +26 -0
  46. package/dist/core/module/grid/engines/GridRegionEngine.test.d.ts +1 -0
  47. package/dist/core/module/grid/engines/GridTransformEngine.d.ts +24 -0
  48. package/dist/core/module/grid/engines/GridTransformEngine.test.d.ts +1 -0
  49. package/dist/core/module/renderer/DisplayRenderer.d.ts +51 -0
  50. package/dist/core/module/renderer/DisplayRenderer.test.d.ts +1 -0
  51. package/dist/core/module/renderer/GameRenderer.d.ts +59 -0
  52. package/dist/core/module/renderer/GameRenderer.test.d.ts +1 -0
  53. package/dist/core/module/renderer/HudRenderer.d.ts +56 -0
  54. package/dist/core/module/renderer/HudRenderer.test.d.ts +1 -0
  55. package/dist/core/module/score/GameScore.d.ts +117 -0
  56. package/dist/core/module/score/GameScore.test.d.ts +1 -0
  57. package/dist/core/module/session/GameSession.d.ts +20 -0
  58. package/dist/core/module/session/GameSession.test.d.ts +1 -0
  59. package/dist/core/module/sound/GameSound.d.ts +85 -0
  60. package/dist/core/module/sound/GameSound.test.d.ts +1 -0
  61. package/dist/core/module/state/GameState.d.ts +172 -0
  62. package/dist/core/module/state/GameState.test.d.ts +1 -0
  63. package/dist/core/module/text/GameText.d.ts +87 -0
  64. package/dist/core/module/text/GameText.test.d.ts +1 -0
  65. package/dist/core/module/time/GameTime.d.ts +76 -0
  66. package/dist/core/module/time/GameTime.test.d.ts +1 -0
  67. package/dist/core/types/Interfaces.d.ts +53 -0
  68. package/dist/core/types/Types.d.ts +114 -0
  69. package/dist/core/types/enums.d.ts +106 -0
  70. package/dist/core/types/modules.d.ts +723 -0
  71. package/dist/css/app.743066d8e4172b0e73f9.css +824 -0
  72. package/dist/css/app.743066d8e4172b0e73f9.css.map +1 -0
  73. package/dist/docs/GAME_DEVELOPER_GUIDE.html +727 -0
  74. package/dist/docs/brick-engine-guide.html +610 -0
  75. package/dist/docs/diagrams/lifecycle.mmd +19 -0
  76. package/dist/docs/documentation_style_guide.html +994 -0
  77. package/dist/docs/getting-started.html +648 -0
  78. package/dist/docs/images/lifecycle.svg +1 -0
  79. package/dist/docs/index.html +593 -0
  80. package/dist/docs/jsdoc_standard.html +656 -0
  81. package/dist/docs/publishing.html +573 -0
  82. package/dist/docs/reference/enums/Color.html +533 -0
  83. package/dist/docs/reference/enums/ControlEventType.html +505 -0
  84. package/dist/docs/reference/enums/ControlKey.html +529 -0
  85. package/dist/docs/reference/enums/FontAlignment.html +545 -0
  86. package/dist/docs/reference/enums/FontSize.html +517 -0
  87. package/dist/docs/reference/enums/Sound.html +558 -0
  88. package/dist/docs/reference/enums/StateProperty.html +525 -0
  89. package/dist/docs/reference/helpers/CellHelper.html +520 -0
  90. package/dist/docs/reference/helpers/ControlInputHandlerHelper.html +569 -0
  91. package/dist/docs/reference/helpers/CoordinateHelper.html +703 -0
  92. package/dist/docs/reference/helpers/RelativeValuesHelper.html +560 -0
  93. package/dist/docs/reference/interfaces/Debuggable.html +501 -0
  94. package/dist/docs/reference/interfaces/GameModules.html +544 -0
  95. package/dist/docs/reference/interfaces/Initializable.html +495 -0
  96. package/dist/docs/reference/interfaces/RendererInitializable.html +517 -0
  97. package/dist/docs/reference/interfaces/StateSyncable.html +542 -0
  98. package/dist/docs/reference/interfaces/modules/Control.html +648 -0
  99. package/dist/docs/reference/interfaces/modules/Grid.html +1256 -0
  100. package/dist/docs/reference/interfaces/modules/Renderer.html +522 -0
  101. package/dist/docs/reference/interfaces/modules/RendererComposite.html +577 -0
  102. package/dist/docs/reference/interfaces/modules/Score.html +669 -0
  103. package/dist/docs/reference/interfaces/modules/Session.html +585 -0
  104. package/dist/docs/reference/interfaces/modules/State.html +897 -0
  105. package/dist/docs/reference/interfaces/modules/Text.html +668 -0
  106. package/dist/docs/reference/interfaces/modules/Time.html +684 -0
  107. package/dist/docs/reference/modules/Debugger.html +579 -0
  108. package/dist/docs/reference/modules/DisplayRenderer.html +557 -0
  109. package/dist/docs/reference/modules/Game.html +909 -0
  110. package/dist/docs/reference/modules/GameControl.html +716 -0
  111. package/dist/docs/reference/modules/GameGrid.html +1910 -0
  112. package/dist/docs/reference/modules/GameHudGrid.html +508 -0
  113. package/dist/docs/reference/modules/GameMenu.html +538 -0
  114. package/dist/docs/reference/modules/GameRenderer.html +589 -0
  115. package/dist/docs/reference/modules/GameScore.html +664 -0
  116. package/dist/docs/reference/modules/GameSession.html +533 -0
  117. package/dist/docs/reference/modules/GameSound.html +636 -0
  118. package/dist/docs/reference/modules/GameState.html +922 -0
  119. package/dist/docs/reference/modules/GameText.html +701 -0
  120. package/dist/docs/reference/modules/GameTime.html +696 -0
  121. package/dist/docs/reference/modules/HudRenderer.html +568 -0
  122. package/dist/docs/reference/modules/InitialStateSnapshot.html +557 -0
  123. package/dist/docs/reference/modules/SessionModal.html +520 -0
  124. package/dist/docs/reference/types/Axis.html +505 -0
  125. package/dist/docs/reference/types/Cell.html +514 -0
  126. package/dist/docs/reference/types/ControlCallback.html +488 -0
  127. package/dist/docs/reference/types/Coordinate.html +510 -0
  128. package/dist/docs/reference/types/GameEntry.html +514 -0
  129. package/dist/docs/reference/types/GameEvent.html +514 -0
  130. package/dist/docs/reference/types/Piece.html +506 -0
  131. package/dist/docs/reference/types/RendererMetrics.html +514 -0
  132. package/dist/docs/reference/types/Vector.html +509 -0
  133. package/dist/docs/testing_best_practices.html +770 -0
  134. package/dist/favicon.ico +0 -0
  135. package/dist/fonts/digital-7.monoitalic.ttf +0 -0
  136. package/dist/images/cell.svg +32 -0
  137. package/dist/images/close.png +0 -0
  138. package/dist/images/games.png +0 -0
  139. package/dist/images/github.png +0 -0
  140. package/dist/images/letter-a.png +0 -0
  141. package/dist/images/letter-d.png +0 -0
  142. package/dist/images/letter-j.png +0 -0
  143. package/dist/images/letter-s.png +0 -0
  144. package/dist/images/letter-w.png +0 -0
  145. package/dist/images/meta-image.png +0 -0
  146. package/dist/images/number-1.png +0 -0
  147. package/dist/images/number-2.png +0 -0
  148. package/dist/images/number-3.png +0 -0
  149. package/dist/images/number-4.png +0 -0
  150. package/dist/images/number-5.png +0 -0
  151. package/dist/images/number-6.png +0 -0
  152. package/dist/images/splash.gif +0 -0
  153. package/dist/index.d.ts +8 -0
  154. package/dist/index.html +1 -0
  155. package/dist/index.test.d.ts +1 -0
  156. package/dist/main.d.ts +3 -0
  157. package/dist/main.test.d.ts +1 -0
  158. package/dist/menu/GameMenu.d.ts +15 -0
  159. package/dist/menu/GameMenu.test.d.ts +1 -0
  160. package/dist/menu/GameMenuSingleton.d.ts +6 -0
  161. package/dist/menu/GameMenuSingleton.test.d.ts +1 -0
  162. package/dist/menu/GameRepository.d.ts +7 -0
  163. package/dist/menu/GameRepository.test.d.ts +1 -0
  164. package/dist/menu/manager/GameManager.d.ts +6 -0
  165. package/dist/menu/manager/GameManager.test.d.ts +1 -0
  166. package/dist/sounds/sound_00.wav +0 -0
  167. package/dist/sounds/sound_01.wav +0 -0
  168. package/dist/sounds/sound_02.wav +0 -0
  169. package/dist/sounds/sound_03.wav +0 -0
  170. package/dist/sounds/sound_04.wav +0 -0
  171. package/dist/sounds/sound_05.wav +0 -0
  172. package/dist/sounds/sound_06.wav +0 -0
  173. package/dist/sounds/sound_07.wav +0 -0
  174. package/dist/sounds/sound_08.wav +0 -0
  175. package/dist/sounds/sound_09.wav +0 -0
  176. package/dist/sounds/sound_10.wav +0 -0
  177. package/dist/sounds/sound_11.wav +0 -0
  178. package/dist/sounds/sound_12.wav +0 -0
  179. package/dist/sounds/sound_13.wav +0 -0
  180. package/dist/sounds/sound_14.wav +0 -0
  181. package/dist/sounds/sound_15.wav +0 -0
  182. package/dist/types/interfaces.d.ts +5 -0
  183. package/dist/vendor/p5.min.js +1 -0
  184. package/dist/view/Debugger.d.ts +12 -0
  185. package/dist/view/Debugger.test.d.ts +1 -0
  186. package/dist/view/GameView.d.ts +101 -0
  187. package/dist/view/GameView.test.d.ts +1 -0
  188. package/dist/view/SessionModal.d.ts +12 -0
  189. package/dist/view/SessionModal.test.d.ts +4 -0
  190. package/dist/view/components/layout/ButtonLayout.d.ts +25 -0
  191. package/dist/view/components/layout/ButtonLayout.test.d.ts +1 -0
  192. package/dist/view/components/layout/ContainerLayout.d.ts +23 -0
  193. package/dist/view/components/layout/ContainerLayout.test.d.ts +1 -0
  194. package/dist/view/components/layout/FrameLayout.d.ts +11 -0
  195. package/dist/view/components/layout/FrameLayout.test.d.ts +1 -0
  196. package/dist/view/components/ui/BigButton.d.ts +13 -0
  197. package/dist/view/components/ui/BigButton.test.d.ts +1 -0
  198. package/dist/view/components/ui/Button.d.ts +12 -0
  199. package/dist/view/components/ui/Button.test.d.ts +1 -0
  200. package/dist/view/components/ui/Canvas.d.ts +22 -0
  201. package/dist/view/components/ui/Canvas.test.d.ts +1 -0
  202. package/dist/view/components/ui/SmallButton.d.ts +13 -0
  203. package/dist/view/components/ui/SmallButton.test.d.ts +1 -0
  204. package/dist/view/theme/applyColors.d.ts +10 -0
  205. package/dist/view/theme/applyColors.test.d.ts +1 -0
  206. package/dist/view/theme/dimensions.d.ts +13 -0
  207. package/dist/view/theme/dimensions.test.d.ts +1 -0
  208. package/docs/GAME_DEVELOPER_GUIDE.adoc +167 -0
  209. package/docs/brick-engine-guide.adoc +87 -0
  210. package/docs/diagrams/lifecycle.mmd +19 -0
  211. package/docs/documentation_style_guide.adoc +210 -0
  212. package/docs/getting-started.adoc +147 -0
  213. package/docs/images/lifecycle.svg +1 -0
  214. package/docs/jsdoc_standard.adoc +109 -0
  215. package/docs/publishing.adoc +58 -0
  216. package/docs/reference/enums/Color.adoc +35 -0
  217. package/docs/reference/enums/ControlEventType.adoc +28 -0
  218. package/docs/reference/enums/ControlKey.adoc +34 -0
  219. package/docs/reference/enums/FontAlignment.adoc +43 -0
  220. package/docs/reference/enums/FontSize.adoc +31 -0
  221. package/docs/reference/enums/Sound.adoc +42 -0
  222. package/docs/reference/enums/StateProperty.adoc +33 -0
  223. package/docs/reference/helpers/CellHelper.adoc +37 -0
  224. package/docs/reference/helpers/ControlInputHandlerHelper.adoc +57 -0
  225. package/docs/reference/helpers/CoordinateHelper.adoc +118 -0
  226. package/docs/reference/helpers/RelativeValuesHelper.adoc +53 -0
  227. package/docs/reference/interfaces/Debuggable.adoc +29 -0
  228. package/docs/reference/interfaces/GameModules.adoc +35 -0
  229. package/docs/reference/interfaces/Initializable.adoc +24 -0
  230. package/docs/reference/interfaces/RendererInitializable.adoc +33 -0
  231. package/docs/reference/interfaces/StateSyncable.adoc +41 -0
  232. package/docs/reference/interfaces/modules/Control.adoc +98 -0
  233. package/docs/reference/interfaces/modules/Grid.adoc +411 -0
  234. package/docs/reference/interfaces/modules/Renderer.adoc +34 -0
  235. package/docs/reference/interfaces/modules/RendererComposite.adoc +57 -0
  236. package/docs/reference/interfaces/modules/Score.adoc +107 -0
  237. package/docs/reference/interfaces/modules/Session.adoc +66 -0
  238. package/docs/reference/interfaces/modules/State.adoc +290 -0
  239. package/docs/reference/interfaces/modules/Text.adoc +110 -0
  240. package/docs/reference/interfaces/modules/Time.adoc +119 -0
  241. package/docs/reference/modules/Debugger.adoc +71 -0
  242. package/docs/reference/modules/DisplayRenderer.adoc +55 -0
  243. package/docs/reference/modules/Game.adoc +256 -0
  244. package/docs/reference/modules/GameControl.adoc +139 -0
  245. package/docs/reference/modules/GameGrid.adoc +794 -0
  246. package/docs/reference/modules/GameHudGrid.adoc +38 -0
  247. package/docs/reference/modules/GameMenu.adoc +39 -0
  248. package/docs/reference/modules/GameRenderer.adoc +79 -0
  249. package/docs/reference/modules/GameScore.adoc +138 -0
  250. package/docs/reference/modules/GameSession.adoc +43 -0
  251. package/docs/reference/modules/GameSound.adoc +111 -0
  252. package/docs/reference/modules/GameState.adoc +318 -0
  253. package/docs/reference/modules/GameText.adoc +139 -0
  254. package/docs/reference/modules/GameTime.adoc +141 -0
  255. package/docs/reference/modules/HudRenderer.adoc +56 -0
  256. package/docs/reference/modules/InitialStateSnapshot.adoc +47 -0
  257. package/docs/reference/modules/SessionModal.adoc +34 -0
  258. package/docs/reference/types/Axis.adoc +28 -0
  259. package/docs/reference/types/Cell.adoc +29 -0
  260. package/docs/reference/types/ControlCallback.adoc +23 -0
  261. package/docs/reference/types/Coordinate.adoc +29 -0
  262. package/docs/reference/types/GameEntry.adoc +29 -0
  263. package/docs/reference/types/GameEvent.adoc +29 -0
  264. package/docs/reference/types/Piece.adoc +32 -0
  265. package/docs/reference/types/RendererMetrics.adoc +29 -0
  266. package/docs/reference/types/Vector.adoc +28 -0
  267. package/docs/testing_best_practices.adoc +190 -0
  268. package/eslint.config.mjs +29 -0
  269. package/package.json +54 -0
  270. package/public/CNAME +1 -0
  271. package/public/docs/GAME_DEVELOPER_GUIDE.html +727 -0
  272. package/public/docs/brick-engine-guide.html +610 -0
  273. package/public/docs/diagrams/lifecycle.mmd +19 -0
  274. package/public/docs/documentation_style_guide.html +994 -0
  275. package/public/docs/getting-started.html +648 -0
  276. package/public/docs/images/lifecycle.svg +1 -0
  277. package/public/docs/index.html +593 -0
  278. package/public/docs/jsdoc_standard.html +656 -0
  279. package/public/docs/publishing.html +573 -0
  280. package/public/docs/reference/enums/Color.html +533 -0
  281. package/public/docs/reference/enums/ControlEventType.html +505 -0
  282. package/public/docs/reference/enums/ControlKey.html +529 -0
  283. package/public/docs/reference/enums/FontAlignment.html +545 -0
  284. package/public/docs/reference/enums/FontSize.html +517 -0
  285. package/public/docs/reference/enums/Sound.html +558 -0
  286. package/public/docs/reference/enums/StateProperty.html +525 -0
  287. package/public/docs/reference/helpers/CellHelper.html +520 -0
  288. package/public/docs/reference/helpers/ControlInputHandlerHelper.html +569 -0
  289. package/public/docs/reference/helpers/CoordinateHelper.html +703 -0
  290. package/public/docs/reference/helpers/RelativeValuesHelper.html +560 -0
  291. package/public/docs/reference/interfaces/Debuggable.html +501 -0
  292. package/public/docs/reference/interfaces/GameModules.html +544 -0
  293. package/public/docs/reference/interfaces/Initializable.html +495 -0
  294. package/public/docs/reference/interfaces/RendererInitializable.html +517 -0
  295. package/public/docs/reference/interfaces/StateSyncable.html +542 -0
  296. package/public/docs/reference/interfaces/modules/Control.html +648 -0
  297. package/public/docs/reference/interfaces/modules/Grid.html +1256 -0
  298. package/public/docs/reference/interfaces/modules/Renderer.html +522 -0
  299. package/public/docs/reference/interfaces/modules/RendererComposite.html +577 -0
  300. package/public/docs/reference/interfaces/modules/Score.html +669 -0
  301. package/public/docs/reference/interfaces/modules/Session.html +585 -0
  302. package/public/docs/reference/interfaces/modules/State.html +897 -0
  303. package/public/docs/reference/interfaces/modules/Text.html +668 -0
  304. package/public/docs/reference/interfaces/modules/Time.html +684 -0
  305. package/public/docs/reference/modules/Debugger.html +579 -0
  306. package/public/docs/reference/modules/DisplayRenderer.html +557 -0
  307. package/public/docs/reference/modules/Game.html +909 -0
  308. package/public/docs/reference/modules/GameControl.html +716 -0
  309. package/public/docs/reference/modules/GameGrid.html +1910 -0
  310. package/public/docs/reference/modules/GameHudGrid.html +508 -0
  311. package/public/docs/reference/modules/GameMenu.html +538 -0
  312. package/public/docs/reference/modules/GameRenderer.html +589 -0
  313. package/public/docs/reference/modules/GameScore.html +664 -0
  314. package/public/docs/reference/modules/GameSession.html +533 -0
  315. package/public/docs/reference/modules/GameSound.html +636 -0
  316. package/public/docs/reference/modules/GameState.html +922 -0
  317. package/public/docs/reference/modules/GameText.html +701 -0
  318. package/public/docs/reference/modules/GameTime.html +696 -0
  319. package/public/docs/reference/modules/HudRenderer.html +568 -0
  320. package/public/docs/reference/modules/InitialStateSnapshot.html +557 -0
  321. package/public/docs/reference/modules/SessionModal.html +520 -0
  322. package/public/docs/reference/types/Axis.html +505 -0
  323. package/public/docs/reference/types/Cell.html +514 -0
  324. package/public/docs/reference/types/ControlCallback.html +488 -0
  325. package/public/docs/reference/types/Coordinate.html +510 -0
  326. package/public/docs/reference/types/GameEntry.html +514 -0
  327. package/public/docs/reference/types/GameEvent.html +514 -0
  328. package/public/docs/reference/types/Piece.html +506 -0
  329. package/public/docs/reference/types/RendererMetrics.html +514 -0
  330. package/public/docs/reference/types/Vector.html +509 -0
  331. package/public/docs/testing_best_practices.html +770 -0
  332. package/public/favicon.ico +0 -0
  333. package/public/fonts/digital-7.monoitalic.ttf +0 -0
  334. package/public/images/cell.svg +32 -0
  335. package/public/images/close.png +0 -0
  336. package/public/images/games.png +0 -0
  337. package/public/images/github.png +0 -0
  338. package/public/images/letter-a.png +0 -0
  339. package/public/images/letter-d.png +0 -0
  340. package/public/images/letter-j.png +0 -0
  341. package/public/images/letter-s.png +0 -0
  342. package/public/images/letter-w.png +0 -0
  343. package/public/images/meta-image.png +0 -0
  344. package/public/images/number-1.png +0 -0
  345. package/public/images/number-2.png +0 -0
  346. package/public/images/number-3.png +0 -0
  347. package/public/images/number-4.png +0 -0
  348. package/public/images/number-5.png +0 -0
  349. package/public/images/number-6.png +0 -0
  350. package/public/images/splash.gif +0 -0
  351. package/public/index.html +15 -0
  352. package/public/sounds/sound_00.wav +0 -0
  353. package/public/sounds/sound_01.wav +0 -0
  354. package/public/sounds/sound_02.wav +0 -0
  355. package/public/sounds/sound_03.wav +0 -0
  356. package/public/sounds/sound_04.wav +0 -0
  357. package/public/sounds/sound_05.wav +0 -0
  358. package/public/sounds/sound_06.wav +0 -0
  359. package/public/sounds/sound_07.wav +0 -0
  360. package/public/sounds/sound_08.wav +0 -0
  361. package/public/sounds/sound_09.wav +0 -0
  362. package/public/sounds/sound_10.wav +0 -0
  363. package/public/sounds/sound_11.wav +0 -0
  364. package/public/sounds/sound_12.wav +0 -0
  365. package/public/sounds/sound_13.wav +0 -0
  366. package/public/sounds/sound_14.wav +0 -0
  367. package/public/sounds/sound_15.wav +0 -0
  368. package/public/style/body.css +86 -0
  369. package/public/style/buttons.css +233 -0
  370. package/public/style/debugger.css +117 -0
  371. package/public/style/sessionModal.css +155 -0
  372. package/public/style/sourceCodeAndCommands.css +74 -0
  373. package/public/style/splash.css +13 -0
  374. package/public/style/theme.css +137 -0
  375. package/scripts/generate-diagrams.sh +20 -0
  376. package/scripts/generate-docs.js +111 -0
  377. package/src/client-game.d.ts +1 -0
  378. package/src/config/configs.test.ts +20 -0
  379. package/src/config/configs.ts +197 -0
  380. package/src/config/env.test.ts +59 -0
  381. package/src/config/env.ts +7 -0
  382. package/src/config/styles.ts +5 -0
  383. package/src/core/Game.test.ts +167 -0
  384. package/src/core/Game.ts +307 -0
  385. package/src/core/InitialStateSnapshot.test.ts +51 -0
  386. package/src/core/InitialStateSnapshot.ts +46 -0
  387. package/src/core/helpers/CellHelper.test.ts +33 -0
  388. package/src/core/helpers/CellHelper.ts +21 -0
  389. package/src/core/helpers/ControlInputHandlerHelper.test.ts +116 -0
  390. package/src/core/helpers/ControlInputHandlerHelper.ts +68 -0
  391. package/src/core/helpers/CoordinateHelper.test.ts +113 -0
  392. package/src/core/helpers/CoordinateHelper.ts +82 -0
  393. package/src/core/helpers/InterfaceIdentifierHelper.test.ts +122 -0
  394. package/src/core/helpers/InterfaceIdentifierHelper.ts +43 -0
  395. package/src/core/helpers/RelativeValuesHelper.test.ts +47 -0
  396. package/src/core/helpers/RelativeValuesHelper.ts +29 -0
  397. package/src/core/module/control/GameControl.test.ts +82 -0
  398. package/src/core/module/control/GameControl.ts +142 -0
  399. package/src/core/module/control/GameControlKeyBinding.test.ts +59 -0
  400. package/src/core/module/control/GameControlKeyBinding.ts +92 -0
  401. package/src/core/module/grid/GameGrid.test.ts +83 -0
  402. package/src/core/module/grid/GameGrid.ts +610 -0
  403. package/src/core/module/grid/GameHudGrid.test.ts +22 -0
  404. package/src/core/module/grid/GameHudGrid.ts +40 -0
  405. package/src/core/module/grid/engines/GridAnalysisEngine.test.ts +157 -0
  406. package/src/core/module/grid/engines/GridAnalysisEngine.ts +124 -0
  407. package/src/core/module/grid/engines/GridLineEngine.test.ts +132 -0
  408. package/src/core/module/grid/engines/GridLineEngine.ts +165 -0
  409. package/src/core/module/grid/engines/GridMovementEngine.test.ts +125 -0
  410. package/src/core/module/grid/engines/GridMovementEngine.ts +113 -0
  411. package/src/core/module/grid/engines/GridRegionEngine.test.ts +136 -0
  412. package/src/core/module/grid/engines/GridRegionEngine.ts +52 -0
  413. package/src/core/module/grid/engines/GridTransformEngine.test.ts +98 -0
  414. package/src/core/module/grid/engines/GridTransformEngine.ts +70 -0
  415. package/src/core/module/renderer/DisplayRenderer.test.ts +86 -0
  416. package/src/core/module/renderer/DisplayRenderer.ts +152 -0
  417. package/src/core/module/renderer/GameRenderer.test.ts +103 -0
  418. package/src/core/module/renderer/GameRenderer.ts +144 -0
  419. package/src/core/module/renderer/HudRenderer.test.ts +108 -0
  420. package/src/core/module/renderer/HudRenderer.ts +203 -0
  421. package/src/core/module/score/GameScore.test.ts +71 -0
  422. package/src/core/module/score/GameScore.ts +188 -0
  423. package/src/core/module/session/GameSession.test.ts +176 -0
  424. package/src/core/module/session/GameSession.ts +103 -0
  425. package/src/core/module/sound/GameSound.test.ts +117 -0
  426. package/src/core/module/sound/GameSound.ts +229 -0
  427. package/src/core/module/state/GameState.test.ts +101 -0
  428. package/src/core/module/state/GameState.ts +339 -0
  429. package/src/core/module/text/GameText.test.ts +87 -0
  430. package/src/core/module/text/GameText.ts +150 -0
  431. package/src/core/module/time/GameTime.test.ts +86 -0
  432. package/src/core/module/time/GameTime.ts +144 -0
  433. package/src/core/types/Interfaces.ts +59 -0
  434. package/src/core/types/Types.ts +124 -0
  435. package/src/core/types/enums.ts +113 -0
  436. package/src/core/types/modules.ts +841 -0
  437. package/src/index.test.ts +15 -0
  438. package/src/index.ts +9 -0
  439. package/src/main.test.ts +137 -0
  440. package/src/main.ts +77 -0
  441. package/src/menu/GameMenu.test.ts +157 -0
  442. package/src/menu/GameMenu.ts +124 -0
  443. package/src/menu/GameMenuSingleton.test.ts +26 -0
  444. package/src/menu/GameMenuSingleton.ts +13 -0
  445. package/src/menu/GameRepository.test.ts +46 -0
  446. package/src/menu/GameRepository.ts +47 -0
  447. package/src/menu/manager/GameManager.test.ts +68 -0
  448. package/src/menu/manager/GameManager.ts +50 -0
  449. package/src/types/global.d.ts +8 -0
  450. package/src/types/interfaces.ts +5 -0
  451. package/src/view/Debugger.test.ts +152 -0
  452. package/src/view/Debugger.ts +124 -0
  453. package/src/view/GameView.test.ts +95 -0
  454. package/src/view/GameView.ts +244 -0
  455. package/src/view/SessionModal.test.ts +141 -0
  456. package/src/view/SessionModal.ts +73 -0
  457. package/src/view/components/layout/ButtonLayout.test.ts +28 -0
  458. package/src/view/components/layout/ButtonLayout.ts +63 -0
  459. package/src/view/components/layout/ContainerLayout.test.ts +48 -0
  460. package/src/view/components/layout/ContainerLayout.ts +50 -0
  461. package/src/view/components/layout/FrameLayout.test.ts +24 -0
  462. package/src/view/components/layout/FrameLayout.ts +25 -0
  463. package/src/view/components/ui/BigButton.test.ts +28 -0
  464. package/src/view/components/ui/BigButton.ts +31 -0
  465. package/src/view/components/ui/Button.test.ts +30 -0
  466. package/src/view/components/ui/Button.ts +30 -0
  467. package/src/view/components/ui/Canvas.test.ts +32 -0
  468. package/src/view/components/ui/Canvas.ts +34 -0
  469. package/src/view/components/ui/SmallButton.test.ts +48 -0
  470. package/src/view/components/ui/SmallButton.ts +32 -0
  471. package/src/view/theme/applyColors.test.ts +47 -0
  472. package/src/view/theme/applyColors.ts +38 -0
  473. package/src/view/theme/dimensions.test.ts +34 -0
  474. package/src/view/theme/dimensions.ts +53 -0
  475. package/tsconfig.json +16 -0
  476. package/vitest.config.ts +14 -0
  477. package/webpack.config.js +133 -0
@@ -0,0 +1,25 @@
1
+ import p5 from 'p5';
2
+ import configs from '../../../config/configs';
3
+
4
+ /**
5
+ * Creates the decorative frame for the game.
6
+ *
7
+ * Adds a visual frame around the game area and includes the branding text "Brick Game".
8
+ *
9
+ * @param p - The p5 instance.
10
+ * @param container - The parent container element.
11
+ * @returns The created frame element.
12
+ */
13
+ export default function FrameLayout(p: p5, container: p5.Element): p5.Element {
14
+ const frame = p.createDiv();
15
+ frame.parent(container);
16
+ frame.id(configs.selectors.viewElementIds.frame);
17
+
18
+ const div = p.createDiv();
19
+ div.parent(frame);
20
+
21
+ const paragraph = p.createP('Brick Game');
22
+ paragraph.parent(div);
23
+
24
+ return frame;
25
+ }
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import type p5 from 'p5';
3
+ import BigButton from './BigButton';
4
+
5
+ describe('BigButton', () => {
6
+ it('should create a large button with requested label', () => {
7
+ // [ARRANGE]
8
+ const mockElement = {
9
+ parent: vi.fn(),
10
+ addClass: vi.fn(),
11
+ };
12
+ const mockP5 = {
13
+ createDiv: vi.fn().mockReturnValue(mockElement),
14
+ createButton: vi.fn().mockReturnValue(mockElement),
15
+ } as unknown as p5;
16
+ const mockContainer = {} as p5.Element;
17
+
18
+ // [ACT]
19
+ const result = BigButton(mockP5, mockContainer, 'Action');
20
+
21
+ // [ASSERT]
22
+ expect(mockP5.createDiv).toHaveBeenCalled();
23
+ expect(mockP5.createButton).toHaveBeenCalledWith('Action');
24
+ expect(mockElement.addClass).toHaveBeenCalledWith('lg-btn-container');
25
+ expect(mockElement.addClass).toHaveBeenCalledWith('lg-btn');
26
+ expect(result).toBe(mockElement);
27
+ });
28
+ });
@@ -0,0 +1,31 @@
1
+ import p5 from 'p5';
2
+
3
+ /**
4
+ * Creates the large action button.
5
+ *
6
+ * This button is typically used for the primary game action (e.g., rotate, fire).
7
+ * It creates a specific container and applies large button styles.
8
+ *
9
+ * @param p - The p5 instance.
10
+ * @param container - The container element to attach the button to.
11
+ * @param label - The text label for the button (currently used for aria-label or internal logic as visual label is commented out).
12
+ * @returns The created button element.
13
+ */
14
+ export default function BigButton(p: p5, container: p5.Element, label: string) {
15
+ //Container
16
+ const buttonContainer = p.createDiv();
17
+ buttonContainer.parent(container);
18
+ buttonContainer.addClass('lg-btn-container');
19
+
20
+ // //Label
21
+ // const paragraph = p.createP(label);
22
+ // paragraph.parent(buttonContainer);
23
+ // paragraph.addClass('lg-btn-p');
24
+
25
+ //Button
26
+ const button = p.createButton(label);
27
+ button.parent(buttonContainer);
28
+ button.addClass('lg-btn');
29
+
30
+ return button;
31
+ }
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import type p5 from 'p5';
3
+ import Button from './Button';
4
+
5
+ describe('Button', () => {
6
+ it('should create a button with requested label and classes', () => {
7
+ // [ARRANGE]
8
+ const mockElement = {
9
+ parent: vi.fn(),
10
+ addClass: vi.fn(),
11
+ };
12
+ const mockP5 = {
13
+ createDiv: vi.fn().mockReturnValue(mockElement),
14
+ createButton: vi.fn().mockReturnValue(mockElement),
15
+ } as unknown as p5;
16
+ const mockContainer = {} as p5.Element;
17
+
18
+ // [ACT]
19
+ const result = Button(mockP5, mockContainer, 'UP');
20
+
21
+ // [ASSERT]
22
+ expect(mockP5.createDiv).toHaveBeenCalled();
23
+ expect(mockP5.createButton).toHaveBeenCalledWith('UP');
24
+ expect(mockElement.parent).toHaveBeenCalledWith(mockContainer); // Div parent
25
+ expect(mockElement.parent).toHaveBeenCalledWith(mockElement); // Button parent (self-referencing mock)
26
+ expect(mockElement.addClass).toHaveBeenCalledWith('btn-container');
27
+ expect(mockElement.addClass).toHaveBeenCalledWith('btn');
28
+ expect(result).toBe(mockElement);
29
+ });
30
+ });
@@ -0,0 +1,30 @@
1
+ import p5 from 'p5';
2
+
3
+ /**
4
+ * Creates a standard directional button.
5
+ *
6
+ * These buttons are used for the D-pad controls (Up, Down, Left, Right).
7
+ *
8
+ * @param p - The p5 instance.
9
+ * @param container - The container element to attach the button to.
10
+ * @param label - The text label for the button.
11
+ * @returns The created button element.
12
+ */
13
+ export default function Button(p: p5, container: p5.Element, label: string) {
14
+ //Container
15
+ const buttonContainer = p.createDiv();
16
+ buttonContainer.parent(container);
17
+ buttonContainer.addClass('btn-container');
18
+
19
+ //Button
20
+ const button = p.createButton(label);
21
+ button.parent(buttonContainer);
22
+ button.addClass('btn');
23
+
24
+ //Label
25
+ // const paragraph = p.createP(label);
26
+ // paragraph.parent(buttonContainer);
27
+ // paragraph.addClass('btn-p');
28
+
29
+ return button;
30
+ }
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import type p5 from 'p5';
3
+ import Canvas from './Canvas';
4
+
5
+ describe('Canvas', () => {
6
+ it('should create a canvas with calculated dimensions from configs', () => {
7
+ // [ARRANGE]
8
+ const mockElement = {
9
+ parent: vi.fn(),
10
+ id: vi.fn(),
11
+ };
12
+ const mockP5 = {
13
+ createCanvas: vi.fn().mockReturnValue(mockElement),
14
+ } as unknown as p5;
15
+ const mockContainer = {} as p5.Element;
16
+
17
+ // Ratios from actual configs: widthRatio: 0.7, aspectRatio: 1.114
18
+ const width = 500;
19
+ const expectedWidth = 500 * 0.7; // 350
20
+ const expectedHeight = expectedWidth * 1.114; // 389.9
21
+
22
+ // [ACT]
23
+ const result = Canvas(mockP5, mockContainer, width);
24
+
25
+ // [ASSERT]
26
+ expect(mockP5.createCanvas).toHaveBeenCalledWith(expectedWidth, expectedHeight);
27
+ expect(mockElement.parent).toHaveBeenCalledWith(mockContainer);
28
+ expect(mockElement.id).toHaveBeenCalledWith('brick-game-canvas');
29
+ expect(result.canvasWidth).toBe(expectedWidth);
30
+ expect(result.canvasHeight).toBe(expectedHeight);
31
+ });
32
+ });
@@ -0,0 +1,34 @@
1
+ import p5 from 'p5';
2
+
3
+ import configs from '../../../config/configs';
4
+
5
+ /**
6
+ * Response object containing canvas dimensions and element reference.
7
+ */
8
+ interface CanvasResponse {
9
+ canvasWidth: number;
10
+ canvasHeight: number;
11
+ canvas: p5.Element;
12
+ }
13
+
14
+ /**
15
+ * Creates the main p5 canvas for rendering the game.
16
+ *
17
+ * It calculates the canvas size based on the provided container width, maintaining a specific aspect ratio
18
+ * defined by `configs.viewLayout.canvas.aspectRatio`.
19
+ *
20
+ * @param {p5} p - The p5 instance.
21
+ * @param {p5.Element} container - The frame container to attach the canvas to.
22
+ * @param {number} width - The width of the outer container, used to calculate canvas dimensions with `configs.viewLayout.canvas.widthRatio`.
23
+ * @returns {CanvasResponse} Object containing the canvas element and its calculated dimensions.
24
+ */
25
+ export default function Canvas(p: p5, container: p5.Element, width: number): CanvasResponse {
26
+ const canvasWidth = width * configs.viewLayout.canvas.widthRatio;
27
+ const canvasHeight = canvasWidth * configs.viewLayout.canvas.aspectRatio;
28
+
29
+ const canvas = p.createCanvas(canvasWidth, canvasHeight);
30
+ canvas.parent(container);
31
+ canvas.id(configs.selectors.viewElementIds.canvas);
32
+
33
+ return { canvasWidth, canvasHeight, canvas };
34
+ }
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import type p5 from 'p5';
3
+ import SmallButton from './SmallButton';
4
+
5
+ describe('SmallButton', () => {
6
+ it('should create a small button with paragraph label', () => {
7
+ // [ARRANGE]
8
+ const mockElement = {
9
+ parent: vi.fn(),
10
+ addClass: vi.fn(),
11
+ };
12
+ const mockP5 = {
13
+ createDiv: vi.fn().mockReturnValue(mockElement),
14
+ createButton: vi.fn().mockReturnValue(mockElement),
15
+ createP: vi.fn().mockReturnValue(mockElement),
16
+ } as unknown as p5;
17
+ const mockContainer = {} as p5.Element;
18
+
19
+ // [ACT]
20
+ const result = SmallButton(mockP5, mockContainer, 'Reset', true);
21
+
22
+ // [ASSERT]
23
+ expect(mockP5.createDiv).toHaveBeenCalled();
24
+ expect(mockP5.createButton).toHaveBeenCalledWith('');
25
+ expect(mockP5.createP).toHaveBeenCalledWith('Reset');
26
+ expect(mockElement.addClass).toHaveBeenCalledWith('sm-btn-container');
27
+ expect(mockElement.addClass).toHaveBeenCalledWith('sm-btn-container-top');
28
+ expect(mockElement.addClass).toHaveBeenCalledWith('sm-btn');
29
+ expect(mockElement.addClass).toHaveBeenCalledWith('sm-btn-p');
30
+ expect(result).toBe(mockElement);
31
+ });
32
+
33
+ it('should use bottom class when top is false', () => {
34
+ // [ARRANGE]
35
+ const mockElement = { parent: vi.fn(), addClass: vi.fn() };
36
+ const mockP5 = {
37
+ createDiv: vi.fn().mockReturnValue(mockElement),
38
+ createButton: vi.fn().mockReturnValue(mockElement),
39
+ createP: vi.fn().mockReturnValue(mockElement),
40
+ } as unknown as p5;
41
+
42
+ // [ACT]
43
+ SmallButton(mockP5, {} as p5.Element, 'Test', false);
44
+
45
+ // [ASSERT]
46
+ expect(mockElement.addClass).toHaveBeenCalledWith('sm-btn-container-bottom');
47
+ });
48
+ });
@@ -0,0 +1,32 @@
1
+ import p5 from 'p5';
2
+
3
+ /**
4
+ * Creates a small system button (e.g., Reset, Sound).
5
+ *
6
+ * These buttons have a distinct style and include a visible paragraph label next to them.
7
+ *
8
+ * @param {p5} p - The p5 instance.
9
+ * @param {p5.Element} container - The container element to attach the button to.
10
+ * @param {string} label - The visible text label displayed near the button.
11
+ * @param {boolean} top - Determines position/styling nuance (e.g. if it belongs to the top row of small buttons).
12
+ * @returns {p5.Element} The created button element.
13
+ */
14
+ export default function SmallButton(p: p5, container: p5.Element, label: string, top: boolean) {
15
+ //Container
16
+ const buttonContainer = p.createDiv();
17
+ buttonContainer.parent(container);
18
+ buttonContainer.addClass('sm-btn-container');
19
+ buttonContainer.addClass(top ? 'sm-btn-container-top' : 'sm-btn-container-bottom');
20
+
21
+ //Button
22
+ const button = p.createButton('');
23
+ button.parent(buttonContainer);
24
+ button.addClass('sm-btn');
25
+
26
+ //Label
27
+ const paragraph = p.createP(label);
28
+ paragraph.parent(buttonContainer);
29
+ paragraph.addClass('sm-btn-p');
30
+
31
+ return button;
32
+ }
@@ -0,0 +1,47 @@
1
+ /** @vitest-environment jsdom */
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import applyColors from './applyColors';
4
+
5
+ describe('applyColors', () => {
6
+ let root: HTMLElement;
7
+
8
+ beforeEach(() => {
9
+ // Setup JSDOM :root element styles
10
+ root = document.documentElement;
11
+ root.style.cssText = '';
12
+
13
+ // Default location mock
14
+ vi.stubGlobal('location', {
15
+ href: 'http://localhost/',
16
+ });
17
+ });
18
+
19
+ it('should apply default colors when no query params are present', () => {
20
+ // [ACT]
21
+ applyColors();
22
+
23
+ // [ASSERT]
24
+ // Default bodyMain is rgb(0, 68, 187)
25
+ expect(root.style.getPropertyValue('--main-color')).toBe('rgb(0, 68, 187)');
26
+ expect(root.style.getPropertyValue('--button-color')).toBe('rgb(247, 222, 57)');
27
+ });
28
+
29
+ it('should apply colors from query parameters', () => {
30
+ // [ARRANGE]
31
+ // body-color and button-color are the keys in configs
32
+ vi.stubGlobal('location', {
33
+ href: 'http://localhost/?body-color=%23ff0000&button-color=%2300ff00',
34
+ });
35
+
36
+ // [ACT]
37
+ applyColors();
38
+
39
+ // [ASSERT]
40
+ // JSDOM might return rgb(255, 0, 0) for #ff0000
41
+ const mainColor = root.style.getPropertyValue('--main-color');
42
+ expect(mainColor === '#ff0000' || mainColor === 'rgb(255, 0, 0)').toBe(true);
43
+
44
+ const buttonColor = root.style.getPropertyValue('--button-color');
45
+ expect(buttonColor === '#00ff00' || buttonColor === 'rgb(0, 255, 0)').toBe(true);
46
+ });
47
+ });
@@ -0,0 +1,38 @@
1
+ import { colord } from 'colord';
2
+
3
+ import configs from '../../config/configs';
4
+
5
+ // prettier-ignore
6
+ /**
7
+ * Applies color themes to the application by setting CSS variables.
8
+ *
9
+ * It checks for `configs.inputQueryParams.mainColor` and `configs.inputQueryParams.buttonColor` query parameters in the URL.
10
+ * If present, these values are used; otherwise, default `configs.colors` are applied.
11
+ * It also calculates and sets shadow and reflection variations for these colors.
12
+ *
13
+ * @returns {void}
14
+ */
15
+ export default function applyColors() {
16
+ const root: HTMLElement = document.querySelector(':root');
17
+
18
+ const paramsString = window.location.href.substring(
19
+ window.location.href.indexOf('?') + 1,
20
+ );
21
+ const searchParams = new URLSearchParams(paramsString);
22
+
23
+ const mainColor = searchParams.has(configs.inputQueryParams.mainColor)
24
+ ? searchParams.get(configs.inputQueryParams.mainColor)
25
+ : configs.colors.bodyMain;
26
+
27
+ const buttonColor = searchParams.has(configs.inputQueryParams.buttonColor)
28
+ ? searchParams.get(configs.inputQueryParams.buttonColor)
29
+ : configs.colors.bodyButton;
30
+
31
+ root.style.setProperty('--main-color' , mainColor);
32
+ root.style.setProperty('--button-color' , buttonColor);
33
+
34
+ root.style.setProperty('--color-shadow' , colord(mainColor) .darken(0.15).toHex());
35
+ root.style.setProperty('--color-shadow-reflexion', colord(mainColor) .lighten(0.15).toHex());
36
+ root.style.setProperty('--button-color-reflexion', colord(buttonColor).lighten(0.15).toHex());
37
+ root.style.setProperty('--button-color-shadow' , colord(buttonColor).darken(0.15).toHex());
38
+ }
@@ -0,0 +1,34 @@
1
+ /** @vitest-environment jsdom */
2
+ import { describe, it, expect, beforeEach } from 'vitest';
3
+ import dimensions from './dimensions';
4
+
5
+ describe('dimensions', () => {
6
+ let root: HTMLElement;
7
+
8
+ beforeEach(() => {
9
+ root = document.documentElement;
10
+ // Clear properties
11
+ root.style.cssText = '';
12
+ });
13
+
14
+ it('should set CSS variables based on input dimensions', () => {
15
+ // [ARRANGE]
16
+ const width = 400;
17
+ const height = 800;
18
+ const canvasWidth = 300;
19
+ const canvasHeight = 600;
20
+
21
+ // [ACT]
22
+ dimensions(width, height, canvasWidth, canvasHeight);
23
+
24
+ // [ASSERT]
25
+ expect(root.style.getPropertyValue('--width')).toBe('400px');
26
+ expect(root.style.getPropertyValue('--height')).toBe('800px');
27
+ expect(root.style.getPropertyValue('--canvas-width')).toBe('300px');
28
+ expect(root.style.getPropertyValue('--canvas-height')).toBe('600px');
29
+
30
+ // Multiplier from configs: 1.9
31
+ // borderRadiusRatio: 0.05 -> 400 * 0.05 = 20px
32
+ expect(root.style.getPropertyValue('--border-radius')).toBe('20px');
33
+ });
34
+ });
@@ -0,0 +1,53 @@
1
+ import configs from '../../config/configs';
2
+
3
+ // prettier-ignore
4
+ /**
5
+ * Calculates and sets various CSS variables for responsive sizing of the game UI.
6
+ *
7
+ * This function defines sizes for the main container, canvas, borders, buttons (including mobile variations),
8
+ * and fonts based on the provided dimensions.
9
+ *
10
+ * @param width - The width of the game container.
11
+ * @param height - The height of the game container.
12
+ * @param canvasWidth - The width of the game canvas.
13
+ * @param canvasHeight - The height of the game canvas.
14
+ * @returns
15
+ */
16
+ export default function dimensions(
17
+ width: number,
18
+ height: number,
19
+ canvasWidth: number,
20
+ canvasHeight: number,
21
+ ) {
22
+ const root: HTMLElement = document.querySelector(':root');
23
+
24
+ root.style.setProperty('--dispersion' , configs.viewLayout.shadowDispersion);
25
+
26
+ root.style.setProperty('--width' , `${width}px`);
27
+ root.style.setProperty('--height' , `${height}px`);
28
+
29
+ root.style.setProperty('--canvas-width' , `${canvasWidth}px`);
30
+ root.style.setProperty('--canvas-height' , `${canvasHeight}px`);
31
+
32
+ root.style.setProperty('--border-radius' , `${width * configs.viewLayout.dimensions.borderRadiusRatio}px`);
33
+ root.style.setProperty('--border' , `${width * configs.viewLayout.dimensions.borderWidthRatio}px solid black`);
34
+
35
+ root.style.setProperty('--sm-button-size' , `${width * configs.viewLayout.dimensions.button.smSizeRatio}px`);
36
+ root.style.setProperty('--button-size' , `${width * configs.viewLayout.dimensions.button.mdSizeRatio}px`);
37
+ root.style.setProperty('--lg-button-size' , `${width * configs.viewLayout.dimensions.button.lgSizeRatio}px`);
38
+
39
+ root.style.setProperty('--sm-button-size-mobile' , `${width * configs.viewLayout.dimensions.button.mobile.smSizeRatio}px`);
40
+ root.style.setProperty('--button-size-mobile' , `${width * configs.viewLayout.dimensions.button.mobile.mdSizeRatio}px`);
41
+ root.style.setProperty('--lg-button-size-mobile' , `${width * configs.viewLayout.dimensions.button.mobile.lgSizeRatio}px`);
42
+
43
+ root.style.setProperty('--sm-button-size-mobile-font-size' , `${width * configs.viewLayout.dimensions.button.mobile.smFontRatio}px`);
44
+ root.style.setProperty('--sm-button-size-mobile-line-height' , `${width * configs.viewLayout.dimensions.button.mobile.smFontRatio}px`);
45
+
46
+ root.style.setProperty('--button-size-mobile-font-size' , `${width * configs.viewLayout.dimensions.button.mobile.fontRatio}px`);
47
+ root.style.setProperty('--lg-button-size-mobile-font-size' , `${width * configs.viewLayout.dimensions.button.mobile.lgFontRatio}px`);
48
+
49
+ root.style.setProperty('--button-size-mobile-spacing' , `${width * configs.viewLayout.dimensions.button.mobile.spacingRatio}px`);
50
+
51
+ root.style.setProperty('--button-border' , `${width * configs.viewLayout.dimensions.button.borderRatio}px solid black`);
52
+ root.style.setProperty('--button-animation-duration' , configs.viewLayout.dimensions.button.animationDuration);
53
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "./dist/",
4
+ "noImplicitAny": true,
5
+ "module": "ESNext",
6
+ "target": "es5",
7
+ "jsx": "react",
8
+ "allowJs": true,
9
+ "moduleResolution": "node",
10
+ "resolveJsonModule": true,
11
+ "skipLibCheck": true,
12
+ "types": ["node", "webpack-env", "p5"],
13
+ "declaration": true
14
+ },
15
+ "include": ["src/**/*"]
16
+ }
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import path from 'path';
3
+
4
+ export default defineConfig({
5
+ resolve: {
6
+ alias: {
7
+ '@client-game': path.resolve(__dirname, './src/core/Game.ts'),
8
+ },
9
+ },
10
+ test: {
11
+ globals: true,
12
+ environment: 'node',
13
+ },
14
+ });
@@ -0,0 +1,133 @@
1
+ const HtmlWebpackPlugin = require('html-webpack-plugin');
2
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
3
+ const CopyWebpackPlugin = require('copy-webpack-plugin');
4
+ const path = require('path');
5
+ const webpack = require('webpack');
6
+ const dotenv = require('dotenv');
7
+ const fs = require('fs');
8
+
9
+ module.exports = (env = {}, argv) => {
10
+ const isProduction = argv.mode === 'production';
11
+ const appMode = env.mode || 'server'; // 'server' or 'client'
12
+ const clientGamePath = env.game ? path.resolve(process.cwd(), env.game) : path.resolve(__dirname, 'src/menu/GameMenu.ts');
13
+
14
+ // Load .env files, .env.local takes precedence.
15
+ const envFileLocal = path.resolve(__dirname, '.env.local');
16
+ const envFile = path.resolve(__dirname, '.env');
17
+
18
+ let envConfig = {};
19
+ if (fs.existsSync(envFile)) {
20
+ Object.assign(envConfig, dotenv.config({ path: envFile }).parsed);
21
+ }
22
+ if (fs.existsSync(envFileLocal)) {
23
+ Object.assign(envConfig, dotenv.config({ path: envFileLocal }).parsed);
24
+ }
25
+
26
+ // Fallback logic for webpack
27
+ const SUPABASE_URL = process.env.SUPABASE_URL || envConfig.SUPABASE_URL || 'http://127.0.0.1:54321';
28
+ const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY || envConfig.SUPABASE_ANON_KEY || '';
29
+
30
+ return {
31
+ mode: isProduction ? 'production' : 'development',
32
+ entry: {
33
+ 'brick-engine': './src/index.ts',
34
+ app: './src/main.ts',
35
+ },
36
+ devtool: isProduction ? 'source-map' : 'eval-source-map',
37
+ output: {
38
+ filename: '[name].js',
39
+ path: path.resolve(__dirname, 'dist'),
40
+ clean: true, // Clean the output directory before emit.
41
+ publicPath: 'auto',
42
+ library: {
43
+ name: 'BrickEngine',
44
+ type: 'umd',
45
+ },
46
+ },
47
+ externals: {
48
+ p5: 'p5',
49
+ },
50
+ module: {
51
+ rules: [
52
+ {
53
+ test: /\.ts$/,
54
+ use: 'ts-loader',
55
+ exclude: /node_modules/,
56
+ },
57
+ {
58
+ test: /\.css$/i,
59
+ use: [
60
+ {
61
+ loader: MiniCssExtractPlugin.loader,
62
+ options: {
63
+ publicPath: '../', // CSS is in css/ folder, needs to go up to find images/fonts
64
+ },
65
+ },
66
+ 'css-loader',
67
+ ],
68
+ },
69
+ {
70
+ test: /\.(woff|woff2|eot|ttf|otf)$/i, // Fonts (Required for CSS url() resolution)
71
+ type: 'asset/resource',
72
+ generator: {
73
+ filename: 'fonts/[name][ext]',
74
+ },
75
+ },
76
+ ],
77
+ },
78
+ resolve: {
79
+ extensions: ['.tsx', '.ts', '.js', '.css', '.wav', '.png', '.ico', '.gif', '.json', '.svg', '.webmanifest'],
80
+ alias: {
81
+ '@client-game': clientGamePath,
82
+ },
83
+ },
84
+ devServer: {
85
+ static: [
86
+ {
87
+ directory: path.resolve(__dirname, 'dist'),
88
+ },
89
+ ],
90
+ port: 9000,
91
+ open: true,
92
+ hot: true,
93
+ historyApiFallback: true,
94
+ },
95
+ plugins: [
96
+ new webpack.DefinePlugin({
97
+ 'process.env.APP_MODE': JSON.stringify(appMode),
98
+ 'process.env.SUPABASE_URL': JSON.stringify(SUPABASE_URL),
99
+ 'process.env.SUPABASE_ANON_KEY': JSON.stringify(SUPABASE_ANON_KEY),
100
+ }),
101
+ new HtmlWebpackPlugin({
102
+ template: './public/index.html',
103
+ filename: 'index.html', // Output file name
104
+ favicon: './public/favicon.ico',
105
+ inject: 'body',
106
+ chunks: ['app'], // Only inject the app bundle, not the library
107
+ minify: isProduction
108
+ ? {
109
+ removeComments: true,
110
+ collapseWhitespace: true,
111
+ removeAttributeQuotes: true,
112
+ }
113
+ : false,
114
+ }),
115
+ new MiniCssExtractPlugin({
116
+ filename: isProduction ? 'css/[name].[contenthash].css' : 'css/[name].bundle.css',
117
+ }),
118
+ new CopyWebpackPlugin({
119
+ patterns: [
120
+ { from: 'node_modules/p5/lib/p5.min.js', to: 'vendor/p5.min.js' },
121
+ { from: 'public/images', to: 'images' },
122
+ { from: 'public/sounds', to: 'sounds' },
123
+ { from: 'public/docs', to: 'docs' },
124
+ { from: 'public/favicon.ico', to: './' },
125
+ { from: 'public/CNAME', to: './' },
126
+ ],
127
+ }),
128
+ ],
129
+ optimization: {
130
+ minimize: isProduction,
131
+ },
132
+ };
133
+ };