From 778be49489ba6d817c5659fb9fd7ec0a5641f4c8 Mon Sep 17 00:00:00 2001 From: jwalz Date: Sat, 5 Jan 2002 21:05:53 +0000 Subject: [PATCH] *** empty log message *** --- src/sit.c | 417 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 src/sit.c diff --git a/src/sit.c b/src/sit.c new file mode 100644 index 000000000..46a726371 --- /dev/null +++ b/src/sit.c @@ -0,0 +1,417 @@ +/* SCCS Id: @(#)sit.c 3.3 2000/11/09 */ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/* NetHack may be freely redistributed. See license for details. */ + +#include "hack.h" +#include "artifact.h" + +void +take_gold() +{ +#ifndef GOLDOBJ + if (u.ugold <= 0) { + You_feel("a strange sensation."); + } else { + You("notice you have no gold!"); + u.ugold = 0; + flags.botl = 1; + } +#else + struct obj *otmp; + int lost_money = 0; + for (otmp = invent; otmp; otmp = otmp->nobj) { + if (otmp->oclass == GOLD_CLASS) { + lost_money = 1; + delobj(otmp); + } + } + if (!lost_money) { + You_feel("a strange sensation."); + } else { + You("notice you have no money!"); + flags.botl = 1; + } +#endif +} + +int +dosit() +{ + static const char *sit_message = "sit on the %s."; + register struct trap *trap; + register int typ = levl[u.ux][u.uy].typ; + + +#ifdef STEED + if (u.usteed) { + You("are already sitting on %s.", mon_nam(u.usteed)); + return (0); + } +#endif + + if(!can_reach_floor()) { + if (Levitation) + You("tumble in place."); + else + You("are sitting on air."); + return 0; + } else if (is_pool(u.ux, u.uy) && !Underwater) { /* water walking */ + goto in_water; + } + + if(OBJ_AT(u.ux, u.uy)) { + register struct obj *obj; + + obj = level.objects[u.ux][u.uy]; + You("sit on %s.", the(xname(obj))); + if (!(Is_box(obj) || objects[obj->otyp].oc_material == CLOTH)) + pline("It's not very comfortable..."); + + } else if ((trap = t_at(u.ux, u.uy)) != 0) { + + if (u.utrap) { + exercise(A_WIS, FALSE); /* you're getting stuck longer */ + if(u.utraptype == TT_BEARTRAP) { + You_cant("sit down with your %s in the bear trap.", body_part(FOOT)); + u.utrap++; + } else if(u.utraptype == TT_PIT) { + if(trap->ttyp == SPIKED_PIT) { + You("sit down on a spike. Ouch!"); + losehp(1, "sitting on an iron spike", KILLED_BY); + exercise(A_STR, FALSE); + } else + You("sit down in the pit."); + u.utrap += rn2(5); + } else if(u.utraptype == TT_WEB) { + You("sit in the spider web and get entangled further!"); + u.utrap += rn1(10, 5); + } else if(u.utraptype == TT_LAVA) { + /* Must have fire resistance or they'd be dead already */ + You("sit in the lava!"); + u.utrap += rnd(4); + losehp(d(2,10), "sitting in lava", KILLED_BY); + } else if(u.utraptype == TT_INFLOOR) { + You_cant("maneuver to sit!"); + u.utrap++; + } + } else { + You("sit down."); + dotrap(trap, 0); + } + } else if(Underwater || Is_waterlevel(&u.uz)) { + if (Is_waterlevel(&u.uz)) + There("are no cushions floating nearby."); + else + You("sit down on the muddy bottom."); + } else if(is_pool(u.ux, u.uy)) { + in_water: + You("sit in the water."); + if (!rn2(10) && uarm) + (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); + if (!rn2(10) && uarmf && uarmf->otyp != WATER_WALKING_BOOTS) + (void) rust_dmg(uarm, "armor", 1, TRUE, &youmonst); +#ifdef SINKS + } else if(IS_SINK(typ)) { + + You(sit_message, defsyms[S_sink].explanation); + Your("%s gets wet.", humanoid(youmonst.data) ? "rump" : "underside"); +#endif + } else if(IS_ALTAR(typ)) { + + You(sit_message, defsyms[S_altar].explanation); + altar_wrath(u.ux, u.uy); + + } else if(IS_GRAVE(typ)) { + + You(sit_message, defsyms[S_grave].explanation); + + } else if(typ == STAIRS) { + + You(sit_message, "stairs"); + + } else if(typ == LADDER) { + + You(sit_message, "ladder"); + + } else if (is_lava(u.ux, u.uy)) { + + /* must be WWalking */ + You(sit_message, "lava"); + burn_away_slime(); + if (likes_lava(youmonst.data)) { + pline_The("lava feels warm."); + return 1; + } + pline_The("lava burns you!"); + losehp(d((Fire_resistance ? 2 : 10), 10), + "sitting on lava", KILLED_BY); + + } else if (is_ice(u.ux, u.uy)) { + + You(sit_message, defsyms[S_ice].explanation); + if (!Cold_resistance) pline_The("ice feels cold."); + + } else if (typ == DRAWBRIDGE_DOWN) { + + You(sit_message, "drawbridge"); + + } else if(IS_THRONE(typ)) { + + You(sit_message, defsyms[S_throne].explanation); + if (rnd(6) > 4) { + switch (rnd(13)) { + case 1: + (void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE); + losehp(rnd(10), "cursed throne", KILLED_BY_AN); + break; + case 2: + (void) adjattrib(rn2(A_MAX), 1, FALSE); + break; + case 3: + pline("A%s electric shock shoots through your body!", + (Shock_resistance) ? "n" : " massive"); + losehp(Shock_resistance ? rnd(6) : rnd(30), + "electric chair", KILLED_BY_AN); + exercise(A_CON, FALSE); + break; + case 4: + You_feel("much, much better!"); + if (Upolyd) { + if (u.mh >= (u.mhmax - 5)) u.mhmax += 4; + u.mh = u.mhmax; + } + if(u.uhp >= (u.uhpmax - 5)) u.uhpmax += 4; + u.uhp = u.uhpmax; + make_blinded(0L,TRUE); + make_sick(0L, (char *) 0, FALSE, SICK_ALL); + heal_legs(); + flags.botl = 1; + break; + case 5: + take_gold(); + break; + case 6: + if(u.uluck + rn2(5) < 0) { + You_feel("your luck is changing."); + change_luck(1); + } else makewish(); + break; + case 7: + { + register int cnt = rnd(10); + + pline("A voice echoes:"); + verbalize("Thy audience hath been summoned, %s!", + flags.female ? "Dame" : "Sire"); + while(cnt--) + (void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS); + break; + } + case 8: + pline("A voice echoes:"); + verbalize("By thy Imperious order, %s...", + flags.female ? "Dame" : "Sire"); + do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */ + break; + case 9: + pline("A voice echoes:"); + verbalize("A curse upon thee for sitting upon this most holy throne!"); + if (Luck > 0) { + make_blinded(Blinded + rn1(100,250),TRUE); + } else rndcurse(); + break; + case 10: + if (Luck < 0 || (HSee_invisible & INTRINSIC)) { + if (level.flags.nommap) { + pline( + "A terrible drone fills your head!"); + make_confused(HConfusion + rnd(30), + FALSE); + } else { + pline("An image forms in your mind."); + do_mapping(); + } + } else { + Your("vision becomes clear."); + HSee_invisible |= FROMOUTSIDE; + newsym(u.ux, u.uy); + } + break; + case 11: + if (Luck < 0) { + You_feel("threatened."); + aggravate(); + } else { + + You_feel("a wrenching sensation."); + tele(); /* teleport him */ + } + break; + case 12: + You("are granted an insight!"); + if (invent) { + /* rn2(5) agrees w/seffects() */ + identify_pack(rn2(5)); + } + break; + case 13: + Your("mind turns into a pretzel!"); + make_confused(HConfusion + rn1(7,16),FALSE); + break; + default: impossible("throne effect"); + break; + } + } else { + if (is_prince(youmonst.data)) + You_feel("very comfortable here."); + else + You_feel("somehow out of place..."); + } + + if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) { + /* may have teleported */ + pline_The("throne vanishes in a puff of logic."); + levl[u.ux][u.uy].typ = ROOM; + newsym(u.ux,u.uy); + } + + } else if (lays_eggs(youmonst.data)) { + struct obj *uegg; + + if (!flags.female) { + pline("Males can't lay eggs!"); + return 0; + } + + if (u.uhunger < (int)objects[EGG].oc_nutrition) { + You("don't have enough energy to lay an egg."); + return 0; + } + + uegg = mksobj(EGG, FALSE, FALSE); + uegg->spe = 1; + uegg->quan = 1; + uegg->owt = weight(uegg); + uegg->corpsenm = egg_type_from_parent(u.umonnum, FALSE); + uegg->known = uegg->dknown = 1; + attach_egg_hatch_timeout(uegg); + You("lay an egg."); + dropy(uegg); + stackobj(uegg); + morehungry((int)objects[EGG].oc_nutrition); + } else if (u.uswallow) + There("are no seats in here!"); + else + pline("Having fun sitting on the %s?", surface(u.ux,u.uy)); + return(1); +} + +void +rndcurse() /* curse a few inventory items at random! */ +{ + int nobj = 0; + int cnt, onum; + struct obj *otmp; + static const char *mal_aura = "feel a malignant aura surround %s."; + + if (uwep && (uwep->oartifact == ART_MAGICBANE) && rn2(20)) { + You(mal_aura, "the magic-absorbing blade"); + return; + } + + if(Antimagic) { + shieldeff(u.ux, u.uy); + You(mal_aura, "you"); + } + + for (otmp = invent; otmp; otmp = otmp->nobj) nobj++; + + if (nobj) { + for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1)); + cnt > 0; cnt--) { + onum = rn2(nobj); + for(otmp = invent; onum != 0; onum--) + otmp = otmp->nobj; + + if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) && + rn2(10) < 8) { + pline("%s resists!", The(xname(otmp))); + continue; + } + + if(otmp->blessed) + unbless(otmp); + else + curse(otmp); + } + update_inventory(); + } +} + +void +attrcurse() /* remove a random INTRINSIC ability */ +{ + switch(rnd(11)) { + case 1 : if (HFire_resistance & INTRINSIC) { + HFire_resistance &= ~INTRINSIC; + You_feel("warmer."); + break; + } + case 2 : if (HTeleportation & INTRINSIC) { + HTeleportation &= ~INTRINSIC; + You_feel("less jumpy."); + break; + } + case 3 : if (HPoison_resistance & INTRINSIC) { + HPoison_resistance &= ~INTRINSIC; + You_feel("a little sick!"); + break; + } + case 4 : if (HTelepat & INTRINSIC) { + HTelepat &= ~INTRINSIC; + if (Blind && !Blind_telepat) + see_monsters(); /* Can't sense mons anymore! */ + Your("senses fail!"); + break; + } + case 5 : if (HCold_resistance & INTRINSIC) { + HCold_resistance &= ~INTRINSIC; + You_feel("cooler."); + break; + } + case 6 : if (HInvis & INTRINSIC) { + HInvis &= ~INTRINSIC; + You_feel("paranoid."); + break; + } + case 7 : if (HSee_invisible & INTRINSIC) { + HSee_invisible &= ~INTRINSIC; + You("%s!", Hallucination ? "tawt you taw a puttie tat" + : "thought you saw something"); + break; + } + case 8 : if (HFast & INTRINSIC) { + HFast &= ~INTRINSIC; + You_feel("slower."); + break; + } + case 9 : if (HStealth & INTRINSIC) { + HStealth &= ~INTRINSIC; + You_feel("clumsy."); + break; + } + case 10: if (HProtection & INTRINSIC) { + HProtection &= ~INTRINSIC; + You_feel("vulnerable."); + break; + } + case 11: if (HAggravate_monster & INTRINSIC) { + HAggravate_monster &= ~INTRINSIC; + You_feel("less attractive."); + break; + } + default: break; + } +} + +/*sit.c*/