forked from RetroBattlestations/Cannonball
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ZXSpectrum.txt
98 lines (86 loc) · 3.48 KB
/
ZXSpectrum.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
100 REM === BASIC Month 3, Cannonball
110 REM === http://reddit.com/r/RetroBattlestations
120 REM === written by FozzTexx
130 REM === ZX Spectrum ASCII version by mattinx
200 REM === Clear the screen and setup variabls
210 CLS
220 LET CL=32: LET RW=21: REM Columns and Rows of screen
230 LET CA=45: LET CN=5: REM Angle and length of cannon
240 LET CX=5: LET PX=CL-5: LET SC=0: LET LV=3
250 RANDOMIZE
260 LET LA=0: LET PXI=0: LET BXI=0: LET BYI=0
300 REM === Play game
310 LET CV=INT (RND*15)+10: GO SUB 4010: GO SUB 2010
320 GO SUB 2510
330 IF K$="A" OR K$="a" OR K$="5" THEN LET CA=CA+5: IF CA>85 THEN LET CA=85
340 IF K$="Z" OR K$="z" OR K$="8" THEN LET CA=CA-5: IF CA<15 THEN LET CA=15
350 IF K$="Q" OR K$="q" THEN STOP
360 IF K$=" " THEN GO TO 410
370 GO SUB 1010
380 GO TO 320
400 REM === Fire!
410 LET LX=(CN+1)*COS ((360-CA)*PI/180): LET LY=(CN+1)*SIN ((360-CA)*PI/180)
420 LET BX=CX+LX: LET BY=RW+LY
430 GO SUB 1510
440 LET VX=CV*COS ((360-CA)*PI/180): LET VY=CV*SIN ((360-CA)*PI/180)
500 REM === Move player and animate ball
510 GO SUB 2510
520 IF K$="5" THEN LET PX=PX-1: IF PX<CX+CN THEN LET PX=CX+CN
530 IF K$="8" THEN LET PX=PX+1: IF PX>CL-1 THEN LET PX=CL-1
540 GO SUB 2010
550 LET BX=BX+(VX/10): LET BY=BY+(VY/10): GO SUB 1510
560 LET VY=VY+2
570 IF BY<RW THEN GO TO 510
580 LET P$=" ": LET X1I=BXI: LET Y1I=BYI: GO SUB 3510
600 REM === Score or die
610 LET LX=BX-BXI: LET LY=BY-BYI: LET L2=RW-BYI: LET LA=0
620 LET IX=BXI+LX*(L2/LY)
630 IF IX>=PX-1 AND IX<=PX+1 THEN LET SC=SC+10: GO TO 310
640 LET LV=LV-1: GO SUB 4010
650 IF LV<1 THEN LET P$="Game Over": LET X1I=INT ((CL-LEN P$)/2): LET Y1I=INT (RW/2): GO SUB 3510: STOP
660 GO TO 310
1000 REM === Draw Cannon
1010 LET P$="Angle: "+STR$ CA+" ": LET X1I=2: LET Y1I=2: GO SUB 3510
1030 IF CA=LA THEN RETURN
1040 LET LX=CN*COS ((360-LA)*PI/180): LET LY=CN*SIN ((360-LA)*PI/180)
1050 LET X1=CX: LET Y1=RW: LET X2=X1+LX: LET Y2=Y1+LY: LET P$=" ": GO SUB 3010
1060 LET LX=CN*COS ((360-CA)*PI/180): LET LY=CN*SIN ((360-CA)*PI/180)
1070 LET X2=X1+LX: LET Y2=Y1+LY: LET P$="%": GO SUB 3010
1080 LET LA=CA: RETURN
1500 REM === Draw ball
1510 LET X1I=INT BX: LET Y1I=INT BY: LET P$="o": GO SUB 3510
1520 IF BXI<>X1I OR BYI<>Y1I THEN LET X1I=BXI: LET Y1I=BYI: LET P$=" ": GO SUB 3510
1530 LET BXI=INT BX: LET BYI=INT BY
1540 RETURN
2000 REM === Draw Player
2010 LET P$="U": LET X1I=INT PX: LET Y1I=INT RW: GO SUB 3510
2020 IF PXI<>X1I THEN LET X1I=PXI: LET P$=" ": GO SUB 3510
2030 LET PXI=INT PX
2040 RETURN
2500 REM === Read the keyboad
2510 LET K$=INKEY$
2520 RETURN
3000 REM === Plot a line
3010 LET X1I=INT X1: LET X2I=INT X2: LET Y1I=INT Y1: LET Y2I=INT Y2
3020 LET DXI=ABS (X2I-X1I): LET SXI=-1: IF X1I<X2I THEN LET SXI=1
3030 LET DYI=ABS (Y2I-Y1I): LET SYI=-1: IF Y1I<Y2I THEN LET SYI=1
3040 LET ERI=-DYI: IF DXI>DYI THEN LET ERI=DXI
3050 LET ERI=ERI/2
3060 GO SUB 3510
3070 IF X1I=X2I AND Y1I=Y2I THEN RETURN
3080 LET E2I=ERI
3090 IF E2I>-DXI THEN LET ERI=ERI-DYI: LET X1I=X1I+SXI
3100 IF X1I=X2I AND Y1I=Y2I THEN RETURN
3110 IF E2I<DYI THEN LET ERI=ERI+DXI: LET Y1I=Y1I+SYI
3120 IF X1I=X2I AND Y1I=Y2I THEN RETURN
3130 GO TO 3060
3500 REM === Plot a point
3510 IF X1I<1 OR X1I>CL OR Y1I<1 OR Y1I>RW THEN RETURN
3520 PRINT AT Y1I-1,X1I-1;P$
3540 RETURN
4000 REM === Show score/lives/velocity
4010 LET P$="Velocity: "+STR$ CV+" ": LET X1I=2: LET Y1I=1: GO SUB 3510
4020 LET P$="Score: "+STR$ SC: LET X1I=INT (CL/2): GO SUB 3510
4025 LET LVE=LV+3: IF LVE>6 THEN LET LVE=6
4030 LET P$=" UUU"(LV+1 TO LVE): LET X1I=CL-3: GO SUB 3510
4040 RETURN