Cold Takes/1 - Why Zero-K
This is the first in a new series of design blogs about Zero-K. We aim to release one every two weeks, when there isn't a patch, and by 'we' I mean me, GoogleFrog (others might contribute later). Expect posts about Zero-K development, design, history, and whatever else comes to mind.
To start us off, why is Zero-K even called Zero-K? It started around 2009 when a mod called Complete Annihilation wanted to throw off the shadow of being "just another alphabet soup mod", the term for games on the Spring Engine that traces themselves back to Total Annihilation. The mod split off from Balanced Annihilation a few years earlier, which forked off Absolute Annihilation, which was based on Uberhack and subsequently ported to Spring. For those of you aware of BAR (Beyond All Reason), it is based on Balanced Annihilation and had the working name BA Reloaded.
Zero-K was picked after much discussion, deliberation, argument, and finally, a vote. We had a site at the time, called CaGov, where developers could create polls and vote on things. We voted on things from whether taking damage should decloak (it does) and whether all bombers should be replaced with laser bombers (only Thunderbird was replaced). The simple version of the Zero-K name is that it won, beating a few other proposals, the only other of which I can remember is Robocracy.
Edit: Longtime developer Sprung remembers "Ecce Machina" and the related name "why oh why is Deus Ex already taken". MidKnight remember "Open Conflict", because it's open source.
There were a few arguments in favour of Zero-K. The more narratively inclined like the idea of robots fighting pointlessly over the scraps of a universe approaching heat death, or zero degrees kelvin. That paid off in the lore for the campaign over a decade later (any more would be spoilers). We also coveted 0 A.D.'s alphabetically superior position on various lists, and thought we could force the shortening 0K. That did not work out.
Most of all, we wanted a unique name that would stand out and win at page rank, as search was all the rage in the late 2000s. We at least won that battle, defeating a book about cryogenics and a brand of dangerously cold single-use towelettes. The towelette company even sent us a sample after a Twitter interaction; the book still makes it to the image search preview in DuckDuckGo.
We may have been a bit too clever with the name. Zero-K stepped out of the shadow of Total Annihilation only a few years before Planetary Annihilation embraced it. Nostalgia aside, the latter is still a more descriptive name, and such names are common for strategy games. Think of all the names to do with armies or conquest. War, command, force, settle, empire, company, division, legion... the list goes on. Generic names indicate genre, which we gave up in favour of being unique. Maybe that sums up Zero-K.
Arguably the best aspect of the name revealed itself years after the decision was made - puns about low temperature - which far outweighs any downside. Zero-K: Nothing is cooler.
Debug data:
[SQLBagOStuff] MainObjectStash using store ReplicatedBagOStuff
[objectcache] MainWANObjectCache using store EmptyBagOStuff
IP: 216.73.216.107
Start request GET /mediawiki/index.php?oldid=9103&printable=yes&title=Cold_Takes%2F1_-_Why_Zero-K
HTTP HEADERS:
CONTENT-TYPE:
CONTENT-LENGTH: 0
USER-AGENT: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
HOST: zero-k.info
COOKIE: wikidb229_mw__session=jo3tskqt73hcu5lfg09tutqfhia5ktum
ACCEPT-ENCODING: gzip, br, zstd, deflate
ACCEPT: */*
CONNECTION: close[localisation] LocalisationCache: using store LCStoreDB
[session] SessionManager using store SqlBagOStuff
[session] Session "jo3tskqt73hcu5lfg09tutqfhia5ktum" requested without UserID cookie
[DBReplication] Cannot use ChronologyProtector with EmptyBagOStuff
[DBReplication] Wikimedia\Rdbms\LBFactory::getChronologyProtector: request info {
"IPAddress": "216.73.216.107",
"UserAgent": "Mozilla\/5.0 AppleWebKit\/537.36 (KHTML, like Gecko; compatible; ClaudeBot\/1.0; +claudebot@anthropic.com)",
"ChronologyProtection": false,
"ChronologyPositionIndex": 0,
"ChronologyClientId": false
}[DBConnection] Wikimedia\Rdbms\LoadBalancer::lazyLoadReplicationPositions: executed chronology callback.
[DBConnection] Wikimedia\Rdbms\LoadBalancer::getLocalConnection: connected to database 0 at 'localhost'.
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[DBConnection] Wikimedia\Rdbms\LoadBalancer::getLocalConnection: connected to database 0 at 'localhost'.
Title::getRestrictionTypes: applicable restrictions to [[Cold Takes/1 - Why Zero-K]] are {edit,move}
[ContentHandler] Created handler for wikitext: WikitextContentHandler
[MessageCache] MessageCache using store SqlBagOStuff
[localisation] LocalisationCache::isExpired(en): cache for en expired due to GlobalDependency
[localisation] LocalisationCache::recache: got localisation for en from source
[DBQuery] startAtomic: entering level 0 (LCStoreDB::finishWrite)
[DBQuery] endAtomic: leaving level 0 (LCStoreDB::finishWrite)
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] SqlBagOStuff::lock failed due to timeout for wikidb229-mw_:messages:en.
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[MessageCache] MessageCache::load: Loading en... local cache is empty, global cache is expired/volatile, loading from database
ParserFactory: using preprocessor: Preprocessor_Hash
Unstubbing $wgLang on call of $wgLang::_unstub from ParserOptions->__construct
[caches] parser: SqlBagOStuff
Article::view using parser cache: no
Article::view: doing uncached parse
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
[SQLBagOStuff] Connection mysql object #126 (handle id #120) will be used for SqlBagOStuff
Parser cache options found.
[Preprocessor] Cached preprocessor output (key: wikidb229-mw_:preprocess-hash:786a1c4c14cf8e966a462477686144fd:0)
[objectcache] Rejected set() for wikidb229-mw_:page:10:62473c79b69e43e489a3d7e851f6e8629f0832da due to pending writes.
[objectcache] Rejected set() for global:revision-row-1.29:wikidb229-mw_:1640:10032 due to pending writes.
[Preprocessor] Cached preprocessor output (key: wikidb229-mw_:preprocess-hash:17aa7002849cc6ce738a62fa8e371aed:1)
[objectcache] Rejected set() for wikidb229-mw_:page:10:1eea3d5309d2a88c1e83cbfafba24489c41a09ad due to pending writes.
[objectcache] Rejected set() for global:revision-row-1.29:wikidb229-mw_:1979:10035 due to pending writes.
[objectcache] Rejected set() for wikidb229-mw_:page:828:3df63b7acb0522da685dad5fe84b81fdd7b25264 due to pending writes.
[objectcache] Rejected set() for global:revision-row-1.29:wikidb229-mw_:78:981 due to pending writes.
[ContentHandler] Created handler for Scribunto: ScribuntoContentHandler
[Scribunto] Scribunto_LuaStandaloneInterpreter::__construct: creating interpreter: ""C:\Projekty\zero-k.info\www\mediawiki\extensions\Scribunto\includes\engines\LuaStandalone/binaries/lua5_1_5_Win64_bin/lua5.1.exe" "C:\Projekty\zero-k.info\www\mediawiki\extensions\Scribunto\includes\engines\LuaStandalone/mw_main.lua" "C:\Projekty\zero-k.info\www\mediawiki\extensions\Scribunto\includes" "0" "8""
[gitinfo] Candidate cacheFile=C:\Projekty\zero-k.info\www\mediawiki/gitinfo.json for C:\Projekty\zero-k.info\www\mediawiki
[gitinfo] Cache incomplete for C:\Projekty\zero-k.info\www\mediawiki
SiteStats::loadAndLazyInit: reading site_stats from replica DB
[objectcache] Rejected set() for wikidb229-mw_:SiteStats:groupcounts:sysop due to pending writes.
[objectcache] Rejected set() for wikidb229-mw_:file:73af53ccad147c77191d984a0352b7bfb895e391 due to pending writes.
[objectcache] Rejected set() for wikidb229-mw_:page:6:8c628847bf7fbf7a64e04d9e0421c3e5eabc1f26 due to pending writes.
[objectcache] Rejected set() for wikidb229-mw_:file:8c628847bf7fbf7a64e04d9e0421c3e5eabc1f26 due to pending writes.
[objectcache] Rejected set() for wikidb229-mw_:page:10:719ea396ad92e01b4757ec2b93bb1e5f270f771d due to pending writes.
[objectcache] Rejected set() for global:revision-row-1.29:wikidb229-mw_:12:79 due to pending writes.
[Mime] MimeAnalyzer::loadFiles: loading mime types from C:\Projekty\zero-k.info\www\mediawiki\includes/libs/mime/mime.types
[Mime] MimeAnalyzer::loadFiles: loading mime info from C:\Projekty\zero-k.info\www\mediawiki\includes/libs/mime/mime.info
File::transform: Doing stat for mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/1px-1_-_Why_Zero-K.jpg
TransformationalImageHandler::doTransform: creating 1x1 thumbnail at mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/1px-1_-_Why_Zero-K.jpg using scaler im
TransformationalImageHandler::doTransform: Transforming later per flags.
File::transform: Doing stat for mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/2px-1_-_Why_Zero-K.jpg
TransformationalImageHandler::doTransform: creating 2x1 thumbnail at mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/2px-1_-_Why_Zero-K.jpg using scaler im
TransformationalImageHandler::doTransform: Transforming later per flags.
File::transform: Doing stat for mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/2px-1_-_Why_Zero-K.jpg
TransformationalImageHandler::doTransform: creating 2x1 thumbnail at mwstore://local-backend/local-thumb/0/0c/1_-_Why_Zero-K.jpg/2px-1_-_Why_Zero-K.jpg using scaler im
TransformationalImageHandler::doTransform: Transforming later per flags.
[objectcache] Rejected set() for wikidb229-mw_:file:bc71b1076e9a9e5d986701177904770f44316f41 due to pending writes.
File::transform: Doing stat for mwstore://local-backend/local-thumb/e/e3/CA.2.jpg/927px-CA.2.jpg
[FileOperation] FileBackendStore::ingestFreshFileStats: File mwstore://local-backend/local-thumb/e/e3/CA.2.jpg/927px-CA.2.jpg does not exist
TransformationalImageHandler::doTransform: creating 927x350 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_a61343018c52.jpg using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
File::transform: Doing stat for mwstore://local-backend/local-thumb/e/e3/CA.2.jpg/927px-CA.2.jpg
TransformationalImageHandler::doTransform: creating 927x350 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_2c1a4a13bc41.jpg using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
File::transform: Doing stat for mwstore://local-backend/local-thumb/e/e3/CA.2.jpg/927px-CA.2.jpg
TransformationalImageHandler::doTransform: creating 927x350 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_82d54721809b.jpg using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
[objectcache] Rejected set() for wikidb229-mw_:file:80b8337df120f5aba2bcecb3e29f33283e353c1e due to pending writes.
File::transform: Doing stat for mwstore://local-backend/local-thumb/c/c3/DuckDuckGo.png/672px-DuckDuckGo.png
[FileOperation] FileBackendStore::ingestFreshFileStats: File mwstore://local-backend/local-thumb/c/c3/DuckDuckGo.png/672px-DuckDuckGo.png does not exist
TransformationalImageHandler::doTransform: creating 672x316 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_75ccef5e04f0.png using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
File::transform: Doing stat for mwstore://local-backend/local-thumb/c/c3/DuckDuckGo.png/672px-DuckDuckGo.png
TransformationalImageHandler::doTransform: creating 672x316 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_b61535729870.png using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
File::transform: Doing stat for mwstore://local-backend/local-thumb/c/c3/DuckDuckGo.png/672px-DuckDuckGo.png
TransformationalImageHandler::doTransform: creating 672x316 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_6a435fc249b2.png using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
[Preprocessor] Cached preprocessor output (key: wikidb229-mw_:preprocess-hash:786a1c4c14cf8e966a462477686144fd:0)
MediaWiki::preOutputCommit: primary transaction round committed
MediaWiki::preOutputCommit: pre-send deferred updates completed
MediaWiki::preOutputCommit: session changes committed
MediaWiki::preOutputCommit: LBFactory shutdown completed
File::transform: Doing stat for mwstore://local-backend/local-thumb/e/e3/CA.2.jpg/927px-CA.2.jpg
TransformationalImageHandler::doTransform: creating 927x350 thumbnail at C:\Windows\TEMP\mwtmp-IUSR/transform_047ee71f159d.jpg using scaler im
TransformationalImageHandler::doTransform: returning unscaled image
Title::getRestrictionTypes: applicable restrictions to [[Cold Takes/1 - Why Zero-K]] are {edit,move}