Unit OopObjs;

{ OOPOBJS.PAS  Version 1.1 Copyright 1992 Scott D. Ramsay }

{  OOPOBJS.PAS is free! Go crazy. }
{  When I was learning Linked-List in High School, I thought that I'd only  }
{ need it in boring stuff like database Programming.  Doubled linked-list,  }
{ is a great way to handle multiple Objects For games.  Throw in some OOP   }
{ design and Volia!  Easy managable sprites.                                }
{  I give this code to Public Domain.  Use it as you see fit.  Just include }
{ the first comment line when distributing the source code, Thanks.         }

{  Changes from 1.0:                                                        }
{    Added new parameter in method checkhit.                                }
{          Var item:pobj                                                    }
{      Is a Pointer to the Object which called the checkhit                 }

Interface

Type
  plist   = ^tlist;
  PObjs   = ^tobjs;
  tobjs   = Object
              nx,ny,                       { Sprite Position               }
              flp,                         { Sprite number (For animation) }
              nrx,                         { I Forget what this does       }
              num_sprite,                  { Num of sprites per Objects    }
              timeo,                       { How long this Object lasts    }
              pointage     : Integer;      { Score value (For gamers)      }
              mapcolor     : Byte;         { Color For radar display       }
              id,                          { I Forget this one too         }
              explo,                       { True if the Object is explodin}
              overshow     : Boolean;      { See: Procedure DRAWITEMS      }
              powner       : plist;        { The PLIST node which this     }
                                           {  Object belongs               }
              Constructor init(vx,vy:Integer);
              Procedure drawitemObject;Virtual;
              Procedure calcitemObject;Virtual;
              Function checkhit(hx,hy:Integer;Var item:pobjs):Boolean;Virtual;
              Destructor done; Virtual;
            end;
  PobjMov = ^tobjMov;
  tobjMov = Object(tobjs)
              ndx,ndy : Integer;
              Constructor init(vx,vy,vdx,vdy:Integer);
              Procedure calcitemObject; Virtual;
            end;
  tlist = Record
            item      : pobjs;
            prev,next : plist;
          end;
  pkill = ^tkill;
  tkill = Record
            tk   : plist;
            next : pkill;
          end;

Procedure addp(Var nkbeg,nkend,p:plist);
Procedure deletep(Var nkbeg,nkend,p:plist);
Procedure calcitems(Var nkbeg:plist);
Procedure drawitems(Var nkbeg:plist;over:Boolean);
Procedure add2kill_list(Var kill:pkill;Var i:plist);
Procedure cleankill_list(Var kill:pkill;Var nkbeg,nkend:plist);
Procedure clean_plist(Var nkbeg,nkend:plist);

Implementation

Procedure calcitems(Var nkbeg:plist);
Var
  p : plist;
begin
  p := nkbeg;
  While p<>nil do
    begin
      p^.item^.calcitemObject;
      p := p^.next;
    end;
end;


Procedure drawitems(Var nkbeg:plist;over:Boolean);
{
  This Procedure is usually called from:  (GMorPH.PAS)
     Tmorph.pre_map
     Tmorph.post_map
  The OVER flag tells when this Object should be drawn.  Behind
   geomorph or infront of the geomorph.
}
Var
  p : plist;
begin
  p := nkbeg;
  While p<>nil do
    begin
      if (p^.item^.overshow=over)
        then p^.item^.drawitemObject;
      p := p^.next;
    end;
end;


Procedure clean_plist(Var nkbeg,nkend:plist);
Var
  p,p2 : plist;
begin
  p := nkbeg;
  While p<>nil do
    begin
      p2 := p;
      p := p^.next;
      dispose(p2^.item,done);
      dispose(p2);
    end;
  nkbeg := nil;
  nkend := nil;
end;


Procedure addp(Var nkbeg,nkend,p:plist);
begin
  p^.next := nil;
  if nkend=nil
    then
      begin
        nkbeg := p;
        nkend := p;
        p^.prev := nil;
      end
    else
      begin
        p^.prev := nkend;
        nkend^.next := p;
        nkend := p;
      end;
end;


Procedure deletep(Var nkbeg,nkend,p:plist);
begin
  if nkbeg=nkend
    then
      begin
        nkbeg := nil;
        nkend := nil;
      end
    else
  if nkbeg=p
    then
      begin
        nkbeg := nkbeg^.next;
        nkbeg^.prev := nil;
      end
    else
  if nkend=p
    then
      begin
        nkend := nkend^.prev;
        nkend^.next := nil;
      end
    else
      begin
        p^.next^.prev := p^.prev;
        p^.prev^.next := p^.next;
      end;
  dispose(p^.item,done);
  dispose(p);
end;


Procedure cleankill_list(Var kill:pkill;Var nkbeg,nkend:plist);
Var
  p,p2 : pkill;
begin
  p := kill;
  While p<>nil do
    begin
      p2 := p;
      p := p^.next;
      deletep(nkbeg,nkend,p2^.tk);
      dispose(p2);
    end;
  kill := nil;
end;


Procedure add2kill_list(Var kill:pkill;Var i:plist);
Var
  p : pkill;
begin
  new(p);
  p^.tk := i;
  p^.next := kill;
  kill := p
end;

(**) { tobjs Methods }

Constructor tobjs.init(vx,vy:Integer);
begin
  nx := vx; ny := vy; num_sprite := 1;
  mapcolor := $fb; pointage := 0;
  flp := 0; overshow := False;
end;


Destructor tobjs.done;
begin
end;


Procedure tobjs.drawitemObject;
begin
  { i.e.
     fbitdraw(nx,ny,pic[flip]^);
  }
end;


Procedure tobjs.calcitemObject;
begin
end;


Function tobjs.checkhit(hx,hy:Integer;Var item:pobjs):Boolean;
begin
end;

(**) { tobjMov methods }

Constructor tobjMov.init(vx,vy,vdx,vdy:Integer);
begin
  nx := vx; ny := vy; ndx := vdx; ndy := vdy;
  mapcolor := $fb; pointage := 0;
  flp := 0; overshow := False;
end;


Procedure tobjMov.calcitemObject;
begin
 { These are just simple examples of what should go in the methods }
  inc(nx,ndx); inc(ny,ndy);
  flp := (flp+1)mod num_sprite;
end;

end.