@vibemancer/core 0.1.4 → 0.1.5

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 (74) hide show
  1. package/README.md +2 -2
  2. package/dist/chunk-W7HWJFQ4.js +10599 -0
  3. package/dist/chunk-W7HWJFQ4.js.map +1 -0
  4. package/dist/index-browser.d.ts +1300 -1051
  5. package/dist/index-browser.js +55 -17
  6. package/dist/index.d.ts +53 -3
  7. package/dist/index.js +200 -54
  8. package/dist/index.js.map +1 -1
  9. package/package.json +21 -15
  10. package/src/bots/Hero.ts +867 -0
  11. package/src/bots/berserker/01_Stormchaser.ts +162 -120
  12. package/src/bots/berserker/02_Stormcaller.ts +160 -116
  13. package/src/bots/berserker/03_Stormforger.ts +162 -129
  14. package/src/bots/caster/01_Flamecaller.ts +126 -84
  15. package/src/bots/caster/02_Pyromancer.ts +148 -101
  16. package/src/bots/caster/03_Infernalist.ts +180 -160
  17. package/src/bots/defensive/01_Turtle.ts +48 -44
  18. package/src/bots/defensive/02_Sentinel.ts +57 -53
  19. package/src/bots/defensive/03_Golem.ts +85 -97
  20. package/src/bots/duelist/01_Battlemage.ts +157 -122
  21. package/src/bots/duelist/02_Warmage.ts +166 -121
  22. package/src/bots/duelist/03_Archmage.ts +198 -178
  23. package/src/bots/homing/01_Bonemancer.ts +20 -32
  24. package/src/bots/homing/02_Lich.ts +145 -93
  25. package/src/bots/homing/03_Archlich.ts +129 -60
  26. package/src/bots/kiter/01_Spellspinner.ts +145 -107
  27. package/src/bots/kiter/02_Spellweaver.ts +153 -105
  28. package/src/bots/kiter/03_Spellbinder.ts +168 -123
  29. package/src/bots/melee/01_Shadowblade.ts +131 -75
  30. package/src/bots/melee/02_Nightblade.ts +174 -130
  31. package/src/bots/melee/03_Voidblade.ts +266 -168
  32. package/src/bots/registry.ts +44 -37
  33. package/src/bots/shared.ts +185 -25
  34. package/src/bots/sniper/01_Spellshot.ts +151 -98
  35. package/src/bots/sniper/02_Spelltracer.ts +173 -128
  36. package/src/bots/sniper/03_Spellseeker.ts +177 -152
  37. package/src/bots/standalone/Critter.ts +46 -52
  38. package/src/bots/standalone/Doombringer.ts +36 -40
  39. package/src/bots/standalone/Hogger.ts +120 -89
  40. package/src/bots/standalone/Rookie.ts +21 -23
  41. package/src/bots/standalone/TargetDummy.ts +5 -6
  42. package/src/bots/test/cheater.ts +91 -85
  43. package/src/bots/test/crasher.ts +26 -28
  44. package/src/engine/bundle-fight.ts +242 -0
  45. package/src/engine/hooks-runtime.ts +58 -18
  46. package/src/engine/manual-match.ts +33 -25
  47. package/src/engine/missile-templates.ts +25 -43
  48. package/src/engine/optimizer.ts +7 -7
  49. package/src/engine/params-runtime.ts +3 -3
  50. package/src/engine/physics.ts +33 -23
  51. package/src/engine/sandbox-browser.ts +8 -7
  52. package/src/engine/sandbox-compile.ts +1 -1
  53. package/src/engine/sandbox-harness.ts +299 -367
  54. package/src/engine/sandbox.ts +3 -3
  55. package/src/engine/simulation.ts +291 -76
  56. package/src/engine/spells.ts +9 -12
  57. package/src/engine-version.ts +1 -1
  58. package/src/hooks/action-builders.ts +76 -21
  59. package/src/hooks/index.ts +17 -9
  60. package/src/hooks/state-hooks.ts +61 -25
  61. package/src/hooks/threat-analysis.ts +44 -20
  62. package/src/hooks/types.ts +62 -5
  63. package/src/index.ts +2 -0
  64. package/src/rules.ts +209 -63
  65. package/src/stats.ts +2 -2
  66. package/src/testing.ts +6 -30
  67. package/src/trace.ts +63 -3
  68. package/src/types.ts +127 -14
  69. package/src/utils/angles.ts +1 -0
  70. package/src/utils/combat.ts +98 -6
  71. package/src/utils/spatial.ts +3 -3
  72. package/dist/chunk-74FFJCFF.js +0 -9140
  73. package/dist/chunk-74FFJCFF.js.map +0 -1
  74. package/src/hooks/bot-wrapper.ts +0 -84
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ALL_BOTS,
3
- ARENA_HEIGHT,
3
+ ARENA_MAX,
4
+ ARENA_MIN,
4
5
  ARENA_SIZE,
5
6
  ARENA_WATER_BUFFER,
6
- ARENA_WIDTH,
7
7
  Archlich,
8
8
  Archmage,
9
9
  BLINK_CAST_TIME,
@@ -28,6 +28,11 @@ import {
28
28
  Golem,
29
29
  Hogger,
30
30
  Infernalist,
31
+ KNOCKBACK_DAMAGE_THRESHOLD,
32
+ KNOCKBACK_DECAY,
33
+ KNOCKBACK_DELAY,
34
+ KNOCKBACK_SPEED_PER_DAMAGE,
35
+ LAVA_BORDER_WIDTH,
31
36
  Lich,
32
37
  MATCH_DURATION,
33
38
  MAX_HEALTH,
@@ -50,6 +55,8 @@ import {
50
55
  ManualMatch,
51
56
  Nightblade,
52
57
  Pyromancer,
58
+ RULES,
59
+ RULESET_RANGES,
53
60
  Rookie,
54
61
  SHIELD_CAST_TIME,
55
62
  SHIELD_DECAY_PER_SECOND,
@@ -87,8 +94,8 @@ import {
87
94
  angleDiff,
88
95
  angleInRange,
89
96
  angleTo,
90
- antiHomingMissile,
91
97
  applyDamage,
98
+ applyRulesetOverrides,
92
99
  blink,
93
100
  browserSandboxFight,
94
101
  browserSandboxSimulate,
@@ -109,18 +116,22 @@ import {
109
116
  createInitialState,
110
117
  createRandom,
111
118
  createWorkerScript,
119
+ currentRuleset,
112
120
  diagnoseTrace,
113
121
  directionAway,
114
122
  directionTo,
115
123
  distanceTo,
116
124
  effectiveTurnRateCost,
117
125
  extractAction,
126
+ extractMissileAction,
118
127
  extractStats,
119
128
  extractTraceEvents,
120
129
  fight,
121
130
  findInRange,
122
131
  findNearest,
132
+ fitMissileForEscapingTarget,
123
133
  fitMissileToBudget,
134
+ flyStraight,
124
135
  formatDiagnosis,
125
136
  formatStats,
126
137
  formatTraceEvents,
@@ -128,17 +139,18 @@ import {
128
139
  generateCandidates,
129
140
  generateCombos,
130
141
  getAdaptiveMissileConfig,
131
- getBotContext,
132
142
  getEffectiveRange,
133
143
  getLeadPosition,
134
144
  getMissileCastTime,
145
+ getMissileContext,
135
146
  getPlayerState,
147
+ getWizardContext,
136
148
  hashCombine,
137
149
  homingMissile,
138
150
  idle,
139
151
  inRange,
140
152
  interceptAngle,
141
- isNewStyleBot,
153
+ isInLava,
142
154
  magnitude,
143
155
  missile,
144
156
  move,
@@ -151,15 +163,17 @@ import {
151
163
  normalizeAngle,
152
164
  predictPosition,
153
165
  resetAllHooks,
166
+ resetRuleset,
154
167
  resolveWizardCollision,
155
- runBotWithContext,
156
168
  runWithHooks,
169
+ runWizardWithContext,
157
170
  scoreFight,
158
171
  scoreFightAsWizard2,
159
172
  seekerMissile,
160
173
  setParamValues,
161
174
  shield,
162
175
  simulate,
176
+ simulateMinDuration,
163
177
  sortByDistance,
164
178
  spiralMissile,
165
179
  startCast,
@@ -170,6 +184,8 @@ import {
170
184
  sweptCircleCollision,
171
185
  testBot,
172
186
  tick,
187
+ turnToAngle,
188
+ turnToward,
173
189
  updateShield,
174
190
  useArenaSize,
175
191
  useBlinkCooldown,
@@ -182,11 +198,14 @@ import {
182
198
  useEnemy,
183
199
  useHealth,
184
200
  useLastHitTick,
201
+ useLastMissileConfig,
185
202
  useMemo,
186
203
  useMyProjectiles,
187
204
  useMyThreatsToEnemy,
188
205
  useParam,
189
206
  usePosition,
207
+ useProjectiles,
208
+ useRandom,
190
209
  useRef,
191
210
  useShieldStrength,
192
211
  useState,
@@ -197,10 +216,10 @@ import {
197
216
  useVelocity,
198
217
  validateHookCall,
199
218
  validateMissileConfig,
200
- withBotContext,
201
- wrapNewBot,
219
+ withMissileContext,
220
+ withWizardContext,
202
221
  wrapWithParams
203
- } from "./chunk-74FFJCFF.js";
222
+ } from "./chunk-W7HWJFQ4.js";
204
223
 
205
224
  // src/engine/sandbox.ts
206
225
  import ivm from "isolated-vm";
@@ -247,50 +266,17 @@ function generateMatchEntryPoint(bot1SourcePath, bot1ExportName, bot2SourcePath,
247
266
  const bot2Path = bot2SourcePath.replace(/\\/g, "/");
248
267
  const srcPath = enginePath.replace(/\/engine\/?$/, "");
249
268
  return `
250
- import {${bot1ExportName} as __RawBot1} from '${bot1Path}';
251
- import {${bot2ExportName} as __RawBot2} from '${bot2Path}';
269
+ import {${bot1ExportName} as __Bot1} from '${bot1Path}';
270
+ import {${bot2ExportName} as __Bot2} from '${bot2Path}';
252
271
  import {fight, simulate} from '${srcPath}/engine/simulation.ts';
253
272
  import {wrapWithParams} from '${srcPath}/engine/params-runtime.ts';
254
- import {wrapNewBot} from '${srcPath}/hooks/bot-wrapper.ts';
255
-
256
- // Auto-detect new-style bots (hooks API) and wrap them for the simulation engine.
257
- // New-style: uses hooks, returns FinalAction (has _toAction method).
258
- // Old-style: accepts ({state, config, random}), returns WizardActions directly.
259
- // We detect by doing a dry-run call \u2014 if the result has _toAction, it's new-style.
260
- //
261
- // Detection is deferred until the first fight/simulate call so that malicious
262
- // bots (infinite loops, memory bombs) time out during fight(), not during
263
- // sandbox creation. __resolveBots memoizes the wrapped functions.
264
- function __wrap(bot) {
265
- if (bot.length > 0) return bot; // Old-style: has parameters
266
- // 0-param function could be either style. Try calling it to check return type.
267
- try {
268
- var result = bot();
269
- if (result && typeof result._toAction === 'function') {
270
- return wrapNewBot(bot);
271
- }
272
- } catch(e) {
273
- // If it throws (e.g. hooks not initialized), it must be new-style
274
- return wrapNewBot(bot);
275
- }
276
- return bot;
277
- }
278
-
279
- var __Bot1 = null;
280
- var __Bot2 = null;
281
- function __resolveBots() {
282
- if (__Bot1 === null) __Bot1 = __wrap(__RawBot1);
283
- if (__Bot2 === null) __Bot2 = __wrap(__RawBot2);
284
- }
285
273
 
286
274
  globalThis.__fight = function __fight(options) {
287
- __resolveBots();
288
275
  const result = fight(__Bot1, __Bot2, options);
289
276
  return result;
290
277
  };
291
278
 
292
279
  globalThis.__simulate = function __simulate(options) {
293
- __resolveBots();
294
280
  const {params1, params2, ...simOptions} = options;
295
281
  const bot1 = params1 ? wrapWithParams(__Bot1, params1) : __Bot1;
296
282
  const bot2 = params2 ? wrapWithParams(__Bot2, params2) : __Bot2;
@@ -402,7 +388,7 @@ var MatchSandbox = class _MatchSandbox {
402
388
  */
403
389
  static async create(bot1, bot2, options) {
404
390
  const memoryLimitMB = options?.memoryLimitMB ?? 512;
405
- const timeoutMs = options?.timeoutMs ?? 3e4;
391
+ const timeoutMs = options?.timeoutMs ?? 6e4;
406
392
  const bundle = await compileMatchBundle(bot1, bot2, options?.compileOptions);
407
393
  const isolate = new ivm.Isolate({ memoryLimit: memoryLimitMB });
408
394
  try {
@@ -427,7 +413,7 @@ var MatchSandbox = class _MatchSandbox {
427
413
  */
428
414
  static async fromBundle(bundle, options) {
429
415
  const memoryLimitMB = options?.memoryLimitMB ?? 512;
430
- const timeoutMs = options?.timeoutMs ?? 3e4;
416
+ const timeoutMs = options?.timeoutMs ?? 6e4;
431
417
  const isolate = new ivm.Isolate({ memoryLimit: memoryLimitMB });
432
418
  try {
433
419
  const context = await isolate.createContext();
@@ -539,12 +525,150 @@ async function sandboxSimulate(bot1, bot2, options) {
539
525
  sandbox.dispose();
540
526
  }
541
527
  }
528
+
529
+ // src/engine/bundle-fight.ts
530
+ import path2 from "path";
531
+ import ivm2 from "isolated-vm";
532
+ import { build as build2 } from "esbuild";
533
+ var MEMORY_LIMIT_MB = 256;
534
+ var FIGHT_TIMEOUT_MS = 6e4;
535
+ var FREEZE_BANNER = `
536
+ Object.freeze(Object.prototype);
537
+ Object.freeze(Array.prototype);
538
+ Object.freeze(Function.prototype);
539
+ Object.freeze(String.prototype);
540
+ Object.freeze(Number.prototype);
541
+ Object.freeze(Boolean.prototype);
542
+ Object.freeze(RegExp.prototype);
543
+ Object.freeze(Date.prototype);
544
+ Object.freeze(Error.prototype);
545
+ Object.freeze(Map.prototype);
546
+ Object.freeze(Set.prototype);
547
+ Object.freeze(Math);
548
+ Object.freeze(JSON);
549
+ (function() {
550
+ var g = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : {};
551
+ var blocked = [
552
+ 'fetch', 'XMLHttpRequest', 'WebSocket', 'EventSource',
553
+ 'importScripts', 'Worker', 'SharedWorker',
554
+ 'Request', 'Response', 'Headers',
555
+ 'navigator', 'BroadcastChannel',
556
+ 'indexedDB', 'caches'
557
+ ];
558
+ for (var i = 0; i < blocked.length; i++) {
559
+ try { Object.defineProperty(g, blocked[i], {value: undefined, writable: false, configurable: false}); }
560
+ catch(e) {}
561
+ }
562
+ })();
563
+ `;
564
+ var cachedTemplate = null;
565
+ function buildMatchTemplate() {
566
+ if (!cachedTemplate) {
567
+ cachedTemplate = (async () => {
568
+ const engineDir = getEngineDir();
569
+ const coreSrc = path2.dirname(engineDir).replace(/\\/g, "/");
570
+ const entryPoint = `
571
+ import {fight, simulate} from '${coreSrc}/engine/simulation.ts';
572
+ import {wrapWithParams} from '${coreSrc}/engine/params-runtime.ts';
573
+
574
+ const __Bot1 = (globalThis as any).__injectedBot1;
575
+ const __Bot2 = (globalThis as any).__injectedBot2;
576
+
577
+ if (!__Bot1) throw new Error('Bot 1 not injected (set globalThis.__injectedBot1)');
578
+ if (!__Bot2) throw new Error('Bot 2 not injected (set globalThis.__injectedBot2)');
579
+
580
+ (globalThis as any).__fight = function __fight(options: any) {
581
+ return fight(__Bot1, __Bot2, options);
582
+ };
583
+
584
+ (globalThis as any).__simulate = function __simulate(options: any) {
585
+ const {params1, params2, ...simOptions} = options;
586
+ const bot1 = params1 ? wrapWithParams(__Bot1, params1) : __Bot1;
587
+ const bot2 = params2 ? wrapWithParams(__Bot2, params2) : __Bot2;
588
+ return simulate(bot1, bot2, simOptions);
589
+ };
590
+ `;
591
+ const result = await build2({
592
+ stdin: { contents: entryPoint, resolveDir: engineDir, loader: "ts" },
593
+ bundle: true,
594
+ write: false,
595
+ format: "iife",
596
+ platform: "neutral",
597
+ target: "es2022",
598
+ banner: { js: FREEZE_BANNER },
599
+ logLevel: "error",
600
+ external: [
601
+ "isolated-vm",
602
+ "esbuild",
603
+ "node:path",
604
+ "node:fs",
605
+ "node:url",
606
+ "node:worker_threads",
607
+ "node:crypto",
608
+ "node:os",
609
+ "node:child_process"
610
+ ]
611
+ });
612
+ if (!result.outputFiles?.[0]) throw new Error("esbuild produced no match-template output");
613
+ return result.outputFiles[0].text;
614
+ })();
615
+ }
616
+ return cachedTemplate;
617
+ }
618
+ async function runBundleFight(bundle1, bundle2, options) {
619
+ const template = options.matchTemplate ?? await buildMatchTemplate();
620
+ const skipHistory = options.skipHistory ?? true;
621
+ const code = bundle1 + "\nvar __savedBot1 = globalThis.__injectedBot1;\nglobalThis.__injectedBot1 = undefined;\n" + bundle2 + "\nglobalThis.__injectedBot2 = globalThis.__injectedBot1;\n\nglobalThis.__injectedBot1 = __savedBot1;\n__savedBot1 = undefined;\n" + template + "\ndelete globalThis.__injectedBot1;\ndelete globalThis.__injectedBot2;\n";
622
+ const isolate = new ivm2.Isolate({ memoryLimit: MEMORY_LIMIT_MB });
623
+ try {
624
+ const context = await isolate.createContext();
625
+ const jail = context.global;
626
+ await jail.set("global", jail.derefInto());
627
+ const script = await isolate.compileScript(code);
628
+ await script.run(context, { timeout: FIGHT_TIMEOUT_MS });
629
+ const fightFn = await jail.get("__fight");
630
+ const result = await fightFn.apply(
631
+ void 0,
632
+ [new ivm2.ExternalCopy({ seed: options.seed, skipHistory }).copyInto()],
633
+ { timeout: FIGHT_TIMEOUT_MS, result: { copy: true } }
634
+ );
635
+ return result;
636
+ } finally {
637
+ if (!isolate.isDisposed) isolate.dispose();
638
+ }
639
+ }
640
+ async function runBundleSimulate(bundle1, bundle2, options = {}) {
641
+ const template = options.matchTemplate ?? await buildMatchTemplate();
642
+ const code = bundle1 + "\nvar __savedBot1 = globalThis.__injectedBot1;\nglobalThis.__injectedBot1 = undefined;\n" + bundle2 + "\nglobalThis.__injectedBot2 = globalThis.__injectedBot1;\n\nglobalThis.__injectedBot1 = __savedBot1;\n__savedBot1 = undefined;\n" + template + "\ndelete globalThis.__injectedBot1;\ndelete globalThis.__injectedBot2;\n";
643
+ const isolate = new ivm2.Isolate({ memoryLimit: MEMORY_LIMIT_MB });
644
+ try {
645
+ const context = await isolate.createContext();
646
+ const jail = context.global;
647
+ await jail.set("global", jail.derefInto());
648
+ const script = await isolate.compileScript(code);
649
+ await script.run(context, { timeout: FIGHT_TIMEOUT_MS });
650
+ const simulateFn = await jail.get("__simulate");
651
+ const simOptions = {
652
+ seed: options.seed ?? 1,
653
+ spawnDistance: options.spawnDistance,
654
+ maxTicks: options.maxTicks
655
+ };
656
+ const result = await simulateFn.apply(
657
+ void 0,
658
+ [new ivm2.ExternalCopy(simOptions).copyInto()],
659
+ { timeout: FIGHT_TIMEOUT_MS, result: { copy: true } }
660
+ );
661
+ return result;
662
+ } finally {
663
+ if (!isolate.isDisposed) isolate.dispose();
664
+ }
665
+ }
542
666
  export {
543
667
  ALL_BOTS,
544
- ARENA_HEIGHT,
668
+ ARENA_MAX,
669
+ ARENA_MIN,
545
670
  ARENA_SIZE,
546
671
  ARENA_WATER_BUFFER,
547
- ARENA_WIDTH,
548
672
  Archlich,
549
673
  Archmage,
550
674
  BLINK_CAST_TIME,
@@ -570,6 +694,11 @@ export {
570
694
  Golem,
571
695
  Hogger,
572
696
  Infernalist,
697
+ KNOCKBACK_DAMAGE_THRESHOLD,
698
+ KNOCKBACK_DECAY,
699
+ KNOCKBACK_DELAY,
700
+ KNOCKBACK_SPEED_PER_DAMAGE,
701
+ LAVA_BORDER_WIDTH,
573
702
  Lich,
574
703
  MATCH_DURATION,
575
704
  MAX_HEALTH,
@@ -593,6 +722,8 @@ export {
593
722
  MatchSandbox,
594
723
  Nightblade,
595
724
  Pyromancer,
725
+ RULES,
726
+ RULESET_RANGES,
596
727
  Rookie,
597
728
  SHIELD_CAST_TIME,
598
729
  SHIELD_DECAY_PER_SECOND,
@@ -630,11 +761,12 @@ export {
630
761
  angleDiff,
631
762
  angleInRange,
632
763
  angleTo,
633
- antiHomingMissile,
634
764
  applyDamage,
765
+ applyRulesetOverrides,
635
766
  blink,
636
767
  browserSandboxFight,
637
768
  browserSandboxSimulate,
769
+ buildMatchTemplate,
638
770
  calculateBlinkCooldown,
639
771
  calculateMissileCastTime,
640
772
  calculateMissileRadius,
@@ -653,18 +785,22 @@ export {
653
785
  createInitialState,
654
786
  createRandom,
655
787
  createWorkerScript,
788
+ currentRuleset,
656
789
  diagnoseTrace,
657
790
  directionAway,
658
791
  directionTo,
659
792
  distanceTo,
660
793
  effectiveTurnRateCost,
661
794
  extractAction,
795
+ extractMissileAction,
662
796
  extractStats,
663
797
  extractTraceEvents,
664
798
  fight,
665
799
  findInRange,
666
800
  findNearest,
801
+ fitMissileForEscapingTarget,
667
802
  fitMissileToBudget,
803
+ flyStraight,
668
804
  formatDiagnosis,
669
805
  formatStats,
670
806
  formatTraceEvents,
@@ -672,17 +808,18 @@ export {
672
808
  generateCandidates,
673
809
  generateCombos,
674
810
  getAdaptiveMissileConfig,
675
- getBotContext,
676
811
  getEffectiveRange,
677
812
  getLeadPosition,
678
813
  getMissileCastTime,
814
+ getMissileContext,
679
815
  getPlayerState,
816
+ getWizardContext,
680
817
  hashCombine,
681
818
  homingMissile,
682
819
  idle,
683
820
  inRange,
684
821
  interceptAngle,
685
- isNewStyleBot,
822
+ isInLava,
686
823
  magnitude,
687
824
  missile,
688
825
  move,
@@ -695,9 +832,12 @@ export {
695
832
  normalizeAngle,
696
833
  predictPosition,
697
834
  resetAllHooks,
835
+ resetRuleset,
698
836
  resolveWizardCollision,
699
- runBotWithContext,
837
+ runBundleFight,
838
+ runBundleSimulate,
700
839
  runWithHooks,
840
+ runWizardWithContext,
701
841
  sandboxFight,
702
842
  sandboxSimulate,
703
843
  scoreFight,
@@ -706,6 +846,7 @@ export {
706
846
  setParamValues,
707
847
  shield,
708
848
  simulate,
849
+ simulateMinDuration,
709
850
  sortByDistance,
710
851
  spiralMissile,
711
852
  startCast,
@@ -716,6 +857,8 @@ export {
716
857
  sweptCircleCollision,
717
858
  testBot,
718
859
  tick,
860
+ turnToAngle,
861
+ turnToward,
719
862
  updateShield,
720
863
  useArenaSize,
721
864
  useBlinkCooldown,
@@ -728,11 +871,14 @@ export {
728
871
  useEnemy,
729
872
  useHealth,
730
873
  useLastHitTick,
874
+ useLastMissileConfig,
731
875
  useMemo,
732
876
  useMyProjectiles,
733
877
  useMyThreatsToEnemy,
734
878
  useParam,
735
879
  usePosition,
880
+ useProjectiles,
881
+ useRandom,
736
882
  useRef,
737
883
  useShieldStrength,
738
884
  useState,
@@ -743,8 +889,8 @@ export {
743
889
  useVelocity,
744
890
  validateHookCall,
745
891
  validateMissileConfig,
746
- withBotContext,
747
- wrapNewBot,
892
+ withMissileContext,
893
+ withWizardContext,
748
894
  wrapWithParams
749
895
  };
750
896
  //# sourceMappingURL=index.js.map