unit pierwotniak;

interface
uses OmegaImageList, OmegaScreen, OmegaSprite,OmegaInput,
     praduszek,UnitWarstwy,unit1, Sysutils;
const
  tabGrafikiPierwotny:array[0..2]of string=
                    (
                     ('pierwotny000'),//grafa- stoj, pauza, idź, bieg
                     ('pierwotny001'),//grafa- mow,okrzyk
                     ('pierwotny002') //grafa- rzut dzida,śmierć
                    );
  tabRuchuPierwotny:array[0..1,0..7]of byte=
                    (
                     (7,4,3,5,7,4,3,5),//Idź
                     (17,8,6,12,17,8,6,12) //Bieg
                    );
  //wartosci odpowiadaja skrajnym indeksą klatek zachowań
  tabPierwotny:array[0..49,0..1]of byte=
                    ((0,7),//stoj   {0}
                     (8,15),//pauza {1}
                     (16,23),//IDŹ  {2}
                     (24,31),//
                     (32,39),//
                     (40,47),//
                     (48,55),//
                     (56,63),//
                     (64,71),//
                     (72,79),//
                     (80,87),//BIEG  {10}
                     (88,95),
                     (96,103),
                     (104,111),
                     (112,119),
                     (120,127),
                     (128,135),
                     (136,143),
                     (0,8),//Mów    {18}
                     (9,17),
                     (18,26),
                     (27,35),
                     (36,44),
                     (45,53),
                     (54,62),
                     (63,71),
                     (72,80),//okrzyk {26}
                     (81,89),
                     (90,98),
                     (99,107),
                     (108,116),
                     (117,125),
                     (126,134),
                     (135,143),       {32}
                     (0,10),//rzut dzidą {33}
                     (11,21),
                     (22,32),
                     (33,43),
                     (44,54),
                     (55,65),
                     (66,76),
                     (77,87),             {40}
                     (88,98),             {41}
                     (99,109),
                     (110,120),
                     (121,131),
                     (132,142),
                     (143,153),
                     (154,164),
                     (165,175)             {48}
                     );
type
  tPierwotny=class(TPraduch)
   private

    dXAnimacji:single;
    fdxObrazu,
    fdyObrazu:integer;//przesuniecie obrazu klatki  ze wzgledu na rózne jej rozmiary
                     //dla ataku, ruchu itp.
    procedure Move(const MoveCount:single);override;
    procedure Draw;override;
    procedure Zachowanie;override;
    procedure Klawiszologia;override;
    procedure AtakDzida;
    procedure Akcja;
    function Kolizja(aX,aY:single):boolean;
  end;
procedure RobPierwotniaka(const AParent: TOmegaSprite;
                          const AOmegaImageList: TOmegaImageList;
                          const AOmegaInput:TOmegaInput;
                          const ANazwaObrazu:string;
                          const AIdKlatka,aX,aY:Integer);
implementation

uses UnitPociski;

procedure TPierwotny.Draw;
begin
 Image.Draw(Round(x-fdxObrazu),Round(y-fdyObrazu),ImageIndex);
end;
procedure TPierwotny.Move(const MoveCount:single);
begin
 inherited Move(MoveCount);
end;

function tPierwotny.Kolizja(aX,aY:single):boolean;
//funkcja kolizji opartej na tescie zawartości klatek
var
 stareX,stareY:single;
 stareIdkafla:LongInt;
begin
  stareX:=x;
  stareY:=y;
  stareIdkafla:=idKafla;
  result:=false;
  Pozycja(aX,aY,DaneMApy.W1Kosc,DAneMapy.H1Kosc);
  if (PMapa(Lista.Items[1])^[idKafla].RGBA.zakazWstepu=1)
     or
     KoniecSwiata(aX,aY)
   then begin
   skokX:=0;
   skokY:=0;
   x:=stareX;
   y:=stareY;
   idKafla:=stareidKafla;
   result:=true;
  end;
end;

procedure tPierwotny.AtakDzida;
const
  fLicznikKlatek:integer=0;
begin
  if fLicznikKlatek>10 then
     begin
      Stan:=stStop;
      fLicznikKlatek:=0;
      //rzucaj dzidą
      RobPocisk(Form1.OmegaSprite1,Form1.OmegaImageList1,tDzida,
                Kierunek,X,Y);
      exit;
     end;
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*8 then begin
                        inc(fLicznikKlatek);
                        ZmienObraz(tabGrafikiPierwotny[2]);
                        fdxObrazu:=21;
                        fdyObrazu:=14;
                        ImageIndex:=ImageIndex+1;dXAnimacji:=0;
                        Stan:=stAtak;
                        Zachowanie;
                        end;
end;

procedure tPierwotny.Akcja;
begin
 if Stan=stAtak then begin AtakDzida;exit;end;

 //rzut dzida- klawisz A
 if(oisButton4{A} in fOmegaInput.keyboard.States)
 then begin
  AtakDzida;
  exit;
 end;
 //bieg
 if(oisUp in fOmegaInput.keyboard.States)and(oisButton1{Lewy Shift} in fOmegaInput.keyboard.States)
 then begin
  skokX:=dv*1.5*tabWersor[ord(Kierunek),0];
  skokY:=dv*1.125*tabWersor[ord(Kierunek),1];
  if Kolizja(X+skokX,Y+skokY) then exit;
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*3.5 then begin
                        ImageIndex:=ImageIndex+1;dXAnimacji:=0;
                        Stan:=stBieg;
                        Zachowanie;
                        end;
  exit;
 end;
 //idz na przod
 if oisUp in fOmegaInput.keyboard.States then begin
  skokX:=dv*tabWersor[ord(Kierunek),0];
  skokY:=dv*0.75*tabWersor[ord(Kierunek),1];
  if Kolizja(X+skokX,Y+skokY) then exit;
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*5 then begin
                        ImageIndex:=ImageIndex+1;dXAnimacji:=0;
                        Stan:=stIdz;
                        Zachowanie;
                        end;
  exit;
 end;
 //cofaj się
 if oisDown in fOmegaInput.keyboard.States then begin
  skokX:=-dv*tabWersor[ord(Kierunek),0];
  skokY:=-dv*0.75*tabWersor[ord(Kierunek),1];
  if Kolizja(X+skokX,Y+skokY) then exit;
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*5 then begin
                        ImageIndex:=ImageIndex-1;dXAnimacji:=0;
                        Stan:=stIdz;
                        Zachowanie;
                        end;
  exit;
 end;
 //Rozmowa
 if(oisButton2{M} in fOmegaInput.keyboard.States)
 then begin
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*5 then begin
                        ZmienObraz(tabGrafikiPierwotny[1]);
                        ImageIndex:=ImageIndex+1;dXAnimacji:=0;
                        Stan:=stMow;
                        Zachowanie;
                        end;
  exit;
 end;
 //Okrzyk
 if(oisButton3{O} in fOmegaInput.keyboard.States)
 then begin
  dXAnimacji:=dXAnimacji+deltaSeconds;
  if dXAnimacji>deltaSeconds*5 then begin
                        ZmienObraz(tabGrafikiPierwotny[1]);
                        ImageIndex:=ImageIndex+1;dXAnimacji:=0;
                        Stan:=stOkrzyk;
                        Zachowanie;
                        end;
  exit;
 end;
 //jak nic nie wybrano lub zwolniono klawisz to wzkonaj standard
 fdxObrazu:=0;
 fdyObrazu:=0;
 dxAnimacji:=0;
 ZmienObraz(tabGrafikiPierwotny[0]);
 stan:=stStop;
 Zachowanie;
 ImageIndex:=ord(Kierunek);
end;

procedure tPierwotny.Klawiszologia;
begin
 Akcja;
 inherited Klawiszologia;

end;
procedure tPierwotny.Zachowanie;
//ustal granice klatek zachowań
begin
 case Stan of
      stStop  :begin TabZachowan0:=tabPierwotny[0,0] ;TabZachowanK:=tabPierwotny[0,1];end;
      stPauza :begin TabZachowan0:=tabPierwotny[1,0] ;TabZachowanK:=tabPierwotny[1,1];end;
      stIdz   :begin TabZachowan0:=tabPierwotny[2+ord(Kierunek),0] ;TabZachowanK:=tabPierwotny[2+ord(Kierunek),1];end;
      stBieg  :begin TabZachowan0:=tabPierwotny[10+ord(Kierunek),0];TabZachowanK:=tabPierwotny[10+ord(Kierunek),1];end;
      stMow   :begin TabZachowan0:=tabPierwotny[18+ord(Kierunek),0];TabZachowanK:=tabPierwotny[18+ord(Kierunek),1];end;
      stOkrzyk:begin TabZachowan0:=tabPierwotny[26+ord(Kierunek),0];TabZachowanK:=tabPierwotny[26+ord(Kierunek),1];end;
      stAtak  :begin TabZachowan0:=tabPierwotny[34+ord(Kierunek),0];TabZachowanK:=tabPierwotny[34+ord(Kierunek),1];end;
 end;
 inherited Zachowanie;
end;
procedure RobPierwotniaka(const AParent: TOmegaSprite;
                          const AOmegaImageList: TOmegaImageList;
                          const AOmegaInput:TOmegaInput;
                          const ANazwaObrazu:string;
                          const AIdKlatka,aX,aY:Integer);
var
 p:tPierwotny;
begin
 p:=tPierwotny.Create(AParent,AOmegaImageList,ANazwaObrazu,AIdKlatka);
 with p do begin
      dV:=2;//2;
      x:=aX;
      y:=aY;
      Stan:=stStop;
      Aktywny:=true;
      Zachowanie;
      Kierunek:=k_S;
      ImageIndex:=TabZachowan0+ord(Kierunek);
      fOmegaInput:=AOmegaInput;
      dXAnimacji:=0;
 end;
 PraLista.Add(p);
 IdAktywnyDuszek:=PraLista.Count-1;
end;

end.
