This file is currently a shell to be filled in over time. For now, it only captures project-specific maintenance notes that are easy to miss.
For current sfall compatibility status and the remaining work needed to close gaps, see SFALL_COMPATIBILITY.md.
The project uses CMake, so building mostly comes down to picking the right preset.
--scan-unimplemented- do an analysis of opcodes and hooks used by loaded mods--dev-load-game=1- load the given save game automatically (useful for LLM automation)--dev-endgame- after a new or loaded game starts, trigger the normalendgame_slideshowrequest--dev-endgame-movie- after a new or loaded game starts, run theendgame_moviesequence directly
For Fallout 1/Fo1in2-style endings, use both endgame flags to mirror the script flow:
./Fallout\ II\ Community\ Edition.app/Contents/MacOS/Fallout\ II\ Community\ Edition --dev-load-game=1 --dev-endgame --dev-endgame-movie- Install the Command Line Tools if needed:
xcode-select --install - Install the common build dependencies:
brew install cmake ninja - Configure and build:
cmake -S . -B out/build/macos -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build out/build/macos --target fallout2-ceInstall SDL and a toolchain:
- Debian / Ubuntu:
sudo apt install build-essential cmake ninja-build libsdl2-dev zlib1g-dev- Fedora:
sudo dnf install gcc-c++ cmake ninja-build SDL2-devel zlib-devel- Arch Linux:
sudo pacman -S base-devel cmake ninja sdl2 zlibThen build:
cmake -S . -B out/build/linux-x64-debug -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build out/build/linux-x64-debug --target fallout2-ce
TODO: add Visual Studio build instructions. This will likely need a Visual Studio generator or preset plus the MSVC toolchain and Windows SDK.
There is a small command-line archive tool in this repo for inspecting Fallout .dat files. It supports both Fallout 2 and Fallout 1 archives.
From the repo root, build it with your normal CMake workflow, targeting ce-dat-tool:
cmake --build out/build/<preset-name> --target ce-dat-tool
The executable is written to your selected build directory, so the exact path will vary by preset and configuration.
Available commands:
./<BUILD_DIR>/ce-dat-tool <archive.dat> list [pattern]ce-dat-tool <archive.dat> info [pattern]ce-dat-tool <archive.dat> extract [--lower] <output-dir> [pattern]ce-dat-tool <archive.dat> extract [--lower] (--file-list|--files-from) <list-file> <output-dir>ce-dat-tool <archive.dat> cat <entry>ce-dat-tool create <input-dir> <archive.dat>
Use --lower with extract when you want every extracted file and directory name forced to lowercase.
For example:
ce-dat-tool master.dat extract --lower /tmp/ce-dat-tool-lower data\\*
There is also a small FRM conversion tool in this repo for converting Fallout art between .frm and .png.
From the repo root, build it with your normal CMake workflow, targeting ce-frm2png:
cmake --build out/build/<preset-name> --target ce-frm2png
The executable is written to your selected build directory, so the exact path will vary by preset and configuration.
Basic usage:
./<BUILD_DIR>/ce-frm2png <input.frm> [output.png]./<BUILD_DIR>/ce-frm2png <input.frm> [output.png] --palette <path-to-color.pal>./<BUILD_DIR>/ce-frm2png <input.frm> [output.png] --frame <index> --direction <index>./<BUILD_DIR>/ce-frm2png <input.png> [output.frm] --palette <path-to-color.pal>./<BUILD_DIR>/ce-frm2png <input.png> [output.frm] --fps 10 --action-frame 0 --x-offset 0 --y-offset 0./<BUILD_DIR>/ce-frm2png <input.png> <output.png> --palette <path-to-color.pal>./<BUILD_DIR>/ce-frm2png - [output.png|-] --from-frm --palette <path-to-color.pal>./<BUILD_DIR>/ce-frm2png - [output.frm|-] --from-png --palette <path-to-color.pal>
- can be used to take input from stdin (e.g. from ce-dat-tool cat) or write to stdout. When reading from stdin, pass --from-frm or --from-png. Output defaults to PNG for FRM input and FRM for PNG input when output is omitted or -; use --to-png for PNG output to stdout from PNG input.
Output file extensions are validated against the selected conversion. For example, PNG-to-FRM output must use .frm, and PNG output must use .png.
If --palette isn't specified, it will pick up color.pal in the input file's directory or cwd.
Notes:
- The tool expects a raw
color.palfile. It does not read palettes directly frommaster.dat, so extractcolor.palfirst if needed. - A typical extraction flow is:
ce-dat-tool master.dat extract --lower . 'color.pal' - By default palette index
0becomes transparent in the output PNG. Pass--opaqueto keep it opaque. - PNG output is always palette-indexed and preserves Fallout palette indices when possible.
- For
png -> frm, transparent pixels (alpha below 128) map to palette index0by default. Pass--opaqueto quantize every pixel instead. - The current
png -> frmimplementation writes a single-frame FRM and points all six direction slots at the same frame payload.
SDL is pinned for native builds in third_party/sdl2/CMakeLists.txt. Right now, Android also relies on checked-in Java bindings in os/android/app/src/main/java/org/libsdl/app, and those bindings must match the SDL version fetched by CMake.
When updating SDL:
- Update the SDL tag in
third_party/sdl2/CMakeLists.txt. - Run an Android build once so Gradle/CMake fetch the new SDL source tree.
- Copy the Android Java bindings from the fetched SDL checkout into
os/android/app/src/main/java/org/libsdl/app. Source path pattern:os/android/app/.cxx/<Variant>/<Hash>/arm64-v8a/_deps/sdl2-src/android-project/app/src/main/java/org/libsdl/app - Rebuild Android and confirm the SDL sync guard passes.
The Android build contains a guard in os/android/app/build.gradle that fails if the checked-in Java bindings drift from the fetched native SDL source.
This is a hack, not a good long-term setup. The Java bindings are still duplicated in the repo instead of being sourced from the same SDL tree as the native build. That should be improved so Android does not depend on a manual copy/sync step.