|
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 d
Length: 6636 (0x19ec) Types: TextFile Names: »debug.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Rog-O-Matic/debug.c«
/* * debug.c: Rog-O-Matic XIV (CMU) Fri Dec 28 21:48:55 1984 - mlm * Copyright (C) 1985 by A. Appel, G. Jacobson, L. Hamey, and M. Mauldin * * This file contains the code for the debugger. Rogomatic has one of * the tensest internal debuggers around, because in the early days it * had an incredible number of bugs, with no way to repeat an error * (because Rogue uses a different dungeon each time). */ # include <curses.h> # include <setjmp.h> # include "types.h" # include "globals.h" # include "install.h" /* * Debugging wait loop: Handle the usual Rogomatic command chars, and also * allows dumping the flags '^' command. Exits when a non-command char is * typed. To use, just put a "dwait (type, "message");" wherever you need * debugging messages, and hit a space or a cr to continue */ dwait (msgtype, f, a1, a2, a3, a4, a5, a6, a7, a8) char *f; int msgtype, a1, a2, a3, a4, a5, a6, a7, a8; { char msg[128]; int r, c; /* Build the actual message */ sprintf (msg, f, a1, a2, a3, a4, a5, a6, a7, a8); /* Log the message if the error is severe enough */ if (!replaying && (msgtype & (D_FATAL | D_ERROR | D_WARNING))) { char errfn[128]; FILE *errfil; sprintf (errfn, "%s/error%s", RGMDIR, versionstr); if ((errfil = wopen (errfn, "a")) != NULL) { fprintf (errfil, "User %s, error type %d: %s\n\n", getname(), msgtype, msg); if (msgtype & (D_FATAL | D_ERROR)) { printsnap (errfil); summary (errfil, NEWLINE); fprintf (errfil, "\f\n"); } fclose (errfil); } } if (msgtype & D_FATAL) { extern jmp_buf commandtop; /* From play */ saynow (msg); playing = 0; quitrogue ("fatal error trap", Gold, SAVED); longjmp (commandtop); } if (! debug (msgtype | D_INFORM)) /* If debugoff */ { if (msgtype & D_SAY) /* Echo? */ { saynow (msg); return (1); } /* Yes => win */ return (0); /* No => lose */ } if (*msg) { mvaddstr (0, 0, msg); clrtoeol (); } /* Write msg */ if (noterm) return (1); /* Exit if no user */ /* Debugging loop, accept debugging commands from user */ while (1) { refresh (); switch (fgetc (stdin)) { case '?': say ("i=inv, d=debug !=stf, @=mon, #=wls, $=id, ^=flg, &=chr"); break; case 'i': at (1,0); dumpinv (NULL); at (row, col); break; case 'd': toggledebug (); break; case 't': transparent = 1; break; case '!': dumpstuff (); break; case '@': dumpmonster (); break; case '#': dumpwalls (); break; case '^': promptforflags (); break; case '&': if (getscrpos ("char", &r, &c)) saynow ("Char at %d,%d '%c'", r, c, screen[r][c]); break; case '(': dumpdatabase (); at (row, col); break; case ')': markcycles (DOPRINT); at (row, col); break; case '~': saynow ("Version %d, quit at %d", version, quitat); break; case '/': dosnapshot (); break; default: at (row, col); return (1); } } } /* * promptforflags: Prompt the user for a location and dump its flags. */ promptforflags () { int r, c; if (getscrpos ("flags", &r, &c)) { mvprintw (0, 0, "Flags for %d,%d ", r, c); dumpflags (r, c); clrtoeol (); at (row, col); } } /* * dumpflags: Create a message line for the scrmap flags of a particular * square. Note that the fnames[] array must match the * various flags defined in "types.h". */ char *fnames[] = { "been", "cango", "door", "hall", "psd", "room", "safe", "seen", "deadend", "stuff", "trap", "arrow", "trapdor", "teltrap", "gastrap", "beartrap", "dartrap", "waterap", "monster", "wall", "useless", "scarem", "stairs", "runok", "boundry", "sleeper", "everclr" }; dumpflags (r, c) int r, c; { char **f; int b; printw (":"); for (f=fnames, b=1; b<=EVERCLR; b = b * 2, f++) if (scrmap[r][c] & b) printw ("%s:", *f); } /* * Timehistory: print a time analysis of the game. */ timehistory (f, sep) FILE *f; char sep; { register int i, j; char s[2048]; timespent[0].timestamp = 0; sprintf (s, "Time Analysis: %s%c%c", "othr hand fght rest move expl rung grop srch door total", sep, sep); for (i=1; i<=MaxLevel; i++) { sprintf (s, "%slevel %2d: ", s, i); for (j = T_OTHER; j < T_LISTLEN; j++) sprintf (s, "%s%5d", s, timespent[i].activity[j]); sprintf (s, "%s%6d%c", s, timespent[i].timestamp - timespent[i-1].timestamp, sep); } if (f == NULL) addstr (s); else fprintf (f, "%s", s); } /* * toggledebug: Set the value of the debugging word. */ toggledebug () { char debugstr[100]; int type = debugging & ~(D_FATAL | D_ERROR | D_WARNING); if (debugging == D_ALL) debugging = D_NORMAL; else if (debugging == D_NORMAL) debugging = D_NORMAL | D_SEARCH; else if (type == D_SEARCH) debugging = D_NORMAL | D_BATTLE; else if (type == D_BATTLE) debugging = D_NORMAL | D_MESSAGE; else if (type == D_MESSAGE) debugging = D_NORMAL | D_PACK; else if (type == D_PACK) debugging = D_NORMAL | D_MONSTER; else if (type == D_MONSTER) debugging = D_NORMAL | D_CONTROL; else if (type == D_CONTROL) debugging = D_NORMAL | D_SCREEN; else if (type == D_SCREEN) debugging = D_NORMAL | D_WARNING; else if (!debug (D_INFORM)) debugging = D_NORMAL | D_WARNING | D_INFORM; else debugging = D_ALL; strcpy (debugstr, "Debugging :"); if (debug(D_FATAL)) strcat (debugstr, "fatal:"); if (debug(D_ERROR)) strcat (debugstr, "error:"); if (debug(D_WARNING)) strcat (debugstr, "warn:"); if (debug(D_INFORM)) strcat (debugstr, "info:"); if (debug(D_SEARCH)) strcat (debugstr, "search:"); if (debug(D_BATTLE)) strcat (debugstr, "battle:"); if (debug(D_MESSAGE)) strcat (debugstr, "msg:"); if (debug(D_PACK)) strcat (debugstr, "pack:"); if (debug(D_CONTROL)) strcat (debugstr, "ctrl:"); if (debug(D_SCREEN)) strcat (debugstr, "screen:"); if (debug(D_MONSTER)) strcat (debugstr, "monster:"); saynow (debugstr); } /* * getscrpos: Prompt the user for an x,y coordinate on the screen. */ getscrpos (msg, r, c) char *msg; int *r, *c; { char buf[256]; saynow ("At %d,%d: enter 'row,col' for %s: ", atrow, atcol, msg); if (fgets (buf, 256, stdin)) { sscanf (buf, "%d,%d", r, c); if (*r>=1 && *r<23 && *c>=0 && *c<=79) return (1); else say ("%d,%d is not on the screen!", *r, *c); } at (row, col); return (0); }