Puzzle game
Dependencies: PokittoLib mbed-src
main.cpp@2:ab85f5ea1be6, 2017-10-18 (annotated)
- Committer:
- spinal
- Date:
- Wed Oct 18 14:48:38 2017 +0000
- Revision:
- 2:ab85f5ea1be6
- Parent:
- 0:3c929189abce
trying to compile online
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
spinal | 0:3c929189abce | 1 | |
spinal | 0:3c929189abce | 2 | #include "Pokitto.h" |
spinal | 0:3c929189abce | 3 | #include "sens_levs.h" |
spinal | 0:3c929189abce | 4 | #include "gfx.h" |
spinal | 0:3c929189abce | 5 | |
spinal | 0:3c929189abce | 6 | Pokitto::Core game; |
spinal | 0:3c929189abce | 7 | |
spinal | 0:3c929189abce | 8 | #define OFF_X 2 |
spinal | 0:3c929189abce | 9 | #define OFF_Y 42 |
spinal | 0:3c929189abce | 10 | #define LEVWIDTH 18 |
spinal | 0:3c929189abce | 11 | #define LEVHEIGHT 11 |
spinal | 0:3c929189abce | 12 | #define SCROLLHEIGHT 112 |
spinal | 0:3c929189abce | 13 | #define RUMBLEFRAMES 15 |
spinal | 0:3c929189abce | 14 | #define STEPSIZE 1 |
spinal | 0:3c929189abce | 15 | #define EXPLODESPRITES 15 |
spinal | 0:3c929189abce | 16 | #define EXPLODESPEED 5 |
spinal | 0:3c929189abce | 17 | |
spinal | 0:3c929189abce | 18 | byte oldLev[LEVWIDTH * LEVHEIGHT]; |
spinal | 0:3c929189abce | 19 | byte curLev[LEVWIDTH * LEVHEIGHT]; |
spinal | 0:3c929189abce | 20 | byte teleportMap[LEVWIDTH * LEVHEIGHT]; |
spinal | 0:3c929189abce | 21 | byte telArray[32]; |
spinal | 0:3c929189abce | 22 | char satTime = 0; |
spinal | 0:3c929189abce | 23 | int numTiles; |
spinal | 0:3c929189abce | 24 | int px,py,ps,pd; |
spinal | 0:3c929189abce | 25 | int levelNum=0; |
spinal | 0:3c929189abce | 26 | int maxLevels=sizeof(levels)/102; |
spinal | 0:3c929189abce | 27 | int tileSize=12; |
spinal | 0:3c929189abce | 28 | uint32_t frameNumber=0; |
spinal | 0:3c929189abce | 29 | int score=0; |
spinal | 0:3c929189abce | 30 | int hiscore=0; |
spinal | 0:3c929189abce | 31 | bool stillExploding=0; |
spinal | 0:3c929189abce | 32 | int telNum = 0; |
spinal | 0:3c929189abce | 33 | byte gameMode; |
spinal | 0:3c929189abce | 34 | unsigned int myInt=0; |
spinal | 0:3c929189abce | 35 | byte scroller=0; |
spinal | 0:3c929189abce | 36 | char musicName[] = "sensitiv.raw"; |
spinal | 0:3c929189abce | 37 | int lives; |
spinal | 0:3c929189abce | 38 | |
spinal | 0:3c929189abce | 39 | uint32_t myDelay; |
spinal | 0:3c929189abce | 40 | uint32_t tempTime; |
spinal | 0:3c929189abce | 41 | |
spinal | 0:3c929189abce | 42 | // explosion |
spinal | 0:3c929189abce | 43 | uint8_t expX[EXPLODESPRITES], expY[EXPLODESPRITES], expF[EXPLODESPRITES], expU[EXPLODESPRITES]; |
spinal | 0:3c929189abce | 44 | uint8_t explode = 0; |
spinal | 0:3c929189abce | 45 | |
spinal | 0:3c929189abce | 46 | void rumbleOn(){ |
spinal | 0:3c929189abce | 47 | DigitalOut outPin(P0_13); |
spinal | 0:3c929189abce | 48 | DigitalOut inPin(P0_11); |
spinal | 0:3c929189abce | 49 | inPin=0; |
spinal | 0:3c929189abce | 50 | outPin=1; |
spinal | 0:3c929189abce | 51 | } |
spinal | 0:3c929189abce | 52 | void rumbleOff(){ |
spinal | 0:3c929189abce | 53 | DigitalOut outPin(P0_13); |
spinal | 0:3c929189abce | 54 | DigitalOut inPin(P0_11); |
spinal | 0:3c929189abce | 55 | inPin=0; |
spinal | 0:3c929189abce | 56 | outPin=0; |
spinal | 0:3c929189abce | 57 | } |
spinal | 0:3c929189abce | 58 | |
spinal | 0:3c929189abce | 59 | /**************************************************************************/ |
spinal | 0:3c929189abce | 60 | #define HELD 0 |
spinal | 0:3c929189abce | 61 | #define NEW 1 |
spinal | 0:3c929189abce | 62 | #define RELEASE 2 |
spinal | 0:3c929189abce | 63 | byte CompletePad, ExPad, TempPad, myPad; |
spinal | 0:3c929189abce | 64 | bool _A[3], _B[3], _C[3], _Up[3], _Down[3], _Left[3], _Right[3]; |
spinal | 0:3c929189abce | 65 | |
spinal | 0:3c929189abce | 66 | DigitalIn _aPin(P1_9); |
spinal | 0:3c929189abce | 67 | DigitalIn _bPin(P1_4); |
spinal | 0:3c929189abce | 68 | DigitalIn _cPin(P1_10); |
spinal | 0:3c929189abce | 69 | DigitalIn _upPin(P1_13); |
spinal | 0:3c929189abce | 70 | DigitalIn _downPin(P1_3); |
spinal | 0:3c929189abce | 71 | DigitalIn _leftPin(P1_25); |
spinal | 0:3c929189abce | 72 | DigitalIn _rightPin(P1_7); |
spinal | 0:3c929189abce | 73 | |
spinal | 0:3c929189abce | 74 | void UPDATEPAD(int pad, int var) { |
spinal | 0:3c929189abce | 75 | _C[pad] = (var >> 1)&1; |
spinal | 0:3c929189abce | 76 | _B[pad] = (var >> 2)&1; |
spinal | 0:3c929189abce | 77 | _A[pad] = (var >> 3)&1; |
spinal | 0:3c929189abce | 78 | _Down[pad] = (var >> 4)&1; |
spinal | 0:3c929189abce | 79 | _Left[pad] = (var >> 5)&1; |
spinal | 0:3c929189abce | 80 | _Right[pad] = (var >> 6)&1; |
spinal | 0:3c929189abce | 81 | _Up[pad] = (var >> 7)&1; |
spinal | 0:3c929189abce | 82 | } |
spinal | 0:3c929189abce | 83 | |
spinal | 0:3c929189abce | 84 | void UpdatePad(int joy_code){ |
spinal | 0:3c929189abce | 85 | ExPad = CompletePad; |
spinal | 0:3c929189abce | 86 | CompletePad = joy_code; |
spinal | 0:3c929189abce | 87 | UPDATEPAD(HELD, CompletePad); // held |
spinal | 0:3c929189abce | 88 | UPDATEPAD(RELEASE, (ExPad & (~CompletePad))); // released |
spinal | 0:3c929189abce | 89 | UPDATEPAD(NEW, (CompletePad & (~ExPad))); // newpress |
spinal | 0:3c929189abce | 90 | } |
spinal | 0:3c929189abce | 91 | |
spinal | 0:3c929189abce | 92 | byte updateButtons(byte var){ |
spinal | 0:3c929189abce | 93 | var = 0; |
spinal | 0:3c929189abce | 94 | if (_cPin) var |= (1<<1); |
spinal | 0:3c929189abce | 95 | if (_bPin) var |= (1<<2); |
spinal | 0:3c929189abce | 96 | if (_aPin) var |= (1<<3); // P1_9 = A |
spinal | 0:3c929189abce | 97 | if (_downPin) var |= (1<<4); |
spinal | 0:3c929189abce | 98 | if (_leftPin) var |= (1<<5); |
spinal | 0:3c929189abce | 99 | if (_rightPin) var |= (1<<6); |
spinal | 0:3c929189abce | 100 | if (_upPin) var |= (1<<7); |
spinal | 0:3c929189abce | 101 | |
spinal | 0:3c929189abce | 102 | return var; |
spinal | 0:3c929189abce | 103 | } |
spinal | 0:3c929189abce | 104 | |
spinal | 0:3c929189abce | 105 | /**************************************************************************/ |
spinal | 0:3c929189abce | 106 | |
spinal | 0:3c929189abce | 107 | void new2BitTile(int x1, int y1, int wide, int high, int tile, const uint16_t *gfx, int palNumber){ |
spinal | 0:3c929189abce | 108 | |
spinal | 0:3c929189abce | 109 | uint16_t tileBuffer[wide*high]; |
spinal | 0:3c929189abce | 110 | |
spinal | 0:3c929189abce | 111 | uint8_t pix; |
spinal | 0:3c929189abce | 112 | uint8_t quartWide=wide/4; |
spinal | 0:3c929189abce | 113 | uint8_t pic; |
spinal | 0:3c929189abce | 114 | |
spinal | 0:3c929189abce | 115 | int palNo = palLookup[palNumber]*4; |
spinal | 0:3c929189abce | 116 | for(int y=0; y<high; y++){ |
spinal | 0:3c929189abce | 117 | for(int x=0; x<quartWide; x++){ |
spinal | 0:3c929189abce | 118 | pic = gfx[(tile*quartWide*high)+(x+quartWide*y)]; |
spinal | 0:3c929189abce | 119 | pix = (pic >> 6)&3; tileBuffer[y+high*( x*4)]=_pal[_miniPal[palNo+pix]]; |
spinal | 0:3c929189abce | 120 | pix = (pic >> 4)&3; tileBuffer[y+high*(1+x*4)]=_pal[_miniPal[palNo+pix]]; |
spinal | 0:3c929189abce | 121 | pix = (pic >> 2)&3; tileBuffer[y+high*(2+x*4)]=_pal[_miniPal[palNo+pix]]; |
spinal | 0:3c929189abce | 122 | pix = pic &3; tileBuffer[y+high*(3+x*4)]=_pal[_miniPal[palNo+pix]]; |
spinal | 0:3c929189abce | 123 | } |
spinal | 0:3c929189abce | 124 | } |
spinal | 0:3c929189abce | 125 | |
spinal | 0:3c929189abce | 126 | game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer); |
spinal | 0:3c929189abce | 127 | } |
spinal | 0:3c929189abce | 128 | |
spinal | 0:3c929189abce | 129 | void new4BitTile(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx){ |
spinal | 0:3c929189abce | 130 | uint16_t tileBuffer[wide*high]; |
spinal | 0:3c929189abce | 131 | int pix1,pix2; |
spinal | 0:3c929189abce | 132 | int halfWide=wide/2; |
spinal | 0:3c929189abce | 133 | for(int y=0; y<high; y++){ |
spinal | 0:3c929189abce | 134 | for(int x=0; x<halfWide; x++){ |
spinal | 0:3c929189abce | 135 | pix1 = gfx[(tile*halfWide*high)+(x+halfWide*y)]>>4; |
spinal | 0:3c929189abce | 136 | pix2 = gfx[(tile*halfWide*high)+(x+halfWide*y)]&15; |
spinal | 0:3c929189abce | 137 | tileBuffer[y+high*( x*2)]=_pal[pix1]; |
spinal | 0:3c929189abce | 138 | tileBuffer[y+high*(1+x*2)]=_pal[pix2]; |
spinal | 0:3c929189abce | 139 | } |
spinal | 0:3c929189abce | 140 | } |
spinal | 0:3c929189abce | 141 | game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer); |
spinal | 0:3c929189abce | 142 | } |
spinal | 0:3c929189abce | 143 | |
spinal | 0:3c929189abce | 144 | |
spinal | 0:3c929189abce | 145 | /**************************************************************************/ |
spinal | 0:3c929189abce | 146 | /**************************************************************************/ |
spinal | 0:3c929189abce | 147 | |
spinal | 0:3c929189abce | 148 | |
spinal | 0:3c929189abce | 149 | int RandMinMax(int min, int max){ |
spinal | 0:3c929189abce | 150 | return rand() % max + min; |
spinal | 0:3c929189abce | 151 | } |
spinal | 0:3c929189abce | 152 | |
spinal | 0:3c929189abce | 153 | void refreshDisplay(){ |
spinal | 0:3c929189abce | 154 | // place holder to replace a simulator command. |
spinal | 0:3c929189abce | 155 | } |
spinal | 0:3c929189abce | 156 | |
spinal | 0:3c929189abce | 157 | void draw4BitTile(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx){ |
spinal | 0:3c929189abce | 158 | int pix1,pix2; |
spinal | 0:3c929189abce | 159 | int halfWide=wide/2; |
spinal | 0:3c929189abce | 160 | for(int y=0; y<high; y++){ |
spinal | 0:3c929189abce | 161 | for(int x=0; x<halfWide; x++){ |
spinal | 0:3c929189abce | 162 | pix1 = gfx[(tile*halfWide*high)+(x+halfWide*y)]>>4; |
spinal | 0:3c929189abce | 163 | pix2 = gfx[(tile*halfWide*high)+(x+halfWide*y)]&15; |
spinal | 0:3c929189abce | 164 | if(pix1 != transparentColor){game.display.directPixel(x1+(x*2),y1+y,_pal[pix1]);} |
spinal | 0:3c929189abce | 165 | if(pix2 != transparentColor){game.display.directPixel(1+x1+(x*2),y1+y,_pal[pix2]);} |
spinal | 0:3c929189abce | 166 | } |
spinal | 0:3c929189abce | 167 | } |
spinal | 0:3c929189abce | 168 | } |
spinal | 0:3c929189abce | 169 | |
spinal | 0:3c929189abce | 170 | void draw2BitTile(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx, int palNumber, int palReplace = -1){ |
spinal | 0:3c929189abce | 171 | uint8_t pix; |
spinal | 0:3c929189abce | 172 | uint8_t quartWide=wide/4; |
spinal | 0:3c929189abce | 173 | uint8_t pic; |
spinal | 0:3c929189abce | 174 | |
spinal | 0:3c929189abce | 175 | int palNo = palLookup[palNumber]*4; |
spinal | 0:3c929189abce | 176 | for(int y=0; y<high; y++){ |
spinal | 0:3c929189abce | 177 | for(int x=0; x<quartWide; x++){ |
spinal | 0:3c929189abce | 178 | pic = gfx[(tile*quartWide*high)+(x+quartWide*y)]; |
spinal | 0:3c929189abce | 179 | pix = (pic >> 6)&3; if(pix != transparentColor){game.display.directPixel( x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);} |
spinal | 0:3c929189abce | 180 | pix = (pic >> 4)&3; if(pix != transparentColor){game.display.directPixel(1+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);} |
spinal | 0:3c929189abce | 181 | pix = (pic >> 2)&3; if(pix != transparentColor){game.display.directPixel(2+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);} |
spinal | 0:3c929189abce | 182 | pix = pic &3; if(pix != transparentColor){game.display.directPixel(3+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);} |
spinal | 0:3c929189abce | 183 | } |
spinal | 0:3c929189abce | 184 | } |
spinal | 0:3c929189abce | 185 | } |
spinal | 0:3c929189abce | 186 | |
spinal | 0:3c929189abce | 187 | |
spinal | 0:3c929189abce | 188 | void drawFont(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx, int palReplace = -1){ |
spinal | 0:3c929189abce | 189 | uint16_t tileBuffer[(wide+1)*(high+1)]; |
spinal | 0:3c929189abce | 190 | |
spinal | 0:3c929189abce | 191 | uint8_t pix; |
spinal | 0:3c929189abce | 192 | uint8_t quartWide=wide/4; |
spinal | 0:3c929189abce | 193 | uint8_t pic; |
spinal | 0:3c929189abce | 194 | |
spinal | 0:3c929189abce | 195 | for(int y=0; y<high; y++){ |
spinal | 0:3c929189abce | 196 | for(int x=0; x<quartWide; x++){ |
spinal | 0:3c929189abce | 197 | pic = gfx[(tile*quartWide*high)+(x+quartWide*y)]; |
spinal | 0:3c929189abce | 198 | pix = (pic >> 6)&3; if(pix != transparentColor){tileBuffer[y+high*( x*4)]=numbers_pal[pix];}else{tileBuffer[y+high*( x*4)]=palReplace;} |
spinal | 0:3c929189abce | 199 | pix = (pic >> 4)&3; if(pix != transparentColor){tileBuffer[y+high*(1+x*4)]=numbers_pal[pix];}else{tileBuffer[y+high*(1+x*4)]=palReplace;} |
spinal | 0:3c929189abce | 200 | pix = (pic >> 2)&3; if(pix != transparentColor){tileBuffer[y+high*(2+x*4)]=numbers_pal[pix];}else{tileBuffer[y+high*(2+x*4)]=palReplace;} |
spinal | 0:3c929189abce | 201 | pix = pic &3; if(pix != transparentColor){tileBuffer[y+high*(3+x*4)]=numbers_pal[pix];}else{tileBuffer[y+high*(3+x*4)]=palReplace;} |
spinal | 0:3c929189abce | 202 | } |
spinal | 0:3c929189abce | 203 | } |
spinal | 0:3c929189abce | 204 | |
spinal | 0:3c929189abce | 205 | game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer); |
spinal | 0:3c929189abce | 206 | |
spinal | 0:3c929189abce | 207 | } |
spinal | 0:3c929189abce | 208 | |
spinal | 0:3c929189abce | 209 | // print text |
spinal | 0:3c929189abce | 210 | void print(uint16_t x, uint16_t y, const char* text, uint8_t bgCol, signed int repCol=-1){ |
spinal | 0:3c929189abce | 211 | if(repCol==-1)repCol=bgCol; |
spinal | 0:3c929189abce | 212 | for(uint8_t t = 0; t < strlen(text); t++){ |
spinal | 0:3c929189abce | 213 | uint8_t character = text[t]-32; |
spinal | 0:3c929189abce | 214 | drawFont(x, y, 8, 8, character, bgCol, myFont, repCol); |
spinal | 0:3c929189abce | 215 | x += 8; |
spinal | 0:3c929189abce | 216 | } |
spinal | 0:3c929189abce | 217 | } |
spinal | 0:3c929189abce | 218 | |
spinal | 0:3c929189abce | 219 | |
spinal | 0:3c929189abce | 220 | |
spinal | 0:3c929189abce | 221 | void loadLevel(int number) { |
spinal | 0:3c929189abce | 222 | /* |
spinal | 0:3c929189abce | 223 | // store level number in file for testing |
spinal | 0:3c929189abce | 224 | FILE *fp; |
spinal | 0:3c929189abce | 225 | fp = fopen("test.txt", "w+"); |
spinal | 0:3c929189abce | 226 | fwrite(&number, sizeof(int),1, fp); |
spinal | 0:3c929189abce | 227 | fclose(fp); |
spinal | 0:3c929189abce | 228 | */ |
spinal | 0:3c929189abce | 229 | |
spinal | 0:3c929189abce | 230 | numTiles = 0; |
spinal | 0:3c929189abce | 231 | satTime = 0; |
spinal | 0:3c929189abce | 232 | int numTels = 0; |
spinal | 0:3c929189abce | 233 | |
spinal | 0:3c929189abce | 234 | int amount = (LEVWIDTH/2)*LEVHEIGHT; |
spinal | 0:3c929189abce | 235 | |
spinal | 0:3c929189abce | 236 | for (int t = amount-1; t >= 0; t--) { |
spinal | 0:3c929189abce | 237 | int s = pgm_read_byte(levels + t + ((amount+3) * number)); |
spinal | 0:3c929189abce | 238 | curLev[t * 2] = pgm_read_byte(lookUpTile + (s >> 4)); |
spinal | 0:3c929189abce | 239 | curLev[(t * 2) + 1] = pgm_read_byte(lookUpTile + (s & 15)); |
spinal | 0:3c929189abce | 240 | s = t * 2; |
spinal | 0:3c929189abce | 241 | teleportMap[s] = 0; |
spinal | 0:3c929189abce | 242 | teleportMap[s+1] = 0; |
spinal | 0:3c929189abce | 243 | |
spinal | 0:3c929189abce | 244 | switch (curLev[s]) { |
spinal | 0:3c929189abce | 245 | case 1: |
spinal | 0:3c929189abce | 246 | numTiles++; |
spinal | 0:3c929189abce | 247 | break; |
spinal | 0:3c929189abce | 248 | case 2: |
spinal | 0:3c929189abce | 249 | numTiles += 2; |
spinal | 0:3c929189abce | 250 | break; |
spinal | 0:3c929189abce | 251 | case 4: |
spinal | 0:3c929189abce | 252 | curLev[s + 1] = 5; |
spinal | 0:3c929189abce | 253 | curLev[s + LEVWIDTH] = 6; |
spinal | 0:3c929189abce | 254 | curLev[s + LEVWIDTH+1] = 7; |
spinal | 0:3c929189abce | 255 | break; |
spinal | 0:3c929189abce | 256 | case 8: |
spinal | 0:3c929189abce | 257 | curLev[s + 1] = 9; |
spinal | 0:3c929189abce | 258 | break; |
spinal | 0:3c929189abce | 259 | case 10: |
spinal | 0:3c929189abce | 260 | curLev[s + 1] = 11; |
spinal | 0:3c929189abce | 261 | break; |
spinal | 0:3c929189abce | 262 | case 12: |
spinal | 0:3c929189abce | 263 | curLev[s + LEVWIDTH] = 13; |
spinal | 0:3c929189abce | 264 | break; |
spinal | 0:3c929189abce | 265 | } |
spinal | 0:3c929189abce | 266 | |
spinal | 0:3c929189abce | 267 | s = (t * 2) + 1; |
spinal | 0:3c929189abce | 268 | switch (curLev[s]) { |
spinal | 0:3c929189abce | 269 | case 1: |
spinal | 0:3c929189abce | 270 | numTiles++; |
spinal | 0:3c929189abce | 271 | break; |
spinal | 0:3c929189abce | 272 | case 2: |
spinal | 0:3c929189abce | 273 | numTiles += 2; |
spinal | 0:3c929189abce | 274 | break; |
spinal | 0:3c929189abce | 275 | case 4: |
spinal | 0:3c929189abce | 276 | curLev[s + 1] = 5; |
spinal | 0:3c929189abce | 277 | curLev[s + LEVWIDTH] = 6; |
spinal | 0:3c929189abce | 278 | curLev[s + LEVWIDTH+1] = 7; |
spinal | 0:3c929189abce | 279 | break; |
spinal | 0:3c929189abce | 280 | case 8: |
spinal | 0:3c929189abce | 281 | curLev[s + 1] = 9; |
spinal | 0:3c929189abce | 282 | break; |
spinal | 0:3c929189abce | 283 | case 10: |
spinal | 0:3c929189abce | 284 | curLev[s + 1] = 11; |
spinal | 0:3c929189abce | 285 | break; |
spinal | 0:3c929189abce | 286 | case 12: |
spinal | 0:3c929189abce | 287 | curLev[s + LEVWIDTH] = 13; |
spinal | 0:3c929189abce | 288 | break; |
spinal | 0:3c929189abce | 289 | } |
spinal | 0:3c929189abce | 290 | |
spinal | 0:3c929189abce | 291 | } |
spinal | 0:3c929189abce | 292 | |
spinal | 0:3c929189abce | 293 | |
spinal | 0:3c929189abce | 294 | px = pgm_read_byte(levels + amount + ((amount+3) * number))*tileSize; |
spinal | 0:3c929189abce | 295 | py = pgm_read_byte(levels + amount+1 + ((amount+3) * number))*tileSize; |
spinal | 0:3c929189abce | 296 | int telNumber = pgm_read_byte(levels + amount+2 + ((amount+3) * number)); |
spinal | 0:3c929189abce | 297 | ps = 0; pd = 0; |
spinal | 0:3c929189abce | 298 | satTime = 0; |
spinal | 0:3c929189abce | 299 | |
spinal | 0:3c929189abce | 300 | for(int t=0; t<31; t++){ |
spinal | 0:3c929189abce | 301 | telArray[t] = pgm_read_byte(telPath + t + (telNumber*32)); |
spinal | 0:3c929189abce | 302 | } |
spinal | 0:3c929189abce | 303 | |
spinal | 0:3c929189abce | 304 | // teleport locations |
spinal | 0:3c929189abce | 305 | numTels=0; |
spinal | 0:3c929189abce | 306 | for (int y = 0; y <LEVHEIGHT; y++) { |
spinal | 0:3c929189abce | 307 | for (int x = 0; x <LEVWIDTH ; x++) { |
spinal | 0:3c929189abce | 308 | int tn = (y * LEVWIDTH) + x; |
spinal | 0:3c929189abce | 309 | if(curLev[tn]==16){ |
spinal | 0:3c929189abce | 310 | teleportMap[tn] = numTels; |
spinal | 0:3c929189abce | 311 | numTels++; |
spinal | 0:3c929189abce | 312 | } |
spinal | 0:3c929189abce | 313 | } |
spinal | 0:3c929189abce | 314 | } |
spinal | 0:3c929189abce | 315 | |
spinal | 0:3c929189abce | 316 | |
spinal | 0:3c929189abce | 317 | // draw part of the screen here |
spinal | 0:3c929189abce | 318 | // bad practice I know, but so what! |
spinal | 0:3c929189abce | 319 | |
spinal | 0:3c929189abce | 320 | for(byte t=0; t<LEVWIDTH * LEVHEIGHT; t++){ |
spinal | 0:3c929189abce | 321 | oldLev[t] = 255; |
spinal | 0:3c929189abce | 322 | } |
spinal | 0:3c929189abce | 323 | |
spinal | 0:3c929189abce | 324 | for (int x = LEVWIDTH-1; x >= 0 ; x--) { |
spinal | 0:3c929189abce | 325 | new2BitTile(OFF_X+x*tileSize, 42, tileSize, tileSize, 0, gbTiles, 0); |
spinal | 0:3c929189abce | 326 | } |
spinal | 0:3c929189abce | 327 | |
spinal | 0:3c929189abce | 328 | game.display.directRectangle(OFF_X,0,218,40,_pal[10]); |
spinal | 0:3c929189abce | 329 | game.display.directRectangle(OFF_X,0,218,0,_pal[4]); |
spinal | 0:3c929189abce | 330 | game.display.directRectangle(OFF_X,1,218,1,_pal[10]); |
spinal | 0:3c929189abce | 331 | game.display.directRectangle(OFF_X,2,218,2,_pal[15]); |
spinal | 0:3c929189abce | 332 | game.display.directRectangle(OFF_X,3,218,3,_pal[15]); |
spinal | 0:3c929189abce | 333 | game.display.directRectangle(OFF_X,4,218,4,_pal[10]); |
spinal | 0:3c929189abce | 334 | game.display.directRectangle(OFF_X,5,218,5,_pal[4]); |
spinal | 0:3c929189abce | 335 | game.display.directRectangle(OFF_X,36,218,36,_pal[4]); |
spinal | 0:3c929189abce | 336 | game.display.directRectangle(OFF_X,37,218,37,_pal[10]); |
spinal | 0:3c929189abce | 337 | game.display.directRectangle(OFF_X,38,218,38,_pal[15]); |
spinal | 0:3c929189abce | 338 | game.display.directRectangle(OFF_X,39,218,39,_pal[15]); |
spinal | 0:3c929189abce | 339 | game.display.directRectangle(OFF_X,40,218,40,_pal[10]); |
spinal | 0:3c929189abce | 340 | game.display.directRectangle(OFF_X,41,218,41,_pal[4]); |
spinal | 0:3c929189abce | 341 | |
spinal | 0:3c929189abce | 342 | |
spinal | 0:3c929189abce | 343 | // pause if any buttons held |
spinal | 0:3c929189abce | 344 | while(_Up[HELD] || _Down[HELD] || _Left[HELD] || _Right[HELD] || _A[HELD] || _B[HELD] || _C[HELD]){ |
spinal | 0:3c929189abce | 345 | myPad = updateButtons(myPad); |
spinal | 0:3c929189abce | 346 | UpdatePad(myPad); |
spinal | 0:3c929189abce | 347 | } |
spinal | 0:3c929189abce | 348 | |
spinal | 0:3c929189abce | 349 | |
spinal | 0:3c929189abce | 350 | } |
spinal | 0:3c929189abce | 351 | |
spinal | 0:3c929189abce | 352 | void renderLevel(bool drawPlayer = 1, bool fullLevel=0){ |
spinal | 0:3c929189abce | 353 | |
spinal | 0:3c929189abce | 354 | signed int xStart=(px / tileSize)+4; |
spinal | 0:3c929189abce | 355 | signed int yStart=(py / tileSize)+4; |
spinal | 0:3c929189abce | 356 | signed int xEnd=(px / tileSize)-4; |
spinal | 0:3c929189abce | 357 | signed int yEnd=(py / tileSize)-4; |
spinal | 0:3c929189abce | 358 | if(xEnd<0){xStart+=-xEnd; xEnd=0;} |
spinal | 0:3c929189abce | 359 | if(yEnd<0){yStart+=-yEnd; yEnd=0;} |
spinal | 0:3c929189abce | 360 | if(xStart>LEVWIDTH-1){xStart=LEVWIDTH-1; xEnd=xStart-9;} |
spinal | 0:3c929189abce | 361 | if(yStart>LEVHEIGHT-1){yStart=LEVHEIGHT-1; yEnd=yStart-9;} |
spinal | 0:3c929189abce | 362 | |
spinal | 0:3c929189abce | 363 | // if(fullLevel){ |
spinal | 0:3c929189abce | 364 | xStart=LEVWIDTH-1; |
spinal | 0:3c929189abce | 365 | yStart=LEVHEIGHT-1; |
spinal | 0:3c929189abce | 366 | xEnd=0; |
spinal | 0:3c929189abce | 367 | yEnd=1; |
spinal | 0:3c929189abce | 368 | // } |
spinal | 0:3c929189abce | 369 | |
spinal | 0:3c929189abce | 370 | |
spinal | 0:3c929189abce | 371 | // oldLev[t] = curLev[t]; |
spinal | 0:3c929189abce | 372 | |
spinal | 0:3c929189abce | 373 | |
spinal | 0:3c929189abce | 374 | // int transp=-1; |
spinal | 0:3c929189abce | 375 | for (int y = yStart; y >= yEnd; y--) { |
spinal | 0:3c929189abce | 376 | for (int x = xStart; x >= xEnd; x--) { |
spinal | 0:3c929189abce | 377 | int tn = (y * LEVWIDTH) + x; |
spinal | 0:3c929189abce | 378 | if(oldLev[tn] != curLev[tn]){ |
spinal | 0:3c929189abce | 379 | oldLev[tn] = curLev[tn]; |
spinal | 0:3c929189abce | 380 | if(curLev[tn]==0){ |
spinal | 0:3c929189abce | 381 | // water tile with shaddow |
spinal | 0:3c929189abce | 382 | uint8_t tile = 0; |
spinal | 0:3c929189abce | 383 | if(y>0){ |
spinal | 0:3c929189abce | 384 | if(curLev[((y-1) * LEVWIDTH) + (x)]){ tile += 1; } |
spinal | 0:3c929189abce | 385 | if(x>0){if(curLev[((y-1) * LEVWIDTH) + (x-1)]){ tile += 2; }} |
spinal | 0:3c929189abce | 386 | } |
spinal | 0:3c929189abce | 387 | if(x>0){if(curLev[((y) * LEVWIDTH) + (x-1)]){ tile += 4; }} |
spinal | 0:3c929189abce | 388 | new2BitTile(OFF_X+x*tileSize, OFF_Y+y*tileSize, tileSize, tileSize, shaddow[tile], gbTiles, shaddow[tile]); |
spinal | 0:3c929189abce | 389 | }else{ |
spinal | 0:3c929189abce | 390 | // all other tiles |
spinal | 0:3c929189abce | 391 | new2BitTile(OFF_X+x*tileSize, OFF_Y+y*tileSize, tileSize, tileSize, curLev[tn], gbTiles, curLev[tn]); |
spinal | 0:3c929189abce | 392 | } |
spinal | 0:3c929189abce | 393 | } |
spinal | 0:3c929189abce | 394 | } |
spinal | 0:3c929189abce | 395 | |
spinal | 0:3c929189abce | 396 | |
spinal | 0:3c929189abce | 397 | } |
spinal | 0:3c929189abce | 398 | |
spinal | 0:3c929189abce | 399 | // explosions |
spinal | 0:3c929189abce | 400 | stillExploding=0; |
spinal | 0:3c929189abce | 401 | for (int t = 0; t < EXPLODESPRITES; t++) { |
spinal | 0:3c929189abce | 402 | if (expU[t] == 1) { |
spinal | 0:3c929189abce | 403 | oldLev[expX[t] + LEVWIDTH * expY[t]] = 255; |
spinal | 0:3c929189abce | 404 | |
spinal | 0:3c929189abce | 405 | stillExploding=1; |
spinal | 0:3c929189abce | 406 | if(expF[t]<=1){ |
spinal | 0:3c929189abce | 407 | new2BitTile(OFF_X+(expX[t]*tileSize), OFF_Y+expY[t]*tileSize, tileSize, tileSize, 1, gbTiles, 1); |
spinal | 0:3c929189abce | 408 | } |
spinal | 0:3c929189abce | 409 | draw4BitTile(OFF_X+(expX[t]*tileSize), OFF_Y+expY[t]*tileSize, tileSize, tileSize, expF[t], 8, explode_tiles); |
spinal | 0:3c929189abce | 410 | if (frameNumber % EXPLODESPEED == 0) { |
spinal | 0:3c929189abce | 411 | expF[t]++; |
spinal | 0:3c929189abce | 412 | if (expF[t] == 8) { |
spinal | 0:3c929189abce | 413 | expU[t] = 0; |
spinal | 0:3c929189abce | 414 | } |
spinal | 0:3c929189abce | 415 | } |
spinal | 0:3c929189abce | 416 | } |
spinal | 0:3c929189abce | 417 | } |
spinal | 0:3c929189abce | 418 | |
spinal | 0:3c929189abce | 419 | // player sprite |
spinal | 0:3c929189abce | 420 | if(drawPlayer){ |
spinal | 0:3c929189abce | 421 | uint16_t tileBuffer[10]; |
spinal | 0:3c929189abce | 422 | for(byte y=0; y<8; y++){ |
spinal | 0:3c929189abce | 423 | int offX = ball[y][0]; |
spinal | 0:3c929189abce | 424 | int wide = ball[y][1]; |
spinal | 0:3c929189abce | 425 | for(byte x=0; x<wide; x++){ |
spinal | 0:3c929189abce | 426 | tileBuffer[x]=_pal[ball[y][x+2]]; |
spinal | 0:3c929189abce | 427 | } |
spinal | 0:3c929189abce | 428 | game.display.directTile(OFF_X+px+offX+2, OFF_Y+py+y+2, OFF_X+px+wide+offX+2, OFF_Y+py+3+y , tileBuffer); |
spinal | 0:3c929189abce | 429 | }// y |
spinal | 0:3c929189abce | 430 | }//drawplayer |
spinal | 0:3c929189abce | 431 | |
spinal | 0:3c929189abce | 432 | |
spinal | 0:3c929189abce | 433 | print(8, 14, "SCORE LEV LIVES HISCORE",0,_pal[10]); |
spinal | 0:3c929189abce | 434 | char text[] = " "; |
spinal | 0:3c929189abce | 435 | sprintf(text, "%05d",score); |
spinal | 0:3c929189abce | 436 | print(8, 24, text,0,_pal[10]); |
spinal | 0:3c929189abce | 437 | sprintf(text, "%03d",levelNum+1); |
spinal | 0:3c929189abce | 438 | print(64, 24, text,0,_pal[10]); |
spinal | 0:3c929189abce | 439 | sprintf(text, "%02d",lives); |
spinal | 0:3c929189abce | 440 | print(104, 24, text,0,_pal[10]); |
spinal | 0:3c929189abce | 441 | sprintf(text, "%05d",hiscore); |
spinal | 0:3c929189abce | 442 | print(160, 24, text,0,_pal[10]); |
spinal | 0:3c929189abce | 443 | |
spinal | 0:3c929189abce | 444 | } |
spinal | 0:3c929189abce | 445 | |
spinal | 0:3c929189abce | 446 | void explodeHere(){ |
spinal | 0:3c929189abce | 447 | for (int t = 0; t < EXPLODESPRITES; t++) { |
spinal | 0:3c929189abce | 448 | if (expU[t] == 0) { |
spinal | 0:3c929189abce | 449 | expX[t] = px / tileSize; |
spinal | 0:3c929189abce | 450 | expY[t] = py / tileSize; |
spinal | 0:3c929189abce | 451 | expF[t] = 0; |
spinal | 0:3c929189abce | 452 | expU[t] = 1; |
spinal | 0:3c929189abce | 453 | score++; |
spinal | 0:3c929189abce | 454 | break; |
spinal | 0:3c929189abce | 455 | } |
spinal | 0:3c929189abce | 456 | } |
spinal | 0:3c929189abce | 457 | } |
spinal | 0:3c929189abce | 458 | |
spinal | 0:3c929189abce | 459 | void checkTile(int x, int y) { |
spinal | 0:3c929189abce | 460 | int t = curLev[x + LEVWIDTH * y]; |
spinal | 0:3c929189abce | 461 | switch (t) { |
spinal | 0:3c929189abce | 462 | case 1: |
spinal | 0:3c929189abce | 463 | curLev[x + LEVWIDTH * y] = 0; |
spinal | 0:3c929189abce | 464 | oldLev[x + LEVWIDTH * y] = 255; |
spinal | 0:3c929189abce | 465 | oldLev[(x+1) + LEVWIDTH * y] = 255; |
spinal | 0:3c929189abce | 466 | oldLev[(x+1) + LEVWIDTH * (y+1)] = 255; |
spinal | 0:3c929189abce | 467 | oldLev[x + LEVWIDTH * (y+1)] = 255; |
spinal | 0:3c929189abce | 468 | numTiles--; |
spinal | 0:3c929189abce | 469 | explodeHere(); |
spinal | 0:3c929189abce | 470 | break; |
spinal | 0:3c929189abce | 471 | case 2: |
spinal | 0:3c929189abce | 472 | curLev[x + LEVWIDTH * y] = 1; |
spinal | 0:3c929189abce | 473 | numTiles--; |
spinal | 0:3c929189abce | 474 | score++; |
spinal | 0:3c929189abce | 475 | break; |
spinal | 0:3c929189abce | 476 | } |
spinal | 0:3c929189abce | 477 | if(score > 9999) { |
spinal | 0:3c929189abce | 478 | score = 9999; |
spinal | 0:3c929189abce | 479 | } |
spinal | 0:3c929189abce | 480 | if(score > hiscore) { |
spinal | 0:3c929189abce | 481 | hiscore = score; |
spinal | 0:3c929189abce | 482 | } |
spinal | 0:3c929189abce | 483 | } |
spinal | 0:3c929189abce | 484 | |
spinal | 0:3c929189abce | 485 | |
spinal | 0:3c929189abce | 486 | void movePlayer() { |
spinal | 0:3c929189abce | 487 | char x = px/tileSize; |
spinal | 0:3c929189abce | 488 | char y = py/tileSize; |
spinal | 0:3c929189abce | 489 | oldLev[(x-1) + LEVWIDTH * y] = 255; |
spinal | 0:3c929189abce | 490 | oldLev[x + LEVWIDTH * y] = 255; |
spinal | 0:3c929189abce | 491 | oldLev[(x+1) + LEVWIDTH * y] = 255; |
spinal | 0:3c929189abce | 492 | oldLev[x + LEVWIDTH * (y+1)] = 255; |
spinal | 0:3c929189abce | 493 | |
spinal | 0:3c929189abce | 494 | if (ps == 0) { // not moving |
spinal | 0:3c929189abce | 495 | // sneeky exit check |
spinal | 0:3c929189abce | 496 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 10 || curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 11) { |
spinal | 0:3c929189abce | 497 | if (numTiles == 0) { |
spinal | 0:3c929189abce | 498 | levelNum++; |
spinal | 0:3c929189abce | 499 | if (levelNum >= maxLevels) { |
spinal | 0:3c929189abce | 500 | levelNum = 0; |
spinal | 0:3c929189abce | 501 | } |
spinal | 0:3c929189abce | 502 | // make sure explosions have finished :-) |
spinal | 0:3c929189abce | 503 | for (int t = 0; t < EXPLODESPRITES; t++){expU[t] = 0;} |
spinal | 0:3c929189abce | 504 | renderLevel(); refreshDisplay(); |
spinal | 0:3c929189abce | 505 | loadLevel(levelNum); |
spinal | 0:3c929189abce | 506 | renderLevel(0,1); |
spinal | 0:3c929189abce | 507 | } |
spinal | 0:3c929189abce | 508 | } |
spinal | 0:3c929189abce | 509 | // sneeky water check |
spinal | 0:3c929189abce | 510 | int p = curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)]; |
spinal | 0:3c929189abce | 511 | if (p == 0 || (p>=24 && p<=32)) { |
spinal | 0:3c929189abce | 512 | lives--; |
spinal | 0:3c929189abce | 513 | rumbleOn(); |
spinal | 0:3c929189abce | 514 | if (lives >= 0) { |
spinal | 0:3c929189abce | 515 | explodeHere(); |
spinal | 0:3c929189abce | 516 | // make sure explosions have finished :-) |
spinal | 0:3c929189abce | 517 | for(frameNumber=0; frameNumber<30; frameNumber++){ |
spinal | 0:3c929189abce | 518 | if(frameNumber>=RUMBLEFRAMES){rumbleOff();} |
spinal | 0:3c929189abce | 519 | renderLevel(0); // 0 to hide player |
spinal | 0:3c929189abce | 520 | refreshDisplay(); |
spinal | 0:3c929189abce | 521 | } |
spinal | 0:3c929189abce | 522 | loadLevel(levelNum); |
spinal | 0:3c929189abce | 523 | renderLevel(0,1); |
spinal | 0:3c929189abce | 524 | } else { |
spinal | 0:3c929189abce | 525 | explodeHere(); |
spinal | 0:3c929189abce | 526 | // make sure explosions have finished :-) |
spinal | 0:3c929189abce | 527 | for(frameNumber=0; frameNumber<30; frameNumber++){ |
spinal | 0:3c929189abce | 528 | if(frameNumber>=RUMBLEFRAMES){rumbleOff();} |
spinal | 0:3c929189abce | 529 | renderLevel(0); // 0 to hide player |
spinal | 0:3c929189abce | 530 | refreshDisplay(); |
spinal | 0:3c929189abce | 531 | } |
spinal | 0:3c929189abce | 532 | gameMode = 0; // titlescreen |
spinal | 0:3c929189abce | 533 | } |
spinal | 0:3c929189abce | 534 | } |
spinal | 0:3c929189abce | 535 | |
spinal | 0:3c929189abce | 536 | |
spinal | 0:3c929189abce | 537 | pd = 0; |
spinal | 0:3c929189abce | 538 | // if (!_B[HELD]) { |
spinal | 0:3c929189abce | 539 | if (_Up[HELD]) { |
spinal | 0:3c929189abce | 540 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14 && curLev[(px / tileSize) + LEVWIDTH * ((py-tileSize) / tileSize)] != 14) { |
spinal | 0:3c929189abce | 541 | pd = 1; |
spinal | 0:3c929189abce | 542 | checkTile(px / tileSize, py / tileSize); |
spinal | 0:3c929189abce | 543 | } |
spinal | 0:3c929189abce | 544 | } |
spinal | 0:3c929189abce | 545 | if (_Down[HELD]) { |
spinal | 0:3c929189abce | 546 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14 && curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14) { |
spinal | 0:3c929189abce | 547 | pd = 2; |
spinal | 0:3c929189abce | 548 | checkTile(px / tileSize, py / tileSize); |
spinal | 0:3c929189abce | 549 | } |
spinal | 0:3c929189abce | 550 | } |
spinal | 0:3c929189abce | 551 | if (_Left[HELD]) { |
spinal | 0:3c929189abce | 552 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 15 && curLev[((px-tileSize) / tileSize) + LEVWIDTH * (py / tileSize)] != 15) { |
spinal | 0:3c929189abce | 553 | pd = 3; |
spinal | 0:3c929189abce | 554 | checkTile(px / tileSize, py / tileSize); |
spinal | 0:3c929189abce | 555 | } |
spinal | 0:3c929189abce | 556 | } |
spinal | 0:3c929189abce | 557 | if (_Right[HELD]) { |
spinal | 0:3c929189abce | 558 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 15 && curLev[((px+tileSize) / tileSize) + LEVWIDTH * (py / tileSize)] != 15) { |
spinal | 0:3c929189abce | 559 | pd = 4; |
spinal | 0:3c929189abce | 560 | checkTile(px / tileSize, py / tileSize); |
spinal | 0:3c929189abce | 561 | } |
spinal | 0:3c929189abce | 562 | } |
spinal | 0:3c929189abce | 563 | if (_A[NEW]) { |
spinal | 0:3c929189abce | 564 | if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 16) { // teleport |
spinal | 0:3c929189abce | 565 | int t = (px / tileSize) + LEVWIDTH * (py / tileSize); |
spinal | 0:3c929189abce | 566 | telNum = teleportMap[t]; |
spinal | 0:3c929189abce | 567 | px = (telArray[telNum]%LEVWIDTH)*tileSize; |
spinal | 0:3c929189abce | 568 | py = (telArray[telNum]/LEVWIDTH)*tileSize; |
spinal | 0:3c929189abce | 569 | renderLevel(1,1); |
spinal | 0:3c929189abce | 570 | } |
spinal | 0:3c929189abce | 571 | } |
spinal | 0:3c929189abce | 572 | |
spinal | 0:3c929189abce | 573 | } |
spinal | 0:3c929189abce | 574 | |
spinal | 0:3c929189abce | 575 | switch (pd) { |
spinal | 0:3c929189abce | 576 | case 0: |
spinal | 0:3c929189abce | 577 | break; |
spinal | 0:3c929189abce | 578 | case 1: |
spinal | 0:3c929189abce | 579 | py-=STEPSIZE; |
spinal | 0:3c929189abce | 580 | ps+=STEPSIZE; |
spinal | 0:3c929189abce | 581 | break; |
spinal | 0:3c929189abce | 582 | case 2: |
spinal | 0:3c929189abce | 583 | py+=STEPSIZE; |
spinal | 0:3c929189abce | 584 | ps+=STEPSIZE; |
spinal | 0:3c929189abce | 585 | break; |
spinal | 0:3c929189abce | 586 | case 3: |
spinal | 0:3c929189abce | 587 | px-=STEPSIZE; |
spinal | 0:3c929189abce | 588 | ps+=STEPSIZE; |
spinal | 0:3c929189abce | 589 | break; |
spinal | 0:3c929189abce | 590 | case 4: |
spinal | 0:3c929189abce | 591 | px+=STEPSIZE; |
spinal | 0:3c929189abce | 592 | ps+=STEPSIZE; |
spinal | 0:3c929189abce | 593 | break; |
spinal | 0:3c929189abce | 594 | } |
spinal | 0:3c929189abce | 595 | if (ps == tileSize) { |
spinal | 0:3c929189abce | 596 | ps = 0; pd = 0; |
spinal | 0:3c929189abce | 597 | satTime = 0; |
spinal | 0:3c929189abce | 598 | } |
spinal | 0:3c929189abce | 599 | |
spinal | 0:3c929189abce | 600 | } |
spinal | 0:3c929189abce | 601 | |
spinal | 0:3c929189abce | 602 | void drawTitleScreen(){ |
spinal | 0:3c929189abce | 603 | game.display.directRectangle(0,0,220,176,_pal[0]); // clear the screen |
spinal | 0:3c929189abce | 604 | draw4BitTile(4, 41, 212, 23, 0, -1, title); |
spinal | 0:3c929189abce | 605 | |
spinal | 0:3c929189abce | 606 | print(40, 80, "Remade for Pokitto",0,_pal[0]); |
spinal | 0:3c929189abce | 607 | print(40, 96, " By Spinal",0,_pal[0]); |
spinal | 0:3c929189abce | 608 | |
spinal | 0:3c929189abce | 609 | print(8, 136, " Original on C64 by",0,_pal[0]); |
spinal | 0:3c929189abce | 610 | print(8, 152, " Oliva Kirwa (C) 1990",0,_pal[0]); |
spinal | 0:3c929189abce | 611 | |
spinal | 0:3c929189abce | 612 | for(int x=0; x<220; x++){ |
spinal | 0:3c929189abce | 613 | game.display.directPixel(x,SCROLLHEIGHT,_pal[4]); |
spinal | 0:3c929189abce | 614 | game.display.directPixel(x,SCROLLHEIGHT+1,_pal[10]); |
spinal | 0:3c929189abce | 615 | game.display.directPixel(x,SCROLLHEIGHT+2,_pal[15]); |
spinal | 0:3c929189abce | 616 | game.display.directPixel(x,SCROLLHEIGHT+11,_pal[15]); |
spinal | 0:3c929189abce | 617 | game.display.directPixel(x,SCROLLHEIGHT+12,_pal[10]); |
spinal | 0:3c929189abce | 618 | game.display.directPixel(x,SCROLLHEIGHT+13,_pal[4]); |
spinal | 0:3c929189abce | 619 | } |
spinal | 0:3c929189abce | 620 | |
spinal | 0:3c929189abce | 621 | gameMode=1; |
spinal | 0:3c929189abce | 622 | } |
spinal | 0:3c929189abce | 623 | |
spinal | 0:3c929189abce | 624 | void titleScreen(){ |
spinal | 0:3c929189abce | 625 | char text1[34]; |
spinal | 0:3c929189abce | 626 | memcpy(text1, &text[myInt],33); |
spinal | 0:3c929189abce | 627 | text1[32]=0; |
spinal | 0:3c929189abce | 628 | //titleprint(-scroller, 6 , text1); |
spinal | 0:3c929189abce | 629 | print(-scroller, SCROLLHEIGHT+3, text1,0,_pal[14]); |
spinal | 0:3c929189abce | 630 | if(frameNumber%3==0){ |
spinal | 0:3c929189abce | 631 | scroller++; |
spinal | 0:3c929189abce | 632 | if(scroller==8){ |
spinal | 0:3c929189abce | 633 | scroller=0; |
spinal | 0:3c929189abce | 634 | myInt++; |
spinal | 0:3c929189abce | 635 | if(myInt==strlen(text)){myInt=0;} |
spinal | 0:3c929189abce | 636 | } |
spinal | 0:3c929189abce | 637 | } |
spinal | 0:3c929189abce | 638 | |
spinal | 0:3c929189abce | 639 | if(_A[NEW]){ |
spinal | 0:3c929189abce | 640 | lives = 5; |
spinal | 0:3c929189abce | 641 | score = 0; |
spinal | 0:3c929189abce | 642 | levelNum = 0; |
spinal | 0:3c929189abce | 643 | gameMode = 10; |
spinal | 0:3c929189abce | 644 | game.display.directRectangle(0,0,220,176,0x0000); // clear the screen |
spinal | 0:3c929189abce | 645 | } |
spinal | 0:3c929189abce | 646 | |
spinal | 0:3c929189abce | 647 | } |
spinal | 0:3c929189abce | 648 | |
spinal | 0:3c929189abce | 649 | void playLevel(){ |
spinal | 0:3c929189abce | 650 | |
spinal | 0:3c929189abce | 651 | movePlayer(); |
spinal | 0:3c929189abce | 652 | |
spinal | 0:3c929189abce | 653 | // sit still too long at your peril! |
spinal | 0:3c929189abce | 654 | if (pd == 0) { |
spinal | 0:3c929189abce | 655 | satTime++; |
spinal | 0:3c929189abce | 656 | int t=curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)]; |
spinal | 0:3c929189abce | 657 | char satCount = 16; |
spinal | 0:3c929189abce | 658 | if(t==2) satCount = 8; |
spinal | 0:3c929189abce | 659 | |
spinal | 0:3c929189abce | 660 | if(satTime == satCount) { |
spinal | 0:3c929189abce | 661 | checkTile(px / tileSize, py / tileSize); |
spinal | 0:3c929189abce | 662 | satTime = 0; |
spinal | 0:3c929189abce | 663 | } |
spinal | 0:3c929189abce | 664 | } |
spinal | 0:3c929189abce | 665 | |
spinal | 0:3c929189abce | 666 | renderLevel(); |
spinal | 0:3c929189abce | 667 | |
spinal | 0:3c929189abce | 668 | } |
spinal | 0:3c929189abce | 669 | |
spinal | 0:3c929189abce | 670 | |
spinal | 0:3c929189abce | 671 | int main(){ |
spinal | 0:3c929189abce | 672 | rumbleOff(); // just in case |
spinal | 0:3c929189abce | 673 | |
spinal | 0:3c929189abce | 674 | game.begin(); |
spinal | 0:3c929189abce | 675 | game.display.width = 220; // full size |
spinal | 0:3c929189abce | 676 | game.display.height = 174; |
spinal | 0:3c929189abce | 677 | |
spinal | 0:3c929189abce | 678 | game.sound.ampEnable(true); |
spinal | 0:3c929189abce | 679 | game.sound.playMusicStream(musicName); |
spinal | 0:3c929189abce | 680 | |
spinal | 0:3c929189abce | 681 | gameMode = 0; // titleScreen |
spinal | 0:3c929189abce | 682 | tempTime = game.getTime(); |
spinal | 0:3c929189abce | 683 | |
spinal | 0:3c929189abce | 684 | while (game.isRunning()) { |
spinal | 0:3c929189abce | 685 | |
spinal | 0:3c929189abce | 686 | // if it is time to update the screen |
spinal | 0:3c929189abce | 687 | // if (game.update(true)){ |
spinal | 0:3c929189abce | 688 | |
spinal | 0:3c929189abce | 689 | game.sound.updateStream(); |
spinal | 0:3c929189abce | 690 | |
spinal | 0:3c929189abce | 691 | myPad = updateButtons(myPad); |
spinal | 0:3c929189abce | 692 | UpdatePad(myPad); |
spinal | 0:3c929189abce | 693 | |
spinal | 0:3c929189abce | 694 | frameNumber++; |
spinal | 0:3c929189abce | 695 | char oldMode = gameMode; |
spinal | 0:3c929189abce | 696 | switch(gameMode){ |
spinal | 0:3c929189abce | 697 | case 0: |
spinal | 0:3c929189abce | 698 | drawTitleScreen(); |
spinal | 0:3c929189abce | 699 | break; |
spinal | 0:3c929189abce | 700 | case 1: |
spinal | 0:3c929189abce | 701 | levelNum = 0; |
spinal | 0:3c929189abce | 702 | myDelay = 10; |
spinal | 0:3c929189abce | 703 | titleScreen(); |
spinal | 0:3c929189abce | 704 | break; |
spinal | 0:3c929189abce | 705 | case 10: |
spinal | 0:3c929189abce | 706 | // start new game. |
spinal | 0:3c929189abce | 707 | loadLevel(levelNum); |
spinal | 0:3c929189abce | 708 | renderLevel(0,1); |
spinal | 0:3c929189abce | 709 | gameMode = 20; |
spinal | 0:3c929189abce | 710 | break; |
spinal | 0:3c929189abce | 711 | case 20: |
spinal | 0:3c929189abce | 712 | // play levels |
spinal | 0:3c929189abce | 713 | myDelay = 30; |
spinal | 0:3c929189abce | 714 | playLevel(); |
spinal | 0:3c929189abce | 715 | break; |
spinal | 0:3c929189abce | 716 | } |
spinal | 0:3c929189abce | 717 | |
spinal | 0:3c929189abce | 718 | // timing loop |
spinal | 0:3c929189abce | 719 | while(game.getTime()-tempTime < myDelay){ |
spinal | 0:3c929189abce | 720 | refreshDisplay(); |
spinal | 0:3c929189abce | 721 | }; |
spinal | 0:3c929189abce | 722 | tempTime = game.getTime(); |
spinal | 0:3c929189abce | 723 | // } // update |
spinal | 0:3c929189abce | 724 | } |
spinal | 0:3c929189abce | 725 | return 1; |
spinal | 0:3c929189abce | 726 | } |