#include #include #include #include "game.h" #include "tiles.h" unsigned int playerx=155,playery=210,seed; int lastp=239,jumpp=0,running=0; char buffer[24][24]; long score=0; inline void setPixel(int x, int y, int color) { if(x>=0&&x<320&&y>=0&&y<240&&color>=0&&color<=15) { unsigned char* p = (unsigned char*)(SCREEN_BASE_ADDRESS + ((x >> 1) + (y << 7) + (y << 5))); *p = (x & 1) ? ((*p & 0xF0) | color) : ((*p & 0x0F) | (color << 4)); } } inline int getPixel(int x, int y) { if(x>=0&&x<320&&y>=0&&y<240) { unsigned char* p = (unsigned char*)(SCREEN_BASE_ADDRESS + ((x >> 1) + (y << 7) + (y << 5))); return ((x & 1) ? (*p & 0x0F) : (*p >> 4)); } return 0; } void init() { int i,j; for(i=0; i<240; i++) { for(j=0; j<320; j++) { if(getPixel(j,i)!=0) setPixel(j,i,15); } } for(i=0; i<37; i++) { playery++; refresh(); sleep(10); } running=1; } void move(int dir) { int i,j; char* addr=(char*)SCREEN_BASE_ADDRESS; for(i=0; i<24; i++) { if(playery+i<240) { if(playerx&1) { memset(addr+playery*160+i*160+playerx/2+1,255,11); setPixel(playerx,playery+i,15); setPixel(playerx+23,playery+i,15); } else memset(addr+playery*160+i*160+playerx/2,255,12); } } if(dir==4&&playerx>0) { for(i=0; i<24; i++) { for(j=0; j<24; j++) { if(buffer[j][i]==0) setPixel(playerx+j,playery+i,0); } } for(i=0; i<24; i++) { for(j=22; j>=0; j--) buffer[j+1][i]=buffer[j][i]; } playerx--; for(i=0; i<24; i++) buffer[0][i]=getPixel(playerx,playery+i); } else if(dir==6&&playerx<295) { for(i=0; i<24; i++) { // if(buffer[0][i]==0) // setPixel(playerx,playery+i,0); for(j=0; j<24; j++) { if(buffer[j][i]==0) setPixel(playerx+j,playery+i,0); } } for(i=0; i<24; i++) { for(j=1; j<24; j++) buffer[j-1][i]=buffer[j][i]; } playerx++; for(i=0; i<24; i++) buffer[23][i]=getPixel(playerx+23,playery+i); } else if(dir==8) { for(i=0; i<24; i++) { for(j=0; j<24; j++) { if(buffer[i][j]==0) setPixel(playerx+i,playery+j,0); } } for(i=22; i>=0; i--) { for(j=0; j<24; j++) buffer[j][i+1]=buffer[j][i]; } if(playery>100) playery--; else refresh(); for(i=0; i<24; i++) buffer[i][0]=getPixel(playerx+i,playery); } else if(dir==5) { for(i=0; i<24; i++) { for(j=0; j<24; j++) { if(buffer[i][j]==0) setPixel(playerx+i,playery+j,0); } } for(i=1; i<24; i++) { for(j=0; j<24; j++) buffer[j][i-1]=buffer[j][i]; } playery++; for(i=0; i<24; i++) buffer[i][23]=getPixel(playerx+i,playery+23); } // for(i=0; i<24; i++) // { // for(j=0; j<24; j++) // setPixel(playerx+j,playery+i,0); // } for(i=0; i<24; i++) { if(playery+i<240) { for(j=0; j<23; j+=2) { if((Player[i][j/2]&0xF0)!=0xF0) setPixel(playerx+j,playery+i,(Player[i][j/2]>>4)); if((Player[i][j/2]&0x0F)!=0x0F) setPixel(playerx+j+1,playery+i,(Player[i][j/2]&0x0F)); } } } } int autom() { if((getPixel(playerx,playery+24)==0||getPixel(playerx+23,playery+24)==0)&&playery<216&&jumpp<1) jumpp=80; if(jumpp>0) move(8); else move(5); if(jumpp>-80) jumpp--; if(playery>240) gameover(); return jumpp; } void refresh() { char* addr=(char*)SCREEN_BASE_ADDRESS; memmove(addr+160,addr,38240); memset(addr,255,160); score++; int i,j,k,score2=score; for(k=0; score2>=1; k++) { for(i=0; i<5; i++) { for(j=0; j<8; j++) setPixel(310+i-7*k,12-j,!((Numbers8x5[score2%10][i]>>(7-j))&1)*15); } score2=score2/10; } lastp++; genplat(); } int random(int max,int min) { long int hi = seed / 44488; long int lo = seed % 44488; seed = 48271 * lo - 3399 * hi; if (seed <= 0) seed += 2147483647; return (seed / (2147483646 / (max-min))%(max-min)+min); } void genplat() { int x,y,i,end=0; char* addr=(char*)SCREEN_BASE_ADDRESS; while(end==0&&lastp>65) { x=random(280,0); y=random(45,20); for(i=0; i<8; i++) memcpy(addr+(lastp*160-(i*160+y*160))+x/2,Platforms[i],20); if(lastp-y<227) lastp-=y; else end=1; } } void gameover() { unsigned int i,j,l,k,newscore=0,score2,sc[10][11]= {0}; FILE *scores; // char* addr=(char*)SCREEN_BASE_ADDRESS; // for(i=0; i<240; i++) // { // sleep(5); // memmove(addr,addr+160,38240); // memset(addr+38240,255,160); // } scores=fopen ("Highscores.tns","r+"); if(scores==NULL) scores=fopen ("Highscores.tns","w+"); for(i=0; i<10; i++) fgets (sc[i] , 10 , scores); rewind (scores); for(i=0; i<10; i++) { if(score>atoi(sc[i])) { if(i==0) newscore=1; fprintf (scores, "%u\n",score); for(; i<10; i++) fputs (sc[i],scores); } fputs (sc[i],scores); } fclose (scores); running=0; char* addr=(char*)SCREEN_BASE_ADDRESS; char bufferl[200][160]= {0}; for(i=0; i<160; i++) { for(j=0; j<200; j++) { bufferl[j][i]=255; } } for(i=0; i<160; i++) { for(j=0; j<20; j++) { bufferl[j][i]=0x88; } } for(i=0; i<160; i++) { for(j=57; j<78; j++) { bufferl[j][i]=0x88; } } for(i=0; i<160; i++) { for(j=130; j<196; j++) { bufferl[j][i]=0x88; } } for(j=0; j<200; j++) { bufferl[j][0]=0x00; } for(j=0; j<200; j++) { bufferl[j][159]=0x00; } for(j=0; j<200; j++) { bufferl[j][158]=0xF0; } for(j=0; j<200; j++) { bufferl[j][1]=0x0F; } for(i=0; i<160; i++) { for(j=197; j<200; j++) { bufferl[j][i]=0; } } char strover[9]= {'G','a','m','e',' ','O','v','e','r'}; for(l=0; l<9; l++) { for(i=0; i<32; i++) { for(j=0; j<19; j+=2) { bufferl[55-i][(50+j+l*24)/2]=!((Numbers8x5[strover[l]-48][j/4]>>(7-i/4))&1)*15+((!((Numbers8x5[strover[l]-48][j/4]>>(7-i/4))&1)*15)<<4); } } } if(newscore==1) { char strscore[13]= {'N','e','w',' ','H','i','g','h','s','c','o','r','e'}; for(i=2; i<158; i++) { for(j=130; j<156; j++) { bufferl[j][i]=0xFF; } } for(l=0; l<13; l++) { for(i=0; i<16; i++) { for(j=0; j<9; j+=2) { bufferl[145-i][(120+j+l*12)/2]=!((Numbers8x5[strscore[l]-48][j/2]>>(7-i/2))&1)*15+((!((Numbers8x5[strscore[l]-48][j/2]>>(7-i/2))&1)*15)<<4); } } } } score2=score; for(k=0; score2>=1; k++) { for(i=0; i<32; i++) { for(j=0; j<19; j+=2) bufferl[120-i][(270+j-28*k)/2]=!((Numbers8x5[score2%10][j/4]>>(7-i/4))&1)*15+((!((Numbers8x5[score2%10][j/4]>>(7-i/4))&1)*15)<<4); } score2=score2/10; } for(j=1; j<200; j++) { memmove(addr+160*j,bufferl[j],160); sleep(5); } for(i=200; i<203; i++) { for(j=0; j<320; j++) setPixel(j,i,0); } char strreturn[13]= {'P','r','e','s','s','_','a','n','y','_','K','e','y'}; for(i=0; i<37; i++) memset(addr+160*(203+i),0xFF,160); for(l=0; l<13; l++) { for(i=0; i<10; i++) { for(j=0; j<16; j++) setPixel(70+i+14*l,230-j,!((Numbers8x5[strreturn[l]-48][i/2]>>(7-j/2))&1)*15); } } score=0; wait_key_pressed(); //init(); } int menu() { int sel=0,selx=10,i,j,l; unsigned int *RTC = (unsigned int *) 0x90090000; seed=*RTC; playerx=155; playery=175; lastp=170; score=0; jumpp=0; running=0; for(i=0; i<24; i++) { for(j=0; j<24; j++) buffer[i][j]=0xFF; } char* addr=(char*)SCREEN_BASE_ADDRESS; char strplay[4]= {'P','l','a','y'}; char strscore[5]= {'S','c','o','r','e'}; char strexit[4]= {'E','x','i','t'}; for(i=0; i<6; i++) memset(addr+i*6400,i+10+((i+10)<<4),6400); genplat(); autom(); for(i=0; i<200; i++) { for(j=0; j<320; j++) { if(getPixel(j,i)==15) setPixel(j,i,14); } } memset(addr+32000,0,480); for(l=0; l<4; l++) { for(i=0; i<10; i++) { for(j=0; j<16; j++) setPixel(35+i+14*l,230-j,!((Numbers8x5[strplay[l]-48][i/2]>>(7-j/2))&1)*15); } } for(l=0; l<5; l++) { for(i=0; i<10; i++) { for(j=0; j<16; j++) setPixel(128+i+14*l,230-j,!((Numbers8x5[strscore[l]-48][i/2]>>(7-j/2))&1)*15); } } for(l=0; l<4; l++) { for(i=0; i<10; i++) { for(j=0; j<16; j++) setPixel(235+i+14*l,230-j,!((Numbers8x5[strexit[l]-48][i/2]>>(7-j/2))&1)*15); } } wait_no_key_pressed(); while(1) { for(i=0; i<3; i++) { for(j=0; j<100; j++) setPixel(selx+j,235+i,15); } if((isKeyPressed(KEY_NSPIRE_LEFT)||isKeyPressed(KEY_NSPIRE_4))&&sel>0) { sel--; selx-=100; wait_no_key_pressed(); } if((isKeyPressed(KEY_NSPIRE_RIGHT)||isKeyPressed(KEY_NSPIRE_6))&&sel<2) { sel++; selx+=100; wait_no_key_pressed(); } if(isKeyPressed(KEY_NSPIRE_ENTER)||isKeyPressed(KEY_NSPIRE_5)) { return sel; } for(i=0; i<3; i++) { for(j=0; j<100; j++) setPixel(selx+j,235+i,0); } wait_key_pressed(); } } int game() { return running; } void highscore() { int i,j,k,l,score2,sc[10][11]= {0}; char bufferl[200][160]= {0}; for(i=0; i<160; i++) { for(j=0; j<200; j++) { bufferl[j][i]=255; } } for(j=0; j<200; j++) { bufferl[j][0]=0x00; } for(j=0; j<200; j++) { bufferl[j][1]=0x0F; } for(i=0; i<160; i++) { for(j=0; j<3; j++) { bufferl[j][i]=0; } } for(i=0; i<160; i++) { for(j=197; j<200; j++) { bufferl[j][i]=0; } } char* addr=(char*)SCREEN_BASE_ADDRESS; char strscore[9]= {'H','i','g','h','s','c','o','r','e'}; char strreturn[13]= {'P','r','e','s','s','_','a','n','y','_','K','e','y'}; for(l=0; l<9; l++) { for(i=0; i<16; i++) { for(j=0; j<9; j+=2) { bufferl[30-i+19*l][(15+j)/2]=!((Numbers8x5[strscore[l]-48][j/2]>>(7-i/2))&1)*15+((!((Numbers8x5[strscore[l]-48][j/2]>>(7-i/2))&1)*15)<<4); } } } FILE *scores; scores=fopen ("Highscores.tns","r"); if(scores!=NULL) { for(i=0; i<10; i++) fgets (sc[i] , 10 , scores); score2=atoi (sc[0]); for(k=0; score2>=1; k++) { for(i=0; i<32; i++) { for(j=0; j<19; j+=2) bufferl[42-i][(282+j-28*k)/2]=!((Numbers8x5[score2%10][j/4]>>(7-i/4))&1)*15+((!((Numbers8x5[score2%10][j/4]>>(7-i/4))&1)*15)<<4); } score2=score2/10; } score2=atoi (sc[1]); for(k=0; score2>=1; k++) { for(i=0; i<24; i++) { for(j=0; j<15; j+=2) bufferl[68-i][(286+j-20*k)/2]=!((Numbers8x5[score2%10][(j+1)/3]>>(7-i/3))&1)*15+((!((Numbers8x5[score2%10][j/3]>>(7-i/3))&1)*15)<<4); bufferl[68-i][(286+14-20*k)/2]=(bufferl[68-i][(286+14-20*k)/2])|0x0F; } score2=score2/10; } for(l=2; l<9; l++) { score2=atoi (sc[l]); for(k=0; score2>=1; k++) { for(i=0; i<16; i++) { for(j=0; j<9; j+=2) bufferl[51-i+18*l][(290+j-14*k)/2]=!((Numbers8x5[score2%10][j/2]>>(7-i/2))&1)*15+((!((Numbers8x5[score2%10][j/2]>>(7-i/2))&1)*15)<<4); } score2=score2/10; } } } fclose (scores); for(i=1; i<=160; i++) { for(j=0; j<200; j++) { memmove(addr+160-i+160*j,bufferl[j],i); } sleep(5); } for(i=0; i<37; i++) memset(addr+160*(203+i),0xFF,160); for(l=0; l<13; l++) { for(i=0; i<10; i++) { for(j=0; j<16; j++) setPixel(70+i+14*l,230-j,!((Numbers8x5[strreturn[l]-48][i/2]>>(7-j/2))&1)*15); } } wait_key_pressed(); for(i=1; i<=160; i++) { for(j=0; j<200; j++) { memmove(addr+i+160*j,bufferl[j],160-i); memset(addr+160*j,j/40+10+((j/40+10)<<4),i); } sleep(5); } } int showscore() { return score; }