Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
cdfee2a
minimap: a native-rendered in-game minimap for big maps (minimap=1, o…
silver2127 Sep 16, 2026
def3884
Port Windows dev cdfee2a to Linux
silver2127 Sep 16, 2026
d99c054
minimap: company colours and names from the multiplayer mod's map
silver2127 Sep 17, 2026
462c9eb
Port Windows dev d99c054 to Linux
silver2127 Sep 17, 2026
6121934
pager: terrain_dedup_probe -- count byte-identical live tiles (measur…
silver2127 Sep 17, 2026
a75f83e
pager: content dedup of the two CTerrain versions (terrain_dedup), pl…
silver2127 Sep 17, 2026
ae3027e
docs: terrain_dedup measured in the game (LONGMAPSAVE load: 21% of ev…
silver2127 Sep 17, 2026
4b39aad
pager: steady-state budget follows the working set instead of snappin…
silver2127 Sep 17, 2026
a0805be
pager: wait for a section at the commit limit, cap evictions per seco…
silver2127 Sep 17, 2026
5271b75
pager: leave the engine half of free memory (8 GiB floor) while loadi…
silver2127 Sep 17, 2026
48946d2
pager: 12 GiB reserve floor for the engine while loading
silver2127 Sep 17, 2026
c4aa846
pager: only a tight commit charge lifts the eviction rate cap
silver2127 Sep 17, 2026
09fd641
pager: adaptive eviction rate from measured cost and gameplay frame s…
silver2127 Sep 17, 2026
35317e7
pager: the adaptive eviction rate remembers its measured cost across …
silver2127 Sep 17, 2026
101d36e
travel_time_limit_s / cargo_path_time_s: the urbansim's 20 and 100 mi…
silver2127 Sep 17, 2026
9431584
pager: lazy zero tiles -- a fresh allocation gets its section on the …
silver2127 Sep 17, 2026
8f4e6a9
pager: the alignment pass's per-tile blocks and result vectors go thr…
silver2127 Sep 17, 2026
52ede02
pager: backpressure while the commit charge is tight; block counters …
silver2127 Sep 17, 2026
cce148a
terrain_blocks: log the callers of one-tile block constructions and c…
silver2127 Sep 17, 2026
0d2c47e
small pager: the alignment pass's per-region vectors in page-granular…
silver2127 Sep 17, 2026
b528366
small pager: fixed budget, no loading allowance (it kept 26.7 GiB of …
silver2127 Sep 17, 2026
c76db05
alignment_batch_tiles: the terrain alignment update runs in batches o…
silver2127 Sep 17, 2026
30cb13a
alignment batch: the dirty set's entries are blocks with a vector of …
silver2127 Sep 17, 2026
bd0d85f
docs: the load-time memory spike and its batching fix (alignment-batc…
silver2127 Sep 17, 2026
dc7264d
alignment batch: log the pass's wall time and expose the pass's CTerr…
silver2127 Sep 17, 2026
915aec1
test_alignment_batch: a real system object for the detour's CTerrain …
silver2127 Sep 17, 2026
e62e43b
terrain sidecar: file format, grid walk and codec for reusing a save'…
silver2127 Sep 17, 2026
0511bb5
terrain sidecar: streaming per-tile load API for the alignment pass t…
silver2127 Sep 17, 2026
96340f9
terrain sidecar: RecordIndex/IndexOfRecord helpers matching the engin…
silver2127 Sep 17, 2026
1c3c713
docs(sidecar): record the save-path/fingerprint mechanism and why bas…
silver2127 Sep 17, 2026
059f2f1
terrain sidecar: fix the tile layout -- record+8 is a control block, …
silver2127 Sep 17, 2026
5bf8aaf
terrain sidecar: serve a loaded sidecar's tiles at CTerrain::AddTile …
silver2127 Sep 18, 2026
da9d033
terrain sidecar: fingerprint, arm/begin/end glue and WriteForSave
silver2127 Sep 18, 2026
8e42635
terrain sidecar: arm at the first AddTile of the load, release at the…
silver2127 Sep 18, 2026
ff2fd60
terrain sidecar: BeginApply indexes without decoding, to avoid stalli…
silver2127 Sep 18, 2026
4d696f3
docs(sidecar): one image serves both CTerrain versions (they are byte…
silver2127 Sep 18, 2026
f7c6395
release 0.5.0: the load-time memory spike batched away, in-game minim…
silver2127 Sep 18, 2026
585921b
release 0.5.1: pager headroom sized to the machine; a full pager no l…
silver2127 Sep 18, 2026
a448c32
release 0.5.2: the minimap ships on (minimap=1)
silver2127 Sep 18, 2026
2d03251
pagers: the commit-tight throttle keeps hysteresis, and the resident …
silver2127 Sep 20, 2026
7407127
pagers: simulate_physical_mb (rig-only) makes the policy see a smalle…
silver2127 Sep 20, 2026
ce3feb7
pagers: the automatic cap is a quarter of RAM clamped to 4..8 GiB -- …
silver2127 Sep 20, 2026
24a020a
pagers: the steady policy keeps a working-set floor instead of drifti…
silver2127 Sep 20, 2026
26bced4
ci: build the MSI and a draft release on GitHub Actions
silver2127 Sep 20, 2026
5ca9f16
README: the memory section describes the pagers as shipped -- sizing,…
silver2127 Sep 20, 2026
3a642d1
octree: the GOG build degrades depths 12 and 13 to the depth-11 root …
Sep 21, 2026
ce4fabc
installer: the GOG package installs from a double-click, and it valid…
Sep 21, 2026
3ce79c3
installer: version 0.5.3
Sep 21, 2026
4fa9917
installer: drop the GOG registry folder search
Sep 21, 2026
3e20ce3
release 0.5.3: the installer finds the game on any drive; the shared …
Sep 21, 2026
8950338
README: GOG is supported, and the depth 12/13 fallback is the reason …
Sep 21, 2026
757d35d
ci: build on main, tags and by hand only; every .md ignored; one buil…
Sep 21, 2026
7053712
terrain sidecar: written at SaveGame and armed at LoadGame -- the hal…
silver2127 Sep 22, 2026
80a6c63
terrain sidecar: capture the LIVE CTerrain at save time, not the alig…
silver2127 Sep 22, 2026
3c9fc62
terrain sidecar: the tile's height vector IS the shared_ptr's object …
silver2127 Sep 22, 2026
9180629
pagers: the commit throttle sleeps faults only while a world is loading
silver2127 Sep 22, 2026
49c37a6
Port Windows dev bd0d85f to Linux
silver2127 Sep 22, 2026
152c7cb
Port Windows dev 26bced4 to Linux
silver2127 Sep 22, 2026
cb938d1
Port Windows dev 9180629 to Linux
silver2127 Sep 22, 2026
c7e8e30
bigmap: one build, one installer -- Big Maps ships in the TpF2 Multip…
silver2127 Sep 22, 2026
45dd855
bigmap sidecar: an autosave keeps its sidecar (the engine's file, not…
silver2127 Sep 22, 2026
a2756cc
bigmap: terrain compression ON by default on native Linux, for everyo…
silver2127 Sep 23, 2026
e19eec1
bigmap docs: the Linux terrain pager thrashes a running big map (rece…
silver2127 Sep 23, 2026
9f6a3e2
octree: the GOG build degrades depths 12 and 13 to the depth-11 root …
Sep 21, 2026
9cba049
bigmap build.bat: the -deploy check never closes a block early on a (…
silver2127 Sep 23, 2026
926113b
Merge PR #5 from Kalemillion: Support GOG build for 0.5.2
silver2127 Sep 23, 2026
1c6fccc
Merge Kalemillion's GOG support (tpf2-bigmap PR #5) into bigmap/
silver2127 Sep 23, 2026
eae2e8d
Port Windows dev 926113b to Linux
silver2127 Sep 23, 2026
2e2abe5
bigmap docs: octree depths 12/13 are tested in play and work fine
silver2127 Sep 23, 2026
4ef7656
bigmap: README lists every performance optimization and how it works
silver2127 Sep 23, 2026
26b4ca3
bigmap: mirror bigmap/ into the standalone tpf2-bigmap repo on every …
silver2127 Sep 23, 2026
b755f65
bigmap: the terrain sidecar is released once, under a lock (crash rel…
silver2127 Sep 26, 2026
11ea525
Port Windows dev b755f65 to Linux
silver2127 Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions .github/workflows/build-msi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# Builds TpF2BigMaps.msi the way a release does: installer\build_msi.ps1
# (build.bat -> out\tpf2_bigmap.dll, the vendored shared binaries, wix build,
# then an administrative-install validation). A push to main, a v* tag or a manual run
# gets the MSI and its checksum as an artifact; a v* tag also gets a draft GitHub
# release with them attached. Nothing builds on dev or pull requests.
#
# build.bat finds the runner's Visual Studio through vswhere, so no Build Tools
# path is assumed. WiX v7 is installed as a .NET global tool; passing
# -AcceptWixEula means the repository owner accepts the WiX Open Source
# Maintenance Fee terms (https://wixtoolset.org/osmf/) for CI builds.
#
# The runner has no tpf2-multiplayer checkout beside this one, so the script's
# own PluginHost.wxs drift check would be skipped; the "Shared fragment" step
# fetches the multiplayer copy at the release recorded in vendor\VENDORED.md
# and compares it instead (line endings aside, like the script does).
name: Build MSI

on:
push:
branches: [main]
tags: ['v*']
# docs and every Markdown file, release notes included, change no byte of the
# package. A release commit always touches installer/VERSION, so a tag is
# never filtered out by this.
paths-ignore: ['docs/**', '**/*.md']
workflow_dispatch:

permissions:
contents: write # release upload on tags; read-only is enough for everything else

concurrency:
group: msi-${{ github.ref }}
cancel-in-progress: true

jobs:
# ONE BUILD PER RELEASE. A release is a tag on a commit that main is then
# fast-forwarded to; both pushes would build the same bytes. The tag goes up
# first (tools/ci_run.py, the release recipe), so a main push finds its tag's
# run here and steps aside. A main push nobody tagged still builds.
check:
runs-on: ubuntu-latest
outputs:
skip: ${{ steps.dup.outputs.skip }}
steps:
- id: dup
env:
GH_TOKEN: ${{ github.token }}
run: |
skip=false
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
tag=$(gh api "repos/${{ github.repository }}/actions/runs?head_sha=${{ github.sha }}&per_page=30" \
--jq '[.workflow_runs[] | select(.event == "push" and (.head_branch | startswith("v")) and (.id != ${{ github.run_id }}))] | .[0].head_branch // empty')
if [ -n "$tag" ]; then skip=true; echo "commit ${{ github.sha }} is release $tag: its tag run builds it"; fi
fi
echo "skip=$skip" >> "$GITHUB_OUTPUT"

msi:
needs: check
if: needs.check.outputs.skip != 'true'
runs-on: windows-2022
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- name: Version
id: version
shell: pwsh
run: |
$v = (Get-Content installer\VERSION -Raw).Trim()
if ($v -notmatch '^\d+\.\d+\.\d+$') { throw "installer\VERSION is not a three-part version: '$v'" }
"version=$v" >> $env:GITHUB_OUTPUT
$ref = "${{ github.ref }}"
if ($ref -like 'refs/tags/v*' -and $ref -ne "refs/tags/v$v") {
throw "tag $ref does not match installer\VERSION ($v): bump VERSION before tagging"
}
"installer\VERSION = $v"

- name: Shared fragment matches the vendored multiplayer release
shell: pwsh
run: |
$rel = (Select-String -Path installer\vendor\VENDORED.md -Pattern '^source release:\s*(v\S+)').Matches[0].Groups[1].Value
if (-not $rel) { throw "installer\vendor\VENDORED.md names no source release" }
$url = "https://raw.githubusercontent.com/silver2127/tpf2-multiplayer/$rel/installer/PluginHost.wxs"
"comparing installer\PluginHost.wxs with $url"
$theirs = (Invoke-WebRequest -Uri $url -UseBasicParsing).Content -replace "`r`n", "`n"
$ours = [IO.File]::ReadAllText("installer\PluginHost.wxs") -replace "`r`n", "`n"
if ($ours -cne $theirs) { throw "installer\PluginHost.wxs differs from the tpf2-multiplayer copy at $rel -- the two packages must share it" }
"PluginHost.wxs matches tpf2-multiplayer $rel"

- uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'

- name: WiX Toolset v7
run: |
dotnet tool install --global wix
wix --version

- name: Build the MSI
run: powershell -ExecutionPolicy Bypass -File installer\build_msi.ps1 -AcceptWixEula -Validate

- name: Checksums
shell: pwsh
working-directory: installer/out
run: |
$msi = "TpF2BigMaps-${{ steps.version.outputs.version }}.msi"
Get-FileHash $msi -Algorithm SHA256 |
ForEach-Object { "{0} {1}" -f $_.Hash.ToLower(), (Split-Path $_.Path -Leaf) } |
Set-Content SHA256SUMS.txt -Encoding ascii
Get-Content SHA256SUMS.txt

- uses: actions/upload-artifact@v4
with:
name: TpF2BigMaps-${{ github.sha }}
path: |
installer/out/TpF2BigMaps-${{ steps.version.outputs.version }}.msi
installer/out/SHA256SUMS.txt
if-no-files-found: error

- name: Release
if: startsWith(github.ref, 'refs/tags/v')
uses: softprops/action-gh-release@v2
with:
files: |
installer/out/TpF2BigMaps-${{ steps.version.outputs.version }}.msi
installer/out/SHA256SUMS.txt
draft: true
generate_release_notes: true
Loading