updating stuff

Dependencies:   PWMOut Pokitto_

Fork of Pokittris by Pokitto Community Team

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?

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