%EXTERNALROUTINE STARWARS
%EXTERNALROUTINESPEC PROMPT(%STRING (15) S)
%EXTERNALREALFNSPEC RANDOMREAL
%EXTERNALREALFNSPEC CPUTIME
%INTEGER CH, F, S, Z, FUEL, GF, GD, SFLAG
%REAL X, Y, H, T, C, G, A, V, SS, PROB, DAMAGE, Q, K, DA, DT, DC

%ROUTINE TEXT
%PRINTTEXT"
 THIS PROGRAM SIMULATES THE FINAL ATTACK ON THE DEATHSTAR BY REBEL
X-WING FIGHTERS.
 YOU ARE THE PILOT OF ONE OF THESE FIGHTERS, AND MUST FLY YOUR CRAFT
DOWN A NARROW CHANNEL IN THE DEATHSTAR, AND ATTEMPT TO HIT A"
%PRINTTEXT"
VULNERABLE POINT WHICH HAS BEEN LOCATED ON THE STOLEN PLANS.
YOUR CRAFT'S TARGETING COMPUTER WILL DO ALL OF THE ACTUAL AIMING -
ALL YOU HAVE TO DO IS TO FLY AS CLOSE TO THE CENTRE OF THE CHANNEL,
AND AS LOW AS POSSIBLE."
%PRINTTEXT"
YOU CAN FIRE AT ANY TIME, BUT THE CLOSER TO THE TARGET, THE GREATER
THE CHANCE OF HITTING IT. IT IS, OF COURSE, IMPOSSIBLE TO
HIT THE TARGET UNLESS YOU ARE IN THE CHANNEL.
 YOUR CRAFT IS STEERED BY GIVING TURN AND CLIMB ANGLES. THESE MAY BE"
%PRINTTEXT"
POSITIVE OR NEGATIVE NUMBERS (FOR EXAMPLE, +5 SIGNIFIES A
CLIMB, WHILE -5 IS A DIVE)
THE EFFECT OF THESE CONTROLS IS CUMULATIVE, SO THAT -4 FOLLOWED
BY 12 HAS A NET EFFECT OF (+)8, EVEN IF ENTERED IN SEPARATE MOVES."
%PRINTTEXT"
 THE THROTTLE CONTROL IS OPERATED BY ENTERING AN ACCELERATION (IN
m/s/s).
THIS IS NOT A CUMULATIVE CONTROL - THE NEW ACCELERATION MERELY
REPLACES THE LAST ONE ENTERED. IF REQUIRED, A NEGATIVE ACCELERATION"
%PRINTTEXT"
CAN BE ENTERED TO SLOW THE CRAFT DOWN (OR FLY BACKWARDS, IF YOU
REALLY WANT TO)
 IT SHOULD BE NOTED THAT LARGE ACCELERATIONS OR VERY TIGHT TURNS
PRODUCE HIGH GEE-STRESSES. THIS MAY CAUSE THE PILOT (YOU!) TO BLACK-"
%PRINTTEXT"
OUT, LEAVING THE CRAFT OUT OF CONTROL. OR, IF VERY LARGE, MAY
CAUSE THE CRAFT TO BREAK UP.
 YOU CAN EXPECT TO BE SHOT AT BY ENEMY (BOO!) FIGHTERS WHILE YOU ARE
IN THE CHANNEL. THESE WILL ATTEMPT TO GET CLOSE BEHIND YOU SO THAT"
%PRINTTEXT"
THEIR COMPUTERS CAN ZERO IN ON YOU. SINCE YOU HAVE NO REAR-FIRING
WEAPONS, THE ONLY THING TO DO IS TO TAKE EVASIVE ACTION - SUDDEN"
%PRINTTEXT"
TURNS, ACCELERATIONS AND SO ON. IF REALLY DESPERATE, YOU CAN JETTISON
AND IGNITE SOME FUEL, AND HOPE THAT THE ENEMY FIGHTERS ARE TOO CLOSE"
%PRINTTEXT"
TO AVOID IT. THIS MANOEUVRE SHOULD NOT BE REPEATED TOO OFTEN, SINCE
WITHOUT FUEL YOU HAVE THE AERODYNAMIC PROPERTIES OF A FALLING BRICK.
 OUTSIDE THE CHANNEL, OR ABOVE THE LEVEL OF ITS SIDES, YOU MAY
BE SHOT AT BY GROUND-BASED LASER CANNON."
%PRINTTEXT"
YOU CAN SHOOT BACK AT THESE - BUT WITH LASERS, SINCE THE
PROTON TORPEDOES DESIGNED FOR THE MAIN TARGET HAVE NO EFFECT
ON THE HEAVILY ARMOURED LASER CANNON TURRETS.
KEEPING LOW AND FAST WILL AVOID HEAVY DAMAGE FROM GROUND"
%PRINTTEXT"
DEFENSES.
 IF HIT BY ENEMY FIRE, YOUR CRAFT MAY BE DAMAGED SERIOUSLY
ENOUGH TO SIGNIFICANTLY AFFECT HANDLING AND CONTROL. AFTER
BEING HIT, THE TOTAL AMOUNT OF DAMAGE INCURRED SO FAR IS GIVEN."
%PRINTTEXT"
THE AMOUNT OF DAMAGE DEPENDS ON HOW CLOSE THE TIE FIGHTERS
WERE AT THE TIME, OR HOW ACCURATE THE GROUND GUNNERS WERE,
WHICH DEPENDS ON HOW HARD YOU WERE TRYING TO AVOID THEM.
FOR EXAMPLE, IF YOU ARE FLYING STRAIGHT AND LEVEL AT ABOUT"
%PRINTTEXT"
100 M/S, ONE HIT CAN DO AS MUCH AS 30% DAMAGE. A FEW OF THOSE
AND YOU'RE DEAD.
 IF YOU OVERSHOOT THE TARGET, YOU CAN USE A SPECIALLY PROGRAMMED
HYPERSPACE GENERATOR, WHICH WILL TAKE THE CRAFT BACK TO THE START OF"
%PRINTTEXT"
THE ATTACK RUN, WITH NO TIME LAPSE."
%PRINTTEXT"
ONCE THE REQUIRED ACCELERATION, TURN, AND/OR CLIMB HAVE BEEN GIVEN,
THE PROMPT 'CONTROL?' SHOULD BE ANSWERED BY 'X' (FOR EXECUTE).
THE CRAFT WILL THEN PROCEED FOR 10 SECONDS WITH THE CONTROLS AS SET."
%PRINTTEXT"
(IT SHOULD BE REMEMBERED THAT FIRE, LASER, AND DUMP COMMANDS
ARE AUTOMATICALLY FOLLOWED BY AN EXECUTE COMMAND, SINCE YOUR
MAIN COMPUTER CAN ONLY DEAL WITH EITHER PILOTING OR AIMING"
%PRINTTEXT"
AT THE SAME TIME.)"
%PRINTTEXT"
THE COMMANDS AVAILABLE ARE AS FOLLOWS:
T-TURN
C-CLIMB
A-ACCELERATE"
%PRINTTEXT"
F-FIRE
D-DUMP FUEL BEHIND
J-HYPERSPACE JUMP TO START OF RUN
?-INFORMATION (LIST OF COMMANDS)"
%PRINTTEXT"
L-FIRE LASERS AT GROUND DEFENSES
I-DATA PRINTOUTS
S-STOP (COWARD!)
"
%PRINTTEXT"
THESE ARE ENTERED IN RESPONSE TO THE PROMPT 'CONTROL?'"
%PRINTTEXT"
AFTER ENTERING A, T OR C, YOU WILL BE PROMPTED FOR THE NUMERICAL
VALUE REQUIRED. (THEY NEED NOT BE WHOLE NUMBERS)"
%PRINTTEXT"

 YOU WILL BE ASKED TO ENTER A 'LUCKY' NUMBER. THIS IS SO THAT YOUR
NAV COMPUTER CAN START THE ATTACK RUN AT AN EFFECTIVELY RANDOM"
%PRINTTEXT"
POINT, WHICH WILL HELP AVOID BEING DETECTED BY FIGHTERS OR GROUND
DEFENSES."
%PRINTTEXT"
IDEAS, IMPROVEMENTS & CRITICISMS WELCOMED.
                                        STEVE GRAHAM CS2, 1/3/1978"
%END

   %ROUTINE LASER
      %IF GD = -1 %THEN PRINTSTRING('
NO TARGETS IN RANGE') %C
         %AND %RETURN
      %IF RANDOMREAL < 0.5 %THEN PRINTSTRING('
GROUND BASED LASER DESTROYED') %C
         %AND GD = -1 %ELSE PRINTSTRING('
GROUND DEFENSES STILL OPERATIONAL')
   %END

   %ROUTINE CRASH
SFLAG=1
      %IF CH = 1 %THEN %START
         %IF MOD(Y) > 25 %THEN PRINTSTRING('
COLLISION WITH CHANNEL WALL AT ' %C
            ) %ELSE %START
            %IF MOD(X) > 7500 %THEN PRINTSTRING("
YOU'VE JUST HIT THE END OF THE CHANNEL AT ")
         %FINISH
         %IF MOD(X) < 7500 %AND MOD(Y) < 25 %AND H < 0 %C
            %THEN PRINTSTRING('
IMPACTED WITH BOTTOM OF CHANNEL AT ')
      %FINISH %ELSE %START
         %IF H < 0 %THEN PRINTSTRING('
IMPACTED WITH SURFACE AT ')
      %FINISH
      PRINT(V,1,0)
      PRINTSTRING(' METRES/SECOND
YOU ARE DEAD. (AND A LOT THINNER)')
SFLAG=-1
   %END

   %ROUTINE DUMP
      FUEL = FUEL+1
      %IF FUEL >= 10 %THEN PRINTSTRING('
NO FUEL LEFT-ENGINES CUTTING OUT. CRASH IMMINENT') %C
         %AND H = -1 %AND CRASH
      %IF F = -1 %THEN PRINTSTRING('
NO FIGHTERS BEHIND - WASTE OF FUEL') %C
         %AND %RETURN
      %IF RANDOMREAL > 0.6 %THEN %START
         PRINTSTRING('
ENEMY FIGHTERS CAUGHT IN JETTISONED FUEL. ALL DESTROYED')
         F = -1
      %FINISH %ELSE %START
         PRINTSTRING('
FIGHTERS AVOIDED DUMPED FUEL. STILL BEHIND')
      %FINISH
   %END

   %ROUTINE XHIT
SFLAG=1
      DAMAGE = DAMAGE+(PROB/40)
      %IF DAMAGE > 1 %THEN PRINTSTRING('
            FATAL HIT BY ENEMY LASERS.
YOU ARE DEAD' %C
         ) %AND SFLAG=-1 %ANDRETURN
      PRINTSTRING('
HIT BY LASER FIRE. DAMAGE ')
      PRINT(DAMAGE*100,1,2)
      PRINTSTRING('%')
      %IF RANDOMREAL > 0.9 %THEN PRINTSTRING('
R2 UNIT ATTEMPTING REPAIRS')
   %END

   %ROUTINE FIRE
SFLAG=1
      %IF CH < 0 %THEN PRINTSTRING('
WASTING AMMUNITION!') %C
         %AND %RETURN
      %IF X*COS(T/57.29) < 0 %THEN PRINTSTRING('
TARGET PASSED') %C
         %AND %RETURN
      PROB = (1/(4+MOD(Y))+1/(4+MOD(X/200))+1/(4+H/10))
      %IF PROB+RANDOMREAL < 1 %THEN PRINTSTRING('YOU MISSED') %C
         %AND %RETURN %ELSE %START
         PRINTSTRING('
TARGET HIT')
         NEWLINE
         %IF PROB+RANDOMREAL+K < 1 %C
            %THEN PRINTSTRING(' HIT INEFFECTIVE') %C
            %AND K = K+0.1 %AND %RETURN
         PRINTSTRING( %C
            ' CHAIN REACTION INITIATED. DEATHSTAR DESTROYED.
CONGRATULATIONS-THE FORCE WAS WITH YOU' )
SFLAG=-1
      %FINISH
   %END

   %ROUTINE PRINTOUTS
      %IF CH > 0 %AND H<50 %THEN NEWLINE %C
         %AND PRINTSTRING('* IN CHANNEL') %AND NEWLINE
%IF CH>0 %AND H>50 %THEN NEWLINE %AND PRINTSTRING %C
('*OVER CHANNEL') %AND NEWLINE
      NEWLINE
      PRINTSTRING('RANGE TO TARGET ')
      PRINT(X,2,1)
      PRINTSTRING(' METRES
DISTANCE FROM AXIS OF CHANNEL ')
      PRINT(Y,2,1)
      PRINTSTRING(' METRES
HEIGHT ')
      PRINT(H,2,1)
      PRINTSTRING(' METRES
VELOCITY ')
      PRINT(V,2,1)
      PRINTSTRING(' METRES/SECOND        ACCELERATION ')
      PRINT(A,2,1)
      PRINTSTRING(' METRES/SEC/SEC
ORIENTATION(HORIZONTAL) ')
      PRINT(T,1,2)
      PRINTSTRING(' DEGREES   (VERTICAL) ')
      PRINT(C,1,2)
      PRINTSTRING(' DEGREES
STRESS ')
      PRINT(G,2,1)
      PRINTSTRING(' GEES')
      NEWLINE
   %END
BACK:
PROMPT('BRIEFING? (Y/N)')
READSYMBOL(S)
%IF S='Y' %THEN TEXT
  %IF S # 'Y' %AND S # 'N' %THEN -> BACK
   PROMPT('LUCKY NUMBER: ')
BAKK:
NEWLINE
   READ(Z)
%IF Z<1%THEN PRINTSTRING('
TOO SMALL') %AND -> BAKK
%IF Z>100 %THEN PRINTSTRING('
LESS THAN 100 PLEASE') %AND -> BAKK
Z=INT(FRACPT(CPUTIME)*Z)
%IF Z=0 %THEN Z=6
   %CYCLE S = 1,1,Z
      Q = RANDOMREAL
   %REPEAT
BEGIN:DAMAGE=0
FUEL=0
K=0
SFLAG=1
JUMP:
  GF = -1
  GD = -1
   G = 0
   V = 100
   T = 0
   C = 0
   A = 0
   F = -1
   CH = -1
   X = 30000*RANDOMREAL
   Y = 400*RANDOMREAL-200
   H = 200*RANDOMREAL
   PRINTOUTS
READ:

   DA = 1-(RANDOMREAL*DAMAGE/2)
   DT = 1-(RANDOMREAL*DAMAGE/2)
   DC = 1-(RANDOMREAL*DAMAGE/2)
   NEWLINE
   PROMPT('CONTROL? ')
   READSYMBOL(S)
   %IF S = 'J' %THEN PRINTSTRING('
HYPERSPACE JUMP TO START OF ATTACK RUN') %C
      %AND -> JUMP
   %IF S = 'A' %THEN PROMPT('ACCELERATION:') %AND READ(A)
   %IF S = 'B' %THEN TEXT
   %IF S = 'D' %THEN DUMP %AND -> START
   %IF S = 'T' %THEN %START
      PROMPT('TURN(DEG):')
      READ(Q)
      T = T+Q*DT
      %IF MOD(T) > 180 %THEN T = 57.29*ARCSIN(SIN(T/57.29))
   %FINISH
   %IF S = 'C' %THEN %START
      PROMPT('CLIMB(DEG):')
      READ(Q)
      C = C+Q*DC
      %IF MOD(C) > 180 %THEN C = 57.29*ARCSIN(SIN(C/57.29))
   %FINISH
   %IF S = 'I' %THEN PRINTOUTS
   %IF S = 'F' %THEN FIRE %AND -> START
   %IF S = 'X' %THEN -> START
   %IF S = 'L' %THEN LASER %AND -> START
   %IF S = 'S' %THEN %STOP
   %IF S = '?' %THEN PRINTSTRING('
Acceleration
Turn
Climb
Information
Fire
Dump
Jump
Laser
BRIEFING
eXecute
Stop')
   -> READ
START:

   SS = 10*V+50*A
   V = V+10*A*DA
   X = X-SS*COS(C/57.29)*COS(T/57.29)
   Y = Y+SS*COS(C/57.29)*SIN(T/57.29)
   H = H+SS*SIN(C/57.29)
   G = (A/10+V*(MOD(C)+MOD(T))/2000)*RANDOMREAL
   %IF CH = 1 %THEN %START
      %IF H < 50 %AND (MOD(X) > 7500 %OR MOD(Y) > 25) %THEN CRASH
%IF SFLAG<0 %THEN -> AGAIN
      %IF H > 50 %AND (MOD(X) > 7500 %OR MOD(Y) > 25) %C
         %THEN CH = -1 %AND H = H-50
   %FINISH %ELSE %START
      %IF MOD(X) < 7500 %AND MOD(Y) < 25 %C
         %THEN H = H+50 %AND CH = 1
   %FINISH
   %IF H < 0 %THEN CRASH
%IF SFLAG<0 %THEN -> AGAIN
   %IF G > 5 %THEN %START
      %IF GF = -1 %THEN PRINTSTRING('
TOO MANY GEES - YOU BLACKED OUT')
      A = 0
      T = 0.75*T
      C = 0.75*C
      GF = 1
      -> START
   %FINISH
   %IF G < 5 %THEN GF = -1
   %IF G > 10 %THEN PRINTSTRING('
EXCESSIVE GEES-CRAFT BREAKING UP.
YOU ARE DEAD.') %C
      %AND -> AGAIN
   %IF CH = -1 %OR H > 50 %THEN %START
      %IF RANDOMREAL > 0.8 %OR GD = 1 %C
         %THEN PRINTSTRING('
UNDER FIRE FROM GROUND DEFENSES') %C
         %AND GD = 1 %ELSE -> FIN
      PROB = (H+500)/(A**2+C**2+T**2+2*V)
      %IF PROB+RANDOMREAL > 1 %THENSTART
XHIT
%IF SFLAG<0 %THEN -> AGAIN
%FINISH %ELSE PRINTSTRING('
NO DAMAGE')
      %IF PROB+RANDOMREAL < 0.75 %THEN GD = -1
FIN:
   %FINISH
   %IF F = 1 %THEN %START
      PROB = DAMAGE+750/(A**2+C**2+T**2+V)
      %IF PROB+RANDOMREAL > 1 %THENSTART
XHIT
%IF SFLAG<0 %THEN -> AGAIN
 %FINISH %ELSE PRINTSTRING('
UNDER FIRE FROM FIGHTERS-NO DAMAGE')
      %IF RANDOMREAL > 0.95 %THEN PRINTSTRING('
FIGHTERS DESTROYED BY FIRE FROM UNIDENTIFIED SPACE FREIGHTER
WITH MERCENARY MARKINGS' %C
         ) %AND F = -1 %AND -> FNISH
      %IF PROB+RANDOMREAL < 0.7 %C
         %THEN PRINTSTRING('
FIGHTERS EVADED') %AND F = -1
FNISH:
   %FINISH
   %IF CH = 1 %AND F = -1 %AND RANDOMREAL > 0.5 %C
      %THEN PRINTSTRING('
**TIE FIGHTERS BEHIND**') %AND F = 1
   PRINTOUTS
   -> READ
AGAIN:
PROMPT('AGAIN? (Y/N)')
NEWLINE
READSYMBOL(S)
%IF S='Y' %THEN SFLAG=1 %AND ->BEGIN
%IF S#'Y' %AND S#'N' %THEN -> AGAIN
%END
%ENDOFFILE