updating stuff

Dependencies:   PWMOut Pokitto_

Fork of Pokittris by Pokitto Community Team

Committer:
spinal
Date:
Sun Oct 15 18:03:18 2017 +0000
Revision:
3:8540039d1eed
Parent:
1:827c9852286e
Child:
4:e861ad5ad42d
trying to find out what's keeping it slow.

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