Source:NetHack 3.0.0/steal.c
Jump to navigation
Jump to search
Below is the full text to steal.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/steal.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.
1. /* SCCS Id: @(#)steal.c 3.0 88/07/06 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. 7. static char * 8. equipname(otmp) 9. 10. register struct obj *otmp; 11. { 12. 13. return ( 14. #ifdef SHIRT 15. (otmp == uarmu) ? "shirt" : 16. #endif 17. (otmp == uarmf) ? "boots" : 18. (otmp == uarms) ? "shield" : 19. (otmp == uarmg) ? "gloves" : 20. (otmp == uarmc) ? "cloak" : 21. (otmp == uarmh) ? "helmet" : "armor"); 22. } 23. 24. long /* actually returns something that fits in an int */ 25. somegold(){ 26. #ifdef LINT /* long conv. ok */ 27. return(0L); 28. #else 29. return (long)( (u.ugold < 100) ? u.ugold : 30. (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) ); 31. #endif 32. } 33. 34. void 35. stealgold(mtmp) 36. register struct monst *mtmp; 37. { 38. register struct gold *gold = g_at(u.ux, u.uy); 39. register long tmp; 40. if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) { 41. mtmp->mgold += gold->amount; 42. freegold(gold); 43. if(Invisible) newsym(u.ux, u.uy); 44. pline("%s quickly snatches some gold from between your %s!", 45. Monnam(mtmp), makeplural(body_part(FOOT))); 46. if(!u.ugold || !rn2(5)) { 47. rloc(mtmp); 48. mtmp->mflee = 1; 49. } 50. } else if(u.ugold) { 51. u.ugold -= (tmp = somegold()); 52. Your("purse feels lighter."); 53. mtmp->mgold += tmp; 54. rloc(mtmp); 55. mtmp->mflee = 1; 56. flags.botl = 1; 57. } 58. } 59. 60. /* steal armor after he finishes taking it off */ 61. unsigned int stealoid; /* object to be stolen */ 62. unsigned int stealmid; /* monster doing the stealing */ 63. 64. static int 65. stealarm(){ 66. register struct monst *mtmp; 67. register struct obj *otmp; 68. 69. for(otmp = invent; otmp; otmp = otmp->nobj) 70. if(otmp->o_id == stealoid) { 71. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 72. if(mtmp->m_id == stealmid) { 73. freeinv(otmp); 74. pline("%s steals %s!", Monnam(mtmp), doname(otmp)); 75. mpickobj(mtmp,otmp); 76. mtmp->mflee = 1; 77. rloc(mtmp); 78. break; 79. } 80. break; 81. } 82. return stealoid = 0; 83. } 84. 85. /* Returns 1 when something was stolen (or at least, when N should flee now) 86. * Avoid stealing the object stealoid 87. */ 88. int 89. steal(mtmp) 90. struct monst *mtmp; 91. { 92. register struct obj *otmp; 93. register int tmp; 94. register int named = 0; 95. 96. /* the following is true if successful on first of two attacks. */ 97. if(dist(mtmp->mx, mtmp->my) > 3) return(0); 98. 99. if(!invent){ 100. /* Not even a thousand men in armor can strip a naked man. */ 101. if(Blind) 102. pline("Somebody tries to rob you, but finds nothing to steal."); 103. else 104. pline("%s tries to rob you, but she finds nothing to steal!", 105. Monnam(mtmp)); 106. return(1); /* let her flee */ 107. } 108. 109. if(Adornment & LEFT_RING) { 110. otmp = uleft; 111. goto gotobj; 112. } else if(Adornment & RIGHT_RING) { 113. otmp = uright; 114. goto gotobj; 115. } 116. 117. tmp = 0; 118. for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarmc) 119. tmp += ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1); 120. tmp = rn2(tmp); 121. for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarmc) 122. if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1)) 123. < 0) break; 124. if(!otmp) { 125. impossible("Steal fails!"); 126. return(0); 127. } 128. /* can't steal armor while wearing cloak - so steal the cloak. */ 129. if(otmp == uarm && uarmc) otmp = uarmc; 130. #ifdef SHIRT 131. else if(otmp == uarmu && uarmc) otmp = uarmc; 132. else if(otmp == uarmu && uarm) otmp = uarm; 133. #endif 134. gotobj: 135. if(otmp->o_id == stealoid) return(0); 136. 137. #ifdef WALKIES 138. if(otmp->otyp == LEASH && otmp->leashmon) o_unleash(otmp); 139. #endif 140. 141. if((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))){ 142. switch(otmp->olet) { 143. case TOOL_SYM: 144. Blindf_off(otmp); 145. break; 146. case AMULET_SYM: 147. Amulet_off(); 148. break; 149. case RING_SYM: 150. Ring_gone(otmp); 151. break; 152. case ARMOR_SYM: 153. if(multi < 0 || otmp == uarms){ 154. setworn((struct obj *) 0, otmp->owornmask & W_ARMOR); 155. break; 156. } 157. { int curssv = otmp->cursed; 158. otmp->cursed = 0; 159. stop_occupation(); 160. if(flags.female) 161. pline("%s charms you. You gladly %s your %s.", 162. Monnam(mtmp), 163. curssv ? "let her take" : "hand over", 164. equipname(otmp)); 165. else 166. pline("%s seduces you and %s off your %s.", 167. Amonnam(mtmp, Blind ? "gentle" : "beautiful"), 168. curssv ? "helps you to take" : "you start taking", 169. equipname(otmp)); 170. named++; 171. /* the following is to set multi for later on */ 172. (void) nomul(-objects[otmp->otyp].oc_delay); 173. 174. if (otmp == uarm) (void) Armor_off(); 175. else if (otmp == uarmc) (void) Cloak_off(); 176. else if (otmp == uarmf) (void) Boots_off(); 177. else if (otmp == uarmg) (void) Gloves_off(); 178. else if (otmp == uarmh) (void) Helmet_off(); 179. else if (otmp == uarms) (void) Shield_off(); 180. else setworn((struct obj *)0, otmp->owornmask & W_ARMOR); 181. otmp->cursed = curssv; 182. if(multi < 0){ 183. /* 184. multi = 0; 185. nomovemsg = 0; 186. afternmv = 0; 187. */ 188. stealoid = otmp->o_id; 189. stealmid = mtmp->m_id; 190. afternmv = stealarm; 191. return(0); 192. } 193. break; 194. } 195. default: 196. impossible("Tried to steal a strange worn thing."); 197. } 198. } 199. else if(otmp == uwep) uwepgone(); 200. 201. if(otmp == uball) unpunish(); 202. 203. freeinv(otmp); 204. pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); 205. mpickobj(mtmp,otmp); 206. return((multi < 0) ? 0 : 1); 207. } 208. 209. void 210. mpickobj(mtmp,otmp) 211. register struct monst *mtmp; 212. register struct obj *otmp; 213. { 214. otmp->nobj = mtmp->minvent; 215. mtmp->minvent = otmp; 216. } 217. 218. void 219. stealamulet(mtmp) 220. register struct monst *mtmp; 221. { 222. register struct obj *otmp; 223. 224. for(otmp = invent; otmp; otmp = otmp->nobj) { 225. if(otmp->otyp == AMULET_OF_YENDOR) { 226. /* might be an imitation one */ 227. setnotworn(otmp); 228. freeinv(otmp); 229. mpickobj(mtmp,otmp); 230. pline("%s stole %s!", Monnam(mtmp), doname(otmp)); 231. rloc(mtmp); 232. } 233. } 234. } 235. 236. /* release the objects the killed animal has stolen */ 237. void 238. relobj(mtmp,show) 239. register struct monst *mtmp; 240. register int show; 241. { 242. register struct obj *otmp, *otmp2; 243. 244. for(otmp = mtmp->minvent; otmp; otmp = otmp2){ 245. otmp->ox = mtmp->mx; 246. otmp->oy = mtmp->my; 247. otmp2 = otmp->nobj; 248. otmp->nobj = fobj; 249. if (flooreffects(otmp,mtmp->mx,mtmp->my)) continue; 250. fobj = otmp; 251. levl[otmp->ox][otmp->oy].omask = 1; 252. stackobj(fobj); 253. if(show & cansee(mtmp->mx,mtmp->my)) 254. atl(otmp->ox,otmp->oy,Hallucination?rndobjsym() : otmp->olet); 255. } 256. mtmp->minvent = (struct obj *) 0; 257. if(mtmp->mgold || mtmp->data->mlet == S_LEPRECHAUN) { 258. register long tmp; 259. 260. tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold; 261. mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my); 262. if(show & cansee(mtmp->mx,mtmp->my)) 263. atl(mtmp->mx,mtmp->my, Hallucination ? rndobjsym() : GOLD_SYM); 264. } 265. }