{"id":70,"date":"2026-07-06T20:31:12","date_gmt":"2026-07-06T20:31:12","guid":{"rendered":"https:\/\/blogs.scummvm.org\/andy\/?p=70"},"modified":"2026-07-06T21:17:35","modified_gmt":"2026-07-06T21:17:35","slug":"week-6","status":"publish","type":"post","link":"https:\/\/blogs.scummvm.org\/andy\/2026\/07\/06\/week-6\/","title":{"rendered":"WEEK 6"},"content":{"rendered":"<h2 data-path-to-node=\"3\">Crossing the Atlantic: the US Amiga Release<\/h2>\n<p data-path-to-node=\"4\">Last week ended with the European Amiga version of Kult running almost perfectly, and a promise: next up, the US release. In America, the game shipped as <i data-path-to-node=\"4\" data-index-in-node=\"154\">Chamber of the Sci-Mutant Priestess<\/i>, published by Draconian, and this week was all about making that version boot and play too.<\/p>\n<h2 data-path-to-node=\"5\">Same game, different executable<\/h2>\n<p data-path-to-node=\"6\">My hope was that the US build would just be the EU one with translated text files. It wasn&#8217;t. The Draconian build lays out the <code data-path-to-node=\"6\" data-index-in-node=\"127\">KULT<\/code> executable completely differently:<\/p>\n<ul data-path-to-node=\"7\">\n<li>\n<p data-path-to-node=\"7,0,0\"><b data-path-to-node=\"7,0,0\" data-index-in-node=\"0\">Every static resource lives at a different offset.<\/b> On the EU side, I had a table of file offsets for the resources embedded in the executable (palettes, icons, zone data&#8230;). The US executable shifts them around non-uniformly, so I couldn&#8217;t just add a constant \u2014 I had to reverse-engineer the US binary and rebuild the whole offset table entry by entry. The good news: once located, 8 of the 12 embedded resources turned out to be byte-identical to the EU ones; only <code data-path-to-node=\"7,0,0\" data-index-in-node=\"467\">ZONES<\/code>, <code data-path-to-node=\"7,0,0\" data-index-in-node=\"474\">TEMPL<\/code>, <code data-path-to-node=\"7,0,0\" data-index-in-node=\"481\">CARAC<\/code>, and <code data-path-to-node=\"7,0,0\" data-index-in-node=\"492\">ICONE<\/code> actually differ.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,1,0\"><b data-path-to-node=\"7,1,0\" data-index-in-node=\"0\">The English text banks are jammed straight into the executable<\/b>, completely abandoning the neat separate files the EU release used. This meant writing a different extraction path just for the US text.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"7,2,0\"><b data-path-to-node=\"7,2,0\" data-index-in-node=\"0\">The filenames are lowercase.<\/b>Normally, this would be an immediate problem on case-sensitive file systems like Linux. Thankfully, ScummVM&#8217;s <code data-path-to-node=\"3,0,0,0\" data-index-in-node=\"139\">Common::File<\/code> API handles case-insensitivity out of the box, which saved me from having to write any extra fallback logic!<\/p>\n<\/li>\n<\/ul>\n<h2 data-path-to-node=\"8\">A different welcome screen<\/h2>\n<p data-path-to-node=\"9\">The US version also greets you differently: it shows an <code data-path-to-node=\"9\" data-index-in-node=\"56\">intro.pia<\/code> title screen before the usual <code data-path-to-node=\"9\" data-index-in-node=\"96\">pres.bin<\/code> presentation. It\u2019s a small detail, but until the engine knew about it, the game wouldn&#8217;t even get past boot.<\/p>\n<p data-path-to-node=\"10\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-71\" src=\"https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-300x174.png\" alt=\"\" width=\"300\" height=\"174\" srcset=\"https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-300x174.png 300w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-1024x594.png 1024w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-768x445.png 768w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-1536x891.png 1536w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-2048x1188.png 2048w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-1200x696.png 1200w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-21-13-1980x1148.png 1980w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2 data-path-to-node=\"11\">Zone Scan, the Amiga way<\/h2>\n<p data-path-to-node=\"12\">While testing, I also finished the Amiga version of the <i data-path-to-node=\"12\" data-index-in-node=\"56\">Zone Scan<\/i> psi power. The Amiga renderer draws it differently from DOS: the effect applies a dedicated palette delta that tints the room green while the scan line sweeps across the screen. Getting the line itself right took one more fix \u2014 the sweep works on chunky pixels now, so the line width and the inversion effect had to be adapted from the original planar code.<\/p>\n<p data-path-to-node=\"13\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-72\" src=\"https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-300x223.png\" alt=\"\" width=\"300\" height=\"223\" srcset=\"https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-300x223.png 300w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-1024x760.png 1024w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-768x570.png 768w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-1536x1139.png 1536w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-2048x1519.png 2048w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-1200x890.png 1200w, https:\/\/blogs.scummvm.org\/andy\/wp-content\/uploads\/sites\/83\/2026\/07\/Screenshot-from-2026-07-06-23-22-54-1980x1469.png 1980w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2 data-path-to-node=\"14\">Detection entries<\/h2>\n<p data-path-to-node=\"4\">With both variants playable, I added proper detection entries for the Amiga EU and US releases. ScummVM now recognizes all of them straight from the launcher.<\/p>\n<p data-path-to-node=\"5\">Looking back at these past two weeks, I am incredibly happy to see the Amiga versions finally fully animated and playable. Building the Amiga support from absolute scratch was a massive, daunting challenge, and I honestly couldn&#8217;t have reached this milestone without the immense help and guidance from my mentor. Seeing these versions breathe and run flawlessly makes all the heavy lifting worth it!<\/p>\n<h2 data-path-to-node=\"16\">Next week<\/h2>\n<p data-path-to-node=\"17\">While all this was happening, sev ran static analysis over the engine and sent me a nice stack of Coverity and PVS-Studio reports. While chasing those, I found a bug that wasn&#8217;t in my engine at all, but in ScummVM itself. More about that (and about a monster that refused to survive a save\/load cycle) in the next post!).Stay tuned!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Crossing the Atlantic: the US Amiga Release Last week ended with the European Amiga version of Kult running almost perfectly, and a promise: next up, the US release. In America, the game shipped as Chamber of the Sci-Mutant Priestess, published by Draconian, and this week was all about making that version boot and play too. [&hellip;]<\/p>\n","protected":false},"author":31,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-70","post","type-post","status-publish","format-standard","hentry","category-gsoc-2026"],"_links":{"self":[{"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/posts\/70","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/comments?post=70"}],"version-history":[{"count":5,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/posts\/70\/revisions"}],"predecessor-version":[{"id":77,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/posts\/70\/revisions\/77"}],"wp:attachment":[{"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/media?parent=70"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/categories?post=70"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/andy\/wp-json\/wp\/v2\/tags?post=70"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}