Fork of "Pokittris" for the Pokitto

Dependencies:   PWMOut Pokitto

Fork of Pokittris by Nicolas Mougin

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?

UserRevisionLine numberNew 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 }