@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.
- package/README.md +39 -36
- package/package.json +10 -22
- package/src/engine/ai/movement/dynamic/align.js +63 -63
- package/src/engine/ai/movement/dynamic/arrive.js +42 -43
- package/src/engine/ai/movement/dynamic/evade.js +38 -38
- package/src/engine/ai/movement/dynamic/face.js +19 -20
- package/src/engine/ai/movement/dynamic/flee.js +45 -45
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
- package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
- package/src/engine/ai/movement/dynamic/pursue.js +38 -38
- package/src/engine/ai/movement/dynamic/seek.js +44 -44
- package/src/engine/ai/movement/dynamic/wander.js +31 -32
- package/src/engine/ai/movement/kinematic/align.js +37 -37
- package/src/engine/ai/movement/kinematic/arrive.js +42 -42
- package/src/engine/ai/movement/kinematic/face.js +19 -20
- package/src/engine/ai/movement/kinematic/flee.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
- package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
- package/src/engine/ai/movement/kinematic/wander.js +27 -27
- package/src/engine/animation/sprite.js +101 -0
- package/src/engine/animation/ticker.js +38 -0
- package/src/engine/behaviors/camera.js +68 -0
- package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
- package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
- package/src/engine/behaviors/controls/event-handlers.js +17 -0
- package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
- package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
- package/src/engine/behaviors/debug/collision.js +35 -0
- package/src/engine/behaviors/fps.js +29 -0
- package/src/engine/behaviors/fsm.js +33 -0
- package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
- package/src/engine/behaviors/game.js +15 -0
- package/src/engine/behaviors/input/controls.js +37 -0
- package/src/engine/behaviors/input/gamepad.js +114 -0
- package/src/engine/behaviors/input/input.js +48 -0
- package/src/engine/behaviors/input/keyboard.js +64 -0
- package/src/engine/behaviors/input/mouse.js +91 -0
- package/src/engine/behaviors/physics/bouncy.js +25 -0
- package/src/engine/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
- package/src/engine/behaviors/physics/jumpable.js +145 -0
- package/src/engine/behaviors/ui/button.js +17 -0
- package/src/engine/collision/detection.js +110 -115
- package/src/engine/core/api.js +34 -0
- package/src/engine/core/dev-tools.js +135 -0
- package/src/engine/core/engine.js +119 -0
- package/src/engine/core/loop.js +15 -0
- package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
- package/src/engine/{loop → core/loops}/elapsed.js +22 -23
- package/src/engine/{loop → core/loops}/fixed.js +27 -28
- package/src/engine/{loop → core/loops}/flash.js +13 -14
- package/src/engine/{loop → core/loops}/lag.js +26 -27
- package/src/engine/core/select.js +26 -0
- package/src/engine/core/store.js +178 -0
- package/src/engine/core/store.test.js +110 -0
- package/src/engine/movement/dynamic/modern.js +21 -24
- package/src/engine/movement/dynamic/tank.js +43 -43
- package/src/engine/movement/kinematic/modern.js +16 -16
- package/src/engine/movement/kinematic/modern.test.js +27 -27
- package/src/engine/movement/kinematic/tank.js +27 -27
- package/src/engine/physics/bounds.js +138 -0
- package/src/engine/physics/position.js +43 -0
- package/src/engine/physics/position.test.js +80 -0
- package/src/engine/systems/sprite-animation.js +27 -0
- package/src/main.js +10 -5
- package/src/renderers/canvas/absolute-position.js +18 -0
- package/src/renderers/canvas/camera.js +13 -0
- package/src/renderers/canvas/canvas-renderer.js +68 -0
- package/src/{ui → renderers}/canvas/character.js +38 -35
- package/src/{ui → renderers}/canvas/form/button.js +25 -25
- package/src/{ui → renderers}/canvas/fps.js +18 -18
- package/src/renderers/canvas/image/hitmask.js +51 -0
- package/src/{ui → renderers}/canvas/image/image.js +34 -37
- package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
- package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
- package/src/{ui → renderers}/canvas/mouse.js +37 -37
- package/src/renderers/canvas/rendering-system.js +79 -0
- package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
- package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
- package/src/renderers/react/game/character/index.jsx +20 -0
- package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
- package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
- package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
- package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
- package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
- package/src/{ui → renderers}/react/game/game.jsx +72 -71
- package/src/{ui → renderers}/react/game/index.jsx +29 -29
- package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
- package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
- package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
- package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
- package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
- package/src/{ui → renderers}/react/index.jsx +9 -9
- package/src/utils/algorithms/decision-tree.js +24 -24
- package/src/utils/algorithms/decision-tree.test.js +153 -102
- package/src/utils/algorithms/path-finding.js +155 -155
- package/src/utils/algorithms/path-finding.test.js +151 -151
- package/src/utils/data-structures/array.js +83 -83
- package/src/utils/data-structures/array.test.js +173 -173
- package/src/utils/data-structures/board.js +159 -159
- package/src/utils/data-structures/board.test.js +242 -242
- package/src/utils/data-structures/boolean.js +9 -9
- package/src/utils/data-structures/heap.js +164 -164
- package/src/utils/data-structures/heap.test.js +103 -103
- package/src/utils/data-structures/object.js +138 -102
- package/src/utils/data-structures/object.test.js +218 -121
- package/src/utils/data-structures/objects.js +66 -48
- package/src/utils/data-structures/objects.test.js +99 -99
- package/src/utils/data-structures/tree.js +36 -36
- package/src/utils/data-structures/tree.test.js +33 -33
- package/src/utils/functions/functions.js +19 -19
- package/src/utils/functions/functions.test.js +23 -23
- package/src/utils/math/geometry/circle.js +70 -117
- package/src/utils/math/geometry/circle.test.js +97 -97
- package/src/utils/math/geometry/hitmask.js +70 -39
- package/src/utils/math/geometry/hitmask.test.js +155 -84
- package/src/utils/math/geometry/line.js +35 -35
- package/src/utils/math/geometry/line.test.js +49 -49
- package/src/utils/math/geometry/point.js +78 -71
- package/src/utils/math/geometry/point.test.js +81 -81
- package/src/utils/math/geometry/rectangle.js +76 -45
- package/src/utils/math/geometry/rectangle.test.js +42 -42
- package/src/utils/math/geometry/segment.js +80 -80
- package/src/utils/math/geometry/segment.test.js +183 -183
- package/src/utils/math/geometry/triangle.js +15 -15
- package/src/utils/math/geometry/triangle.test.js +11 -11
- package/src/utils/math/linear-algebra/2d.js +28 -28
- package/src/utils/math/linear-algebra/2d.test.js +17 -17
- package/src/utils/math/linear-algebra/quaternion.js +22 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
- package/src/utils/math/linear-algebra/quaternions.js +20 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
- package/src/utils/math/linear-algebra/vector.js +327 -302
- package/src/utils/math/linear-algebra/vector.test.js +265 -257
- package/src/utils/math/linear-algebra/vectors.js +122 -122
- package/src/utils/math/linear-algebra/vectors.test.js +65 -65
- package/src/utils/math/linear-interpolation.js +9 -0
- package/src/utils/math/numbers.js +90 -90
- package/src/utils/math/numbers.test.js +137 -137
- package/src/utils/math/rng.js +44 -44
- package/src/utils/math/rng.test.js +39 -39
- package/src/utils/math/statistics.js +43 -43
- package/src/utils/math/statistics.test.js +47 -47
- package/src/utils/math/trigonometry.js +89 -89
- package/src/utils/math/trigonometry.test.js +52 -52
- package/src/utils/physics/acceleration.js +61 -63
- package/src/utils/physics/friction.js +28 -30
- package/src/utils/physics/friction.test.js +42 -44
- package/src/utils/physics/gravity.js +69 -71
- package/src/utils/physics/gravity.test.js +77 -80
- package/src/utils/physics/jump.js +31 -41
- package/src/utils/physics/velocity.js +36 -38
- package/src/engine/loop.js +0 -15
- package/src/engine/store.js +0 -174
- package/src/engine/store.test.js +0 -256
- package/src/engine.js +0 -74
- package/src/game/animation.js +0 -26
- package/src/game/bounds.js +0 -66
- package/src/game/decorators/character.js +0 -5
- package/src/game/decorators/clamp-to-bounds.js +0 -15
- package/src/game/decorators/controls/dynamic/modern.js +0 -48
- package/src/game/decorators/controls/dynamic/shooter.js +0 -47
- package/src/game/decorators/controls/dynamic/tank.js +0 -55
- package/src/game/decorators/controls/kinematic/modern.js +0 -49
- package/src/game/decorators/controls/kinematic/shooter.js +0 -45
- package/src/game/decorators/controls/kinematic/tank.js +0 -52
- package/src/game/decorators/debug/collisions.js +0 -32
- package/src/game/decorators/double-jump.js +0 -70
- package/src/game/decorators/fps.js +0 -30
- package/src/game/decorators/fsm.js +0 -27
- package/src/game/decorators/game.js +0 -11
- package/src/game/decorators/image/image.js +0 -5
- package/src/game/decorators/image/sprite.js +0 -5
- package/src/game/decorators/image/tilemap.js +0 -5
- package/src/game/decorators/input/controls.js +0 -27
- package/src/game/decorators/input/gamepad.js +0 -74
- package/src/game/decorators/input/input.js +0 -41
- package/src/game/decorators/input/keyboard.js +0 -49
- package/src/game/decorators/input/mouse.js +0 -65
- package/src/game/decorators/jump.js +0 -72
- package/src/game/decorators/platform.js +0 -5
- package/src/game/decorators/ui/button.js +0 -21
- package/src/game/sprite.js +0 -119
- package/src/ui/canvas/absolute-position.js +0 -17
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
- /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
|
@@ -1,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
|
|
23
|
-
|
|
24
|
-
target,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
acceleration =
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
velocity =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
multiply(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
{
|
|
16
|
-
) {
|
|
17
|
-
const velocity =
|
|
18
|
-
|
|
19
|
-
const direction = subtract(target.position,
|
|
20
|
-
const distance = magnitude(direction)
|
|
21
|
-
|
|
22
|
-
if (!distance) {
|
|
23
|
-
return
|
|
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(
|
|
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
|
|
19
|
-
const maxAcceleration =
|
|
20
|
-
const maxSpeed =
|
|
21
|
-
|
|
22
|
-
const direction = subtract(target.position,
|
|
23
|
-
const distance = magnitude(direction)
|
|
24
|
-
|
|
25
|
-
if (!distance) {
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const acceleration = setMagnitude(direction, maxAcceleration)
|
|
30
|
-
|
|
31
|
-
let velocity =
|
|
32
|
-
velocity = sum(velocity, multiply(acceleration, dt))
|
|
33
|
-
velocity = clamp(velocity, MIN_SPEED, maxSpeed)
|
|
34
|
-
|
|
35
|
-
const position = sum(
|
|
36
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
wanderOffset = DEFAULT_WANDER_OFFSET,
|
|
18
|
-
wanderRadius = DEFAULT_WANDER_RADIUS,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
12
|
-
|
|
13
|
-
target,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
targetRadius = DEFAULT_TARGET_RADIUS,
|
|
17
|
-
timeToTarget = DEFAULT_TIME_TO_TARGET,
|
|
18
|
-
},
|
|
19
|
-
) {
|
|
20
|
-
const maxAngularSpeed =
|
|
21
|
-
|
|
22
|
-
let orientation =
|
|
23
|
-
|
|
24
|
-
const direction = toRange(target.orientation - orientation)
|
|
25
|
-
const distance = abs(direction)
|
|
26
|
-
|
|
27
|
-
if (distance < targetRadius) {
|
|
28
|
-
return
|
|
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
|
|
18
|
-
|
|
19
|
-
target,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
targetRadius = DEFAULT_TARGET_RADIUS,
|
|
23
|
-
timeToTarget = DEFAULT_TIME_TO_TARGET,
|
|
24
|
-
},
|
|
25
|
-
) {
|
|
26
|
-
const maxSpeed =
|
|
27
|
-
|
|
28
|
-
const direction = subtract(target.position,
|
|
29
|
-
const distance = magnitude(direction)
|
|
30
|
-
|
|
31
|
-
if (distance < targetRadius) {
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
let velocity = divide(direction, timeToTarget)
|
|
36
|
-
velocity = clamp(velocity, MIN_SPEED, maxSpeed)
|
|
37
|
-
|
|
38
|
-
const position = sum(
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
12
|
-
const maxSpeed =
|
|
13
|
-
|
|
14
|
-
const direction = subtract(
|
|
15
|
-
const distance = magnitude(direction)
|
|
16
|
-
|
|
17
|
-
if (!distance) {
|
|
18
|
-
return
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const velocity = setMagnitude(direction, maxSpeed)
|
|
22
|
-
const position = sum(
|
|
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
|
|
12
|
-
const maxSpeed =
|
|
13
|
-
|
|
14
|
-
const direction = subtract(target.position,
|
|
15
|
-
const distance = magnitude(direction)
|
|
16
|
-
|
|
17
|
-
if (!distance) {
|
|
18
|
-
return
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const velocity = setMagnitude(direction, maxSpeed)
|
|
22
|
-
const position = sum(
|
|
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
|
+
}
|