*** empty log message ***
This commit is contained in:
417
src/sit.c
Normal file
417
src/sit.c
Normal file
@@ -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*/
|
||||
Reference in New Issue
Block a user