treadcore · lab reportscontentsThe rule, and who may use itWhat is physicalThe rangesThe scale systemLinks← 810 →

chapter 9 of 16

Physical constraints first, and a scale for the world

The plan begins where the week's numbers point. Of the brain's 135 weights, about a third are distances, times and counts with a meaning in the world: how far a teammate can be and still be "coming", how long a target stays called, how many strike drones fly at once. The search has treated them as preferences, and some of them walked: base_r went 16, 32, 8, 6.15 in one day; coming_r reached 221 tiles on a map 128 tiles wide. A number that means something in the world has limits the world sets, and the first step of the second half is to write them down. Then the scale: the game's constants assume a tile of 25 metres and a game speed about six times life, and the maps range from a 128-tile island to a 1,024-tile world. A scale system says what a tile is on each map, so that flight times, arcs and speeds can be reasoned about, and so that the game can show a player real units.

The rule, and who may use it

Paul's rule of 30 October stands: every number may have a minimum and a maximum in source/treadcore-brain/RANGES; nothing moves a number outside its range (not a weights file, not a trial, not a promotion); the search stays inside; and a decree, min equal to max, is a person's ruling that only Paul makes. What this chapter adds are ranges, not decrees. Each is grounded in a constant of the simulator or the map, and each says so beside it. Three numbers are decree candidates: they are facts of the simulator or Paul's own word, and the chapter names them for him rather than writing them.

What is physical

KindCountExamplesWhat bounds it
physical: a distance in tiles30near_scale, base_r, odds_r, coming_r, crew_reach, kite_in, post_spacing, the ping reaches, the dodge's margin and clearancethe gun's reach (60), the map (128 wide, 181 across), a pillbox's ring (8), direct range (10), vision (10 and 20)
physical: a time in seconds17called_for, mass_for, forget_for, dodge_horizon, bridge_keep, duck_memory, longshot_every, bio_perioda shell's flight (6 s at full range), a reload (4 s, 12 s), a match (16 to 30 min)
physical: a count or material10focus_cap, answer_cap, confirm, strikes_max, posts_max, c_boat, tree_material, forest_needthe bay (2, 6, 3, 2), the squad (4), the material a tank carries (8), sixteen seats
a share, 0 to 131alpha, w_duck, focus_blend, skill, w_front, the thresholded yes-or-no weightsalready ranged, or added here
a worth or preference33w_near, w_wounded, w_pos_fortify, w_mend, pillbox_worthfree: a worth is what the search is for
a choice or switch14bot_style, roles, ladder, crew_stay, cycle_allheld to their versions by construction

The ranges

Added to RANGES on 2 November, each with its reason. A range holds a number at its edge rather than refusing it, so a trial that asks for more gets the edge and is read there. The defaults of 2 November all lie inside.

WeightDefaultMinMaxWhy
near_scale30260nearness is scaled by a distance: under two tiles it is adjacency, past the gun's reach (60) nothing is near
called_for151120a ping older than two minutes is history; forget_for is 120
focus_cap215teammates on one target: a fleet is five
base_r6.15232the base's reach for threats: a depot's radius (2) to a quarter of the map
odds_r14860tanks that count toward a fight: a pillbox's ring to the gun's reach
coming_r22110256a teammate "coming" from beyond the largest map (256) is not coming; today's 221 means everyone counts, and Paul may wish to decree less
mass_for12160seconds to hold off for help
answer_cap3015nearer teammates who answer instead: sixteen seats
crew_reach405128a crew answers a call this near: the map's width
kite_margin1.5010past the target's reach, within direct range
kite_in2.25010the ring a step in ends on
kite_turn0.805seconds beyond the drive
kite_spare0.404seconds of a 4-second reload to spare
confirm, confirm_turret2, 3110thinks in a row
jitter3020a goal's shift smoothed under this many tiles
retreat_armor500100armour is 100
retreat_shells4024a tank holds 24
forget_for120101800a match is at most 30 minutes
bridge_soft6030a bridge this long costs no extra
c_boat, t_launch5, 3016material, in trees' worth; a tank carries 8
tree_material418decree candidate: the simulator gives 4 a tree (HARVEST_MATERIAL)
forest_need12064trees a base asks for
site_area4001616384tiles of an island; 128 squared
site_reach, w_site_beach30, 200128tiles, the map's width
column_gap20.56tiles between tanks in file
column_past2020tiles past a bridge
ping_help_reach, ping_defend_reach60, 905128tiles, the map's width
ping_defend_hold1.50.55times a rally's length
ping_warn_reach, ping_warn_flee, ping_caution_reach25, 15, 20260tiles, within the gun's reach
ping_outnumbered1.514a ratio of tanks
bio_period606060a decree by Paul's word (1 November: "it was already at 60, 73, 86 seconds per cycle; that's perfect")
patch_reach10030tiles the transform may move a point
dodge_horizon1.080.26seconds before a shell lands; a full-range shell flies 6
dodge_margin0.805tiles past the splash (2.5)
dodge_clear2.50.510tiles driven clear
landfall_wait10060seconds standing off a beach
landfall_memory, front_memory30, 300300seconds a hostile is remembered
connect_tiles5.12116road tiles a visit
castle_road206pillboxes on the castle's road
post_spacing31.9664tiles between posts: twice a pillbox's spacing to half the map
posts_max6020there are twenty neutral pillboxes
junction_clear3010tiles from a junction
bridge_keep9010600seconds a part-laid bridge stays a job
bridge_reach, fetch_gather40, 200128tiles
duck_memory2.5030seconds a gun is remembered
duck_ready1.504seconds; a tank's reload is 4
longshot_every1.250.560seconds between longshots
strikes_max3.304decree candidate: the bay holds 3; a fourth cannot launch
escort_distance, wing_leash, wing_greed, wing_threat, wing_ahead4, 20, 16, 10, 161, 5, 2, 2, 212, 60, 40, 30, 40the wingman's five numbers, weights from today (chapter 11): a tank's length to direct range; a leash within the gun's reach
the shares (skill, connect_idle, long_game, posture_scored, dodge_hold, landfall_shy, the thresholded yes-or-no weights, upgrade_vs_mend, w_front, w_front_post, w_front_push, focus_blend, assist, bio_amount, patch_confidence)01outside 0 to 1 a share is not one
site_poor0.5−11a site score runs −1 to 1

What this changes in the search: a trial that asked for coming_r 400 is read at 256; the far read, which doubles and halves a dial four times, stops at the edges; and the fit's draws are bounded, which is what suggest.py already does with the file. What it changes in the game: nothing today, since every default lies inside.

The scale system

What a tile is

MapTilesAt 25 m a tileWhat it depictsScale it should declare
island, industry128 × 1283.2 kma generated island25 m
naval160 × 1604 kman archipelago25 m
big-lizard, constanine, fidos-airstrip, fortressisles2, fortressislesx256 × 2566.4 kmconverted prior-art maps25 m
europe320 × 2568 kmEurope, about 4,000 km acrossabout 12 km: a theatre, not a field
atlantic512 × 33312.8 kmthe Atlantic, about 6,000 kmabout 12 km
world1024 × 102425.6 kmthe worldabout 40 km

The game plays every one of these with the same constants, so on europe a tank crosses the continent in eighty seconds and a mortar reaches 700 km. Nobody minds, because the game's time and distance are gameplay, not physics; but the census reads europe and atlantic among its eleven maps, and a brain tuned there is tuned for a theatre game. The scale system makes the difference explicit rather than removing it.

The three numbers

  1. Scale, metres a tile, declared in the map file's header (scale 25), 25 when absent. It changes no rule; it labels.
  2. Tempo, how many real seconds a game second stands for, declared with the scale. At 25 m a tile the game's own numbers fit a tempo of about 6: a tank at 4 tiles a second is 360 km/h in game time and 60 km/h at tempo 6; a recon quadcopter 75 km/h; an interceptor 135 km/h; an FPV strike 97 km/h; a recon's 150-second battery is a quarter of an hour; a sixteen-minute match is an hour and a half. Those are the vehicles the drones are modelled on.
  3. The class: field (scale under 100 m), where the physical table below should hold, or theatre, where it does not and the HUD says so.

The constants in real units, at 25 m a tile and tempo 6

ConstantGameReal, at tempo 6The system it stands forFit
tank speed4 tiles/s60 km/ha main battle tank on a road, 65 to 70 km/hfits
recon Mk I speed, battery5 tiles/s, 150 s75 km/h, 15 mina quadcopter, 50 to 90 km/h, 20 to 40 minfits
recon Mk II6.5 tiles/s, 210 s97 km/h, 21 mina VTOL fixed-wingfits
interceptor Mk I9 tiles/s, 90 s135 km/h, 9 mina kinetic interceptor drone, 150 to 300 km/hslow by half
interceptor Mk III14 tiles/s210 km/ha high-speed interceptorfits
strike (FPV)6.5 tiles/s, 45 s97 km/h, 4.5 minan FPV, 100 to 150 km/h, 5 to 10 minfits
loitering munition5.5 tiles/s, 90 s82 km/h, 9 mina loitering munition, about 110 km/h, 30 minslow, short
longshot3 tiles/s, 150 s45 km/h, 15 mina one-way attack drone, 150 to 200 km/h, hoursslow by four; kept slow so a bubble on its path has time
indirect gun12 to 60 tiles, 6 s at full range300 m to 1.5 km, 36 sa 120 mm mortar, 200 m to 7 km, 15 to 25 s at 1.5 kmshort, and the shell flies twice as long; kept long so a tank can move if it sees the launch
direct gun10 tiles, 40 tiles/s250 m, 170 m/sa tank gun, 2 to 4 km, 800 to 1,700 m/sa quarter of the range, a fifth of the speed: the island is small
recon vision, link20, 40 tiles500 m, 1 kma drone's camera and radioshort, by design: the island is small
pillbox range8 tiles200 ma fortified gunfits a machine gun, not a cannon

The fit column is the finding: the vehicles and the drones scale together at tempo 6, and the two exceptions are the longshot (four times too slow) and the gun (short and slow). Both are gameplay choices the code already explains in its comments, and the plan keeps them; what it adds is that they are now written in one table, in one place, with the real units beside them, so a change is a one-line diff with a sentence (which is what rules.rs has always said it wants to be).

Ballistic arcs

A shell today flies a straight track at 10 tiles a second and lands; the arc is drawn, not simulated. A real arc for a range R at launch speed v and angle θ has R = v*² sin 2*θ / g and flight time t = 2 v sin θ / g; at a high angle the time grows with the range's square root, not linearly. The design keeps the straight track (determinism, replay, every read of the week) and adds the arc as a displayed quantity: given the scale and tempo, the HUD can show "a 1.2 km lob, 5 s" and the newswire can say it, with the real arc's apex for the picture. A later game version may make the flight time follow the square root; that is a rule change, a GAME_VERSION bump, and a census, and it is not built.

Where the scale system is built, and where not

  • Built: the ranges above, in RANGES, with the brain's test that every default lies inside; the physical table in rules.rs's documentation with a test that recomputes the real units from the constants, so the table cannot go stale.
  • Designed, not built: the scale and tempo header fields (a map-format change with a round-trip test), the class on the HUD, the arc as a displayed quantity, and the square-root flight time behind a game version. Each is a one-session step; none changes a read already made.