EotB – Färger

Detta är en fortsättning på artiklarna om Eye of the Beholder (EotB) som tidigare publicerats. Först undersökte vi .PAK-filerna, sedan undersökte vi grafikformatet CPS. Nu är det dags att färgsätta tillvaron lite med paletter.

Palett-filer

En riktigt gammal dator kunde endast visa kanske 16, 32 eller 256 olika färger på skärmen samtidigt. Med de begränsningarna så sparade man alla bilder i ett format som använde endast 16 färger (EGA) eller upp till 256 färger (VGA). Även om maskinen endast kunde visa ett begränsat antal färger samtidigt så hade man möjlighet att välja mellan betydligt fler.

Vilka färger man valde ut lades i en ”palett”. Denna palett är som en slags låda med olika färgade kritor. Du kan välja mellan kanske 262144 möjliga färger (6-bit RGB) men du kan endast ha 256 utvalda kritor i din låda (palett).

Eftersom mycket av grafiken i spelet visas på samma skärm så kommer den grafiken att ha samma palett, frågan är bara vilken palett. Som vi tidigare nämnt i förra artikeln så sparas inte paletten i CPS-bilderna. Möjligheten finns men används inte.

Troligtvis används .COL-filerna som palett. De är alla 768 bytes stora, vilket passar paletter med 256 färger, 24-bit RGB = 3*256 = 768 bytes.

Låt oss kolla efter alla .COL-filer som finns i alla .PAK-filer.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;

namespace PakExtract
{
    class Program
    {
        static void Main(string[] args)
        {
            var files = new string[] { "EOBDATA1.PAK", "EOBDATA2.PAK", "EOBDATA3.PAK", "EOBDATA4.PAK", "EOBDATA5.PAK" };
            var palettes = new List<FileInfo>();
            var images = new List<FileInfo>();

            foreach (var pakFile in files)
            {
                Console.WriteLine(pakFile);
                var pak = PakFile.FromFile(pakFile);
                foreach (var file in pak.Files)
                {
                    if (file.FileName.EndsWith(".COL"))
                    {
                        palettes.Add(file);
                        Console.WriteLine($"*PAL* {file.FileName,-12}\toffset: {file.OffsetInPak}\tsize: {file.FileSize} bytes");
                    }
                }
            }

            Console.WriteLine($"\n{palettes.Count} palette files found");
            Console.ReadKey();
        }
    }
}

Det blir 16 filer totalt men om vi kikar noga så finns det dubbletter av samma namn. Först trodde jag att det var för att spelet lades på två disketter och man ville kunna ladda paletterna utan att behöva byta diskett. Den teorin faller då alla paletter, utom en, ligger i EOBDATA4.PAK.

Vi modifierar programmet ovan och tittar på alla filer som slutar med byte-värde 0x80. Vi antar att dessa är CPS-filer vilket ger oss 99 möjliga bilder. Nu kan vi beräkna vinsten med att lagra separata palett-filer då 99*768 = 76032 bytes ganska exakt 74kB.

Dubbletter

Vi behöver undersöka lite varför det finns dubbletter. Genom att spara ut alla filerna med ett extra löpnummer så kan vi jämföra två stycken i hex-editorn.

Efter lite testande så visar det sig att alla dubbletter verkligen är identiska. Frågan är då varför? Vi har inget bra svar på det. Teorin om två disketter är kanske den troligaste och att man senare har paketerat om spelet. Vi är inte helt säkra på vilken version vi sitter med.

Men nu är det dags att testa lite paletter.

Färgläggning 1

Vi konstruerar en metod, SaveAsPng, som kan spara en bild samt färglägga den med en given palett. Koden blir:

SaveAsPng
        public static void SaveAsPng(string filename, byte[] rawData, byte[] paletteData)
        {
            Bitmap bmp = new Bitmap(320, 200);
            var palette = new Color[paletteData.Length / 3];

            for (int i = 0; i < palette.Length; i++)
                palette[i] = Color.FromArgb(
                    (paletteData[i * 3]), 
                    (paletteData[i * 3 + 1]), 
                    (paletteData[i * 3 + 2]));

            for (int i = 0; i < rawData.Length; i++)
                bmp.SetPixel(i % 320, i / 320, palette[rawData[i]]);

            bmp.Save(filename, ImageFormat.Png);
        }

Vi tar varje byte i palett-data som 24-bit RGB, alltså 8 bitar per färg. Vi testar sedan med att spara filen ADVENTUR.CMP med alla 8 unika paletter som vi hittat. Resultatet blir inte riktigt vad vi hade tänkt.

ADVENTUR_EOBPAL.png

ADVENTUR_ORB.png

Alla 8 varianter blir mörka. Något fel gör vi.

Färgläggning 2

Vi har troligtvis att göra med 6-bit VGA paletter. Det skulle vara förklaringen till varför bilderna blir så mörka. Värdet 63 (0b111111, maximum för 6 bitar) ska alltså omvandlas till värdet 255 när vi jobbar med 8-bitars färgkanaler.

Vi räknar om färgerna på formel R*63 / 255 för att gå från 6-bit till 8-bit. Vi passar också på att göra färg 0 till transparent. Nu blir resultatet:

ADVENTUR_ZOOMTUNL.png

ADVENTUR_WTRDP2.png

ADVENTUR_WESTWOOD.png

ADVENTUR_TOWRMAGE.png

ADVENTUR_TITLE-V.png

ADVENTUR_PALETTE.png

ADVENTUR_ORB.png

ADVENTUR_EOBPAL.png

Nu blev resultatet bättre!

Det är lite svårt att se men bilden ADVENTUR_WTRDP2.png är den som är korrekt. Paletten som användes var då WTRDP2.COL.

Katalogisering

Det som återstår nu är att manuellt granska alla 99 bilder och para ihop dem med rätt palett. Något som vi ska försöka ge oss på här. Tabellen finner du nedan.

Fil Pak Palett
ADVENTUR.CMP EOBDATA1.PAK WTRDP2.COL
AVALANCH.CMP EOBDATA1.PAK ZOOMTUNL.COL
HANDS.CMP EOBDATA1.PAK WTRDP2.COL
KING.CMP EOBDATA1.PAK WTRDP2.COL
ORB.CMP EOBDATA1.PAK ORB.COL
TEXT.CMP EOBDATA1.PAK WTRDP2.COL
TITLE-E.CMP EOBDATA1.PAK WTRDP2.COL
TITLE-V.CMP EOBDATA1.PAK TITLE-V.COL
TOWRMAGE.CMP EOBDATA1.PAK TOWRMAGE.COL
TUNNEL.CMP EOBDATA1.PAK ZOOMTUNL.COL
WTRDP1.CMP EOBDATA1.PAK WTRDP2.COL
WTRDP2.CMP EOBDATA1.PAK WTRDP2.COL
WTRDP3.CMP EOBDATA1.PAK WTRDP2.COL
ZOOMTUNL.CMP EOBDATA1.PAK ZOOMTUNL.COL
DOOR.EGA EOBDATA2.PAK ANY

Detta är en början. De filer som listas ovan är mycket från spelets intro där många verkar ha egna paletter för att öka mängden färger i introt.

Efter lite research så finns det också totalt 4 stycken .PAL-filer som verkar vara paletter. Dessa används troligtvis till olika nivåer i spelet och används då också till det mesta av den kommande grafiken i övriga .PAK-filer.

Avslutning

Nu har vi tillgång till mycket av grafiken. Några filer som identifieras som CPS-bilder ser inte korrekta ut. Speciellt .ECN och .VCN-filerna. De ser ut som:

BRICK.VCN

BRICK.ECN

Den modifierade koden för detektivarbetet i denna artikel hittar du nedan.

Scroll to top