EotB – Rendera väggar

Eye of the Beholder fortsätter att intressera oss. I tidigare artikel så försökte vi lista ut hur väggarna är uppbyggda. Vi kom en bit på vägen. I denna artikel ska vi lösa uppritningen av väggar och hela systemet för vyn i spelet.

Spelplanen

Som vi tidigare nämnt så är ”spelplanen”, alltså det fönster där världen ritas upp i, 22 x 15 block stort. Varje block är 8 x 8 pixlar vilket get 176 x 120 pixlars fönster.

Kartan som man vandrar runt i kan ses som ett 2D rutnät. När vi kikar år något av de fyra väderstrecken så är vår syn i kartan begränsad. Bilden nedan försöker illustrera de intilliggande rutorna som man kan se. Om det inte finns några väggar i vägen såklart.

Det blå fältet indikerar ungefärligt synfält. De gröna linjerna är potentiella väggar som kan ses. För varje väggtyp måste det finnas 25 olika versioner för att täcka in alla kombinationer av vinklar av samma väggtyp.

Innan vi går in på mer detaljer kring uppritning så måste vi göra en del korrigeringar i vår tolkning av .VMP-filerna.

VMP-filer

Vi gjorde ett fel i tidigare artiklar som måste revideras. Den ”padding” på 101 UInt16 som angavs stämmer inte. Det är inte utfyllnad utan data om hur blocken ska byggas ihop. Vi upptäckte detta då informationen vi hade sa att varje väggtyp beskrevs med 431 olika 8 x 8 block. Väljer man att läsa in filen med det filhuvud som angavs så kommer 330 UInt16 data att inte laddas in och en hel väggtyp kommer att missas. Det korrekta filhuvudet är

Datatyp Namn Kommentar
UInt16 Header Oklart vad den används till. Troligtvis hur många väggtyper som finns i filen.
UInt16 [22,15] BackgroundTiles Alla block som ska användas till bakgrunden. Den är alltså 22×15 block stor.
UInt16[431]*NrOfWallTypes WallType… Block för att beskriva en sorts vägg.

NrOfWallTypes kan beräknas med formeln (filstorlek – 2) / (431 * 2). En korrekt kodfil för inläsning blir:

Hjälp vid uppritning

För att lista ut vilka block i VMP-filen som hör till vilka väggar så behöver vi hjälp. Vi behöver data över varje position och dess tillhörande block. Som tur är så har vi hittat, felsökt och rättat en datastruktur som vi väljer att kalla WallRenderData. Alla 25 olika positioner kan vi beskriva med följande fil:

Läs kommentarerna till varje position för att länka ihop med bilden över synliga rutor (A-Q).

BaseOffset anger hur många block in i VMP-filens WallTiles[,] vi hittar given position.
OffsetInViewPort anger hur många block in (både x- och y-led i samma siffra) fönstret som positionen börjar på.
VisibleWidthInBlocks anger antalet synliga block i x-led.
VisibleHeightInBlocks anger antalet synliga block i y-led.
SkipValue anger en extra offset som måste läggas på när man byter y-värde för positionens block vid uppritningen.
FlipFlag anger om blocket som ska ritas upp ska speglas horisontellt. Det är ett värde på 0x4000 i så fall.

Uppritningen av en given position blir alltså VisibleWidthInBlocks x VisibleHeightInBlocks stor i fönstret. Blocken i VMP-filen ligger i den ordningen (med viss korrigering för SkipValue ).

Uppritning

För att rita upp en korrekt vy så behöver vi en VMP-fil, tillhörande VCN-fil samt tillhörande PAL-fil. Vi behöver också veta hur vi ska pussla ihop dessa filer, vilket vi nu gör!

Det är dags att konstruera en uppritare som kan generera bakgrundsbild + en väggposition av en given väggtyp. Vi kommer att bespara er all diskussion om flesökning och testning som ledde fram till detta och enbart presentera resultatet, nämligen vår BlockBuilder.

Bakgrunden ritas upp med en egen palett utan genomskinlighet. Väggarna ritas upp med en annan palett och med färg 0 som genomskinlig. Även om koden är en aning omfattande så gör den helt enkelt jobbet med att rita upp en väggposition med hjälp av data från WallRenderData. DrawBackDrop har vi diskuterat i tidigare artikel. Den metoden som är intressant här är DrawWall.

Nu har vi knåpat ihop en liten loop som ritar ut väggtyp 0 från BRICK.VMP i alla 25 olika positioner, namngivna med text så du kan koppla ihop positionerna med den inledande bilden.

Väggtyper

Nu kan vi också undersöka vilka olika väggtyper det faktiskt finns. Det visar sig att det endast finns 6 olika väggtyper i BRICK.VMP.

De två första väggtyperna är ”vanlig” vägg i två olika varianter. Sedan har vi dörrarna följt av stegar upp och ned (?). Sist så finns portalen.

Avslutning

Nu har vi verkligen kommit en bra bit på vägen. Allt du ser är återskapat utifrån original-filerna. Nästa steg kommer att vara att få igång en variant av själva ”motorn” så vi kan gå runt. Steget efter det är att ladda banorna från spelet. Vi avslutar som vanligt med att bifoga källkoden.

Scroll to top