-
Notifications
You must be signed in to change notification settings - Fork 0
/
fallingsnake.bas
258 lines (220 loc) · 8.45 KB
/
fallingsnake.bas
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
CLS:NEW
0 REM INIT - SET TO 40X30 CHARS SCREEN ---
1 SCREEN 0
2 HM$=CHR$(19) : REM HOME CHARACTER
3 DIM EX(9)
4 FOR T=0TO8: READ C: EX(T)=C: NEXT : REM READ PETSCII EXPLOSION
5 TS = 0 : REM SET TOP SCORE
6 DIM CO(6): CO(0)=9: CO(1)=11: CO(2)=12: CO(3)=15: CO(4)=5: CO(5)=6
7 DIM IO(6): IO(0)=$66: IO(1)=$6F: IO(2)=$54: IO(3)=$75: IO(4)=$58: IO(5)=$1E
10 GOSUB 1000 : REM READ SPRITE DATA
11 GOSUB 1030 : REM SETUP LAYER 0 AND 1
12 GOSUB 1050 : REM SETUP SPRITE 0
49 REM TITLE SCREEN -----------------
50 REM SET COLORS TO BLACK AND WHITE, CLEAR SCREEN
51 GOSUB 1025
52 COLOR 2,0: CLS : GOSUB 4000: GOSUB 1020: REM PRINT TITLE
53 PRINT " y y y "
54 PRINT " y y y "
55 PRINT " y y y y"
56 PRINT " y y y y y y"
57 PRINT " y y y y" : COLOR 11,0
58 PRINT " FALLING SNAKE":COLOR 12
59 PRINT " FALLING SNAKE":COLOR 14
60 PRINT " **";:COLOR 1
61 PRINT "FALLING SNAKE";: COLOR 14: PRINT "**": PRINT: COLOR 15
62 PRINT : PRINT
63 COLOR 7: PRINT " HI-SCORE: "+STR$(TS)
64 PRINT : PRINT : PRINT : COLOR 15
65 PRINT " SIMON SNAKE IS FALLING"
66 PRINT " DOWN A HOLE!": PRINT
67 PRINT " AVOID ALL OBSTACLES": PRINT: PRINT
68 COLOR 7: PRINT " PRESS SPACE TO START"
70 BA$=CHR$(113):BB$=CHR$(119) : REM BALL SYMBOLS
71 COLOR 2,0 : PRINT " "+BA$
72 PRINT " "+BA$:PRINT " "+BA$
73 PRINT " "+BA$+BA$+BA$+BA$+BA$+BA$+BA$+BA$+BA$;:COLOR 8:PRINT BB$;
74 COLOR 2: PRINT "="
75 X0=150: Y0=68: GOSUB 1070 : REM SET SPRITE X,Y
76 D0=0: GOSUB 1080 : REM SET SPRITE DATA OFFSET
77 GOSUB 1020
80 C0=C0+1: IF C0>2 THEN C0=0: C1=C1+1: IF C1>255 THEN C1=0:
82 VPOKE 1,$FA1C,C1: VPOKE 1,$FA1D,C1
85 GET A$: IF A$="" GOTO 80 : REM WAIT FOR KEY
99 REM START GAME -----------------
100 COLOR 1,0: CLS : GOSUB 1025: GOSUB 3500 : GOSUB 1020
101 FOR T=1TO29:PRINT:NEXT
102 BO=29*256:SI=102:HI=83 : REM BOTTOMSCREENOFFSET, STONEIMAGE
103 PO=15*256:PI=81:PC=2:PX=20 : REM PLAYEROFFSET, PLAYERIMAGE, PLAYERCOLOR
104 DE=250 : REM DELAY VALUE
105 S=0 : REM SET SCORE
106 D0=4: GOSUB 1080 : REM SET SPRITE DATA OFFSET
107 OI=0 : REM OBSTACLE IMAGE
108 CC=0:L=0
199 REM GAME LOOP -----------------
200 GET A$
201 IF A$=CHR$(29) AND PX<40 THEN PX=PX+1 : REM GO RIGHT
202 IF A$=CHR$(157) AND PX>0 THEN PX=PX-1: REM GO LEFT
210 X=INT(RND(1)*40)*2: C=INT(RND(1)*15)+1 : REM GET RANDOM STONE POSITION
211 O=PO+(PX*2): PE=VPEEK( 0, O )
212 IF PE<>32 THEN O0=O: C0=PE: D0=1: GOSUB 500 : IF D0=1 THEN GOTO 400
225 R=( INT(RND(1)*5) ): IF RND(1) > .95 THEN R=5
226 C=CO(R): I=IO(R)
231 VPOKE 0, BO+X, I: VPOKE 0, BO+X+1, C
235 VPOKE 0, PO+(PX*2), PI: VPOKE 0, PO+(PX*2)+1, PC
280 CL=CL+1: C2=C2+1: TI=0
281 IF CL>2 THEN CL=0: CC=1-CC : LO=255:HI=8: IF CC=1 THEN LO=15:HI=1
282 IF C2>10 THEN C2=0: N0=DE: O0=2: GOSUB 3010 : N0=S: O0=56: GOSUB 3000
284 VPOKE 1,$FA0C,LO: VPOKE 1,$FA0D,HI
295 X0=PX*8: Y0=122: GOSUB 1070 : REM SET SPRITE X,Y
300 FOR W=1 TO DE: NEXT : REM DELAY, SLOW DOWN CODE
305 PRINT : S=S+1 : DE=DE-1 : IF DE<0 THEN DE=0
310 GOTO 200
399 REM GAME OVER -----------------
400 GOSUB 1025 : IF S>TS THEN TS=S
401 REM DRAW EXPLOSION
402 FOR XX=0TO2:FOR YY=0TO2
403 XS=XX+PX-1: YS=YY+15-1 : REM SCREEN X,Y
404 IF PX<1 THEN XS=XX+1 : REM CHECK PLAYER X TO BE ON SCREEN
405 IF PX>38 THEN XS=XX+38
406 DO=XX+(YY*3):SO=(XS*2)+(YS*256) : REM CALC DATA OFFSET, SCREEN OFFSET
407 VPOKE 0,SO,EX(DO) : REM WRITE TO SCREEN
408 VPOKE 0,SO+1,1 : REM WRITE TO SCREEN
409 NEXT:NEXT
410 REM EXPLOSION COLOR EFFECT
411 FOR T=1 TO 50
412 C0=INT(RND(1)*255)
413 C1=INT(RND(1)*255)
414 VPOKE 1,$FA00,C0: VPOKE 1,$FA01,C1
415 NEXT: VPOKE 1,$FA00,0: VPOKE 1,$FA01,0
421 PRINT HM$:PRINT:PRINT:COLOR 14: PRINT " GAME OVER": PRINT
422 COLOR 1: PRINT " SCORE: "+STR$(S);
425 PRINT " HI-SCORE="+STR$(TS)
430 COLOR 7: PRINT: PRINT " PRESS SPACE TRY AGAIN" : PRINT:PRINT
440 GET A$
441 C0=C0+1: IF C0>2 THEN C0=0: C1=C1+1: IF C1>255 THEN C1=0:
442 VPOKE 1,$FA1C,C1: VPOKE 1,$FA1D,C1
450 IF A$ = "" OR A$=CHR$(29) OR A$=CHR$(157) THEN GOTO 440
452 GOTO 50
500 REM CHECK COLISSION ---
501 D0 = 1
502 IF C0 = $58 THEN S=S+50 : D0=0: GOSUB600 : REM GOT FOOD = EXTRA POINTS
503 IF C0 = $1E THEN DE=DE+100 : D0=0: GOSUB630 : REM GOT "SLOW DOWN" SYMBOL
505 RETURN
599 REM WRITE "50" ON SCREEN
600 VPOKE 0,O0-256,$35 : VPOKE 0,2+O0-256,$30
601 VPOKE 0,1+O0-256,1 : VPOKE 0,3+O0-256,1
602 RETURN
629 REM WRITE "SLOW" ON SCREEN ---
630 VPOKE 0,O0-4-256,$13 : VPOKE 0,2+O0-4-256,$0C:
631 VPOKE 0,4+O0-4-256,$0F :VPOKE 0,6+O0-4-256,$17
632 VPOKE 0,1+O0-4-256,1 : VPOKE 0,3+O0-4-256,1
633 VPOKE 0,5+O0-4-256,1 : VPOKE 0,7+O0-4-256,1
634 RETURN
999 REM SPRITE ROUTINES ---
1000 REM READ SPRITE DATA ---
1001 FOR I=O TO 255
1011 READ PX
1012 VPOKE $0,$4000+I,PX
1013 NEXT I
1014 RETURN
1019 REM ENABLE SPRITES ---
1020 POKE $9F29,($40 OR PEEK($9F29))
1021 RETURN
1019 REM DISABLE SPRITES ---
1025 POKE $9F29,PEEK($9F29) AND ($FF - $40)
1026 RETURN
1030 REM SETUP 2 LAYERS SCREEN ---
1031 POKE $9F29,($20 OR $10 OR PEEK($9F29))
1032 POKE $9F2F, PEEK( $9F36)
1033 POKE $9F2D, PEEK( $9F34)
1034 POKE $9F2E, $00: POKE $9F35, $0F
1035 COLOR 1,0: CLS
1040 RETURN
1049 REM INIT SPRITE ---
1050 POKE $9F29,($40 OR PEEK($9F29)): PO=0
1051 REM SET SPRITE DATA
1053 VPOKE $1,$FC11,$02 : REM 4BPP, ADDRESS $04000
1060 VPOKE $1,$FC16,$0C : REM NO COLLISION, ZDEPTH 3, NO FLIP
1061 VPOKE $1,$FC17,$50+PO : REM 16X16 PIXELS, PALETTE OFFSET PO
1062 RETURN
1069 REM INIT SPRITE ---
1070 REM SET SPRITE 0,X0,Y0
1071 VPOKE $1,$FC12,X0 AND $FF
1072 VPOKE $1,$FC13,(X0 AND $0300)/$100
1073 VPOKE $1,$FC14,Y0 : REM YPOS 128
1074 VPOKE $1,$FC15,$00
1075 RETURN
1080 REM SET SPRITE IMG DATA ---
1081 VPOKE $1,$FC10,D0
1082 RETURN
2499 REM CLEAR LINE FAST(O0,P0,C0) ---
2500 FOR X=0TO39 STEP 10: O=(X*2)+O0
2501 VPOKE 0,O,P0: VPOKE 0,O+1,C0:VPOKE 0,O+2,P0: VPOKE 0,O+3,C0
2503 VPOKE 0,O+4,P0: VPOKE 0,O+5,C0:VPOKE 0,O+6,P0: VPOKE 0,O+7,C0
2505 VPOKE 0,O+8,P0: VPOKE 0,O+9,C0:VPOKE 0,O+10,P0: VPOKE 0,O+11,C0
2507 VPOKE 0,O+12,P0: VPOKE 0,O+13,C0:VPOKE 0,O+14,P0: VPOKE 0,O+15,C0
2509 VPOKE 0,O+16,P0: VPOKE 0,O+17,C0:VPOKE 0,O+18,P0: VPOKE 0,O+19,C0
2515 NEXT
2516 RETURN
2999 REM UPDATE SCORE ---
3000 S$=STR$(N0 + 1000000)
3001 FOR T=2TOLEN(S$)-1
3002 C=ASC(MID$(S$,T+1))
3004 VPOKE 0,7676+O0+(T*2),C
3005 NEXT
3006 RETURN
3009 REM UPDATE SPEED DISPLAY ---
3010 S$=STR$(N0 + 1000)
3011 FOR T=2TOLEN(S$)-1
3012 C=ASC(MID$(S$,T+1))
3014 VPOKE 0,7676+O0+(T*2),C
3015 NEXT
3016 RETURN
3499 REM INIT EXTRA LAYER FOR GAMELOOP ---
3500 O0=7680:P0=32:C0=$5D:GOSUB 2500
3501 O0=7936:P0=$79:C0=$DB:GOSUB 2500
3502 OF=7936+256:P0=32:C0=0
3503 FOR T=0TO27:O0=OF+(T*256):GOSUB2500:NEXT
3510 RETURN
3999 REM INIT EXTRA LAYER FOR GAMEOVER/TITLE ---
4000 OF=7936-256:P0=32:C0=0
4001 FOR T=0TO29:O0=OF+(T*256):GOSUB2500:NEXT
4002 RETURN
10000 REM PETSCI EXPLOSION ---
10001 DATA $4D, $20 , $4E, $20, $D6, $20, $4E, $20, $4D
10999 REM SPRITE DATA ---
11000 DATA $00, $00, $22, $22, $22, $22, $00, $00
11001 DATA $00, $22, $82, $82, $82, $82, $22, $00
11002 DATA $02, $88, $88, $28, $28, $28, $28, $20
11003 DATA $28, $08, $08, $22, $22, $22, $82, $8b
11004 DATA $28, $88, $88, $20, $00, $28, $28, $b0
11005 DATA $02, $82, $82, $00, $02, $82, $8b, $00
11006 DATA $00, $22, $20, $00, $28, $22, $b0, $00
11007 DATA $00, $20, $20, $28, $22, $2b, $00, $00
11008 DATA $00, $00, $02, $82, $2b, $b0, $00, $00
11009 DATA $00, $00, $28, $2b, $b0, $00, $00, $00
11010 DATA $00, $00, $82, $00, $00, $00, $00, $00
11011 DATA $00, $00, $22, $92, $00, $00, $00, $00
11012 DATA $00, $00, $0b, $22, $92, $92, $00, $00
11013 DATA $00, $00, $00, $00, $22, $29, $92, $00
11014 DATA $00, $00, $00, $00, $00, $00, $22, $20
11015 DATA $00, $00, $00, $00, $00, $00, $00, $22
11999 REM SPRITE DATA ---
12000 DATA $00, $22, $22, $00, $00, $00, $00, $00
12001 DATA $02, $88, $88, $20, $00, $00, $00, $00
12002 DATA $28, $08, $80, $82, $00, $00, $00, $00
12003 DATA $28, $88, $88, $82, $00, $00, $00, $00
12004 DATA $02, $88, $88, $20, $00, $00, $00, $00
12005 DATA $00, $28, $82, $00, $00, $00, $00, $00
12006 DATA $00, $02, $20, $00, $00, $00, $00, $00
12007 DATA $00, $20, $02, $00, $00, $00, $00, $00
12008 DATA $00, $00, $00, $00, $00, $00, $00, $00
12009 DATA $00, $00, $00, $00, $00, $00, $00, $00
12010 DATA $00, $00, $00, $00, $00, $00, $00, $00
12011 DATA $00, $00, $00, $00, $00, $00, $00, $00
12012 DATA $00, $00, $00, $00, $00, $00, $00, $00
12013 DATA $00, $00, $00, $00, $00, $00, $00, $00
12014 DATA $00, $00, $00, $00, $00, $00, $00, $00
12015 DATA $00, $00, $00, $00, $00, $00, $00, $00
50000 REM END