mkdist: redist runtime DLLs + versioned tester README

The first zips (pre-mkdist) shipped d3dx9_43.dll / msvcp140.dll /
vcruntime140.dll next to the exe -- testers without the VC++ / DirectX
redistributables cannot load the exe otherwise.  mkdist missed them (the
clean-extract boot test passed only because this machine has them system-
wide).  Carried into redist/ (recovered from BT411_4.11.341.zip) and
packaged next to the exe.

Also: players/README.txt -- the tester instructions (updated for the
unified build: one exe, clickable cockpit surround, trigger-config regroup,
the settled keymap, play_steam.bat) -- stamped with the version and placed
at the zip root, matching the original zips' shape.

Clean-extract verified on BT411_4.11.435.zip: root has README + 4 bats,
exe dir carries all 4 DLLs, glass-profile boot simulates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-21 10:32:11 -05:00
co-authored by Claude Opus 4.8
parent 10ed66bd7c
commit dd74d13120
5 changed files with 53 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
BattleTech {VERSION} -- multiplayer client
==========================================
IMPORTANT: FULLY EXTRACT this zip first (right-click - Extract All).
Do NOT run anything from inside the zip. The .bat files must sit next
to the 'content' and 'build' folders.
TO JOIN AN INTERNET GAME: double-click join.bat
(waits for the operator's session if it's not up yet)
TO JOIN A LAN GAME: double-click join_lan.bat (operator's LAN)
SINGLE-PLAYER PRACTICE: double-click play_solo.bat (no network)
STEAM INTERNET PLAY: double-click play_steam.bat (EXPERIMENTAL --
needs the Steam client running; host or join from the menu)
Your seat and mech are assigned automatically by the operator.
If the game closes unexpectedly, send the operator content\join.log.
You start INSIDE the cockpit with the pod's MFD panels composited
around the view (one window). The red MFD buttons, radar rails and
joystick buttons are all MOUSE-CLICKABLE -- right-click a button to
latch it held. Press V any time to toggle the external camera.
CONTROLS (keyboard):
W/S or Up/Down ....... throttle lever X / NumPad5 ... all stop
A/D or Left/Right .... turn pedals Alt ........... reverse thrust
Q/E .................. torso twist R/F ........... torso aim
NumPad 8/2/4/6 ....... torso aim/twist (alt) Shift ......... throttle up
1 or Space ........... main trigger 2 ............. middle thumb
3 or Ctrl ............ upper thumb (missiles) 4 ............ pinky
V view | B look-behind | M control mode | N schematic | J/K/L MFD pages
G (hold) + fire key .. regroup a weapon onto that trigger -- or hold a
weapon panel's red PROGRAM button with the mouse and tap a fire key;
the joystick diagram on the panel shows the binding live.
An Xbox controller works out of the box. Rebind keys in
content\bindings.txt (regenerates with defaults if deleted).
This build: {VERSION}. Private -- do not redistribute.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+15
View File
@@ -66,8 +66,20 @@ def main():
if f.lower().endswith(".dll"):
exes.append(d + "/" + f)
# System runtime DLLs the exe needs on a bare tester machine (32-bit
# d3dx9 + MSVC runtimes -- carried in redist/, shipped next to the exe;
# the first zips included them and machines without the redists fail
# to load the exe otherwise).
redist = ["redist/" + f for f in sorted(os.listdir("redist"))
if f.lower().endswith(".dll")] if os.path.isdir("redist") else []
total = 0
with zipfile.ZipFile(zpath, "w", zipfile.ZIP_DEFLATED, compresslevel=6) as z:
# versioned tester README at the zip root
if os.path.exists("players/README.txt"):
readme = open("players/README.txt", encoding="utf-8").read()
readme = readme.replace("{VERSION}", name.replace("BT411_", ""))
z.writestr(name + "/README.txt", readme)
for p in bats: # bats at the zip ROOT (next to
arc = os.path.basename(p) # content\ + build\, per the guard)
z.write(p, name + "/" + arc)
@@ -75,6 +87,9 @@ def main():
for p in exes:
z.write(p, name + "/" + p)
total += os.path.getsize(p)
for p in redist: # next to the exe
z.write(p, name + "/build/Release/" + os.path.basename(p))
total += os.path.getsize(p)
for p in tracked:
if not os.path.exists(p):
print(" (skipping tracked-but-absent: %s)" % p)