d21f7ce5f5
MEASURED LIVE (common_libs/tests/measure_fire_ghost_lag.py, 4 sessions, 1777 matched ghost spawns, both movers): the server dispatches a turn's fire AFTER our go() for that same turn, so a turn-T shot's energy drop first reaches our scan at turn T+1 — and a bullet takes its FIRST step during the turn it is fired, so the true bullet is already one whole bullet step (11-20 px) downrange. Both movers place the ghost at the SCANNED enemy position (where the bullet was born), so the whole ghost trajectory is the true one shifted one turn later and the arrival deadline is a full tick late. MEASURED: detection lag +1 tick on 100% of 1777 matched spawns; ghost-vs- observer displacement 19.06 px mean / 22.00 p90 (tfil) and 16.08 / 21.81 (strafe); arrival-deadline error 0.99 / 0.77 ticks. NOT a rendering artefact: the draw/advance order is correct (advanceBullets -> detectFires -> build). THE FIX: TR_FIRE_LAG (int, default 0 = today byte-for-byte) in the shared fire_tracker, applied by both movers at spawn: x = origin + dir*speed*lag. The deadline needs no separate change — both movers derive it from the ghost's own position, so a correct position gives a correct deadline. WITH IT: displacement 19.06 -> 5.37 px mean (the residue is the enemy's own <=8 px scan staleness) and the deadline error 0.99 -> 0.06 ticks. Guards: test_tfil_commit_env 77 -> 87 checks (default golden parity, exact n-step back-date, deadline shortens by exactly lag, junk/negative degrade to 0, reaped exactly one tick earlier); test_env_report + test_env_dotenv green. TR_FIRE_LAG registered in env_report + knownEnvNames + .env.example + docs/env_reference.md. Live A/B pre-registered in docs/movement_campaign.md (Batch 8) with its MDE stated up front; arms tools/ab/arms_fire_lag.txt. TR_FIRE_DIAG gains a per-round ROUND line (the tick->getTurn anchor) and a per-spawn SPAWN line (the ghost's drawn position).
269 lines
19 KiB
Bash
269 lines
19 KiB
Bash
# ModularBot environment — EVERY knob the bot reads, already set to its default.
|
|
#
|
|
# cp .env.example .env
|
|
#
|
|
# The bot reads `.env` from its own folder automatically when you start it from
|
|
# there. To use a different file: ./out/ModularBot --env-file /path/to/my.env
|
|
# The FILE WINS over variables you exported in the shell: if a shell value
|
|
# differs, the bot prints one override line at boot so you know it happened.
|
|
#
|
|
# Every value below IS the built-in default, so running the bot with this file
|
|
# is identical to a clean run with no file at all. Delete a line (or comment it
|
|
# out with #) and that knob falls back to the built-in default. An inline
|
|
# `# comment` after a value is fine — the loader strips it.
|
|
#
|
|
# A few switches are PRESENCE-only (`existsEnv`): for those, OFF means the line
|
|
# is absent, so they are shown commented out. Writing `=0` would still turn them
|
|
# ON.
|
|
#
|
|
# SNAPSHOT of the code at commit 5e32ec1. Regenerate this file whenever a default
|
|
# changes, or it will start lying.
|
|
|
|
# ── movement ─────────────────────────────────────────────────────────────────
|
|
# Which dodging engine runs: tfil, tfil_ring, strafe, surf or learned.
|
|
TR_MOVEMENT=strafe
|
|
# Whole-engine on/off switches. 0 removes an engine from the TR_MOVEMENT choices.
|
|
TR_MODULE_MOVE_TFIL=on # the long-shipped "floor is lava" engine
|
|
TR_MODULE_MOVE_TFIL_RING=on # the same, re-weighted toward a target range
|
|
TR_MODULE_MOVE_STRAFE=on # perpendicular strafe with sign-flip reversals
|
|
TR_MODULE_MOVE_SURF=on # wave surfing, steered by the GuessFactor
|
|
TR_MODULE_MOVE_LEARNED=on # learned per-state danger field
|
|
|
|
# ── gun rack: which guns the bot may choose (off | 1v1 | melee | both) ───────
|
|
# The shipped rack is Pattern only. Turn a gun on with `both`.
|
|
TR_RACK_PATTERN=both # the only admitted gun; both = usable in 1v1 and melee
|
|
TR_RACK_HEADON=off # aim straight at the target, no lead
|
|
TR_RACK_LINEAR=off # constant-angle linear aim
|
|
TR_RACK_TSETLIN=off # Tsetlin automaton gun
|
|
TR_RACK_CIRCULAR=off # assumes the enemy circles
|
|
TR_RACK_GUESSFACTOR=off # learns the wave-surfing GF of the enemy
|
|
TR_RACK_WALLBOUNCE=off # predicts a rebound off the arena wall
|
|
TR_RACK_ACCEL=off # leads a bullet that is still accelerating
|
|
TR_RACK_STOPSHOT=off # fires only when it expects a full stop
|
|
TR_RACK_DISPLACE=off # leads a displaced enemy
|
|
TR_RACK_AVGLEAD=off # averaged lead over recent shots
|
|
TR_RACK_DECAYGF=off # GuessFactor with a forgetting decay
|
|
TR_RACK_KNN=off # nearest-neighbour over past gun states
|
|
TR_RACK_TMSELECT=off # Tsetlin machine used as the shot selector
|
|
TR_RACK_TMPATTERN=off # Tsetlin machine used as a pattern matcher
|
|
TR_RACK_TMHORIZON=off # horizon Tsetlin automata gun
|
|
TR_RACK_LEADGAIN=off # per-range-band learned lead-gain corrector
|
|
# Give every admitted gun a fixed share of the turns instead of ranking them,
|
|
# e.g. TR_RACK_SHARE=PATTERN:60%,HEADON:40%. Empty = the ranking selector.
|
|
TR_RACK_SHARE=
|
|
# Drop whole guns by rack id (comma separated, e.g. 16). Empty = keep them all.
|
|
GUN_RACK_DISABLE=
|
|
|
|
# ── gun selector (which admitted gun fires this tick) ───────────────────────
|
|
GUN_VBULLET_METRIC=path # fitness measure: path (time-to-collision) or point
|
|
GUN_SELECTOR_MODE=relative # rank guns against the incumbent (absolute = vs a fixed bar)
|
|
GUN_SELECTOR_WINDOW=100 # ticks of virtual-bullet history behind the fitness
|
|
GUN_SELECTOR_MINOBS=50 # observations a gun needs before it may compete
|
|
GUN_SELECTOR_TIE=0.2 # relative margin two guns must differ by to count as separated
|
|
GUN_SELECTOR_FLOOR=0.25 # fitness fraction of the peak below which a band is unsafe
|
|
GUN_SELECTOR_POOL=on # pool the per-tick samples over the window instead of replacing
|
|
GUN_SELECTOR_RANK=mean # how to rank guns: mean, wilson, ucb, thompson or shrunk
|
|
GUN_SELECTOR_SHRINK=20.0 # pseudo-count the shrunk rank adds per prior observation
|
|
GUN_SELECTOR_DWELL=10 # ticks a gun must lead before it can be switched away from
|
|
GUN_SELECTOR_MARGIN=0.05 # fraction the challenger must beat the incumbent by
|
|
GUN_SELECTOR_TIEBREAK=off # off, point or pointCommit: break ties on arrival accuracy
|
|
GUN_SELECTOR_POINT_TIE=0.5 # relative width of the point band used by the tie-break
|
|
# Seed for the selector's tie-breaks. Empty = seed from the clock + pid.
|
|
GUN_SELECTOR_SEED=
|
|
|
|
# ── power / energy policy ────────────────────────────────────────────────────
|
|
# Every rule below only ever CAPS power; the gun's own preference is the ceiling.
|
|
TR_POWER_POLICY=on # 0 = no cap at all (the control arm)
|
|
TR_POWER_FAR_DIST=200.0 # px; past this the enemy is in the bad-chances zone
|
|
TR_POWER_FAR_CAP=1.0 # cap applied past TR_POWER_FAR_DIST
|
|
TR_POWER_MID_CAP=2.0 # cap when close and healthy but not above its average
|
|
TR_POWER_REF=0.0 # 0 = the gun's own mean; >0 = that fixed reference power
|
|
TR_POWER_ENERGY_HI=80.0 # our energy at/above which the energy slope stops capping
|
|
TR_POWER_ENERGY_LO=20.0 # our energy at/below which the cap is TR_POWER_ENERGY_MIN
|
|
TR_POWER_ENERGY_MIN=0.5 # NOTE: this is a CEILING, not a floor — low energy, low power
|
|
TR_POWER_ENERGY_MAX=3.0 # the cap at/above ENERGY_HI; 3.0 means effectively uncapped
|
|
TR_POWER_FINISH_KILL=on # cap to the smallest bullet that still kills a low-energy enemy
|
|
|
|
# ── radar ────────────────────────────────────────────────────────────────────
|
|
#TR_RADAR_FORCE_SPIN=1 # presence-only: force the old full 360 spin instead of 1v1 lock
|
|
TR_RADAR_SCAN_LOG_PATH=/tmp/radar_scan_log.jsonl # where the per-tick scan log is written
|
|
|
|
# ── ram ──────────────────────────────────────────────────────────────────────
|
|
TR_MODULE_RAM=on # 0 = never ram; the movement engine alone drives
|
|
TR_RAM_OPPORTUNITY=off # the proactive "close the distance" gate (measured not to convert)
|
|
TR_RAM_OPP_DIST=200.0 # px; max range at which that gate may fire
|
|
TR_RAM_OPP_MARGIN=15.0 # energy advantage the gate needs before it starts
|
|
TR_RAM_ABORT_DMG=2.0 # incoming damage per turn that aborts a ram in progress
|
|
TR_RAM_PLAN=off # the change-of-plan trigger (enemy outguns us while we ram)
|
|
TR_RAM_PLAN_DIST=250.0 # px; max range at which the plan trigger may fire
|
|
TR_RAM_PLAN_MARGIN=20.0 # energy advantage the plan trigger needs
|
|
TR_RAM_PLAN_HITRATE=0.05 # pooled virtual hit rate below which the gun duel counts as failing
|
|
|
|
# ── movement internals: tfil (the floor-is-lava field) ──────────────────────
|
|
TR_TFIL_RANGE_LO=100.0 # px; lower edge of the range band the ring mover prefers
|
|
TR_TFIL_RANGE_HI=200.0 # px; upper edge of that band
|
|
TR_TFIL_RANGE_TEMP=0.4 # sharpness of the ring mover's weighted random draw
|
|
TR_TFIL_RANGE_K=60.0 # px; how fast the weight falls off outside the band
|
|
TR_TFIL_CORRIDOR_HEAT=10.0 # lava painted per corridor-overlapping tile
|
|
TR_TFIL_WALL_HOTNESS=15.0 # peak heat painted on tiles next to a wall
|
|
TR_TFIL_WALL_RADIANCE=10.0 # how fast wall heat falls off with distance
|
|
TR_TFIL_BULLET_CORE=10.0 # tfil only: lava per bullet-overlapping tile (== PathDangerThreshold, so a bullet is never hot on its own)
|
|
TR_TFIL_BULLET_AURA=5.0 # tfil only: lava for the bullet's aura ring tiles
|
|
TR_TFIL_TILE_REPLAN=self # self | enemy | off: when a dodge commitment is cancelled
|
|
TR_TFIL_COMMIT_TICKS=15 # ticks to commit to a dodge point before replanning
|
|
TR_TFIL_NO_REV=off # on = never reverse direction inside a corridor
|
|
TR_TFIL_COMMIT_LOG= # path for the per-commit log; empty = no log
|
|
TR_TFIL_COMMIT_ARRIVAL=off # on = hold the dodge tile until we are ON it (not a fixed dwell)
|
|
TR_TFIL_COMMIT_MARGIN=0.0 # lava an alternative tile must be cooler by before it wins the tile
|
|
TR_TFIL_NOREV_SPEED=0.0 # px/tick; below this, a mid-flight switch may not turn the bot around
|
|
TR_TFIL_TURN_BIAS=0.0 # turn TIEBREAK odds ratio among SAFE tiles; 0 = uniform draw as today
|
|
TR_TFIL_TURN_REF_DEG=45.0 # deg; turn below which the tiebreak applies no penalty
|
|
TR_TFIL_HEAT_TIME=off # on = index bullet heat by time (flat field when off)
|
|
TR_TFIL_HEAT_TAU=9.0 # ticks a tracked bullet's heat lives for
|
|
TR_TFIL_HEAT_POWER_GAIN=1.0 # scale of the heat a bullet paints, per firepower
|
|
TR_TFIL_PILLAR_ON=off # on = paint heat on the arena centre, which has no pillar
|
|
|
|
# ── movement internals: strafe ───────────────────────────────────────────────
|
|
TR_STRAFE_BAND=20.0 # degrees the heading may sit off the perpendicular
|
|
TR_STRAFE_SPREAD=1 # tiles of sideways jitter added to each candidate
|
|
TR_STRAFE_REACH=144.0 # px the candidate line reaches in each direction
|
|
TR_STRAFE_DWELL_MIN=6 # min ticks on a target tile before it may be re-picked
|
|
TR_STRAFE_DWELL_MAX=20 # max ticks on a target tile before it is re-picked anyway
|
|
TR_STRAFE_RANGE=325.0 # px; the enemy distance the line is tilted toward
|
|
TR_STRAFE_RANGE_TOL=25.0 # px dead band around it, where the tilt is exactly 0
|
|
TR_STRAFE_TILT_MAX=15.0 # degrees; the hard cap on that tilt
|
|
TR_STRAFE_TILT_GAIN=0.1 # degrees of tilt per px of range error beyond the band
|
|
TR_STRAFE_KAPPA=0.0025 # 1/px; how hard the candidate wing bends near a wall
|
|
TR_STRAFE_WALL_MARGIN=108.0 # px range over which the wing starts to bend
|
|
TR_STRAFE_WING_MAX=30.0 # degrees; cap on the wing's own tilt toward the interior
|
|
TR_STRAFE_WALL_BIAS=0.35 # how strongly a tile farther from the wall is preferred
|
|
TR_STRAFE_WALL_SAFE=24.0 # px; a wing point never lands nearer than this to a wall
|
|
TR_STRAFE_ESCAPE=on # the guaranteed wall escape when every candidate is hot
|
|
TR_STRAFE_FIRE_FIX=on # strafe's share of the shared TR_FIRE_FIX switch
|
|
TR_FIRE_FIX=on # 0 = the shipped previous-energy bullet detector
|
|
#TR_FIRE_DIAG=1 # presence-only: per-reading tick/raw/correction trace
|
|
#TR_FIRE_LAG=0 # ticks to back-date each detected fire at spawn (0=shipped; 1=the measured live detection lag)
|
|
TR_STRAFE_HEAT_GRID=on # draw the whole heat grid; 0 leaves only the chosen tile
|
|
TR_STRAFE_BULLET_CORE=20.0 # strafe's own retune: lava per bullet-overlapping tile
|
|
TR_STRAFE_BULLET_AURA=10.0 # strafe's own retune: lava for the bullet aura ring
|
|
TR_STRAFE_CORRIDOR_HEAT=10.0 # strafe's own retune: lava per corridor tile
|
|
TR_STRAFE_WALL_HOTNESS=15.0 # strafe's own retune: peak wall heat
|
|
TR_STRAFE_WALL_RADIANCE=5.0 # strafe's own retune: wall heat falloff
|
|
|
|
# ── movement internals: surf (wave surfing) ─────────────────────────────────
|
|
TR_SURF_PREF_DIST=400.0 # px; the wave distance the mover tries to sit at
|
|
TR_SURF_DIST_BAND=50.0 # px dead band around it
|
|
TR_SURF_WALL_MARGIN=48.0 # px kept from the wall when picking a wave point
|
|
TR_SURF_RADIAL_FRAC=0.35 # how much of the remaining weight goes to the radial blend
|
|
#TR_SURF_LOG=1 # presence-only: one line per wave-surfing decision
|
|
|
|
# ── movement internals: learned (per-state learned danger) ──────────────────
|
|
TR_LEARNED_DECAY_EVERY=128 # learns between forgetting passes; 0 never forgets
|
|
TR_LEARNED_DECAY_SHIFT=1 # forgetting is c -= c shr shift; 0 disables it
|
|
TR_LEARNED_ALPHA=5.0 # weight of the uniform prior against the learned counts
|
|
TR_LEARNED_TRAVEL=0.01 # danger cost of crossing a wave
|
|
TR_LEARNED_REVERSAL=0.02 # danger cost of flipping the strafe side
|
|
TR_LEARNED_PREF_DIST=400.0 # px; the enemy distance this mover prefers
|
|
TR_LEARNED_DIST_BAND=50.0 # px dead band around it
|
|
TR_LEARNED_RADIAL_FRAC=0.35 # radial blend used outside the band
|
|
TR_LEARNED_WALL_MARGIN=48.0 # px kept from the wall
|
|
TR_LEARNED_GLOBAL=off # on = ignore the learned state (ablation arm)
|
|
TR_LEARNED_LABEL=histogram # histogram (default) or outcome: what a wave is labelled with
|
|
TR_LEARNED_REAL_EVENTS=off # on = resolve a wave on the real bullet event, not on energy
|
|
#TR_LEARNED_LOG=1 # presence-only: one line per learned decision
|
|
|
|
# ── guns ─────────────────────────────────────────────────────────────────────
|
|
# Virtual bullets: the prediction the whole gun selector is built on.
|
|
TR_MODULE_VBULLETS=on # 0 = no gun predicts or spawns; the selector falls back to its floor gun
|
|
|
|
# TMH — the horizon Tsetlin automata gun.
|
|
TR_TMHORIZON_SHIFT=2.0 # degrees added to the aim; 0 disables the correction arm
|
|
TR_TMHORIZON_BIG_MULT=1.5 # extra scale applied when the error magnitude is big
|
|
TR_TMHORIZON_RESET_ON_TARGET=on # wipe the automata when the target changes
|
|
TR_TMHORIZON_NSTATES=64 # automata state count (the inertia it can hold)
|
|
TR_TMHORIZON_WINDOW=0 # samples kept in the sliding window; 0 keeps everything
|
|
TR_TMHORIZON_RESET_DROP=0.0 # rolling accuracy drop, in points, that forces a retrain
|
|
TR_TMHORIZON_ACCURVE=off # log the accuracy curve even without the thinking log
|
|
TR_TMHORIZON_RETRAIN_EVERY=50 # samples between full retrains in sliding mode
|
|
TR_TMHORIZON_EPOCHS=1 # epochs each full retrain runs
|
|
|
|
# LEADGAIN (rack id 16) — the per-range-band learned lead-gain corrector.
|
|
TR_LEADGAIN_MEM=perRound # perRound | retained | decay: how corrections are kept
|
|
TR_LEADGAIN_GAINS=0.0,0.25,0.5,0.75,1.0 # the candidate lead gains it picks among
|
|
TR_LEADGAIN_MIN_OBS=8 # samples a band needs before its gain is trusted
|
|
TR_LEADGAIN_DECAY=250 # samples between count-decay passes
|
|
TR_LEADGAIN_DECAY_FRAC=0.02 # fraction each decay pass takes off every count
|
|
TR_LEADGAIN_RESET_ON_TARGET=on # wipe the learned gains when the target changes
|
|
TR_LEADGAIN_LOG=off # on = one line per gain change
|
|
# Kept only so a pre-rename .env does not warn. The gun does not read them.
|
|
TR_LEADGAIN_N=32 # NO-OP: the old SBC geometry, no longer used
|
|
TR_LEADGAIN_NADE=256 # NO-OP: the old ADE count, no longer used
|
|
TR_LEADGAIN_RANGE=40.0 # NO-OP: the old class half-range, no longer used
|
|
TR_LEADGAIN_WARMUP=400 # NO-OP: the old warm-up count, no longer used
|
|
TR_LEADGAIN_ADAPT=32 # NO-OP: the old adapt interval, no longer used
|
|
TR_LEADGAIN_CALIB=512 # NO-OP: the old calibration interval, no longer used
|
|
TR_LEADGAIN_SEED=20240921 # NO-OP: the old seed, no longer used
|
|
|
|
# PATTERN — the shipped gun, the only one the rack admits.
|
|
TR_PATTERN_LEN=10 # ticks of movement history used as the search key
|
|
TR_PATTERN_DEPTH=500 # how far back the history scan may reach
|
|
TR_PATTERN_RAD_OFFSET=0.0 # px added to the aim distance; negative aims short
|
|
TR_PATTERN_RAD_SCALE=1.0 # multiplier on the whole aim distance
|
|
|
|
# The SBC library (common_libs/bitbrain), not a gun knob. Registered so a config
|
|
# that sets them is not reported as a typo; the shipped bot path never reads them.
|
|
TR_BITBRAIN_MODE=bitset # bitset (default) or counted: the memory's storage
|
|
TR_BITBRAIN_DECAY_EVERY=1024 # learns between forgetting passes, counted mode only
|
|
TR_BITBRAIN_DECAY_SHIFT=1 # forgetting strength, counted mode only; 0 disables it
|
|
|
|
# Legacy names. `TR_BITBRAIN_<X>` is the old namespace of TR_LEADGAIN_<X> and
|
|
# `TR_RACK_BITBRAIN` the old name of TR_RACK_LEADGAIN; they are still honoured,
|
|
# but the new name always wins and setting an old one prints a [depr] line, so
|
|
# they stay commented out here.
|
|
#TR_RACK_BITBRAIN=off # LEGACY: old name of TR_RACK_LEADGAIN
|
|
#TR_BITBRAIN_MEM=perRound # LEGACY: old name of TR_LEADGAIN_MEM
|
|
#TR_BITBRAIN_GAINS=0.0,0.25,0.5,0.75,1.0 # LEGACY: old name of TR_LEADGAIN_GAINS
|
|
#TR_BITBRAIN_N=32 # LEGACY: old name of TR_LEADGAIN_N
|
|
#TR_BITBRAIN_NADE=256 # LEGACY: old name of TR_LEADGAIN_NADE
|
|
#TR_BITBRAIN_RANGE=40.0 # LEGACY: old name of TR_LEADGAIN_RANGE
|
|
#TR_BITBRAIN_LOG=off # LEGACY: old name of TR_LEADGAIN_LOG
|
|
#TR_BITBRAIN_MIN_OBS=8 # LEGACY: old name of TR_LEADGAIN_MIN_OBS
|
|
#TR_BITBRAIN_WARMUP=400 # LEGACY: old name of TR_LEADGAIN_WARMUP
|
|
#TR_BITBRAIN_ADAPT=32 # LEGACY: old name of TR_LEADGAIN_ADAPT
|
|
#TR_BITBRAIN_CALIB=512 # LEGACY: old name of TR_LEADGAIN_CALIB
|
|
#TR_BITBRAIN_DECAY=250 # LEGACY: old name of TR_LEADGAIN_DECAY
|
|
#TR_BITBRAIN_DECAY_FRAC=0.02 # LEGACY: old name of TR_LEADGAIN_DECAY_FRAC
|
|
#TR_BITBRAIN_SEED=20240921 # LEGACY: old name of TR_LEADGAIN_SEED
|
|
#TR_BITBRAIN_RESET_ON_TARGET=on # LEGACY: old name of TR_LEADGAIN_RESET_ON_TARGET
|
|
|
|
# ── debug overlays (all on top of the gun; they never change a decision) ─────
|
|
TR_DEBUG_DRAW=on # master switch for every mover's debugGraphics
|
|
TR_GEO_DEBUG=off # draw the shared candidate-tile geometry overlay
|
|
TR_VBULLET_DEBUG=off # draw each admitted gun's virtual-bullet paths
|
|
TR_VBULLET_DEBUG_GUN= # which gun the overlay draws: empty = the selected one
|
|
TR_VBULLET_DEBUG_MAX=32 # max virtual bullets drawn per gun
|
|
TR_VBULLET_ADMIT_ONLY=on # on = a gun the rack does not admit is not even predicted
|
|
|
|
# ── logs (set the value to 1; presence alone turns some of them on) ──────────
|
|
TR_RESULT_LOG=on # one line per round result
|
|
#TR_POWER_LOG=1 # presence-only: one line per power decision
|
|
#TR_RAM_LOG=1 # presence-only: one line per ram start/stop and why
|
|
#TR_MOVEMENT_LOG=1 # presence-only: movement band/class changes
|
|
#TR_STRAFE_LOG=1 # presence-only: one line per strafe tile pick
|
|
#TR_TMHORIZON_LOG=1 # presence-only: the per-shot thinking of the TM horizon gun
|
|
GUN_STATS_PATH=/tmp/gun_stats.jsonl # where the per-round gun stats are written
|
|
GUN_SHOTLOG_PATH=/tmp/shot_log.jsonl # where the per-shot log is written
|
|
|
|
# ── measurement helpers (leave off unless you are measuring) ─────────────────
|
|
#TR_RECORD_WORLDSTATE=1 # presence-only: dump every observed world state
|
|
#TR_RADAR_SCANLOG=1 # presence-only: log every radar scan tick
|
|
#TR_TRACKER_PROBE=1 # presence-only: dump the enemy-tracker's internal state
|
|
TR_TRACKER_PROBE_PATH=/tmp/tracker_probe.jsonl # where that dump is written
|
|
|
|
# ── dotenv / boot report ─────────────────────────────────────────────────────
|
|
# Name of the env file to load. Must be set in the REAL environment, not in the
|
|
# file it points at. Empty = use ./.env, else .env next to the binary.
|
|
TR_ENV_FILE=
|
|
# 1 = print the [env] report on startup (default). 0 = do not print it.
|
|
TR_ENV_REPORT=1
|