Source:NetHack 1.3d/eat.c
Jump to navigation
Jump to search
Below is the full text to eat.c from the source code of NetHack 1.3d. To link to a particular line, write [[NetHack 1.3d/eat.c#line123]], for example.
Warning! This is the source code from an old release. For the latest release, see Source code
Screenshots and source code from Hack are used under the CWI license.
1. /* SCCS Id: @(#)eat.c 1.3 87/07/14 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* eat.c - version 1.0.3 */ 4. 5. #include "hack.h" 6. #ifdef KAA 7. char POISONOUS[] = "ADKSVabhks&"; 8. #else 9. char POISONOUS[] = "ADKSVabhks"; 10. #endif 11. extern char *nomovemsg; 12. extern int (*afternmv)(); 13. extern int (*occupation)(); 14. extern char *occtxt; 15. extern struct obj *splitobj(), *addinv(); 16. 17. /* hunger texts used on bottom line (each 8 chars long) */ 18. #define SATIATED 0 19. #define NOT_HUNGRY 1 20. #define HUNGRY 2 21. #define WEAK 3 22. #define FAINTING 4 23. #define FAINTED 5 24. #define STARVED 6 25. 26. char *hu_stat[] = { 27. "Satiated", 28. " ", 29. "Hungry ", 30. "Weak ", 31. "Fainting", 32. "Fainted ", 33. "Starved " 34. }; 35. 36. init_uhunger(){ 37. u.uhunger = 900; 38. u.uhs = NOT_HUNGRY; 39. } 40. 41. struct { char *txt; int nut; } tintxts[] = { 42. "It contains salmon - not bad!", 60, 43. "It contains first quality peaches - what a surprise!", 40, 44. "It contains apple juice - perhaps not what you hoped for.", 20, 45. "It contains some nondescript substance, tasting awfully.", 500, 46. "It contains rotten meat. You vomit.", -50, 47. "It turns out to be empty.", 0 48. }; 49. #define TTSZ SIZE(tintxts) 50. 51. static struct { 52. struct obj *tin; 53. int usedtime, reqtime; 54. } tin; 55. 56. opentin(){ 57. register int r; 58. 59. if(!carried(tin.tin)) /* perhaps it was stolen? */ 60. return(0); /* %% probably we should use tinoid */ 61. if(tin.usedtime++ >= 50) { 62. pline("You give up your attempt to open the tin."); 63. return(0); 64. } 65. if(tin.usedtime < tin.reqtime) 66. return(1); /* still busy */ 67. 68. pline("You succeed in opening the tin."); 69. useup(tin.tin); 70. r = rn2(2*TTSZ); 71. if(r < TTSZ) { 72. pline(tintxts[r].txt); 73. lesshungry(tintxts[r].nut); 74. /* check for vomiting added by GAN 01/16/87 */ 75. if(tintxts[r].nut < 0 && Sick) { 76. Sick = 0; 77. pline("What a relief!"); 78. } 79. if(r == 0) { /* Salmon */ 80. Glib = rnd(15); 81. pline("Eating salmon made your fingers very slippery."); 82. } 83. } else { 84. pline("It contains spinach - this makes you feel like %s!", 85. Hallucination ? "Swee'pea" : "Popeye"); 86. 87. lesshungry(600); 88. gainstr(0); 89. } 90. return(0); 91. } 92. 93. Meatdone(){ 94. u.usym = '@'; 95. prme(); 96. } 97. 98. doeat(){ 99. register struct obj *otmp; 100. register struct objclass *ftmp; 101. register tmp; 102. 103. /* Is there some food (probably a heavy corpse) here on the ground? */ 104. if(!Levitation) 105. for(otmp = fobj; otmp; otmp = otmp->nobj) { 106. if(otmp->ox == u.ux && otmp->oy == u.uy && 107. otmp->olet == FOOD_SYM) { 108. pline("There %s %s here; eat %s? [ny] ", 109. (otmp->quan == 1) ? "is" : "are", 110. doname(otmp), 111. (otmp->quan == 1) ? "it" : "one"); 112. if(readchar() == 'y') { 113. if(otmp->quan != 1) 114. (void) splitobj(otmp, 1); 115. freeobj(otmp); 116. otmp = addinv(otmp); 117. addtobill(otmp); 118. if(Invisible) newsym(u.ux, u.uy); 119. goto gotit; 120. } 121. } 122. } 123. otmp = getobj("%", "eat"); 124. if(!otmp) return(0); 125. gotit: 126. if(otmp->otyp == TIN) { 127. if(uwep) { 128. switch(uwep->otyp) { 129. case CAN_OPENER: 130. tmp = 1; 131. break; 132. case DAGGER: 133. case CRYSKNIFE: 134. tmp = 3; 135. break; 136. case PICK_AXE: 137. case AXE: 138. tmp = 6; 139. break; 140. default: 141. goto no_opener; 142. } 143. pline("Using your %s you try to open the tin.", 144. aobjnam(uwep, (char *) 0)); 145. } else { 146. no_opener: 147. pline("It is not so easy to open this tin."); 148. if(Glib) { 149. pline("The tin slips out of your hands."); 150. if(otmp->quan > 1) { 151. register struct obj *obj; 152. extern struct obj *splitobj(); 153. 154. obj = splitobj(otmp, 1); 155. if(otmp == uwep) setuwep(obj); 156. } 157. dropx(otmp); 158. return(1); 159. } 160. tmp = 10 + rn2(1 + 500/((int)(u.ulevel + u.ustr))); 161. } 162. tin.reqtime = tmp; 163. tin.usedtime = 0; 164. tin.tin = otmp; 165. #ifdef DGK 166. set_occupation(opentin, "opening the tin", 0); 167. #else 168. occupation = opentin; 169. occtxt = "opening the tin"; 170. #endif 171. return(1); 172. } 173. ftmp = &objects[otmp->otyp]; 174. multi = -ftmp->oc_delay; 175. if(otmp->otyp >= CORPSE && eatcorpse(otmp)) goto eatx; 176. #ifdef DGKMOD 177. if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE && otmp->otyp != DEAD_LIZARD) { 178. #else 179. if(!rn2(7) && otmp->otyp != FORTUNE_COOKIE) { 180. #endif 181. #ifdef KAA 182. if (otmp->otyp == DEAD_VIOLET_FUNGUS) 183. pline("Seems rather stale though..."); 184. else 185. #endif 186. pline("Blecch! Rotten food!"); 187. if(!rn2(4)) { 188. if (Hallucination) pline("You feel rather trippy."); 189. else 190. pline("You feel rather light headed."); 191. HConfusion += d(2,4); 192. } else if(!rn2(4) && !Blind) { 193. pline("Everything suddenly goes dark."); 194. Blind = d(2,10); 195. seeoff(0); 196. } else if(!rn2(3)) { 197. if(Blind) 198. pline("The world spins and you slap against the floor."); 199. else 200. pline("The world spins and goes dark."); 201. nomul(-rnd(10)); 202. nomovemsg = "You are conscious again."; 203. } 204. lesshungry(ftmp->nutrition / 4); 205. } else { 206. if(u.uhunger >= 1500) choke(ftmp); 207. 208. switch(otmp->otyp){ 209. case FOOD_RATION: 210. if(u.uhunger <= 200) 211. if (Hallucination) 212. pline("Oh wow, like superior man!"); 213. else 214. pline("That food really hit the spot!"); 215. else if(u.uhunger <= 700) 216. pline("That satiated your stomach!"); 217. #ifdef DGKMOD 218. /* Have lesshungry() report when you're nearly full so all eating 219. * warns when you're about to choke. 220. */ 221. lesshungry(ftmp->nutrition); 222. #else 223. else { 224. pline("You're having a hard time getting all that food down."); 225. multi -= 2; 226. } 227. lesshungry(ftmp->nutrition); 228. if(multi < 0) nomovemsg = "You finished your meal."; 229. #endif /* DGKMOD /**/ 230. break; 231. case TRIPE_RATION: 232. if (u.usym != '@') 233. pline("That tripe ration was surprisingly good!"); 234. else { 235. pline("Yak - dog food!"); 236. more_experienced(1,0); 237. flags.botl = 1; 238. } 239. if(rn2(2) && u.usym == '@'){ 240. pline("You vomit."); 241. morehungry(20); 242. if(Sick) { 243. Sick = 0; /* David Neves */ 244. pline("What a relief!"); 245. } 246. } else lesshungry(ftmp->nutrition); 247. break; 248. default: 249. if(u.usym == '@' && otmp->otyp >= CORPSE) { 250. #ifdef KAA 251. if(otmp->otyp != DEAD_VIOLET_FUNGUS) 252. #endif 253. pline("That %s tasted terrible!",ftmp->oc_name); 254. } else 255. pline("That %s was delicious!",ftmp->oc_name); 256. lesshungry(ftmp->nutrition); 257. #ifdef DGKMOD 258. /* Relief from cockatrices -dgk */ 259. if (otmp->otyp == DEAD_LIZARD) { 260. if (Stoned) { 261. Stoned = 0; 262. pline("You feel more limber!"); 263. } 264. if (HConfusion > 2) 265. HConfusion = 2; 266. } 267. #else 268. if(otmp->otyp == DEAD_LIZARD && (HConfusion > 2)) 269. HConfusion = 2; 270. #endif /* DGKMOD /**/ 271. else 272. #ifdef QUEST 273. if(otmp->otyp == CARROT && !Blind){ 274. u.uhorizon++; 275. setsee(); 276. pline("Your vision improves."); 277. } else 278. #endif 279. #ifdef KAA 280. if(otmp->otyp == CARROT && Blind) Blind=1; 281. else 282. #endif 283. if(otmp->otyp == FORTUNE_COOKIE) { 284. if(Blind) { 285. pline("This cookie has a scrap of paper inside!"); 286. pline("What a pity, that you cannot read it!"); 287. } else 288. outrumor(); 289. } else 290. if(otmp->otyp == LUMP_OF_ROYAL_JELLY) { 291. /* This stuff seems to be VERY healthy! */ 292. gainstr(1); 293. u.uhp += rnd(20); 294. if(u.uhp > u.uhpmax) { 295. if(!rn2(17)) u.uhpmax++; 296. u.uhp = u.uhpmax; 297. } 298. heal_legs(); 299. } 300. break; 301. } 302. } 303. eatx: 304. if(multi<0 && !nomovemsg){ 305. static char msgbuf[BUFSZ]; 306. (void) sprintf(msgbuf, "You finished eating the %s.", 307. ftmp->oc_name); 308. nomovemsg = msgbuf; 309. } 310. useup(otmp); 311. return(1); 312. } 313. 314. /* called in main.c */ 315. gethungry(){ 316. --u.uhunger; 317. if(moves % 2) { 318. if(HRegeneration) u.uhunger--; 319. if(Hunger) u.uhunger--; 320. /* a3: if(Hunger & LEFT_RING) u.uhunger--; 321. if(Hunger & RIGHT_RING) u.uhunger--; 322. etc. */ 323. } 324. if(moves % 20 == 0) { /* jimt@asgb */ 325. if(uleft) u.uhunger--; 326. if(uright) u.uhunger--; 327. } 328. newuhs(TRUE); 329. } 330. 331. /* called after vomiting and after performing feats of magic */ 332. morehungry(num) register num; { 333. u.uhunger -= num; 334. newuhs(TRUE); 335. } 336. 337. /* called after eating something (and after drinking fruit juice) */ 338. lesshungry(num) register num; { 339. u.uhunger += num; 340. if(u.uhunger >= 2000) choke(FALSE); 341. #ifdef DGKMOD 342. else { 343. /* Have lesshungry() report when you're nearly full so all eating 344. * warns when you're about to choke. 345. */ 346. if (u.uhunger >= 1500) { 347. pline("You're having a hard time getting all of it down."); 348. multi -= 2; 349. nomovemsg = "You're finally finished."; 350. } 351. } 352. #endif /* DGKMOD /**/ 353. newuhs(FALSE); 354. } 355. 356. unfaint(){ 357. u.uhs = FAINTING; 358. flags.botl = 1; 359. } 360. 361. newuhs(incr) boolean incr; { 362. register int newhs, h = u.uhunger; 363. 364. newhs = (h > 1000) ? SATIATED : 365. (h > 150) ? NOT_HUNGRY : 366. (h > 50) ? HUNGRY : 367. (h > 0) ? WEAK : FAINTING; 368. 369. if(newhs == FAINTING) { 370. if(u.uhs == FAINTED) newhs = FAINTED; 371. if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) { 372. if(u.uhs != FAINTED && multi >= 0 /* %% */) { 373. pline("You faint from lack of food."); 374. nomul(-10+(u.uhunger/10)); 375. nomovemsg = "You regain consciousness."; 376. afternmv = unfaint; 377. newhs = FAINTED; 378. } 379. } else 380. if(u.uhunger < -(int)(200 + 25*u.ulevel)) { 381. u.uhs = STARVED; 382. flags.botl = 1; 383. bot(); 384. pline("You die from starvation."); 385. done("starved"); 386. } 387. } 388. 389. if(newhs != u.uhs) { 390. if(newhs >= WEAK && u.uhs < WEAK) 391. losestr(1); /* this may kill you -- see below */ 392. else 393. if(newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax) 394. losestr(-1); 395. switch(newhs){ 396. case HUNGRY: 397. if (Hallucination) { 398. pline((!incr) ? 399. "You now have a lesser case of the munchies." : 400. "You are getting the munchies."); 401. } else 402. pline((!incr) ? "You only feel hungry now." : 403. (u.uhunger < 145) ? "You feel hungry." : 404. "You are beginning to feel hungry."); 405. break; 406. case WEAK: 407. if (Hallucination) 408. pline((!incr) ? 409. "You still have the munchies." : 410. "The munchies are starting to interfere with your motor capabilities."); 411. else 412. pline((!incr) ? "You feel weak now." : 413. (u.uhunger < 45) ? "You feel weak." : 414. "You are beginning to feel weak."); 415. break; 416. } 417. u.uhs = newhs; 418. flags.botl = 1; 419. if(u.uhp < 1) { 420. pline("You die from hunger and exhaustion."); 421. killer = "exhaustion"; 422. done("starved"); 423. } 424. } 425. } 426. 427. #define CORPSE_I_TO_C(otyp) (char) ((otyp >= DEAD_ACID_BLOB)\ 428. ? 'a' + (otyp - DEAD_ACID_BLOB)\ 429. : '@' + (otyp - DEAD_HUMAN)) 430. poisonous(otmp) 431. register struct obj *otmp; 432. { 433. #ifdef KAA 434. if(otmp->otyp == DEAD_DEMON) return(1); 435. #endif 436. return(index(POISONOUS, CORPSE_I_TO_C(otmp->otyp)) != 0); 437. } 438. 439. /* returns 1 if some text was printed */ 440. eatcorpse(otmp) register struct obj *otmp; { 441. #ifdef KAA 442. register char let; 443. #else 444. register char let = CORPSE_I_TO_C(otmp->otyp); 445. #endif 446. register tp = 0; 447. #ifdef KAA 448. if(otmp->otyp == DEAD_DEMON) let='&'; 449. else if (otmp->otyp == DEAD_GIANT) let='9'; 450. else let = CORPSE_I_TO_C(otmp->otyp); 451. #endif 452. if(let != 'a' && moves > otmp->age + 50 + rn2(100)) { 453. tp++; 454. pline("Ulch -- that meat was tainted!"); 455. pline("You get very sick."); 456. Sick = 10 + rn2(10); 457. u.usick_cause = objects[otmp->otyp].oc_name; 458. } else if(index(POISONOUS, let) && rn2(5)){ 459. tp++; 460. pline("Ecch -- that must have been poisonous!"); 461. if(!Poison_resistance){ 462. losestr(rnd(4)); 463. losehp(rnd(15), "poisonous corpse"); 464. } else 465. pline("You don't seem affected by the poison."); 466. } else if(index("ELNOPQRUuxz", let) && rn2(5)){ 467. tp++; 468. pline("You feel sick."); 469. losehp(rnd(8), "cadaver"); 470. } 471. switch(let) { 472. case 'L': 473. case 'N': 474. case 't': 475. #ifdef KAA 476. case 'Q': 477. #endif 478. HTeleportation |= INTRINSIC; 479. break; 480. case 'W': 481. pluslvl(); 482. break; 483. case 'n': 484. u.uhp = u.uhpmax; 485. flags.botl = 1; 486. /* fall into next case */ 487. case '@': 488. pline("You cannibal! You will be sorry for this!"); 489. /* not tp++; */ 490. /* fall into next case */ 491. case 'd': 492. Aggravate_monster |= INTRINSIC; 493. break; 494. case 'I': 495. if(!Invis) { 496. HInvis = 50+rn2(100); 497. if(!See_invisible) 498. newsym(u.ux, u.uy); 499. } else { 500. HInvis |= INTRINSIC; 501. HSee_invisible |= INTRINSIC; 502. } 503. /* fall into next case */ 504. case 'y': 505. #ifdef QUEST 506. u.uhorizon++; 507. #endif 508. /* fall into next case */ 509. case 'B': 510. HConfusion += 50; 511. break; 512. case 'D': 513. HFire_resistance |= INTRINSIC; 514. break; 515. case 'E': 516. HTelepat |= INTRINSIC; 517. break; 518. case 'F': 519. case 'Y': 520. HCold_resistance |= INTRINSIC; 521. break; 522. #ifdef KAA 523. case '9': 524. gainstr(1); 525. break; 526. #endif 527. case 'k': 528. case 's': 529. HPoison_resistance |= INTRINSIC; 530. break; 531. case 'c': 532. if (u.usym != 'c') { 533. 534. pline("You turn to stone."); 535. killer = "dead cockatrice"; 536. done("died"); 537. } 538. break; 539. case 'a': 540. if(Stoned) { 541. pline("What a pity - you just destroyed a future piece of art!"); 542. tp++; 543. Stoned = 0; 544. } 545. break; 546. #ifdef KAA 547. case 'v': 548. pline ("Oh wow! Great stuff!"); 549. Hallucination += 200; 550. setsee(); 551. break; 552. #endif 553. case 'M': 554. if(u.usym == '@') { 555. pline("You cannot resist the temptation to mimic a treasure chest."); 556. tp++; 557. nomul(-30); 558. afternmv = Meatdone; 559. nomovemsg = "You now again prefer mimicking a human."; 560. u.usym = '$'; 561. prme(); 562. } 563. break; 564. } 565. return(tp); 566. } 567. 568. /* added by GAN 01/28/87 */ 569. choke(food) 570. register struct objclass *food; 571. { 572. /* only happens if you were satiated */ 573. if(u.uhs != SATIATED) return; 574. 575. if(food) killer = food->oc_name; 576. else killer = "exuberant appetite"; 577. pline("You choke over your food."); 578. pline("You die..."); 579. done("choked"); 580. }