redmap/BlockEditor.pas

161 lines
4.8 KiB
Plaintext

//******************************************************************************
//GoldMap
//by BlueSonic (aka Jigglypuff)
//******************************************************************************
unit BlockEditor;
interface
uses
SysUtils, Controls, Classes, Forms, StdCtrls, ExtCtrls, Graphics;
type
TBlockEditorForm = class(TForm)
ScrollBox1: TScrollBox;
TileLabel: TLabel;
BlockLabel: TLabel;
UpdateButton: TButton;
AddressLabel: TLabel;
BlockEditBox: TImage;
BlockBox: TPaintBox;
TilePalette: TImage;
procedure FormCreate(Sender: TObject);
procedure BlockBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure BlockBoxMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure LoadTile;
procedure SaveTile;
procedure UpdateTile;
procedure TilePaletteMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure TilePaletteMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure BlockEditBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure UpdateButtonClick(Sender: TObject);
procedure BlockBoxPaint(Sender: TObject);
procedure BlockEditBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
public
BlockStart,SelTile,TileNumber : Integer;
BlockData: array [0..15] of Byte;
end;
implementation
uses MapEditor;
{$R *.DFM}
procedure TBlockeditorForm.LoadTile;
begin
Rom.Position := BlockStart;
//loads block
Rom.Read(BlockData, SizeOf(BlockData));
end;
procedure TBlockeditorForm.SaveTile;
begin
Rom.Position := BlockStart;
//Saves block
Rom.Write(BlockData, SizeOf(BlockData));
end;
procedure TBlockeditorForm.UpdateTile;
var
X,Y,I: Integer;
TileX, TileY, TileNumber: Byte;
begin
I := 0;
//draws tiles into block
for Y := 0 to 3 do
for X := 0 to 3 do
begin
TileNumber := BlockData[I];
//calculate x and y coordinate where to copy tile from, the tileset picture has 16 tiles per line
TileY := TileNumber div 16;
TileX := TileNumber mod 16;
//draw tile to block picture
BlockEditBox.Picture.Bitmap.Canvas.CopyRect(Rect(X*8,Y*8,X*8+8,Y*8+8),Tiles.Canvas,Rect(TileX*8,TileY*8,TileX*8+8,TileY*8+8));
Inc(I);
end;
end;
procedure TBlockEditorForm.FormCreate(Sender: TObject);
begin
//create block bitmap
BlockEditBox.Picture.Bitmap := TBitmap.Create;
BlockEditBox.Picture.Bitmap.Height := 32;
BlockEditBox.Picture.Bitmap.Width := 32;
BlockEditBox.Picture.Bitmap.PixelFormat := pf24bit;
//initalize other stuff
//BlockBox.Picture.Bitmap := MainForm.BlockPalette.Picture.Bitmap;
BlockBox.Height := MapEditorForm.BlockPalette.Height;
TilePalette.Picture.Graphic := Tiles;
//TilePalette.Height := Tiles.Height;
Caption := 'Block Editor - Tileset ' + IntToStr(LoadedTileset);
BlockStart := TilesetStart;
LoadTile;
UpdateTile;
end;
procedure TBlockEditorForm.BlockBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
BlockLabel.Caption := 'Block: $' + IntToHex(Y div 32, 2);
AddressLabel.Caption := 'Offset: $' + IntToHex(TilesetStart + ((Y div 32) * 16), 2);
end;
procedure TBlockEditorForm.BlockBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
BlockStart := TilesetStart + ((Y div 32) * 16);
TileNumber := Y div 32;
LoadTile;
UpdateTile;
end;
procedure TBlockEditorForm.TilePaletteMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
TileLabel.Caption := 'Tile: $' + IntToHex((X div 8) + ((Y div 8) * 8), 2);
end;
procedure TBlockEditorForm.TilePaletteMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//gets tile where cursor is
SelPic := (X div 8) + ((Y div 8) * 8);
end;
procedure TBlockEditorForm.BlockEditBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
//puts selected tile into block
BlockData[(X div 8) + ((Y div 8) * 4)] := SelPic;
UpdateTile;
end
else
begin
SelPic := BlockData[(X div 8) + ((Y div 8) * 4)];
end;
end;
procedure TBlockEditorForm.UpdateButtonClick(Sender: TObject);
begin
SaveTile;
//draws edited tile into tileset
BlockPics[TileNumber].Canvas.Draw(0, 0, BlockEditBox.Picture.Bitmap);
//update block palette
MapEditorForm.DrawBlocks(MapEditorForm.BlockPalette.Canvas);
MapEditorForm.DrawBlocks(BlockBox.Canvas);
MapEditorForm.DrawMap(MapEditorForm.MapBox.Canvas);
RomModified := True;
end;
procedure TBlockEditorForm.BlockBoxPaint(Sender: TObject);
begin
MapEditorForm.DrawBlocks(BlockBox.Canvas);
end;
procedure TBlockEditorForm.BlockEditBoxMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
TileLabel.Caption := 'Tile: $' + IntToHex(BlockData[(X div 8) + ((Y div 8) * 4)], 2);
end;
end.