1
0
mirror of https://github.com/abakh/nbsdgames.git synced 2024-12-04 14:46:22 -05:00

improved handling of the scorefiles

This commit is contained in:
Your Name 2021-04-24 13:11:43 +04:30
parent 0035eb5238
commit 375d551487
8 changed files with 159 additions and 390 deletions

76
common.h Normal file
View File

@ -0,0 +1,76 @@
/*
Authored by abakh <abakh@tuta.io>
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 <http://creativecommons.org/publicdomain/zero/1.0/>.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
#include "config.h"
#define FOPEN_FAIL -10
typedef signed char byte;
FILE* score_file;
byte score_write(const char* path, long wscore, byte save_to_num){// only saves the top 10, returns the place in the chart
score_file=fopen(path,"r");
if(!score_file){
score_file=fopen(path,"w");
if(!score_file){
return FOPEN_FAIL;
}
}
char name_buff[save_to_num][60];
long score_buff[save_to_num];
memset(name_buff,0,save_to_num*60*sizeof(char) );
memset(score_buff,0,save_to_num*sizeof(long) );
long scanned_score =0;
char scanned_name[60]={0};
byte location=0;
while( fscanf(score_file,"%59s : %ld\n",scanned_name,&scanned_score) == 2 && location<save_to_num){
strcpy(name_buff[location],scanned_name);
score_buff[location] = scanned_score;
++location;//so it doesn't save more scores than intented
memset(scanned_name,0,60);
scanned_score=0;
}
score_file = fopen(path,"w+") ;//will get rid of the previous text
byte scores_count=location;//if 5 scores were scanned, it is 5. the number of scores it reached
byte ret = -1;
bool wrote_it=0;
for(byte i=0;i<=scores_count && i<save_to_num-wrote_it;++i){
if(!wrote_it && (i>=scores_count || wscore>=score_buff[i]) ){
fprintf(score_file,"%s : %ld\n",getenv("USER"),wscore);
ret=i;
wrote_it=1;
}
if(i<save_to_num-wrote_it && i<scores_count){
fprintf(score_file,"%s : %ld\n",name_buff[i],score_buff[i]);
}
}
fflush(score_file);
return ret;
}
byte fallback_to_home(const char* name,long wscore,byte save_to_num){// only saves the top 10, returns the place in the chart
byte ret;
char full_path[1000]={0};
snprintf(full_path,1000,"%s/%s",SCORES_DIR,name);
ret=score_write(full_path,wscore,save_to_num);
if(ret==FOPEN_FAIL){
snprintf(full_path,1000,"%s/.%s",getenv("HOME"),name);
ret=score_write(full_path,wscore,save_to_num);
}
return ret;
}

View File

@ -2,19 +2,15 @@
//the default scorefiles //the default scorefiles
#ifdef Plan9 #ifdef Plan9
#define PP_SCORES "/sys/lib/games/pp_scores" #define SCORES_DIR "/sys/lib/games/"
#define JW_SCORES "/sys/lib/games/jw_scores"
#define FSH_SCORES "/sys/lib/games/fsh_scores"
#define MNCH_SCORES "/sys/lib/games/mnch_scores"
#define MT_SCORES "/sys/lib/games/mt_scores"
#define DRT_SCORES "/sys/lib/games/drt_scores"
#else #else
#define PP_SCORES "/usr/games/pp_scores" #define SCORES_DIR "/var/games/"
/* #define PP_SCORES "/usr/games/pp_scores"
#define JW_SCORES "/usr/games/jw_scores" #define JW_SCORES "/usr/games/jw_scores"
#define FSH_SCORES "/usr/games/fsh_scores" #define FSH_SCORES "/usr/games/fsh_scores"
#define MNCH_SCORES "/usr/games/mnch_scores" #define MNCH_SCORES "/usr/games/mnch_scores"
#define MT_SCORES "/usr/games/mt_scores" #define MT_SCORES "/usr/games/mt_scores"
#define DRT_SCORES "/usr/games/drt_scores" #define DRT_SCORES "/usr/games/drt_scores"*/
#endif #endif
#ifdef Plan9 #ifdef Plan9

76
darrt.c
View File

@ -21,6 +21,7 @@ You should have received a copy of the CC0 Public Domain Dedication along with t
#include <curses.h> #include <curses.h>
#include <unistd.h> #include <unistd.h>
#include "config.h" #include "config.h"
#include "common.h"
#define SAVE_TO_NUM 11 #define SAVE_TO_NUM 11
#define LEN 24 #define LEN 24
#define HLEN LEN/2 #define HLEN LEN/2
@ -46,7 +47,6 @@ int usleep(long usec) {
chtype colors[3]={0}; chtype colors[3]={0};
long score=0; long score=0;
char error [150]={0};
FILE* scorefile; FILE* scorefile;
chtype background[LEN][WID]; chtype background[LEN][WID];
@ -288,68 +288,18 @@ void end_scene(){
refresh(); refresh();
} }
byte scorewrite(void){// only saves the top 10, returns the place in the chart byte save_score(void){
bool deforno; return fallback_to_home("darrt_scores",score,SAVE_TO_NUM);
if( !getenv("DRT_SCORES") && (scorefile= fopen(DRT_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("DRT_SCORES"),"r")) ){
sprintf(error,"No accessible score files found. You can make an empty text file in %s or set DRT_SCORES to such a file to solve this.",DRT_SCORES);
return -1;
}
}
char namebuff[SAVE_TO_NUM][60];
long scorebuff[SAVE_TO_NUM];
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore =0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(DRT_SCORES,"w+");//get rid of the previous text first
else
scorefile = fopen(getenv("DRT_SCORES"), "w+") ;
if(!scorefile){
strcpy(error, "The file cannot be opened in w+. ");
return -1;
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && score>=scorebuff[location] ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){
void show_scores(byte playerrank){
byte y,x; byte y,x;
attron(colors[3]); attron(colors[3]);
filled_rect(0,0,LEN,WID); filled_rect(0,0,LEN,WID);
red_border(); red_border();
if(*error){ if(playerrank==FOPEN_FAIL){
mvaddstr(1,0,error); mvaddstr(1,0,"Could not open score file.");
mvprintw(2,0,"However, your score is %ld.",score); mvprintw(2,0,"However, your score is %ld.",score);
refresh(); refresh();
return; return;
@ -357,9 +307,9 @@ void showscores(byte playerrank){
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d"); fscanf(score_file,"%*s : %*d");
if ( fscanf(scorefile,"%s : %ld",formername,&formerscore)==2 && formerscore>0){ if ( fscanf(score_file,"%s : %ld",formername,&formerscore)==2 && formerscore>0){
byte a = (LEN-9)/2; byte a = (LEN-9)/2;
star_line(1); star_line(1);
star_line(LEN-2); star_line(LEN-2);
@ -387,10 +337,10 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
mvaddstr(1,WID/2-4,"HIGH SCORES"); mvaddstr(1,WID/2-4,"HIGH SCORES");
attron(colors[3]); attron(colors[3]);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
star_line(2+2*rank); star_line(2+2*rank);
move(2+2*rank,1); move(2+2*rank,1);
if(rank == playerrank) if(rank == playerrank)
@ -485,7 +435,7 @@ int main(void){
cbreak(); cbreak();
curs_set(1); curs_set(1);
end_scene(); end_scene();
showscores(scorewrite()); show_scores(save_score());
attron(colors[0]|A_STANDOUT); attron(colors[0]|A_STANDOUT);
mvprintw(LEN-1,HWID-11,"Wanna play again? (y/n)"); mvprintw(LEN-1,HWID-11,"Wanna play again? (y/n)");
attroff(colors[0]|A_STANDOUT); attroff(colors[0]|A_STANDOUT);

View File

@ -20,6 +20,7 @@ You should have received a copy of the CC0 Public Domain Dedication along with t
#include <curses.h> #include <curses.h>
#include <unistd.h> #include <unistd.h>
#include "config.h" #include "config.h"
#include "common.h"
#define SAVE_TO_NUM 11 #define SAVE_TO_NUM 11
#define HOOKS 10 #define HOOKS 10
#define LEN 24 #define LEN 24
@ -49,9 +50,7 @@ unsigned int count[10]={0};
unsigned long score=0; unsigned long score=0;
const char sym[]="~:=!@+><;&"; const char sym[]="~:=!@+><;&";
byte hook=0, hooknum=0; byte hook=0, hooknum=0;
char error [150]={0};
byte clb,clbtime=0; byte clb,clbtime=0;
FILE* scorefile;
int input; int input;
byte digit_count(int num){ byte digit_count(int num){
@ -185,68 +184,19 @@ void draw(void){
attroff(colors[1]); attroff(colors[1]);
} }
byte scorewrite(void){// only saves the top 10, returns the place in the chart byte save_score(void){
bool deforno; return fallback_to_home("fisher_scores",score,SAVE_TO_NUM);
if( !getenv("FSH_SCORES") && (scorefile= fopen(FSH_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("FSH_SCORES"),"r")) ){
sprintf(error,"No accessible score files found. You can make an empty text file in %s or set FSH_SCORES to such a file to solve this.",FSH_SCORES);
return -1;
}
}
char namebuff[SAVE_TO_NUM][60];
long scorebuff[SAVE_TO_NUM];
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore =0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(FSH_SCORES,"w+");//get rid of the previous text first
else
scorefile = fopen(getenv("FSH_SCORES"), "w+") ;
if(!scorefile){
strcpy(error, "The file cannot be opened in w+. ");
return -1;
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && (location>=itreached || score>=scorebuff[location]) ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){
void show_scores(byte playerrank){
byte y,x; byte y,x;
attron(colors[3]); attron(colors[3]);
filled_rect(0,0,LEN,WID); filled_rect(0,0,LEN,WID);
green_border(); green_border();
if(*error){ if(playerrank==FOPEN_FAIL){
mvaddstr(1,0,error); mvaddstr(1,0,"Could not open score file");
mvprintw(2,0,"However, your score is %ld.",score); mvprintw(2,0,"However, your score is %ld.",score);
refresh(); refresh();
return; return;
@ -254,9 +204,9 @@ void showscores(byte playerrank){
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d"); fscanf(score_file,"%*s : %*d");
if ( fscanf(scorefile,"%s : %ld",formername,&formerscore)==2 && formerscore>0){ if ( fscanf(score_file,"%s : %ld",formername,&formerscore)==2 && formerscore>0){
byte a = (LEN-9)/2; byte a = (LEN-9)/2;
star_line(1); star_line(1);
star_line(LEN-2); star_line(LEN-2);
@ -284,10 +234,10 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
mvaddstr(1,WID/2-4,"HIGH SCORES"); mvaddstr(1,WID/2-4,"HIGH SCORES");
attron(colors[3]); attron(colors[3]);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
star_line(2+2*rank); star_line(2+2*rank);
move(2+2*rank,1); move(2+2*rank,1);
if(rank == playerrank) if(rank == playerrank)
@ -424,7 +374,7 @@ int main(void){
nocbreak(); nocbreak();
cbreak(); cbreak();
curs_set(1); curs_set(1);
showscores(scorewrite()); show_scores(save_score());
attron(colors[2]); attron(colors[2]);
mvprintw(LEN-1,HWID-11,"Wanna play again? (y/n)"); mvprintw(LEN-1,HWID-11,"Wanna play again? (y/n)");
attroff(colors[2]); attroff(colors[2]);

View File

@ -19,6 +19,7 @@ TODO make it like puyo puyo instead of the remake of what i poorly remembered*/
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "config.h" #include "config.h"
#include "common.h"
#define LEN 17 #define LEN 17
#define WID 19 #define WID 19
#define DELAY 2 #define DELAY 2
@ -32,70 +33,22 @@ byte jx,jy; //first jewel's position
byte kx,ky;//second jewel's position in relation to that of j byte kx,ky;//second jewel's position in relation to that of j
long score=0; long score=0;
char* controls = "j,l-Move k-Rotate p-Pause q-Quit"; char* controls = "j,l-Move k-Rotate p-Pause q-Quit";
FILE* scorefile;
byte scorewrite(long score){// only saves the top 10
bool deforno;
if( !getenv("JW_SCORES") && (scorefile= fopen(JW_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("JW_SCORES"),"r")) ){
fprintf(stderr,"\nNo accessible score files found. You can make an empty text file in %s or set JW_SCORES to such a file to solve this. \n",JW_SCORES);
exit(EXIT_SUCCESS);
}
}
char namebuff[SAVE_TO_NUM][60]; byte save_score(void){
long scorebuff[SAVE_TO_NUM]; return fallback_to_home("jewels_scores",score,SAVE_TO_NUM);
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore =0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(JW_SCORES,"w+");//get rid of the text
else
scorefile = fopen(getenv("JW_SCORES"), "w+") ;
if(!scorefile){
printf("\nThe file cannot be opened in w+.\n");
exit(EXIT_SUCCESS);
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && (location>=itreached || score>=scorebuff[location]) ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){ void show_scores(byte playerrank){
if(playerrank==FOPEN_FAIL){
printf("Could not open scorefile.");
abort();
}
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d\n"); fscanf(score_file,"%*s : %*d\n");
if ( fscanf(scorefile,"%s : %ld\n",formername,&formerscore)==2){ if ( fscanf(score_file,"%s : %ld\n",formername,&formerscore)==2){
printf("\n*****CONGRATULATIONS!****\n"); printf("\n*****CONGRATULATIONS!****\n");
printf(" _____ You bet the\n"); printf(" _____ You bet the\n");
printf(" .' | previous\n"); printf(" .' | previous\n");
@ -114,15 +67,16 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
printf("\n>*>*>Top %d<*<*<\n",SAVE_TO_NUM); printf("\n>*>*>Top %d<*<*<\n",SAVE_TO_NUM);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
if(rank == playerrank) if(rank == playerrank)
printf(">>>"); printf(">>>");
printf("%d) %s : %ld\n",rank+1,pname,pscore); printf("%d) %s : %ld\n",rank+1,pname,pscore);
++rank; ++rank;
} }
putchar('\n'); putchar('\n');
fclose(score_file);
} }
//apply gravity //apply gravity
bool fall(void){ bool fall(void){
@ -386,6 +340,6 @@ int main(void){
endwin(); endwin();
printf("%s _Jewels_ %s\n",jwstr,jwstr); printf("%s _Jewels_ %s\n",jwstr,jwstr);
printf("You have scored %ld points.\n",score); printf("You have scored %ld points.\n",score);
showscores(scorewrite(score)); show_scores(save_score());
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -18,6 +18,7 @@ You should have received a copy of the CC0 Public Domain Dedication along with t
#include <unistd.h> #include <unistd.h>
#include <stdbool.h> #include <stdbool.h>
#include "config.h" #include "config.h"
#include "common.h"
#define SAVE_TO_NUM 10 #define SAVE_TO_NUM 10
#define MINLEN 10 #define MINLEN 10
#define MAXLEN 24 #define MAXLEN 24
@ -57,7 +58,6 @@ byte pse_msg=100;
//no need to a epilepsy variable like in muncher as zeroing the colors suffices //no need to a epilepsy variable like in muncher as zeroing the colors suffices
FILE *scorefile; FILE *scorefile;
char error[150]={0};
void move_tron(void){ void move_tron(void){
switch(direction){ switch(direction){
@ -87,68 +87,16 @@ void logo(void){
mvaddstr(1,0,"|\\/|"); mvaddstr(1,0,"|\\/|");
mvaddstr(2,0,"| |IKETRON"); mvaddstr(2,0,"| |IKETRON");
} }
byte scorewrite(void){// only saves the top 10, returns the place in the chart byte save_score(void){
bool deforno; return fallback_to_home("miketron_scores",score,SAVE_TO_NUM);
if( !getenv("MT_SCORES") && (scorefile= fopen(MT_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("MT_SCORES"),"r")) ){
sprintf(error,"No accessible score files found. You can make an empty text file in %s or set MT_SCORES to such a file to solve this.",MT_SCORES);
return -1;
}
}
char namebuff[SAVE_TO_NUM][60];
long scorebuff[SAVE_TO_NUM];
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore=0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(MT_SCORES,"w+");//get rid of the previous text first
else
scorefile = fopen(getenv("MT_SCORES"), "w+") ;
if(!scorefile){
strcpy(error, "The file cannot be opened in w+. ");
return -1;
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && (location>=itreached || score>=scorebuff[location]) ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){ void show_scores(byte playerrank){
erase(); erase();
logo(); logo();
if(*error){ if(playerrank==FOPEN_FAIL){
mvaddstr(3,0,error); mvaddstr(3,0,"Couldn't open scorefile.");
printw("\nHowever, your score is %ld.",score); printw("\nHowever, your score is %ld.",score);
refresh(); refresh();
return; return;
@ -156,11 +104,11 @@ void showscores(byte playerrank){
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d\n"); fscanf(score_file,"%*s : %*d\n");
move(3,0); move(3,0);
byte b=0; byte b=0;
if ( fscanf(scorefile,"%s : %ld\n",formername,&formerscore)==2){ if ( fscanf(score_file,"%s : %ld\n",formername,&formerscore)==2){
halfdelay(1); halfdelay(1);
printw("*****CONGRATULATIONS!****\n"); printw("*****CONGRATULATIONS!****\n");
printw(" You bet the\n"); printw(" You bet the\n");
@ -201,9 +149,9 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
printw(">*>*>Top %d<*<*<\n",SAVE_TO_NUM); printw(">*>*>Top %d<*<*<\n",SAVE_TO_NUM);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
if(rank == playerrank) if(rank == playerrank)
printw(">>>"); printw(">>>");
printw("%d) %s : %ld\n",rank+1,pname,pscore); printw("%d) %s : %ld\n",rank+1,pname,pscore);
@ -568,7 +516,7 @@ int main(int argc, char** argv){
refresh(); refresh();
mvprintw(len+5,0,"Game over! Press a key to see the high scores:"); mvprintw(len+5,0,"Game over! Press a key to see the high scores:");
getch(); getch();
showscores(scorewrite()); show_scores(save_score());
printw("Game over! Wanna play again?(y/n)"); printw("Game over! Wanna play again?(y/n)");
curs_set(1); curs_set(1);
input=getch(); input=getch();

View File

@ -18,6 +18,7 @@ You should have received a copy of the CC0 Public Domain Dedication along with t
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#include "config.h" #include "config.h"
#include "common.h"
#define SAVE_TO_NUM 10 #define SAVE_TO_NUM 10
#define MINLEN 10 #define MINLEN 10
#define MAXLEN 24 #define MAXLEN 24
@ -60,74 +61,22 @@ long score;
chtype colors[6]={0}; chtype colors[6]={0};
FILE* scorefile; FILE* scorefile;
char error[150]={0};
void logo(void){ void logo(void){
mvaddstr(1,0,"|\\/|"); mvaddstr(1,0,"|\\/|");
mvaddstr(2,0,"| |UNCHER"); mvaddstr(2,0,"| |UNCHER");
} }
byte scorewrite(void){// only saves the top 10, returns the place in the chart
bool deforno;
if( !getenv("MNCH_SCORES") && (scorefile= fopen(MNCH_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("MNCH_SCORES"),"r")) ){
sprintf(error,"No accessible score files found. You can make an empty text file in %s or set MNCH_SCORES to such a file to solve this.",MNCH_SCORES);
return -1;
}
}
char namebuff[SAVE_TO_NUM][60]; byte save_score(void){
long scorebuff[SAVE_TO_NUM]; return fallback_to_home("muncher_scores",score,SAVE_TO_NUM);
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore =0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(MNCH_SCORES,"w+");//get rid of the previous text first
else
scorefile = fopen(getenv("MNCH_SCORES"), "w+") ;
if(!scorefile){
strcpy(error, "The file cannot be opened in w+. ");
return -1;
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && (location>=itreached || score>=scorebuff[location]) ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){ void show_scores(byte playerrank){
erase(); erase();
logo(); logo();
if(*error){ if(playerrank==FOPEN_FAIL){
mvaddstr(3,0,error); mvaddstr(3,0,"Could not open score file");
printw("\nHowever, your score is %ld.",score); printw("\nHowever, your score is %ld.",score);
refresh(); refresh();
return; return;
@ -135,11 +84,11 @@ void showscores(byte playerrank){
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d\n"); fscanf(score_file,"%*s : %*d\n");
move(3,0); move(3,0);
byte b=0; byte b=0;
if ( fscanf(scorefile,"%s : %ld\n",formername,&formerscore)==2){ if ( fscanf(score_file,"%s : %ld\n",formername,&formerscore)==2){
halfdelay(1); halfdelay(1);
printw("*****CONGRATULATIONS!****\n"); printw("*****CONGRATULATIONS!****\n");
printw(" You bet the\n"); printw(" You bet the\n");
@ -180,9 +129,9 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
printw(">*>*>Top %d<*<*<\n",SAVE_TO_NUM); printw(">*>*>Top %d<*<*<\n",SAVE_TO_NUM);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
if(rank == playerrank) if(rank == playerrank)
printw(">>>"); printw(">>>");
printw("%d) %s : %ld\n",rank+1,pname,pscore); printw("%d) %s : %ld\n",rank+1,pname,pscore);
@ -498,7 +447,7 @@ int main(int argc, char** argv){
refresh(); refresh();
mvprintw(len+5,0,"Game over! Press a key to see the high scores:"); mvprintw(len+5,0,"Game over! Press a key to see the high scores:");
getch(); getch();
showscores(scorewrite()); show_scores(save_score());
printw("Game over! Wanna play again?(y/n)"); printw("Game over! Wanna play again?(y/n)");
curs_set(1); curs_set(1);
input=getch(); input=getch();

80
pipes.c
View File

@ -18,6 +18,7 @@ You should have received a copy of the CC0 Public Domain Dedication along with t
#include <time.h> #include <time.h>
#include <signal.h> #include <signal.h>
#include "config.h" #include "config.h"
#include "common.h"
#define UP 1 #define UP 1
#define RIGHT 2 #define RIGHT 2
#define DOWN 4 #define DOWN 4
@ -44,8 +45,6 @@ int py,px,fy,fx;//p: pointer f: fluid
bitbox tocome[5]={0};//the row of pipes in the left side bitbox tocome[5]={0};//the row of pipes in the left side
chtype green=A_BOLD;//will use bold font instead of green if colors are not available chtype green=A_BOLD;//will use bold font instead of green if colors are not available
long score; long score;
FILE* scorefile;
char error [150]={0};
void logo(void){ void logo(void){
mvprintw(0,0," _ "); mvprintw(0,0," _ ");
@ -53,68 +52,16 @@ void logo(void){
mvprintw(2,0,"| IPES"); mvprintw(2,0,"| IPES");
} }
byte scorewrite(void){// only saves the top 10, returns the place in the chart byte save_score(void){
bool deforno; return fallback_to_home("pipes_scores",score,SAVE_TO_NUM);
if( !getenv("PP_SCORES") && (scorefile= fopen(PP_SCORES,"r")) ){
deforno=1;
}
else{
deforno=0;
if( !(scorefile = fopen(getenv("PP_SCORES"),"r")) ){
sprintf(error,"No accessible score files found. You can make an empty text file in %s or set PP_SCORES to such a file to solve this.",PP_SCORES);
return -1;
}
}
char namebuff[SAVE_TO_NUM][60];
long scorebuff[SAVE_TO_NUM];
memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) );
memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) );
long fuckingscore =0;
char fuckingname[60]={0};
byte location=0;
while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location<SAVE_TO_NUM ){
strcpy(namebuff[location],fuckingname);
scorebuff[location] = fuckingscore;
++location;
memset(fuckingname,0,60);
fuckingscore=0;
}
if(deforno)
scorefile = fopen(PP_SCORES,"w+");//get rid of the previous text first
else
scorefile = fopen(getenv("PP_SCORES"), "w+") ;
if(!scorefile){
strcpy(error, "The file cannot be opened in w+. ");
return -1;
}
byte itreached=location;
byte ret = -1;
bool wroteit=0;
for(location=0;location<=itreached && location<SAVE_TO_NUM-wroteit;++location){
if(!wroteit && (location>=itreached || score>=scorebuff[location]) ){
fprintf(scorefile,"%s : %ld\n",getenv("USER"),score);
ret=location;
wroteit=1;
}
if(location<SAVE_TO_NUM-wroteit && location<itreached)
fprintf(scorefile,"%s : %ld\n",namebuff[location],scorebuff[location]);
}
fflush(scorefile);
return ret;
} }
void showscores(byte playerrank){ void show_scores(byte playerrank){
erase(); erase();
logo(); logo();
if(*error){ if(playerrank==FOPEN_FAIL){
mvaddstr(SY,SX,error); mvaddstr(SY,SX,"Couldn't open scorefile");
mvprintw(SY+1,SX,"However, your score is %ld.",score); mvprintw(SY+1,SX,"However, your score is %ld.",score);
refresh(); refresh();
return; return;
@ -122,9 +69,9 @@ void showscores(byte playerrank){
if(playerrank == 0){ if(playerrank == 0){
char formername[60]={0}; char formername[60]={0};
long formerscore=0; long formerscore=0;
rewind(scorefile); rewind(score_file);
fscanf(scorefile,"%*s : %*d"); fscanf(score_file,"%*s : %*d");
if ( fscanf(scorefile,"%s : %ld",formername,&formerscore)==2 && formerscore>0){ if ( fscanf(score_file,"%s : %ld",formername,&formerscore)==2 && formerscore>0){
byte a = (len-9)/2; byte a = (len-9)/2;
attron(A_BOLD); attron(A_BOLD);
mvprintw(SY,SX, "**** ***"); mvprintw(SY,SX, "**** ***");
@ -159,8 +106,8 @@ void showscores(byte playerrank){
char pname[60] = {0}; char pname[60] = {0};
long pscore=0; long pscore=0;
byte rank=0; byte rank=0;
rewind(scorefile); rewind(score_file);
while( rank<SAVE_TO_NUM && fscanf(scorefile,"%s : %ld\n",pname,&pscore) == 2){ while( rank<SAVE_TO_NUM && fscanf(score_file,"%s : %ld\n",pname,&pscore) == 2){
move(SY+1+rank,SX+1); move(SY+1+rank,SX+1);
attron(green); attron(green);
if(rank == playerrank) if(rank == playerrank)
@ -394,7 +341,6 @@ int main(int argc, char** argv){
flow=0; flow=0;
fast=0; fast=0;
score=0; score=0;
memset(error,0,150);
memset(board,0,len*wid); memset(board,0,len*wid);
fy=1+(rand()%(len-2) ); fy=1+(rand()%(len-2) );
fx=1+(rand()%(wid-2) ); fx=1+(rand()%(wid-2) );
@ -525,7 +471,7 @@ int main(int argc, char** argv){
if(input == 'N' || input=='n' || input =='q') if(input == 'N' || input=='n' || input =='q')
sigint_handler(EXIT_SUCCESS); sigint_handler(EXIT_SUCCESS);
showscores(scorewrite()); show_scores(save_score());
mvprintw(len+2,0,"Press a key to exit:"); mvprintw(len+2,0,"Press a key to exit:");
refresh(); refresh();
getch(); getch();
@ -543,7 +489,7 @@ int main(int argc, char** argv){
draw(board); draw(board);
mvprintw(len+2,0,"Game over! Press a key to see the high scores:"); mvprintw(len+2,0,"Game over! Press a key to see the high scores:");
getch(); getch();
showscores(scorewrite()); show_scores(save_score());
mvprintw(len+2,0,"Game over!"); mvprintw(len+2,0,"Game over!");
printw(" Wanna play again?(y/n)"); printw(" Wanna play again?(y/n)");
input=getch(); input=getch();