unit MP;

interface

uses
  perso,
  map,
  gameplay,
  System.Drawing,
  System.Windows.Forms,
  Microsoft.DirectX,
  Microsoft.DirectX.DirectInput,
  Microsoft.DirectX.Direct3D;

type
  TZone = record
    u, d, r, l : char;
  end;

  TMP = class
    private
      i,j : double;
      zone : TZone;

    public
      cboost : double;
      constructor create;
      procedure newPosition(  var pos : Tpos ;  var Touches:TTouches ; vecteur: array of string ;tailleX : integer ; tailleZ:integer);
      procedure getZone ( pos : Tpos ; vecteur: array of string);
      procedure contact(var pos : Tpos; stockx, stockz : real; surface : TZone);
      procedure reset(var pos : Tpos);
      procedure jump(var pos : Tpos);
      procedure boost;
  end;

implementation

constructor TMP.create;
begin
  i:=0.5;
  inherited;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.newPosition(  var pos : Tpos ;  var Touches:TTouches ; vecteur: array of string ;tailleX : integer ; tailleZ:integer);
  var
    stockX, stockZ : real;
begin
  if  (pos.x <= 0.5) or (pos.x >= tailleX-0.5 ) or (pos.z <= 0.5) or (pos.z >= tailleZ-0.5 )or (pos.y < 0) then
    pos.y := pos.y-0.20
  else
    getZone(pos , vecteur);
    stockx := pos.x;
    stockz := pos.z;

    if Touches.Dr then
    begin
      pos.angle := (pos.angle - 0.05);
      if pos.angle < 0 then
        pos.angle := 2*math.pi - 0.05
    end;

    if Touches.Ga then
    begin
      pos.angle := (pos.angle + 0.05);
      if pos.angle >= 2*math.pi then
        pos.angle := 0.05
    end;

    if Touches.Ha then
    begin
      pos.x := pos.x - 0.1*cos(pos.angle)*cboost;
      pos.z := pos.z - 0.1*sin(pos.angle)*cboost;
    end;

    if (Touches.saut or pos.saut) and (pos.y>=0) then
      jump(pos);

    Self.contact(pos, stockx, stockz, zone );

    if Touches.R then
      reset(pos);

    if touches.boost or pos.boost then
      boost
    else
    begin
      j := 1;
      cboost:=1;
    end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.getZone ( pos : Tpos ; vecteur: array of string);
begin
  if  (vecteur[trunc(pos.z+0.5)][trunc(1+pos.x+0.20)] = '2') or (vecteur[trunc(pos.z+0.5)][trunc(1+pos.x-0.20)] = '2') then
    zone.u := '2'
  else if (vecteur[trunc(pos.z+0.5)][trunc(1+pos.x+0.20)] = '1') or (vecteur[trunc(pos.z+0.5)][trunc(1+pos.x-0.20)] = '1') then
    zone.u :='1'
  else
    begin
      zone.u :='0';
    end;


  if  (vecteur[trunc(pos.z-0.5)][trunc(1+pos.x+0.20)] = '2') or (vecteur[trunc(pos.z-0.5)][trunc(1+pos.x-0.20)] = '2') then
    zone.d := '2'
  else if (vecteur[trunc(pos.z-0.5)][trunc(1+pos.x+0.20)] = '1') or (vecteur[trunc(pos.z-0.5)][trunc(1+pos.x-0.20)] = '1') then
    zone.d :='1'
  else
    begin
    zone.d :='0';
    end;


  if  (vecteur[trunc(pos.z-0.20)][trunc(1+pos.x+0.5)] = '2') or (vecteur[trunc(pos.z+0.20)][trunc(1+pos.x+0.5)] = '2') then
    zone.r := '2'
  else if (vecteur[trunc(pos.z-0.20)][trunc(1+pos.x+0.5)] = '2') or (vecteur[trunc(pos.z+0.20)][trunc(1+pos.x+0.5)] = '1') then
    zone.r :='1'
  else
    begin
    zone.r :='0';
    end;


  if  (vecteur[trunc(pos.z-0.20)][trunc(1+pos.x-0.5)] = '2') or (vecteur[trunc(pos.z+0.20)][trunc(1+pos.x-0.5)] = '2') then
    zone.l := '2'
  else if (vecteur[trunc(pos.z-0.20)][trunc(1+pos.x-0.5)] = '1') or (vecteur[trunc(pos.z+0.20)][trunc(1+pos.x-0.5)] = '1') then
    zone.l :='1'
  else
    begin
    zone.l :='0';
    end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.contact(var pos : Tpos; stockx, stockz : real; surface : TZone);
begin


  if (surface.u = '2')  and (pos.angle > math.pi) then
    pos.z := stockz;

  if (surface.d = '2') and (pos.angle < math.pi) then
    pos.z := stockz;

  if (surface.r = '2') and ((pos.angle>0.5*math.pi) and (pos.angle < 1.5*math.pi)) then
    pos.x := stockx;

  if (surface.l = '2') and ((pos.angle<0.5*math.pi) or (pos.angle > 1.5*math.pi)) then
    pos.x := stockx;

  if (surface.l <> '1') and (surface.r <> '1') and (surface.u <> '1') and (surface.d <> '1') then
  begin
    if pos.saut = false then
    begin
    pos.x := stockx;
    pos.z := stockz;
    pos.y := pos.y-0.2;
    end;
  end;


end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.reset(var pos : Tpos);
begin
  pos.x := 2;
  pos.y := 0;
  pos.z := 21;
  pos.angle := 1.57;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.jump(var pos : Tpos);
begin
  pos.saut := true;
  pos.y := 3*sin(0.1*i);
  i:= i+0.5;
  if (pos.y <= 0) then
  begin
    pos.saut := false;
    pos.y := 0;
    self.i := 0.5;

  end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure TMP.boost;
begin
  cboost := 3-2/j;
  j:=j+0.02;
end;

end.
