@inglorious/engine 0.1.1 → 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.
Files changed (201) hide show
  1. package/README.md +39 -36
  2. package/package.json +10 -22
  3. package/src/engine/ai/movement/dynamic/align.js +63 -63
  4. package/src/engine/ai/movement/dynamic/arrive.js +42 -43
  5. package/src/engine/ai/movement/dynamic/evade.js +38 -38
  6. package/src/engine/ai/movement/dynamic/face.js +19 -20
  7. package/src/engine/ai/movement/dynamic/flee.js +45 -45
  8. package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
  9. package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
  10. package/src/engine/ai/movement/dynamic/pursue.js +38 -38
  11. package/src/engine/ai/movement/dynamic/seek.js +44 -44
  12. package/src/engine/ai/movement/dynamic/wander.js +31 -32
  13. package/src/engine/ai/movement/kinematic/align.js +37 -37
  14. package/src/engine/ai/movement/kinematic/arrive.js +42 -42
  15. package/src/engine/ai/movement/kinematic/face.js +19 -20
  16. package/src/engine/ai/movement/kinematic/flee.js +26 -26
  17. package/src/engine/ai/movement/kinematic/seek.js +26 -26
  18. package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
  19. package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
  20. package/src/engine/ai/movement/kinematic/wander.js +27 -27
  21. package/src/engine/animation/sprite.js +101 -0
  22. package/src/engine/animation/ticker.js +38 -0
  23. package/src/engine/behaviors/camera.js +68 -0
  24. package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
  25. package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
  26. package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
  27. package/src/engine/behaviors/controls/event-handlers.js +17 -0
  28. package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
  29. package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
  30. package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
  31. package/src/engine/behaviors/debug/collision.js +35 -0
  32. package/src/engine/behaviors/fps.js +29 -0
  33. package/src/engine/behaviors/fsm.js +33 -0
  34. package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
  35. package/src/engine/behaviors/game.js +15 -0
  36. package/src/engine/behaviors/input/controls.js +37 -0
  37. package/src/engine/behaviors/input/gamepad.js +114 -0
  38. package/src/engine/behaviors/input/input.js +48 -0
  39. package/src/engine/behaviors/input/keyboard.js +64 -0
  40. package/src/engine/behaviors/input/mouse.js +91 -0
  41. package/src/engine/behaviors/physics/bouncy.js +25 -0
  42. package/src/engine/behaviors/physics/clamped.js +36 -0
  43. package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
  44. package/src/engine/behaviors/physics/jumpable.js +145 -0
  45. package/src/engine/behaviors/ui/button.js +17 -0
  46. package/src/engine/collision/detection.js +110 -115
  47. package/src/engine/core/api.js +34 -0
  48. package/src/engine/core/dev-tools.js +135 -0
  49. package/src/engine/core/engine.js +119 -0
  50. package/src/engine/core/loop.js +15 -0
  51. package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
  52. package/src/engine/{loop → core/loops}/elapsed.js +22 -23
  53. package/src/engine/{loop → core/loops}/fixed.js +27 -28
  54. package/src/engine/{loop → core/loops}/flash.js +13 -14
  55. package/src/engine/{loop → core/loops}/lag.js +26 -27
  56. package/src/engine/core/select.js +26 -0
  57. package/src/engine/core/store.js +178 -0
  58. package/src/engine/core/store.test.js +110 -0
  59. package/src/engine/movement/dynamic/modern.js +21 -24
  60. package/src/engine/movement/dynamic/tank.js +43 -43
  61. package/src/engine/movement/kinematic/modern.js +16 -16
  62. package/src/engine/movement/kinematic/modern.test.js +27 -27
  63. package/src/engine/movement/kinematic/tank.js +27 -27
  64. package/src/engine/physics/bounds.js +138 -0
  65. package/src/engine/physics/position.js +43 -0
  66. package/src/engine/physics/position.test.js +80 -0
  67. package/src/engine/systems/sprite-animation.js +27 -0
  68. package/src/main.js +10 -5
  69. package/src/renderers/canvas/absolute-position.js +18 -0
  70. package/src/renderers/canvas/camera.js +13 -0
  71. package/src/renderers/canvas/canvas-renderer.js +68 -0
  72. package/src/{ui → renderers}/canvas/character.js +38 -35
  73. package/src/{ui → renderers}/canvas/form/button.js +25 -25
  74. package/src/{ui → renderers}/canvas/fps.js +18 -18
  75. package/src/renderers/canvas/image/hitmask.js +51 -0
  76. package/src/{ui → renderers}/canvas/image/image.js +34 -37
  77. package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
  78. package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
  79. package/src/{ui → renderers}/canvas/mouse.js +37 -37
  80. package/src/renderers/canvas/rendering-system.js +79 -0
  81. package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
  82. package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
  83. package/src/renderers/react/game/character/index.jsx +20 -0
  84. package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
  85. package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
  86. package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
  87. package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
  88. package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
  89. package/src/{ui → renderers}/react/game/game.jsx +72 -71
  90. package/src/{ui → renderers}/react/game/index.jsx +29 -29
  91. package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
  92. package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
  93. package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
  94. package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
  95. package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
  96. package/src/{ui → renderers}/react/index.jsx +9 -9
  97. package/src/utils/algorithms/decision-tree.js +24 -24
  98. package/src/utils/algorithms/decision-tree.test.js +153 -102
  99. package/src/utils/algorithms/path-finding.js +155 -155
  100. package/src/utils/algorithms/path-finding.test.js +151 -151
  101. package/src/utils/data-structures/array.js +83 -83
  102. package/src/utils/data-structures/array.test.js +173 -173
  103. package/src/utils/data-structures/board.js +159 -159
  104. package/src/utils/data-structures/board.test.js +242 -242
  105. package/src/utils/data-structures/boolean.js +9 -9
  106. package/src/utils/data-structures/heap.js +164 -164
  107. package/src/utils/data-structures/heap.test.js +103 -103
  108. package/src/utils/data-structures/object.js +138 -102
  109. package/src/utils/data-structures/object.test.js +218 -121
  110. package/src/utils/data-structures/objects.js +66 -48
  111. package/src/utils/data-structures/objects.test.js +99 -99
  112. package/src/utils/data-structures/tree.js +36 -36
  113. package/src/utils/data-structures/tree.test.js +33 -33
  114. package/src/utils/functions/functions.js +19 -19
  115. package/src/utils/functions/functions.test.js +23 -23
  116. package/src/utils/math/geometry/circle.js +70 -117
  117. package/src/utils/math/geometry/circle.test.js +97 -97
  118. package/src/utils/math/geometry/hitmask.js +70 -39
  119. package/src/utils/math/geometry/hitmask.test.js +155 -84
  120. package/src/utils/math/geometry/line.js +35 -35
  121. package/src/utils/math/geometry/line.test.js +49 -49
  122. package/src/utils/math/geometry/point.js +78 -71
  123. package/src/utils/math/geometry/point.test.js +81 -81
  124. package/src/utils/math/geometry/rectangle.js +76 -45
  125. package/src/utils/math/geometry/rectangle.test.js +42 -42
  126. package/src/utils/math/geometry/segment.js +80 -80
  127. package/src/utils/math/geometry/segment.test.js +183 -183
  128. package/src/utils/math/geometry/triangle.js +15 -15
  129. package/src/utils/math/geometry/triangle.test.js +11 -11
  130. package/src/utils/math/linear-algebra/2d.js +28 -28
  131. package/src/utils/math/linear-algebra/2d.test.js +17 -17
  132. package/src/utils/math/linear-algebra/quaternion.js +22 -22
  133. package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
  134. package/src/utils/math/linear-algebra/quaternions.js +20 -20
  135. package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
  136. package/src/utils/math/linear-algebra/vector.js +327 -302
  137. package/src/utils/math/linear-algebra/vector.test.js +265 -257
  138. package/src/utils/math/linear-algebra/vectors.js +122 -122
  139. package/src/utils/math/linear-algebra/vectors.test.js +65 -65
  140. package/src/utils/math/linear-interpolation.js +9 -0
  141. package/src/utils/math/numbers.js +90 -90
  142. package/src/utils/math/numbers.test.js +137 -137
  143. package/src/utils/math/rng.js +44 -44
  144. package/src/utils/math/rng.test.js +39 -39
  145. package/src/utils/math/statistics.js +43 -43
  146. package/src/utils/math/statistics.test.js +47 -47
  147. package/src/utils/math/trigonometry.js +89 -89
  148. package/src/utils/math/trigonometry.test.js +52 -52
  149. package/src/utils/physics/acceleration.js +61 -63
  150. package/src/utils/physics/friction.js +28 -30
  151. package/src/utils/physics/friction.test.js +42 -44
  152. package/src/utils/physics/gravity.js +69 -71
  153. package/src/utils/physics/gravity.test.js +77 -80
  154. package/src/utils/physics/jump.js +31 -41
  155. package/src/utils/physics/velocity.js +36 -38
  156. package/src/engine/loop.js +0 -15
  157. package/src/engine/store.js +0 -174
  158. package/src/engine/store.test.js +0 -256
  159. package/src/engine.js +0 -74
  160. package/src/game/animation.js +0 -26
  161. package/src/game/bounds.js +0 -66
  162. package/src/game/decorators/character.js +0 -5
  163. package/src/game/decorators/clamp-to-bounds.js +0 -15
  164. package/src/game/decorators/controls/dynamic/modern.js +0 -48
  165. package/src/game/decorators/controls/dynamic/shooter.js +0 -47
  166. package/src/game/decorators/controls/dynamic/tank.js +0 -55
  167. package/src/game/decorators/controls/kinematic/modern.js +0 -49
  168. package/src/game/decorators/controls/kinematic/shooter.js +0 -45
  169. package/src/game/decorators/controls/kinematic/tank.js +0 -52
  170. package/src/game/decorators/debug/collisions.js +0 -32
  171. package/src/game/decorators/double-jump.js +0 -70
  172. package/src/game/decorators/fps.js +0 -30
  173. package/src/game/decorators/fsm.js +0 -27
  174. package/src/game/decorators/game.js +0 -11
  175. package/src/game/decorators/image/image.js +0 -5
  176. package/src/game/decorators/image/sprite.js +0 -5
  177. package/src/game/decorators/image/tilemap.js +0 -5
  178. package/src/game/decorators/input/controls.js +0 -27
  179. package/src/game/decorators/input/gamepad.js +0 -74
  180. package/src/game/decorators/input/input.js +0 -41
  181. package/src/game/decorators/input/keyboard.js +0 -49
  182. package/src/game/decorators/input/mouse.js +0 -65
  183. package/src/game/decorators/jump.js +0 -72
  184. package/src/game/decorators/platform.js +0 -5
  185. package/src/game/decorators/ui/button.js +0 -21
  186. package/src/game/sprite.js +0 -119
  187. package/src/ui/canvas/absolute-position.js +0 -17
  188. package/src/ui/canvas/image/hitmask.js +0 -37
  189. package/src/ui/canvas.js +0 -81
  190. package/src/ui/react/game/character/index.jsx +0 -30
  191. package/src/utils/math/geometry/platform.js +0 -42
  192. package/src/utils/math/geometry/platform.test.js +0 -133
  193. /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
  194. /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
  195. /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
  196. /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
  197. /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
  198. /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
  199. /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
  200. /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
  201. /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
@@ -1,256 +0,0 @@
1
- import { expect, test } from "vitest"
2
-
3
- import { createStore } from "./store.js"
4
-
5
- test("it should add an event to the event queue", () => {
6
- const event = { id: "something:happened" }
7
- const config = {
8
- types: {
9
- kitty: {
10
- [event.id](instance) {
11
- return { ...instance, wasNotified: true }
12
- },
13
- },
14
- },
15
- instances: {
16
- instance1: { type: "kitty" },
17
- },
18
- }
19
- const store = createStore(config)
20
- const afterState = {
21
- events: [],
22
- instances: {
23
- game: {
24
- id: "game",
25
- type: "game",
26
- layer: 0,
27
- bounds: [0, 0, 800, 600],
28
- },
29
- instance1: {
30
- id: "instance1",
31
- type: "kitty",
32
- layer: 0,
33
- wasNotified: true,
34
- },
35
- },
36
- }
37
-
38
- store.notify(event)
39
- store.update()
40
-
41
- const state = store.getState()
42
- expect(state).toStrictEqual(afterState)
43
- })
44
-
45
- test("it should process the event queue", () => {
46
- const event = { id: "something:happened" }
47
- const config = {
48
- types: {
49
- kitty: {
50
- "game:update"(instance) {
51
- return { ...instance, wasUpdated: true }
52
- },
53
-
54
- [event.id](instance) {
55
- return { ...instance, wasNotified: true }
56
- },
57
- },
58
- },
59
- instances: {
60
- instance1: { type: "kitty" },
61
- },
62
- }
63
- const store = createStore(config)
64
- store.notify(event)
65
- const afterState = {
66
- events: [],
67
- instances: {
68
- game: {
69
- id: "game",
70
- type: "game",
71
- layer: 0,
72
- bounds: [0, 0, 800, 600],
73
- },
74
- instance1: {
75
- id: "instance1",
76
- type: "kitty",
77
- layer: 0,
78
- wasNotified: true,
79
- wasUpdated: true,
80
- },
81
- },
82
- }
83
-
84
- store.update()
85
-
86
- const state = store.getState()
87
- expect(state).toStrictEqual(afterState)
88
- })
89
-
90
- test("it should send an event from an instance", () => {
91
- const event = {
92
- id: "doge:message",
93
- payload: { id: "inu", message: "Woof!" },
94
- }
95
- const config = {
96
- types: {
97
- doge: {
98
- "game:update"(instance, event, { instances, notify }) {
99
- if (instances.instance2.position === "near") {
100
- notify(event)
101
- }
102
- },
103
- },
104
- kitty: {
105
- [event.id](instance) {
106
- if (event.payload.id === "inu" && event.payload.message === "Woof!") {
107
- instance.position = "far"
108
- }
109
- },
110
- },
111
- },
112
-
113
- instances: {
114
- instance1: {
115
- type: "doge",
116
- },
117
- instance2: {
118
- type: "kitty",
119
- position: "near",
120
- },
121
- },
122
- }
123
- const store = createStore(config)
124
- const afterState = {
125
- events: [],
126
- instances: {
127
- game: {
128
- id: "game",
129
- type: "game",
130
- layer: 0,
131
- bounds: [0, 0, 800, 600],
132
- },
133
- instance1: {
134
- id: "instance1",
135
- type: "doge",
136
- layer: 0,
137
- },
138
- instance2: {
139
- id: "instance2",
140
- type: "kitty",
141
- layer: 0,
142
- position: "near", // should do nothing at first
143
- },
144
- },
145
- }
146
-
147
- store.update()
148
-
149
- const state = store.getState()
150
- expect(state).toStrictEqual(afterState)
151
- })
152
-
153
- test("it should receive an event from an instance", () => {
154
- const event = {
155
- id: "doge:message",
156
- payload: { id: "inu", message: "Woof!" },
157
- }
158
- const config = {
159
- types: {
160
- doge: {
161
- "game:update"(instance, event, { instances, notify }) {
162
- if (instances.instance2.position === "near") {
163
- notify(event)
164
- }
165
- },
166
- },
167
- kitty: {
168
- [event.id](instance, event) {
169
- if (event.payload.id === "inu" && event.payload.message === "Woof!") {
170
- instance.position = "far"
171
- }
172
- },
173
- },
174
- },
175
-
176
- instances: {
177
- instance1: {
178
- type: "doge",
179
- },
180
- instance2: {
181
- type: "kitty",
182
- position: "near",
183
- },
184
- },
185
- }
186
- const store = createStore(config)
187
- store.notify(event)
188
- const afterState = {
189
- events: [],
190
- instances: {
191
- game: {
192
- id: "game",
193
- type: "game",
194
- layer: 0,
195
- bounds: [0, 0, 800, 600],
196
- },
197
- instance1: {
198
- id: "instance1",
199
- type: "doge",
200
- layer: 0,
201
- },
202
- instance2: {
203
- id: "instance2",
204
- type: "kitty",
205
- layer: 0,
206
- position: "far", // position changed
207
- },
208
- },
209
- }
210
-
211
- store.update()
212
-
213
- const state = store.getState()
214
- expect(state).toStrictEqual(afterState)
215
- })
216
-
217
- test("it should mutate state in an immutable way", () => {
218
- const config = {
219
- types: {
220
- kitty: {
221
- "game:update"(instance) {
222
- instance.wasUpdated = true
223
- },
224
- },
225
- },
226
-
227
- instances: {
228
- instance1: {
229
- type: "kitty",
230
- },
231
- },
232
- }
233
- const store = createStore(config)
234
- const afterState = {
235
- events: [],
236
- instances: {
237
- game: {
238
- id: "game",
239
- type: "game",
240
- layer: 0,
241
- bounds: [0, 0, 800, 600],
242
- },
243
- instance1: {
244
- id: "instance1",
245
- type: "kitty",
246
- layer: 0,
247
- wasUpdated: true,
248
- },
249
- },
250
- }
251
-
252
- store.update()
253
-
254
- const state = store.getState()
255
- expect(state).toStrictEqual(afterState)
256
- })
package/src/engine.js DELETED
@@ -1,74 +0,0 @@
1
- import { extend } from "@inglorious/utils/data-structures/objects.js"
2
-
3
- import Loop from "./engine/loop.js"
4
- import { createStore } from "./engine/store.js"
5
-
6
- // Default configuration for the engine
7
- // loop.type specifies the type of loop to use (defaults to "animationFrame").
8
- const DEFAULT_CONFIG = {
9
- loop: { type: "animationFrame" },
10
- }
11
- const ONE_SECOND = 1000 // Number of milliseconds in one second.
12
-
13
- /**
14
- * Engine class responsible for managing the game loop, state, and rendering.
15
- */
16
- export default class Engine {
17
- /**
18
- * @param {Object} game - Game-specific configuration.
19
- * @param {Object} ui - UI instance responsible for rendering.
20
- */
21
- constructor(game, ui) {
22
- this._config = extend(DEFAULT_CONFIG, game)
23
- this._store = createStore(this._config)
24
- this._loop = new Loop[this._config.loop.type]()
25
- this._ui = ui
26
- }
27
-
28
- /**
29
- * Starts the game engine, initializing the loop and notifying the store.
30
- */
31
- start() {
32
- this._store.notify({ id: "game:start" })
33
- this._loop.start(this, ONE_SECOND / this._config.loop.fps)
34
- this.isRunning = true
35
- }
36
-
37
- /**
38
- * Updates the game state.
39
- * @param {number} dt - Delta time since the last update in milliseconds.
40
- */
41
- update(dt) {
42
- this._store.update(dt)
43
- }
44
-
45
- /**
46
- * Renders the game state using the UI.
47
- * @param {number} dt - Delta time since the last render in milliseconds.
48
- */
49
- render(dt) {
50
- this._ui?.render({
51
- dt,
52
- types: this._store.getTypes(),
53
- instances: this._store.getState().instances,
54
- })
55
- }
56
-
57
- /**
58
- * Notifies the store of an event.
59
- * @param {Object} event - Event object to notify the store with.
60
- */
61
- notify = (event) => {
62
- this._store.notify(event)
63
- }
64
-
65
- /**
66
- * Stops the game engine, halting the loop and notifying the store.
67
- */
68
- stop() {
69
- this._store.notify({ id: "game:stop" })
70
- this._store.update()
71
- this._loop.stop()
72
- this.isRunning = false
73
- }
74
- }
@@ -1,26 +0,0 @@
1
- const COUNTER_RESET = 0
2
- const DEFAULT_VALUE = 0
3
-
4
- export const Animation = { play }
5
-
6
- function play(what, state, instance, options) {
7
- const { dt, onTick } = options
8
- const {
9
- speed,
10
- defaultValue = DEFAULT_VALUE,
11
- value = DEFAULT_VALUE,
12
- } = instance[what]
13
-
14
- if (state !== instance[what].state) {
15
- instance[what].state = state
16
- instance[what].counter = COUNTER_RESET
17
- instance[what].value = defaultValue
18
- }
19
-
20
- instance[what].counter += dt
21
- if (instance[what].counter >= speed) {
22
- instance[what].counter = COUNTER_RESET
23
- instance[what].value = value
24
- onTick && onTick(instance, options)
25
- }
26
- }
@@ -1,66 +0,0 @@
1
- import {
2
- angle,
3
- clamp,
4
- createVector,
5
- fromAngle,
6
- multiply,
7
- zero,
8
- } from "@inglorious/utils/math/linear-algebra/vector.js"
9
- import { sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
10
- import { abs } from "@inglorious/utils/math/numbers.js"
11
-
12
- const X = 0
13
- const Z = 2
14
-
15
- export function bounce(instance, { dt, instances }) {
16
- const [minX, minZ, maxX, maxZ] = instances.game.bounds
17
- const [x, , z] = instance.position
18
-
19
- const velocity = createVector(instance.maxSpeed, instance.orientation)
20
- if (x < minX || x >= maxX) {
21
- velocity[X] = -velocity[X]
22
- }
23
-
24
- if (z < minZ || z >= maxZ) {
25
- velocity[Z] = -velocity[Z]
26
- }
27
-
28
- const position = sum(instance.position, multiply(velocity, dt))
29
- const orientation = angle(velocity)
30
-
31
- return { velocity, position, orientation }
32
- }
33
-
34
- // TODO: make the following functions pure
35
- export function clampToBounds(instance, [minX, minZ, maxX, maxZ]) {
36
- instance.position = clamp(
37
- instance.position,
38
- [minX, minZ, minZ],
39
- [maxX, maxZ, maxZ],
40
- )
41
- }
42
-
43
- export function flip(instance, [minX, minZ, maxX, maxZ]) {
44
- const [x, , z] = instance.position
45
-
46
- const direction = fromAngle(instance.orientation)
47
-
48
- if (x < minX || x >= maxX || z < minZ || z >= maxZ) {
49
- if (x < minX) {
50
- direction[X] = abs(direction[X])
51
- } else if (x >= maxX) {
52
- direction[X] = -abs(direction[X])
53
- }
54
-
55
- if (z < minZ) {
56
- direction[Z] = abs(direction[Z])
57
- } else if (z >= maxZ) {
58
- direction[Z] = -abs(direction[Z])
59
- }
60
-
61
- instance.acceleration = zero()
62
- instance.velocity = zero()
63
- }
64
-
65
- instance.orientation = angle(direction)
66
- }
@@ -1,5 +0,0 @@
1
- import draw from "@inglorious/ui/canvas/character.js"
2
-
3
- export function enableCharacter() {
4
- return { draw }
5
- }
@@ -1,15 +0,0 @@
1
- import { extend } from "@inglorious/utils/data-structures/objects.js"
2
-
3
- import { clampToBounds } from "../bounds.js"
4
-
5
- export function enableClampToBounds() {
6
- return (type) =>
7
- extend(type, {
8
- "game:update"(instance, event, options) {
9
- type["game:update"]?.(instance, event, options)
10
-
11
- const { instances } = options
12
- clampToBounds(instance, instances.game.bounds)
13
- },
14
- })
15
- }
@@ -1,48 +0,0 @@
1
- import modernMove from "@inglorious/engine/movement/dynamic/modern.js"
2
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
3
- import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
4
-
5
- const DEFAULT_PARAMS = {
6
- maxAcceleration: 500,
7
- }
8
- const X = 0
9
- const Z = 2
10
-
11
- export function enableModernControls(params) {
12
- params = extend(DEFAULT_PARAMS, params)
13
-
14
- return (type) =>
15
- extend(type, {
16
- "game:update"(instance, event, options) {
17
- type["game:update"]?.(instance, event, options)
18
-
19
- const maxAcceleration =
20
- instance.maxAcceleration ?? params.maxAcceleration
21
-
22
- const { input0 } = options.instances
23
- instance.acceleration = zero()
24
-
25
- if (input0.left) {
26
- instance.acceleration[X] = -maxAcceleration
27
- }
28
- if (input0.right) {
29
- instance.acceleration[X] = maxAcceleration
30
- }
31
- if (input0.down) {
32
- instance.acceleration[Z] = -maxAcceleration
33
- }
34
- if (input0.up) {
35
- instance.acceleration[Z] = maxAcceleration
36
- }
37
-
38
- if (input0.leftRight != null) {
39
- instance.acceleration[X] += input0.leftRight * maxAcceleration
40
- }
41
- if (input0.upDown != null) {
42
- instance.acceleration[Z] += -input0.upDown * maxAcceleration
43
- }
44
-
45
- merge(instance, modernMove(instance, options))
46
- },
47
- })
48
- }
@@ -1,47 +0,0 @@
1
- import face from "@inglorious/engine/ai/movement/dynamic/face.js"
2
- import tankMove from "@inglorious/engine/movement/dynamic/tank.js"
3
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
4
- import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
5
- import { pi } from "@inglorious/utils/math/trigonometry.js"
6
-
7
- const FULL_CIRCLE = 2
8
- const DEFAULT_PARAMS = {
9
- maxAngularSpeed: FULL_CIRCLE * pi(),
10
- maxSpeed: 250,
11
- }
12
- const X = 0
13
- const Z = 2
14
-
15
- export function enableShooterControls(params) {
16
- params = extend(DEFAULT_PARAMS, params)
17
-
18
- return (type) =>
19
- extend(type, {
20
- "game:update"(instance, event, options) {
21
- instance.maxAngularSpeed =
22
- instance.maxAngularSpeed ?? params.maxAngularSpeed
23
- instance.maxAcceleration =
24
- instance.maxAcceleration ?? params.maxAcceleration
25
- instance.maxSpeed = instance.maxSpeed ?? params.maxSpeed
26
-
27
- const { input0, mouse } = options.instances
28
- instance.acceleration = zero()
29
-
30
- if (input0.left) {
31
- instance.acceleration[Z] = -instance.maxAcceleration
32
- }
33
- if (input0.down) {
34
- instance.acceleration[X] = -instance.maxAcceleration
35
- }
36
- if (input0.right) {
37
- instance.acceleration[Z] = instance.maxAcceleration
38
- }
39
- if (input0.up) {
40
- instance.acceleration[X] = instance.maxAcceleration
41
- }
42
-
43
- merge(instance, face(instance, mouse, options))
44
- merge(instance, tankMove(instance, options))
45
- },
46
- })
47
- }
@@ -1,55 +0,0 @@
1
- import tankMove from "@inglorious/engine/movement/dynamic/tank.js"
2
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
3
- import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
4
-
5
- const DEFAULT_PARAMS = {
6
- maxAngularSpeed: 10,
7
- maxAcceleration: 500,
8
- maxSpeed: 250,
9
- }
10
- const X = 0
11
- const Z = 2
12
-
13
- export function enableTankControls(params) {
14
- params = extend(DEFAULT_PARAMS, params)
15
-
16
- return (type) =>
17
- extend(type, {
18
- "game:update"(instance, event, options) {
19
- instance.maxAngularSpeed =
20
- instance.maxAngularSpeed ?? params.maxAngularSpeed
21
- instance.maxAcceleration =
22
- instance.maxAcceleration ?? params.maxAcceleration
23
- instance.maxSpeed = instance.maxSpeed ?? params.maxSpeed
24
-
25
- instance.acceleration = zero()
26
-
27
- const { input0 } = options.instances
28
- if (input0.left) {
29
- instance.orientation += 0.1
30
- }
31
- if (input0.down) {
32
- instance.acceleration[X] = -instance.maxAcceleration
33
- }
34
- if (input0.right) {
35
- instance.orientation -= 0.1
36
- }
37
- if (input0.up) {
38
- instance.acceleration[X] = instance.maxAcceleration
39
- }
40
-
41
- if (input0.leftRight != null) {
42
- instance.orientation +=
43
- -input0.leftRight * instance.maxAngularSpeed * options.dt
44
- }
45
- if (input0.upDown != null) {
46
- instance.acceleration[X] += -input0.upDown * instance.maxAcceleration
47
- }
48
- if (input0.strafe != null) {
49
- instance.acceleration[Z] += input0.strafe * instance.maxAcceleration
50
- }
51
-
52
- merge(instance, tankMove(instance, options))
53
- },
54
- })
55
- }
@@ -1,49 +0,0 @@
1
- import modernMove from "@inglorious/engine/movement/kinematic/modern.js"
2
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
3
- import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
4
-
5
- const DEFAULT_PARAMS = {
6
- onState: "default",
7
- movementStrategy: "kinematic",
8
- maxSpeed: 250,
9
- }
10
- const X = 0
11
- const Z = 2
12
-
13
- export function enableModernControls(params) {
14
- params = extend(DEFAULT_PARAMS, params)
15
-
16
- return (type) =>
17
- extend(type, {
18
- "game:update"(instance, event, options) {
19
- type["game:update"]?.(instance, event, options)
20
-
21
- const maxSpeed = instance.maxSpeed ?? params.maxSpeed
22
-
23
- const { input0 } = options.instances
24
- instance.velocity = zero()
25
-
26
- if (input0.left) {
27
- instance.velocity[X] = -maxSpeed
28
- }
29
- if (input0.down) {
30
- instance.velocity[Z] = -maxSpeed
31
- }
32
- if (input0.right) {
33
- instance.velocity[X] = maxSpeed
34
- }
35
- if (input0.up) {
36
- instance.velocity[Z] = maxSpeed
37
- }
38
-
39
- if (input0.leftRight != null) {
40
- instance.velocity[X] += input0.leftRight * maxSpeed
41
- }
42
- if (input0.upDown != null) {
43
- instance.velocity[Z] += -input0.upDown * maxSpeed
44
- }
45
-
46
- merge(instance, modernMove(instance, options))
47
- },
48
- })
49
- }
@@ -1,45 +0,0 @@
1
- import face from "@inglorious/engine/ai/movement/kinematic/face.js"
2
- import tankMove from "@inglorious/engine/movement/kinematic/tank.js"
3
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
4
- import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
5
- import { pi } from "@inglorious/utils/math/trigonometry.js"
6
-
7
- const FULL_CIRCLE = 2
8
- const DEFAULT_PARAMS = {
9
- maxAngularSpeed: FULL_CIRCLE * pi(),
10
- maxSpeed: 250,
11
- }
12
- const X = 0
13
- const Z = 2
14
-
15
- export function enableShooterControls(params) {
16
- params = extend(DEFAULT_PARAMS, params)
17
-
18
- return (type) =>
19
- extend(type, {
20
- "game:update"(instance, event, options) {
21
- instance.maxAngularSpeed =
22
- instance.maxAngularSpeed ?? params.maxAngularSpeed
23
- instance.maxSpeed = instance.maxSpeed ?? params.maxSpeed
24
-
25
- const { input0, mouse } = options.instances
26
- instance.velocity = zero()
27
-
28
- if (input0.left) {
29
- instance.velocity[Z] = -instance.maxSpeed
30
- }
31
- if (input0.down) {
32
- instance.velocity[X] = -instance.maxSpeed
33
- }
34
- if (input0.right) {
35
- instance.velocity[Z] = instance.maxSpeed
36
- }
37
- if (input0.up) {
38
- instance.velocity[X] = instance.maxSpeed
39
- }
40
-
41
- merge(instance, face(instance, mouse, options))
42
- merge(instance, tankMove(instance, options))
43
- },
44
- })
45
- }