Document the prebuilt Windows release and ship it without a descriptor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
vtroc7
2026-10-02 16:23:31 +03:00
parent 3694c35041
commit 3adb14b5ba
4 changed files with 30 additions and 10 deletions
+14 -3
View File
@@ -17,8 +17,19 @@ Explore maps, fight bots, and record and replay demos. Gameplay remains incomple
expect missing behavior, bugs and desyncs. The asset readers also cover MW3 and Black
Ops.
Build from source. APIs, configuration, caches and the wire protocol change between
commits; multiplayer peers must run the same commit.
APIs, configuration, caches and the wire protocol change between commits;
multiplayer peers must run the same build.
## Windows: prebuilt release
1. Download `iw4l-windows.zip` from [Releases](../../releases) and extract it into an
empty writable folder. The archive password is `contextrot`.
2. Next to `iw4l.exe`, add a Windows shortcut to your MW2 installation folder.
3. Launch `iw4l.exe`.
For online play, put the `.iw4l-server` file you received from a server operator next
to `iw4l.exe`. With it the game finds that master and updates itself on launch. Details:
[Windows guide](docs/WINDOWS.md).
## Build and run
@@ -26,7 +37,7 @@ Install Rust through rustup and GNU Make. [Build dependencies](docs/BUILD.md) co
Linux's C/C++ toolchain and system libraries, and macOS's Xcode command line tools.
[Windows instructions](docs/WINDOWS.md) cover building and arranging a portable folder.
You need your own installed MW2 Multiplayer data, including `common_mp.ff`. IW4L
You need your own installed MW2 Multiplayer data. IW4L
distributes no game assets and reads installations without patching or replacing their
files. Caches, demos and logs go under `iw4l-artifacts/`; Linux settings use a separate
configuration directory described in the [run guide](docs/RUN.md).
+1 -1
View File
@@ -79,7 +79,7 @@ make map mp_boneyard IW4L_MASTER_HOST_NAME='Friday match' IW4L_MASTER_MAX_PLAYER
```
Other players open `make menu` and select the room. Master networking needs
MW2 multiplayer data (`common_mp.ff`); it is disabled during demo replay.
MW2 multiplayer data; it is disabled during demo replay.
When a setting appears in more than one place:
+6 -3
View File
@@ -1,6 +1,9 @@
# Portable Windows folder
`make launcher windows` creates `dist/windows/iw4l-windows-{dev,prod}.zip`.
Players download `iw4l-windows.zip` from the GitHub release; it holds the executable
and licences. A server operator hands out the `.iw4l-server` descriptor separately.
`make release prod|dev` also writes `iw4l-windows-{dev,prod}.zip` with the descriptor
included, and `make launcher windows` writes the same pair under `dist/windows/`.
The archive password is `contextrot`. Extract into a dedicated writable folder:
```text
@@ -15,8 +18,8 @@ IW4L/
```
Add ordinary Windows shortcuts to installed title folders or executables.
MW2 multiplayer data (`zone/**/common_mp.ff`) is required for the menu;
BO1 and MW3 are optional. The runtime reads those installations.
MW2 multiplayer data is required for the menu; BO1 and MW3 are optional.
The runtime reads those installations.
Launch `iw4l.exe`. Before starting the game or contacting QUIC, it checks its
community's HTTPS manifest. An unchanged executable starts normally. An update
+9 -3
View File
@@ -399,7 +399,10 @@ pub fn prepare(root: &Path, env: &Env, channel: Channel, profile: &str) -> Res<P
player_archive(
&dest.join("client"),
&dest.join(format!("iw4l-windows-{channel}.zip")),
true,
)?;
// The GitHub download: the descriptor names the master, which stays private.
player_archive(&dest.join("client"), &dest.join("iw4l-windows.zip"), false)?;
println!("release.done path=dist/releases/{channel}/{release_id}");
Ok(dest)
}
@@ -439,14 +442,17 @@ pub fn bundles(root: &Path, env: &Env, profile: &str) -> Res<()> {
&community(channel, &host, &ca_cert)?,
)?;
let archive = out.join(format!("iw4l-windows-{channel}.zip"));
player_archive(&stage, &archive)?;
player_archive(&stage, &archive, true)?;
println!("[windows] {channel} archive: {}", archive.display());
}
Ok(())
}
fn player_archive(stage: &Path, archive: &Path) -> Res<()> {
let mut names = vec!["iw4l.exe", "community.iw4l-server"];
fn player_archive(stage: &Path, archive: &Path, descriptor: bool) -> Res<()> {
let mut names = vec!["iw4l.exe"];
if descriptor {
names.push("community.iw4l-server");
}
names.extend(LEGAL_FILES.iter().map(|(_, to)| *to));
let files = names
.into_iter()