About: Source:NetHack 3.3.0/vault.c   Sponge Permalink

An Entity of Type : owl:Thing, within Data Space : 134.155.108.49:8890 associated with source dataset(s)

Below is the full text to vault.c from the source code of NetHack 3.3.0. To link to a particular line, write [[NetHack 3.3.0/vault.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code

AttributesValues
rdfs:label
  • Source:NetHack 3.3.0/vault.c
rdfs:comment
  • Below is the full text to vault.c from the source code of NetHack 3.3.0. To link to a particular line, write [[NetHack 3.3.0/vault.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code
dcterms:subject
dbkwik:nethack/pro...iPageUsesTemplate
abstract
  • Below is the full text to vault.c from the source code of NetHack 3.3.0. To link to a particular line, write [[NetHack 3.3.0/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 3.3 96/06/05 */ 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. #include "vault.h" 7. 8. STATIC_DCL struct monst *NDECL(findgd); 9. 10. #ifdef OVLB 11. 12. STATIC_DCL boolean FDECL(clear_fcorr, (struct monst *,BOOLEAN_P)); 13. STATIC_DCL void FDECL(restfakecorr,(struct monst *)); 14. STATIC_DCL boolean FDECL(in_fcorridor, (struct monst *,int,int)); 15. STATIC_DCL void FDECL(move_gold,(struct obj *,int)); 16. STATIC_DCL void FDECL(wallify_vault,(struct monst *)); 17. 18. STATIC_OVL boolean 19. clear_fcorr(grd, forceshow) 20. register struct monst *grd; 21. register boolean forceshow; 22. { 23. register int fcx, fcy, fcbeg; 24. register struct monst *mtmp; 25. 26. while((fcbeg = EGD(grd)->fcbeg) < EGD(grd)->fcend) { 27. fcx = EGD(grd)->fakecorr[fcbeg].fx; 28. fcy = EGD(grd)->fakecorr[fcbeg].fy; 29. if((grd->mhp <= 0 || !in_fcorridor(grd, u.ux, u.uy)) && 30. EGD(grd)->gddone) 31. forceshow = TRUE; 32. if((u.ux == fcx && u.uy == fcy && grd->mhp > 0) 33. || (!forceshow && couldsee(fcx,fcy)) 34. || (Punished && !carried(uball) 35. && uball->ox == fcx && uball->oy == fcy)) 36. return FALSE; 37. 38. if ((mtmp = m_at(fcx,fcy)) != 0) { 39. if(mtmp->isgd) return(FALSE); 40. else if(!in_fcorridor(grd, u.ux, u.uy)) { 41. if(mtmp->mtame) yelp(mtmp); 42. rloc(mtmp); 43. } 44. } 45. levl[fcx][fcy].typ = EGD(grd)->fakecorr[fcbeg].ftyp; 46. map_location(fcx, fcy, 1); /* bypass vision */ 47. if(!ACCESSIBLE(levl[fcx][fcy].typ)) block_point(fcx,fcy); 48. EGD(grd)->fcbeg++; 49. } 50. if(grd->mhp <= 0) { 51. pline_The("corridor disappears."); 52. if(IS_ROCK(levl[u.ux][u.uy].typ)) You("are encased in rock."); 53. } 54. return(TRUE); 55. } 56. 57. STATIC_OVL void 58. restfakecorr(grd) 59. register struct monst *grd; 60. { 61. /* it seems you left the corridor - let the guard disappear */ 62. if(clear_fcorr(grd, FALSE)) mongone(grd); 63. } 64. 65. boolean 66. grddead(grd) /* called in mon.c */ 67. register struct monst *grd; 68. { 69. register boolean dispose = clear_fcorr(grd, TRUE); 70. 71. if(!dispose) { 72. /* see comment by newpos in gd_move() */ 73. remove_monster(grd->mx, grd->my); 74. newsym(grd->mx, grd->my); 75. place_monster(grd, 0, 0); 76. EGD(grd)->ogx = grd->mx; 77. EGD(grd)->ogy = grd->my; 78. dispose = clear_fcorr(grd, TRUE); 79. } 80. return(dispose); 81. } 82. 83. STATIC_OVL boolean 84. in_fcorridor(grd, x, y) 85. register struct monst *grd; 86. int x, y; 87. { 88. register int fci; 89. 90. for(fci = EGD(grd)->fcbeg; fci < EGD(grd)->fcend; fci++) 91. if(x == EGD(grd)->fakecorr[fci].fx && 92. y == EGD(grd)->fakecorr[fci].fy) 93. return(TRUE); 94. return(FALSE); 95. } 96. 97. STATIC_OVL 98. struct monst * 99. findgd() 100. { 101. register struct monst *mtmp; 102. 103. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 104. if(mtmp->isgd && on_level(&(EGD(mtmp)->gdlevel), &u.uz)) 105. return(mtmp); 106. return((struct monst *)0); 107. } 108. 109. #endif /* OVLB */ 110. #ifdef OVL0 111. 112. char 113. vault_occupied(array) 114. char *array; 115. { 116. register char *ptr; 117. 118. for (ptr = array; *ptr; ptr++) 119. if (rooms[*ptr - ROOMOFFSET].rtype == VAULT) 120. return(*ptr); 121. return('\0'); 122. } 123. 124. void 125. invault() 126. { 127. #ifdef BSD_43_BUG 128. int dummy; /* hack to avoid schain botch */ 129. #endif 130. struct monst *guard; 131. int vaultroom = (int)vault_occupied(u.urooms); 132. 133. if(!vaultroom) { 134. u.uinvault = 0; 135. return; 136. } 137. 138. vaultroom -= ROOMOFFSET; 139. 140. guard = findgd(); 141. if(++u.uinvault % 30 == 0 && !guard) { /* if time ok and no guard now. */ 142. char buf[BUFSZ]; 143. register int x, y, dd, gx, gy; 144. int lx = 0, ly = 0; 145. 146. /* first find the goal for the guard */ 147. for(dd = 2; (dd < ROWNO || dd < COLNO); dd++) { 148. for(y = u.uy-dd; y <= u.uy+dd; ly = y, y++) { 149. if(y < 0 || y > ROWNO-1) continue; 150. for(x = u.ux-dd; x <= u.ux+dd; lx = x, x++) { 151. if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd) 152. x = u.ux+dd; 153. if(x < 1 || x > COLNO-1) continue; 154. if(levl[x][y].typ == CORR) { 155. if(x < u.ux) lx = x + 1; 156. else if(x > u.ux) lx = x - 1; 157. else lx = x; 158. if(y < u.uy) ly = y + 1; 159. else if(y > u.uy) ly = y - 1; 160. else ly = y; 161. if(levl[lx][ly].typ != STONE && levl[lx][ly].typ != CORR) 162. goto incr_radius; 163. goto fnd; 164. } 165. } 166. } 167. incr_radius: ; 168. } 169. impossible("Not a single corridor on this level??"); 170. tele(); 171. return; 172. fnd: 173. gx = x; gy = y; 174. 175. /* next find a good place for a door in the wall */ 176. x = u.ux; y = u.uy; 177. if(levl[x][y].typ != ROOM) { /* player dug a door and is in it */ 178. if(levl[x+1][y].typ == ROOM) x = x + 1; 179. else if(levl[x][y+1].typ == ROOM) y = y + 1; 180. else if(levl[x-1][y].typ == ROOM) x = x - 1; 181. else if(levl[x][y-1].typ == ROOM) y = y - 1; 182. else if(levl[x+1][y+1].typ == ROOM) { 183. x = x + 1; 184. y = y + 1; 185. } else if (levl[x-1][y-1].typ == ROOM) { 186. x = x - 1; 187. y = y - 1; 188. } else if (levl[x+1][y-1].typ == ROOM) { 189. x = x + 1; 190. y = y - 1; 191. } else if (levl[x-1][y+1].typ == ROOM) { 192. x = x - 1; 193. y = y + 1; 194. } 195. } 196. while(levl[x][y].typ == ROOM) { 197. register int dx,dy; 198. 199. dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; 200. dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; 201. if(abs(gx-x) >= abs(gy-y)) 202. x += dx; 203. else 204. y += dy; 205. } 206. if(x == u.ux && y == u.uy) { 207. if(levl[x+1][y].typ == HWALL || levl[x+1][y].typ == DOOR) 208. x = x + 1; 209. else if(levl[x-1][y].typ == HWALL || levl[x-1][y].typ == DOOR) 210. x = x - 1; 211. else if(levl[x][y+1].typ == VWALL || levl[x][y+1].typ == DOOR) 212. y = y + 1; 213. else if(levl[x][y-1].typ == VWALL || levl[x][y-1].typ == DOOR) 214. y = y - 1; 215. else return; 216. } 217. 218. /* make something interesting happen */ 219. if(!(guard = makemon(&mons[PM_GUARD], x, y, NO_MM_FLAGS))) return; 220. guard->isgd = 1; 221. guard->mpeaceful = 1; 222. set_malign(guard); 223. EGD(guard)->gddone = 0; 224. EGD(guard)->ogx = x; 225. EGD(guard)->ogy = y; 226. assign_level(&(EGD(guard)->gdlevel), &u.uz); 227. EGD(guard)->vroom = vaultroom; 228. EGD(guard)->warncnt = 0; 229. 230. if(!cansee(guard->mx, guard->my)) { 231. mongone(guard); 232. return; 233. } 234. 235. reset_faint(); /* if fainted - wake up */ 236. pline("Suddenly one of the Vault's guards enters!"); 237. newsym(guard->mx,guard->my); 238. if (Strangled || youmonst.data->msound == MS_SILENT) { 239. verbalize("I'll be back when you're ready to speak to me!"); 240. mongone(guard); 241. return; 242. } 243. stop_occupation(); /* if occupied, stop it *now* */ 244. do { 245. getlin("\"Hello stranger, who are you?\" -",buf); 246. } while (!letter(buf[0])); 247. 248. if (u.ualign.type == A_LAWFUL && 249. /* ignore trailing text, in case player includes character's rank */ 250. strncmpi(buf, plname, (int) strlen(plname)) != 0) { 251. adjalign(-1); /* Liar! */ 252. } 253. 254. if (!strcmpi(buf, "Croesus") || !strcmpi(buf, "Kroisos") 255. #ifdef TOURIST 256. || !strcmpi(buf, "Creosote") 257. #endif 258. ) { 259. if (!mvitals[PM_CROESUS].died) { 260. verbalize("Oh, yes, of course. Sorry to have disturbed you."); 261. mongone(guard); 262. } else { 263. setmangry(guard); 264. verbalize("Back from the dead, are you? I'll remedy that!"); 265. /* don't want guard to waste next turn wielding a weapon */ 266. if (!MON_WEP(guard)) { 267. guard->weapon_check = NEED_HTH_WEAPON; 268. (void) mon_wield_item(guard); 269. } 270. } 271. return; 272. } 273. verbalize("I don't know you."); 274. if (!u.ugold && !hidden_gold()) 275. verbalize("Please follow me."); 276. else { 277. if (!u.ugold) 278. verbalize("You have hidden gold."); 279. verbalize("Most likely all your gold was stolen from this vault."); 280. verbalize("Please drop that gold and follow me."); 281. } 282. EGD(guard)->gdx = gx; 283. EGD(guard)->gdy = gy; 284. EGD(guard)->fcbeg = 0; 285. EGD(guard)->fakecorr[0].fx = x; 286. EGD(guard)->fakecorr[0].fy = y; 287. if(IS_WALL(levl[x][y].typ)) 288. EGD(guard)->fakecorr[0].ftyp = levl[x][y].typ; 289. else { /* the initial guard location is a dug door */ 290. int vlt = EGD(guard)->vroom; 291. xchar lowx = rooms[vlt].lx, hix = rooms[vlt].hx; 292. xchar lowy = rooms[vlt].ly, hiy = rooms[vlt].hy; 293. 294. if(x == lowx-1 && y == lowy-1) 295. EGD(guard)->fakecorr[0].ftyp = TLCORNER; 296. else if(x == hix+1 && y == lowy-1) 297. EGD(guard)->fakecorr[0].ftyp = TRCORNER; 298. else if(x == lowx-1 && y == hiy+1) 299. EGD(guard)->fakecorr[0].ftyp = BLCORNER; 300. else if(x == hix+1 && y == hiy+1) 301. EGD(guard)->fakecorr[0].ftyp = BRCORNER; 302. else if(y == lowy-1 || y == hiy+1) 303. EGD(guard)->fakecorr[0].ftyp = HWALL; 304. else if(x == lowx-1 || x == hix+1) 305. EGD(guard)->fakecorr[0].ftyp = VWALL; 306. } 307. levl[x][y].typ = DOOR; 308. levl[x][y].doormask = D_NODOOR; 309. unblock_point(x, y); /* doesn't block light */ 310. EGD(guard)->fcend = 1; 311. EGD(guard)->warncnt = 1; 312. } 313. } 314. 315. #endif /* OVL0 */ 316. #ifdef OVLB 317. 318. STATIC_OVL void 319. move_gold(gold, vroom) 320. struct obj *gold; 321. int vroom; 322. { 323. xchar nx, ny; 324. 325. remove_object(gold); 326. newsym(gold->ox, gold->oy); 327. nx = rooms[vroom].lx + rn2(2); 328. ny = rooms[vroom].ly + rn2(2); 329. place_object(gold, nx, ny); 330. stackobj(gold); 331. newsym(nx,ny); 332. } 333. 334. STATIC_OVL void 335. wallify_vault(grd) 336. struct monst *grd; 337. { 338. int x, y; 339. int vlt = EGD(grd)->vroom; 340. char tmp_viz; 341. xchar lowx = rooms[vlt].lx, hix = rooms[vlt].hx; 342. xchar lowy = rooms[vlt].ly, hiy = rooms[vlt].hy; 343. register struct obj *gold; 344. register boolean fixed = FALSE; 345. register boolean movedgold = FALSE; 346. 347. for(x = lowx-1; x <= hix+1; x++) 348. for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) { 349. if(!IS_WALL(levl[x][y].typ) && !in_fcorridor(grd, x, y)) { 350. if(MON_AT(x, y) && grd->mx != x && grd->my != y) { 351. struct monst *mon = m_at(x,y); 352. if (mon->mtame) yelp(mon); 353. rloc(mon); 354. } 355. if ((gold = g_at(x, y)) != 0) { 356. move_gold(gold, EGD(grd)->vroom); 357. movedgold = TRUE; 358. } 359. if(x == lowx-1 && y == lowy-1) 360. levl[x][y].typ = TLCORNER; 361. else if(x == hix+1 && y == lowy-1) 362. levl[x][y].typ = TRCORNER; 363. else if(x == lowx-1 && y == hiy+1) 364. levl[x][y].typ = BLCORNER; 365. else if(x == hix+1 && y == hiy+1) 366. levl[x][y].typ = BRCORNER; 367. else levl[x][y].typ = HWALL; 368. 369. levl[x][y].doormask = 0; 370. /* 371. * hack: player knows walls are restored because of the 372. * message, below, so show this on the screen. 373. */ 374. tmp_viz = viz_array[y][x]; 375. viz_array[y][x] = IN_SIGHT|COULD_SEE; 376. newsym(x,y); 377. viz_array[y][x] = tmp_viz; 378. block_point(x,y); 379. fixed = TRUE; 380. } 381. } 382. for(x = lowx-1; x <= hix+1; x += (hix-lowx+2)) 383. for(y = lowy; y <= hiy; y++) { 384. if(!IS_WALL(levl[x][y].typ) && !in_fcorridor(grd, x, y)) { 385. if(MON_AT(x, y) && grd->mx != x && grd->my != y) { 386. struct monst *mon = m_at(x,y); 387. if (mon->mtame) yelp(mon); 388. rloc(mon); 389. } 390. if ((gold = g_at(x, y)) != 0) { 391. move_gold(gold, EGD(grd)->vroom); 392. movedgold = TRUE; 393. } 394. levl[x][y].typ = VWALL; 395. levl[x][y].doormask = 0; 396. tmp_viz = viz_array[y][x]; 397. viz_array[y][x] = IN_SIGHT|COULD_SEE; 398. newsym(x,y); 399. viz_array[y][x] = tmp_viz; 400. block_point(x,y); 401. fixed = TRUE; 402. } 403. } 404. 405. if(movedgold || fixed) { 406. if(in_fcorridor(grd, grd->mx, grd->my) || cansee(grd->mx, grd->my)) 407. pline_The("guard whispers an incantation."); 408. else You_hear("a distant chant."); 409. if(movedgold) 410. pline("A mysterious force moves the gold into the vault."); 411. if(fixed) 412. pline_The("damaged vault's walls are magically restored!"); 413. } 414. } 415. 416. /* 417. * return 1: guard moved, 0: guard didn't, -1: let m_move do it, -2: died 418. */ 419. int 420. gd_move(grd) 421. register struct monst *grd; 422. { 423. int x, y, nx, ny, m, n; 424. int dx, dy, gx, gy, fci; 425. uchar typ; 426. struct fakecorridor *fcp; 427. register struct egd *egrd = EGD(grd); 428. register struct rm *crm; 429. register boolean goldincorridor = FALSE, 430. u_in_vault = vault_occupied(u.urooms)? TRUE : FALSE, 431. grd_in_vault = *in_rooms(grd->mx, grd->my, VAULT)? 432. TRUE : FALSE; 433. boolean disappear_msg_seen = FALSE, semi_dead = (grd->mhp <= 0); 434. register boolean u_carry_gold = ((u.ugold + hidden_gold()) > 0L); 435. 436. if(!on_level(&(egrd->gdlevel), &u.uz)) return(-1); 437. nx = ny = m = n = 0; 438. if(!u_in_vault && !grd_in_vault) 439. wallify_vault(grd); 440. if(!grd->mpeaceful) { 441. if(semi_dead) { 442. egrd->gddone =1; 443. goto newpos; 444. } 445. if(!u_in_vault && 446. (grd_in_vault || 447. (in_fcorridor(grd, grd->mx, grd->my) && 448. !in_fcorridor(grd, u.ux, u.uy)))) { 449. rloc(grd); 450. wallify_vault(grd); 451. (void) clear_fcorr(grd, TRUE); 452. goto letknow; 453. } 454. if(!in_fcorridor(grd, grd->mx, grd->my)) 455. (void) clear_fcorr(grd, TRUE); 456. return(-1); 457. } 458. if(abs(egrd->ogx - grd->mx) > 1 || 459. abs(egrd->ogy - grd->my) > 1) 460. return(-1); /* teleported guard - treat as monster */ 461. if(egrd->fcend == 1) { 462. if(u_in_vault && 463. (u_carry_gold || um_dist(grd->mx, grd->my, 1))) { 464. if(egrd->warncnt == 3) 465. verbalize("I repeat, %sfollow me!", 466. u_carry_gold ? (!u.ugold ? 467. "drop that hidden gold and " : 468. "drop that gold and ") : ""); 469. if(egrd->warncnt == 7) { 470. m = grd->mx; 471. n = grd->my; 472. verbalize("You've been warned, knave!"); 473. mnexto(grd); 474. levl[m][n].typ = egrd->fakecorr[0].ftyp; 475. newsym(m,n); 476. grd->mpeaceful = 0; 477. return(-1); 478. } 479. /* not fair to get mad when (s)he's fainted or paralyzed */ 480. if(!is_fainted() && multi >= 0) egrd->warncnt++; 481. return(0); 482. } 483. 484. if (!u_in_vault) 485. if (u_carry_gold) { /* player teleported */ 486. m = grd->mx; 487. n = grd->my; 488. rloc(grd); 489. levl[m][n].typ = egrd->fakecorr[0].ftyp; 490. newsym(m,n); 491. grd->mpeaceful = 0; 492. letknow: 493. if(!cansee(grd->mx, grd->my)) 494. You_hear("the shrill sound of a guard's whistle."); 495. else 496. You(um_dist(grd->mx, grd->my, 2) ? 497. "see an angry %s approaching." : 498. "are confronted by an angry %s.", 499. l_monnam(grd)); 500. return(-1); 501. } else { 502. verbalize("Well, begone."); 503. wallify_vault(grd); 504. egrd->gddone = 1; 505. goto cleanup; 506. } 507. } 508. 509. if(egrd->fcend > 1) { 510. if(egrd->fcend > 2 && in_fcorridor(grd, grd->mx, grd->my) && 511. !egrd->gddone && !in_fcorridor(grd, u.ux, u.uy) && 512. levl[egrd->fakecorr[0].fx][egrd->fakecorr[0].fy].typ 513. == egrd->fakecorr[0].ftyp) { 514. pline_The("guard, confused, disappears."); 515. disappear_msg_seen = TRUE; 516. goto cleanup; 517. } 518. if(u_carry_gold && 519. (in_fcorridor(grd, u.ux, u.uy) || 520. /* cover a 'blind' spot */ 521. (egrd->fcend > 1 && u_in_vault))) { 522. if(!grd->mx) { 523. restfakecorr(grd); 524. return(-2); 525. } 526. if(egrd->warncnt < 6) { 527. egrd->warncnt = 6; 528. verbalize("Drop all your gold, scoundrel!"); 529. return(0); 530. } else { 531. verbalize("So be it, rogue!"); 532. grd->mpeaceful = 0; 533. return(-1); 534. } 535. } 536. } 537. for(fci = egrd->fcbeg; fci < egrd->fcend; fci++) 538. if(g_at(egrd->fakecorr[fci].fx, egrd->fakecorr[fci].fy)){ 539. m = egrd->fakecorr[fci].fx; 540. n = egrd->fakecorr[fci].fy; 541. goldincorridor = TRUE; 542. } 543. if(goldincorridor && !egrd->gddone) { 544. x = grd->mx; 545. y = grd->my; 546. if (m == u.ux && n == u.uy) { 547. struct obj *gold = g_at(m,n); 548. /* Grab the gold from between the hero's feet. */ 549. grd->mgold += gold->quan; 550. delobj(gold); 551. newsym(m,n); 552. } else if (m == x && n == y) { 553. mpickgold(grd); /* does a newsym */ 554. } else { 555. /* just for insurance... */ 556. if (MON_AT(m, n) && m != grd->mx && n != grd->my) { 557. verbalize("Out of my way, scum!"); 558. rloc(m_at(m, n)); 559. } 560. remove_monster(grd->mx, grd->my); 561. newsym(grd->mx, grd->my); 562. place_monster(grd, m, n); 563. mpickgold(grd); /* does a newsym */ 564. } 565. if(cansee(m,n)) 566. pline("%s%s picks up the gold.", Monnam(grd), 567. grd->mpeaceful ? " calms down and" : ""); 568. if(x != grd->mx || y != grd->my) { 569. remove_monster(grd->mx, grd->my); 570. newsym(grd->mx, grd->my); 571. place_monster(grd, x, y); 572. newsym(x, y); 573. } 574. if(!grd->mpeaceful) return(-1); 575. else { 576. egrd->warncnt = 5; 577. return(0); 578. } 579. } 580. if(um_dist(grd->mx, grd->my, 1) || egrd->gddone) { 581. if(!egrd->gddone && !rn2(10)) verbalize("Move along!"); 582. restfakecorr(grd); 583. return(0); /* didn't move */ 584. } 585. x = grd->mx; 586. y = grd->my; 587. 588. if(u_in_vault) goto nextpos; 589. 590. /* look around (hor & vert only) for accessible places */ 591. for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) { 592. if((nx == x || ny == y) && (nx != x || ny != y) && isok(nx, ny)) { 593. 594. typ = (crm = &levl[nx][ny])->typ; 595. if(!IS_STWALL(typ) && !IS_POOL(typ)) { 596. 597. if(in_fcorridor(grd, nx, ny)) 598. goto nextnxy; 599. 600. if(*in_rooms(nx,ny,VAULT)) 601. continue; 602. 603. /* seems we found a good place to leave him alone */ 604. egrd->gddone = 1; 605. if(ACCESSIBLE(typ)) goto newpos; 606. #ifdef STUPID 607. if (typ == SCORR) 608. crm->typ = CORR; 609. else 610. crm->typ = DOOR; 611. #else 612. crm->typ = (typ == SCORR) ? CORR : DOOR; 613. #endif 614. if(crm->typ == DOOR) crm->doormask = D_NODOOR; 615. goto proceed; 616. } 617. } 618. nextnxy: ; 619. } 620. nextpos: 621. nx = x; 622. ny = y; 623. gx = egrd->gdx; 624. gy = egrd->gdy; 625. dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; 626. dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; 627. if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy; 628. 629. while((typ = (crm = &levl[nx][ny])->typ) != 0) { 630. /* in view of the above we must have IS_WALL(typ) or typ == POOL */ 631. /* must be a wall here */ 632. if(isok(nx+nx-x,ny+ny-y) && !IS_POOL(typ) && 633. IS_ROOM(levl[nx+nx-x][ny+ny-y].typ)){ 634. crm->typ = DOOR; 635. crm->doormask = D_NODOOR; 636. goto proceed; 637. } 638. if(dy && nx != x) { 639. nx = x; ny = y+dy; 640. continue; 641. } 642. if(dx && ny != y) { 643. ny = y; nx = x+dx; dy = 0; 644. continue; 645. } 646. /* I don't like this, but ... */ 647. if(IS_ROOM(typ)) { 648. crm->typ = DOOR; 649. crm->doormask = D_NODOOR; 650. goto proceed; 651. } 652. break; 653. } 654. crm->typ = CORR; 655. proceed: 656. unblock_point(nx, ny); /* doesn't block light */ 657. if (cansee(nx,ny)) 658. newsym(nx,ny); 659. 660. fcp = &(egrd->fakecorr[egrd->fcend]); 661. if(egrd->fcend++ == FCSIZ) panic("fakecorr overflow"); 662. fcp->fx = nx; 663. fcp->fy = ny; 664. fcp->ftyp = typ; 665. newpos: 666. if(egrd->gddone) { 667. /* The following is a kludge. We need to keep */ 668. /* the guard around in order to be able to make */ 669. /* the fake corridor disappear as the player */ 670. /* moves out of it, but we also need the guard */ 671. /* out of the way. We send the guard to never- */ 672. /* never land. We set ogx ogy to mx my in order */ 673. /* to avoid a check at the top of this function. */ 674. /* At the end of the process, the guard is killed */ 675. /* in restfakecorr(). */ 676. cleanup: 677. x = grd->mx; y = grd->my; 678. 679. wallify_vault(grd); 680. remove_monster(grd->mx, grd->my); 681. newsym(grd->mx,grd->my); 682. place_monster(grd, 0, 0); 683. egrd->ogx = grd->mx; 684. egrd->ogy = grd->my; 685. restfakecorr(grd); 686. if(!semi_dead && (in_fcorridor(grd, u.ux, u.uy) || 687. cansee(x, y))) { 688. if (!disappear_msg_seen) 689. pline("Suddenly, the guard disappears."); 690. return(1); 691. } 692. return(-2); 693. } 694. egrd->ogx = grd->mx; /* update old positions */ 695. egrd->ogy = grd->my; 696. remove_monster(grd->mx, grd->my); 697. place_monster(grd, nx, ny); 698. newsym(grd->mx,grd->my); 699. restfakecorr(grd); 700. return(1); 701. } 702. 703. /* Routine when dying or quitting with a vault guard around */ 704. void 705. paygd() 706. { 707. register struct monst *grd = findgd(); 708. struct obj *gold; 709. int gx,gy; 710. char buf[BUFSZ]; 711. 712. if (!u.ugold || !grd) return; 713. 714. if (u.uinvault) { 715. Your("%ld zorkmid%s goes into the Magic Memory Vault.", 716. u.ugold, plur(u.ugold)); 717. gx = u.ux; 718. gy = u.uy; 719. } else { 720. if(grd->mpeaceful) { /* guard has no "right" to your gold */ 721. mongone(grd); 722. return; 723. } 724. mnexto(grd); 725. pline("%s remits your gold to the vault.", Monnam(grd)); 726. gx = rooms[EGD(grd)->vroom].lx + rn2(2); 727. gy = rooms[EGD(grd)->vroom].ly + rn2(2); 728. Sprintf(buf, 729. "To Croesus: here's the gold recovered from %s the %s.", 730. plname, mons[u.umonster].mname); 731. make_engr_at(gx, gy, buf, 0L, ENGRAVE); 732. } 733. place_object(gold = mkgoldobj(u.ugold), gx, gy); 734. stackobj(gold); 735. mongone(grd); 736. } 737. 738. long 739. hidden_gold() 740. { 741. register long value = 0L; 742. register struct obj *obj; 743. 744. for (obj = invent; obj; obj = obj->nobj) 745. if (Has_contents(obj)) 746. value += contained_gold(obj); 747. /* unknown gold stuck inside statues may cause some consternation... */ 748. 749. return(value); 750. } 751. 752. boolean 753. gd_sound() /* prevent "You hear footsteps.." when inappropriate */ 754. { 755. register struct monst *grd = findgd(); 756. 757. if (vault_occupied(u.urooms)) return(FALSE); 758. else return((boolean)(grd == (struct monst *)0)); 759. } 760. 761. #endif /* OVLB */ 762. 763. /*vault.c*/
Alternative Linked Data Views: ODE     Raw Data in: CXML | CSV | RDF ( N-Triples N3/Turtle JSON XML ) | OData ( Atom JSON ) | Microdata ( JSON HTML) | JSON-LD    About   
This material is Open Knowledge   W3C Semantic Web Technology [RDF Data] Valid XHTML + RDFa
OpenLink Virtuoso version 07.20.3217, on Linux (x86_64-pc-linux-gnu), Standard Edition
Data on this page belongs to its respective rights holders.
Virtuoso Faceted Browser Copyright © 2009-2012 OpenLink Software