From 74296c3213e64f4849322a58fd072831da5400cd Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 20 Feb 2022 17:28:48 +0200 Subject: [PATCH] Split sitting code into smaller parts Split sitting on a throne and laying an egg into their own functions. No changes to behaviour. --- src/sit.c | 389 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 203 insertions(+), 186 deletions(-) diff --git a/src/sit.c b/src/sit.c index 3a652767d..c30695747 100644 --- a/src/sit.c +++ b/src/sit.c @@ -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)); }