@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.
Files changed (292) hide show
  1. package/README.md +39 -36
  2. package/package.json +20 -33
  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/docs/ai/movement/dynamic/align.js +0 -131
  157. package/src/docs/ai/movement/dynamic/arrive.js +0 -88
  158. package/src/docs/ai/movement/dynamic/dynamic.mdx +0 -99
  159. package/src/docs/ai/movement/dynamic/dynamic.stories.js +0 -58
  160. package/src/docs/ai/movement/dynamic/evade.js +0 -72
  161. package/src/docs/ai/movement/dynamic/face.js +0 -90
  162. package/src/docs/ai/movement/dynamic/flee.js +0 -38
  163. package/src/docs/ai/movement/dynamic/look-where-youre-going.js +0 -114
  164. package/src/docs/ai/movement/dynamic/match-velocity.js +0 -92
  165. package/src/docs/ai/movement/dynamic/pursue.js +0 -72
  166. package/src/docs/ai/movement/dynamic/seek.js +0 -37
  167. package/src/docs/ai/movement/dynamic/wander.js +0 -71
  168. package/src/docs/ai/movement/kinematic/align.js +0 -122
  169. package/src/docs/ai/movement/kinematic/arrive.js +0 -78
  170. package/src/docs/ai/movement/kinematic/face.js +0 -82
  171. package/src/docs/ai/movement/kinematic/flee.js +0 -36
  172. package/src/docs/ai/movement/kinematic/kinematic.mdx +0 -67
  173. package/src/docs/ai/movement/kinematic/kinematic.stories.js +0 -42
  174. package/src/docs/ai/movement/kinematic/seek.js +0 -34
  175. package/src/docs/ai/movement/kinematic/wander-as-seek.js +0 -62
  176. package/src/docs/ai/movement/kinematic/wander.js +0 -28
  177. package/src/docs/bounds.js +0 -7
  178. package/src/docs/code-reuse.js +0 -35
  179. package/src/docs/collision/circles.js +0 -58
  180. package/src/docs/collision/collision.mdx +0 -27
  181. package/src/docs/collision/collision.stories.js +0 -22
  182. package/src/docs/collision/platform.js +0 -76
  183. package/src/docs/collision/tilemap.js +0 -181
  184. package/src/docs/empty.js +0 -1
  185. package/src/docs/engine.mdx +0 -81
  186. package/src/docs/engine.stories.js +0 -37
  187. package/src/docs/event-handlers.js +0 -68
  188. package/src/docs/framerate.js +0 -37
  189. package/src/docs/game.jsx +0 -15
  190. package/src/docs/image/image.js +0 -19
  191. package/src/docs/image/image.stories.js +0 -22
  192. package/src/docs/image/sprite.js +0 -39
  193. package/src/docs/image/tilemap.js +0 -84
  194. package/src/docs/input/controls.js +0 -67
  195. package/src/docs/input/gamepad.js +0 -67
  196. package/src/docs/input/input.mdx +0 -55
  197. package/src/docs/input/input.stories.js +0 -27
  198. package/src/docs/input/keyboard.js +0 -58
  199. package/src/docs/input/mouse.js +0 -32
  200. package/src/docs/instances.js +0 -49
  201. package/src/docs/player/dynamic/double-jump.js +0 -90
  202. package/src/docs/player/dynamic/dynamic.stories.js +0 -32
  203. package/src/docs/player/dynamic/jump.js +0 -83
  204. package/src/docs/player/dynamic/modern-controls.js +0 -57
  205. package/src/docs/player/dynamic/shooter-controls.js +0 -51
  206. package/src/docs/player/dynamic/tank-controls.js +0 -44
  207. package/src/docs/player/kinematic/double-jump.js +0 -90
  208. package/src/docs/player/kinematic/jump.js +0 -82
  209. package/src/docs/player/kinematic/kinematic.stories.js +0 -32
  210. package/src/docs/player/kinematic/modern-controls.js +0 -56
  211. package/src/docs/player/kinematic/shooter-controls.js +0 -48
  212. package/src/docs/player/kinematic/tank-controls.js +0 -42
  213. package/src/docs/quick-start/first-game.js +0 -49
  214. package/src/docs/quick-start/hello-world.js +0 -1
  215. package/src/docs/quick-start.mdx +0 -127
  216. package/src/docs/quick-start.stories.js +0 -17
  217. package/src/docs/recipes/add-and-remove.js +0 -71
  218. package/src/docs/recipes/add-instance.js +0 -42
  219. package/src/docs/recipes/decision-tree.js +0 -169
  220. package/src/docs/recipes/random-instances.js +0 -25
  221. package/src/docs/recipes/recipes.mdx +0 -81
  222. package/src/docs/recipes/recipes.stories.js +0 -37
  223. package/src/docs/recipes/remove-instance.js +0 -52
  224. package/src/docs/recipes/states.js +0 -64
  225. package/src/docs/ui/button.js +0 -28
  226. package/src/docs/ui/form.stories.js +0 -55
  227. package/src/docs/ui-chooser.jsx +0 -6
  228. package/src/docs/utils/data-structures/object.mdx +0 -47
  229. package/src/docs/utils/data-structures/objects.mdx +0 -30
  230. package/src/docs/utils/functions/functions.mdx +0 -34
  231. package/src/docs/utils/math/geometry/circle.mdx +0 -55
  232. package/src/docs/utils/math/geometry/point.mdx +0 -38
  233. package/src/docs/utils/math/geometry/rectangle.mdx +0 -24
  234. package/src/docs/utils/math/geometry/segment.mdx +0 -55
  235. package/src/docs/utils/math/geometry/triangle.mdx +0 -22
  236. package/src/docs/utils/math/linear-algebra/2d.mdx +0 -22
  237. package/src/docs/utils/math/linear-algebra/quaternion.mdx +0 -21
  238. package/src/docs/utils/math/linear-algebra/quaternions.mdx +0 -22
  239. package/src/docs/utils/math/linear-algebra/vector.mdx +0 -177
  240. package/src/docs/utils/math/linear-algebra/vectors.mdx +0 -58
  241. package/src/docs/utils/math/numbers.mdx +0 -76
  242. package/src/docs/utils/math/random.mdx +0 -35
  243. package/src/docs/utils/math/statistics.mdx +0 -38
  244. package/src/docs/utils/math/trigonometry.mdx +0 -85
  245. package/src/docs/utils/physics/friction.mdx +0 -20
  246. package/src/docs/utils/physics/gravity.mdx +0 -28
  247. package/src/engine/loop.js +0 -15
  248. package/src/engine/store.js +0 -174
  249. package/src/engine/store.test.js +0 -256
  250. package/src/engine.js +0 -74
  251. package/src/game/animation.js +0 -26
  252. package/src/game/bounds.js +0 -66
  253. package/src/game/decorators/character.js +0 -5
  254. package/src/game/decorators/clamp-to-bounds.js +0 -15
  255. package/src/game/decorators/controls/dynamic/modern.js +0 -48
  256. package/src/game/decorators/controls/dynamic/shooter.js +0 -47
  257. package/src/game/decorators/controls/dynamic/tank.js +0 -55
  258. package/src/game/decorators/controls/kinematic/modern.js +0 -49
  259. package/src/game/decorators/controls/kinematic/shooter.js +0 -45
  260. package/src/game/decorators/controls/kinematic/tank.js +0 -52
  261. package/src/game/decorators/debug/collisions.js +0 -32
  262. package/src/game/decorators/double-jump.js +0 -70
  263. package/src/game/decorators/fps.js +0 -30
  264. package/src/game/decorators/fsm.js +0 -27
  265. package/src/game/decorators/game.js +0 -11
  266. package/src/game/decorators/image/image.js +0 -5
  267. package/src/game/decorators/image/sprite.js +0 -5
  268. package/src/game/decorators/image/tilemap.js +0 -5
  269. package/src/game/decorators/input/controls.js +0 -27
  270. package/src/game/decorators/input/gamepad.js +0 -74
  271. package/src/game/decorators/input/input.js +0 -41
  272. package/src/game/decorators/input/keyboard.js +0 -49
  273. package/src/game/decorators/input/mouse.js +0 -65
  274. package/src/game/decorators/jump.js +0 -72
  275. package/src/game/decorators/platform.js +0 -5
  276. package/src/game/decorators/ui/button.js +0 -21
  277. package/src/game/sprite.js +0 -119
  278. package/src/ui/canvas/absolute-position.js +0 -17
  279. package/src/ui/canvas/image/hitmask.js +0 -37
  280. package/src/ui/canvas.js +0 -81
  281. package/src/ui/react/game/character/index.jsx +0 -30
  282. package/src/utils/math/geometry/platform.js +0 -42
  283. package/src/utils/math/geometry/platform.test.js +0 -133
  284. /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
  285. /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
  286. /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
  287. /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
  288. /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
  289. /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
  290. /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
  291. /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
  292. /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
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
- }
@@ -1,52 +0,0 @@
1
- import tankMove from "@inglorious/engine/movement/kinematic/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
- maxSpeed: 250,
8
- }
9
- const X = 0
10
- const Z = 2
11
-
12
- export function enableTankControls(params) {
13
- params = extend(DEFAULT_PARAMS, params)
14
-
15
- return (type) =>
16
- extend(type, {
17
- "game:update"(instance, event, options) {
18
- instance.maxAngularSpeed =
19
- instance.maxAngularSpeed ?? params.maxAngularSpeed
20
- instance.maxSpeed = instance.maxSpeed ?? params.maxSpeed
21
-
22
- const { input0 } = options.instances
23
- instance.velocity = zero()
24
-
25
- if (input0.left) {
26
- instance.orientation += 0.1
27
- }
28
- if (input0.down) {
29
- instance.velocity[X] = -instance.maxSpeed
30
- }
31
- if (input0.right) {
32
- instance.orientation -= 0.1
33
- }
34
- if (input0.up) {
35
- instance.velocity[X] = instance.maxSpeed
36
- }
37
-
38
- if (input0.leftRight != null) {
39
- instance.orientation +=
40
- -input0.leftRight * instance.maxAngularSpeed * options.dt
41
- }
42
- if (input0.upDown != null) {
43
- instance.velocity[X] += -input0.upDown * instance.maxSpeed
44
- }
45
- if (input0.strafe != null) {
46
- instance.velocity[Z] += input0.strafe * instance.maxSpeed
47
- }
48
-
49
- merge(instance, tankMove(instance, options))
50
- },
51
- })
52
- }
@@ -1,32 +0,0 @@
1
- import drawHitmask from "@inglorious/ui/canvas/image/hitmask.js"
2
- import drawCircle from "@inglorious/ui/canvas/shapes/circle.js"
3
- import drawRectangle from "@inglorious/ui/canvas/shapes/rectangle.js"
4
- import { extend } from "@inglorious/utils/data-structures/objects.js"
5
-
6
- const Shape = {
7
- circle: drawCircle,
8
- rectangle: drawRectangle,
9
- hitmask: drawHitmask,
10
- }
11
-
12
- export function enableCollisionsDebug() {
13
- return (type) =>
14
- extend(type, {
15
- draw(ctx, instance, options) {
16
- type.draw(ctx, instance, options)
17
-
18
- if (!options.instances.game.debug) {
19
- return
20
- }
21
-
22
- ctx.save()
23
-
24
- Object.values(instance.collisions).forEach((collision) => {
25
- const draw = Shape[collision.shape]
26
- draw(ctx, { ...collision, color: "#00FF00" }, options)
27
- })
28
-
29
- ctx.restore()
30
- },
31
- })
32
- }
@@ -1,70 +0,0 @@
1
- import { collidesWith } from "@inglorious/engine/collision/detection.js"
2
- import { extend, merge } from "@inglorious/utils/data-structures/objects.js"
3
- import { applyGravity } from "@inglorious/utils/physics/gravity.js"
4
- import { jump } from "@inglorious/utils/physics/jump.js"
5
-
6
- import { enableFsm } from "./fsm.js"
7
-
8
- const DEFAULT_PARAMS = {
9
- onState: "default",
10
- onInput: "input0",
11
- maxSpeed: 250,
12
- maxJump: 100,
13
- maxLeap: 100,
14
- }
15
- const FALLING = 0
16
-
17
- export function enableDoubleJump(params) {
18
- params = extend(DEFAULT_PARAMS, params)
19
-
20
- const freeFall = createFreeFall(params)
21
-
22
- return enableFsm({
23
- jumping: {
24
- "input:press"(instance, event, options) {
25
- instance.onInput = instance.onInput ?? params.onInput
26
- instance.maxJump = instance.maxJump ?? params.maxJump
27
- instance.maxLeap = instance.maxLeap ?? params.maxLeap
28
- instance.maxSpeed = instance.maxSpeed ?? params.maxSpeed
29
-
30
- const { id, action } = event.payload
31
- if (id.endsWith(instance.onInput) && action === "jump") {
32
- instance.state = "doubleJumping"
33
- merge(instance, jump(instance, options))
34
- }
35
- },
36
- },
37
-
38
- doubleJumping: {
39
- "game:update"(instance, event, options) {
40
- freeFall(instance, event, options)
41
- },
42
- },
43
- })
44
- }
45
-
46
- // TODO: this is a copy-paste of jump.js. Can we reduce duplication?
47
- function createFreeFall(params) {
48
- return (instance, event, options) => {
49
- instance.maxLeap = instance.maxLeap ?? params.maxLeap
50
-
51
- merge(instance, applyGravity(instance, options))
52
-
53
- const { instances } = options
54
- const targets = Object.values(instances).filter(
55
- ({ type }) => type === "platform",
56
- )
57
-
58
- targets.forEach((target) => {
59
- if (instance.vy < FALLING && collidesWith(instance, target, "platform")) {
60
- instance.vy = 0
61
- const [x, , z] = instance.position
62
- const { radius } = instance.collisions.platform
63
- const [, targetY] = target.position
64
- const py = targetY + radius
65
- instance.position = [x, py, z]
66
- instance.state = params.onState
67
- }
68
- })
69
- }
70
- }
@@ -1,30 +0,0 @@
1
- import { Animation } from "@inglorious/game/animation.js"
2
- import draw from "@inglorious/ui/canvas/fps.js"
3
- import { extend } from "@inglorious/utils/data-structures/objects.js"
4
-
5
- const DEFAULT_PARAMS = {
6
- accuracy: 1,
7
- size: 16,
8
- speed: 1,
9
- defaultValue: 0.016666666666666666,
10
- }
11
-
12
- export function enableFps(params) {
13
- params = extend(DEFAULT_PARAMS, params)
14
-
15
- return {
16
- draw,
17
-
18
- "game:start"(instance) {
19
- instance.dt = instance.dt ?? params
20
- },
21
-
22
- "game:update"(instance, event, options) {
23
- Animation.play("dt", "default", instance, { ...options, onTick })
24
- },
25
- }
26
- }
27
-
28
- function onTick(instance, options) {
29
- instance.dt.value = options.dt
30
- }
@@ -1,27 +0,0 @@
1
- import { extend } from "@inglorious/utils/data-structures/objects.js"
2
-
3
- const DEFAULT_STATE = "default"
4
-
5
- export function enableFsm(states) {
6
- return (type) => {
7
- const uniqueEventNames = [
8
- ...new Set(Object.values(states).flatMap(Object.keys)),
9
- ]
10
-
11
- const newType = uniqueEventNames.reduce(
12
- (acc, eventName) => ({
13
- ...acc,
14
-
15
- [eventName](instance, event, options) {
16
- type[eventName]?.(instance, event, options)
17
-
18
- const state = states[instance.state ?? DEFAULT_STATE]
19
- state?.[eventName]?.(instance, event, options)
20
- },
21
- }),
22
- {},
23
- )
24
-
25
- return extend(type, newType)
26
- }
27
- }
@@ -1,11 +0,0 @@
1
- export function enableGame() {
2
- return {
3
- "keyboard:keyUp"(instance, event) {
4
- const code = event.payload
5
-
6
- if (code === "KeyC") {
7
- instance.debug = !instance.debug
8
- }
9
- },
10
- }
11
- }
@@ -1,5 +0,0 @@
1
- import draw from "@inglorious/ui/canvas/image/image.js"
2
-
3
- export function enableImage() {
4
- return { draw }
5
- }
@@ -1,5 +0,0 @@
1
- import draw from "@inglorious/ui/canvas/image/sprite.js"
2
-
3
- export function enableSprite() {
4
- return { draw }
5
- }
@@ -1,5 +0,0 @@
1
- import draw from "@inglorious/ui/canvas/image/tilemap.js"
2
-
3
- export function enableTilemap() {
4
- return { draw }
5
- }