unit uWorldData;

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

interface

uses Types,
     SysUtils,

     fwTypes,
     fwCustomEngine;

const
  cMapSizeX        = 256;
  cMapSizeY        = 256;

type
  PWorldRect       = ^TWorldRect;
  TWorldRect       = packed record
    X                : SmallInt;
    Y                : SmallInt;
    Layer            : SmallInt;
    SortOrder        : Integer;
    Floor            : Word;
    Wall             : Word;
    Event            : Word;
  end;

  TWorldMap        = class(TObject)
  protected
    fMap             : array[0..(cMapSizeX * cMapSizeY) - 1] of TWorldRect;
    fHeight          : Integer;
    fWidth           : Integer;
    function GetFloor(aX, aY : Integer) : PWorldRect;
    function GetWall(aX, aY : Integer) : PWorldRect;
  public
    constructor Create(aWidth, aHeight : Integer);
    destructor Destroy; override;
    procedure Clear;
    property Height : Integer read fHeight;
    property Floor[aX, aY : Integer] : PWorldRect read GetFloor; default;
    property Wall[aX, aY : Integer] : PWorldRect read GetWall; 
    property Width : Integer read fWidth;
  end;

  TWorldData       = record
    // Physikalische Aufloseung
    ScreenWidth      : Integer;   // Breite der Bildschirmausgabe
    ScreenHeight     : Integer;   // Hoehe des Bildschirmausgabe
    ScreenXHalf      : Integer;   // Vorbrechnet, damit eine Division gespaart wird
    ScreenYHalf      : Integer;   // Vorbrechnet, damit eine Division gespaart wird
    Viewport         : TCERect;   // Anzeigebreich auf dem Bildschirm

    // Tile - Informationen
    TileWidth        : Integer;   // Breite eines Tile in Pixel
    TileHeight       : Integer;   // Hoehe eines Tile in Pixel
    TileXHalf        : Integer;   // Vorbrechnet, damit eine Division gespaart wird
    TileYHalf        : Integer;   // Vorbrechnet, damit eine Division gespaart wird
    IsRealScale      : Boolean;   // Ist Verhaeltnis Breite/Hoehe ganzzahlig -> einfache Division
    TileRScale       : Single;    // Verhaeltnis als Gleitkommazahl
    TileIScale       : Integer;   // Verhaeltnis als Ganzzahl

    // Tile - Grafiken
    Tiles            : array[0..255] of TfwCEDrawable;

    // Karteninformation
    OffsetX          : Integer;   // X-Offset der Position in Pixel
    OffsetY          : Integer;   // Y-Offset der Position in Pixel
    Map              : TWorldMap;
  end;

implementation

// TWorldMap -------------------------------------------------------------
function TWorldMap.GetFloor(aX, aY : Integer) : PWorldRect;
begin
  Result := @fMap[aY * cMapSizeX + aX];
end;

function TWorldMap.GetWall(aX, aY : Integer) : PWorldRect;
begin
  Result := @fMap[aY * cMapSizeX + aX];
end;

constructor TWorldMap.Create(aWidth, aHeight : Integer);
begin
  inherited Create;

  fWidth  := aWidth;
  fHeight := aHeight;
end;

destructor TWorldMap.Destroy;
begin
  inherited Destroy;
end;

procedure TWorldMap.Clear;
begin
  FillChar(fMap, SizeOf(fMap), #0);
end;

end.
