-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ Xshort readscreen() `7B X X FILE *screen; X char *fnam; X short j, c, ret = 0; X X fnam = malloc( strlen( SCREENPATH) + 11); X sprintf( fnam, "%sscreen.%d", SCREENPATH, level); X if( (screen = fopen( fnam, "r")) == NULL)`20 X ret = E_FOPENSCREEN; X else `7B X packets = savepack = rows = j = columns = 0; X ppos.x = -1; ppos.y = -1; X while( (ret == 0) && ((c = getc( screen)) != EOF)) `7B X if( c == '\n') `7B X`09 map`5Brows++`5D`5Bj`5D = '\0'; X`09 if( rows > MAXROW)`20 X`09 ret = E_TOMUCHROWS; X`09 else `7B X`09 if( j > columns) columns = j; X`09 j = 0; X`09 `7D X`09 `7D X`09 else if( (c == player.obj_intern) `7C`7C (c == playerstore.obj_intern)) V `7B X`09 if( ppos.x != -1)`20 X`09 ret = E_PLAYPOS1; X`09 else `7B`20 X`09 ppos.x = rows; ppos.y = j; X`09 map`5Brows`5D`5Bj++`5D = c; X`09 if( j > MAXCOL) ret = E_TOMUCHCOLS; X`09 `7D X`09 `7D X`09 else if( (c == save.obj_intern) `7C`7C (c == packet.obj_intern) `7C`7C X`09`09 (c == wall.obj_intern) `7C`7C (c == store.obj_intern) `7C`7C X`09`09 (c == ground.obj_intern)) `7B X`09 if( c == save.obj_intern) `7B savepack++; packets++; `7D X`09 if( c == packet.obj_intern) packets++; X`09 map`5Brows`5D`5Bj++`5D = c; X`09 if( j > MAXCOL) ret = E_TOMUCHCOLS; X`09 `7D X`09 else ret = E_ILLCHAR; X `7D X fclose( screen); X if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2; X `7D X return( ret); X`7D $ CALL UNPACK READSCREEN.C;1 71977338 $ create 'f' X#include X#include X#include X#include X#include unixlib X#include "sokoban.h" X Xextern char *malloc(); Xextern FILE *fopen(); X Xextern char map`5BMAXROW+1`5D`5BMAXCOL+1`5D; Xextern short level, moves, pushes, packets, savepack, rows, columns; Xextern short scoring; Xextern POS ppos; X Xstatic long savedbn; Xstatic FILE *savefile; Xstatic struct stat sfstat; X Xshort savegame() `7B X X short ret = 0; X X signal( SIGINT, SIG_IGN); X/* sfname = malloc( strlen( SAVEPATH) + strlen( username) + 4);*/ X/* sprintf(sfname, "$1$dua22:`5Btemp.masandy`5D%s.SAV",username);*/ X if( (savefile = fopen( sfname, "w")) == NULL) X ret = E_FOPENSAVE; X else `7B X savedbn = fileno( savefile); X if( write( savedbn, &(map`5B0`5D`5B0`5D), MAXROW*MAXCOL) != MAXROW*MAX VCOL) X`09 ret = E_WRITESAVE; X else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS)) `20 X`09 ret = E_WRITESAVE; X else if( write( savedbn, &scoring, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &level, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &moves, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &pushes, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &packets, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &rows, 2) != 2) ret = E_WRITESAVE; X else if( write( savedbn, &columns, 2) != 2) ret = E_WRITESAVE; X else `7B X`09 fclose( savefile); X`09 if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE; X`09 else if( (savefile = fopen( sfname, "a")) == NULL) X ret = E_FOPENSAVE; X else `7B X`09 fclose( savefile); X`09 `7D X `7D X `7D X if( (ret == E_WRITESAVE) `7C`7C (ret == E_STATSAVE)) printf("Error.\n"); X signal( SIGINT, SIG_DFL); X X return( ret); X`7D X Xshort restoregame() `7B X X short ret = 0; X struct stat oldsfstat; X X signal( SIGINT, SIG_IGN); X/* sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);*/ X/* sprintf( sfname, "%s%s.SAV", SAVEPATH, username);*/ X if( stat( sfname, &oldsfstat) < -1)`20 X ret = E_NOSAVEFILE; X else `7B X if( (savefile = fopen( sfname, "r")) == NULL) X ret = 1; /* If there is no save file, start player at level 1 */ X else `7B X savedbn = fileno( savefile); X if( read( savedbn, &(map`5B0`5D`5B0`5D), MAXROW*MAXCOL) != MAXROW*M VAXCOL) X`09 ret = E_READSAVE; X else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS)) `2 V0 X`09 ret = E_READSAVE; X else if( read( savedbn, &scoring, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &level, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &moves, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &pushes, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &packets, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &rows, 2) != 2) ret = E_READSAVE; X else if( read( savedbn, &columns, 2) != 2) ret = E_READSAVE; X/*`09 else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat)) X`09 ret = E_READSAVE; X`09 else if( (sfstat.st_dev != oldsfstat.st_dev) `7C`7C X (sfstat.st_ino != oldsfstat.st_ino) `7C`7C X (sfstat.st_nlink != oldsfstat.st_nlink) `7C`7C X (sfstat.st_uid != oldsfstat.st_uid) `7C`7C X (sfstat.st_gid != oldsfstat.st_gid) `7C`7C X (sfstat.st_mtime != oldsfstat.st_mtime)) X ret = E_ALTERSAVE;*/ X `7D X `7D X signal( SIGINT, SIG_DFL); X return( ret); X`7D $ CALL UNPACK SAVE.C;1 962675488 $ create 'f' X 0 MASANDY 21 678 167 `20 X 1 V050QR5K 10 1613 518 `20 X 2 V059NRRZ 9 620 239 `20 X 3 MASDAN 9 654 239 `20 X 4 V096QGCM 8 716 250 `20 X 5 V114JCMW 5 438 149 `20 X 6 V095MB9J 5 449 145 `20 X 7 V129J6ED 4 917 357 `20 X 8 V102PCAK 3 384 142 `20 X 9 V088PXER 2 535 131 `20 X 10 V062J3AP 2 537 155 `20 X 11 V050LP7C 2 551 137 `20 X 12 V051LPQA 2 579 151 `20 X 13 V089PV9R 1 244 97 `20 X 14 V127JC8C 1 248 97 `20 X 15 MASGREG 1 250 97 `20 X 16 V063RB8D 1 262 97 `20 X 17 V124JW4Y 1 264 97 `20 X 18 V222P9NS 1 274 99 `20 X 19 V120MCVM 1 286 97 `20 $ CALL UNPACK SAVE.SCORE;1 460678648 $ create 'f' X#include X#include X#include unixlib X#include "sokoban.h" X Xextern FILE *fopen(); X Xextern short scorelevel, scoremoves, scorepushes; X Xstatic short scoreentries; Xstatic short rank; Xstatic struct `7B X char user`5BMAXUSERNAME`5D; X short lv, mv, ps; X`7D scoretable`5BMAXSCOREENTRIES`5D; X Xstatic FILE *scorefile; X Xshort outputscore() `7B X X short ret; X X if( (ret = readscore()) == 0) X showscore(); X return( (ret == 0) ? E_ENDGAME : ret); X`7D X Xshort makenewscore() `7B X X short i; X short ret = 0; X short file_count = 0; X char blank_line`5B70`5D; X X scoreentries = 0; X if( (scorefile = fopen( SCOREFILE, "w")) == NULL) X ret = E_FOPENSCORE; X else `7B X for (i=0; i<70; i++) /* Make the blank line to put into the score file V */ X`09blank_line`5Bi`5D = ' '; X blank_line`5B70`5D = '\0'; X for (file_count=0; file_count < MAXSCOREENTRIES; file_count++) X if( fprintf( scorefile,"%s\n", blank_line) == NULL) ret = E_WRITESCO VRE; X fclose( scorefile); X `7D X return( (ret == 0) ? E_ENDGAME : ret); X`7D X Xshort score() `7B X `20 X short ret; X X if( (ret = readscore()) == 0) X if( (ret = makescore()) == 0) X`09 if( (ret = writescore()) == 0) X`09 showscore(); X return( (ret == 0) ? E_ENDGAME : ret); X`7D X Xreadscore() `7B X X short rank; X short ret = 0; X long tmp; X X if( (scorefile = fopen( SCOREFILE, "r")) == NULL) X ret = E_FOPENSCORE; X else `7B X while(fscanf(scorefile,"%d",&rank)!=EOF && rank < MAXSCOREENTRIES V-1) X`09 `7B X fscanf( scorefile, "%10s %8d %8d %8d\n", scoretable`5Brank`5D V.user,`20 X`09 &scoretable`5Brank`5D.lv, &scoretable`5Brank`5D.mv, &scoretable`5Bra Vnk`5D.ps); X scoreentries++; X `7D X `7D X fclose( scorefile); X return( ret); X`7D X Xmakescore() `7B X X short ret = 0, pos, i, build = 1, insert; X X if( (pos = finduser()) > -1) `7B`09/* user already in score file */ X insert = (scorelevel > scoretable`5Bpos`5D.lv) X`09 `7C`7C ( (scorelevel == scoretable`5Bpos`5D.lv) && X (scoremoves < scoretable`5Bpos`5D.mv) X`09`09 ) X`09 `7C`7C ( (scorelevel == scoretable`5Bpos`5D.lv) && X`09`09 (scoremoves == scoretable`5Bpos`5D.mv) && X`09`09 (scorepushes < scoretable`5Bpos`5D.ps) X`09`09 ); X if( insert) `7B `09`09`09/* delete existing entry */ X`09 for( i = pos; i < scoreentries-1; i++) X`09 cp_entry( i, i+1); X`09 scoreentries--; X `7D X else build = 0; X `7D X else if( scoreentries == MAXSCOREENTRIES) X ret = E_TOMUCHSE; X if( (ret == 0) && build) `7B X pos = findpos();`09`09`09/* find the new score position */ X if( pos > -1) `7B`09`09`09/* score table not empty */ X`09 for( i = scoreentries; i > pos; i--) X`09 cp_entry( i, i-1); X `7D X else pos = scoreentries; X X strcpy( scoretable`5Bpos`5D.user, username); X scoretable`5Bpos`5D.lv = scorelevel; X scoretable`5Bpos`5D.mv = scoremoves; X scoretable`5Bpos`5D.ps = scorepushes; X scoreentries++; X `7D X return( ret); X`7D X Xfinduser() `7B X X short i, found = 0; X X for( i = 0; (i < scoreentries) && (! found); i++) X found = (strcmp( scoretable`5Bi`5D.user, username) == 0); X return( (found) ? i-1 : -1); X`7D X Xfindpos() `7B X`20 X short i, found = 0; X X for( i = 0; (i < scoreentries) && (! found); i++) X found = (scorelevel > scoretable`5Bi`5D.lv) X`09 `7C`7C ( (scorelevel == scoretable`5Bi`5D.lv) && X (scoremoves < scoretable`5Bi`5D.mv) X`09`09 ) X`09 `7C`7C ( (scorelevel == scoretable`5Bi`5D.lv) && X`09`09 (scoremoves == scoretable`5Bi`5D.mv) && X`09`09 (scorepushes < scoretable`5Bi`5D.ps) X`09`09 ); X return( (found) ? i-1 : -1); X`7D X Xwritescore() `7B X X short ret = 0; X long tmp; X char score_string`5B70`5D; X X if( (scorefile = fopen( SCOREFILE, "r+")) == NULL) X ret = E_FOPENSCORE; X else `7B X for (tmp = 0; tmp < scoreentries; tmp++) `7B X sprintf(score_string," %d %10s %8d %8d %8d", X tmp,scoretable`5Btmp`5D.user,scoretable`5Btmp`5D.lv, X scoretable`5Btmp`5D.mv,scoretable`5Btmp`5D.ps); X while(strlen(score_string) < 70) strcat(score_string," "); X score_string`5B70`5D = '\0'; X if (fprintf(scorefile,"%s\n",score_string) == NULL)`20 X `7Bfclose(scorefile); return(E_WRITESCORE);`7D X `7D X `7D X fclose( scorefile); X return( ret); X`7D X Xshowscore() `7B X X register short lastlv = 0, lastmv = 0, lastps = 0, i; X X fprintf( stdout, "Rank User Level Moves Pushes\n"); X fprintf( stdout, "==============================================\n"); X for ( i = 0; i < scoreentries; i++) X printf(" %d %10s %8d %8d %8d\n",i+1,scoretable`5Bi`5D.user, X`09 scoretable`5Bi`5D.lv,scoretable`5Bi`5D.mv,scoretable`5Bi`5D.ps); X`7D X Xcp_entry( i1, i2) Xregister short i1, i2; X`7B X strcpy( scoretable`5Bi1`5D.user, scoretable`5Bi2`5D.user); X scoretable`5Bi1`5D.lv = scoretable`5Bi2`5D.lv; X scoretable`5Bi1`5D.mv = scoretable`5Bi2`5D.mv; X scoretable`5Bi1`5D.ps = scoretable`5Bi2`5D.ps; X`7D $ CALL UNPACK SCORE.C;1 1579222126 $ create 'f' X ##### X # # X #$ # X ### $## X # $ $ # X### # ## # ###### X# # ## ##### ..# X# $ $ ..# X##### ### #@## ..# X # ######### X ####### $ CALL UNPACK SCREEN.1;1 1661207973 $ create 'f' X ### ############# X##@#### # # X# $$ $$ $ $ ...# X# $$$# $ #...# X# $ # $$ $$ #...# X### # $ #...# X# # $ $ $ #...# X# ###### ###...# X## # # $ $ #...# X# ## # $$ $ $##..# X# ..# # $ #.# X# ..# # $$$ $$$ #.# X##### # # #.# X # ######### #.# X # #.# X ############### $ CALL UNPACK SCREEN.10;1 224857975 $ create 'f' X #### X #### # # X ### @###$ # X ## $ # X ## $ $$## ## X # #$## # X # # $ $$ # ### X # $ # # $ ##### X#### # $$ # # X#### ## $ # X#. ### ######## X#.. ..# #### X#...#.# X#.....# X####### $ CALL UNPACK SCREEN.11;1 1126837018 $ create 'f' X################ X# # X# # ###### # X# # $ $ $ $# # X# # $@$ ## ## X# # $ $ $###...# X# # $ $ ##...# X# ###$$$ $ ##...# X# # ## ##...# X##### ## ##...# X ##### ### X # # X ####### $ CALL UNPACK SCREEN.12;1 1829309829 $ create 'f' X ######### X ## ## ##### X### # # ### X# $ #$ # # ... # X# # $#@$## # #.#. # X# # #$ # . . # X# $ $ # # #.#. # X# ## ##$ $ . . # X# $ # # #$#.#. # X## $ $ $ $... # X #$ ###### ## # X # # ########## X #### $ CALL UNPACK SCREEN.13;1 57476972 $ create 'f' X ####### X ####### # X # # $@$ # X #$$ # ######### X # ###......## # X # $......## # # X # ###...... # X## #### ### #$## X# #$ # $ # # X# $ $$$ # $## # X# $ $ ###$$ # # X##### $ # # X ### ### # # X # # # X ######## # X #### $ CALL UNPACK SCREEN.14;1 658516047 $ create 'f' X ######## X # # # X # $ # X ### #$ #### X # $ ##$ # X # # @ $ # $# X # # $ #### X ## ####$## # X # $#.....# # # X # $..**. $# ### +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-