39 lines
2.9 KiB
Python
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")
|