diff --git a/sjump.c b/sjump.c index 0e3ca7d..efe3bb1 100755 --- a/sjump.c +++ b/sjump.c @@ -1,22 +1,35 @@ /* - _ -| '. -| : -|.' ARRT + _ ___ +(_' | +._)QUARE (_:UMP Authored by abakh To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see . */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "config.h" #include "common.h" -#define SAVE_TO_NUM 11 +#define SAVE_TO_NUM 10 #define LEN 24 #define HLEN LEN/2 #define WID 80 #define HWID WID/2 +#define SIZE 12 #define SHOTS_WHEN_STARTING 10 - +#define DELAY 50000 +#define byte int #define randint(a,b) ((a)+(rand()%((b+1)-(a)))) #ifdef Plan9 int usleep(long usec) { @@ -31,9 +44,9 @@ int usleep(long usec) { #endif // 12 lines of water // 80 columns - -chtype colors[3]={0}; -long score=0; +enum {LOSE,WIN}; +chtype colors[5]={0}; +long score=0,jumps=0; FILE* scorefile; chtype background[LEN][WID]; @@ -43,20 +56,13 @@ char msg[150]={0}; byte msg_show=0; bool timed[3]; -byte circlex[3]; -byte circley[3]; +byte squarex[3]; +byte squarey[3]; byte loops_left=0; -float shooting_angle=0; +int oy=0; +int ox=0; float rotation_angle=0; - -byte digit_count(int num){ - byte ret=0; - do{ - ++ret; - num/=10; - }while(num); - return ret; -} +int combo=1; void filled_rect(byte sy,byte sx,byte ey,byte ex){ byte y,x; for(y=sy;y0){ - byte a = (LEN-9)/2; - star_line(1); - star_line(LEN-2); - mvaddstr(1,WID/2-8,"CONGRATULATIONS!!"); - mvprintw(a+1,HWID-10," _____ You bet the"); - mvprintw(a+2,HWID-10," .' | previous"); - mvprintw(a+3,HWID-10," .' | record"); - mvprintw(a+4,HWID-10," | .| | of"); - mvprintw(a+5,HWID-10," |.' | |%11ld",formerscore); - mvprintw(a+6,HWID-10," | | held by"); - mvprintw(a+7,HWID-10," ___| |___%7s!",formername); - mvprintw(a+8,HWID-10," | |"); - mvprintw(a+9,HWID-10," |____________|"); - mvprintw(LEN-3,HWID-11,"Press a key to continue"); - refresh(); - do{ - input=getch(); - }while((input==KEY_UP||input=='w') || (input==KEY_DOWN||input=='s')); - filled_rect(0,0,LEN,WID); - red_border(); + fscanf(score_file,"%*s : %*d\n"); + move(4,0); + byte b=0; + if ( fscanf(score_file,"%s : %ld\n",formername,&formerscore)==2){ + halfdelay(1); + printw("*****CONGRATULATIONS!****\n"); + printw(" You beat the\n"); + printw(" previous\n"); + printw(" record\n"); + printw(" of\n"); + printw(" %14ld\n",formerscore); + printw(" held by\n"); + printw(" %11s\n",formername); + printw(" \n"); + printw(" \n"); + printw("*************************\n"); + printw("Press a key to proceed:"); + Effect: + move(4,0); + mvprintw(4,0, " _____ "); + mvprintw(5,0, " .' |"); + mvprintw(6,0, " .' |"); + mvprintw(7,0, " | .| |"); + mvprintw(8,0, " |.' | |"); + mvprintw(9,0, " | |"); + mvprintw(10,0," ___| |___"); + mvprintw(11,0," | |"); + mvprintw(12,0," |____________|"); + b=(b+1)%6; + if(getch()==ERR) + goto Effect; + nocbreak(); + cbreak(); + erase(); + logo(0,0); } - } //scorefile is still open with w+ + move(4,0); char pname[60] = {0}; long pscore=0; byte rank=0; - rewind(score_file); - mvaddstr(1,WID/2-4,"HIGH SCORES"); - attron(colors[3]); + rewind(score_file); + printw(">*>*>Top %d<*<*<\n",SAVE_TO_NUM); while( rank>>"); - printw("%s",pname); - mvprintw(2+2*rank,WID-1-digit_count(pscore),"%d",pscore); + printw("%d) %s : %ld\n",rank+1,pname,pscore); ++rank; } + addch('\n'); refresh(); } + + +void draw_square(byte sy,byte sx){ + for(byte y=0;y--- + //| | + //^ V + //| | + //----<--- + +} +void draw_angle(byte sy,byte sx){ + int y=sy+oy; + int x=sx+ox; + attron(colors[0]); + mvaddch(y,x,'O'); + attroff(colors[0]); +} +void draw(int sy,int sx){ + for(byte i=0;i<3;++i){ + draw_square(sy+squarey[i],sx+squarex[i]); + } + logo(); +} + +byte shooting_scene(){ + float dy=(oy-(SIZE/2))/(float)SIZE; + float dx=(ox-(SIZE))/(float)(SIZE*2); + dy/=2;//it was too hard :( + float y=squarey[0]+oy; + float x=squarex[0]+ox; + float offsetx=0; + float offsety=0; + float doffsety=0; + float doffsetx=-dx*2; + byte reached_o=0; + while(1){ + erase(); + draw(offsety,offsetx); + if(round(x)<=-round(offsetx)+1){//slow the animation + reached_o=1; + } + attron(colors[0]); + mvaddch(round(y)+round(offsety),round(x)+round(offsetx),'O'); + attroff(colors[0]); + for(byte i=0;i<1;i++){ + y+=dy; + x+=dx; + offsety+=doffsety; + if(reached_o){ + offsetx=-x; + } + else{ + offsetx+=doffsetx; + } + + if( y>=LEN-1 || y<=1|| x> squarex[1]+SIZE*3 || x<-SIZE){ + combo=1; + return LOSE; + } + if(y>=squarey[1] && x>=squarex[1] && y<=squarey[1]+SIZE && round(x)<=squarex[1]+SIZE*2){ + if(round(y)==squarey[1] || round(y)==squarey[1]+SIZE){ + score+=combo*101; + } + else{ + score+=combo; + } + combo++; + jumps++; + oy=round(y)-squarey[1]; + ox=round(x)-squarex[1]; + for(byte i=0;i<3;++i){ + squarey[i]+=offsety; + squarex[i]+=offsetx; + } + squarey[0]=squarey[1]; + squarex[0]=squarex[1]; + squarey[1]=squarey[2]; + squarex[1]=squarex[2]; + squarex[2]=squarex[1]+WID-SIZE; + squarey[2]=5+ (rand()%(LEN-(5+SIZE))); + //since square 0 always ends up at the center after the animation, + //square 2 should be choosen in a way that it would still remain + //in the screen after the animation in which it becomes square 1. + return WIN; + } + } + refresh(); + if(reached_o){ + usleep(DELAY/6); + } + else{ + usleep(DELAY/3); + } + } +} void help(void){ nocbreak(); cbreak(); @@ -229,9 +319,7 @@ void help(void){ filled_rect(0,0,LEN,WID); red_border(); mvprintw(1,HWID-4,"GAME PLAY"); - mvprintw(3,1,"If you hit a letter on keyboard, the letter on the"); - mvprintw(4,1,"screen will soon stop. You have to aim for the"); - mvprintw(5,1,"center of the target using the moving letters."); + mvprintw(3,1,"Jump from square to square."); attroff(colors[3]); refresh(); getch(); @@ -251,53 +339,63 @@ int main(void){ srand(time(NULL)%UINT_MAX); if(has_colors()){ start_color(); - init_pair(1,COLOR_RED,COLOR_BLACK); - init_pair(2,COLOR_YELLOW,COLOR_BLACK); - init_pair(3,COLOR_GREEN,COLOR_BLACK); - for(byte b=0;b<3;++b) + use_default_colors(); + init_pair(1,COLOR_RED,-1); + init_pair(2,COLOR_YELLOW,-1); + init_pair(3,COLOR_GREEN,-1); + init_pair(4,COLOR_MAGENTA,-1); + init_pair(5,COLOR_BLUE,-1); + + for(byte b=0;b<5;++b) colors[b]=COLOR_PAIR(b+1); } - - make_background(); Start: + oy=ox=0; + squarey[0]=5; + squarex[0]=0; + squarey[1]=5; + squarex[1]=squarex[0]+WID-SIZE; + squarey[2]=5; + squarex[2]=squarex[1]+WID-SIZE; erase(); - halfdelay(1); + nodelay(stdscr,1); curs_set(0); score=0; msg_show=0; - aims_to_stop=shots=SHOTS_WHEN_STARTING; - fill_aims(); while(1){ - draw(); + erase(); + draw(0,0); + draw_angle(squarey[0],squarex[0]); refresh(); input=getch(); - + move_o(); if(input=='?' || input==KEY_F(1)) help(); - if(input=='Q'){ - strcpy(msg,"Ctrl-C to quit."); - msg_show=50; - } - if(input!=ERR){ - usleep(100000); - flushinp(); - } - if(!aims_to_stop){ + if(input=='q'){ break; } - for(int i=0;i<26;++i){ - move_aim(aims+i); + if(input=='\n'||input==KEY_ENTER){ + if(shooting_scene()==LOSE){ + break; + } + } + usleep(DELAY); + if(input!=ERR){ + flushinp(); } } + nodelay(stdscr,0); flushinp(); nocbreak(); cbreak(); curs_set(1); - end_scene(); + + mvprintw(LEN,0,"Press a key to see the high scores:"); + refresh(); + getch(); + show_scores(save_score()); - attron(colors[0]|A_STANDOUT); - mvprintw(LEN-1,HWID-11,"Wanna play again? (y/n)"); - attroff(colors[0]|A_STANDOUT); + printw("\n\nWanna play again? (y/n)"); do{ input=getch(); }while((input==KEY_UP||input=='w') || (input==KEY_DOWN||input=='s'));