]> granicus.if.org Git - nethack/commitdiff
Split sitting code into smaller parts
authorPasi Kallinen <paxed@alt.org>
Sun, 20 Feb 2022 15:28:48 +0000 (17:28 +0200)
committerPasi Kallinen <paxed@alt.org>
Sun, 20 Feb 2022 15:29:37 +0000 (17:29 +0200)
Split sitting on a throne and laying an egg into their
own functions.  No changes to behaviour.

src/sit.c

index 3a652767d24655478cbf5a3eab883d1395ce746b..c30695747b561d10ade9c96ed9d5e9609d1a710c 100644 (file)
--- 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));
     }