-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshiroge.bas
254 lines (209 loc) · 5.29 KB
/
shiroge.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
rem Screen settings
set tv ntsc
set romsize 4k
set kernel_options pfcolors no_blank_line background
rem Player sprite
player0:
%11101111
%01100110
%10011001
%10000001
%01010010
%00101100
%01010111
%00111101
end
pfcolors:
0
176
176
242
242
242
112
112
210
210
176
0
0
end
const BLACK = 0
const GRAY = 7
const RED = 67
const WHITE = 15
const GREEN = 198
const ZERO_LIFE_COUNT = 0
const ONE_LIFE_COUNT = 128
const TWO_LIFE_COUNT = 160
const THREE_LIFE_COUNT = 168
const END_LEVEL = 137
const BOTTOM_LEVEL = 85
rem Background color
COLUBK = BLACK
const pfscore = 1
rem Player and score color
scorecolor = GRAY
pfscorecolor = RED
rem Direction player is looking
dim direction = d
rem Next frame position
dim xnext = x
xnext = player0x
dim ynext = y
ynext = player0y
rem Position in playfield grid
dim tilex = t
dim tiley = u
rem Conversion for player to playfield coordinates
tilex = (xnext - 13) / 4
tiley = ynext / 8
rem Vertical velocity: 128 is stopped
dim vel = v
dim counter = c
counter = 0
dim jumped = j
jumped = 0
dim life = l
life = 3
dim level = score + 2
menu
playfield:
................................
................................
.XXX..XX.XXXXXXX..XX...X.X......
...XX.XX.XX...XX.XXXXXXXX.......
.XX...XX.XX...XX.X..XX...XXXXXX.
..XX.XX..XX...XX....XX..........
....XX...XXXXXXX...XX...........
..XXX....XX...XX.XXX............
................................
................................
end
player0x = 0
player0y = 0
level = 0
if joy0fire then goto level1 else goto draw
goto menu
rem Run every time a life is lost
level1
playfield:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X..........XX..................X
X..........XX..................X
X..........XX..................X
XXXXXX.....XX.......XX.........X
X........XXXX......XX..........X
X..............................X
X..............XX..............X
X..............XX..............X
X....XXX......XXX...............
XXXXXXX....XXXXXX.......XXXXXXXX
end
rem Initial position and speed
player0x = 25
player0y = 24
level = 1
goto startstage
level2
playfield:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X..............................X
X..............................X
X..............................X
X..XX......XX..................X
X...XX.........................X
X..............................X
X..............................X
X..............................X
X...................XX..........
X..........................XXXXX
end
rem Initial position and speed
player0x = 25
player0y = 25
level = 2
goto startstage
level3
playfield:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X.................X............X
X.................X............X
X.................X............X
XXXXX.............X............X
X...X......XX..................X
X.......................XXXXX..X
X..............................X
X..............................X
X...............................
X.............................XX
end
rem Initial position and speed
player0x = 25
player0y = 25
level = 3
goto startstage
startstage
vel = 128
direction{0} = 1
jumped = 1
goto main
rem Main routine
main
if switchreset then reboot
rem Buffers for player position in next frame
xnext = player0x
ynext = player0y
rem Increase vel for each 8 frames
counter = counter + 1
if counter{0} && counter{1} && counter{2} then vel = vel + 1
rem Left movement
if joy0left then xnext = xnext - 1 : direction{0} = 0
tilex = (xnext - 13) / 4 - 1
if pfread(tilex, tiley) then xnext = player0x
rem Right movement
if joy0right then xnext = xnext + 1 : direction{0} = 1
tilex = (xnext - 14) / 4 + 1
if pfread(tilex, tiley) then xnext = player0x
rem Vertical movement
if joy0up && !jumped{0} then vel = 126 : jumped{0} = 1
ynext = ynext + vel - 128
tilex = (xnext - 13) / 4
tiley = (ynext - 1) / 8
if pfread(tilex, tiley) then ynext = player0y : vel = 128 : jumped{0} = 0
tilex = tilex - 1
if pfread(tilex, tiley) then ynext = player0y : vel = 128 : jumped{0} = 0
tilex = (xnext - 14) / 4 + 1
if pfread(tilex, tiley) then ynext = player0y : vel = 128 : jumped{0} = 0
if ynext >= BOTTOM_LEVEL then goto lostlife
rem draw life bar
if life = 3 then pfscore1 = THREE_LIFE_COUNT
if life = 2 then pfscore1 = TWO_LIFE_COUNT
if life = 1 then pfscore1 = ONE_LIFE_COUNT
if life = 0 then pfscore1 = ZERO_LIFE_COUNT
rem Updating position
player0x = xnext
player0y = ynext
if player0x > END_LEVEL then goto nextlevel
rem Draw screen and setup screen registers
draw
rem Reflect sprite
if direction{0} then REFP0 = 8
rem Player color
COLUP0 = 252
rem Playfield color
COLUPF = 240
PF0 = 255
drawscreen
if level = 0 then goto menu else goto main
lostlife
if life = 0 then goto gameover
life = life - 1
on level goto menu level1 level2 level3
nextlevel
level = level + 1
on level goto menu level1 level2 level3 gameover
gameover
life = 3
if joy0fire then goto menu
goto gameover