Chris Dick
/
Gameduino_Invaders_game
Invaders game for the Gameduino
graphics.cpp@1:f44175dd69fd, 2012-09-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |