|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 13547 (0x34eb) Types: TextFile Names: »potion.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Nethack/potion.c«
/* SCCS Id: @(#)potion.c 2.1 87/09/29 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ #include "hack.h" extern int float_down(); extern char *nomovemsg; extern struct monst youmonst; extern struct monst *makemon(); char *hcolor(); #ifdef KAA char *xname(); extern char pl_character[]; #endif #ifdef FOUNTAINS extern int drinkfountain(); extern int dipfountain(); #endif int nothing, unkn; dodrink() { register struct obj *otmp; register int retval; #ifdef FOUNTAINS /* Is there something to drink here, i.e., a fountain? */ if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { pline("Drink from the fountain? [ny] "); if(readchar() == 'y') { (void) drinkfountain(); return(0); } } #endif /* FOUNTAINS /**/ nothing = unkn = 0; otmp = getobj("!", "drink"); if(!otmp) return(0); if(!strcmp(objects[otmp->otyp].oc_descr, "smoky") && !rn2(13)) { ghost_from_bottle(); goto use_it; } if((retval = peffects(otmp)) >= 0) return(retval); if(nothing) { unkn++; pline("You have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "peculiar"); } if(otmp->dknown && !objects[otmp->otyp].oc_name_known) { if(!unkn) { objects[otmp->otyp].oc_name_known = 1; more_experienced(0,10); } else if(!objects[otmp->otyp].oc_uname) docall(otmp); } use_it: useup(otmp); return(1); } peffects(otmp) register struct obj *otmp; { register struct obj *objs; register struct monst *mtmp; switch(otmp->otyp){ case POT_RESTORE_STRENGTH: #ifdef SPELLS case SPE_RESTORE_STRENGTH: #endif unkn++; pline("Wow! This makes you feel great!"); if(u.ustr < u.ustrmax) { u.ustr = u.ustrmax; flags.botl = 1; } break; #ifdef KAA case POT_HALLUCINATION: if (Hallucination) nothing++; else pline("Oh wow! Everything looks so cosmic!"); Hallucination += rn1(100,750); setsee(); break; case POT_HOLY_WATER: unkn++; if(index("VWZ&",u.usym)) { pline("This burns like acid!"); /* should never kill you, but... */ losehp(d(2,6), "potion of holy water"); } else { pline("You feel full of awe."); if (Sick) Sick=0; if (HConfusion) HConfusion=0; } #else case POT_HOLY_WATER: case POT_HALLUCINATION: #endif break; case POT_BOOZE: unkn++; pline("Ooph! This tastes like liquid fire!"); HConfusion += d(3,8); /* the whiskey makes us feel better */ if(u.uhp < u.uhpmax) losehp(-1, "bottle of whiskey"); if(!rn2(4)) { pline("You pass out."); multi = -rnd(15); nomovemsg = "You awake with a headache."; } break; case POT_INVISIBILITY: #ifdef SPELLS case SPE_INVISIBILITY: #endif if(Invis || See_invisible) nothing++; else { if(!Blind) pline("Gee! All of a sudden, you can't see yourself."); else pline("You feel rather airy."), unkn++; newsym(u.ux,u.uy); } HInvis += rn1(15,31); break; case POT_FRUIT_JUICE: pline("This tastes like fruit juice."); lesshungry(20); break; case POT_HEALING: pline("You begin to feel better."); healup(rnd(10), 1, 1, 1); break; case POT_PARALYSIS: if(Levitation) pline("You are motionlessly suspended."); else pline("Your feet are frozen to the floor!"); nomul(-(rn1(10,25))); break; case POT_MONSTER_DETECTION: #ifdef SPELLS case SPE_DETECT_MONSTERS: #endif if(!fmon) { strange_feeling(otmp, "You feel threatened."); return(1); } else { cls(); for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->mx > 0) at(mtmp->mx,mtmp->my,Hallucination ? rndmonsym() : mtmp->data->mlet); prme(); pline("You sense the presence of monsters."); more(); docrt(); } break; case POT_OBJECT_DETECTION: #ifdef SPELLS case SPE_DETECT_TREASURE: #endif if(!fobj) { strange_feeling(otmp, "You feel a pull downward."); return(1); } else { for(objs = fobj; objs; objs = objs->nobj) if(objs->ox != u.ux || objs->oy != u.uy) goto outobjmap; pline("You sense the presence of objects close nearby."); break; outobjmap: cls(); for(objs = fobj; objs; objs = objs->nobj) at(objs->ox,objs->oy,Hallucination ? rndobjsym() : objs->olet); /* monster possessions added by GAN 12/16/86 */ for(mtmp = fmon ; mtmp ; mtmp = mtmp->nmon) if(mtmp->minvent) for(objs = mtmp->minvent; objs ; objs = objs->nobj) at(mtmp->mx,mtmp->my,objs->olet); prme(); pline("You sense the presence of objects."); more(); docrt(); } break; case POT_SICKNESS: pline("Yech! This stuff tastes like poison."); if(Poison_resistance) pline("(But in fact it was biologically contaminated orange juice.)"); #ifdef KAA if (pl_character[0] == 'H') pline("Fortunately you have been immunized!"); else { #endif losestr((Poison_resistance) ? 1 : rn1(4,3)); if(!Poison_resistance) losehp(rnd(10), "contaminated potion"); #ifdef KAA } #endif if(Hallucination) { pline("You are shocked back to your senses!"); Hallucination=1; } break; case POT_CONFUSION: if(!Confusion) if (Hallucination) { pline("What a trippy feeling!"); unkn++; } else pline("Huh, What? Where am I?"); else nothing++; HConfusion += rn1(7,16); break; case POT_GAIN_STRENGTH: pline("Wow do you feel strong!"); gainstr(0); break; case POT_SPEED: if(Wounded_legs) { heal_legs(); unkn++; break; } /* and fall through */ #ifdef SPELLS case SPE_HASTE_SELF: #endif if(!(Fast & ~INTRINSIC)) pline("You are suddenly moving much faster."); else pline("Your legs get new energy."), unkn++; Fast += rn1(10,100); break; case POT_BLINDNESS: if(!Blind) if (Hallucination) pline("Bummer! Everything is dark! Help!"); else pline("A cloud of darkness falls upon you."); else nothing++; Blinded += rn1(100,250); seeoff(0); break; case POT_GAIN_LEVEL: pluslvl(); break; case POT_EXTRA_HEALING: pline("You feel much better."); healup(d(2,20)+1, 2, 1, 1); if(Hallucination) Hallucination = 1; break; case POT_LEVITATION: #ifdef SPELLS case SPE_LEVITATION: #endif if(!Levitation) float_up(); else nothing++; Levitation += rnd(100); u.uprops[PROP(RIN_LEVITATION)].p_tofn = float_down; break; case POT_GAIN_ENERGY: /* M. Stephenson */ #ifdef SPELLS { register int num; if(Confusion) { pline("You feel feverish."); unkn++; } else pline("Magical energies course through your body."); num = rnd(5) + 1; u.uenmax += num; u.uen += num; flags.botl = 1; break; } #else pline("This potion tastes weird!"); break; #endif default: impossible("What a funny potion! (%u)", otmp->otyp); return(0); } return(-1); } healup(nhp, nxtra, curesick, cureblind) int nhp, nxtra; register boolean curesick, cureblind; { #ifdef KAA if (u.mtimedone & nhp) { u.mh += rnd(nhp); if (u.mh > u.mhmax) u.mh = (u.mhmax + nxtra); } #endif if(nhp) { u.uhp += nhp; if(u.uhp > u.uhpmax) u.uhp = (u.uhpmax += nxtra); } if(Blind && cureblind) Blinded = 1; /* see on next move */ if(Sick && curesick) Sick = 0; flags.botl = 1; return; } pluslvl() { register num; pline("You feel more experienced."); num = rnd(10); u.uhpmax += num; u.uhp += num; #ifdef SPELLS num = rnd(u.ulevel/2+1) + 1; /* M. Stephenson */ u.uenmax += num; u.uen += num; #endif if(u.ulevel < 14) { extern long newuexp(); u.uexp = newuexp()+1; pline("Welcome to experience level %u.", ++u.ulevel); } flags.botl = 1; } strange_feeling(obj,txt) register struct obj *obj; register char *txt; { if(flags.beginner) pline("You have a %s feeling for a moment, then it passes.", Hallucination ? "normal" : "strange"); else pline(txt); if(!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname) docall(obj); useup(obj); } char *bottlenames[] = { "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial" }; potionhit(mon, obj) register struct monst *mon; register struct obj *obj; { extern char *xname(); register char *botlnam = bottlenames[rn2(SIZE(bottlenames))]; boolean uclose, isyou = (mon == &youmonst); if(isyou) { uclose = TRUE; pline("The %s crashes on your head and breaks into shivers.", botlnam); losehp(rnd(2), "thrown potion"); } else { uclose = (dist(mon->mx,mon->my) < 3); /* perhaps 'E' and 'a' have no head? */ pline("The %s crashes on %s's head and breaks into shivers.", botlnam, monnam(mon)); if(rn2(5) && mon->mhp > 1) mon->mhp--; } pline("The %s evaporates.", xname(obj)); #ifdef KAA if(!isyou) switch (obj->otyp) { #else if(!isyou && !rn2(3)) switch(obj->otyp) { #endif case POT_RESTORE_STRENGTH: case POT_GAIN_STRENGTH: case POT_HEALING: case POT_EXTRA_HEALING: if(mon->mhp < mon->mhpmax) { mon->mhp = mon->mhpmax; pline("%s looks sound and hale again!", Monnam(mon)); } break; case POT_SICKNESS: if((mon->mhpmax > 3) && !resist(mon, '!', 0, NOTELL)) mon->mhpmax /= 2; if((mon->mhp > 2) && !resist(mon, '!', 0, NOTELL)) mon->mhp /= 2; #ifdef KAA pline("%s looks rather ill.", Monnam(mon)); #endif break; case POT_CONFUSION: case POT_BOOZE: if(!resist(mon, '!', 0, NOTELL)) mon->mconf = 1; break; case POT_INVISIBILITY: unpmon(mon); mon->minvis = 1; pmon(mon); break; case POT_PARALYSIS: mon->mfroz = 1; break; case POT_SPEED: mon->mspeed = MFAST; break; case POT_BLINDNESS: mon->mblinded |= 64 + rn2(32) + rn2(32) * !resist(mon, '!', 0, NOTELL); break; #ifdef KAA case POT_HOLY_WATER: if (index("ZVW &", mon->data->mlet)) { pline("%s shrieks in pain!", Monnam(mon)); mon->mhp -= d(2,6); if (mon->mhp <1) killed(mon); } break; #endif /* case POT_GAIN_LEVEL: case POT_LEVITATION: case POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case POT_OBJECT_DETECTION: break; */ } if(uclose && rn2(5)) potionbreathe(obj); obfree(obj, Null(obj)); } potionbreathe(obj) register struct obj *obj; { switch(obj->otyp) { case POT_RESTORE_STRENGTH: case POT_GAIN_STRENGTH: if(u.ustr < u.ustrmax) u.ustr++, flags.botl = 1; break; case POT_HEALING: case POT_EXTRA_HEALING: if(u.uhp < u.uhpmax) u.uhp++, flags.botl = 1; break; case POT_SICKNESS: if(u.uhp <= 5) u.uhp = 1; else u.uhp -= 5; flags.botl = 1; break; case POT_HALLUCINATION: #ifdef KAA pline("You have a vision for a moment."); break; #endif case POT_CONFUSION: case POT_BOOZE: if(!Confusion) pline("You feel somewhat dizzy."); HConfusion += rnd(5); break; case POT_INVISIBILITY: pline("For an instant you could see through yourself!"); break; case POT_PARALYSIS: pline("Something seems to be holding you."); nomul(-rnd(5)); break; case POT_SPEED: Fast += rnd(5); pline("Your knees seem more flexible now."); break; case POT_BLINDNESS: if(!Blind) pline("It suddenly gets dark."); Blinded += rnd(5); seeoff(0); break; /* case POT_GAIN_LEVEL: case POT_LEVITATION: case POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case POT_OBJECT_DETECTION: break; */ } /* note: no obfree() */ } /* * -- rudimentary -- to do this correctly requires much more work * -- all sharp weapons get one or more qualities derived from the potions * -- texts on scrolls may be (partially) wiped out; do they become blank? * -- or does their effect change, like under Confusion? * -- all objects may be made invisible by POT_INVISIBILITY * -- If the flask is small, can one dip a large object? Does it magically * -- become a jug? Etc. */ dodip(){ register struct obj *potion, *obj; #ifdef KAA char *tmp; #endif if(!(obj = getobj("#", "dip"))) return(0); #ifdef FOUNTAINS /* Is there something to dip into here, i.e., a fountain? */ if (levl[u.ux][u.uy].typ == FOUNTAIN) { pline("Dip it in the fountain? [ny] "); if(readchar() == 'y') { dipfountain(obj); return(1); } } #endif if(!(potion = getobj("!", "dip into"))) return(0); #ifndef KAA pline("Interesting..."); #else if(potion->otyp == POT_HOLY_WATER) { if (obj->cursed) { obj->cursed=0; pline("Your %s %s.", aobjnam(obj,"softly glow"), Hallucination ? hcolor() : "amber"); poof: useup(potion); return(1); } else if(obj->otyp >= ARROW && obj->otyp <= SPEAR) { obj->dknown=1; tmp = Hallucination ? hcolor() : "light blue"; /* dknown for weapons is meaningless, so it's free to be reused. */ pline("Your %s with a%s %s aura.", aobjnam(obj,"softly glow"), index("aeiou",*tmp) ? "n" : "", tmp); goto poof; } } #endif if(obj->otyp == ARROW || obj->otyp == DART || obj->otyp == CROSSBOW_BOLT || obj->otyp == SHURIKEN) { if(potion->otyp == POT_SICKNESS) { char buf[BUFSZ]; useup(potion); if(obj->spe < 7) obj->spe++; /* %% */ sprintf(buf, xname(potion)); pline("The %s forms a coating on the %s.", buf, xname(obj)); } } #ifdef HARD else if (!rn2(4)) useup(potion); #endif #ifdef KAA pline("Interesting..."); #endif return(1); } ghost_from_bottle(){ extern struct permonst pm_ghost; register struct monst *mtmp; if(!(mtmp = makemon(PM_GHOST,u.ux,u.uy))){ pline("This bottle turns out to be empty."); return; } mnexto(mtmp); pline("As you open the bottle, an enormous ghost emerges!"); pline("You are frightened to death, and unable to move."); nomul(-3); } gainstr(inc) register int inc; { if (inc) u.ustr++; else { if (u.ustr < 18) u.ustr += (rn2(4) ? 1 : rnd(6) ); else if (u.ustr < 103) u.ustr += rnd(10); else u.ustr++; } if(u.ustr > 118) u.ustr = 118; if(u.ustr > u.ustrmax) u.ustrmax = u.ustr; flags.botl = 1; }