rogue3: add the option of logging all games to a text file

This commit is contained in:
John "Elwin" Edwards 2009-11-10 22:38:46 +00:00
parent 437daf6c31
commit bd3b2e4e53
5 changed files with 86 additions and 1 deletions

View file

@ -40,7 +40,8 @@ CC = gcc
ROPTS =
COPTS = -O3
CFLAGS= $(COPTS) $(ROPTS) -DSCOREFILE=\"/usr/local/games/roguelike/rogue3.scr\" \
-DSAVEDIR=\"/usr/local/games/roguelike/rogue3save/\"
-DSAVEDIR=\"/usr/local/games/roguelike/rogue3save/\" \
-DLOGFILE=\"/usr/local/games/roguelike/rogue3.log\"
LIBS = -lcurses
RM = rm -f
LD = $(CC)

View file

@ -338,6 +338,7 @@ quit(int p)
move(LINES-1, 0);
draw(stdscr);
endwin();
log(purse, 1, 0);
score(purse, 1, 0);
exit(0);
}

View file

@ -23,6 +23,7 @@ WINDOW *cw; /* Window that the player sees */
WINDOW *hw; /* Used for the help command */
WINDOW *mw; /* Used to store mosnters */
FILE *scoreboard = NULL;
FILE *logf = NULL;
main(argc, argv, envp)
char **argv;

View file

@ -77,6 +77,7 @@ death(int monst)
mvaddstr(18, 26, prbuf);
move(LINES-1, 0);
draw(stdscr);
log(purse, 0, monst);
score(purse, 0, monst);
/* Make sure all the output gets through ssh and
anything else that might be in the way. */
@ -118,6 +119,31 @@ open_score(void)
#endif
}
#if 0 /* not necessary */
/* Same thing, but for the log file. Maybe combine them eventually. */
/* FIXME you don't know what this does */
void open_log(void)
{
#ifdef LOGFILE
if (logf != NULL) {
rewind(logf);
return;
}
logf = fopen(LOGFILE, "a");
if (logf == NULL)
{
fprintf(stderr, "Could not open %s for appending: %s\n", LOGFILE, strerror(errno));
fflush(stderr);
}
#else
logf == NULL;
#endif
return;
}
#endif
/* VARARGS2 */
void
score(int amount, int flags, int monst)
@ -288,6 +314,59 @@ score(int amount, int flags, int monst)
fclose(outf);
}
void log(int amount, int flags, int monst)
{
char logmessage[160], ltemp[80];
char *killer;
if (waswizard)
return;
#ifdef LOGFILE
sprintf(logmessage, "%d %d %.20s ", time(NULL), amount, whoami);
if (flags == 0) /* died */
{
strcat(logmessage, "killed by a");
killer = killname(monst);
if (*killer == 'a' || *killer == 'e' || *killer == 'i' ||
*killer == 'o' || *killer == 'u')
strcat(logmessage, "n ");
else
strcat(logmessage, " ");
strcat(logmessage, killer);
if (max_level > level)
sprintf(ltemp, " on level %d [max %d]\n", level, max_level);
else
sprintf(ltemp, " on level %d\n", level);
strcat(logmessage, ltemp);
}
else if (flags == 1) /* quit */
{
if (max_level > level)
sprintf(ltemp, "quit on level %d [max %d]\n", level, max_level);
else
sprintf(ltemp, "quit on level %d\n", level);
strcat(logmessage, ltemp);
}
else if (flags == 2) /* won */
{
sprintf(ltemp, "escaped with the Amulet found on level %d\n", max_level);
strcat(logmessage, ltemp);
}
else
return;
logf = fopen(LOGFILE, "a"); /* permissions? */
if (logf == NULL)
return;
/* and write it */
md_lockfile(logf);
fprintf(logf, "%s", logmessage);
md_unlockfile(logf);
fclose(logf);
#endif
return;
}
void
total_winner()
{
@ -394,6 +473,7 @@ total_winner()
}
mvprintw(c - 'a' + 1, 0," %5d Gold Peices ", oldpurse);
refresh();
log(purse, 2, 0);
score(purse, 2, 0);
exit(0);
}

View file

@ -443,6 +443,7 @@ extern int inpack; /* Number of things in pack */
extern int jump; /* Show running as series of jumps */
extern int lastscore; /* Score before this turn */
extern int level; /* What level rogue is on */
extern FILE * logf;
extern char lvl_mons[27];
extern struct linked_list * lvl_obj; /* List of objects on this level */
extern int max_hp; /* Player's max hit points */
@ -597,6 +598,7 @@ void killed(struct linked_list *item, int pr);
char * killname(int monst);
void lengthen(void (*func)(), int xtime);
void light(coord *cp);
void log(int amount, int flags, int monst);
void look(int wakeup);
void miss(char *er, char *ee);
void missile(int ydelta, int xdelta);