Code:
program nnnn;
var
range, projimg, backg, gposx, gposy, i, n, red, time, maxbullets, control: Integer;
green, speed, projspeed, xmax, ymax, bitmap, maxenemies, shotdelay:integer;
angspeed, ang: extended;
shot, pause: boolean;
zzz: TForm;
n1, n2, n3, n4: TEdit;
type
enemy = record
enx, eny, enspeed, endir: integer;
end;
projectile = record
projx, projy, savex, savey: integer;
saveang: extended;
end;
var
bullets: array of projectile;
enemies: array of enemy;
v: tvariantarray;
procedure createenemy(dir: integer);
begin
if (length(enemies)<maxenemies) then begin
setlength(enemies, length(enemies) + 1);
for i := (length(enemies)-1) to high(enemies) do
begin
enemies[i].enspeed := (1+Random(5));
enemies[i].endir := dir;
case enemies[i].endir of
0:begin
enemies[i].enx := Random(xmax-10)+5;
enemies[i].eny := (-6);
end;
1:begin
enemies[i].enx := (-6);
enemies[i].eny := Random(ymax-10)+5;
end;
2:begin
enemies[i].enx := Random(xmax-10)+5;
enemies[i].eny := (ymax+6);
end;
3:begin
enemies[i].enx := (xmax+6);
enemies[i].eny := Random(ymax-10)+5;
end;
end;
end;
end;
end;
function stupid(angle:extended; spd:integer; crap:boolean):integer;
begin
if crap then result:=((round(degrees(sin(radians(angle)))))/spd) else result:=((round(degrees(cos(radians(angle)))))/spd);
end;
procedure moveenemies;
begin
for i:=0 to high(enemies) do
begin
case enemies[i].endir of
0:enemies[i].eny:=enemies[i].eny + enemies[i].enspeed;
1:enemies[i].enx:=enemies[i].enx + enemies[i].enspeed;
2:enemies[i].eny:=enemies[i].eny - enemies[i].enspeed;
3:enemies[i].enx:=enemies[i].enx - enemies[i].enspeed;
end;
end;
end;
procedure cut;
begin
enemies[i]:= enemies[high(enemies)]
setlength(enemies, length(enemies) -1);
end;
procedure freenemies;
begin
for i:=0 to high(enemies) do
begin
case enemies[i].endir of
0:if (enemies[i].eny>ymax+6) then cut;
1:if (enemies[i].enx>xmax+6) then cut;
2:if (enemies[i].eny<-6) then cut;
3:if (enemies[i].enx<-6) then cut;
end;
end;
end;
procedure shoot;
begin
if (shotdelay=0) and (length(bullets)<maxbullets) then begin
setlength(bullets, length(bullets) + 1);
shotdelay:= control;
for i := (length(bullets)-1) to high(bullets) do
begin
bullets[i].savex:=gposx;
bullets[i].savey:=gposy;
bullets[i].projx:=gposx;
bullets[i].projy:=gposy;
bullets[i].saveang:=ang;
end;
end;
end;
procedure blah;
begin
for i := 0 to high(bullets) do
begin
FastDrawTransparent(bullets[i].projx-3, bullets[i].projy-3, projimg, backg);
if (not(InCircle(bullets[i].projx, bullets[i].projy, bullets[i].savex, bullets[i].savey, range))) then begin
bullets[i]:= bullets[high(bullets)];
setlength(bullets, length(bullets)-1);
end else begin
bullets[i].projx:=bullets[i].projx-(stupid(bullets[i].saveang,projspeed,true));
bullets[i].projy:=bullets[i].projy-(stupid(bullets[i].saveang,projspeed,false));
end;
end;
end;
procedure formo;
begin
zzz := CreateForm;
zzz.ClientHeight:= ymax;
zzz.ClientWidth := xmax+120;
zzz.Caption := 'Form';
zzz.Position := poDesktopCenter;
GetSelf.WindowState := wsMinimized;
zzz.Show;
n1 := TEdit.create(zzz);
n2 := TEdit.create(zzz);
n3 := TEdit.create(zzz);
n4 := TEdit.create(zzz);
n1.height:= 15;
n1.width:= 100;
n1.Top:= 20;
n1.Left:= 5;
n1.parent:= zzz;
n2.height:= 15;
n2.width:= 100;
n2.Top:= 60;
n2.Left:= 5;
n2.parent:= zzz;
n3.height:= 15;
n3.width:= 100;
n3.Top:= 100;
n3.Left:= 5;
n3.parent:= zzz;
n4.height:= 15;
n4.width:= 100;
n4.Top:= 140;
n4.Left:= 5;
n4.parent:= zzz;
n1.text:= inttostr(time);
n2.text:= inttostr(maxenemies);
n3.text:= inttostr(maxbullets);
n4.text:= inttostr(control);
end;
function collisiondetect(actx, acty, objx, objy, correction: integer): Boolean;
begin
Result := IntInBox(actx, acty, inttobox(objx-correction, objy-correction, objx+correction, objy+correction))
end;
begin
maxenemies:= 100;
time:= 10;
control:= 40;
ang:=90;
angspeed:=4;
xmax:=500;
ymax:=500;
setlength(enemies, 0);
backg := BitmapFromString(xmax, ymax, 'beNrtwTEBAAAAwqD1T20MH' +
'6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgbx7sAAE=');
green:= BitmapFromString(15, 15, 'beNq1yrkNADAIw' +
'ED2X9qpKJCI+K0rjfgh2VC7M9bWjGc+8zeZifRmcqozNx6sgX6C');
red:= BitmapFromString(11, 11, 'beNpjYPjPMIroggA92XiI');
bitmap:=green;
projimg:= BitmapFromString(6, 6, 'beNpjYACC/0iIAYnBgCrOgCqIKfIfQwGKyQAqehPt');
gposx:=145;
gposy:=145;
range:=200;
speed:=13;
projspeed:= 7;
maxbullets:= 3;
SetTransparentColor(projimg,0);
SetTransparentColor(green,0);
ThreadSafeCall('formo', v);
SafeDrawBitmap(backg, zzz.canvas,120,0);
repeat
if iskeydown('l') and not pause then pause:= true;
if not pause then begin
n1.ReadOnly:= true;
n2.ReadOnly:= true;
n3.ReadOnly:= true;
n4.ReadOnly:= true;
shotdelay:= shotdelay - 2;
if (shotdelay<0) then shotdelay:=0;
FastDrawTransparent(gposx-7, gposy-7, green, backg);
if (length(bullets)>0) then shot:= true else shot:=false;
if shot then blah;
case true of
(iskeydown('w')): createenemy(2);
(iskeydown('a')): createenemy(3);
(iskeydown('d')): createenemy(1);
(iskeydown('x')): createenemy(0);
(iskeydown('s')): createenemy(random(4));
end;
moveenemies;
freenemies;
if shot then begin
for i := 0 to high(enemies) do
begin
for n:= 0 to high(bullets) do
begin
if collisiondetect(bullets[n].projx,bullets[n].projy,enemies[i].enx, enemies[i].eny, 6) then
begin
cut;
bullets[n]:= bullets[high(bullets)];
setlength(bullets, length(bullets)-1);
end;
end;
end;
end;
for i := 0 to high(enemies) do fastdrawtransparent(enemies[i].enx-5, enemies[i].eny-5, red, backg);
SafeDrawBitmap(backg, zzz.canvas,120,0);
Wait(time);
green:=rotatebitmap(bitmap,(radians(ang)));
case true of
(IsArrowDown(0)):begin
gposx:=gposx-(stupid(ang,speed,true));
gposy:=gposy-(stupid(ang,speed,false));
end;
(IsArrowDown(2)):begin
gposx:=gposx+(stupid(ang,speed,true));
gposy:=gposy+(stupid(ang,speed,false));
end;
end;
case true of
(IsArrowDown(3)): ang:= ang+angspeed;
(IsArrowDown(1)): ang:= ang-angspeed;
end;
case true of
(gposx<7): gposx:=7;
(gposx>(xmax-7)): gposx:=(xmax-7);
end;
case true of
(gposy<7): gposy:=7;
(gposy>(ymax-7)): gposy:=(ymax-7);
end;
if iskeydown('t') then shoot;
FastDrawClear(backg,0);
end else begin
n1.ReadOnly:= false;
n2.ReadOnly:= false;
n3.ReadOnly:= false;
n4.ReadOnly:= false;
n1.text:=TrimLetters(n1.Text);
n2.text:=TrimLetters(n2.Text);
n3.text:=TrimLetters(n3.Text);
n4.text:=TrimLetters(n4.Text);
wait(10);
control:=strtoint(n4.text);
maxbullets:=strtoint(n3.text);
maxenemies:=strtoint(n2.text);
time:=strtoint(n1.text);
end;
if iskeydown('k') and pause then pause:=false;
until (IsKeyDown('p'));
setlength(bullets, 0);
setlength(enemies, 0);
FreeBitmap(backg);
FreeBitmap(red);
FreeBitmap(green);
FreeBitmap(projimg);
FreeBitmap(bitmap);
freeform(zzz);
GetSelf.WindowState := wsMaximized;
ClearDebug;
writeln('"Oooow!"');
writeln(' - Michael Jackson');
writeln('');
terminatescript;
end.
Controls are WASDX, arrows, T, L to pause and K to unpause.