[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{If you have any questions please send me mail at OleRom@hotmail.com}
{player 1 keys:
up, down, right, left (down=fire)
player 2 keys:
A,S,D,W (S=fire)}
{$M 2000,2000,20000}
{$R-,S-,I-,D-,F+,V-,B-,N-,L+}
Program BalMan;
Uses DOS, Graph, Crt;
Label NewGame, Konec;
Const Time = 0; {Delay}
HurtDelay = 100;
HurtTimeOff = 1000;
VAr S : String[10];
Var Old_Keyb:Pointer;
Keyz:Set Of 0..127;
Procedure STI;
Inline($FB);
Procedure CLI;
Inline($FA);
Procedure CallOld(Sub:Pointer);
Begin
Inline($9C/$FF/$5E/$06);
End;
Procedure OutText(X,Y,Color,BkColor:Byte;S:OpenString);{By OleRom}
Var Chr : Char;
fo : Byte;
Begin
For fo := 1 to Ord(S[0]) do
Begin
Chr := S[fo];
asm
mov ah,02h
xor bh,bh
mov dh,[y]
mov dl,[x]
int 10h
mov ah,09h
mov al,[Chr]
mov bh,[BkColor]
mov bl,[Color]
mov cx,01h
int 10h
inc [x]
end;
End;
End; {OutText}
Procedure My_Keyb;
Interrupt;
Var B:Byte;
Begin
CallOld(Old_Keyb);
B:=Port[$60];
If B>=$80 Then
Keyz:=Keyz-[B And $7F]
Else
Keyz:=Keyz+[B];
STI;
End;
Procedure SetGraph;
{$F+} Function DETECTSvga : Integer; assembler; {$F-} asm mov ax,0000h end;
Var GDr : Integer;
Begin
GDr := InstallUserDriver('SVGA256',@DETECTSvga);
GDr := DETECT;
InitGraph(GDr,GDr,'');
End;
Procedure CleanKeyBuffer; assembler;
asm
xor ax,ax; mov es,ax
mov ax,es:[041Ah]; mov es:[041Ch],ax
end;
Var X, Y : Integer;
Smer : Boolean;
xx,yy : Integer;
Ss : Boolean;
H, Hh : Byte;
T, Tt : Word;
Begin
Keyz:=[];
GetIntVec($09,Old_Keyb);
SetIntVec($09,@My_Keyb);
NewGame:
Keyz:=[];
SetGraph;
SetViewPort(0,0,geTmAXx,190,False);
X := 106;
Y := 170;
Xx := 213;
Yy := 170;
Smer := False;
Ss := False;
H := 0;
hh := 0;
Tt := 0;
T := 0;
SetFillStyle(1,Blue);
Bar(0,0,GetMAxX,GetMaxY);
SetFillStyle(1,12);
Bar(10,192,100-T*10+10,198);
SetFillStyle(1,14);
Bar(GetMaxX-10,192,GetMaxX-(100-tT*10+10),198);
Repeat
If 77 In Keyz Then If X < GetMaxX-20 then Inc(X,2);
If 75 In Keyz Then If X > 20 then Dec(X,2);
If 72 In Keyz Then Smer := True;
If 30 In Keyz Then If Xx > 20 then Dec(xX,2);
If 32 In Keyz Then If Xx < GetMaxX-20 then Inc(Xx,2);
If 17 In Keyz Then Ss := True;
If 80 in Keyz Then If H = 0 then H := 1;
If 31 in Keyz Then If Hh = 0 then Hh := 1;
If Hh > 0 then Inc(Hh);
If H > 0 then Inc(H);
If H >= HurtTimeOff then H := 0;
If Hh >= HurtTimeOff then Hh := 0;
If Smer or (Y <> 170)then
If Smer then Dec(Y,2) else Inc(Y,2);
If Ss or (Yy <> 170)then
If Ss then Dec(Yy,2) else Inc(Yy,2);
While Y < 20 do Inc(Y);
While Yy < 20 do Inc(Yy);
Smer := False;
ss := False;
ClearViewPOrt;
If (H = 0) or (H > HurtDelay) then SetColor(4) else SetColor(15);
SetFillStyle(1,12);
FillEllipse(X,Y,20,Round(20/1.20));
If (Hh = 0) or (Hh > HurtDelay) then SetColor(6) else SetColor(15);
SetFillStyle(1,14);
FillEllipse(Xx,Yy,20,Round(20/1.20));
CleanKeyBuffer;
If (Abs(X-Xx) < 30) and (Abs(Y-Yy) < 30) and
(HH <= HurtDelay) and (HH > 0) AND
( (H > HurtDelay) or (H = 0))THEN
Begin
For xX := 1 to 100 do
Begin
SetColor(4);
If ODD(xX) then SetFillStyle(1,12) else SetFillStyle(1,15);
FillEllipse(X,Y,20,Round(20/1.20));
Sound(Random(100));
Delay(10);
End;
X := 106;
Y := 170;
Xx := 213;
Yy := 170;
Smer := False;
Ss := False;
H := 0;
hh := 0;
Inc(T);
SetFillStyle(1,Red);
Bar(10,192,110,198);
SetFillStyle(1,12);
Bar(10,192,100-T*10+10,198);
End;
CleanKeyBuffer;
If (Abs(X-Xx) < 30) and (Abs(Y-Yy) < 30) and
(H <= HurtDelay) and (H > 0) AND
( (hH > HurtDelay) or (hH = 0))THEN
Begin
For X := 1 to 100 do
Begin
SetColor(6);
If ODD(X) then SetFillStyle(1,14) else SetFillStyle(1,15);
FillEllipse(Xx,Yy,20,Round(20/1.20));
Sound(Random(100));
Delay(10);
End;
X := 106;
Y := 170;
Xx := 213;
Yy := 170;
Smer := False;
Ss := False;
H := 0;
hh := 0;
Inc(Tt);
SetFillStyle(1,Brown);
Bar(GetMaxX-10,192,GetMaxX-110,198);
SetFillStyle(1,14);
Bar(GetMaxX-10,192,GetMaxX-(100-tT*10+10),198);
End;
nOsoUND;
Until (Port[$60] = 1) or (T >= 10) or (Tt >= 10);
ClearDevice;
If Port[$60] = 1 then Goto Konec;
If Tt >= 10 then OutText(7,12,LightRed,0,' Red ball is the winner!');
If t >= 10 then OutText(7,12,Yellow,0, 'Yellow ball is the winner!');
Repeat
CleanKeyBuffer;
Until Port[$60] = 28;
Goto NewGame;
Konec:
asm
mov ax,3
int 10h
end;
SetIntVec($09,@Old_Keyb);
WriteLn('Game by Bostjan Gabrovsek.');
End.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]