|
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 r
Length: 4665 (0x1239) Types: TextFile Names: »replay.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Rog-O-Matic/replay.c«
/* * replay.c: Rog-O-Matic XIV (CMU) Fri Dec 28 22:43:54 1984 - mlm * Copyright (C) 1985 by A. Appel, G. Jacobson, L. Hamey, and M. Mauldin * * Make a table of offsets to the beginning of each level of a * Rog-O-Matic log file. */ # include <curses.h> # include <ctype.h> # include "types.h" # include "globals.h" # define MAXNUMLEV 50 # define FIRSTLEVSTR "\nR: " # define NEWLEVSTR "\nR: {ff}" # define POSITAT "{ff}" struct levstruct { long pos; int level, gold, hp, hpmax, str, strmax, ac, explev, exp; } levpos[MAXNUMLEV]; int numlev = 0; /* * positionreplay: Called when user has typed the 'R' command, it fills * the level table by calling findlevel if necessary, and then positions * the log file to the level requested by the user. */ positionreplay () { int curlev; long curpos; char cmd; /* Prompt user for a command character, read it, and lower case it */ saynow ("Which level (f=first, p=previous, c=current, n=next, l=last): "); if (isupper ((cmd = getch ()))) cmd = tolower (cmd); /* Clear the prompt */ saynow (""); /* If command is not in the list, clear the prompt and exit. */ switch (cmd) { case 'f': case 'p': case 'c': case 'n': case 'l': break; default: return; } /* Save the current position in the file */ curpos = ftell (logfile); /* Read the log file, if we have not already done so */ if (!logdigested) { saynow ("Reading whole log file to find levels..."); if (!findlevel (logfile, levpos, &numlev, MAXNUMLEV)) { saynow ("Findlevel failed! Let's try to get back to where we were..."); fseek (logfile, curpos, 0); return; } logdigested++; } /* Now figure out the current level (so relative commands will work) */ for (curlev = 0; curlev < numlev-1; curlev++) if (levpos[curlev+1].pos > curpos) break; /* Now clear the screen, position the log file, and return */ switch (cmd) { case 'f': fseek (logfile, levpos[0].pos, 0); break; case 'p': if (curlev > 0) fseek (logfile, levpos[curlev-1].pos); else fseek (logfile, levpos[0].pos, 0); break; break; case 'c': fseek (logfile, levpos[curlev].pos); break; case 'n': if (curlev < numlev-1) fseek (logfile, levpos[curlev+1].pos); else fseek (logfile, levpos[curlev].pos, 0); break; break; case 'l': fseek (logfile, levpos[numlev-1].pos); break; default: fseek (logfile, 0L, 0); } clearscreen (); /* Clear the screen */ Level = -1; /* Force a newlevel() call */ } /* * findlevel: Make a table of offsets to the various levels of a * Rog-O-Matic log file. */ findlevel (f, levpos, numlev, maxnum) FILE *f; struct levstruct *levpos; int *numlev, maxnum; { char ch; int l=0; *numlev = 0; /* Position file after first newline */ rewind (f); while ((ch = getc (f)) != '\n' && (int) ch != EOF); /* This is that start of level one */ levpos[l].pos = ftell (f); if (!findmatch (f, FIRSTLEVSTR)) { rewind (f); return (FAILURE); } fillstruct (f, &levpos[l]); while (++l <= maxnum && findmatch (f, NEWLEVSTR)) { fseek (f, (long) -strlen (POSITAT), 1); levpos[l].pos = ftell (f); fillstruct (f, &levpos[l]); } *numlev = l; rewind (f); return (SUCCESS); } /* * fillstruct: scan the logfile from the current point, and fill in the * fields of a levstruct. */ fillstruct (f, lev) FILE *f; struct levstruct *lev; { lev->level = 0; lev->gold = 0; lev->hp = 0; lev->hpmax = 0; lev->str = 0; lev->strmax = 0; lev->ac = 0; lev->explev = 0; lev->exp = 0; if (!findmatch (f, "Level:")) return; fscanf (f, "%d", &lev->level); if (!findmatch (f, "Gold:")) return; fscanf (f, "%d", &lev->gold); if (!findmatch (f, "Hp:")) return; fscanf (f, "%d(%d)", &lev->hp, &lev->hpmax); if (!findmatch (f, "Str:")) return; fscanf (f, "%d(%d)", &lev->str, &lev->strmax); if (!findmatch (f, ":")) return; /* Armor class */ fscanf (f, "%d", &lev->ac); if (!findmatch (f, "Exp:")) return; fscanf (f, "%d/%d", &lev->explev, &lev->exp); saynow ("Found level %d, has %d gold...", lev->level, lev->gold); } /* * findmatch: read from a stream until string 's' has been read. Returns 0 * if EOF is read, and 1 if the match is found. The stream is left * immediately after the matched string. * * Restriction: 's' must not contain prefix of itself as a substring. */ int findmatch (f, s) FILE *f; char *s; { char *m = s, ch; while (*m && (int) (ch = fgetc (f)) != EOF) if (ch != *(m++)) m = s; if (*m) return (0); else return (1); }