@vibemancer/core 1.0.9 → 1.0.10

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.
@@ -95,9 +95,20 @@ interface ActionBuilder extends FinalAction {
95
95
  * to `missile()` is overwritten before the shot leaves. That makes the enemy impossible
96
96
  * to LEAD: you always fire where they are, never where they will be.
97
97
  *
98
- * `lockAim()` holds your angle for the whole cast, which is what makes `getLeadPosition`
99
- * and `interceptAngle` worth using. It is opt-in precisely because auto-aim is the right
100
- * default for most bots: lock your aim and a target that moves during the cast is missed.
98
+ * `lockAim()` holds your angle for the whole cast but it is USUALLY THE WRONG TOOL for
99
+ * leading, and this comment used to claim the opposite. Measured over 1,140 matches
100
+ * against the built-ins: auto-aim wins 80.5%, lockAim with a computed lead wins 29.3%,
101
+ * and it degrades monotonically the more shots you lock.
102
+ *
103
+ * The reason is cast time. A cast runs 88-240 ticks — up to 2.4 SECONDS — and lockAim
104
+ * freezes the angle at cast START, so it is stale long before the missile leaves. No bot
105
+ * holds a heading that long.
106
+ *
107
+ * TO LEAD A TARGET, call `aim(degrees)` on every tick of the cast and recompute the lead
108
+ * each time: same harness, 85.4%. That is what makes `getLeadPosition` worth calling.
109
+ *
110
+ * lockAim is for aiming at a PLACE rather than a bot — a lava edge, an escape lane, an
111
+ * area you want denied — where a fixed angle is the point.
101
112
  *
102
113
  * Chainable — `missile(cfg, ai, angle).lockAim().move(0, 1)` aims, fires and kites.
103
114
  */
@@ -1 +1 @@
1
- export { A as ALL_BOTS, a as ARENA_MAX, b as ARENA_MIN, c as ARENA_SIZE, d as ARENA_WATER_BUFFER, e as ActionBuilder, f as AnalyzedThreat, g as Archlich, h as Archmage, B as BLINK_CAST_TIME, i as BLINK_COOLDOWN, j as BLINK_MAX_COOLDOWN, k as BLINK_MAX_RANGE, l as BLINK_MIN_COOLDOWN, m as BLINK_RANGE, n as BOT_GROUPS, o as Battlemage, p as BlinkEvent, q as Bonemancer, s as BotError, t as BrowserManualMatchSandbox, u as BrowserMatchSandbox, v as BrowserSandboxOptions, C as CASTING_MOVEMENT_MULT, x as COLLISION_RADIUS, y as CastCancelEvent, z as CastStartEvent, D as Critter, H as DEFAULT_SEED, I as Doombringer, J as ENGINE_VERSION, K as EQUIVALENT_ENGINE_VERSIONS, L as EnemyState, M as FIGHT_SPAWN_DISTANCES, F as FightResult, O as FightStats, P as FightWinner, Q as FinalAction, R as Flamecaller, T as GCD_DURATION, U as GameConfig, V as GameState, W as Golem, X as Hero, Y as Hogger, Z as HomingParams, _ as HookState, $ as Infernalist, a0 as InternalWizardState, a1 as KNOCKBACK_DAMAGE_THRESHOLD, a2 as KNOCKBACK_DECAY, a3 as KNOCKBACK_DELAY, a4 as KNOCKBACK_SPEED_PER_DAMAGE, a5 as LAVA_BORDER_WIDTH, a6 as Lich, a7 as MATCH_DURATION, a8 as MAX_HEALTH, a9 as MISSILE_BASE_CAST, aa as MISSILE_BASE_RADIUS, ab as MISSILE_DAMAGE_POWER, ac as MISSILE_DAMAGE_RADIUS_SCALE, ad as MISSILE_DAMAGE_SCALE, ae as MISSILE_HOMING_COEFF, af as MISSILE_MIN_CAST_TIME, ag as MISSILE_MIN_DAMAGE, ah as MISSILE_MIN_DURATION, ai as MISSILE_MIN_SPEED, aj as MISSILE_RADIUS_PER_DAMAGE, ak as MISSILE_SPEED_DURATION_BASELINE, al as MISSILE_SPEED_DURATION_COEFF, am as MISSILE_TURN_DURATION_COEFF, an as MOVEMENT_SPEED, ao as MOVE_SPEED, ap as ManualMatch, aq as ManualMatchInitOptions, ar as ManualMatchOptions, as as ManualMatchStepRequest, at as MatchWinner, au as MissileAction, av as MissileActions, aw as MissileConfig, ax as MissileContext, ay as MissileExpiredEvent, az as MissileFunction, aA as MissileHitEvent, aB as MissileLaunchEvent, aC as MissileOobEvent, aD as MissileTemplate, aE as Nightblade, aF as ParamDeclaration, aG as Position, aH as ProjectileState, aI as Pyromancer, aJ as RULES, aK as RULESET_RANGES, aL as RefObject, aM as Rookie, aN as SHIELD_CAST_TIME, aO as SHIELD_DECAY_PER_SECOND, aP as SHIELD_DECAY_RATE, aQ as SHIELD_MAX_BLOCK, aR as SHIELD_MAX_STRENGTH, aS as SHIELD_MIN_BLOCK, aT as SHIELD_MIN_STRENGTH, aU as SPAWN_DISTANCE, aV as SeekerParams, aW as Sentinel, aX as Shadowblade, aY as ShieldBlockEvent, aZ as ShieldStartEvent, a_ as SimEvent, S as SimulateResult, a$ as Spellbinder, b0 as Spellseeker, b1 as Spellshot, b2 as Spellspinner, b3 as Spelltracer, b4 as Spellweaver, b5 as SpiralParams, b6 as StepResult, b7 as Stormcaller, b8 as Stormchaser, b9 as Stormforger, ba as StraightParams, bb as TICKS_PER_SECOND, bc as TICK_DURATION_MS, bd as TargetDummy, be as TestBotBuilder, bf as TestFightResult, bg as TestSimulateResult, bh as TraceBotSummary, bi as TraceEvent, bj as TraceEventType, bk as TraceSummary, bl as Turtle, bm as Velocity, bn as Voidblade, bo as WARMUP_DURATION_TOLERANCE, bp as WARMUP_MAX_BONUS, bq as WARMUP_MAX_PENALTY, br as WARMUP_SPEED_TOLERANCE, bs as WARMUP_TURN_TOLERANCE, bt as WIZARD_HEALTH, bu as WIZARD_RADIUS, bv as Warmage, bw as WizardActions, bx as WizardContext, by as WizardDeathEvent, bz as WizardEntry, bA as WizardFunction, bB as WizardGroup, bC as WizardLavaDeathEvent, bD as WizardState, bE as WorkerFactory, bF as WorkerLike, bG as aim, bH as analyzeThreats, bI as angleDiff, bJ as angleInRange, bK as angleTo, bL as applyDamage, bM as applyRulesetOverrides, bN as blink, bO as browserSandboxFight, bP as browserSandboxSimulate, bQ as calculateBlinkCooldown, bR as calculateMissileCastTime, bS as calculateMissileRadius, bT as calculateMissileSimilarity, bU as calculateShieldBlock, bV as calculateWarmupMultiplier, bW as canReplayMatch, bX as cancel, bY as cancelCast, bZ as clampPositionToArena, b_ as clampToArena, b$ as clearHooks, c0 as clearParamValues, c1 as completeCast, c3 as createEntitySeed, c5 as createInitialState, c6 as createRandom, c7 as createWorkerScript, c8 as currentRuleset, c9 as diagnoseTrace, ca as directionAway, cb as directionTo, cc as distanceTo, cd as effectiveTurnRateCost, ce as extractAction, cf as extractMissileAction, cg as extractStats, ch as extractTraceEvents, ci as fight, cj as findInRange, ck as findNearest, cl as fitMissileForEscapingTarget, cm as fitMissileToBudget, cn as flyStraight, co as formatDiagnosis, cp as formatStats, cq as formatTraceEvents, cr as formatTraceSummary, cs as generateCandidates, ct as generateCombos, cu as getAdaptiveMissileConfig, cv as getEffectiveRange, cw as getLeadPosition, cx as getMissileCastTime, cy as getMissileContext, cz as getPlayerState, cA as getWizardContext, cB as hashCombine, cC as homingMissile, cD as idle, cE as inRange, cF as interceptAngle, cG as isBannedBotName, cH as isInLava, cI as magnitude, cJ as matchesAnyBanRule, cL as missile, cM as move, cN as moveInDirection, cO as moveProjectile, cP as moveWizard, cQ as narrowRange, cR as nextRandom, cS as normalize, cT as normalizeAngle, cU as predictPosition, cW as resetAllHooks, cX as resetRuleset, cY as resolveWizardCollision, cZ as runWithHooks, c_ as runWizardWithContext, c$ as scoreFight, d0 as scoreFightAsWizard2, d1 as seekerMissile, d2 as setParamValues, d3 as shield, d4 as simulate, d5 as simulateMinDuration, d6 as sortByDistance, d7 as spiralMissile, d8 as startCast, d9 as startDiscovery, da as stopDiscovery, db as straightMissile, dc as summarizeTrace, dd as sweptCircleCollision, de as testBot, df as tick, dg as turnToAngle, dh as turnToward, di as updateShield, dj as useArenaSize, dk as useBlinkCooldown, dl as useCastProgress, dm as useCastingSpell, dn as useClosestThreat, dp as useDamageDealt, dq as useDamageTaken, dr as useEffect, ds as useEnemy, dt as useHealth, du as useLastHitTick, dv as useLastMissileConfig, dw as useMemo, dx as useMyProjectiles, dy as useMyThreatsToEnemy, dz as useParam, dA as usePosition, dB as useProjectiles, dC as useRandom, dD as useRef, dE as useShieldStrength, dF as useState, dG as useStatus, dH as useThreats, dI as useTick, dJ as useTicksUntilReady, dK as useVelocity, dL as validateHookCall, dM as validateMissileConfig, dN as withMissileContext, dO as withWizardContext, dP as wrapWithParams } from './index-browser-BTHlrB_s.js';
1
+ export { A as ALL_BOTS, a as ARENA_MAX, b as ARENA_MIN, c as ARENA_SIZE, d as ARENA_WATER_BUFFER, e as ActionBuilder, f as AnalyzedThreat, g as Archlich, h as Archmage, B as BLINK_CAST_TIME, i as BLINK_COOLDOWN, j as BLINK_MAX_COOLDOWN, k as BLINK_MAX_RANGE, l as BLINK_MIN_COOLDOWN, m as BLINK_RANGE, n as BOT_GROUPS, o as Battlemage, p as BlinkEvent, q as Bonemancer, s as BotError, t as BrowserManualMatchSandbox, u as BrowserMatchSandbox, v as BrowserSandboxOptions, C as CASTING_MOVEMENT_MULT, x as COLLISION_RADIUS, y as CastCancelEvent, z as CastStartEvent, D as Critter, H as DEFAULT_SEED, I as Doombringer, J as ENGINE_VERSION, K as EQUIVALENT_ENGINE_VERSIONS, L as EnemyState, M as FIGHT_SPAWN_DISTANCES, F as FightResult, O as FightStats, P as FightWinner, Q as FinalAction, R as Flamecaller, T as GCD_DURATION, U as GameConfig, V as GameState, W as Golem, X as Hero, Y as Hogger, Z as HomingParams, _ as HookState, $ as Infernalist, a0 as InternalWizardState, a1 as KNOCKBACK_DAMAGE_THRESHOLD, a2 as KNOCKBACK_DECAY, a3 as KNOCKBACK_DELAY, a4 as KNOCKBACK_SPEED_PER_DAMAGE, a5 as LAVA_BORDER_WIDTH, a6 as Lich, a7 as MATCH_DURATION, a8 as MAX_HEALTH, a9 as MISSILE_BASE_CAST, aa as MISSILE_BASE_RADIUS, ab as MISSILE_DAMAGE_POWER, ac as MISSILE_DAMAGE_RADIUS_SCALE, ad as MISSILE_DAMAGE_SCALE, ae as MISSILE_HOMING_COEFF, af as MISSILE_MIN_CAST_TIME, ag as MISSILE_MIN_DAMAGE, ah as MISSILE_MIN_DURATION, ai as MISSILE_MIN_SPEED, aj as MISSILE_RADIUS_PER_DAMAGE, ak as MISSILE_SPEED_DURATION_BASELINE, al as MISSILE_SPEED_DURATION_COEFF, am as MISSILE_TURN_DURATION_COEFF, an as MOVEMENT_SPEED, ao as MOVE_SPEED, ap as ManualMatch, aq as ManualMatchInitOptions, ar as ManualMatchOptions, as as ManualMatchStepRequest, at as MatchWinner, au as MissileAction, av as MissileActions, aw as MissileConfig, ax as MissileContext, ay as MissileExpiredEvent, az as MissileFunction, aA as MissileHitEvent, aB as MissileLaunchEvent, aC as MissileOobEvent, aD as MissileTemplate, aE as Nightblade, aF as ParamDeclaration, aG as Position, aH as ProjectileState, aI as Pyromancer, aJ as RULES, aK as RULESET_RANGES, aL as RefObject, aM as Rookie, aN as SHIELD_CAST_TIME, aO as SHIELD_DECAY_PER_SECOND, aP as SHIELD_DECAY_RATE, aQ as SHIELD_MAX_BLOCK, aR as SHIELD_MAX_STRENGTH, aS as SHIELD_MIN_BLOCK, aT as SHIELD_MIN_STRENGTH, aU as SPAWN_DISTANCE, aV as SeekerParams, aW as Sentinel, aX as Shadowblade, aY as ShieldBlockEvent, aZ as ShieldStartEvent, a_ as SimEvent, S as SimulateResult, a$ as Spellbinder, b0 as Spellseeker, b1 as Spellshot, b2 as Spellspinner, b3 as Spelltracer, b4 as Spellweaver, b5 as SpiralParams, b6 as StepResult, b7 as Stormcaller, b8 as Stormchaser, b9 as Stormforger, ba as StraightParams, bb as TICKS_PER_SECOND, bc as TICK_DURATION_MS, bd as TargetDummy, be as TestBotBuilder, bf as TestFightResult, bg as TestSimulateResult, bh as TraceBotSummary, bi as TraceEvent, bj as TraceEventType, bk as TraceSummary, bl as Turtle, bm as Velocity, bn as Voidblade, bo as WARMUP_DURATION_TOLERANCE, bp as WARMUP_MAX_BONUS, bq as WARMUP_MAX_PENALTY, br as WARMUP_SPEED_TOLERANCE, bs as WARMUP_TURN_TOLERANCE, bt as WIZARD_HEALTH, bu as WIZARD_RADIUS, bv as Warmage, bw as WizardActions, bx as WizardContext, by as WizardDeathEvent, bz as WizardEntry, bA as WizardFunction, bB as WizardGroup, bC as WizardLavaDeathEvent, bD as WizardState, bE as WorkerFactory, bF as WorkerLike, bG as aim, bH as analyzeThreats, bI as angleDiff, bJ as angleInRange, bK as angleTo, bL as applyDamage, bM as applyRulesetOverrides, bN as blink, bO as browserSandboxFight, bP as browserSandboxSimulate, bQ as calculateBlinkCooldown, bR as calculateMissileCastTime, bS as calculateMissileRadius, bT as calculateMissileSimilarity, bU as calculateShieldBlock, bV as calculateWarmupMultiplier, bW as canReplayMatch, bX as cancel, bY as cancelCast, bZ as clampPositionToArena, b_ as clampToArena, b$ as clearHooks, c0 as clearParamValues, c1 as completeCast, c3 as createEntitySeed, c5 as createInitialState, c6 as createRandom, c7 as createWorkerScript, c8 as currentRuleset, c9 as diagnoseTrace, ca as directionAway, cb as directionTo, cc as distanceTo, cd as effectiveTurnRateCost, ce as extractAction, cf as extractMissileAction, cg as extractStats, ch as extractTraceEvents, ci as fight, cj as findInRange, ck as findNearest, cl as fitMissileForEscapingTarget, cm as fitMissileToBudget, cn as flyStraight, co as formatDiagnosis, cp as formatStats, cq as formatTraceEvents, cr as formatTraceSummary, cs as generateCandidates, ct as generateCombos, cu as getAdaptiveMissileConfig, cv as getEffectiveRange, cw as getLeadPosition, cx as getMissileCastTime, cy as getMissileContext, cz as getPlayerState, cA as getWizardContext, cB as hashCombine, cC as homingMissile, cD as idle, cE as inRange, cF as interceptAngle, cG as isBannedBotName, cH as isInLava, cI as magnitude, cJ as matchesAnyBanRule, cL as missile, cM as move, cN as moveInDirection, cO as moveProjectile, cP as moveWizard, cQ as narrowRange, cR as nextRandom, cS as normalize, cT as normalizeAngle, cU as predictPosition, cW as resetAllHooks, cX as resetRuleset, cY as resolveWizardCollision, cZ as runWithHooks, c_ as runWizardWithContext, c$ as scoreFight, d0 as scoreFightAsWizard2, d1 as seekerMissile, d2 as setParamValues, d3 as shield, d4 as simulate, d5 as simulateMinDuration, d6 as sortByDistance, d7 as spiralMissile, d8 as startCast, d9 as startDiscovery, da as stopDiscovery, db as straightMissile, dc as summarizeTrace, dd as sweptCircleCollision, de as testBot, df as tick, dg as turnToAngle, dh as turnToward, di as updateShield, dj as useArenaSize, dk as useBlinkCooldown, dl as useCastProgress, dm as useCastingSpell, dn as useClosestThreat, dp as useDamageDealt, dq as useDamageTaken, dr as useEffect, ds as useEnemy, dt as useHealth, du as useLastHitTick, dv as useLastMissileConfig, dw as useMemo, dx as useMyProjectiles, dy as useMyThreatsToEnemy, dz as useParam, dA as usePosition, dB as useProjectiles, dC as useRandom, dD as useRef, dE as useShieldStrength, dF as useState, dG as useStatus, dH as useThreats, dI as useTick, dJ as useTicksUntilReady, dK as useVelocity, dL as validateHookCall, dM as validateMissileConfig, dN as withMissileContext, dO as withWizardContext, dP as wrapWithParams } from './index-browser-BLioGWvO.js';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FightResult, S as SimulateResult } from './index-browser-BTHlrB_s.js';
2
- export { A as ALL_BOTS, a as ARENA_MAX, b as ARENA_MIN, c as ARENA_SIZE, d as ARENA_WATER_BUFFER, e as ActionBuilder, f as AnalyzedThreat, g as Archlich, h as Archmage, B as BLINK_CAST_TIME, i as BLINK_COOLDOWN, j as BLINK_MAX_COOLDOWN, k as BLINK_MAX_RANGE, l as BLINK_MIN_COOLDOWN, m as BLINK_RANGE, n as BOT_GROUPS, o as Battlemage, p as BlinkEvent, q as Bonemancer, r as BotBudgetState, s as BotError, t as BrowserManualMatchSandbox, u as BrowserMatchSandbox, v as BrowserSandboxOptions, w as BudgetLimits, C as CASTING_MOVEMENT_MULT, x as COLLISION_RADIUS, y as CastCancelEvent, z as CastStartEvent, D as Critter, E as DEFAULT_BUDGET, G as DEFAULT_FIGHT_BACKSTOP_MS, H as DEFAULT_SEED, I as Doombringer, J as ENGINE_VERSION, K as EQUIVALENT_ENGINE_VERSIONS, L as EnemyState, M as FIGHT_SPAWN_DISTANCES, N as FightBudget, O as FightStats, P as FightWinner, Q as FinalAction, R as Flamecaller, T as GCD_DURATION, U as GameConfig, V as GameState, W as Golem, X as Hero, Y as Hogger, Z as HomingParams, _ as HookState, $ as Infernalist, a0 as InternalWizardState, a1 as KNOCKBACK_DAMAGE_THRESHOLD, a2 as KNOCKBACK_DECAY, a3 as KNOCKBACK_DELAY, a4 as KNOCKBACK_SPEED_PER_DAMAGE, a5 as LAVA_BORDER_WIDTH, a6 as Lich, a7 as MATCH_DURATION, a8 as MAX_HEALTH, a9 as MISSILE_BASE_CAST, aa as MISSILE_BASE_RADIUS, ab as MISSILE_DAMAGE_POWER, ac as MISSILE_DAMAGE_RADIUS_SCALE, ad as MISSILE_DAMAGE_SCALE, ae as MISSILE_HOMING_COEFF, af as MISSILE_MIN_CAST_TIME, ag as MISSILE_MIN_DAMAGE, ah as MISSILE_MIN_DURATION, ai as MISSILE_MIN_SPEED, aj as MISSILE_RADIUS_PER_DAMAGE, ak as MISSILE_SPEED_DURATION_BASELINE, al as MISSILE_SPEED_DURATION_COEFF, am as MISSILE_TURN_DURATION_COEFF, an as MOVEMENT_SPEED, ao as MOVE_SPEED, ap as ManualMatch, aq as ManualMatchInitOptions, ar as ManualMatchOptions, as as ManualMatchStepRequest, at as MatchWinner, au as MissileAction, av as MissileActions, aw as MissileConfig, ax as MissileContext, ay as MissileExpiredEvent, az as MissileFunction, aA as MissileHitEvent, aB as MissileLaunchEvent, aC as MissileOobEvent, aD as MissileTemplate, aE as Nightblade, aF as ParamDeclaration, aG as Position, aH as ProjectileState, aI as Pyromancer, aJ as RULES, aK as RULESET_RANGES, aL as RefObject, aM as Rookie, aN as SHIELD_CAST_TIME, aO as SHIELD_DECAY_PER_SECOND, aP as SHIELD_DECAY_RATE, aQ as SHIELD_MAX_BLOCK, aR as SHIELD_MAX_STRENGTH, aS as SHIELD_MIN_BLOCK, aT as SHIELD_MIN_STRENGTH, aU as SPAWN_DISTANCE, aV as SeekerParams, aW as Sentinel, aX as Shadowblade, aY as ShieldBlockEvent, aZ as ShieldStartEvent, a_ as SimEvent, a$ as Spellbinder, b0 as Spellseeker, b1 as Spellshot, b2 as Spellspinner, b3 as Spelltracer, b4 as Spellweaver, b5 as SpiralParams, b6 as StepResult, b7 as Stormcaller, b8 as Stormchaser, b9 as Stormforger, ba as StraightParams, bb as TICKS_PER_SECOND, bc as TICK_DURATION_MS, bd as TargetDummy, be as TestBotBuilder, bf as TestFightResult, bg as TestSimulateResult, bh as TraceBotSummary, bi as TraceEvent, bj as TraceEventType, bk as TraceSummary, bl as Turtle, bm as Velocity, bn as Voidblade, bo as WARMUP_DURATION_TOLERANCE, bp as WARMUP_MAX_BONUS, bq as WARMUP_MAX_PENALTY, br as WARMUP_SPEED_TOLERANCE, bs as WARMUP_TURN_TOLERANCE, bt as WIZARD_HEALTH, bu as WIZARD_RADIUS, bv as Warmage, bw as WizardActions, bx as WizardContext, by as WizardDeathEvent, bz as WizardEntry, bA as WizardFunction, bB as WizardGroup, bC as WizardLavaDeathEvent, bD as WizardState, bE as WorkerFactory, bF as WorkerLike, bG as aim, bH as analyzeThreats, bI as angleDiff, bJ as angleInRange, bK as angleTo, bL as applyDamage, bM as applyRulesetOverrides, bN as blink, bO as browserSandboxFight, bP as browserSandboxSimulate, bQ as calculateBlinkCooldown, bR as calculateMissileCastTime, bS as calculateMissileRadius, bT as calculateMissileSimilarity, bU as calculateShieldBlock, bV as calculateWarmupMultiplier, bW as canReplayMatch, bX as cancel, bY as cancelCast, bZ as clampPositionToArena, b_ as clampToArena, b$ as clearHooks, c0 as clearParamValues, c1 as completeCast, c2 as createBudgetState, c3 as createEntitySeed, c4 as createFightBudget, c5 as createInitialState, c6 as createRandom, c7 as createWorkerScript, c8 as currentRuleset, c9 as diagnoseTrace, ca as directionAway, cb as directionTo, cc as distanceTo, cd as effectiveTurnRateCost, ce as extractAction, cf as extractMissileAction, cg as extractStats, ch as extractTraceEvents, ci as fight, cj as findInRange, ck as findNearest, cl as fitMissileForEscapingTarget, cm as fitMissileToBudget, cn as flyStraight, co as formatDiagnosis, cp as formatStats, cq as formatTraceEvents, cr as formatTraceSummary, cs as generateCandidates, ct as generateCombos, cu as getAdaptiveMissileConfig, cv as getEffectiveRange, cw as getLeadPosition, cx as getMissileCastTime, cy as getMissileContext, cz as getPlayerState, cA as getWizardContext, cB as hashCombine, cC as homingMissile, cD as idle, cE as inRange, cF as interceptAngle, cG as isBannedBotName, cH as isInLava, cI as magnitude, cJ as matchesAnyBanRule, cK as mayAct, cL as missile, cM as move, cN as moveInDirection, cO as moveProjectile, cP as moveWizard, cQ as narrowRange, cR as nextRandom, cS as normalize, cT as normalizeAngle, cU as predictPosition, cV as recordSpend, cW as resetAllHooks, cX as resetRuleset, cY as resolveWizardCollision, cZ as runWithHooks, c_ as runWizardWithContext, c$ as scoreFight, d0 as scoreFightAsWizard2, d1 as seekerMissile, d2 as setParamValues, d3 as shield, d4 as simulate, d5 as simulateMinDuration, d6 as sortByDistance, d7 as spiralMissile, d8 as startCast, d9 as startDiscovery, da as stopDiscovery, db as straightMissile, dc as summarizeTrace, dd as sweptCircleCollision, de as testBot, df as tick, dg as turnToAngle, dh as turnToward, di as updateShield, dj as useArenaSize, dk as useBlinkCooldown, dl as useCastProgress, dm as useCastingSpell, dn as useClosestThreat, dp as useDamageDealt, dq as useDamageTaken, dr as useEffect, ds as useEnemy, dt as useHealth, du as useLastHitTick, dv as useLastMissileConfig, dw as useMemo, dx as useMyProjectiles, dy as useMyThreatsToEnemy, dz as useParam, dA as usePosition, dB as useProjectiles, dC as useRandom, dD as useRef, dE as useShieldStrength, dF as useState, dG as useStatus, dH as useThreats, dI as useTick, dJ as useTicksUntilReady, dK as useVelocity, dL as validateHookCall, dM as validateMissileConfig, dN as withMissileContext, dO as withWizardContext, dP as wrapWithParams } from './index-browser-BTHlrB_s.js';
1
+ import { F as FightResult, S as SimulateResult } from './index-browser-BLioGWvO.js';
2
+ export { A as ALL_BOTS, a as ARENA_MAX, b as ARENA_MIN, c as ARENA_SIZE, d as ARENA_WATER_BUFFER, e as ActionBuilder, f as AnalyzedThreat, g as Archlich, h as Archmage, B as BLINK_CAST_TIME, i as BLINK_COOLDOWN, j as BLINK_MAX_COOLDOWN, k as BLINK_MAX_RANGE, l as BLINK_MIN_COOLDOWN, m as BLINK_RANGE, n as BOT_GROUPS, o as Battlemage, p as BlinkEvent, q as Bonemancer, r as BotBudgetState, s as BotError, t as BrowserManualMatchSandbox, u as BrowserMatchSandbox, v as BrowserSandboxOptions, w as BudgetLimits, C as CASTING_MOVEMENT_MULT, x as COLLISION_RADIUS, y as CastCancelEvent, z as CastStartEvent, D as Critter, E as DEFAULT_BUDGET, G as DEFAULT_FIGHT_BACKSTOP_MS, H as DEFAULT_SEED, I as Doombringer, J as ENGINE_VERSION, K as EQUIVALENT_ENGINE_VERSIONS, L as EnemyState, M as FIGHT_SPAWN_DISTANCES, N as FightBudget, O as FightStats, P as FightWinner, Q as FinalAction, R as Flamecaller, T as GCD_DURATION, U as GameConfig, V as GameState, W as Golem, X as Hero, Y as Hogger, Z as HomingParams, _ as HookState, $ as Infernalist, a0 as InternalWizardState, a1 as KNOCKBACK_DAMAGE_THRESHOLD, a2 as KNOCKBACK_DECAY, a3 as KNOCKBACK_DELAY, a4 as KNOCKBACK_SPEED_PER_DAMAGE, a5 as LAVA_BORDER_WIDTH, a6 as Lich, a7 as MATCH_DURATION, a8 as MAX_HEALTH, a9 as MISSILE_BASE_CAST, aa as MISSILE_BASE_RADIUS, ab as MISSILE_DAMAGE_POWER, ac as MISSILE_DAMAGE_RADIUS_SCALE, ad as MISSILE_DAMAGE_SCALE, ae as MISSILE_HOMING_COEFF, af as MISSILE_MIN_CAST_TIME, ag as MISSILE_MIN_DAMAGE, ah as MISSILE_MIN_DURATION, ai as MISSILE_MIN_SPEED, aj as MISSILE_RADIUS_PER_DAMAGE, ak as MISSILE_SPEED_DURATION_BASELINE, al as MISSILE_SPEED_DURATION_COEFF, am as MISSILE_TURN_DURATION_COEFF, an as MOVEMENT_SPEED, ao as MOVE_SPEED, ap as ManualMatch, aq as ManualMatchInitOptions, ar as ManualMatchOptions, as as ManualMatchStepRequest, at as MatchWinner, au as MissileAction, av as MissileActions, aw as MissileConfig, ax as MissileContext, ay as MissileExpiredEvent, az as MissileFunction, aA as MissileHitEvent, aB as MissileLaunchEvent, aC as MissileOobEvent, aD as MissileTemplate, aE as Nightblade, aF as ParamDeclaration, aG as Position, aH as ProjectileState, aI as Pyromancer, aJ as RULES, aK as RULESET_RANGES, aL as RefObject, aM as Rookie, aN as SHIELD_CAST_TIME, aO as SHIELD_DECAY_PER_SECOND, aP as SHIELD_DECAY_RATE, aQ as SHIELD_MAX_BLOCK, aR as SHIELD_MAX_STRENGTH, aS as SHIELD_MIN_BLOCK, aT as SHIELD_MIN_STRENGTH, aU as SPAWN_DISTANCE, aV as SeekerParams, aW as Sentinel, aX as Shadowblade, aY as ShieldBlockEvent, aZ as ShieldStartEvent, a_ as SimEvent, a$ as Spellbinder, b0 as Spellseeker, b1 as Spellshot, b2 as Spellspinner, b3 as Spelltracer, b4 as Spellweaver, b5 as SpiralParams, b6 as StepResult, b7 as Stormcaller, b8 as Stormchaser, b9 as Stormforger, ba as StraightParams, bb as TICKS_PER_SECOND, bc as TICK_DURATION_MS, bd as TargetDummy, be as TestBotBuilder, bf as TestFightResult, bg as TestSimulateResult, bh as TraceBotSummary, bi as TraceEvent, bj as TraceEventType, bk as TraceSummary, bl as Turtle, bm as Velocity, bn as Voidblade, bo as WARMUP_DURATION_TOLERANCE, bp as WARMUP_MAX_BONUS, bq as WARMUP_MAX_PENALTY, br as WARMUP_SPEED_TOLERANCE, bs as WARMUP_TURN_TOLERANCE, bt as WIZARD_HEALTH, bu as WIZARD_RADIUS, bv as Warmage, bw as WizardActions, bx as WizardContext, by as WizardDeathEvent, bz as WizardEntry, bA as WizardFunction, bB as WizardGroup, bC as WizardLavaDeathEvent, bD as WizardState, bE as WorkerFactory, bF as WorkerLike, bG as aim, bH as analyzeThreats, bI as angleDiff, bJ as angleInRange, bK as angleTo, bL as applyDamage, bM as applyRulesetOverrides, bN as blink, bO as browserSandboxFight, bP as browserSandboxSimulate, bQ as calculateBlinkCooldown, bR as calculateMissileCastTime, bS as calculateMissileRadius, bT as calculateMissileSimilarity, bU as calculateShieldBlock, bV as calculateWarmupMultiplier, bW as canReplayMatch, bX as cancel, bY as cancelCast, bZ as clampPositionToArena, b_ as clampToArena, b$ as clearHooks, c0 as clearParamValues, c1 as completeCast, c2 as createBudgetState, c3 as createEntitySeed, c4 as createFightBudget, c5 as createInitialState, c6 as createRandom, c7 as createWorkerScript, c8 as currentRuleset, c9 as diagnoseTrace, ca as directionAway, cb as directionTo, cc as distanceTo, cd as effectiveTurnRateCost, ce as extractAction, cf as extractMissileAction, cg as extractStats, ch as extractTraceEvents, ci as fight, cj as findInRange, ck as findNearest, cl as fitMissileForEscapingTarget, cm as fitMissileToBudget, cn as flyStraight, co as formatDiagnosis, cp as formatStats, cq as formatTraceEvents, cr as formatTraceSummary, cs as generateCandidates, ct as generateCombos, cu as getAdaptiveMissileConfig, cv as getEffectiveRange, cw as getLeadPosition, cx as getMissileCastTime, cy as getMissileContext, cz as getPlayerState, cA as getWizardContext, cB as hashCombine, cC as homingMissile, cD as idle, cE as inRange, cF as interceptAngle, cG as isBannedBotName, cH as isInLava, cI as magnitude, cJ as matchesAnyBanRule, cK as mayAct, cL as missile, cM as move, cN as moveInDirection, cO as moveProjectile, cP as moveWizard, cQ as narrowRange, cR as nextRandom, cS as normalize, cT as normalizeAngle, cU as predictPosition, cV as recordSpend, cW as resetAllHooks, cX as resetRuleset, cY as resolveWizardCollision, cZ as runWithHooks, c_ as runWizardWithContext, c$ as scoreFight, d0 as scoreFightAsWizard2, d1 as seekerMissile, d2 as setParamValues, d3 as shield, d4 as simulate, d5 as simulateMinDuration, d6 as sortByDistance, d7 as spiralMissile, d8 as startCast, d9 as startDiscovery, da as stopDiscovery, db as straightMissile, dc as summarizeTrace, dd as sweptCircleCollision, de as testBot, df as tick, dg as turnToAngle, dh as turnToward, di as updateShield, dj as useArenaSize, dk as useBlinkCooldown, dl as useCastProgress, dm as useCastingSpell, dn as useClosestThreat, dp as useDamageDealt, dq as useDamageTaken, dr as useEffect, ds as useEnemy, dt as useHealth, du as useLastHitTick, dv as useLastMissileConfig, dw as useMemo, dx as useMyProjectiles, dy as useMyThreatsToEnemy, dz as useParam, dA as usePosition, dB as useProjectiles, dC as useRandom, dD as useRef, dE as useShieldStrength, dF as useState, dG as useStatus, dH as useThreats, dI as useTick, dJ as useTicksUntilReady, dK as useVelocity, dL as validateHookCall, dM as validateMissileConfig, dN as withMissileContext, dO as withWizardContext, dP as wrapWithParams } from './index-browser-BLioGWvO.js';
3
3
 
4
4
  /**
5
5
  * A compiled bot ready for sandboxed execution.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibemancer/core",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "Vibemancer game engine - competitive programming wizard battle arena",
5
5
  "type": "module",
6
6
  "author": "Low Entry",
@@ -108,9 +108,20 @@ export interface ActionBuilder extends FinalAction
108
108
  * to `missile()` is overwritten before the shot leaves. That makes the enemy impossible
109
109
  * to LEAD: you always fire where they are, never where they will be.
110
110
  *
111
- * `lockAim()` holds your angle for the whole cast, which is what makes `getLeadPosition`
112
- * and `interceptAngle` worth using. It is opt-in precisely because auto-aim is the right
113
- * default for most bots: lock your aim and a target that moves during the cast is missed.
111
+ * `lockAim()` holds your angle for the whole cast but it is USUALLY THE WRONG TOOL for
112
+ * leading, and this comment used to claim the opposite. Measured over 1,140 matches
113
+ * against the built-ins: auto-aim wins 80.5%, lockAim with a computed lead wins 29.3%,
114
+ * and it degrades monotonically the more shots you lock.
115
+ *
116
+ * The reason is cast time. A cast runs 88-240 ticks — up to 2.4 SECONDS — and lockAim
117
+ * freezes the angle at cast START, so it is stale long before the missile leaves. No bot
118
+ * holds a heading that long.
119
+ *
120
+ * TO LEAD A TARGET, call `aim(degrees)` on every tick of the cast and recompute the lead
121
+ * each time: same harness, 85.4%. That is what makes `getLeadPosition` worth calling.
122
+ *
123
+ * lockAim is for aiming at a PLACE rather than a bot — a lava edge, an escape lane, an
124
+ * area you want denied — where a fixed angle is the point.
114
125
  *
115
126
  * Chainable — `missile(cfg, ai, angle).lockAim().move(0, 1)` aims, fires and kites.
116
127
  */