Files
TeslaRel410/restoration/audit.py
T
CydandClaude Fable 5 326d29b72a Extract all recoverable Division scenes; add Scene Archive gallery
Cracks the DIV-BIZ2 binary format (BGF/BMF) using Division's own
reader source (DPL3/BIZREAD.C) as reference: block stream, 14 vertex
layouts, pmesh/strip connectivity, LOD nesting, embedded materials.
Adds SVT raw-texture decoding, 1995-dialect VGF support (implicit
CONNECTION_LIST, header SCALE), and a whole-drive scene audit.

108 of 241 scenes on the Glaze drive are recoverable; 26 are curated
into restoration/vwe-archive.html, a self-contained WebGL gallery:
Star Trek, Hull Pressure, BattleTech (incl. the polar-map mech
lineup), Red Planet's Mars-canal raceway, and the Canyon demos.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 18:03:12 -05:00

67 lines
2.7 KiB
Python

"""Audit every .SCN on the drive: which geometry does it need, and in what form
(VGF text / BGF binary / missing) does that geometry survive?"""
import os, re, sys
from collections import defaultdict
SDA4 = r"c:\VWE\TeslaRel410\sda4"
# index every VGF/BGF/VMF/BMF/TGA on the drive by lowercase basename
index = defaultdict(list)
for root, dirs, files in os.walk(SDA4):
dirs[:] = [d for d in dirs if d.upper() not in ("EDITBACK", "RECYCLED")]
for f in files:
base, ext = os.path.splitext(f.lower())
if ext in (".vgf", ".bgf", ".vmf", ".bmf", ".tga", ".spl", ".bsl"):
index[(base, ext)].append(os.path.join(root, f))
def parse_scene_refs(path):
geos, mats, spls = [], set(), []
geodir = matdir = None
for raw in open(path, errors="replace"):
line = raw.split("//")[0].split("#")[0].strip()
if not line: continue
t = line.split()
k = t[0].upper()
try:
if k == "GEOMETRY": geodir = t[1]
elif k == "MATERIAL": matdir = t[1]
elif k in ("STATIC", "SCHILD", "DCHILD"):
geos.append(t[1].lower())
elif k == "DYNAMIC":
geos.append(t[1].lower())
spls.append(os.path.basename(t[3].replace("\\", "/")).lower())
elif k == "MORPH":
geos.append(t[1].lower())
except IndexError:
pass
return geos, spls, geodir, matdir
scenes = []
for root, dirs, files in os.walk(SDA4):
dirs[:] = [d for d in dirs if d.upper() not in ("EDITBACK", "RECYCLED")]
for f in files:
if f.lower().endswith(".scn"):
scenes.append(os.path.join(root, f))
report = []
for s in sorted(scenes):
geos, spls, geodir, matdir = parse_scene_refs(s)
if not geos: continue
uniq = sorted(set(g.split(":")[0] for g in geos))
n_vgf = sum(1 for g in uniq if (g, ".vgf") in index)
n_bgf = sum(1 for g in uniq if (g, ".bgf") in index and (g, ".vgf") not in index)
n_missing = len(uniq) - n_vgf - n_bgf
spl_missing = sum(1 for x in set(spls) if (os.path.splitext(x)[0], ".spl") not in index)
rel = os.path.relpath(s, SDA4)
report.append((rel, len(uniq), n_vgf, n_bgf, n_missing, spl_missing))
print(f"{'scene':<44} {'geo':>3} {'vgf':>3} {'bgf':>3} {'mis':>3} {'spl-':>4}")
full, partial, locked = 0, 0, 0
for rel, n, v, b, m, sm in report:
tag = "FULL-VGF" if v == n else ("HAS-BGF" if m == 0 else "MISSING")
if v == n: full += 1
elif m == 0: locked += 1
else: partial += 1
print(f"{rel:<44} {n:>3} {v:>3} {b:>3} {m:>3} {sm:>4} {tag}")
print(f"\n{len(report)} scenes with geometry: {full} fully VGF, {locked} need BGF, {partial} have missing geometry")