nice puzzle game

Dependencies:   PokittoLib

Committer:
spinal
Date:
Sun Nov 18 14:37:27 2018 +0000
Revision:
3:f6302af708a4
Parent:
0:3c929189abce
trying to add tracker music, got weird silence every 2 seconds;

Who changed what in which revision?

UserRevisionLine numberNew 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 3:f6302af708a4 5 #include "Synth.h"
spinal 3:f6302af708a4 6 #include "sound.h"
spinal 3:f6302af708a4 7 #include "snd.h"
spinal 3:f6302af708a4 8 #include "tune.h"
spinal 0:3c929189abce 9
spinal 0:3c929189abce 10 Pokitto::Core game;
spinal 3:f6302af708a4 11 Pokitto::Sound snd_;
spinal 0:3c929189abce 12
spinal 0:3c929189abce 13 #define OFF_X 2
spinal 0:3c929189abce 14 #define OFF_Y 42
spinal 0:3c929189abce 15 #define LEVWIDTH 18
spinal 0:3c929189abce 16 #define LEVHEIGHT 11
spinal 0:3c929189abce 17 #define SCROLLHEIGHT 112
spinal 0:3c929189abce 18 #define RUMBLEFRAMES 15
spinal 0:3c929189abce 19 #define STEPSIZE 1
spinal 0:3c929189abce 20 #define EXPLODESPRITES 15
spinal 0:3c929189abce 21 #define EXPLODESPEED 5
spinal 0:3c929189abce 22
spinal 0:3c929189abce 23 byte oldLev[LEVWIDTH * LEVHEIGHT];
spinal 0:3c929189abce 24 byte curLev[LEVWIDTH * LEVHEIGHT];
spinal 0:3c929189abce 25 byte teleportMap[LEVWIDTH * LEVHEIGHT];
spinal 0:3c929189abce 26 byte telArray[32];
spinal 0:3c929189abce 27 char satTime = 0;
spinal 0:3c929189abce 28 int numTiles;
spinal 0:3c929189abce 29 int px,py,ps,pd;
spinal 0:3c929189abce 30 int levelNum=0;
spinal 0:3c929189abce 31 int maxLevels=sizeof(levels)/102;
spinal 0:3c929189abce 32 int tileSize=12;
spinal 0:3c929189abce 33 uint32_t frameNumber=0;
spinal 0:3c929189abce 34 int score=0;
spinal 0:3c929189abce 35 int hiscore=0;
spinal 0:3c929189abce 36 bool stillExploding=0;
spinal 0:3c929189abce 37 int telNum = 0;
spinal 0:3c929189abce 38 byte gameMode;
spinal 0:3c929189abce 39 unsigned int myInt=0;
spinal 0:3c929189abce 40 byte scroller=0;
spinal 3:f6302af708a4 41 //char musicName[] = "sensitiv.snd";
spinal 0:3c929189abce 42 int lives;
spinal 0:3c929189abce 43
spinal 0:3c929189abce 44 uint32_t myDelay;
spinal 0:3c929189abce 45 uint32_t tempTime;
spinal 0:3c929189abce 46
spinal 3:f6302af708a4 47 typedef struct{
spinal 3:f6302af708a4 48 bool playSample;
spinal 3:f6302af708a4 49 int soundPoint;
spinal 3:f6302af708a4 50 const uint8_t *currentSound;
spinal 3:f6302af708a4 51 int currentSoundSize;
spinal 3:f6302af708a4 52 int volume;
spinal 3:f6302af708a4 53 int speed;
spinal 3:f6302af708a4 54 int repeat;
spinal 3:f6302af708a4 55 } sampletype;
spinal 3:f6302af708a4 56
spinal 3:f6302af708a4 57 sampletype snd[4]; // up to 4 sounds at once?
spinal 3:f6302af708a4 58 int oldQuart;
spinal 3:f6302af708a4 59
spinal 3:f6302af708a4 60 uint32_t nextBufferIndexToFill = 0;
spinal 3:f6302af708a4 61 uint32_t nextT = 0;
spinal 3:f6302af708a4 62 uint32_t oldBufIndex=0;
spinal 3:f6302af708a4 63
spinal 3:f6302af708a4 64 int currentLine=0;
spinal 3:f6302af708a4 65 int mytick=0;
spinal 3:f6302af708a4 66 int pattern=0;
spinal 3:f6302af708a4 67 int oldBufNum = 0;
spinal 3:f6302af708a4 68
spinal 0:3c929189abce 69 // explosion
spinal 0:3c929189abce 70 uint8_t expX[EXPLODESPRITES], expY[EXPLODESPRITES], expF[EXPLODESPRITES], expU[EXPLODESPRITES];
spinal 0:3c929189abce 71 uint8_t explode = 0;
spinal 0:3c929189abce 72
spinal 0:3c929189abce 73 void rumbleOn(){
spinal 3:f6302af708a4 74 DigitalOut outPin(EXT0);
spinal 3:f6302af708a4 75 //DigitalOut inPin(P0_11);
spinal 3:f6302af708a4 76 //inPin=0;
spinal 0:3c929189abce 77 outPin=1;
spinal 0:3c929189abce 78 }
spinal 0:3c929189abce 79 void rumbleOff(){
spinal 3:f6302af708a4 80 DigitalOut outPin(EXT0);
spinal 3:f6302af708a4 81 //DigitalOut inPin(P0_11);
spinal 3:f6302af708a4 82 //inPin=0;
spinal 0:3c929189abce 83 outPin=0;
spinal 0:3c929189abce 84 }
spinal 0:3c929189abce 85
spinal 0:3c929189abce 86 /**************************************************************************/
spinal 0:3c929189abce 87 #define HELD 0
spinal 0:3c929189abce 88 #define NEW 1
spinal 0:3c929189abce 89 #define RELEASE 2
spinal 0:3c929189abce 90 byte CompletePad, ExPad, TempPad, myPad;
spinal 0:3c929189abce 91 bool _A[3], _B[3], _C[3], _Up[3], _Down[3], _Left[3], _Right[3];
spinal 0:3c929189abce 92
spinal 0:3c929189abce 93 DigitalIn _aPin(P1_9);
spinal 0:3c929189abce 94 DigitalIn _bPin(P1_4);
spinal 0:3c929189abce 95 DigitalIn _cPin(P1_10);
spinal 0:3c929189abce 96 DigitalIn _upPin(P1_13);
spinal 0:3c929189abce 97 DigitalIn _downPin(P1_3);
spinal 0:3c929189abce 98 DigitalIn _leftPin(P1_25);
spinal 0:3c929189abce 99 DigitalIn _rightPin(P1_7);
spinal 0:3c929189abce 100
spinal 0:3c929189abce 101 void UPDATEPAD(int pad, int var) {
spinal 0:3c929189abce 102 _C[pad] = (var >> 1)&1;
spinal 0:3c929189abce 103 _B[pad] = (var >> 2)&1;
spinal 0:3c929189abce 104 _A[pad] = (var >> 3)&1;
spinal 0:3c929189abce 105 _Down[pad] = (var >> 4)&1;
spinal 0:3c929189abce 106 _Left[pad] = (var >> 5)&1;
spinal 0:3c929189abce 107 _Right[pad] = (var >> 6)&1;
spinal 0:3c929189abce 108 _Up[pad] = (var >> 7)&1;
spinal 0:3c929189abce 109 }
spinal 0:3c929189abce 110
spinal 0:3c929189abce 111 void UpdatePad(int joy_code){
spinal 0:3c929189abce 112 ExPad = CompletePad;
spinal 0:3c929189abce 113 CompletePad = joy_code;
spinal 0:3c929189abce 114 UPDATEPAD(HELD, CompletePad); // held
spinal 0:3c929189abce 115 UPDATEPAD(RELEASE, (ExPad & (~CompletePad))); // released
spinal 0:3c929189abce 116 UPDATEPAD(NEW, (CompletePad & (~ExPad))); // newpress
spinal 0:3c929189abce 117 }
spinal 0:3c929189abce 118
spinal 0:3c929189abce 119 byte updateButtons(byte var){
spinal 0:3c929189abce 120 var = 0;
spinal 0:3c929189abce 121 if (_cPin) var |= (1<<1);
spinal 0:3c929189abce 122 if (_bPin) var |= (1<<2);
spinal 0:3c929189abce 123 if (_aPin) var |= (1<<3); // P1_9 = A
spinal 0:3c929189abce 124 if (_downPin) var |= (1<<4);
spinal 0:3c929189abce 125 if (_leftPin) var |= (1<<5);
spinal 0:3c929189abce 126 if (_rightPin) var |= (1<<6);
spinal 0:3c929189abce 127 if (_upPin) var |= (1<<7);
spinal 0:3c929189abce 128
spinal 0:3c929189abce 129 return var;
spinal 0:3c929189abce 130 }
spinal 0:3c929189abce 131
spinal 3:f6302af708a4 132 /**********[Sound]*********************************************************/
spinal 3:f6302af708a4 133
spinal 3:f6302af708a4 134
spinal 3:f6302af708a4 135 Ticker sounder;
spinal 3:f6302af708a4 136 Ticker sounder1;
spinal 3:f6302af708a4 137
spinal 3:f6302af708a4 138 // note_speed << octave. = speed to play sample
spinal 3:f6302af708a4 139 int note_speed[]={ 27,30,16,18,20,21,24, 29,0 ,17,19,0 ,23,25};
spinal 3:f6302af708a4 140 // A B C D E F G A# B# C# D# E# F# G#
spinal 3:f6302af708a4 141
spinal 3:f6302af708a4 142
spinal 3:f6302af708a4 143 uint8_t playSound(int channel, const unsigned char *sound, uint16_t soundSize, int volume = 255, int speed=255, int repeat=0){
spinal 3:f6302af708a4 144
spinal 3:f6302af708a4 145 snd[channel].currentSound = sound;
spinal 3:f6302af708a4 146 snd[channel].currentSoundSize = (soundSize*255)/speed;
spinal 3:f6302af708a4 147 snd[channel].soundPoint = 0;
spinal 3:f6302af708a4 148 snd[channel].playSample = 1;
spinal 3:f6302af708a4 149 snd[channel].volume = volume;
spinal 3:f6302af708a4 150 snd[channel].speed = speed;
spinal 3:f6302af708a4 151 snd[channel].repeat = repeat;
spinal 3:f6302af708a4 152
spinal 3:f6302af708a4 153 return channel;
spinal 3:f6302af708a4 154 }
spinal 3:f6302af708a4 155
spinal 3:f6302af708a4 156 uint8_t mixSound(int samplePos)
spinal 3:f6302af708a4 157 {
spinal 3:f6302af708a4 158 int temp = 0;
spinal 3:f6302af708a4 159 int ss[4];
spinal 3:f6302af708a4 160
spinal 3:f6302af708a4 161 for(int s=0; s<4; s++){
spinal 3:f6302af708a4 162 ss[s] = (snd[s].currentSound[(snd[s].soundPoint*snd[s].speed)>>8]*snd[s].volume>>8) * snd[s].playSample;
spinal 3:f6302af708a4 163 ++snd[s].soundPoint;
spinal 3:f6302af708a4 164 if(snd[s].soundPoint >= snd[s].currentSoundSize){
spinal 3:f6302af708a4 165 if(snd[s].repeat){
spinal 3:f6302af708a4 166 snd[s].soundPoint=0;
spinal 3:f6302af708a4 167 }else{
spinal 3:f6302af708a4 168 snd[s].playSample=0;
spinal 3:f6302af708a4 169 snd[s].soundPoint=0;
spinal 3:f6302af708a4 170 }
spinal 3:f6302af708a4 171 }
spinal 3:f6302af708a4 172 }
spinal 3:f6302af708a4 173
spinal 3:f6302af708a4 174
spinal 3:f6302af708a4 175 // temp = (ss[0] + ss[1] + ss[2] + ss[3]) - (ss[0] * ss[1] * ss[2] * ss[3]);
spinal 3:f6302af708a4 176 temp = ((127 - ss[0] + ss[1] + ss[2] + ss[3])/4)+127;
spinal 3:f6302af708a4 177
spinal 3:f6302af708a4 178 return temp;
spinal 3:f6302af708a4 179 }
spinal 3:f6302af708a4 180
spinal 3:f6302af708a4 181 void update_tune(){
spinal 3:f6302af708a4 182
spinal 3:f6302af708a4 183 char pat = my_pattern[pattern];
spinal 3:f6302af708a4 184
spinal 3:f6302af708a4 185 for(int t=0; t<4; t++){
spinal 3:f6302af708a4 186 char note = tune[pat][currentLine][t][0];
spinal 3:f6302af708a4 187 char octave = tune[pat][currentLine][t][1];
spinal 3:f6302af708a4 188 int volume = tune[pat][currentLine][t][2] << 2;
spinal 3:f6302af708a4 189 char instrument = tune[pat][currentLine][t][3];
spinal 3:f6302af708a4 190
spinal 3:f6302af708a4 191 if(note > 0){
spinal 3:f6302af708a4 192
spinal 3:f6302af708a4 193 int speed = (note_speed[note-1] << octave) >> 2;
spinal 3:f6302af708a4 194
spinal 3:f6302af708a4 195 switch(instrument){
spinal 3:f6302af708a4 196 case 1:
spinal 3:f6302af708a4 197 playSound(t, s_01, sizeof(s_01), volume, speed, sampleRepeat[0]);
spinal 3:f6302af708a4 198 break;
spinal 3:f6302af708a4 199 case 2:
spinal 3:f6302af708a4 200 playSound(t, s_02, sizeof(s_02), volume, speed, sampleRepeat[1]);
spinal 3:f6302af708a4 201 break;
spinal 3:f6302af708a4 202 case 3:
spinal 3:f6302af708a4 203 playSound(t, s_03, sizeof(s_03), volume, speed, sampleRepeat[2]);
spinal 3:f6302af708a4 204 break;
spinal 3:f6302af708a4 205 case 4:
spinal 3:f6302af708a4 206 playSound(t, s_04, sizeof(s_04), volume, speed, sampleRepeat[3]);
spinal 3:f6302af708a4 207 break;
spinal 3:f6302af708a4 208 }
spinal 3:f6302af708a4 209 }
spinal 3:f6302af708a4 210
spinal 3:f6302af708a4 211 snd[t].volume = volume;
spinal 3:f6302af708a4 212
spinal 3:f6302af708a4 213 }
spinal 3:f6302af708a4 214
spinal 3:f6302af708a4 215 if(currentLine++==63){
spinal 3:f6302af708a4 216 currentLine=0;
spinal 3:f6302af708a4 217 if(pattern++==sizeof(my_pattern))pattern=0;
spinal 3:f6302af708a4 218 }
spinal 3:f6302af708a4 219 }
spinal 3:f6302af708a4 220
spinal 0:3c929189abce 221 /**************************************************************************/
spinal 0:3c929189abce 222
spinal 3:f6302af708a4 223
spinal 0:3c929189abce 224 void new2BitTile(int x1, int y1, int wide, int high, int tile, const uint16_t *gfx, int palNumber){
spinal 3:f6302af708a4 225 // for drawing level tiles
spinal 0:3c929189abce 226 uint16_t tileBuffer[wide*high];
spinal 0:3c929189abce 227
spinal 0:3c929189abce 228 uint8_t pix;
spinal 0:3c929189abce 229 uint8_t quartWide=wide/4;
spinal 0:3c929189abce 230 uint8_t pic;
spinal 0:3c929189abce 231
spinal 0:3c929189abce 232 int palNo = palLookup[palNumber]*4;
spinal 0:3c929189abce 233 for(int y=0; y<high; y++){
spinal 0:3c929189abce 234 for(int x=0; x<quartWide; x++){
spinal 0:3c929189abce 235 pic = gfx[(tile*quartWide*high)+(x+quartWide*y)];
spinal 3:f6302af708a4 236 pix = (pic >> 6)&3; tileBuffer[y*high+( x*4)]=_pal[_miniPal[palNo+pix]];
spinal 3:f6302af708a4 237 pix = (pic >> 4)&3; tileBuffer[y*high+(1+x*4)]=_pal[_miniPal[palNo+pix]];
spinal 3:f6302af708a4 238 pix = (pic >> 2)&3; tileBuffer[y*high+(2+x*4)]=_pal[_miniPal[palNo+pix]];
spinal 3:f6302af708a4 239 pix = pic &3; tileBuffer[y*high+(3+x*4)]=_pal[_miniPal[palNo+pix]];
spinal 0:3c929189abce 240 }
spinal 0:3c929189abce 241 }
spinal 0:3c929189abce 242
spinal 0:3c929189abce 243 game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer);
spinal 0:3c929189abce 244 }
spinal 0:3c929189abce 245
spinal 0:3c929189abce 246 void new4BitTile(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx){
spinal 0:3c929189abce 247 uint16_t tileBuffer[wide*high];
spinal 0:3c929189abce 248 int pix1,pix2;
spinal 0:3c929189abce 249 int halfWide=wide/2;
spinal 0:3c929189abce 250 for(int y=0; y<high; y++){
spinal 0:3c929189abce 251 for(int x=0; x<halfWide; x++){
spinal 0:3c929189abce 252 pix1 = gfx[(tile*halfWide*high)+(x+halfWide*y)]>>4;
spinal 0:3c929189abce 253 pix2 = gfx[(tile*halfWide*high)+(x+halfWide*y)]&15;
spinal 0:3c929189abce 254 tileBuffer[y+high*( x*2)]=_pal[pix1];
spinal 0:3c929189abce 255 tileBuffer[y+high*(1+x*2)]=_pal[pix2];
spinal 0:3c929189abce 256 }
spinal 0:3c929189abce 257 }
spinal 0:3c929189abce 258 game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer);
spinal 0:3c929189abce 259 }
spinal 0:3c929189abce 260
spinal 0:3c929189abce 261
spinal 0:3c929189abce 262 /**************************************************************************/
spinal 0:3c929189abce 263 /**************************************************************************/
spinal 0:3c929189abce 264
spinal 0:3c929189abce 265
spinal 0:3c929189abce 266 int RandMinMax(int min, int max){
spinal 0:3c929189abce 267 return rand() % max + min;
spinal 0:3c929189abce 268 }
spinal 0:3c929189abce 269
spinal 0:3c929189abce 270 void refreshDisplay(){
spinal 0:3c929189abce 271 // place holder to replace a simulator command.
spinal 0:3c929189abce 272 }
spinal 0:3c929189abce 273
spinal 0:3c929189abce 274 void draw4BitTile(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx){
spinal 0:3c929189abce 275 int pix1,pix2;
spinal 0:3c929189abce 276 int halfWide=wide/2;
spinal 0:3c929189abce 277 for(int y=0; y<high; y++){
spinal 0:3c929189abce 278 for(int x=0; x<halfWide; x++){
spinal 0:3c929189abce 279 pix1 = gfx[(tile*halfWide*high)+(x+halfWide*y)]>>4;
spinal 0:3c929189abce 280 pix2 = gfx[(tile*halfWide*high)+(x+halfWide*y)]&15;
spinal 0:3c929189abce 281 if(pix1 != transparentColor){game.display.directPixel(x1+(x*2),y1+y,_pal[pix1]);}
spinal 0:3c929189abce 282 if(pix2 != transparentColor){game.display.directPixel(1+x1+(x*2),y1+y,_pal[pix2]);}
spinal 0:3c929189abce 283 }
spinal 0:3c929189abce 284 }
spinal 0:3c929189abce 285 }
spinal 0:3c929189abce 286
spinal 0:3c929189abce 287 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 288 uint8_t pix;
spinal 0:3c929189abce 289 uint8_t quartWide=wide/4;
spinal 0:3c929189abce 290 uint8_t pic;
spinal 0:3c929189abce 291
spinal 0:3c929189abce 292 int palNo = palLookup[palNumber]*4;
spinal 0:3c929189abce 293 for(int y=0; y<high; y++){
spinal 0:3c929189abce 294 for(int x=0; x<quartWide; x++){
spinal 0:3c929189abce 295 pic = gfx[(tile*quartWide*high)+(x+quartWide*y)];
spinal 0:3c929189abce 296 pix = (pic >> 6)&3; if(pix != transparentColor){game.display.directPixel( x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);}
spinal 0:3c929189abce 297 pix = (pic >> 4)&3; if(pix != transparentColor){game.display.directPixel(1+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);}
spinal 0:3c929189abce 298 pix = (pic >> 2)&3; if(pix != transparentColor){game.display.directPixel(2+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);}
spinal 0:3c929189abce 299 pix = pic &3; if(pix != transparentColor){game.display.directPixel(3+x1+(x*4),y1+y,_pal[_miniPal[palNo+pix]]);}
spinal 0:3c929189abce 300 }
spinal 0:3c929189abce 301 }
spinal 0:3c929189abce 302 }
spinal 0:3c929189abce 303
spinal 0:3c929189abce 304
spinal 0:3c929189abce 305 void drawFont(int x1, int y1, int wide, int high, int tile, int transparentColor, const uint8_t *gfx, int palReplace = -1){
spinal 0:3c929189abce 306 uint16_t tileBuffer[(wide+1)*(high+1)];
spinal 0:3c929189abce 307
spinal 0:3c929189abce 308 uint8_t pix;
spinal 0:3c929189abce 309 uint8_t quartWide=wide/4;
spinal 0:3c929189abce 310 uint8_t pic;
spinal 0:3c929189abce 311
spinal 0:3c929189abce 312 for(int y=0; y<high; y++){
spinal 0:3c929189abce 313 for(int x=0; x<quartWide; x++){
spinal 0:3c929189abce 314 pic = gfx[(tile*quartWide*high)+(x+quartWide*y)];
spinal 3:f6302af708a4 315 pix = (pic >> 6)&3; if(pix != transparentColor){tileBuffer[y*high+( x*4)]=numbers_pal[pix];}else{tileBuffer[y*high+( x*4)]=palReplace;}
spinal 3:f6302af708a4 316 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 3:f6302af708a4 317 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 3:f6302af708a4 318 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 319 }
spinal 0:3c929189abce 320 }
spinal 0:3c929189abce 321
spinal 0:3c929189abce 322 game.display.directTile(x1, y1, x1+wide, y1+high, tileBuffer);
spinal 0:3c929189abce 323
spinal 0:3c929189abce 324 }
spinal 0:3c929189abce 325
spinal 0:3c929189abce 326 // print text
spinal 0:3c929189abce 327 void print(uint16_t x, uint16_t y, const char* text, uint8_t bgCol, signed int repCol=-1){
spinal 0:3c929189abce 328 if(repCol==-1)repCol=bgCol;
spinal 0:3c929189abce 329 for(uint8_t t = 0; t < strlen(text); t++){
spinal 0:3c929189abce 330 uint8_t character = text[t]-32;
spinal 0:3c929189abce 331 drawFont(x, y, 8, 8, character, bgCol, myFont, repCol);
spinal 0:3c929189abce 332 x += 8;
spinal 0:3c929189abce 333 }
spinal 0:3c929189abce 334 }
spinal 0:3c929189abce 335
spinal 0:3c929189abce 336
spinal 0:3c929189abce 337
spinal 0:3c929189abce 338 void loadLevel(int number) {
spinal 0:3c929189abce 339 /*
spinal 0:3c929189abce 340 // store level number in file for testing
spinal 0:3c929189abce 341 FILE *fp;
spinal 0:3c929189abce 342 fp = fopen("test.txt", "w+");
spinal 0:3c929189abce 343 fwrite(&number, sizeof(int),1, fp);
spinal 0:3c929189abce 344 fclose(fp);
spinal 0:3c929189abce 345 */
spinal 0:3c929189abce 346
spinal 0:3c929189abce 347 numTiles = 0;
spinal 0:3c929189abce 348 satTime = 0;
spinal 0:3c929189abce 349 int numTels = 0;
spinal 0:3c929189abce 350
spinal 0:3c929189abce 351 int amount = (LEVWIDTH/2)*LEVHEIGHT;
spinal 0:3c929189abce 352
spinal 0:3c929189abce 353 for (int t = amount-1; t >= 0; t--) {
spinal 0:3c929189abce 354 int s = pgm_read_byte(levels + t + ((amount+3) * number));
spinal 0:3c929189abce 355 curLev[t * 2] = pgm_read_byte(lookUpTile + (s >> 4));
spinal 0:3c929189abce 356 curLev[(t * 2) + 1] = pgm_read_byte(lookUpTile + (s & 15));
spinal 0:3c929189abce 357 s = t * 2;
spinal 0:3c929189abce 358 teleportMap[s] = 0;
spinal 0:3c929189abce 359 teleportMap[s+1] = 0;
spinal 0:3c929189abce 360
spinal 0:3c929189abce 361 switch (curLev[s]) {
spinal 0:3c929189abce 362 case 1:
spinal 0:3c929189abce 363 numTiles++;
spinal 0:3c929189abce 364 break;
spinal 0:3c929189abce 365 case 2:
spinal 0:3c929189abce 366 numTiles += 2;
spinal 0:3c929189abce 367 break;
spinal 0:3c929189abce 368 case 4:
spinal 0:3c929189abce 369 curLev[s + 1] = 5;
spinal 0:3c929189abce 370 curLev[s + LEVWIDTH] = 6;
spinal 0:3c929189abce 371 curLev[s + LEVWIDTH+1] = 7;
spinal 0:3c929189abce 372 break;
spinal 0:3c929189abce 373 case 8:
spinal 0:3c929189abce 374 curLev[s + 1] = 9;
spinal 0:3c929189abce 375 break;
spinal 0:3c929189abce 376 case 10:
spinal 0:3c929189abce 377 curLev[s + 1] = 11;
spinal 0:3c929189abce 378 break;
spinal 0:3c929189abce 379 case 12:
spinal 0:3c929189abce 380 curLev[s + LEVWIDTH] = 13;
spinal 0:3c929189abce 381 break;
spinal 0:3c929189abce 382 }
spinal 0:3c929189abce 383
spinal 0:3c929189abce 384 s = (t * 2) + 1;
spinal 0:3c929189abce 385 switch (curLev[s]) {
spinal 0:3c929189abce 386 case 1:
spinal 0:3c929189abce 387 numTiles++;
spinal 0:3c929189abce 388 break;
spinal 0:3c929189abce 389 case 2:
spinal 0:3c929189abce 390 numTiles += 2;
spinal 0:3c929189abce 391 break;
spinal 0:3c929189abce 392 case 4:
spinal 0:3c929189abce 393 curLev[s + 1] = 5;
spinal 0:3c929189abce 394 curLev[s + LEVWIDTH] = 6;
spinal 0:3c929189abce 395 curLev[s + LEVWIDTH+1] = 7;
spinal 0:3c929189abce 396 break;
spinal 0:3c929189abce 397 case 8:
spinal 0:3c929189abce 398 curLev[s + 1] = 9;
spinal 0:3c929189abce 399 break;
spinal 0:3c929189abce 400 case 10:
spinal 0:3c929189abce 401 curLev[s + 1] = 11;
spinal 0:3c929189abce 402 break;
spinal 0:3c929189abce 403 case 12:
spinal 0:3c929189abce 404 curLev[s + LEVWIDTH] = 13;
spinal 0:3c929189abce 405 break;
spinal 0:3c929189abce 406 }
spinal 0:3c929189abce 407
spinal 0:3c929189abce 408 }
spinal 0:3c929189abce 409
spinal 0:3c929189abce 410
spinal 0:3c929189abce 411 px = pgm_read_byte(levels + amount + ((amount+3) * number))*tileSize;
spinal 0:3c929189abce 412 py = pgm_read_byte(levels + amount+1 + ((amount+3) * number))*tileSize;
spinal 0:3c929189abce 413 int telNumber = pgm_read_byte(levels + amount+2 + ((amount+3) * number));
spinal 0:3c929189abce 414 ps = 0; pd = 0;
spinal 0:3c929189abce 415 satTime = 0;
spinal 0:3c929189abce 416
spinal 0:3c929189abce 417 for(int t=0; t<31; t++){
spinal 0:3c929189abce 418 telArray[t] = pgm_read_byte(telPath + t + (telNumber*32));
spinal 0:3c929189abce 419 }
spinal 0:3c929189abce 420
spinal 0:3c929189abce 421 // teleport locations
spinal 0:3c929189abce 422 numTels=0;
spinal 0:3c929189abce 423 for (int y = 0; y <LEVHEIGHT; y++) {
spinal 0:3c929189abce 424 for (int x = 0; x <LEVWIDTH ; x++) {
spinal 0:3c929189abce 425 int tn = (y * LEVWIDTH) + x;
spinal 0:3c929189abce 426 if(curLev[tn]==16){
spinal 0:3c929189abce 427 teleportMap[tn] = numTels;
spinal 0:3c929189abce 428 numTels++;
spinal 0:3c929189abce 429 }
spinal 0:3c929189abce 430 }
spinal 0:3c929189abce 431 }
spinal 0:3c929189abce 432
spinal 0:3c929189abce 433
spinal 0:3c929189abce 434 // draw part of the screen here
spinal 0:3c929189abce 435 // bad practice I know, but so what!
spinal 0:3c929189abce 436
spinal 0:3c929189abce 437 for(byte t=0; t<LEVWIDTH * LEVHEIGHT; t++){
spinal 0:3c929189abce 438 oldLev[t] = 255;
spinal 0:3c929189abce 439 }
spinal 0:3c929189abce 440
spinal 0:3c929189abce 441 for (int x = LEVWIDTH-1; x >= 0 ; x--) {
spinal 0:3c929189abce 442 new2BitTile(OFF_X+x*tileSize, 42, tileSize, tileSize, 0, gbTiles, 0);
spinal 0:3c929189abce 443 }
spinal 0:3c929189abce 444
spinal 0:3c929189abce 445 game.display.directRectangle(OFF_X,0,218,40,_pal[10]);
spinal 3:f6302af708a4 446 game.display.directRectangle(OFF_X,0,218,1,_pal[4]);
spinal 3:f6302af708a4 447 game.display.directRectangle(OFF_X,1,218,2,_pal[10]);
spinal 3:f6302af708a4 448 game.display.directRectangle(OFF_X,2,218,3,_pal[15]);
spinal 3:f6302af708a4 449 game.display.directRectangle(OFF_X,3,218,4,_pal[15]);
spinal 3:f6302af708a4 450 game.display.directRectangle(OFF_X,4,218,5,_pal[10]);
spinal 3:f6302af708a4 451 game.display.directRectangle(OFF_X,5,218,6,_pal[4]);
spinal 3:f6302af708a4 452 game.display.directRectangle(OFF_X,36,218,37,_pal[4]);
spinal 3:f6302af708a4 453 game.display.directRectangle(OFF_X,37,218,38,_pal[10]);
spinal 3:f6302af708a4 454 game.display.directRectangle(OFF_X,38,218,39,_pal[15]);
spinal 3:f6302af708a4 455 game.display.directRectangle(OFF_X,39,218,40,_pal[15]);
spinal 3:f6302af708a4 456 game.display.directRectangle(OFF_X,40,218,41,_pal[10]);
spinal 3:f6302af708a4 457 game.display.directRectangle(OFF_X,41,218,42,_pal[4]);
spinal 0:3c929189abce 458
spinal 0:3c929189abce 459
spinal 0:3c929189abce 460 // pause if any buttons held
spinal 0:3c929189abce 461 while(_Up[HELD] || _Down[HELD] || _Left[HELD] || _Right[HELD] || _A[HELD] || _B[HELD] || _C[HELD]){
spinal 0:3c929189abce 462 myPad = updateButtons(myPad);
spinal 0:3c929189abce 463 UpdatePad(myPad);
spinal 0:3c929189abce 464 }
spinal 0:3c929189abce 465
spinal 0:3c929189abce 466
spinal 0:3c929189abce 467 }
spinal 0:3c929189abce 468
spinal 0:3c929189abce 469 void renderLevel(bool drawPlayer = 1, bool fullLevel=0){
spinal 0:3c929189abce 470
spinal 0:3c929189abce 471 signed int xStart=(px / tileSize)+4;
spinal 0:3c929189abce 472 signed int yStart=(py / tileSize)+4;
spinal 0:3c929189abce 473 signed int xEnd=(px / tileSize)-4;
spinal 0:3c929189abce 474 signed int yEnd=(py / tileSize)-4;
spinal 0:3c929189abce 475 if(xEnd<0){xStart+=-xEnd; xEnd=0;}
spinal 0:3c929189abce 476 if(yEnd<0){yStart+=-yEnd; yEnd=0;}
spinal 0:3c929189abce 477 if(xStart>LEVWIDTH-1){xStart=LEVWIDTH-1; xEnd=xStart-9;}
spinal 0:3c929189abce 478 if(yStart>LEVHEIGHT-1){yStart=LEVHEIGHT-1; yEnd=yStart-9;}
spinal 0:3c929189abce 479
spinal 0:3c929189abce 480 // if(fullLevel){
spinal 0:3c929189abce 481 xStart=LEVWIDTH-1;
spinal 0:3c929189abce 482 yStart=LEVHEIGHT-1;
spinal 0:3c929189abce 483 xEnd=0;
spinal 0:3c929189abce 484 yEnd=1;
spinal 0:3c929189abce 485 // }
spinal 0:3c929189abce 486
spinal 0:3c929189abce 487
spinal 0:3c929189abce 488 // oldLev[t] = curLev[t];
spinal 0:3c929189abce 489
spinal 0:3c929189abce 490
spinal 0:3c929189abce 491 // int transp=-1;
spinal 0:3c929189abce 492 for (int y = yStart; y >= yEnd; y--) {
spinal 0:3c929189abce 493 for (int x = xStart; x >= xEnd; x--) {
spinal 0:3c929189abce 494 int tn = (y * LEVWIDTH) + x;
spinal 0:3c929189abce 495 if(oldLev[tn] != curLev[tn]){
spinal 0:3c929189abce 496 oldLev[tn] = curLev[tn];
spinal 0:3c929189abce 497 if(curLev[tn]==0){
spinal 0:3c929189abce 498 // water tile with shaddow
spinal 0:3c929189abce 499 uint8_t tile = 0;
spinal 0:3c929189abce 500 if(y>0){
spinal 0:3c929189abce 501 if(curLev[((y-1) * LEVWIDTH) + (x)]){ tile += 1; }
spinal 0:3c929189abce 502 if(x>0){if(curLev[((y-1) * LEVWIDTH) + (x-1)]){ tile += 2; }}
spinal 0:3c929189abce 503 }
spinal 0:3c929189abce 504 if(x>0){if(curLev[((y) * LEVWIDTH) + (x-1)]){ tile += 4; }}
spinal 0:3c929189abce 505 new2BitTile(OFF_X+x*tileSize, OFF_Y+y*tileSize, tileSize, tileSize, shaddow[tile], gbTiles, shaddow[tile]);
spinal 3:f6302af708a4 506
spinal 3:f6302af708a4 507 for (int t = 0; t < EXPLODESPRITES; t++) {
spinal 3:f6302af708a4 508 if (expU[t] == 1) {
spinal 3:f6302af708a4 509 if(expX[t]==x && expY[t]==y){
spinal 3:f6302af708a4 510 draw4BitTile(OFF_X+(expX[t]*tileSize), OFF_Y+expY[t]*tileSize, tileSize, tileSize, expF[t], 8, explode_tiles);
spinal 3:f6302af708a4 511 }
spinal 3:f6302af708a4 512 }
spinal 3:f6302af708a4 513 }
spinal 3:f6302af708a4 514
spinal 0:3c929189abce 515 }else{
spinal 0:3c929189abce 516 // all other tiles
spinal 0:3c929189abce 517 new2BitTile(OFF_X+x*tileSize, OFF_Y+y*tileSize, tileSize, tileSize, curLev[tn], gbTiles, curLev[tn]);
spinal 0:3c929189abce 518 }
spinal 0:3c929189abce 519 }
spinal 3:f6302af708a4 520
spinal 3:f6302af708a4 521 // player sprite
spinal 3:f6302af708a4 522 if(drawPlayer){
spinal 3:f6302af708a4 523 if(x == px/tileSize){
spinal 3:f6302af708a4 524 if(y == py/tileSize){
spinal 3:f6302af708a4 525 uint16_t tileBuffer[10];
spinal 3:f6302af708a4 526 for(byte y1=0; y1<8; y1++){
spinal 3:f6302af708a4 527 int offX = ball[y1][0];
spinal 3:f6302af708a4 528 int wide = ball[y1][1];
spinal 3:f6302af708a4 529 for(byte x1=0; x1<wide; x1++){
spinal 3:f6302af708a4 530 tileBuffer[x1]=_pal[ball[y1][x1+2]];
spinal 3:f6302af708a4 531 }
spinal 3:f6302af708a4 532 game.display.directTile(OFF_X+px+offX+2, OFF_Y+py+y1+2, OFF_X+px+wide+offX+2, OFF_Y+py+3+y1 , tileBuffer);
spinal 3:f6302af708a4 533 }// y
spinal 3:f6302af708a4 534 }
spinal 3:f6302af708a4 535 }
spinal 3:f6302af708a4 536
spinal 3:f6302af708a4 537 }//drawplayer
spinal 0:3c929189abce 538
spinal 0:3c929189abce 539
spinal 3:f6302af708a4 540 }
spinal 0:3c929189abce 541 }
spinal 0:3c929189abce 542
spinal 0:3c929189abce 543 // explosions
spinal 0:3c929189abce 544 stillExploding=0;
spinal 0:3c929189abce 545 for (int t = 0; t < EXPLODESPRITES; t++) {
spinal 0:3c929189abce 546 if (expU[t] == 1) {
spinal 0:3c929189abce 547 oldLev[expX[t] + LEVWIDTH * expY[t]] = 255;
spinal 0:3c929189abce 548
spinal 0:3c929189abce 549 stillExploding=1;
spinal 0:3c929189abce 550 if(expF[t]<=1){
spinal 3:f6302af708a4 551 // new2BitTile(OFF_X+(expX[t]*tileSize), OFF_Y+expY[t]*tileSize, tileSize, tileSize, 1, gbTiles, 1);
spinal 0:3c929189abce 552 }
spinal 3:f6302af708a4 553 // draw4BitTile(OFF_X+(expX[t]*tileSize), OFF_Y+expY[t]*tileSize, tileSize, tileSize, expF[t], 8, explode_tiles);
spinal 0:3c929189abce 554 if (frameNumber % EXPLODESPEED == 0) {
spinal 0:3c929189abce 555 expF[t]++;
spinal 0:3c929189abce 556 if (expF[t] == 8) {
spinal 0:3c929189abce 557 expU[t] = 0;
spinal 0:3c929189abce 558 }
spinal 0:3c929189abce 559 }
spinal 0:3c929189abce 560 }
spinal 0:3c929189abce 561 }
spinal 0:3c929189abce 562
spinal 0:3c929189abce 563
spinal 0:3c929189abce 564 print(8, 14, "SCORE LEV LIVES HISCORE",0,_pal[10]);
spinal 0:3c929189abce 565 char text[] = " ";
spinal 0:3c929189abce 566 sprintf(text, "%05d",score);
spinal 0:3c929189abce 567 print(8, 24, text,0,_pal[10]);
spinal 0:3c929189abce 568 sprintf(text, "%03d",levelNum+1);
spinal 0:3c929189abce 569 print(64, 24, text,0,_pal[10]);
spinal 0:3c929189abce 570 sprintf(text, "%02d",lives);
spinal 0:3c929189abce 571 print(104, 24, text,0,_pal[10]);
spinal 0:3c929189abce 572 sprintf(text, "%05d",hiscore);
spinal 0:3c929189abce 573 print(160, 24, text,0,_pal[10]);
spinal 0:3c929189abce 574
spinal 0:3c929189abce 575 }
spinal 0:3c929189abce 576
spinal 0:3c929189abce 577 void explodeHere(){
spinal 0:3c929189abce 578 for (int t = 0; t < EXPLODESPRITES; t++) {
spinal 0:3c929189abce 579 if (expU[t] == 0) {
spinal 0:3c929189abce 580 expX[t] = px / tileSize;
spinal 0:3c929189abce 581 expY[t] = py / tileSize;
spinal 0:3c929189abce 582 expF[t] = 0;
spinal 0:3c929189abce 583 expU[t] = 1;
spinal 0:3c929189abce 584 score++;
spinal 0:3c929189abce 585 break;
spinal 0:3c929189abce 586 }
spinal 0:3c929189abce 587 }
spinal 0:3c929189abce 588 }
spinal 0:3c929189abce 589
spinal 0:3c929189abce 590 void checkTile(int x, int y) {
spinal 0:3c929189abce 591 int t = curLev[x + LEVWIDTH * y];
spinal 0:3c929189abce 592 switch (t) {
spinal 0:3c929189abce 593 case 1:
spinal 0:3c929189abce 594 curLev[x + LEVWIDTH * y] = 0;
spinal 0:3c929189abce 595 oldLev[x + LEVWIDTH * y] = 255;
spinal 0:3c929189abce 596 oldLev[(x+1) + LEVWIDTH * y] = 255;
spinal 0:3c929189abce 597 oldLev[(x+1) + LEVWIDTH * (y+1)] = 255;
spinal 0:3c929189abce 598 oldLev[x + LEVWIDTH * (y+1)] = 255;
spinal 0:3c929189abce 599 numTiles--;
spinal 0:3c929189abce 600 explodeHere();
spinal 0:3c929189abce 601 break;
spinal 0:3c929189abce 602 case 2:
spinal 0:3c929189abce 603 curLev[x + LEVWIDTH * y] = 1;
spinal 0:3c929189abce 604 numTiles--;
spinal 0:3c929189abce 605 score++;
spinal 0:3c929189abce 606 break;
spinal 0:3c929189abce 607 }
spinal 0:3c929189abce 608 if(score > 9999) {
spinal 0:3c929189abce 609 score = 9999;
spinal 0:3c929189abce 610 }
spinal 0:3c929189abce 611 if(score > hiscore) {
spinal 0:3c929189abce 612 hiscore = score;
spinal 0:3c929189abce 613 }
spinal 0:3c929189abce 614 }
spinal 0:3c929189abce 615
spinal 0:3c929189abce 616
spinal 0:3c929189abce 617 void movePlayer() {
spinal 0:3c929189abce 618 char x = px/tileSize;
spinal 0:3c929189abce 619 char y = py/tileSize;
spinal 0:3c929189abce 620 oldLev[(x-1) + LEVWIDTH * y] = 255;
spinal 0:3c929189abce 621 oldLev[x + LEVWIDTH * y] = 255;
spinal 0:3c929189abce 622 oldLev[(x+1) + LEVWIDTH * y] = 255;
spinal 0:3c929189abce 623 oldLev[x + LEVWIDTH * (y+1)] = 255;
spinal 0:3c929189abce 624
spinal 0:3c929189abce 625 if (ps == 0) { // not moving
spinal 0:3c929189abce 626 // sneeky exit check
spinal 0:3c929189abce 627 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 10 || curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 11) {
spinal 0:3c929189abce 628 if (numTiles == 0) {
spinal 0:3c929189abce 629 levelNum++;
spinal 0:3c929189abce 630 if (levelNum >= maxLevels) {
spinal 0:3c929189abce 631 levelNum = 0;
spinal 0:3c929189abce 632 }
spinal 0:3c929189abce 633 // make sure explosions have finished :-)
spinal 0:3c929189abce 634 for (int t = 0; t < EXPLODESPRITES; t++){expU[t] = 0;}
spinal 0:3c929189abce 635 renderLevel(); refreshDisplay();
spinal 0:3c929189abce 636 loadLevel(levelNum);
spinal 0:3c929189abce 637 renderLevel(0,1);
spinal 0:3c929189abce 638 }
spinal 0:3c929189abce 639 }
spinal 0:3c929189abce 640 // sneeky water check
spinal 0:3c929189abce 641 int p = curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)];
spinal 0:3c929189abce 642 if (p == 0 || (p>=24 && p<=32)) {
spinal 0:3c929189abce 643 lives--;
spinal 0:3c929189abce 644 rumbleOn();
spinal 0:3c929189abce 645 if (lives >= 0) {
spinal 0:3c929189abce 646 explodeHere();
spinal 0:3c929189abce 647 // make sure explosions have finished :-)
spinal 0:3c929189abce 648 for(frameNumber=0; frameNumber<30; frameNumber++){
spinal 0:3c929189abce 649 if(frameNumber>=RUMBLEFRAMES){rumbleOff();}
spinal 0:3c929189abce 650 renderLevel(0); // 0 to hide player
spinal 0:3c929189abce 651 refreshDisplay();
spinal 0:3c929189abce 652 }
spinal 0:3c929189abce 653 loadLevel(levelNum);
spinal 0:3c929189abce 654 renderLevel(0,1);
spinal 0:3c929189abce 655 } else {
spinal 0:3c929189abce 656 explodeHere();
spinal 0:3c929189abce 657 // make sure explosions have finished :-)
spinal 0:3c929189abce 658 for(frameNumber=0; frameNumber<30; frameNumber++){
spinal 0:3c929189abce 659 if(frameNumber>=RUMBLEFRAMES){rumbleOff();}
spinal 0:3c929189abce 660 renderLevel(0); // 0 to hide player
spinal 0:3c929189abce 661 refreshDisplay();
spinal 0:3c929189abce 662 }
spinal 0:3c929189abce 663 gameMode = 0; // titlescreen
spinal 0:3c929189abce 664 }
spinal 0:3c929189abce 665 }
spinal 0:3c929189abce 666
spinal 0:3c929189abce 667
spinal 0:3c929189abce 668 pd = 0;
spinal 0:3c929189abce 669 // if (!_B[HELD]) {
spinal 0:3c929189abce 670 if (_Up[HELD]) {
spinal 0:3c929189abce 671 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14 && curLev[(px / tileSize) + LEVWIDTH * ((py-tileSize) / tileSize)] != 14) {
spinal 0:3c929189abce 672 pd = 1;
spinal 0:3c929189abce 673 checkTile(px / tileSize, py / tileSize);
spinal 0:3c929189abce 674 }
spinal 0:3c929189abce 675 }
spinal 0:3c929189abce 676 if (_Down[HELD]) {
spinal 0:3c929189abce 677 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14 && curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 14) {
spinal 0:3c929189abce 678 pd = 2;
spinal 0:3c929189abce 679 checkTile(px / tileSize, py / tileSize);
spinal 0:3c929189abce 680 }
spinal 0:3c929189abce 681 }
spinal 0:3c929189abce 682 if (_Left[HELD]) {
spinal 0:3c929189abce 683 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 15 && curLev[((px-tileSize) / tileSize) + LEVWIDTH * (py / tileSize)] != 15) {
spinal 0:3c929189abce 684 pd = 3;
spinal 0:3c929189abce 685 checkTile(px / tileSize, py / tileSize);
spinal 0:3c929189abce 686 }
spinal 0:3c929189abce 687 }
spinal 0:3c929189abce 688 if (_Right[HELD]) {
spinal 0:3c929189abce 689 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] != 15 && curLev[((px+tileSize) / tileSize) + LEVWIDTH * (py / tileSize)] != 15) {
spinal 0:3c929189abce 690 pd = 4;
spinal 0:3c929189abce 691 checkTile(px / tileSize, py / tileSize);
spinal 0:3c929189abce 692 }
spinal 0:3c929189abce 693 }
spinal 0:3c929189abce 694 if (_A[NEW]) {
spinal 0:3c929189abce 695 if (curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)] == 16) { // teleport
spinal 0:3c929189abce 696 int t = (px / tileSize) + LEVWIDTH * (py / tileSize);
spinal 0:3c929189abce 697 telNum = teleportMap[t];
spinal 0:3c929189abce 698 px = (telArray[telNum]%LEVWIDTH)*tileSize;
spinal 0:3c929189abce 699 py = (telArray[telNum]/LEVWIDTH)*tileSize;
spinal 0:3c929189abce 700 renderLevel(1,1);
spinal 0:3c929189abce 701 }
spinal 0:3c929189abce 702 }
spinal 0:3c929189abce 703
spinal 0:3c929189abce 704 }
spinal 0:3c929189abce 705
spinal 0:3c929189abce 706 switch (pd) {
spinal 0:3c929189abce 707 case 0:
spinal 0:3c929189abce 708 break;
spinal 0:3c929189abce 709 case 1:
spinal 0:3c929189abce 710 py-=STEPSIZE;
spinal 0:3c929189abce 711 ps+=STEPSIZE;
spinal 0:3c929189abce 712 break;
spinal 0:3c929189abce 713 case 2:
spinal 0:3c929189abce 714 py+=STEPSIZE;
spinal 0:3c929189abce 715 ps+=STEPSIZE;
spinal 0:3c929189abce 716 break;
spinal 0:3c929189abce 717 case 3:
spinal 0:3c929189abce 718 px-=STEPSIZE;
spinal 0:3c929189abce 719 ps+=STEPSIZE;
spinal 0:3c929189abce 720 break;
spinal 0:3c929189abce 721 case 4:
spinal 0:3c929189abce 722 px+=STEPSIZE;
spinal 0:3c929189abce 723 ps+=STEPSIZE;
spinal 0:3c929189abce 724 break;
spinal 0:3c929189abce 725 }
spinal 0:3c929189abce 726 if (ps == tileSize) {
spinal 0:3c929189abce 727 ps = 0; pd = 0;
spinal 0:3c929189abce 728 satTime = 0;
spinal 0:3c929189abce 729 }
spinal 0:3c929189abce 730
spinal 0:3c929189abce 731 }
spinal 0:3c929189abce 732
spinal 0:3c929189abce 733 void drawTitleScreen(){
spinal 0:3c929189abce 734 game.display.directRectangle(0,0,220,176,_pal[0]); // clear the screen
spinal 0:3c929189abce 735 draw4BitTile(4, 41, 212, 23, 0, -1, title);
spinal 0:3c929189abce 736
spinal 0:3c929189abce 737 print(40, 80, "Remade for Pokitto",0,_pal[0]);
spinal 0:3c929189abce 738 print(40, 96, " By Spinal",0,_pal[0]);
spinal 0:3c929189abce 739
spinal 0:3c929189abce 740 print(8, 136, " Original on C64 by",0,_pal[0]);
spinal 0:3c929189abce 741 print(8, 152, " Oliva Kirwa (C) 1990",0,_pal[0]);
spinal 0:3c929189abce 742
spinal 0:3c929189abce 743 for(int x=0; x<220; x++){
spinal 0:3c929189abce 744 game.display.directPixel(x,SCROLLHEIGHT,_pal[4]);
spinal 0:3c929189abce 745 game.display.directPixel(x,SCROLLHEIGHT+1,_pal[10]);
spinal 0:3c929189abce 746 game.display.directPixel(x,SCROLLHEIGHT+2,_pal[15]);
spinal 0:3c929189abce 747 game.display.directPixel(x,SCROLLHEIGHT+11,_pal[15]);
spinal 0:3c929189abce 748 game.display.directPixel(x,SCROLLHEIGHT+12,_pal[10]);
spinal 0:3c929189abce 749 game.display.directPixel(x,SCROLLHEIGHT+13,_pal[4]);
spinal 0:3c929189abce 750 }
spinal 0:3c929189abce 751
spinal 0:3c929189abce 752 gameMode=1;
spinal 0:3c929189abce 753 }
spinal 0:3c929189abce 754
spinal 0:3c929189abce 755 void titleScreen(){
spinal 0:3c929189abce 756 char text1[34];
spinal 0:3c929189abce 757 memcpy(text1, &text[myInt],33);
spinal 0:3c929189abce 758 text1[32]=0;
spinal 0:3c929189abce 759 //titleprint(-scroller, 6 , text1);
spinal 0:3c929189abce 760 print(-scroller, SCROLLHEIGHT+3, text1,0,_pal[14]);
spinal 0:3c929189abce 761 if(frameNumber%3==0){
spinal 0:3c929189abce 762 scroller++;
spinal 0:3c929189abce 763 if(scroller==8){
spinal 0:3c929189abce 764 scroller=0;
spinal 0:3c929189abce 765 myInt++;
spinal 0:3c929189abce 766 if(myInt==strlen(text)){myInt=0;}
spinal 0:3c929189abce 767 }
spinal 0:3c929189abce 768 }
spinal 0:3c929189abce 769
spinal 0:3c929189abce 770 if(_A[NEW]){
spinal 0:3c929189abce 771 lives = 5;
spinal 0:3c929189abce 772 score = 0;
spinal 0:3c929189abce 773 levelNum = 0;
spinal 0:3c929189abce 774 gameMode = 10;
spinal 0:3c929189abce 775 game.display.directRectangle(0,0,220,176,0x0000); // clear the screen
spinal 0:3c929189abce 776 }
spinal 0:3c929189abce 777
spinal 0:3c929189abce 778 }
spinal 0:3c929189abce 779
spinal 0:3c929189abce 780 void playLevel(){
spinal 0:3c929189abce 781
spinal 0:3c929189abce 782 movePlayer();
spinal 0:3c929189abce 783
spinal 0:3c929189abce 784 // sit still too long at your peril!
spinal 0:3c929189abce 785 if (pd == 0) {
spinal 0:3c929189abce 786 satTime++;
spinal 0:3c929189abce 787 int t=curLev[(px / tileSize) + LEVWIDTH * (py / tileSize)];
spinal 0:3c929189abce 788 char satCount = 16;
spinal 0:3c929189abce 789 if(t==2) satCount = 8;
spinal 0:3c929189abce 790
spinal 0:3c929189abce 791 if(satTime == satCount) {
spinal 0:3c929189abce 792 checkTile(px / tileSize, py / tileSize);
spinal 0:3c929189abce 793 satTime = 0;
spinal 0:3c929189abce 794 }
spinal 0:3c929189abce 795 }
spinal 0:3c929189abce 796
spinal 0:3c929189abce 797 renderLevel();
spinal 0:3c929189abce 798
spinal 0:3c929189abce 799 }
spinal 0:3c929189abce 800
spinal 3:f6302af708a4 801 void update_buffer(){
spinal 3:f6302af708a4 802 /*
spinal 3:f6302af708a4 803 // Fill the next buffer if it is not used currently
spinal 3:f6302af708a4 804 if((uint32_t)currentBuffer != nextBufferIndexToFill) {
spinal 3:f6302af708a4 805
spinal 3:f6302af708a4 806 for(uint32_t t=0; t<BUFFER_SIZE; t++){
spinal 3:f6302af708a4 807 buffers[nextBufferIndexToFill][t] = mixSound(t);
spinal 3:f6302af708a4 808 }
spinal 3:f6302af708a4 809 if(++nextBufferIndexToFill > 3)
spinal 3:f6302af708a4 810 nextBufferIndexToFill = 0;
spinal 3:f6302af708a4 811 }
spinal 3:f6302af708a4 812 */
spinal 3:f6302af708a4 813 char sndOffset[]={2,3,0,1};
spinal 3:f6302af708a4 814
spinal 3:f6302af708a4 815 if((uint32_t)currentBuffer != nextBufferIndexToFill) {
spinal 3:f6302af708a4 816 for(uint32_t t=0; t<BUFFER_SIZE; t++){
spinal 3:f6302af708a4 817 nextBufferIndexToFill = currentBuffer;
spinal 3:f6302af708a4 818 buffers[sndOffset[nextBufferIndexToFill]][t] = mixSound(t);
spinal 3:f6302af708a4 819 }
spinal 3:f6302af708a4 820 }
spinal 3:f6302af708a4 821
spinal 3:f6302af708a4 822 }
spinal 0:3c929189abce 823
spinal 0:3c929189abce 824 int main(){
spinal 3:f6302af708a4 825
spinal 3:f6302af708a4 826
spinal 0:3c929189abce 827 rumbleOff(); // just in case
spinal 0:3c929189abce 828
spinal 0:3c929189abce 829 game.begin();
spinal 0:3c929189abce 830 game.display.width = 220; // full size
spinal 0:3c929189abce 831 game.display.height = 174;
spinal 3:f6302af708a4 832
spinal 3:f6302af708a4 833 // Set global audio variables
spinal 3:f6302af708a4 834 currentBuffer = 0;
spinal 3:f6302af708a4 835 currentPtr = buffers[currentBuffer];
spinal 3:f6302af708a4 836 endPtr = currentPtr + BUFFER_SIZE;
spinal 3:f6302af708a4 837
spinal 3:f6302af708a4 838 // Init audio stream.
spinal 3:f6302af708a4 839 pokPlayStream(); // activate stream
spinal 0:3c929189abce 840 game.sound.ampEnable(true);
spinal 3:f6302af708a4 841 game.sound.playMusicStream();
spinal 3:f6302af708a4 842
spinal 0:3c929189abce 843
spinal 0:3c929189abce 844 gameMode = 0; // titleScreen
spinal 0:3c929189abce 845 tempTime = game.getTime();
spinal 0:3c929189abce 846
spinal 3:f6302af708a4 847
spinal 3:f6302af708a4 848 sounder.attach(&update_tune, 0.05);
spinal 3:f6302af708a4 849 sounder1.attach(&update_buffer, 0.0075);
spinal 3:f6302af708a4 850
spinal 0:3c929189abce 851 while (game.isRunning()) {
spinal 3:f6302af708a4 852 //update_buffer();
spinal 3:f6302af708a4 853
spinal 0:3c929189abce 854 // if it is time to update the screen
spinal 0:3c929189abce 855 // if (game.update(true)){
spinal 0:3c929189abce 856
spinal 3:f6302af708a4 857 //game.sound.updateStream();
spinal 0:3c929189abce 858
spinal 0:3c929189abce 859 myPad = updateButtons(myPad);
spinal 0:3c929189abce 860 UpdatePad(myPad);
spinal 0:3c929189abce 861
spinal 0:3c929189abce 862 frameNumber++;
spinal 3:f6302af708a4 863
spinal 3:f6302af708a4 864 // if(frameNumber %3 == 0) update_tune();
spinal 3:f6302af708a4 865
spinal 3:f6302af708a4 866
spinal 3:f6302af708a4 867 //char oldMode = gameMode;
spinal 0:3c929189abce 868 switch(gameMode){
spinal 0:3c929189abce 869 case 0:
spinal 0:3c929189abce 870 drawTitleScreen();
spinal 0:3c929189abce 871 break;
spinal 0:3c929189abce 872 case 1:
spinal 0:3c929189abce 873 levelNum = 0;
spinal 3:f6302af708a4 874 myDelay = 5;
spinal 0:3c929189abce 875 titleScreen();
spinal 0:3c929189abce 876 break;
spinal 0:3c929189abce 877 case 10:
spinal 0:3c929189abce 878 // start new game.
spinal 0:3c929189abce 879 loadLevel(levelNum);
spinal 0:3c929189abce 880 renderLevel(0,1);
spinal 0:3c929189abce 881 gameMode = 20;
spinal 0:3c929189abce 882 break;
spinal 0:3c929189abce 883 case 20:
spinal 0:3c929189abce 884 // play levels
spinal 3:f6302af708a4 885 myDelay = 15;
spinal 0:3c929189abce 886 playLevel();
spinal 0:3c929189abce 887 break;
spinal 0:3c929189abce 888 }
spinal 0:3c929189abce 889
spinal 0:3c929189abce 890 // timing loop
spinal 0:3c929189abce 891 while(game.getTime()-tempTime < myDelay){
spinal 0:3c929189abce 892 };
spinal 3:f6302af708a4 893 refreshDisplay();
spinal 0:3c929189abce 894 tempTime = game.getTime();
spinal 0:3c929189abce 895 // } // update
spinal 0:3c929189abce 896 }
spinal 0:3c929189abce 897 return 1;
spinal 0:3c929189abce 898 }