|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 8424 (0x20e8) Types: TextFile Names: »score.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Pm/Sys3-SysV/score.c«
/* ** score.c - code dealing with maintaining the score file and the user log ** ** Note: the score file is not encrypted ** ** [pm by Peter Costantinidis, Jr. @ University of California at Davis] */ #include "pm.h" #include <pwd.h> #ifdef SYSIII # include <sys/ioctl.h> #endif SYSIII extern int fwrite(), fread(); /* ** check_scrs() - print out the pm roll (only for score enquiries) */ void check_scrs () { reg int i; auto score scrs[MAX_SCORES]; if (rwscore(0, scrs)) { printf("No scores recorded at this time\n"); return; } printf("\nTop Ten Players:\n"); printf("Rank\tScore\tName\n"); for (i = 0; i < MAX_SCORES && scrs[i].sc_uid != -1; i++) { print_scrs(&scrs[i], i + 1); printf(".\n"); } } /* ** get_hi_scr() - get the highest score from the score file */ long get_hi_scr () { auto score scrs[MAX_SCORES]; if (rwscore(0, scrs)) return(0L); if (scrs[0].sc_uid == uid) { /* taunt the high scorer */ printf("\nWelcome back %s,\n", scrs[0].sc_name); printf("do you think that you can do better than\n"); printf("last time? Just a second while I think\n"); printf("of a better strategy!\n"); sleep(1); #ifdef PATTERNS /* ** they seem to have this pattern mastered, so ** lets be tricky and give them a different pattern ** (i.e. change the seed) */ randomize(getpid()); #endif } return(scrs[0].sc_score); } /* ** chk_pm_user() - check the user file ** return non-zero on error */ int chk_pm_user () { reg int i; reg int bit, byte; auto char buf[MAX_BYTES]; if (!pm_user || uid > (unsigned) MAX_USERS) /* wraps on 16 bit machines */ return(FALSE); byte = uid / BYTE_SIZE; bit = 1 << (uid % BYTE_SIZE); for (i=0; i<MAX_BYTES; i++) buf[i] = '\0'; if (rwuser(0, buf)) fprintf(stderr, "%s: creating user file\n", argv0); if (!(buf[byte] & bit)) /* have they played before? */ { directions(); /* give directions and */ buf[byte] |= bit; if (rwuser(1, buf)) { fprintf(stderr, "%s: cannot update user file\n", argv0); return(TRUE); } } return(FALSE); } /* ** print_scrs() - print out the score record */ void print_scrs (scr, rank) reg score *scr; reg int rank; { static char *reason[] = { "eaten", "quit", }; if (scr->sc_uid < 0) return; printf("%d\t%6ld\t%s: %s after %d screen%c", rank, scr->sc_score, scr->sc_name, reason[scr->sc_flags], scr->sc_level+1, (scr->sc_level ? 's' : ' ')); if (scr->sc_flags == FL_DIE) printf(" by %s", mons_str(scr->sc_mons)); } /* ** scores() - print the list of scores and conditionally add ** the new one */ void scores (mon, flags) char mon; int flags; { reg int i; auto score scrs[MAX_SCORES]; if (rwscore(0, &(scrs[0]))) { fprintf(stderr, "%s: creating the score file\n", argv0); for (i=0; i<MAX_SCORES; i++) scrs[i].sc_uid = -1; /* indicates an invalid score */ } if (madeit(thescore, scrs)) { auto score newscr; auto char buf[BUFSIZ]; printf("\nYou made it on the pm roll with "); printf("your score of %ld!\n", thescore); printf("Your name please: "); #if SYSV|SYSIII /* doesn't seem to help much */ ioctl(fileno(stdin), TCFLSH, 0); /* flush input */ #endif if (!gets(buf)) printf("Sorry, that is not acceptable!\n"); newscr.sc_score = thescore; newscr.sc_uid = uid; newscr.sc_level = level; newscr.sc_mons = mon; newscr.sc_flags = flags; strucpy(newscr.sc_name, buf, NAME_SIZE); newscr.sc_name[NAME_SIZE - 1] = NULL; /* ** find where to insert their score */ for (i = 0; i < MAX_SCORES && scrs[i].sc_uid != -1; i++) { auto score scr; if (thescore < scrs[i].sc_score) continue; scrcpy(&scr, &(scrs[i])); scrcpy(&(scrs[i]), &newscr); for (++i; i < MAX_SCORES; i++) { auto score tmp; scrcpy(&tmp,&(scrs[i])); scrcpy(&(scrs[i]),&scr); scrcpy(&scr,&tmp); } break; } if (scrs[i].sc_uid == -1) /* add at end of roll */ scrcpy(&(scrs[i]), &newscr); if (rwscore(1, scrs)) fprintf(stderr, "%s: cannot write score file\n", argv0); } check_scrs(); } /* ** madeit() - return true if the given score will make on the given roll */ static int madeit (l, scrs) reg long l; reg score *scrs; { reg int i; if (!l || was_wiz) return(FALSE); for (i=0; i<MAX_SCORES; i++, scrs++) if (scrs->sc_uid == -1) return(TRUE); else if (l > scrs->sc_score) return(TRUE); return(FALSE); } /* ** pmers() - called by main() to print the list of players */ void pmers () { auto char buf[MAX_BYTES]; reg int j; if (rwuser(0, buf)) { perror(pm_user); exit(1); } for (j = 0; j < MAX_BYTES; j++) { reg int i; if (!buf[j]) continue; for (i = 0; i < BYTE_SIZE; i++) { auto int puid; struct passwd *pw; extern struct passwd *getpwuid(); if (!((char) (1 << i) & buf[j])) continue; if (pw = getpwuid(puid = ((j * BYTE_SIZE) + i))) printf("%s\n", pw->pw_name); else fprintf(stderr, "%s: getpwuid(%d) error\n", argv0, puid); } } } /* ** rwscore() - read/write the contents of the pm_roll file ** - if flag is true, write, else read ** - return non-zero on error */ static int rwscore (flag, scrs) reg int flag; reg score *scrs; { reg FILE *fp; reg int (*func)(); if (!(fp = fopen(pm_roll, flag ? "w" : "r"))) return(TRUE); func = flag ? fwrite : fread; if ((*func)(scrs, sizeof(*scrs), MAX_SCORES, fp) != MAX_SCORES) { perror(pm_roll); fclose(fp); return(TRUE); } fclose(fp); return(FALSE); } /* ** rwuser() - read/write the contents of the pm_user file ** - if flag is true, write, else read ** - return non-zero on error */ static int rwuser (flag, buf) reg int flag; reg char *buf; { reg FILE *fp; reg int (*func)(); if (!(fp = fopen(pm_user, flag ? "w" : "r"))) return(TRUE); func = flag ? fwrite : fread; if ((*func)(buf, sizeof(*buf), MAX_BYTES, fp) != MAX_BYTES) { perror(pm_user); fclose(fp); return(TRUE); } fclose(fp); return(FALSE); }