Oilspill calls down thumpers, Calldown calls down a Firefall server.
tl;dr: Check out PIN, RIN.WebAPI and SDBrowser next to this repo, start Docker, then run aspire run in this folder.
Once everything is green in the dashboard, run "Create account" on rin-webapi, "Configure client" on firefall, and start firefall.
Calldown is an Aspire AppHost that runs the whole stack with one command:
postgreswith pgweb, running in Docker with a persistent volumedb-setup, which applies RIN'swebapi_schema.sqland seed data, then imports the client'sclientdb.sd2into thesdbschemarin-internalandrin-webapicollision-cache, which pre-generates the collision data with PIN'sCollisionGeneratorpin-gameserverandpin-matrixfirefall, the game client itself, which only starts when you tell it to
The resources wait on each other in that order. So the Matrix server only hands out clients once the game server says, that it's ready.
- .NET 10 SDK (the AppHost), plus the .NET 8 and 9 runtimes for RIN and PIN
- An ASP.NET Core development certificate, i.e.
dotnet dev-certs httpsonce - Docker or a compatible runtime for Postgres. On Windows, Rancher Desktop works well, while Podman 6 has issues with published ports on WSL
- A Firefall 1962 client install - Calldown finds it through the
firefall://handler or your Steam libraries - Write access to the install folder, "Configure client" edits
firefall.iniand patchesFirefallClient.exeto bypass RedHanded - The Aspire CLI is optional but handy:
dotnet tool install -g Aspire.Cli
The repos are expected as siblings:
TMW/
Calldown/
PIN/
RIN.WebAPI/
SDBrowser/
If yours live elsewhere, set the MSBuild properties PinRoot, RinRoot and SDBrowserRoot, e.g. with dotnet build -p:PinRoot=D:\code\PIN\.
aspire run
dotnet run --project src/Calldown.AppHost or F5 in Rider/Visual Studio work just as well.
The first start takes a bit longer:
- The SDB import takes about 20s
- The collision cache for zone 448 about a minute and 5.6 GB in
%LocalAppData%\Calldown\collision
Every later start skips both, as long as the client files haven't changed.
Set them in the AppHost's user secrets, e.g. aspire secret set Parameters:zone-id 1030 or dotnet user-secrets set Parameters:zone-id 1030 --project src/Calldown.AppHost.
| Parameter | Default | |
|---|---|---|
firefall-path |
detected install | Folder that contains system\ and firefall.ini |
zone-id |
448 |
Default zone for characters without a last zone; the collision cache is built for it |
preload-zones |
1030 |
Comma separated zones hosted from startup. Other zones load on first use, and their collision cache is built then |
collision |
zone+assets |
off, zone or zone+assets. Changing it needs an AppHost restart |
pg-user |
tmwadmin |
Has to stay tmwadmin, RIN's schema assigns everything to that role |
streaming-assets-path |
%LocalAppData%\Calldown\streaming-assets |
Drop folder RIN serves in place of dl.firefall.com, see Streaming Assets |
| Resource | Command | |
|---|---|---|
firefall |
Configure client | Sets OperatorHost in firefall.ini to https://localhost:5001, streams assets from RIN instead of dl.firefall.com and patches FirefallClient.exe to bypass RedHanded, keeps the originals with a .calldown.bak suffix |
firefall |
Client options | Screen mode and a key to leave a vehicle |
firefall |
Restore client | Puts the backups back, the unpatched client included |
rin-webapi |
Create account | Registers an account with email, password and country |
db-setup |
Re-import SDB | Imports clientdb.sd2 again |
db-setup |
Reset database | Drops everything, accounts and characters included, and sets it up from scratch |
collision-cache |
Rebuild collision cache | Regenerates the cache even if it looks current |
All of them also work from the terminal, e.g. aspire resource rin-webapi create-account --email me@example.com --password hunter22 --country US.
The installer didn't ship everything, the client streamed the rest from dl.firefall.com with HTTP range requests:
- the three finest levels of the virtual texture (
system\vt\static.vtex0to2, about 25 GB), streamed only where the install lacks them - the dialogue media banks listed in
dbsounddata::SoundStreamingAsset, the client has no other source for those voice lines
RIN serves the streaming-assets-path folder at https://localhost:5001/dl, and "Configure client" points VTRemotePath and AssetStreamPath in firefall.ini at it. Drop the files in with this layout:
streaming-assets\
vtex\static.vtex0 any level the install lacks, the files as they are in system\vt
AssetStream\00180000\00180091.bnk media banks, <id rounded down to 1000, 8 digits>\<id, 8 digits>.bnk
AssetStream\00180000\00180091.bnk_ac for a partial bank, the ranges it holds
ingame\panelmanager.html the in-game web UI page, served at /ingame/panelmanager
ingame\assets\... its scripts, styles, fonts and the item icons, served at /ingame/assets
The client reads the offsets from its own static.vtex_idx and from the _Event banks, so the files have to be the ones of build 1962. A missing file is a 404.
No complete copy of the dialogue banks is known. The banks merged from the player caches in the library hold about a third of 1962's voice lines, each with a .bnk_ac in the client cache's format. RIN answers requests outside those ranges with a 404, so the client never gets the gaps as audio. Firefall-Client-Cache.md in the workspace root describes the caches and the merge.
The client also loads its web UI, the panel manager, from RIN's /ingame host. The ingame folder holds the 1962 page from the library's browser caches, with the New Relic tracking removed and its urls moved under /ingame, and the assets of the library's 2016 crawl of the in-game host. The page's panels call /ingame/api/..., which RIN mostly doesn't implement yet.
| Port | |
|---|---|
| 5000 / 5001 | RIN.WebAPI (http / https), the client's OperatorHost |
| 5201 | RIN.InternalAPI, gRPC over cleartext HTTP/2 |
| 25000 / 25001 | Matrix and game server, UDP |
| 25080 / 25081 | Health endpoints of the Matrix and game server |