home *** CD-ROM | disk | FTP | other *** search
- { TROFF II --- UFP Software --- 1990 }
-
- uses
- Graph,
- Crt;
-
- label 1, 2, 3, 4;
-
- const
- TLCor = 1; Hor = 5;
- TRCor = 2; Ver = 6;
- BLCor = 3;
- BRCor = 4;
- ML = 1; IBML = 2; W = 3; MW = 4; Bl = 5;
- SB = 1; LB = 2; PS = 3; Sp = 0;
- You = 1; IBM = 2; incr = 1; decr =2;
-
- type
- PlayField = array[0..78,0..48] of byte;
-
- var
- { Images }
- LineIm : array[1..4,1..6] of pointer;
- BallIm : array[1..2,1..4] of pointer;
- Sib, Null : pointer;
- Note : pointer;
- Numbers : array[0..9] of pointer;
-
- PF : PlayField; { Playfield }
- Gd, Gm : integer; { EGAsetup }
- OldPal : PaletteType;
- Scr,Bonus : array[1..2] of longint;
- Lng,Lplus : array[1..2] of integer;
- Trn : array[1..2] of byte;
- Pntr : array[1..2] of integer;
- Snk : array[1..2,1..200] of record x:byte; y:byte ;end;
- MaxTrn, Code, OldCode, OldestCode, SaveCode : byte;
- Xdir,Ydir : array[1..2] of integer;
- Ch : char;
- ObN : byte;
- ShowTurnsFlag : boolean;
- ShowScoreFlag, ShowLenFlag : array[1..2] of boolean;
- Gold : array[1..3] of
- record
- Class : byte;
- gx : byte;
- gy : byte;
- Size : byte;
- Dir : byte;
- end; { Gold }
- MoveWallFlag : boolean;
- Mow : array[1..35] of record
- mwx : byte;
- mwy : byte;
- end; { Mow }
- MWInfo : record mwxdir : integer;
- mwydir : integer;
- mwleng : byte;
- mwpntr : byte;
- end; { MWData }
- Tune,Counter : byte;
- MaxCounter : byte;
- ToggleSound : boolean;
- Message : array[1..20] of string;
- MessageFlag : integer;
- Speed : byte;
- EndFlag : array[1..2] of boolean;
- EnemyToggle : boolean;
- MWallToggle : integer;
- LenToWin : byte;
- g : integer;
- GameNo : byte;
- Hisco,Losco : longint;
- HiPla,Lopla : byte;
- FirstGameFlag: boolean;
- QuitFlag : boolean;
- ExitFlag : boolean;
-
- procedure GetImages;
- var i, j, x, c1, c2 :integer;
- size : word;
- begin
- for i:=0 to 15 do SetPalette(i,0);
- { Numbers }
- SetColor(Red);
- Line(3,1,6,1);Line(3,18,6,18);Line(2,2,2,3);Line(7,2,7,3);
- Line(1,4,1,15);Line(8,4,8,15);Line(2,16,2,17);Line(7,16,7,17);
- Line(4,5,5,5);Line(4,14,5,14); {0}
- MoveTo(16,1);LineTo(16,15);LineTo(18,15);LineTo(18,18);
- LineTo(11,18);LineTo(11,15);LineTo(13,15);LineTo(13,5);LineTo(11,7);
- LineTo(11,3);LineTo(12,2);LineTo(13,2);LineTo(13,1);LineTo(16,1); {1}
- MoveTo(21,3);LineTo(23,1);LineTo(26,1);LineTo(28,3);LineTo(28,10);
- LineTo(24,14);LineTo(24,15);LineTo(28,15);LineTo(28,18);LineTo(21,18);
- LineTo(21,14);LineTo(25,10);LineTo(25,4);LineTo(23,4);LineTo(21,6);
- LineTo(21,3); {2}
- MoveTo(31,6);LineTo(31,3);LineTo(33,1);LineTo(36,1);LineTo(38,3);
- LineTo(38,8);Line(37,9,37,10);MoveTo(38,11);LineTo(38,16);LineTo(36,18);
- LineTo(33,18);LineTo(31,16);LineTo(31,13);LineTo(33,15);LineTo(34,15);LineTo(35,14);
- LineTo(35,11);LineTo(33,10);LineTo(33,9);LineTo(35,8);LineTo(35,5);
- LineTo(34,4);LineTo(33,4);LineTo(31,6); {3}
- MoveTo(48,1);LineTo(48,18);LineTo(45,18);LineTo(45,11);LineTo(41,11);
- LineTo(41,5);LineTo(45,1);LineTo(48,1);MoveTo(45,5);LineTo(45,8);
- LineTo(43,8);LineTo(43,6);LineTo(45,5); {4}
- MoveTo(58,1);LineTo(51,1);LineTo(51,10);LineTo(55,10);LineTo(55,15);
- LineTo(54,15);LineTo(51,12);LineTo(51,15);LineTo(54,18);LineTo(55,18);
- LineTo(58,15);LineTo(58,9);LineTo(56,7);LineTo(54,7);LineTo(54,4);
- LineTo(58,4);LineTo(58,1); {5}
- MoveTo(68,1);LineTo(63,1);LineTo(61,3);LineTo(61,17);LineTo(62,18);
- LineTo(66,18);LineTo(68,16);LineTo(68,9);LineTo(66,7);LineTo(64,7);
- LineTo(64,4);LineTo(68,4);LineTo(68,1);Rectangle(63,10,66,15); {6}
- MoveTo(71,1);LineTo(78,1);LineTo(78,7);LineTo(76,9);LineTo(76,18);
- LineTo(73,18);LineTo(73,9);LineTo(75,7);LineTo(75,4);LineTo(73,4);
- LineTo(73,6);LineTo(71,6);LineTo(71,1); {7}
- MoveTo(83,1);LineTo(86,1);LineTo(88,3);LineTo(88,7);LineTo(86,9);
- LineTo(88,11);LineTo(88,16);LineTo(86,18);LineTo(83,18);LineTo(81,16);
- LineTo(81,11);LineTo(83,9);LineTo(81,7);LineTo(81,3);LineTo(83,1);
- MoveTo(83,5);LineTo(84,4);LineTo(85,4);LineTo(86,5);LineTo(85,6);
- LineTo(84,6);MoveTo(84,12);LineTo(85,12);LineTo(86,13);LineTo(86,14);
- LineTo(85,15);LineTo(84,15);LineTo(83,14);LineTo(83,13); {8}
- MoveTo(93,1);LineTo(97,1);LineTo(98,2);LineTo(98,16);LineTo(96,18);
- LineTo(91,18);LineTo(91,15);LineTo(95,15);LineTo(95,12);LineTo(93,12);
- LineTo(91,10);LineTo(91,3);LineTo(93,1);Rectangle(93,4,96,9); {9}
- SetColor(Yellow);
- Line(2,4,2,15);Line(3,2,3,17);Line(6,2,6,17);Line(7,4,7,15);
- SetFillStyle(SolidFill,Yellow);Bar(4,2,5,4);Bar(4,15,5,17);
- SetFillStyle(SolidFill,Yellow);FloodFill(14,2,Red);FloodFill(22,3,Red);
- FloodFill(32,3,Red);FloodFill(45,2,Red);FloodFill(57,2,Red);
- FloodFill(67,2,Red);Line(63,10,63,15);Line(66,10,66,15);
- FloodFill(72,2,Red);FloodFill(83,2,Red);
- FloodFill(97,2,Red);Line(93,4,93,9);Line(96,4,96,9);
- { Snakes & Walls }
- for i:=1 to 4 do
- begin
- x:=i*30-30;
- case i of
- 1 : begin c1:=LightGreen;c2:=Green;end; 2 : begin c1:=LightMagenta;c2:=Magenta;end;
- 3 : begin c1:=LightBlue;c2:=Blue;end; 4 : begin c1:=LightGray;c2:=DarkGray;end;
- end; {case i}
- SetColor(c2);
- MoveTo(x+2,30); LineTo(x+18,30); LineTo(x+20,32); LineTo(x+20,48);
- LineTo(x+18,50); LineTo(x+2,50); LineTo(x,48); LineTo(x,32);
- LineTo(x+2,30); Rectangle(x+6,36,x+14,44);
- for j:=0 to 8 do
- begin
- Line(x+3+j*2,31,x+3+j*2,30); Line(x+3+j*2,49,x+3+j*2,50);
- Line(x+1,33+j*2,x,33+j*2); Line(x+19,33+j*2,x+20,33+j*2);
- end;
- for j:=0 to 5 do
- begin
- Line(x+5+j*2,35,x+5+j*2,35); Line(x+5+j*2,45,x+5+j*2,45);
- Line(x+5,35+j*2,x+5,35+j*2); Line(x+15,35+j*2,x+15,35+j*2);
- end;
- Line(x+1,33,x+3,31); Line(x+17,31,x+19,33);
- Line(x+1,47,x+3,49); Line(x+17,49,x+19,47);
- SetFillStyle(SolidFill,c1);FloodFill(x+4,31,c2);
- SetColor(c1);
- Line(x+1,32,x+2,31);Line(x+18,31,x+19,32);
- Line(x+1,48,x+2,49);Line(x+18,49,x+19,48);
- end;
- { Golds }
- for i:=0 to 1 do
- begin
- case i of
- 0 : begin c1:=LightCyan;c2:=Cyan;end;
- 1 : begin c1:=White;c2:=LightGray;end;
- end; {case i} SetFillStyle(SolidFill,c1);
- SetColor(c2);Line(3,92+i*10,3,94+i*10);Line(2,93+i*10,4,93+i*10);PutPixel(3,93+10*i,c1);
- SetColor(c1);Bar(12,92+10*i,14,94+10*i);SetColor(c2);
- MoveTo(13,91+i*10);LineTo(15,93+i*10);LineTo(13,95+i*10);LineTo(11,93+i*10);LineTo(13,91+i*10);
- MoveTo(23,90+i*10);LineTo(26,93+i*10);LineTo(23,96+i*10);LineTo(20,93+i*10);LineTo(23,90+i*10);
- FloodFill(23,91+i*10,c2);
- Line(30,92+i*10,32,90+i*10);Line(34,90+i*10,36,92+i*10);Line(30,94+i*10,32,96+i*10);Line(34,96+i*10,36,94+i*10);
- SetColor(c1);MoveTo(30,93+i*10);LineTo(33,90+i*10);LineTo(36,93+i*10);
- LineTo(33,96+i*10);LineTo(30,93+i*10);FloodFill(33,93+i*10,c1);
- end;
- SetColor(Yellow);MoveTo(0,111);LineTo(1,110);LineTo(5,110);LineTo(6,111);LineTo(6,115);
- LineTo(5,116);LineTo(1,116);LineTo(0,115);LineTo(0,111);Line(2,110,2,116);
- PutPixel(1,113,Yellow);PutPixel(4,112,Yellow);
- { Get Images }
- for i:=0 to 9 do
- begin
- Size:=ImageSize(10*i,0,10*i+9,19);GetMem(Numbers[i],Size);
- GetImage(10*i,0,10*i+9,19,Numbers[i]^); end;
- Size:=ImageSize(0,30,6,36);
- for i:=1 to 4 do
- begin
- x:=30*i-30;
- for j:=1 to 6 do GetMem(LineIm[i,j],Size);
- GetImage(x,30,x+6,36,LineIm[i,TLCor]^);
- GetImage(x+14,30,x+20,36,LineIm[i,TRCor]^);
- GetImage(x,44,x+6,50,LineIm[i,BLCor]^);
- GetImage(x+14,44,x+20,50,LineIm[i,BRCor]^);
- GetImage(x+7,30,x+13,36,LineIm[i,Hor]^);
- GetImage(x,37,x+6,43,LineIm[i,Ver]^);
- end;
- for i:=1 to 2 do
- begin
- for j:=1 to 4 do
- begin
- GetMem(BallIm[i,j],Size);
- x:=10*j-10;
- GetImage(x,80+i*10,x+6,86+i*10,BallIm[i,j]^);
- end;
- end;
- GetMem(Null,Size);GetMem(Sib,Size);
- GetImage(0,70,6,76,Null^);GetImage(0,110,6,116,Sib^);
- SetColor(LightGray);
- Line(631,9,631,11);
- for i:=632 to 634 do Line(i,8,i,12);
- for i:=635 to 636 do Line(i,0,i,11);
- MoveTo(637,0);LineTo(639,0);LineTo(639,1);
- MoveTo(637,3);LineTo(639,3);LineTo(639,4);
- GetMem(Note,ImageSize(631,0,639,12));
- GetImage(631,0,639,12,Note^);
- end;
-
- procedure DrawScoreWindow;
- begin
- SetColor(Magenta);
- MoveTo(565,0);LineTo(629,0);LineTo(634,10);LineTo(634,329);LineTo(629,339);
- LineTo(565,339);LineTo(560,329);LineTo(560,10);LineTo(565,0);
- SetFillStyle(InterleaveFill,Magenta);FloodFill(566,1,Magenta);
- SetColor(Red);
- MoveTo(634,329);LineTo(629,339);LineTo(634,349);LineTo(639,339);LineTo(634,329);
- SetFillStyle(SolidFill,Brown);FloodFill(634,339,Red);
- SetColor(Brown);
- MoveTo(629,0);LineTo(639,20);LineTo(639,339);LineTo(634,329);LineTo(634,10);
- MoveTo(560,329);LineTo(570,349);LineTo(634,349);LineTo(629,339);LineTo(565,339);
- SetFillStyle(InterleaveFill,Brown);FloodFill(635,20,Brown);FloodFill(570,340,Brown);
- SetColor(Black);SetFillStyle(InterleaveFill,DarkGray);Bar(565,270,626,291);Bar(565,300,626,321);
- Bar(565,58,590,263);Bar(601,58,626,263);Bar(565,19,590,50);Bar(601,19,626,50);
- SetColor(Brown);
- MoveTo(565,50);LineTo(565,19);LineTo(590,19);
- MoveTo(601,50);LineTo(601,19);LineTo(626,19);
- Line(565,20,590,20);Line(601,20,626,20);
- MoveTo(565,263);LineTo(565,58);LineTo(590,58);Line(565,59,590,59);
- MoveTo(601,263);LineTo(601,58);LineTo(626,58);Line(601,59,626,59);
- MoveTo(565,291);LineTo(565,270);LineTo(626,270);Line(565,271,626,271);
- MoveTo(565,321);LineTo(565,300);LineTo(626,300);Line(565,301,626,301);
- SetFillStyle(SolidFill,Black);SetColor(Magenta);
- FillEllipse(577,10,5,5);FillEllipse(613,10,5,5);FillEllipse(596,330,5,5);
- end;
-
- procedure DrawPlayField;
- var i,j,Room,Barrier : integer;
- procedure DW(ax,by,img : byte);
- begin
- PutImage(7*ax,7*by,LineIm[W,img]^,NormalPut);
- PF[ax,by]:=W;
- end;
- begin
- if trn[1]+1=MaxTrn then begin
- SetFillStyle(SolidFill,LightGreen);FloodFill(577,10,Magenta);end;
- if trn[2]+1=MaxTrn then begin
- SetFillStyle(SolidFill,LightRed);FloodFill(613,10,Magenta);end;
- for i:=0 to 78 do for j:=0 to 48 do PF[i,j]:=Sp;
- for i:=0 to 78 do begin pf[i,0]:=W;pf[i,48]:=W;PutImage(7*i,0,LineIm[W,Hor]^,NormalPut);
- PutImage(7*i,336,LineIm[W,Hor]^,NormalPut);end;
- for j:=1 to 47 do begin pf[0,j]:=W;pf[78,j]:=w;PutImage(0,7*j,LineIm[W,Ver]^,NormalPut);
- PutImage(546,7*j,LineIm[W,Ver]^,NormalPut);end;
- PutImage(0,0,LineIm[W,TLCor]^,NormalPut);PutImage(546,0,LineIm[W,TRCor]^,NormalPut);
- PutImage(0,336,LineIm[W,BLCor]^,NormalPut);PutImage(546,336,LineIm[W,BRCor]^,NormalPut);
- Barrier:=Random(5)+1;
- repeat
- Room:=Random(11)+1;Barrier:=Barrier-1;
- case Room of
- 1: begin
- DW(1,1,BRCor); DW(77,1,BLCor); DW(1,47,TRCor); DW(77,47,TLCor);
- end;
- 2: begin
- for i:=35 to 43 do begin DW(i,1,Hor); DW(i,47,Hor); end;
- end;
- 3: begin
- for i:=21 to 27 do begin DW(1,i,Ver); DW(77,i,Ver); end;
- end;
- 4: begin
- for i:=11 to 14 do begin DW(i,5,Hor); DW(i,43,Hor); end;
- for i:=64 to 67 do begin DW(i,5,Hor); DW(i,43,Hor); end;
- for i:=6 to 9 do begin DW(10,i,Ver); DW(68,i,Ver); end;
- for i:=39 to 42 do begin DW(10,i,Ver); DW(68,i,Ver); end;
- DW(10,5,TLCor); DW(68,5,TRCor);
- DW(10,43,BLCor); DW(68,43,BRCor);
- end;
- 5: begin
- for i:=15 to 19 do begin DW(i,5,Hor); DW(i,43,Hor); end;
- for i:=59 to 63 do begin DW(i,5,Hor); DW(i,43,Hor); end;
- for i:=10 to 14 do begin DW(10,i,Ver); DW(68,i,Ver); end;
- for i:=34 to 38 do begin DW(10,i,Ver); DW(68,i,Ver); end;
- end;
- 6: begin
- for i:=21 to 27 do DW(39,i,Ver);
- end;
- 7: begin
- for i:=16 to 20 do DW(39,i,Ver);
- for i:=28 to 32 do DW(39,i,Ver);
- end;
- 8: begin
- for i:=35 to 43 do DW(i,24,Hor);
- end;
- 9: begin
- for i:=30 to 34 do DW(i,24,Hor);
- for i:=44 to 48 do DW(i,24,Hor);
- end;
- 10: begin
- for i:=35 to 43 do begin DW(i,7,Hor); DW(i,41,Hor); end;
- end;
- 11: begin
- for i:=30 to 34 do begin DW(i,7,Hor); DW(i,41,Hor); end;
- for i:=44 to 48 do begin DW(i,7,Hor); DW(i,41,Hor); end;
- end;
- end; { case Room }
- until Barrier=0;
- end;
-
- procedure ClearVariables;
- var i,j : integer;
- begin
- for i:=1 to 2 do
- begin lng[i]:=0; lplus[i]:=20; pntr[i]:=1; EndFlag[i]:=False;
- ydir[i]:=0; xdir[i]:=3-i*2; showturnsflag:=true;
- showscoreflag[i]:=true; showlenflag[i]:=true;
- for j:=1 to 200 do begin snk[i,j].x:=0;snk[i,j].y:=0; end;
- end;
- snk[1,1].y:=24;snk[2,1].y:=24;snk[1,1].x:=8;snk[2,1].x:=70;
- OldCode:=77;OldestCode:=77;Code:=77;
- for i:=1 to 3 do
- with Gold[i] do
- begin class:=0;gx:=0;gy:=0;size:=0;dir:=0; end;
- MoveWallFlag:=False;
- MWInfo.mwxdir:=0; MWInfo.mwydir:=0;
- MWInfo.mwleng:=0; MWInfo.mwpntr:=1;
- for i:=1 to 35 do begin Mow[i].mwx:=0; Mow[i].mwy:=0; end;
- ExitFlag:=False;
- end;
-
- procedure ShowScore;
- var k : longint;
- b : word;
- i : integer;
- procedure WRN(x,y,n : integer);
- begin PutImage(x,y,Numbers[n]^,NormalPut); end;
- begin
- if scr[1]>scr[2] then setfillstyle(1,10) else
- if scr[2]>scr[1] then setfillstyle(1,12) else
- setfillstyle(1,0);
- FloodFill(596,330,Magenta);
- for i:=1 to 2 do
- begin
- if ShowScoreFlag[i]=True then
- begin
- b:=242+30*i; k:=scr[i];
- if k>999999 then begin k:=k-999999;SetPalette(Yellow,Random(63)+1);end;
- WRN(566,b,k div 100000);k:=k mod 100000;
- WRN(576,b,k div 10000) ;k:=k mod 10000;
- WRN(586,b,k div 1000) ;k:=k mod 1000;
- WRN(596,b,k div 100) ;k:=k mod 100;
- WRN(606,b,k div 10) ;k:=k mod 10;
- WRN(616,b,k);
- ShowScoreFlag[i]:=False;
- end;
- if ShowTurnsFlag=True then
- begin
- b:=569+36*(i-1); k:=trn[i];
- WRN(b-1,26,k div 10);k:=k mod 10;WRN(b+10,26,k);
- if i=2 then ShowTurnsFlag:=False;
- end;
- if ShowLenFlag[i]=True then
- begin
- b:=570+36*(i-1);k:=lng[i];
- if LenToWin=150 then k:=Round(k*1.34);
- if LenToWin=100 then k:=k*2;
- SetFillStyle(InterLeaveFill,DarkGray);Bar(565+(i-1)*36,58,590+(i-1)*36,263);
- SetFillStyle(SolidFill,8+i*2);SetColor(i*2);Bar3D(b,262-k,b+14,262,2,True);
- Line(b+15,262-k,b+15,262);
- ShowLenFlag[i]:=False;
- if (lng[i]<2) and (lplus[i]=0) then EndFlag[i]:=True;
- if lng[i]>LenToWin-1 then EndFlag[3-i]:=True;
- end else delay(8);
- end;
- end;
-
- procedure PauseGame;
- var c : char;
- begin
- nosound;
- SetTextStyle(SmallFont,HorizDir,4);SetColor(White);
- OutTextXY(10,341,'Game Paused --- Press F4 to continue');
- repeat
- if keypressed then c:=readkey;
- if c=#0 then c:=readkey;
- until ord(c)=62;
- SetFillStyle(1,0);SetColor(0);Bar(10,342,225,349);
- end;
-
- procedure Change(ObjNum : byte);
- begin
- with Gold[ObjNum] do
- begin
- if Size=0 then
- begin
- if random(25)=0 then begin Class:=PS; Tune:=10; end else
- if random(2)=0 then Class:=SB else Class:=LB;
- Dir:=incr; Size:=1;
- repeat
- gx:=random(79);gy:=random(49);
- until (PF[gx,gy]=Sp);
- PF[gx,gy]:=Bl;
- if Class<>PS then PutImage(gx*7,gy*7,BallIm[Class,Size]^,NormalPut)
- else PutImage(gx*7,gy*7,Sib^,NormalPut);
- end
- else
- begin
- if (Size=4) and (Dir=incr) then Dir:=decr;
- if (Size=1) and (Dir=decr) then
- begin Size:=0;if Class=PS then Tune:=11;
- Class:=0;Dir:=0;if PF[gx,gy]=Bl then begin
- PutImage(gx*7,gy*7,Null^,NormalPut);PF[gx,gy]:=Sp;end; end
- else
- begin
- if Dir=incr then Size:=Size+1;
- if Dir=decr then Size:=Size-1;
- if (Class=SB) or (Class=LB) then
- PutImage(gx*7,gy*7,BallIm[Class,Size]^,NormalPut);
- end; {else 2}
- end; {else 1}
- end; {with}
- end; {proc}
-
- procedure MoveSib(ObjNum : byte);
- var zx,zy : byte;
- begin
- zx:=Gold[ObjNum].gx+(Random(3)-1);
- zy:=Gold[ObjNum].gy+(Random(3)-1);
- if PF[zx,zy]=Sp then
- begin
- PF[Gold[ObjNum].gx,Gold[ObjNum].gy]:=Sp;
- PutImage(Gold[ObjNum].gx*7,Gold[ObjNum].gy*7,Null^,NormalPut);
- Gold[ObjNum].gx:=zx;
- Gold[ObjNum].gy:=zy;
- PutImage(zx*7,zy*7,Sib^,NormalPut);
- PF[zx,zy]:=Bl;
- end;
- end;
-
- procedure MoveYou;
- var nx,ny,ox,oy,tx,ty,c : byte;
- tail : integer;
-
- procedure GetBall(aa,bb: byte);
- var bonusl,bonuss : byte;
- i, ObN: integer;
- begin
- BonusS:=0; BonusL:=0;
- for i:=1 to 3 do
- with Gold[i] do begin
- if (aa=gx) and (bb=gy) and (size>0) then ObN:=i;
- end;
- with Gold[ObN] do
- begin
- if Class=SB then begin BonusS:=Size*20;
- BonusL:=0; Tune:=1; end;
- if Class=LB then begin BonusL:=Size*2;
- BonusS:=0; Tune:=2; end;
- if Class=PS then begin BonusS:=100;
- BonusL:=10; Tune:=3; end;
- Lplus[You]:=Lplus[You]+BonusL;
- if BonusS>0 then begin scr[You]:=scr[You]+BonusS;
- ShowScoreFlag[You]:=True; end;
- Gx:=0; Gy:=0; Size:=0; Class:=0;
- end;
- end;
-
- begin
- OX:=snk[You,Pntr[You]].x; OY:=snk[You,Pntr[You]].y;
- NX:=OX+XDir[1] ; NY:=OY+YDir[1] ;
- Tail:=Pntr[You]-lng[You]; if Tail<1 then Tail:=Tail+200;
- TX:=snk[You,Tail].x ; TY:=snk[You,Tail].y ;
- case OldestCode of
- 72 : if Code=72 then PutImage(OX*7,OY*7,LineIm[ML,Ver]^,NormalPut) else
- if Code=77 then PutImage(OX*7,OY*7,LineIm[ML,TLCor]^,NormalPut) else
- if Code=75 then PutImage(OX*7,OY*7,LineIm[ML,TRCor]^,NormalPut);
- 80 : if Code=80 then PutImage(OX*7,OY*7,LineIm[ML,Ver]^,NormalPut) else
- if Code=77 then PutImage(OX*7,OY*7,LineIm[ML,BLCor]^,NormalPut) else
- if Code=75 then PutImage(OX*7,OY*7,LineIm[ML,BRCor]^,NormalPut);
- 77 : if Code=72 then PutImage(OX*7,OY*7,LineIm[ML,BRCor]^,NormalPut) else
- if Code=80 then PutImage(OX*7,OY*7,LineIm[ML,TRCor]^,NormalPut) else
- if Code=77 then PutImage(OX*7,OY*7,LineIm[ML,Hor]^,NormalPut);
- 75 : if Code=72 then PutImage(OX*7,OY*7,LineIm[ML,BLCor]^,NormalPut) else
- if Code=80 then PutImage(OX*7,OY*7,LineIm[ML,TLCor]^,NormalPut) else
- if Code=75 then PutImage(OX*7,OY*7,LineIm[ML,Hor]^,NormalPut);
- end; { case OldestCode }
- c:=PF[NX,NY];
- if c=Bl then GetBall(nx,ny);
- if (c=W) or (c=MW) or (c=ML) or (c=IBML) then
- begin
- lng[you]:=lng[you]-1;Tune:=7;
- ShowLenFlag[you]:=True;
- end
- else begin
- Pntr[You]:=Pntr[You]+1; if Pntr[You]>200 then Pntr[You]:=1;
- snk[You,Pntr[You]].x:=NX;snk[You,Pntr[You]].y:=NY;
- PF[NX,NY]:=ML;
- if (Code=72) or (Code=80) then PutImage(NX*7,NY*7,LineIm[ML,Ver]^,NormalPut)
- else PutImage(NX*7,NY*7,LineIm[ML,Hor]^,NormalPut);
- end; {else}
- if Lplus[You]>0 then
- begin Lplus[You]:=Lplus[You]-1;Lng[You]:=Lng[You]+1;
- ShowLenFlag[you]:=True; end
- else
- begin
- PF[TX,TY]:=Sp;
- PutImage(TX*7,TY*7,Null^,NormalPut);
- end;
- end;
-
- procedure MoveIBM;
- var ox,oy,nx,ny,tx,ty : byte;
- gex,gey : byte;
- LoWa : array[0..3] of byte;
- Dngr : array[0..3] of boolean;
- j,Tail : integer;
- IBMFindsGem : boolean;
- DeadEnd : boolean;
- NewDir,OldDir : byte;
-
- function Best(wx,wy: byte): byte;
- var Up,Down,Left,Right,a,b : integer;
- function Dist(ddx,ddy: integer): byte;
- var ij: integer;
- begin
- ij:=0;
- while (PF[a,b]=Sp) or (PF[a,b]=Bl)
- do begin ij:=ij+1;a:=a+ddx;b:=b+ddy; end;
- Dist:=ij;
- end;
- begin
- a:=wx;b:=wy-1;Up:=Dist(0,-1);
- a:=wx;b:=wy+1;Down:=Dist(0,1);
- a:=wx-1;b:=wy;Left:=Dist(-1,0);
- a:=wx+1;b:=wy;Right:=Dist(1,0);
- if (Up>=Down) and (Up>=Left) and (Up>=Right) then Best:=0;
- if (Down>=Up) and (Down>=Left) and (Down>=Right) then Best:=1;
- if (Left>=Up) and (Left>=Down) and (Left>=Right) then Best:=2;
- if (Right>=Up) and (Right>=Down) and (Right>=Left) then Best:=3;
- end;
-
- procedure IBMGetsGold(aa,bb : byte);
- var bonusl,bonuss : byte;
- i, ObN : integer;
- begin
- ObN:=0; BonusL:=0; BonusS:=0;
- for i:=1 to 3 do
- if (aa=Gold[i].gx) and (bb=Gold[i].gy) and (Gold[i].size>0) then ObN:=i;
- if ObN>0 then
- begin
- if Gold[ObN].Class=SB then begin BonusS:=Gold[ObN].Size*20;
- BonusL:=0;Tune:=4;end;
- if Gold[ObN].Class=LB then begin BonusL:=Gold[ObN].Size*2;
- BonusS:=0;Tune:=5;end;
- if Gold[ObN].Class=PS then begin BonusS:=100;
- BonusL:=10;Tune:=6;end;
- Lplus[IBM]:=Lplus[IBM]+BonusL;
- if BonusS>0 then begin scr[IBM]:=scr[IBM]+BonusS;
- ShowScoreFlag[IBM]:=True; end;
- PF[Gold[ObN].gx,Gold[ObN].gy]:=Sp;
- Gold[ObN].size:=0; Gold[ObN].Class:=0;
- end;
- end;
-
- begin
- OX:=snk[IBM,Pntr[IBM]].x; OY:=snk[IBM,Pntr[IBM]].y;
- Tail:=Pntr[IBM]-lng[IBM]; if Tail<1 then Tail:=Tail+200;
- TX:=snk[IBM,Tail].x; TY:=snk[IBM,Tail].y;
- if XDir[IBM]=0 then
- if YDir[IBM]=-1 then OldDir:=0 else OldDir:=1;
- if YDir[IBM]=0 then
- if XDir[IBM]=-1 then OldDir:=2 else OldDir:=3;
- LoWa[0]:=PF[ox,oy-1]; LoWa[1]:=PF[ox,oy+1];
- LoWa[2]:=PF[ox-1,oy]; LoWa[3]:=PF[ox+1,oy];
- for j:=0 to 3 do
- if (Lowa[j]=W) or (Lowa[j]=MW) or (Lowa[j]=ML) or (Lowa[j]=IBML)
- then Dngr[j]:=True
- else Dngr[j]:=False;
- if (Dngr[0]=True) and (Dngr[1]=True) and
- (Dngr[2]=True) and (Dngr[3]=True)
- then begin ShowLenFlag[IBM]:=True; DeadEnd:=True; end
- else
- begin
- IBMFindsGem:=False; DeadEnd:=False;
- for j:=1 to 3 do if Gold[j].size>0 then
- begin
- GeX:=Gold[j].gx; Gey:=Gold[j].gy;
- if (OX=Gex) and (OY>Gey) and (Dngr[0]=False)
- then begin NewDir:=0; IBMFindsGem:=True; end;
- if (OX=Gex) and (OY<Gey) and (Dngr[1]=False)
- then begin NewDir:=1; IBMFindsGem:=True; end;
- if (OX>Gex) and (OY=Gey) and (Dngr[2]=False)
- then begin NewDir:=2; IBMFindsGem:=True; end;
- if (OX<Gex) and (OY=Gey) and (Dngr[3]=False)
- then begin NewDir:=3; IBMFindsGem:=True; end;
- end;
- if IBMFindsGem=False then
- if (Random(30)=1) or
- (Dngr[OldDir]=True)
- then
- if Random(7)<>1 then NewDir:=Best(OX,OY)
- else repeat NewDir:=Random(4) until Dngr[NewDir]=False;
- case NewDir of
- 0: begin
- case OldDir of
- 0: PutImage(OX*7,OY*7,LineIm[IBML,Ver]^,NormalPut);
- 2: PutImage(OX*7,OY*7,LineIm[IBML,BLCor]^,NormalPut);
- 3: PutImage(OX*7,OY*7,LineIm[IBML,BRCor]^,NormalPut);
- end;
- XDir[IBM]:=0; YDir[IBM]:=-1;
- end;
- 1: begin
- case OldDir of
- 1: PutImage(OX*7,OY*7,LineIm[IBML,Ver]^,NormalPut);
- 2: PutImage(OX*7,OY*7,LineIm[IBML,TLCor]^,NormalPut);
- 3: PutImage(OX*7,OY*7,LineIm[IBML,TRCor]^,NormalPut);
- end;
- XDir[IBM]:=0; YDir[IBM]:=1 ;
- end;
- 2: begin
- case OldDir of
- 0: PutImage(OX*7,OY*7,LineIm[IBML,TRCor]^,NormalPut);
- 1: PutImage(OX*7,OY*7,LineIm[IBML,BRCor]^,NormalPut);
- 2: PutImage(OX*7,OY*7,LineIm[IBML,Hor]^,NormalPut);
- end;
- XDir[IBM]:=-1;YDir[IBM]:=0 ;
- end;
- 3: begin
- case OldDir of
- 0: PutImage(OX*7,OY*7,LineIm[IBML,TLCor]^,NormalPut);
- 1: PutImage(OX*7,OY*7,LineIm[IBML,BLCor]^,NormalPut);
- 3: PutImage(OX*7,OY*7,LineIm[IBML,Hor]^,NormalPut);
- end;
- XDir[IBM]:=1; YDir[IBM]:=0 ;
- end;
- end; { case NewDir }
- if (IBMFindsGem=True) and (Lowa[NewDir]=Bl)
- then IBMGetsGold(OX+XDir[IBM],OY+YDir[IBM]);
- NX:=OX+XDir[IBM]; NY:=OY+YDir[IBM];
- Pntr[IBM]:=Pntr[IBM]+1;if Pntr[IBM]>200 then Pntr[IBM]:=Pntr[IBM]-200;
- snk[IBM,Pntr[IBM]].x:=NX; snk[IBM,Pntr[IBM]].y:=NY;
- PF[NX,NY]:=IBML;
- if XDir[IBM]=0 then PutImage(NX*7,NY*7,LineIm[IBML,Ver]^,NormalPut)
- else PutImage(NX*7,NY*7,LineIm[IBML,Hor]^,NormalPut);
- end; { if no danger }
- if Lplus[IBM]>0 then
- begin Lplus[IBM]:=LPlus[IBM]-1;
- if DeadEnd=False then Lng[IBM]:=Lng[IBM]+1;
- ShowLenFlag[IBM]:=True; end
- else
- begin
- PF[TX,TY]:=sp;
- PutImage(TX*7,TY*7,Null^,NormalPut);
- if DeadEnd=True then begin lng[IBM]:=lng[IBM]-1;Tune:=8;
- ShowLenFlag[IBM]:=True;end;
- end;
- end;
-
- procedure SetMoveWall;
- var mwdir : byte;
- x0,y0 : byte;
- begin
- MoveWallFlag:=True; Tune:=9;
- MWInfo.mwpntr:=1;
- MWDir:=random(4);
- if (MWDir=0) and (snk[You,Pntr[You]].y>44) then MWDir:=1;
- if (MWDir=1) and (snk[You,Pntr[You]].y<4 ) then MWDir:=0;
- if (MWDir=2) and (snk[You,Pntr[You]].x<5 ) then MWDir:=3;
- if (MWDir=3) and (snk[You,Pntr[You]].x>73) then MWDir:=2
- ;
- case MWDir of
- 0: begin MWInfo.mwxdir:=0 ; MWInfo.mwydir:=-1; end;
- 1: begin MWInfo.mwxdir:=0 ; MWInfo.mwydir:=1 ; end;
- 2: begin MWInfo.mwxdir:=-1; MWInfo.mwydir:=0 ; end;
- 3: begin MWInfo.mwxdir:=1 ; MWInfo.mwydir:=0 ; end;
- end; {case MWDir}
- if MWInfo.mwxdir=0 then MWInfo.mwleng:=Random(22)+3
- else MWInfo.mwleng:=Random(29)+7;
- case MWDir of
- 0: begin x0:=Random(69)+5; y0:=48; end;
- 1: begin x0:=Random(69)+5; y0:=0 ; end;
- 2: begin x0:=78; y0:=Random(41)+4; end;
- 3: begin x0:=0 ; y0:=Random(41)+4; end;
- end; {case MWDir}
- Mow[1].mwx:=x0; Mow[1].mwy:=y0;
- end;
-
- procedure MoveWall;
- var OX,OY,NX,NY,TX,TY,pix : byte;
- Tail,i : integer;
- begin
- OX:=Mow[MWInfo.mwpntr].mwx; OY:=Mow[MWInfo.mwpntr].mwy;
- NX:=OX+MWInfo.mwxdir ; NY:=OY+MWInfo.mwydir ;
- Tail:=MWInfo.mwpntr-MWinfo.mwleng+1;
- if Tail<1 then Tail:=Tail+35;
- if Tail>35 then Tail:=Tail-35;
- TX:=Mow[Tail].mwx ; TY:=Mow[Tail].mwy ;
- Pix:=PF[NX,NY];
- if Pix<>Sp then MWInfo.mwleng:=MWInfo.mwleng-1
- else
- begin
- PF[nx,ny]:=MW;
- MWInfo.mwpntr:=MWInfo.mwpntr+1;
- if MWInfo.mwpntr>35 then MWInfo.mwpntr:=1;
- Mow[MWInfo.mwpntr].mwx:=NX;
- Mow[MWInfo.mwpntr].mwy:=NY;
- if MWInfo.mwxdir=0 then PutImage(NX*7,NY*7,LineIm[MW,Ver]^,NormalPut)
- else PutImage(NX*7,NY*7,LIneIm[MW,Hor]^,NormalPut);
- end;
- if (TX>0) and (TX<78) and (TY>0) and (TY<48) and (PF[tx,ty]=MW) then
- begin
- PF[TX,TY]:=Sp;
- PutImage(TX*7,TY*7,Null^,NormalPut);
- end;
- if MWInfo.mwleng=0 then
- begin
- MoveWallFlag:=False;
- for i:=1 to 30 do begin Mow[i].mwx:=0;Mow[i].mwy:=0;end;
- end;
- end;
-
- procedure Play(Music: byte);
- var i: integer;
- begin
- case Music of
- 1: Sound(1000+Counter*100);
- 2: Sound(500 +Counter*100);
- 3: case Counter of
- 0: sound(1000); 1: sound(500); 2: sound(1500);
- 3: sound(750); 4: sound(1250);5: sound(1000);
- end;
- 4: Sound(1500-Counter*100);
- 5: Sound(1000-Counter*100);
- 6: case Counter of
- 0: sound(500); 1: sound(300); 2: sound(700);
- 3: sound(400); 4: sound(600); 5: sound(500);
- end;
- 7: sound(300+Random(100));
- 8: sound(100+Random(100));
- 9: case Counter of 0: sound(100); 1: sound(120); 2: sound(100);
- 3: sound(120); 4: sound(100); 5: sound(120); end;
- 10: sound(1600+10*Counter);
- 11: sound(1650-300*Counter);
- 12: case Counter of 0: sound(600); 1: sound(800); 2: sound(400);
- 3: sound(800); 4: sound(200); 5: sound(800); 6: sound(750);
- 7: sound(700); 8: sound(650); 9: sound(600); end;
- 13: case Counter of 0: sound(100); 1: sound(50); 2: sound(100);
- 3: sound(50); 4: sound(200); 5: sound(175); 6: sound(150);
- 7: sound(125); 8: sound(100); 9: sound(50); end;
- end; { case }
- Counter:=Counter+1;
- if Counter>MaxCounter then begin Counter:=0; Tune:=0; nosound; end;
- end;
-
- procedure GlobalInit;
- begin
- Message[1]:='YOU WILL BE DESTROYED!';
- Message[2]:='TRUST YOUR FEELINGS!';
- Message[3]:='MAY THE FORCE BE WITH YOU!';
- Message[4]:='USE THE FORCE, LUKE!';
- Message[5]:='WAKE UP! IT''S TIME TO DIE!';
- Message[6]:='WORKERS OF ALL COUNTRIES, UNITE!';
- Message[7]:='LIFE IS LIVE, TROFF IS TROFF ...';
- Message[8]:='WELCOME TO MY NIGHTMARE (NIGHTWARE OR SOFTMARE) !';
- Message[9]:='MEOW !';
- Message[10]:='YOU''D BETTER PLAY SIERRA GAMES!';
- Message[11]:='YOU ARE SO BRIGHT!';
- Message[12]:='YOU''LL BE THE HERO OF THE SOVIET UNION!';
- Message[13]:='TRY TO WRITE "TROFF - 3" IF YOU''RE SO CLEVER!';
- Message[14]:='GRATEFUL PEOPLE WILL BUILD A STATUE OF YOU!';
- Message[15]:='SEE YOU LATER. TERMINATOR.';
- Message[16]:='IT''S A CATASTROFF!';
- Message[17]:='HAVE A NICE DEATH!';
- Message[18]:='TROFF IS TOO HARD FOR YOU. TRY TO PLAY CLIPPER';
- Message[19]:='TROFF II IS FOR ABSTINENTS ONLY';
- Message[20]:='NO CHANCE!';
- MessageFlag:=0;
- scr[1]:=0; scr[2]:=0;
- trn[1]:=0; trn[2]:=0;
- Tune:=0; Counter:=0;
- ToggleSound:=True;
- MaxTrn:=3;
- Speed:=30;
- MaxCounter:=5;
- EnemyToggle:=True;
- MWallToggle:=100;
- LenToWin:=200;
- Bonus[1]:=0; Bonus[2]:=0;
- GameNo:=0;
- Hisco:=0; Losco:=0; Hipla:=2; Lopla:=2;
- end;
-
- procedure PrintMessage(MN : byte);
- begin
- SetColor(Cyan);SetTextStyle(SmallFont,HorizDir,4);
- OutTextXY(550-TextWidth(Message[MN]),341,Message[MN]);
- end;
-
- procedure Destroy(Player : byte);
- var p, st, en : byte;
- tail : integer;
- begin
- en:=Pntr[Player];
- Tail:=en-lng[Player]-1;
- if Tail<1 then Tail:=Tail+200;
- st:=Tail;
- p:=st;
- repeat
- p:=p+1; if p>200 then p:=1;
- if ToggleSound=True then sound(Random(500)+Player*500);Delay(10);
- PutImage(snk[Player,p].x*7,snk[Player,p].y*7,Null^,NormalPut);
- until p=en;
- nosound;
- end;
-
- procedure ShowNote;
- begin
- PutImage(631,0,Note^,XORPut);
- end;
-
- procedure DeleteScreen;
- var i : integer;
- begin SetColor(1+Random(15)); nosound;
- for i:=0 to 319 do Rectangle(i,i-145,639-i,494-i);
- SetColor(Black);
- for i:=0 to 319 do Rectangle(i,i-145,639-i,494-i);
- end;
-
- procedure CalcBonus;
- var i : integer;
- begin
- Bonus[1]:=0; Bonus[2]:=0;
- for i:=1 to 2 do if EndFlag[3-i]=True then
- begin
- Bonus[i]:=lng[i];
- case MWallToggle of
- 300: Bonus[i]:=Bonus[i]+25;
- 100: Bonus[i]:=Bonus[i]+50;
- 0: Bonus[i]:=Bonus[i]+100;
- end; {case}
- Bonus[i]:=Bonus[i]+(50-Speed)*4;
- if EnemyToggle=True then Bonus[i]:=Round(Bonus[i]*3);
- end;
- end;
-
- procedure ShowHighScore;
- function st(l:longint):string;
- var s: string;
- begin
- str(l,s);
- case length(s) of
- 1: st:='0000000'+s; 2: st:='000000'+s; 3: st:='00000'+s;
- 4: st:='0000'+s; 5: st:='000'+s; 6: st:='00'+s; 7: st:='0'+s;
- 8: st:=s; end;
- end;
- procedure Pr(xi,yi: word; strn: string; s1,c1,s2,c2: byte; fo,si: word);
- var u,v : integer;
- begin
- SetColor(c1); SetTextStyle(fo,HorizDir,si);
- for u:=xi-s1 to xi+s1 do
- for v:=yi-s1 to yi+s1 do
- OutTextXY(u,v,strn);
- SetColor(c2);
- for u:=xi-s2 to xi do
- for v:=yi-s2 to yi+s2 do
- OutTextXY(u,v,strn);
- end;
- begin
- Pr(235,10,'Troff II',5,LightBlue,4,Blue,SmallFont,15);
- SetFillStyle(SolidFill,Brown);SetColor(Yellow);
- Bar3D(0,10,180,55,5,True); Bar3D(450,10,630,55,5,True);
- SetTextStyle(SmallFont,HorizDir,7);SetColor(LightRed);
- OutTextXY(32,9,'High Score');OutTextXY(490,9,'Low Score');
- SetColor(Yellow);
- OutTextXY(31,10,'High Score');OutTextXY(489,10,'Low Score');
- SetTextStyle(SmallFont,HorizDir,5);
- if Hipla=1 then
- Pr((180-TextWidth(st(Hisco))) div 2 -15,26,st(Hisco),1,0,0,10,1,3)
- else Pr((180-TextWidth(st(Hisco))) div 2 -15,26,st(Hisco),1,0,0,12,1,3);
- if Lopla=1 then
- Pr(455+((180-TextWidth(st(Losco))) div 2),26,st(Losco),1,0,0,10,1,3)
- else Pr(455+((180-TextWidth(st(Losco))) div 2),26,st(Losco),1,0,0,12,1,3);
- end;
-
- procedure PressSpaceBar;
- var chch : char;
- begin
- SetTextStyle(SmallFont,HorizDir,4);
- SetUserCharSize(1,1,1,1);
- SetColor(White);
- OutTextXY(522,325,'Press Space Bar ...');
- repeat
- chch:=ReadKey;
- until chch=#32;
- end;
-
- procedure StatusScreen;
- var Mes: array[1..10] of string;
- w: integer;
- function ss1(l:longint):string;
- var s:string;begin str(l,s);
- if length(s)=1 then ss1:='0'+s else ss1:=s;end;
- function ss2(l:longint):string;var s:string;begin str(l,s);ss2:=s;end;
- procedure Pri(xi,yi:word;stri:string;ci1,ci2:word);
- begin
- SetColor(ci2);
- OutTextXY(xi+2,yi-2,stri);OutTextXY(xi+1,yi-1,stri);
- SetColor(ci1);
- OutTextXY(xi,yi,stri);
- end;
- begin
- Mes[1]:='Turns to win'; Mes[2]:='Enemy Snake';
- Mes[3]:='Moving walls'; Mes[4]:='Max.Snake Length';
- Mes[5]:='Speed' ; Mes[6]:='Sound';
- Mes[7]:='Winner :' ; Mes[8]:='Score:';
- Mes[9]:='Bonus:' ; Mes[10]:='Total:';
- ShowHighScore;
- SetLineStyle(0,0,3);
- SetColor(DarkGray); Rectangle(4,62,638,335);
- SetColor(LightGray);Rectangle(0,65,634,338);
- GameNo:=GameNo+1;
- SetTextStyle(SansSerifFont,HorizDir,2);
- pri(280,67,'Game '+ss1(GameNo),Yellow,Brown);
- SetUserCharSize(2,1,1,1);
- pri(140,67,ss1(trn[1]),LightGreen,Green);
- pri(440,67,ss1(trn[2]),LightRed,Red);
- SetUserCharSize(1,1,1,2);
- SetColor(Brown);Line(262,92,382,92);
- SetColor(Yellow);Line(260,94,380,94);
- SetLineStyle(0,0,1);
- for w:=1 to 6 do
- pri(300-TextWidth(Mes[w]),80+w*20,Mes[w],LightGray,DarkGray);
- pri(340,100,ss1(MaxTrn),13,5);
- if EnemyToggle=True then pri(340,120,'On',13,5)
- else pri(340,120,'Off',13,5);
- case MWallToggle of
- -1: pri(340,140,'Off',13,5);
- 300: pri(340,140,'Seldom',13,5);
- 100: pri(340,140,'Often',13,5);
- 0: pri(340,140,'Always',13,5);
- end;
- pri(340,160,ss1(LenToWin),13,5);
- pri(340,180,ss1(Speed),13,5);
- case Speed of
- 0: pri(390,180,'(Madness)',13,5);
- 1..10: pri(390,180,'(Very Fast)',13,5);
- 11..20: pri(390,180,'(Fast)',13,5);
- 21..30: pri(390,180,'(Normal)',13,5);
- 31..40: pri(390,180,'(Slow)',13,5);
- 41..50: pri(390,180,'(Very Slow)',13,5);
- end;
- if ToggleSound=True then pri(340,200,'On',13,5)
- else pri(340,200,'Off',13,5);
- SetTextStyle(GothicFont,HorizDir,3);SetUserCharSize(2,1,1,1);
- pri(300-TextWidth(Mes[7]),220,Mes[7],LightCyan,Cyan);
- if EndFlag[IBM]=True then pri(340,220,'You',LightGreen,Green);
- if EndFlag[You]=True then pri(340,220,'mr.Troff',LightRed,Red);
- SetTextStyle(SansSerifFont,HorizDir,3); SetUserCharSize(1,1,1,2);
- for w:=8 to 10 do pri(40,100+w*20,Mes[w],Black,Brown);
- for w:=1 to 2 do begin
- pri(75+175*w,260,ss2(scr[w]),8+2*w,2*w);
- pri(75+175*w,280,ss2(bonus[w]),8+2*w,2*w);
- scr[w]:=scr[w]+bonus[w];
- pri(75+175*w,300,ss2(scr[w]),8+2*w,2*w);
- end;
- PressSpaceBar;
- end;
-
- procedure GameOver;
- var i,xj,yj,cj: integer;
- mess : array[1..6] of string;
- hsc,lsc : longint;
- hpl,lpl : byte;
- function ss3(l:longint):string;
- var s:string;
- begin str(l,s);
- if length(s)=1 then ss3:='0'+s else ss3:=s;
- end;
- function ss4(l:longint):string;
- var s,n:string;
- begin str(l,s);
- n:='00000000';
- if length(s)=8 then ss4:=s else
- ss4:=copy(n,1,8-length(s))+s;
- end;
- procedure prin(xl,yl:word;strin:string;cl1,cl2,cl3:word);
- begin
- SetColor(cl3);OutTextXY(xl+2,yl-2,strin);
- SetColor(cl2);OutTextXY(xl+1,yl-1,strin);
- SetColor(cl1);OutTextXY(xl,yl,strin);
- end;
- begin
- mess[1]:='GAME OVER'; mess[2]:='You'; mess[3]:='mr.Troff';
- mess[4]:='The Winner:'; mess[5]:='New High Score'; mess[6]:='New Low Score';
- for i:=0 to 500 do begin cj:=Random(15)+1;SetColor(cj);
- xj:=Random(640);yj:=Random(350);
- if Random(20)=1 then begin Line(xj-2,yj,xj+2,yj);Line(xj,yj-2,xj,yj+2);end;
- if Random(10)=1 then begin Line(xj-1,yj,xj+1,yj);Line(xj,yj-1,xj,yj+1);end;
- PutPixel(xj,yj,cj);end;
- SetTextStyle(SansSerifFont,HorizDir,5);SetColor(Yellow);
- OutTextXY(195,100,mess[1]);
- for i:=1 to 2 do begin SetColor(8+2*i);
- SetTextStyle(TriplexFont,HorizDir,5);
- OutTextXY(220-TextWidth(mess[1+i]),130+40*i,mess[1+i]);
- SetTextStyle(GothicFont,HorizDir,5);
- prin(250,130+40*i,ss3(trn[i]),Yellow,Brown,Red);
- SetTextStyle(SmallFont,HorizDir,12);
- prin(330,135+40*i,ss4(scr[i]),8+2*i,Black,2*i);
- end;
- SetTextStyle(SmallFont,HorizDir,14);
- prin(185,260,mess[4],White,LightGray,DarkGray);
- if Trn[You]=MaxTrn then prin(270,300,mess[2],Cyan,LightCyan,Cyan)
- else prin(220,300,mess[3],Magenta,LightMagenta,Magenta);
- if scr[You]>=scr[IBM] then
- begin hsc:=scr[You]; lsc:=scr[IBM];
- hpl:=You; lpl:=IBM; end
- else
- begin hsc:=scr[IBM]; lsc:=scr[You];
- hpl:=IBM; lpl:=You; end;
- SetTextStyle(SmallFont,HorizDir,4);
- if hsc>=hisco then
- begin hisco:=hsc; hipla:=hpl;
- prin(540,145+42*hpl,mess[5],LightCyan,LightBlue,Blue);end;
- if (FirstGameFlag=True) or (lsc<=losco) then
- begin FirstGameFlag:=False;
- losco:=lsc; lopla:=lpl;
- prin(540,145+42*lpl,mess[6],LightCyan,LightMagenta,Magenta);end;
- ShowHighScore;
- PressSpaceBar;
- end;
-
- procedure SetGameOptions;
- label 224;
- var MS : array[1..8] of string;
- i : integer;
- chx : char;
- cd : byte;
- procedure print(prx,pry:word;prs:string;prc1,prc2:word);
- begin
- SetColor(prc2);
- OutTextXY(prx+3,pry-3,prs); OutTextXY(prx+2,pry-2,prs); OutTextXY(prx+1,pry-1,prs);
- SetColor(prc1);
- OutTextXY(prx,pry,prs);
- end;
- function ss0(l:integer):string;
- var s:string;begin str(l,s);ss0:=s;end;
- procedure enter(fld: byte);
- var j: integer;
- begin
- case fld of
- 1: begin SetColor(White);
- for j:=1 to 12 do begin
- Rectangle(240+j*25,84,264+j*25,110);
- if j<=MaxTrn then SetFillStyle(InterLeaveFill,LightRed)
- else SetFillStyle(InterLeaveFill,DarkGray);
- FloodFill(241+j*25,85,White);
- end; end;
- 2: if EnemyToggle=True then
- begin print(290,110,'On',LightRed,Red);
- print(370,110,'Off',DarkGray,DarkGray);end
- else
- begin print(290,110,'On',DarkGray,DarkGray);
- print(370,110,'Off',LightRed,Red);end;
- 3: begin
- print(290,140,'Off',DarkGray,DarkGray);
- print(370,140,'Easy',DarkGray,DarkGray);
- print(450,140,'Med.',DarkGray,DarkGray);
- print(530,140,'Hard',DarkGray,DarkGray);
- case MWallToggle of
- -1: print(290,140,'Off',LightRed,Red);
- 300: print(370,140,'Easy',LightRed,Red);
- 100: print(450,140,'Med.',LightRed,Red);
- 0: print(530,140,'Hard',LightRed,Red);end;
- end;
- 4: for j:=0 to 2 do
- if LenToWin=100+j*50 then
- print(370+80*j,170,ss0(100+50*j),LightRed,Red)
- else print(370+80*j,170,ss0(100+50*j),DarkGray,DarkGray);
- 5: begin SetColor(White);SetFillStyle(InterLeaveFill,LightRed);
- Bar(299,207,601,227);Rectangle(299,207,601,227);
- SetFillStyle(InterLeaveFill,DarkGray);
- if Speed>0 then Bar(600-Speed*6,208,600,226);
- end;
- 6: if ToggleSound=True then begin
- print(290,230,'On',LightRed,Red);
- print(370,230,'Off',DarkGray,DarkGray); end
- else begin
- print(290,230,'On',DarkGray,DarkGray);
- print(370,230,'Off',LightRed,Red); end;
- end; end;
- procedure Chan(fld:byte);
- begin
- case fld of
- 1:begin if (chx=#75) and (MaxTrn>1) then MaxTrn:=MaxTrn-1;
- if (chx=#77) and (MaxTrn<12) then MaxTrn:=MaxTrn+1;end;
- 2:EnemyToggle:=not EnemyToggle;
- 3:if (chx=#75) then begin
- if MWallToggle=300 then MWallToggle:=-1;
- if MWallToggle=100 then MWallToggle:=300;
- if MWallToggle=0 then MWallToggle:=100; end
- else begin
- if MWallToggle=100 then MWallToggle:=0;
- if MWallToggle=300 then MWallToggle:=100;
- if MWallToggle=-1 then MWallToggle:=300; end;
- 4: begin if (chx=#75) and (LenToWin>100) then LenToWin:=LenToWin-50;
- if (chx=#77) and (LenToWin<200) then LenToWin:=LenToWin+50; end;
- 5: begin if (chx=#75) and (Speed<50) then Speed:=Speed+1;
- if (chx=#77) and (Speed>0) then Speed:=Speed-1; end;
- 6: ToggleSound:=not ToggleSound;
- end;end;
- begin
- ShowHighScore;
- SetFillStyle(InterLeaveFill,DarkGray);SetColor(LightGray);
- Bar3D(0,70,633,349,5,True);
- MS[1]:='Turns To Win';
- MS[2]:='Enemy Snake';
- MS[3]:='Moving Walls';
- MS[4]:='Max.Snake Length';
- MS[5]:='Speed';
- MS[6]:='Sound';
- MS[7]:='Start Game';
- MS[8]:='Quit';
- SetTextStyle(SansSerifFont,HorizDir,4);
- for i:=1 to 8 do print(50,50+i*30,MS[i],LightGray,DarkGray);
- for i:=1 to 8 do enter(i);
- i:=7;
- 224:print(50,50+i*30,MS[i],LightGreen,Green);
- chx:=ReadKey;
- if chx=#0 then
- begin
- chx:=ReadKey;
- if (chx=#72) or (chx=#80) then print(50,50+i*30,MS[i],LightGray,DarkGray);
- if (chx=#72) and (i>1) then i:=i-1;
- if (chx=#80) and (i<8) then i:=i+1;
- if (chx=#77) or (chx=#75) then begin Chan(i);Enter(i);end;
- end;
- if chx<>#13 then goto 224;
- if i<7 then goto 224;
- if i=8 then QuitFlag:=True;
- end;
-
- procedure SQ(q1,w1,q2,w2,q3,w3,q4,w4,cc:word);
- var square: array[1..4] of PointType;
- begin square[1].x:=q1;square[1].y:=w1;square[2].x:=q2;square[2].y:=w2;
- square[3].x:=q3;square[3].y:=w3;square[4].x:=q4;square[4].y:=w4;
- SetColor(cc);SetFillStyle(SolidFill,cc);
- FillPoly(sizeof(square) div sizeof(pointtype),square);end;
-
- procedure TroffTitle;
- label 129;
- var i,j: integer;
- chx:char;
- cn,cd: array[1..8] of word;
- procedure LLine(q1,w1,q2,w2,q3,w3,q4,w4,q5,w5,q6,w6:word);
- begin MoveTo(q1,w1);LineTo(q2,w2);LineTo(q3,w3);LineTo(q4,w4);
- LineTo(q5,w5);LineTo(q6,w6);end;
- begin
- cn[1]:=8;cn[2]:=7;cn[3]:=5;cn[4]:=13;cn[5]:=2;cn[6]:=10;cn[7]:=6;cn[8]:=12;
- cd[1]:=57;cd[2]:=59;cd[3]:=57;cd[4]:=1;cd[5]:=57;cd[6]:=59;cd[7]:=57;cd[8]:=1;
- SetLineStyle(0,0,3);SetColor(Blue);
- LLine(220,140,220,200,420,200,420,140,380,140,380,180);
- LLine(380,180,260,180,260,140,220,140,220,140,220,140);
- LLine(273,170,273,130,220,130,220,110,273,110,273,90);
- LLine(273,90,220,90,220,70,313,70,313,170,273,170);
- LLine(327,170,327,70,420,70,420,130,367,130,367,170);
- LLine(367,170,327,170,327,170,327,170,327,170,327,170);
- Circle(380,100,20);Line(380,86,380,115);Line(360,100,380,100);
- Line(390,94,390,96);SetLineStyle(0,0,1);
- SetTextStyle(TriplexFont,Horizdir,4);SetColor(LightBlue);
- OutTextXY(220,200,'UFP software');
- PressSpaceBar;
- cleardevice;
- SetColor(white);SetLineStyle(0,0,3);
- LLine(77,40,107,10,197,10,167,40,152,40,152,115);
- LLine(152,115,137,130,122,115,122,40,77,40,77,40);
- LLine(182,40,212,10,242,10,272,40,272,70,242,100);
- LLine(242,100,272,130,242,130,212,100,167,100,167,70);
- LLine(167,70,227,70,242,55,227,40,182,40,182,40);
- LLine(287,40,317,10,347,10,377,40,377,100,347,130);
- LLine(347,130,317,130,287,100,287,40,287,40,287,40);
- LLine(332,40,347,55,347,85,332,100,317,85,317,55);
- LLine(317,55,332,40,332,40,332,40,332,40,332,40);
- LLine(362,10,437,10,467,40,392,40,362,10,362,10);
- LLine(392,55,422,55,437,70,422,85,392,85,392,55);
- LLine(452,10,527,10,557,40,482,40,452,10,452,10);
- LLine(452,55,512,55,527,70,512,85,482,85,482,115);
- LLine(482,115,467,130,452,115,452,55,452,55,452,55);
- SetLineStyle(0,0,1);
- sq(125,170,155,190,275,190,305,170,White);
- sq(125,260,185,260,215,280,155,280,White);
- sq(215,280,245,260,305,260,275,280,White);
- sq(335,170,515,170,485,190,365,190,White);
- sq(335,260,395,260,425,280,365,280,White);
- sq(425,280,455,260,515,260,485,280,White);
- sq(155,190,215,190,185,210,125,210,Blue);
- sq(215,190,275,190,305,210,245,210,Blue);
- sq(125,300,155,281,275,282,305,300,Blue);
- sq(365,190,425,190,405,210,335,210,Blue);
- sq(425,190,485,190,515,210,445,210,Blue);
- sq(335,300,365,280,485,280,515,300,Blue);
- sq(125,170,155,190,125,210,125,210,Cyan);
- sq(125,260,155,280,125,300,125,300,Cyan);
- sq(185,210,215,190,215,280,185,260,Cyan);
- sq(335,170,365,190,335,210,335,210,Cyan);
- sq(335,260,365,280,335,300,335,300,Cyan);
- sq(395,210,425,190,425,280,395,260,Cyan);
- sq(275,190,305,170,305,210,305,210,LightBlue);
- sq(275,280,305,260,305,300,305,300,LightBlue);
- sq(215,190,245,210,245,260,215,280,LightBlue);
- sq(485,190,515,170,515,210,515,210,LightBlue);
- sq(485,280,515,260,515,300,515,300,LightBlue);
- sq(425,190,455,210,455,260,425,280,LightBlue);
- SetFillStyle(SolidFill,Red);
- FloodFill(137,15,White);FloodFill(227,15,White);
- FloodFill(332,15,White);FloodFill(392,15,White);
- FloodFill(400,60,White);FloodFill(512,15,White);
- FloodFill(467,58,White);SetColor(Yellow);
- SetTextStyle(SmallFont,HorizDir,6);
- OutTextXY(263,217,' Written by');
- OutTextXY(263,234,'N.Soumarokov');
- for i:=1 to 8 do setpalette(cn[i],cd[i]);
- sq(557,20,557,40,562,35,562,35,DarkGray);
- sq(557,40,562,35,577,40,577,40,LightGray);
- sq(557,40,577,40,562,45,562,45,Magenta);
- sq(557,40,562,45,557,70,557,70,LightMagenta);
- sq(557,40,557,70,552,45,552,45,Green);
- sq(557,40,552,45,537,40,537,40,LightGreen);
- sq(557,40,537,40,552,35,552,35,Brown);
- sq(557,40,552,35,557,20,557,20,LightRed);
- 129: repeat
- i:=cd[8];
- for j:=8 downto 2 do begin setpalette(cn[j],cd[j-1]); cd[j]:=cd[j-1]; end;
- setpalette(cn[1],i); cd[1]:=i;
- delay(75);
- until keypressed;
- chx:=Readkey; if chx<>' ' then goto 129;
- end;
-
- procedure BossKey;
- label 115;
- var i,j,h:integer;
- s:string;
- chx:char;
- begin
- SetActivePage(1);cleardevice;SetVisualPage(1);nosound;
- if Random(10)>0 then
- begin
- DrawScoreWindow;for i:=1 to 2 do begin SetFillStyle(SolidFill,8+i*2);
- SetColor(i*2);BAR3d(570+36*(i-1),70,584+36*(i-1),262,2,True);
- Line(585+36*(i-1),70,585+36*(i-1),262);end;
- SetColor(White);SetTextStyle(SmallFont,HorizDir,7);
- OutTextXY(568,25,'89');OutTextXY(604,25,'90');
- SetTextStyle(SmallFont,HorizDir,4);
- OutTextXY(573,277,'Business');OutTextXY(573,306,'Graphics');
- for i:=1 to 2 do
- for j:=0 to 11 do begin SetColor(i*2);SetFillStyle(SolidFill,8+i*2);h:=Random(100)+20;
- Bar3d(120-30*i+j*30,200+20*i,145-30*i+j*30,200+20*i-h,20,True);
- SetFillStyle(SolidFill,i*2);
- sq(120-30*i+j*30,200+20*i-h,145-30*i+j*30,200+20*i-h,165-30*i+j*30,185+20*i-h,140-30*i+j*30,185+20*i-h,2*i);
- sq(145-30*i+j*30,200+20*i-h,165-30*i+j*30,185+20*i-h,165-30*i+j*30,185+20*i,145-30*i+j*30,200+20*i,1+2*i);
- SetColor(White);SetTextStyle(SmallFont,VertDir,6);end;
- OutTextXY(67,240,'Jan');OutTextXY(97,240,'Feb');OutTextXY(127,240,'Mar');
- OutTextXY(157,240,'Apr');OutTextXY(187,240,'May');OutTextXY(217,240,'Jun');
- OutTextXY(247,240,'Jul');OutTextXY(277,240,'Aug');OutTextXY(307,240,'Sep');
- OutTextXY(337,240,'Oct');OutTextXY(367,240,'Nov');OutTextXY(397,240,'Dec');
- Line(50,240,50,70);Line(55,80,50,70);Line(50,70,45,80);
- SetColor(Yellow);SetTextStyle(SmallFont,HorizDir,3);h:=(Random(10)+1)*10;
- for i:=0 to 15 do begin Line(48,240-i*10,52,240-i*10);str(h*i,s);
- OutTextXY(30,237-i*10,s);end;
- SetTextStyle(TriplexFont,HorizDir,3);SetColor(random(15)+1);
- if Random(10)=0 then OutTextXY(0,0,'Cats'' Wool Growth') else
- if Random(10)=0 then OutTextXY(0,0,'Poltergeist in the USSR') else
- if Random(10)=0 then OutTextXY(0,0,'Alcohol sale in Sib-Sibiya') else
- if Random(10)=0 then OutTextXY(0,0,'Contacts of the 3d kind growth') else
- if Random(10)=0 then OutTextXY(0,0,'UFP software annual budget') else
- if Random(10)=0 then OutTextXY(0,0,'Number of ghosts catched by Ghostbusters') else
- if Random(10)=0 then OutTextXY(0,0,'Vice in Miami') else
- if Random(10)=0 then OutTextXY(0,0,'Cinetic energy of Darth Vader');
- repeat chx:=ReadKey; until chx=' ';
- end
- else
- begin
- SetTextStyle(TriplexFont,HorizDir,6);SetColor(LightGreen);
- OutTextXY(200,30,'Hey Boss!');SetColor(LightRed);
- OutTextXY(100,80,'C''mon Big Fella!');SetColor(Yellow);
- OutTextXY(150,150,'Do''Ya Wanna');SetColor(White);
- OutTextXY(150,200,'Play TROFF?!');
- h:=1;i:=100;
- 115: repeat sound(i); i:=i+h;if (i>2000) or (i<100) then h:=-h;
- until keypressed;
- ch:=ReadKey; if ch<>' ' then goto 115;
- end;
- SetVisualPage(0);SetActivePage(0);nosound;
- end;
-
- begin
- Gd:=EGA; Gm:=EGAHi; InitGraph(Gd,Gm,''); if GraphResult<>grOk then Halt(1);
- FirstGameFlag:=True; QuitFlag:=False;
- SetActivePage(0);SetVisualPage(0);
- GlobalInit;
- GetDefaultPalette(OldPal); Randomize;
- GetImages;
- ClearDevice; SetAllPalette(OldPal); TroffTitle;
- 3:scr[1]:=0;scr[2]:=0;trn[1]:=0;trn[2]:=0;
- DeleteScreen;SetAllPalette(Oldpal);SetGameOptions;DeleteScreen;
- if QuitFlag=True then goto 4;
- 2: ClearVariables;
- DrawScoreWindow; if ToggleSound=True then ShowNote;
- DrawPlayField;
- 1: ShowScore;
- { ******************** Get Command *********************** }
- OldestCode:=OldCode;
- if KeyPressed then
- begin
- ch:=ReadKey;
- if ch=#0 then begin
- ch:=ReadKey;
- SaveCode:=Code;Code:=ord(ch);
- case Code of
- 77 : if OldCode<>75 then begin XDir[1]:=1 ;YDir[1]:=0 ;OldCode:=77;end;
- 75 : if OldCode<>77 then begin XDir[1]:=-1;YDir[1]:=0 ;OldCode:=75;end;
- 72 : if OldCode<>80 then begin XDir[1]:=0 ;YDir[1]:=-1;OldCode:=72;end;
- 80 : if OldCode<>72 then begin XDir[1]:=0 ;YDir[1]:=1 ;OldCode:=80;end;
- 68 : ExitFlag:=True ;
- 59 : begin PauseGame; Code:=SaveCode; end;
- 60 : begin ToggleSound:=not ToggleSound; ShowNote;
- nosound; Code:=SaveCode; end;
- 61 : begin Bosskey; Code:=SaveCode; end;
- end; { case }
- end; end;
- { ******************************************************** }
- MoveYou;
- if EnemyToggle=True then MoveIBM;
- ObN:=Random(3)+1;
- if (Gold[Obn].Class=PS) and (Gold[Obn].Size>0) then MoveSib(ObN);
- if random(10)=0 then Change(ObN);
- if MoveWallFlag=True then MoveWall;
- if MWallToggle>-1 then if
- (random(MWallToggle)=0) and (MoveWallFlag=False) then SetMoveWall;
- if (Tune>0) and (ToggleSound=True) then play(Tune);
- if ((MessageFlag=0) and (Random(2000)=0))
- then begin PrintMessage(Random(10)+1); MessageFlag:=100; end;
- if MessageFlag>0 then
- begin
- MessageFlag:=MessageFlag-1;
- if MessageFlag=0 then begin SetFillStyle(SolidFill,0);
- Bar(251,342,550,349); end;
- end;
- delay(Speed);
- if (EndFlag[You]=False) and (EndFlag[IBM]=False)
- and (ExitFlag=False) then GoTo 1;
- if ExitFlag=True then goto 3;
- { *** End of Turn *** }
- SetFillStyle(SolidFill,0);Bar(251,342,550,349);
- if (EndFlag[You]=True) then if Random(5)=0
- then PrintMessage(Random(5)+16);
- if (EndFlag[You]=False) then if Random(5)=0
- then PrintMessage(Random(5)+11);
- if EndFlag[IBM]=True then Destroy(IBM);
- if EndFlag[You]=True then Destroy(You);
- if ToggleSound=True then begin
- if EndFlag[IBM]=True then begin MaxCounter:=9;
- Counter:=0;repeat Play(12); delay(750); until Counter=0; end;
- if EndFlag[You]=True then begin MaxCounter:=9;
- Counter:=0;repeat Play(13); delay(750); until Counter=0; end;
- nosound;
- end;
- if EndFlag[IBM]=True then Trn[You]:=Trn[You]+1;
- if EndFlag[You]=True then Trn[IBM]:=Trn[IBM]+1;
- ShowTurnsFlag:=True; ShowScore; Delay(500);
- DeleteScreen; CalcBonus;
- StatusScreen; DeleteScreen;
- if (trn[1]<MaxTrn) and (trn[2]<MaxTrn) then GoTo 2;
- GameOver;
- scr[1]:=0;scr[2]:=0;trn[1]:=0;trn[2]:=0;Tune:=0;Counter:=0;GameNo:=0;
- goto 3;
- 4: CloseGraph; end.