@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.
Files changed (139) hide show
  1. package/README.md +16 -0
  2. package/dist/AdaptiveDifficultyFixtures.d.ts +58 -0
  3. package/dist/AdaptiveDifficultyFixtures.d.ts.map +1 -0
  4. package/dist/AdaptiveDifficultyFixtures.js +228 -0
  5. package/dist/AdaptiveDifficultyFixtures.js.map +1 -0
  6. package/dist/AnalyticsPrivacyFixtures.d.ts +63 -0
  7. package/dist/AnalyticsPrivacyFixtures.d.ts.map +1 -0
  8. package/dist/AnalyticsPrivacyFixtures.js +120 -0
  9. package/dist/AnalyticsPrivacyFixtures.js.map +1 -0
  10. package/dist/Behavior.d.ts +10 -0
  11. package/dist/Behavior.d.ts.map +1 -0
  12. package/dist/Behavior.js +2 -0
  13. package/dist/Behavior.js.map +1 -0
  14. package/dist/BehaviorHost.d.ts +17 -0
  15. package/dist/BehaviorHost.d.ts.map +1 -0
  16. package/dist/BehaviorHost.js +39 -0
  17. package/dist/BehaviorHost.js.map +1 -0
  18. package/dist/BehaviorRegistry.d.ts +8 -0
  19. package/dist/BehaviorRegistry.d.ts.map +1 -0
  20. package/dist/BehaviorRegistry.js +17 -0
  21. package/dist/BehaviorRegistry.js.map +1 -0
  22. package/dist/BehaviorSystem.d.ts +26 -0
  23. package/dist/BehaviorSystem.d.ts.map +1 -0
  24. package/dist/BehaviorSystem.js +76 -0
  25. package/dist/BehaviorSystem.js.map +1 -0
  26. package/dist/BehaviorTree.d.ts +75 -0
  27. package/dist/BehaviorTree.d.ts.map +1 -0
  28. package/dist/BehaviorTree.js +204 -0
  29. package/dist/BehaviorTree.js.map +1 -0
  30. package/dist/CloudServiceFixtures.d.ts +81 -0
  31. package/dist/CloudServiceFixtures.d.ts.map +1 -0
  32. package/dist/CloudServiceFixtures.js +144 -0
  33. package/dist/CloudServiceFixtures.js.map +1 -0
  34. package/dist/CulturalBehaviorFixtures.d.ts +75 -0
  35. package/dist/CulturalBehaviorFixtures.d.ts.map +1 -0
  36. package/dist/CulturalBehaviorFixtures.js +180 -0
  37. package/dist/CulturalBehaviorFixtures.js.map +1 -0
  38. package/dist/DecisionTree.d.ts +42 -0
  39. package/dist/DecisionTree.d.ts.map +1 -0
  40. package/dist/DecisionTree.js +125 -0
  41. package/dist/DecisionTree.js.map +1 -0
  42. package/dist/GOAP.d.ts +51 -0
  43. package/dist/GOAP.d.ts.map +1 -0
  44. package/dist/GOAP.js +105 -0
  45. package/dist/GOAP.js.map +1 -0
  46. package/dist/HTN.d.ts +58 -0
  47. package/dist/HTN.d.ts.map +1 -0
  48. package/dist/HTN.js +115 -0
  49. package/dist/HTN.js.map +1 -0
  50. package/dist/LearningAgentFixtures.d.ts +60 -0
  51. package/dist/LearningAgentFixtures.d.ts.map +1 -0
  52. package/dist/LearningAgentFixtures.js +122 -0
  53. package/dist/LearningAgentFixtures.js.map +1 -0
  54. package/dist/NetworkReplicationFixtures.d.ts +82 -0
  55. package/dist/NetworkReplicationFixtures.d.ts.map +1 -0
  56. package/dist/NetworkReplicationFixtures.js +330 -0
  57. package/dist/NetworkReplicationFixtures.js.map +1 -0
  58. package/dist/Perception.d.ts +58 -0
  59. package/dist/Perception.d.ts.map +1 -0
  60. package/dist/Perception.js +111 -0
  61. package/dist/Perception.js.map +1 -0
  62. package/dist/PlayerBehaviorTelemetryFixtures.d.ts +74 -0
  63. package/dist/PlayerBehaviorTelemetryFixtures.d.ts.map +1 -0
  64. package/dist/PlayerBehaviorTelemetryFixtures.js +189 -0
  65. package/dist/PlayerBehaviorTelemetryFixtures.js.map +1 -0
  66. package/dist/ProceduralContentAdaptationFixtures.d.ts +52 -0
  67. package/dist/ProceduralContentAdaptationFixtures.d.ts.map +1 -0
  68. package/dist/ProceduralContentAdaptationFixtures.js +149 -0
  69. package/dist/ProceduralContentAdaptationFixtures.js.map +1 -0
  70. package/dist/ScriptContext.d.ts +18 -0
  71. package/dist/ScriptContext.d.ts.map +1 -0
  72. package/dist/ScriptContext.js +21 -0
  73. package/dist/ScriptContext.js.map +1 -0
  74. package/dist/StateMachine.d.ts +52 -0
  75. package/dist/StateMachine.d.ts.map +1 -0
  76. package/dist/StateMachine.js +117 -0
  77. package/dist/StateMachine.js.map +1 -0
  78. package/dist/UtilityAI.d.ts +55 -0
  79. package/dist/UtilityAI.d.ts.map +1 -0
  80. package/dist/UtilityAI.js +113 -0
  81. package/dist/UtilityAI.js.map +1 -0
  82. package/dist/VisualGraph.d.ts +20 -0
  83. package/dist/VisualGraph.d.ts.map +1 -0
  84. package/dist/VisualGraph.js +191 -0
  85. package/dist/VisualGraph.js.map +1 -0
  86. package/dist/VisualGraphContext.d.ts +123 -0
  87. package/dist/VisualGraphContext.d.ts.map +1 -0
  88. package/dist/VisualGraphContext.js +2 -0
  89. package/dist/VisualGraphContext.js.map +1 -0
  90. package/dist/VisualGraphExecutor.d.ts +16 -0
  91. package/dist/VisualGraphExecutor.d.ts.map +1 -0
  92. package/dist/VisualGraphExecutor.js +571 -0
  93. package/dist/VisualGraphExecutor.js.map +1 -0
  94. package/dist/VisualNode.d.ts +17 -0
  95. package/dist/VisualNode.d.ts.map +1 -0
  96. package/dist/VisualNode.js +24 -0
  97. package/dist/VisualNode.js.map +1 -0
  98. package/dist/VisualNodeCatalog.d.ts +14 -0
  99. package/dist/VisualNodeCatalog.d.ts.map +1 -0
  100. package/dist/VisualNodeCatalog.js +142 -0
  101. package/dist/VisualNodeCatalog.js.map +1 -0
  102. package/dist/WeaponSystem.d.ts +228 -0
  103. package/dist/WeaponSystem.d.ts.map +1 -0
  104. package/dist/WeaponSystem.js +530 -0
  105. package/dist/WeaponSystem.js.map +1 -0
  106. package/dist/index.d.ts +51 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +25 -0
  109. package/dist/index.js.map +1 -0
  110. package/package.json +13 -0
  111. package/src/AdaptiveDifficultyFixtures.ts +324 -0
  112. package/src/AnalyticsPrivacyFixtures.ts +182 -0
  113. package/src/Behavior.ts +11 -0
  114. package/src/BehaviorHost.ts +51 -0
  115. package/src/BehaviorRegistry.ts +22 -0
  116. package/src/BehaviorSystem.ts +103 -0
  117. package/src/BehaviorTree.ts +234 -0
  118. package/src/CloudServiceFixtures.ts +225 -0
  119. package/src/CulturalBehaviorFixtures.ts +262 -0
  120. package/src/DecisionTree.ts +162 -0
  121. package/src/GOAP.ts +150 -0
  122. package/src/HTN.ts +178 -0
  123. package/src/LearningAgentFixtures.ts +184 -0
  124. package/src/NetworkReplicationFixtures.ts +440 -0
  125. package/src/Perception.ts +163 -0
  126. package/src/PlayerBehaviorTelemetryFixtures.ts +257 -0
  127. package/src/ProceduralContentAdaptationFixtures.ts +205 -0
  128. package/src/ScriptContext.ts +34 -0
  129. package/src/StateMachine.ts +138 -0
  130. package/src/UtilityAI.ts +158 -0
  131. package/src/VisualGraph.ts +236 -0
  132. package/src/VisualGraphContext.ts +138 -0
  133. package/src/VisualGraphExecutor.ts +663 -0
  134. package/src/VisualNode.ts +44 -0
  135. package/src/VisualNodeCatalog.ts +195 -0
  136. package/src/WeaponSystem.ts +793 -0
  137. package/src/index.ts +175 -0
  138. package/tests/scripting.test.ts +229 -0
  139. package/tsconfig.json +7 -0
@@ -0,0 +1,189 @@
1
+ export function samplePlayerBehaviorTelemetryFixture(options = {}) {
2
+ const seed = normalizeSeed(options.seed ?? 0xb34a);
3
+ const playerId = normalizePlayerId(options.playerId ?? "external-parity-runtime-player");
4
+ const sessionSeconds = positive(options.sessionSeconds ?? 180, "sessionSeconds");
5
+ const combat = count(options.combatEvents ?? 12, "combatEvents");
6
+ const movement = count(options.movementEvents ?? 18, "movementEvents");
7
+ const interaction = count(options.interactionEvents ?? 7, "interactionEvents");
8
+ const progression = count(options.progressionEvents ?? 5, "progressionEvents");
9
+ const success = count(options.successEvents ?? 24, "successEvents");
10
+ const total = combat + movement + interaction + progression;
11
+ const successRate = Number((success / Math.max(1, total)).toFixed(4));
12
+ const eventsPerMinute = Number((total / Math.max(1, sessionSeconds / 60)).toFixed(3));
13
+ const combatRatio = combat / Math.max(1, total);
14
+ const movementRatio = movement / Math.max(1, total);
15
+ const interactionRatio = interaction / Math.max(1, total);
16
+ const progressionRatio = progression / Math.max(1, total);
17
+ const playstyle = detectPlaystyle({ combatRatio, movementRatio, interactionRatio, progressionRatio, successRate, eventsPerMinute });
18
+ const skillScore = successRate * 0.4 + Math.min(eventsPerMinute / 10, 1) * 0.3 + Math.min(4 / Math.max(1, total), 1) * 0.3;
19
+ const skillLevel = skillForScore(skillScore);
20
+ const engagement = sessionSeconds > 900 ? "hardcore" : sessionSeconds > 420 ? "dedicated" : sessionSeconds > 180 ? "regular" : "casual";
21
+ const skills = [
22
+ skill("combat", clamp01(successRate * 0.7 + combatRatio * 0.3), combat),
23
+ skill("navigation", clamp01(0.45 + movementRatio * 0.65), movement),
24
+ skill("objective-routing", clamp01(0.36 + progressionRatio * 1.1), progression),
25
+ skill("interaction", clamp01(0.42 + interactionRatio * 1.15), interaction)
26
+ ];
27
+ const patterns = [
28
+ { name: `${playstyle}-loop`, frequency: Number(Math.max(1, eventsPerMinute).toFixed(3)), confidence: Number((0.62 + successRate * 0.24).toFixed(3)) },
29
+ { name: "objective-retry", frequency: Number((Math.max(0, total - success) / Math.max(1, sessionSeconds / 60)).toFixed(3)), confidence: Number((0.5 + (1 - successRate) * 0.32).toFixed(3)) }
30
+ ];
31
+ const insights = [
32
+ {
33
+ type: "playstyle",
34
+ confidence: patterns[0]?.confidence ?? 0.6,
35
+ evidence: [`combat=${combat}`, `movement=${movement}`, `progression=${progression}`],
36
+ recommendations: [playstyle === "aggressive" ? "offer-combat-optional-objective" : "offer-navigation-shortcut"]
37
+ },
38
+ {
39
+ type: "skill-estimate",
40
+ confidence: Number((0.58 + skillScore * 0.3).toFixed(3)),
41
+ evidence: [`successRate=${successRate}`, `eventsPerMinute=${eventsPerMinute}`],
42
+ recommendations: [skillScore > 0.6 ? "raise-optional-challenge" : "keep-assistive-checkpoints"]
43
+ }
44
+ ];
45
+ const core = {
46
+ playerId,
47
+ skillLevel,
48
+ playstyle,
49
+ engagement,
50
+ successRate,
51
+ eventsPerMinute,
52
+ skills,
53
+ patterns,
54
+ insights
55
+ };
56
+ return {
57
+ source: "origin-master-player-profile-event-analysis-adapted",
58
+ playerId,
59
+ profile: {
60
+ skillLevel,
61
+ playstyle,
62
+ engagement,
63
+ skills,
64
+ preferences: [
65
+ { category: "difficulty", value: skillScore > 0.6 ? "advanced" : "adaptive", strength: Number((0.62 + seededUnit(seed) * 0.22).toFixed(3)) },
66
+ { category: "route", value: movementRatio > combatRatio ? "exploration" : "direct", strength: Number((0.56 + seededUnit(seed ^ 0x2735) * 0.2).toFixed(3)) }
67
+ ],
68
+ patterns,
69
+ totalPlaytimeMs: Math.round(sessionSeconds * 1000),
70
+ sessionCount: 3 + Math.round(seededUnit(seed ^ 0x9e37) * 4)
71
+ },
72
+ events: {
73
+ total,
74
+ byCategory: {
75
+ combat,
76
+ movement,
77
+ interaction,
78
+ progression,
79
+ economy: 0,
80
+ social: 0,
81
+ custom: 0
82
+ },
83
+ bySeverity: {
84
+ low: movement,
85
+ medium: interaction + progression,
86
+ high: combat,
87
+ critical: 0
88
+ },
89
+ successRate,
90
+ avgDurationMs: Number((180 + seededUnit(seed ^ 0xf00d) * 140).toFixed(2)),
91
+ eventsPerMinute
92
+ },
93
+ sessionAnalysis: {
94
+ durationMs: Math.round(sessionSeconds * 1000),
95
+ dominantPlaystyle: playstyle,
96
+ skillEstimate: skillLevel,
97
+ insights
98
+ },
99
+ productionReadiness: {
100
+ playerProfileTelemetry: true,
101
+ eventTrackingTelemetry: true,
102
+ behaviorPatternTelemetry: true,
103
+ adaptiveSystemInputTelemetry: true
104
+ },
105
+ blockedClaims: [
106
+ "production player modeling certification",
107
+ "privacy/compliance analytics certification",
108
+ "cloud telemetry pipeline parity",
109
+ "Unity Analytics/Remote Config parity",
110
+ "Unreal Insights gameplay telemetry parity"
111
+ ],
112
+ claimBoundary: "This fixture ports old smart PlayerProfile/EventTracker/BehaviorAnalyzer concepts into deterministic local runtime telemetry. It does not claim production player modeling, privacy/compliance analytics certification, cloud telemetry pipelines, Unity Analytics, or Unreal Insights parity.",
113
+ hash: stableHash(JSON.stringify(core))
114
+ };
115
+ }
116
+ function detectPlaystyle(stats) {
117
+ if (stats.combatRatio > 0.45 && stats.eventsPerMinute > 8)
118
+ return "aggressive";
119
+ if (stats.movementRatio > 0.45 && stats.combatRatio < 0.35)
120
+ return "exploration";
121
+ if (stats.successRate > 0.7 && stats.combatRatio < 0.4)
122
+ return "stealth";
123
+ if (stats.eventsPerMinute > 10 && stats.progressionRatio > 0.2)
124
+ return "speedrun";
125
+ if (stats.interactionRatio > 0.35)
126
+ return "completionist";
127
+ if (stats.combatRatio > 0.3 && stats.successRate > 0.6)
128
+ return "defensive";
129
+ return "balanced";
130
+ }
131
+ function skillForScore(score) {
132
+ if (score < 0.2)
133
+ return "beginner";
134
+ if (score < 0.4)
135
+ return "novice";
136
+ if (score < 0.6)
137
+ return "intermediate";
138
+ if (score < 0.8)
139
+ return "advanced";
140
+ return "expert";
141
+ }
142
+ function skill(area, level, sampleSize) {
143
+ return {
144
+ area,
145
+ level: Number(level.toFixed(4)),
146
+ confidence: Number(Math.min(1, Math.max(0.1, sampleSize / 40)).toFixed(3)),
147
+ sampleSize
148
+ };
149
+ }
150
+ function count(value, name) {
151
+ if (!Number.isFinite(value) || value < 0)
152
+ throw new Error(`${name} must be a non-negative finite number.`);
153
+ return Math.trunc(value);
154
+ }
155
+ function positive(value, name) {
156
+ if (!Number.isFinite(value) || value <= 0)
157
+ throw new Error(`${name} must be a positive finite number.`);
158
+ return value;
159
+ }
160
+ function normalizeSeed(seed) {
161
+ if (!Number.isInteger(seed) || seed < 0)
162
+ throw new Error("seed must be a non-negative integer.");
163
+ return seed >>> 0;
164
+ }
165
+ function normalizePlayerId(playerId) {
166
+ const normalized = playerId.trim();
167
+ if (normalized.length === 0)
168
+ throw new Error("playerId is required.");
169
+ return normalized;
170
+ }
171
+ function clamp01(value) {
172
+ return Math.max(0, Math.min(1, value));
173
+ }
174
+ function seededUnit(seed) {
175
+ let value = seed >>> 0;
176
+ value ^= value << 13;
177
+ value ^= value >>> 17;
178
+ value ^= value << 5;
179
+ return (value >>> 0) / 0xffffffff;
180
+ }
181
+ function stableHash(value) {
182
+ let hash = 2166136261;
183
+ for (let index = 0; index < value.length; index += 1) {
184
+ hash ^= value.charCodeAt(index);
185
+ hash = Math.imul(hash, 16777619);
186
+ }
187
+ return (hash >>> 0).toString(16).padStart(8, "0");
188
+ }
189
+ //# sourceMappingURL=PlayerBehaviorTelemetryFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayerBehaviorTelemetryFixtures.js","sourceRoot":"","sources":["../../../../packages/scripting/src/PlayerBehaviorTelemetryFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { PlayerBehaviorTelemetryFixture } from "./PlayerBehaviorTelemetryFixtures";
2
+ export type GeneratedContentType = "level" | "quest" | "enemy_encounter" | "puzzle" | "reward" | "narrative";
3
+ export type GeneratedContentDifficulty = "trivial" | "easy" | "moderate" | "challenging" | "extreme";
4
+ export type AdaptiveAiStrategy = "mirror" | "counter" | "exploit" | "match_skill" | "challenge";
5
+ export interface ProceduralContentAdaptationOptions {
6
+ readonly seed?: number;
7
+ readonly playerTelemetry: PlayerBehaviorTelemetryFixture;
8
+ readonly strategy?: AdaptiveAiStrategy;
9
+ }
10
+ export interface GeneratedContentTelemetry {
11
+ readonly id: string;
12
+ readonly type: GeneratedContentType;
13
+ readonly difficulty: GeneratedContentDifficulty;
14
+ readonly estimatedDurationMs: number;
15
+ readonly tags: readonly string[];
16
+ readonly parameters: {
17
+ readonly size?: number;
18
+ readonly enemyCount?: number;
19
+ readonly resourceCount?: number;
20
+ readonly hasSecretAreas?: boolean;
21
+ readonly hasTimeLimit?: boolean;
22
+ readonly layout?: "linear" | "branching";
23
+ readonly objectiveCount?: number;
24
+ readonly rewardTier?: string;
25
+ };
26
+ }
27
+ export interface ProceduralContentAdaptationFixture {
28
+ readonly source: "origin-master-content-generator-adaptive-ai-adapted";
29
+ readonly content: readonly GeneratedContentTelemetry[];
30
+ readonly adaptiveAi: {
31
+ readonly strategy: AdaptiveAiStrategy;
32
+ readonly behaviorMode: "passive" | "balanced" | "aggressive" | "tactical" | "adaptive";
33
+ readonly aggression: number;
34
+ readonly defensiveness: number;
35
+ readonly tacticalAwareness: number;
36
+ readonly reactionSpeed: number;
37
+ readonly accuracy: number;
38
+ readonly abilityUsage: number;
39
+ readonly coordination: number;
40
+ };
41
+ readonly productionReadiness: {
42
+ readonly contentGenerationTelemetry: true;
43
+ readonly playstyleCustomizationTelemetry: true;
44
+ readonly skillScalingTelemetry: true;
45
+ readonly adaptiveAiParameterTelemetry: true;
46
+ };
47
+ readonly blockedClaims: readonly string[];
48
+ readonly claimBoundary: string;
49
+ readonly hash: string;
50
+ }
51
+ export declare function sampleProceduralContentAdaptationFixture(options: ProceduralContentAdaptationOptions): ProceduralContentAdaptationFixture;
52
+ //# sourceMappingURL=ProceduralContentAdaptationFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProceduralContentAdaptationFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/ProceduralContentAdaptationFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAqC,MAAM,mCAAmC,CAAC;AAE3H,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC7G,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC;AACrG,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAEhG,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,8BAA8B,CAAC;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CACxC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAC;IAChD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;QACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,MAAM,EAAE,qDAAqD,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACvD,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;QACvF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,mBAAmB,EAAE;QAC5B,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC;QAC1C,QAAQ,CAAC,+BAA+B,EAAE,IAAI,CAAC;QAC/C,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC;QACrC,QAAQ,CAAC,4BAA4B,EAAE,IAAI,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,wCAAwC,CAAC,OAAO,EAAE,kCAAkC,GAAG,kCAAkC,CAiCxI"}
@@ -0,0 +1,149 @@
1
+ export function sampleProceduralContentAdaptationFixture(options) {
2
+ const seed = normalizeSeed(options.seed ?? 0xc067);
3
+ const profile = options.playerTelemetry.profile;
4
+ const difficulty = difficultyForSkill(profile.skillLevel);
5
+ const playstyle = profile.playstyle;
6
+ const content = [
7
+ generateLevel(seed, difficulty, playstyle),
8
+ generateEncounter(seed ^ 0x1138, difficulty, playstyle),
9
+ generateReward(seed ^ 0x9821, difficulty, profile.skillLevel),
10
+ generateQuest(seed ^ 0xa77a, difficulty, playstyle)
11
+ ];
12
+ const adaptiveAi = adaptiveAiFor(options.strategy ?? "counter", playstyle, profile.skillLevel, options.playerTelemetry.events.successRate);
13
+ const core = { content, adaptiveAi, playerHash: options.playerTelemetry.hash };
14
+ return {
15
+ source: "origin-master-content-generator-adaptive-ai-adapted",
16
+ content,
17
+ adaptiveAi,
18
+ productionReadiness: {
19
+ contentGenerationTelemetry: true,
20
+ playstyleCustomizationTelemetry: true,
21
+ skillScalingTelemetry: true,
22
+ adaptiveAiParameterTelemetry: true
23
+ },
24
+ blockedClaims: [
25
+ "production procedural content generation parity",
26
+ "runtime-authored quest/narrative generation",
27
+ "Unity Adaptive Performance/Game Foundation parity",
28
+ "Unreal PCG Framework/MassAI parity",
29
+ "LLM-authored live content generation"
30
+ ],
31
+ claimBoundary: "This fixture ports old ContentGenerator/AdaptiveAI concepts into deterministic content-plan and adaptive-parameter telemetry. It does not create production PCG levels, generate live narrative, or claim Unity/Unreal PCG or AI-system parity.",
32
+ hash: stableHash(JSON.stringify(core))
33
+ };
34
+ }
35
+ function generateLevel(seed, difficulty, playstyle) {
36
+ const multiplier = difficultyMultiplier(difficulty);
37
+ return {
38
+ id: "content-level-1",
39
+ type: "level",
40
+ difficulty,
41
+ estimatedDurationMs: Math.round(240000 * multiplier),
42
+ tags: ["procedural", "level", playstyle],
43
+ parameters: {
44
+ size: Math.round(90 * multiplier),
45
+ enemyCount: playstyle === "stealth" ? Math.round(4 * multiplier) : Math.round(7 * multiplier),
46
+ resourceCount: playstyle === "exploration" || playstyle === "completionist" ? Math.round(10 * multiplier) : Math.round(6 * multiplier),
47
+ hasSecretAreas: playstyle === "exploration" || playstyle === "completionist",
48
+ hasTimeLimit: playstyle === "speedrun",
49
+ layout: seededUnit(seed) > 0.5 ? "branching" : "linear"
50
+ }
51
+ };
52
+ }
53
+ function generateEncounter(seed, difficulty, playstyle) {
54
+ const multiplier = difficultyMultiplier(difficulty);
55
+ return {
56
+ id: "content-encounter-1",
57
+ type: "enemy_encounter",
58
+ difficulty,
59
+ estimatedDurationMs: Math.round(95000 * multiplier),
60
+ tags: ["combat", "encounter", playstyle === "defensive" ? "cover" : "pressure"],
61
+ parameters: {
62
+ enemyCount: Math.max(1, Math.round((playstyle === "aggressive" ? 6 : 4) * multiplier)),
63
+ resourceCount: Math.max(1, Math.round((1 + seededUnit(seed) * 3) * multiplier)),
64
+ layout: playstyle === "defensive" ? "branching" : "linear"
65
+ }
66
+ };
67
+ }
68
+ function generateReward(seed, difficulty, skill) {
69
+ return {
70
+ id: "content-reward-1",
71
+ type: "reward",
72
+ difficulty,
73
+ estimatedDurationMs: 0,
74
+ tags: ["reward", "loot", skill],
75
+ parameters: {
76
+ rewardTier: skill === "expert" || skill === "advanced" ? "rare" : seededUnit(seed) > 0.55 ? "uncommon" : "standard",
77
+ resourceCount: Math.round(2 + seededUnit(seed ^ 0x55aa) * 4)
78
+ }
79
+ };
80
+ }
81
+ function generateQuest(seed, difficulty, playstyle) {
82
+ return {
83
+ id: "content-quest-1",
84
+ type: "quest",
85
+ difficulty,
86
+ estimatedDurationMs: Math.round(360000 * difficultyMultiplier(difficulty)),
87
+ tags: ["quest", playstyle === "exploration" ? "optional" : "objective"],
88
+ parameters: {
89
+ objectiveCount: Math.round(2 + seededUnit(seed) * 3),
90
+ hasSecretAreas: playstyle === "completionist" || playstyle === "exploration"
91
+ }
92
+ };
93
+ }
94
+ function adaptiveAiFor(strategy, playstyle, skill, successRate) {
95
+ const skillScale = skill === "expert" ? 1 : skill === "advanced" ? 0.85 : skill === "intermediate" ? 0.65 : skill === "novice" ? 0.48 : 0.35;
96
+ const counterAggression = playstyle === "defensive" || playstyle === "stealth" ? 0.72 : playstyle === "aggressive" ? 0.48 : 0.58;
97
+ return {
98
+ strategy,
99
+ behaviorMode: strategy === "counter" || strategy === "challenge" ? "adaptive" : "balanced",
100
+ aggression: Number(Math.min(1, counterAggression + skillScale * 0.12).toFixed(3)),
101
+ defensiveness: Number((playstyle === "aggressive" ? 0.72 : 0.48 + skillScale * 0.16).toFixed(3)),
102
+ tacticalAwareness: Number((0.42 + skillScale * 0.44).toFixed(3)),
103
+ reactionSpeed: Number((0.82 + skillScale * 0.38).toFixed(3)),
104
+ accuracy: Number((0.36 + skillScale * 0.36 + successRate * 0.08).toFixed(3)),
105
+ abilityUsage: Number((0.3 + skillScale * 0.48).toFixed(3)),
106
+ coordination: Number((0.38 + skillScale * 0.32).toFixed(3))
107
+ };
108
+ }
109
+ function difficultyForSkill(skill) {
110
+ if (skill === "beginner")
111
+ return "easy";
112
+ if (skill === "novice" || skill === "intermediate")
113
+ return "moderate";
114
+ if (skill === "advanced")
115
+ return "challenging";
116
+ return "extreme";
117
+ }
118
+ function difficultyMultiplier(difficulty) {
119
+ if (difficulty === "trivial")
120
+ return 0.6;
121
+ if (difficulty === "easy")
122
+ return 0.8;
123
+ if (difficulty === "moderate")
124
+ return 1;
125
+ if (difficulty === "challenging")
126
+ return 1.28;
127
+ return 1.55;
128
+ }
129
+ function normalizeSeed(seed) {
130
+ if (!Number.isInteger(seed) || seed < 0)
131
+ throw new Error("seed must be a non-negative integer.");
132
+ return seed >>> 0;
133
+ }
134
+ function seededUnit(seed) {
135
+ let value = seed >>> 0;
136
+ value ^= value << 13;
137
+ value ^= value >>> 17;
138
+ value ^= value << 5;
139
+ return (value >>> 0) / 0xffffffff;
140
+ }
141
+ function stableHash(value) {
142
+ let hash = 2166136261;
143
+ for (let index = 0; index < value.length; index += 1) {
144
+ hash ^= value.charCodeAt(index);
145
+ hash = Math.imul(hash, 16777619);
146
+ }
147
+ return (hash >>> 0).toString(16).padStart(8, "0");
148
+ }
149
+ //# sourceMappingURL=ProceduralContentAdaptationFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProceduralContentAdaptationFixtures.js","sourceRoot":"","sources":["../../../../packages/scripting/src/ProceduralContentAdaptationFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { BehaviorPhase } from "./Behavior";
2
+ export interface ScriptContextOptions {
3
+ readonly phase: BehaviorPhase;
4
+ readonly deltaSeconds?: number;
5
+ readonly fixedDeltaSeconds?: number;
6
+ readonly target?: unknown;
7
+ readonly services?: ReadonlyMap<string, unknown>;
8
+ }
9
+ export declare class ScriptContext {
10
+ readonly phase: BehaviorPhase;
11
+ readonly deltaSeconds: number;
12
+ readonly fixedDeltaSeconds: number;
13
+ readonly target?: unknown;
14
+ private readonly services;
15
+ constructor(options: ScriptContextOptions);
16
+ getService<T>(name: string): T;
17
+ }
18
+ //# sourceMappingURL=ScriptContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptContext.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/ScriptContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;gBAE5C,OAAO,EAAE,oBAAoB;IAQzC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;CAO/B"}
@@ -0,0 +1,21 @@
1
+ export class ScriptContext {
2
+ phase;
3
+ deltaSeconds;
4
+ fixedDeltaSeconds;
5
+ target;
6
+ services;
7
+ constructor(options) {
8
+ this.phase = options.phase;
9
+ this.deltaSeconds = options.deltaSeconds ?? 0;
10
+ this.fixedDeltaSeconds = options.fixedDeltaSeconds ?? 0;
11
+ this.target = options.target;
12
+ this.services = options.services ?? new Map();
13
+ }
14
+ getService(name) {
15
+ if (!this.services.has(name)) {
16
+ throw new Error(`Script service is not available in ${this.phase}: ${name}`);
17
+ }
18
+ return this.services.get(name);
19
+ }
20
+ }
21
+ //# sourceMappingURL=ScriptContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptContext.js","sourceRoot":"","sources":["../../../../packages/scripting/src/ScriptContext.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,aAAa;IACf,KAAK,CAAgB;IACrB,YAAY,CAAS;IACrB,iBAAiB,CAAS;IAC1B,MAAM,CAAW;IAET,QAAQ,CAA+B;IAExD,YAAY,OAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,UAAU,CAAI,IAAY;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAM,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,52 @@
1
+ import { Blackboard, type BlackboardValue } from "./BehaviorTree";
2
+ export type StateTransitionCondition = (blackboard: Blackboard) => boolean;
3
+ export interface StateTransition {
4
+ readonly targetState: string;
5
+ readonly condition: StateTransitionCondition;
6
+ readonly priority: number;
7
+ readonly name: string;
8
+ }
9
+ export interface StateMachineSnapshot {
10
+ readonly running: boolean;
11
+ readonly currentState: string;
12
+ readonly previousState: string;
13
+ readonly tickCount: number;
14
+ readonly transitionCount: number;
15
+ readonly history: readonly string[];
16
+ readonly trace: readonly string[];
17
+ }
18
+ export declare class State {
19
+ readonly id: string;
20
+ readonly name: string;
21
+ readonly transitions: StateTransition[];
22
+ onEnter?: (blackboard: Blackboard) => void;
23
+ onUpdate?: (deltaSeconds: number, blackboard: Blackboard) => void;
24
+ onExit?: (blackboard: Blackboard) => void;
25
+ constructor(id: string, name?: string);
26
+ addTransition(targetState: string, condition: StateTransitionCondition, priority?: number, name?: string): this;
27
+ }
28
+ export declare class StateMachine {
29
+ readonly blackboard: Blackboard;
30
+ private readonly states;
31
+ private readonly history;
32
+ private readonly maxHistorySize;
33
+ private current?;
34
+ private previous?;
35
+ private running;
36
+ private tickCounter;
37
+ private transitionCounter;
38
+ private lastTrace;
39
+ constructor(blackboard?: Blackboard, options?: {
40
+ readonly maxHistorySize?: number;
41
+ });
42
+ addState(state: State): this;
43
+ getState(id: string): State | undefined;
44
+ start(stateId: string): StateMachineSnapshot;
45
+ stop(): StateMachineSnapshot;
46
+ update(deltaSeconds: number): StateMachineSnapshot;
47
+ set(key: string, value: BlackboardValue): void;
48
+ snapshot(): StateMachineSnapshot;
49
+ private transitionTo;
50
+ private requireState;
51
+ }
52
+ //# sourceMappingURL=StateMachine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../../../../packages/scripting/src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElE,MAAM,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,qBAAa,KAAK;IAMJ,QAAQ,CAAC,EAAE,EAAE,MAAM;IAAE,QAAQ,CAAC,IAAI;IAL9C,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,CAAM;IAC7C,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAClE,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;gBAErB,EAAE,EAAE,MAAM,EAAW,IAAI,SAAK;IAEnD,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,SAAI,EAAE,IAAI,SAA+B,GAAG,IAAI;CAKjI;AAED,qBAAa,YAAY;IAWX,QAAQ,CAAC,UAAU;IAV/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,OAAO,CAAC,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAgB;gBAEZ,UAAU,aAAmB,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO;IAItG,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM5B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIvC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB;IAU5C,IAAI,IAAI,oBAAoB;IAa5B,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,oBAAoB;IAiBlD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI;IAI9C,QAAQ,IAAI,oBAAoB;IAYhC,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,117 @@
1
+ import { Blackboard } from "./BehaviorTree.js";
2
+ export class State {
3
+ id;
4
+ name;
5
+ transitions = [];
6
+ onEnter;
7
+ onUpdate;
8
+ onExit;
9
+ constructor(id, name = id) {
10
+ this.id = id;
11
+ this.name = name;
12
+ }
13
+ addTransition(targetState, condition, priority = 0, name = `${this.id}->${targetState}`) {
14
+ this.transitions.push({ targetState, condition, priority, name });
15
+ this.transitions.sort((left, right) => right.priority - left.priority || left.name.localeCompare(right.name));
16
+ return this;
17
+ }
18
+ }
19
+ export class StateMachine {
20
+ blackboard;
21
+ states = new Map();
22
+ history = [];
23
+ maxHistorySize;
24
+ current;
25
+ previous;
26
+ running = false;
27
+ tickCounter = 0;
28
+ transitionCounter = 0;
29
+ lastTrace = [];
30
+ constructor(blackboard = new Blackboard(), options = {}) {
31
+ this.blackboard = blackboard;
32
+ this.maxHistorySize = options.maxHistorySize ?? 12;
33
+ }
34
+ addState(state) {
35
+ if (this.states.has(state.id))
36
+ throw new Error(`State already registered: ${state.id}`);
37
+ this.states.set(state.id, state);
38
+ return this;
39
+ }
40
+ getState(id) {
41
+ return this.states.get(id);
42
+ }
43
+ start(stateId) {
44
+ const state = this.requireState(stateId);
45
+ this.running = true;
46
+ this.current = state;
47
+ this.previous = undefined;
48
+ this.lastTrace = [`enter:${state.id}`];
49
+ state.onEnter?.(this.blackboard);
50
+ return this.snapshot();
51
+ }
52
+ stop() {
53
+ if (this.current) {
54
+ this.current.onExit?.(this.blackboard);
55
+ this.lastTrace = [`exit:${this.current.id}`, "stop"];
56
+ }
57
+ else {
58
+ this.lastTrace = ["stop"];
59
+ }
60
+ this.running = false;
61
+ this.previous = this.current;
62
+ this.current = undefined;
63
+ return this.snapshot();
64
+ }
65
+ update(deltaSeconds) {
66
+ this.tickCounter += 1;
67
+ this.lastTrace = [];
68
+ if (!this.running || !this.current) {
69
+ this.lastTrace.push("idle");
70
+ return this.snapshot();
71
+ }
72
+ this.current.onUpdate?.(Math.max(0, deltaSeconds), this.blackboard);
73
+ this.lastTrace.push(`update:${this.current.id}`);
74
+ const transition = this.current.transitions.find((entry) => entry.condition(this.blackboard));
75
+ if (transition) {
76
+ this.transitionTo(transition);
77
+ }
78
+ return this.snapshot();
79
+ }
80
+ set(key, value) {
81
+ this.blackboard.set(key, value);
82
+ }
83
+ snapshot() {
84
+ return {
85
+ running: this.running,
86
+ currentState: this.current?.id ?? "none",
87
+ previousState: this.previous?.id ?? "none",
88
+ tickCount: this.tickCounter,
89
+ transitionCount: this.transitionCounter,
90
+ history: [...this.history],
91
+ trace: [...this.lastTrace]
92
+ };
93
+ }
94
+ transitionTo(transition) {
95
+ if (!this.current)
96
+ return;
97
+ const from = this.current;
98
+ const to = this.requireState(transition.targetState);
99
+ from.onExit?.(this.blackboard);
100
+ this.previous = from;
101
+ this.current = to;
102
+ this.transitionCounter += 1;
103
+ this.history.push(`${from.id}->${to.id}`);
104
+ while (this.history.length > this.maxHistorySize)
105
+ this.history.shift();
106
+ this.lastTrace.push(`transition:${transition.name}`);
107
+ to.onEnter?.(this.blackboard);
108
+ this.lastTrace.push(`enter:${to.id}`);
109
+ }
110
+ requireState(id) {
111
+ const state = this.states.get(id);
112
+ if (!state)
113
+ throw new Error(`State is not registered: ${id}`);
114
+ return state;
115
+ }
116
+ }
117
+ //# sourceMappingURL=StateMachine.js.map