"""#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")