"""Fast per-class live count: search ONE definition pointer, dedup by position.""" import sys, os, struct, time sys.path.insert(0, '/tmp/rc') import gmem, gworld, entities2 as E w = gworld.World() defs = E.definitions(w) want = {nm: pat for pat, nm in defs.items() if nm in ('UN_e010_ADAN_Attacker_S', 'UN_e007_ADAN_Turret')} lo, hi = gmem.va_to_off(E.ENT_VA_LO), gmem.va_to_off(E.ENT_VA_HI) def count(pat): seen = set() for a, b in gmem.extents(w.fd, w.size): a, b = max(a, lo), min(b, hi) if b <= a: continue blob = os.pread(w.fd, b - a, a); i = 0 while True: j = blob.find(pat, i) if j < 0: break off = a + j if off % 4 == 0: p = off - 0x130 d = os.pread(w.fd, 12, p) if len(d) == 12: seen.add(struct.unpack('>fff', d)) i = j + 4 return len(seen) for n in range(int(sys.argv[1])): row = ' '.join('%s=%d' % (k.split('_')[1], count(v)) for k, v in sorted(want.items())) print('%2d %s' % (n, row), flush=True) time.sleep(float(sys.argv[2]))