/* diag.c Larn is copyrighted 1986 by Noah Morgan. */ /* $FreeBSD: src/games/larn/diag.c,v 1.5 1999/11/16 02:57:21 billf Exp $ */ /* $DragonFly: src/games/larn/diag.c,v 1.5 2006/08/26 17:05:05 pavalos Exp $ */ #include #include #include #include "header.h" extern int rmst,maxitm,lasttime; static struct tms cputime; /* *************************** DIAG -- dungeon diagnostics *************************** subroutine to print out data for debugging */ static void greedy(void); static void fsorry(void); static void fcheat(void); #ifdef EXTRA static int dcount(int); static void drawdiagscreen(void); static int rndcount[16]; int diag(void) { int i,j; int hit,dam; cursors(); lwclose(); if (lcreat(diagfile) < 0) /* open the diagnostic file */ { lcreat((char*)0); lprcat("\ndiagnostic failure\n"); return(-1); } write(1,"\nDiagnosing . . .\n",18); lprcat("\n\nBeginning of DIAG diagnostics ----------\n"); /* for the character attributes */ lprintf("\n\nPlayer attributes:\n\nHit points: %2d(%2d)",(long)c[HP],(long)c[HPMAX]); lprintf("\ngold: %d Experience: %d Character level: %d Level in caverns: %d", (long)c[GOLD],(long)c[EXPERIENCE],(long)c[LEVEL],(long)level); lprintf("\nTotal types of monsters: %d",(long)MAXMONST+8); lprcat("\f\nHere's the dungeon:\n\n"); i=level; for (j=0; j to save game\n",fname); nosignal=0; return(-1); } set_score_output(); lwrite((char*)beenhere,MAXLEVEL+MAXVLEVEL); for (k=0; kp) lwrite((char*)sp,sizeof(struct sphere)); /* save spheres of annihilation */ time(&zzz); lprint((long)(zzz-initialtime)); lwrite((char*)&zzz,sizeof(long)); if (fstat(lfd,&statbuf)< 0) lprint(0L); else lprint((long)statbuf.st_ino); /* inode # */ lwclose(); lastmonst[0] = 0; #ifndef VT100 setscroll(); #endif /* VT100 */ lcreat((char*)0); nosignal=0; return(0); } void restoregame(char *fname) { int i,k; struct sphere *sp,*sp2; struct stat filetimes; cursors(); lprcat("\nRestoring . . ."); lflush(); if (lopen(fname) <= 0) { lcreat((char*)0); lprintf("\nCan't open file <%s>to restore game\n",fname); nap(2000); c[GOLD]=c[BANKACCOUNT]=0; died(-265); return; } lrfill((char*)beenhere,MAXLEVEL+MAXVLEVEL); for (k=0; kp=0; /* null out pointer */ if (i==0) spheres=sp; /* beginning of list */ else sp2->p = sp; } time(&zzz); initialtime = zzz-lrint_x(); fstat(fd,&filetimes); /* get the creation and modification time of file */ lrfill((char*)&zzz,sizeof(long)); zzz += 6; if (filetimes.st_ctime > zzz) fsorry(); /* file create time */ else if (filetimes.st_mtime > zzz) fsorry(); /* file modify time */ if (c[HP]<0) { died(284); return; } /* died a post mortem death */ oldx = oldy = 0; i = lrint_x(); /* inode # */ if (i && (filetimes.st_ino!=(unsigned)i)) fsorry(); lrclose(); if (strcmp(fname,ckpfile) == 0) { if (lappend(fname) < 0) fcheat(); else { lprc(' '); lwclose(); } lcreat((char*)0); } else if (unlink(fname) < 0) fcheat(); /* can't unlink save file */ /* for the greedy cheater checker */ for (k=0; k<6; k++) if (c[k]>99) greedy(); if (c[HPMAX]>999 || c[SPELLMAX]>125) greedy(); if (c[LEVEL]==25 && c[EXPERIENCE]>skill[24]) /* if patch up lev 25 player */ { long tmp; tmp = c[EXPERIENCE]-skill[24]; /* amount to go up */ c[EXPERIENCE] = skill[24]; raiseexperience((long)tmp); } getlevel(); lasttime=gtime; } /* subroutine to not allow greedy cheaters */ static void greedy(void) { #if WIZID if (wizard) return; #endif lprcat("\n\nI am so sorry, but your character is a little TOO good! Since this\n"); lprcat("cannot normally happen from an honest game, I must assume that you cheated.\n"); lprcat("In that you are GREEDY as well as a CHEATER, I cannot allow this game\n"); lprcat("to continue.\n"); nap(5000); c[GOLD]=c[BANKACCOUNT]=0; died(-267); return; } /* subroutine to not allow altered save files and terminate the attempted restart */ static void fsorry(void) { lprcat("\nSorry, but your savefile has been altered.\n"); lprcat("However, seeing as I am a good sport, I will let you play.\n"); lprcat("Be advised though, you won't be placed on the normal scoreboard."); cheat = 1; nap(4000); } /* subroutine to not allow game if save file can't be deleted */ static void fcheat(void) { #if WIZID if (wizard) return; #endif lprcat("\nSorry, but your savefile can't be deleted. This can only mean\n"); lprcat("that you tried to CHEAT by protecting the directory the savefile\n"); lprcat("is in. Since this is unfair to the rest of the larn community, I\n"); lprcat("cannot let you play this game.\n"); nap(5000); c[GOLD]=c[BANKACCOUNT]=0; died(-268); return; }