Skip to content

Instantly share code, notes, and snippets.

@tom-seddon
Created March 26, 2015 00:02
Show Gist options
  • Save tom-seddon/5af219f42ec434003453 to your computer and use it in GitHub Desktop.
Save tom-seddon/5af219f42ec434003453 to your computer and use it in GitHub Desktop.
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