Source:NetHack 3.1.0/steal.c
Jump to navigation
Jump to search
Below is the full text to steal.c from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.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.1 92/10/14 */ 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_DCL int NDECL(stealarm); 8. 9. #ifdef OVLB 10. static const char * FDECL(equipname, (struct obj *)); 11. 12. static const char * 13. equipname(otmp) 14. 15. register struct obj *otmp; 16. { 17. 18. return ( 19. #ifdef TOURIST 20. (otmp == uarmu) ? "shirt" : 21. #endif 22. (otmp == uarmf) ? "boots" : 23. (otmp == uarms) ? "shield" : 24. (otmp == uarmg) ? "gloves" : 25. (otmp == uarmc) ? "cloak" : 26. (otmp == uarmh) ? "helmet" : "armor"); 27. } 28. 29. long /* actually returns something that fits in an int */ 30. somegold(){ 31. #ifdef LINT /* long conv. ok */ 32. return(0L); 33. #else 34. return (long)( (u.ugold < 100) ? u.ugold : 35. (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) ); 36. #endif 37. } 38. 39. void 40. stealgold(mtmp) 41. register struct monst *mtmp; 42. { 43. register struct obj *gold = g_at(u.ux, u.uy); 44. register long tmp; 45. 46. if (gold && ( !u.ugold || gold->quan > u.ugold || !rn2(5))) { 47. mtmp->mgold += gold->quan; 48. delobj(gold); 49. newsym(u.ux, u.uy); 50. pline("%s quickly snatches some gold from between your %s!", 51. Monnam(mtmp), makeplural(body_part(FOOT))); 52. if(!u.ugold || !rn2(5)) { 53. rloc(mtmp); 54. mtmp->mflee = 1; 55. } 56. } else if(u.ugold) { 57. u.ugold -= (tmp = somegold()); 58. Your("purse feels lighter."); 59. mtmp->mgold += tmp; 60. rloc(mtmp); 61. mtmp->mflee = 1; 62. flags.botl = 1; 63. } 64. } 65. 66. /* steal armor after you finish taking it off */ 67. unsigned int stealoid; /* object to be stolen */ 68. unsigned int stealmid; /* monster doing the stealing */ 69. 70. STATIC_OVL int 71. stealarm(){ 72. register struct monst *mtmp; 73. register struct obj *otmp; 74. 75. for(otmp = invent; otmp; otmp = otmp->nobj) 76. if(otmp->o_id == stealoid) { 77. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 78. if(mtmp->m_id == stealmid) { 79. if(otmp->unpaid) 80. subfrombill(otmp, shop_keeper(*u.ushops)); 81. freeinv(otmp); 82. pline("%s steals %s!", Monnam(mtmp), doname(otmp)); 83. mpickobj(mtmp,otmp); 84. mtmp->mflee = 1; 85. rloc(mtmp); 86. break; 87. } 88. break; 89. } 90. stealoid = 0; 91. return 0; 92. } 93. 94. /* Returns 1 when something was stolen (or at least, when N should flee now) 95. * Returns -1 if the monster died in the attempt 96. * Avoid stealing the object stealoid 97. */ 98. int 99. steal(mtmp) 100. struct monst *mtmp; 101. { 102. register struct obj *otmp; 103. register int tmp; 104. register int named = 0; 105. 106. /* the following is true if successful on first of two attacks. */ 107. if(!monnear(mtmp, u.ux, u.uy)) return(0); 108. 109. if(!invent 110. #ifdef POLYSELF 111. || (inv_cnt() == 1 && uskin) 112. #endif 113. ){ 114. /* Not even a thousand men in armor can strip a naked man. */ 115. if(Blind) 116. pline("Somebody tries to rob you, but finds nothing to steal."); 117. else 118. pline("%s tries to rob you, but she finds nothing to steal!", 119. Monnam(mtmp)); 120. return(1); /* let her flee */ 121. } 122. 123. if(Adornment & LEFT_RING) { 124. otmp = uleft; 125. goto gotobj; 126. } else if(Adornment & RIGHT_RING) { 127. otmp = uright; 128. goto gotobj; 129. } 130. 131. tmp = 0; 132. for(otmp = invent; otmp; otmp = otmp->nobj) 133. if((!uarm || otmp != uarmc) 134. #ifdef POLYSELF 135. && otmp != uskin 136. #endif 137. ) 138. tmp += ((otmp->owornmask & 139. (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1); 140. tmp = rn2(tmp); 141. for(otmp = invent; otmp; otmp = otmp->nobj) 142. if((!uarm || otmp != uarmc) 143. #ifdef POLYSELF 144. && otmp != uskin 145. #endif 146. ) 147. if((tmp -= ((otmp->owornmask & 148. (W_ARMOR | W_RING | W_AMUL | W_TOOL)) ? 5 : 1)) < 0) 149. break; 150. if(!otmp) { 151. impossible("Steal fails!"); 152. return(0); 153. } 154. /* can't steal gloves while wielding - so steal the wielded item. */ 155. if (otmp == uarmg && uwep) 156. otmp = uwep; 157. /* can't steal armor while wearing cloak - so steal the cloak. */ 158. else if(otmp == uarm && uarmc) otmp = uarmc; 159. #ifdef TOURIST 160. else if(otmp == uarmu && uarmc) otmp = uarmc; 161. else if(otmp == uarmu && uarm) otmp = uarm; 162. #endif 163. gotobj: 164. if(otmp->o_id == stealoid) return(0); 165. 166. #ifdef WALKIES 167. if(otmp->otyp == LEASH && otmp->leashmon) o_unleash(otmp); 168. #endif 169. 170. if((otmp->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))){ 171. switch(otmp->oclass) { 172. case TOOL_CLASS: 173. Blindf_off(otmp); 174. break; 175. case AMULET_CLASS: 176. Amulet_off(); 177. break; 178. case RING_CLASS: 179. Ring_gone(otmp); 180. break; 181. case ARMOR_CLASS: 182. /* Stop putting on armor which has been stolen. */ 183. if (donning(otmp)) { 184. cancel_don(); 185. if (otmp == uarm) (void) Armor_off(); 186. /* else if (otmp == uarmc) (void) Cloak_off(); */ 187. else if (otmp == uarmf) (void) Boots_off(); 188. else if (otmp == uarmg) (void) Gloves_off(); 189. else if (otmp == uarmh) (void) Helmet_off(); 190. /* else if (otmp == uarms) (void) Shield_off(); */ 191. else setworn((struct obj *)0, otmp->owornmask & W_ARMOR); 192. break; 193. } 194. { int curssv = otmp->cursed; 195. otmp->cursed = 0; 196. stop_occupation(); 197. if(flags.female) 198. pline("%s charms you. You gladly %s your %s.", 199. Blind ? "She" : Monnam(mtmp), 200. curssv ? "let her take" : "hand over", 201. equipname(otmp)); 202. else 203. pline("%s seduces you and %s off your %s.", 204. Blind ? "It" : Adjmonnam(mtmp, "beautiful"), 205. curssv ? "helps you to take" : "you start taking", 206. equipname(otmp)); 207. named++; 208. /* the following is to set multi for later on */ 209. nomul(-objects[otmp->otyp].oc_delay); 210. 211. if (otmp == uarm) (void) Armor_off(); 212. else if (otmp == uarmc) (void) Cloak_off(); 213. else if (otmp == uarmf) (void) Boots_off(); 214. else if (otmp == uarmg) (void) Gloves_off(); 215. else if (otmp == uarmh) (void) Helmet_off(); 216. else if (otmp == uarms) (void) Shield_off(); 217. else setworn((struct obj *)0, otmp->owornmask & W_ARMOR); 218. otmp->cursed = curssv; 219. if(multi < 0){ 220. /* 221. multi = 0; 222. nomovemsg = 0; 223. afternmv = 0; 224. */ 225. stealoid = otmp->o_id; 226. stealmid = mtmp->m_id; 227. afternmv = stealarm; 228. return(0); 229. } 230. break; 231. } 232. default: 233. impossible("Tried to steal a strange worn thing."); 234. } 235. } 236. else if(otmp == uwep) uwepgone(); 237. 238. if(otmp == uball) unpunish(); 239. 240. freeinv(otmp); 241. pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp)); 242. (void) snuff_candle(otmp); 243. mpickobj(mtmp,otmp); 244. if (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE 245. && !resists_ston(mtmp->data)) { 246. pline("%s turns to stone.", Monnam(mtmp)); 247. stoned = TRUE; 248. xkilled(mtmp, 0); 249. return -1; 250. } 251. return((multi < 0) ? 0 : 1); 252. } 253. 254. #endif /* OVLB */ 255. #ifdef OVL1 256. 257. void 258. mpickobj(mtmp,otmp) 259. register struct monst *mtmp; 260. register struct obj *otmp; 261. { 262. otmp->nobj = mtmp->minvent; 263. mtmp->minvent = otmp; 264. } 265. 266. #endif /* OVL1 */ 267. #ifdef OVLB 268. 269. void 270. stealamulet(mtmp) 271. register struct monst *mtmp; 272. { 273. register struct obj *otmp; 274. 275. for(otmp = invent; otmp; otmp = otmp->nobj) { 276. if(otmp->otyp == AMULET_OF_YENDOR || 277. (otmp->otyp == FAKE_AMULET_OF_YENDOR && !mtmp->iswiz)) { 278. /* might be an imitation one */ 279. setnotworn(otmp); 280. freeinv(otmp); 281. mpickobj(mtmp,otmp); 282. pline("%s stole %s!", Monnam(mtmp), doname(otmp)); 283. if (can_teleport(mtmp->data)) rloc(mtmp); 284. return; 285. } 286. } 287. } 288. 289. #endif /* OVLB */ 290. #ifdef OVL0 291. 292. /* release the objects the killed animal was carrying */ 293. void 294. relobj(mtmp,show,is_pet) 295. register struct monst *mtmp; 296. register int show; 297. boolean is_pet; /* If true, pet should keep wielded weapon */ 298. { 299. register struct obj *otmp, *otmp2; 300. register int omx = mtmp->mx, omy = mtmp->my; 301. 302. #ifdef MUSE 303. otmp2 = otmp = 0; 304. if (is_pet) { 305. sort_mwep(mtmp); 306. if ((otmp2 = MON_WEP(mtmp))) { 307. otmp = otmp2->nobj; 308. otmp2->nobj = 0; 309. } 310. } 311. if (!otmp2) 312. #endif 313. { otmp = mtmp->minvent; 314. mtmp->minvent = 0; 315. } 316. 317. for (; otmp; otmp = otmp2) { 318. #ifdef MUSE 319. if (otmp->owornmask) { 320. mtmp->misc_worn_check &= ~(otmp->owornmask); 321. otmp->owornmask = 0L; 322. } 323. #endif 324. otmp2 = otmp->nobj; 325. if (is_pet && cansee(omx, omy) && flags.verbose) 326. pline("%s drops %s.", Monnam(mtmp), 327. distant_name(otmp, doname)); 328. if (flooreffects(otmp, omx, omy, "fall")) continue; 329. place_object(otmp, omx, omy); 330. otmp->nobj = fobj; 331. fobj = otmp; 332. stackobj(fobj); 333. } 334. if (mtmp->mgold) { 335. register long g = mtmp->mgold; 336. mkgold(g, omx, omy); 337. if (is_pet && cansee(omx, omy) && flags.verbose) 338. pline("%s drops %ld gold piece%s.", Monnam(mtmp), 339. g, plur(g)); 340. mtmp->mgold = 0L; 341. } 342. if (show & cansee(omx, omy)) 343. newsym(omx, omy); 344. } 345. 346. #endif /* OVL0 */ 347. 348. /*steal.c*/