Created
March 26, 2015 00:02
-
-
Save tom-seddon/5af219f42ec434003453 to your computer and use it in GitHub Desktop.
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
10REM>IWAR | |
20REM SPACE WAR | |
30REM Jobst Brandt 1/4/82 | |
40REM Chris Osborn 22/3/15 | |
50REM (conv Apple II -> IBM CGA) | |
60REM Tom Seddon 25/3/15 | |
70REM (conv IBM CGA -> BBC Micro) | |
80D$="25/3/15" | |
90DIMC(46),OA(21,3),S(16,2),E(8,2),Q(4),V1$(2),N$(2),A1$(2) | |
100REM Star locs and size: Xmax=720, Ymax=360, Smax=0, Smin=0 | |
110DATA 0,0,0,0,10,0,-2,0,0,2,-1,0,3,2,-8,0,-2,-2,-4,0,-4 | |
120DATA -2,4,-2,4,0,2,-2,8,0,-3,2,1,0,0,2 | |
130DATA -2,6,-2,-6,-6,-2,6,-2,2,-6,2,6,6,2,-6,2 | |
140FORI=1TO4:READQ(I):NEXT:FORI=1TO16:FORJ=1TO2:READS(I,J):NEXTJ,I:FORI=1TO8:FORJ=1TO2:READE(I,J):NEXTJ,I | |
150GOSUB2400:G=R1 | |
160REM - Q CONTAINS Xlim,Ylim(screen),Distance,Maxsize(stars) | |
170M=INT(2*FNRND+1):O=0 | |
180N1$="9":P$="2" | |
190GOSUB2100 | |
200CLS | |
210F1=0:F2=0:F3=0:V1$(1)="20":V1$(2)="20" | |
220PRINTTAB(21,1);:PRINT"(";P$;") One or two players? "; | |
230INPUT"";A$:P1$=A$ | |
240GOSUB1870:IFR1<>0ONR1GOTO330,330,330,310,330,2550 | |
250IFA$=""THENA$=P$ | |
260Q=VAL(A$) | |
270IFQ<>1ANDQ<>2THEN220 | |
280NP=Q | |
290P$=STR$(NP) | |
300IFNP=2THEN330 | |
310N$(1)="Player":N$(2)="Enemy" | |
320GOTO400 | |
330N$(1)="Spock":N$(2)="Darth":FORJ=1TO2 | |
340PRINTTAB(21,1);:PRINT"("N$(J)") Name of captain #";J;" "; | |
350INPUT"";A$ | |
360P1$=A$:GOSUB1870:IFR1<>0ONR1GOTO320,480,320,310,320,2550 | |
370IFA$=""THEN390 | |
380P1$=A$:GOSUB2300:N$(J)=R1$ | |
390NEXTJ | |
400PRINTTAB(21,1);:PRINT"(";N1$;") How many stars? (0 to 18): "; | |
410INPUT"";A$ | |
420P1$=A$:GOSUB1870:IFR1<>0ONR1GOTO320,510,510,510,320,2550 | |
430IFA$=""THENA$=N1$ | |
440N=VAL(A$) | |
450IFABS(N)<0ORABS(N)>18THEN400 | |
460N1$=STR$(N) | |
470REM O=Black hole | |
480O=0:IFN<0THENO=1 | |
490N=ABS(N) | |
500Q(4)=INT(10-N/6) | |
510Q(3)=INT(Q(2)/3)-N | |
520CLS | |
530REM ** MAKE STARS | |
540N=N+O | |
550ResetI=0:FORI=1TON | |
560R=0 | |
570R=R+1:ResetJ=0 | |
580IFR>20THENResetI=1:I=N+1:GOTO680 | |
590OA(I,3)=Q(4) | |
600REM -- J: 1 = Xpos, 2 = Ypos, 3 = Mass/Size -- | |
610FORJ=3TO1STEP-1 | |
620OA(I,J)=INT((Q(J)-2*OA(I,3))*FNRND+OA(I,3)) | |
630NEXTJ | |
640FORJ=1TOI-1:IFJ>I-1THEN670 | |
650T=(OA(I,3)+OA(J,3)+10)^2 | |
660IF(OA(I,1)-OA(J,1))^2+(OA(I,2)-OA(J,2))^2<TTHENJ=I-2:ResetJ=1 | |
670NEXTJ:IFResetJTHEN570 | |
680NEXTI:IFResetITHEN550 | |
690REM ** PLACE SPACE SHIPS | |
700REM -- Space ship size = 5 -- | |
710OA(N+1,3)=5:OA(N+2,3)=5 | |
720FORJ=1TO2 | |
730T=4*LEN(N$(J)):IFT<10THENT=10 | |
740IFJ=1THENI=.28*Q(1):Q=0:GOTO760 | |
750T=-T:I=-.28*Q(1):Q=Q(1) | |
760R=0 | |
770R=R+1:ResetK=0 | |
780IFR>20THENJ=3:ResetJ=1:GOTO860 | |
790X=INT(I*FNRND)+Q+T | |
800Y=INT((Q(2)-30)*FNRND+20) | |
810FORK=1TON | |
820IF(X-OA(K,1))^2+(Y-OA(K,2))^2<(OA(K,3)*2)^2THENK=N+1:ResetK=1 | |
830NEXTK:IFResetKTHEN770 | |
840OA(N+J,1)=X | |
850OA(N+J,2)=Y | |
860NEXTJ:IFResetJTHEN550 | |
870A1$(1)="0":A1$(2)="180" | |
880IFNP>1THENA$=N$(1):N$(1)=N$(2):N$(2)=A$ | |
890REM ** PLOT STARS | |
900MODE0 | |
910Z1=3.14159*(1/180) | |
920FORI=0TO45 | |
930C(I+1)=COS(I*10*Z1) | |
940NEXTI | |
950FORI=1TON-O | |
960FORJ=1TO37 | |
970X=INT(OA(I,1)+OA(I,3)*C(J)+.5) | |
980Y=INT(OA(I,2)-OA(I,3)*C(J+9)+.5) | |
990IFJ=1THENPROCMOVE(X,Y) | |
1000PROCLINETO(X,Y) | |
1010NEXTJ | |
1020NEXTI | |
1030REM**PLOT SPACE SHIPS | |
1040FORI=1TO2 | |
1050P1=OA(N+I,1):P2=OA(N+I,2):P3$=N$(I):P4=I:GOSUB1970 | |
1060NEXTI | |
1070IFMID$(A$,1,1)="I"THEN1310 | |
1080GOTO1110 | |
1090REM**PLAY GAME | |
1100M=M-INT(M/2)*2+1 | |
1110IFNP=1THENM=1 | |
1120PRINTTAB(23,26);:PRINT"("+A1$(M)+") ";N$(M);"'s, launch angle: "; | |
1130B=20:F1=1 | |
1140INPUT"";A$ | |
1150IFA$=""THENA$=A1$(M) | |
1160P1$=A$:GOSUB1870:IFR1<>0ONR1GOTO1230,1010,1230,310,1230,2550 | |
1170A=VAL(A$) | |
1180A=-SGN(A)*(ABS(A)-INT(ABS(A)/360)*360) | |
1190A1$(M)=STR$(-A) | |
1200IFN=0THEN1310 | |
1210PRINTTAB(23,26); | |
1220PRINT"(";V1$(M);") ";N$(M);"'s initial velocity: "; | |
1230INPUT"";A$ | |
1240IFA$=""THENA$=V1$(M) | |
1250P1$=A$:GOSUB1870:IFR1<>0ONR1GOTO1230,1010,1320,310,1230,2550 | |
1260B=VAL(A$) | |
1270IFB>=0ANDB<=20THEN1300 | |
1280PRINTTAB(22,26);:PRINT"Velocity must be from 0 to 20" | |
1290GOTO1210 | |
1300V1$(M)=STR$(B) | |
1310U1=0:U2=0:V1=0:V2=0:F3=0 | |
1320X=.35*B*COS(A*Z1) | |
1330Y=.35*B*SIN(A*Z1) | |
1340U=X+OA(N+M,1)+8*COS(A*Z1) | |
1350V=Y+OA(N+M,2)+8*SIN(A*Z1) | |
1360P1=U:P2=V:GOSUB2020 | |
1370IFF2THEN1430 | |
1380REM**DRAW ROCKET PATH | |
1390U1=INT(U+.5):V1=INT(V+.5) | |
1400IFU1<>U2ORV1<>V2THENP1=U1:P2=V1:GOSUB2080 | |
1410U2=U1:V2=V1 | |
1420REM -- E = Xforce, F = Yforce -- | |
1430E=0:F=0 | |
1440FORJ=1TON | |
1450R5=OA(J,1)-U | |
1460R6=OA(J,2)-V | |
1470R4=R5^2+R6^2 | |
1480R3=SQR(R4) | |
1490R2=R5/R3 | |
1500R1=R6/R3 | |
1510G=.017*(OA(J,3)^3)/R4 | |
1520E=E+G*R2 | |
1530F=F+G*R1 | |
1540NEXTJ | |
1550X=X+E | |
1560Y=Y+F | |
1570U=U+X | |
1580V=V+Y | |
1590REM**FIND COLLISIONS | |
1600IFF2THEN1660 | |
1610SkipJ=0:FORJ=1TON+2 | |
1620IFJ=N+1THEN1650 | |
1630IFOANDJ=NTHEN1650 | |
1640IF(U-OA(J,1))^2+(V-OA(J,2))^2<OA(J,3)^2THENF1=J:J=N+3:SkipJ=1 | |
1650NEXTJ:IFSkipJTHENJ=F1:GOTO1750 | |
1660IFU<-Q(1)ORU>Q(1)*2ORV<-Q(2)ORV>Q(2)*2THEN1100 | |
1670F2=(U<0ORU>Q(1)ORV<0ORV>Q(2)) | |
1680REM -- F2=F3 (no change............) -- | |
1690REM -- F2=1 (just went off screen.) -- | |
1700REM -- F3=1 (just came onto screen) -- | |
1710IFF2=F3THEN1370 | |
1720IFF3THENP1=U:P2=V:GOSUB2020 | |
1730F3=F2 | |
1740GOTO1370 | |
1750REM**MAKE EXPLOSIONS | |
1760P1=U+2:P2=V+2:GOSUB2020 | |
1770FORI=1TO8:P1=E(I,1):P2=E(I,2):GOSUB2040:NEXT | |
1780IFJ<=NTHEN1100 | |
1790PRINTTAB(23,16); | |
1800PRINTN$(M);" destroyed ";N$(J-N);"'s ship!"; | |
1810PRINT" (Y) Again? : "; | |
1820INPUT"";A$ | |
1830IFLEFT$(A$,2)="//"THEN2440 | |
1840A$=LEFT$(A$,1):IFA$="D"ORA$="I"THEN900 | |
1850IFA$="N"ORA$="E"THEN2440 | |
1860GOTO200 | |
1870REM**INPUT | |
1880P1$=LEFT$(P1$,1) | |
1890IFP1$=""THENR1=0:RETURN | |
1900P=7 | |
1910P=P-1:IFP=0THEN1960 | |
1920IFMID$("BDHS/E",P,1)=P1$THEN1940 | |
1930GOTO1910 | |
1940IFMID$(A$,1,2)="//"THENP=6 | |
1950IFP=3THENGOSUB2100 | |
1960R1=P:RETURN | |
1970REM**MAKE SHIPS | |
1980S=(P4-1)*2-1 | |
1990GOSUB2020 | |
2000FORK=1TO16:P1=S(K,1)*S:P2=S(K,2):GOSUB2040:NEXT | |
2010RETURN | |
2020REM**G CURSOR | |
2030CX=P1:CY=P2:RETURN | |
2040REM**DRAW LINE | |
2050PROCLINE(CX,CY,CX+P1,CY+P2) | |
2060CX=CX+P1:CY=CY+P2 | |
2070RETURN | |
2080PROCLINE(CX,CY,P1,P2) | |
2090CX=P1:CY=P2:RETURN | |
2100REM**HELP | |
2110MODE0 | |
2120PRINT"SPACE WAR ";D$ | |
2130PRINTTAB(31,1)"Commands:"TAB(32,2)"H = Help"TAB(32,3)"S = Start"TAB(32,4)"D = Display"TAB(32,5)"I = Instant replay after hit"TAB(27,6)"/ or B = Back"TAB(26,7)"// or E = Exit"TAB(17,17)"Negative number of stars gives a BLACK HOLE" | |
2210PRINTTAB(19,22)"(Y) Are you ready to play? (Y/N): "; | |
2220INPUT"";A$ | |
2230A$=LEFT$(A$,2):IFA$>""THENA=ASC(A$):A$=CHR$(A-32*(A>96ANDA<123))+MID$(A$,2) | |
2240IFA$="N"ORA$="E"ORA$="//"THEN2280 | |
2250IFA$="H"THEN2110 | |
2260RETURN:POKE 49232,0:POKE 49239,0 | |
2270RETURN | |
2280CLS | |
2290END | |
2300REM**FUNCTION DOWNSHIFT | |
2310M=0:IFP1$=""THENRETURN | |
2320FORI=1TOLEN(P1$) | |
2330K=ASC(MID$(P1$,I,1)) | |
2340IFK=32THENM=0 | |
2350IFK<65ORK>91THEN2380 | |
2360IFMTHENP1$=MID$(P1$,1,I-1)+CHR$(K+32)+MID$(P1$,I+1) | |
2370M=1 | |
2380NEXTI | |
2390R1$=P1$:RETURN | |
2400REM**SYSPARAMS | |
2410R1=1:Q(1)=639:Q(2)=175 | |
2420RETURN | |
2430REM**EXIT | |
2440MODE7 | |
2450END | |
2460: | |
2470DEFFNRND:=RND(1) | |
2480DEFFNX(X):=X*2 | |
2490DEFFNY(Y):=1023-Y*4 | |
2500DEFPROCMOVE(X,Y):MOVEFNX(X),FNY(Y):ENDPROC | |
2510DEFPROCLINETO(X,Y):DRAWFNX(X),FNY(Y):ENDPROC | |
2520DEFPROCLINE(X0,Y0,X1,Y1):PROCMOVE(X0,Y0):PROCLINETO(X1,Y1):ENDPROC |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment