updating stuff
Fork of Pokittris by
tetris.cpp@1:827c9852286e, 2017-10-15 (annotated)
- Committer:
- spinal
- Date:
- Sun Oct 15 16:51:15 2017 +0000
- Revision:
- 1:827c9852286e
- Parent:
- 0:f759a823d3ae
- Child:
- 3:8540039d1eed
messing about with draw routines
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mougino | 0:f759a823d3ae | 1 | // music - 8bit archade4 from www.dl-sounds.com |
mougino | 0:f759a823d3ae | 2 | |
mougino | 0:f759a823d3ae | 3 | #include "Pokitto.h" |
mougino | 0:f759a823d3ae | 4 | #include "tetris_gfx.h" |
mougino | 0:f759a823d3ae | 5 | #include "easing.h" |
mougino | 0:f759a823d3ae | 6 | |
mougino | 0:f759a823d3ae | 7 | #define REPSPEED 12 |
mougino | 0:f759a823d3ae | 8 | |
mougino | 0:f759a823d3ae | 9 | Pokitto::Core game; |
mougino | 0:f759a823d3ae | 10 | |
mougino | 0:f759a823d3ae | 11 | bool bgNum = 1; |
mougino | 0:f759a823d3ae | 12 | char musicName[] = "pokittris.raw"; |
mougino | 0:f759a823d3ae | 13 | byte palNum = 0; |
mougino | 0:f759a823d3ae | 14 | |
mougino | 0:f759a823d3ae | 15 | int topLine; |
mougino | 0:f759a823d3ae | 16 | byte unlockedPal=0; |
mougino | 0:f759a823d3ae | 17 | bool removeLine[19]; |
mougino | 0:f759a823d3ae | 18 | byte linesToRemove=0; |
mougino | 0:f759a823d3ae | 19 | byte animCount; |
mougino | 0:f759a823d3ae | 20 | bool splodeOK=0; |
mougino | 0:f759a823d3ae | 21 | byte animSplode=0; |
mougino | 0:f759a823d3ae | 22 | |
spinal | 1:827c9852286e | 23 | |
spinal | 1:827c9852286e | 24 | /**************************************************************************/ |
spinal | 1:827c9852286e | 25 | #define HELD 0 |
spinal | 1:827c9852286e | 26 | #define NEW 1 |
spinal | 1:827c9852286e | 27 | #define RELEASE 2 |
spinal | 1:827c9852286e | 28 | byte CompletePad, ExPad, TempPad, myPad; |
spinal | 1:827c9852286e | 29 | bool _A[3], _B[3], _C[3], _Up[3], _Down[3], _Left[3], _Right[3]; |
spinal | 1:827c9852286e | 30 | |
spinal | 1:827c9852286e | 31 | DigitalIn _aPin(P1_9); |
spinal | 1:827c9852286e | 32 | DigitalIn _bPin(P1_4); |
spinal | 1:827c9852286e | 33 | DigitalIn _cPin(P1_10); |
spinal | 1:827c9852286e | 34 | DigitalIn _upPin(P1_13); |
spinal | 1:827c9852286e | 35 | DigitalIn _downPin(P1_3); |
spinal | 1:827c9852286e | 36 | DigitalIn _leftPin(P1_25); |
spinal | 1:827c9852286e | 37 | DigitalIn _rightPin(P1_7); |
spinal | 1:827c9852286e | 38 | |
mougino | 0:f759a823d3ae | 39 | void UPDATEPAD(int pad, int var) { |
mougino | 0:f759a823d3ae | 40 | _C[pad] = (var >> 1)&1; |
mougino | 0:f759a823d3ae | 41 | _B[pad] = (var >> 2)&1; |
mougino | 0:f759a823d3ae | 42 | _A[pad] = (var >> 3)&1; |
mougino | 0:f759a823d3ae | 43 | _Down[pad] = (var >> 4)&1; |
mougino | 0:f759a823d3ae | 44 | _Left[pad] = (var >> 5)&1; |
mougino | 0:f759a823d3ae | 45 | _Right[pad] = (var >> 6)&1; |
mougino | 0:f759a823d3ae | 46 | _Up[pad] = (var >> 7)&1; |
mougino | 0:f759a823d3ae | 47 | } |
mougino | 0:f759a823d3ae | 48 | |
mougino | 0:f759a823d3ae | 49 | void UpdatePad(int joy_code){ |
mougino | 0:f759a823d3ae | 50 | ExPad = CompletePad; |
mougino | 0:f759a823d3ae | 51 | CompletePad = joy_code; |
mougino | 0:f759a823d3ae | 52 | UPDATEPAD(HELD, CompletePad); // held |
mougino | 0:f759a823d3ae | 53 | UPDATEPAD(RELEASE, (ExPad & (~CompletePad))); // released |
mougino | 0:f759a823d3ae | 54 | UPDATEPAD(NEW, (CompletePad & (~ExPad))); // newpress |
mougino | 0:f759a823d3ae | 55 | } |
mougino | 0:f759a823d3ae | 56 | |
mougino | 0:f759a823d3ae | 57 | byte updateButtons(byte var){ |
mougino | 0:f759a823d3ae | 58 | var = 0; |
spinal | 1:827c9852286e | 59 | if (_cPin) var |= (1<<1); |
spinal | 1:827c9852286e | 60 | if (_bPin) var |= (1<<2); |
spinal | 1:827c9852286e | 61 | if (_aPin) var |= (1<<3); // P1_9 = A |
spinal | 1:827c9852286e | 62 | if (_downPin) var |= (1<<4); |
spinal | 1:827c9852286e | 63 | if (_leftPin) var |= (1<<5); |
spinal | 1:827c9852286e | 64 | if (_rightPin) var |= (1<<6); |
spinal | 1:827c9852286e | 65 | if (_upPin) var |= (1<<7); |
mougino | 0:f759a823d3ae | 66 | |
mougino | 0:f759a823d3ae | 67 | return var; |
mougino | 0:f759a823d3ae | 68 | } |
mougino | 0:f759a823d3ae | 69 | |
mougino | 0:f759a823d3ae | 70 | |
mougino | 0:f759a823d3ae | 71 | |
mougino | 0:f759a823d3ae | 72 | // some globals... |
mougino | 0:f759a823d3ae | 73 | long int frameNumber = 0; |
mougino | 0:f759a823d3ae | 74 | long int myDelay; |
mougino | 0:f759a823d3ae | 75 | long int tempTime; |
mougino | 0:f759a823d3ae | 76 | int dropTime = 0; |
mougino | 0:f759a823d3ae | 77 | int slideTime = 0; |
mougino | 0:f759a823d3ae | 78 | byte gameMode = 0; |
mougino | 0:f759a823d3ae | 79 | bool paused = 0; |
mougino | 0:f759a823d3ae | 80 | byte menuItem; |
mougino | 0:f759a823d3ae | 81 | bool bgmusic = 1; |
mougino | 0:f759a823d3ae | 82 | |
mougino | 0:f759a823d3ae | 83 | byte px, py, ps, pr; // player x,y,shape,rotation |
mougino | 0:f759a823d3ae | 84 | byte nextTile; |
mougino | 0:f759a823d3ae | 85 | byte lineCount, level; |
mougino | 0:f759a823d3ae | 86 | int score, lines; |
mougino | 0:f759a823d3ae | 87 | bool okToContinue = 0; |
mougino | 0:f759a823d3ae | 88 | byte slideSpeed = 10; |
mougino | 0:f759a823d3ae | 89 | |
mougino | 0:f759a823d3ae | 90 | |
mougino | 0:f759a823d3ae | 91 | void loadPal(char num){ |
mougino | 0:f759a823d3ae | 92 | unsigned short curPal[4]; |
mougino | 0:f759a823d3ae | 93 | curPal[0] = pallet[(num*4)]; |
mougino | 0:f759a823d3ae | 94 | curPal[1] = pallet[(num*4)+1]; |
mougino | 0:f759a823d3ae | 95 | curPal[2] = pallet[(num*4)+2]; |
mougino | 0:f759a823d3ae | 96 | curPal[3] = pallet[(num*4)+3]; |
mougino | 0:f759a823d3ae | 97 | game.display.load565Palette(curPal); |
mougino | 0:f759a823d3ae | 98 | } |
mougino | 0:f759a823d3ae | 99 | |
mougino | 0:f759a823d3ae | 100 | void drawShape(byte x1, signed char y1, byte shape, byte frame) { |
mougino | 0:f759a823d3ae | 101 | for (char y = 0; y < 4; y++) { |
mougino | 0:f759a823d3ae | 102 | if (y1 + y > 1) { |
mougino | 0:f759a823d3ae | 103 | for (char x = 0; x < 4; x++) { |
mougino | 0:f759a823d3ae | 104 | byte mt = pgm_read_byte(shapeMap + (x + 4 * y) + shape * 64 + (frame * 16)); |
mougino | 0:f759a823d3ae | 105 | if (mt > 1) { |
mougino | 0:f759a823d3ae | 106 | game.display.drawBitmap((x1 + x)*8, (y1 + y)*8, tile_gfx[(mt-1)+shape*6]); |
mougino | 0:f759a823d3ae | 107 | } |
mougino | 0:f759a823d3ae | 108 | } |
mougino | 0:f759a823d3ae | 109 | } |
mougino | 0:f759a823d3ae | 110 | } |
mougino | 0:f759a823d3ae | 111 | } |
mougino | 0:f759a823d3ae | 112 | |
mougino | 0:f759a823d3ae | 113 | bool check(signed char x1, signed char y1, char rot) { |
mougino | 0:f759a823d3ae | 114 | byte ret=0; |
mougino | 0:f759a823d3ae | 115 | for (char y = 0; y < 4; y++) { |
mougino | 0:f759a823d3ae | 116 | if (y1 + y >= 0) { |
mougino | 0:f759a823d3ae | 117 | for (char x = 0; x < 4; x++) { |
mougino | 0:f759a823d3ae | 118 | byte mt = pgm_read_byte(shapeMap + (x + 4 * y) + ps * 64 + (rot * 16)); |
mougino | 0:f759a823d3ae | 119 | if (mt > 1) { |
mougino | 0:f759a823d3ae | 120 | if ( playfield[(x1 + x) + 16 * (y1 + y)] != 0) { |
mougino | 0:f759a823d3ae | 121 | ret= 1; |
mougino | 0:f759a823d3ae | 122 | } |
mougino | 0:f759a823d3ae | 123 | } |
mougino | 0:f759a823d3ae | 124 | } |
mougino | 0:f759a823d3ae | 125 | } |
mougino | 0:f759a823d3ae | 126 | } |
mougino | 0:f759a823d3ae | 127 | return ret; |
mougino | 0:f759a823d3ae | 128 | } |
mougino | 0:f759a823d3ae | 129 | |
mougino | 0:f759a823d3ae | 130 | void stamp(signed char x1, signed char y1, byte shape, byte rot) { |
mougino | 0:f759a823d3ae | 131 | for (char y = 0; y < 4; y++) { |
mougino | 0:f759a823d3ae | 132 | if (y1 + y >= 0) { |
mougino | 0:f759a823d3ae | 133 | for (char x = 0; x < 4; x++) { |
mougino | 0:f759a823d3ae | 134 | byte mt = pgm_read_byte(shapeMap + (x + 4 * y) + shape * 64 + (rot * 16)); |
mougino | 0:f759a823d3ae | 135 | if (mt > 1) { |
mougino | 0:f759a823d3ae | 136 | playfield[(x1 + x) + 16 * (y1 + y)] = (mt-1)+shape*6; |
mougino | 0:f759a823d3ae | 137 | } |
mougino | 0:f759a823d3ae | 138 | } |
mougino | 0:f759a823d3ae | 139 | } |
mougino | 0:f759a823d3ae | 140 | } |
mougino | 0:f759a823d3ae | 141 | } |
mougino | 0:f759a823d3ae | 142 | |
mougino | 0:f759a823d3ae | 143 | |
mougino | 0:f759a823d3ae | 144 | void clearPlayfield() { |
mougino | 0:f759a823d3ae | 145 | for (char y = 0; y < 19; y++) { |
mougino | 0:f759a823d3ae | 146 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 147 | playfield[x + 16 * y] = 0; |
mougino | 0:f759a823d3ae | 148 | } |
mougino | 0:f759a823d3ae | 149 | } |
mougino | 0:f759a823d3ae | 150 | } |
mougino | 0:f759a823d3ae | 151 | |
mougino | 0:f759a823d3ae | 152 | void drawBackground(){ |
mougino | 0:f759a823d3ae | 153 | for (char y = 0; y < 22; y++) { |
mougino | 0:f759a823d3ae | 154 | for (char x = 0; x < 28; x++) { |
mougino | 0:f759a823d3ae | 155 | byte mt = bg_map[x + 28 * y + (616*bgNum)]; |
mougino | 0:f759a823d3ae | 156 | game.display.drawBitmap(x*8, y*8, bg_gfx[mt]); |
mougino | 0:f759a823d3ae | 157 | } |
mougino | 0:f759a823d3ae | 158 | } |
mougino | 0:f759a823d3ae | 159 | } |
mougino | 0:f759a823d3ae | 160 | |
mougino | 0:f759a823d3ae | 161 | void drawPlayfield() { |
mougino | 0:f759a823d3ae | 162 | drawBackground(); |
mougino | 0:f759a823d3ae | 163 | |
mougino | 0:f759a823d3ae | 164 | for (char y = 1; y < 19; y++) { |
mougino | 0:f759a823d3ae | 165 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 166 | byte mt = playfield[x + 16 * y]; |
mougino | 0:f759a823d3ae | 167 | game.display.drawBitmap((x + 5)*8, (y+1 )*8, tile_gfx[mt]); |
mougino | 0:f759a823d3ae | 168 | } |
mougino | 0:f759a823d3ae | 169 | } |
mougino | 0:f759a823d3ae | 170 | |
mougino | 0:f759a823d3ae | 171 | if(animSplode==0){ |
mougino | 0:f759a823d3ae | 172 | // current shape |
mougino | 0:f759a823d3ae | 173 | drawShape(px+5, py+1, ps, pr); |
mougino | 0:f759a823d3ae | 174 | } |
mougino | 0:f759a823d3ae | 175 | // next shape? |
mougino | 0:f759a823d3ae | 176 | drawShape(19, 14, nextTile, 0); |
mougino | 0:f759a823d3ae | 177 | |
mougino | 0:f759a823d3ae | 178 | char text[] = " "; |
mougino | 0:f759a823d3ae | 179 | sprintf(text, "%05d", score); |
mougino | 0:f759a823d3ae | 180 | game.display.setCursor(152,56); |
mougino | 0:f759a823d3ae | 181 | game.display.color=3; |
mougino | 0:f759a823d3ae | 182 | game.display.print(text); |
mougino | 0:f759a823d3ae | 183 | sprintf(text, "%5d", level); |
mougino | 0:f759a823d3ae | 184 | game.display.setCursor(16,96); |
mougino | 0:f759a823d3ae | 185 | game.display.print(text); |
mougino | 0:f759a823d3ae | 186 | sprintf(text, "%5d", lines); |
mougino | 0:f759a823d3ae | 187 | game.display.setCursor(16,48); |
mougino | 0:f759a823d3ae | 188 | game.display.print(text); |
mougino | 0:f759a823d3ae | 189 | |
mougino | 0:f759a823d3ae | 190 | } |
mougino | 0:f759a823d3ae | 191 | |
mougino | 0:f759a823d3ae | 192 | |
mougino | 0:f759a823d3ae | 193 | |
mougino | 0:f759a823d3ae | 194 | void checkLine() { |
mougino | 0:f759a823d3ae | 195 | |
mougino | 0:f759a823d3ae | 196 | for(char t=0; t<19; t++){ |
mougino | 0:f759a823d3ae | 197 | removeLine[t]=0; |
mougino | 0:f759a823d3ae | 198 | } |
mougino | 0:f759a823d3ae | 199 | |
mougino | 0:f759a823d3ae | 200 | if (py <= 0) { |
mougino | 0:f759a823d3ae | 201 | loadPal(1); // default green palette |
mougino | 0:f759a823d3ae | 202 | gameMode = 3; // gameOver if off top of screen |
mougino | 0:f759a823d3ae | 203 | frameNumber=0; |
mougino | 0:f759a823d3ae | 204 | return; |
mougino | 0:f759a823d3ae | 205 | } |
mougino | 0:f759a823d3ae | 206 | |
mougino | 0:f759a823d3ae | 207 | score++; // increase score here as it's called whenever a tile drops |
mougino | 0:f759a823d3ae | 208 | topLine = 0; |
mougino | 0:f759a823d3ae | 209 | |
mougino | 0:f759a823d3ae | 210 | for (char y = 0; y < 19; y++) { |
mougino | 0:f759a823d3ae | 211 | char line = 0; |
mougino | 0:f759a823d3ae | 212 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 213 | line += playfield[x + 16 * y] != 0 ? 1 : 0; |
mougino | 0:f759a823d3ae | 214 | } |
mougino | 0:f759a823d3ae | 215 | if (line == 10) { // remove line |
mougino | 0:f759a823d3ae | 216 | removeLine[y]=1; |
mougino | 0:f759a823d3ae | 217 | linesToRemove++; |
mougino | 0:f759a823d3ae | 218 | if(linesToRemove==4){splodeOK=1;} |
mougino | 0:f759a823d3ae | 219 | lineCount++; |
mougino | 0:f759a823d3ae | 220 | if (lineCount == 10) { |
mougino | 0:f759a823d3ae | 221 | lineCount = 0; |
mougino | 0:f759a823d3ae | 222 | level++; |
mougino | 0:f759a823d3ae | 223 | } |
mougino | 0:f759a823d3ae | 224 | lines++; |
mougino | 0:f759a823d3ae | 225 | score += 10; |
mougino | 0:f759a823d3ae | 226 | } |
mougino | 0:f759a823d3ae | 227 | } |
mougino | 0:f759a823d3ae | 228 | |
mougino | 0:f759a823d3ae | 229 | for (char y = 0; y < 10; y++) { |
mougino | 0:f759a823d3ae | 230 | char line = 0; |
mougino | 0:f759a823d3ae | 231 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 232 | topLine += playfield[x + 16 * y] != 0 ? 1 : 0; |
mougino | 0:f759a823d3ae | 233 | } |
mougino | 0:f759a823d3ae | 234 | } |
mougino | 0:f759a823d3ae | 235 | |
mougino | 0:f759a823d3ae | 236 | |
mougino | 0:f759a823d3ae | 237 | // mess with the palette |
mougino | 0:f759a823d3ae | 238 | |
mougino | 0:f759a823d3ae | 239 | int percent = 100; |
mougino | 0:f759a823d3ae | 240 | int diff = topLine; |
mougino | 0:f759a823d3ae | 241 | |
mougino | 0:f759a823d3ae | 242 | unsigned short *p; |
mougino | 0:f759a823d3ae | 243 | palNum = 0;//level & 31; |
mougino | 0:f759a823d3ae | 244 | p=pallet+(palNum*4); |
mougino | 0:f759a823d3ae | 245 | unsigned short curPal[4]; |
mougino | 0:f759a823d3ae | 246 | |
mougino | 0:f759a823d3ae | 247 | curPal[0] = pallet[(palNum*4)]; |
mougino | 0:f759a823d3ae | 248 | curPal[1] = pallet[(palNum*4)+1]; |
mougino | 0:f759a823d3ae | 249 | curPal[2] = pallet[(palNum*4)+2]; |
mougino | 0:f759a823d3ae | 250 | curPal[3] = pallet[(palNum*4)+3]; |
mougino | 0:f759a823d3ae | 251 | |
mougino | 0:f759a823d3ae | 252 | int greyPal[] = {0xF800,0xF8000,0xF800,0xF800}; // it's actually RED for danger! |
mougino | 0:f759a823d3ae | 253 | |
mougino | 0:f759a823d3ae | 254 | unsigned short red[4], green[4], blue[4], red1[4], green1[4], blue1[4], red2[4], green2[4], blue2[4]; |
mougino | 0:f759a823d3ae | 255 | |
mougino | 0:f759a823d3ae | 256 | for(char t=0; t<4; t++){ |
mougino | 0:f759a823d3ae | 257 | red1[t] = (curPal[t]>>11) & 31; |
mougino | 0:f759a823d3ae | 258 | red2[t] = (greyPal[t]>> 11) & 31; |
mougino | 0:f759a823d3ae | 259 | green1[t] = (curPal[t]>> 5) & 63; |
mougino | 0:f759a823d3ae | 260 | green2[t] = (greyPal[t]>> 5) & 63; |
mougino | 0:f759a823d3ae | 261 | blue1[t] = curPal[t] & 31; |
mougino | 0:f759a823d3ae | 262 | blue2[t] = greyPal[t] & 31; |
mougino | 0:f759a823d3ae | 263 | |
mougino | 0:f759a823d3ae | 264 | red[t] = red1[t]+((red2[t]-red1[t])*diff/percent); |
mougino | 0:f759a823d3ae | 265 | green[t] = green1[t]+((green2[t]-green1[t])*diff/percent); |
mougino | 0:f759a823d3ae | 266 | blue[t] = blue1[t]+((blue2[t]-blue1[t])*diff/percent); |
mougino | 0:f759a823d3ae | 267 | |
mougino | 0:f759a823d3ae | 268 | curPal[t] = (red[t]<<11)+(green[t]<<5)+blue[t]; |
mougino | 0:f759a823d3ae | 269 | |
mougino | 0:f759a823d3ae | 270 | } |
mougino | 0:f759a823d3ae | 271 | game.display.load565Palette(curPal); |
mougino | 0:f759a823d3ae | 272 | } |
mougino | 0:f759a823d3ae | 273 | |
mougino | 0:f759a823d3ae | 274 | |
mougino | 0:f759a823d3ae | 275 | // transparent 2bit bitmap with mask |
mougino | 0:f759a823d3ae | 276 | void drawMyBitmap(int16_t x, int16_t y, const uint8_t* bitmap, const uint8_t* mask) |
mougino | 0:f759a823d3ae | 277 | { |
mougino | 0:f759a823d3ae | 278 | int16_t w = *bitmap; |
mougino | 0:f759a823d3ae | 279 | int16_t h = *(bitmap + 1); |
mougino | 0:f759a823d3ae | 280 | bitmap = bitmap + 2; //add an offset to the pointer to start after the width and height |
mougino | 0:f759a823d3ae | 281 | /** visibility check */ |
mougino | 0:f759a823d3ae | 282 | if (y<-h || y>game.display.height) return; //invisible |
mougino | 0:f759a823d3ae | 283 | if (x<-w || x>game.display.width) return; //invisible |
mougino | 0:f759a823d3ae | 284 | |
mougino | 0:f759a823d3ae | 285 | /** 2 bpp mode */ |
mougino | 0:f759a823d3ae | 286 | int16_t i, j, byteNum, bitNum, byteWidth = w >> 2; |
mougino | 0:f759a823d3ae | 287 | for (i = 0; i < w; i++) { |
mougino | 0:f759a823d3ae | 288 | byteNum = i / 4; |
mougino | 0:f759a823d3ae | 289 | bitNum = (i % 4)<<1; |
mougino | 0:f759a823d3ae | 290 | for (j = 0; j < h; j++) { |
mougino | 0:f759a823d3ae | 291 | uint8_t source = *(bitmap + j * byteWidth + byteNum); |
mougino | 0:f759a823d3ae | 292 | uint8_t source2 = *(mask + j * byteWidth + byteNum+2); |
mougino | 0:f759a823d3ae | 293 | uint8_t output = (source & (0xC0 >> bitNum)); |
mougino | 0:f759a823d3ae | 294 | output >>= (6-bitNum); |
mougino | 0:f759a823d3ae | 295 | |
mougino | 0:f759a823d3ae | 296 | uint8_t output2 = (source2 & (0xC0 >> bitNum)); |
mougino | 0:f759a823d3ae | 297 | output2 >>= (6-bitNum); |
mougino | 0:f759a823d3ae | 298 | |
mougino | 0:f759a823d3ae | 299 | if (output2 != 0) { |
mougino | 0:f759a823d3ae | 300 | game.display.setColor(output); |
mougino | 0:f759a823d3ae | 301 | game.display.drawPixel(x + i, y + j); |
mougino | 0:f759a823d3ae | 302 | } |
mougino | 0:f759a823d3ae | 303 | } |
mougino | 0:f759a823d3ae | 304 | } |
mougino | 0:f759a823d3ae | 305 | } |
mougino | 0:f759a823d3ae | 306 | |
mougino | 0:f759a823d3ae | 307 | |
mougino | 0:f759a823d3ae | 308 | |
mougino | 0:f759a823d3ae | 309 | void titleScreen(){ |
mougino | 0:f759a823d3ae | 310 | |
mougino | 0:f759a823d3ae | 311 | // background |
mougino | 0:f759a823d3ae | 312 | for (char y = 0; y < 22; y++) { |
mougino | 0:f759a823d3ae | 313 | for (char x = 0; x < 28; x++) { |
mougino | 0:f759a823d3ae | 314 | byte mt = bg_map[x + 28 * y]; |
mougino | 0:f759a823d3ae | 315 | game.display.drawBitmap(x*8, y*8, bg_gfx[mt]); |
mougino | 0:f759a823d3ae | 316 | } |
mougino | 0:f759a823d3ae | 317 | } |
mougino | 0:f759a823d3ae | 318 | |
mougino | 0:f759a823d3ae | 319 | int y=48; |
mougino | 0:f759a823d3ae | 320 | if(frameNumber<=64){ |
mougino | 0:f759a823d3ae | 321 | // time, start, distance, duration |
mougino | 0:f759a823d3ae | 322 | #ifdef POK_SIM |
mougino | 0:f759a823d3ae | 323 | y = easeOutBounce(frameNumber, -48, 48+48, 64); |
mougino | 0:f759a823d3ae | 324 | #else |
mougino | 0:f759a823d3ae | 325 | y = easeOutBounce(frameNumber*4, -48, 48+48, 64); |
mougino | 0:f759a823d3ae | 326 | if (y>48) y=48; |
mougino | 0:f759a823d3ae | 327 | #endif |
mougino | 0:f759a823d3ae | 328 | } |
mougino | 0:f759a823d3ae | 329 | drawMyBitmap(16, y, title_bitmap, title_mask); |
mougino | 0:f759a823d3ae | 330 | |
mougino | 0:f759a823d3ae | 331 | |
mougino | 0:f759a823d3ae | 332 | char text[] = " Press A to Start "; |
mougino | 0:f759a823d3ae | 333 | game.display.setCursor(40,120); |
mougino | 0:f759a823d3ae | 334 | game.display.color=3; |
mougino | 0:f759a823d3ae | 335 | game.display.print(text); |
mougino | 0:f759a823d3ae | 336 | |
mougino | 0:f759a823d3ae | 337 | if(_A[NEW]){ |
mougino | 0:f759a823d3ae | 338 | // make sure the playfield is clear! |
mougino | 0:f759a823d3ae | 339 | for (char y = 18; y > 0; y--) { |
mougino | 0:f759a823d3ae | 340 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 341 | playfield[x + 16 * y] = 0; |
mougino | 0:f759a823d3ae | 342 | } |
mougino | 0:f759a823d3ae | 343 | } |
mougino | 0:f759a823d3ae | 344 | |
mougino | 0:f759a823d3ae | 345 | loadPal(0); // default green palette |
mougino | 0:f759a823d3ae | 346 | gameMode = 1; |
mougino | 0:f759a823d3ae | 347 | } |
mougino | 0:f759a823d3ae | 348 | |
mougino | 0:f759a823d3ae | 349 | } |
mougino | 0:f759a823d3ae | 350 | |
mougino | 0:f759a823d3ae | 351 | void gameOver(){ |
mougino | 0:f759a823d3ae | 352 | // background |
mougino | 0:f759a823d3ae | 353 | for (char y = 0; y < 22; y++) { |
mougino | 0:f759a823d3ae | 354 | for (char x = 0; x < 28; x++) { |
mougino | 0:f759a823d3ae | 355 | byte mt = bg_map[x + 28 * y]; |
mougino | 0:f759a823d3ae | 356 | game.display.drawBitmap(x*8, y*8, bg_gfx[mt]); |
mougino | 0:f759a823d3ae | 357 | } |
mougino | 0:f759a823d3ae | 358 | } |
mougino | 0:f759a823d3ae | 359 | |
mougino | 0:f759a823d3ae | 360 | int y=48; |
mougino | 0:f759a823d3ae | 361 | if(frameNumber<=64){ |
mougino | 0:f759a823d3ae | 362 | // time, start, distance, duration |
mougino | 0:f759a823d3ae | 363 | y = easeOutBounce(frameNumber, -48, 48+48, 64); |
mougino | 0:f759a823d3ae | 364 | } |
mougino | 0:f759a823d3ae | 365 | drawMyBitmap(1, y, gameover_bitmap, gameover_mask); |
mougino | 0:f759a823d3ae | 366 | |
mougino | 0:f759a823d3ae | 367 | char text[] = " Press A "; |
mougino | 0:f759a823d3ae | 368 | game.display.setCursor(62,120); |
mougino | 0:f759a823d3ae | 369 | game.display.color=3; |
mougino | 0:f759a823d3ae | 370 | game.display.print(text); |
mougino | 0:f759a823d3ae | 371 | |
mougino | 0:f759a823d3ae | 372 | if(_A[NEW]){ |
mougino | 0:f759a823d3ae | 373 | gameMode = 0; |
mougino | 0:f759a823d3ae | 374 | frameNumber = 0; |
mougino | 0:f759a823d3ae | 375 | score=0; |
mougino | 0:f759a823d3ae | 376 | lines=0; |
mougino | 0:f759a823d3ae | 377 | level=0; |
mougino | 0:f759a823d3ae | 378 | splodeOK=0; |
mougino | 0:f759a823d3ae | 379 | animSplode=0; |
mougino | 0:f759a823d3ae | 380 | } |
mougino | 0:f759a823d3ae | 381 | |
mougino | 0:f759a823d3ae | 382 | } |
mougino | 0:f759a823d3ae | 383 | |
mougino | 0:f759a823d3ae | 384 | void playGame(){ |
mougino | 0:f759a823d3ae | 385 | #ifdef POK_SIM |
mougino | 0:f759a823d3ae | 386 | #define SLIDECOUNT 6 |
mougino | 0:f759a823d3ae | 387 | #define DROPCOUNT 20 |
mougino | 0:f759a823d3ae | 388 | #else |
mougino | 0:f759a823d3ae | 389 | #define SLIDECOUNT 1 |
mougino | 0:f759a823d3ae | 390 | #define DROPCOUNT 2 |
mougino | 0:f759a823d3ae | 391 | #endif |
mougino | 0:f759a823d3ae | 392 | |
mougino | 0:f759a823d3ae | 393 | if(linesToRemove==0 && animSplode==0){ |
mougino | 0:f759a823d3ae | 394 | |
mougino | 0:f759a823d3ae | 395 | if (_Left[NEW]) { |
mougino | 0:f759a823d3ae | 396 | if (check(px - 1, py, pr) == 0) { |
mougino | 0:f759a823d3ae | 397 | px--; |
mougino | 0:f759a823d3ae | 398 | slideTime = 0; |
mougino | 0:f759a823d3ae | 399 | } |
mougino | 0:f759a823d3ae | 400 | } |
mougino | 0:f759a823d3ae | 401 | if (_Right[NEW]) { |
mougino | 0:f759a823d3ae | 402 | if (check(px + 1, py, pr) == 0) { |
mougino | 0:f759a823d3ae | 403 | px++; |
mougino | 0:f759a823d3ae | 404 | slideTime = 0; |
mougino | 0:f759a823d3ae | 405 | } |
mougino | 0:f759a823d3ae | 406 | } |
mougino | 0:f759a823d3ae | 407 | if (_Left[HELD] && slideTime++ > SLIDECOUNT) { |
mougino | 0:f759a823d3ae | 408 | if (check(px - 1, py, pr) == 0) { |
mougino | 0:f759a823d3ae | 409 | px--; |
mougino | 0:f759a823d3ae | 410 | slideTime = 12; |
mougino | 0:f759a823d3ae | 411 | } |
mougino | 0:f759a823d3ae | 412 | } |
mougino | 0:f759a823d3ae | 413 | if (_Right[HELD] && slideTime++ > SLIDECOUNT) { |
mougino | 0:f759a823d3ae | 414 | if (check(px + 1, py, pr) == 0) { |
mougino | 0:f759a823d3ae | 415 | px++; |
mougino | 0:f759a823d3ae | 416 | slideTime = 12; |
mougino | 0:f759a823d3ae | 417 | } |
mougino | 0:f759a823d3ae | 418 | } |
mougino | 0:f759a823d3ae | 419 | |
mougino | 0:f759a823d3ae | 420 | if ((_Down[HELD]) || (dropTime++ > DROPCOUNT - (level * 2))) { |
mougino | 0:f759a823d3ae | 421 | dropTime = 0; |
mougino | 0:f759a823d3ae | 422 | if (check(px, py+1, pr) == 0) { |
mougino | 0:f759a823d3ae | 423 | py++; |
mougino | 0:f759a823d3ae | 424 | } else { |
mougino | 0:f759a823d3ae | 425 | // place shape and create new one |
mougino | 0:f759a823d3ae | 426 | stamp(px, py, ps, pr); |
mougino | 0:f759a823d3ae | 427 | checkLine(); |
mougino | 0:f759a823d3ae | 428 | py = 0; px = 6; ps = nextTile; nextTile = random(6); pr = 0; |
mougino | 0:f759a823d3ae | 429 | } |
mougino | 0:f759a823d3ae | 430 | } |
mougino | 0:f759a823d3ae | 431 | if (_Up[NEW] && splodeOK==1) { |
mougino | 0:f759a823d3ae | 432 | splodeOK=0; |
mougino | 0:f759a823d3ae | 433 | animSplode=1; |
mougino | 0:f759a823d3ae | 434 | } |
mougino | 0:f759a823d3ae | 435 | |
spinal | 1:827c9852286e | 436 | if (_B[NEW]) { |
mougino | 0:f759a823d3ae | 437 | if (check(px, py, (pr - 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 438 | pr--; |
mougino | 0:f759a823d3ae | 439 | } else if (check(px - 1, py, (pr - 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 440 | pr--; px--; |
mougino | 0:f759a823d3ae | 441 | } else if (check(px + 1, py, (pr - 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 442 | pr--; px++; |
mougino | 0:f759a823d3ae | 443 | } else if (check(px - 2, py, (pr - 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 444 | pr--; px -= 2; |
mougino | 0:f759a823d3ae | 445 | } else if (check(px + 2, py, (pr - 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 446 | pr--; px += 2; |
mougino | 0:f759a823d3ae | 447 | } |
mougino | 0:f759a823d3ae | 448 | pr &= 3; |
mougino | 0:f759a823d3ae | 449 | } |
mougino | 0:f759a823d3ae | 450 | |
spinal | 1:827c9852286e | 451 | if (_A[NEW]) { |
mougino | 0:f759a823d3ae | 452 | if (check(px, py, (pr + 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 453 | pr++; |
mougino | 0:f759a823d3ae | 454 | } else if (check(px - 1, py, (pr + 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 455 | pr++; px--; |
mougino | 0:f759a823d3ae | 456 | } else if (check(px + 1, py, (pr + 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 457 | pr++; px++; |
mougino | 0:f759a823d3ae | 458 | } else if (check(px - 2, py, (pr + 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 459 | pr++; px -= 2; |
mougino | 0:f759a823d3ae | 460 | } else if (check(px + 2, py, (pr + 1) & 3) == 0) { |
mougino | 0:f759a823d3ae | 461 | pr++; px += 2; |
mougino | 0:f759a823d3ae | 462 | } |
mougino | 0:f759a823d3ae | 463 | pr &= 3; |
mougino | 0:f759a823d3ae | 464 | } |
mougino | 0:f759a823d3ae | 465 | |
mougino | 0:f759a823d3ae | 466 | animCount=0; |
mougino | 0:f759a823d3ae | 467 | } |
mougino | 0:f759a823d3ae | 468 | |
mougino | 0:f759a823d3ae | 469 | if(linesToRemove!=0){ |
mougino | 0:f759a823d3ae | 470 | // remove some lines |
mougino | 0:f759a823d3ae | 471 | for(byte t=0; t<19; t++){ |
mougino | 0:f759a823d3ae | 472 | if(removeLine[t]==1){ |
mougino | 0:f759a823d3ae | 473 | if(animCount<5){ |
mougino | 0:f759a823d3ae | 474 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 475 | playfield[x + 16 * t] = 5+animCount*6; |
mougino | 0:f759a823d3ae | 476 | } // x |
mougino | 0:f759a823d3ae | 477 | }else{ |
mougino | 0:f759a823d3ae | 478 | removeLine[t]=0; |
mougino | 0:f759a823d3ae | 479 | linesToRemove--; |
mougino | 0:f759a823d3ae | 480 | for (char y1 = t; y1 > 0; y1--) { |
mougino | 0:f759a823d3ae | 481 | for (char x = 3; x < 13; x++) { |
mougino | 0:f759a823d3ae | 482 | playfield[x + 16 * y1] = playfield[x + 16 * (y1 - 1)]; |
mougino | 0:f759a823d3ae | 483 | } |
mougino | 0:f759a823d3ae | 484 | } |
mougino | 0:f759a823d3ae | 485 | } |
mougino | 0:f759a823d3ae | 486 | } |
mougino | 0:f759a823d3ae | 487 | } |
mougino | 0:f759a823d3ae | 488 | animCount++; |
mougino | 0:f759a823d3ae | 489 | } |
mougino | 0:f759a823d3ae | 490 | |
mougino | 0:f759a823d3ae | 491 | if(animSplode!=0){ |
mougino | 0:f759a823d3ae | 492 | |
mougino | 0:f759a823d3ae | 493 | if(animSplode<6){ |
mougino | 0:f759a823d3ae | 494 | for (char y = 0; y < 4; y++) { |
mougino | 0:f759a823d3ae | 495 | if (py + y >= 0) { |
mougino | 0:f759a823d3ae | 496 | for (char x = 0; x < 4; x++) { |
mougino | 0:f759a823d3ae | 497 | byte mt = pgm_read_byte(shapeMap + (x + 4 * y) + ps * 64 + (pr * 16)); |
mougino | 0:f759a823d3ae | 498 | if (mt > 1) { |
mougino | 0:f759a823d3ae | 499 | playfield[(px + x) + 16 * (py + y)] = 5+animSplode*6; |
mougino | 0:f759a823d3ae | 500 | } |
mougino | 0:f759a823d3ae | 501 | } |
mougino | 0:f759a823d3ae | 502 | } |
mougino | 0:f759a823d3ae | 503 | } |
mougino | 0:f759a823d3ae | 504 | animSplode++; |
mougino | 0:f759a823d3ae | 505 | }else{ |
mougino | 0:f759a823d3ae | 506 | |
mougino | 0:f759a823d3ae | 507 | for (char y = 0; y < 4; y++) { |
mougino | 0:f759a823d3ae | 508 | if (py + y >= 0) { |
mougino | 0:f759a823d3ae | 509 | for (char x = 0; x < 4; x++) { |
mougino | 0:f759a823d3ae | 510 | byte mt = pgm_read_byte(shapeMap + (x + 4 * y) + ps * 64 + (pr * 16)); |
mougino | 0:f759a823d3ae | 511 | if (mt > 1) { |
mougino | 0:f759a823d3ae | 512 | playfield[(px + x) + 16 * (py + y)] = 0; |
mougino | 0:f759a823d3ae | 513 | } |
mougino | 0:f759a823d3ae | 514 | } |
mougino | 0:f759a823d3ae | 515 | } |
mougino | 0:f759a823d3ae | 516 | } |
mougino | 0:f759a823d3ae | 517 | py = 0; px = 6; ps = nextTile; |
mougino | 0:f759a823d3ae | 518 | nextTile = random(6); pr = 0; |
mougino | 0:f759a823d3ae | 519 | animSplode=0; |
mougino | 0:f759a823d3ae | 520 | } |
mougino | 0:f759a823d3ae | 521 | } |
mougino | 0:f759a823d3ae | 522 | |
mougino | 0:f759a823d3ae | 523 | // render screen |
mougino | 0:f759a823d3ae | 524 | drawPlayfield(); |
mougino | 0:f759a823d3ae | 525 | } |
mougino | 0:f759a823d3ae | 526 | |
mougino | 0:f759a823d3ae | 527 | |
mougino | 0:f759a823d3ae | 528 | |
mougino | 0:f759a823d3ae | 529 | |
mougino | 0:f759a823d3ae | 530 | int main(){ |
mougino | 0:f759a823d3ae | 531 | |
mougino | 0:f759a823d3ae | 532 | game.begin(); |
mougino | 0:f759a823d3ae | 533 | game.display.width = 220; // full size |
mougino | 0:f759a823d3ae | 534 | game.display.height = 176; |
mougino | 0:f759a823d3ae | 535 | game.display.setFont(fontC64); |
mougino | 0:f759a823d3ae | 536 | //game.display.charSpacingAdjust = 0; //needed for the non-proportional C64 font (normal value=1) |
mougino | 0:f759a823d3ae | 537 | game.display.fixedWidthFont = true; |
mougino | 0:f759a823d3ae | 538 | |
mougino | 0:f759a823d3ae | 539 | loadPal(1); // default green palette |
mougino | 0:f759a823d3ae | 540 | |
mougino | 0:f759a823d3ae | 541 | px=6; |
mougino | 0:f759a823d3ae | 542 | gameMode=0; |
mougino | 0:f759a823d3ae | 543 | char oldMode = 50; |
mougino | 0:f759a823d3ae | 544 | myDelay=40; |
mougino | 0:f759a823d3ae | 545 | |
mougino | 0:f759a823d3ae | 546 | game.sound.playMusicStream(musicName); |
mougino | 0:f759a823d3ae | 547 | |
mougino | 0:f759a823d3ae | 548 | frameNumber=0; |
mougino | 0:f759a823d3ae | 549 | animCount=0; |
mougino | 0:f759a823d3ae | 550 | splodeOK=0; |
mougino | 0:f759a823d3ae | 551 | animSplode=0; |
mougino | 0:f759a823d3ae | 552 | |
mougino | 0:f759a823d3ae | 553 | while (game.isRunning()) { |
mougino | 0:f759a823d3ae | 554 | |
mougino | 0:f759a823d3ae | 555 | // if it is time to update the screen |
spinal | 1:827c9852286e | 556 | if (game.update(1)){ |
mougino | 0:f759a823d3ae | 557 | frameNumber++; |
mougino | 0:f759a823d3ae | 558 | game.sound.updateStream(); |
mougino | 0:f759a823d3ae | 559 | myPad = updateButtons(myPad); |
mougino | 0:f759a823d3ae | 560 | UpdatePad(myPad); |
mougino | 0:f759a823d3ae | 561 | |
mougino | 0:f759a823d3ae | 562 | switch (gameMode) { |
mougino | 0:f759a823d3ae | 563 | case 0: |
mougino | 0:f759a823d3ae | 564 | titleScreen(); |
mougino | 0:f759a823d3ae | 565 | break; |
mougino | 0:f759a823d3ae | 566 | case 1: |
mougino | 0:f759a823d3ae | 567 | if (paused) { |
mougino | 0:f759a823d3ae | 568 | // pauseMenu(); |
mougino | 0:f759a823d3ae | 569 | } else { |
mougino | 0:f759a823d3ae | 570 | playGame(); |
mougino | 0:f759a823d3ae | 571 | } |
mougino | 0:f759a823d3ae | 572 | break; |
mougino | 0:f759a823d3ae | 573 | case 3: |
mougino | 0:f759a823d3ae | 574 | gameOver(); |
mougino | 0:f759a823d3ae | 575 | break; |
mougino | 0:f759a823d3ae | 576 | } |
spinal | 1:827c9852286e | 577 | game.display.updateRegion(0,0,220,176); |
mougino | 0:f759a823d3ae | 578 | } |
mougino | 0:f759a823d3ae | 579 | } |
mougino | 0:f759a823d3ae | 580 | return 0; |
mougino | 0:f759a823d3ae | 581 | } |