Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
graphics.cpp@4:e82f4a87df9e, 2013-10-26 (annotated)
- Committer:
- TheChrisyd
- Date:
- Sat Oct 26 22:32:18 2013 +0000
- Revision:
- 4:e82f4a87df9e
- Parent:
- 2:20a89dc286d5
Shields are now destroyed when hit, corrected score displays
Who changed what in which revision?
| User | Revision | Line number | New 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:e82f4a87df9e | 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:e82f4a87df9e | 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:e82f4a87df9e | 346 | int8_t offset = 3; | 
| TheChrisyd | 4:e82f4a87df9e | 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:e82f4a87df9e | 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:e82f4a87df9e | 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 | } |