bench parity: local nodes now launch exactly like a player's shortcut
Local benches had drifted from the shipped launchers and every divergence
cost a debugging session:
* no BT_START_INSIDE -> benches opened in the EXTERNAL CHASE camera while
every player starts in the COCKPIT. The first first-person look at a
bench window was misread as a broken HUD.
* novice bench eggs -> every SHIPPED egg is expert; novice gates off the
entire heat model, crits and jams, so bench combat was not field combat.
(Verified: the aligned node now boots experience=3 simLive=1
heatModelOn=1, where it used to boot 0/0/0.)
* 1-LP affinity pins -> starved the gauge executive and produced a false
"the comms panel never counts deaths" reading. Two LPs per node keeps
the documented single-box jitter fix without the starvation.
scratchpad/night6/bench_common.sh now owns the contract (bt_player_env,
bt_launch, bt_expert_egg, bt_novice_egg) copied verbatim from play_solo.bat,
with bt_assert_player_env warning if the shipped bat ever drifts. All three
4-node benches source it. The limp bench keeps a novice egg -- expert crits
the aimed leg and the mech turns-but-never-moves -- and now says so loudly.
Also: BT_SHOT_EVERY=<n> headless backbuffer capture (btl4vid.cpp), the tool
this was diagnosed with. It must sit above the warp phase-0 early-out since
that fn is the per-frame alpha-pass hook. OS screen-capture is off-limits:
a foreground-lock failure photographed the user's browser instead of the game.
KB: build-and-run.md gains the bench-parity rule + the capture diag;
cockpit-view.md gains the measured aspect/FOV finding (the surround's 2.05:1
view collapses vertical FOV to 31.5 deg vs the pod's 46.8, so fixed canopy
geometry covers 68.6% of the lower half -- NOT a regression: the shipped 643
binary reports identical geometry).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
82f1ea1183
commit
4e89baeff3
@@ -92,6 +92,41 @@ run\run.cmd [EGG] # default DEV.EGG; cd's to content\ and runs btl4.exe -eg
|
||||
mad1/mad2, own1, snd1, thr1, vul1); each boots a solo mission, spawns, animates, no
|
||||
crash. The code path is mech-agnostic. [T2]
|
||||
|
||||
## Local benches MUST launch like a player (bench parity, 2026-07-30)
|
||||
|
||||
Every shipped launcher (`play_solo.bat`, `join*.bat`, `play_steam.bat`) sets the SAME three
|
||||
things, and a local bench that omits them is not testing the game the field plays:
|
||||
|
||||
set BT_PLATFORM=glass set BT_START_INSIDE=1 set BT_DEV_GAUGES=1
|
||||
|
||||
plus a front-end flag (`BT_FE_SOLO` / `BT_FE_JOIN`), `cd content`, and NO `-res`.
|
||||
**`BT_START_INSIDE=1` is the big one** — without it a bench opens in the EXTERNAL CHASE camera
|
||||
while every player starts in the COCKPIT. Benches ran chase-only for weeks; the first
|
||||
first-person look at one was misread as a broken HUD [T2].
|
||||
**Experience:** every SHIPPED egg is `experience=expert`. A `novice` bench egg silences the whole
|
||||
heat model, crits and jams (see [[experience-levels]]) — bench combat then is not field combat.
|
||||
Only the aimed-leg gimp bench may use novice (expert crits the aimed leg and the mech
|
||||
turns-but-never-moves); it must say so out loud.
|
||||
**Affinity:** pin each node to TWO logical processors (`0x03/0x0C/0x30/0xC0`), not one. Disjoint
|
||||
core sets keep single-box packet delivery even (the peer-shakiness fix, [[multiplayer]]); ONE LP
|
||||
per node starves the gauge executive and fakes a "the comms panel never counts" reading [T2].
|
||||
|
||||
`scratchpad/night6/bench_common.sh` owns this contract (`bt_player_env` / `bt_launch` /
|
||||
`bt_expert_egg` / `bt_novice_egg`, and `bt_assert_player_env` warns if the shipped bat drifts).
|
||||
The 4-node benches (`mp4_panel.sh` respawn+scoreboard, `mp4_cross.sh` real cross-fire kills,
|
||||
`mp4_limp.sh` gait replication) all source it. A `-net` node renders NOTHING until
|
||||
`tools/btconsole.py` starts the mission — a solo launch is the quick visual check.
|
||||
|
||||
## Headless frame capture — `BT_SHOT_EVERY` (2026-07-30)
|
||||
|
||||
`BT_SHOT_EVERY=<n>` dumps the game's own backbuffer every n frames to
|
||||
`<BT_SHOT_PREFIX|shot>_NNN.png` (btl4vid.cpp, top of `BTDrawTranslocationSpheres` — the per-frame
|
||||
alpha-pass hook; it MUST stay above that function's phase-0 early-out). This is how rendering is
|
||||
diagnosed without foregrounding a window, and it is the ONLY capture method to use: OS
|
||||
screen-capture grabs whatever is actually on the user's screen (a foreground-lock failure once
|
||||
photographed the user's browser instead of the game) and is off-limits.
|
||||
Frames land mid-alpha-pass, so a process killed during a write leaves ONE truncated PNG — skip it.
|
||||
|
||||
## Debug (cdb x86)
|
||||
`"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\cdb.exe"`. Pattern for a faulting stack (cwd
|
||||
= content\): `-g -c ".lines;sxe av;g;kp 24;q"` with `BT_ASSERT_TO_DEBUGGER=1`. Debug CRT fills fresh
|
||||
|
||||
@@ -88,6 +88,36 @@ inverse(eyeWorld)`. No LookAt anywhere.
|
||||
DPLEyeRenderable::Execute (order `Orient × R`, `D3DXMatrixInverse` on the live path — note the
|
||||
ctor also holds a copy of this code but its view write is DEAD; patch the Execute).
|
||||
|
||||
## ⚠ The canopy looks "obscured" at wide viewports — it is the ASPECT, not the canopy [T2]
|
||||
|
||||
`BTFovYFromHorizontal` (L4VIDEO.cpp:127) pins the HORIZONTAL fov at the authentic 60° and derives
|
||||
the vertical from the LIVE aspect — correct at the pod's 4:3 (60°×46.8°), but the cockpit-surround
|
||||
layout hands it a very wide, short world view and the vertical field collapses:
|
||||
|
||||
| viewport | aspect | vertical FOV |
|
||||
|---|---|---|
|
||||
| pod 800×600 | 1.33 | **46.8°** |
|
||||
| surround default 900×500 | 1.80 | 35.6° |
|
||||
| surround on a 1080p screen 900×440 | 2.05 | **31.5°** |
|
||||
|
||||
The surround height-clamps the view to fit the work area (`btl4main.cpp` ~1404: 900×500 → 900×440
|
||||
on 1080p), so the smaller the screen the worse it gets. The canopy is FIXED world geometry, so a
|
||||
1.5× vertical squeeze makes it eat 1.5× more of the view: measured on bhk1 at 900×440 the frame
|
||||
covers **39% of the viewport — 9.5% of the upper half but 68.6% of the LOWER half**, i.e. the dash
|
||||
rides up over the horizon and hides the ground where enemy mechs stand (user-reported as "can't
|
||||
see to shoot"). At a true 4:3 world view the same build/mech/map renders a correct big-window
|
||||
cockpit. Left/right skew is 6% (symmetric — nothing is tilted).
|
||||
**Not a regression:** the shipped 4.11.643 binary reports identical geometry (`view 900x440
|
||||
canvas 1452x999`), and the gauge-executive change is measurably innocent (canopy coverage 57–59%
|
||||
with it on vs 60–61% off — scene variation).
|
||||
**Verification method:** `BT_COP_PLATES=1` (kit off) gives a 100%-solid viewport vs 39% with the
|
||||
stencil cut live — that is how to prove the punch kit is running. Canopy coverage = per-pixel diff
|
||||
of a normal frame against a `BT_HIDE_COCKPIT=1` frame; a raw grey-pixel count also catches sky.
|
||||
**Open decision (nothing changed yet):** cap the aspect used for fovY (wide windows would show
|
||||
MORE horizontally instead of cropping vertical — identical to the pod at 4:3), or make the
|
||||
surround's view taller (clamp width, costing surround width), or bench first-person work in the
|
||||
dock layout (`BT_DEV_GAUGES_DOCK=1 -res 640 480`).
|
||||
|
||||
## Status per mech + the gyro (task #56 — gyro now LIVE)
|
||||
|
||||
- **Madcat (MAX_COP): verified good on pure defaults** — dark domed frame (top arch +
|
||||
|
||||
Reference in New Issue
Block a user