#!/usr/bin/env python3 # Digest the instrumented zone-walk: per-zone level progressions on B (master), # replicant levels seen by A's armor watcher, and the per-hit damage economy. import re, sys, collections def rd(p): with open(p, 'rb') as f: return f.read().decode('utf-8', 'replace') a = rd(r'C:\git\bt411\content\zw_a.log') b = rd(r'C:\git\bt411\content\zw_b.log') # idx -> name from A's walk lines: zone N 'name' names = {} for m in re.finditer(r"zone (\d+) '([^']+)'", a): names[int(m.group(1))] = m.group(2) # B-side consumption: [dmghit] mech=E zone=N ... amt=X ... lvl P->Q zones = collections.defaultdict(lambda: {'hits': 0, 'amt': 0.0, 'first': None, 'last': 0.0}) hitlines = re.findall(r"\[dmghit\] mech=(\S+) zone=(\d+) vital=(\d+) type=(\d+) amt=([\d.eE+-]+) burst=(\d+) lvl ([\d.eE+-]+)->([\d.eE+-]+)", b) mechs = collections.Counter(m[0] for m in hitlines) victim = mechs.most_common(1)[0][0] if mechs else None for mech, zi, vital, typ, amt, burst, p, q in hitlines: if mech != victim: continue z = zones[int(zi)] z['hits'] += 1 z['amt'] += float(amt) if z['first'] is None: z['first'] = float(p) z['last'] = float(q) print(f"victim {victim}: {sum(z['hits'] for z in zones.values())} hits into {len(zones)} zones") print(f"{'zone':>4} {'name':<12} {'hits':>4} {'amt/hit':>8} {'lvl first->last':>18}") for zi in sorted(zones, key=lambda k: -zones[k]['last']): z = zones[zi] per = z['amt'] / z['hits'] if z['hits'] else 0 print(f"{zi:>4} {names.get(zi, '?'):<12} {z['hits']:>4} {per:>8.3f} {z['first']:>8.4f} -> {z['last']:<8.4f}") # A-side replicant levels: [armor] '' zone N level P -> Q arm = re.findall(r"\[armor\] '[^']*' zone (\d+) level ([\d.eE+-]+) -> ([\d.eE+-]+)", a) if arm: peak = collections.defaultdict(float) for zi, p, q in arm: peak[int(zi)] = max(peak[int(zi)], float(q)) print(f"\nA-side watcher: {len(arm)} level-change pushes; replicant peaks:") for zi in sorted(peak, key=lambda k: -peak[k])[:12]: print(f" zone {zi:>3} {names.get(zi, '?'):<12} peak {peak[zi]:.4f}") else: print("\nA-side watcher: NO level-change pushes (replicant levels never moved)") # zone-repl confirmations on A zr = re.findall(r"\[zone-repl\] zone (\d+) '([^']+)' lvl ([\d.eE+-]+)->([\d.eE+-]+)", a) print(f"\n[zone-repl] on A: {len(zr)} lines") for zi, nm, p, q in zr[:8]: print(f" zone {zi} {nm} {p}->{q}")