## Averaged-lead gun: mean prediction from linear, circular, and wall-bounce guns. ## Smooths noise when enemy movement is between analytical models. import gun_harness/gun_interface import guns/linear import guns/circular import guns/wall_bounce type AveragedLeadGun* = object linear: LinearGun circular: CircularGun wallBounce: WallBounceGun cachedTick: int cachedPred: GunPrediction # per-tick cache; ponytail: single cache, extend if multi-power needed debugGraphics*: bool proc initAveragedLeadGun*(): AveragedLeadGun = AveragedLeadGun(wallBounce: initWallBounceGun(), debugGraphics: false) proc predict*(g: var AveragedLeadGun, state: WorldState, bulletSpeed: float): GunPrediction = if state.tick == g.cachedTick: return g.cachedPred let lp = g.linear.predict(state, bulletSpeed) let cp = g.circular.predict(state, bulletSpeed) let wp = g.wallBounce.predict(state, bulletSpeed) var px = (lp.x + cp.x + wp.x) / 3.0 var py = (lp.y + cp.y + wp.y) / 3.0 px = clamp(px, BotRadius, state.arenaWidth - BotRadius) py = clamp(py, BotRadius, state.arenaHeight - BotRadius) g.cachedTick = state.tick g.cachedPred = GunPrediction(x: px, y: py) g.cachedPred proc onResult*(g: var AveragedLeadGun, e: FeedbackEvent) = discard # analytical average — no learning