In this update2
Full notes
Full Blackdoor update
Read the full published notes in a cleaner layout. The original post stays linked below.
What changed
- Events
- Performance
- Gameplay
- Server
- Fixes
- UI and audio
Blackdoor changes
Features
- Music, for real this time - the music command is liveview the playlist, music next / music prev to skip around, music to jump straight to a track, or music set to loop one track on repeat instead of rotating, for anyone who just wants one song. Tracks now play out in full - around four minutes each, matching the standalone soundtrack - and fade out naturally before handing off to the next one, instead of the old hard cut on a fixed timer.
forkbomb - a last-resort recovery command for a remote server you've broken beyond normal use (accidentally deleted its own /, or a stray script wrote a file literally named after a directory path). Crashes the target and restores it fresh from backup, undoing every change you've made to it - deleted files, uploads, cracked users, all of it. Asks for confirmation first. Not an actual attack - it's a reset button, framed as one.
New: get_cpu() - returns your current aggregate CPU load (0-100) across every running process, the same number your own status bar shows. Scripts can now self-throttle (if get_cpu() > 80: sleep(0.5)) instead of finding out about overload only when everything gets killed.
New: object.remove(key) - removes a property from an object, joining keys()/values()/has(). Objects previously had no way to delete a key at all.
creds - a formatted view of every cracked username/password, grouped by server. Reads the same ~/.ssh/credentials file cat already showed you, just organized - no more tracking it yourself.
Bug Fixes
Confirming a completed mission in IRC could silently fail to advance it - replying "yes" when an NPC asked for confirmation crashed partway through an internal check on almost any mission (a leftover call meant for a plain dictionary, used on a typed object instead), so the mission never moved to its upload step or finished, even though every objective was already checked off. This was a serious one - by far the most impactful fix in this patch.
Two "delete/scrub" mission objectives could become permanently unsatisfiable - clearing /var/log/auth.log (or any other common path) only counted if it was gone from every server you'd ever registered, not just the mission's own target. On a path that common, some other server almost always still had a copy, so the objective could never complete. It now only checks the mission's own server(s), and multi-server missions can point a specific objective at one server directly.
Abandoning mission_00 or a Daily/Weekly Audit and then finishing something else could corrupt that mission's completion - the abandon handler only reset its "is this mission active" flag for the base Full Audit, not mission_00 or the Daily/Weekly variants. Finishing an unrelated mission afterward could get silently rerouted through that abandoned mission's completion logic instead of its own.
cp on an encrypted or protected file dropped both the encryption and protection on the copy - cat-ing the copy showed the plaintext immediately, no cracking required, defeating any encryption-gated file. The copy now carries over encryption and protection state, same as the original.
Browser back button could leave you interacting with the wrong server - after following a link to another server and pressing back, the page shown reverted correctly, but the browser's internal "current server" pointer didn't - so the next form submit or login on that page could hit the server you'd left, not the one on screen.
mkdir foo/ (trailing slash) silently created an unreachable phantom directory, and mkdir .. created a literal folder named .. instead of failing sensibly - mkdir's path handling never normalized paths the way every other file command already does. Also fixes the same family of bug in mv/cp/grep/mkdir, where a filename that happened to start with ~ (but wasn't a home-folder shorthand) got mangled instead of treated literally.
/join//leave in IRC required exact-case channel names while /msg and /whois didn't - /join #Blackdoor failed even with #blackdoor open. Now case-insensitive like its siblings.
exit claimed nothing was connected even when a background script still held a connection - it skipped the same explanation disconnect already gives in that situation, which points you at ps/kill instead.
decrypt(conn) (missing the required path argument) hit a raw engine error instead of the usual decrypt: ... message every other function in the API gives for bad input.
List/string indexing didn't support negative indices (list[-1], "abc"[-1]) even though pop()/insert() already did and the v0.11.0 notes said it should - fixed to match.
neofetch, sysinfo, credits, and fortune are real, working commands that were missing from tab completion and typo suggestions. Added.
.size() on lists and strings was implemented but missing from the editor's built-in cheatsheet. Added.
upload(conn, local_path, "/some/dir/") (trailing slash, no filename) wrote a file literally named after the directory instead of appending the source filename - the directory check didn't strip the trailing slash first, so it silently missed the stored directory entry. Same bug already fixed for scp in v0.11.0, just never applied to the scripting API's own upload().
The Mission and Network panes could go blank after a live layout.cfg edit (or loading a save with a custom layout) and stay blank until quitting to the menu and back - both panes only render their own content once, the first time they're built; every later panel rebuild reuses the same control as-is instead of re-rendering it. Now re-rendered every time panels rebuild, not just the first.
A side mission's crack objective could never complete - side_gains_and_losses.json used "user": "cto" instead of "target": "cto", a field the loader doesn't read, so the crack check silently checked against an empty username forever.
A side mission's log-scrub objective could become permanently unsatisfiable - same bug class as the delete fix above, just not applied to scrub_log: with no server specified, it checked every registered server's log for the player's IP instead of just the mission's own target.
Several servers listed filesystem entries at the root level (lib, run, sbin, sys) that didn't actually exist - ls / would show them, but exploring any of them failed. Added the missing entries.
The shop mislabeled its own leaderboard server's IP, and referred to one of its own products by an old, unused name in three different places on its own pages - both now consistent with what's actually for sale.
Upload mission objectives only checked that a file existed at the destination, not what was in it - writing any file with the right name to the drop server completed the objective, real evidence or not. Now checks the actual file content against the source you were meant to deliver; the destination filename no longer has to match at all, only the content.
Static
Source
Changelog.gg summarizes and formats this update. How we read updates.
