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