Space invaders with a nRF2401A wireless joypad

Dependencies:   Gameduino mbed nRF2401A

Fork of Gameduino_Invaders_game by Chris Dick

Gameduino and an nRF2401A hooked up to an mbed on an mbeduino:

/media/uploads/TheChrisyd/2014-03-08_22.53.54.jpg

Committer:
TheChrisyd
Date:
Sun Mar 09 12:27:20 2014 +0000
Revision:
5:3ede9991d8e0
Parent:
4:bb78bedae411
Update to match Library update

Who changed what in which revision?

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