Halo: Combat Evolved back on the original Xbox: ChupathingyCE's console line, playing online with the PC builds.
ChupathingyCE · Games online now · Discord
Warthog follows ChupathingyCE: the shared game code comes from there, and this repository adds only the consoles' own code. You need your own copy of Halo; no SDK or game files are included.
Built on ChupathingyCE with OpenCE build-133 through build-138 (network version 20). Warthog joins games hosted on network versions 11 through 20, by ChupathingyCE and OpenCE builds alike, with up to 16 players. There's no release yet: Warthog is in development, and for now it runs on development kits and modified consoles.
Warthog is the Halo: Combat Evolved decompilation built back for the console it was written for, on the same code as ChupathingyCE (the Windows, Mac, Linux and Android builds). The goal: Halo as it shipped on the Xbox, with its memory, caches and limits, that also plays online with the PC builds. Expect rough edges, and please report them.
On the original Xbox (in development)
- Boots to the menus at a steady 30 fps on a development kit, with the menu music and profiles
- Gets its address by DHCP, and the game list from the internet
- ONLINE GAMES in the Multiplayer menu: the game list on a screen of its own, joining a game by its invite through the PCs' own tunnel (built, not yet seen working on a console)
- System Link with PC builds: joins a PC host's game, a [D] dedicated server's too, at the console's 16 slots (tested with a desktop build at the console's limits; not yet on a console)
- Reads the console's memory (64, 128 or 256 MB) at the start, and can use more on a bigger one
- Not yet: hosting PC players, Bink movies, reverb, network co-op
Consoles
| Console | Status |
|---|---|
| Original Xbox | In development: this page |
| Xbox 360 | Next, with the Wii U alongside: both are big-endian, so the byte-order groundwork is shared. Scaffolding only so far |
| Wii U | Alongside the Xbox 360. Scaffolding only so far |
| Switch | thelinkin3000's port, being brought in |
docs/consoles.md has where each stands.
Warthog doesn't include the game's maps, sounds or art. You need your own Xbox disc of Halo: Combat Evolved. Warthog plays the maps of the North American release (NTSC, 01.10.12.2276), as every ChupathingyCE build and dedicated server does; the PAL disc's maps work too.
- Copy the
mapsfolder from your own disc (about 2 GB) to your computer. - Lay the game out for the console's hard disk:
tools/xbox_package.pyputsdefault.xbebeside your maps in one folder (see "Build"). - Copy that folder to the console, for example to
E:\Games\Warthog\, and startdefault.xbe.
Warthog never provides game files: we don't provide maps, disc images or other copyrighted game data, and we don't link to them.
| You want to | Do this |
|---|---|
| Join a game online | Multiplayer → ONLINE GAMES, pick a game, press A. Needs bypass_security.txt (below), which the packaging script writes. |
| Join a game on your network | Multiplayer → System Link, as on the disc. PC hosts on your network show up too. |
| Join one host directly | Put its LAN address (192.168.1.20) or its invite link in D:\join.txt; System Link joins the address, ONLINE GAMES' Y the invite. |
| See your stats | Not yet on the console. |
What to know:
- 16 players. The console plays games of up to 16 players, as the Xbox did. It leaves a game that grows past that, as it leaves a full one. With Delta (below), hosts will know the console's limit and keep room for it.
- No network co-op. OpenCE's network co-op isn't built for the original Xbox for now. Co-op games are left out of the console's lists, and a game that turns co-op is left with a message. Split screen and the campaign on the console itself play as they always did.
- Network versions. The console joins hosts of network versions 11 through 20. A host of another version is refused with the reason.
- Your address stays private. The game's log never shows a public IP address, only a tag.
The console has no settings file yet. Its switches are small text files in
the game's folder (D:\, beside default.xbe): an empty file turns a
switch on.
| File | What it does |
|---|---|
bypass_security.txt |
Starts the network in its open mode, which the internet and the PC builds need. The packaging script writes it; --secure leaves it out for console-only System Link. |
game_list.txt |
One line, a host or address (:port optional): where to get the game list if warthog.milenko.org doesn't resolve. |
join.txt |
One line: a host's LAN address, or an invite (halo://join/…). |
trace.txt |
Detailed network traces in debug.txt, for reporting a join that fails. Other hosts appear only as tags (enet# and six hex digits), never by their network cards' addresses; with it, debug.txt also gives XLink Kai's address for the console. |
large_caches.txt |
On a 128 MB console, a bigger texture cache (44 MB; 64 MB on a 256 MB console). On a stock 64 MB console it shows a message and keeps the Xbox's own. |
brokers.txt |
The signalling servers internet play uses, one host:port a line, if the built-in ones can't be reached. |
xlink.txt |
Planned: XLink Kai addressing (docs/xlink.md). Today debug.txt says whether the console's address is already Kai's (yes or no; Kai's address itself with trace.txt). |
The game writes its log to D:\debug.txt; attach it to bug reports.
- ChupathingyCE to Warthog, one way. Warthog is rebased on ChupathingyCE: changes flow from ChupathingyCE into Warthog, never back through it. Fixes to the shared game code go to ChupathingyCE first (and from there to OpenCE). Warthog keeps only what the console needs on top.
- Playing together. The game protocol is the PC builds', byte for byte: the console adapts to their network version and their 128-slot game settings, never the other way (docs/cross-play.md).
- Delta. ChupathingyCE's network family (docs/delta.md):
everything our machines and services say beyond OpenCE's protocol. Warthog
is to be a full Delta machine: Delta Peer with an
xboxplatform key (its 16-player and no-co-op caveats, its memory class), the signed legacy table, a signed game list so the console needs no TLS, and later stats and profile links. The plan: docs/warthog-delta.md.
Warthog builds on macOS today, with OXDK, clang and lld-link (Linux should work the same way, untested). Nothing from Microsoft's SDKs is in this repository, and none of it may be committed: you supply your own.
- Python 3, ninja and LLVM (clang and
lld-link). On macOS:
brew install llvm lld ninja. - OXDK in
~/OXDK(or--oxdk DIR, orOXDK_DIR), with itscxbebuilt, and the 5933 Xbox SDK's libraries and headers in OXDK'sxbox/xdk/libandxbox/xdk/include, as OXDK's README says. - An Aug 2001 Direct3D library,
d3d8ntpr.lib(theaug01i386 build), given toconfigure.py --xbox-d3d8.
python3 configure.py --xbox-d3d8 /path/to/d3d8ntpr.lib
ninja xbox # build/xbox/default.xbe
port/xbox/tests/run.sh --xbox # the host tests
python3 tools/xbox_package.py --maps /path/to/your/maps --out ~/Downloads/Warthog-xboxxbox_package.py lays out default.xbe and your own maps/ as one folder
for the console's hard disk, with an empty bypass_security.txt (--secure
leaves it out). Copy it to the console (FTP on a modified console), for
example to E:\Games\Warthog\, and start default.xbe.
docs/building.md has every step, the versions tested
and the options. xbox360, wiiu and switch build the other consoles'
stubs where their toolchains are installed
(docs/consoles.md).
Milenko, Warthog's maintainer, doesn't use Windows, so Warthog builds on macOS with OXDK and clang today, and the Windows side is open. If you know the Xbox's Windows tools, we'd love your help to set up and document:
- a Windows build path: a Visual Studio project or solution, or the same clang and OXDK build run on Windows;
- the official XDK and RDK tooling: what installs where, and how the build finds it;
- debugging through XBDM on a development kit;
- a Windows CI job or a written build recipe that others can follow.
Say hello in #warthog-dev on the Discord so we can coordinate, and see CONTRIBUTING.md.
Development kit or modified console. Copy the folder to the hard disk
(FTP, or the development kit's tools) and launch default.xbe. The game
logs halo: lines to the debug monitor (XBDM) and writes D:\debug.txt.
It is a debug build: an assertion stops it and shows the error on screen
and in debug.txt. A watchdog reports a main loop that stalls;
D:\trace.txt turns on the bring-up traces.
xemu. vsod99's fork of OpenCE (vsod99/halo-ce-universal, branch
xbox-backport, CC0) has a development loop, tools/xbox_dev.py: it packs
an ISO, boots it in xemu at 128 MB with NAT and streams the serial log. Its
ISO and xemu steps work for any XBE. xemu needs the user's own MCPX boot
ROM, flash image and hard disk image.
On the host. port/xbox/tests/run.sh builds the console's parsers
(the game list, the settings record's fold, join.txt, the memory class,
XLink's addressing) on the computer under AddressSanitizer, with a fuzzer;
--xbox adds the Xbox build's own checks.
The console builds 16 players on 16 machines and the Xbox's 2,048 objects;
the PCs build 128, 128 and 8,192, and both send their game settings whole
(13,120 bytes at 128 slots, unchanged in network version 20). As a client
of a PC host, the console folds the PCs' 128-slot game settings record and
Slayer's state into its own 16 slots as they arrive, checks the record's
layout against its own at compile time, and leaves a game that grows past
its slots. A desktop build with the console's limits
(configure.py --console-limits) plays whole games against a PC dedicated
server on one computer that way.
Hosting PC players, and the PCs' object indices past 2,048, need a bigger game state than the Xbox's (its pools fill all but 948 bytes of 0x305000 bytes): the route is the game state as ordinary virtual memory on a 128 MB console. The field-by-field analysis and the plan are in docs/cross-play.md.
Internet games go through the PCs' own tunnel (port/linux/src/p2p.c,
built for the console as a joiner), which needs XNet in its open mode
(D:\bypass_security.txt). Memory detection and the console's switches are in
port/xbox/README.md; XLink Kai is in
docs/xlink.md.
Warthog is rebased on ChupathingyCE: its own commits are replayed
(git cherry-pick) onto ChupathingyCE's newest main, conflicts resolved in
favor of ChupathingyCE's code with the console's switches kept, and
ninja xbox, the desktop builds and the host tests must pass. Each
console switch Warthog keeps in a shared file is work at every rebase;
docs/warthog-upstreaming.md lists the ones
that could move into ChupathingyCE itself, compiled out of the desktop
builds.
- The decompilation: punpckhdq/halo and bnunu/halo-1, of the Xbox build 2342.
- The port: OpenCE and its contributors, and ChupathingyCE.
- Warthog: Milenko and contributors. The toolchain: OXDK.
- Libraries: KCP and Monocypher (internet play), zlib, and the
ChupathingyCE libraries the shared code uses. Their licenses are beside
them in
port/third_party.
- thelinkin3000: the Nintendo Switch port, being brought into Warthog.
- CrunchBite (XLink Kai's developer): XLink Kai's addressing for consoles (docs/xlink.md), and the idea of checking the console's memory and saying so on screen instead of crashing.
- vsod99: the xemu development loop and the memory probe behind the cross-play plan.
Halo is a trademark of Microsoft. Warthog is a fan project, not made or endorsed by Microsoft, Bungie or 343 Industries, and includes none of the game's content. The code is released under CC0.