|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ ! 2: /* hack.lev.c - version 1.0.3 */ ! 3: ! 4: #include "hack.h" ! 5: #include "def.mkroom.h" ! 6: #include <stdio.h> ! 7: extern struct monst *restmonchn(); ! 8: extern struct obj *restobjchn(); ! 9: extern struct obj *billobjs; ! 10: extern char *itoa(); ! 11: extern char SAVEF[]; ! 12: extern int hackpid; ! 13: extern xchar dlevel; ! 14: extern char nul[]; ! 15: ! 16: #ifndef NOWORM ! 17: #include "def.wseg.h" ! 18: extern struct wseg *wsegs[32], *wheads[32]; ! 19: extern long wgrowtime[32]; ! 20: #endif NOWORM ! 21: ! 22: boolean level_exists[MAXLEVEL+1]; ! 23: ! 24: savelev(fd,lev) ! 25: int fd; ! 26: xchar lev; ! 27: { ! 28: #ifndef NOWORM ! 29: register struct wseg *wtmp, *wtmp2; ! 30: register tmp; ! 31: #endif NOWORM ! 32: ! 33: if(fd < 0) panic("Save on bad file!"); /* impossible */ ! 34: if(lev >= 0 && lev <= MAXLEVEL) ! 35: level_exists[lev] = TRUE; ! 36: ! 37: bwrite(fd,(char *) &hackpid,sizeof(hackpid)); ! 38: bwrite(fd,(char *) &lev,sizeof(lev)); ! 39: bwrite(fd,(char *) levl,sizeof(levl)); ! 40: bwrite(fd,(char *) &moves,sizeof(long)); ! 41: bwrite(fd,(char *) &xupstair,sizeof(xupstair)); ! 42: bwrite(fd,(char *) &yupstair,sizeof(yupstair)); ! 43: bwrite(fd,(char *) &xdnstair,sizeof(xdnstair)); ! 44: bwrite(fd,(char *) &ydnstair,sizeof(ydnstair)); ! 45: savemonchn(fd, fmon); ! 46: savegoldchn(fd, fgold); ! 47: savetrapchn(fd, ftrap); ! 48: saveobjchn(fd, fobj); ! 49: saveobjchn(fd, billobjs); ! 50: billobjs = 0; ! 51: save_engravings(fd); ! 52: #ifndef QUEST ! 53: bwrite(fd,(char *) rooms,sizeof(rooms)); ! 54: bwrite(fd,(char *) doors,sizeof(doors)); ! 55: #endif QUEST ! 56: fgold = 0; ! 57: ftrap = 0; ! 58: fmon = 0; ! 59: fobj = 0; ! 60: #ifndef NOWORM ! 61: bwrite(fd,(char *) wsegs,sizeof(wsegs)); ! 62: for(tmp=1; tmp<32; tmp++){ ! 63: for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){ ! 64: wtmp2 = wtmp->nseg; ! 65: bwrite(fd,(char *) wtmp,sizeof(struct wseg)); ! 66: } ! 67: wsegs[tmp] = 0; ! 68: } ! 69: bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime)); ! 70: #endif NOWORM ! 71: } ! 72: ! 73: bwrite(fd,loc,num) ! 74: register fd; ! 75: register char *loc; ! 76: register unsigned num; ! 77: { ! 78: /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */ ! 79: if(write(fd, loc, (int) num) != num) ! 80: panic("cannot write %u bytes to file #%d", num, fd); ! 81: } ! 82: ! 83: saveobjchn(fd,otmp) ! 84: register fd; ! 85: register struct obj *otmp; ! 86: { ! 87: register struct obj *otmp2; ! 88: unsigned xl; ! 89: int minusone = -1; ! 90: ! 91: while(otmp) { ! 92: otmp2 = otmp->nobj; ! 93: xl = otmp->onamelth; ! 94: bwrite(fd, (char *) &xl, sizeof(int)); ! 95: bwrite(fd, (char *) otmp, xl + sizeof(struct obj)); ! 96: free((char *) otmp); ! 97: otmp = otmp2; ! 98: } ! 99: bwrite(fd, (char *) &minusone, sizeof(int)); ! 100: } ! 101: ! 102: savemonchn(fd,mtmp) ! 103: register fd; ! 104: register struct monst *mtmp; ! 105: { ! 106: register struct monst *mtmp2; ! 107: unsigned xl; ! 108: int minusone = -1; ! 109: struct permonst *monbegin = &mons[0]; ! 110: ! 111: bwrite(fd, (char *) &monbegin, sizeof(monbegin)); ! 112: ! 113: while(mtmp) { ! 114: mtmp2 = mtmp->nmon; ! 115: xl = mtmp->mxlth + mtmp->mnamelth; ! 116: bwrite(fd, (char *) &xl, sizeof(int)); ! 117: bwrite(fd, (char *) mtmp, xl + sizeof(struct monst)); ! 118: if(mtmp->minvent) saveobjchn(fd,mtmp->minvent); ! 119: free((char *) mtmp); ! 120: mtmp = mtmp2; ! 121: } ! 122: bwrite(fd, (char *) &minusone, sizeof(int)); ! 123: } ! 124: ! 125: savegoldchn(fd,gold) ! 126: register fd; ! 127: register struct gold *gold; ! 128: { ! 129: register struct gold *gold2; ! 130: while(gold) { ! 131: gold2 = gold->ngold; ! 132: bwrite(fd, (char *) gold, sizeof(struct gold)); ! 133: free((char *) gold); ! 134: gold = gold2; ! 135: } ! 136: bwrite(fd, nul, sizeof(struct gold)); ! 137: } ! 138: ! 139: savetrapchn(fd,trap) ! 140: register fd; ! 141: register struct trap *trap; ! 142: { ! 143: register struct trap *trap2; ! 144: while(trap) { ! 145: trap2 = trap->ntrap; ! 146: bwrite(fd, (char *) trap, sizeof(struct trap)); ! 147: free((char *) trap); ! 148: trap = trap2; ! 149: } ! 150: bwrite(fd, nul, sizeof(struct trap)); ! 151: } ! 152: ! 153: getlev(fd,pid,lev) ! 154: int fd,pid; ! 155: xchar lev; ! 156: { ! 157: register struct gold *gold; ! 158: register struct trap *trap; ! 159: #ifndef NOWORM ! 160: register struct wseg *wtmp; ! 161: #endif NOWORM ! 162: register tmp; ! 163: long omoves; ! 164: int hpid; ! 165: xchar dlvl; ! 166: ! 167: /* First some sanity checks */ ! 168: mread(fd, (char *) &hpid, sizeof(hpid)); ! 169: mread(fd, (char *) &dlvl, sizeof(dlvl)); ! 170: if((pid && pid != hpid) || (lev && dlvl != lev)) { ! 171: pline("Strange, this map is not as I remember it."); ! 172: pline("Somebody is trying some trickery here ..."); ! 173: pline("This game is void ..."); ! 174: done("tricked"); ! 175: } ! 176: ! 177: fgold = 0; ! 178: ftrap = 0; ! 179: mread(fd, (char *) levl, sizeof(levl)); ! 180: mread(fd, (char *)&omoves, sizeof(omoves)); ! 181: mread(fd, (char *)&xupstair, sizeof(xupstair)); ! 182: mread(fd, (char *)&yupstair, sizeof(yupstair)); ! 183: mread(fd, (char *)&xdnstair, sizeof(xdnstair)); ! 184: mread(fd, (char *)&ydnstair, sizeof(ydnstair)); ! 185: ! 186: fmon = restmonchn(fd); ! 187: ! 188: /* regenerate animals while on another level */ ! 189: { long tmoves = (moves > omoves) ? moves-omoves : 0; ! 190: register struct monst *mtmp, *mtmp2; ! 191: extern char genocided[]; ! 192: ! 193: for(mtmp = fmon; mtmp; mtmp = mtmp2) { ! 194: long newhp; /* tmoves may be very large */ ! 195: ! 196: mtmp2 = mtmp->nmon; ! 197: if(index(genocided, mtmp->data->mlet)) { ! 198: mondead(mtmp); ! 199: continue; ! 200: } ! 201: ! 202: if(mtmp->mtame && tmoves > 250) { ! 203: mtmp->mtame = 0; ! 204: mtmp->mpeaceful = 0; ! 205: } ! 206: ! 207: newhp = mtmp->mhp + ! 208: (index(MREGEN, mtmp->data->mlet) ? tmoves : tmoves/20); ! 209: if(newhp > mtmp->mhpmax) ! 210: mtmp->mhp = mtmp->mhpmax; ! 211: else ! 212: mtmp->mhp = newhp; ! 213: } ! 214: } ! 215: ! 216: setgd(); ! 217: gold = newgold(); ! 218: mread(fd, (char *)gold, sizeof(struct gold)); ! 219: while(gold->gx) { ! 220: gold->ngold = fgold; ! 221: fgold = gold; ! 222: gold = newgold(); ! 223: mread(fd, (char *)gold, sizeof(struct gold)); ! 224: } ! 225: free((char *) gold); ! 226: trap = newtrap(); ! 227: mread(fd, (char *)trap, sizeof(struct trap)); ! 228: while(trap->tx) { ! 229: trap->ntrap = ftrap; ! 230: ftrap = trap; ! 231: trap = newtrap(); ! 232: mread(fd, (char *)trap, sizeof(struct trap)); ! 233: } ! 234: free((char *) trap); ! 235: fobj = restobjchn(fd); ! 236: billobjs = restobjchn(fd); ! 237: rest_engravings(fd); ! 238: #ifndef QUEST ! 239: mread(fd, (char *)rooms, sizeof(rooms)); ! 240: mread(fd, (char *)doors, sizeof(doors)); ! 241: #endif QUEST ! 242: #ifndef NOWORM ! 243: mread(fd, (char *)wsegs, sizeof(wsegs)); ! 244: for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){ ! 245: wheads[tmp] = wsegs[tmp] = wtmp = newseg(); ! 246: while(1) { ! 247: mread(fd, (char *)wtmp, sizeof(struct wseg)); ! 248: if(!wtmp->nseg) break; ! 249: wheads[tmp]->nseg = wtmp = newseg(); ! 250: wheads[tmp] = wtmp; ! 251: } ! 252: } ! 253: mread(fd, (char *)wgrowtime, sizeof(wgrowtime)); ! 254: #endif NOWORM ! 255: } ! 256: ! 257: mread(fd, buf, len) ! 258: register fd; ! 259: register char *buf; ! 260: register unsigned len; ! 261: { ! 262: register int rlen; ! 263: extern boolean restoring; ! 264: ! 265: rlen = read(fd, buf, (int) len); ! 266: if(rlen != len){ ! 267: pline("Read %d instead of %u bytes.\n", rlen, len); ! 268: if(restoring) { ! 269: (void) unlink(SAVEF); ! 270: error("Error restoring old game."); ! 271: } ! 272: panic("Error reading level file."); ! 273: } ! 274: } ! 275: ! 276: mklev() ! 277: { ! 278: extern boolean in_mklev; ! 279: ! 280: if(getbones()) return; ! 281: ! 282: in_mklev = TRUE; ! 283: makelevel(); ! 284: in_mklev = FALSE; ! 285: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.