Created
November 26, 2023 22:15
-
-
Save scruss/a143d538f40882e48e264f946505412b to your computer and use it in GitHub Desktop.
TAIPAN Apple II source code from https://archive.org/details/taipan-hayden-book-version
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 REM TAIPAN - HAYDEN BOOK CO COPYRIGHT 1986 | |
2 REM BY ART CANFIL, KARL ALBRECHT, AND JIM MCCLENAHAN | |
3 REM TYPED, NOT EXHAUSTIVELY CHECKED, AND MILDLY TWEAKED BY DEAN OISBOID 2022 | |
4 REM REPLACED DIRECT CTRL-G CALLS WITH BP$ | |
5 REM INITIALIZATION (10-50) | |
10 HOME :A$ = " ":W$ = "ELDER BROTHER YU":LY$ = "LI YUEN":YS$ = "YAMATO & SMYTHE":TC$ = "O, S, T, A, P, OR R" | |
11 B$ = " " | |
14 REM OZZY REPLACED JUST BELOW WITH PROPER CTRL-G | |
15 BP$ = CHR$(7) | |
20 VTAB 4: INVERSE : PRINT A$: HTAB 15: PRINT "T A I P A N:": NORMAL : HTAB 13: PRINT "_________________" | |
21 SPEED= 100: VTAB 9: HTAB 14: PRINT "A G A M E I N": PRINT TAB( 15);"C O N T E X T": PRINT : PRINT TAB( 14);"HAYDEN BOOK CO." | |
22 SPEED= 255: VTAB 15: INVERSE : PRINT A$: NORMAL | |
30 DIM M$(11),G$(5),AP(9,5),GG(5),L(9,5),GP(5),V(9): FOR I = 0 TO 9: READ L$(I): NEXT I: FOR I = 0 TO 11: READ M$(I): NEXT I: FOR I = 0 TO 5: READ G$(I): NEXT I | |
40 FOR I = 0 TO 9: FOR J = 0 TO 5: READ AP(I,J):AP(I,J) = AP(I,J) *6 ^(5 -J): NEXT J,I: GOSUB 180 | |
50 FOR I = 0 TO 9: READ L0(I): NEXT I:D = 1000:Y = 1860:GT = 1:C = 400:MW = 50:SH = MW:SR = 1:G = 1:V(0) = 1: GOSUB 5000:X$ = "": GOSUB 590: HOME : GOTO 120 | |
55 REM GET$ SUBROUTINE (60-64) | |
60 POKE -16368,0 | |
61 IF PEEK( -16384) <128 THEN 61 | |
62 X$ = CHR$( PEEK( -16384) -128) | |
63 POKE -16368,0 | |
64 RETURN | |
65 REM INITIALIZATION DATA (70-110) | |
70 DATA HONGKONG,FOOCHOW,SHANGHAI,NAGASAKI,MANILA,SINGAPORE,BATAVIA,SAIGON,CALCUTTA,LIVERPOOL | |
80 DATA JAN,FEB,MAR,APR,MAY,JUN | |
81 DATA JUL,AUG,SEP,OCT,NOV,DEC | |
90 DATA OPIUM,SILK,TEA,ARMS,PEPPER,RICE | |
100 DATA 8,2,2,4,5,2,8,2,1,8,4,3,9,3,3,6,5,4,6,4,2,8,6,5,3,3,4,7,4,4,2,4,5,4,3,5,3,4,5,5,2,6,3,1,4,5,3,3,1,5,6,3,4,5,3,9,9,1,9,5 | |
110 DATA 21,14,7,0,35,49,56,42,84,200 | |
115 REM MAIN DISPLAY (120-150) | |
120 GOSUB 130: GOTO 220 | |
130 VTAB 1: HTAB 1: PRINT "PORT ";L$(L);: HTAB 28: PRINT M$(M);". ";DA +1;",";Y | |
140 VTAB 2: INVERSE : PRINT "CASH ";:Q = C: GOSUB 1330: NORMAL : VTAB 2: HTAB 28: PRINT "GUNS ";G: VTAB 3: PRINT "DEBT ";:Q = D: GOSUB 1330: VTAB 3: HTAB 28: PRINT "HOLD ";:Q = SH: GOSUB 1330 | |
141 VTAB 4: INVERSE : PRINT "GOODS ABOARD SHIP HONGKONG GODOWN": NORMAL | |
150 FOR I = 0 TO 5: VTAB 5 +I: PRINT G$(I): VTAB 5 +I: HTAB 11: PRINT CHR$(133);:Q = SG(I): GOSUB 1330: VTAB 5 +I: HTAB 26: PRINT CHR$(133);:Q = GG(I): GOSUB 1330: NEXT I: INVERSE : PRINT A$: NORMAL : RETURN | |
155 REM UPDATE SUBROUTINE (160-172) | |
160 ET = INT(ET +(ET * RND(1)/3)):GT = GT +ET:D = D + INT(D *(ET/360)):JD = JD +ET: IF JD >360 THEN JD = JD -360:Y = Y +1 | |
161 IF JD <1 THEN JD = 1 | |
170 M = INT((JD -30)/30):DA = INT((((JD/30) - INT(JD/30))) *30): IF RND(1) >.95 THEN TR = 0 | |
171 IF M <0 THEN M = 0 | |
172 RETURN | |
175 REM PRICE VARIATION SUBROUTINE (180) | |
180 FOR I = 0 TO 5:GP(I) = INT(AP(L,I) +( RND(1) *AP(L,I))): NEXT I: RETURN | |
185 REM HI-LO SUBROUTINE (190-210) | |
190 FOR I = 0 TO 5: IF GP(I) >H(L,I) THEN H(L,I) = GP(I) | |
200 IF GP(I) <L(L,I) OR L(L,I) = 0 THEN L(L,I) = GP(I) | |
210 NEXT I: RETURN | |
212 REM MARKET (220-350) | |
217 REM MARKET PRICES (220-221) | |
220 GOSUB 790: GOSUB 1340: VTAB 11: INVERSE : HTAB 8: PRINT " ";L$(L);" MARKET PRICES ": NORMAL : PRINT A$: FOR I = 0 TO 4 STEP 2: VTAB 13 +I/2: HTAB 1: PRINT G$(I);: HTAB 10: PRINT GP(I);: HTAB 21: PRINT G$(I +1); | |
221 HTAB 30: PRINT GP(I +1): NEXT I | |
225 REM MARKET MENU | |
230 PRINT : VTAB 18: PRINT " B)UY, S)ELL, L)EAVE, OR R)ETIRE?" | |
235 REM MARKET MENU INPUT (240-244) | |
240 GOSUB 60: IF X$ = "B" THEN T$ = "BUY":X = 1 | |
241 IF X$ = "S" THEN T$ = "SELL":X = 2 | |
242 IF X$ = "L" THEN 360 | |
243 IF X$ = "R" THEN 1300 | |
244 IF X$ < >"B" AND X$ < >"S" AND X$ < >"L" AND X$ < >"R" THEN GOSUB 770: GOTO 240 | |
245 REM BUY/SELL (250-351) | |
247 REM ITEM MENU (250) | |
250 VTAB 18: PRINT A$;: VTAB 18: HTAB 3: PRINT T$;" ";TC$;"?": GOSUB 260: GOTO 280 | |
255 REM ITEM CHOICE SUBROUTINE (260-270) | |
260 GOSUB 60: IF X$ = "O" THEN X1 = 0 | |
261 IF X$ = "S" THEN X1 = 1 | |
262 IF X$ = "T" THEN X1 = 2 | |
263 IF X$ = "A" THEN X1 = 3 | |
264 IF X$ = "P" THEN X1 = 4 | |
265 IF X$ = "R" THEN X1 = 5 | |
266 IF X$ < >"O" AND X$ < >"S" AND X$ < >"T" AND X$ < >"A" AND X$ < >"P" AND X$ < >"R" THEN GOSUB 770: GOTO 260 | |
270 RETURN | |
280 IF X = 1 AND GP(X1) >C THEN VTAB 18: PRINT "YOU CAN'T AFFORD ANY "G$(X1)";:GOSUB 760:GOTO 230 | |
290 IF X = 2 AND SG(X1) <1 THEN VTAB 18: PRINT "YOU HAVE NO "G$(X1)" ABOARD! ";: GOSUB 760: GOTO 230 | |
300 VTAB 18: PRINT A$;: VTAB 18: PRINT T$;" HOW MUCH ";G$(X1);: PRINT "? ";:NUM$ = "":NUM = 0: GOSUB 310: GOTO 320 | |
305 REM SOOPER DOOPER NUMBER SCOOPER SUBROUTINE (310-314) | |
310 PRINT CHR$(8);: INVERSE : PRINT " ";: NORMAL : GOSUB 60: IF LEN(NUM$) >0 AND ASC(X$) = 8 THEN PRINT X$;: PRINT " ";: PRINT X$;X$;: PRINT " ";:FG = 1: IF LEN(NUM$) = 1 THEN NUM$ = "":FG = 0: GOTO 310 | |
311 IF FG = 1 THEN NUM$ = LEFT$(NUM$, LEN(NUM$) -1):FG = 0: GOTO 310 | |
313 IF ASC(X$) = 65 OR ASC(X$) = 13 THEN RETURN | |
313 IF ASC(X$) <48 OR ASC(X$) >57 THEN 310 | |
314 NUM$ = NUM$ +X$: PRINT CHR$(8);X$;: INVERSE : PRINT " ";: NORMAL : GOTO 310 | |
320 IF X = 1 THEN IF X$ = "A" THEN PRINT CHR$(8);: INVERSE : PRINT "ALL";:NUM = INT(C/GP(X1) | |
321 IF X = 1 AND X$ < >"A" THEN NUM = VAL(NUM$) | |
330 IF X = 2 THEN IF X$ = "A" THEN PRINT CHR$(8);: INVERSE : PRINT "ALL";:NUM = SG(X1) | |
331 IF X = 2 AND X$ < >"A" THEN NUM = VAL(NUM$) | |
335 NORMAL | |
340 IF X = 1 THEN IF NUM *GP(X1) >C THEN PRINT : VTAB 18: PRINT "YOU CAN'T AFFORD SO MUCH! ";: GOSUB 760: VTAB 18: PRINT A$;: GOTO 300 | |
341 IF X = 1 AND NUM *GP(X1) < = C THEN SG(X1) = SG(X1) +NUM:SH = SH -NUM:C = C -GP(X1) *NUM: GOSUB 130: GOTO 230 | |
350 IF NUM >SG(X1) THEN VTAB 18: PRINT A$;: VTAB 18: PRINT "YOU DON'T HAVE THAT MUCH! ";: GOSUB 760: VTAB 18: PRINT A$: GOTO 300 | |
351 SG(X1) = SG(X1) -NUM:SH = SH +NUM:C = C +(NUM *GP(X1)): GOSUB 130: GOTO 230 | |
355 REM OTHER OPTIONS (360-381) | |
360 GOSUB 130: GOSUB 1340: VTAB 11: INVERSE : PRINT A$: NORMAL : PRINT " T)RADE, R)ECORDS";: IF L = 0 THEN PRINT ", L)ENDER, G)ODOWN OR E)MBARK?": PRINT : PRINT A$ | |
361 IF L < >0 THEN PRINT " OR E)MBARK?": PRINT : PRINT : PRINT A$; | |
370 GOSUB 60: IF X$ = "G" AND L = 0 THEN X = 1 | |
371 IF X$ = "T" THEN 120 | |
372 IF X$ = "R" THEN X = 2 | |
373 IF X$ = "L" THEN X = 3 | |
374 IF X$ = "E" THEN 730 | |
375 IF (X$ < >"G" OR L < >0) AND X$ < >"T" AND X$ < >"R" AND X$ < >"L" AND X$ < >"E" THEN GOSUB 770: GOTO 370 | |
380 IF X = 3 AND L < >Q THEN GOSUB 770: GOTO 370 | |
381 IF X < >3 OR L = 0 THEN ON X GOSUB 390,600,470: GOTO 360 | |
384 REM GODOWN SUBROUTINE (390-461) | |
387 REM GODOWN MENU (390-392) | |
390 GOSUB 130: VTAB 13: PRINT A$: VTAB 13: PRINT "CARGO <T>O OR <F>ROM GODOWN?": PRINT A;: GOSUB 60: IF X$ = "T" THEN 410 | |
391 IF X$ = "F" THEN 440 | |
392 IF X$ < >"T" AND X$ < >"F" THEN GOSUB 770: GOTO 390 | |
395 REM GODOWN CARGO CHOICE SUBROUTINE (400) | |
400 VTAB 13: PRINT "MOVE WHAT (";TC$;")? ": GOSUB 260: RETURN | |
410 GOSUB 400: IF SG(X1) = 0 THEN VTAB 13: PRINT "YOU HAVE NO ";G$(X1);" ABOARD! ": GOSUB 760: RETURN | |
420 NUM$ = "": VTAB 13: PRINT A$: VTAB 13: PRINT " MOVE HOW MUCH ";G$(X1);"? ";: GOSUB 310: IF X$ = "A" THEN INVERSE : PRINT CHR$(8);"ALL";:NUH = SG(X1): NORMAL | |
421 IF X$ < >"A" THEN NUM = VAL(NUM$) | |
425 HTAB 1 | |
430 IF NUM >SG(X1) THEN VTAB 13: PRINT " ONLY ";:Q = SG(X1): GOSUB 1330: HTAB 11: PRINT " UNITS ABOARD! ": GOSUB 760: GOTO 420 | |
431 IF NUM < = SG(X1) THEN SG(X1) = SG(X1) -NUM:SH = SH +NUM:GG(X1) = GG(X1) +NUM:NUM$ = "": RETURN | |
440 GOSUB 400: IF GG(X1) = 0 THEN VTAB 13: PRINT " THE GODOWN HAS NO ";G$(X1);", ": GOSUB 760: RETURN | |
450 NUM$ = "": VTAB 13: PRINT B$;: HTAB 1: PRINT " MOVE HOW MUCH ";G$(X1);" TO SHIP? ";: GOSUB 310: IF X$ = "A" THEN PRINT CHR$(8);: INVERSE : PRINT "ALL";: NORMAL :NUM = GG(X1) | |
451 IF X$ < >"A" THEN NUM = VAL(NUM$) | |
460 IF NUM >GG(X1) THEN VTAB 13: PRINT " JUST ";:Q = GG(X1): GOSUB 1330: PRINT " UNITS STORED!": GOSUB 760: GOTO 450 | |
461 IF NUM < = GG(X1) THEN GG(X1) = GG(X1) -NUM:SG(X1) = SG(X1) +NUM:SH = SH -NUM:NUM$ = "": RETURN | |
465 REM LENDER SUBROUTINE (470-580) | |
470 GOSUB 130: GOSUB 1340: VTAB 12: PRINT "[WANCHAI DISTRICT OF HONGKONG: HOME OF ";W$;"]": PRINT W$;" GREETS YOU, TAIPAN, AND WISHES YOU WELL.": GOSUB 780: VTAB 14: PRINT A$: PRINT A$ | |
480 VTAB 14: PRINT "WU STATES THAT HIS IRON LOTUS": PRINT "TRIAD HAS BEEN WATCHING YOU.": GOSUB 780 | |
490 VTAB 14: PRINT A$: PRINT A$: PRINT A$: VTAB 14: PRINT W$;" ASKS, DO YOU": PRINT A$;: VTAB 15: PRINT "WISH TO B)ORROW, P)AY, OR Q)UIT? ";:NUM$ = "" | |
500 GOSUB 60: IF X$ = "B" THEN LD$ = "BORROW":LD = 1 | |
501 IF X$ = "P" THEN LD$ = "PAY":LD = 2 | |
502 IF X$ = "Q" THEN PRINT : GOSUB 1340: RETURN | |
503 IF X$ < >"B" AND X$ < >"P" AND X$ < >"Q" THEN GOSUB 770: GOTO 500 | |
510 IF LD = 1 AND (B = 1 OR D >1E4) THEN GOSUB 1340: VTAB 15: PRINT "WU REGRETS THAT HE CANNOT LOAN": PRINT "YOU MORE AT THIS TIME, TAIPAN.";: GOSUB 760: GOTO 490 | |
520 GOSUB 1340: VTAB 15: PRINT "HOW MUCH DO YOU WISH TO ";LD$;",": PRINT "TAIPAN? ";: GOSUB 310:NUM = VAL(NUM$) | |
530 IF X$ = "A" AND LD = 1 THEN PRINT CHR$(8);: INVERSE : PRINT "ALL";: NORMAL :NUM = C *2 | |
531 IF X$ = "A" AND LD = E THEN PRINT CHR$(8);: INVERSE : PRINT "ALL";: NORMAL :NUM = D | |
540 IF LD = 2 THEN 560 | |
541 IF NUM >2 *C THEN VTAB 15: PRINT A$: VTAB 15: PRINT W$;" REGRETS THAT HE": PRINT "CANNOT LOAN YOU THAT MUCH.";: GOSUB 760: GOTO 490 | |
550 B = 1:C = C +NUM:D = D +NUM: GOSUB 130: GOTO 490 | |
560 IF NUM >C THEN NUM = C:D = D -C:C = 0: GOSUB 130: VTAB 15: PRINT W$;" THANKS YOU,": PRINT "TAIPAN, FOR THE PAYMENT.";: GOSUB 780: IF D <D THEN D = 0: GOSUB 130: GOTO 490 | |
561 IF NUM >C AND D > = 0 THEN GOSUB 130: GOTO 490 | |
570 IF NUM >D THEN D = 0:C = C -NUM: VTAB 15: PRINT W$;" THANKS YOU FOR YOUR STARTLING GENEROSITY!";: GOSUB 130: GOSUB 780: GOTO 490 | |
580 C = C -NUM:D = D -NUM: GOSUB 130: VTAB 15: PRINT W$;" ACCEPTS YOUR PAYMENT WITH GRATITUDE, TAIPAN.";: GOSUB 780: GOTO 490 | |
585 REM RANDOMIZER SUBROUTINE (590-591) | |
590 VTAB 15: HTAB 8: PRINT "PRESS <";: FLASH : PRINT "SPACEBAR";: NORMAL : PRINT "> TO START";: GOSUB 60: IF X$ = " " THEN RETURN | |
591 X = INT( RND(1) *9) +1: GOTO 590 | |
595 REM RECORDS SUBROUTINE (600-721) | |
600 HOME : INVERSE : PRINT A$;: NORMAL : PRINT " RECORDS OF HIGH & LOW PRICES": INVERSE : PRINT A$;: NORMAL : PRINT : PRINT " RECORDS BY P)ORT OR I)TEM?": PRINT " __________________________" | |
601 VTAB 10: PRINT " PRESS <SPACEBAR> WHEN FINISHED": PRINT : INVERSE : PRINT A$: NORMAL | |
610 GOSUB 60: IF X$ = "P" THEN GOSUB 720: GOTO 620 | |
611 IF X$ = "I" THEN PRINT : VTAB 5: PRINT A$;: PRINT A$: GOSUB 660: GOTO 670 | |
612 IF X$ = " " THEN HOME : RETURN | |
613 IF X$ < >"P" AND X$ < >"I" AND X$ < >" " THEN GOSUB 770: GOTO 610 | |
620 GOSUB 60: IF ASC(X$) >47 AND ASC(X$) <58 THEN X = VAL(X$) | |
621 IF ASC(X$) <48 OR ASC(X$) >57 THEN GOSUB 770: GOTO 620 | |
630 HOME : PRINT " ";L$(X);" PRICES (VISITS:";V(X);")": INVERSE : PRINT " ITEM HIGH LOW ";: NORMAL : FOR I = 0 TO 5: PRINT " ";G$(I);: HTAB 21 | |
640 IF H(X,I) = 0 THEN PRINT " ?";: HTAB 30: INVERSE : PRINT " ";: NORMAL : PRINT " ?";: NEXT I | |
641 IF H(X,I) < >0 THEN HTAB 21: PRINT H(X,I);: HTAB 30: INVERSE : PRINT " ";: NORMAL : PRINT " ";L(X,I): NEXT I | |
650 INVERSE : PRINT A$: NORMAL : GOTO 700 | |
660 VTAB 5: FOR I = 0 TO 5: PRINT " ";G$(I);: NEXT I: PRINT : PRINT " WHAT ITEM (";TC$;" ?": PRINT : PRINT A$: INVERSE : PRINT A$: NORMAL : GOSUB 260: RETURN | |
670 HOME : PRINT " ";G$(X1);" PRICES": INVERSE : PRINT " PORT VISITS HIGH LOW ";: NORMAL : FOR I = 0 TO 9: PRINT L$(I); | |
680 VTAB I +3: HTAB 12: PRINT V(I);: IF L(I,X1) = 0 THEN HTAB 21: INVERSE : PRINT " ";: NORMAL : PRINT " ?";: HTAB 32: PRINT "?": NEXT I: GOTO 690 | |
681 IF L(I,X1) < >0 THEN HTAB 21: INVERSE : PRINT " ";: NORMAL : PRINT " ";H(I,X1);: HTAB 31: PRINT " ";L(I,X1): NEXT I | |
690 INVERSE : PRINT A$: NORMAL | |
700 PRINT " PRESS <SPACEBAR> WHEN FINISHED"; | |
710 GOSUB 60: IF X$ = " " THEN 600 | |
711 GOTO 710 | |
715 REM PORT CHOICE SUBROUTINE (720) | |
720 FOR I = 0 TO 9 STEP 2: VTAB (I/2) +4: PRINT A$: VTAB (I/2) +4: PRINT I;" ";L$(I);: HTAB 20: PRINT I +1;" ";L$(I +1): NEXT I: PRINT | |
721 PRINT " WHICH PORT (0-9)?";: PRINT : INVERSE : PRINT A$: NORMAL : RETURN | |
725 REM EMBARK (730-751) | |
730 IF SH <0 THEN VTAB 13: PRINT "YOUR SHIP IS OVERLOADED, TAIPAN ";: PRINT A$: GOSUB 760: GOTO 360 | |
731 IF SH > = 0 THEN HOME : PRINT TAB( 11);: INVERSE : PRINT "EMBARKING": NORMAL : PRINT TAB( 9);"FROM ";L$(L): INVERSE : PRINT A$: NORMAL : FOR I = 0 TO 9: IF L = I THEN NEXT I: GOTO 740 | |
732 IF L < >I THEN PRINT TAB( 10);I;" ";L$(I): NEXT I | |
740 PRINT : PRINT : INVERSE : PRINT A$: NORMAL : PRINT "WHAT PORT O' CALL, TAIPAN (0-9)?" | |
750 GOSUB 60: IF ASC(X$) >47 AND ASC(X$) <58 AND VAL(X$) < >L THEN PO = VAL(X$): GOTO 980 | |
751 GOSUB 770: GOTO 750 | |
755 REM NO CAN DO SUBROUTINE (760) | |
756 REM OZZY NEXT LINE REPLACED CONTROL-G | |
760 PRINT BP$: GOSUB 780: RETURN | |
765 REM INPUT ERROR SUBROUTINE (770) | |
766 REM OZZY NEXT LINE REPLACED CONTROL-G | |
770 PRINT BP$;: RETURN | |
775 REM DELAY SUBROUTINE (780-783) | |
780 POKE -16368,0 | |
781 FOR I = 0 TO 250 | |
782 IF PEEK( -16384) >127 THEN POKE -16386,0: RETURN | |
783 NEXT I: RETURN | |
785 REM EVENTS SUBROUTINE (790-851) | |
790 IF K = 1 THEN RETURN | |
791 K = 1:X = 50 + INT( RND(1) *100) +1:GN = INT( RND(1) *3) +1:XP = (X +(GN *50)) *100: IF C <XP OR RND(1) <.75 THEN 805 | |
792 GOSUB 1340: VTAB 12: PRINT " A BROKER OFFERS TO TAKE YOUR": PRINT "VESSEL IN TRADE FOR ONE WITH": PRINT GN +G;" GUNS & ";X +MW;" CAPACITY" | |
800 PRINT "FOR ";XP;" IN CASH- WILL YOU": PRINT " ACCEPT (<Y> OR <N>)?";: GOSUB 60: VTAB 12: IF X$ = "Y" THEN C = C -XP:SH = SH +X:MW = MW +X:G = G +GN: GOSUB 130 | |
805 GOSUB 1340 | |
810 IF C >D AND D >2000 AND RND(1) >.7 THEN GOSUB 1340: VTAB 12: PRINT "YOU'VE BEEN ATTACKED AND ROBBED BY IRON LOTUS RUFFIANS, TAIPAN !";:C = INT(C/3): GOSUB 760: GOSUB 130 | |
820 GOSUB 180: GOSUB 860: GOSUB 190: GOSUB 1340:DN = INT((C/2) * RND(1)): IF RND(1) >.8 AND TR = 0 AND L < >0 THEN VTAB 12: PRINT " A MESSENGER FROM ";LY$;" ASKS": PRINT "THAT YOU RETURN TO HONGKONG" | |
821 IF RND(0) >.8 AND TR = 0 AND L < >0 THEN PRINT "WITHOUT DELAY, TAIPAN.": GOSUB 780 | |
830 IF C >100 AND TR = 0 AND L = 0 THEN GOSUB 1340: VTAB 12: PRINT YS$;", LIEUTENANTS": PRINT "OF THE MARINER, ";LY$;", ASK IF": PRINT "YOU WILL DONATE ";:Q = DN: GOSUB 1330: PRINT "TO THE TEMPLE OF TIN HAU, THE" | |
831 IF C >100 AND TR = 0 AND L = 0 THEN PRINT "SEA GODDESS. (Y) OR (N)" | |
840 IF C >0 AND TR = 0 AND L = 0 THEN GOSUB 60: IF X$ = "Y" THEN C = C -DN:TR = 1: GOSUB 130: GOSUB 1340: VTAB 12: PRINT " ": PRINT " ";YS$;" THANK": PRINT " YOU, AND DEPART.": PRINT : PRINT A$; | |
841 IF C >0 AND TR = 0 AND L = 0 THEN IF X$ < >"Y" THEN GOSUB 1340: VTAB 12: PRINT " ": PRINT " ";YS$;" DEPART": PRINT "ABRUPTLY IN A CHILLY SILENCE.": PRINT A$; | |
850 IF (TR = 0 AND L = 0) OR X$ = "Y" AND L = 0 THEN PRINT : PRINT A$;: GOSUB 780: VTAB 13: PRINT A$: PRINT : PRINT | |
851 RETURN | |
855 REM BEARS 'N' BULLS SUBROUTINE (860-910) | |
860 I = INT( RND(1) *6) | |
870 IF RND(1) <.85 THEN RETURN | |
880 GP(I) = INT(GP(I) *( RND(1) *4) +.5) | |
890 VTAB 12: PRINT L$(L);" MARKET FORCES HAVE": PRINT "DRIVEN ";G$(I);" PRICES TO ";: PRINT GP(I);: PRINT "!"; | |
900 GOSUB 780 | |
910 RETURN | |
975 REM VOYAGE (980-1290) | |
980 HOME : PRINT : INVERSE : PRINT A$;: NORMAL : PRINT " SEA VOYAGE FROM ";L$(L): PRINT " TO ";L$(PO): INVERSE : PRINT A$: NORMAL : GOSUB 780: HOME :ET = ABS(L0(L) -L0(PO)) | |
981 IF INT( RND(1) *50) +1 > INT( RND(1) *ET) +1 THEN 1290 | |
985 REM STORM (990-1022) | |
990 IF RND(1) >.5 THEN 1030 | |
991 VTAB 13: PRINT B$;: HTAB 1: PRINT " STORM, TAIPAN!": GOSUB 760 | |
1000 IF RND(1) >.2 THEN 1020 | |
1001 VTAB 14: PRINT " ANY PORT IN A STORM, ": GOSUB 760:PO = INT( RND(1) *10): IF PO = L THEN VTAB 14: PRINT " WE CAN'T MAKE IT, TAIPAN, ":SR = 0: GOTO 1090 | |
1010 VTAB 14: PRINT " WE'RE HEADED FOR SHELTER, ": GOSUB 780 | |
1020 VTAB 14: PRINT " WE RODE OUT THE STORM, TAIPAN! ": GOSUB 780 | |
1021 IF RND(1) >.5 THEN 990 | |
1022 GOTO 1290 | |
1025 REM PIRATES (1030-1281) | |
1030 HOME :ID = INT( RND(1) *2) +1: GOSUB 5290:P = INT( RND(1) *(MW/25) *2 ^(ID *2)) + INT( RND(1) *3) +1: HTAB 1: VTAB 17: PRINT P;" PIRATE CRAFT SIGHTED!": GOSUB 780: GOSUB 1100 | |
1040 IF ID = 1 THEN VTAB 19: PRINT " LOOKS LIKE INDEPENDENT PIRATES!": GOSUB 780 | |
1041 IF ID < >1 THEN VTAB 19: PRINT B$;: HTAB 1: PRINT " THERE'S ";LY$;"'S BANNER!": GOSUB 780 | |
1050 GOSUB 1100: IF ID = 1 AND RND(1) >.95 THEN VTAB 19: PRINT B$;: HTAB 1: PRINT " ";LY$;"'S FLEET DROVE'EM OFF!": GOSUB 6100:P = P * INT( RND(1) *10) +6:ID = 2: GOSUB 5290: GOSUB 1100: IF TR = 0 THEN 1070 | |
1060 IF ID = 2 AND TR = 1 THEN VTAB 19: PRINT "THEY GREET US, AND SAIL OFF. ": GOSUB 6100:P = 0: GOSUB 780: IF RND(1) >.8 THEN 1030 | |
1061 IF ID = 2 AND TR = 1 THEN 1290 | |
1070 IF CR = 0 AND TR = 0 AND ID = 2 THEN CR = 1: VTAB 19: PRINT B$;: HTAB 1: PRINT " ";YS$;" ARE CURSING US!": GOSUB 780 | |
1080 VTAB 19: PRINT " THEY'RE FIRING ON US! ": GOSUB 5380 | |
1081 IF INT( RND(1) *P) +1 > INT( RND(1) *5) +1 THEN GOSUB 5540: VTAB 19: PRINT B$;: HTAB 1: PRINT " THE BUGGERS HIT US!":SR = SR -( RND(1)/(MW/( INT( RND(1) *50) +1))): GOSUB 780: GOSUB 1100: GOTO 1090 | |
1085 VTAB 19: PRINT " MISSED US, TAIPAN! ": GOSUB 780 | |
1090 IF SR <.1 THEN GOSUB 780: VTAB 19: PRINT " WE'RE GOING UNDER, TAIPAN!";: GOSUB 6300:X$ = "": GOTO 1300 | |
1091 GOTO 1120 | |
1095 REM SHIP STATUS SUBROUTINE (1100-1110) | |
1100 HTAB 1: VTAB 16: INVERSE : PRINT A$;: NORMAL : PRINT " GUNS: ";G;" REPAIR:";: IF SR <0 THEN SR = 0 | |
1110 PRINT INT(SR *100);"% ": PRINT "SHIPS ENCOUNTERED: ";P;" ": PRINT A$;: PRINT A$;: PRINT A$;: RETURN | |
1120 VTAB 19: PRINT " SHALL WE R)UN, F)IGHT, OR P)ARLEY?": GOSUB 60: IF X$ = "R" THEN X = 1 | |
1121 IF X$ = "F" THEN X = 2 | |
1122 IF X$ = "P" THEN X = 3 | |
1123 IF X$ < >"R" AND X$ < >"F" AND X$ < >"P" THEN GOSUB 770: GOTO 1120 | |
1130 ON X GOTO 1140,1160,1200 | |
1140 IF SR < = RND(1) AND INT( RND(1) *6) +1 < = INT( RND(1) *P) +1 THEN 1150 | |
1141 IF SR > RND(1) AND INT( RND(1) *6) +1 > INT( RND(1) *P) +1 THEN 1143 | |
1142 GOTO 1150 | |
1143 GOSUB 6220: VTAB 18: PRINT " WE ESCAPED FROM 'EM TAIPAN! ":P = 0: GOSUB 780: GOSUB 1100: IF RND(1) >.8 THEN 1030 | |
1144 GOTO 1290 | |
1150 IF SR > RND(1) AND RND(1) >.6 THEN P = P - INT( INT(( RND(1) *P) +1)/2): GOSUB 6220: GOSUB 5290: VTAB 19: HTAB 1: PRINT P;" OF 'EM STILL WITH US! ": GOSUB 780: GOSUB 1100: GOTO 1050 | |
1151 VTAB 19: PRINT " CAN'T SHAKE 'EM! ": GOSUB 780: GOTO 1050 | |
1160 VTAB 19: PRINT " WE'RE FIRING ON 'EM! ": GOSUB 5540: IF INT( RND(1) *(G +1)) +1 > INT( RND(1) *4) THEN VTAB 19: PRINT B$;: HTAB 1: PRINT "HIT 'EM!": GOSUB 5680: GOTO 1170 | |
1161 VTAB 19: PRINT " MISSED 'EM! ": GOSUB 780: GOTO 1190 | |
1170 NK = RND(1): IF NK >.4 THEN IF P > = G THEN X = INT( INT(( RND(1) *(G -1)) +1)/3) +1 | |
1171 IF NK >.4 AND P <G THEN X = INT( RND(1) *P) +1 | |
1172 IF NK < = .4 THEN VTAB 19: PRINT " THEY'RE STILL AFLOAT.": GOSUB 780: GOTO 1190 | |
1180 P = P -X: VTAB 19: PRINT " SANK ";X;" OF 'EM, TAIPAN!": GOSUB 5830: IF P >0 THEN GOSUB 5290 | |
1190 GOSUB 1100: IF P = 0 THEN IF RND(1) >.5 THEN 1270 | |
1191 IF P = 0 THEN VTAB 19: PRINT " THAT'S ALL FOR THE BUGGERS!": GOSUB 780: IF RND(1) >.8 THEN 1030 | |
1192 IF P = 0 THEN 1290 | |
1193 GOSUB 780: GOTO 1050 | |
1200 IF RND(1) <.8 THEN VTAB 19: PRINT " THEY REFUSE TO PARLEY, TAIPAN. ": GOSUB 780: GOTO 1050 | |
1201 VTAB 19: PRINT " THEY AGREE TO DISCUSS TERMS. ": GOSUB 780 | |
1210 IF P >G/2 OR RND(1) >.7 THEN VTAB 19: PRINT " THEY OFFER TO LET US GO IN EXCHANGE FOR";: PRINT "ALL OUR CASH. DO WE ACCEPT? TAIPAN (Y/N)";: GOTO 1220 | |
1211 GOTO 1240 | |
1220 GOSUB 60: VTAB 19: PRINT A$;: PRINT A$;: VTAB 18: IF X$ = "Y" THEN IF RND(1) >.2 AND C >100 + INT( RND(1) *2000) THEN P = 0:C = 0: VTAB 19: PRINT " THEY TOOK IT & RAN!": GOSUB 780: GOSUB 1100: GOTO 1280 | |
1221 IF X$ < >"Y" THEN 1050 | |
1222 C = 0: VTAB 19: PRINT " THEY STILL INTEND TO FIGHT!": PRINT : PRINT A$;: GOSUB 780 | |
1230 GOSUB 780: GOTO 1050 | |
1240 VTAB 1: HTAB 13: PRINT SFL$;: VTAB 19: PRINT " THEY OFFER TO SURRENDER. ": GOSUB 780: VTAB 19: PRINT " DO WE LET THEM GIVE UP (Y/N)? ": GOSUB 60: IF X$ = "Y" THEN 1260 | |
1250 IF RND(1) >.5 AND P >0 THEN E = INT( RND(1) *P) +1:P = P -E: GOSUB 6100: VTAB 19: PRINT B$;: HTAB 1: PRINT E;OF'EMRANAWAY!":GOSUB 780:GOSUB 1100:GOSUB 5290:GOTO 1050 | |
1260 IF RND(1) >.7 THEN VTAB 19: PRINT " THEY'RE PREPARING TO ATTACK! ": GOSUB 780: GOTO 1050 | |
1265 REM CAPTURE (1270-1281) | |
1270 VTAB 19: PRINT " WE'VE CAPTURED A BIGGER SHIP!": GOSUB 760: VTAB 19: PRINT " WE'RE TRANSFERRING TO IT NOW.": GOSUB 780:G = G + INT( RND(1) *(G +1)) +1:E = SH + INT( RND(1) *(SH +150)) +1:SH = SH +E:MW = MW +E:P = 0 | |
1280 IF SR <.1 THEN 1300 | |
1281 IF P >0 THEN 1050 | |
1285 REM ARRIVAL (1290) | |
1290 CR = 0:SR = 1:L = PO:V(L) = V(L) +1:B = 0:K = 0: GOSUB 160: HOME : PRINT : INVERSE : PRINT A$;: NORMAL : PRINT " ARRIVING ";L$(L);" AFTER": PRINT " A VOYAGE OF ";ET;" DAYS.": INVERSE : PRINT A$: NORMAL : GOSUB 780: HOME : GOTO 120 | |
1295 REM THAT'S ALL FOLKS (1300-1321) | |
1300 HOME :NW = C -D:Q = NW/GT: VTAB 4: INVERSE : PRINT A$;: NORMAL : PRINT : PRINT "YOUR SCORE, BASED UPON TIME AND YOUR": PRINT "NET WORTH (EXCLUDING STOCK) IS ";: GOSUB 1330: INVERSE : PRINT A$: NORMAL | |
1310 IF X$ = "R" THEN PRINT "WOULD YOU LIKE TO PICK UP THIS": PRINT "GAME WHERE YOU LEFT OFF (Y/N)?": GOSUB 60: IF X$ = "Y" THEN HOME : GOTO 120 | |
1320 GOSUB 1340: VTAB 10: PRINT A$;: PRINT "DO YOU WISH TO START OVER (Y/N)?": GOSUB 60: IF X$ = "Y" THEN RUN | |
1321 END | |
1325 REM BIG NUMBER SUBROUTINE (1330-1370) | |
1330 IF ABS(Q) <1E6 THEN PRINT INT(Q);: NORMAL : PRINT " ": RETURN | |
1331 IF ABS(Q) <1E9 THEN Q = Q/1E6:Q$ = "MIL": GOTO 1335 | |
1332 IF ABS(Q) <1E12 THEN Q = Q/1E9:Q$ = "BIL": GOTO 1335 | |
1333 IF ABS(Q) > = 1E12 THEN Q = Q/1E12:Q$ = "TRL": GOTO 1335 | |
1335 PRINT INT(Q);Q$;: NORMAL : PRINT " " | |
1337 RETURN | |
1338 REM CLEANUP SUBROUTINE (1340-1370) | |
1340 FOR I = 12 TO 18 | |
1345 HTAB 1 | |
1350 VTAB I: PRINT A$; | |
1360 NEXT I | |
1365 PRINT : VTAB 12 | |
1370 RETURN | |
4555 REM SEA ACTION SUBROUTINES (5000-6360) | |
4557 REM GRAPHICS INITIALIZATION (5000-5120) | |
4999 REM OZZY DIM WERE 14 | |
5000 DIM CH$(13),CN$(13) | |
5005 FOR V1 = 0 TO 12 | |
5010 READ CH$(V1) | |
5020 CN$(V1) = CH$(V1) | |
5030 NEXT V1 | |
5040 DATA " : " | |
5050 DATA " ------- " | |
5060 DATA " ------- \: " | |
5070 DATA " :/ ------- \\ " | |
5075 DATA " // ------- \\\ " | |
5080 DATA "/// ------- \\\ " | |
5085 DATA "/// ------- \\ " | |
5090 DATA "/// ------- :\ " | |
5100 DATA "// ------- : " | |
5105 DATA "/: ------- -:- " | |
5110 DATA " :-- : :000: " | |
5111 DATA ": \----------/ / " | |
5112 DATA " \ / " | |
5120 RETURN | |
5290 REM PIRATES ARRIVE (5300-5370) | |
5300 GOSUB 5950 | |
5305 IF ID < >1 THEN CH$(0) = " ===: " | |
5310 FOR A = 1 TO 10: VTAB 1: PRINT AS;: NEXT A | |
5320 FOR A = 1 TO 30 | |
5340 FOR B = 0 TO 13 | |
5350 VTAB B +1: HTAB 40 -A: PRINT LEFT$(CH$(B),A),;" "; | |
5360 NEXT B: NEXT A | |
5370 RETURN | |
5380 REM PIRATES FIRE (5380-5440) | |
5390 FOR A = 1 TO INT( RND(1) *6) +1 | |
5410 A1 = INT( RND(1) *10) +1 | |
5420 IF A1 = 5 THEN 5410 | |
5430 HTAB 16 +A1: VTAB 11: PRINT "*" | |
5431 REM OZZY NEXT LINE REPLACED CTRL-G | |
5432 PRINT BP$ | |
5433 HTAB 16 +A1: VTAB 11: PRINT " " | |
5435 NEXT A | |
5440 RETURN | |
5540 REM CANNON HIT (5550-5560) | |
5549 REM OZZY NEXT LINE REPLACED CTRL-G | |
5550 PRINT BP$ | |
5560 RETURN | |
5680 REM DAMAGE 'EM (5730-5760) | |
5730 I = INT( RND(1) *17) +2:I1 = INT( RND(1) *9) +2 | |
5740 CH$(I1) = LEFT$(CH$(I1),I -1) +" " + MID$ (CH$(I1),I +1, LEN(CHS(I1))) | |
5750 HTAB 10: VTAB I1 +1: PRINT CH$(I1) | |
5755 GOSUB 780 | |
5760 RETURN | |
5830 REM PIRATES SINK (5840-5940) | |
5840 FOR A = 0 TO 12 | |
5850 VTAB A +1: PRINT A$; | |
5870 FOR A1 = 0 TO 12 -A | |
5880 VTAB 2 +A +A1: HTAB 10: PRINT CH$(A1) | |
5890 NEXT A1 | |
5910 NEXT A | |
5920 VTAB 14: PRINT A$; | |
5930 GOSUB 5950 | |
5940 RETURN | |
5950 REM REPAIR DAMAGE (5960-5990) | |
5960 FOR A = 0 TO 13 | |
5970 CH$(A) = CN$(A) | |
5980 NEXT A | |
5990 RETURN | |
6100 REM PIRATES DEPART (6110-6210) | |
6110 FOR A = 9 TO 0 STEP -1 | |
6130 FOR B = 0 TO 13 | |
6140 HTAB A +1: VTAB B +1: PRINT CH$(B);" " | |
6150 NEXT B: NEXT A | |
6160 FOR A = 22 TO 1 STEP -1 | |
6180 FOR B = 0 TO 13 | |
6190 HTAB 1: VTAB B +1: PRINT RIGHT$(CH$(B),A);" " | |
6200 NEXT B: NEXT A | |
6210 RETURN | |
6220 REM WE PULL AWAY (6230-6280) | |
6230 FOR A = 30 TO 1 STEP -1 | |
6250 FOR B = 0 TO 13 | |
6260 HTAB 40 -A: VTAB B +1: PRINT " "; LEFT$(CH$(B),A); CHR$(8);" "; | |
6270 NEXT B: NEXT A | |
6280 RETURN | |
6290 REM WE'RE SUNK! (6300-6360) | |
6300 FOR A = 1 TO 17 | |
6310 FOR B = 1 TO 100: NEXT B | |
6320 VTAB 24: HTAB INT( RND(1) *40) +1: PRINT "0" | |
6350 NEXT A | |
6360 RETURN |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment