unit Unit1;
 // Автор Энгельгардт Влад mailto:Hex@samtel.ru
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXClass, DXSprite, DXInput, DXDraws, StdCtrls, ExtCtrls,math,
  DXSounds, MPlayer,ShellAPI, Buttons;
 //когда 2 раза esc написать About в нём управление.
type
  TForm1 = class(TDXForm)
    DXDraw1: TDXDraw;
    DXImageList1: TDXImageList;
    DXInput1: TDXInput;
    DXSpriteEngine1: TDXSpriteEngine;
    DXTimer1: TDXTimer;
    Timer1: TTimer;
    AI: TTimer;
    DXSound1: TDXSound;
    DXWaveList1: TDXWaveList;
    MediaPlayer1: TMediaPlayer;
    Panel1: TPanel;
    Label2: TLabel;
    Label1: TLabel;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    Panel2: TPanel;
    SpeedButton9: TSpeedButton;
    Memo1: TMemo;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure DXDraw1Initialize(Sender: TObject);
    procedure AITimer(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure SpeedButton8Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton9Click(Sender: TObject);
    procedure Label4Click(Sender: TObject);
    procedure Label6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TPlayerone = class(TImageSprite)
     private
    lngpolet:integer;
    oldlngpolet:integer;
  protected
    procedure DoMove(MoveCount: Integer); override;
  end;

  TPlayerFa = class(TImageSprite)  // playerов пуля
  private
    anglefa:integer; // угол под которым летит пуля
   protected
    procedure DoMove(MoveCount: Integer); override;
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
   public
    constructor Create(AParent: TSprite); override;
    destructor Destroy; override;
  end;

 TPlayertwo = class(TImageSprite)
     private
    lngpolet:integer;
    oldlngpolet:integer;
  protected
   procedure DoMove(MoveCount: Integer); override;
  end;

var
  Form1: TForm1;
  speed,speed2,ang,ang2: integer;
  fragpl,fragpl2:integer;
  umerpl,umerai:boolean; // plres переменная респавна true= погиб 1 игрок false 2 игрок
  fa:boolean; //выстрел нашего Ai true стрелял, false не стрелял
  ktogame:boolean;// кто играет за второй класс true-игрок, false-AI
  Player:TPlayerone;
  Playerai:TPlayertwo;
  pulxpl,CurrentPanpl:integer;
  ziznpl,ziznai:Integer;
implementation

{$R *.dfm}

procedure TPlayerfa.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is TPlayertwo then
begin
ziznAi:=ziznAi-10;
dead;
end;

if Sprite is TPlayerone then
begin
ziznpl:=ziznpl-10;
dead;
end;
end;

Procedure TPlayerone.DoMove(MoveCount: Integer);
begin
if ziznpl <=0 then
begin
dead;
form1.AI.Enabled :=false;
fragpl2:=fragpl2+1;
umerpl:=true;
form1.Timer1.enabled:=true;
end;
  inherited DoMove(MoveCount);
  ang:=angle;
  x:=x+cos256(Angle)*speed;
  y:=y+sin256(Angle)*speed;
  if  y >= form1.DXDraw1.SurfaceHeight-image.Height then
  y := form1.DXDraw1.SurfaceHeight-image.Height;
  if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then
  x := form1.DXDraw1.SurfaceWidth -image.Width;
  if  y <= 0 then
  y := 1;
  if  x <= 0 then
  x:=1;
    begin
     speed:=0;
      if isLeft in Form1.DXInput1.States then angle:=angle-5;
      if isRight in Form1.DXInput1.States then angle:=angle+5;;
      if isup in Form1.DXInput1.States then speed:=5;
      if isDown in Form1.DXInput1.States then speed:=-5;
      if isbutton3 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle+64)*3;
      y:= y+sin256 (angle+64)*3 ;
      end;
      if isbutton2 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle-64)*3;
      y:= y+sin256 (angle-64)*3 ;
      end;
      if isbutton1 in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           form1.DXWaveList1.Items.Find('fa').Play(true);
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang)*55;
           Y:=self.y+sin256(ang)*55;
           anglefa:=ang;
           oldlngpolet := lngpolet;
         end;
         end;
    end;
      lngpolet := lngpolet + MoveCount;
end;
 Collision;
end;
     constructor TPlayerFa.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Image := form1.DXImageList1.Items.Find('pul');
  Width := Image.Width;
  Height := Image.Height;
  AnimCount := Image.PatternCount;    //число кадров
  AnimLooped := True;         //повторять ли анимацию
  AnimSpeed := 10 / 1000;
end;

 destructor TPlayerFa.Destroy;
begin
  inherited Destroy;
end;

  procedure TPlayerFa.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
  angle := anglefa;
  x:=x+cos256(angle)*8;
  y:=y+sin256(angle)*8;
  pulxpl := trunc(x);
  CurrentPanpl := -20000 * pulxpl div form1.DXDraw1.ClientWidth + 10000;
  form1.dxwavelist1.Items.Find('fa').pan := CurrentPanpl;
  if X>= 800 then Dead;
  if y>= 600 then Dead;
  if X<= 0 then Dead;
  if y<= 0 then Dead;
  Collision;
end;

Procedure TPlayertwo.DoMove(MoveCount: Integer);
  begin
if ziznAi <=0 then
begin
dead;
ziznAi:=ziznAi-10;
fragpl:=fragpl+1;
umerAi:=true;
form1.Timer1.enabled:=true;
end;
  inherited DoMove(MoveCount);
  ang2:=angle;
  x:=x+cos256(Angle)*speed2;
  y:=y+sin256(Angle)*speed2;
  if  y >= form1.DXDraw1.SurfaceHeight-image.Height then
  y := form1.DXDraw1.SurfaceHeight-image.Height;
  if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then
  x := form1.DXDraw1.SurfaceWidth -image.Width;
  if  y <= 0 then
  y := 1;
  if  x <= 0 then
  x:=1;
begin
    if ktogame=true then
   begin
      speed2:=0;
      if isbutton6 in Form1.DXInput1.States then angle:=angle-5;
      if isbutton7 in Form1.DXInput1.States then angle:=angle+5;;
      if isbutton4 in Form1.DXInput1.States then speed2:=5;
      if isbutton5 in Form1.DXInput1.States then speed2:=-5;
      if isbutton10 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle+64)*3;
      y:= y+sin256 (angle+64)*3 ;
      end;
      if isbutton9 in Form1.DXInput1.States then
      begin
      x:= x+cos256 (angle-64)*3;
      y:= y+sin256 (angle-64)*3 ;
      end;
      if isbutton8 in Form1.DXInput1.States then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           form1.DXWaveList1.Items.Find('fa').Play(true);
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang2)*55;
           Y:=self.y+sin256(ang2)*55;
           anglefa:=ang2;
           oldlngpolet := lngpolet;
         end;
         end;
    end;
   end;
   if ktogame=false then
   begin
      if fa=true then
      begin
       if lngpolet-oldlngpolet>=250 then
      begin
       Inc(lngpolet);
         with TPlayerFa.Create(Engine) do
          begin
           form1.DXWaveList1.Items.Find('fa').Play(true);
           Image := form1.DXImageList1.Items.Find('pul');
           X:=self.X+cos256(ang2)*55;
           Y:=self.y+sin256(ang2)*55;
           anglefa:=ang2;
           oldlngpolet := lngpolet;
         end;
         fa:=false;
         end;
    end;
    end;
      lngpolet := lngpolet + MoveCount;
end;
 Collision;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;
  DXInput1.Update;
  DXSpriteEngine1.Move(LagCount);
  DXSpriteEngine1.Dead;
  DXDraw1.Surface.Fill(0);
  DXSpriteEngine1.Draw;
   with DXDraw1.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 12;
    Textout(30, 40, 'Фраги первого игрока: '+inttostr(fragpl));
    Textout(240, 40, 'Фраги второго игрока: '+inttostr(fragpl2));
    Textout(30, 60, 'Жизни первого игрока: '+inttostr(ziznpl));
    Textout(240, 60, 'Жизни второго игрока: '+inttostr(ziznai));
    Release;
  end;
  DXDraw1.Flip;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TBackgroundSprite.Create(DXSpriteEngine1.Engine) do
begin
  SetMapSize(1,1);
  Image := dxImageList1.Items.Find('bgr');
  Z:= -2;
  Tile := True;
end;
randomize;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if panel1.Visible =false then
begin
if Key=VK_ESCAPE then
begin
  ShowCursor(true);
  dxtimer1.Enabled:=false;
  panel1.Visible :=true;
  speedbutton3.Visible:=true;
  speedbutton7.Visible:=true;
  speedbutton8.Visible:=true;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin

if umerpl=true then
begin
  ziznpl:=100;
  Player:= TPlayerone.Create(DXSpriteEngine1.Engine);
  Player.Image := form1.dxImageList1.Items.Find('pl1');
  Player.x:=random(600);
  Player.y:=random(500);
  Player.Width := Player.Image.Width;
  Player.Height := Player.Image.Height;
  Player.AnimCount := Player.Image.PatternCount;
  Player.AnimLooped := True;
  Player.AnimSpeed := 10 / 1000;
  umerpl:=false;
  if ktogame=false then  form1.AI.Enabled :=true;
end;

if umerai=true then
begin
 ziznai:=100;
 Playerai:= TPlayertwo.Create(DXSpriteEngine1.Engine);
 Playerai.Image := DXImageList1.Items.Find('pl2');
 Playerai.X := random(600);
 Playerai.Y := random(500);
 Playerai.AnimCount := Playerai.Image.PatternCount;
 Playerai.AnimLooped := True;
 Playerai.AnimSpeed := 10 / 1000;
 Playerai.Width := Playerai.Image.Width;
 Playerai.Height := Playerai.Image.Height;
 umerai:=false;
 timer1.Enabled := false;
end;
end;

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
 ziznai:=100;
 Playerai:= TPlayertwo.Create(DXSpriteEngine1.Engine);
 Playerai.Image := DXImageList1.Items.Find('pl2');
 Playerai.X := 50;
 Playerai.Y := 250;
 Playerai.AnimCount := Playerai.Image.PatternCount;
 Playerai.AnimLooped := True;
 Playerai.AnimSpeed := 10 / 1000;
 Playerai.Width := Playerai.Image.Width;
 Playerai.Height := Playerai.Image.Height;

 ziznpl:=100;
 Player:= TPlayerone.Create(DXSpriteEngine1.Engine);
 Player.Image := form1.dxImageList1.Items.Find('pl1');
 Player.x:=350;
 Player.y:=250;
 Player.AnimCount := Player.Image.PatternCount;
 Player.AnimLooped := True;
 Player.AnimSpeed := 10 / 1000;
 Player.Width := Player.Image.Width;
 Player.Height := Player.Image.Height;
 Dxtimer1.enabled:=false;
panel1.Visible :=true;
 end;

procedure TForm1.AITimer(Sender: TObject);
begin
playerai.angle:=trunc(1/sin256(trunc((player.y-playerai.y)/(player.x-playerai.x))));
If (player.y-playerai.y < 0)and(player.x-playerai.x > 0) then  playerai.angle:=playerai.angle+192;
If (player.y-playerai.y < 0)and(player.x-playerai.x < 0) then  playerai.angle:=playerai.angle+128;
If (player.y-playerai.y > 0)and(player.x-playerai.x < 0) then  playerai.angle:=playerai.angle+64;
   if player.x <= playerai.x then
      playerai.x:=playerai.x-2.5;
    if player.x > playerai.x then
      playerai.x:=playerai.x+2.5;
    if player.y <= playerai.y then
      playerai.y:=playerai.y-2.5;
    if player.y > playerai.y then
      playerai.y:=playerai.y+2.5;
  if playerai.x >= player.x-140 then
    begin
      playerai.x:=playerai.x-2.5;
     end;
  if playerai.y>= player.y-140 then
    begin
     playerai.y:=playerai.y-2.5;
     end;
  if playerai.y >=player.y-150 then
    begin
    if playerai.x >=player.x-150 then
    begin
    fa:=true;
    end;
    end;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
application.Terminate;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 SpeedButton1.Visible:=false;
 SpeedButton2.Visible:=false;
 SpeedButton3.Visible:=false;
 SpeedButton4.Visible:=true;
 SpeedButton5.Visible:=true;
 SpeedButton6.Visible:=true;
end;

procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
 SpeedButton1.Visible:=true;
 SpeedButton2.Visible:=true;
 SpeedButton3.Visible:=true;
 SpeedButton4.Visible:=false;
 SpeedButton5.Visible:=false;
 SpeedButton6.Visible:=false;
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
MediaPlayer1.Play;
Dxtimer1.Enabled:=true;
ai.Enabled :=false;
ktogame:=true;
panel1.Visible:=false;
 ShowCursor(false);
 SpeedButton1.Visible:=false;
 SpeedButton2.Visible:=false;
 SpeedButton3.Visible:=false;
 SpeedButton4.Visible:=false;
 SpeedButton5.Visible:=false;
 SpeedButton6.Visible:=false;
 Playerai.X := random(600);
 Playerai.Y := random(500);
 Player.X := random(600);
 Player.Y := random(500);
 ziznpl:=100;
 ziznai:=100;
 fragpl:=0;
 fragpl2:=0;
end;

procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
MediaPlayer1.Play;
Dxtimer1.Enabled:=true;
ktogame:=false;
ai.Enabled :=true;
panel1.Visible:=false;
 ShowCursor(false);
 SpeedButton1.Visible:=false;
 SpeedButton2.Visible:=false;
 SpeedButton3.Visible:=false;
 SpeedButton4.Visible:=false;
 SpeedButton5.Visible:=false;
 SpeedButton6.Visible:=false;
 Playerai.X := random(600);
 Playerai.Y := random(500);
 Player.X := random(600);
 Player.Y := random(500);
 ziznpl:=100;
 ziznai:=100;
 fragpl:=0;
 fragpl2:=0;
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
 ShowCursor(false);
 dxtimer1.Enabled:=true;
 panel1.Visible :=false;
 SpeedButton1.Visible:=false;
 SpeedButton2.Visible:=false;
 SpeedButton3.Visible:=false;
 SpeedButton4.Visible:=false;
 SpeedButton5.Visible:=false;
 SpeedButton6.Visible:=false;
 SpeedButton7.Visible:=false;
 SpeedButton8.Visible:=false;
end;
procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
 SpeedButton1.Visible:=true;
 SpeedButton2.Visible:=true;
 SpeedButton7.Visible:=false;
 SpeedButton8.Visible:=false;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Panel2.Visible:=true;
end;

procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
panel2.Visible :=false;
end;

procedure TForm1.Label4Click(Sender: TObject);
begin
ShellExecute(GetDesktopWindow, 'open', 'Mailto:hex@samtel.ru', nil, nil, 0);
end;
procedure TForm1.Label6Click(Sender: TObject);
begin
ShellExecute(GetDesktopWindow, 'open', 'http://club.mnogo.ru/anketa.html?ref=card_01251224', nil, nil, 0);
end;

end.


