nice puzzle game
main.cpp@3:f6302af708a4, 2018-11-18 (annotated)
- 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?
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 | 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 | } |