00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "gfx.h"
00024
00025
00026
00027 extern u_char grass1[8];
00028 extern u_char grass1_attr[8];
00029 extern u_char grass2[8];
00030 extern u_char grass2_attr[8];
00031 extern u_char water1[8];
00032 extern u_char water2[8];
00033 extern u_char water3[8];
00034
00035 extern u_char spaceship[32];
00036 extern u_char fire[32];
00037
00038
00039
00040
00041 #define MAP_WIDTH 32
00042 #define MAP_HEIGHT 24
00043 #define MAP_SIZE MAP_WIDTH * MAP_HEIGHT
00044
00045
00046
00047
00048 #define KEEP_RANGE(var, min, max) \
00049 if (var < min) var = min; else if (var > max) var = max
00050
00051
00052
00053
00054 void show_map(u_char *map, int line_start) {
00055 int y, addr;
00056 u_char *l;
00057
00058 l = map + (line_start * MAP_WIDTH);
00059 addr = 6144;
00060 for (y = line_start; y < MAP_HEIGHT; y++) {
00061 vwrite(l, addr, MAP_WIDTH);
00062 addr += MAP_WIDTH;
00063 l += MAP_WIDTH;
00064 }
00065 l = map;
00066 for (y = 0; y < line_start; y++) {
00067 vwrite(l, addr, MAP_WIDTH);
00068 addr += MAP_WIDTH;
00069 l += MAP_WIDTH;
00070 }
00071 }
00072
00073 void map_fill_line(u_char* line, int river_width, int river_offs) {
00074 int river_left;
00075 u_char *last;
00076
00077 river_left = (MAP_WIDTH - river_width) / 2 + river_offs;
00078 last = line + MAP_WIDTH;
00079
00080 while (river_left--)
00081 *line++ = (get_rnd() & 1) + '%';
00082
00083 while (river_width--)
00084 *line++ = (get_rnd() % 3) + '"';
00085
00086 while (line < last)
00087 *line++ = (get_rnd() & 1) + '%';
00088 }
00089
00090 void randomize_river(int *width, int *offs) {
00091 *width += (get_rnd() & 2) - 1;
00092 *offs += (get_rnd() & 2) - 1;
00093 KEEP_RANGE(*width, 8, 16);
00094 KEEP_RANGE(*offs, -4, 4);
00095 }
00096
00097
00098
00099
00100 typedef struct {
00101 int x;
00102 int y;
00103 int vx, vy;
00104 bool trig;
00105 } player_t;
00106
00107
00108
00109
00110 typedef struct {
00111 int x;
00112 int y;
00113 u_char sp;
00114 bool active;
00115 } rocket_t;
00116
00117
00118
00119
00120 #define MAX_ROCKET 3
00121
00122
00123
00124
00125 rocket_t* alloc_rocket(rocket_t *array) {
00126 int c;
00127 for (c = 0; c < MAX_ROCKET; c++) {
00128 if (!array->active) {
00129 array->active = true;
00130 array->sp = 10 + c;
00131 return array;
00132 }
00133 ++array;
00134 }
00135 return NULL;
00136 }
00137
00138 void free_rocket(rocket_t *r) {
00139 r->active = false;
00140 put_sprite_16(r->sp, 0, 192, 0, 0);
00141 }
00142
00143 void initialize_rockets(rocket_t *array) {
00144 int c;
00145 for (c = 0; c < MAX_ROCKET; c++)
00146 free_rocket(array++);
00147 }
00148
00149 void move_rockets(rocket_t *array) {
00150 int c;
00151 for (c = 0; c < MAX_ROCKET; c++) {
00152 if (array->active) {
00153 if ((array->y -= 7) < 0)
00154 free_rocket(array);
00155 else
00156 put_sprite_16(array->sp, array->x, array->y, 1, 6);
00157 }
00158 ++array;
00159 }
00160 }
00161
00162
00163
00164
00165 void move_player(player_t *player) {
00166 u_char s;
00167 char ax, ay;
00168
00169 s = st_dir[get_stick(0)];
00170
00171 ay = (s & st_up) ? -1 : ((s & st_down) ? 1 : 0);
00172 ax = (s & st_left) ? -1 : ((s & st_right) ? 1 : 0);
00173
00174 player->vx += ax;
00175 player->vy += ay;
00176 KEEP_RANGE(player->vx, -3, 3);
00177 KEEP_RANGE(player->vy, -3, 3);
00178
00179 player->x += player->vx;
00180 player->y += player->vy;
00181
00182 put_sprite_16(0, player->x, player->y, 0, 15);
00183 put_sprite_16(31, player->x + 6, player->y + 6, 0, 1);
00184 }
00185
00186
00187
00188
00189 main() {
00190
00191
00192 int c, river_width, river_offs;
00193 player_t player;
00194 rocket_t rockets[MAX_ROCKET], *rckt;
00195
00196 u_char *l;
00197 u_char map[MAP_WIDTH * MAP_HEIGHT];
00198
00199
00200 set_color(15, 1, 1);
00201 set_mangled_mode();
00202
00203
00204 set_sprite_mode(sprite_large);
00205
00206 set_sprite_16(0, spaceship);
00207 set_sprite_16(1, fire);
00208
00209
00210 set_char('"', water1, NULL, 0x54, place_all);
00211 set_char('#', water2, NULL, 0x54, place_all);
00212 set_char('$', water3, NULL, 0x54, place_all);
00213 set_char('%', grass1, grass1_attr, 0, place_all);
00214 set_char('&', grass2, grass2_attr, 0, place_all);
00215
00216
00217 initialize_rockets(rockets);
00218
00219 river_width = 16;
00220 river_offs = 0;
00221
00222 l = map + MAP_SIZE - MAP_WIDTH;
00223 for (c = 0; c < MAP_HEIGHT; c++) {
00224 randomize_river(&river_width, &river_offs);
00225 map_fill_line(l, river_width, river_offs);
00226 l -= MAP_WIDTH;
00227 }
00228
00229 c = 0;
00230
00231 player.x = 128;
00232 player.y = 96;
00233 player.vx = player.vy = player.trig = 0;
00234
00235
00236 for (;;) {
00237 move_player(&player);
00238
00239 player.trig |= get_trigger(0);
00240
00241 if ((c & 2) && player.trig && (rckt = alloc_rocket(rockets))) {
00242 rckt->x = player.x + 4;
00243 rckt->y = player.y - 8;
00244 player.trig = false;
00245 }
00246 move_rockets(rockets);
00247
00248 if (--c < 0)
00249 c += MAP_HEIGHT;
00250 l = map + c * MAP_WIDTH;
00251 randomize_river(&river_width, &river_offs);
00252 map_fill_line(l, river_width, river_offs);
00253 show_map(map, c);
00254 }
00255 }
00256
00257
00258
00259 #asm
00260 psect data
00261
00262 global _grass1
00263 _grass1:
00264 defb 00000000B
00265 defb 00111000B
00266 defb 00000000B
00267 defb 10000011B
00268 defb 00000000B
00269 defb 00110000B
00270 defb 00000100B
00271 defb 00011010B
00272
00273 global _grass1_attr
00274 _grass1_attr:
00275 defb 032h ;00000000B
00276 defb 032h ;00111000B
00277 defb 032h ;00000000B
00278 defb 0B2h ;10000011B
00279 defb 032h ;00000000B
00280 defb 032h ;00110000B
00281 defb 0B2h ;00000100B
00282 defb 0A2h ;00011010B
00283
00284 global _grass2
00285 _grass2:
00286 defb 01011000B
00287 defb 00000000B
00288 defb 00000000B
00289 defb 11100000B
00290 defb 00000000B
00291 defb 00000111B
00292 defb 00000000B
00293 defb 00100000B
00294
00295 global _grass2_attr
00296 _grass2_attr:
00297 defb 0A2h
00298 defb 032h
00299 defb 032h
00300 defb 0B2h
00301 defb 032h
00302 defb 032h
00303 defb 032h
00304 defb 0B2h
00305
00306 global _water1
00307 _water1:
00308 defb 00000000B
00309 defb 11111000B
00310 defb 00000000B
00311 defb 00000000B
00312 defb 00111111B
00313 defb 00000000B
00314 defb 00000000B
00315 defb 00000000B
00316
00317 global _water2
00318 _water2:
00319 defb 00000000B
00320 defb 00000000B
00321 defb 00000000B
00322 defb 00000000B
00323 defb 11111111B
00324 defb 00000000B
00325 defb 00000111B
00326 defb 00000000B
00327
00328 global _water3
00329 _water3:
00330 defb 0,0,0,0,0,0,0,0
00331
00332 global _spaceship
00333 _spaceship:
00334 defb 00000011B
00335 defb 00000011B
00336 defb 00000011B
00337 defb 00000111B
00338 defb 00000111B
00339 defb 11000111B
00340 defb 11000111B
00341 defb 11100111B
00342 defb 11101110B
00343 defb 11101110B
00344 defb 11111110B
00345 defb 11111111B
00346 defb 11100111B
00347 defb 11000011B
00348 defb 11110000B
00349 defb 10010000B
00350
00351 defb 11000000B
00352 defb 11000000B
00353 defb 11000000B
00354 defb 11100000B
00355 defb 11100000B
00356 defb 11100011B
00357 defb 11100011B
00358 defb 11100111B
00359 defb 01110111B
00360 defb 01110111B
00361 defb 01111111B
00362 defb 11111111B
00363 defb 11100111B
00364 defb 11000011B
00365 defb 00001111B
00366 defb 00001001B
00367
00368 global _fire
00369 _fire:
00370 defb 00011000B
00371 defb 00111100B
00372 defb 00111100B
00373 defb 01111110B
00374 defb 01111110B
00375 defb 01111110B
00376 defb 01110110B
00377 defb 01010100B
00378 defb 00010000B
00379 defb 00010000B
00380 defb 00010000B
00381 defb 00000000B
00382 defb 00000000B
00383 defb 00000000B
00384 defb 00000000B
00385 defb 00000000B
00386 defb 0,0,0,0,0,0,0,0
00387 defb 0,0,0,0,0,0,0,0
00388
00389 #endasm
00390
00391