diff options
| author | Vaino Kauppila <vaino@vke.fi> | 2026-07-02 22:58:25 +0300 |
|---|---|---|
| committer | Vaino Kauppila <vaino@vke.fi> | 2026-07-02 23:47:07 +0300 |
| commit | cd0c08dc7ce754473178ad3f32f7740a1dddc1eb (patch) | |
| tree | 589c676b41d6f3d322ea5ce339ddb0811f29ec31 /Containerfile | |
| download | forts_clone-cd0c08dc7ce754473178ad3f32f7740a1dddc1eb.tar.gz forts_clone-cd0c08dc7ce754473178ad3f32f7740a1dddc1eb.zip | |
Initial import: LibreForts (M0-M5 in progress)
Open-source Forts clone: custom C++20 engine + data-driven (Lua) 2D physics
artillery RTS.
- Building: node/strut graph on a stiff mass-spring solver (canon Forts model),
triangulation rigidity, axial + 30-degree angle-stress breaking, cascading
collapse, fire (DoT + spread), ground destroys debris.
- Weapons (M4): cannon (ballistic) + laser (beam/ignite) with select-and-aim-in-
arc UX; splash / beam damage; bg-brace passthrough.
- Devices + economy (M5): reactors + win/loss + restart, mines/turbines/battery,
metal deposits, storage caps, per-shot energy cost.
- Data-driven via Lua/sol2 with a layered mod loader; enemy-fort scenario mod.
- Renderer: SDL3 + textures + ImGui dev UI. stb_image + ImGui vendored.
- Assets: CC0 placeholders only; real game art loaded at runtime from the user's
own install via forts: paths (bring-your-own; nothing copyrighted committed).
See README.md / CLAUDE.md and research/ + requirements/ for detail.
Diffstat (limited to 'Containerfile')
| -rw-r--r-- | Containerfile | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..7b618e0 --- /dev/null +++ b/Containerfile @@ -0,0 +1,119 @@ +# Containerfile for Forts Clone build environment +# Builds all C/C++ dependencies from source, installs to /usr/local. +# Usage: +# podman build -t forts-clone-dev . +# podman run -it --rm -v $(pwd):/src:Z --userns=keep-id forts-clone-dev + +FROM docker.io/library/fedora:41 + +# ============================================================================= +# All system packages in one layer +# ============================================================================= +RUN dnf -y update && dnf -y install \ + gcc-c++ clang lld meson ninja-build cmake git gdb valgrind \ + SDL3-devel lua-devel glm-devel \ + mesa-libGL-devel mesa-libEGL-devel \ + libX11-devel libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel \ + wayland-devel libdrm-devel libxkbcommon-devel libxkbcommon-x11-devel \ + vulkan-loader-devel \ + pkg-config python3 which \ + && dnf clean all + +# ============================================================================= +# bgfx -- cross-platform GPU rendering +# ============================================================================= +WORKDIR /tmp/bgfx_build +RUN git clone --recursive --depth 1 https://github.com/bkaradzic/bgfx.cmake.git . \ + && cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBGFX_BUILD_TOOLS=OFF \ + -DBGFX_BUILD_EXAMPLES=OFF \ + -DBGFX_BUILD_TESTS=OFF \ + && cmake --build build \ + && cmake --install build \ + && rm -rf /tmp/bgfx_build + +# ============================================================================= +# Box2D v3 -- deterministic 2D physics engine +# Built directly from source to avoid CMake FetchContent issues. +# ============================================================================= +WORKDIR /tmp/box2d_build +RUN git clone --depth 1 --branch v3.1.1 https://github.com/erincatto/box2d.git . \ + && mkdir -p /usr/local/include/box2d \ + && cp -r include/box2d/*.h /usr/local/include/box2d/ \ + && cp -r include/box2d/*.h /usr/local/include/ \ + && gcc -c src/*.c -I include -I src -O2 -DBOX2D_ENABLE_ASSERT=0 \ + && ar rcs libbox2d.a *.o \ + && cp libbox2d.a /usr/local/lib/ \ + && rm -rf /tmp/box2d_build + +# ============================================================================= +# SoLoud -- game audio engine +# Built directly from source (contrib CMake is fragile). +# ============================================================================= +RUN dnf -y install alsa-lib-devel pulseaudio-libs-devel && dnf clean all +WORKDIR /tmp/soloud_build +RUN git clone --depth 1 https://github.com/jarikomppa/soloud.git . \ + && mkdir -p /usr/local/include/soloud \ + && cp include/*.h /usr/local/include/soloud/ \ + && g++ -c src/core/*.cpp src/audiosource/*/*.cpp src/filter/*.cpp \ + src/backend/alsa/*.cpp src/c_api/*.cpp \ + -I include -O2 -fPIC -DWITH_ALSA \ + && ar rcs libsoloud.a *.o \ + && cp libsoloud.a /usr/local/lib/ \ + && rm -rf /tmp/soloud_build + +# ============================================================================= +# ENet -- UDP networking library +# ============================================================================= +WORKDIR /tmp/enet_build +RUN git clone --depth 1 --branch v1.3.18 https://github.com/lsalzman/enet.git . \ + && cmake -B build -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + && cmake --build build \ + && cmake --install build \ + && rm -rf /tmp/enet_build + +# ============================================================================= +# ============================================================================= +# sol2 -- Lua C++ bindings (header-only) +# ============================================================================= +WORKDIR /tmp/sol2_build +RUN git clone --depth 1 --branch v3.5.0 https://github.com/ThePhD/sol2.git . \ + && cp -r include/sol /usr/local/include/ \ + && rm -rf /tmp/sol2_build + +# ============================================================================= +# EnTT -- ECS library (header-only) +# ============================================================================= +WORKDIR /tmp/entt_build +RUN git clone --depth 1 --branch v3.14.0 https://github.com/skypjack/entt.git . \ + && cp -r src/entt /usr/local/include/ \ + && rm -rf /tmp/entt_build + +# ============================================================================= +# Lua 5.4 -- built as a STATIC archive (liblua.a) so the game binary carries +# Lua itself and needs no liblua .so at runtime. Fedora's shared soname +# (liblua-5.4.so) differs from other distros (liblua5.4.so), which breaks +# running the container-built binary on the host. Appended LAST so none of the +# cached dependency layers above have to rebuild. +# ============================================================================= +WORKDIR /tmp/lua_build +RUN python3 -c "import urllib.request; urllib.request.urlretrieve('https://www.lua.org/ftp/lua-5.4.7.tar.gz','lua.tar.gz')" \ + && tar xf lua.tar.gz \ + && cd lua-5.4.7/src \ + && gcc -O2 -fPIC -DLUA_USE_LINUX -c $(ls *.c | grep -vE '^(lua|luac)\.c$') \ + && ar rcs liblua.a *.o \ + && install -m644 liblua.a /usr/local/lib/ \ + && install -m644 lua.h luaconf.h lualib.h lauxlib.h /usr/local/include/ \ + && printf 'extern "C" {\n#include "lua.h"\n#include "lualib.h"\n#include "lauxlib.h"\n}\n' \ + > /usr/local/include/lua.hpp \ + && rm -rf /tmp/lua_build + +# ============================================================================= +# Ready +# ============================================================================= +WORKDIR /src +CMD ["bash"] |
