94 lines
2.2 KiB
Plaintext
94 lines
2.2 KiB
Plaintext
|
unit Tileset;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses Map, Classes, Dialogs, SysUtils, Graphics;
|
||
|
|
||
|
type
|
||
|
TTilesetHeader = packed record
|
||
|
BankNumber: Byte;
|
||
|
TilesetArrangementPointer: Word;
|
||
|
TilesetGraphicsPointer: Word;
|
||
|
UnknownData: array [0..6] of Byte;
|
||
|
end;
|
||
|
|
||
|
var
|
||
|
//Palette: array [0..3] of TColor = (clWhite,clLtGray,clDkGray,clBlack);
|
||
|
//Palette: array [0..3] of TColor = ($F8E8F8, $A8E058, $A0D0F8, $181010);
|
||
|
Palette: array [0..3] of TColor = ($F8E8F8, $58E0A8, $F8D0A0, $101018);
|
||
|
RawMapPalettes: array [0..12, 0..3] of Word;
|
||
|
|
||
|
const Zero: Byte = 0;
|
||
|
|
||
|
function GetTilesetHeader(TilesetNumber: Byte): TTilesetHeader;
|
||
|
function WordToColor(Value: Word): TColor;
|
||
|
procedure ReadTilesetGraphics(TilesetHeader: TTilesetHeader; Bmp: TBitmap);
|
||
|
procedure ReadMapPallets;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses MapEditor;
|
||
|
|
||
|
function GetTilesetHeader(TilesetNumber: Byte): TTilesetHeader;
|
||
|
begin
|
||
|
Rom.Position := $C7BE + ((TilesetNumber) * SizeOf(TTilesetHeader));
|
||
|
Rom.Read(Result, SizeOf(TTilesetHeader));
|
||
|
end;
|
||
|
|
||
|
function WordToColor(Value: Word): TColor;
|
||
|
var
|
||
|
R,G,B: Byte;
|
||
|
begin
|
||
|
R := Round((((Value shr 00) and 31) / 31) * 255);
|
||
|
G := Round((((Value shr 05) and 31) / 31) * 255);
|
||
|
B := Round((((Value shr 10) and 31) / 31) * 255);
|
||
|
Result := R or (G shl 8) or (B shl 16);
|
||
|
end;
|
||
|
|
||
|
//reads tile from Stream into Bmp and uses colors from Pal
|
||
|
procedure ReadTile(Stream: TStream; Bmp: TBitmap);
|
||
|
var
|
||
|
X,Y: Integer;
|
||
|
Data1,Data2: Byte;
|
||
|
begin
|
||
|
for Y := 0 to 7 do
|
||
|
begin
|
||
|
Stream.Read(Data1,1);
|
||
|
Stream.Read(Data2,1);
|
||
|
for X := 0 to 7 do
|
||
|
Bmp.Canvas.Pixels[X,Y] := Palette[((Data1 shr (7-X)) and 1) or (((Data2 shr (7-X)) and 1) shl 1)];
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//reads tileset at specific address into Bmp
|
||
|
procedure ReadTilesetGraphics(TilesetHeader: TTilesetHeader; Bmp: TBitmap);
|
||
|
var
|
||
|
Tile: TBitmap;
|
||
|
TileCnt: Byte;
|
||
|
I: Integer;
|
||
|
|
||
|
begin
|
||
|
|
||
|
Tile := TBitmap.Create;
|
||
|
Tile.PixelFormat := pf24bit;
|
||
|
Tile.Width := 8;
|
||
|
Tile.Height := 8;
|
||
|
Rom.Position := GBPtrToFilePos(TilesetHeader.BankNumber, TilesetHeader.TilesetGraphicsPointer);
|
||
|
TileCnt := 0;
|
||
|
for I := 1 to 16 * 6 do
|
||
|
begin
|
||
|
ReadTile(Rom,Tile);
|
||
|
Bmp.Canvas.Draw((TileCnt mod 16) * 8, (TileCnt div 16) * 8, Tile);
|
||
|
Inc(TileCnt);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure ReadMapPallets;
|
||
|
begin
|
||
|
Rom.Position := $72660;
|
||
|
Rom.Read(RawMapPalettes, 8*12);
|
||
|
|
||
|
end;
|
||
|
|
||
|
end.
|