@aura3d/scripting 1.0.6
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 +16 -0
- package/dist/AdaptiveDifficultyFixtures.d.ts +58 -0
- package/dist/AdaptiveDifficultyFixtures.d.ts.map +1 -0
- package/dist/AdaptiveDifficultyFixtures.js +228 -0
- package/dist/AdaptiveDifficultyFixtures.js.map +1 -0
- package/dist/AnalyticsPrivacyFixtures.d.ts +63 -0
- package/dist/AnalyticsPrivacyFixtures.d.ts.map +1 -0
- package/dist/AnalyticsPrivacyFixtures.js +120 -0
- package/dist/AnalyticsPrivacyFixtures.js.map +1 -0
- package/dist/Behavior.d.ts +10 -0
- package/dist/Behavior.d.ts.map +1 -0
- package/dist/Behavior.js +2 -0
- package/dist/Behavior.js.map +1 -0
- package/dist/BehaviorHost.d.ts +17 -0
- package/dist/BehaviorHost.d.ts.map +1 -0
- package/dist/BehaviorHost.js +39 -0
- package/dist/BehaviorHost.js.map +1 -0
- package/dist/BehaviorRegistry.d.ts +8 -0
- package/dist/BehaviorRegistry.d.ts.map +1 -0
- package/dist/BehaviorRegistry.js +17 -0
- package/dist/BehaviorRegistry.js.map +1 -0
- package/dist/BehaviorSystem.d.ts +26 -0
- package/dist/BehaviorSystem.d.ts.map +1 -0
- package/dist/BehaviorSystem.js +76 -0
- package/dist/BehaviorSystem.js.map +1 -0
- package/dist/BehaviorTree.d.ts +75 -0
- package/dist/BehaviorTree.d.ts.map +1 -0
- package/dist/BehaviorTree.js +204 -0
- package/dist/BehaviorTree.js.map +1 -0
- package/dist/CloudServiceFixtures.d.ts +81 -0
- package/dist/CloudServiceFixtures.d.ts.map +1 -0
- package/dist/CloudServiceFixtures.js +144 -0
- package/dist/CloudServiceFixtures.js.map +1 -0
- package/dist/CulturalBehaviorFixtures.d.ts +75 -0
- package/dist/CulturalBehaviorFixtures.d.ts.map +1 -0
- package/dist/CulturalBehaviorFixtures.js +180 -0
- package/dist/CulturalBehaviorFixtures.js.map +1 -0
- package/dist/DecisionTree.d.ts +42 -0
- package/dist/DecisionTree.d.ts.map +1 -0
- package/dist/DecisionTree.js +125 -0
- package/dist/DecisionTree.js.map +1 -0
- package/dist/GOAP.d.ts +51 -0
- package/dist/GOAP.d.ts.map +1 -0
- package/dist/GOAP.js +105 -0
- package/dist/GOAP.js.map +1 -0
- package/dist/HTN.d.ts +58 -0
- package/dist/HTN.d.ts.map +1 -0
- package/dist/HTN.js +115 -0
- package/dist/HTN.js.map +1 -0
- package/dist/LearningAgentFixtures.d.ts +60 -0
- package/dist/LearningAgentFixtures.d.ts.map +1 -0
- package/dist/LearningAgentFixtures.js +122 -0
- package/dist/LearningAgentFixtures.js.map +1 -0
- package/dist/NetworkReplicationFixtures.d.ts +82 -0
- package/dist/NetworkReplicationFixtures.d.ts.map +1 -0
- package/dist/NetworkReplicationFixtures.js +330 -0
- package/dist/NetworkReplicationFixtures.js.map +1 -0
- package/dist/Perception.d.ts +58 -0
- package/dist/Perception.d.ts.map +1 -0
- package/dist/Perception.js +111 -0
- package/dist/Perception.js.map +1 -0
- package/dist/PlayerBehaviorTelemetryFixtures.d.ts +74 -0
- package/dist/PlayerBehaviorTelemetryFixtures.d.ts.map +1 -0
- package/dist/PlayerBehaviorTelemetryFixtures.js +189 -0
- package/dist/PlayerBehaviorTelemetryFixtures.js.map +1 -0
- package/dist/ProceduralContentAdaptationFixtures.d.ts +52 -0
- package/dist/ProceduralContentAdaptationFixtures.d.ts.map +1 -0
- package/dist/ProceduralContentAdaptationFixtures.js +149 -0
- package/dist/ProceduralContentAdaptationFixtures.js.map +1 -0
- package/dist/ScriptContext.d.ts +18 -0
- package/dist/ScriptContext.d.ts.map +1 -0
- package/dist/ScriptContext.js +21 -0
- package/dist/ScriptContext.js.map +1 -0
- package/dist/StateMachine.d.ts +52 -0
- package/dist/StateMachine.d.ts.map +1 -0
- package/dist/StateMachine.js +117 -0
- package/dist/StateMachine.js.map +1 -0
- package/dist/UtilityAI.d.ts +55 -0
- package/dist/UtilityAI.d.ts.map +1 -0
- package/dist/UtilityAI.js +113 -0
- package/dist/UtilityAI.js.map +1 -0
- package/dist/VisualGraph.d.ts +20 -0
- package/dist/VisualGraph.d.ts.map +1 -0
- package/dist/VisualGraph.js +191 -0
- package/dist/VisualGraph.js.map +1 -0
- package/dist/VisualGraphContext.d.ts +123 -0
- package/dist/VisualGraphContext.d.ts.map +1 -0
- package/dist/VisualGraphContext.js +2 -0
- package/dist/VisualGraphContext.js.map +1 -0
- package/dist/VisualGraphExecutor.d.ts +16 -0
- package/dist/VisualGraphExecutor.d.ts.map +1 -0
- package/dist/VisualGraphExecutor.js +571 -0
- package/dist/VisualGraphExecutor.js.map +1 -0
- package/dist/VisualNode.d.ts +17 -0
- package/dist/VisualNode.d.ts.map +1 -0
- package/dist/VisualNode.js +24 -0
- package/dist/VisualNode.js.map +1 -0
- package/dist/VisualNodeCatalog.d.ts +14 -0
- package/dist/VisualNodeCatalog.d.ts.map +1 -0
- package/dist/VisualNodeCatalog.js +142 -0
- package/dist/VisualNodeCatalog.js.map +1 -0
- package/dist/WeaponSystem.d.ts +228 -0
- package/dist/WeaponSystem.d.ts.map +1 -0
- package/dist/WeaponSystem.js +530 -0
- package/dist/WeaponSystem.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/package.json +13 -0
- package/src/AdaptiveDifficultyFixtures.ts +324 -0
- package/src/AnalyticsPrivacyFixtures.ts +182 -0
- package/src/Behavior.ts +11 -0
- package/src/BehaviorHost.ts +51 -0
- package/src/BehaviorRegistry.ts +22 -0
- package/src/BehaviorSystem.ts +103 -0
- package/src/BehaviorTree.ts +234 -0
- package/src/CloudServiceFixtures.ts +225 -0
- package/src/CulturalBehaviorFixtures.ts +262 -0
- package/src/DecisionTree.ts +162 -0
- package/src/GOAP.ts +150 -0
- package/src/HTN.ts +178 -0
- package/src/LearningAgentFixtures.ts +184 -0
- package/src/NetworkReplicationFixtures.ts +440 -0
- package/src/Perception.ts +163 -0
- package/src/PlayerBehaviorTelemetryFixtures.ts +257 -0
- package/src/ProceduralContentAdaptationFixtures.ts +205 -0
- package/src/ScriptContext.ts +34 -0
- package/src/StateMachine.ts +138 -0
- package/src/UtilityAI.ts +158 -0
- package/src/VisualGraph.ts +236 -0
- package/src/VisualGraphContext.ts +138 -0
- package/src/VisualGraphExecutor.ts +663 -0
- package/src/VisualNode.ts +44 -0
- package/src/VisualNodeCatalog.ts +195 -0
- package/src/WeaponSystem.ts +793 -0
- package/src/index.ts +175 -0
- package/tests/scripting.test.ts +229 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class BehaviorRegistry {
|
|
2
|
+
factories = new Map();
|
|
3
|
+
register(type, factory) {
|
|
4
|
+
if (this.factories.has(type)) {
|
|
5
|
+
throw new Error(`Behavior type already registered: ${type}`);
|
|
6
|
+
}
|
|
7
|
+
this.factories.set(type, factory);
|
|
8
|
+
}
|
|
9
|
+
create(type) {
|
|
10
|
+
const factory = this.factories.get(type);
|
|
11
|
+
if (!factory) {
|
|
12
|
+
throw new Error(`Unknown behavior type: ${type}`);
|
|
13
|
+
}
|
|
14
|
+
return factory();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=BehaviorRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorRegistry.js","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorRegistry.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,gBAAgB;IACV,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEhE,QAAQ,CAAC,IAAY,EAAE,OAAwB;QAC7C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Behavior, BehaviorPhase } from "./Behavior";
|
|
2
|
+
import type { BehaviorHost } from "./BehaviorHost";
|
|
3
|
+
export interface BehaviorError {
|
|
4
|
+
readonly phase: BehaviorPhase;
|
|
5
|
+
readonly behavior: Behavior;
|
|
6
|
+
readonly error: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface BehaviorSystemUpdateOptions {
|
|
9
|
+
readonly deltaSeconds?: number;
|
|
10
|
+
readonly fixedDeltaSeconds?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class BehaviorSystem {
|
|
13
|
+
readonly errors: BehaviorError[];
|
|
14
|
+
private readonly hosts;
|
|
15
|
+
private readonly started;
|
|
16
|
+
private readonly services;
|
|
17
|
+
registerHost(host: BehaviorHost): void;
|
|
18
|
+
unregisterHost(host: BehaviorHost): void;
|
|
19
|
+
setService(name: string, value: unknown): void;
|
|
20
|
+
fixedUpdate(options?: BehaviorSystemUpdateOptions): Promise<void>;
|
|
21
|
+
update(options?: BehaviorSystemUpdateOptions): Promise<void>;
|
|
22
|
+
private runStart;
|
|
23
|
+
private runPhase;
|
|
24
|
+
private invoke;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=BehaviorSystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorSystem.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAM;IAEtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAItC,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIxC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIxC,WAAW,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,MAAM,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,IAAI,CAAC;YAKxD,QAAQ;YAiBR,QAAQ;YAgBR,MAAM;CA0BrB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ScriptContext } from "./ScriptContext.js";
|
|
2
|
+
export class BehaviorSystem {
|
|
3
|
+
errors = [];
|
|
4
|
+
hosts = new Set();
|
|
5
|
+
started = new WeakSet();
|
|
6
|
+
services = new Map();
|
|
7
|
+
registerHost(host) {
|
|
8
|
+
this.hosts.add(host);
|
|
9
|
+
}
|
|
10
|
+
unregisterHost(host) {
|
|
11
|
+
this.hosts.delete(host);
|
|
12
|
+
}
|
|
13
|
+
setService(name, value) {
|
|
14
|
+
this.services.set(name, value);
|
|
15
|
+
}
|
|
16
|
+
async fixedUpdate(options = {}) {
|
|
17
|
+
await this.runPhase("fixed", options);
|
|
18
|
+
}
|
|
19
|
+
async update(options = {}) {
|
|
20
|
+
await this.runStart(options);
|
|
21
|
+
await this.runPhase("update", options);
|
|
22
|
+
}
|
|
23
|
+
async runStart(options) {
|
|
24
|
+
for (const host of [...this.hosts]) {
|
|
25
|
+
if (host.isDestroyed) {
|
|
26
|
+
this.hosts.delete(host);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
for (const behavior of host.list()) {
|
|
30
|
+
if (behavior.enabled === false || this.started.has(behavior)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
this.started.add(behavior);
|
|
34
|
+
await this.invoke("start", behavior, host, options);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async runPhase(phase, options) {
|
|
39
|
+
for (const host of [...this.hosts]) {
|
|
40
|
+
if (host.isDestroyed) {
|
|
41
|
+
this.hosts.delete(host);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
for (const behavior of host.list()) {
|
|
45
|
+
if (behavior.enabled === false) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
await this.invoke(phase, behavior, host, options);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async invoke(phase, behavior, host, options) {
|
|
53
|
+
const context = new ScriptContext({
|
|
54
|
+
phase,
|
|
55
|
+
deltaSeconds: options.deltaSeconds,
|
|
56
|
+
fixedDeltaSeconds: options.fixedDeltaSeconds,
|
|
57
|
+
target: host.target,
|
|
58
|
+
services: this.services
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
if (phase === "start") {
|
|
62
|
+
await behavior.onStart?.(context);
|
|
63
|
+
}
|
|
64
|
+
else if (phase === "fixed") {
|
|
65
|
+
await behavior.onFixedUpdate?.(context);
|
|
66
|
+
}
|
|
67
|
+
else if (phase === "update") {
|
|
68
|
+
await behavior.onUpdate?.(context);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
this.errors.push({ phase, behavior, error });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=BehaviorSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorSystem.js","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export type BehaviorTreeStatus = "success" | "failure" | "running";
|
|
2
|
+
export type BlackboardValue = number | string | boolean | readonly unknown[] | Record<string, unknown> | null | undefined;
|
|
3
|
+
export interface BlackboardChange {
|
|
4
|
+
readonly key: string;
|
|
5
|
+
readonly value: BlackboardValue;
|
|
6
|
+
readonly previous: BlackboardValue;
|
|
7
|
+
readonly version: number;
|
|
8
|
+
}
|
|
9
|
+
export interface BehaviorTreeContext {
|
|
10
|
+
readonly blackboard: Blackboard;
|
|
11
|
+
readonly deltaSeconds: number;
|
|
12
|
+
readonly depth: number;
|
|
13
|
+
}
|
|
14
|
+
export interface BehaviorTreeTickResult {
|
|
15
|
+
readonly status: BehaviorTreeStatus;
|
|
16
|
+
readonly tickCount: number;
|
|
17
|
+
readonly trace: readonly string[];
|
|
18
|
+
readonly blackboardVersion: number;
|
|
19
|
+
}
|
|
20
|
+
export declare abstract class BehaviorTreeNode {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
status: BehaviorTreeStatus;
|
|
23
|
+
running: boolean;
|
|
24
|
+
constructor(name: string);
|
|
25
|
+
abstract tick(context: BehaviorTreeContext): BehaviorTreeStatus;
|
|
26
|
+
reset(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare class Blackboard {
|
|
29
|
+
readonly parent?: Blackboard | undefined;
|
|
30
|
+
private readonly values;
|
|
31
|
+
private readonly changes;
|
|
32
|
+
private localVersion;
|
|
33
|
+
constructor(parent?: Blackboard | undefined);
|
|
34
|
+
get version(): number;
|
|
35
|
+
set(key: string, value: BlackboardValue): void;
|
|
36
|
+
get<T extends BlackboardValue = BlackboardValue>(key: string, fallback?: T): T;
|
|
37
|
+
has(key: string): boolean;
|
|
38
|
+
snapshot(): Record<string, BlackboardValue>;
|
|
39
|
+
changeLog(): readonly BlackboardChange[];
|
|
40
|
+
}
|
|
41
|
+
export declare class BehaviorAction extends BehaviorTreeNode {
|
|
42
|
+
private readonly action;
|
|
43
|
+
constructor(name: string, action: (context: BehaviorTreeContext) => BehaviorTreeStatus);
|
|
44
|
+
tick(context: BehaviorTreeContext): BehaviorTreeStatus;
|
|
45
|
+
}
|
|
46
|
+
export declare class BehaviorCondition extends BehaviorTreeNode {
|
|
47
|
+
private readonly condition;
|
|
48
|
+
constructor(name: string, condition: (context: BehaviorTreeContext) => boolean);
|
|
49
|
+
tick(context: BehaviorTreeContext): BehaviorTreeStatus;
|
|
50
|
+
}
|
|
51
|
+
export declare class BehaviorSequence extends BehaviorTreeNode {
|
|
52
|
+
readonly children: readonly BehaviorTreeNode[];
|
|
53
|
+
private currentIndex;
|
|
54
|
+
constructor(name: string, children: readonly BehaviorTreeNode[]);
|
|
55
|
+
tick(context: BehaviorTreeContext): BehaviorTreeStatus;
|
|
56
|
+
reset(): void;
|
|
57
|
+
}
|
|
58
|
+
export declare class BehaviorSelector extends BehaviorTreeNode {
|
|
59
|
+
readonly children: readonly BehaviorTreeNode[];
|
|
60
|
+
private currentIndex;
|
|
61
|
+
constructor(name: string, children: readonly BehaviorTreeNode[]);
|
|
62
|
+
tick(context: BehaviorTreeContext): BehaviorTreeStatus;
|
|
63
|
+
reset(): void;
|
|
64
|
+
}
|
|
65
|
+
export declare class BehaviorTree {
|
|
66
|
+
readonly root: BehaviorTreeNode;
|
|
67
|
+
readonly blackboard: Blackboard;
|
|
68
|
+
private tickCounter;
|
|
69
|
+
private lastTrace;
|
|
70
|
+
constructor(root: BehaviorTreeNode, blackboard?: Blackboard);
|
|
71
|
+
tick(deltaSeconds: number): BehaviorTreeTickResult;
|
|
72
|
+
reset(): void;
|
|
73
|
+
private tickNode;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=BehaviorTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorTree.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
export class BehaviorTreeNode {
|
|
2
|
+
name;
|
|
3
|
+
status = "failure";
|
|
4
|
+
running = false;
|
|
5
|
+
constructor(name) {
|
|
6
|
+
this.name = name;
|
|
7
|
+
}
|
|
8
|
+
reset() {
|
|
9
|
+
this.status = "failure";
|
|
10
|
+
this.running = false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class Blackboard {
|
|
14
|
+
parent;
|
|
15
|
+
values = new Map();
|
|
16
|
+
changes = [];
|
|
17
|
+
localVersion = 0;
|
|
18
|
+
constructor(parent) {
|
|
19
|
+
this.parent = parent;
|
|
20
|
+
}
|
|
21
|
+
get version() {
|
|
22
|
+
return this.localVersion;
|
|
23
|
+
}
|
|
24
|
+
set(key, value) {
|
|
25
|
+
const previous = this.get(key);
|
|
26
|
+
this.localVersion += 1;
|
|
27
|
+
this.values.set(key, { value, version: this.localVersion });
|
|
28
|
+
this.changes.push({ key, value, previous, version: this.localVersion });
|
|
29
|
+
}
|
|
30
|
+
get(key, fallback) {
|
|
31
|
+
const local = this.values.get(key);
|
|
32
|
+
if (local)
|
|
33
|
+
return local.value;
|
|
34
|
+
if (this.parent?.has(key))
|
|
35
|
+
return this.parent.get(key, fallback);
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
has(key) {
|
|
39
|
+
return this.values.has(key) || this.parent?.has(key) === true;
|
|
40
|
+
}
|
|
41
|
+
snapshot() {
|
|
42
|
+
const inherited = this.parent?.snapshot() ?? {};
|
|
43
|
+
return { ...inherited, ...Object.fromEntries([...this.values].map(([key, entry]) => [key, entry.value])) };
|
|
44
|
+
}
|
|
45
|
+
changeLog() {
|
|
46
|
+
return [...this.changes];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class BehaviorAction extends BehaviorTreeNode {
|
|
50
|
+
action;
|
|
51
|
+
constructor(name, action) {
|
|
52
|
+
super(name);
|
|
53
|
+
this.action = action;
|
|
54
|
+
}
|
|
55
|
+
tick(context) {
|
|
56
|
+
this.running = true;
|
|
57
|
+
this.status = this.action(context);
|
|
58
|
+
if (this.status !== "running")
|
|
59
|
+
this.running = false;
|
|
60
|
+
return this.status;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class BehaviorCondition extends BehaviorTreeNode {
|
|
64
|
+
condition;
|
|
65
|
+
constructor(name, condition) {
|
|
66
|
+
super(name);
|
|
67
|
+
this.condition = condition;
|
|
68
|
+
}
|
|
69
|
+
tick(context) {
|
|
70
|
+
this.status = this.condition(context) ? "success" : "failure";
|
|
71
|
+
return this.status;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class BehaviorSequence extends BehaviorTreeNode {
|
|
75
|
+
children;
|
|
76
|
+
currentIndex = 0;
|
|
77
|
+
constructor(name, children) {
|
|
78
|
+
super(name);
|
|
79
|
+
this.children = children;
|
|
80
|
+
}
|
|
81
|
+
tick(context) {
|
|
82
|
+
this.running = true;
|
|
83
|
+
while (this.currentIndex < this.children.length) {
|
|
84
|
+
const child = this.children[this.currentIndex];
|
|
85
|
+
const status = child.tick({ ...context, depth: context.depth + 1 });
|
|
86
|
+
if (status === "failure") {
|
|
87
|
+
this.reset();
|
|
88
|
+
return "failure";
|
|
89
|
+
}
|
|
90
|
+
if (status === "running") {
|
|
91
|
+
this.status = "running";
|
|
92
|
+
return "running";
|
|
93
|
+
}
|
|
94
|
+
this.currentIndex += 1;
|
|
95
|
+
}
|
|
96
|
+
this.reset();
|
|
97
|
+
this.status = "success";
|
|
98
|
+
return "success";
|
|
99
|
+
}
|
|
100
|
+
reset() {
|
|
101
|
+
super.reset();
|
|
102
|
+
this.currentIndex = 0;
|
|
103
|
+
for (const child of this.children)
|
|
104
|
+
child.reset();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export class BehaviorSelector extends BehaviorTreeNode {
|
|
108
|
+
children;
|
|
109
|
+
currentIndex = 0;
|
|
110
|
+
constructor(name, children) {
|
|
111
|
+
super(name);
|
|
112
|
+
this.children = children;
|
|
113
|
+
}
|
|
114
|
+
tick(context) {
|
|
115
|
+
this.running = true;
|
|
116
|
+
while (this.currentIndex < this.children.length) {
|
|
117
|
+
const child = this.children[this.currentIndex];
|
|
118
|
+
const status = child.tick({ ...context, depth: context.depth + 1 });
|
|
119
|
+
if (status === "success") {
|
|
120
|
+
this.reset();
|
|
121
|
+
return "success";
|
|
122
|
+
}
|
|
123
|
+
if (status === "running") {
|
|
124
|
+
this.status = "running";
|
|
125
|
+
return "running";
|
|
126
|
+
}
|
|
127
|
+
this.currentIndex += 1;
|
|
128
|
+
}
|
|
129
|
+
this.reset();
|
|
130
|
+
this.status = "failure";
|
|
131
|
+
return "failure";
|
|
132
|
+
}
|
|
133
|
+
reset() {
|
|
134
|
+
super.reset();
|
|
135
|
+
this.currentIndex = 0;
|
|
136
|
+
for (const child of this.children)
|
|
137
|
+
child.reset();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export class BehaviorTree {
|
|
141
|
+
root;
|
|
142
|
+
blackboard;
|
|
143
|
+
tickCounter = 0;
|
|
144
|
+
lastTrace = [];
|
|
145
|
+
constructor(root, blackboard = new Blackboard()) {
|
|
146
|
+
this.root = root;
|
|
147
|
+
this.blackboard = blackboard;
|
|
148
|
+
}
|
|
149
|
+
tick(deltaSeconds) {
|
|
150
|
+
this.tickCounter += 1;
|
|
151
|
+
this.lastTrace = [];
|
|
152
|
+
const status = this.tickNode(this.root, { blackboard: this.blackboard, deltaSeconds, depth: 0 });
|
|
153
|
+
return {
|
|
154
|
+
status,
|
|
155
|
+
tickCount: this.tickCounter,
|
|
156
|
+
trace: [...this.lastTrace],
|
|
157
|
+
blackboardVersion: this.blackboard.version
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
reset() {
|
|
161
|
+
this.root.reset();
|
|
162
|
+
this.lastTrace = [];
|
|
163
|
+
this.tickCounter = 0;
|
|
164
|
+
}
|
|
165
|
+
tickNode(node, context) {
|
|
166
|
+
const status = node.tick({
|
|
167
|
+
...context,
|
|
168
|
+
blackboard: new TracingBlackboard(context.blackboard, (key, value) => {
|
|
169
|
+
this.lastTrace.push(`${node.name}:${key}=${String(value)}`);
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
this.lastTrace.push(`${node.name}:${status}`);
|
|
173
|
+
return status;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
class TracingBlackboard extends Blackboard {
|
|
177
|
+
target;
|
|
178
|
+
onSet;
|
|
179
|
+
constructor(target, onSet) {
|
|
180
|
+
super();
|
|
181
|
+
this.target = target;
|
|
182
|
+
this.onSet = onSet;
|
|
183
|
+
}
|
|
184
|
+
get version() {
|
|
185
|
+
return this.target.version;
|
|
186
|
+
}
|
|
187
|
+
set(key, value) {
|
|
188
|
+
this.target.set(key, value);
|
|
189
|
+
this.onSet(key, value);
|
|
190
|
+
}
|
|
191
|
+
get(key, fallback) {
|
|
192
|
+
return this.target.get(key, fallback);
|
|
193
|
+
}
|
|
194
|
+
has(key) {
|
|
195
|
+
return this.target.has(key);
|
|
196
|
+
}
|
|
197
|
+
snapshot() {
|
|
198
|
+
return this.target.snapshot();
|
|
199
|
+
}
|
|
200
|
+
changeLog() {
|
|
201
|
+
return this.target.changeLog();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=BehaviorTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BehaviorTree.js","sourceRoot":"","sources":["../../../../packages/scripting/src/BehaviorTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type CloudFixtureServiceStatus = "offline-cache" | "queued" | "synced" | "simulated-match" | "blocked";
|
|
2
|
+
export interface CloudServiceFixtureOptions {
|
|
3
|
+
readonly seed?: number;
|
|
4
|
+
readonly playerId?: string;
|
|
5
|
+
readonly score?: number;
|
|
6
|
+
readonly offlineMode?: boolean;
|
|
7
|
+
readonly sessionSeconds?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface CloudServiceFixture {
|
|
10
|
+
readonly source: "origin-master-cloud-services-adapted";
|
|
11
|
+
readonly services: {
|
|
12
|
+
readonly authentication: {
|
|
13
|
+
readonly provider: "guest";
|
|
14
|
+
readonly authenticated: false;
|
|
15
|
+
readonly offlineUserId: string;
|
|
16
|
+
readonly tokenIssued: false;
|
|
17
|
+
readonly status: CloudFixtureServiceStatus;
|
|
18
|
+
};
|
|
19
|
+
readonly cloudSave: {
|
|
20
|
+
readonly saveId: "runtime-progress";
|
|
21
|
+
readonly version: number;
|
|
22
|
+
readonly checksum: string;
|
|
23
|
+
readonly queuedUploads: number;
|
|
24
|
+
readonly conflictResolution: "last-write-wins" | "merge" | "manual";
|
|
25
|
+
readonly status: CloudFixtureServiceStatus;
|
|
26
|
+
};
|
|
27
|
+
readonly achievements: {
|
|
28
|
+
readonly unlocked: readonly string[];
|
|
29
|
+
readonly inProgress: readonly {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly progress: number;
|
|
32
|
+
}[];
|
|
33
|
+
readonly totalPoints: number;
|
|
34
|
+
readonly status: CloudFixtureServiceStatus;
|
|
35
|
+
};
|
|
36
|
+
readonly leaderboard: {
|
|
37
|
+
readonly id: "runtime-score";
|
|
38
|
+
readonly score: number;
|
|
39
|
+
readonly rank: number;
|
|
40
|
+
readonly timeFrame: "daily" | "weekly" | "all-time";
|
|
41
|
+
readonly cachedEntries: number;
|
|
42
|
+
readonly status: CloudFixtureServiceStatus;
|
|
43
|
+
};
|
|
44
|
+
readonly remoteConfig: {
|
|
45
|
+
readonly activated: true;
|
|
46
|
+
readonly abTestGroup: "control" | "variant-a" | "variant-b";
|
|
47
|
+
readonly parameterCount: number;
|
|
48
|
+
readonly difficultyScale: number;
|
|
49
|
+
readonly eventMultiplier: number;
|
|
50
|
+
readonly status: CloudFixtureServiceStatus;
|
|
51
|
+
};
|
|
52
|
+
readonly matchmaking: {
|
|
53
|
+
readonly queue: "casual-runtime";
|
|
54
|
+
readonly region: "local";
|
|
55
|
+
readonly ticketId: string;
|
|
56
|
+
readonly estimatedWaitMs: number;
|
|
57
|
+
readonly matchedPlayers: number;
|
|
58
|
+
readonly status: CloudFixtureServiceStatus;
|
|
59
|
+
};
|
|
60
|
+
readonly contentDelivery: {
|
|
61
|
+
readonly manifestId: "runtime-content";
|
|
62
|
+
readonly assetCount: number;
|
|
63
|
+
readonly cacheHits: number;
|
|
64
|
+
readonly integrityHashes: readonly string[];
|
|
65
|
+
readonly status: CloudFixtureServiceStatus;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
readonly productionReadiness: {
|
|
69
|
+
readonly cloudServiceTelemetry: true;
|
|
70
|
+
readonly offlineQueueTelemetry: true;
|
|
71
|
+
readonly remoteConfigTelemetry: true;
|
|
72
|
+
readonly leaderboardTelemetry: true;
|
|
73
|
+
readonly matchmakingTelemetry: true;
|
|
74
|
+
readonly contentDeliveryTelemetry: true;
|
|
75
|
+
};
|
|
76
|
+
readonly blockedClaims: readonly string[];
|
|
77
|
+
readonly claimBoundary: string;
|
|
78
|
+
readonly hash: string;
|
|
79
|
+
}
|
|
80
|
+
export declare function sampleCloudServiceFixture(options?: CloudServiceFixtureOptions): CloudServiceFixture;
|
|
81
|
+
//# sourceMappingURL=CloudServiceFixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudServiceFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/CloudServiceFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export function sampleCloudServiceFixture(options = {}) {
|
|
2
|
+
const seed = normalizeSeed(options.seed ?? 0xc10d);
|
|
3
|
+
const playerId = normalizePlayerId(options.playerId ?? "external-parity-runtime-player");
|
|
4
|
+
const score = positiveInteger(options.score ?? 12_400, "score");
|
|
5
|
+
const sessionSeconds = positiveInteger(options.sessionSeconds ?? 180, "sessionSeconds");
|
|
6
|
+
const offlineMode = options.offlineMode ?? true;
|
|
7
|
+
const abTestGroup = seededChoice(seed, ["control", "variant-a", "variant-b"]);
|
|
8
|
+
const difficultyScale = Number((0.86 + seededUnit(seed ^ 0x55a5) * 0.24).toFixed(3));
|
|
9
|
+
const eventMultiplier = Number((1 + Math.min(0.5, sessionSeconds / 1800)).toFixed(3));
|
|
10
|
+
const version = 3 + Math.floor(seededUnit(seed ^ 0x911) * 6);
|
|
11
|
+
const savePayload = JSON.stringify({ playerId, score, sessionSeconds, version });
|
|
12
|
+
const cloudSaveChecksum = stableHash(savePayload);
|
|
13
|
+
const achievements = [
|
|
14
|
+
{ id: "first-run", points: 10, progress: 1 },
|
|
15
|
+
{ id: "collector", points: 25, progress: Math.min(1, score / 20_000) },
|
|
16
|
+
{ id: "speed-clear", points: 50, progress: Math.min(1, sessionSeconds <= 240 ? 1 : 240 / sessionSeconds) }
|
|
17
|
+
];
|
|
18
|
+
const unlocked = achievements.filter((achievement) => achievement.progress >= 1).map((achievement) => achievement.id);
|
|
19
|
+
const inProgress = achievements.filter((achievement) => achievement.progress < 1).map((achievement) => ({
|
|
20
|
+
id: achievement.id,
|
|
21
|
+
progress: Number(achievement.progress.toFixed(3))
|
|
22
|
+
}));
|
|
23
|
+
const rank = Math.max(1, Math.round(5000 / Math.max(1, score / 500)));
|
|
24
|
+
const integrityHashes = [
|
|
25
|
+
stableHash(`runtime-content:${seed}:arena`),
|
|
26
|
+
stableHash(`runtime-content:${seed}:hero`),
|
|
27
|
+
stableHash(`runtime-content:${seed}:config`)
|
|
28
|
+
];
|
|
29
|
+
const status = offlineMode ? "offline-cache" : "queued";
|
|
30
|
+
const fixture = {
|
|
31
|
+
source: "origin-master-cloud-services-adapted",
|
|
32
|
+
services: {
|
|
33
|
+
authentication: {
|
|
34
|
+
provider: "guest",
|
|
35
|
+
authenticated: false,
|
|
36
|
+
offlineUserId: `guest-${stableHash(playerId).slice(0, 6)}`,
|
|
37
|
+
tokenIssued: false,
|
|
38
|
+
status
|
|
39
|
+
},
|
|
40
|
+
cloudSave: {
|
|
41
|
+
saveId: "runtime-progress",
|
|
42
|
+
version,
|
|
43
|
+
checksum: cloudSaveChecksum,
|
|
44
|
+
queuedUploads: offlineMode ? 1 : 0,
|
|
45
|
+
conflictResolution: "last-write-wins",
|
|
46
|
+
status: offlineMode ? "queued" : "synced"
|
|
47
|
+
},
|
|
48
|
+
achievements: {
|
|
49
|
+
unlocked,
|
|
50
|
+
inProgress,
|
|
51
|
+
totalPoints: achievements.filter((achievement) => achievement.progress >= 1).reduce((sum, achievement) => sum + achievement.points, 0),
|
|
52
|
+
status
|
|
53
|
+
},
|
|
54
|
+
leaderboard: {
|
|
55
|
+
id: "runtime-score",
|
|
56
|
+
score,
|
|
57
|
+
rank,
|
|
58
|
+
timeFrame: "weekly",
|
|
59
|
+
cachedEntries: 5 + Math.floor(seededUnit(seed ^ 0x7717) * 8),
|
|
60
|
+
status
|
|
61
|
+
},
|
|
62
|
+
remoteConfig: {
|
|
63
|
+
activated: true,
|
|
64
|
+
abTestGroup,
|
|
65
|
+
parameterCount: 4,
|
|
66
|
+
difficultyScale,
|
|
67
|
+
eventMultiplier,
|
|
68
|
+
status
|
|
69
|
+
},
|
|
70
|
+
matchmaking: {
|
|
71
|
+
queue: "casual-runtime",
|
|
72
|
+
region: "local",
|
|
73
|
+
ticketId: `ticket-${stableHash(`${playerId}:${score}`).slice(0, 8)}`,
|
|
74
|
+
estimatedWaitMs: Math.round(1500 + seededUnit(seed ^ 0x4d47) * 3000),
|
|
75
|
+
matchedPlayers: 2,
|
|
76
|
+
status: "simulated-match"
|
|
77
|
+
},
|
|
78
|
+
contentDelivery: {
|
|
79
|
+
manifestId: "runtime-content",
|
|
80
|
+
assetCount: integrityHashes.length,
|
|
81
|
+
cacheHits: offlineMode ? integrityHashes.length : Math.max(1, integrityHashes.length - 1),
|
|
82
|
+
integrityHashes,
|
|
83
|
+
status
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
productionReadiness: {
|
|
87
|
+
cloudServiceTelemetry: true,
|
|
88
|
+
offlineQueueTelemetry: true,
|
|
89
|
+
remoteConfigTelemetry: true,
|
|
90
|
+
leaderboardTelemetry: true,
|
|
91
|
+
matchmakingTelemetry: true,
|
|
92
|
+
contentDeliveryTelemetry: true
|
|
93
|
+
},
|
|
94
|
+
blockedClaims: [
|
|
95
|
+
"real cloud authentication backend",
|
|
96
|
+
"production cloud-save conflict resolution",
|
|
97
|
+
"hosted CDN/content-delivery parity",
|
|
98
|
+
"real multiplayer matchmaking service",
|
|
99
|
+
"Unity Gaming Services parity",
|
|
100
|
+
"Unreal Online Services parity",
|
|
101
|
+
"privacy/compliance/security certification"
|
|
102
|
+
],
|
|
103
|
+
claimBoundary: "This fixture ports old cloud-service concepts into deterministic local telemetry. It does not contact a backend, issue real auth tokens, upload saves, submit leaderboards, run CDN delivery, create multiplayer matches, or claim Unity Gaming Services or Unreal Online Services parity."
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
...fixture,
|
|
107
|
+
hash: stableHash(JSON.stringify(fixture))
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function normalizeSeed(seed) {
|
|
111
|
+
if (!Number.isInteger(seed) || seed < 0)
|
|
112
|
+
throw new Error("seed must be a non-negative integer.");
|
|
113
|
+
return seed >>> 0;
|
|
114
|
+
}
|
|
115
|
+
function normalizePlayerId(playerId) {
|
|
116
|
+
const trimmed = playerId.trim();
|
|
117
|
+
if (trimmed.length === 0)
|
|
118
|
+
throw new Error("playerId must not be empty.");
|
|
119
|
+
return trimmed;
|
|
120
|
+
}
|
|
121
|
+
function positiveInteger(value, name) {
|
|
122
|
+
if (!Number.isInteger(value) || value <= 0)
|
|
123
|
+
throw new Error(`${name} must be a positive integer.`);
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
function seededChoice(seed, values) {
|
|
127
|
+
return values[Math.min(values.length - 1, Math.floor(seededUnit(seed) * values.length))];
|
|
128
|
+
}
|
|
129
|
+
function seededUnit(seed) {
|
|
130
|
+
let value = seed >>> 0;
|
|
131
|
+
value ^= value << 13;
|
|
132
|
+
value ^= value >>> 17;
|
|
133
|
+
value ^= value << 5;
|
|
134
|
+
return (value >>> 0) / 0xffffffff;
|
|
135
|
+
}
|
|
136
|
+
function stableHash(value) {
|
|
137
|
+
let hash = 2166136261;
|
|
138
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
139
|
+
hash ^= value.charCodeAt(index);
|
|
140
|
+
hash = Math.imul(hash, 16777619);
|
|
141
|
+
}
|
|
142
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=CloudServiceFixtures.js.map
|