Invaders game for the Gameduino

Dependencies:   Gameduino mbed

Committer:
TheChrisyd
Date:
Thu Jun 21 19:13:34 2012 +0000
Revision:
0:8a7c58553b44
Child:
1:f44175dd69fd
backup before adding more features

Who changed what in which revision?

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