abstract
| - Below is the full text to bones.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/bones.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)bones.c 1.3 87/07/14 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* bones.c - version 1.0.3 */ 4. 5. #include "hack.h" 6. extern char plname[PL_NSIZ]; 7. extern long somegold(); 8. extern struct monst *makemon(); 9. extern struct permonst pm_ghost; 10. 11. #ifdef DGK 12. char bones[FILENAME]; 13. #else 14. char bones[] = "bones_xx"; 15. #endif 16. 17. /* save bones and possessions of a deceased adventurer */ 18. savebones(){ 19. register fd; 20. register struct obj *otmp; 21. register struct trap *ttmp; 22. register struct monst *mtmp; 23. if(dlevel <= 0 || dlevel > MAXLEVEL) return; 24. if(!rn2(1 + dlevel/2) /* not so many ghosts on low levels */ 25. #ifdef WIZARD 26. && !wizard 27. #endif 28. ) return; 29. #ifdef DGK 30. name_file(bones, dlevel); 31. #else 32. bones[6] = '0' + (dlevel/10); 33. bones[7] = '0' + (dlevel%10); 34. #endif 35. if((fd = open(bones,0)) >= 0){ 36. (void) close(fd); 37. #ifdef WIZARD 38. if(wizard) 39. pline("Bones file already exists."); 40. #endif 41. return; 42. } 43. /* drop everything; the corpse's possessions are usually cursed */ 44. otmp = invent; 45. while(otmp){ 46. otmp->ox = u.ux; 47. otmp->oy = u.uy; 48. otmp->age = 0; /* very long ago */ 49. otmp->owornmask = 0; 50. if(rn2(5)) otmp->cursed = 1; 51. if(!otmp->nobj){ 52. otmp->nobj = fobj; 53. fobj = invent; 54. invent = 0; /* superfluous */ 55. break; 56. } 57. otmp = otmp->nobj; 58. } 59. /* spill any contained objects - added by GAN 03/23/87 */ 60. otmp = fcobj; 61. while(otmp) { 62. register struct obj *otmp2; 63. 64. otmp2 = otmp->nobj; 65. spill_obj(otmp); 66. otmp = otmp2; 67. } 68. if(!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) return; 69. mtmp->mx = u.ux; 70. mtmp->my = u.uy; 71. mtmp->msleep = 1; 72. (void) strcpy((char *) mtmp->mextra, plname); 73. mkgold(somegold() + d(dlevel,30), u.ux, u.uy); 74. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ 75. mtmp->m_id = 0; 76. if(mtmp->mtame) { 77. mtmp->mtame = 0; 78. mtmp->mpeaceful = 0; 79. } 80. mtmp->mlstmv = 0; 81. if(mtmp->mdispl) unpmon(mtmp); 82. } 83. for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 84. ttmp->tseen = 0; 85. for(otmp = fobj; otmp; otmp = otmp->nobj) { 86. otmp->o_id = 0; 87. /* otmp->o_cnt_id = 0; - superfluous */ 88. otmp->onamelth = 0; 89. otmp->known = 0; 90. otmp->invlet = 0; 91. if(otmp->olet == AMULET_SYM && !otmp->spe) { 92. otmp->spe = -1; /* no longer the actual amulet */ 93. otmp->cursed = 1; /* flag as gotten from a ghost */ 94. } 95. } 96. #ifdef DGK 97. fd = open(bones, O_WRONLY | O_BINARY | O_CREAT, FMASK); 98. #else 99. fd = creat(bones, FMASK); 100. #endif 101. if(fd < 0) { 102. #ifdef WIZARD 103. if(wizard) 104. pline("Cannot create bones file - creat failed"); 105. #endif 106. return; 107. } 108. #ifdef DGK 109. savelev(fd,dlevel, COUNT | WRITE); 110. #else 111. savelev(fd,dlevel); 112. #endif 113. (void) close(fd); 114. } 115. 116. /* 117. * "spill" object out of box onto floor 118. */ 119. spill_obj(obj) 120. struct obj *obj; 121. { 122. struct obj *otmp; 123. 124. for(otmp = fobj; otmp; otmp = otmp->nobj) 125. if(obj->o_cnt_id == otmp->o_id) { 126. obj->ox = otmp->ox; 127. obj->oy = otmp->oy; 128. obj->age = 0; 129. if(rn2(5)) 130. obj->cursed = 1; 131. obj->nobj = otmp->nobj; 132. otmp->nobj = obj; 133. return; 134. } 135. } 136. 137. getbones(){ 138. register fd,x,y,ok; 139. /* wizard check added by GAN 02/05/87 */ 140. if(rn2(3) /* only once in three times do we find bones */ 141. #ifdef WIZARD 142. && !wizard 143. #endif 144. ) return(0); 145. #ifdef DGK 146. name_file(bones, dlevel); 147. #else 148. bones[6] = '0' + dlevel/10; 149. bones[7] = '0' + dlevel%10; 150. #endif 151. if((fd = open(bones, 0)) < 0) return(0); 152. if((ok = uptodate(fd)) != 0){ 153. #ifdef WIZARD 154. if(wizard) { 155. char buf[BUFSZ]; 156. pline("Get bones? "); 157. getlin(buf); 158. if(buf[0] == 'n') { 159. (void) close(fd); 160. return(0); 161. } 162. } 163. #endif 164. getlev(fd, 0, dlevel); 165. for(x = 0; x < COLNO; x++) for(y = 0; y < ROWNO; y++) 166. levl[x][y].seen = levl[x][y].new = 0; 167. } 168. (void) close(fd); 169. #ifdef WIZARD 170. if(wizard) { 171. char buf[BUFSZ]; 172. pline("Unlink bones? "); 173. getlin(buf); 174. if(buf[0] == 'n') 175. return(ok); 176. } 177. #endif 178. if(unlink(bones) < 0){ 179. pline("Cannot unlink %s .", bones); 180. return(0); 181. } 182. return(ok); 183. }
|