Files
BT411/scratchpad/night6/file_82fix.py
T

39 lines
2.9 KiB
Python

"""#82 skating fix landed -- comment + close."""
import base64
import json
import subprocess
import urllib.request
REPO = r"C:\git\bt411"
BASE = "https://gitea.mysticmachines.com/api/v1/repos/VWE/BT411"
out = subprocess.run(["git", "credential", "fill"],
input="protocol=https\nhost=gitea.mysticmachines.com\n\n",
capture_output=True, text=True, cwd=REPO)
cred = dict(l.split("=", 1) for l in out.stdout.strip().splitlines() if "=" in l)
AUTH = "Basic " + base64.b64encode(
(cred["username"] + ":" + cred["password"]).encode()).decode()
def call(method, path, payload=None):
data = json.dumps(payload).encode() if payload is not None else None
r = urllib.request.Request(BASE + path, data=data, method=method)
r.add_header("Authorization", AUTH)
r.add_header("Content-Type", "application/json")
return json.load(urllib.request.urlopen(r))
BODY = """**Fixed in `e1c15eb`** (build 4.11.643), verified on a two-node bench: the observer's replicant now receives the gimp level and its gait runs the wgr entry -> ggl limp cycle instead of sliding in a walk pose.
**Root cause -- the mech was erasing its own state 60 times a second.** In the binary the gimp level lives in `mech+0x40`, which IS `Simulation::simulationState` -- and that field rides the header of EVERY update record. So in 1995 a peer learned the level on every packet and limped for free; there is no gimp-specific replication in the binary because none was needed. The port carries that one cell as two members (graphicAlarm + the engine cell), and `Mech::PerformAndWatch` writes `SetMovementMode(1)` ("ground, non-death, non-airborne") **every frame** -- which erased the level as soon as it was mirrored in for the #78 voice. The wire carried 1, so bystanders walked while sliding at limp speed. The per-frame write now writes the authoritative level (`gimped ? 3/4 : 1`).
**The clue that cracked it was the field observation "after respawning a peer DID see the limp"** -- that proved the wire path worked and something local was clobbering the value, which pointed straight at the per-frame writer. Thanks SAURON/Elengil/epilectrik.
Two bonuses from the same fix: the "reverse disabled" announcement now fires **once per wound** instead of restarting on every damage tick, and the authentic leg-destroyed -> fall gate (`mechdmg`, MovementMode 3||4, [T1 task #60]) is live again after being dead while the cell was pinned at 1 -- so shooting a limping mech's bad leg off now puts it down.
Also documented (gotcha #25 + locomotion.md): zone damage levels replicate only when the EXPLOSION TABLE's damage tier is crossed -- measured a peer at 0.428 while the master was at 0.857 -- so peer-side damage state must never be inferred from replicated zone levels. Closing."""
call("POST", "/issues/82/comments", {"body": BODY})
call("PATCH", "/issues/82", {"state": "closed"})
print("#82 commented + closed")