#include <vectrex.h> #define ASTEROIDS 12 #define BIG -1,120,120, -1,120,0, -1,120,-120, -1,0,-120, -1,-120,-120, -1,-120,0, -1,-120,120, -1,0,120, 1 #define MEDIUM -1,80,80, -1,80,0, -1,80,-80, -1,0,-80, -1,-80,-80, -1,-80,0, -1,-80,80, -1,0,80, 1 #define SMALL -1,60,60, -1,60,0, -1,60,-60, -1,0,-60, -1,-60,-60, -1,-60,0, -1,-60,60, -1,0,60, 1 const int vector[((unsigned long)ASTEROIDS) * (8UL * 3UL + 1UL)] = { /* octagons for now, later asteroids */ /* 0 */ BIG, /* 1 */ BIG, /* 2 */ MEDIUM, /* 3 */ MEDIUM, /* 4 */ MEDIUM, /* 5 */ MEDIUM, /* 6 */ SMALL, /* 7 */ SMALL, /* 8 */ SMALL, /* 9 */ SMALL, /* 10 */ SMALL, /* 11 */ SMALL, }; static int x[ASTEROIDS], y[ASTEROIDS]; static int dx[ASTEROIDS*2] = { 1,1,2,1,1,2,1,1,1,2,-1,-1, 2,2,2,2,2,2,2,2,2,2,-2,-2, }; static int dy[ASTEROIDS*2] = { -1,1,-1,1,-1,1,-1,1,-1,1,-1,1, -1,2,-2,1,-2,2,-2,1,-2,2,-2,1, }; static char DEMO[15]; const signed char BouncerTitle[7][17] = { // count, moveto, drawtos... {+0x05, +0x67, -0x5A, -0x2E, -0x05, +0x11, +0x1C, +0x08, -0x0D, +0x0E, +0x09, +0x07, -0x13,}, {+0x06, +0x51, -0x38, -0x0D, -0x0C, -0x0E, +0x04, +0x03, +0x11, +0x0C, +0x07, +0x0F, -0x05, -0x02, -0x0A,}, {+0x03, +0x57, -0x1F, -0x18, -0x09, -0x09, +0x13, +0x19, +0x06,}, {+0x04, +0x56, -0x05, -0x1F, -0x05, +0x1F, +0x0A, +0x01, +0x0D, -0x20, +0x00,}, {+0x04, +0x59, +0x26, -0x03, -0x0F, -0x11, -0x04, -0x0E, +0x03, +0x04, +0x13,}, {+0x07, +0x4D, +0x38, +0x04, +0x0D, +0x06, +0x03, +0x03, -0x0F, -0x05, -0x0A, -0x0F, -0x02, -0x0E, +0x03, +0x02, +0x15,}, {+0x04, +0x5A, +0x50, -0x04, +0x03, -0x1E, -0x03, +0x20, +0x06, +0x02, +0x0F,}, }; #include "graphics.inc" // USER CODE: static char *p; int init(void) { int row; cstrcpy(DEMO, "TICK: 0000000\x80"); // long enough to allow freewheeling counter... p = DEMO+12; for (row = 0; row < ASTEROIDS; row++) { x[row] = random(); y[row] = random(); } return 0; } static int base=0; int loop(void) { int row, tmp1, idx; while (*p == '9') { // find digit to increment - X9999 becomes (X+1)0000 *p-- = '0'; if (*p == ' ') { cstrcpy(DEMO, "TICK: 0000000\x80"); p = DEMO+12; } } *p += 1; p = DEMO+12; for (row = 0; row < ASTEROIDS; row++) { // Bounce off wall - detected when incrementing or decrementing causes over/under-flow tmp1 = x[row] + dx[idx=base+row]; if ((dx[idx] > 0 && x[row] > 0 && tmp1 < 0) || (dx[idx] < 0 && x[row] < 0 && tmp1 > 0)) { dx[idx] = -dx[idx]; } else { x[row] = tmp1; } tmp1 = y[row] + dy[idx]; if ((dy[idx] > 0 && y[row] > 0 && tmp1 < 0) || (dy[idx] < 0 && y[row] < 0 && tmp1 > 0)) { dy[idx] = -dy[idx]; } else { y[row] = tmp1; } } base ^= ASTEROIDS; return 0; }