Invaders game for the Gameduino

Dependencies:   Gameduino mbed

Committer:
TheChrisyd
Date:
Sat Sep 29 13:01:42 2012 +0000
Revision:
1:f44175dd69fd
Parent:
0:8a7c58553b44
Child:
2:20a89dc286d5
saved progress

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TheChrisyd 1:f44175dd69fd 1 #include "game.h"
TheChrisyd 1:f44175dd69fd 2
TheChrisyd 1:f44175dd69fd 3 SPI spigraphics(ARD_MOSI, ARD_MISO, ARD_SCK); // mosi, miso, sclk
TheChrisyd 1:f44175dd69fd 4
TheChrisyd 1:f44175dd69fd 5 typedef prog_uint8_t char_data;
TheChrisyd 1:f44175dd69fd 6 typedef prog_uint16_t sprite_data;
TheChrisyd 1:f44175dd69fd 7
TheChrisyd 1:f44175dd69fd 8 /*---------------------------------------------
TheChrisyd 1:f44175dd69fd 9 Graphics - made by typing in the hex... :-)
TheChrisyd 1:f44175dd69fd 10 ---------------------------------------------*/
TheChrisyd 1:f44175dd69fd 11 static PROGMEM sprite_data invaderT[] = {
TheChrisyd 1:f44175dd69fd 12 0x0c00, 0x0c00,
TheChrisyd 1:f44175dd69fd 13 0x1e00, 0x1e00,
TheChrisyd 1:f44175dd69fd 14 0x3f00, 0x3f00,
TheChrisyd 1:f44175dd69fd 15 0x6d80, 0x6d80,
TheChrisyd 1:f44175dd69fd 16 0x7f80, 0x7f80,
TheChrisyd 1:f44175dd69fd 17 0x1200, 0x2d00,
TheChrisyd 1:f44175dd69fd 18 0x2d00, 0x4080,
TheChrisyd 1:f44175dd69fd 19 0x5280, 0x2100
TheChrisyd 1:f44175dd69fd 20 };
TheChrisyd 1:f44175dd69fd 21 static PROGMEM sprite_data invaderM[] = {
TheChrisyd 1:f44175dd69fd 22 0x2080, 0x2080,
TheChrisyd 1:f44175dd69fd 23 0x9120, 0x1100,
TheChrisyd 1:f44175dd69fd 24 0xbfa0, 0x3f80,
TheChrisyd 1:f44175dd69fd 25 0xeee0, 0x6ec0,
TheChrisyd 1:f44175dd69fd 26 0xffe0, 0xffe0,
TheChrisyd 1:f44175dd69fd 27 0x7fc0, 0xbfa0,
TheChrisyd 1:f44175dd69fd 28 0x2080, 0xa0a0,
TheChrisyd 1:f44175dd69fd 29 0x4040, 0x1b00
TheChrisyd 1:f44175dd69fd 30 };
TheChrisyd 1:f44175dd69fd 31 static PROGMEM sprite_data invaderB[] = {
TheChrisyd 1:f44175dd69fd 32 0x0f00, 0x0f00,
TheChrisyd 1:f44175dd69fd 33 0x7fe0, 0x7fe0,
TheChrisyd 1:f44175dd69fd 34 0xfff0, 0xfff0,
TheChrisyd 1:f44175dd69fd 35 0xe670, 0xe670,
TheChrisyd 1:f44175dd69fd 36 0xfff0, 0xfff0,
TheChrisyd 1:f44175dd69fd 37 0x1980, 0x1980,
TheChrisyd 1:f44175dd69fd 38 0x36c0, 0x6660,
TheChrisyd 1:f44175dd69fd 39 0xc030, 0x30c0
TheChrisyd 1:f44175dd69fd 40 };
TheChrisyd 1:f44175dd69fd 41 static PROGMEM sprite_data invader_explosion[] = {
TheChrisyd 1:f44175dd69fd 42 0x0880,
TheChrisyd 1:f44175dd69fd 43 0x4510,
TheChrisyd 1:f44175dd69fd 44 0x2020,
TheChrisyd 1:f44175dd69fd 45 0x1040,
TheChrisyd 1:f44175dd69fd 46 0xc018,
TheChrisyd 1:f44175dd69fd 47 0x1040,
TheChrisyd 1:f44175dd69fd 48 0x2520,
TheChrisyd 1:f44175dd69fd 49 0x4890
TheChrisyd 1:f44175dd69fd 50 };
TheChrisyd 1:f44175dd69fd 51 static PROGMEM sprite_data player[] = {
TheChrisyd 1:f44175dd69fd 52 0x0200, 0x1004, 0x0200,
TheChrisyd 1:f44175dd69fd 53 0x0700, 0x8219, 0x0010,
TheChrisyd 1:f44175dd69fd 54 0x0700, 0x10c0, 0x02a0,
TheChrisyd 1:f44175dd69fd 55 0x7ff0, 0x0202, 0x1200,
TheChrisyd 1:f44175dd69fd 56 0xfff8, 0x4b31, 0x01b0,
TheChrisyd 1:f44175dd69fd 57 0xfff8, 0x21c4, 0x45a8,
TheChrisyd 1:f44175dd69fd 58 0xfff8, 0x1ff0, 0x1fe4,
TheChrisyd 1:f44175dd69fd 59 0xfff8, 0x37f2, 0x3ff5
TheChrisyd 1:f44175dd69fd 60 };
TheChrisyd 1:f44175dd69fd 61 static PROGMEM sprite_data bullet[] = {
TheChrisyd 1:f44175dd69fd 62 0x0200,
TheChrisyd 1:f44175dd69fd 63 0x0200,
TheChrisyd 1:f44175dd69fd 64 0x0200,
TheChrisyd 1:f44175dd69fd 65 0x0200,
TheChrisyd 1:f44175dd69fd 66 0x0000,
TheChrisyd 1:f44175dd69fd 67 0x0000,
TheChrisyd 1:f44175dd69fd 68 0x0000,
TheChrisyd 1:f44175dd69fd 69 0x0000
TheChrisyd 1:f44175dd69fd 70 };
TheChrisyd 1:f44175dd69fd 71 static PROGMEM sprite_data bullet_blast[] = {
TheChrisyd 1:f44175dd69fd 72 0x1120,
TheChrisyd 1:f44175dd69fd 73 0x0440,
TheChrisyd 1:f44175dd69fd 74 0x0fc0,
TheChrisyd 1:f44175dd69fd 75 0x1fe0,
TheChrisyd 1:f44175dd69fd 76 0x1fe0,
TheChrisyd 1:f44175dd69fd 77 0x0fc0,
TheChrisyd 1:f44175dd69fd 78 0x0480,
TheChrisyd 1:f44175dd69fd 79 0x1220
TheChrisyd 1:f44175dd69fd 80 };
TheChrisyd 1:f44175dd69fd 81 static PROGMEM sprite_data saucer[] = {
TheChrisyd 1:f44175dd69fd 82 0x0000, 0x1281, 0x4800,
TheChrisyd 1:f44175dd69fd 83 0x07e0, 0x0806, 0x1000,
TheChrisyd 1:f44175dd69fd 84 0x1ff8, 0x51e3, 0x0000,
TheChrisyd 1:f44175dd69fd 85 0x3ffc, 0x03f9, 0xc800,
TheChrisyd 1:f44175dd69fd 86 0x6db6, 0x0754, 0xe400,
TheChrisyd 1:f44175dd69fd 87 0xffff, 0x11f1, 0x8000,
TheChrisyd 1:f44175dd69fd 88 0x399c, 0x40a3, 0x1000,
TheChrisyd 1:f44175dd69fd 89 0x1008, 0x1110, 0x8000
TheChrisyd 1:f44175dd69fd 90 };
TheChrisyd 1:f44175dd69fd 91 static PROGMEM sprite_data saucerScore[] = {
TheChrisyd 1:f44175dd69fd 92 0x007c, 0x1038, 0x107c, 0x7c38,
TheChrisyd 1:f44175dd69fd 93 0x0040, 0x3044, 0x3040, 0x0444,
TheChrisyd 1:f44175dd69fd 94 0x0078, 0x104c, 0x1078, 0x084c,
TheChrisyd 1:f44175dd69fd 95 0x0004, 0x1054, 0x1004, 0x1854,
TheChrisyd 1:f44175dd69fd 96 0x0004, 0x1064, 0x1004, 0x0464,
TheChrisyd 1:f44175dd69fd 97 0x0044, 0x1044, 0x1044, 0x4444,
TheChrisyd 1:f44175dd69fd 98 0x0038, 0x3838, 0x3838, 0x3838,
TheChrisyd 1:f44175dd69fd 99 0x0000, 0x0000, 0x0000, 0x0000
TheChrisyd 1:f44175dd69fd 100 };
TheChrisyd 1:f44175dd69fd 101 static PROGMEM sprite_data saucerZero[] = {
TheChrisyd 1:f44175dd69fd 102 0x3800,
TheChrisyd 1:f44175dd69fd 103 0x4400,
TheChrisyd 1:f44175dd69fd 104 0x4c00,
TheChrisyd 1:f44175dd69fd 105 0x5400,
TheChrisyd 1:f44175dd69fd 106 0x6400,
TheChrisyd 1:f44175dd69fd 107 0x4400,
TheChrisyd 1:f44175dd69fd 108 0x3800,
TheChrisyd 1:f44175dd69fd 109 0x0000
TheChrisyd 1:f44175dd69fd 110 };
TheChrisyd 1:f44175dd69fd 111 static PROGMEM sprite_data zigzagBomb[] = {
TheChrisyd 1:f44175dd69fd 112 0x0200, 0x0400, 0x0200, 0x0100,
TheChrisyd 1:f44175dd69fd 113 0x0400, 0x0300, 0x0100, 0x0200,
TheChrisyd 1:f44175dd69fd 114 0x0200, 0x0100, 0x0200, 0x0400,
TheChrisyd 1:f44175dd69fd 115 0x0100, 0x0200, 0x0400, 0x0200,
TheChrisyd 1:f44175dd69fd 116 0x0200, 0x0400, 0x0200, 0x0100,
TheChrisyd 1:f44175dd69fd 117 0x0400, 0x0200, 0x0100, 0x0200,
TheChrisyd 1:f44175dd69fd 118 0x0100, 0x0100, 0x0200, 0x0400,
TheChrisyd 1:f44175dd69fd 119 0x0000, 0x0000, 0x0000, 0x0000
TheChrisyd 1:f44175dd69fd 120 };
TheChrisyd 1:f44175dd69fd 121 static PROGMEM sprite_data barBomb[] = {
TheChrisyd 1:f44175dd69fd 122 0x0200, 0x0200, 0x0200, 0x0700,
TheChrisyd 1:f44175dd69fd 123 0x0200, 0x0200, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 124 0x0200, 0x0200, 0x0700, 0x0200,
TheChrisyd 1:f44175dd69fd 125 0x0200, 0x0700, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 126 0x0200, 0x0200, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 127 0x0700, 0x0200, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 128 0x0000, 0x0000, 0x0000, 0x0000,
TheChrisyd 1:f44175dd69fd 129 0x0000, 0x0000, 0x0000, 0x0000
TheChrisyd 1:f44175dd69fd 130 };
TheChrisyd 1:f44175dd69fd 131 static PROGMEM sprite_data diagBomb[] = {
TheChrisyd 1:f44175dd69fd 132 0x0200, 0x0200, 0x0200, 0x0300,
TheChrisyd 1:f44175dd69fd 133 0x0200, 0x0200, 0x0200, 0x0600,
TheChrisyd 1:f44175dd69fd 134 0x0200, 0x0600, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 135 0x0200, 0x0300, 0x0200, 0x0300,
TheChrisyd 1:f44175dd69fd 136 0x0200, 0x0200, 0x0200, 0x0600,
TheChrisyd 1:f44175dd69fd 137 0x0200, 0x0600, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 138 0x0200, 0x0300, 0x0200, 0x0200,
TheChrisyd 1:f44175dd69fd 139 0x0000, 0x0000, 0x0000, 0x0000
TheChrisyd 1:f44175dd69fd 140 };
TheChrisyd 1:f44175dd69fd 141 static PROGMEM sprite_data bomb_blast[] = {
TheChrisyd 1:f44175dd69fd 142 0x0100,
TheChrisyd 1:f44175dd69fd 143 0x0440,
TheChrisyd 1:f44175dd69fd 144 0x01a0,
TheChrisyd 1:f44175dd69fd 145 0x03c0,
TheChrisyd 1:f44175dd69fd 146 0x05c0,
TheChrisyd 1:f44175dd69fd 147 0x03e0,
TheChrisyd 1:f44175dd69fd 148 0x05c0,
TheChrisyd 1:f44175dd69fd 149 0x02a0
TheChrisyd 1:f44175dd69fd 150 };
TheChrisyd 1:f44175dd69fd 151
TheChrisyd 1:f44175dd69fd 152 static PROGMEM sprite_data shield[] = {
TheChrisyd 1:f44175dd69fd 153 0x0fff, 0xc000,
TheChrisyd 1:f44175dd69fd 154 0x1fff, 0xe000,
TheChrisyd 1:f44175dd69fd 155 0x3fff, 0xf000,
TheChrisyd 1:f44175dd69fd 156 0x7fff, 0xf800,
TheChrisyd 1:f44175dd69fd 157 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 158 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 159 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 160 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 161 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 162 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 163 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 164 0xffff, 0xfc00,
TheChrisyd 1:f44175dd69fd 165 0xfe03, 0xfc00,
TheChrisyd 1:f44175dd69fd 166 0xfc01, 0xfc00,
TheChrisyd 1:f44175dd69fd 167 0xf800, 0xfc00,
TheChrisyd 1:f44175dd69fd 168 0xf800, 0xfc00
TheChrisyd 1:f44175dd69fd 169 };
TheChrisyd 1:f44175dd69fd 170
TheChrisyd 1:f44175dd69fd 171 /*---------------------------------------------
TheChrisyd 1:f44175dd69fd 172 Turn raw data into Gameduino sprites
TheChrisyd 1:f44175dd69fd 173
TheChrisyd 1:f44175dd69fd 174 We're using four color sprites so each
TheChrisyd 1:f44175dd69fd 175 sprite can contain four images. This
TheChrisyd 1:f44175dd69fd 176 function interleaves the data...
TheChrisyd 1:f44175dd69fd 177 ---------------------------------------------*/
TheChrisyd 1:f44175dd69fd 178 void makeSprite(byte index, byte height, const sprite_data* g1, byte s1=1, const sprite_data* g2=0, byte s2=0, const sprite_data* g3=0, byte s3=0, const sprite_data* g4=0, byte s4=0)
TheChrisyd 1:f44175dd69fd 179 {
TheChrisyd 1:f44175dd69fd 180 const unsigned int topBit = 0x8000;
TheChrisyd 1:f44175dd69fd 181 unsigned int d1=0,d2=0,d3=0,d4=0;
TheChrisyd 1:f44175dd69fd 182 unsigned int dest = RAM_SPRIMG+(index*256);
TheChrisyd 1:f44175dd69fd 183 for (byte i=0; i<height; ++i) { // Space invaders are only 8 pixels tall
TheChrisyd 1:f44175dd69fd 184 d1 = *g1; g1 += s1;
TheChrisyd 1:f44175dd69fd 185 if (g2) { d2 = *g2; g2 += s2; }
TheChrisyd 1:f44175dd69fd 186 if (g3) { d3 = *g3; g3 += s3; }
TheChrisyd 1:f44175dd69fd 187 if (g4) { d4 = *g4; g4 += s4; }
TheChrisyd 1:f44175dd69fd 188 for (byte j=0; j<16; ++j) {
TheChrisyd 1:f44175dd69fd 189 unsigned int m1 = (d1&topBit)>>15;
TheChrisyd 1:f44175dd69fd 190 unsigned int m2 = (d2&topBit)>>13;
TheChrisyd 1:f44175dd69fd 191 unsigned int m3 = (d3&topBit)>>11;
TheChrisyd 1:f44175dd69fd 192 unsigned int m4 = (d4&topBit)>>9;
TheChrisyd 1:f44175dd69fd 193 GD.wr(dest++,m1+m2+m3+m4);
TheChrisyd 1:f44175dd69fd 194 d1 <<= 1;
TheChrisyd 1:f44175dd69fd 195 d2 <<= 1;
TheChrisyd 1:f44175dd69fd 196 d3 <<= 1;
TheChrisyd 1:f44175dd69fd 197 d4 <<= 1;
TheChrisyd 1:f44175dd69fd 198 }
TheChrisyd 1:f44175dd69fd 199 }
TheChrisyd 1:f44175dd69fd 200 }
TheChrisyd 1:f44175dd69fd 201 void makeInvader(byte gr, const sprite_data *data)
TheChrisyd 1:f44175dd69fd 202 {
TheChrisyd 1:f44175dd69fd 203 makeSprite(gr,8,data,2,data+1,2,invader_explosion,1);
TheChrisyd 1:f44175dd69fd 204 }
TheChrisyd 1:f44175dd69fd 205 void makeSp3(byte gr, const sprite_data *d)
TheChrisyd 1:f44175dd69fd 206 {
TheChrisyd 1:f44175dd69fd 207 makeSprite(gr,8, d,3, d+1,3, d+2,3);
TheChrisyd 1:f44175dd69fd 208 }
TheChrisyd 1:f44175dd69fd 209 void makeSp4(byte gr, const sprite_data *d)
TheChrisyd 1:f44175dd69fd 210 {
TheChrisyd 1:f44175dd69fd 211 makeSprite(gr,8, d,4, d+1,4, d+2,4, d+3,4);
TheChrisyd 1:f44175dd69fd 212 }
TheChrisyd 1:f44175dd69fd 213
TheChrisyd 1:f44175dd69fd 214 /*---------------------------------------------
TheChrisyd 1:f44175dd69fd 215 Char data
TheChrisyd 1:f44175dd69fd 216 ---------------------------------------------*/
TheChrisyd 1:f44175dd69fd 217 static PROGMEM char_data floorChar[] = {
TheChrisyd 1:f44175dd69fd 218 0x00,
TheChrisyd 1:f44175dd69fd 219 0x00,
TheChrisyd 1:f44175dd69fd 220 0x00,
TheChrisyd 1:f44175dd69fd 221 0x00,
TheChrisyd 1:f44175dd69fd 222 0x00,
TheChrisyd 1:f44175dd69fd 223 0x00,
TheChrisyd 1:f44175dd69fd 224 0xff,
TheChrisyd 1:f44175dd69fd 225 0x00
TheChrisyd 1:f44175dd69fd 226 };
TheChrisyd 1:f44175dd69fd 227 static PROGMEM char_data playerLeft[] = {
TheChrisyd 1:f44175dd69fd 228 0x02,
TheChrisyd 1:f44175dd69fd 229 0x07,
TheChrisyd 1:f44175dd69fd 230 0x07,
TheChrisyd 1:f44175dd69fd 231 0x7f,
TheChrisyd 1:f44175dd69fd 232 0xff,
TheChrisyd 1:f44175dd69fd 233 0xff,
TheChrisyd 1:f44175dd69fd 234 0xff,
TheChrisyd 1:f44175dd69fd 235 0xff
TheChrisyd 1:f44175dd69fd 236 };
TheChrisyd 1:f44175dd69fd 237 static PROGMEM char_data playerRight[] = {
TheChrisyd 1:f44175dd69fd 238 0x00,
TheChrisyd 1:f44175dd69fd 239 0x00,
TheChrisyd 1:f44175dd69fd 240 0x00,
TheChrisyd 1:f44175dd69fd 241 0xf0,
TheChrisyd 1:f44175dd69fd 242 0xf8,
TheChrisyd 1:f44175dd69fd 243 0xf8,
TheChrisyd 1:f44175dd69fd 244 0xf8,
TheChrisyd 1:f44175dd69fd 245 0xf8
TheChrisyd 1:f44175dd69fd 246 };
TheChrisyd 1:f44175dd69fd 247
TheChrisyd 1:f44175dd69fd 248 /*---------------------------------------------
TheChrisyd 1:f44175dd69fd 249 Make a character
TheChrisyd 1:f44175dd69fd 250 ---------------------------------------------*/
TheChrisyd 1:f44175dd69fd 251 static PROGMEM prog_uint8_t stretch[16] = {
TheChrisyd 1:f44175dd69fd 252 0x00, 0x03, 0x0c, 0x0f,
TheChrisyd 1:f44175dd69fd 253 0x30, 0x33, 0x3c, 0x3f,
TheChrisyd 1:f44175dd69fd 254 0xc0, 0xc3, 0xcc, 0xcf,
TheChrisyd 1:f44175dd69fd 255 0xf0, 0xf3, 0xfc, 0xff
TheChrisyd 1:f44175dd69fd 256 };
TheChrisyd 1:f44175dd69fd 257 static void makeChar(byte index, const char_data *ch, unsigned int color)
TheChrisyd 1:f44175dd69fd 258 {
TheChrisyd 1:f44175dd69fd 259 // Bitmap
TheChrisyd 1:f44175dd69fd 260 GD.__wstart(RAM_CHR+(16*index));
TheChrisyd 1:f44175dd69fd 261 for (int i=0; i<8; i++) {
TheChrisyd 1:f44175dd69fd 262 byte b = *ch++;
TheChrisyd 1:f44175dd69fd 263 spigraphics.write((*stretch+(b >> 4)));
TheChrisyd 1:f44175dd69fd 264 spigraphics.write((*stretch+(b & 15)));
TheChrisyd 1:f44175dd69fd 265 }
TheChrisyd 1:f44175dd69fd 266 GD.__end();
TheChrisyd 1:f44175dd69fd 267 // Colors
TheChrisyd 1:f44175dd69fd 268 GD.setpal((4*index)+3, color);
TheChrisyd 1:f44175dd69fd 269 }
TheChrisyd 1:f44175dd69fd 270
TheChrisyd 1:f44175dd69fd 271 /*---------------------------------------------
TheChrisyd 1:f44175dd69fd 272 Make all the game sprites
TheChrisyd 1:f44175dd69fd 273 ---------------------------------------------*/
TheChrisyd 1:f44175dd69fd 274 void makeGraphics()
TheChrisyd 1:f44175dd69fd 275 {
TheChrisyd 1:f44175dd69fd 276 // Sprites
TheChrisyd 1:f44175dd69fd 277 makeInvader(GR_INVADER_T,invaderT);
TheChrisyd 1:f44175dd69fd 278 makeInvader(GR_INVADER_M,invaderM);
TheChrisyd 1:f44175dd69fd 279 makeInvader(GR_INVADER_B,invaderB);
TheChrisyd 1:f44175dd69fd 280 makeSp3(GR_PLAYER,player);
TheChrisyd 1:f44175dd69fd 281 makeSprite(GR_BULLET,8,bullet,1,bullet_blast,1);
TheChrisyd 1:f44175dd69fd 282 makeSprite(GR_BULLET,8,bullet,1,bullet_blast,1, saucerZero,1);
TheChrisyd 1:f44175dd69fd 283 makeSp3(GR_SAUCER,saucer);
TheChrisyd 1:f44175dd69fd 284 makeSp4(GR_BOMB_ZIGZAG,zigzagBomb);
TheChrisyd 1:f44175dd69fd 285 makeSp4(GR_BOMB_BARS, barBomb);
TheChrisyd 1:f44175dd69fd 286 makeSp4(GR_BOMB_DIAG, diagBomb);
TheChrisyd 1:f44175dd69fd 287 makeSp4(GR_SAUCER_SCORE,saucerScore);
TheChrisyd 1:f44175dd69fd 288 makeSprite(GR_BOMB_OTHER,8,bomb_blast,1);
TheChrisyd 1:f44175dd69fd 289 GD.wr16(PALETTE4A+0,0x8000); // Transparent
TheChrisyd 1:f44175dd69fd 290 GD.wr16(PALETTE4A+2,0x7fff); // White
TheChrisyd 1:f44175dd69fd 291 // Charset
TheChrisyd 1:f44175dd69fd 292 GD.ascii();
TheChrisyd 1:f44175dd69fd 293 //const unsigned int red = 0x7c00;
TheChrisyd 1:f44175dd69fd 294 const unsigned int green = 0x03e0;
TheChrisyd 1:f44175dd69fd 295 makeChar(CH_FLOOR,floorChar,green);
TheChrisyd 1:f44175dd69fd 296 makeChar(CH_PLAYERL,playerLeft,green);
TheChrisyd 1:f44175dd69fd 297 makeChar(CH_PLAYERR,playerRight,green);
TheChrisyd 1:f44175dd69fd 298 }
TheChrisyd 1:f44175dd69fd 299
TheChrisyd 1:f44175dd69fd 300
TheChrisyd 1:f44175dd69fd 301 /*---------------------------------------------------
TheChrisyd 1:f44175dd69fd 302 The shields are sprites but we use them as bitmaps
TheChrisyd 1:f44175dd69fd 303 so we need to be able to shoot/bomb/rebuild them
TheChrisyd 1:f44175dd69fd 304 on demand.
TheChrisyd 1:f44175dd69fd 305 ---------------------------------------------------*/
TheChrisyd 1:f44175dd69fd 306 void remakeShields()
TheChrisyd 1:f44175dd69fd 307 {
TheChrisyd 1:f44175dd69fd 308 for (int i=0; i<4; ++i) {
TheChrisyd 1:f44175dd69fd 309 makeSprite(GR_SHIELD1+i,16,shield,2,shield+1,2);
TheChrisyd 1:f44175dd69fd 310 }
TheChrisyd 1:f44175dd69fd 311 }
TheChrisyd 1:f44175dd69fd 312
TheChrisyd 1:f44175dd69fd 313 int8 zapShield(int n, int8 x, bool withBullet)
TheChrisyd 1:f44175dd69fd 314 {
TheChrisyd 1:f44175dd69fd 315 int y = 0;
TheChrisyd 1:f44175dd69fd 316 if ((n >= 0) and (n <= 3)) {
TheChrisyd 1:f44175dd69fd 317 n += GR_SHIELD1;
TheChrisyd 1:f44175dd69fd 318 const unsigned int spriteMem = RAM_SPRIMG+(n*256);
TheChrisyd 1:f44175dd69fd 319 int col = x+6; // The pixels in the bullet are in column 6 of the graphic
TheChrisyd 1:f44175dd69fd 320 if (col < 0 ) col = 0;
TheChrisyd 1:f44175dd69fd 321 if (col > 31) col = 31;
TheChrisyd 1:f44175dd69fd 322 // Scan the shield and find the top/bottom pixel in column 'x'
TheChrisyd 1:f44175dd69fd 323 byte pixelMask = 0x03;
TheChrisyd 1:f44175dd69fd 324 if (col > 15) {
TheChrisyd 1:f44175dd69fd 325 pixelMask = 0x0c;
TheChrisyd 1:f44175dd69fd 326 col &= 15;
TheChrisyd 1:f44175dd69fd 327 }
TheChrisyd 1:f44175dd69fd 328 unsigned int s = spriteMem+col;
TheChrisyd 1:f44175dd69fd 329 const sprite_data *blastMap = bullet_blast;
TheChrisyd 1:f44175dd69fd 330 if (withBullet) {
TheChrisyd 1:f44175dd69fd 331 // Go from the top, find lowest pixel
TheChrisyd 1:f44175dd69fd 332 for (int8 r=0; r<16; ++r) {
TheChrisyd 1:f44175dd69fd 333 if ((GD.rd(s)&pixelMask)!=0) {
TheChrisyd 1:f44175dd69fd 334 y = r;
TheChrisyd 1:f44175dd69fd 335 }
TheChrisyd 1:f44175dd69fd 336 s += 16;
TheChrisyd 1:f44175dd69fd 337 }
TheChrisyd 1:f44175dd69fd 338 x += 3;
TheChrisyd 1:f44175dd69fd 339 y -= 5;
TheChrisyd 1:f44175dd69fd 340 }
TheChrisyd 1:f44175dd69fd 341 else {
TheChrisyd 1:f44175dd69fd 342 // Go from the bottom, find highest pixel
TheChrisyd 1:f44175dd69fd 343 y = 16;
TheChrisyd 1:f44175dd69fd 344 s += 256;
TheChrisyd 1:f44175dd69fd 345 int8 offset = 3;
TheChrisyd 1:f44175dd69fd 346 for (int8 r=0; r<16; ++r) {
TheChrisyd 1:f44175dd69fd 347 s -= 16;
TheChrisyd 1:f44175dd69fd 348 // Bombs are wider...we check three columns
TheChrisyd 1:f44175dd69fd 349 if ((GD.rd(s)&pixelMask)!=0) {
TheChrisyd 1:f44175dd69fd 350 y = 15-r;
TheChrisyd 1:f44175dd69fd 351 offset = 2;
TheChrisyd 1:f44175dd69fd 352 }
TheChrisyd 1:f44175dd69fd 353 else if ((col!=0) and ((GD.rd(s-1)&pixelMask)!=0)) {
TheChrisyd 1:f44175dd69fd 354 y = 15-r;
TheChrisyd 1:f44175dd69fd 355 offset = 1;
TheChrisyd 1:f44175dd69fd 356 }
TheChrisyd 1:f44175dd69fd 357 else if ((col!=31) and ((GD.rd(s+1)&pixelMask)!=0)) {
TheChrisyd 1:f44175dd69fd 358 y = 15-r;
TheChrisyd 1:f44175dd69fd 359 offset = 3;
TheChrisyd 1:f44175dd69fd 360 }
TheChrisyd 1:f44175dd69fd 361 }
TheChrisyd 1:f44175dd69fd 362 x += offset;
TheChrisyd 1:f44175dd69fd 363 y -= 4;
TheChrisyd 1:f44175dd69fd 364 blastMap = bomb_blast;
TheChrisyd 1:f44175dd69fd 365 }
TheChrisyd 1:f44175dd69fd 366 // Blast a hole in it
TheChrisyd 1:f44175dd69fd 367 for (int8 j=0; j<8; ++j) { // 8 lines tall
TheChrisyd 1:f44175dd69fd 368 const int py = y+j;
TheChrisyd 1:f44175dd69fd 369 if ((py>=0) and (py<=15)) {
TheChrisyd 1:f44175dd69fd 370 unsigned int blastMask = 0x1000;
TheChrisyd 1:f44175dd69fd 371 unsigned int blastGraphic = pgm_read_word_near(blastMap);
TheChrisyd 1:f44175dd69fd 372 for (int8 i=0; i<8; ++i) { // 8 pixels wide...
TheChrisyd 1:f44175dd69fd 373 if ((blastGraphic&blastMask)!=0) {
TheChrisyd 1:f44175dd69fd 374 // Set shield pixel to 0 where there's a 1 in the source graphic
TheChrisyd 1:f44175dd69fd 375 int px = x+i;
TheChrisyd 1:f44175dd69fd 376 if ((px>=0) and (px<=31)) {
TheChrisyd 1:f44175dd69fd 377 byte pixelMask = 0xfc;
TheChrisyd 1:f44175dd69fd 378 if (px > 15) {
TheChrisyd 1:f44175dd69fd 379 px &= 15;
TheChrisyd 1:f44175dd69fd 380 pixelMask = 0xf3;
TheChrisyd 1:f44175dd69fd 381 }
TheChrisyd 1:f44175dd69fd 382 unsigned int s = spriteMem+(py*16)+px;
TheChrisyd 1:f44175dd69fd 383 GD.wr(s,GD.rd(s)&pixelMask);
TheChrisyd 1:f44175dd69fd 384 }
TheChrisyd 1:f44175dd69fd 385 }
TheChrisyd 1:f44175dd69fd 386 blastMask >>= 1;
TheChrisyd 1:f44175dd69fd 387 }
TheChrisyd 1:f44175dd69fd 388 }
TheChrisyd 1:f44175dd69fd 389 ++blastMap;
TheChrisyd 1:f44175dd69fd 390 }
TheChrisyd 1:f44175dd69fd 391
TheChrisyd 1:f44175dd69fd 392 }
TheChrisyd 1:f44175dd69fd 393 return y;
TheChrisyd 1:f44175dd69fd 394 }