!-----------------------------------------------------------------------------
! MODIFIED [01/28/90] by Grant Thomson-T F Business Computers, Toronto, Canada
!
! Replaced Line numbers with labels (mostly meaningful ones)
! Added Fuel gauge, Kill gauge.
! Added High Score Tracker.
! Number of Enemies and Fuel proportional to skill rating.
! A few cosmetic changes.
! Program is now both AlphaBASE Pre-compiler compatible as well as pure
! AlphaBASIC compatible to encourage enhancements (other scenarios?)
! REMEMBER TO LOAD INKEY.SBR INTO MEMORY as suggested by Marc (see below)
!-----------------------------------------------------------------------------
! This program was originally written in MICROSOFT BASIC for CP/M
! and was first distributed by the HEATH USERS GROUP (HUG). I found it
! titled: OSZ-JEDI.BAS (FOR THE OSBORNE-1) and modified it to run on my
! ALPHA MICRO AM1000. The line #'s are choppy due to my editing, but
! have remained largely unchanged due to the number of line # calls.
!
! There may still be a bug or two - if you find 'em, fix 'em!
!
! Makes use of TCRT calls and GRAPHICS CHARACTERS FOR AM-62 TERMINAL
! Makes use of INKEY.SBR (from AMUS) (Thanx, Mr. Jarboe!)
!
! I suggest you copy the following into a .CMD file to load and start the
! program. It runs a great deal faster with INKEY.SBR resident in memory.
!
! DEL *
! LOAD INKEY.SBR
! :R
! RUN JEDI
!
! ENJOY!
!
! Marc McCauley MARY/AM 12/30/85
!
MAP1 A$,S,2
MAP1 B$,S,1
MAP1 E$,S,1,CHR$(27)
MAP1 ED,F ! enemies destroyed - mod line 3280 for more
MAP1 CD,F
MAP1 CT,F ! timer - mod line 2910 for longer game
MAP1 KM,F
MAP1 BR,F
MAP1 EV,F
MAP1 DG,F
MAP1 FQ,F
MAP1 FX,F
MAP1 FY,F
MAP1 FZ,F
MAP1 X,F
MAP1 Y,F
MAP1 A9,F
MAP1 FL$,S,1
MAP1 DM$,S,1
MAP1 H'ED(7),B,3 ! History of most enemies destroyed
MAP1 H'CT(7),B,3 ! History of Fuel remaining for high scorer
MAP1 HU$(7),S,10 ! High Scorers Name
MAP1 SAV$,S,10 ! High Scorers Name For Input
RANDOMIZE
GOSUB STAR'WARS
PRINT ,"A long time ago in a galaxy far, far away, a great":GOSUB DELAY
PRINT ,"adventure took place. It is a period of civil war.":GOSUB DELAY
PRINT ,"Rebel space ships striking from a hidden base have":GOSUB DELAY
PRINT ,"won their first victory against the evil galactic ":GOSUB DELAY
PRINT ,"empire. During the battle, rebel spies managed to":GOSUB DELAY
PRINT ,"steal secret plans to the empire's ultimate weapon":GOSUB DELAY
PRINT ,"The Death Star, an armoured space station with the":GOSUB DELAY
PRINT ,"fire power to destroy an entire planet. ":GOSUB DELAY:PRINT
PRINT ," Your mission as one of the rebel pilots is to":GOSUB DELAY
PRINT ,"attack and destroy the `Death Star'. While making":GOSUB DELAY
PRINT ,"your attack you have encountered `Darth Vader' and":GOSUB DELAY
PRINT ,"his Imperial storm troopers in their tie fighters.":GOSUB DELAY
PRINT ,"You must destroy them before they can destroy you.":PRINT
PRINT ," GOOD LUCK, AND MAY THE `FORCE' BE WITH YOU "
FOR I=1 TO 11000:NEXT I
PRINT TAB(-1,0)
!
! INSTRUCTION ROUTINE ***
!
!Old PRINT E$;"=*6";"DO YOU NEED:":PRINT
PRINT TAB(10,30);"F - FULL INSTRUCTIONS"
PRINT TAB(11,30);"B - BRIEF INSTRUCTIONS"
PRINT TAB(12,30);"N - NO INSTRUCTIONS"
GET'INSTR'TYP:
! INPUT A$:IF A$=" " THEN A$="N"
?tab(-1,28);
?TAB(8,26);"CHOOSE ONE OF THE FOLLOWING: N";TAB(-1,5);
INPUT LINE "",A$
if A$="" THEN A$="N" ! Default
IF UCS(A$)="F" THEN GOTO FULL'INSTR
IF UCS(A$)="B" THEN GOTO BRIEF'INSTR
IF UCS(A$)<>"N" THEN GOTO GET'INSTR'TYP
SKILL'LEVEL:
PRINT TAB(19,20);"PLEASE ENTER A SKILL RATING FROM 1 TO 9:"
! PRINT
PRINT TAB(19,62);"1";TAB(-1,5);
INPUT LINE "",A$
IF A$="" THEN A$="1" ! Default=1
?tab(-1,29); ! Turn cursor OFF
IF A$<"1" OR A$>"9" THEN GOTO USER'SCREW'UP
A$=A$+"0":A9=INT(VAL(A$)):A9=A9-12336:GOTO DRAW'GRID
USER'SCREW'UP:
PRINT
PRINT TAB(26);"EVIDENTLY YOU NEED INSTRUCTIONS!"
FOR I=1 TO 3000:NEXT I:PRINT
FULL'INSTR:
PRINT TAB(-1,0)
PRINT "You have been equipped with an X-wing As in a real DOG-FIGHT you must lead"
PRINT "Fighter by the Rebel Alliance. Your the target when firing your laser. If"
PRINT "fighter is computer controlled by the you wait until he is exactly centered"
PRINT "NUMERIC KEYPAD on your keyboard. The to fire, then you will miss him. You"
PRINT "display you will see is your ON-BOARD may continue to fire at him, but when"
PRINT "SCANNER. In order to kill an enemy you are firing your weapon, your con-"
PRINT "fighter he must receive a DIRECT HIT trol of direction is not as good as"
PRINT "OR MULTIPLE DAMAGING HITS. He will when you aren't Firing and the Target"
PRINT "receive damage if hit when he is +/- may fly out of your sights."
PRINT "10 DEGREES IN ELEVATION and he is +/-"
PRINT "9 DEGREES IN BEARING. In addition to In order to CENTER your target on the"
PRINT "this, he MUST BE WITHIN 7500 KMS. Scanner, you must fly towards him."
PRINT " To do this you PRESS THE KEY ON THE"
PRINT "WARNING: The `Tie' Fighter has the NUMERIC KEY PAD THAT IS IN HIS DIREC-"
PRINT "capability to pop in and out of hyp- TION. ie: IF HE IS IN THE UPPER RIGHT"
PRINT "erspace. Therefore he may disappear QUADRANT YOU WOULD PRESS KEY 9 TO FLY"
PRINT "right from before your sights. Also, TOWARDS HIM. IF HE IS BELOW, PRESS 2."
PRINT "you are given a limited amount of NOTE: At higher skill levels, you"
PRINT "fuel. Your gauge will indicate fuel will be thrust into a more intense"
PRINT "remaining. battle (more Tie Fighters to destroy)"
PRINT " ":PRINT
INPUT " MAY THE FORCE BE WITH YOU Press RETURN to Continue ",NADA
BRIEF'INSTR:
PRINT TAB(-1,0)
PRINT ," UP & UP UP &"
PRINT TAB(17);" LEFT";TAB(-1,23);" rzzzzzs rzzzzzs rzzzzzs ";TAB(-1,24);"RIGHT"
PRINT TAB(17);TAB(-1,23);" v v v v v v"
PRINT TAB(17);" qzzzzzu qzzzzzu qzzzzzu"
PRINT ," rzzzzzs rzzzzzs rzzzzzs";TAB(-1,24)
PRINT ," LEFT ";TAB(-1,23);"v v v v v v";TAB(-1,24);" RIGHT"
PRINT TAB(-1,23)," qzzzzzu qzzzzzu qzzzzzu"
PRINT ," rzzzzzs rzzzzzs rzzzzzs"
PRINT TAB(17);" v v v v v v"
PRINT TAB(-1,24)," DOWN";TAB(-1,23);" qzzzzzu qzzzzzu qzzzzzu ";TAB(-1,24);"DOWN"
PRINT ," & LEFT";TAB(-1,23);" rzzzzzs";TAB(-1,24);" DOWN & RIGHT"
PRINT TAB(-1,23);" v v"
PRINT " qzzzzzu";TAB(-1,24)
PRINT ," FIRE"
PRINT TAB(4,33);"7";TAB(4,41);"8";TAB(4,49);"9"
PRINT TAB(7,33);"4";TAB(7,41);"5";TAB(7,49);"6"
PRINT TAB(10,33);"1";TAB(10,41);"2";TAB(10,49);"3";TAB(13,33);"0"
PRINT TAB(17,20);"<<PRESS '5' TO STOP ANY TURNS OR CLIMBS>>":PRINT
PRINT:PRINT:PRINT
!!! PRINT TAB(20);"PLEASE ENTER A SKILL RATING FROM 1 TO 9:":PRINT
PRINT TAB(27);"NOVICE = 1 EXPERT = 9":PRINT
PRINT "AFTER SCANNER CONSTRUCTION IS COMPLETE, PRESS ANY NUMBER KEY TO START."
?tab(-1,28); ! Turn cursor ON
GOTO SKILL'LEVEL
!GET'INSTR'TYP2:
! INPUT "SKILL LEVEL > ",A$:IF A$<"1" OR A$>"9" THEN GOTO GET'INSTR'TYP2
! A$=A$+"0":A9=INT(VAL(A$)):A9=A9-12336
DRAW'GRID: ! GRID CONSTRUCTION ROUTINE ***
ED=0:CT=0
PRINT TAB(-1,0);TAB(-1,29);TAB(-1,11);
PRINT TAB(1,2);"RANGE: KM ELEVATION: DEG BEARING: DEG FUEL: KILLS:"
PRINT
PRINT TAB(8);"-90 -75 -60 -45 -30 -15 0 +15 +30 +45 +60 +75 +90"
PRINT TAB(5);"+90 ";TAB(-1,23);"r0000b0000b0000b0000b0000b0000b0000b0000b0000b0000b0000b0000s";TAB(-1,24);" +90"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(5);"+60 ";TAB(-1,23);"x";SPACE(59);"x";TAB(-1,24);" +60"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(5);"+30 ";TAB(-1,23);"x";SPACE(59);"x";TAB(-1,24);" +30"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(6);"0 ";TAB(-1,23);" x";SPACE(59);"x ";TAB(-1,24);" 0"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(5);"-30 ";TAB(-1,23);"x";SPACE(59);"x";TAB(-1,24);" -30"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(5);"-60 ";TAB(-1,23);"x";SPACE(59);"x";TAB(-1,24);" -60"
PRINT TAB(9);TAB(-1,23);"v";SPACE(59);"v":PRINT TAB(9);"v";SPACE(59);"v";TAB(-1,24)
PRINT TAB(5);"-90 ";TAB(-1,23);"q]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]a]]]]u";TAB(-1,24);" -90"
PRINT TAB(8);"-90 -75 -60 -45 -30 -15 0 +15 +30 +45 +60 +75 +90";TAB(-1,12)
!
! *** INPUT CONTROL SCAN ROUTINE ***
!
CD=200+(A$[1,1]*10)+INT(200+RND(1)):FL$="5" !2910
!Old CD=200+INT(200+RND(1)):FL$="5" !2910
IN'LOOP:
IF CT=CD THEN GOTO FAILED ELSE CT=CT+1 : CALL DSP'TIME
IF FL$="0" THEN GOTO FIRE
XCALL INKEY,B$
IF B$>="0" AND B$<="9" THEN FL$=B$ ELSE IF B$<>"" THEN DM$=B$
IN'LOOP2:
XCALL INKEY,B$
IF B$>"0" AND B$<="9" THEN FL$=B$ ELSE IF B$<>"" THEN DM$=B$
GOSUB POS'UPDATE
PRINT E$;"=&3+";E$;"=23+";E$;"=)=+";E$;"=/=+";E$;"=,G+";E$;"=)Q+";E$;"=/Q+";E$;"=&[+";E$;"=2[+";
FOR I=1 TO 100:NEXT I
GOTO IN'LOOP
FIRE: ! *** FIRE WEAPON ROUTINE ***
FOR I=8 TO 1 STEP -1
PRINT E$;"=";CHR$(44+I);CHR$(71-I);TAB(-1,23);"a";
PRINT E$;"=";CHR$(44+I);CHR$(71+I);"a";TAB(-1,24);
IF I>6 THEN GOTO NXTI'1
PRINT E$;"=";CHR$(46+I);CHR$(69-I);" ";
PRINT E$;"=";CHR$(46+I);CHR$(73+I);" ";
NXTI'1:
NEXT I
PRINT E$;"=.E ";E$;"=.I ";E$;"=-F ";E$;"=-H ";
IF FX<>44 OR FY<>70 THEN GOTO L'3290
IF KM>5000 THEN GOTO IN'LOOP2
DESTROYED:
PRINT TAB(25,31);TAB(-1,32);" ENEMY DESTROYED ";TAB(-1,33);:DG=0
ED=ED+1
PRINT E$;"=";CHR$(FX-1);CHR$(FY);"<|>"
PRINT E$;"=";CHR$(FX);CHR$(FY-1);" "
PRINT E$;"=";CHR$(FX+1);CHR$(FY);">|<"
FOR I=1 TO 50:PRINT CHR$(7);:NEXT I
PRINT E$;"=";CHR$(FX);CHR$(FY);"***"
FOR I=1 TO 50:NEXT I
PRINT E$;"=";CHR$(FX-1);CHR$(FY);" "
PRINT E$;"=";CHR$(FX);CHR$(FY-1);"***"
PRINT E$;"=";CHR$(FX+1);CHR$(FY);" "
FOR I=1 TO 50:NEXT I
PRINT E$;"=";CHR$(FX);CHR$(FY);" "
FQ=0:IF ED=3*A$[1,1] THEN GOTO MISSION'DONE ELSE GOSUB DSP'KILLS : GOTO IN'LOOP2 !3280
L'3290:
IF FX<43 OR FX>45 THEN GOTO L'3410
IF FY<68 OR FY>72 THEN GOTO L'3410
DG=DG+1:IF DG=3 THEN GOTO DESTROYED
PRINT E$;"=";CHR$(FX-1);CHR$(FY);"[=]"
PRINT E$;"=";CHR$(FX);CHR$(FY-1);"I"
PRINT E$;"=";CHR$(FX);CHR$(FY+3);"I"
PRINT E$;"=";CHR$(FX+1);CHR$(FY);"]*["
FOR I=1 TO 50:NEXT I
PRINT E$;"=";CHR$(FX-1);CHR$(FY);" "
PRINT E$;"=";CHR$(FX);CHR$(FY-1);" "
PRINT E$;"=";CHR$(FX);CHR$(FY+3);" "
PRINT E$;"=";CHR$(FX+1);CHR$(FY);" ":GOTO IN'LOOP2
L'3410:
PRINT E$;"=8 ";E$;"T";
GOTO IN'LOOP2
POS'UPDATE: ! *** FIGHTER POSITION UPDATE ***
IF FQ=1 THEN GOTO POS'1 ELSE FQ=1
POS'LOOP'1:
LET FX=INT(100*RND(1))
IF FX<36 OR FX>52 THEN GOTO POS'LOOP'1
POS'LOOP'2:
LET FY=INT(200*RND(1))
IF FY<44 OR FY>97 THEN GOTO POS'LOOP'2
LET KM=INT(10000*RND(1))
FZ=INT(16*RND(1))
POS'1:
IF INT(100*RND(1))>6 THEN GOTO POS'2
FZ=INT(16*RND(1))
POS'2:
IF INT(10*RND(1))>A9 X=FX:Y=FY:GOTO POS'3
IF FZ=0 THEN X=FX-1:Y=FY+1
IF FZ=1 THEN X=FX:Y=FY+1
IF FZ=2 THEN X=FX+1:Y=FY+1
IF FZ=3 THEN X=FX+1:Y=FY
IF FZ=4 THEN X=FX+1:Y=FY-1
IF FZ=5 THEN X=FX:Y=FY-1
IF FZ=6 THEN X=FX-1:Y=FY-1
IF FZ=7 THEN X=FX-1:Y=FY
IF FZ=8 THEN X=FX-1:Y=FY+2
IF FZ=9 THEN X=FX-1:Y=FY+3
IF FZ=10 THEN X=FX+1:Y=FY+3
IF FZ=11 THEN X=FX+1:Y=FY+2
IF FZ=12 THEN X=FX+1:Y=FY-2
IF FZ=13 THEN X=FX+1:Y=FY-3
IF FZ=14 THEN X=FX-1:Y=FY-3
IF FZ=15 THEN X=FX-1:Y=FY-2
POS'3:
IF FL$="1" THEN X=X-1:Y=Y+1
IF FL$="2" THEN X=X-2:Y=Y
IF FL$="3" THEN X=X-1:Y=Y-1
IF FL$="4" THEN X=X:Y=Y+2
IF FL$="6" THEN X=X:Y=Y-2
IF FL$="7" THEN X=X+1:Y=Y+1
IF FL$="8" THEN X=X+2:Y=Y
IF FL$="9" THEN X=X+1:Y=Y-1
IF X>39 AND X<50 AND Y>55 AND Y<87 THEN GOTO POS'4
IF SGN(KM)=+1 THEN KM=KM+INT(200*RND(1))
IF SGN(KM)=-1 THEN KM=KM-INT(200*RND(1))
IF KM<10000 THEN GOTO POS'5 ELSE GOTO POS'6
POS'4:
IF SGN(KM)=+1 THEN KM=KM-INT(200*RND(1))
IF SGN(KM)=-1 THEN KM=KM+INT(200*RND(1))
POS'5:
IF X<36 OR X>52 OR Y<42 OR Y>98 THEN GOTO POS'6
IF X=FX AND Y=FY THEN RETURN
PRINT E$;"=";CHR$(FX);CHR$(FY);" ":FX=X:FY=Y
PRINT E$;"=";CHR$(FX);CHR$(FY);TAB(-1,23);"4/9";TAB(-1,24)
PRINT TAB(1,8);KM
EV=10*(44-FX):PRINT TAB(1,31);EV
BR=3*(FY-70):PRINT TAB(1,51);BR:RETURN
POS'6:
PRINT E$;"=";CHR$(FX);CHR$(FY);" ";
FQ=0:RETURN
PRINT E$;"=8 ";E$;"T";
RETURN
MISSION'DONE:
FOR I=1 TO 500:NEXT I:PRINT E$;"= ";TAB(-1,0)
PRINT TAB(-1,12);E$;"=( ";
PRINT TAB(-1,0)
PRINT TAB(2,1);
PRINT TAB(2,20);"CONGRATULATIONS ON A JOB WELL DONE. YOU HAVE"
PRINT TAB(3,20);"DESTROYED DARTH VADER AND HIS STORM TROOPERS,"
PRINT TAB(4,20);"AND SAVED THE REBELLION.":GOTO END'YN
FAILED:
PRINT TAB(-1,0)
PRINT TAB(2,20);"YOU HAVE ONLY DESTROYED";ED;"TIE FIGHTERS AND"
PRINT TAB(3,20);"YOU LET DARTH VADER GET AWAY. OH WELL, I GUESS"
PRINT TAB(4,20);"WE WANT HIM AROUND FOR THE SEQUEL ANYWAY!"
END'YN:
CALL HIGH'SCORE
PRINT ""
PRINT TAB(-1,28);TAB(17,20);"DO YOU WANT TO PLAY AGAIN (Y/N): Y";TAB(-1,5);
INPUT LINE "",A$
if A$="" THEN A$="Y" ! Default
IF UCS(A$)="Y" THEN B$=" ":GOTO SKILL'LEVEL
PRINT TAB(-1,0);TAB(-1,28)
PRINT TAB(5,5);"FIGHTING EVIL CAN BE TIRING...COME BACK WHEN YOU'RE READY FOR";TAB(-1,21);"ACTION !";TAB(-1,22)
END
DELAY:
FOR I=1 TO 1000:NEXT I:PRINT
RETURN
DSP'TIME:
?tab(1,66);CD-CT;
RETURN
DSP'KILLS:
?tab(1,77);ED;
RETURN
HIGH'SCORE:
LOOKUP "JEDI.SCO",HSTRY
! If NO history, then New high score
IF HSTRY=0 THEN CALL CREATE'HIGH
OPEN #1,"JEDI.SCO",INPUT
H'FLG=0 ! High scored attained? 0=NO 1=LEVEL OF HIGH
FOR I=1 to 7 ! See if high score attained
INPUT #1,HU$(I),H'ED(I),H'CT(I)
IF H'FLG > 0 THEN GOTO NXTI'2
IF ED > H'ED(I) THEN H'FLG=I ! New high by no. of kills
IF ED=H'ED(I) AND CD-CT > H'CT(I) THEN &
H'FLG=I ! New high by kills and fuel remaining
NXTI'2:
NEXT I
CLOSE #1
IF H'FLG > 0 GOTO NEW'HIGH
DSP'HIGH:
? TAB(6,1);TAB(-1,9);TAB(6,30);"HIGH SCORES: "
? TAB(8,1);TAB(-1,9);TAB(8,22);"NAME: KILLS: FUEL REMAINING:"
FOR I=1 TO 7
?TAB(20);HU$(I);TAB(32);H'ED(I) USING "###";TAB(45);H'CT(I)
NEXT I
RETURN
NEW'HIGH:
? TAB(6,20);"YOU ARE A NEW REBEL LEADER!"
?tab(-1,28); ! Turn Cursor OFF
? TAB(8,20)"YOUR NAME (10 DIGITS MAX): ";
INPUT LINE "",SAV'HU$
FOR I=7 to 2 STEP -1 ! Shuffles High Scores to insert new
IF I > H'FLG THEN &
HU$(I)=HU$(I-1) : &
H'ED(I)=H'ED(I-1) : &
H'CT(I)=H'CT(I-1)
NEXT I
HU$(H'FLG)=SAV'HU$ : H'ED(H'FLG)=ED : H'CT(H'FLG)=CD-CT ! Insert new
OPEN #1,"JEDI.SCO",OUTPUT
FOR I=1 TO 7
? #1,HU$(I);",";H'ED(I);",";H'CT(I)
NEXT I
CLOSE #1
?tab(-1,29); ! Turn Cursor ON
GOTO DSP'HIGH
CREATE'HIGH: ! Setup system generated high scores
OPEN #1,"JEDI.SCO",OUTPUT
FOR I=1 TO 7
? #1,"SKYWALK, 3 , 50 "
HU$(I)="SKYWALK"
H'ED(I)=3
H'CT(I)=50
NEXT I
CLOSE #1
RETURN