@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
@@ -1,50 +1,51 @@
1
- import {
2
- angle,
3
- clamp,
4
- divide,
5
- magnitude,
6
- multiply,
7
- zero,
8
- } from "@inglorious/utils/math/linear-algebra/vector.js"
9
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
10
-
11
- export const DEFAULT_TIME_TO_TARGET = 0.1
12
-
13
- const DEFAULT_MAX_ACCELERATION = 0
14
- const DEFAULT_MAX_SPEED = 0
15
- const DEFAULT_ORIENTATION = 0
16
-
17
- const MIN_ACCELERATION = 0
18
- const MIN_SPEED = 0
19
-
20
- const HALF_ACCELERATION = 0.5
21
-
22
- export default function matchVelocity(
23
- instance,
24
- target,
25
- { dt, timeToTarget = DEFAULT_TIME_TO_TARGET },
26
- ) {
27
- const maxAcceleration = instance.maxAcceleration ?? DEFAULT_MAX_ACCELERATION
28
- const maxSpeed = instance.maxSpeed ?? DEFAULT_MAX_SPEED
29
-
30
- let orientation = instance.orientation ?? DEFAULT_ORIENTATION
31
-
32
- let velocity = instance.velocity ?? zero()
33
- const velocityDelta = subtract(target.velocity, velocity)
34
-
35
- let acceleration = divide(velocityDelta, timeToTarget)
36
- acceleration = clamp(acceleration, MIN_ACCELERATION, maxAcceleration)
37
-
38
- velocity = sum(velocity, multiply(acceleration, dt))
39
- velocity = clamp(velocity, MIN_SPEED, maxSpeed)
40
-
41
- const position = sum(
42
- instance.position,
43
- multiply(velocity, dt),
44
- multiply(acceleration, HALF_ACCELERATION * dt * dt),
45
- )
46
-
47
- orientation = magnitude(velocity) ? angle(velocity) : orientation
48
-
49
- return { acceleration, velocity, position, orientation }
50
- }
1
+ import {
2
+ angle,
3
+ clamp,
4
+ divide,
5
+ magnitude,
6
+ multiply,
7
+ zero,
8
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
9
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
10
+
11
+ export const DEFAULT_TIME_TO_TARGET = 0.1
12
+
13
+ const DEFAULT_MAX_ACCELERATION = 0
14
+ const DEFAULT_MAX_SPEED = 0
15
+ const DEFAULT_ORIENTATION = 0
16
+
17
+ const MIN_ACCELERATION = 0
18
+ const MIN_SPEED = 0
19
+
20
+ const HALF_ACCELERATION = 0.5
21
+
22
+ export function matchVelocity(
23
+ entity,
24
+ target,
25
+ dt,
26
+ { timeToTarget = DEFAULT_TIME_TO_TARGET } = {},
27
+ ) {
28
+ const maxAcceleration = entity.maxAcceleration ?? DEFAULT_MAX_ACCELERATION
29
+ const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
30
+
31
+ let orientation = entity.orientation ?? DEFAULT_ORIENTATION
32
+
33
+ let velocity = entity.velocity ?? zero()
34
+ const velocityDelta = subtract(target.velocity, velocity)
35
+
36
+ let acceleration = divide(velocityDelta, timeToTarget)
37
+ acceleration = clamp(acceleration, MIN_ACCELERATION, maxAcceleration)
38
+
39
+ velocity = sum(velocity, multiply(acceleration, dt))
40
+ velocity = clamp(velocity, MIN_SPEED, maxSpeed)
41
+
42
+ const position = sum(
43
+ entity.position,
44
+ multiply(velocity, dt),
45
+ multiply(acceleration, HALF_ACCELERATION * dt * dt),
46
+ )
47
+
48
+ orientation = magnitude(velocity) ? angle(velocity) : orientation
49
+
50
+ return { acceleration, velocity, position, orientation }
51
+ }
@@ -1,38 +1,38 @@
1
- import {
2
- magnitude,
3
- multiply,
4
- zero,
5
- } from "@inglorious/utils/math/linear-algebra/vector.js"
6
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
7
-
8
- import seek from "./seek.js"
9
-
10
- export const DEFAULT_MAX_PREDICTION = 10
11
-
12
- export default function pursue(
13
- instance,
14
- target,
15
- { dt, maxPrediction = DEFAULT_MAX_PREDICTION },
16
- ) {
17
- const velocity = instance.velocity ?? zero()
18
-
19
- const direction = subtract(target.position, instance.position)
20
- const distance = magnitude(direction)
21
-
22
- if (!distance) {
23
- return instance
24
- }
25
-
26
- const speed = magnitude(velocity)
27
-
28
- let prediction
29
- if (speed <= distance / maxPrediction) {
30
- prediction = maxPrediction
31
- } else {
32
- prediction = distance / speed
33
- }
34
-
35
- const position = sum(target.position, multiply(target.velocity, prediction))
36
-
37
- return seek(instance, { ...target, position }, { dt })
38
- }
1
+ import { seek } from "@inglorious/engine/ai/movement/dynamic/seek.js"
2
+ import {
3
+ magnitude,
4
+ multiply,
5
+ zero,
6
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
7
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
8
+
9
+ export const DEFAULT_MAX_PREDICTION = 10
10
+
11
+ export function pursue(
12
+ entity,
13
+ target,
14
+ dt,
15
+ { maxPrediction = DEFAULT_MAX_PREDICTION } = {},
16
+ ) {
17
+ const velocity = entity.velocity ?? zero()
18
+
19
+ const direction = subtract(target.position, entity.position)
20
+ const distance = magnitude(direction)
21
+
22
+ if (!distance) {
23
+ return entity
24
+ }
25
+
26
+ const speed = magnitude(velocity)
27
+
28
+ let prediction
29
+ if (speed <= distance / maxPrediction) {
30
+ prediction = maxPrediction
31
+ } else {
32
+ prediction = distance / speed
33
+ }
34
+
35
+ const position = sum(target.position, multiply(target.velocity, prediction))
36
+
37
+ return seek(entity, { ...target, position }, dt)
38
+ }
@@ -1,44 +1,44 @@
1
- import {
2
- angle,
3
- clamp,
4
- magnitude,
5
- multiply,
6
- setMagnitude,
7
- zero,
8
- } from "@inglorious/utils/math/linear-algebra/vector.js"
9
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
10
-
11
- const DEFAULT_MAX_ACCELERATION = 0
12
- const DEFAULT_MAX_SPEED = 0
13
-
14
- const MIN_SPEED = 0
15
-
16
- const HALF_ACCELERATION = 0.5
17
-
18
- export default function seek(instance, target, { dt }) {
19
- const maxAcceleration = instance.maxAcceleration ?? DEFAULT_MAX_ACCELERATION
20
- const maxSpeed = instance.maxSpeed ?? DEFAULT_MAX_SPEED
21
-
22
- const direction = subtract(target.position, instance.position)
23
- const distance = magnitude(direction)
24
-
25
- if (!distance) {
26
- return instance
27
- }
28
-
29
- const acceleration = setMagnitude(direction, maxAcceleration)
30
-
31
- let velocity = instance.velocity ?? zero()
32
- velocity = sum(velocity, multiply(acceleration, dt))
33
- velocity = clamp(velocity, MIN_SPEED, maxSpeed)
34
-
35
- const position = sum(
36
- instance.position,
37
- multiply(velocity, dt),
38
- multiply(acceleration, HALF_ACCELERATION * dt * dt),
39
- )
40
-
41
- const orientation = angle(velocity)
42
-
43
- return { velocity, position, orientation }
44
- }
1
+ import {
2
+ angle,
3
+ clamp,
4
+ magnitude,
5
+ multiply,
6
+ setMagnitude,
7
+ zero,
8
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
9
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
10
+
11
+ const DEFAULT_MAX_ACCELERATION = 0
12
+ const DEFAULT_MAX_SPEED = 0
13
+
14
+ const MIN_SPEED = 0
15
+
16
+ const HALF_ACCELERATION = 0.5
17
+
18
+ export function seek(entity, target, dt) {
19
+ const maxAcceleration = entity.maxAcceleration ?? DEFAULT_MAX_ACCELERATION
20
+ const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
21
+
22
+ const direction = subtract(target.position, entity.position)
23
+ const distance = magnitude(direction)
24
+
25
+ if (!distance) {
26
+ return entity
27
+ }
28
+
29
+ const acceleration = setMagnitude(direction, maxAcceleration)
30
+
31
+ let velocity = entity.velocity ?? zero()
32
+ velocity = sum(velocity, multiply(acceleration, dt))
33
+ velocity = clamp(velocity, MIN_SPEED, maxSpeed)
34
+
35
+ const position = sum(
36
+ entity.position,
37
+ multiply(velocity, dt),
38
+ multiply(acceleration, HALF_ACCELERATION * dt * dt),
39
+ )
40
+
41
+ const orientation = angle(velocity)
42
+
43
+ return { velocity, position, orientation }
44
+ }
@@ -1,32 +1,31 @@
1
- import { createVector } from "@inglorious/utils/math/linear-algebra/vector.js"
2
- import { sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
3
- import { randomBinomial } from "@inglorious/utils/math/rng.js"
4
-
5
- import seek from "./seek.js"
6
-
7
- export const DEFAULT_WANDER_OFFSET = 100
8
- export const DEFAULT_WANDER_RADIUS = 100
9
-
10
- const DEFAULT_MAX_ANGULAR_SPEED = 0
11
-
12
- const DEFAULT_ORIENTATION = 0
13
-
14
- export default function wander(
15
- instance,
16
- {
17
- wanderOffset = DEFAULT_WANDER_OFFSET,
18
- wanderRadius = DEFAULT_WANDER_RADIUS,
19
- ...options
20
- },
21
- ) {
22
- const maxAngularSpeed = instance.maxAngularSpeed ?? DEFAULT_MAX_ANGULAR_SPEED
23
-
24
- let orientation = instance.orientation ?? DEFAULT_ORIENTATION
25
-
26
- let position = sum(instance.position, createVector(wanderOffset, orientation))
27
-
28
- orientation += randomBinomial() * maxAngularSpeed
29
- position = sum(position, createVector(wanderRadius, orientation))
30
-
31
- return seek(instance, { position }, options)
32
- }
1
+ import { seek } from "@inglorious/engine/ai/movement/dynamic/seek.js"
2
+ import { createVector } from "@inglorious/utils/math/linear-algebra/vector.js"
3
+ import { sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
4
+ import { randomBinomial } from "@inglorious/utils/math/rng.js"
5
+
6
+ export const DEFAULT_WANDER_OFFSET = 100
7
+ export const DEFAULT_WANDER_RADIUS = 100
8
+
9
+ const DEFAULT_MAX_ANGULAR_SPEED = 0
10
+
11
+ const DEFAULT_ORIENTATION = 0
12
+
13
+ export function wander(
14
+ entity,
15
+ dt,
16
+ {
17
+ wanderOffset = DEFAULT_WANDER_OFFSET,
18
+ wanderRadius = DEFAULT_WANDER_RADIUS,
19
+ } = {},
20
+ ) {
21
+ const maxAngularSpeed = entity.maxAngularSpeed ?? DEFAULT_MAX_ANGULAR_SPEED
22
+
23
+ let orientation = entity.orientation ?? DEFAULT_ORIENTATION
24
+
25
+ let position = sum(entity.position, createVector(wanderOffset, orientation))
26
+
27
+ orientation += randomBinomial() * maxAngularSpeed
28
+ position = sum(position, createVector(wanderRadius, orientation))
29
+
30
+ return seek(entity, { position }, dt)
31
+ }
@@ -1,37 +1,37 @@
1
- import { abs, clamp } from "@inglorious/utils/math/numbers.js"
2
- import { toRange } from "@inglorious/utils/math/trigonometry.js"
3
-
4
- export const DEFAULT_TARGET_RADIUS = 0.1
5
- export const DEFAULT_TIME_TO_TARGET = 0.1
6
-
7
- const DEFAULT_MAX_ANGULAR_SPEED = 0
8
-
9
- const DEFAULT_ORIENTATION = 0
10
-
11
- export default function align(
12
- instance,
13
- target,
14
- {
15
- dt,
16
- targetRadius = DEFAULT_TARGET_RADIUS,
17
- timeToTarget = DEFAULT_TIME_TO_TARGET,
18
- },
19
- ) {
20
- const maxAngularSpeed = instance.maxAngularSpeed ?? DEFAULT_MAX_ANGULAR_SPEED
21
-
22
- let orientation = instance.orientation ?? DEFAULT_ORIENTATION
23
-
24
- const direction = toRange(target.orientation - orientation)
25
- const distance = abs(direction)
26
-
27
- if (distance < targetRadius) {
28
- return instance
29
- }
30
-
31
- let angularVelocity = direction / timeToTarget
32
- angularVelocity = clamp(angularVelocity, -maxAngularSpeed, maxAngularSpeed)
33
-
34
- orientation += angularVelocity * dt
35
-
36
- return { orientation }
37
- }
1
+ import { abs, clamp } from "@inglorious/utils/math/numbers.js"
2
+ import { toRange } from "@inglorious/utils/math/trigonometry.js"
3
+
4
+ export const DEFAULT_TARGET_RADIUS = 0.1
5
+ export const DEFAULT_TIME_TO_TARGET = 0.1
6
+
7
+ const DEFAULT_MAX_ANGULAR_SPEED = 0
8
+
9
+ const DEFAULT_ORIENTATION = 0
10
+
11
+ export function align(
12
+ entity,
13
+ target,
14
+ dt,
15
+ {
16
+ targetRadius = DEFAULT_TARGET_RADIUS,
17
+ timeToTarget = DEFAULT_TIME_TO_TARGET,
18
+ } = {},
19
+ ) {
20
+ const maxAngularSpeed = entity.maxAngularSpeed ?? DEFAULT_MAX_ANGULAR_SPEED
21
+
22
+ let orientation = entity.orientation ?? DEFAULT_ORIENTATION
23
+
24
+ const direction = toRange(target.orientation - orientation)
25
+ const distance = abs(direction)
26
+
27
+ if (distance < targetRadius) {
28
+ return entity
29
+ }
30
+
31
+ let angularVelocity = direction / timeToTarget
32
+ angularVelocity = clamp(angularVelocity, -maxAngularSpeed, maxAngularSpeed)
33
+
34
+ orientation += angularVelocity * dt
35
+
36
+ return { orientation }
37
+ }
@@ -1,42 +1,42 @@
1
- import {
2
- angle,
3
- clamp,
4
- divide,
5
- magnitude,
6
- multiply,
7
- } from "@inglorious/utils/math/linear-algebra/vector.js"
8
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
9
-
10
- export const DEFAULT_TARGET_RADIUS = 1
11
- export const DEFAULT_TIME_TO_TARGET = 0.1
12
-
13
- const DEFAULT_MAX_SPEED = 0
14
-
15
- const MIN_SPEED = 0
16
-
17
- export default function arrive(
18
- instance,
19
- target,
20
- {
21
- dt,
22
- targetRadius = DEFAULT_TARGET_RADIUS,
23
- timeToTarget = DEFAULT_TIME_TO_TARGET,
24
- },
25
- ) {
26
- const maxSpeed = instance.maxSpeed ?? DEFAULT_MAX_SPEED
27
-
28
- const direction = subtract(target.position, instance.position)
29
- const distance = magnitude(direction)
30
-
31
- if (distance < targetRadius) {
32
- return instance
33
- }
34
-
35
- let velocity = divide(direction, timeToTarget)
36
- velocity = clamp(velocity, MIN_SPEED, maxSpeed)
37
-
38
- const position = sum(instance.position, multiply(velocity, dt))
39
- const orientation = angle(velocity)
40
-
41
- return { velocity, position, orientation }
42
- }
1
+ import {
2
+ angle,
3
+ clamp,
4
+ divide,
5
+ magnitude,
6
+ multiply,
7
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
8
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
9
+
10
+ export const DEFAULT_TARGET_RADIUS = 1
11
+ export const DEFAULT_TIME_TO_TARGET = 0.1
12
+
13
+ const DEFAULT_MAX_SPEED = 0
14
+
15
+ const MIN_SPEED = 0
16
+
17
+ export function arrive(
18
+ entity,
19
+ target,
20
+ dt,
21
+ {
22
+ targetRadius = DEFAULT_TARGET_RADIUS,
23
+ timeToTarget = DEFAULT_TIME_TO_TARGET,
24
+ } = {},
25
+ ) {
26
+ const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
27
+
28
+ const direction = subtract(target.position, entity.position)
29
+ const distance = magnitude(direction)
30
+
31
+ if (distance < targetRadius) {
32
+ return entity
33
+ }
34
+
35
+ let velocity = divide(direction, timeToTarget)
36
+ velocity = clamp(velocity, MIN_SPEED, maxSpeed)
37
+
38
+ const position = sum(entity.position, multiply(velocity, dt))
39
+ const orientation = angle(velocity)
40
+
41
+ return { velocity, position, orientation }
42
+ }
@@ -1,20 +1,19 @@
1
- import {
2
- angle,
3
- magnitude,
4
- } from "@inglorious/utils/math/linear-algebra/vector.js"
5
- import { subtract } from "@inglorious/utils/math/linear-algebra/vectors.js"
6
-
7
- import align from "./align.js"
8
-
9
- export default function face(instance, target, options) {
10
- const direction = subtract(target.position, instance.position)
11
- const distance = magnitude(direction)
12
-
13
- if (!distance) {
14
- return instance
15
- }
16
-
17
- const orientation = angle(direction)
18
-
19
- return align(instance, { ...target, orientation }, options)
20
- }
1
+ import { align } from "@inglorious/engine/ai/movement/kinematic/align.js"
2
+ import {
3
+ angle,
4
+ magnitude,
5
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
6
+ import { subtract } from "@inglorious/utils/math/linear-algebra/vectors.js"
7
+
8
+ export function face(entity, target, dt, options) {
9
+ const direction = subtract(target.position, entity.position)
10
+ const distance = magnitude(direction)
11
+
12
+ if (!distance) {
13
+ return entity
14
+ }
15
+
16
+ const orientation = angle(direction)
17
+
18
+ return align(entity, { ...target, orientation }, dt, options)
19
+ }
@@ -1,26 +1,26 @@
1
- import {
2
- angle,
3
- magnitude,
4
- multiply,
5
- setMagnitude,
6
- } from "@inglorious/utils/math/linear-algebra/vector.js"
7
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
8
-
9
- const DEFAULT_MAX_SPEED = 0
10
-
11
- export default function flee(instance, target, { dt }) {
12
- const maxSpeed = instance.maxSpeed ?? DEFAULT_MAX_SPEED
13
-
14
- const direction = subtract(instance.position, target.position)
15
- const distance = magnitude(direction)
16
-
17
- if (!distance) {
18
- return instance
19
- }
20
-
21
- const velocity = setMagnitude(direction, maxSpeed)
22
- const position = sum(instance.position, multiply(velocity, dt))
23
- const orientation = angle(velocity)
24
-
25
- return { velocity, position, orientation }
26
- }
1
+ import {
2
+ angle,
3
+ magnitude,
4
+ multiply,
5
+ setMagnitude,
6
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
7
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
8
+
9
+ const DEFAULT_MAX_SPEED = 0
10
+
11
+ export function flee(entity, target, dt) {
12
+ const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
13
+
14
+ const direction = subtract(entity.position, target.position)
15
+ const distance = magnitude(direction)
16
+
17
+ if (!distance) {
18
+ return entity
19
+ }
20
+
21
+ const velocity = setMagnitude(direction, maxSpeed)
22
+ const position = sum(entity.position, multiply(velocity, dt))
23
+ const orientation = angle(velocity)
24
+
25
+ return { velocity, position, orientation }
26
+ }
@@ -1,26 +1,26 @@
1
- import {
2
- angle,
3
- magnitude,
4
- multiply,
5
- setMagnitude,
6
- } from "@inglorious/utils/math/linear-algebra/vector.js"
7
- import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
8
-
9
- const DEFAULT_MAX_SPEED = 0
10
-
11
- export default function seek(instance, target, { dt }) {
12
- const maxSpeed = instance.maxSpeed ?? DEFAULT_MAX_SPEED
13
-
14
- const direction = subtract(target.position, instance.position)
15
- const distance = magnitude(direction)
16
-
17
- if (!distance) {
18
- return instance
19
- }
20
-
21
- const velocity = setMagnitude(direction, maxSpeed)
22
- const position = sum(instance.position, multiply(velocity, dt))
23
- const orientation = angle(velocity)
24
-
25
- return { velocity, position, orientation }
26
- }
1
+ import {
2
+ angle,
3
+ magnitude,
4
+ multiply,
5
+ setMagnitude,
6
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
7
+ import { subtract, sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
8
+
9
+ const DEFAULT_MAX_SPEED = 0
10
+
11
+ export function seek(entity, target, dt) {
12
+ const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
13
+
14
+ const direction = subtract(target.position, entity.position)
15
+ const distance = magnitude(direction)
16
+
17
+ if (!distance) {
18
+ return entity
19
+ }
20
+
21
+ const velocity = setMagnitude(direction, maxSpeed)
22
+ const position = sum(entity.position, multiply(velocity, dt))
23
+ const orientation = angle(velocity)
24
+
25
+ return { velocity, position, orientation }
26
+ }