@inglorious/engine 0.1.0 → 0.2.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.
- package/README.md +39 -36
- package/package.json +20 -33
- package/src/engine/ai/movement/dynamic/align.js +63 -63
- package/src/engine/ai/movement/dynamic/arrive.js +42 -43
- package/src/engine/ai/movement/dynamic/evade.js +38 -38
- package/src/engine/ai/movement/dynamic/face.js +19 -20
- package/src/engine/ai/movement/dynamic/flee.js +45 -45
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
- package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
- package/src/engine/ai/movement/dynamic/pursue.js +38 -38
- package/src/engine/ai/movement/dynamic/seek.js +44 -44
- package/src/engine/ai/movement/dynamic/wander.js +31 -32
- package/src/engine/ai/movement/kinematic/align.js +37 -37
- package/src/engine/ai/movement/kinematic/arrive.js +42 -42
- package/src/engine/ai/movement/kinematic/face.js +19 -20
- package/src/engine/ai/movement/kinematic/flee.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
- package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
- package/src/engine/ai/movement/kinematic/wander.js +27 -27
- package/src/engine/animation/sprite.js +101 -0
- package/src/engine/animation/ticker.js +38 -0
- package/src/engine/behaviors/camera.js +68 -0
- package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
- package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
- package/src/engine/behaviors/controls/event-handlers.js +17 -0
- package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
- package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
- package/src/engine/behaviors/debug/collision.js +35 -0
- package/src/engine/behaviors/fps.js +29 -0
- package/src/engine/behaviors/fsm.js +33 -0
- package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
- package/src/engine/behaviors/game.js +15 -0
- package/src/engine/behaviors/input/controls.js +37 -0
- package/src/engine/behaviors/input/gamepad.js +114 -0
- package/src/engine/behaviors/input/input.js +48 -0
- package/src/engine/behaviors/input/keyboard.js +64 -0
- package/src/engine/behaviors/input/mouse.js +91 -0
- package/src/engine/behaviors/physics/bouncy.js +25 -0
- package/src/engine/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
- package/src/engine/behaviors/physics/jumpable.js +145 -0
- package/src/engine/behaviors/ui/button.js +17 -0
- package/src/engine/collision/detection.js +110 -115
- package/src/engine/core/api.js +34 -0
- package/src/engine/core/dev-tools.js +135 -0
- package/src/engine/core/engine.js +119 -0
- package/src/engine/core/loop.js +15 -0
- package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
- package/src/engine/{loop → core/loops}/elapsed.js +22 -23
- package/src/engine/{loop → core/loops}/fixed.js +27 -28
- package/src/engine/{loop → core/loops}/flash.js +13 -14
- package/src/engine/{loop → core/loops}/lag.js +26 -27
- package/src/engine/core/select.js +26 -0
- package/src/engine/core/store.js +178 -0
- package/src/engine/core/store.test.js +110 -0
- package/src/engine/movement/dynamic/modern.js +21 -24
- package/src/engine/movement/dynamic/tank.js +43 -43
- package/src/engine/movement/kinematic/modern.js +16 -16
- package/src/engine/movement/kinematic/modern.test.js +27 -27
- package/src/engine/movement/kinematic/tank.js +27 -27
- package/src/engine/physics/bounds.js +138 -0
- package/src/engine/physics/position.js +43 -0
- package/src/engine/physics/position.test.js +80 -0
- package/src/engine/systems/sprite-animation.js +27 -0
- package/src/main.js +10 -5
- package/src/renderers/canvas/absolute-position.js +18 -0
- package/src/renderers/canvas/camera.js +13 -0
- package/src/renderers/canvas/canvas-renderer.js +68 -0
- package/src/{ui → renderers}/canvas/character.js +38 -35
- package/src/{ui → renderers}/canvas/form/button.js +25 -25
- package/src/{ui → renderers}/canvas/fps.js +18 -18
- package/src/renderers/canvas/image/hitmask.js +51 -0
- package/src/{ui → renderers}/canvas/image/image.js +34 -37
- package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
- package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
- package/src/{ui → renderers}/canvas/mouse.js +37 -37
- package/src/renderers/canvas/rendering-system.js +79 -0
- package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
- package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
- package/src/renderers/react/game/character/index.jsx +20 -0
- package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
- package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
- package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
- package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
- package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
- package/src/{ui → renderers}/react/game/game.jsx +72 -71
- package/src/{ui → renderers}/react/game/index.jsx +29 -29
- package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
- package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
- package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
- package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
- package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
- package/src/{ui → renderers}/react/index.jsx +9 -9
- package/src/utils/algorithms/decision-tree.js +24 -24
- package/src/utils/algorithms/decision-tree.test.js +153 -102
- package/src/utils/algorithms/path-finding.js +155 -155
- package/src/utils/algorithms/path-finding.test.js +151 -151
- package/src/utils/data-structures/array.js +83 -83
- package/src/utils/data-structures/array.test.js +173 -173
- package/src/utils/data-structures/board.js +159 -159
- package/src/utils/data-structures/board.test.js +242 -242
- package/src/utils/data-structures/boolean.js +9 -9
- package/src/utils/data-structures/heap.js +164 -164
- package/src/utils/data-structures/heap.test.js +103 -103
- package/src/utils/data-structures/object.js +138 -102
- package/src/utils/data-structures/object.test.js +218 -121
- package/src/utils/data-structures/objects.js +66 -48
- package/src/utils/data-structures/objects.test.js +99 -99
- package/src/utils/data-structures/tree.js +36 -36
- package/src/utils/data-structures/tree.test.js +33 -33
- package/src/utils/functions/functions.js +19 -19
- package/src/utils/functions/functions.test.js +23 -23
- package/src/utils/math/geometry/circle.js +70 -117
- package/src/utils/math/geometry/circle.test.js +97 -97
- package/src/utils/math/geometry/hitmask.js +70 -39
- package/src/utils/math/geometry/hitmask.test.js +155 -84
- package/src/utils/math/geometry/line.js +35 -35
- package/src/utils/math/geometry/line.test.js +49 -49
- package/src/utils/math/geometry/point.js +78 -71
- package/src/utils/math/geometry/point.test.js +81 -81
- package/src/utils/math/geometry/rectangle.js +76 -45
- package/src/utils/math/geometry/rectangle.test.js +42 -42
- package/src/utils/math/geometry/segment.js +80 -80
- package/src/utils/math/geometry/segment.test.js +183 -183
- package/src/utils/math/geometry/triangle.js +15 -15
- package/src/utils/math/geometry/triangle.test.js +11 -11
- package/src/utils/math/linear-algebra/2d.js +28 -28
- package/src/utils/math/linear-algebra/2d.test.js +17 -17
- package/src/utils/math/linear-algebra/quaternion.js +22 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
- package/src/utils/math/linear-algebra/quaternions.js +20 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
- package/src/utils/math/linear-algebra/vector.js +327 -302
- package/src/utils/math/linear-algebra/vector.test.js +265 -257
- package/src/utils/math/linear-algebra/vectors.js +122 -122
- package/src/utils/math/linear-algebra/vectors.test.js +65 -65
- package/src/utils/math/linear-interpolation.js +9 -0
- package/src/utils/math/numbers.js +90 -90
- package/src/utils/math/numbers.test.js +137 -137
- package/src/utils/math/rng.js +44 -44
- package/src/utils/math/rng.test.js +39 -39
- package/src/utils/math/statistics.js +43 -43
- package/src/utils/math/statistics.test.js +47 -47
- package/src/utils/math/trigonometry.js +89 -89
- package/src/utils/math/trigonometry.test.js +52 -52
- package/src/utils/physics/acceleration.js +61 -63
- package/src/utils/physics/friction.js +28 -30
- package/src/utils/physics/friction.test.js +42 -44
- package/src/utils/physics/gravity.js +69 -71
- package/src/utils/physics/gravity.test.js +77 -80
- package/src/utils/physics/jump.js +31 -41
- package/src/utils/physics/velocity.js +36 -38
- package/src/docs/ai/movement/dynamic/align.js +0 -131
- package/src/docs/ai/movement/dynamic/arrive.js +0 -88
- package/src/docs/ai/movement/dynamic/dynamic.mdx +0 -99
- package/src/docs/ai/movement/dynamic/dynamic.stories.js +0 -58
- package/src/docs/ai/movement/dynamic/evade.js +0 -72
- package/src/docs/ai/movement/dynamic/face.js +0 -90
- package/src/docs/ai/movement/dynamic/flee.js +0 -38
- package/src/docs/ai/movement/dynamic/look-where-youre-going.js +0 -114
- package/src/docs/ai/movement/dynamic/match-velocity.js +0 -92
- package/src/docs/ai/movement/dynamic/pursue.js +0 -72
- package/src/docs/ai/movement/dynamic/seek.js +0 -37
- package/src/docs/ai/movement/dynamic/wander.js +0 -71
- package/src/docs/ai/movement/kinematic/align.js +0 -122
- package/src/docs/ai/movement/kinematic/arrive.js +0 -78
- package/src/docs/ai/movement/kinematic/face.js +0 -82
- package/src/docs/ai/movement/kinematic/flee.js +0 -36
- package/src/docs/ai/movement/kinematic/kinematic.mdx +0 -67
- package/src/docs/ai/movement/kinematic/kinematic.stories.js +0 -42
- package/src/docs/ai/movement/kinematic/seek.js +0 -34
- package/src/docs/ai/movement/kinematic/wander-as-seek.js +0 -62
- package/src/docs/ai/movement/kinematic/wander.js +0 -28
- package/src/docs/bounds.js +0 -7
- package/src/docs/code-reuse.js +0 -35
- package/src/docs/collision/circles.js +0 -58
- package/src/docs/collision/collision.mdx +0 -27
- package/src/docs/collision/collision.stories.js +0 -22
- package/src/docs/collision/platform.js +0 -76
- package/src/docs/collision/tilemap.js +0 -181
- package/src/docs/empty.js +0 -1
- package/src/docs/engine.mdx +0 -81
- package/src/docs/engine.stories.js +0 -37
- package/src/docs/event-handlers.js +0 -68
- package/src/docs/framerate.js +0 -37
- package/src/docs/game.jsx +0 -15
- package/src/docs/image/image.js +0 -19
- package/src/docs/image/image.stories.js +0 -22
- package/src/docs/image/sprite.js +0 -39
- package/src/docs/image/tilemap.js +0 -84
- package/src/docs/input/controls.js +0 -67
- package/src/docs/input/gamepad.js +0 -67
- package/src/docs/input/input.mdx +0 -55
- package/src/docs/input/input.stories.js +0 -27
- package/src/docs/input/keyboard.js +0 -58
- package/src/docs/input/mouse.js +0 -32
- package/src/docs/instances.js +0 -49
- package/src/docs/player/dynamic/double-jump.js +0 -90
- package/src/docs/player/dynamic/dynamic.stories.js +0 -32
- package/src/docs/player/dynamic/jump.js +0 -83
- package/src/docs/player/dynamic/modern-controls.js +0 -57
- package/src/docs/player/dynamic/shooter-controls.js +0 -51
- package/src/docs/player/dynamic/tank-controls.js +0 -44
- package/src/docs/player/kinematic/double-jump.js +0 -90
- package/src/docs/player/kinematic/jump.js +0 -82
- package/src/docs/player/kinematic/kinematic.stories.js +0 -32
- package/src/docs/player/kinematic/modern-controls.js +0 -56
- package/src/docs/player/kinematic/shooter-controls.js +0 -48
- package/src/docs/player/kinematic/tank-controls.js +0 -42
- package/src/docs/quick-start/first-game.js +0 -49
- package/src/docs/quick-start/hello-world.js +0 -1
- package/src/docs/quick-start.mdx +0 -127
- package/src/docs/quick-start.stories.js +0 -17
- package/src/docs/recipes/add-and-remove.js +0 -71
- package/src/docs/recipes/add-instance.js +0 -42
- package/src/docs/recipes/decision-tree.js +0 -169
- package/src/docs/recipes/random-instances.js +0 -25
- package/src/docs/recipes/recipes.mdx +0 -81
- package/src/docs/recipes/recipes.stories.js +0 -37
- package/src/docs/recipes/remove-instance.js +0 -52
- package/src/docs/recipes/states.js +0 -64
- package/src/docs/ui/button.js +0 -28
- package/src/docs/ui/form.stories.js +0 -55
- package/src/docs/ui-chooser.jsx +0 -6
- package/src/docs/utils/data-structures/object.mdx +0 -47
- package/src/docs/utils/data-structures/objects.mdx +0 -30
- package/src/docs/utils/functions/functions.mdx +0 -34
- package/src/docs/utils/math/geometry/circle.mdx +0 -55
- package/src/docs/utils/math/geometry/point.mdx +0 -38
- package/src/docs/utils/math/geometry/rectangle.mdx +0 -24
- package/src/docs/utils/math/geometry/segment.mdx +0 -55
- package/src/docs/utils/math/geometry/triangle.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/2d.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/quaternion.mdx +0 -21
- package/src/docs/utils/math/linear-algebra/quaternions.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/vector.mdx +0 -177
- package/src/docs/utils/math/linear-algebra/vectors.mdx +0 -58
- package/src/docs/utils/math/numbers.mdx +0 -76
- package/src/docs/utils/math/random.mdx +0 -35
- package/src/docs/utils/math/statistics.mdx +0 -38
- package/src/docs/utils/math/trigonometry.mdx +0 -85
- package/src/docs/utils/physics/friction.mdx +0 -20
- package/src/docs/utils/physics/gravity.mdx +0 -28
- package/src/engine/loop.js +0 -15
- package/src/engine/store.js +0 -174
- package/src/engine/store.test.js +0 -256
- package/src/engine.js +0 -74
- package/src/game/animation.js +0 -26
- package/src/game/bounds.js +0 -66
- package/src/game/decorators/character.js +0 -5
- package/src/game/decorators/clamp-to-bounds.js +0 -15
- package/src/game/decorators/controls/dynamic/modern.js +0 -48
- package/src/game/decorators/controls/dynamic/shooter.js +0 -47
- package/src/game/decorators/controls/dynamic/tank.js +0 -55
- package/src/game/decorators/controls/kinematic/modern.js +0 -49
- package/src/game/decorators/controls/kinematic/shooter.js +0 -45
- package/src/game/decorators/controls/kinematic/tank.js +0 -52
- package/src/game/decorators/debug/collisions.js +0 -32
- package/src/game/decorators/double-jump.js +0 -70
- package/src/game/decorators/fps.js +0 -30
- package/src/game/decorators/fsm.js +0 -27
- package/src/game/decorators/game.js +0 -11
- package/src/game/decorators/image/image.js +0 -5
- package/src/game/decorators/image/sprite.js +0 -5
- package/src/game/decorators/image/tilemap.js +0 -5
- package/src/game/decorators/input/controls.js +0 -27
- package/src/game/decorators/input/gamepad.js +0 -74
- package/src/game/decorators/input/input.js +0 -41
- package/src/game/decorators/input/keyboard.js +0 -49
- package/src/game/decorators/input/mouse.js +0 -65
- package/src/game/decorators/jump.js +0 -72
- package/src/game/decorators/platform.js +0 -5
- package/src/game/decorators/ui/button.js +0 -21
- package/src/game/sprite.js +0 -119
- package/src/ui/canvas/absolute-position.js +0 -17
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
- /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default filler function for board cells.
|
|
3
|
-
* @returns {null} Default value for a cell.
|
|
4
|
-
*/
|
|
5
|
-
const DEFAULT_FILLER = () => null
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Default function to convert a cell to a string.
|
|
9
|
-
* @param {*} cell - The cell value.
|
|
10
|
-
* @returns {string} String representation of the cell.
|
|
11
|
-
*/
|
|
12
|
-
const DEFAULT_CELL_TO_STRING = (cell) => `${cell}`
|
|
13
|
-
|
|
14
|
-
const FIRST_ROW = 0
|
|
15
|
-
const FIRST_COLUMN = 0
|
|
16
|
-
const LAST_ROW_OFFSET = 1
|
|
17
|
-
const LAST_COLUMN_OFFSET = 1
|
|
18
|
-
const MOVE_DOWN = 1
|
|
19
|
-
const MOVE_LEFT = -1
|
|
20
|
-
const MOVE_RIGHT = 1
|
|
21
|
-
const MOVE_UP = -1
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Calculates the index in a one-dimensional array for given row and column.
|
|
25
|
-
* @param {number} row - The row index.
|
|
26
|
-
* @param {number} column - The column index.
|
|
27
|
-
* @param {number} columns - The total number of columns.
|
|
28
|
-
* @returns {number} The calculated index.
|
|
29
|
-
*/
|
|
30
|
-
function getIndex(row, column, columns) {
|
|
31
|
-
return row * columns + column
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Creates a 1D board with the specified dimensions and fills it using the provided filler function.
|
|
36
|
-
* @param {[number, number]} dimensions - Array containing the number of rows and columns.
|
|
37
|
-
* @param {Function} [filler=DEFAULT_FILLER] - Function to fill each cell of the board.
|
|
38
|
-
* @returns {any[]} The created board.
|
|
39
|
-
*/
|
|
40
|
-
export function createBoard([rows, columns], filler = DEFAULT_FILLER) {
|
|
41
|
-
return new Array(rows * columns).fill(null).map((_, index) => {
|
|
42
|
-
const row = Math.floor(index / columns)
|
|
43
|
-
const column = index % columns
|
|
44
|
-
return filler(row, column)
|
|
45
|
-
})
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Moves the given coordinates one step down.
|
|
50
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
51
|
-
* @param {[number]} size - Array containing the number of rows.
|
|
52
|
-
* @returns {[number, number]} The new coordinates after moving down.
|
|
53
|
-
* @throws {Error} If the movement goes out of bounds.
|
|
54
|
-
*/
|
|
55
|
-
export function down([i, j], [rows]) {
|
|
56
|
-
if (i === rows - LAST_ROW_OFFSET) {
|
|
57
|
-
throw new Error()
|
|
58
|
-
}
|
|
59
|
-
return [i + MOVE_DOWN, j]
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Moves the given coordinates one step down and one step left.
|
|
64
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
65
|
-
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
66
|
-
* @returns {[number, number]} The new coordinates after moving down-left.
|
|
67
|
-
*/
|
|
68
|
-
export function downLeft(coords, size) {
|
|
69
|
-
return down(left(coords, size), size)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Moves the given coordinates one step down and one step right.
|
|
74
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
75
|
-
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
76
|
-
* @returns {[number, number]} The new coordinates after moving down-right.
|
|
77
|
-
*/
|
|
78
|
-
export function downRight(coords, size) {
|
|
79
|
-
return down(right(coords, size), size)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Moves the given coordinates one step left.
|
|
84
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
85
|
-
* @returns {[number, number]} The new coordinates after moving left.
|
|
86
|
-
* @throws {Error} If the movement goes out of bounds.
|
|
87
|
-
*/
|
|
88
|
-
export function left([i, j]) {
|
|
89
|
-
if (j === FIRST_COLUMN) {
|
|
90
|
-
throw new Error()
|
|
91
|
-
}
|
|
92
|
-
return [i, j + MOVE_LEFT]
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Moves the given coordinates one step right.
|
|
97
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
98
|
-
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
99
|
-
* @returns {[number, number]} The new coordinates after moving right.
|
|
100
|
-
* @throws {Error} If the movement goes out of bounds.
|
|
101
|
-
*/
|
|
102
|
-
export function right([i, j], [, columns]) {
|
|
103
|
-
if (j === columns - LAST_COLUMN_OFFSET) {
|
|
104
|
-
throw new Error()
|
|
105
|
-
}
|
|
106
|
-
return [i, j + MOVE_RIGHT]
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Converts the board to a string representation.
|
|
111
|
-
* @param {any[]} board - The 1D board to convert.
|
|
112
|
-
* @param {[number, number]} dimensions - Array containing the number of rows and columns.
|
|
113
|
-
* @param {Function} [cellToString=DEFAULT_CELL_TO_STRING] - Function to convert each cell to a string.
|
|
114
|
-
* @returns {string} The string representation of the board.
|
|
115
|
-
*/
|
|
116
|
-
export function toString(
|
|
117
|
-
board,
|
|
118
|
-
[rows, columns],
|
|
119
|
-
cellToString = DEFAULT_CELL_TO_STRING,
|
|
120
|
-
) {
|
|
121
|
-
return Array.from({ length: rows }, (_, i) =>
|
|
122
|
-
Array.from({ length: columns }, (_, j) =>
|
|
123
|
-
cellToString(board[getIndex(i, j, columns)], i, j),
|
|
124
|
-
).join(" "),
|
|
125
|
-
).join("\n")
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Moves the given coordinates one step up.
|
|
130
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
131
|
-
* @returns {[number, number]} The new coordinates after moving up.
|
|
132
|
-
* @throws {Error} If the movement goes out of bounds.
|
|
133
|
-
*/
|
|
134
|
-
export function up([i, j]) {
|
|
135
|
-
if (i === FIRST_ROW) {
|
|
136
|
-
throw new Error()
|
|
137
|
-
}
|
|
138
|
-
return [i + MOVE_UP, j]
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Moves the given coordinates one step up and one step left.
|
|
143
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
144
|
-
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
145
|
-
* @returns {[number, number]} The new coordinates after moving up-left.
|
|
146
|
-
*/
|
|
147
|
-
export function upLeft(coords, size) {
|
|
148
|
-
return up(left(coords, size), size)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Moves the given coordinates one step up and one step right.
|
|
153
|
-
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
154
|
-
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
155
|
-
* @returns {[number, number]} The new coordinates after moving up-right.
|
|
156
|
-
*/
|
|
157
|
-
export function upRight(coords, size) {
|
|
158
|
-
return up(right(coords, size), size)
|
|
159
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Default filler function for board cells.
|
|
3
|
+
* @returns {null} Default value for a cell.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_FILLER = () => null
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Default function to convert a cell to a string.
|
|
9
|
+
* @param {*} cell - The cell value.
|
|
10
|
+
* @returns {string} String representation of the cell.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CELL_TO_STRING = (cell) => `${cell}`
|
|
13
|
+
|
|
14
|
+
const FIRST_ROW = 0
|
|
15
|
+
const FIRST_COLUMN = 0
|
|
16
|
+
const LAST_ROW_OFFSET = 1
|
|
17
|
+
const LAST_COLUMN_OFFSET = 1
|
|
18
|
+
const MOVE_DOWN = 1
|
|
19
|
+
const MOVE_LEFT = -1
|
|
20
|
+
const MOVE_RIGHT = 1
|
|
21
|
+
const MOVE_UP = -1
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Calculates the index in a one-dimensional array for given row and column.
|
|
25
|
+
* @param {number} row - The row index.
|
|
26
|
+
* @param {number} column - The column index.
|
|
27
|
+
* @param {number} columns - The total number of columns.
|
|
28
|
+
* @returns {number} The calculated index.
|
|
29
|
+
*/
|
|
30
|
+
function getIndex(row, column, columns) {
|
|
31
|
+
return row * columns + column
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Creates a 1D board with the specified dimensions and fills it using the provided filler function.
|
|
36
|
+
* @param {[number, number]} dimensions - Array containing the number of rows and columns.
|
|
37
|
+
* @param {Function} [filler=DEFAULT_FILLER] - Function to fill each cell of the board.
|
|
38
|
+
* @returns {any[]} The created board.
|
|
39
|
+
*/
|
|
40
|
+
export function createBoard([rows, columns], filler = DEFAULT_FILLER) {
|
|
41
|
+
return new Array(rows * columns).fill(null).map((_, index) => {
|
|
42
|
+
const row = Math.floor(index / columns)
|
|
43
|
+
const column = index % columns
|
|
44
|
+
return filler(row, column)
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Moves the given coordinates one step down.
|
|
50
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
51
|
+
* @param {[number]} size - Array containing the number of rows.
|
|
52
|
+
* @returns {[number, number]} The new coordinates after moving down.
|
|
53
|
+
* @throws {Error} If the movement goes out of bounds.
|
|
54
|
+
*/
|
|
55
|
+
export function down([i, j], [rows]) {
|
|
56
|
+
if (i === rows - LAST_ROW_OFFSET) {
|
|
57
|
+
throw new Error()
|
|
58
|
+
}
|
|
59
|
+
return [i + MOVE_DOWN, j]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Moves the given coordinates one step down and one step left.
|
|
64
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
65
|
+
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
66
|
+
* @returns {[number, number]} The new coordinates after moving down-left.
|
|
67
|
+
*/
|
|
68
|
+
export function downLeft(coords, size) {
|
|
69
|
+
return down(left(coords, size), size)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Moves the given coordinates one step down and one step right.
|
|
74
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
75
|
+
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
76
|
+
* @returns {[number, number]} The new coordinates after moving down-right.
|
|
77
|
+
*/
|
|
78
|
+
export function downRight(coords, size) {
|
|
79
|
+
return down(right(coords, size), size)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Moves the given coordinates one step left.
|
|
84
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
85
|
+
* @returns {[number, number]} The new coordinates after moving left.
|
|
86
|
+
* @throws {Error} If the movement goes out of bounds.
|
|
87
|
+
*/
|
|
88
|
+
export function left([i, j]) {
|
|
89
|
+
if (j === FIRST_COLUMN) {
|
|
90
|
+
throw new Error()
|
|
91
|
+
}
|
|
92
|
+
return [i, j + MOVE_LEFT]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Moves the given coordinates one step right.
|
|
97
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
98
|
+
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
99
|
+
* @returns {[number, number]} The new coordinates after moving right.
|
|
100
|
+
* @throws {Error} If the movement goes out of bounds.
|
|
101
|
+
*/
|
|
102
|
+
export function right([i, j], [, columns]) {
|
|
103
|
+
if (j === columns - LAST_COLUMN_OFFSET) {
|
|
104
|
+
throw new Error()
|
|
105
|
+
}
|
|
106
|
+
return [i, j + MOVE_RIGHT]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Converts the board to a string representation.
|
|
111
|
+
* @param {any[]} board - The 1D board to convert.
|
|
112
|
+
* @param {[number, number]} dimensions - Array containing the number of rows and columns.
|
|
113
|
+
* @param {Function} [cellToString=DEFAULT_CELL_TO_STRING] - Function to convert each cell to a string.
|
|
114
|
+
* @returns {string} The string representation of the board.
|
|
115
|
+
*/
|
|
116
|
+
export function toString(
|
|
117
|
+
board,
|
|
118
|
+
[rows, columns],
|
|
119
|
+
cellToString = DEFAULT_CELL_TO_STRING,
|
|
120
|
+
) {
|
|
121
|
+
return Array.from({ length: rows }, (_, i) =>
|
|
122
|
+
Array.from({ length: columns }, (_, j) =>
|
|
123
|
+
cellToString(board[getIndex(i, j, columns)], i, j),
|
|
124
|
+
).join(" "),
|
|
125
|
+
).join("\n")
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Moves the given coordinates one step up.
|
|
130
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
131
|
+
* @returns {[number, number]} The new coordinates after moving up.
|
|
132
|
+
* @throws {Error} If the movement goes out of bounds.
|
|
133
|
+
*/
|
|
134
|
+
export function up([i, j]) {
|
|
135
|
+
if (i === FIRST_ROW) {
|
|
136
|
+
throw new Error()
|
|
137
|
+
}
|
|
138
|
+
return [i + MOVE_UP, j]
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Moves the given coordinates one step up and one step left.
|
|
143
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
144
|
+
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
145
|
+
* @returns {[number, number]} The new coordinates after moving up-left.
|
|
146
|
+
*/
|
|
147
|
+
export function upLeft(coords, size) {
|
|
148
|
+
return up(left(coords, size), size)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Moves the given coordinates one step up and one step right.
|
|
153
|
+
* @param {[number, number]} coords - The current coordinates [row, column].
|
|
154
|
+
* @param {[number, number]} size - Array containing the number of rows and columns.
|
|
155
|
+
* @returns {[number, number]} The new coordinates after moving up-right.
|
|
156
|
+
*/
|
|
157
|
+
export function upRight(coords, size) {
|
|
158
|
+
return up(right(coords, size), size)
|
|
159
|
+
}
|