Invader War
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.