Repository navigation
Releases
Dark Oberon 0.6.0
A product page for the game, and the lobby now links to it and shows the version it runs. The game itself is the same as in 0.5.1.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.6.0-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.6.0-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.6.0-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
All players of one network game need the same version.
Changes in 0.6.0
Added
- Product page for the game at https://oberon.cloud.digitalmind.cz (Czech at
/, English at/en/),
styled after the game's main menu: what the fork adds, downloads for Linux, Windows and Haiku from the
newest GitHub release, a link to the Oberon Cloud lobby with the number of games running, and the
original authors. Source and deploy steps indeploy/srv_dark-oberon/(DigiCloud stack, Python
standard library only). The game is unchanged. - The lobby links to the game's download page and shows the version it runs. The version comes from the
VERSIONfile at build time;GAME_VERSIONinserver/.envoverrides it andDOWNLOAD_URLchanges the
link.
Dark Oberon 0.5.1
Crash fixes: no more crashes a few minutes into a game with many workers cutting wood, and none when a game ends.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.5.1-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.5.1-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.5.1-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
All players of one network game need the same version.
Changes in 0.5.1
Fixed
- Crashes (use after free) a few minutes into a game, most often with many workers cutting wood, seen
on Haiku in the renderer (TSOURCE_UNIT::TestVisibility,TMAP_UNIT::DrawToRadar) and in the CPU AI
(TAI_GAME_STATE::ScanFromPlayer). A unit marked for deletion (e.g. a tree that was cut down) was
freed by whoever released the last counted pointer to it, which could be a path finding thread,
while the game thread and the renderer were still walking the unit lists; the pointer counter itself
was a plainintchanged from several threads. Units are now only queued there and deleted by the
game thread between steps (and when a game stops), the counter is atomic, and exactly one caller
takes over the deletion. The queue is checked without any locking when it is empty (the usual case),
so the game thread does not wait for the renderer every step. On Linux it usually went unnoticed
because the freed memory stays readable. - Use after free when a game ends (found with AddressSanitizer): the map fields' aimer/watcher lists
released their counted pointers after the players and their units had already been deleted. They
are now released first. - Haiku: the game could abort at start in Mesa ("Mesa cache keys mismatch!") after an earlier crash had
left llvmpipe's on-disk shader cache inconsistent. The game now starts with the shader cache off
(MESA_SHADER_CACHE_DISABLE, can still be overridden). - The git revision next to the version in the menu now follows new commits; before,
build_info.h
was only regenerated whenVERSIONor the Makefile changed, so packages could show an older hash.
Builds without git (release containers, Docker) keep the existing stamp.
Dark Oberon 0.5.0
Smarter CPU soldiers, a god mode for watching the AI, and a performance test for big battles.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.5.0-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.5.0-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.5.0-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
All players of one network game need the same version.
Changes in 0.5.0
Added
- Dev console
god: your units take no damage;god allmakes every player's units invulnerable (map
objects such as trees and mines are not affected);god offturns it off. Local games only, like the
other dev commands. - Performance test
tests/cpp/perf_smoke.sh [units] [seconds] [warmup] [map]: a headless server with CPU
players places the units around the bases, sends them all to the middle of the map and measures the
battle: simulation step time (events and AI; avg, p50, p95, p99, max, share over the 20 ms budget),
path search jobs in the thread pool and the length of their queue. Optional limits
PERF_MAX_STEP_P99_MSandPERF_MAX_PATH_QUEUEmake it fail. New server commands behind it:
spawn <n> [fight]andperf [reset]; statistics insrc/doperf.*(tested inmake test-ai).
Changed
- Path finding uses one thread per CPU core minus one (at least the original 5, at most 8) instead of
always 5; the A* jobs do not take the simulation lock. With 1200 fighting units 8 threads halve the
queue of waiting path searches; more threads made each search and the simulation step slower.
DO_PATH_THREADS=<n>overrides the count.
Fixed
- A CPU soldier that got ahead of its army kept walking to a building and hitting it while a player
was attacking it: attack and retreat decisions only looked at the army as a whole, and the army order
kept re-sending the unit at its target. Each army unit now reacts on its own: it turns on the enemy
attacking it, or falls back to the rally point when it is outnumbered where it stands
(TAI_UnitReaction, personalityretreat_ratio). - CPU scouts walked into the enemy base and kept hitting the first building they reached, even while
being attacked, because scouts are left out of defense and the army. Scouts now ignore enemies, run
home as soon as they are hit or targeted, and keep away from that base for 60 s.
Dark Oberon 0.4.1
Steadier internet games: keepalive on game connections, clear logs when a player drops out, and a sturdier lobby.
Server admins: after updating, run
server/up-server(it now starts the lobby in the background and only follows the logs; Ctrl+C no longer stops running games). Rebuilding the container still ends running games, so update when nobody is playing.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.4.1-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.4.1-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.4.1-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
Changes in 0.4.1
Changed
server/up-serverstarts the lobby in the background (up -d) and then only follows the logs, so
Ctrl+C or a closed terminal no longer stops the lobby and the running games. It prints the lobby URL
from.env(PROJECT_WEBSITE), and--no-logsreturns right after the start.
Added
- Game connections use TCP keepalive (30 s idle, then 6 probes 10 s apart where the system allows it,
the system default on Windows), so NATs and firewalls keep quiet connections open and a dead peer is
detected in about a minute. - Connection logging on the game server at Info/Warning level: every connection, clean close, reset,
a message cut off, and a failed send, with the peer's IP and port and the reason. - Lobby log: every game server start, stop (and why: owner, idle, max lifetime, lobby exiting) and any
unexpected end with its exit code or signal.
Fixed
- A player whose connection broke with an error (e.g.
Connection reset by peer) stayed in the game as
a ghost: the listener thread returned without reporting the disconnect. - Lobby: the thread that reads a game server's log died silently on the first byte that was not valid
UTF-8 (e.g. a player name with national characters). Nobody drained the pipe afterwards, and after
about 64 KB of log the game server blocked and the game froze. The log is now decoded leniently and
read until the server exits. - Lobby: when the lobby worker exits, it stops its games and logs it, instead of the games ending
silently when their stdin closes. - README: the Oberon Cloud lobby is at
https://oberon-game.cloud.digitalmind.cz.
Dark Oberon 0.4.0
Faster building, WASD camera, and a dedicated server that no longer dies from stray connections.
Server admins: update to this version. Older servers crash as soon as anything on the internet (e.g. a port scanner) connects to a game port and sends garbage. All players of one network game need the same version, because the game pace changed.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.4.0-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.4.0-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.4.0-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
Changes in 0.4.0
Added
- Map scrolling with W, A, S, D (in addition to the arrow keys).
Changed
- Faster game pace for all races: construction, upgrades and repairs are 3× faster and factories
produce units 1.5× faster (src/dopace.h; the.racfiles keep the original timings). A peon now
builds a barracks in about 70 s instead of 200 s. Players of one network game must run the same version. - Hotkeys: Stay moved from S to H (hold) and Attack from A to T, because S and A now scroll the map.
Fixed
- Orcs: the Goblin Workshop and the flying Goblin Zeppelin flickered, because codex had repainted each
animation frame separately. The zeppelin now changes only at its propeller (the part that moves in the
original animation); the workshop, which has no wheel like the human Manufactory, stands still. All
three orc colours. New pipeline scriptstabilize_frames.py(dark-oberon-dat skill,--freezefor
groups without a moving part) does this against the human reference race. - Dedicated server crashed (
terminate called after throwing an instance of 'int') when any TCP
connection to the game port sent an invalid size byte or closed in the middle of a message, e.g. a
port scanner on the public internet. Such a connection is now dropped with a warning; the game goes on.
Dark Oberon 0.3.1
Dark Oberon now runs on Linux, Windows and Haiku.
Downloads
| System | Package | Needs |
|---|---|---|
| Windows 10 / 11 | dark-oberon-0.3.1-win64.zip |
nothing, unzip and run dark-oberon.exe |
| Linux (glibc 2.34+) | dark-oberon-0.3.1-linux-x86_64.tar.gz |
sudo apt install libsdl2-2.0-0 libsdl2-mixer-2.0-0 libglu1-mesa (or your distro's sdl2 sdl2_mixer glu) |
| Haiku R1/beta6 | dark-oberon-0.3.1-haiku-x86_64.zip |
pkgman install libsdl2 sdl2_mixer glu |
Unpack anywhere and start the game from its folder. Each package has a short README with details.
Changes in 0.3.1
Added
- Portable Linux release:
make linux-distbuilds the client in an Ubuntu 22.04 Docker container and packs
it with the game data intodist/dark-oberon-<version>-linux-x86_64.tar.gz. It needs glibc 2.34 or newer
(Debian 12, Ubuntu 22.04, Fedora 35 and later) plus SDL2, SDL2_mixer and GLU from the distro.
Fixed
- The game did not build with SDL2_mixer older than 2.6 (e.g. Ubuntu 22.04):
dosound.hforward-declared
struct Mix_Music, which conflicts with the oldertypedef struct _Mix_Music Mix_Music.
Changed
make distbuilds the Windows, Haiku and Linux packages in parallel.make windows-cleanremoves only the Windows packages fromdist/, not the Linux and Haiku ones.
Changes in 0.3.0
Added
- Windows (x86_64) build, cross-compiled with MinGW-w64:
make windowsproduces
dist/dark-oberon-<version>-win64.zip(exe, SDL2/SDL2_mixer DLLs, game data). The C/C++ runtime is
linked statically. One-time setup:sudo scripts/setup-windows-toolchain.shand
scripts/fetch-windows-deps.sh. - Haiku (x86_64) support: builds natively with the regular
make -C src SOUND=1(needs
libsdl2_devel sdl2_mixer_devel glu_develfrom HaikuDepot/pkgman); sockets link againstlibnetwork.
make haikubuilds it on a Haiku machine over SSH (HAIKU_HOST, defaulthaiku) and fetches
dist/dark-oberon-<version>-haiku-x86_64.zip. - Lobby accounts: registration and sign-in (name + password, no e-mail). Hosting a game needs an
account, each account can run one game at a time, and only its owner can start or stop it. Joining
still needs only the address. Accounts live in SQLite in thelobby-dataDocker volume; sign-up and
sign-in are rate limited per IP, forms and API calls are CSRF-protected. - Lobby housekeeping: a game with no human player connected stops after
LOBBY_IDLE_MINUTES(30), and
any game afterLOBBY_MAX_GAME_HOURS(8). - New lobby settings in
server/.env.example:LOBBY_SECRET_KEY,TRUSTED_PROXIES,
SESSION_COOKIE_SECURE,LOBBY_IDLE_MINUTES,LOBBY_MAX_GAME_HOURS. Lobby tests intests/lobby.
Changed
- The lobby web page is restyled after the game's main menu (stone backdrop with the plasticine
knights, the gold title, black panels, menu-style commands) and works on phones. The manual port
field is gone; ports are assigned automatically. - README: internet play explains accounts, hosting vs. joining and when games stop by themselves.
- README: the game is documented as running on Linux, Windows and Haiku, with OS badges, a platform table,
a link to the release zips and build steps for each. The Linux steps now build with sound by default. - The top-level
makebuilds the Linux client with sound (SDL2_mixer) by default;make SOUND=0builds
without it.
Removed
build-classic.sh: it only ranmake -C src -j$(nproc), and nothing referred to it.docs/obvious_bugs.md: all its bugs are fixed; the two design notes moved to
ARCHITECTURE_REFACTOR_PLAN.md.
Fixed
- Dedicated server: when its stdin closed (the lobby exited or restarted), the server spun at 100 % CPU
forever instead of quitting, becausepoll()reportedPOLLHUPwithoutPOLLIN. - Windows: crash on startup while listing maps. The
_findfirsthandle was stored in a 32-bitlong,
which truncates it on Win64 (same bug in race loading). A map file without an extension no longer
crashes the map list either. - Windows: variables named
near/farin the CPU player code clashed withwindows.hmacros. - Crash (double free) when leaving a network game, e.g. hosting and then connecting elsewhere: the
dispatcher thread was joined twice, first by the listener that consumes its queue and then by the
dispatcher itself. It showed up on Haiku, and on the other systems it was silent undefined behaviour. - Config-file parser (
dofile.cpp): values fromconfig.cfg, maps, races and schemes were copied into
fixed-size buffers without a length check. A player name over 20 characters or a map name over 30 could
overwrite memory. Values are now copied with the buffer size and truncated, with a warning in the log.
The config file path is no longer limited to 128 characters (deep Windows folders), and twodelete
calls on arrays were corrected todelete[]. Covered bytests/cpp/test_dofile.cpp(built with
AddressSanitizer, part ofmake test-ai). tests/cpp/ai_smoke.shfailed to build since 0.2.0 because it did not copyVERSION.- The map list no longer relies on
dirent::d_type(missing on Haiku) and no longer crashes on a file
without an extension inmaps/.