Invader War

 
 

program InvaderWar;

uses Common,QuickDrawII,EventMgr,MscToolSet;


type

  star = object

    x,y,speed : integer;

    procedure setup;

    procedure draw;

  end;

   

  invader = object

    x,y,bx,by,speed : integer;

    fshoot : boolean;

    procedure setup;

    procedure draw;

    procedure bang;

    procedure fire;

  end;

   

var

  i,posX,posY,etypes,bulletX,bulletY,score:

    integer;

  stars: array[1..10]of star;

  invaders: array[1..5]of invader;

  tick,key: longInt;

  event: eventRecord;

  shippoly,fire: polyHandle;

  gameOver,shoot: boolean;

  str: string;

   

procedure explode;

var

  a,ex,ey : integer;

  r : rect;

  str : string;


begin

  sysBeep;


  for a := 1 to 15 do begin

    setSolidPenPat(a);

    ex := randomInteger mod 20 + (posX - 30);

    ey := randomInteger mod 20 + (posY - 20);

    setRect(r,ex,ey,ex + 20, ey + 20);

    paintOval(r);

    tick := getTick;


    repeat until getTick - tick > 1;

  end;


  moveTo(75,100);

  str := concat('Game Over. Score:',

    cnvis(score));

  drawString(str);

  repeat until button(0);

  gameOver := true;

end;

   

procedure drawShip;

var

  mouse : point;


begin

  setSolidPenPat(0);

  paintPoly(shippoly);

  paintPoly(fire);

   

  getMouse(mouse);

  posX := mouse.h;

  posY := mouse.v;


  if posX < 20 then posX := 20;

  if posY < 20 then posY := 20;

  if posY > 195 then posY := 195;


  shippoly := openPoly;

    moveTo(posX,posY);

    lineTo(posX-20,posY-7);

    line(0,14);

    lineTo(posX,posY);

  closePoly;


  setSolidPenPat(7);

  paintPoly(shippoly);

   

  fire := openPoly;

    moveTo(posX-20,posY-7);

    line(0,14);

    lineTo(posX-25,posY);

    lineTo(posX-20,posY-7);

  closePoly;

  setSolidPenPat(randomInteger mod 2 * 6);

  paintPoly(fire);  

end;           


procedure bangShip;

var

  i: integer;


begin

  for i := 1 to 15 do

    if (invaders[i].x < posX) and

      (invaders[i].x > posX - 35) and

      (invaders[i].y < posY + 7) and

      (invaders[i].y > posY - 12) then explode;

end;   

           

procedure invader.setup;

begin

  x := randomInteger mod 100 + 220;

  y := randomInteger mod 185 + 15;

end;


procedure invader.draw;

var

  r: Rect;

   

begin

  speed := randomInteger mod 3 + 1;


  setSolidPenPat(0);

  setRect(r,x,y,x+15,y+10);

  paintOval(r);

  moveTo(x + 5,y);

  line(10,0);

  moveTo(x + 5,y + 10);

  line(10,0);


  x := x - speed;

  if posY < y + 2 then y := y - 1;

  if posY > y then y := y + 1;

       

  if x < 0 then begin

    x := 320;

    y := randomInteger mod 200;

  end;

   

  setSolidPenPat(11);

  setRect(r,x,y,x+15,y+10);

  paintOval(r);

  setSolidPenPat(6);

  moveTo(x + 5,y);

  line(10,0);

  moveTo(x + 5,y + 10);

  line(10,0);   

end;   


procedure invader.bang;

var

  r: Rect;


begin

  if shoot then begin

    setSolidPenPat(0);

    moveTo(bulletX,bulletY);

    line(-10,0);

    bulletX := bulletX + 3;

    setSolidPenPat(10);

    moveTo(bulletX,bulletY);

    line(-10,0);


    if (bulletY > y - 2) and (bulletY < y + 12)

      and (bulletX > x - 1)

      and (bulletX < x + 16) then begin

      setSolidPenPat(15);

      setRect(r,x-10,y-10,x+20,y+20);

      paintOval(r);

      score := score + (320 - (x - posX)) div 10;           

      tick := getTick;

      repeat until getTick - tick > 5;

           

      setSolidPenPat(0);

      paintOval(r);

                       

      x := 320;

      y := randomInteger mod 200;

      moveTo(bulletX,bulletY);

      line(-5,0);

      shoot := false;

    end;


    if bulletX > 330 then shoot := false; 

  end;

end;       


procedure invader.fire;

begin

  if fshoot then begin

    setSolidPenPat(0);

    moveTo(bx,by);

    line(5,0);

    bx := bx - 5;

    setSolidPenPat(14);

    moveTo(bx,by);

    line(5,0);

    if (bx < posX) and (bx > posX - 25) and

      (by < posY + 5) and (by > posY - 5) then

      explode;


    if bx < -5 then fshoot := false;

  end;

   

  if not fshoot then begin

    if (y + 3 > posY - 5) and (y + 3 < posY + 5)

      then begin

      bx := x;

      by := y + 3;

      fshoot := true;

    end;

  end;

end;       

                                           

procedure star.setup;

begin

  x := randomInteger mod 320;

  y := randomInteger mod 185 + 15;

  speed := randomInteger mod 6 + 1;

end;   


procedure star.draw;

begin

  setSolidPenPat(0);

  moveTo(x,y);

  line(0,0);

   

  x := x - speed;

  if x < 0 then begin

    x := 320;

    speed := randomInteger mod 6 + 1;

  end;


  setSolidPenPat(i);

  moveTo(x,y); 

  line(0,0);

end;

   

begin

  etypes := keyDownMask + mDownMask;

  tick := getTick;

   

  startDesk(320);

  hideCursor;

  clearScreen(0);

  setForeColor(9);

  setBackColor(0);

  setRandSeed(tick);

   

  for i := 1 to 10 do begin

    new(stars[i]);

    stars[i].setup;

  end;

   

  for i := 1 to 5 do begin

    new(invaders[i]);

    invaders[i].setup;

  end;   

   

  repeat

    for i := 1 to 10 do stars[i].draw;         

      for i := 1 to 5 do invaders[i].draw;

      for i := 1 to 5 do invaders[i].bang;

      for i := 1 to 5 do invaders[i].fire;

       

      drawShip;

      bangShip;     

                       

      if getNextEvent(etypes,event) then begin

        case event.eventWhat of

          keyDownEvt: begin

            key := event.eventMessage;       

            if key = 27 then

              gameOver := true;

          end;

   

          mouseDownEvt: begin

            if not shoot then begin

              shoot := true;

              bulletX := posX;

              bulletY := posY;

            end;

          end;                            

        end;   

      end;

   

      moveTo(10,10);

      str := concat('Score: ',cnvis(score));

      drawString(str);   

      repeat until getTick > tick;

      tick := tick + 1;

    until gameOver;


    for i := 1 to 15 do

      dispose(stars[i]);

   

    for i := 1 to 5 do

      dispose(invaders[i]);

  endDesk;

end.

Ding Wen first space game for Apple IIGS.


This program is written using Orca/Pascal, an Object Oriented language for Apple IIGS.




Invader War is currently on development as an iPhone application and will available for download via App Store when it is completed.