unit uMap;
interface
// Для любителей поковырять сырцы:
// Да, я опять написал процедурный хомнокод.
// Да, я взялся за старое, но все это потому,
// что:
// 1. такой код мне отладить быстрее, чем ООП огород и списки;
// 2. думаю, не стоит без необходимости плодить лишние сущности
// 3. создается ощущуение, что есть небольшие отличия в реализации ООП
// в разных языках (для справки, прототип написан на JavaScript с использованием
// ООП)
// вот так, будь у меня больше времени, возможно я бы переписал этот код
// в красивый, объектно ориентированный и логичный.

uses
  zglHeader, uMaterials, uList, uParticle;

const
  c_Tile_W = 16;
  c_Tile_H = 16;
  c_Map_W = 80 - 1;
  c_Map_H = 4;
  c_Map_sW = c_Map_W * c_Tile_W;
  c_Map_sH = c_Map_W * c_Tile_W;
  c_BunkerH = 32;

type
  TMap = class
    Tile : array[0..c_Map_W, 0..c_Map_H] of Byte;
    WinW, WinH,
    BunkerX0, BunkerX1, BunkerY0, BunkerY1,
    sX, sY, sX1, sY1 : Integer;
    BunkerNoLive : Boolean;
    PParticles : TParticles;
    constructor Create(WinW_, WinH_ : Integer);
    procedure Start;
    procedure Update;
    procedure Draw;
    function Collis(X, Y : Single) : Boolean;
    function IsTile(X, Y : Integer) : Boolean;
  end;

implementation
{ Map }

function TMap.Collis(X, Y: Single): Boolean;
var
  tX, tY : Integer;


  procedure TileFree(nX, nY : Integer);
  begin
    if IsTile(nX, nY) then
    begin
      Tile[nX, nY] := 0;
      PParticles.Add(sX + nX * c_Tile_W + random(10) - 2, sY + nY * c_Tile_H + random(10) - 2, 2);
      PParticles.Add(sX + nX * c_Tile_W + random(10) - 2, sY + nY * c_Tile_H + random(10) - 2, 1);
      PParticles.Add(sX + nX * c_Tile_W + random(10) - 2, sY + nY * c_Tile_H + random(10) - 2, 1);
    end;
  end;
begin
  if (X >= BunkerX0) and (X <= BunkerX1) and (Y >= BunkerY0) and (Y <= BunkerY1) then
  begin
    BunkerNoLive := true;
    Result := true;
  end
  else
  if (X >= sX) and (X <= sX1 ) and (Y >= sY ) and (Y <= sY1) then
  begin
    tX := trunc((X - sX) / c_Tile_W);
    tY := trunc((Y - sY) / c_Tile_H);

    Result := IsTile(tX, tY) and (Tile[tX, tY] > 0);
    if Result then
    begin
      Tile[tX, tY] := 0;
      TileFree(tX - 1, tY);
      TileFree(tX + 1, tY);
      TileFree(tX, tY - 1);
      TileFree(tX, tY + 1);
    end;
  end
  else
    Result := false;
end;

constructor TMap.Create;
begin
  WinW := WinW_;
  WinH := WInH_;

  BunkerX0 := 0;
  BunkerX1 := BunkerX0 + c_Map_sW;
  BunkerY0 := WinH - c_BunkerH;
  BunkerY1 := WinH;

  sX := BunkerX0;
  sY := BunkerY0 - c_Tile_H * (c_Map_H + 1);

  sX1 := BunkerX1;
  sY1 := BunkerY0;

  Start;
end;

procedure TMap.Draw;
var
  iX, iY : Integer;
begin
  for iY := 0 to c_Map_H do
  for iX := 0 to c_Map_W do
  if Tile[iX, iY] > 0 then
    pr2d_Rect(sX + iX * c_Tile_W, sY + iY * c_Tile_H, c_Tile_W, c_Tile_H, $FFFFFF, 252, PR2D_FILL);

  pr2d_Rect(BunkerX0, BunkerY0, WinW, c_BunkerH, $222288, 252, PR2D_FILL);
end;
 {
function TMap.FreeWay(X, Y: Integer): Boolean;
begin
	if (X >= 0) and (X <= W) and (Y >= 0) and (Y <= H) then
 		result := Tile[X][Y].Free
 	else
 		result := false;
end;
  }



function TMap.IsTile(X, Y: Integer): Boolean;
begin
	result := (X >= 0) and (X <= c_Map_W) and (Y >= 0) and (Y <= c_Map_H);
end;

procedure TMap.Start;
var
  iX, iY : Integer;
begin
  for iX := 0 to c_Map_W do
  for iY := 0 to c_Map_H do
    Tile[iX, iY] := 1;
  BunkerNoLive := false;
end;

procedure TMap.Update;
var
  AP : Single;
  A, X, Y : Integer;
begin

end;

end.
