abstract
| - Below is the full text to hack.trap.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/hack.trap.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2. 3. #include "hack.h" 4. #include "def.trap.h" 5. 6. extern struct monst *makemon(); 7. 8. char vowels[] = "aeiou"; 9. 10. char *traps[] = { 11. " bear trap", 12. "n arrow trap", 13. " dart trap", 14. " trapdoor", 15. " teleportation trap", 16. " pit", 17. " sleeping gas trap", 18. " piercer", 19. " mimic" 20. }; 21. 22. dotrap(trap) register struct gen *trap; { 23. nomul(0); 24. if(trap->gflag&SEEN && !rn2(5)) 25. pline("You escape a%s.",traps[trap->gflag&037]); 26. else { 27. trap->gflag |= SEEN; 28. switch(trap->gflag & ~SEEN) { 29. case SLP_GAS_TRAP: 30. pline("A cloud of gas puts you to sleep!"); 31. nomul(-rnd(25)); 32. break; 33. case BEAR_TRAP: 34. if(Levitation) { 35. pline("You float over a bear trap."); 36. break; 37. } 38. u.utrap = 4 + rn2(4); 39. u.utraptype = TT_BEARTRAP; 40. pline("A bear trap closes on your foot!"); 41. break; 42. case PIERC: 43. deltrap(trap); 44. if(makemon(PM_PIERC,u.ux,u.uy)) { 45. pline("A piercer suddenly drops from the ceiling!"); 46. if(uarmh) 47. pline("Its blow glances off your helmet."); 48. else 49. (void) thitu(3,d(4,6),"falling piercer"); 50. } 51. break; 52. case ARROW_TRAP: 53. pline("An arrow shoots out at you!"); 54. if(!thitu(8,rnd(6),"arrow")){ 55. mksobj_at(WEAPON_SYM, ARROW, u.ux, u.uy); 56. fobj->quan = 1; 57. } 58. break; 59. case TRAPDOOR: 60. if(!xdnstair) { 61. pline("A trap door in the ceiling opens and a rock falls on your head!"); 62. if(uarmh) pline("Fortunately, you are wearing a helmet!"); 63. losehp(uarmh ? 2 : d(2,10),"falling rock"); 64. } else { 65. register int newlevel = dlevel + 1; 66. while(!rn2(4) && newlevel < 29) 67. newlevel++; 68. pline("A trap door opens up under you!"); 69. if(Levitation || u.ustuck) { 70. pline("For some reason you don't fall in."); 71. break; 72. } 73. 74. goto_level(newlevel, FALSE); 75. } 76. break; 77. case DART_TRAP: 78. pline("A little dart shoots out at you!"); 79. if(thitu(7,rnd(3),"little dart")) { 80. if(!rn2(6)) 81. poisoned("dart","poison dart"); 82. } else { 83. mksobj_at(WEAPON_SYM, DART, u.ux, u.uy); 84. fobj->quan = 1; 85. } 86. break; 87. case TELEP_TRAP: 88. newsym(u.ux,u.uy); 89. tele(); 90. break; 91. case PIT: 92. if(Levitation) { 93. pline("A pit opens up under you!"); 94. pline("You don't fall in!"); 95. break; 96. } 97. pline("You fall into a pit!"); 98. u.utrap = rn1(6,2); 99. u.utraptype = TT_PIT; 100. losehp(rnd(6),"fall into a pit"); 101. selftouch("Falling, you"); 102. break; 103. default: 104. pline("You hit a trap of type %d",trap->gflag); 105. impossible(); 106. } 107. } 108. } 109. 110. mintrap(mtmp) register struct monst *mtmp; { 111. register struct gen *gen = g_at(mtmp->mx, mtmp->my, ftrap); 112. register int wasintrap = mtmp->mtrapped; 113. 114. if(!gen) { 115. mtmp->mtrapped = 0; /* perhaps teleported? */ 116. } else if(wasintrap) { 117. if(!rn2(40)) mtmp->mtrapped = 0; 118. } else { 119. register int tt = (gen->gflag & ~SEEN); 120. int in_sight = cansee(mtmp->mx,mtmp->my); 121. extern char mlarge[]; 122. if(mtmp->mtrapseen & (1 << tt)) { 123. /* he has been in such a trap - perhaps he escapes */ 124. if(rn2(4)) return(0); 125. } 126. mtmp->mtrapseen |= (1 << tt); 127. switch (tt) { 128. case BEAR_TRAP: 129. if(index(mlarge, mtmp->data->mlet)) { 130. if(in_sight) 131. pline("%s is caught in a bear trap!", 132. Monnam(mtmp)); 133. else 134. if(mtmp->data->mlet == 'o') 135. pline("You hear the roaring of an angry bear!"); 136. mtmp->mtrapped = 1; 137. } 138. break; 139. case PIT: 140. if(!index("Eyw", mtmp->data->mlet)) { 141. mtmp->mtrapped = 1; 142. if(in_sight) 143. pline("%s falls in a pit!", Monnam(mtmp)); 144. } 145. break; 146. case SLP_GAS_TRAP: 147. if(!mtmp->msleep && !mtmp->mfroz) { 148. mtmp->msleep = 1; 149. if(in_sight) 150. pline("%s suddenly falls asleep!", 151. Monnam(mtmp)); 152. } 153. break; 154. case TELEP_TRAP: 155. rloc(mtmp); 156. if(in_sight && !cansee(mtmp->mx,mtmp->my)) 157. pline("%s suddenly disappears!", 158. Monnam(mtmp)); 159. break; 160. case ARROW_TRAP: 161. if(in_sight) { 162. pline("%s is hit by an arrow!", 163. Monnam(mtmp)); 164. } 165. mtmp->mhp -= 3; 166. break; 167. case DART_TRAP: 168. if(in_sight) { 169. pline("%s is hit by a dart!", 170. Monnam(mtmp)); 171. } 172. mtmp->mhp -= 2; 173. /* not mondied here !! */ 174. break; 175. case TRAPDOOR: 176. if(!xdnstair) { 177. mtmp->mhp -= 10; 178. if(in_sight) 179. pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp)); 180. break; 181. } 182. if(mtmp->data->mlet != 'w'){ 183. fall_down(mtmp); 184. if(in_sight) 185. pline("Suddenly, %s disappears out of sight.", monnam(mtmp)); 186. return(2); /* no longer on this level */ 187. } 188. break; 189. case PIERC: 190. break; 191. default: 192. pline("Some monster encountered an impossible trap."); 193. impossible(); 194. } 195. } 196. return(mtmp->mtrapped); 197. } 198. 199. selftouch(arg) char *arg; { 200. if(uwep && uwep->otyp == DEAD_COCKATRICE){ 201. pline("%s touch the dead cockatrice.", arg); 202. pline("You turn to stone."); 203. killer = objects[uwep->otyp].oc_name; 204. done("died"); 205. } 206. } 207. 208. float_up(){ 209. if(u.utrap) { 210. if(u.utraptype == TT_PIT) { 211. u.utrap = 0; 212. pline("You float up, out of the pit!"); 213. } else { 214. pline("You float up, only your leg is still stuck."); 215. } 216. } else 217. pline("You start to float in the air!"); 218. } 219. 220. float_down(){ 221. register struct gen *trap; 222. pline("You float gently to the ground."); 223. if(trap = g_at(u.ux,u.uy,ftrap)) 224. switch(trap->gflag & 037) { 225. case PIERC: 226. break; 227. case TRAPDOOR: 228. if(!xdnstair || u.ustuck) break; 229. /* fall into next case */ 230. default: 231. dotrap(trap); 232. } 233. pickup(); 234. } 235. 236. tele() 237. { 238. extern coord getpos(); 239. coord cc; 240. register int nux,nuy; 241. if(Teleport_control) { 242. pline("To what position do you want to be teleported?"); 243. cc = getpos(1, "the desired position"); /* 1: force valid */ 244. /* possible extensions: introduce a small error if 245. magic power is low; allow transfer to solid rock */ 246. if(teleok(cc.x, cc.y)){ 247. nux = cc.x; 248. nuy = cc.y; 249. goto gotpos; 250. } 251. pline("Sorry ..."); 252. } 253. do { 254. nux = rnd(COLNO-1); 255. nuy = rn2(ROWNO); 256. } while(!teleok(nux, nuy)); 257. gotpos: 258. if(Punished) unplacebc(); 259. unsee(); 260. u.utrap = 0; 261. u.ustuck = 0; 262. u.ux = nux; 263. u.uy = nuy; 264. setsee(); 265. if(Punished) placebc(1); 266. if(u.uswallow){ 267. u.uswldtim = u.uswallow = 0; 268. docrt(); 269. } 270. nomul(0); 271. (void) inshop(); 272. pickup(); 273. if(!Blind) read_engr_at(u.ux,u.uy); 274. } 275. 276. teleok(x,y) register int x,y; { 277. return( isok(x,y) && levl[x][y].typ > DOOR && !m_at(x,y) && 278. !sobj_at(ENORMOUS_ROCK,x,y) && !g_at(x,y,ftrap) 279. ); 280. /* Note: gold is permitted (because of vaults) */ 281. } 282. 283. placebc(attach) int attach; { 284. if(!uchain || !uball){ 285. pline("Where are your chain and ball??"); 286. impossible(); 287. return; 288. } 289. uball->ox = uchain->ox = u.ux; 290. uball->oy = uchain->oy = u.uy; 291. if(attach){ 292. uchain->nobj = fobj; 293. fobj = uchain; 294. if(!carried(uball)){ 295. uball->nobj = fobj; 296. fobj = uball; 297. } 298. } 299. } 300. 301. unplacebc(){ 302. if(!carried(uball)){ 303. freeobj(uball); 304. unpobj(uball); 305. } 306. freeobj(uchain); 307. unpobj(uchain); 308. } 309. 310. level_tele() { 311. register int newlevel = 5 + rn2(20); /* 5 - 24 */ 312. if(dlevel == newlevel) 313. if(!xdnstair) newlevel--; else newlevel++; 314. goto_level(newlevel, FALSE); 315. }
|