brick-engine-js 1.0.1 → 1.0.3

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 (131) hide show
  1. package/dist/docs/GAME_DEVELOPER_GUIDE.html +1 -1
  2. package/dist/docs/brick-engine-guide.html +1 -1
  3. package/dist/docs/getting-started.html +1 -1
  4. package/dist/docs/jsdoc_standard.html +1 -1
  5. package/dist/docs/publishing.html +1 -1
  6. package/dist/docs/reference/interfaces/modules/Session.html +1 -1
  7. package/dist/docs/reference/modules/GameMenu.html +1 -1
  8. package/dist/docs/reference/modules/GameSession.html +1 -1
  9. package/dist/docs/reference/modules/InitialStateSnapshot.html +1 -1
  10. package/dist/docs/reference/modules/SessionModal.html +1 -1
  11. package/dist/docs/testing_best_practices.html +1 -1
  12. package/package.json +8 -1
  13. package/public/docs/GAME_DEVELOPER_GUIDE.html +1 -1
  14. package/public/docs/brick-engine-guide.html +1 -1
  15. package/public/docs/getting-started.html +1 -1
  16. package/public/docs/jsdoc_standard.html +1 -1
  17. package/public/docs/publishing.html +1 -1
  18. package/public/docs/reference/interfaces/modules/Session.html +1 -1
  19. package/public/docs/reference/modules/GameMenu.html +1 -1
  20. package/public/docs/reference/modules/GameSession.html +1 -1
  21. package/public/docs/reference/modules/InitialStateSnapshot.html +1 -1
  22. package/public/docs/reference/modules/SessionModal.html +1 -1
  23. package/public/docs/testing_best_practices.html +1 -1
  24. package/.env.local.example +0 -2
  25. package/.github/workflows/publish.yml +0 -73
  26. package/.prettierignore +0 -2
  27. package/.prettierrc.json +0 -8
  28. package/eslint.config.mjs +0 -29
  29. package/scripts/generate-diagrams.sh +0 -20
  30. package/scripts/generate-docs.js +0 -111
  31. package/src/client-game.d.ts +0 -1
  32. package/src/config/configs.test.ts +0 -20
  33. package/src/config/configs.ts +0 -197
  34. package/src/config/env.test.ts +0 -59
  35. package/src/config/env.ts +0 -7
  36. package/src/config/styles.ts +0 -5
  37. package/src/core/Game.test.ts +0 -167
  38. package/src/core/Game.ts +0 -307
  39. package/src/core/InitialStateSnapshot.test.ts +0 -51
  40. package/src/core/InitialStateSnapshot.ts +0 -46
  41. package/src/core/helpers/CellHelper.test.ts +0 -33
  42. package/src/core/helpers/CellHelper.ts +0 -21
  43. package/src/core/helpers/ControlInputHandlerHelper.test.ts +0 -116
  44. package/src/core/helpers/ControlInputHandlerHelper.ts +0 -68
  45. package/src/core/helpers/CoordinateHelper.test.ts +0 -113
  46. package/src/core/helpers/CoordinateHelper.ts +0 -82
  47. package/src/core/helpers/InterfaceIdentifierHelper.test.ts +0 -122
  48. package/src/core/helpers/InterfaceIdentifierHelper.ts +0 -43
  49. package/src/core/helpers/RelativeValuesHelper.test.ts +0 -47
  50. package/src/core/helpers/RelativeValuesHelper.ts +0 -29
  51. package/src/core/module/control/GameControl.test.ts +0 -82
  52. package/src/core/module/control/GameControl.ts +0 -142
  53. package/src/core/module/control/GameControlKeyBinding.test.ts +0 -59
  54. package/src/core/module/control/GameControlKeyBinding.ts +0 -92
  55. package/src/core/module/grid/GameGrid.test.ts +0 -83
  56. package/src/core/module/grid/GameGrid.ts +0 -610
  57. package/src/core/module/grid/GameHudGrid.test.ts +0 -22
  58. package/src/core/module/grid/GameHudGrid.ts +0 -40
  59. package/src/core/module/grid/engines/GridAnalysisEngine.test.ts +0 -157
  60. package/src/core/module/grid/engines/GridAnalysisEngine.ts +0 -124
  61. package/src/core/module/grid/engines/GridLineEngine.test.ts +0 -132
  62. package/src/core/module/grid/engines/GridLineEngine.ts +0 -165
  63. package/src/core/module/grid/engines/GridMovementEngine.test.ts +0 -125
  64. package/src/core/module/grid/engines/GridMovementEngine.ts +0 -113
  65. package/src/core/module/grid/engines/GridRegionEngine.test.ts +0 -136
  66. package/src/core/module/grid/engines/GridRegionEngine.ts +0 -52
  67. package/src/core/module/grid/engines/GridTransformEngine.test.ts +0 -98
  68. package/src/core/module/grid/engines/GridTransformEngine.ts +0 -70
  69. package/src/core/module/renderer/DisplayRenderer.test.ts +0 -86
  70. package/src/core/module/renderer/DisplayRenderer.ts +0 -152
  71. package/src/core/module/renderer/GameRenderer.test.ts +0 -103
  72. package/src/core/module/renderer/GameRenderer.ts +0 -144
  73. package/src/core/module/renderer/HudRenderer.test.ts +0 -108
  74. package/src/core/module/renderer/HudRenderer.ts +0 -203
  75. package/src/core/module/score/GameScore.test.ts +0 -71
  76. package/src/core/module/score/GameScore.ts +0 -188
  77. package/src/core/module/session/GameSession.test.ts +0 -176
  78. package/src/core/module/session/GameSession.ts +0 -103
  79. package/src/core/module/sound/GameSound.test.ts +0 -117
  80. package/src/core/module/sound/GameSound.ts +0 -229
  81. package/src/core/module/state/GameState.test.ts +0 -101
  82. package/src/core/module/state/GameState.ts +0 -339
  83. package/src/core/module/text/GameText.test.ts +0 -87
  84. package/src/core/module/text/GameText.ts +0 -150
  85. package/src/core/module/time/GameTime.test.ts +0 -86
  86. package/src/core/module/time/GameTime.ts +0 -144
  87. package/src/core/types/Interfaces.ts +0 -59
  88. package/src/core/types/Types.ts +0 -124
  89. package/src/core/types/enums.ts +0 -113
  90. package/src/core/types/modules.ts +0 -841
  91. package/src/index.test.ts +0 -15
  92. package/src/index.ts +0 -9
  93. package/src/main.test.ts +0 -137
  94. package/src/main.ts +0 -77
  95. package/src/menu/GameMenu.test.ts +0 -157
  96. package/src/menu/GameMenu.ts +0 -124
  97. package/src/menu/GameMenuSingleton.test.ts +0 -26
  98. package/src/menu/GameMenuSingleton.ts +0 -13
  99. package/src/menu/GameRepository.test.ts +0 -46
  100. package/src/menu/GameRepository.ts +0 -47
  101. package/src/menu/manager/GameManager.test.ts +0 -68
  102. package/src/menu/manager/GameManager.ts +0 -50
  103. package/src/types/global.d.ts +0 -8
  104. package/src/types/interfaces.ts +0 -5
  105. package/src/view/Debugger.test.ts +0 -152
  106. package/src/view/Debugger.ts +0 -124
  107. package/src/view/GameView.test.ts +0 -95
  108. package/src/view/GameView.ts +0 -244
  109. package/src/view/SessionModal.test.ts +0 -141
  110. package/src/view/SessionModal.ts +0 -73
  111. package/src/view/components/layout/ButtonLayout.test.ts +0 -28
  112. package/src/view/components/layout/ButtonLayout.ts +0 -63
  113. package/src/view/components/layout/ContainerLayout.test.ts +0 -48
  114. package/src/view/components/layout/ContainerLayout.ts +0 -50
  115. package/src/view/components/layout/FrameLayout.test.ts +0 -24
  116. package/src/view/components/layout/FrameLayout.ts +0 -25
  117. package/src/view/components/ui/BigButton.test.ts +0 -28
  118. package/src/view/components/ui/BigButton.ts +0 -31
  119. package/src/view/components/ui/Button.test.ts +0 -30
  120. package/src/view/components/ui/Button.ts +0 -30
  121. package/src/view/components/ui/Canvas.test.ts +0 -32
  122. package/src/view/components/ui/Canvas.ts +0 -34
  123. package/src/view/components/ui/SmallButton.test.ts +0 -48
  124. package/src/view/components/ui/SmallButton.ts +0 -32
  125. package/src/view/theme/applyColors.test.ts +0 -47
  126. package/src/view/theme/applyColors.ts +0 -38
  127. package/src/view/theme/dimensions.test.ts +0 -34
  128. package/src/view/theme/dimensions.ts +0 -53
  129. package/tsconfig.json +0 -16
  130. package/vitest.config.ts +0 -14
  131. package/webpack.config.js +0 -133
@@ -1,59 +0,0 @@
1
- /** @vitest-environment jsdom */
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- import GameControlKeyBinding from './GameControlKeyBinding';
4
- import { Control } from '../../types/modules';
5
- import { ControlKey } from '../../types/enums';
6
-
7
- describe('GameControlKeyBinding', () => {
8
- let binding: GameControlKeyBinding;
9
- let mockControl: Control;
10
-
11
- beforeEach(() => {
12
- mockControl = {
13
- notify: vi.fn(),
14
- } as unknown as Control;
15
-
16
- binding = new GameControlKeyBinding(mockControl);
17
- });
18
-
19
- it('should bind and unbind window events', () => {
20
- const addSpy = vi.spyOn(window, 'addEventListener');
21
- const removeSpy = vi.spyOn(window, 'removeEventListener');
22
-
23
- binding.bindControls();
24
- expect(addSpy).toHaveBeenCalledWith('keydown', expect.any(Function));
25
-
26
- binding.unbindControls();
27
- expect(removeSpy).toHaveBeenCalledWith('keydown', expect.any(Function));
28
- });
29
-
30
- it('should trigger control press on valid key down', () => {
31
- binding.bindControls();
32
-
33
- // Simulating KeyboardEvent
34
- const event = new KeyboardEvent('keydown', { code: 'ArrowUp' });
35
- window.dispatchEvent(event);
36
-
37
- expect(mockControl.notify).toHaveBeenCalledWith(ControlKey.UP, 'pressed');
38
- });
39
-
40
- it('should ignore repeated native key down events', () => {
41
- binding.bindControls();
42
-
43
- const event = new KeyboardEvent('keydown', { code: 'ArrowUp', repeat: true } as KeyboardEventInit);
44
- window.dispatchEvent(event);
45
-
46
- expect(mockControl.notify).not.toHaveBeenCalled();
47
- });
48
-
49
- it('should trigger control release on key up', () => {
50
- binding.bindControls();
51
-
52
- const event = new KeyboardEvent('keyup', { code: 'ArrowLeft' });
53
- window.dispatchEvent(event);
54
-
55
- // ControlInputHandler doesn't notify on release directly but we can verify it doesn't crash
56
- // Actually, let's verify if handleRelease was called on the handler
57
- // Since it's private, we just check if it doesn't error and maybe mock the handler if we could
58
- });
59
- });
@@ -1,92 +0,0 @@
1
- import { ControlKey } from '../../types/enums';
2
- import { Control } from '../../types/modules';
3
- import ControlInputHandler from '../../helpers/ControlInputHandlerHelper';
4
-
5
- const DEFAULT_KEY_MAP: Record<string, ControlKey> = {
6
- // Arrows
7
- ArrowUp: ControlKey.UP,
8
- ArrowDown: ControlKey.DOWN,
9
- ArrowLeft: ControlKey.LEFT,
10
- ArrowRight: ControlKey.RIGHT,
11
-
12
- // WASD
13
- KeyW: ControlKey.UP,
14
- KeyS: ControlKey.DOWN,
15
- KeyA: ControlKey.LEFT,
16
- KeyD: ControlKey.RIGHT,
17
-
18
- // Actions
19
- KeyJ: ControlKey.ACTION,
20
-
21
- // System
22
- Digit1: ControlKey.POWER,
23
- Digit2: ControlKey.START_PAUSE,
24
- Digit3: ControlKey.SOUND,
25
- Digit4: ControlKey.RESET,
26
- Digit5: ControlKey.EXIT,
27
- Digit6: ControlKey.COLOR,
28
- };
29
-
30
- /**
31
- * Handles the binding of physical keyboard events to logical control actions.
32
- * Translates Browser `KeyboardEvent`s into engine `ControlKey`s.
33
- */
34
- export default class GameControlKeyBinding {
35
- private _inputHandler: ControlInputHandler;
36
-
37
- private _boundHandleKeyDown: (event: KeyboardEvent) => void;
38
- private _boundHandleKeyUp: (event: KeyboardEvent) => void;
39
-
40
- /**
41
- * Creates an instance of GameControlKeyBinding.
42
- *
43
- * @param {Control} control - The parent control module.
44
- */
45
- constructor(control: Control) {
46
- this._inputHandler = new ControlInputHandler(control);
47
- this._boundHandleKeyDown = this._handleKeyDown.bind(this);
48
- this._boundHandleKeyUp = this._handleKeyUp.bind(this);
49
- }
50
-
51
- /**
52
- * Binds keyboard events to the global window object.
53
- */
54
- bindControls() {
55
- window.addEventListener('keydown', this._boundHandleKeyDown);
56
- window.addEventListener('keyup', this._boundHandleKeyUp);
57
- }
58
-
59
- /**
60
- * Unbinds keyboard events from the global window object.
61
- */
62
- unbindControls() {
63
- window.removeEventListener('keydown', this._boundHandleKeyDown);
64
- window.removeEventListener('keyup', this._boundHandleKeyUp);
65
- }
66
-
67
- /**
68
- * Internal handler for key down events.
69
- *
70
- * @param {KeyboardEvent} event - The browser keyboard event.
71
- */
72
- private _handleKeyDown(event: KeyboardEvent) {
73
- const controlKey = DEFAULT_KEY_MAP[event.code];
74
- if (!controlKey) return;
75
-
76
- if (event.repeat) return; // Ignore native repeat, fully delegating repeat logic to InputHandler
77
-
78
- this._inputHandler.handlePress(controlKey);
79
- }
80
-
81
- /**
82
- * Internal handler for key up events.
83
- *
84
- * @param {KeyboardEvent} event - The browser keyboard event.
85
- */
86
- private _handleKeyUp(event: KeyboardEvent) {
87
- const controlKey = DEFAULT_KEY_MAP[event.code];
88
- if (!controlKey) return;
89
-
90
- this._inputHandler.handleRelease(controlKey);
91
- }
92
- }
@@ -1,83 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import GameGrid from './GameGrid';
3
- import { Color } from '../../types/enums';
4
- import CellHelper from '../../helpers/CellHelper';
5
-
6
- describe('GameGrid', () => {
7
- let grid: GameGrid;
8
-
9
- beforeEach(() => {
10
- grid = new GameGrid();
11
- grid.setup();
12
- });
13
-
14
- describe('Core & Utilities', () => {
15
- it('should initialize with empty cells', () => {
16
- const data = grid.getGrid();
17
- expect(data.length).toBe(grid.height);
18
- expect(data[0].length).toBe(grid.width);
19
- expect(data[0][0].value).toBe(0);
20
- });
21
-
22
- it('should validate coordinates', () => {
23
- expect(grid.isValidCoordinate({ x: 0, y: 0 })).toBe(true);
24
- expect(grid.isValidCoordinate({ x: -1, y: 0 })).toBe(false);
25
- expect(grid.isValidCoordinate({ x: grid.width, y: 0 })).toBe(false);
26
- });
27
-
28
- it('should get and set cell values/colors', () => {
29
- const coord = { x: 5, y: 5 };
30
- grid.setCellValue(coord, 1);
31
- grid.setCellColor(coord, Color.RED);
32
-
33
- expect(grid.isCellActive(coord)).toBe(true);
34
- expect(grid.getCell(coord)?.color).toBe(Color.RED);
35
- });
36
-
37
- it('should return null for out of bounds cell access', () => {
38
- expect(grid.getCell({ x: -1, y: 0 })).toBeNull();
39
- });
40
- });
41
-
42
- describe('Iteration', () => {
43
- it('should iterate over all cells', () => {
44
- let count = 0;
45
- grid.forEach(() => count++);
46
- expect(count).toBe(grid.width * grid.height);
47
- });
48
- });
49
-
50
- describe('Delegation', () => {
51
- // We verify that calling grid methods calls the internal engines
52
- // Since engines are private, we can't easily mock them without reaching into internals
53
- // but given the implementation, we can just check if the methods exist and work as expected
54
- // as high-level integration tests.
55
-
56
- it('should clear full rows (delegated to line engine)', () => {
57
- // Fill a row
58
- for (let x = 0; x < grid.width; x++) grid.setCellValue({ x, y: 0 }, 1);
59
-
60
- const cleared = grid.clearFullRows();
61
- expect(cleared).toBe(1);
62
- expect(grid.isRowEmpty(0)).toBe(true);
63
- });
64
-
65
- it('should move piece (delegated to movement engine)', () => {
66
- const piece = [CellHelper.emptyCell({ x: 5, y: 5 })];
67
- piece[0].value = 1;
68
-
69
- const moved = grid.movePiece(piece, { x: 1, y: 0 });
70
- expect(moved![0].coordinate).toEqual({ x: 6, y: 5 });
71
- });
72
- });
73
-
74
- describe('Debug', () => {
75
- it('should return correct debug data', () => {
76
- grid.setCellValue({ x: 0, y: 0 }, 1);
77
- const debug = grid.getDebugData();
78
- expect(debug.activeCells).toBe(1);
79
- expect(debug.width).toBe(grid.width);
80
- expect(debug.height).toBe(grid.height);
81
- });
82
- });
83
- });