Repository navigation
Releases: ForkedInTime/keeperfx-tux-edition
Release list
KeeperFX: Tux Edition 1.4.0.6062
Warning
Saved games from earlier versions cannot be loaded by this release — for the last time.
Saved games used to be a direct copy of the engine's memory, so any change to
it made every older save unreadable. From this version on a saved game
describes its own layout and is read field by field, so saves made with this
release keep loading in later ones. Saves from earlier versions are kept on
disk and listed greyed out; they still open in the version that wrote them.
Campaign progress is not affected: Continue, completed levels, bonus levels
and the creatures carried to the next level all carry over, as do high scores.
Finish a level in progress on your current version before updating, or replay
it from its start.
Replaces 1.4.0.5660 as the stable release. Everything the alpha line accumulated from 1.4.0.5696
to 1.4.0.6013 (the changelog has them release by release), plus the fixes made since 6013 (listed here), promoted after a full pass:
static analysis of the engine with every finding checked against the code, valgrind on 35 levels for
15 minutes each, every campaign under AddressSanitizer and UndefinedBehaviorSanitizer, all 35 level
starts, six replays played back in step, a ten-minute multiplayer game, save and load on eight levels
and on copies of players' saves, the AppImage started on Ubuntu 24.04, Debian 13 and Fedora 41, the
Arch packages upgraded from the real 5660 ones, and many hours of play on the alpha line.
Saved games from 1.4.0.5660 and earlier cannot be loaded by this release — for the last time.
From this release on a saved game describes its own layout and is read field by field, so saves made
with it keep loading in later versions. Your 5660 saves stay on disk and are listed greyed out under
their titles; they still open in 5660, which updating keeps (keeperfx-tux-previouson Arch,
previous/beside the game for the AppImage and Flatpak). Finish a level in progress on 5660 first,
or replay it from its start. Campaign progress — Continue, completed levels, bonus levels and the
creatures carried to the next level — carries over, and so do high scores. The release notes
repeat this automatically.
In short, since 5660:
- Two months of the team's work. Five syncs through 19 October and fixes from the week after:
their OpenGL renderer (opt-in withRENDERER=OPENGL; the software renderer stays the default), the
new save format, a progress file per campaign, a replay recorded for every campaign level (zoom,
pause, hold Backspace to rewind), claimed rooms that merge with their neighbours, multiplayer
spectators and colours picked in the lobby, desync fixes, and much else. - No Windows in this repository. The team's code is merged with its Windows-only parts removed,
proven not to change what Linux compiles. - Bugs from players' games. Workers quitting a room they cross, scavengers taken out of their room
every 20 turns, imps fetching crates for traps they cannot reach, hatchery counts, rebirth, magic
doors, explosions, abyss kills, script commands that missed the creatures already on the map. - Security. Chat and replays can no longer act on your machine, and Lua's own file functions no
longer let a map script write or delete your files. - 64-bit fixes. Creature shadows in the software renderer, level-script effects, timers, movie
recording, high-score files, the light table in saved games, the hand's config flags. - Launcher. Renderer, map fade, viewport mode, zoom distance and replay settings; a golden keeper
for stable releases in the news; Save no longer switches settings off on an older config (below).
Since 1.4.0.6013-alpha:
- The game no longer closes after a few Lua errors. When a Lua command failed — typed in the
console, or a map script'sRUN_LUA_CODE— the engine took two values off Lua's stack where a failed
command leaves one. Each failure sank the stack a slot, and on the sixth LuaJIT exited: the game
closed with nothing in the log but "Application exit called", and nothing was saved. A mod's Lua hook
(creature states; object, trap, door and shot updates; trap activation; shot hits) that raised an
error did the same every turn, and took its result from below the stack (for an object's update, a
negative value means "deleted"). Measured: 40 failing commands and 40 that return values, and an
object whose update always fails for 20 seconds, with the game and Lua still running. Upstream has
the same bugs. - Saved games on levels with their own config files read those files again — the team's fix
(#5550), taken ahead of the next sync. A save stored the "selected level" as 0, so loading one read
map00000.*instead of the level's own rules, objects, slabs or creatures. On Pandaemonium level 4
the reload fired the level's final assault at once (hero creatures on the map 61 → 77). Heroes'
Journey, Pandaemonium, Sapphire Realms and some personal levels ship such files. - Creatures no longer choose a step from leftover memory. 52 height lookups built their position
from x and y only, and so did a temple sacrifice drop, a room spot for a new imp and a wall-hug step:
whatever the stack held decided the outcome, so replays and multiplayer peers drifted apart (a level
220 replay went out of sync at turn 6,200). valgrind on that replay: 36 uninitialised-value errors
before, none now. Replay files no longer carry unset bytes in their header either. A replay recorded
by an earlier version can go out of sync part-way through. - A level saved part-way through replays in step. The save put every replay of that level a turn
behind from that point ("Out of sync" on every turn, every later move a turn early), and rewinding
(hold Backspace) across any pause dropped you to the main menu. The fix is in the reader, so earlier
recordings with a save in them replay correctly too. - Map-script fills over a large area no longer write past their buffer.
CHANGE_SLAB_OWNER,
CHANGE_SLAB_TYPE,CHANGE_SLAB_TEXTUREand reveal fills kept a 16-bit entry per slab in room for
one byte per slab. No shipped level comes close (the largest of the 111 shipped fills needs 52). - Mods that hang the game or reach past a buffer. A mod defining a 256th room type froze the game
at load; the count is now capped at 255 with a warning, asNEW_ROOM_TYPEalready does. A dig shot
with a modded Health of 256 or more could hang first-person digging. Room teardown on a corrupted
slab list, two route lookups, a negative effect id and a path helper no longer write or read past
their buffers. - Map-script settings that did nothing.
SET_POWER_CONFIGURATIONset 0 for Spell, Effect,
UseFunction, CreatureType and CostFormula (and Spell wrote the cooldown); a power's top overcharge
level charged its duration as the price; a matchingBLOCKED_PICKUPhand rule blocked instead of
lifting the block; party range checks could never be true. - No memory leak on every level start. The TOML parser that reads the slab, column, effect and
level files kept every table name: 92–124 KB per level start. The sanitizer pass now checks that
parser too. A campaign without a credits line (revlord) no longer opens a folder as its credits. - The hand keeps its object flags after a one-flag Castability change. On 64-bit Linux, config
fields of typelongwere read back as 32 bits, soCastability = <FLAG> 1in a mod, a campaign's
magic.cfgor a map script wiped flags 32–40: picking up and slapping objects. Stable 5660 has the
same bug. Also the team's fix for the minimap zooming fully in when a save loads (#5540), taken early. - The game keeps its last five logs (
keeperfx.log.1to.5); every start used to overwrite the
log of the run before. - Found by the sanitizers: a multiplayer host read before the start of the session list on every
lobby update, and a game folder whose log path came to exactly 144 characters wrote a byte past a
buffer. - The startup error dialog shows without libXrandr. On a system without it (a minimal Fedora, for
one) the AppImage's engine segfaulted instead of saying why it could not start — the known issue in
the 1.4.0.5652 notes. The AppImage now carries libXrandr. - Arch: the package replaces copies an AppImage left in the game folder. They shadowed every
package upgrade (August artwork, no scrollbar on the Load menu). Identical copies become links;
anything else is moved to.replaced-by-package/, never deleted. A weekly check now flags an Arch
library update that would need the engine rebuilt. - Launcher: Save keeps the game's defaults. A
keeperfx.cfgolder than a setting has no line for
it, and the game uses its default; the Settings dialog read the missing line as off or empty, and
Save wrote that back: VSync, relative mouse mode (the cursor jumped on Wayland), delta time, edge
panning and the possession cursor lock off, the startup screens and the zoom limit gone, and the
creature flower, select box, hand sizes and API port saved empty, which the game reads as 0. A config
already saved that way keeps its values: tick Relative mouse mode (Input) and Enable VSync
(Graphics) once. - Launcher: stable releases in the news panel carry a golden keeper; alphas keep the red one.
- Quieter logs: a boulder sinking into lava, deleting a switched-off light and moving crates off a
lost workshop slab no longer log errors. - Downloads are named
KeeperFX-Tux-Edition-x86_64.AppImageand.flatpak; the AppImage is attached
under its old name too.
Known:
- With
RENDERER=OPENGL, movies play in 256 colours; the software renderer plays them in full colour. - With Automatically determine max. FPS on, the frame cap can step down after a l...
KeeperFX: Tux Edition 1.4.0.6013 alpha
- Movies play in full colour again. Every movie the game ships — the intro, the logo stings, the
torture-room and outro films — is modern H.264 video. Up to stable 1.4.0.5660 they played in full
colour and were scaled smoothly to the screen. When the team's new renderer arrived with the
16 September sync, the fork's display layer that did this went with it, and from 1.4.0.5698-alpha
on every frame was squeezed into 216 fixed colours with a dither pattern, then enlarged with
uneven pixels: speckled dark scenes, banded light, a cross-hatch over everything on a big screen.
Found by a player on the first evening of 1.4.0.6010. The team's renderer now takes a full-colour
image too, and the software renderer draws movie frames on a texture of their own, smoothly
scaled. Measured on the same intro frames at 3440x1440: 30–43 distinct colours in the middle of
the picture in 1.4.0.6010, 27,000–61,000 now (stable 1.4.0.5660: 31,000–82,000), and side by side
the frames match 5660's. WithRENDERER=OPENGLmovies still play in 256 colours for now; the log
says so once. - Same save format as 1.4.0.6010: its saves load here. Coming from an earlier version, read the
1.4.0.6010 notes first.
KeeperFX: Tux Edition 1.4.0.6010 alpha
Warning
Saved games from earlier versions cannot be loaded by this release — for the last time.
Saved games used to be a direct copy of the engine's memory, so any change to
it made every older save unreadable. From this version on a saved game
describes its own layout and is read field by field, so saves made with this
release keep loading in later ones. Saves from earlier versions are kept on
disk and listed greyed out; they still open in the version that wrote them.
Campaign progress is not affected: Continue, completed levels, bonus levels
and the creatures carried to the next level all carry over, as do high scores.
Finish a level in progress on your current version before updating, or replay
it from its start.
Saved games from earlier versions cannot be loaded by this build — for the last time. With the
team's new save format (below) a saved game describes its own layout and is read field by field, so
saves made with this build keep loading in later ones. Saves from 1.4.0.5762-alpha, from stable
1.4.0.5660 and from every earlier build are kept on disk and listed greyed out under their titles;
they still open in the version that wrote them, and saving into one of their slots moves the old
save to the trash instead of writing over it. Finish a level in progress on your current version
first, or replay it from its start. The release notes repeat this automatically. Campaign
progress — Continue, completed levels, bonus levels and the creatures carried to the next level —
carries over, and so do high scores (see below).
No more Windows in this repository.
- The team's Windows content is gone, and the weekly sync cannot bring it back. Their Visual Studio
project, the MinGW/MSVC CMake build and vcpkg, a Windowsgdb.exe, CUnit's Visual C++ solutions,
the Windows-only platform code, their Windows CI, and every#ifdef _WIN32branch in the engine and
the vendored libraries — 281 files, about 101,000 lines. The sync no longer merges the team's
commits directly: it takes their tree, removes the Windows content (packaging/linux-only/), and
merges that snapshot, so Windows files are on neither side of a merge and never conflict again.
Proven not to change the game: every file the Linux build compiles was preprocessed with and
without the filter — 315 identical, one with identical machine code — and the sync repeats that
proof every week. A guard workflow fails any pull request that reintroduces Windows content. - The sync also adds the team's new source files to
linux.mkby itself (previously a manual edit
after every sync that added one), generates the fonts and runs the unit tests, and when it cannot
finish it updates the open sync issue instead of opening a new one every Monday. Upstream's
Makefilestays: the release builds use it to regenerate the artwork.
The team's changes through 9 October (48 commits, merged through the new Linux-only sync).
Among them: every campaign you play keeps its own progress, and a saved game that fails to load
resumes that campaign instead; replays can be zoomed, paused, turned off, and survive resyncs;
multiplayer gains spectators, keeps lobbies listed while playing, and fixes several desyncs; the
parchment-map fade is on by default at every resolution (PARCHMENT_MAP_FADE=OFF turns it off);
creatures and objects get configurable inertia and fall acceleration; Lua scripts are sandboxed and
read the date and time without desyncing multiplayer; plus fixes to flying over lava, boulders,
hatcheries, the abyss, possession and camera stutter with VSync. Two of these needed Linux fixes:
- Campaign progress carries over. The team moved progress from one
fx1contn.savto a file per
campaign and imports the old file once — but only in the layout 32-bit Windows writes. Every Linux
build wrote it 160 bytes longer (its campaign flags were 8-bytelongs), so the import would have
skipped it and the Continue button would have vanished with every player's campaign position. The
64-bit layout is now imported too, checked field by field against a file written by stable
1.4.0.5660 itself. The old file is also left in place instead of deleted, so going back to a
stable build that predates the change keeps that build's own Continue. - The new multiplayer matchmaking passed curl a 4-byte timeout where curl reads 8 bytes on 64-bit
Linux, leaving half of it undefined.
The team's changes through 19 October (48 commits, 13–19 October). The big one is the new save
format: saved games, the continue link and campaign progress describe their own layout and are read
field by field, so a change to the engine no longer makes every older save unreadable — after this
one last time (the box above). Among the rest: hold Backspace to rewind a replay, and replays skip the
intro cinematic; claimed rooms merge with adjacent rooms of the same kind; in multiplayer you pick your
colour in the lobby, lobby buttons respond at once, disconnect messages are clearer, and spectators are
shared among the players, switch view with Space or a click on a name, and can sync again; a faster
software parchment-map fade; a destroyed heart reveals the map after its explosion, not before;
tooltips no longer hide behind the hand; possession no longer slides or turns the creature north, and
the hand's light is off while possessing; chickens no longer breathe fire; the computer no longer
reuses, as defenders, creatures it has just dropped; Shift+M recording shows a timer;
CHAT_FONT_SIZE in keeperfx.cfg; USE_SPECIAL_STEAL_HERO and alternate player names in script
locations. It also brings fixes of theirs this fork had already taken early, among them a
temple that counted a creature leaving it twice, and so shielded fewer creatures from enemy scavenging
than were praying in it, and drag and shaped room tools that could start one slab outside the shape.
Some of it needed work here:
- The hand can pick creatures up. The team's new config check limits
longsettings to 32 bits, as
on Windows. On 64-bit Linux the hand's, Slap's and Pick Up Object's "what can it touch" flags are such a
setting and go past 32 bits, so they were refused at every level start and the hand picked up
nothing. Those settings take their full 64-bit values again, as in every earlier Linux build. - Campaign progress still carries over. The new code again imports the old
fx1contn.savonly in
the 32-bit layout (67,241 bytes). Every Linux build wrote 67,401, stable 1.4.0.5660 included, so a
5660 player would have lost Continue and the progress percentage, and the campaign, its bonus
levels, carried creatures and flags would have started over. The 64-bit import is back, the
old file is still kept for stable, and Continue falls back to it only while that campaign has no
progress file of its own. - Saves from earlier Linux builds are listed under their titles, not as
fx1g0003.sav. The new
code reads a save's title after a 12-byte header; every save 64-bit Linux builds wrote before
1.4.0.5751, stable 1.4.0.5660 included, has 24-byte ones. Checked against a save stable 5660 wrote. - The message for a save that cannot be loaded is not blank. The download's game text came from
the team's July release, so every message added since showed as nothing: that one, and the newer
spectator and lobby messages. Every release now compiles the text from the team's translations, as
it already regenerates the artwork. - A save in a deep folder loads. The new loader cut a save's path to 144 bytes, so with a long
home directory or a Flatpak data directory the file read as missing and its slot was disabled. - A merged room keeps the creatures heading for it. Creatures on their way to a room that merges
into its neighbour, or that last worked there, still pointed at the absorbed room, whose number then
goes to the next room built.
Ten of the team's fixes from the week after, taken early: creatures stop fighting when their
keepers ally; creatures no longer ask for a lair while you cannot build one; moving a library's books
no longer turns that spell off; navigation is updated when a neighbouring slab changes; possession
camera fixes; rewinding a replay restores the maps and event boxes; no crash when the host leaves after
a failed join; a possible wrong slab display; a creature's previous work room survives changes to its
current one; and the hand's pickup priority. Next to the books fix, ours: another keeper losing a spell
— claiming or robbing an enemy library, or a neutral one shrinking — no longer clears your own
selection of it.
Creatures, rooms and imps. Most of these were found in players' logs from stable 1.4.0.5660.
- Workers keep working in their own room. A worker crossing a slab of another room between spots —
a bridge through a training room, the training room beside the workshop — quit: about a hundred
"is not valid ROOM_ROLE_TRAIN_EXP" lines in one log, most of them imps dropped in to train. On copies
of that player's saves: 9 and 37 such quits on 5660, none with the fix; in a U-shaped training room
around a bridge, all 8 trainees gone within 30 seconds before, all 8 reaching level 2 after. A worker
stepping off its room's edge for a moment no longer pays the training fee for no experience. - A creature dropped into training once and scavenging later was taken out of its scavenger room
every 20 turns and enrolled again, for the rest of the game: a computer keeper's vampire on original
level 20 did it 382 times in one session. - The computer's creatures the training room cannot take (level 10, or training it cannot afford)
go to the room they were picked for, not onto its heart: 355 errors in one level 20 log; on a staged
level 20, 69 in about 4000 turns before, none after. - Imps and traps. An imp that finds no ro...
KeeperFX: Tux Edition 1.4.0.5660
Replaces 1.4.0.5656. One engine fix and the September launcher, nothing else:
- No more black band across the screen when you cast Call to Arms. The charge bar under the
selected spell measured the spell's age without a ceiling. Call to Arms lasts a single turn, so
one turn after you planted the flag the bar's empty part had a negative width, which the drawing
code read as a huge one: a black strip about 20 pixels tall ran from the panel to the right edge
of the screen and slid off over the next second, every time you cast. The age is now capped
before the bar is drawn, and a freshly planted flag no longer logs "Invalid CTA object life
state 0". Checked on the save it was reported on: the band shows on 5656 and in none of 20
consecutive frames on this build. Upstream has the same bug. - The launcher from the alpha channel, out there since 1.4.0.5762. New settings: VSync,
relative mouse mode, cursor capture, the maximum zoom distance and a Multiplayer tab; clearer
4:3 choices under Resize movies; packet file names can no longer be edited in the Run packetfile
dialog. Controls for features this engine does not have yet (the OpenGL renderer, the map fade,
viewport mode and replays) are greyed out and arrive with the next stable.
Saved games from 1.4.0.5652, 5653 and 5656 load unchanged: no data layout was touched.
KeeperFX Tux Edition 1.4.0.5762 alpha
-
The High Score Table names the level and titles its columns. Bullfrog's table printed a level
number, which reads fine in the numbered original campaign and meant nothing for a custom map (a
personal map showed as "30117"). Each row now shows the level's name, looked up in the campaign
or map pack the table belongs to, under a Score / Level / Name title row; the number is kept as
a fallback for a row the selected pack has no such level for, because several packs write the
same score file. Long names are cut at the column edge; nine rows are visible instead of ten.
The score itself is untouched: Bullfrog's peak dungeon rating, doubled for free-play maps. -
The artwork now tracks upstream, not their July release. The payload took its sprite sheets,
fonts, textures and land views from upstream's last stable package while the engine in the
same download was built from their master, so anything upstream added together with new art
shipped here without the art. Found with the in-game Load/Save scrollbar (their #5106): six new
sprites, a sheet with 239 entries against 245 wanted, "Reserved button sprite 239 has no
matching entry" in every log, and no scrollbar at all for anyone with more than eight saves.
Fourteen upstream artwork commits since July were missing by now. Every release build now
regenerates the artwork from upstream's FXGraphics repository the way their own builds do, so
this download carries the scrollbar, the coloured message icons, the multiplayer bullfrog
colours, the font fixes, the torture screen and the floor next to the Abyss slab. -
When an imp cannot deliver a crate to a trap, the log now says why. "Cannot deliver crate"
appeared two dozen times in one session for traps on plain claimed floor, and every reason the
engine can refuse the walk was logged only at debug level. The failure now writes one line with
the pieces that decide it: the in-wall check at the target, the route with and without the
locked-door rule, the mesh regions at both ends and whether they connect, the owner's door
counts and the map-changed flag. Only on failure, so it costs nothing in normal play. -
README: before/after pictures of the high score table on a custom campaign and a custom map
pack, a three-step picture of deleting a saved game, and a live "this page last updated" badge. -
Launcher: the Viewport mode dropdown, the Max. zoom distance slider and the replay
controls (Max. replay size, Keep replays per campaign / free play / multiplayer), written
under whichever key names the running engine reads and showing the engine's defaults when a
config has no replay lines; the retired Command character field is gone; the log viewer's open
folder button and the workshop links open with the AppImage's library path stripped. -
Saved games from 1.4.0.5732 keep loading. The save format did not move this time
(sizeof(struct Game)is still 53383086 bytes), measured by the release guard, not assumed. -
Upstream sync: dkfans master through d19666f (14 commits, 23–29 September). Every game is
now recorded as a compressed replay underreplays/(campaign, free-play and multiplayer folders),
kept toMAX_REPLAYS=5 5 10files of at mostREPLAY_MAX_SIZE=32768kB each, oldest evicted
first; a manual-packetsavestill takes precedence, and-packetloadis now a replay viewer with
a free camera and Tab cycling through the human players, with the console usable during playback
and chat messages replayed deterministically. Multiplayer can no longer be won by proposing
alliances, and the non-scripted victory checks that produced surprise wins in co-op are gone. The
OpenGL renderer packs sprites with atlas UVs so edges no longer bleed. The configurable command
character is gone (it was a workaround for broken keyboards). Lua:StandInis nowPlaceholder,
AddShotToLeveltakes a parent, and things moved by script no longer interpolate across the jump.
Two multiplayer maps get their creature attraction back. Theplayer->is_activeflag was
refactored away with no gameplay change. -
Upstream's script-command union fix, made right for a 64-bit build. Their #5357 moves the
x/y/icon of positioned messages to bytes 8–13 of the script value, which clears the location on
their 32-bit Windows build (bytes 4–7) but lands exactly on it here, wherelongis 8 bytes and
the location sits in bytes 8–15. This build takes their short slots and keeps the location where
the fork already moved it (bytes 16–23), so both are clear. The fork's rule that only
DISPLAY_INFORMATIONcarries an icon argument stays: upstream still reads the y coordinate of
DISPLAY_INFORMATION_WITH_POSas an icon name. Proven with the positioned-message test map: the
green information icon, not a random panel sprite. -
Two config keys of ours moved again. Upstream took ids 52 and 53 for the replay settings, on
top of 51 and 52 last week;TRASH_MAX_COUNTandTRASH_MAX_DAYSnow sit at 55 and 56.
Existing config files need no edit.COMMAND_CHARandPACKETSAVE_MAX_SIZEleave the shipped
config; an old file still carrying them logs one "deprecated" line and carries on. -
Verified with the headless suites against stable 5656: the sync check (12/12), the common
regression suite (same warning set as stable), the new-paths suite (all pass), the OpenGL smoke
test, a twenty-second sweep of every campaign's levels (all alive), a replay autosaved on a menu
quit, and the positioned-message proof map.
1.4.0.5732 alpha
Warning
Saved games from earlier versions cannot be loaded by this release.
A change in this build altered the layout of the in-memory game state that
saved games are a direct copy of. The engine accepts a save only when its
size matches the running build exactly, so every save written before this
version — including autosaves and the "Continue" slot — will be refused.
Finish anything in progress on your current version before updating, or keep
the old build alongside this one.
Saves made from this version on stay loadable until this warning appears again.
(Game state size: 53362370 → 53383086 bytes.)
- Saved games from 1.4.0.5700 and from every stable build will not load in this build. Upstream
flattened the union insidestruct Room(each room now carries its storage capacity, entrance
links, per-model lair counts and hatchery turn side by side instead of sharing one slot), moved
two roomspace fields out ofstruct PlayerInfo, and dropped an unused byte fromstruct Game.
The saved blob is that struct verbatim, so its length changed (53362370 → 53383086 bytes) and the
loader refuses older saves with the usual warning instead of guessing. Start new games; the saves
are not touched. - Upstream sync: dkfans master through 7ca23d1 (26 commits, 16–21 September). Multiplayer:
players who drop are handled without desyncing the rest, replays and packet saves carry a format
version andPACKETSAVE_MAX_SIZEcaps the recording, the "out of sync" log spam is gone, dig
tasks are checksummed, STUN keepalives and a rewritten hole punch keep connections alive, the
roomspace flicker on Ctrl+wheel is fixed, and Lua state serialises correctly. Gameplay: things
placed by script land at the right height, script-moved creatures start in a sane state, the sell
button resets on map start, LuaStartMoneyreplaces gold instead of adding to it, empty tooltips
are fixed and the Abyss slab has one, Lua can define room capacity functions. Renderer: OpenGL
fixes part 5 with the text clipping and objective-length fixes, and semi-transparent panels fill
their corners. The log now lists the audio devices. Creature target search was refactored for
speed; its profiling hooks are compiled out here. - Kept our own defaults where upstream changed theirs. Upstream's shipped config now defaults to
the OpenGL renderer; this build keepsRENDERER=SOFTWAREuntil their fix series (part 5 of 8)
ends — OpenGL remains one config line away, and the launcher now has a dropdown for it.
UNLOCK_CURSOR_WHEN_GAME_PAUSEDdefaults to on, as upstream's does now. - The parchment map fade is a setting, off by default (
PARCHMENT_MAP_FADE). Upstream added the
switch and removed the rule that skipped the fade above 320 pixels wide on the software renderer;
that rule is kept here, so turning the fade on at desktop resolution under the software renderer
still cuts instantly instead of running the slow per-pixel path. Two config keys of ours moved to
make room for upstream's new ones; existing config files need no edit. - Launcher: a Renderer dropdown (Software or OpenGL) and a Fade when opening the map
checkbox on the Graphics tab, reading and writing the game config; a config without a renderer
line shows Software, as the engine treats it. The launcher binary carries its version in an ELF
section for crash reports and packaging.
KeeperFX: Tux Edition 1.4.0.5656
Replaces 1.4.0.5653. One fix on top of it, with its safety nets, and nothing else:
- A defeated keeper's creatures no longer poison the room worker lists. When a keeper's last
heart dies the engine turns every creature it owned towards the nearest portal — without leaving
the state it was in. A creature that was training (or researching, praying, imprisoned) kept its
place in that room's worker list; once it was killed on the way out, or reached the portal, its
slot was freed with the room still chaining through it. Every list walk from then on stopped at
the dead node ("Jump to invalid creature"), the workers behind it were orphaned pointing at a
room index that a bridge or workshop later reused, and the game spent the rest of the session
logging creatures working in rooms of the wrong kind. Read out of a 5652 log (enemy heart
destroyed at turn 315366, the first dead node in that keeper's training room 1600 turns later,
then 500 warnings about trainees and crafters "in" bridges), reproduced with a scripted level,
and fixed at the source: the redirect now runs the abandoned state's cleanup first. Upstream
has the same gap. - Two safety nets behind it. A creature deleted while still in a worker list is unlinked at
deletion and the log names the state that let it through; a room being deleted severs every
control still naming it, chain or no chain. Neither fires on a healthy game. - Also in the same change: a creature preparing to cast a ranged buff is cleaned up as what it
was doing (the same leak through a different door; only custom campaigns use these spells);
room rebuilds re-home workers only into a room of the same kind (the "Room BRIDGE index 39 is
not valid ROOM_ROLE_TRAIN_EXP" storm); and an imp that rested to full health no longer drops
into state 0 for a turn.
Saved games from 1.4.0.5652 and 5653 load unchanged: no data layout was touched.
KeeperFX: Tux Edition 1.4.0.5653
Replaces 1.4.0.5652. One fix on top of it and nothing else:
- Positioned script messages no longer wear random icons.
DISPLAY_INFORMATION_WITH_POS(text, x, y)
fed its y coordinate to the custom-icon parser — an upstream slip in the custom-icon feature, and
get_icon_idon a number is justatoi— so a message placed at y=154 showed the alarm-trap
lightning bolt, at y=112 the Hold Audience gate, at y=55 the guard post: the wrong picture, drawn
at its own size, spilling out of the message column and blinking while unread. Found in a tutorial
map; every map that places information messages was affected. The icon is read only for the form
that takes one.
Saved games from 1.4.0.5652 load unchanged; the game-state layout is untouched.
KeeperFX: Tux Edition 1.4.0.5700 alpha
- A defeated keeper's creatures no longer poison the room worker lists. When a keeper's last
heart dies the engine turns every creature it owned towards the nearest portal — without leaving
the state it was in. A creature that was training (or researching, praying, imprisoned) kept its
place in that room's worker list; once it was killed on the way out, or reached the portal, its
slot was freed with the room still chaining through it. Every list walk from then on stopped at
the dead node ("Jump to invalid creature"), the workers behind it were orphaned pointing at a
room index that a bridge or workshop later reused, and the game spent the rest of the session
logging creatures working in rooms of the wrong kind. Read out of a stable-5652 log: enemy heart
destroyed at turn 315366, the first dead node found in that keeper's training room 1600 turns
later, then 500 warnings about trainees and crafters "in" bridges. Reproduced with a scripted
level (a creature training when its keeper falls, then killed on the way out) and fixed at the
source: the redirect now runs the abandoned state's cleanup first, as the over-population path
already did. Upstream has the same gap. - Two safety nets behind it. A creature deleted while still in a worker list is unlinked at
deletion and the log names the state that let it through; and a room being deleted severs every
control still naming it, chain or no chain, so a reused room index can never inherit workers.
The 5652 list guards remain the last line. Neither fires on a healthy game. - A creature preparing to cast a ranged buff (Ranged Heal and kin) is cleaned up as what it was
doing. The preparation state parks the real state aside and restores it afterwards, but state
cleanup only looked at the preparation itself — a worker killed or interrupted mid-cast stayed
chained into its room. Same class of leak, different door; none of the stock creatures use these
spells, custom campaigns do. - Room rebuilds no longer push workers into the wrong room kind. Selling a slab out of a room
re-homes its workers into whatever room is under their feet; a trainee standing on the bridge
next door was listed as that bridge's worker, still training, until the job handler noticed and
reset it. Only a room of the same kind is accepted now. This was the source of the "Room BRIDGE
index 39 is not valid ROOM_ROLE_TRAIN_EXP" storm (339 lines in one session). - Imps no longer drop into state 0 after resting. An imp that walked to safety to recover, then
found itself healed, was restored to "no state" and reset the next turn ("illegal state[1], S=0"
in the log). It picks a proper start state instead.
KeeperFX: Tux Edition 1.4.0.5698 alpha
- Positioned script messages no longer wear random icons.
DISPLAY_INFORMATION_WITH_POS(text, x, y)
fed its y coordinate to the custom-icon parser — an upstream slip in the custom-icon feature, and
get_icon_idon a number is justatoi— so a message placed at y=154 showed the alarm-trap
lightning bolt, at y=112 the Hold Audience gate, at y=55 the guard post: the wrong picture, drawn
at its own size, spilling out of the message column and blinking while unread. Found in a tutorial
map; every map that places information messages was affected. The icon is read only for the form
that takes one. Saved games are unaffected.