PDA

View Full Version : SCAR shooter



Vandalf
06-28-2010, 07:57 PM
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' +
'6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgbx7sAAE=');
green:= BitmapFromString(15, 15, 'beNq1yrkNADAIw' +
'ED2X9qpKJCI+K0rjfgh2VC7M9bWjGc+8zeZifRmcqozNx6sgX 6C');
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
06-28-2010, 08:11 PM
Good job :)

Blumblebee
06-29-2010, 12:31 AM
very cool. Well done :)

Coh3n
06-29-2010, 12:33 AM
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
06-29-2010, 01:13 PM
Of course you can do that with SCAR. Add momentum to the player and you pretty much have asteroids! Nice Job.

nielsie95
06-29-2010, 06:27 PM
Nice! :)

lordsaturn
07-01-2010, 08:52 AM
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' +
'6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA' +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgbx7sAAE=');
green:= BitmapFromString(15, 15, 'beNq1yrkNADAIw' +
'ED2X9qpKJCI+K0rjfgh2VC7M9bWjGc+8zeZifRmcqozNx6sgX 6C');
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
07-01-2010, 09:10 AM
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
07-10-2010, 01:23 PM
Awesome! I could never do this. XD

Aleks
10-24-2010, 05:05 PM
Great little game :). I never seen anything like it on scar. I'm not too sure how to shoot or if you can?:(

nielsie95
10-24-2010, 05:34 PM
You can use "t" :)

heado45
11-13-2011, 12:35 AM
i got this
Exception in Script: Unable to find file 'srl/srl/core/simba.simba' used from ''
doesn't exist

YoHoJo
11-13-2011, 12:36 AM
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.

m3gaman3g3nd
06-27-2015, 02:00 AM
SCAR is great but terrible for games look at this first person perspective its barely a square
you can act like your walking its slow as can be

var
_0,_1,_2,_3,_4,_5:integer;
begin
DisplayDebugImgWindow(200,200)
_0:=bitmapfromstring(200,200,'')
while not(_1=-1)do
begin
_1:=_1+1
if _1=200 then
begin
if IsArrowDown(ar_down)then _2:=_2+4;
if IsArrowDown(ar_up)then _2:=_2-4;
if IsArrowDown(ar_left)then _3:=_3-4;
if IsArrowDown(ar_right)then _3:=_3+4;
while not(_5=2+-_2)do
begin
while not(_4=2+-_2)do
begin
FastSetPixel(_0,_4+_3+98+_2/2,_5+98+_2/2,clwheat)
_4:=_4+1
end;
_5:=_5+1
_4:=0
end;
_5:=0
SafeDrawBitmap(_0,GetDebugCanvas,0,0)
FastDrawClear(_0,0)
_1:=0
end;
end;
end.



VAR BMP,_0,_1,_2:INTEGER;
S:ARRAY OF STRING;
_3:ARRAY OF INTEGER;
BEGIN
ClearDebug
BMP:=BitmapFromString(200,200,'')
DisplayDebugImgWindow(200,200)
REPEAT
_2:=0 REPEAT _1:=0
REPEAT FastSetPixel(BMP,_1+200/2-1-_0/2,_2+200/2-1-_0/2,CLWHEAT)
IF _0=0 THEN BREAK; _1:=_1+1 UNTIL _1=_0
IF _0=0 THEN BREAK;_2:=_2+1 UNTIL _2=_0
SetLength(S,LENGTH(S)+1)
S[_0/2]:=BitmapToString(BMP)
SetLength(_3,LENGTH(_3)+1)
_3[_0/2]:=BitmapfromString(200,200,S[_0/2])
//WRITELN(S[_3])
//FastDrawTransparent(0,0,_3[_0/2],bmp)
//SafeDrawBitmap(bmp,getdebugcanvas,0,0)
FastDrawClear(BMP,0)
WRITELN('NOW LOADING '+INTTOSTR(_0/2)+'%')
_0:=_0+2 UNTIL _0=200
BMP:=BitmapFromString(600,600,'')
_1:=0
_2:=0
REPEAT
_0:=0 REPEAT
_0:=_0+1 UNTIL _0=20000
IF IsArrowDown(AR_UP) THEN _1:=_1+1;
IF IsArrowDown(AR_DOWN) THEN _1:=_1-1;
IF IsArrowDown(AR_LEFT) THEN _2:=_2+2;
IF IsArrowDown(AR_RIGHT) THEN _2:=_2-2;
FastDrawTransparent(200-1+_2,200-1,_3[_1],BMP)
SafeDrawBitmap(BMP,GetDebugCanvas,-200-1,-200-1)
FastDrawClear(BMP,0)
UNTIL FALSE
END.

a bit fun