11' ** SPACE BATTLE COMPUTER GAME PORTABLE VERSION **
22
33' ** STATE MACHINE STATES **
4- ST_QUIT= 0 : ST_NEWGAME= 1 : ST_NEWQUAD= 2 : ST_COMMAND= 3 : ST_DEAD =4
5- ST_GAMEOVER= 5 : ST_VICTORY= 6 : ST_MISSIONEND= 7 : ST_PLAYAGAIN= 8
4+ ST_QUIT= 0 : ST_NEWGAME= 1 : ST_NEWQUAD= 2 : ST_COMMAND= 3 : ST_END =4
5+ END_DEAD= 1 : END_DATE= 2 : END_NOPOWER= 3 : END_FAIL= 4 : END_WIN= 5
66
77' ** QUADRANT CELL CODES **
88' The short-range grid is an 8x8 integer array QUAD(), not a 192-char string:
5050 GameState = EnterQuadrant()
5151 case ST_COMMAND
5252 GameState = DoCommand()
53- case ST_DEAD
54- GameState = ShipDestroyed()
55- case ST_GAMEOVER
56- GameState = ShowGameOver()
57- case ST_VICTORY
58- GameState = ShowVictory()
59- case ST_MISSIONEND
60- GameState = ShowMissionEnd()
61- case ST_PLAYAGAIN
62- GameState = AskPlayAgain()
53+ case ST_END
54+ GameState = ShowGameEnd()
6355 end select
6456loop until GameState = ST_QUIT
6557end
@@ -91,7 +83,7 @@ function SetupGame()
9183
9284 ' ** DISPLAY TITLE SCREEN AND WAIT FOR KEY **
9385 TitleScreen()
94- CRPLANETT= 1
86+
9587
9688 ' ** RANDOM SEED GENERATOR **
9789 RANDOM_SEED=RNDINT(- 1 )
@@ -160,9 +152,6 @@ function SetupGame()
160152 next I
161153
162154 if GLONKIN_COUNT>MISSION_DAYS then MISSION_DAYS=GLONKIN_COUNT+ 1
163- 'ShowKey() : ' ** KEY TO SRS ICONS **
164- 'ShowCommands() : ' ** USE THESE COMMANDS LIST **
165-
166155
167156 ' Guarantee at least one SPACESTATION and preserve original balancing tweak.
168157 if SPACESTATION_COUNT= 0 then
@@ -187,6 +176,7 @@ function EnterQuadrant()
187176 VISITED_GALAXY(QUADRANT_Y,QUADRANT_X)=GALAXY(QUADRANT_Y,QUADRANT_X)
188177 if QUADRANT_Y >= 1 and QUADRANT_Y <= 8 and QUADRANT_X>= 1 and QUADRANT_X<= 8 then
189178 print
179+
190180 if GAME_DATE=DATE_CUR then
191181 print "LOCATION:" ;
192182 QN$=QuadrantName$(QUADRANT_Y, QUADRANT_X, 0 )
@@ -269,7 +259,7 @@ function DoCommand()
269259 if SHIELD_UNITS+SHIP_POWER <= 10 or (SHIP_POWER<= 10 and DEVICE_DAMAGE( 7 )<> 0 ) then
270260 print "\n** OUT OF POWER **"
271261 Pause()
272- return ST_GAMEOVER
262+ END_REASON=END_NOPOWER : return ST_END
273263 end if
274264
275265 ' COMMAND LOOP
@@ -323,7 +313,7 @@ function DoCommand()
323313 case 8
324314 return Computer()
325315 case 9
326- return ST_MISSIONEND
316+ END_REASON=END_FAIL : return ST_END
327317 end select
328318 ShowCommands()
329319 loop
@@ -362,7 +352,7 @@ function Nav()
362352 K(I, 1 )=TOKEN_Y : K(I, 2 )=TOKEN_X : PlaceToken(C_GLONKIN, K(I, 1 ), K(I, 2 ))
363353 next I
364354 GLONKINsFire()
365- if SHIPDEAD then return ST_DEAD
355+ if SHIPDEAD then END_REASON=END_DEAD : return ST_END
366356
367357 D1= 0 : D6= 0 : if NAV_FTL_SPEED>= 1 then D6= 1
368358 for I= 1 to 8
@@ -411,7 +401,7 @@ function Nav()
411401 if X5<> 0 then
412402 NavWarning( "NAV ERROR: SHUTDOWN: " +SECTOR_Y+ "," +SECTOR_X+ " Q " +QUADRANT_Y+ "," +QUADRANT_X)
413403 SRSFLAG= 1 : Pause()
414- if DATE_CUR>GAME_DATE+MISSION_DAYS then return ST_GAMEOVER
404+ if DATE_CUR>GAME_DATE+MISSION_DAYS then END_REASON=END_DATE : return ST_END
415405 end if
416406 if 8 *QUADRANT_Y+QUADRANT_X<> 8 *Q4+Q5 then DATE_CUR=DATE_CUR+ 1 : ManeuverPOWER() : return ST_NEWQUAD
417407 end if
@@ -420,7 +410,7 @@ function Nav()
420410 PlaceToken(C_SHIP, SECTOR_Y, SECTOR_X)
421411 ManeuverPOWER()
422412 DATE_CUR=DATE_CUR+ 1
423- if DATE_CUR>GAME_DATE+MISSION_DAYS then return ST_GAMEOVER
413+ if DATE_CUR>GAME_DATE+MISSION_DAYS then END_REASON=END_DATE : return ST_END
424414 return ShortRangeScan()
425415end function
426416
@@ -523,7 +513,7 @@ function LASERS()
523513 print " *** GLONKIN DESTROYED ***"
524514 SECTOR_ENEMIES=SECTOR_ENEMIES- 1 : GLONKIN_COUNT=GLONKIN_COUNT- 1 : PlaceToken(C_EMPTY, K(I, 1 ), K(I, 2 ))
525515 K(I, 3 )= 0 : GALAXY(QUADRANT_Y,QUADRANT_X)=GALAXY(QUADRANT_Y,QUADRANT_X)- 100 : VISITED_GALAXY(QUADRANT_Y,QUADRANT_X)=GALAXY(QUADRANT_Y,QUADRANT_X)
526- if GLONKIN_COUNT<= 0 then return ST_VICTORY
516+ if GLONKIN_COUNT<= 0 then END_REASON=END_WIN : return ST_END
527517 next I
528518
529519 ' CHECK IF GLONKINS ARE LEFT
@@ -533,7 +523,7 @@ function LASERS()
533523 GLONKINsFire()
534524
535525 ' CHECK IF SHIP IS DEAD
536- if SHIPDEAD then return ST_DEAD
526+ if SHIPDEAD then END_REASON=END_DEAD : return ST_END
537527
538528 ' RETURN SUCCESS
539529 return ST_COMMAND
@@ -544,7 +534,7 @@ function TorpedoEndTurn(MSG$)
544534 if MSG$<> "" then print MSG$
545535 if SECTOR_ENEMIES<> 0 then Pause()
546536 GLONKINsFire()
547- if SHIPDEAD then return ST_DEAD
537+ if SHIPDEAD then END_REASON=END_DEAD : return ST_END
548538 return ST_COMMAND
549539end function
550540
@@ -559,8 +549,7 @@ function WARHEAD()
559549 C1=AskNumber( "WARHEAD COURSE (1-9) : " , 5 )
560550 if C1= 9 then C1= 1
561551 if C1< 1 or C1>= 9 then
562- print : background 6 : color 1 : print "ALERT:, INCORRECT"
563- print "COURSE DATA" ;:background 0 : print : return ST_COMMAND
552+ print "ALERT:, INCORRECT COURSE DATA" ;: return ST_COMMAND
564553 end if
565554
566555 ' CALCULATE WARHEAD COURSE
@@ -587,7 +576,7 @@ function WARHEAD()
587576 GLONKIN_COUNT=GLONKIN_COUNT- 1
588577
589578 ' CHECK IF ALL GLONKINS ARE DESTROYED
590- if GLONKIN_COUNT<= 0 then return ST_VICTORY
579+ if GLONKIN_COUNT<= 0 then END_REASON=END_WIN : return ST_END
591580
592581 ' FIND GLONKIN INDEX
593582 HitIdx= 3
@@ -606,7 +595,7 @@ function WARHEAD()
606595 GALAXY(QUADRANT_Y,QUADRANT_X)=SECTOR_ENEMIES* 100 +SECTOR_BASES* 10 +SECTOR_PLANETS : VISITED_GALAXY(QUADRANT_Y,QUADRANT_X)=GALAXY(QUADRANT_Y,QUADRANT_X) : GLONKINsFire()
607596
608597 ' CHECK IF SHIP IS DEAD
609- if SHIPDEAD then return ST_DEAD
598+ if SHIPDEAD then END_REASON=END_DEAD : return ST_END
610599
611600 ' RETURN SUCCESS
612601 return ST_COMMAND
@@ -626,7 +615,7 @@ function WARHEAD()
626615 ' CHECK IF ALL SPACESTATIONS ARE DESTROYED
627616 if SPACESTATION_COUNT<= 0 and GLONKIN_COUNT<=DATE_CUR-GAME_DATE-MISSION_DAYS then
628617 NavWarning( "FAILURE - SPACESTATIONS DESTROYED" )
629- return ST_MISSIONEND
618+ END_REASON=END_FAIL : return ST_END
630619 end if
631620
632621 ' DESTROY SPACESTATION
@@ -635,7 +624,7 @@ function WARHEAD()
635624
636625 ' UPDATE QUADRANT DATA
637626 GALAXY(QUADRANT_Y,QUADRANT_X)=SECTOR_ENEMIES* 100 +SECTOR_BASES* 10 +SECTOR_PLANETS : VISITED_GALAXY(QUADRANT_Y,QUADRANT_X)=GALAXY(QUADRANT_Y,QUADRANT_X) : GLONKINsFire()
638- if SHIPDEAD then return ST_DEAD
627+ if SHIPDEAD then END_REASON=END_DEAD : return ST_END
639628 return ST_COMMAND
640629 loop
641630
@@ -694,7 +683,7 @@ function Damage()
694683 for I= 1 to 8
695684 print " " ;DEVICE_NAME$(I) ;left$(SPACE_PAD$, 20 -len(DEVICE_NAME$(I))) ;
696685
697- if DEVICE_DAMAGE(I)< 0 then print CCOL$ ; "DAMAGED " ;DEVICE_DAMAGE(I) ;
686+ if DEVICE_DAMAGE(I)< 0 then print "DAMAGED " ;DEVICE_DAMAGE(I) ;
698687 if DEVICE_DAMAGE(I)>= 0 then print "OPERATIONAL " ;DEVICE_DAMAGE(I) ;
699688 next I
700689 return ST_COMMAND
@@ -714,7 +703,7 @@ function GLONKINsFire()
714703
715704 ' CALCULATE HIT POINTS
716705 H=((K(I, 3 )/FND( 1 ))*( 200 +RNDINT( 100 )))\ 100 : SHIELD_UNITS=SHIELD_UNITS-H : K(I, 3 )=K(I, 3 )\( 2 +RNDINT( 2 ))
717- print : print H ;" UNIT HIT STARSHIP FROM " ;K(I, 1 ) ;"," ;K(I, 2 )
706+ print H ;" UNIT HIT STARSHIP FROM " ;K(I, 1 ) ;"," ;K(I, 2 )
718707
719708 ' CHECK IF SHIELDS ARE DOWN
720709 if SHIELD_UNITS<= 0 then SHIPDEAD= 1 : return
@@ -733,31 +722,19 @@ function GLONKINsFire()
733722end function
734723
735724
736- ' ** ===== END-OF-GAME STATES ===== **
737- function ShowGameOver()
738- print "\nIT IS DATE " ;DATE_CUR
739- return ST_MISSIONEND
740- end function
741-
742-
743- ' ** ===== SHIP DESTROYED ===== **
744- function ShipDestroyed()
745- Pause()
746- print "\n THE STARSHIP HAS BEEN DESTROYED.\nTHE EARTH WILL BE CONQUERED"
747- return ST_GAMEOVER
748- end function
749-
750-
751- ' ** ===== SHOW MISSION END ===== **
752- function ShowMissionEnd()
753- print "\nTHERE WERE " ;GLONKIN_COUNT ;" GLONKIN BATTLE CRUISERS"
754- print "LEFT AT THE END OF YOUR MISSION."
755- return ST_PLAYAGAIN
756- end function
757-
758-
759- ' ** ===== ASK PLAY AGAIN ===== **
760- function AskPlayAgain()
725+ ' ** ===== END-OF-GAME ===== **
726+ function ShowGameEnd()
727+ if END_REASON=END_DEAD or END_REASON=END_WIN then Pause()
728+ if END_REASON=END_DEAD then print "\nTHE STARSHIP HAS BEEN DESTROYED.\nTHE EARTH WILL BE CONQUERED"
729+ if END_REASON=END_DATE then print "\nMISSION TIME EXPIRED. DATE " ;DATE_CUR
730+ if END_REASON=END_WIN then print "\nCONGRATULATIONS, YOU SAVED THE EARTH!"
731+ if END_REASON=END_FAIL then print "\nMISSION FAILED."
732+ print "\nGLONKINS LEFT: " ;GLONKIN_COUNT
733+ print "DATE: " ;DATE_CUR
734+ if END_REASON=END_WIN then
735+ EL=DATE_CUR-GAME_DATE : if EL< 1 then EL= 1
736+ print "SCORE: " ;int( 1000 *(K7/EL)^ 2 )
737+ end if
761738 if SPACESTATION_COUNT= 0 then return ST_QUIT
762739 print "\nGAME OVER"
763740 A$=Ask$( "\nPLAY AGAIN (YES/NO) : " , 3 )
@@ -766,16 +743,6 @@ function AskPlayAgain()
766743end function
767744
768745
769- ' ** ===== SHOW VICTORY ===== **
770- function ShowVictory()
771- Pause()
772- print "\nCONGRATULATIONS, YOU SAVED THE EARTH!\nSCORE:" ;
773- EL=DATE_CUR-GAME_DATE : if EL< 1 then EL= 1
774- print int( 1000 *(K7/EL)^ 2 )
775- return ST_PLAYAGAIN
776- end function
777-
778-
779746' ** ===== SHORT RANGE SCAN & SUMMARY (SLS CHAINS INTO LRS) ===== **
780747function ShortRangeScan()
781748 if ATAKFLAG= 1 then
@@ -1043,48 +1010,22 @@ end function
10431010' ** ===== COMPUTER STATUS REPORT ===== **
10441011function ComputerStatusReport()
10451012
1046- print " STATUS REPORT: \n"
1047-
1048- if GLONKIN_COUNT> 1 then
1049- X$= "S"
1050- else
1051- X$= ""
1052- end if
1053-
1054- print "\n GLONKINS LEFT :" ;GLONKIN_COUNT
1055- print " POWER :" ;int(SHIP_POWER+SHIELD_UNITS)
1056- print " WARHEADES :" ;int(WARHEAD_COUNT)
1057- print "\n MISSION DEADLINE: " ;GAME_DATE+MISSION_DAYS-DATE_CUR
1058- print " DAYS"
1013+ print " STATUS REPORT: \n"
1014+ print " ENEMIES LEFT : " ;GLONKIN_COUNT
1015+ print " POWER : " ;SHIP_POWER+SHIELD_UNITS
1016+ print " WARHEADS : " ;WARHEAD_COUNT
1017+ print " DAYS LEFT : " ;GAME_DATE+MISSION_DAYS-DATE_CUR
1018+ print " SPACESTATIONS: " ;SPACESTATION_COUNT
10591019
1060- ' MULTIPLE SPACESTATIONS
1061- if SPACESTATION_COUNT< 2 then
1062- X$= ""
1063- else
1064- X$= "S"
1065- end if
1066-
1067- ' CHECK IF ANY SPACESTATIONS ARE LEFT
1068- if SPACESTATION_COUNT< 1 then
1069- print "\n NO SPACESTATIONS"
1070- print "LEFT!" : return Damage()
1071- end if
1072-
1073- print "\n EARTH HAS " ;SPACESTATION_COUNT
1074- print " SPACESTATION" ;X$ ;" NEARBY" ; chr$( 13 )
10751020 return Damage()
10761021end function
10771022
10781023
10791024' ** ===== COMPUTER NAV CALC GLONKIN ===== **
10801025function ComputerNavCalcGLONKIN()
10811026 if SECTOR_ENEMIES<= 0 then NoEnemyMsGALAXY() : return ST_COMMAND
1082- if SECTOR_ENEMIES> 1 then
1083- X$= "S"
1084- else
1085- X$= ""
1086- end if
1087- print "\nFROM STARSHIP TO ENEMY SHIP" ;X$
1027+
1028+ print "\nFROM STARSHIP TO ENEMY "
10881029 for I= 1 to 3
10891030 if K(I, 3 )<= 0 then continue for
10901031 ComputerCalcCompute(SECTOR_X, SECTOR_Y, K(I, 1 ), K(I, 2 ), 10 )
@@ -1181,8 +1122,7 @@ end function
11811122
11821123' ** ===== SHARED MESSAGE: NO ENEMY IN QUADRANT ===== **
11831124function NoEnemyMsGALAXY()
1184- print : background 6 : color 1 : print "ALERT:"
1185- print " NO ENEMY SHIPS DETECTED" ;:background 0 : print
1125+ print "ALERT: NO ENEMY SHIPS DETECTED"
11861126 return
11871127end function
11881128
@@ -1251,10 +1191,9 @@ end function
12511191
12521192' PRINT CAPTION$, READ UP TO MAX_LEN CHARS; RETURN TYPED LINE (LII$ ALSO SET)
12531193function Ask$(CAPTION$, MAX_LEN)
1254- LX=MAX_LEN
12551194 print CAPTION$ ;
1256- GetInput()
1257- return LII$
1195+ input LII$
1196+ return UCASE$(left$( LII$, MAX_LEN))
12581197end function
12591198
12601199function AskNumber(CAPTION$, MAX_LEN)
@@ -1263,43 +1202,16 @@ function AskNumber(CAPTION$, MAX_LEN)
12631202end function
12641203
12651204
1266- ' ** GET INPUT **
1267- ' GET CHARACTERS UNTIL RETURN IS PRESSED
1268- function GetInput()
1269- ' ** LX = MAX INPUT LII$ = OUTPUT STRING **
1270- ' ** ACCEPTS A-Z/0-9/PUNCT + SPACE, CHR$(20)=BACKSPACE, ENTER ENDS **
1271- LII$= ""
1272- do
1273- get Y$
1274- Y$=ucase$(Y$)
1275- if Y$= "" then continue do
1276- if asc(Y$)= 0 then Y$=chr$( 13 )
1277-
1278- if asc(Y$)= 13 and LX= 0 then
1279- print " "
1280- print FCOL$
1281- return
1282- end if
1283- if asc(Y$)= 13 then print : print FCOL$ : return
1284-
1285- if asc(Y$)= 20 and len(LII$)< 1 then continue do
1286- if Y$=chr$( 20 ) then Y$= "" : LII$=left$(LII$,(len(LII$)- 1 ))
1287-
1288- if asc(Y$)<> 32 and (asc(Y$)< 46 or asc(Y$)> 90 ) then continue do
1289-
1290- if len(LII$)<LX then print Y$ ;
1291- if len(LII$)<LX then LII$=LII$+Y$
1292- loop
1293- end function
1294-
12951205' ** PAUSE WITHOUT CR**
12961206function Pause()
1297- if CRPLANETT= 1 then CR$= "PRESS RETURN TO BEGIN"
1298- if CRPLANETT= 0 then CR$= "PRESS RETURN TO CONTINUE"
1299- LX= 0 : print " " :print CR$:print " "
1300- GetInput()
1301- CRPLANETT= 0
1302- return
1207+
1208+ PRINT "\nPRESS A KEY TO CONTINUE"
1209+ Y$= ""
1210+ while Y$= ""
1211+ get Y$
1212+ wend
1213+
1214+ return
13031215end function
13041216
13051217' ** KEY TO SRS ICONS **
0 commit comments