farren@well.UUCP (Mike Farren) (06/06/89)
Having played the Amiga version of Wanderer all the way out to level 44, a distressing fact emerged: the saved game file stores your score to date as a 16-bit signed integer, making it impossible to have a score higher than 32767 in a saved game. Weird - this is almost the only place in the entire program that uses "short" variables. Also, the score display routines all call sprintf with the format string "%d" for the score, which in the Lattice 5.02 compiler, if not others, forces the output to a short signed integer. So even if you DID get a score above 32767, you wouldn't be able to see it! These are the changes I've made to allow for 32-bit integers as your score. Note that they will make old saved games unusable. I've also included a short program which will convert old saved games to new saved games. By the way - has anyone successfully completed levels 26 and 44? HELP! -------- CHANGES - in scores.c, save.c, game.c, display.c, and m.c: In file "scores.c": *** CHANGE 48 IN old:scores.c TO 48 IN scores.c *** <addstr("\nNo. Score Level Names How they died\n"); --------------- >addstr("\nNo. Score Level Names How they died\n"); *** CHANGE 54 IN old:scores.c TO 54 IN scores.c *** < sprintf(buffer,"%2d %5d %3d %-20s killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead); --------------- > sprintf(buffer,"%2d %6ld %3d %-20s killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead); In file "save.c": *** CHANGE [9,13] IN old:save.c TO [9,13] IN save.c *** < short num; < short score; < short bell; < short maxmoves; < short num_monsters; --------------- > int num; > int score; > int bell; > int maxmoves; > int num_monsters; In file "game.c": *** CHANGE 236 IN old:game.c TO 236 IN game.c *** <(void) sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); --------------- >(void) sprintf(buffer,"%ld\t %d\t %d ",*score,nf,diamonds); *** CHANGE 491 IN old:game.c TO 491 IN game.c *** < sprintf(buffer,"%d\t %d",*score,nf); --------------- > sprintf(buffer,"%ld\t %d",*score,nf); *** CHANGE 522 IN old:game.c TO 522 IN game.c *** < sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); --------------- > sprintf(buffer,"%ld\t %d\t %d ",*score,nf,diamonds); *** CHANGE 603 IN old:game.c TO 603 IN game.c *** < sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); --------------- > sprintf(buffer,"%ld\t %d\t %d ",*score,nf,diamonds); *** CHANGE 685 IN old:game.c TO 685 IN game.c *** < sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); --------------- > sprintf(buffer,"%ld\t %d\t %d ",*score,nf,diamonds); *** CHANGE 796 IN old:game.c TO 796 IN game.c *** < sprintf(buffer,"%d\t %d\t",*score,nf); --------------- > sprintf(buffer,"%ld\t %d\t",*score,nf); *** CHANGE 914 IN old:game.c TO 914 IN game.c *** < sprintf(buffer,"%d\t %d\t %d ",*score,nf,diamonds); --------------- > sprintf(buffer,"%ld\t %d\t %d ",*score,nf,diamonds); In file "display.c": *** CHANGE 231 IN old:display.c TO 231 IN display.c *** <(void) sprintf(buffer,"%d\t %d\t %d ",score,nf,diamonds); --------------- >(void) sprintf(buffer,"%ld\t %d\t %d ",score,nf,diamonds); In file "m.c": *** CHANGE 167 IN old:m.c TO 167 IN m.c *** < sprintf(buffer,"%s killed by %s with a score of %d on level %d.\n",name,howdead,score,num); --------------- > sprintf(buffer,"%s killed by %s with a score of %ld on level %d.\n",name,howdead,score,num); -------- CONVERSION PROGRAM: (compile with long integers only, please!) /* Usage: convert <old saved game> <new saved game> Minimal error checking - this is quick and dirty. */ #include <stdio.h> main(argc, argv) int argc; char *argv[]; { FILE *fi, *fo; int x, i; short y; if(argc != 3) exit(20); fi = fopen(argv[1], "r"); fo = fopen(argv[2], "w"); if((fi == NULL) || (fo == NULL)) exit(20); for(i=0; i!=5; i++) { fread(&y, 2, 1, fi); x = (int)y; if(i == 1) x &= 0xffff; /* if score is negative */ fwrite(&x, 4, 1, fo); } while((i=fgetc(fi))!=EOF) fputc(i, fo); fclose(fi); fclose(fo); } -- Mike Farren uucp: well!farren