Split sitting code into smaller parts

Split sitting on a throne and laying an egg into their
own functions.  No changes to behaviour.
This commit is contained in:
Pasi Kallinen
2022-02-20 17:28:48 +02:00
parent 928677c810
commit 74296c3213

389
src/sit.c
View File

@@ -6,6 +6,8 @@
#include "hack.h"
#include "artifact.h"
static void throne_sit_effect(void);
static int lay_an_egg(void);
/* take away the hero's money */
void
@@ -30,6 +32,205 @@ take_gold(void)
}
}
/* maybe do something when hero sits on a throne */
static void
throne_sit_effect(void)
{
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;
if (u.uhpmax > u.uhppeak)
u.uhppeak = u.uhpmax;
}
u.uhp = u.uhpmax;
u.ucreamed = 0;
make_blinded(0L, TRUE);
make_sick(0L, (char *) 0, FALSE, SICK_ALL);
heal_legs(0);
g.context.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:
{
int cnt = rnd(10);
/* Magical voice not affected by deafness */
pline("A voice echoes:");
verbalize("Thine audience hath been summoned, %s!",
flags.female ? "Dame" : "Sire");
while (cnt--)
(void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS);
break;
}
case 8:
/* Magical voice not affected by deafness */
pline("A voice echoes:");
verbalize("By thine Imperious order, %s...",
flags.female ? "Dame" : "Sire");
do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */
break;
case 9:
/* Magical voice not affected by deafness */
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);
change_luck((Luck > 1) ? -rnd(2) : -1);
} else
rndcurse();
break;
case 10:
if (Luck < 0 || (HSee_invisible & INTRINSIC)) {
if (g.level.flags.nommap) {
pline("A terrible drone fills your head!");
make_confused((HConfusion & TIMEOUT) + (long) rnd(30),
FALSE);
} else {
pline("An image forms in your mind.");
do_mapping();
}
} else {
/* avoid "vision clears" if hero can't see */
if (!Blind) {
Your("vision becomes clear.");
} else {
int num_of_eyes = eyecount(g.youmonst.data);
const char *eye = body_part(EYE);
/* note: 1 eye case won't actually happen--can't
sit on throne when poly'd into always-levitating
floating eye and can't polymorph into Cyclops */
switch (num_of_eyes) { /* 2, 1, or 0 */
default:
case 2: /* more than 1 eye */
eye = makeplural(eye);
/*FALLTHRU*/
case 1: /* one eye (Cyclops, floating eye) */
Your("%s %s...", eye, vtense(eye, "tingle"));
break;
case 0: /* no eyes */
You("have a very strange feeling in your %s.",
body_part(HEAD));
break;
}
}
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 (g.invent) {
/* rn2(5) agrees w/seffects() */
identify_pack(rn2(5), FALSE);
}
break;
case 13:
Your("mind turns into a pretzel!");
make_confused((HConfusion & TIMEOUT) + (long) rn1(7, 16),
FALSE);
break;
default:
impossible("throne effect");
break;
}
} else {
if (is_prince(g.youmonst.data) || u.uevent.uhand_of_elbereth)
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 */
levl[u.ux][u.uy].typ = ROOM, levl[u.ux][u.uy].flags = 0;
pline_The("throne vanishes in a puff of logic.");
newsym(u.ux, u.uy);
}
}
/* hero lays an egg */
static int
lay_an_egg(void)
{
struct obj *uegg;
if (!flags.female) {
pline("%s can't lay eggs!",
Hallucination
? "You may think you are a platypus, but a male still"
: "Males");
return ECMD_OK;
} else if (u.uhunger < (int) objects[EGG].oc_nutrition) {
You("don't have enough energy to lay an egg.");
return ECMD_OK;
} else if (eggs_in_water(g.youmonst.data)) {
if (!(Underwater || Is_waterlevel(&u.uz))) {
pline("A splash tetra you are not.");
return ECMD_OK;
}
if (Upolyd
&& (g.youmonst.data == &mons[PM_GIANT_EEL]
|| g.youmonst.data == &mons[PM_ELECTRIC_EEL])) {
You("yearn for the Sargasso Sea.");
return ECMD_OK;
}
}
uegg = mksobj(EGG, FALSE, FALSE);
uegg->spe = 1;
uegg->quan = 1L;
uegg->owt = weight(uegg);
/* this sets hatch timers if appropriate */
set_corpsenm(uegg, egg_type_from_parent(u.umonnum, FALSE));
uegg->known = uegg->dknown = 1;
You("%s an egg.", eggs_in_water(g.youmonst.data) ? "spawn" : "lay");
dropy(uegg);
stackobj(uegg);
morehungry((int) objects[EGG].oc_nutrition);
return ECMD_TIME;
}
/* #sit command */
int
dosit(void)
@@ -163,193 +364,9 @@ dosit(void)
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;
if (u.uhpmax > u.uhppeak)
u.uhppeak = u.uhpmax;
}
u.uhp = u.uhpmax;
u.ucreamed = 0;
make_blinded(0L, TRUE);
make_sick(0L, (char *) 0, FALSE, SICK_ALL);
heal_legs(0);
g.context.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:
{
int cnt = rnd(10);
/* Magical voice not affected by deafness */
pline("A voice echoes:");
verbalize("Thine audience hath been summoned, %s!",
flags.female ? "Dame" : "Sire");
while (cnt--)
(void) makemon(courtmon(), u.ux, u.uy, NO_MM_FLAGS);
break;
}
case 8:
/* Magical voice not affected by deafness */
pline("A voice echoes:");
verbalize("By thine Imperious order, %s...",
flags.female ? "Dame" : "Sire");
do_genocide(5); /* REALLY|ONTHRONE, see do_genocide() */
break;
case 9:
/* Magical voice not affected by deafness */
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);
change_luck((Luck > 1) ? -rnd(2) : -1);
} else
rndcurse();
break;
case 10:
if (Luck < 0 || (HSee_invisible & INTRINSIC)) {
if (g.level.flags.nommap) {
pline("A terrible drone fills your head!");
make_confused((HConfusion & TIMEOUT) + (long) rnd(30),
FALSE);
} else {
pline("An image forms in your mind.");
do_mapping();
}
} else {
/* avoid "vision clears" if hero can't see */
if (!Blind) {
Your("vision becomes clear.");
} else {
int num_of_eyes = eyecount(g.youmonst.data);
const char *eye = body_part(EYE);
/* note: 1 eye case won't actually happen--can't
sit on throne when poly'd into always-levitating
floating eye and can't polymorph into Cyclops */
switch (num_of_eyes) { /* 2, 1, or 0 */
default:
case 2: /* more than 1 eye */
eye = makeplural(eye);
/*FALLTHRU*/
case 1: /* one eye (Cyclops, floating eye) */
Your("%s %s...", eye, vtense(eye, "tingle"));
break;
case 0: /* no eyes */
You("have a very strange feeling in your %s.",
body_part(HEAD));
break;
}
}
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 (g.invent) {
/* rn2(5) agrees w/seffects() */
identify_pack(rn2(5), FALSE);
}
break;
case 13:
Your("mind turns into a pretzel!");
make_confused((HConfusion & TIMEOUT) + (long) rn1(7, 16),
FALSE);
break;
default:
impossible("throne effect");
break;
}
} else {
if (is_prince(g.youmonst.data) || u.uevent.uhand_of_elbereth)
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 */
levl[u.ux][u.uy].typ = ROOM, levl[u.ux][u.uy].flags = 0;
pline_The("throne vanishes in a puff of logic.");
newsym(u.ux, u.uy);
}
throne_sit_effect();
} else if (lays_eggs(g.youmonst.data)) {
struct obj *uegg;
if (!flags.female) {
pline("%s can't lay eggs!",
Hallucination
? "You may think you are a platypus, but a male still"
: "Males");
return ECMD_OK;
} else if (u.uhunger < (int) objects[EGG].oc_nutrition) {
You("don't have enough energy to lay an egg.");
return ECMD_OK;
} else if (eggs_in_water(g.youmonst.data)) {
if (!(Underwater || Is_waterlevel(&u.uz))) {
pline("A splash tetra you are not.");
return ECMD_OK;
}
if (Upolyd
&& (g.youmonst.data == &mons[PM_GIANT_EEL]
|| g.youmonst.data == &mons[PM_ELECTRIC_EEL])) {
You("yearn for the Sargasso Sea.");
return ECMD_OK;
}
}
uegg = mksobj(EGG, FALSE, FALSE);
uegg->spe = 1;
uegg->quan = 1L;
uegg->owt = weight(uegg);
/* this sets hatch timers if appropriate */
set_corpsenm(uegg, egg_type_from_parent(u.umonnum, FALSE));
uegg->known = uegg->dknown = 1;
You("%s an egg.", eggs_in_water(g.youmonst.data) ? "spawn" : "lay");
dropy(uegg);
stackobj(uegg);
morehungry((int) objects[EGG].oc_nutrition);
return lay_an_egg();
} else {
pline("Having fun sitting on the %s?", surface(u.ux, u.uy));
}