- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
65 lines
2.5 KiB
Python
65 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
backdate.py -- mechanically back-date a WinTesla-era engine header (BT411/BT412
|
|
engine/MUNGA*/X.h) to its 1995 form (source410/MUNGA/X.HPP).
|
|
|
|
Transforms (the mechanical part -- ALWAYS eyeball the result and write the
|
|
.NOTES.md sidecar; content drift is NOT detected here):
|
|
#pragma once -> #if !defined(X_HPP) / #define X_HPP ... #endif
|
|
#include "y.h" -> guarded #if !defined(Y_HPP) #include <y.hpp> #endif
|
|
(system includes like <string.h> are left alone)
|
|
|
|
Usage: py -3 backdate.py <donor.h> <OUTPUT.HPP>
|
|
"""
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
def main():
|
|
donor, out = sys.argv[1], sys.argv[2]
|
|
name = os.path.splitext(os.path.basename(out))[0].upper()
|
|
guard = "%s_HPP" % name
|
|
body = open(donor, "r", errors="replace").read().splitlines()
|
|
res = []
|
|
warned = set()
|
|
for line in body:
|
|
s = line.strip()
|
|
if s == "#pragma once":
|
|
continue
|
|
# local include, possibly with a relative path -- keep the basename
|
|
m = re.match(r'#include\s+"(?:[.\\/A-Za-z0-9_]*[\\/])?([A-Za-z0-9_]+)\.h(?:pp)?"', s)
|
|
if m:
|
|
inc = m.group(1).lower()
|
|
g = inc.upper() + "_HPP"
|
|
res.append("#\tif !defined(%s)" % g)
|
|
res.append("#\t\tinclude <%s.hpp>" % inc)
|
|
res.append("#\tendif")
|
|
continue
|
|
# post-1994 C++ the 4.52 compiler rejects: de-modernize
|
|
line = re.sub(r"\bstd::", "", line)
|
|
line = re.sub(r"\btrue\b", "True", line)
|
|
line = re.sub(r"\bfalse\b", "False", line)
|
|
line = re.sub(r"\bbool\b", "Logical", line)
|
|
for bad in ("<ostream>",):
|
|
if bad in line:
|
|
line = None
|
|
break
|
|
if line is None:
|
|
continue
|
|
for marker in ("namespace", "static_cast", "reinterpret_cast", "const_cast"):
|
|
if marker in s and marker not in warned:
|
|
warned.add(marker)
|
|
print("WARNING: post-1994 construct '%s' present -- fix by hand" % marker)
|
|
res.append(line)
|
|
# strip leading blank lines
|
|
while res and not res[0].strip():
|
|
res.pop(0)
|
|
with open(out, "w", newline="\r\n") as f:
|
|
f.write("#if !defined(%s)\n#\tdefine %s\n\n" % (guard, guard))
|
|
f.write("\n".join(res))
|
|
f.write("\n\n#endif\n")
|
|
print("wrote %s (%d lines from %s)" % (out, len(res) + 5, donor))
|
|
|
|
if __name__ == "__main__":
|
|
main()
|