{"id":9204,"date":"2026-08-26T18:21:39","date_gmt":"2026-08-26T16:21:39","guid":{"rendered":"https:\/\/www.wegneronline.com\/blog\/?p=9204"},"modified":"2026-08-27T18:00:50","modified_gmt":"2026-08-27T16:00:50","slug":"3-d-ultra-interesting-digital-archaeology-in-3-d-ultra-pinball-creep-night","status":"publish","type":"post","link":"https:\/\/www.wegneronline.com\/blog\/2026\/08\/26\/3-d-ultra-interesting-digital-archaeology-in-3-d-ultra-pinball-creep-night\/","title":{"rendered":"3-D Ultra Interesting: Digital Archaeology in 3-D Ultra Pinball: Creep Night"},"content":{"rendered":"\n<pre class=\"wp-block-verse\"><a href=\"https:\/\/www.wegneronline.com\/blog\/2026\/08\/26\/3-d-ultra-spannend-digitale-archaeologie-in-3-d-ultra-pinball-creep-night\/\" data-type=\"post\" data-id=\"9194\">Deutsche Version hier!<\/a> \/ <a href=\"https:\/\/www.wegneronline.com\/blog\/2026\/08\/26\/3-d-ultra-interesting-digital-archaeology-in-3-d-ultra-pinball-creep-night\/#tool\">Extractor tool<\/a> \/ <a href=\"\/creepnight\/\">Complete Infosite<\/a><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes a technical investigation starts completely by accident &#8211; and end with a game engine torn apart, and discovering new cheats and eastereggs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In my case, all I wanted to do was play Sierra&#8217;s 1996 <em>3-D Ultra Pinball: Creep Night<\/em> again on an emulated Windows 98 PC. It was one of those games I played so much as a child that, decades later, quite a surprising amount of it still seems to live in muscle memory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While playing it again, however, I noticed something I had obviously never thought about as a child: despite its name, <em>3-D Ultra Pinball<\/em> is not really a 3D game in the modern sense.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;galleryId&quot;:&quot;6a967574bf039&quot;}\" data-wp-interactive=\"core\/gallery\" class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574bfab3&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574bfab3\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9197\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400-1024x768.png\" alt=\"\" class=\"wp-image-9197\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400-1024x768.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400-300x225.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400-768x576.png 768w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400-1536x1152.png 1536w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181536-400.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The three 3D-Fake-Tables &#8222;The Castle&#8220;&#8230;<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574bff17&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574bff17\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9199\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260-1024x768.png\" alt=\"\" class=\"wp-image-9199\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260-1024x768.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260-300x225.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260-768x576.png 768w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260-1536x1152.png 1536w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181550-260.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">&#8230;then &#8222;The Tower&#8220; (well, it&#8217;s more a lab)&#8230;<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c0352&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c0352\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9198\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290-1024x768.png\" alt=\"\" class=\"wp-image-9198\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290-1024x768.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290-300x225.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290-768x576.png 768w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290-1536x1152.png 1536w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Monitor_1_20260826-181618-290.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">&#8230;and then &#8222;The Dungeon&#8220;.<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The tables look three-dimensional. So do the characters, ball, ramps and animations. But there is no polygonal 3D world being rendered in real time. Instead, the game developed by Dynamix relies heavily on pre-rendered 2D graphics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That observation started a journey into the internals of its engine. \ud83d\ude0a<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">\u201c3-D\u201d Without 3D<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The basic idea is remarkably simple and clever from today&#8217;s perspective: The pinball tables appear to have been created using 3D tools and then rendered into finished images. In the game itself, each table has a complete 640 \u00d7 480 pixel background.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Smaller sprites for moving objects such as the ball, characters, bumpers and animations are drawn on top of that background.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In simplified form, the rendering process therefore looks something like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pre-rendered 640\u00d7480 background\n                +\n          animated sprites\n                +\n              ball\n                +\n       flippers \/ targets \/ effects\n                =\n          final game image\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The \u201c3-D\u201d therefore primarily describes the visual production of the assets. At runtime, the game itself operates largely with 2D graphics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a Windows PC in 1996 this was a very sensible solution. The expensive 3D work could be done in advance, while the player&#8217;s computer only had to draw prepared pixel graphics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Looking Inside RESOURCE.001<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The game&#8217;s CD contains, among other files, the following pair:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RESOURCE.MAP\nRESOURCE.001<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"433\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-1.png\" alt=\"\" class=\"wp-image-9218\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-1.png 466w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-1-300x279.png 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>RESOURCE.MAP<\/code> acts as an index, while <code>RESOURCE.001<\/code> contains the actual data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In my copy of the game, the archive contains 854 individual resources:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>430 \u00d7 WAV\n275 \u00d7 BMP\n109 \u00d7 ANM\n 19 \u00d7 ITF\n  7 \u00d7 PAL\n  4 \u00d7 TBL\n  4 \u00d7 TBM\n  4 \u00d7 RES\n  2 \u00d7 PFT\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The file extensions are somewhat misleading. A resource named <code>GHOST0.BMP<\/code>, for example, is not a standard Windows BMP file. Instead, its contents start with a proprietary Dynamix header <code>BMP:<\/code>. Similar internal formats exist for animations (<code>ANM:<\/code>) and other resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The resources themselves are stored sequentially inside <code>RESOURCE.001<\/code>. <code>RESOURCE.MAP<\/code> contains a hash and offset for each entry. At that offset in the data file, a DOS-compatible filename is followed by the resource size and finally its data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Does the \u201cLarge\u201d Installation Actually Do?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This also answered a small question raised by the original installer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Creep Night<\/em> offers a \u201cLarge\u201d installation option. When selected, the file <code>ENGLISH\\LARGE\\OVERRIDE.DAT<\/code> is copied to the hard drive. The installer explains that afterwards essentially only audio will still be streamed from the CD.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"430\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-3.png\" alt=\"\" class=\"wp-image-9220\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-3.png 629w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-3-300x205.png 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>OVERRIDE.DAT<\/code> contains both an index and resource data, effectively making it a self-contained local version of the <code>RESOURCE.MAP<\/code>\/<code>RESOURCE.001<\/code> system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While <code>RESOURCE.001<\/code> contains 854 resources, <code>OVERRIDE.DAT<\/code> contains 817. The 37 missing files are:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SX_4000.WAV\n...\nSX_4036.WAV<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and all of them are indeed long audio files. Together, they account for roughly 34 minutes of audio and around 90 MB of data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This gives a surprisingly precise explanation of what a \u201cLarge Installation\u201d meant in 1996: almost all graphics, animations and short sound effects were copied to the faster hard drive, while the large audio tracks remained on the CD to save disk space.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GHOST0.BMP: Four Ghosts in Two Kilobytes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One particularly interesting resource is <code>GHOST0.BMP<\/code>. It is only around 2 KB in size, yet it contains not one but four separate sprite frames:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Frame 1: 56 \u00d7 38 pixels\nFrame 2: 56 \u00d7 64 pixels\nFrame 3: 64 \u00d7 62 pixels\nFrame 4: 64 \u00d7 51 pixels<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each frame has a small header containing its width, height, an encoding byte, compressed size and uncompressed size.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first frame, for example, begins effectively as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>38 00          Width:  56\n26 00          Height: 38\n83             Encoding: 0x83\n61 01 00 00    Compressed block: 353 bytes\n50 08 00 00    Uncompressed: 2128 bytes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And this reveals something important:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>56 \u00d7 38 = 2128\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">After decompression, there is exactly one byte for every pixel. The graphics are classic 8-bit paletted images.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Does 0x83 Mean?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This encoding value initially became the central mystery. For this encoding, there is no documentation. Only a few fragments of other people on the internet that tried to reverse engineer the proprietary Dynamix compression. However, by examining the original <code>PINBALL2.EXE<\/code>, it was possible to locate the relevant code path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original program reads the encoding byte and effectively performs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>encoding = encoding &amp; 0x7F<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So <code>0x83<\/code> becomes <code>0x03<\/code>. Execution then branches to the decoder for compression type 3. That decoder could be reconstructed from the original x86 code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Dynamix Type-3 Codec<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The algorithm is a compact form of LZ-style compression. The stream first contains the number of following tokens. A block of flag bits follows, followed by the actual token data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each token can represent one of two things:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Flag = 0\n\u2192 the next byte is a literal pixel value\n\nFlag = 1\n\u2192 copy pixels that have already been decompressed\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A back-reference uses two bytes, or 16 bits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually, the value is divided like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DDDDDDDD DDLLLLLL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The lower six bits encode the length:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>length = value + 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The upper ten bits encode the distance:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>distance = value + 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The stream can therefore express something conceptually similar to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u201cGo back 56 pixels and copy\nthe following 42 pixels again.\u201d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is extremely efficient for sprites containing large repeated or empty areas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first ghost frame requires 2,128 bytes uncompressed, while its compressed stream needs only around 350 bytes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using this compression, all animations, overlays, buttons, etc. are stored in the <code>RESOURCE.001<\/code> file, one after the other as a constant stream. If extracted correctly, you can get all the game&#8217;s sprites and graphics &#8211; and potentially make your own flip book out of it.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c191e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c191e\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-5-1024x513.png\" alt=\"\" class=\"wp-image-9224\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-5-1024x513.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-5-767x384.png 767w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-5-300x150.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-5.png 1136w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">You could make a little flip book out of the exported sprites (more on exporting sprites below)&#8230;<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How Does Transparency Work?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is particularly charming from a modern perspective, since the developers only had the tools to work with that existed back then. Modern graphics normally use alpha channels. A pixel can be 25, 50 or 80 percent transparent and is blended with whatever is behind it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The developers of <em>Creep Night<\/em> had no such luxury.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After decompression, each sprite consists entirely of 8-bit palette indices. The first frame of <code>GHOST0.BMP<\/code> contains 2,128 pixels &#8211; 1,425 of which have the value 0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually, much of the sprite therefore looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 0 0 0 0 0 0\n0 0 0 X X 0 0\n0 0 X X X X 0\n0 X X X X X X\n0 0 X X X X 0\n0 0 0 X X 0 0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">All available evidence strongly suggests that palette index 0 is used as a color key:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pixel = 0\n\u2192 leave the existing background unchanged\n\nPixel != 0\n\u2192 draw the sprite pixel\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is not alpha transparency. A pixel is either fully visible or not drawn at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The image data strongly supports this interpretation, although the exact blitting routine would still need to be traced instruction by instruction for absolute confirmation. (Feel free to do so!)<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c1f7f&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c1f7f\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"107\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-6.png\" alt=\"\" class=\"wp-image-9227\" style=\"width:449px;height:auto\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-6.png 449w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-6-300x71.png 300w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Even the light inserts on the field (lit\/unlit) are superimposed onto the actual background.<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">GHOST0, GHOST1 and GHOST2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Three particularly interesting resources appear next to each other:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GHOST0.BMP\nGHOST1.BMP\nGHOST2.BMP\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">They contain:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GHOST0:  4 frames\nGHOST1:  9 frames\nGHOST2: 12 frames\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Together, that is 25 individual images of the ghost animations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once exported, they demonstrate very nicely what the term \u201c3-D Ultra\u201d really means: the characters clearly have the appearance of pre-rendered 3D models, while the game itself treats them as small 2D sprites using paletted colour and color-key transparency.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"235\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-1024x235.png\" alt=\"\" class=\"wp-image-9202\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-1024x235.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-300x69.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-766x176.png 766w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-1536x353.png 1536w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghost_animations_sheet-2048x470-1.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That is not a shortcoming. It is a wonderful example of how cleverly developers in the mid-1990s worked within the limitations of contemporary hardware.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By the way, that dude is the ghost circling the towers from &#8222;The Castle&#8220; table. \ud83d\ude09 <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"284\" height=\"146\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghosttower.gif\" alt=\"\" class=\"wp-image-9208\"\/><figcaption class=\"wp-element-caption\">He also appears elsewhere, thus the unused animation frames in the sheet above.<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">The Strange \u201cWobble\u201d \u2014 Simulating Depth in 2D<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This visual oddity was actually what started the entire investigation: At certain positions, especially on a modern display, something strange happens when the ball passes behind a foreground object. The edge of that object appears to change slightly &#8211; almost as if a small piece of the background had been placed over the existing background without matching it perfectly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comparing two screenshots from consecutive game states makes the effect much easier to see:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;galleryId&quot;:&quot;6a967574c2471&quot;}\" data-wp-interactive=\"core\/gallery\" class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c275d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c275d\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"200\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9200\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/1.png\" alt=\"\" class=\"wp-image-9200\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Screenshot 1<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c2b4f&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c2b4f\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"200\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9201\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/2.png\" alt=\"\" class=\"wp-image-9201\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Screenshot 2<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Screenshot 1:<\/strong> The ball is elsewhere. All good.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Screenshot 2:<\/strong> The ball is behind the foreground object. At the same time, a subtle seam or change in the object&#8217;s pixels becomes visible. In these screenshots most noticeable when switching between the two, or if seen in motion in the game.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The interesting part is that the pixels changing between the screenshots cover a much larger area than the ball itself. The affected region resembles a rectangular section of the foreground object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This suggests another very effective 2D technique: an occlusion sprite or foreground layer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The engine could render the table and ball first, then redraw a prepared section of the foreground whenever the ball is supposed to appear behind it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Table background\n      \u2193\nDraw ball\n      \u2193\nIs the ball behind an object?\n      \u2193\nDraw foreground \/ occlusion sprite\nover the ball\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This provides convincing depth for pipes, ramps and other table components without requiring any real 3D geometry or a Z-buffer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The visible \u201cwobble\u201d may therefore come from the overlay itself. A slightly different dithering pattern, palette representation or even a one-pixel alignment difference between the overlay and the original background would be enough to create the subtle seam visible on a modern LCD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Same is true if we look at our ghost GIF from above: Pay attention to the stone structure of the tower. As soon as the ghost sprite enters the screen, the pixels of the background shift slightly. It seems that the logic for palette index 0 (i.e. draw the background again here) is not perfect:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"284\" height=\"146\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/ghosttower.gif\" alt=\"\" class=\"wp-image-9208\"\/><figcaption class=\"wp-element-caption\">The effect is mostly visible when the GIF starts to loop again and the background &#8222;resets&#8220;.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">On a typical 1990s CRT, analog video, the shadow mask or aperture grille and the general characteristics of the display would blur these differences much more naturally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A modern display, meanwhile, reproduces every emulated 640\u00d7480 pixel with brutal precision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lost and Found: Resource File<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I just love going through such internal files. The developers never anticipated anyone else looking at them, so you sometimes find exciting stuff that was never taken out or meant as eastereggs. (Greetings to <a href=\"https:\/\/tcrf.net\/The_Cutting_Room_Floor\">The Cutting Room Floor!<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here are some exciting things to see:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;galleryId&quot;:&quot;6a967574c3180&quot;}\" data-wp-interactive=\"core\/gallery\" class=\"wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c348e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c348e\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"39\" height=\"45\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9239\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/tp_frame09.png\" alt=\"\" class=\"wp-image-9239\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The Sierra mascot including all of its animation frames are in there, as seen in the intro sequence<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c385c&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c385c\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"431\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9237\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/highscor_frame01.png\" alt=\"\" class=\"wp-image-9237\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/highscor_frame01.png 648w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/highscor_frame01-300x200.png 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">If needed, just fake your own highscores on this \ud83d\ude09<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c3b88&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c3b88\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"370\" height=\"187\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9236\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/gameovr2.png\" alt=\"\" class=\"wp-image-9236\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/gameovr2.png 370w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/gameovr2-300x152.png 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Saddest dialog of them all \ud83d\ude41 Note how the buttons are separate spites!<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c3e93&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c3e93\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"191\" height=\"54\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9235\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/dynlogo.png\" alt=\"\" class=\"wp-image-9235\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Proof that Dynamix was the developer &#8211; their logo is in the files as well (and also shown in the intro)<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c4224&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c4224\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"15\" height=\"13\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9240\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/wball.png\" alt=\"\" class=\"wp-image-9240\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Most important sprite of them all \ud83d\ude42<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c4648&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c4648\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"288\" height=\"430\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9232\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/detail_frame01.png\" alt=\"\" class=\"wp-image-9232\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/detail_frame01.png 288w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/detail_frame01-201x300.png 201w\" sizes=\"auto, (max-width: 288px) 100vw, 288px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Settings are also sprites, with the candles (on\/off switches) as separate sprites<\/figcaption><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c4a2a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c4a2a\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"465\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" data-id=\"9241\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Bildschirmfoto-2026-08-26-um-19.31.17.png\" alt=\"\" class=\"wp-image-9241\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Bildschirmfoto-2026-08-26-um-19.31.17.png 1000w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Bildschirmfoto-2026-08-26-um-19.31.17-300x140.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/Bildschirmfoto-2026-08-26-um-19.31.17-768x357.png 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Somewhere in the game there must be a cow easteregg, replacing the goblins with cows. Hm!<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I really need to investigate more about the cow easteregg. <a href=\"https:\/\/www.robertwinter.com\/pinball\/ss\/hidden.html\">Cows are a strange, but well-loved easteregg tradition in physical pinball machines<\/a>, so it would be a nice callback by the game. I&#8217;d also say that the designers were absolutely aware of physical pinball, because in the Help documents, there is a dedicated chapter with recommended reading about the history and principles of physical pinball, with works e.g. by <a href=\"https:\/\/en.wikipedia.org\/wiki\/Roger_Sharpe_(pinball)\">Roger Sharpe<\/a> &#8211; a very nice tip of the hat to pinball machines!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Well&#8230;. let&#8217;s do this right now! \ud83d\ude0a <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">New Cheats and Easter Eggs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are as of today completely undocumented cheats and easter eggs. I am a little proud, to be honest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you open up the highscore table, you can enter &#8222;data&#8220;. Just type it into the void with your keyboard. You will hear a voice saying &#8222;Excellent!&#8220;. That means, cheat or debug mode is now enabled (the variable <code>DYNAMIX<\/code> is set to <code>1<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now for the fun part:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you enter &#8222;cows&#8220; during the game, you will hear a moo sound. This confirms that the flag <code>cow_mode<\/code> is now set to true. If you start the Shooting Gallery bonus game, all sprites are replaced with cows &#8211; some trotting, some running and even one cow riding an ATV. To start the bonus game, you will have to complete all modes in &#8222;The Castle&#8220; and then shoot the portal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Another useful developer code to help you with this is &#8222;fin&#8220;. If you enter this one during the game, all modes are marked as done and you can move on to the final boss phase of each table. It&#8217;s most likely a shortcut for developers during testing (I guess?). This code only works, if &#8222;All Tables&#8220; is selected as game mode. If you start a game with only one table, nothing happens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, there is another state called <code>mcow<\/code> with corresponding animation:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c52a5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c52a5\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/mcow_sheet-1024x184.png\" alt=\"\" class=\"wp-image-9272\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/mcow_sheet-1024x184.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/mcow_sheet-300x54.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/mcow_sheet-768x138.png 768w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/mcow_sheet.png 1524w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Unfortunately, I could not yet find out how to trigger this easter egg. From the code it&#8217;s clear that the cow would replace the goblins in their mode on all three tables. Instead of hunting down goblins on their seven random positions with the silver ball, one would shoot for a cow that circles on the playfield instead. It seems that the needed trigger was, however, never included in the game. Bummer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, I wrote a little patch tool that basically applies the flag <code>cow_mode<\/code> also to this easter egg. You can download it here, patch your <code>PINBALL2.EXE<\/code> with it and try for yourself (type &#8222;DATA&#8220; in Highscores screen, then type &#8222;COWS&#8220; in active game). See the <code>README.MD<\/code> in the ZIP file for more info.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"http:\/\/space.wegneronline.com\/files\/lejs6_creepnight-mcow-patcher-v0.1.1.zip\">Download MCOW Patch Tool (6KB, ZIP)<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/wegneronline.com\/creepnight\/images\/mcow.gif\">And that is how it looks like<\/a> &#8211; pretty cool in my opinion! \ud83d\ude0a <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is another little undocumented extra: The boss key &#8222;U&#8220;. If this key is pressed during gameplay, the game window is minimized and the title of the window changed to &#8222;New Text Document&#8220; (and thus displayed as such in the task bar). <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c5895&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c5895\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"71\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-7.png\" alt=\"\" class=\"wp-image-9279\" style=\"width:642px;height:auto\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-7.png 642w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-7-300x33.png 300w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Boss keys like these were quite popular in the 90s, when games would often be played on workplace computers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"196\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/credit.png\" alt=\"\" class=\"wp-image-9233\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/credit.png 406w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/credit-300x145.png 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/figure>\n<\/div>\n\n\n<h2 id=\"tool\" class=\"wp-block-heading\">Creep Night Resource Tool<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This investigation resulted in a small Python utility capable of reading the resource archives and decoding the proprietary Dynamix bitmap resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Among other things, it can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>read <code>RESOURCE.MAP<\/code> and <code>RESOURCE.001<\/code><\/li>\n\n\n\n<li>read <code>OVERRIDE.DAT<\/code><\/li>\n\n\n\n<li>list contained resources<\/li>\n\n\n\n<li>extract raw resources<\/li>\n\n\n\n<li>inspect internal <code>BMP:<\/code> containers<\/li>\n\n\n\n<li>decode the <code>0x83<\/code> \/ Type-3 compression<\/li>\n\n\n\n<li>read the game&#8217;s RIFF palette resources<\/li>\n\n\n\n<li>export individual sprite frames as standard PNG files<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The tool itself consists only of Python code and contains no original game data. Also, disclaimer: Some parts of the tool were written with ChatGPT.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-fe48e5de wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"http:\/\/space.wegneronline.com\/files\/7gi7b_creepnight-resource-tool-v1.0.0.zip\">Download Tool (31kb, ZIP FILE)<\/a><\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Requirements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Only Python 3 is required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To inspect your own copy of the game, you will at minimum need:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RESOURCE.MAP\nRESOURCE.001<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both can be found on the original game CD (in folder <code>UPBALL2<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The easiest setup is to place them in the same directory as <code>creepnight_tool.py<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Listing Resources<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For example, to find the ghost resources:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py list RESOURCE.MAP --pattern 'GHOST*.BMP'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Extracting Raw Resources<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To extract the complete resource archive:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py extract RESOURCE.MAP -o extracted<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The tool automatically looks for <code>RESOURCE.001<\/code> next to <code>RESOURCE.MAP<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the data file is located elsewhere, it can be specified explicitly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py extract RESOURCE.MAP \\\n  --data \/path\/to\/RESOURCE.001 \\\n  -o extracted\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Decoding a Sprite Resource to PNG<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The four frames contained in <code>GHOST0.BMP<\/code> can be exported with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py decode RESOURCE.MAP GHOST0.BMP \\\n  --palette CASTLE.PAL \\\n  -o decoded<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">By default, palette index 0 is exported as transparent.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Decoding Multiple Resources<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">All three ghost resources can be decoded in one operation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py decode-all RESOURCE.MAP \\\n  --palette CASTLE.PAL \\\n  --pattern 'GHOST*.BMP' \\\n  -o ghosts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Other tables can use their corresponding palettes, such as <code>TOWER.PAL<\/code> or <code>DUNGEON.PAL<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to export all graphics, just omit <code>--pattern<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a967574c64a5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a967574c64a5\" class=\"aligncenter size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"605\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-4-1024x605.png\" alt=\"\" class=\"wp-image-9223\" srcset=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-4-1024x605.png 1024w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-4-300x177.png 300w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-4-767x453.png 767w, https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/image-4.png 1158w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">So many explosions&#8230;<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Exporting Full Backgrounds<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For complete table backgrounds, palette index 0 usually should not be made transparent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py decode RESOURCE.MAP CASTLE.BMP \\\n  --palette CASTLE.PAL \\\n  --transparent-index none \\\n  -o backgrounds<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Inspecting OVERRIDE.DAT<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The archive used by the Large installation can also be processed directly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py list OVERRIDE.DAT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 creepnight_tool.py extract OVERRIDE.DAT -o override-extracted<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Windows, depending on the Python installation, <code>python<\/code> may be used instead of <code>python3<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preservation and Copyright<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The tool contains no graphics, sounds, executables or other original game data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is intentional.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even though older games are frequently described as \u201cabandonware\u201d, that does not automatically mean their copyrighted contents may be freely redistributed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The utility is therefore intended to allow users to investigate the resources from their own copy or installation of the game.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">More Than Nostalgia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Originally, all I wanted to do was run an old pinball game under Windows 98.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, that led to an analysis of the Dynamix resource format, the reconstruction of a proprietary image compression scheme and a small independent decoder for graphics stored in a format that is barely documented today.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"293\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/hackerman.gif\" alt=\"\" class=\"wp-image-9256\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>RESOURCE.001<\/code> contains 275 <code>BMP:<\/code> resources with a total of 6,833 individual frames. The reconstructed decoder successfully expands all of them to exactly the uncompressed size specified by their individual headers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That, to me, is an interesting aspect of video game preservation:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the long term, simply preserving a CD or ISO may not always be enough. When proprietary engines, file formats and development tools disappear, knowledge of how those games were constructed disappears with them. Documenting a format and preserving an independent decoder for it is another small part of preserving the game itself. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Preserving original media is important, but preserving knowledge about proprietary file formats and engines can be just as valuable. What use is it to preserve and maintain an antique car, if nobody knows how the engine works?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And, as a bonus, it is fascinating to discover exactly which tricks a 1996 game used to create something marketed as \u201c3-D Ultra\u201d. Even when, underneath it all, it&#8217;s only a ton of two-dimensional pixels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>By the way:<\/strong> There were other titles in the &#8222;3-D Ultra&#8220; series, especially worth of note:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8222;3-D Ultra Pinball&#8220; (the original, so to say)<\/li>\n\n\n\n<li>&#8222;3-D Ultra Pinball: Creep Night&#8220; (this one was no. 2, it seems)<\/li>\n\n\n\n<li>&#8222;3-D Ultra Pinball: Lost Continent&#8220; (the third one)<\/li>\n\n\n\n<li>&#8222;3-D Ultra Pinball: Thrillride&#8220; (fourth and final one)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Except for &#8222;Thrillride&#8220;, they all seem to use the same engine. Maybe one could use this tool to untangle the other <code>RESOURCE<\/code>-files? Hm&#8230;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"124\" src=\"https:\/\/www.wegneronline.com\/blog\/wp-content\/uploads\/2026\/08\/wonder.gif\" alt=\"\" class=\"wp-image-9257\"\/><\/figure>\n<\/div>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">I decided to put all this info and downloads, and then some, on a dedicated Infosite (as I have done previously with The Residents&#8216; &#8222;Bad Day on the Midway&#8220;).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can find it here: <br><a href=\"https:\/\/wegneronline.com\/creepnight\/\">https:\/\/wegneronline.com\/creepnight\/<\/a> <\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Deutsche Version hier! \/ Extractor tool \/ Complete Infosite Sometimes a technical investigation starts completely by accident &#8211; and end with a game engine torn apart, and discovering new cheats and eastereggs. In my case, all I wanted to do was play Sierra&#8217;s 1996 3-D Ultra Pinball: Creep Night again on an emulated Windows 98 &hellip; <a href=\"https:\/\/www.wegneronline.com\/blog\/2026\/08\/26\/3-d-ultra-interesting-digital-archaeology-in-3-d-ultra-pinball-creep-night\/\" class=\"more-link\"><span class=\"screen-reader-text\">3-D Ultra Interesting: Digital Archaeology in 3-D Ultra Pinball: Creep Night<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":9196,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,6],"tags":[],"class_list":["post-9204","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-2-flipperautomaten","category-5-informatik"],"_links":{"self":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/comments?post=9204"}],"version-history":[{"count":24,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9204\/revisions"}],"predecessor-version":[{"id":9290,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/posts\/9204\/revisions\/9290"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/media\/9196"}],"wp:attachment":[{"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/media?parent=9204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/categories?post=9204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wegneronline.com\/blog\/wp-json\/wp\/v2\/tags?post=9204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}