home *** CD-ROM | disk | FTP | other *** search
- {$R+} {Range checking}
- {$U+} {User interupt}
- {$C+} {Abort and input statement with control C}
- {$K+} {Check stack before placing local variables}
- {$I+} {I/O error checking}
- {$V-} {Strick string checking}
-
- {Integer Bitmap For Quadrant Matrix}
- {Scanned Base ( Stars ) Commander ( Klingons )}
- { 1024 512 128 64 32 16 8 4 2 0}
-
- Program Trek;
-
- Const
- NumLines = 24;
-
- Type
- Triad = array[1..3] of real;
- Display = (short,long,fix,chart,titlepage);
- Line = String[80];
-
- RegPack = Record Case Integer Of
- 1: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer);
- 2: (AL,AH,BL,BH,CL,CH,DL,DH: Byte);
- end;
-
-
- Var
- Warp, Torpedoes, QuadX, QuadY, SectorX, SectorY : integer;
- Level, Klingons, Total_Klingons, Shield_Status, Com, EndSecX, EndSecY : integer;
- Energy, EndQuadX, EndQuadY, CommandNumber : integer;
- Quadrant : array[1..10,1..10] of integer;
- Sector : array[1..10,1..10] of integer;
- StarDate, Time_Left, X, Y, PosX, PosY, Delta_X, Delta_Y : Real;
- Fire_Power, Direction, Distance, T, Shield_Strength, Total_hits : Real;
- WaitInterval : real;
- Damage : array[0..7] of Real;
- GameDone, ReadyToStop, Docked, OK, SoundOn : Boolean;
- Command, Command1, Command2 : Char;
- Command12 : String[2];
- CommandLine : String[30];
- Plot : Array[0..5] of Char;
- Device : Array[0..7] of String[20];
- Numbers : triad;
- Screen : display;
-
- Procedure Initialize;
- var I : integer;
- begin
- Randomize;
- Device[0]:='Short range sensors';
- Device[1]:='Long range sensors';
- Device[2]:='Warp engines';
- Device[3]:='Impulse engines';
- Device[4]:='Phasers';
- Device[5]:='Photon torpedoes';
- Device[6]:='Shields';
- Device[7]:='Ship computer';
- Stardate:=2500;
- Time_left:=4.99;
- Plot:='.*KCBE';
- Klingons:=0;
- Energy:=5000;
- Warp:=6;
- Shield_status:=0;
- Shield_strength:=100;
- Torpedoes:=10;
- GameDone:=False;
- ReadyToStop:=False;
- WaitInterval:=1.0;
- For I:=0 to 7 do Damage[I]:=0;
- SoundOn:=True;
- end;
-
- Function FnStars(X:integer) : Integer;
- begin
- Fnstars:=(X and $01E0) DIV $0020;
- end;
-
- Function FnCommander(X:integer) : Integer;
- var I : integer;
- begin
- I:= X and $0010;
- If I=0 Then FnCommander:=0 Else FnCommander:=1;
- end;
-
- Function Fnklingons(X:integer) : Integer;
- begin
- Fnklingons:=(X and $000F);
- end;
-
- Function Fntotalklingons(X:integer) : Integer;
- begin
- Fntotalklingons:=Fnklingons(X)+FnCommander(X);
- end;
-
- Function FnEnemy(X:integer) : Boolean;
- var I : integer;
- begin
- I:= X and 31;
- If I=0 Then FnEnemy:=False Else FnEnemy:=True;
- end;
-
- Function FnBase(X:integer) : Integer;
- var I : integer;
- begin
- I:= X and $0200;
- If I=0 Then FnBase:=0 Else FnBase:=1;
- end;
-
- Function FnScanned(X:integer) : Boolean;
- var I : integer;
- begin
- I:= X and $0400;
- If I=0 Then FnScanned:=False Else FnScanned:=True;
- end;
-
- Function FnDistance(X1,Y1,X2,Y2:integer) : Real;
- begin
- Fndistance:=Sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2));
- end;
-
- Procedure Screen_erase;
- begin
- ClrScr;
- end;
-
- Procedure Cursor(X,Y: integer);
- begin
- GotoXY(X,Y);
- end;
-
- Procedure Tab(X:integer);
- var Y : integer;
- begin
- Y:=WhereY;
- GotoXY(X,Y);
- end;
-
- Procedure Wait(Time:real);
- var i:integer;
- begin
- Time:=Abs(Time*1000);
- If Time>MAXINT then time:=MAXINT;
- I:=Round(Time);
- Delay(I);
- end;
-
- Procedure Erase_line (X,Y:integer);
- begin
- GotoXY(X,Y);
- ClrEol;
- end;
-
- Procedure Erase_bottom (X,Y:integer);
- var i : integer;
- begin
- for i:=Y to 25 do
- begin {for}
- GotoXY(1,I);
- ClrEol;
- end; {for}
- GotoXY(X,Y);
- end;
-
- procedure Explosion;
- var frequency,I,J:integer;
- begin
- for Frequency:= 30 to 185 do begin Delay(1); Sound(Frequency*2); end;
- for Frequency:= 200 to 30 do begin Delay(1); Sound(Frequency*2); end;
- for I:=1 to 225 do
- begin
- J:=random(5)+1;
- If J>3 then Frequency:=random(1000) else frequency:=random(200);
- If I>180 then Frequency:=random(100)+100;
- Sound(Frequency);
- Delay(1);
- end; {for I}
- NoSound;
- end; {Explosion}
-
- Procedure ColorCharacter(I:Integer);
- begin
- Case I of
- 0:textcolor(yellow); {'.' Space}
- 1:textcolor(lightblue); {'*' Star}
- 2:textcolor(red); {'K' Klingon}
- 3:textcolor(lightred); {'C' Klingon Commander}
- 4:textcolor(Brown); {'B' Base}
- 5:textcolor(lightgreen); {'E' Enterprise}
- end; {Case}
- Write(Plot[I]);
- Textcolor(yellow);
- end;
-
- Procedure Grid;
- var I,J : integer;
- begin
- For J:=1 To 10 do
- begin {for J}
- write(J:2);
- For I:=1 To 10 do
- begin {for I}
- write(' ');
- ColorCharacter(Sector[I,J]);
- Write(' ');
- end; {for I}
- writeln('');
- writeln('');
- end; {for J};
- writeln(' 1 2 3 4 5 6 7 8 9 10');
- Quadrant[Quadx,Quady]:= Quadrant[Quadx,Quady] or 1024;
- end;
-
- Procedure Random_ij(var I,J:Integer);
- begin
- repeat
- I:=Random(10)+1;
- J:=Random(10)+1;
- until Sector[I,J]=0;
- end;
-
- Procedure ZeroSector;
- var I,J : integer;
- begin
- for i:=1 to 10 do
- begin {for i}
- for j:=1 to 10 do Sector[i,j]:=0;
- end; {i}
- end;
-
- Procedure Create_sector;
- var i,j,l : integer;
- begin
- ZeroSector;
- Sector[Sectorx,Sectory]:=5;
- If Fncommander(Quadrant[Quadx,Quady])>0 Then
- begin {if}
- Random_ij(I,J);
- Sector[I,J]:=3;
- end; {if}
- If Fnbase(Quadrant[Quadx,Quady])>0 Then
- begin {if}
- Random_ij(I,J);
- Sector[I,J]:=4;
- end; {if}
- If Fnklingons(Quadrant[Quadx,Quady])>0 Then
- begin {if}
- For L:=1 To Fnklingons(Quadrant[Quadx,Quady]) do
- begin {for l}
- Random_ij(I,J);
- Sector[I,J]:=2;
- end; {for L};
- end; {if}
- If Fnstars(Quadrant[Quadx,Quady])>0 Then
- begin {if}
- For L:=1 To Fnstars(Quadrant[Quadx,Quady]) do
- begin {for L}
- Random_ij(I,J);
- Sector[I,J]:=1;
- end; {for L};
- end; {if}
- end;
-
- Procedure Create_universe;
- var i,j,k,l,m,bases : integer;
- begin
- ZeroSector;
- Random_ij(Quadx,Quady);
- Random_ij(Sectorx,Sectory);
- bases:=0;
- For I:=1 To 10 do
- begin {for I}
- For J:=1 To 10 do
- begin {for J}
- Quadrant[I,J]:=Random(9)*32; {Number of stars}
- K:=Random(100);
- If (K<(7-Level)) Then {Base}
- begin
- Quadrant[I,J]:=Quadrant[I,J]+512;
- bases:=bases+1;
- end;
- K:=random(100);
- If K<(20+Level*5) Then
- begin {if1}
- If K>25 Then M:=Random(Level*2)+1 else M:=random(2)+1;
- Quadrant[I,J]:=Quadrant[I,J]+M;
- Klingons:=Klingons+M; {Regular Klingons}
- L:=random(100);
- If L<(Level*5+1) Then
- begin {if2}
- Quadrant[I,J]:=Quadrant[I,J]+16; {Klingon Commander}
- Klingons:=Klingons+1;
- end; {if2}
- end {if1}
- end; {for J}
- end; {for i}
- If bases=0 then {Make sure there is at least one base}
- begin
- Random_ij(I,J);
- Quadrant[I,J]:=Quadrant[I,J]+512;
- end;
- Total_Klingons:=Klingons;
- end;
-
- Procedure Damaged(I:Integer);
- begin
- Erase_bottom (2,23);
- writeln('Damage to ',Device[I]);
- wait(WaitInterval);
- end;
-
- Procedure Score_board;
- begin
- Cursor(52,1);
- writeln('STARDATE: ',StarDate:5:2);
- Cursor(52,3);
- writeln('POSITION');
- Tab(53);
- writeln(' QUADRANT ',Quadx,',',Quady);
- Tab(53);
- writeln(' SECTOR ',Sectorx,',',Sectory);
- Cursor(52,7);
- writeln('TIME REMAINING: ',Time_left:3:2);
- Cursor(52,9);
- writeln('KLINGONS: ',Klingons,' ');
- Cursor(52,11);
- writeln('ENERGY: ',Energy:5,' ');
- Cursor(52,13);
- If Shield_status=0 Then writeln('SHIELDS DOWN');
- If Shield_status=1 Then writeln('SHIELDS UP ');
- Tab(52);
- writeln(' SHIELD STRENGTH: ',Shield_Strength:4:1,'% ');
- Cursor(52,16);
- writeln('TORPEDOES: ',Torpedoes:2,' ');
- Cursor(52,18);
- writeln('WARP: ',Warp:2);
- Cursor(52,20);
- If Fnenemy(Quadrant[Quadx,Quady]) Then
- begin {if2}
- textcolor(Red);
- writeln('CONDITION: RED ');
- textcolor(Yellow);
- end {if2}
- else
- begin {else}
- textcolor(Green);
- writeln('CONDITION: GREEN');
- textcolor(Yellow);
- end; {else}
- end;
-
- Procedure Short_range;
- begin
- Screen_erase;
- screen:=short;
- Grid;
- Score_board;
- end;
-
- Procedure Get_numbers(var numbers : triad);
- {Needs to be converted into an independent subroutine. Now}
- {uses global variable CommandLine.}
- var
- Command1Line : String[30];
- SubString : String[30];
- J,K,L : integer;
- begin
- Command1Line:=CommandLine;
- For L:=1 to 3 do Numbers[L]:=-1;
- L:=1;
- While Pos(',',Command1Line)>0 do
- begin {while}
- K:=Pos(',',Command1Line);
- SubString:=Copy(Command1Line,1,K-1);
- Val(SubString,Numbers[L],J);
- Delete(Command1Line,1,K);
- L:=L+1;
- end; {while}
- If Length(Command1Line)=0 Then Numbers[L]:=-1 Else Val(Command1Line,Numbers[L],J);
- end;
-
- Procedure Not_enough;
- begin
- Erase_bottom (2,23);
- writeln('Not enough energy.');
- wait(WaitInterval);
- end;
-
- Procedure AnotherGame(Var ReadyToStop : Boolean);
- Var Character : char;
- begin
- repeat
- Erase_bottom(30,18);
- write('ANOTHER GAME (y/n)? ');
- Read(KBD,Character);
- Character:=UpCase(Character);
- until (Character='N') or (Character='Y');
- If Character='N' then ReadyToStop:=True else ReadyToStop:=False;
- end;
-
- Procedure Prisoner;
- begin
- Cursor(5,10);
- writeln('YOU ARE TAKEN PRISONER BY THE KLINGONS UNTIL THE END OF THE CONFLICT.');
- end;
-
- Procedure No_energy;
- begin
- Screen_erase;
- Cursor(17,4);
- writeln('THE ENTERPRISE HAS BEEN TOTALLY DISTROYED');
- Prisoner;
- end;
-
- Procedure No_time;
- begin
- Screen_erase;
- Cursor(12,4);
- writeln('YOU HAVE FAILED TO ELIMINATE THE KLINGON THREAT IN TIME.');
- Cursor(25,11);
- writeln('THE FEDERATION HAS SURRENDERED.');
- end;
-
- Procedure Collision(I:Integer);
- begin
- Screen_erase;
- Cursor(8,4);
- write('THE ENTERPRISE HAS BEEN DESTROYED BY A COLLISION WITH A ');
- If I=1 Then writeln('STAR.');
- If I=2 Then writeln('KLINGON.');
- If I=3 Then writeln('KLINGON COMMANDER.');
- If I=4 Then writeln('STARBASE.');
- If (I<1) or (I>4) then
- begin
- writeln('');
- writeln('Error I= ',I);
- end;
- Prisoner;
- end;
-
- Procedure Spiral (SectorX,SectorY:integer;Var FreeX,FreeY:integer);
- var I,J,K,Box : integer;
- begin
- Box:=Random(3)+1;
- FreeX:=0;
- FreeY:=0;
- repeat
- begin {repeat}
- J:=random(4)+1;
- K:=2*Box+1;
-
- case j of
-
- 1:
- begin {case 1}
- I:=Random(K)+(SectorX-Box);
- If (I in [1..10]) and ((SectorY+Box) in [1..10]) and ((FreeX=0) and (FreeY=0)) then
- begin {Range Check [1..10}
- If Sector[I,SectorY+Box]=0 Then
- begin
- FreeX:=I;
- FreeY:=SectorY+Box;
- end;
- end; {Range Check [1..10}
- end; {case 1}
-
- 2:
- begin {case 2}
- I:=Random(K)+(SectorX-Box);
- If (I in [1..10]) and ((SectorY-Box) in [1..10]) and ((FreeX=0) and (FreeY=0)) then
- begin {Range Check [1..10}
- If Sector[I,SectorY-Box]=0 Then
- begin
- FreeX:=I;
- FreeY:=SectorY-Box;
- end;
- end; {Range Check [1..10}
- end; {case 2}
-
- 3:
- begin {case 3}
- I:=Random(K)+(SectorY-Box);
- If (I in [1..10]) and ((SectorX+Box) in [1..10]) and ((FreeX=0) and (FreeY=0)) then
- begin {Range Check [1..10}
- If Sector[SectorX+Box,I]=0 Then
- begin
- FreeX:=SectorX+Box;
- FreeY:=I;
- end;
- end; {Range Check [1..10}
- end; {case 3}
-
- 4:
- begin {case 4}
- I:=Random(K)+(SectorY-Box);
- If (I in [1..10]) and ((SectorX-Box) in [1..10]) and ((FreeX=0) and (FreeY=0)) then
- begin {Range Check [1..10}
- If Sector[SectorX-box,I]=0 Then
- begin
- FreeX:=SectorX-Box;
- FreeY:=I;
- end;
- end; {Range Check [1..10}
- end; {case 4}
- end; {case}
-
- Box:=Box+1;
- end; {repeat}
- until (box>10) or ((FreeX>0) and (FreeY>0));
- end; {Procedure Spiral}
-
-
- Procedure Attackers (Move:integer);
- Var
- I,J,K,L,M,N,O : integer;
- begin
- For J:=(Quady-1) To(Quady+1) do
- begin {for J}
- For I:=(Quadx-1) To(Quadx+1) do
- begin {for I}
- If ((I in [1..10]) and (j in [1..10])) and ((Quadx<>I) And (Quady<>J)) Then
- begin {if}
- K:=FnKlingons(Quadrant[I,J]);
- If ((K>0) and (K<8)) Then
- begin {if1}
- For L:=1 To K do
- begin {for L}
- M:=random(100);
- If (M<Move) and (Fnklingons(Quadrant[Quadx,Quady])<(4+Level*2)) Then
- begin {if2}
- Quadrant[I,J]:=Quadrant[I,J]-1;
- Quadrant[Quadx,Quady]:=Quadrant[Quadx,Quady]+1;
- Quadrant[I,J]:=Quadrant[I,J] and $FBFF; {Not scanned}
- repeat
- Spiral(SectorX,SectorY,M,N);
- until (M in [1..10]) and (N in [1..10]);
- Sector[M,N]:=2;
- If (screen=short) and (Damage[0]=0) then
- begin
- Cursor(1+(M*4),(N-1)*2+1);
- ColorCharacter(2);
- end; {If screen=short then plot moves}
- end; {if2}
- end; {for L}
- end; {if 1}
- If FnCommander(Quadrant[I,J])>0 Then
- begin {if1}
- M:=random(100);
- If (M<Move) and (FnCommander(Quadrant[Quadx,Quady])=0) Then
- begin {if2}
- Quadrant[I,J]:=Quadrant[I,J]-16;
- Quadrant[Quadx,Quady]:=Quadrant[Quadx,Quady]+16;
- Quadrant[I,J]:=Quadrant[I,J] and $FBFF; {Not scanned}
- repeat
- Spiral(SectorX,SectorY,M,N);
- until (M in [1..10]) and (N in [1..10]);
- Sector[M,N]:=3;
- If (screen=short) and (Damage[0]=0) then
- begin
- Cursor(1+(M*4),(N-1)*2+1);
- ColorCharacter(3);
- end; {If screen=short then plot moves}
- end; {if2}
- end; {if 1}
- end; {if}
- end; {for I}
- end; {for J}
- end;
-
- Procedure Check_path(Direction,Distance:real;Sectx,Secty:integer;var K,L,Missed:Integer);
- Var
- J,M,N:integer;
- Posx, Posy, Delta_x, Delta_y, T : real;
- begin
- Delta_x:=Sin(Direction*0.523581);
- Delta_y:=-1*Cos(Direction*0.523581);
- Missed:=0;
- J:=0;
- While Missed=0 do
- begin {while}
- J:=J+1;
- Posx:=Sectx+Delta_x*J;
- Posy:=Secty+Delta_y*J;
- If Distance>0 Then
- begin {if1}
- K:=round(Delta_x*J);
- L:=round(Delta_y*J);
- T:=Fndistance(K,L,0,0);
- If T>=Distance Then Missed:=-1;
- End; {if1}
- If (Posx<1) or (Posx>10) or (Posy<1) or (Posy>10) Then
- begin {if1}
- If (Posx<0.98) or (Posx>10.02) or (Posy<0.98) or (Posy>10.02) Then Missed:=-1;
- If Posx<1 Then Posx:=1;
- If Posy<1 Then Posy:=1;
- If Posx>10 Then Posx:=10;
- If Posy>10 Then Posy:=10;
- end; {if1}
- K:=round(PosX);
- L:=round(PosY);
- If (Sector[K,L]>0)
- And ((Abs(Sectx-PosX)>0.5) Or (Abs(Secty-PosY)>0.5)) Then
- Begin {if}
- if (SectorX=SectX) and (SectorY=SectY) then
- begin {if}
- Missed:=Sector[K,L];
- end {if}
- else
- begin {else}
- case Sector[K,L] of
- 1:Missed:=Sector[K,L];
- 4:Missed:=Sector[K,L];
- 5:Missed:=Sector[K,L];
- end; {case}
- end; {else}
- End {if}
- Else
- Begin {else}
- If (Screen=short) and (damage[0]=0) and ((SectorX<>K) and (SectorY<>L)) then
- begin {if screen=short}
- M:=K*4+1;
- N:=1+(L-1)*2;
- Cursor(M,N);
- write('Θ');
- wait(0.125);
- Cursor(M,N);
- If ((M Mod 4)=1) and ((N Mod 2)=1) Then write('.') else write(' ');
- end; {if screen=short}
- End; {Else}
- End; {while}
- end;
-
-
- Procedure Mover(Sectorx,Sectory,EndSecX,EndSecY,I:integer);
- begin
- If (Screen=short) and (Damage[0]=0) then
- begin
- Cursor(1+(Sectorx*4),(Sectory-1)*2+1);
- ColorCharacter(0);
- Cursor(1+(EndSecX*4),(EndSecY-1)*2+1);
- ColorCharacter(I);
- end; {If Screen=short then plot moves}
- Sector[Sectorx,Sectory]:=0;
- Sector[EndSecX,EndSecY]:=I;
- end;
-
- Procedure Klingon_attack;
- var
- I,J,K,L,M,N,O,P,Q,Missed : integer;
- begin
- If Level>4 Then Attackers(2*Level);
- Total_hits:=0;
- For I:=1 To 10 do
- begin {for I}
- For J:=1 To 10 do
- begin {for J}
- If (Sector[J,I]=2) Or (Sector[J,I]=3) Then
- begin {If Klingons then attack}
- L:=random(100);
- If (L>30) Or (Level>4) Then
- begin {if2}
- Direction:=Arctan((Sectorx-J)/(I-Sectory+1E-10))/(0.523581);
- If I<Sectory Then Direction:=Direction+6;
- If Direction<0 then direction:=direction+12;
- Check_path(Direction,0,J,I,P,Q,Missed);
- If Missed=5 then
- begin {Missed=5}
- Fire_power:=501.0/Fndistance(Sectorx,Sectory,J,I);
- If Sector[J,I]=3 Then Fire_power:=Fire_power*3;
- If Shield_status=1 Then Shield_strength:=Shield_strength-Fire_power/50.0;
- If Shield_strength<0 Then Shield_strength:=0;
- If Shield_status=1 Then Fire_power:=Fire_power*(1-(Shield_strength/100.0));
- {If Com=6 Then Fire_power:=Fire_power*1.5;}
- If Docked=False Then Fire_power:=Fire_power*Level*0.15;
- Energy:=Energy-round(Fire_power);
- Total_hits:=Total_hits+Fire_power;
- Erase_bottom (2,23);
- writeln('You lost ',Trunc(Fire_power),' giga ergs from the Klingon attacking at ',J,',',I,'.');
- if screen<=fix then score_board;
- wait(WaitInterval);
- K:=random(150+Trunc(fire_power));
- If Fire_power>K Then
- begin
- K:=Random(7);
- Damage[K]:=abs((Ln(Fire_power)*Random)/20.0)+Damage[K];
- If Damage[K]<1E-02 Then Damage[K]:=0;
- If Damage[K]>0 then
- begin
- Erase_bottom (2,23);
- writeln('Klingon attack damaged ',Device[K]);
- If K=6 Then
- begin
- Shield_status:=0;
- end; {if K=6}
- Wait(WaitInterval);
- end; {if Damage[K]>0}
- end; {if Fire_power>K}
- end {If Missed=5}
- else {If Missed=5}
- begin
- Erase_bottom (2,23);
- writeln('The Klingon attacking at ',J,',',I,' missed.');
- wait(WaitInterval);
- end; {Else If Missed=5}
- end; {if2}
- L:=random(100);
- If ((L<5) and (Fire_Power<100) and (Level>3)) or ((Missed<>5) and (Level>1)) then
- begin
- Spiral(SectorX,SectorY,M,N);
- If (M in [1..10]) and (N in [1..10]) then Mover(J,I,M,N,Sector[J,I]);
- end; {If Missed or Small Hit Then Move Klingons}
- end; {If Klingons then attack}
- end {for J};
- end {for I};
- Erase_bottom (2,23);
- If Total_hits>0 Then writeln('You lost ',Trunc(Total_hits),' giga ergs from the Klingon attack.');
- If Level>2 Then Attackers(2*Level);
- If screen<=fix then Score_board;
- end;
-
- Procedure Sector_travel;
- begin
- Mover(Sectorx,Sectory,EndSecX,EndSecY,5);
- Sectorx:=EndSecX;
- Sectory:=EndSecY;
- If Level>3 Then Attackers(2*Level);
- if screen<=fix then Score_board;
- If Fnenemy(Quadrant[Quadx,Quady]) Then Klingon_attack;
- end;
-
- Procedure Quadrant_travel;
- var
- I : integer;
- begin
- If (Fnenemy(Quadrant[Quadx,Quady])) and (Level>1) Then Klingon_attack;
- Quadx:=EndQuadX;
- Quady:=EndQuadY;
- Sectorx:=EndSecX;
- Sectory:=EndSecY;
- Create_sector;
- If Damage[0]=0 then
- begin
- short_range;
- end {If Damage[0]=0}
- else
- begin {else}
- Screen_erase;
- screen:=short;
- damaged(0);
- Score_board;
- end; {else}
- If (Level>2) And (Fntotalklingons(Quadrant[Quadx,Quady])>0) Then Attackers(2*level);
- If Fnenemy(Quadrant[Quadx,Quady]) and (Level>4) Then Klingon_attack;
- If (Warp>6) Then
- begin {If1}
- I:=random(150);
- If I<(Warp*Distance) Then
- begin {if2}
- Damage[2]:=Random*Warp;
- Erase_bottom (2,23);
- writeln('Warp drive is damaged from high speed.');
- wait(WaitInterval);
- end; {if2}
- end; {if1}
- end;
-
- Procedure New_location;
- begin
- Docked:=False;
- If (Quadx=EndQuadX) And (Quady=EndQuadY) Then Sector_travel else Quadrant_travel;
- end;
-
- Procedure Destination;
- var x,y : real;
- begin
- Delta_x:=Distance*Sin(Direction*0.523581);
- Delta_y:=-Distance*Cos(Direction*0.523581);
- X:=Delta_x+Sectorx/10.0+Quadx;
- Y:=Delta_y+Sectory/10.0+Quady;
- EndQuadX:=Trunc(X);
- EndQuadY:=Trunc(Y);
- EndSecX:=Round(Frac(X)*10);
- EndSecY:=Round(Frac(Y)*10);
- If EndSecX<1 Then
- begin
- EndQuadX:=EndQuadX-1;
- EndSecX:=10;
- end;
- If EndSecY<1 Then
- begin
- EndQuadY:=EndQuadY-1;
- EndSecY:=10;
- end;
- If EndSecX>10 Then
- begin
- EndQuadX:=EndQuadX+1;
- EndSecX:=1;
- end;
- If EndSecY>10 then
- begin
- EndQuadY:=EndQuadY+1;
- EndSecY:=1;
- end;
- end;
-
- Procedure DirectionDistance(Var Direction,Distance : real; var OK : Boolean);
- begin
- Repeat
- Erase_bottom (2,22);
- If CommandNumber=3 then write('For warp travel');
- If CommandNumber=4 then write('For impulse travel');
- write(' enter direction, distance: ');
- Read(CommandLine);
- Get_numbers(Numbers);
- Direction:=Numbers[1];
- Distance:=Numbers[2];
- Until ((Direction>=0) and (Direction<=12) and (Distance>=0.1)) or ((Direction<=0) and (Distance<=0));
- If (Direction<=0) and (Distance<=0) Then OK:=False Else OK:=True;
- end;
-
- Procedure LeaveGalaxy(Var OK : Boolean);
- begin
- If (EndQuadX>10) Or (EndQuadY>10) Or (EndQuadX<1) Or (EndQuadY<1) Then
- begin {if}
- Erase_bottom (2,23);
- writeln('You can`t leave the galaxy.');
- wait(WaitInterval);
- OK:=False;
- end {if}
- end;
-
- Procedure Warp_drive;
- begin
- Energy:=Energy-round((Distance*Warp*10.0)+100+Distance*Warp*10*Shield_status);
- cursor(1,24);
- Time_left:=Time_left-Distance*(1.5/(Warp*Warp));
- Stardate:=Stardate+Distance*(1.5/(Warp*Warp));
- New_location;
- end;
-
- Procedure Set_warp;
- var I,J : integer;
- begin
- Erase_bottom (2,22);
- write('Set warp speed to? ');
- read(trm,Command1);
- Val(Command1,I,J);
- Erase_bottom (2,23);
- If (I<1) Or (I>10) Then
- begin {if1}
- writeln('The Enterprise won`t go that fast.');
- end; {if1}
- Warp:=I;
- If Warp<=6 Then writeln('Warp speed set to ',I,'.');
- If Warp>6 Then writeln('A warp speed of ',I,' may damage the drive.');
- If screen<=fix then Score_board;
- wait(waitinterval);
- end;
-
- Procedure PlotGalaxy;
- var I,J, X, Y : integer;
- begin
- For J:=1 To 10 do
- begin {for J}
- write(J:2);
- For I:=1 To 10 do
- begin {for I}
- If Fnscanned(Quadrant[I,J]) then
- begin {if}
- if Fnenemy(Quadrant[I,J]) then textcolor(red);
- write((Fntotalklingons(Quadrant[I,J])):3);
- write(Fnbase(Quadrant[I,J]),Fnstars(Quadrant[I,J]),' ');
- textcolor(yellow);
- end {if}
- else
- begin {else}
- If Fnbase(Quadrant[I,J])>0 Then write(' .1. ') else write(' ... ');
- end; {else}
- end; {for I}
- writeln('');
- writeln('');
- end; {for J}
- writeln(' 1 2 3 4 5 6 7 8 9 10');
- X:=Quadx*6;
- Y:=Quady*2-2;
- Cursor(X,Y+2);
- writeln('=');
- If Y>1 Then
- begin {if1}
- Cursor(X,Y);
- writeln('=');
- end; {if1}
- Cursor(X-3,Y+1);
- writeln('|');
- Cursor(X+2,Y+1);
- writeln('|');
- end;
-
- Procedure Galaxy;
- begin
- Screen:=chart;
- Screen_erase;
- PlotGalaxy;
- end;
-
- Procedure LongGrid;
- var I,J : integer;
- begin
- writeln('LONG RANGE SCAN FROM QUADRANT ',Quadx,',',Quady,'.');
- writeln('');
- writeln('');
- For J:=(Quady-1) To (Quady+1) do
- begin {for J}
- if (J>0) and (J<11) then
- write(' ',J:2)
- else
- write(' ');
- For I:=(Quadx-1) To (Quadx+1) do
- begin {for I}
- If (I<1) Or (J<1) Or (I>10) Or (J>10) Then
- write( ' ')
- else
- begin {else}
- if Fnenemy(Quadrant[I,J]) then textcolor(red);
- write( ' ',(Fntotalklingons(Quadrant[I,J])):2);
- write(Fnbase(Quadrant[I,J]),Fnstars(Quadrant[I,J]));
- Quadrant[I,J]:=Quadrant[I,J] or 1024;
- textcolor(yellow);
- end; {else}
- end; {for I};
- writeln('');
- writeln('');
- writeln('');
- end; {for J}
- write(' ');
- for I:=-1 to 1 do
- begin {for I}
- if ((Quadx+I)>0) and ((Quadx+I)<11) then
- write(' ',(Quadx+I):2)
- else
- write(' ');
- end; {for I}
- end;
-
- Procedure Long_Range;
- begin
- Screen_erase;
- screen:=long;
- LongGrid;
- Score_board;
- end;
-
- Procedure Congradulations;
- begin
- Screen_erase;
- Cursor(28,4);
- writeln('CONGRATULATIONS CAPTAIN!!');
- Cursor(21,11);
- writeln('THE KLINGON THREAT HAS BEEN ELIMINATED.');
- end;
-
- Procedure Struck(X,Y:Integer);
- begin
- If Sector[X,Y] in [2,3] then
- begin
- Klingons:=Klingons-1;
- Time_left:=Time_left+(0.03)*(Total_klingons/(Klingons+1));
- If Sector[X,Y]=2 Then Quadrant[Quadx,Quady]:=Quadrant[Quadx,Quady]-1;
- If Sector[X,Y]=3 Then Quadrant[Quadx,Quady]:=Quadrant[Quadx,Quady]-16;
- if (Damage[0]=0) and (screen=short) then
- begin
- Cursor(1+(X*4),(Y-1)*2+1);
- writeln('.');
- end;
- Erase_bottom (2,23);
- If SoundOn and (Sector[X,Y] in [2,3]) then explosion;
- If Sector[X,Y]=2 Then write('You eliminated the Klingon ship with a ');
- If Sector[X,Y]=3 Then write('You eliminated the Klingon commander with a ');
- If CommandNumber=5 then write( trunc(Fire_power),' giga erg hit.');
- If CommandNumber=6 then write('torpedo.');
- Sector[X,Y]:=0;
- end {If Sector[X,Y] in [2,3]}
- else
- begin {else}
- Erase_bottom (2,23);
- If Sector[X,Y]=1 Then write('You hit a star!!');
- If Sector[X,Y]=4 Then
- begin {If a base}
- write('You destroyed a Federation base!');
- Cursor(1+(X*4),(Y-1)*2+1);
- writeln('.');
- Sector[X,Y]:=0;
- Quadrant[Quadx,Quady]:=Quadrant[Quadx,Quady] and 1279;
- end; {If a base}
- end; {else}
- wait(WaitInterval);
- end;
-
- Procedure Miss(EndSecX,EndSecY:integer);
- begin
- Cursor(1+(EndSecX*4),(EndSecY-1)+1);
- Erase_bottom (2,23);
- If Sector[EndSecX,EndSecY]=0 Then writeln('You fired into empty space!');
- If Sector[EndSecX,EndSecY]=1 Then writeln('You hit a star!');
- If (Sector[EndSecX,EndSecY]=2) Or (Sector[EndSecX,EndSecY]=3) Then
- writeln('A ',trunc(Fire_power),' giga erg hit failed to break the Klingon`s screen');
- If Sector[EndSecX,EndSecY]=4 Then writeln('You hit your own base!');
- Wait(WaitInterval);
- end;
-
- Procedure AskPhasers(var OK : Boolean);
- begin
- Erase_bottom (2,22);
- write('Enter direction,energy. ');
- read(CommandLine);
- Get_numbers(Numbers);
- Direction:=Numbers[1];
- Fire_power:=Numbers[2];
- If (Direction<0) Or (Direction>12) Then OK:=False;
- If Fire_power<1 Then OK:=False;
- end;
-
- Procedure Phasers;
- var
- x,y,z : real;
- I,J,Missed : Integer;
- begin
- Energy:=Energy-round(Fire_power);
- Check_path(Direction,0,Sectorx,Sectory,I,J,Missed);
- Fire_power:=(5/(Fndistance(Sectorx,Sectory,I,J)+0.001))*Fire_power;
- If((Fire_power>=500) And (Sector[I,J]=2)) Or ((Fire_power>=1500) And (Sector[I,J]=3)) Then
- Struck(I,J)
- Else
- Miss(I,J);
- Klingon_attack;
- end;
-
- Procedure AskDirections(var OK:Boolean);
- var I : integer;
- begin
- Erase_bottom (2,22);
- Cursor(2,23);
- write('You may fire ');
- If Torpedoes>3 then I:=3 else I:=torpedoes;
- If I>1 Then write('up to ',I,' torpedoes.') Else Write('1 torpedoe.');
- Cursor(2,22);
- write('Directions to fire? ');
- read(CommandLine);
- Get_numbers(Numbers);
- If Numbers[1]<0 Then OK:=False;
- end;
-
- Procedure FireTorpedoes;
- var
- x,y,z : real;
- I,P,Q,Missed : integer;
- begin
- For I:=1 To 3 do
- begin {for I}
- If (Numbers[I]>=0) and (Numbers[I]<=12) then
- begin {if}
- If Torpedoes<1 Then
- begin {if}
- Erase_bottom (2,23);
- writeln('You have no more torpedoes');
- wait(WaitInterval);
- end {if}
- else
- begin {else}
- Torpedoes:=Torpedoes-1;
- Check_path(Numbers[I],0,Sectorx,Sectory,P,Q,Missed);
- If Missed=-1 Then Miss(P,Q) else Struck(P,Q);
- end; {else}
- end; {if}
- end; {for I}
- Klingon_attack;
- end;
-
- Procedure Dock;
- var I, J : integer;
- begin
- For J := Sectory-1 To Sectory+1 do
- begin {for J}
- For I:=Sectorx-1 To Sectorx+1 do
- begin {for I}
- If (I in [1..10]) and (J in [1..10]) Then
- begin
- If Sector[I,J]=4 Then Docked:=True;
- end; {if}
- end; {for I}
- end; {for J}
- If Docked Then
- begin {if}
- Energy:=5000;
- Torpedoes:=10;
- Shield_strength:=100;
- Erase_bottom (2,23);
- writeln('Enterprise docked at starbase.');
- If screen<=fix then Score_board;
- end {if}
- Else
- begin {else}
- Erase_bottom (2,23);
- writeln('Enterprise not adjacent to starbase.');
- end; {else}
- Wait(WaitInterval);
- end;
-
- Procedure Impulse;
- var
- P,Q,Missed : integer;
- begin
- Cursor(1+(Sectorx)*4,(Sectory-1)*2+1);
- writeln('. ');
- Check_path(Direction,Distance*10,Sectorx,Sectory,P,Q,Missed);
- If Missed>0 Then
- begin {if}
- Erase_bottom (2,23);
- writeln('Safety system stops collision.');
- Wait(WaitInterval);
- EndSecX:=Sectorx;
- EndSecY:=Sectory;
- EndQuadX:=Quadx;
- EndQuadY:=Quady;
- end; {if}
- Energy:=Energy-round(Distance*250);
- Time_left:=Time_left-0.05*Distance;
- Stardate:=Stardate+Distance*0.05;
- New_location;
- end;
-
- Procedure Damage_numbers;
- var I, Y : integer;
- begin
- For I:=0 To 7 do
- begin {for I}
- Y:=I*2+6;
- Cursor(30,Y);
- textcolor(Red);
- If (Damage[I]>0) And (Docked=False) Then writeln(Damage[I]:3:3);
- If (Damage[I]>0) And (Docked) Then writeln((Damage[I]/10):3:3);
- textcolor(Yellow);
- If Damage[I]=0 Then writeln(' OK ');
- end; {for I}
- end;
-
- Procedure DamageInformation;
- var I : integer;
- begin
- writeln('');
- writeln(' DAMAGE REPORT');
- writeln('');
- writeln('System Repair Time');
- writeln('');
- For I:=0 To 7 do
- begin {for I}
- If Damage[I]>0 then textcolor(red);
- writeln(Device[I]);
- textcolor(yellow);
- writeln('');
- end; {for I}
- Damage_numbers;
- end;
-
- Procedure Damage_Report;
- begin
- Screen_erase;
- Screen:=fix;
- DamageInformation;
- Score_board;
- end;
-
- Procedure RepairTime(var T:real);
- var i : integer;
- begin
- Erase_bottom (2,22);
- write('Work on repairs for how long? ');
- read(CommandLine);
- If CommandLine='' Then CommandLine:='0';
- Val(CommandLine,T,I);
- Erase_bottom (2,23);
- end;
-
- Procedure DoRepairs(T:real);
- var
- I : integer;
- begin
- If Fnenemy(Quadrant[Quadx,Quady]) Then T:=0.01+Random*0.2;
- Time_left:=Time_left-T;
- Stardate:=Stardate+T;
- If Docked Then T:=T*10;
- For I:=0 To 7 do
- begin {for I}
- Damage[I]:=Damage[I]-T;
- If Damage[I]<0.01 Then Damage[I]:=0;
- end; {for I}
- If Fnenemy(Quadrant[Quadx,Quady]) Then
- begin {if}
- writeln('Repairs interrupted by Klingon attack.');
- Klingon_attack;
- end
- Else
- writeln('Repairs worked on for time ordered.');
- If screen=fix then Damage_report;
- If screen<fix then Score_board;
- end;
-
- Procedure Repair;
- var
- i : integer;
- t : real;
- begin
- RepairTime(t);
- If T>0 Then DoRepairs(T);
- end;
-
- Procedure HelpText;
- begin
- writeln('SR=Short range scan MO=Warp drive PH=Phasers RE=Repair DO=Dock');
- writeln('LR=Long range scan WA=Warp speed PT=Torpedoes SU=Shields up');
- writeln('CH=Chart of Galaxy IM=Impulse drive DA=Damage report SD=Shields down');
- end;
-
- Procedure TitleText;
- begin
- Screen_erase;
- Cursor(20,4);
- writeln('STARTREK');
- Cursor(20,6);
- writeln('Public Domain Version to Copy and Enjoy');
- Cursor(20,8);
- writeln('by');
- Cursor(20,10);
- writeln('David E. Trachtenbarg.');
- end;
-
- procedure HelpProgram;
- var
- Command : char;
- ContinueHelp : Boolean;
-
-
- Procedure Intro;
- begin
- Screen_erase;
- writeln('Introduction'); writeln('');
- writeln('After 50 years of peace between the Federation and the Klingon empire');
- writeln('open war has been declared. As the commander of the starship Enterprise,');
- writeln('your mission is to eliminate the Klingon threat and restore peace to the');
- writeln('Federation. To ensure peace every Klingon ship must be destroyed. You');
- writeln('currently have five stardates to accomplish your mission. More time may');
- writeln('be allowed if you are successful. Good luck commander. The fate of the');
- writeln('Federation depends on you.');
- writeln('');
- writeln('When starting your command you will be asked to enter your level of');
- writeln('expertise. Level 1 is for rookies. Level 5 is only for the most');
- writeln('experienced commanders.');
- end;
-
- Procedure Ch;
- begin
- Screen_erase;
- If Damage[7]=0 then PlotGalaxy else write('Ship computer has been damaged.');
- Cursor (1,5);
- tab(5); writeln(' This display is a chart of the galaxy. The galaxy is divided up');
- tab(5); writeln(' into a 10x10 grid of one-hundred different quadrants. If the');
- tab(5); writeln(' number of Klingons in a quadrant is not known, the quadrant will');
- tab(5); writeln(' be 3 dots (...) on the chart. If the number of Klingons in');
- tab(5); writeln(' a quadrant is known, a 3 digit number will appear on the chart');
- tab(5); writeln(' instead. The first digit is the number of Klingons, the second');
- tab(5); writeln(' digit is the number of Federation bases, and the third digit is the');
- tab(5); writeln(' number of stars in the quadrant. The position of the Enterprise is');
- tab(5); writeln(' indicated by a box around its position. Since the information for');
- tab(5); writeln(' the chart is stored in the ship`s computer, it can not be displayed ');
- tab(5); writeln(' if the computer is damaged. The chart command is `CH`. ');
- end;
-
- Procedure Lr;
- begin
- Screen_erase;
- If Damage[1]=0 then LongGrid else write('Long range sensors have been damaged');
- Cursor (1,15);
- writeln('This is a long range scan. The position of the Enterprise is');
- writeln('in the middle of the 3x3 grid. The same 3 digit system is');
- writeln('used for representing the number of Klingons, bases, and stars');
- writeln('in a quadrant as in the map of the galaxy. The quadrant numbers');
- writeln('are to the left of and below the grid. The long range sensor');
- writeln('command is `LR`.');
- end;
-
- Procedure Sr;
- begin
- Screen_erase;
- If Damage[0]=0 then Grid else write('Short range sensors have been damaged.');
- cursor(1,2);
- tab(45); writeln('This is a short range scan of');
- tab(45); writeln('a quadrant. Each quadrant is');
- tab(45); writeln('divided up into a 10x10 grid of');
- tab(45); writeln('one-hundred sectors. If a sector');
- tab(45); writeln('is empty you will see a dot on the');
- tab(45); writeln('display. Other symbols are E for');
- tab(45); writeln('Enterprise, B for Base, * for star,');
- tab(45); writeln('K for Klingon, and C for a Klingon');
- tab(45); writeln('commander. The short range sensor');
- tab(45); writeln('command is `SR`.');
- end;
-
- Procedure Score;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('This is Enterprise`s status display.');
- writeln('The time remaining is the total number of');
- writeln('Stardates left that you have to eliminate');
- writeln('the Klingon threat. You initially have');
- writeln('5 stardates, but may be given more time');
- writeln('as the number of Klingons decreases.');
- writeln('The number of Klingons listed is the');
- writeln('total number of Klingons remaining.');
- writeln('There will be a condition RED if the');
- writeln('Enterprise is under attack, otherwise');
- writeln('there will be condition GREEN.');
- Score_board;
- end;
-
- Procedure Wa;
- begin
- Screen_erase;
- Cursor (1,5);
- writeln('The command to change the warp speed is `WA`.');
- writeln('A warp speed above 6 may damage the warp drive.');
- writeln('The command to move using warp drive is `MO`.');
- writeln('After typing `MO` you will be asked to specify');
- writeln('A direction and distance. The distance is entered');
- writeln('like the numbers on a clock.');
- writeln('');
- writeln( ' 12');
- writeln( ' 9 1');
- writeln( ' 6');
- writeln('');
- writeln('The distance between two adjacent points in a');
- writeln('sector is .1, not 1. The direction and distance');
- writeln('are entered on one line separated by commas. For');
- writeln('example, 1.5,.1 is one possible combination.');
- Score_board;
- end;
-
- Procedure Im;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('The command for impulse drive is `IM`. Impulse drive is');
- writeln('slower than warp drive, but uses less energy for short');
- writeln('distances. You must enter a direction and distance');
- writeln('for impulse travel in the same way as they are entered');
- writeln('for warp travel.');
- end;
-
- Procedure Ph;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('The command for phasers is `PH`. Phasers use');
- writeln('pure energy. After entering the phaser');
- writeln('command you will be asked to enter the direction');
- writeln('of phaser fire and the amount of energy to use.');
- writeln('to use. The direction and energy should be');
- writeln('entered on one line separated by commas. ');
- writeln('Your remaining energy level is printed on the');
- writeln('status display.');
- Score_board;
- end;
-
- Procedure Pt;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('The command to fire photon torpedoes is `PT`.');
- writeln('Up to 3 photon torpedoes may be fired at once.');
- writeln('After the `PT` command the direction of');
- writeln('torpedoe travel must be entered. Enter');
- writeln('up to 3 directions separated by commas');
- writeln('to fire more than one torpedoe. The ');
- writeln('number of torpedoes you have left is');
- writeln('printed in the status display.');
- Score_board;
- end;
-
- Procedure Su;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('The command to bring up the shields is `SU`.');
- writeln('The command to bring down the shields is `SD`.');
- writeln('The current state of the shields is printed');
- writeln('on the status display.');
- Score_board;
- end;
-
- Procedure KlingonDescription;
- begin
- Screen_erase;
- Cursor (1,9);
- writeln('There are two types of Klingons. Regular and Klingon commanders.');
- writeln('The Klingon commanders are more powerful. When you start a tour of');
- writeln('command on the Enterprise you are asked to enter your skill level.');
- writeln('A higher skill level will entitle you to a more dangerous mission.');
- writeln('During these more dangerous missions the Klingons are much more');
- writeln('aggresive and will attempt to move as close as possible to your');
- writeln('your ship to attack.');
- end;
-
- Procedure Da;
- begin
- Screen_erase;
- DamageInformation;
- Cursor (1,7);
- tab(45); writeln('The damage report command is');
- tab(45); writeln('`DA`. Repairs are 10 times');
- tab(45); writeln('faster while docked at a ');
- tab(45); writeln('starbase. ');
- end;
-
- Procedure Base;
- begin
- Screen_erase;
- Cursor (1,11);
- writeln('If you are adjacent to a starbase type `DO` to dock. Your supply');
- writeln('of energy and photon torpedoes will then be replenished.');
- end;
-
- Procedure Qg;
- begin
- Screen_erase;
- Cursor (1,11);
- writeln('The command to surrender is `QG` (for quit game). Of course the');
- writeln('Federation will be lost if you do this.');
- end;
-
- Procedure He;
- begin
- Screen_erase;
- Cursor (1,7);
- writeln('The command for help is `HE`. After typing this the short');
- writeln('list of commands displayed below will be printed.');
- Cursor(1,17);
- HelpText;
- end;
-
- Procedure Help_index;
- begin
- Screen_erase;
- writeln('');
- tab(28);
- writeln('HELP INDEX');
- writeln('');
- tab(28); writeln('A. Introduction');
- tab(28); writeln('B. The galaxy');
- tab(28); writeln('C. Long range scanner');
- tab(28); writeln('D. Short range sensors');
- tab(28); writeln('E. Ship status');
- tab(28); writeln('F. Warp Drive');
- tab(28); writeln('G. Impulse Drive');
- tab(28); writeln('H. Phasers');
- tab(28); writeln('I. Photon torpedoes');
- tab(28); writeln('J. Shields');
- tab(28); writeln('K. Klingons');
- tab(28); writeln('L. Damage and repairs');
- tab(28); writeln('M. Starbases');
- tab(28); writeln('N. Surrendering');
- tab(28); writeln('O. Help');
- textcolor(LightBlue);
- tab(28); writeln('P. Resume command');
- textcolor(Yellow);
- repeat
- Erase_bottom (23,21);
- write('Enter the letter of your choice. ');
- Read(KBD,Command);
- Command:=UpCase(Command);
- Write(Command);
- until command in ['A'..'P'];
- end;
-
- Procedure Query;
- var com : char;
- begin
- repeat
- Erase_bottom (28,24);
- writeln('Press RETURN to go on.');
- Cursor (28,25);
- write('or `I` for main index. ');
- read(KBD,Com);
- com:=UpCase(Com);
- If Com<>Char(13) then write(Com);
- If Com='I' Then Command:='*';
- If Com=Chr(13) Then
- begin {if}
- Command:=Chr(ORD(Command)+1);
- If command>'O' then command:='*';
- end; {if}
- until (com='I') or (Com=Char(13));
- end;
-
- procedure BranchRoutine;
- begin
- case command of
- 'A': Intro;
- 'B': Ch;
- 'C': LR;
- 'D': Sr;
- 'E': Score;
- 'F': Wa;
- 'G': Im;
- 'H': Ph;
- 'I': Pt;
- 'J': Su;
- 'K': KlingonDescription;
- 'L': Da;
- 'M': Base;
- 'N': Qg;
- 'O': He;
- 'P': ContinueHelp:=False;
- end; {case}
- If (command<>'*') And ContinueHelp then query;
- end;
-
- begin
- ContinueHelp:=True;
- Command:='*';
- while ContinueHelp do
- begin
- If command='*' then Help_index else BranchRoutine;
- end; {while}
- Screen_erase;
- case Screen of
- short:If Damage[0]=0 then Short_range else Damaged(0);
- long:If Damage[1]=0 then Long_range else Damaged(1);
- fix:Damage_report;
- chart:If Damage[7]=0 then Galaxy else Damaged(7);
- titlepage:TitleText;
- else
- If Damage[0]=0 then Short_range else Damaged(0);
- end; {case}
- end;
-
- Procedure Help;
- var
- command1 : char;
- begin
- Erase_bottom (1,22);
- HelpText;
- repeat
- Erase_bottom (14,25);
- write('Press RETURN to go on OR `H` for more help. ');
- read(KBD,Command1);
- Command1:=UpCase(Command1);
- If Command1<>Char(13) then write(Command1);
- until (command1='H') or (Command1=Char(13));
- If command1='H' then HelpProgram;
- end;
-
- Procedure Shields_up;
- begin
- Erase_bottom (2,23);
- writeln('SHIELDS RAISED.');
- Shield_status:=1;
- Energy:=Energy-50;
- If screen<=fix then Score_board;
- wait(waitinterval);
- end;
-
- Procedure Shields_down;
- begin
- Erase_bottom (2,23);
- writeln('SHIELDS LOWERED.');
- Shield_status:=0;
- if screen<=fix then Score_board;
- wait(waitinterval);
- end;
-
- Procedure Enter_command;
- Var
- Com : Integer;
- Command1, Command2 : Char;
- Command12 : String[2];
- begin
- Erase_bottom (1,22);
- write('Command: ');
- read(kbd,Command1);
- Command1:=UpCase(Command1);
- write(Command1);
- read(kbd,Command2);
- Command2:=UpCase(Command2);
- write(Command2);
- Command12:=Command1+Command2;
- Com:=Pos(Command12,'SRLRMOIMPHPTSUCHSDDAREWAQGHEDO');
- If Com<>0 Then Com:=(Com+2) Div 2;
- CommandNumber:=Com;
- case com of
- 1: begin {Short Range Scanner 0}
- if Damage[0]=0 then
- begin {if}
- Short_range;
- end {if}
- else
- begin {else}
- damaged(0);
- end; {else}
- end;
- 2: begin {Long Range Scanner 1}
- if Damage[1]=0 then
- begin {if}
- Long_range;
- end {if}
- else
- begin {else}
- damaged(1);
- end; {else}
- end;
- 3: begin {Warp Drive 2}
- If Damage[2]=0 then
- begin {if}
- OK:=True;
- end {if}
- else
- begin {else}
- damaged(2);
- OK:=False;
- end; {else}
- If OK then DirectionDistance(Direction,Distance,OK);
- If OK and (Energy<round(Distance*Warp*10+100+Distance*Warp*10*Shield_status)) Then
- begin {if}
- Not_enough;
- OK:=False;
- end; {if}
- If OK then
- begin
- Destination;
- LeaveGalaxy(OK);
- end;
- If OK and (Sector[EndSecX,EndSecY]>0) and (EndQuadX=QuadX) and (EndQuadY=QuadY) Then
- begin
- OK:=False;
- GameDone:=True;
- Collision(Sector[EndSecX,EndSecY]);
- end;
- If OK then Warp_drive;
- end;
- 4: begin {Impulse Drive 3}
- If Damage[3]=0 then
- begin {if}
- OK:=True;
- end {if}
- else
- begin {else}
- damaged(3);
- OK:=False;
- end; {else}
- If OK then DirectionDistance(Direction,Distance,OK);
- If Energy<round(Distance*250) Then
- begin {if}
- Not_enough;
- OK:=False;
- end; {if}
- If OK then
- begin
- Destination;
- LeaveGalaxy(OK);
- end;
- If OK then Impulse;
- end;
- 5: begin {Phasers 4}
- if Damage[4]=0 then
- begin {if}
- OK:=true;
- end {if}
- else
- begin {else}
- damaged(4);
- OK:=False;
- end; {else}
- If OK then AskPhasers(OK);
- If OK AND (round(Fire_power)>Energy) Then
- begin {if}
- Not_enough;
- OK:=False;
- end; {if}
- If OK then Phasers;
- end;
- 6: begin {Photon Torpedoes 5}
- if Damage[5]=0 then
- begin {if}
- OK:=True
- end {if}
- else
- begin {else}
- damaged(5);
- OK:=False;
- end; {else}
- If Torpedoes<1 then
- begin {if1}
- Erase_bottom (2,23);
- writeln('You have no torpedoes');
- wait(WaitInterval);
- OK:=False;
- end; {if}
- If OK then AskDirections(OK);
- If OK then Firetorpedoes;
- end;
- 7: begin {Raise Shields 6}
- if Damage[6]=0 then
- begin {if}
- OK:=True;
- end {if}
- else
- begin {else}
- damaged(6);
- end; {else}
- If Shield_status=1 Then
- begin
- erase_bottom(2,23);
- writeln('Shields already up.');
- wait(WaitInterval);
- OK:=False;
- end; {If Shield_Status=1}
- If Energy<=50 Then
- begin
- erase_bottom(2,23);
- writeln('Not enough energy to raise shields.');
- wait(WaitInterval);
- OK:=False;
- end; {If Energy<50}
- If OK then Shields_Up;
- end;
- 9: begin {Lower Shields 6}
- if Damage[6]=0 then
- begin {if}
- OK:=True;
- end {if}
- else
- begin {else}
- damaged(6);
- end; {else}
- If Shield_status=0 Then
- begin
- erase_bottom(2,23);
- writeln('Shields already down.');
- wait(WaitInterval);
- OK:=False;
- end; {If Shield_Status=0}
- If OK Then Shields_Down;
- end;
- 8: begin {Map of Galaxy 7}
- if Damage[7]=0 then
- begin {if}
- Galaxy;
- end {if}
- else
- begin {else}
- damaged(7);
- end; {else}
- end;
- 10: begin {Damage Report}
- damage_report;
- end;
- 11: begin {Repair Ship}
- repair;
- end;
- 12: begin {Set Warp Speed 2}
- if Damage[2]=0 then
- begin {if}
- Set_warp;
- end {if}
- else
- begin {else}
- damaged(2);
- end; {else}
- end;
- 13: begin {Quit Game}
- GameDone:=True;
- no_time;
- end;
- 15: begin {Attempt to dock}
- dock;
- end;
- 14: begin {Help Section}
- help;
- end
- else
- begin {else}
- If (command2<>Chr(8)) and (command2<>Chr(13)) then
- begin
- Erase_bottom (2,23);
- writeln('Type "HELP" for a list of commands.');
- wait(WaitInterval);
- end; {Command2<>chr(8)}
- end; {else}
- end; {case}
- If Klingons=0 Then
- begin
- GameDone:=True;
- Congradulations;
- end;
- If (GameDone=False) and (Energy<0) then
- begin
- GameDone:=True;
- No_energy;
- end; {Energy<0}
- If (GameDone=False) and (Time_left<0) Then
- begin
- GameDone:=True;
- No_time;
- end; {If Time_left<0}
- end;
-
- Procedure Title;
- var
- I:Integer;
- Lev:Char;
- begin
- Screen:=TitlePage;
- TitleText;
- repeat
- Erase_bottom(28,16);
- writeln(' Press `H` for HELP');
- Tab(28); writeln(' or');
- Tab(28); write('Enter your expertise level (1-5): ');
- Read(KBD,LEV);
- Val(Lev,Level,I);
- If Lev in ['H','h'] then
- begin
- Screen_erase;
- cursor(28,12);
- write('Preparing help section....');
- level:=1;
- Initialize;
- Create_universe;
- Create_sector;
- HelpProgram;
- end;
- until level in [1..5];
- Erase_bottom (28,23);
- writeln('Creating the universe.');
- Initialize;
- Create_universe;
- Create_sector;
- Short_range;
- end;
-
- begin {trek}
- repeat
- title;
- repeat
- enter_Command;
- until GameDone;
- AnotherGame(ReadyToStop);
- until ReadyToStop;
- end. {trek}