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