%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