Source:NetHack 3.0.0/timeout.c
Jump to navigation
Jump to search
Below is the full text to timeout.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/timeout.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: @(#)timeout.c 3.0 87/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. /* He is being petrified - dialogue by inmet!tower */ 8. static const char *stoned_texts[] = { 9. "You are slowing down.", /* 5 */ 10. "Your limbs are stiffening.", /* 4 */ 11. "Your limbs have turned to stone.", /* 3 */ 12. "You have turned to stone.", /* 2 */ 13. "You are a statue." /* 1 */ 14. }; 15. 16. static void 17. stoned_dialogue() { 18. register long i = (Stoned & TIMEOUT); 19. 20. if(i > 0 && i <= SIZE(stoned_texts)) 21. pline(stoned_texts[SIZE(stoned_texts) - i]); 22. if(i == 5) 23. Fast &= ~(TIMEOUT|INTRINSIC); 24. if(i == 3) 25. nomul(-3); 26. } 27. 28. static const char *choke_texts[] = { 29. "You find it hard to breathe.", 30. "You're gasping for air.", 31. "You can no longer breathe.", 32. "You're turning blue.", 33. "You suffocate." 34. }; 35. 36. static void 37. choke_dialogue() 38. { 39. register long i = (Strangled & TIMEOUT); 40. 41. if(i > 0 && i <= SIZE(choke_texts)) 42. pline(choke_texts[SIZE(choke_texts) - i]); 43. } 44. 45. void 46. timeout() 47. { 48. register struct prop *upp; 49. int sleeptime; 50. 51. if(Stoned) stoned_dialogue(); 52. if(Strangled) choke_dialogue(); 53. #ifdef POLYSELF 54. if(u.mtimedone) if(!--u.mtimedone) rehumanize(); 55. #endif 56. if(u.ucreamed) u.ucreamed--; 57. if(u.uluck && moves % (u.uhave_amulet 58. #ifdef THEOLOGY 59. || u.ugangr 60. #endif 61. ? 300 : 600) == 0) { 62. /* Cursed luckstones stop bad luck from timing out; blessed luckstones 63. * stop good luck from timing out; normal luckstones stop both; 64. * neither is stopped if you don't have a luckstone. 65. */ 66. register int time_luck = stone_luck(FALSE); 67. boolean nostone = !carrying(LUCKSTONE); 68. 69. if(u.uluck > 0 && (nostone || time_luck < 0)) 70. u.uluck--; 71. else if(u.uluck < 0 && (nostone || time_luck > 0)) 72. u.uluck++; 73. } 74. 75. for(upp = u.uprops; upp < u.uprops+SIZE(u.uprops); upp++) 76. if((upp->p_flgs & TIMEOUT) && !(--upp->p_flgs & TIMEOUT)) { 77. if(upp->p_tofn) (*upp->p_tofn)(); 78. else switch(upp - u.uprops){ 79. case STONED: 80. killer = "cockatrice"; 81. done("stoned"); 82. break; 83. case SICK: 84. You("die from food poisoning."); 85. killer = u.usick_cause; 86. done("died"); 87. break; 88. case FAST: 89. You("feel yourself slowing down."); 90. break; 91. case CONFUSION: 92. HConfusion = 1; /* So make_confused works properly */ 93. make_confused(0L, TRUE); 94. break; 95. case STUN: 96. HStun = 1; 97. make_stunned(0L, TRUE); 98. break; 99. case BLINDED: 100. Blinded = 1; 101. make_blinded(0L, TRUE); 102. break; 103. case INVIS: 104. on_scr(u.ux,u.uy); 105. if (!Invis && !See_invisible) 106. You("are no longer invisible."); 107. break; 108. case WOUNDED_LEGS: 109. heal_legs(); 110. break; 111. case HALLUC: 112. Hallucination = 1; 113. make_hallucinated(0L, TRUE); 114. break; 115. case SLEEPING: 116. if (unconscious() || Sleep_resistance) 117. Sleeping += rnd(100); 118. else { 119. You("fall asleep."); 120. sleeptime = rnd(20); 121. nomul(-sleeptime); 122. nomovemsg = "You wake up."; 123. Sleeping = sleeptime + rnd(100); 124. } 125. break; 126. case STRANGLED: 127. killer = "strangulation"; 128. done("died"); 129. break; 130. case FUMBLING: 131. /* call this only when a move took place. */ 132. /* otherwise handle fumbling msgs locally. */ 133. if (!Levitation && u.umoved) { 134. if (levl[u.ux][u.uy].omask) 135. You("trip over something."); 136. else 137. switch (rn2(4)) { 138. case 1: 139. if (ACCESSIBLE(levl[u.ux][u.uy].typ)) { /* not POOL or STONE */ 140. if (Hallucination) pline("A rock bites your foot."); 141. else You("trip over a rock."); 142. break; 143. } 144. case 2: 145. if (Hallucination) You("slip on a banana peel."); 146. else You("slip and nearly fall."); 147. break; 148. case 3: 149. You("flounder."); 150. break; 151. default: 152. You("stumble."); 153. } 154. nomul(-2); 155. nomovemsg = ""; 156. } 157. Fumbling = rnd(20); 158. break; 159. } 160. } 161. } 162. 163. static const char slithy[] = { S_SNAKE, S_NAGA, S_WORM, 0 }; 164. 165. static void 166. hatch_it(otmp) /* hatch the egg "otmp" if possible */ 167. register struct obj *otmp; 168. { 169. register struct monst *mtmp; 170. #ifdef POLYSELF 171. int yours = otmp->spe; 172. #endif 173. 174. if(moves-otmp->age > 200) /* very old egg - it's dead */ 175. otmp->corpsenm = -1; 176. #ifdef LINT /* long conv. ok */ 177. else if(rnd(150) > 150) { 178. #else 179. else if(rnd((int)(moves-otmp->age)) > 150) { 180. #endif 181. mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy); 182. useup(otmp); 183. if(mtmp) { 184. 185. if(Blind) 186. You("feel something %s from your pack!", 187. (index(slithy, mtmp->data->mlet)) ? 188. "slither" : "drop"); 189. else 190. pline("A%s %s just %s out of your pack!", 191. (index(vowels, *(mtmp->data->mname))) ? "n" : "", 192. mtmp->data->mname, 193. (index(slithy, mtmp->data->mlet)) ? 194. "slithered" : "dropped"); 195. 196. #ifdef POLYSELF 197. if (yours) { 198. pline("Its cries sound like \"%s.\"", 199. flags.female ? "mommy" : "daddy"); 200. (void) tamedog(mtmp, (struct obj *)0); 201. return; 202. } 203. #endif 204. if(mtmp->data->mlet == S_DRAGON) { 205. pline("\"Gleep!\""); /* Mything eggs :-) */ 206. (void) tamedog(mtmp, (struct obj *)0); 207. } 208. } 209. } 210. } 211. 212. void 213. hatch_eggs() /* hatch any eggs that have been too long in pack */ 214. { 215. register struct obj *otmp,/* *ctmp, /* use of ctmp commented out below*/ 216. *otmp2; 217. 218. for(otmp = invent; otmp; otmp = otmp2) { 219. 220. otmp2 = otmp->nobj; /* otmp may hatch */ 221. if(otmp->otyp == EGG && otmp->corpsenm >= 0) hatch_it(otmp); 222. } 223. 224. /* Not yet - there's a slight problem with "useup" on contained objs. 225. for(otmp = fcobj; otmp; otmp = otmp2) { 226. 227. otmp2 = otmp->nobj; 228. for(ctmp = invent; ctmp; ctmp = ctmp->nobj) 229. if(otmp->cobj == ctmp) 230. if(ctmp->otyp != ICE_BOX) 231. if(otmp->otyp == EGG && otmp->corpsenm >= 0) 232. hatch_it(otmp); 233. } 234. */ 235. }