abstract
| - Below is the full text to vault.c from the source code of NetHack 2.2a. To link to a particular line, write [[NetHack 2.2a/vault.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)vault.c 2.1 87/10/17 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. 4. #include "hack.h" 5. #ifdef QUEST 6. setgd(/* mtmp */) /* struct monst *mtmp; */ {} 7. gd_move() { return(2); } 8. gddead(mtmp) struct monst *mtmp; {} 9. replgd(mtmp,mtmp2) struct monst *mtmp, *mtmp2; {} 10. invault(){} 11. 12. #else 13. 14. 15. #include "mkroom.h" 16. extern struct monst *makemon(); 17. #define FCSIZ (ROWNO+COLNO) 18. struct fakecorridor { 19. xchar fx,fy,ftyp; 20. }; 21. 22. struct egd { 23. int fcbeg, fcend; /* fcend: first unused pos */ 24. xchar gdx, gdy; /* goal of guard's walk */ 25. unsigned gddone:1; 26. struct fakecorridor fakecorr[FCSIZ]; 27. }; 28. 29. struct permonst pm_guard = 30. { "guard", '@', 12, 12, -1, 40, 4, 10, sizeof(struct egd) }; 31. 32. static struct monst *guard; 33. static int gdlevel; 34. #define EGD ((struct egd *)(&(guard->mextra[0]))) 35. 36. static 37. restfakecorr() 38. { 39. register fcx,fcy,fcbeg; 40. register struct rm *crm; 41. 42. while((fcbeg = EGD->fcbeg) < EGD->fcend) { 43. fcx = EGD->fakecorr[fcbeg].fx; 44. fcy = EGD->fakecorr[fcbeg].fy; 45. if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) || 46. m_at(fcx,fcy)) 47. return; 48. crm = &levl[fcx][fcy]; 49. crm->typ = EGD->fakecorr[fcbeg].ftyp; 50. if(!crm->typ) crm->seen = 0; 51. newsym(fcx,fcy); 52. EGD->fcbeg++; 53. } 54. /* it seems he left the corridor - let the guard disappear */ 55. mondead(guard); 56. guard = 0; 57. } 58. 59. static 60. goldincorridor() 61. { 62. register int fci; 63. 64. for(fci = EGD->fcbeg; fci < EGD->fcend; fci++) 65. if(g_at(EGD->fakecorr[fci].fx, EGD->fakecorr[fci].fy)) 66. return(1); 67. return(0); 68. } 69. 70. setgd(){ 71. register struct monst *mtmp; 72. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isgd){ 73. guard = mtmp; 74. gdlevel = dlevel; 75. return; 76. } 77. guard = 0; 78. } 79. 80. invault(){ 81. register tmp = inroom(u.ux, u.uy); 82. if(tmp < 0 || rooms[tmp].rtype != VAULT) { 83. u.uinvault = 0; 84. return; 85. } 86. if(++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) { 87. char buf[BUFSZ]; 88. register x,y,dd,gx,gy; 89. 90. /* first find the goal for the guard */ 91. for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) { 92. for(y = u.uy-dd; y <= u.uy+dd; y++) { 93. if(y < 0 || y > ROWNO-1) continue; 94. for(x = u.ux-dd; x <= u.ux+dd; x++) { 95. if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd) 96. x = u.ux+dd; 97. if(x < 0 || x > COLNO-1) continue; 98. if(levl[x][y].typ == CORR) goto fnd; 99. } 100. } 101. } 102. impossible("Not a single corridor on this level??"); 103. tele(); 104. return; 105. fnd: 106. gx = x; gy = y; 107. 108. /* next find a good place for a door in the wall */ 109. x = u.ux; y = u.uy; 110. while(levl[x][y].typ == ROOM) { 111. register int dx,dy; 112. 113. dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; 114. dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; 115. if(abs(gx-x) >= abs(gy-y)) 116. x += dx; 117. else 118. y += dy; 119. } 120. 121. /* make something interesting happen */ 122. if(!(guard = makemon(&pm_guard,x,y))) return; 123. guard->isgd = guard->mpeaceful = 1; 124. EGD->gddone = 0; 125. gdlevel = dlevel; 126. if(!cansee(guard->mx, guard->my)) { 127. mondead(guard); 128. guard = 0; 129. return; 130. } 131. 132. pline("Suddenly one of the Vault's guards enters!"); 133. pmon(guard); 134. do { 135. pline("\"Hello stranger, who are you?\" - "); 136. getlin(buf); 137. } while (!letter(buf[0])); 138. 139. if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) { 140. pline("\"Oh, yes - of course. Sorry to have disturbed you.\""); 141. mondead(guard); 142. guard = 0; 143. return; 144. } 145. clrlin(); 146. pline("\"I don't know you.\""); 147. if(!u.ugold) 148. pline("\"Please follow me.\""); 149. else { 150. pline("\"Most likely all that gold was stolen from this vault.\""); 151. pline("\"Please drop your gold (say d$ ) and follow me.\""); 152. } 153. EGD->gdx = gx; 154. EGD->gdy = gy; 155. EGD->fcbeg = 0; 156. EGD->fakecorr[0].fx = x; 157. EGD->fakecorr[0].fy = y; 158. EGD->fakecorr[0].ftyp = levl[x][y].typ; 159. levl[x][y].typ = DOOR; 160. EGD->fcend = 1; 161. } 162. } 163. 164. gd_move(){ 165. register int x,y,dx,dy,gx,gy,nx,ny,typ; 166. register struct fakecorridor *fcp; 167. register struct rm *crm; 168. if(!guard || gdlevel != dlevel){ 169. impossible("Where is the guard?"); 170. return(2); /* died */ 171. } 172. if(u.ugold || goldincorridor()) 173. return(0); /* didnt move */ 174. if(dist(guard->mx,guard->my) > 1 || EGD->gddone) { 175. restfakecorr(); 176. return(0); /* didnt move */ 177. } 178. x = guard->mx; 179. y = guard->my; 180. /* look around (hor & vert only) for accessible places */ 181. for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) { 182. if(nx == x || ny == y) if(nx != x || ny != y) 183. if(isok(nx,ny)) 184. if(!IS_WALL(typ = (crm = &levl[nx][ny])->typ) && typ != POOL) { 185. register int i; 186. for(i = EGD->fcbeg; i < EGD->fcend; i++) 187. if(EGD->fakecorr[i].fx == nx && 188. EGD->fakecorr[i].fy == ny) 189. goto nextnxy; 190. if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT) 191. goto nextnxy; 192. /* seems we found a good place to leave him alone */ 193. EGD->gddone = 1; 194. if(ACCESSIBLE(typ)) goto newpos; 195. crm->typ = (typ == SCORR) ? CORR : DOOR; 196. goto proceed; 197. } 198. nextnxy: ; 199. } 200. nx = x; 201. ny = y; 202. gx = EGD->gdx; 203. gy = EGD->gdy; 204. dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; 205. dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; 206. if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy; 207. 208. while((typ = (crm = &levl[nx][ny])->typ) != 0) { 209. /* in view of the above we must have IS_WALL(typ) or typ == POOL */ 210. /* must be a wall here */ 211. if(isok(nx+nx-x,ny+ny-y) && typ != POOL && 212. #ifdef RPH 213. SPACE_POS(levl[nx+nx-x][ny+ny-y].typ)){ 214. #else 215. ZAP_POS(levl[nx+nx-x][ny+ny-y].typ)){ 216. #endif 217. crm->typ = DOOR; 218. goto proceed; 219. } 220. if(dy && nx != x) { 221. nx = x; ny = y+dy; 222. continue; 223. } 224. if(dx && ny != y) { 225. ny = y; nx = x+dx; dy = 0; 226. continue; 227. } 228. /* I don't like this, but ... */ 229. crm->typ = DOOR; 230. goto proceed; 231. } 232. crm->typ = CORR; 233. proceed: 234. if(cansee(nx,ny)) { 235. mnewsym(nx,ny); 236. prl(nx,ny); 237. } 238. fcp = &(EGD->fakecorr[EGD->fcend]); 239. if(EGD->fcend++ == FCSIZ) panic("fakecorr overflow"); 240. fcp->fx = nx; 241. fcp->fy = ny; 242. fcp->ftyp = typ; 243. newpos: 244. if(EGD->gddone) nx = ny = 0; 245. guard->mx = nx; 246. guard->my = ny; 247. pmon(guard); 248. restfakecorr(); 249. return(1); 250. } 251. 252. gddead(){ 253. guard = 0; 254. } 255. 256. replgd(mtmp,mtmp2) 257. register struct monst *mtmp, *mtmp2; 258. { 259. if(mtmp == guard) 260. guard = mtmp2; 261. } 262. 263. #endif /* QUEST /**/
|