SRL Archive - Game Development

SCAR shooter


Vandalf

2010-06-28 15:57:27

Yo, dawgs, check dis out.

Obsolete

Updated.

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.
The edit boxes control some stuff, and can only be edited during pause.

noidea

2010-06-28 16:11:08

Good job :)

Blumblebee

2010-06-28 20:31:18

very cool. Well done :)

Coh3n

2010-06-28 20:33:37

That's actually pretty cool. You should continue developing it. :) Maybe add some scores? Have the targets move? Not sure if you can do that with SCAR though.

Dan Cardin

2010-06-29 09:13:49

Of course you can do that with SCAR. Add momentum to the player and you pretty much have asteroids! Nice Job.

nielsie95

2010-06-29 14:27:57

Nice! :)

lordsaturn

2010-07-01 04:52:08

Cool :) adapted for simba
program nnnn;
{$i srl/srl/core/simba.simba}
var
range, savex, savey, projimg, projx, projy, backg, gposx, gposy, i, red: Integer;
green, speed, projspeed, xmax, ymax, bitmap:integer;
angspeed, ang, saveang: extended;
shot: boolean;
DF: TForm;
type
enemy = record
enx, eny: integer;
end;
var
enemies: array of enemy;
v: tvariantarray;

procedure createenemy;
begin
setlength(enemies, length(enemies) + 1);
for i := (length(enemies)-1) to high(enemies) do
begin
enemies[i].enx := Random(xmax-10);
enemies[i].eny := Random(ymax-10);
end;
end;

procedure formo;
begin
DF := CreateForm;
DF.ClientHeight:= ymax;
DF.ClientWidth := xmax;
DF.Caption := 'Form';
DF.Position := poDesktopCenter;
//GetSelf.WindowState := wsMinimized;
DF.Show;
end;

function killenemy(lol: enemy): Boolean;
begin
Result := IntInBox(projx, projy, inttobox(lol.enx, lol.eny, lol.enx + 10, lol.eny + 10)) or
IntInBox(projx + 6, projy, inttobox(lol.enx, lol.eny, lol.enx + 10, lol.eny + 10)) or
IntInBox(projx, projy + 6, inttobox(lol.enx, lol.eny, lol.enx + 10, lol.eny + 10)) or
IntInBox(projx + 6, projy + 6, inttobox(lol.enx, lol.eny, lol.enx + 10, lol.eny + 10))
end;

function stupid(angle:extended; spd:integer; crap:boolean):integer;
begin
if crap then result:=((round(degrees(sin(radians(angle)))))/spd);
if (not(crap)) then result:=((round(degrees(cos(radians(angle)))))/spd);
end;

begin
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;
SetTransparentColor(projimg,0);
SetTransparentColor(green,0);
ThreadSafeCall('formo', v);
repeat
FastDrawTransparent(gposx, gposy, green, backg);
if shot then
begin
projx:=projx-(stupid(saveang,projspeed,true));
projy:=projy-(stupid(saveang,projspeed,false));
if (not(InCircle(projx, projy, savex, savey, range))) then shot:=false;
FastDrawTransparent(projx, projy, projimg, backg);
end;
if(iskeydown(GetKeyCode('k'))) then createenemy;
if shot then
begin
for i := 0 to high(enemies) do
begin
if killenemy(enemies[i]) then
begin
shot:=false;
enemies[i]:= enemies[high(enemies)];
setlength(enemies, length(enemies) -1);
end;
end;
end;
for i := 0 to high(enemies) do fastdrawtransparent(enemies[i].enx, enemies[i].eny, red, backg);

DrawBitmap(backg, df.canvas, 0, 0);
Wait(10);
green:=rotatebitmap(bitmap,(radians(ang)));

case true of //0
(IsKeyDown(VK_DOWN)):begin
gposx:=gposx-(stupid(ang,speed,true));
gposy:=gposy-(stupid(ang,speed,false));
{2} end;
(IsKeyDown(VK_UP) ):begin
gposx:=gposx+(stupid(ang,speed,true));
gposy:=gposy+(stupid(ang,speed,false));
end;
end;
case true of {3}
(IsKeyDown(VK_RIGHT)): ang:= ang+angspeed;
{1}
(IsKeyDown(VK_LEFT)): ang:= ang-angspeed;
end;
case true of
(gposx<0): gposx:=0;
(gposx>(xmax-15)): gposx:=(xmax-15);
end;
case true of
(gposy<0): gposy:=0;
(gposy>(ymax-15)): gposy:=(ymax-15);
end;
if (not(shot)) and iskeydown(GetKeyCode('t')) then
begin
shot:=true;
saveang:=ang;
savex:=gposx+4;
savey:=gposy+4;
projx:=gposx+4;
projy:=gposy+4;
end;
FastDrawClear(backg,0);
until (IsKeyDown(GetKeyCode('p')));
ClearDebug;
end.
incase anyone doesnt want to do it themselves

YoHoJo

2010-07-01 05:10:14

Love it when people make this kind of neat stuff for scar.
And cohen are you kidding me?! Yakman made some DAMN amazing games for scar, as well as a FULLY FUNCTIONING IRC client! He is one damn amazing scripter.

I agree, you should definitely develop this further and make even make some more classic fun games! :D

DeSnob

2010-07-10 09:23:47

Awesome! I could never do this. XD

Aleks

2010-10-24 13:05:58

Great little game :). I never seen anything like it on scar. I'm not too sure how to shoot or if you can?:(

nielsie95

2010-10-24 13:34:04

You can use "t" :)

heado45

2011-11-12 19:35:04

i got this
Exception in Script: Unable to find file 'srl/srl/core/simba.simba' used from ''
doesn't exist

YoHoJo

2011-11-12 19:36:46

From: heado45
i got this
Exception in Script: Unable to find file 'srl/srl/core/simba.simba' used from ''
doesn't exist


The first post on this thread says "Obsolete" so whatever it is, it doesn't work anymore.