@aura3d/engine 1.5.0 → 1.5.1
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 +77 -46
- package/dist/engine/agent-api/ApplicationKits.d.ts +307 -0
- package/dist/engine/agent-api/ApplicationKits.d.ts.map +1 -0
- package/dist/engine/agent-api/ApplicationKits.js +650 -0
- package/dist/engine/agent-api/ApplicationKits.js.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts +210 -0
- package/dist/engine/agent-api/CombatFrameData.d.ts.map +1 -0
- package/dist/engine/agent-api/CombatFrameData.js +324 -0
- package/dist/engine/agent-api/CombatFrameData.js.map +1 -0
- package/dist/engine/agent-api/FocusSelection.d.ts +186 -0
- package/dist/engine/agent-api/FocusSelection.d.ts.map +1 -0
- package/dist/engine/agent-api/FocusSelection.js +436 -0
- package/dist/engine/agent-api/FocusSelection.js.map +1 -0
- package/dist/engine/agent-api/GameGenreKits.d.ts +32 -1
- package/dist/engine/agent-api/GameGenreKits.d.ts.map +1 -1
- package/dist/engine/agent-api/GameGenreKits.js +51 -7
- package/dist/engine/agent-api/GameGenreKits.js.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts +10 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.d.ts.map +1 -1
- package/dist/engine/agent-api/GameSceneGeometryBindings.js +7 -0
- package/dist/engine/agent-api/GameSceneGeometryBindings.js.map +1 -1
- package/dist/engine/agent-api/PlatformerMotion.d.ts +177 -0
- package/dist/engine/agent-api/PlatformerMotion.d.ts.map +1 -0
- package/dist/engine/agent-api/PlatformerMotion.js +207 -0
- package/dist/engine/agent-api/PlatformerMotion.js.map +1 -0
- package/dist/engine/agent-api/SceneQueries.d.ts +124 -0
- package/dist/engine/agent-api/SceneQueries.d.ts.map +1 -0
- package/dist/engine/agent-api/SceneQueries.js +221 -0
- package/dist/engine/agent-api/SceneQueries.js.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts +232 -0
- package/dist/engine/agent-api/SpatialAnchoring.d.ts.map +1 -0
- package/dist/engine/agent-api/SpatialAnchoring.js +348 -0
- package/dist/engine/agent-api/SpatialAnchoring.js.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts +192 -0
- package/dist/engine/agent-api/VehicleChassis.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleChassis.js +322 -0
- package/dist/engine/agent-api/VehicleChassis.js.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts +123 -0
- package/dist/engine/agent-api/VehicleDriverAi.d.ts.map +1 -0
- package/dist/engine/agent-api/VehicleDriverAi.js +217 -0
- package/dist/engine/agent-api/VehicleDriverAi.js.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts +146 -0
- package/dist/engine/agent-api/WorldLabelRenderer.d.ts.map +1 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js +331 -0
- package/dist/engine/agent-api/WorldLabelRenderer.js.map +1 -0
- package/dist/engine/agent-api/index.d.ts +30 -0
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +87 -1
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationKits.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/ApplicationKits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable frame-based combat model: frame data, spacing and a credible AI.
|
|
3
|
+
*
|
|
4
|
+
* ## The defects this addresses
|
|
5
|
+
*
|
|
6
|
+
* Aura Clash's attacks were reported as unrealistic, with weak spacing, limited
|
|
7
|
+
* momentum, and animations that do not correspond convincingly to hits. Converting
|
|
8
|
+
* the shipped move table to frames at 60fps shows why:
|
|
9
|
+
*
|
|
10
|
+
* | move | startup | active | recovery |
|
|
11
|
+
* | ------- | ------- | ------ | -------- |
|
|
12
|
+
* | light | 4 | **12** | **4** |
|
|
13
|
+
* | heavy | 6 | **17** | **5** |
|
|
14
|
+
* | special | 5 | **32** | **4** |
|
|
15
|
+
*
|
|
16
|
+
* Real fighting-game frame data is the opposite shape: a short active window (2-5
|
|
17
|
+
* frames) and a long recovery (10-30 frames). Aura Clash's active windows are 3-8x
|
|
18
|
+
* too long and its recoveries 3-6x too short, which has three consequences:
|
|
19
|
+
*
|
|
20
|
+
* 1. **Hits do not correspond to the animation.** A 32-frame active window on the
|
|
21
|
+
* special means the hitbox is live for over half a second, so damage lands at
|
|
22
|
+
* moments that look nothing like contact -- the reported "attack dealing damage
|
|
23
|
+
* before contact".
|
|
24
|
+
* 2. **No spacing game.** With a 12-frame active window and a 4-frame recovery, an
|
|
25
|
+
* attack is nearly always safe. Whiffing costs almost nothing, so there is no
|
|
26
|
+
* reason to respect range and no punish window to aim for. That is precisely
|
|
27
|
+
* "weak spacing".
|
|
28
|
+
* 3. **No trades or momentum.** Blockstun and hitstun cannot create meaningful
|
|
29
|
+
* advantage when every move recovers in four frames.
|
|
30
|
+
*
|
|
31
|
+
* The engine defect is that nothing validated frame data as frame data. A move table
|
|
32
|
+
* could declare any startup/active/recovery split and no check compared it against the
|
|
33
|
+
* shape that makes a combat system readable.
|
|
34
|
+
*
|
|
35
|
+
* This module adds that check ({@link validateCombatFrameData}), a solver that derives
|
|
36
|
+
* balanced frame data from an intended move role ({@link solveCombatFrameData}), and a
|
|
37
|
+
* reactive AI ({@link createCombatAi}) that behaves like an opponent: it respects
|
|
38
|
+
* range, reacts with a delay, blocks what it sees, and punishes what it can.
|
|
39
|
+
*
|
|
40
|
+
* Pure and dependency-free.
|
|
41
|
+
*/
|
|
42
|
+
export type CombatMoveRole = "jab" | "light" | "medium" | "heavy" | "launcher" | "special";
|
|
43
|
+
export interface CombatFrameData {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
/** Frames before the hitbox becomes active. */
|
|
46
|
+
readonly startup: number;
|
|
47
|
+
/** Frames the hitbox is live. */
|
|
48
|
+
readonly active: number;
|
|
49
|
+
/** Frames after the active window during which the attacker cannot act. */
|
|
50
|
+
readonly recovery: number;
|
|
51
|
+
/** Frames the defender is stunned on hit. */
|
|
52
|
+
readonly hitstun: number;
|
|
53
|
+
/** Frames the defender is stunned on block. */
|
|
54
|
+
readonly blockstun: number;
|
|
55
|
+
/** Horizontal reach of the hitbox, in world units. */
|
|
56
|
+
readonly range: number;
|
|
57
|
+
readonly damage: number;
|
|
58
|
+
/** Knockback impulse applied on hit. */
|
|
59
|
+
readonly knockback: number;
|
|
60
|
+
/** Frames both fighters freeze on contact, which sells the impact. */
|
|
61
|
+
readonly hitstop: number;
|
|
62
|
+
}
|
|
63
|
+
export interface CombatFrameAdvantage {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
/**
|
|
66
|
+
* Frame advantage on hit: positive means the attacker acts first afterwards.
|
|
67
|
+
*
|
|
68
|
+
* `hitstun - recovery`. A move that is heavily plus on hit can start a combo; one
|
|
69
|
+
* that is minus on hit cannot.
|
|
70
|
+
*/
|
|
71
|
+
readonly onHit: number;
|
|
72
|
+
/**
|
|
73
|
+
* Frame advantage on block. Negative means the defender can act first and punish.
|
|
74
|
+
*
|
|
75
|
+
* This is the number that creates a spacing game. When every move is plus on block
|
|
76
|
+
* there is no risk in attacking.
|
|
77
|
+
*/
|
|
78
|
+
readonly onBlock: number;
|
|
79
|
+
/** Frames the attacker is helpless after a whiff: the punish window. */
|
|
80
|
+
readonly whiffPunishWindow: number;
|
|
81
|
+
/** Total frames the move occupies. */
|
|
82
|
+
readonly totalFrames: number;
|
|
83
|
+
}
|
|
84
|
+
/** Frame advantage for a move. */
|
|
85
|
+
export declare function combatFrameAdvantage(move: CombatFrameData): CombatFrameAdvantage;
|
|
86
|
+
export interface CombatFrameCheck {
|
|
87
|
+
readonly id: string;
|
|
88
|
+
readonly moveId: string;
|
|
89
|
+
readonly description: string;
|
|
90
|
+
readonly passes: boolean;
|
|
91
|
+
readonly detail: string;
|
|
92
|
+
}
|
|
93
|
+
export interface CombatFrameReport {
|
|
94
|
+
readonly schema: "aura3d-combat-frame-data/1.0";
|
|
95
|
+
readonly moves: readonly (CombatFrameData & {
|
|
96
|
+
readonly advantage: CombatFrameAdvantage;
|
|
97
|
+
})[];
|
|
98
|
+
readonly checks: readonly CombatFrameCheck[];
|
|
99
|
+
readonly passes: boolean;
|
|
100
|
+
}
|
|
101
|
+
export interface CombatFrameLimits {
|
|
102
|
+
/** Longest readable active window. Real games use 2-5 frames. */
|
|
103
|
+
readonly maxActiveFrames?: number | undefined;
|
|
104
|
+
/** Shortest active window that can still connect reliably. */
|
|
105
|
+
readonly minActiveFrames?: number | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Minimum recovery as a multiple of the active window.
|
|
108
|
+
*
|
|
109
|
+
* This is the ratio that creates risk. Below roughly 2x an attack is nearly free.
|
|
110
|
+
*/
|
|
111
|
+
readonly minRecoveryToActiveRatio?: number | undefined;
|
|
112
|
+
/** Maximum frame advantage on block. Above 0 every move is safe. */
|
|
113
|
+
readonly maxOnBlock?: number | undefined;
|
|
114
|
+
/** Minimum punish window after a whiff, in frames. */
|
|
115
|
+
readonly minWhiffPunishWindow?: number | undefined;
|
|
116
|
+
/** Minimum hitstop, so contact reads as impact. */
|
|
117
|
+
readonly minHitstop?: number | undefined;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate a move table as frame data.
|
|
121
|
+
*
|
|
122
|
+
* This is the check that did not exist. It fails a table whose active windows are so
|
|
123
|
+
* long that damage cannot correspond to the animation, and one whose recoveries are so
|
|
124
|
+
* short that whiffing carries no risk.
|
|
125
|
+
*/
|
|
126
|
+
export declare function validateCombatFrameData(moves: readonly CombatFrameData[], limits?: CombatFrameLimits): CombatFrameReport;
|
|
127
|
+
export interface CombatMoveRequest {
|
|
128
|
+
readonly id: string;
|
|
129
|
+
readonly role: CombatMoveRole;
|
|
130
|
+
/** Reach in world units. Longer moves are made slower to start. */
|
|
131
|
+
readonly range: number;
|
|
132
|
+
/** Damage, used to scale risk. */
|
|
133
|
+
readonly damage: number;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Derive balanced frame data from a move's intended role.
|
|
137
|
+
*
|
|
138
|
+
* Reach adds startup, because a longer poke should be slower to commit to. Damage adds
|
|
139
|
+
* recovery, so a big hit is a bigger risk. Neither is a free parameter.
|
|
140
|
+
*/
|
|
141
|
+
export declare function solveCombatFrameData(request: CombatMoveRequest, options?: {
|
|
142
|
+
readonly referenceRange?: number | undefined;
|
|
143
|
+
readonly referenceDamage?: number | undefined;
|
|
144
|
+
}): CombatFrameData;
|
|
145
|
+
export type CombatAiAggression = "defensive" | "balanced" | "aggressive";
|
|
146
|
+
export interface CombatAiConfig {
|
|
147
|
+
readonly moves: readonly CombatFrameData[];
|
|
148
|
+
/**
|
|
149
|
+
* Reaction delay in frames.
|
|
150
|
+
*
|
|
151
|
+
* A zero-delay AI is not a credible opponent: it blocks the instant a button is
|
|
152
|
+
* pressed, which reads as cheating rather than as skill. Human reaction is roughly
|
|
153
|
+
* 12-18 frames at 60fps.
|
|
154
|
+
*/
|
|
155
|
+
readonly reactionFrames?: number | undefined;
|
|
156
|
+
/** Preferred distance to hold, in world units. Defaults to just outside its best poke. */
|
|
157
|
+
readonly preferredRange?: number | undefined;
|
|
158
|
+
readonly aggression?: CombatAiAggression | undefined;
|
|
159
|
+
/** Frames to wait after acting before acting again. */
|
|
160
|
+
readonly cooldownFrames?: number | undefined;
|
|
161
|
+
/** Deterministic seed. */
|
|
162
|
+
readonly seed?: number | undefined;
|
|
163
|
+
}
|
|
164
|
+
export interface CombatAiObservation {
|
|
165
|
+
/** Horizontal distance to the opponent. */
|
|
166
|
+
readonly distance: number;
|
|
167
|
+
/** Opponent's current move id, or undefined when neutral. */
|
|
168
|
+
readonly opponentMoveId?: string | undefined;
|
|
169
|
+
/** Frames the opponent's current move has been running. */
|
|
170
|
+
readonly opponentMoveFrame?: number | undefined;
|
|
171
|
+
/** True when the AI is currently in hitstun or blockstun and cannot act. */
|
|
172
|
+
readonly stunned?: boolean | undefined;
|
|
173
|
+
/** Frames remaining in the AI's own current move, 0 when free. */
|
|
174
|
+
readonly ownRecoveryFrames?: number | undefined;
|
|
175
|
+
readonly ownHealthFraction?: number | undefined;
|
|
176
|
+
readonly opponentHealthFraction?: number | undefined;
|
|
177
|
+
}
|
|
178
|
+
export interface CombatAiDecision {
|
|
179
|
+
/** Move to start this frame, or undefined to hold. */
|
|
180
|
+
readonly moveId: string | undefined;
|
|
181
|
+
/** Whether to block. */
|
|
182
|
+
readonly block: boolean;
|
|
183
|
+
/** Movement intent: -1 retreat, 0 hold, 1 advance. */
|
|
184
|
+
readonly approach: -1 | 0 | 1;
|
|
185
|
+
/** Why this decision was made, for evidence and debugging. */
|
|
186
|
+
readonly reason: string;
|
|
187
|
+
}
|
|
188
|
+
export interface CombatAi {
|
|
189
|
+
readonly kind: "aura-combat-ai";
|
|
190
|
+
decide(observation: CombatAiObservation): CombatAiDecision;
|
|
191
|
+
reset(): void;
|
|
192
|
+
telemetry(): {
|
|
193
|
+
readonly reactionFrames: number;
|
|
194
|
+
readonly preferredRange: number;
|
|
195
|
+
readonly aggression: CombatAiAggression;
|
|
196
|
+
readonly decisionCount: number;
|
|
197
|
+
readonly punishAttempts: number;
|
|
198
|
+
readonly blockAttempts: number;
|
|
199
|
+
readonly lastDecision: CombatAiDecision;
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Create a reactive combat AI.
|
|
204
|
+
*
|
|
205
|
+
* Behaves like an opponent rather than a timer: it holds a preferred range, reacts to a
|
|
206
|
+
* telegraphed attack after a delay, blocks what it has had time to see, and punishes a
|
|
207
|
+
* move whose recovery leaves a window. Deterministic for a given seed.
|
|
208
|
+
*/
|
|
209
|
+
export declare function createCombatAi(config: CombatAiConfig): CombatAi;
|
|
210
|
+
//# sourceMappingURL=CombatFrameData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatFrameData.d.ts","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/CombatFrameData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable frame-based combat model: frame data, spacing and a credible AI.
|
|
3
|
+
*
|
|
4
|
+
* ## The defects this addresses
|
|
5
|
+
*
|
|
6
|
+
* Aura Clash's attacks were reported as unrealistic, with weak spacing, limited
|
|
7
|
+
* momentum, and animations that do not correspond convincingly to hits. Converting
|
|
8
|
+
* the shipped move table to frames at 60fps shows why:
|
|
9
|
+
*
|
|
10
|
+
* | move | startup | active | recovery |
|
|
11
|
+
* | ------- | ------- | ------ | -------- |
|
|
12
|
+
* | light | 4 | **12** | **4** |
|
|
13
|
+
* | heavy | 6 | **17** | **5** |
|
|
14
|
+
* | special | 5 | **32** | **4** |
|
|
15
|
+
*
|
|
16
|
+
* Real fighting-game frame data is the opposite shape: a short active window (2-5
|
|
17
|
+
* frames) and a long recovery (10-30 frames). Aura Clash's active windows are 3-8x
|
|
18
|
+
* too long and its recoveries 3-6x too short, which has three consequences:
|
|
19
|
+
*
|
|
20
|
+
* 1. **Hits do not correspond to the animation.** A 32-frame active window on the
|
|
21
|
+
* special means the hitbox is live for over half a second, so damage lands at
|
|
22
|
+
* moments that look nothing like contact -- the reported "attack dealing damage
|
|
23
|
+
* before contact".
|
|
24
|
+
* 2. **No spacing game.** With a 12-frame active window and a 4-frame recovery, an
|
|
25
|
+
* attack is nearly always safe. Whiffing costs almost nothing, so there is no
|
|
26
|
+
* reason to respect range and no punish window to aim for. That is precisely
|
|
27
|
+
* "weak spacing".
|
|
28
|
+
* 3. **No trades or momentum.** Blockstun and hitstun cannot create meaningful
|
|
29
|
+
* advantage when every move recovers in four frames.
|
|
30
|
+
*
|
|
31
|
+
* The engine defect is that nothing validated frame data as frame data. A move table
|
|
32
|
+
* could declare any startup/active/recovery split and no check compared it against the
|
|
33
|
+
* shape that makes a combat system readable.
|
|
34
|
+
*
|
|
35
|
+
* This module adds that check ({@link validateCombatFrameData}), a solver that derives
|
|
36
|
+
* balanced frame data from an intended move role ({@link solveCombatFrameData}), and a
|
|
37
|
+
* reactive AI ({@link createCombatAi}) that behaves like an opponent: it respects
|
|
38
|
+
* range, reacts with a delay, blocks what it sees, and punishes what it can.
|
|
39
|
+
*
|
|
40
|
+
* Pure and dependency-free.
|
|
41
|
+
*/
|
|
42
|
+
/** Frame advantage for a move. */
|
|
43
|
+
export function combatFrameAdvantage(move) {
|
|
44
|
+
return {
|
|
45
|
+
id: move.id,
|
|
46
|
+
onHit: move.hitstun - move.recovery,
|
|
47
|
+
onBlock: move.blockstun - move.recovery,
|
|
48
|
+
whiffPunishWindow: move.recovery,
|
|
49
|
+
totalFrames: move.startup + move.active + move.recovery
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validate a move table as frame data.
|
|
54
|
+
*
|
|
55
|
+
* This is the check that did not exist. It fails a table whose active windows are so
|
|
56
|
+
* long that damage cannot correspond to the animation, and one whose recoveries are so
|
|
57
|
+
* short that whiffing carries no risk.
|
|
58
|
+
*/
|
|
59
|
+
export function validateCombatFrameData(moves, limits = {}) {
|
|
60
|
+
const maxActive = limits.maxActiveFrames ?? 6;
|
|
61
|
+
const minActive = limits.minActiveFrames ?? 2;
|
|
62
|
+
const minRecoveryRatio = limits.minRecoveryToActiveRatio ?? 2;
|
|
63
|
+
const maxOnBlock = limits.maxOnBlock ?? 2;
|
|
64
|
+
const minWhiffWindow = limits.minWhiffPunishWindow ?? 8;
|
|
65
|
+
const minHitstop = limits.minHitstop ?? 2;
|
|
66
|
+
const checks = [];
|
|
67
|
+
const annotated = moves.map((move) => ({ ...move, advantage: combatFrameAdvantage(move) }));
|
|
68
|
+
for (const move of annotated) {
|
|
69
|
+
checks.push({
|
|
70
|
+
id: "active-window-readable",
|
|
71
|
+
moveId: move.id,
|
|
72
|
+
description: `active window must be ${minActive}-${maxActive} frames so damage corresponds to the animation`,
|
|
73
|
+
passes: move.active >= minActive && move.active <= maxActive,
|
|
74
|
+
detail: `${move.active} active frames`
|
|
75
|
+
});
|
|
76
|
+
checks.push({
|
|
77
|
+
id: "recovery-creates-risk",
|
|
78
|
+
moveId: move.id,
|
|
79
|
+
description: `recovery must be at least ${minRecoveryRatio}x the active window so whiffing is punishable`,
|
|
80
|
+
passes: move.active <= 0 || move.recovery >= move.active * minRecoveryRatio,
|
|
81
|
+
detail: `recovery ${move.recovery} vs active ${move.active} (ratio ${round(move.active > 0 ? move.recovery / move.active : Number.POSITIVE_INFINITY)})`
|
|
82
|
+
});
|
|
83
|
+
checks.push({
|
|
84
|
+
id: "not-safe-on-block",
|
|
85
|
+
moveId: move.id,
|
|
86
|
+
description: `frame advantage on block must not exceed +${maxOnBlock}, or the move carries no risk`,
|
|
87
|
+
passes: move.advantage.onBlock <= maxOnBlock,
|
|
88
|
+
detail: `${move.advantage.onBlock >= 0 ? "+" : ""}${move.advantage.onBlock} on block`
|
|
89
|
+
});
|
|
90
|
+
checks.push({
|
|
91
|
+
id: "whiff-punishable",
|
|
92
|
+
moveId: move.id,
|
|
93
|
+
description: `a whiff must leave at least ${minWhiffWindow} frames of punish window`,
|
|
94
|
+
passes: move.advantage.whiffPunishWindow >= minWhiffWindow,
|
|
95
|
+
detail: `${move.advantage.whiffPunishWindow} frame punish window`
|
|
96
|
+
});
|
|
97
|
+
checks.push({
|
|
98
|
+
id: "hitstop-sells-impact",
|
|
99
|
+
moveId: move.id,
|
|
100
|
+
description: `hitstop must be at least ${minHitstop} frames so contact reads as impact`,
|
|
101
|
+
passes: move.hitstop >= minHitstop,
|
|
102
|
+
detail: `${move.hitstop} frames of hitstop`
|
|
103
|
+
});
|
|
104
|
+
checks.push({
|
|
105
|
+
id: "startup-before-active",
|
|
106
|
+
moveId: move.id,
|
|
107
|
+
description: "a move must have startup frames, so an attack telegraphs before it can hit",
|
|
108
|
+
passes: move.startup >= 1,
|
|
109
|
+
detail: `${move.startup} startup frames`
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Table-level: stronger moves must be slower, or there is no reason to use a jab.
|
|
113
|
+
const byDamage = [...annotated].sort((a, b) => a.damage - b.damage);
|
|
114
|
+
for (let index = 0; index < byDamage.length - 1; index += 1) {
|
|
115
|
+
const weaker = byDamage[index];
|
|
116
|
+
const stronger = byDamage[index + 1];
|
|
117
|
+
if (weaker.damage === stronger.damage)
|
|
118
|
+
continue;
|
|
119
|
+
checks.push({
|
|
120
|
+
id: "damage-costs-speed",
|
|
121
|
+
moveId: `${weaker.id}->${stronger.id}`,
|
|
122
|
+
description: "a stronger move must be slower to start or riskier on block",
|
|
123
|
+
passes: stronger.startup >= weaker.startup || stronger.advantage.onBlock <= weaker.advantage.onBlock,
|
|
124
|
+
detail: `${weaker.id} ${weaker.damage}dmg/${weaker.startup}f vs ${stronger.id} ${stronger.damage}dmg/${stronger.startup}f`
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
schema: "aura3d-combat-frame-data/1.0",
|
|
129
|
+
moves: annotated,
|
|
130
|
+
checks,
|
|
131
|
+
passes: checks.every((check) => check.passes)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const ROLE_PROFILES = {
|
|
135
|
+
/*
|
|
136
|
+
* Frame data shaped like a real fighting game.
|
|
137
|
+
*
|
|
138
|
+
* A jab is fast and nearly neutral on block, so it is the safe poke. Heavier moves
|
|
139
|
+
* start slower, recover longer and are clearly minus on block, so using them is a
|
|
140
|
+
* decision rather than a default. Every active window is short, which is what makes a
|
|
141
|
+
* hit correspond to the moment of contact.
|
|
142
|
+
*/
|
|
143
|
+
jab: { startup: 3, active: 2, recovery: 7, hitstun: 12, blockstun: 8, hitstop: 3, knockback: 0.18 },
|
|
144
|
+
light: { startup: 5, active: 3, recovery: 10, hitstun: 15, blockstun: 10, hitstop: 4, knockback: 0.28 },
|
|
145
|
+
medium: { startup: 8, active: 3, recovery: 15, hitstun: 19, blockstun: 12, hitstop: 5, knockback: 0.42 },
|
|
146
|
+
heavy: { startup: 12, active: 4, recovery: 22, hitstun: 26, blockstun: 15, hitstop: 7, knockback: 0.7 },
|
|
147
|
+
launcher: { startup: 11, active: 3, recovery: 26, hitstun: 34, blockstun: 14, hitstop: 6, knockback: 0.55 },
|
|
148
|
+
special: { startup: 14, active: 5, recovery: 28, hitstun: 30, blockstun: 18, hitstop: 9, knockback: 1.05 }
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Derive balanced frame data from a move's intended role.
|
|
152
|
+
*
|
|
153
|
+
* Reach adds startup, because a longer poke should be slower to commit to. Damage adds
|
|
154
|
+
* recovery, so a big hit is a bigger risk. Neither is a free parameter.
|
|
155
|
+
*/
|
|
156
|
+
export function solveCombatFrameData(request, options = {}) {
|
|
157
|
+
const profile = ROLE_PROFILES[request.role];
|
|
158
|
+
const referenceRange = Math.max(0.1, options.referenceRange ?? 1.4);
|
|
159
|
+
const referenceDamage = Math.max(1, options.referenceDamage ?? 10);
|
|
160
|
+
// Reach beyond the reference costs startup; damage beyond it costs recovery.
|
|
161
|
+
const rangePenalty = Math.max(0, request.range / referenceRange - 1);
|
|
162
|
+
const damagePenalty = Math.max(0, request.damage / referenceDamage - 1);
|
|
163
|
+
return {
|
|
164
|
+
id: request.id,
|
|
165
|
+
startup: Math.round(profile.startup * (1 + rangePenalty * 0.4)),
|
|
166
|
+
active: profile.active,
|
|
167
|
+
recovery: Math.round(profile.recovery * (1 + damagePenalty * 0.3)),
|
|
168
|
+
hitstun: profile.hitstun,
|
|
169
|
+
blockstun: profile.blockstun,
|
|
170
|
+
range: round(request.range),
|
|
171
|
+
damage: request.damage,
|
|
172
|
+
knockback: round(profile.knockback * (1 + damagePenalty * 0.2)),
|
|
173
|
+
hitstop: profile.hitstop
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const AGGRESSION_PROFILES = {
|
|
177
|
+
defensive: { attackChance: 0.35, blockChance: 0.9, spacingTolerance: 0.3 },
|
|
178
|
+
balanced: { attackChance: 0.6, blockChance: 0.72, spacingTolerance: 0.2 },
|
|
179
|
+
aggressive: { attackChance: 0.85, blockChance: 0.5, spacingTolerance: 0.12 }
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Create a reactive combat AI.
|
|
183
|
+
*
|
|
184
|
+
* Behaves like an opponent rather than a timer: it holds a preferred range, reacts to a
|
|
185
|
+
* telegraphed attack after a delay, blocks what it has had time to see, and punishes a
|
|
186
|
+
* move whose recovery leaves a window. Deterministic for a given seed.
|
|
187
|
+
*/
|
|
188
|
+
export function createCombatAi(config) {
|
|
189
|
+
const moves = new Map(config.moves.map((move) => [move.id, move]));
|
|
190
|
+
const aggression = config.aggression ?? "balanced";
|
|
191
|
+
const profile = AGGRESSION_PROFILES[aggression];
|
|
192
|
+
const reactionFrames = Math.max(0, config.reactionFrames ?? 14);
|
|
193
|
+
const cooldownFrames = Math.max(0, config.cooldownFrames ?? 18);
|
|
194
|
+
// The fastest move is the punish tool; the longest-reaching is the poke.
|
|
195
|
+
const fastest = [...moves.values()].sort((a, b) => a.startup - b.startup)[0];
|
|
196
|
+
const longest = [...moves.values()].sort((a, b) => b.range - a.range)[0];
|
|
197
|
+
/*
|
|
198
|
+
* Preferred range sits just *inside* the AI's longest poke.
|
|
199
|
+
*
|
|
200
|
+
* Setting it outside its own reach looked like good spacing discipline and was in fact
|
|
201
|
+
* a deadlock: the AI held a distance from which nothing could connect, so it never
|
|
202
|
+
* attacked and only ever adjusted position. Real fighting-game spacing is to hold the
|
|
203
|
+
* edge of your own longest threat -- close enough to poke, far enough that the
|
|
204
|
+
* opponent must commit to reach you.
|
|
205
|
+
*/
|
|
206
|
+
const preferredRange = config.preferredRange ?? (longest ? longest.range * 0.92 : 1.5);
|
|
207
|
+
let seenOpponentMove;
|
|
208
|
+
let framesSinceSeen = 0;
|
|
209
|
+
let cooldown = 0;
|
|
210
|
+
let decisionCount = 0;
|
|
211
|
+
let punishAttempts = 0;
|
|
212
|
+
let blockAttempts = 0;
|
|
213
|
+
let random = (config.seed ?? 1) >>> 0 || 1;
|
|
214
|
+
const nextRandom = () => {
|
|
215
|
+
random ^= random << 13;
|
|
216
|
+
random ^= random >>> 17;
|
|
217
|
+
random ^= random << 5;
|
|
218
|
+
return (random >>> 0) / 0xffffffff;
|
|
219
|
+
};
|
|
220
|
+
let lastDecision = { moveId: undefined, block: false, approach: 0, reason: "initial" };
|
|
221
|
+
return {
|
|
222
|
+
kind: "aura-combat-ai",
|
|
223
|
+
decide(observation) {
|
|
224
|
+
decisionCount += 1;
|
|
225
|
+
cooldown = Math.max(0, cooldown - 1);
|
|
226
|
+
// Track how long the opponent's current move has been visible, so reaction is
|
|
227
|
+
// delayed rather than instant.
|
|
228
|
+
if (observation.opponentMoveId !== seenOpponentMove) {
|
|
229
|
+
seenOpponentMove = observation.opponentMoveId;
|
|
230
|
+
framesSinceSeen = 0;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
framesSinceSeen += 1;
|
|
234
|
+
}
|
|
235
|
+
const reacted = seenOpponentMove !== undefined && framesSinceSeen >= reactionFrames;
|
|
236
|
+
const decide = (decision) => {
|
|
237
|
+
lastDecision = decision;
|
|
238
|
+
return decision;
|
|
239
|
+
};
|
|
240
|
+
// Stunned or mid-move: nothing to decide.
|
|
241
|
+
if (observation.stunned === true || (observation.ownRecoveryFrames ?? 0) > 0) {
|
|
242
|
+
return decide({ moveId: undefined, block: false, approach: 0, reason: "recovering" });
|
|
243
|
+
}
|
|
244
|
+
const opponentMove = observation.opponentMoveId ? moves.get(observation.opponentMoveId) : undefined;
|
|
245
|
+
/*
|
|
246
|
+
* Punish. When the opponent's move is in its recovery and the AI's fastest move
|
|
247
|
+
* can start and connect inside that window, take it. This is the behaviour that
|
|
248
|
+
* makes spacing matter, and it is only possible because recovery frames exist.
|
|
249
|
+
*/
|
|
250
|
+
if (reacted && opponentMove && fastest && cooldown <= 0) {
|
|
251
|
+
const opponentFrame = observation.opponentMoveFrame ?? 0;
|
|
252
|
+
const recoveryStart = opponentMove.startup + opponentMove.active;
|
|
253
|
+
const framesLeftInRecovery = recoveryStart + opponentMove.recovery - opponentFrame;
|
|
254
|
+
const inRecovery = opponentFrame >= recoveryStart && framesLeftInRecovery > 0;
|
|
255
|
+
if (inRecovery && framesLeftInRecovery > fastest.startup && observation.distance <= fastest.range) {
|
|
256
|
+
punishAttempts += 1;
|
|
257
|
+
cooldown = cooldownFrames;
|
|
258
|
+
return decide({ moveId: fastest.id, block: false, approach: 0, reason: "punish-recovery" });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/*
|
|
262
|
+
* Block. Only after the reaction delay, and only while the attack could still
|
|
263
|
+
* reach: blocking a move that has already recovered is not defence, it is a tell
|
|
264
|
+
* that the AI is reading state it should not have.
|
|
265
|
+
*/
|
|
266
|
+
if (reacted && opponentMove) {
|
|
267
|
+
const opponentFrame = observation.opponentMoveFrame ?? 0;
|
|
268
|
+
const threatening = opponentFrame < opponentMove.startup + opponentMove.active;
|
|
269
|
+
if (threatening && observation.distance <= opponentMove.range * 1.15 && nextRandom() < profile.blockChance) {
|
|
270
|
+
blockAttempts += 1;
|
|
271
|
+
return decide({ moveId: undefined, block: true, approach: 0, reason: "block-incoming" });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Spacing. Hold the preferred range; step in to attack, step out when crowded.
|
|
275
|
+
const rangeError = observation.distance - preferredRange;
|
|
276
|
+
if (Math.abs(rangeError) > profile.spacingTolerance) {
|
|
277
|
+
const approach = rangeError > 0 ? 1 : -1;
|
|
278
|
+
// Attack on the way in when a move actually reaches.
|
|
279
|
+
const reachable = [...moves.values()].filter((move) => observation.distance <= move.range);
|
|
280
|
+
if (approach === 1 && reachable.length > 0 && cooldown <= 0 && nextRandom() < profile.attackChance) {
|
|
281
|
+
const chosen = reachable[Math.floor(nextRandom() * reachable.length)] ?? reachable[0];
|
|
282
|
+
cooldown = cooldownFrames;
|
|
283
|
+
return decide({ moveId: chosen.id, block: false, approach: 0, reason: "attack-in-range" });
|
|
284
|
+
}
|
|
285
|
+
return decide({ moveId: undefined, block: false, approach, reason: approach > 0 ? "close-distance" : "create-space" });
|
|
286
|
+
}
|
|
287
|
+
// At preferred range with nothing to react to: poke when the odds are taken.
|
|
288
|
+
if (cooldown <= 0 && nextRandom() < profile.attackChance) {
|
|
289
|
+
const reachable = [...moves.values()].filter((move) => observation.distance <= move.range);
|
|
290
|
+
if (reachable.length > 0) {
|
|
291
|
+
const chosen = reachable[Math.floor(nextRandom() * reachable.length)] ?? reachable[0];
|
|
292
|
+
cooldown = cooldownFrames;
|
|
293
|
+
return decide({ moveId: chosen.id, block: false, approach: 0, reason: "poke-at-range" });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return decide({ moveId: undefined, block: false, approach: 0, reason: "hold-range" });
|
|
297
|
+
},
|
|
298
|
+
reset() {
|
|
299
|
+
seenOpponentMove = undefined;
|
|
300
|
+
framesSinceSeen = 0;
|
|
301
|
+
cooldown = 0;
|
|
302
|
+
decisionCount = 0;
|
|
303
|
+
punishAttempts = 0;
|
|
304
|
+
blockAttempts = 0;
|
|
305
|
+
random = (config.seed ?? 1) >>> 0 || 1;
|
|
306
|
+
lastDecision = { moveId: undefined, block: false, approach: 0, reason: "reset" };
|
|
307
|
+
},
|
|
308
|
+
telemetry() {
|
|
309
|
+
return {
|
|
310
|
+
reactionFrames,
|
|
311
|
+
preferredRange: round(preferredRange),
|
|
312
|
+
aggression,
|
|
313
|
+
decisionCount,
|
|
314
|
+
punishAttempts,
|
|
315
|
+
blockAttempts,
|
|
316
|
+
lastDecision
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
function round(value) {
|
|
322
|
+
return Math.round(value * 1e4) / 1e4;
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=CombatFrameData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CombatFrameData.js","sourceRoot":"","sources":["../../../../../packages/engine/src/agent-api/CombatFrameData.ts"],"names":[],"mappings":"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"}
|