unit Games;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DXDraws, DXSprite, DXClass, DXInput, DIB,Menus, StdCtrls,Engine,
  ComCtrls,Math,Explotion;

type
  TForm1 = class(TDXForm)
    DXDraw: TDXDraw;
    BSpr: TDXImageList;
    DXSpriteEngine: TDXSpriteEngine;
    DXTimer: TDXTimer;
    PSpr: TDXImageList;
    DXInput: TDXInput;
    TSpr: TDXImageList;
    procedure FormCreate(Sender: TObject);
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
    procedure DXDrawFinalize(Sender: TObject);
    procedure DXDrawInitialize(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DXDrawInitializing(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Const
  MaxPix=60;

Var
  Form1: TForm1;
  L1:CEngine;
  ScrMapX,ScrMapY:Integer;
  Ss: Array [0..150] of TPoint;
  H,S:Integer;
  Alpha,G,T,U0:Extended;
  sMax:Integer;
  pix:TFlash;
implementation
{$R *.DFM}

Type
 TScrollBackground = class(TBackgroundSprite)
  private
    FSpeed: Double;
  protected
    procedure DoMove(MoveCount: Integer); override;
  end;

 TPlayerSprite = class(TImageSprite)
  protected
    j,k:Integer;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;
  end;

 TBallSprite = class(TImageSprite)
  private
    AnimP:Integer;
    a,d,f:Integer;
    Touch:Boolean;
    Cr:Boolean;    
    Px:TFlash;
    Tps: array[0..MaxPix] of TImageSprite;
  protected
    j,k:Integer;
    xs,ys:Extended;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
    procedure DoMove(MoveCount: Integer); override;
    procedure Hit;
 end;

procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if Sprite is TBallSprite then
    TBallSprite(Sprite).Hit;
  Done := False;
end;

procedure TPlayerSprite.DoMove(MoveCount: Integer);
Var
  i:Integer;
begin
  inherited DoMove(MoveCount);
//  PixelCheck := True;  
  l1.MoveObj;
  l1.Height:=12;
  l1.Move;
  l1.ResetKeys;
  l1.SetScroll(ScrMapX,ScrMapY);
  If isRight in Form1.DXInput.States then
   begin
    l1.kRight:=True;
    Inc(j);
    if j>5 then
     begin
      j:=0;
      Dec(k);
     end;
    If k>4 then k:=0;
    If k<0 then k:=4;
   end;
  If isLeft in Form1.DXInput.States then
   begin
    l1.kLeft:=True;
    Inc(j);
    if j>5 then
     begin
      j:=0;
      Inc(k);
     end;
    If k>9 then k:=5;
    If k<5 then k:=9;
   end;
  If isUp in Form1.DXInput.States then
   begin
    l1.kUp:=True;
   end;
 // if isShift in Form1.DXInput.States
  If (not l1.kRight) and (not l1.kLeft) and (not l1.kUp) then
   begin
     If k in [0..4] then k:=0;
     If k in [5..9] then k:=5;
   end;
  x:=(l1.Xobject-36)-ScrMapX;
  y:=(l1.Yobject-90)-ScrMapY;
  AnimPos := k;
  Collision;
end;

procedure TBallSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  inherited;
  if Sprite is TBallSprite then
    TBallSprite(Sprite).Hit;
  Done := False;
end;

procedure TBallSprite.DoMove(MoveCount: Integer);
Var
  xx,yy,yy1:Extended;
  i:Integer;
begin
  inherited DoMove(MoveCount);
 If Collisioned Then
  begin
  If a<>1 Then
   begin
    Inc(j);
    if j>5 then
     begin
     Inc(AnimP);
     j:=0;
     end;
    If AnimP<0 Then AnimP:=0;
    If AnimP>6 Then AnimP:=0;
   end
  else
   begin
    Inc(j);
    if j>5 then
     begin
       AnimP:=AnimP+d;
       j:=0;
     end;
    If AnimP<0 Then begin AnimP:=0; d:=1; end;
    If AnimP>6 Then begin d:=-1; end;
   end;

  AnimPos := AnimP;
  end;
 {  Else
     Image:=Form1.Tspr.Items.Items[2];}
  xx:=xs-ScrMapX;
  x:=xx;
  yy:=ys-ScrMapY;
  y:=yy;

  If not Collisioned Then
   begin
     Inc(F);
     Px.Math;
       For i:=0 to MaxPix do
      begin
        Tps[i].X:=(xs+px.Pixels[i].Xpixel div 10)-ScrMapX;
        Tps[i].Y:=(ys-px.Pixels[i].Ypixel div 10)-ScrMapY;
      end;
     If f>150 Then
      begin
        px.Free;
        For i:=0 to MaxPix do  Tps[i].Dead;
        Dead;
      end;
   end;
end;

procedure TBallSprite.Hit;
Var
 l:Integer;
begin
 Collisioned := False;
 Image:=Form1.Tspr.Items.Items[4];
 Px:=TFlash.Create;
// Randomize; 
 For l:=0 to MaxPix do
   begin
     px.Add(Random(150)+20,Random(360)/pi);
     px.Pixels[l].Gravity:=Random(8)+3;
     Px.Pixels[l].iSpr:=Random(3)+2;
     Px.Pixels[l].TimeLife:=30;
   end;
 Px.TimerCount:=0.1;
 px.MaxTime:=-1;
 If Cr Then
   begin
     For l:=0 to MaxPix do
       begin
         Tps[l]:=TImageSprite.Create(Form1.DXSpriteEngine.Engine);
         Tps[l].Image:=Form1.Tspr.Items.Items[Px.Pixels[l].iSpr];
         Tps[l].Z:=Random(2)-2;
       end;
       Cr:=False;
   end;
end;


procedure TForm1.FormCreate(Sender: TObject);
Var
  PlayerSprite,Cherry: TSprite;
  i,l:Integer;
  k,j:Integer;
begin
  DXDraw.Cursor :=crNone;
  DXDraw.ColorTable := BSpr.Items.ColorTable;
  DXDraw.DefColorTable := BSpr.Items.ColorTable;
  DXDraw.UpdatePalette;
  l1:=CEngine.Create;
  ScrMapX:=0;
  ScrMapY:=0;
  l1.Xobject:=160;
  l1.Yobject:=1206;
  l1.LoadFromFile('123.map');
  l1.StepY:=4;
  l1.StepX:=5;
  l1.GetXYMap;
  l1.ScreenSizeX:=640;
  l1.ScreenSizeY:=480;
  l1.AddMovedObj(179,2,3,300,380,MoveOnStay,StartedMoveUp);
  l1.AddMovedObj(180,0,3,0,120,AlwaysMove,StartedMoveDown);

{  with TScrollBackground.Create(DXSpriteEngine.Engine) do
  begin
    SetMapSize(2, 2);
    Image := Bspr.Items.Find('Star');
    Y := 0;
    Z := -2;
    Tile := True;
  end;
 }
  k:=-1;
  Randomize;
  For i:=0 to l1.LinesCount-1 do
   begin
     If not l1.Lines[i].vert Then
      begin
        If (Random(25) in [15..17]) Then  Inc(k);
         If k>150 Then k:=150;
         ss[k].X:=l1.Lines[i].xSpr;
         ss[k].Y:=l1.Lines[i].ySpr-22;
      end;
   end;
  Randomize;
  For i:=0 to k do
  with TBallSprite.Create(DXSpriteEngine.Engine) do
  begin
    j:=Random(2);
    a:=j;
    Image := Tspr.Items.Items[j];
    d:=1;
    Z := 0;
    Touch:=False;
    Width := Image.Width;
    Height := Image.Height;
    x:=ss[i].X;
    y:=ss[i].Y;
    AnimP:=Random(7);
    ys:=y;
    xs:=x;
    cr:=True;
  end;

  PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
  with TPlayerSprite(PlayerSprite) do
  begin
    Image := Bspr.Items.Items[0];
    Z := -1;
    Width := Image.Width;
    Height := Image.Height;
  end;

  Randomize;
  pix:=TFlash.Create;
  For i:=0 to MaxPix do
   begin
    pix.Add(Random(140)+20,Random(360)/pi);
    pix.Pixels[i].Gravity:=Random(7)+3;
  //   pix.Pixels[i].Gravity:=Sin(i/3)*2;
 //   pix.Pixels[i].Gravity:=Random(5);
    Pix.Pixels[i].iSpr:=Random(3)+2;
    Pix.Pixels[i].TimeLife:=Random(50)+Random(10);
   end;
   Pix.TimerCount:=0.3;
   pix.MaxTime:=-1;
end;

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
Var
  i:Integer;
  Ang:Integer;
  xNew,yNew:Integer;
  dxx,dyy:Integer;
  Val:Integer;
begin
  If not DXDraw.CanDraw then exit;
  DXInput.Update;
  DXDraw.Surface.Fill(0);
  DXSpriteEngine.Dead;
  DXSpriteEngine.Move(lagCount);
  DXSpriteEngine.Draw;
  If l1.LinesCount>0 Then
    For i:=0 to l1.LinesCount-1 do
      If l1.Visible[i] Then Pspr.Items.Items[l1.lines[i].IndexSpr].Draw(Form1.DXDraw.Surface,(l1.lines[i].xSpr)-ScrMapX ,(l1.lines[i].ySpr)-ScrMapY,0);
 // For i:=0 to 30 do Tspr.Items.Items[0].Draw(DXDraw.Surface,ss[i].X-ScrMapX,ss[i].Y-ScrMapY,0);

  Pix.Math;
  For i:=0 to MaxPix do
   begin
//     Tspr.Items.Items[Pix.Pixels[i].iSpr].Draw(DXDraw.Surface,(300+pix.Pixels[i].Xpixel div 10)-ScrMapX,(1300-pix.Pixels[i].Ypixel div 10)-ScrMapY,0);
{    Tspr.Items.Items[Pix.Pixels[i].iSpr].DrawAdd
    (DXDraw.Surface,Rect(
    300+pix.Pixels[i].Xpixel div 10 ,
    100-pix.Pixels[i].Ypixel div 10 ,
    300+pix.Pixels[i].Xpixel div 10 +5,
    100-pix.Pixels[i].Ypixel div 10 +5),0,
    Round(pix.Pixels[i].Time)*5);}

   // Tspr.Items.Items[0].Draw(DXDraw.Surface,300+pix.Pixels[i].Xpixel div 10,100-pix.Pixels[i].Ypixel div 10,0);
   //  DXDraw.Surface.Canvas.Pixels[300+pix.Pixels[i].Xpixel div 10 ,100-pix.Pixels[i].Ypixel div 10]:=
    // RGB(Round(Pix.Pixels[i].Time *10),Round(Pix.Pixels[i].Time *10),Round(Pix.Pixels[i].Time*10));
   end;

   For i:=0 to MaxPix do
    begin
     // pix.Pixels[i].Alpha:=pix.Pixels[i].Alpha-0.01;
    //  pix.Pixels[i].StartSpeed:=pix.Pixels[i].StartSpeed-0.03;
  //   pix.Pixels[i].Gravity:=Random(6)+4;
    end;

{   If l1.IndexStayLine=179 Then
    begin
     l1.Teleport(l1.Lines[180].xSpr+32,10);
    end;}
  with DXDraw.Surface.Canvas do
   begin
    Brush.Style := bsClear;
    Font.Color := ClRed;
    Font.Size := 12;
    Font.Style:= Font.Style + [fsBold];
    Textout(10, 0, 'FPS: '+inttostr(DXTimer.FrameRate));
    Textout(10, 20, 'S: '+inttostr(s));
    Textout(10, 35, 'H: '+inttostr(h));
    Textout(10, 50, 'A: '+Floattostr(Alpha));
    Release;
   end;
  DXDraw.Flip;
end;

procedure TForm1.DXDrawFinalize(Sender: TObject);
begin
  DxTimer.Enabled:=False;
end;

procedure TForm1.DXDrawInitialize(Sender: TObject);
begin
  DXTimer.Enabled:=True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then  Close;
  if (ssAlt in Shift) and (Key=VK_RETURN) then
  begin
    DXDraw.Finalize;
    if doFullScreen in DXDraw.Options then
    begin
      RestoreWindow;
      DXDraw.Cursor := crDefault;
      BorderStyle := bsSizeable;
      DXDraw.Options := DXDraw.Options - [doFullScreen];
    end else
    begin
      StoreWindow;
      DXDraw.Cursor := crNone;
      BorderStyle := bsNone;
      DXDraw.Options := DXDraw.Options + [doFullScreen];
    end;
    DXDraw.Initialize;
  end;
end;

{ TScrollBackground }

procedure TScrollBackground.DoMove(MoveCount: Integer);
begin
  inherited;
  //x:=-ScrMapX div 4;
 // y:=-ScrMapy div 8;
end;

procedure TForm1.DXDrawInitializing(Sender: TObject);
begin
  if doFullScreen in DXDraw.Options then
  begin
    BorderStyle := bsNone;
    DXDraw.Cursor := crNone;
  end
 { else
  begin
    BorderStyle := bsSingle;
    DXDraw.Cursor := crDefault;
  end;}
end;

{ TBallSprite }


end.
