Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
4afb596
Disable global audio muffling when reverb is false
WhiteI3ulL Oct 10, 2026
39fcfda
feat: resampler linear mode
WhiteI3ulL Oct 10, 2026
0f3ceb9
refactor: worked on comments a little bit more
WhiteI3ulL Oct 10, 2026
adba55a
New to github pulls, not sure if its correct, but i added arguments t…
GalaxyMinus Oct 12, 2026
521c44f
Keep screen fog on the canopy when the field of view is widened.
innerhat-dev Oct 13, 2026
d9669f6
The guest's assembly conversion keeps string literals byte for byte
startupfoundry Oct 14, 2026
9c70f5f
Voice chat: a packet that is not one 20 ms frame is dropped before de…
startupfoundry Oct 14, 2026
e23b5ad
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
7197c38
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
beeab3d
merging old and new database
GalaxyMinus Oct 12, 2026
6aa6c1a
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
a0b059e
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
4894e5c
new fixes
GalaxyMinus Oct 14, 2026
c0c90e0
Merge branch 'main' of https://github.com/GalaxyMinus/OpenCE
GalaxyMinus Oct 14, 2026
399693b
Update README.md
GalaxyMinus Oct 14, 2026
ce5c1fe
Merge remote-tracking branch 'upstream/main'
GalaxyMinus Oct 15, 2026
e5e97c0
Carry a vehicle no player drives along the host's positions.
innerhat-dev Oct 15, 2026
7cf24ae
Stop carrying an unsteered vehicle once the host says it has stopped.
innerhat-dev Oct 15, 2026
4301ca8
Restore the main menu when leaving the postgame host screen
chestahh Oct 16, 2026
085676d
Merge pull request #346 from startupfoundry/arm64-guest-strings
bnunu Oct 16, 2026
5e228ea
Restore pause menu artwork, timer digits and multiplayer menu spacing
chestahh Oct 16, 2026
f90d955
Merge pull request #374 from chestahh/opence-multiplayer-menu-fix
bnunu Oct 16, 2026
adccd47
Restore online pause gradients and campaign Settings
chestahh Oct 16, 2026
f8b3eec
Complete the high-resolution Xbox HUD
chestahh Oct 16, 2026
e7d334c
Match the legacy size and spacing of gameplay button glyphs
chestahh Oct 16, 2026
4773c35
Add Classic and Gems high-resolution HUD button styles (#380)
chestahh Oct 16, 2026
f80bd15
Add supplied Xbox Gems and retain Menu Gems as a third style (#380)
chestahh Oct 16, 2026
c794406
Restore authored opacity for high-resolution HUD buttons (#380)
chestahh Oct 16, 2026
2c849ca
Merge pull request #380 from chestahh/opence-hud-fixes
bnunu Oct 16, 2026
17a4c84
Merge pull request #326 from innerhat-dev/screen-fog-fov-testing
bnunu Oct 16, 2026
5f4beed
Match high-resolution controller glyphs to the Xbox HUD
chestahh Oct 16, 2026
19d84ce
Merge pull request #383 from chestahh/opence-hud-fixes-2
bnunu Oct 16, 2026
6b214c6
added reference to AUR version to the README
lukerb52 Oct 16, 2026
c54185c
punctuation
lukerb52 Oct 16, 2026
b9e393c
Apply high-resolution HUD and text settings without reloading maps
chestahh Oct 16, 2026
a5e6102
Merge pull request #372 from innerhat-dev/unsteered-vehicle-path
bnunu Oct 16, 2026
25697bb
Merge pull request #378 from chestahh/opence-ui-fixes
bnunu Oct 16, 2026
7c942e9
Merge pull request #384 from lukerb52/main
GuvenHuso Oct 16, 2026
23d20b9
merging old and new database
GalaxyMinus Oct 12, 2026
be649ab
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
7a55338
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
9c9df8e
new fixes
GalaxyMinus Oct 14, 2026
866297f
solve conflicts
GalaxyMinus Oct 12, 2026
46d45dd
etc
GalaxyMinus Oct 14, 2026
1e00d96
Update README.md
GalaxyMinus Oct 14, 2026
845a2bc
new fixes
GalaxyMinus Oct 17, 2026
c7e41c4
new fixes
GalaxyMinus Oct 17, 2026
7635341
Merge branch 'main' of https://github.com/GalaxyMinus/OpenCE
GalaxyMinus Oct 17, 2026
dd16971
Add client-side mods with a Mods menu, load order and incompatibility…
cybersecurity Oct 17, 2026
54c2d31
Show the Mods list as a resource pack list, the top mod winning
cybersecurity Oct 17, 2026
7059096
Merge main into testing, bringing in the pause menu and HUD fixes of …
cybersecurity Oct 17, 2026
01797c0
Merge pull request #388 from OpenCommunityEdition/testing
cybersecurity Oct 17, 2026
9a8382f
Let mods replace models whose nodes, markers and regions match the map's
cybersecurity Oct 17, 2026
af07c05
Say which shaders a mod's models can be drawn with
cybersecurity Oct 17, 2026
b718ad8
Merge pull request #245 from WhiteI3ulL/resampler-linear-interpolation
cybersecurity Oct 17, 2026
5a1b8a4
Set the resampler from a Sound Processing screen of Audio Setup (#245)
cybersecurity Oct 17, 2026
7524ba6
Merge pull request #391 from OpenCommunityEdition/testing
cybersecurity Oct 17, 2026
c447edb
merging old and new database
GalaxyMinus Oct 12, 2026
377dce8
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
8c91506
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
ec49441
new fixes
GalaxyMinus Oct 14, 2026
b840804
solve conflicts
GalaxyMinus Oct 12, 2026
e53d397
etc
GalaxyMinus Oct 14, 2026
7994152
Update README.md
GalaxyMinus Oct 14, 2026
f635fc9
new fixes
GalaxyMinus Oct 17, 2026
40f2559
new fixes
GalaxyMinus Oct 17, 2026
711f17c
merging old and new database
GalaxyMinus Oct 12, 2026
cb055b9
fix conflicts
GalaxyMinus Oct 14, 2026
b4bf445
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
5b9611c
new fixes
GalaxyMinus Oct 14, 2026
3bf107d
etc
GalaxyMinus Oct 12, 2026
4e90bf1
fix conflicts
GalaxyMinus Oct 14, 2026
7531c96
Spawn added and bringto command edited yay
GalaxyMinus Oct 14, 2026
b2e473d
Update README.md
GalaxyMinus Oct 14, 2026
d4becc0
Merge branch 'main' of https://github.com/GalaxyMinus/OpenCE
GalaxyMinus Oct 18, 2026
5c45ad1
new fixes
GalaxyMinus Oct 18, 2026
e194047
new fixes
GalaxyMinus Oct 18, 2026
e4a6ea7
Remove web build and related CI steps
GalaxyMinus Oct 18, 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
221 changes: 2 additions & 219 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ jobs:

- name: Test
run: |
python -m pytest -q tools/test_linux_port.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py
python -m pytest -q tools/test_linux_port.py tools/test_android_asm_convert.py tools/test_host_watch_hash.py tools/test_touch_menu.py tools/harness tools/test_profile.py
python tools/test_light_storage.py

- name: Compile cache
Expand Down Expand Up @@ -260,90 +260,13 @@ jobs:
path: dist/halo-windows-release-symbols
retention-days: 3

web:
# Emscripten (emsdk, the version below, cached) builds the web port's
# site (port/web/README.md); the tests check its graph, the page's
# importer and service worker, its sockets, that it starts in a
# headless Chromium (with no game data, as far as the menus' map), and
# that two browsers join a room through a local MQTT broker.
runs-on: ubuntu-24.04
timeout-minutes: 40
env:
EMSDK_VERSION: 6.0.10
steps:
- uses: actions/checkout@v4

- uses: actions/cache@v4
with:
path: ~/emsdk
key: emsdk-${{ env.EMSDK_VERSION }}-${{ hashFiles('port/web/halo_sdl3.py') }}

- name: Install the toolchain
run: |
if [ ! -x ~/emsdk/upstream/emscripten/emcc ]; then
rm -rf ~/emsdk
git clone --depth 1 https://github.com/emscripten-core/emsdk.git ~/emsdk
~/emsdk/emsdk install "$EMSDK_VERSION"
fi
~/emsdk/emsdk activate "$EMSDK_VERSION"
sudo apt-get update -q
sudo apt-get install -y -q ninja-build ccache python3-pytest mosquitto

- uses: actions/cache@v4
with:
path: .ccache
key: ccache-web-${{ github.sha }}
restore-keys: ccache-web-

- name: Debug
run: |
source ~/emsdk/emsdk_env.sh
python3 tools/ci_build.py web debug

- name: Release
run: |
source ~/emsdk/emsdk_env.sh
python3 tools/ci_build.py web release

- name: Test
run: |
source ~/emsdk/emsdk_env.sh
node --test "port/web/tests/*.test.js"
python3 -m pytest -q tools/test_web_build.py

- name: Test in Chromium and Firefox
run: |
npm install --no-save --prefix "$RUNNER_TEMP/playwright" playwright@1.58
"$RUNNER_TEMP/playwright/node_modules/.bin/playwright" install --with-deps chromium firefox
NODE_PATH="$RUNNER_TEMP/playwright/node_modules" node port/web/tests/smoke.mjs dist/halo-web-release
NODE_PATH="$RUNNER_TEMP/playwright/node_modules" node port/web/tests/rooms.mjs dist/halo-web-release
# (the native builds' WebRTC, port/linux/src/p2p_webrtc.c, with both)
NODE_PATH="$RUNNER_TEMP/playwright/node_modules" node port/web/tests/webrtc_native.mjs chromium firefox

- name: Compile cache
run: ccache --show-stats

- uses: actions/upload-artifact@v4
with:
name: halo-web-debug
path: dist/halo-web-debug
include-hidden-files: true
retention-days: 3

- uses: actions/upload-artifact@v4
with:
name: halo-web-release
path: dist/halo-web-release
include-hidden-files: true
retention-days: 3

release:
# The eight builds (and the Windows builds' PDBs) as a release, tagged
# build-<run number> and marked latest
# (every file keeps its name from release to release, for the README's
# latest/download links); then all but the newest five build-* releases
# go, tags and all. Only for main, and only when every platform built.
needs: [linux, android, windows, web]
needs: [linux, android, windows]
if: ${{ github.ref == 'refs/heads/main' }}
runs-on: ubuntu-24.04
timeout-minutes: 15
Expand Down Expand Up @@ -421,143 +344,3 @@ jobs:
while read -r tag; do
gh release delete "$tag" --cleanup-tag --yes
done

pages:
# The release's web build to GitHub Pages, which serves it at
# https://halocombatevolved.com/ (port/web/README.md, "Hosting"). Only
# main, only once every platform built and the release is out (the site
# and the release are one build), and a deployment is never cancelled
# halfway. The repository's Pages source must be GitHub Actions.
needs: [release]
if: ${{ github.ref == 'refs/heads/main' }}
runs-on: ubuntu-24.04
timeout-minutes: 10
permissions:
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: false
environment:
name: github-pages
url: ${{ steps.deploy.outputs.page_url }}
steps:
- uses: actions/download-artifact@v4
with:
name: halo-web-release
path: site

- uses: actions/configure-pages@v5

- uses: actions/upload-pages-artifact@v3
with:
path: site

- id: deploy
uses: actions/deploy-pages@v4

notify:
# A Discord embed for the run, to the DISCORD_WEBHOOK secret (nothing
# without it): green when every platform built, red when one did not,
# with each platform's result, this run's release (main only), and links
# to the latest release's builds and the site.
needs: [linux, android, windows, web, release, pages]
if: ${{ !cancelled() }}
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Post to Discord
env:
WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
LINUX: ${{ needs.linux.result }}
ANDROID: ${{ needs.android.result }}
WINDOWS: ${{ needs.windows.result }}
WEB: ${{ needs.web.result }}
PAGES: ${{ needs.pages.result }}
SITE_URL: https://halocombatevolved.com/
RELEASE_TAG: ${{ needs.release.outputs.tag }}
SERVER: ${{ github.server_url }}
REPOSITORY: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
SHA: ${{ github.sha }}
ACTOR: ${{ github.actor }}
MESSAGE: ${{ github.event.head_commit.message }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
COMMIT_URL: ${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}
run: |
if [ -z "$WEBHOOK" ]; then
echo "no DISCORD_WEBHOOK secret: nothing to post"
exit 0
fi
status() {
case "$1" in
success) echo "✅ Built" ;;
failure) echo "❌ Failed" ;;
cancelled) echo "⏹️ Cancelled" ;;
*) echo "➖ Skipped" ;;
esac
}
if [ "$LINUX" = success ] && [ "$ANDROID" = success ] && [ "$WINDOWS" = success ] && [ "$WEB" = success ]; then
title="Build succeeded"; color=5763719
else
title="Build failed"; color=15548997
fi
latest="$SERVER/$REPOSITORY/releases/latest"
downloads="[Linux]($latest/download/halo-linux-release.zip) · [Windows]($latest/download/halo-windows-release.zip) · [Android]($latest/download/halo-android-release.zip) · [Web]($SITE_URL) ([all builds]($latest))"
if [ -n "$RELEASE_TAG" ]; then
release="[$RELEASE_TAG]($SERVER/$REPOSITORY/releases/tag/$RELEASE_TAG)"
if [ "$PAGES" = success ]; then
release="$release, on [the site]($SITE_URL)"
fi
else
release="None (only a successful build of main makes one)"
fi
subject="$(printf '%s' "${MESSAGE:-manual run}" | head -n 1 | cut -c1-200)"
jq -n \
--arg title "$title" --argjson color "$color" --arg url "$RUN_URL" \
--arg description "[\`${SHA:0:7}\`]($COMMIT_URL) $subject — $ACTOR ($BRANCH)" \
--arg release "$release" --arg downloads "$downloads" \
--arg linux "$(status "$LINUX")" --arg windows "$(status "$WINDOWS")" --arg android "$(status "$ANDROID")" \
--arg web "$(status "$WEB")" \
--arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
'{embeds: [{
title: $title, url: $url, color: $color, description: $description, timestamp: $timestamp,
fields: [
{name: "Linux", value: $linux, inline: true},
{name: "Windows", value: $windows, inline: true},
{name: "Android", value: $android, inline: true},
{name: "Web", value: $web, inline: true},
{name: "Release", value: $release},
{name: "Latest release builds", value: $downloads}
]
}]}' > payload.json
# Discord rate limits webhooks (HTTP 429, with how many seconds to
# wait in retry_after): wait and try again, a few times. A post
# still limited, or a network or Discord error, is a warning rather
# than a failed run; any other answer (a deleted webhook) fails. (At
# most 5 tries of 15 seconds and 4 waits of 30: inside the job's 5
# minutes.)
for attempt in 1 2 3 4 5; do
code=$(curl -sS --max-time 15 -o response.json -w '%{http_code}' \
-H "Content-Type: application/json" -d @payload.json "$WEBHOOK") || code=000
case "$code" in
2??)
exit 0
;;
429)
wait=$(jq -r '.retry_after // 5' response.json 2>/dev/null || echo 5)
wait=$(awk -v w="$wait" 'BEGIN { w += 0; if (w < 1) w = 1; if (w > 30) w = 30; printf "%d", w + 0.999 }')
echo "Discord is rate limiting the webhook; trying again in ${wait}s (attempt $attempt of 5)"
;;
000|5??)
wait=5
echo "Discord answered HTTP $code; trying again in ${wait}s (attempt $attempt of 5)"
;;
*)
echo "::error::Discord answered HTTP $code: $(cat response.json 2>/dev/null)"
exit 1
;;
esac
[ "$attempt" -lt 5 ] && sleep "$wait"
done
echo "::warning::The Discord post did not go through after 5 attempts (HTTP $code)"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ original/

# CI build outputs (tools/ci_build.py)
dist/

./cmake-build-debug
CMakeLists.txt
8 changes: 5 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ end.
| Path | Contents |
| --- | --- |
| `source/` | The game: 466 C files of the decompilation, compiled as they are with few changes (each marked, below) |
| `port/linux/src/` | The platform layer the three ports share: Direct3D 8 on OpenGL (`d3d8_gl.c`), DirectSound and XInput on SDL3, files, threads, memory, sockets, settings (`port_config.c`), internet play (`p2p*.c`) |
| `port/linux/game/` | The port's game-side code, compiled as the game's sources are: the distributed netcode (`network_*.c`), co-op, map sharing (`map_share*.c`), the menus (`menu_tags.c`, `menu_functions.c`), Custom Edition maps (`custom_edition_*.c`, `cache_file_formats.c`), the tag validator (`tag_validate.c`, `tag_schema_*.c`), touch, FOV and more |
| `port/linux/src/` | The platform layer the three ports share: Direct3D 8 on OpenGL (`d3d8_gl.c`), DirectSound and XInput on SDL3, files, threads, memory, sockets, settings (`port_config.c`), the mods folder (`port_mods.c`), internet play (`p2p*.c`) |
| `port/linux/game/` | The port's game-side code, compiled as the game's sources are: the distributed netcode (`network_*.c`), co-op, map sharing (`map_share*.c`), the menus (`menu_tags.c`, `menu_functions.c`), Custom Edition maps (`custom_edition_*.c`, `cache_file_formats.c`), the tag validator (`tag_validate.c`, `tag_schema_*.c`), mods (`mods.c`, `mod_*.c`), touch, FOV and more |
| `port/linux/include/` | The port's headers: the limits (`halo_port_limits.h`, with `HALO_PORT_NETWORK_VERSION`), capacities (`halo_port_capacity.h`), the prefix header, `halo_linux_source_fixups.h` (port functions the game's sources call) |
| `port/include/xdk/` | Stand-ins for the Xbox SDK's headers (declarations only) |
| `port/windows/` | The Windows build's own files (`win32_*.c`, headers) |
Expand All @@ -26,7 +26,7 @@ end.
| `port/third_party/` | Vendored libraries, each with a README naming its upstream, version and checksum |
| `port/tools/` | Stand-alone tools (`cache_file_report.c`) |
| `tools/` | Build scripts (`linux_build.py`, `windows_build.py`, `android_build.py`, `web_build.py`, `ci_build.py`, `web_serve.py`), generators (`ce_menus.py`, `port_settings.py`, `hud_assets.py`, `title_assets.py`, `embed_assets.py`, `xdk_headers.py`) and tests |
| `docs/` | Longer design notes (`custom_edition_caches.md`) |
| `docs/` | Longer design notes (`custom_edition_caches.md`, `mods.md`) |
| `pgo/` | Profile-guided optimisation profiles |
| `assets/` | Game data for local runs (gitignored: `maps/`, `custom_maps/`) |
| `.github/workflows/` | CI: builds every platform on each push, publishes releases from `main` |
Expand Down Expand Up @@ -84,6 +84,7 @@ setting (`game.custom_edition`), checked at run time with
```sh
python -m pytest -q tools/harness tools/test_touch_menu.py # the engine's functions in a fake world
python -m pytest -q tools/test_linux_port.py # the build, the maps' checks (needs assets/maps)
python -m pytest -q tools/test_mods.py # mods played over a map (needs assets/maps)
python -m pytest -q tools/test_cache_file_formats.py tools/test_bmp_files.py tools/test_profile.py
python tools/test_touch_layout.py # the Android touch layout (JDK 17+)
python tools/test_light_storage.py
Expand Down Expand Up @@ -216,6 +217,7 @@ as documentation of file formats, never copied.
| [port/web/README.md](port/web/README.md) | The web build, the page, the game data in the browser, limits, how it operates, hosting on GitHub Pages |
| [port/include/xdk/README.md](port/include/xdk/README.md) | How the SDK declarations were written and are checked |
| [docs/custom_edition_caches.md](docs/custom_edition_caches.md) | Loading and converting Custom Edition maps, and the evidence for each layout |
| [docs/mods.md](docs/mods.md) | Mods: folders of Halo PC tag files whose sounds, bitmaps, text and models play over a map's on one machine |
| [port/assets/menus/README.md](port/assets/menus/README.md) | The menu files' format and how to write them again |
| [port/assets/menus/NON_HANDDRAWN.md](port/assets/menus/NON_HANDDRAWN.md) | Menu pictures that are not redraws |
| [port/assets/menus/UNWIRED.md](port/assets/menus/UNWIRED.md) | Menu functions that do nothing yet |
Expand Down
3 changes: 3 additions & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
[Lucide](https://lucide.dev) 1.53.0, copyright (c) 2026 Lucide Icons and
Contributors, under the ISC licence
(`port/assets/icons/lucide/LICENSE`).
- **The Mods menu's warning icons** (a mod out of its requested order, and
a mod that cannot be played): `triangle-alert` and `circle-x` from
[Lucide](https://lucide.dev) 1.53.0, under the same licence.
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ release, and the web site then plays it. The [Releases](https://github.com/OpenC
page keeps the last five releases. If the latest build has a problem, get
an older build from that page.

### Arch-based Linux Distributions

The above Linux binary release is available on the [AUR](https://aur.archlinux.org/packages/opence-bin).

## Game data

The port does not include the game data. Download an Xbox disc image
Expand All @@ -57,6 +61,15 @@ the web, the page copies `maps/` out of the disc image into the browser's
storage for the site; nothing is uploaded. Refer to
[port/web/README.md](port/web/README.md).

## Mods

Mods are folders of Halo PC tag files, as the Halo Editing Kit and Invader
write them, in `mods/` next to `maps/`: texture, sound, text and model packs
that play over the maps' on your machine only, in any game. Each has a
`mod.toml`. Every mod in the folder is on; the main menu's Mods turns them
off and on and sets the order they load in.
Refer to [docs/mods.md](docs/mods.md).

## Platforms

Each platform has its own instructions:
Expand Down
Loading