diff --git a/fountain.c b/fountain.c
deleted file mode 100644
index 9ceb75d..0000000
--- a/fountain.c
+++ /dev/null
@@ -1,710 +0,0 @@
-/* NetHack 3.7	fountain.c	$NHDT-Date: 1687058871 2023/06/18 03:27:51 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.95 $ */
-/*      Copyright Scott R. Turner, srt@ucla, 10/27/86 */
-/* NetHack may be freely redistributed.  See license for details. */
-
-/* Code for drinking from fountains. */
-
-#include "hack.h"
-
-static void dowatersnakes(void);
-static void dowaterdemon(void);
-static void dowaternymph(void);
-static void gush(coordxy, coordxy, genericptr_t);
-static void dofindgem(void);
-static boolean watchman_warn_fountain(struct monst *);
-
-DISABLE_WARNING_FORMAT_NONLITERAL
-
-/* used when trying to dip in or drink from fountain or sink or pool while
-   levitating above it, or when trying to move downwards in that state */
-void
-floating_above(const char *what)
-{
-    const char *umsg = "are floating high above the %s.";
-
-    if (u.utrap && (u.utraptype == TT_INFLOOR || u.utraptype == TT_LAVA)) {
-        /* when stuck in floor (not possible at fountain or sink location,
-           so must be attempting to move down), override the usual message */
-        umsg = "are trapped in the %s.";
-        what = surface(u.ux, u.uy); /* probably redundant */
-    }
-    You(umsg, what);
-}
-
-RESTORE_WARNING_FORMAT_NONLITERAL
-
-/* Fountain of snakes! */
-static void
-dowatersnakes(void)
-{
-    register int num = rn1(5, 2); // Generate a random number between 2 and 5 to represent the number of water snakes
-    struct monst *mtmp;
-
-    if (!(gm.mvitals[PM_WATER_MOCCASIN].mvflags & G_GONE)) { // Check if water snakes are extinct
-        if (!Blind) {
-            pline("An endless stream of %s pours forth!",
-                  Hallucination ? makeplural(rndmonnam(NULL)) : "snakes");
-        } else {
-            Soundeffect(se_snakes_hissing, 75); // Play a sound effect of hissing snakes
-            You_hear("%s hissing!", something); // Output the sound of hissing
-        }
-        while (num-- > 0) {
-            if ((mtmp = makemon(&mons[PM_WATER_MOCCASIN], u.ux, u.uy, MM_NOMSG)) != 0
-                && t_at(mtmp->mx, mtmp->my)) {
-                (void) mintrap(mtmp, NO_TRAP_FLAGS); // Place the water snake on the map and check for traps
-            }
-        }
-    } else {
-        Soundeffect(se_furious_bubbling, 20); // Play a sound effect of furious bubbling
-        pline_The("fountain bubbles furiously for a moment, then calms."); // Output a message about the fountain bubbling
-    }
-}
-
-
-/* Water demon */
-static void
-dowaterdemon(void)
-{
-    struct monst *mtmp;
-
-    if (!(gm.mvitals[PM_WATER_DEMON].mvflags & G_GONE)) {
-        if ((mtmp = makemon(&mons[PM_WATER_DEMON], u.ux, u.uy,
-                            MM_NOMSG)) != 0) {
-            if (!Blind)
-                You("unleash %s!", a_monnam(mtmp));
-            else
-                You_feel("the presence of evil.");
-
-            /* Give those on low levels a (slightly) better chance of survival
-             */
-            if (rnd(100) > (80 + level_difficulty())) {
-                pline("Grateful for %s release, %s grants you a wish!",
-                      mhis(mtmp), mhe(mtmp));
-                /* give a wish and discard the monster (mtmp set to null) */
-                mongrantswish(&mtmp);
-            } else if (t_at(mtmp->mx, mtmp->my))
-                (void) mintrap(mtmp, NO_TRAP_FLAGS);
-        }
-    } else {
-        Soundeffect(se_furious_bubbling, 20);
-        pline_The("fountain bubbles furiously for a moment, then calms.");
-    }
-}
-
-/* Water Nymph */
-static void
-dowaternymph(void)
-{
-    register struct monst *mtmp;
-
-    if (!(gm.mvitals[PM_WATER_NYMPH].mvflags & G_GONE) // Check if water nymphs are extinct
-        && (mtmp = makemon(&mons[PM_WATER_NYMPH], u.ux, u.uy, MM_NOMSG)) != 0) { // Place a water nymph on the map
-        if (!Blind)
-            You("attract %s!", a_monnam(mtmp)); // Output a message indicating the player attracted the water nymph
-        else
-            You_hear("a seductive voice."); // Output a message indicating the sound of a seductive voice
-        mtmp->msleeping = 0;
-        if (t_at(mtmp->mx, mtmp->my))
-            (void) mintrap(mtmp, NO_TRAP_FLAGS); // Check for traps at the location of the water nymph
-    } else if (!Blind) {
-        Soundeffect(se_bubble_rising, 50); // Play a sound effect of a rising bubble
-        Soundeffect(se_loud_pop, 50); // Play a sound effect of a loud pop
-        pline("A large bubble rises to the surface and pops."); // Output a message about a large bubble popping
-    } else {
-        Soundeffect(se_loud_pop, 50); // Play a sound effect of a loud pop
-        You_hear("a loud pop."); // Output a message indicating the sound of a loud pop
-    }
-}
-
-
-/* Gushing forth along LOS from (u.ux, u.uy) */
-/* 
- * Function to handle fountain gushing event
- */
-void dogushforth(int drinking)
-{
-    int madepool = 0;
-
-    /* 
-     * Clear the area around player's position and check for fountain gushing
-     */
-    do_clear_area(u.ux, u.uy, 7, gush, (genericptr_t) &madepool);
-    
-    /*
-     * If no pool was generated, display appropriate message based on whether the player is drinking or not
-     */
-    if (!madepool) {
-        if (drinking)
-            Your("thirst is quenched.");
-        else
-            pline("Water sprays all over you.");
-    }
-}
-
-/*
- * Callback function for do_clear_area to handle each grid square
- */
-static void gush(coordxy x, coordxy y, genericptr_t poolcnt)
-{
-    register struct monst *mtmp;
-    register struct trap *ttmp;
-
-    /* 
-     * Check various conditions to determine if a pool can be created at the specified location
-     */
-    if (((x + y) % 2) || u_at(x, y)
-        || (rn2(1 + distmin(u.ux, u.uy, x, y))) || (levl[x][y].typ != ROOM)
-        || (sobj_at(BOULDER, x, y)) || nexttodoor(x, y))
-        return;
-
-    /* 
-     * If there's a trap at the location, attempt to remove it
-     */
-    if ((ttmp = t_at(x, y)) != 0 && !delfloortrap(ttmp))
-        return;
-
-    /* 
-     * If a pool is created for the first time, display a message
-     */
-    if (!((*(int *) poolcnt)++))
-        pline("Water gushes forth from the overflowing fountain!");
-}
-
-    /* Put a pool at x, y */
-    set_levltyp(x, y, POOL);
-    levl[x][y].flags = 0;
-    /* No kelp! */
-    del_engr_at(x, y);
-    water_damage_chain(gl.level.objects[x][y], TRUE);
-
-    if ((mtmp = m_at(x, y)) != 0)
-        (void) minliquid(mtmp);
-    else
-        newsym(x, y);
-}
-
-/* Find a gem in the sparkling waters. */
-static void
-dofindgem(void)
-{
-    if (!Blind)
-        You("spot a gem in the sparkling waters!"); // If the player is not blind, they spot a gem in the fountain.
-    else
-        You_feel("a gem here!"); // If the player is blind, they feel a gem in the fountain.
-    (void) mksobj_at(rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE - 1), u.ux, u.uy,
-                     FALSE, FALSE); // Create a random gem object at the player's location.
-    SET_FOUNTAIN_LOOTED(u.ux, u.uy); // Set the fountain as looted.
-    newsym(u.ux, u.uy); // Update the symbol of the fountain on the map.
-    exercise(A_WIS, TRUE); /* a discovery! */ // Increase the player's wisdom experience.
-}
-
-static boolean
-watchman_warn_fountain(struct monst *mtmp)
-{
-    if (is_watch(mtmp->data) && couldsee(mtmp->mx, mtmp->my)
-        && mtmp->mpeaceful) {
-        if (!Deaf) {
-            pline("%s yells:", Amonnam(mtmp));
-            verbalize("Hey, stop using that fountain!"); // If a peaceful watchman can see the player, they yell at the player to stop using the fountain.
-        } else {
-            pline("%s earnestly %s %s %s!",
-                  Amonnam(mtmp),
-                  nolimbs(mtmp->data) ? "shakes" : "waves",
-                  mhis(mtmp),
-                  nolimbs(mtmp->data)
-                  ? mbodypart(mtmp, HEAD)
-                  : makeplural(mbodypart(mtmp, ARM))); // If the player is deaf, the watchman communicates their message through body language.
-        }
-        return TRUE;
-    }
-    return FALSE;
-}
-
-void
-dryup(coordxy x, coordxy y, boolean isyou)
-{
-    if (IS_FOUNTAIN(levl[x][y].typ)
-        && (!rn2(3) || FOUNTAIN_IS_WARNED(x, y))) {
-        if (isyou && in_town(x, y) && !FOUNTAIN_IS_WARNED(x, y)) {
-            struct monst *mtmp;
-
-            SET_FOUNTAIN_WARNED(x, y);
-            /* Warn about future fountain use. */
-            mtmp = get_iter_mons(watchman_warn_fountain);
-            /* You can see or hear this effect */
-            if (!mtmp)
-                pline_The("flow reduces to a trickle."); // If the player is in a town and no warning has been issued, issue the warning for future fountain use.
-            return;
-        }
-        if (isyou && wizard) {
-            if (y_n("Dry up fountain?") == 'n')
-                return;
-        }
-        /* FIXME: sight-blocking clouds should use block_point() when
-           being created and unblock_point() when going away, then this
-           glyph hackery wouldn't be necessary */
-        if (cansee(x, y)) {
-            int glyph = glyph_at(x, y);
-
-            if (!glyph_is_cmap(glyph) || glyph_to_cmap(glyph) != S_cloud)
-                pline_The("fountain dries up!"); // If the player can see, display the message that the fountain dries up.
-        }
-        /* replace the fountain with ordinary floor */
-        set_levltyp(x, y, ROOM); /* updates level.flags.nfountains */ // Change the tile of the fountain to ordinary floor.
-        levl[x][y].flags = 0;
-        levl[x][y].blessedftn = 0;
-        /* The location is seen if the hero/monster is invisible
-           or felt if the hero is blind. */
-        newsym(x, y); // Update the symbol of the fountain on the map.
-        if (isyou && in_town(x, y))
-            (void) angry_guards(FALSE); // If the fountain was located in a town, generate angry guards.
-    }
-}
-
-void
-drinkfountain(void)
-{
-    /* What happens when you drink from a fountain? */
-    register boolean mgkftn = (levl[u.ux][u.uy].blessedftn == 1);
-    register int fate = rnd(30);
-
-    if (Levitation) {
-        floating_above("fountain");
-        return;
-    }
-
-    if (mgkftn && u.uluck >= 0 && fate >= 10) {
-        int i, ii, littleluck = (u.uluck < 4);
-
-        pline("Wow!  This makes you feel great!");
-        /* blessed restore ability */
-        for (ii = 0; ii < A_MAX; ii++)
-            if (ABASE(ii) < AMAX(ii)) {
-                ABASE(ii) = AMAX(ii);
-                gc.context.botl = 1;
-            }
-        /* gain ability, blessed if "natural" luck is high */
-        i = rn2(A_MAX); /* start at a random attribute */
-        for (ii = 0; ii < A_MAX; ii++) {
-            if (adjattrib(i, 1, littleluck ? -1 : 0) && littleluck)
-                break;
-            if (++i >= A_MAX)
-                i = 0;
-        }
-        display_nhwindow(WIN_MESSAGE, FALSE);
-        pline("A wisp of vapor escapes the fountain...");
-        exercise(A_WIS, TRUE);
-        levl[u.ux][u.uy].blessedftn = 0;
-        return;
-    }
-
-    if (fate < 10) {
-        pline_The("cool draught refreshes you.");
-        u.uhunger += rnd(10); /* don't choke on water */
-        newuhs(FALSE);
-        if (mgkftn)
-            return;
-    } else {
-        switch (fate) {
-        case 19: /* Self-knowledge */
-            You_feel("self-knowledgeable...");
-            display_nhwindow(WIN_MESSAGE, FALSE);
-            enlightenment(MAGICENLIGHTENMENT, ENL_GAMEINPROGRESS);
-            exercise(A_WIS, TRUE);
-            pline_The("feeling subsides.");
-            break;
-        case 20: /* Foul water */
-            pline_The("water is foul!  You gag and vomit.");
-            morehungry(rn1(20, 11));
-            vomit();
-            break;
-        case 21: /* Poisonous */
-            pline_The("water is contaminated!");
-            if (Poison_resistance) {
-                pline("Perhaps it is runoff from the nearby %s farm.",
-                      fruitname(FALSE));
-                losehp(rnd(4), "unrefrigerated sip of juice", KILLED_BY_AN);
-                break;
-            }
-            poison_strdmg(rn1(4, 3), rnd(10), "contaminated water",
-                          KILLED_BY);
-            exercise(A_CON, FALSE);
-            break;
-        case 22: /* Fountain of snakes! */
-            dowatersnakes();
-            break;
-        case 23: /* Water demon */
-            dowaterdemon();
-            break;
-        case 24: { /* Maybe curse some items */
-            register struct obj *obj;
-            int buc_changed = 0;
-
-            pline("This water's no good!");
-            morehungry(rn1(20, 11));
-            exercise(A_CON, FALSE);
-            /* this is more severe than rndcurse() */
-            for (obj = gi.invent; obj; obj = obj->nobj)
-                if (obj->oclass != COIN_CLASS && !obj->cursed && !rn2(5)) {
-                    curse(obj);
-                    ++buc_changed;
-                }
-            if (buc_changed)
-                update_inventory();
-            break;
-        }
-        case 25: /* See invisible */
-            if (Blind) {
-                if (Invisible) {
-                    You("feel transparent.");
-                } else {
-                    You("feel very self-conscious.");
-                    pline("Then it passes.");
-                }
-            } else {
-                You_see("an image of someone stalking you.");
-                pline("But it disappears.");
-            }
-            HSee_invisible |= FROMOUTSIDE;
-            newsym(u.ux, u.uy);
-            exercise(A_WIS, TRUE);
-            break;
-        case 26: /* See Monsters */
-            if (monster_detect((struct obj *) 0, 0))
-                pline_The("%s tastes like nothing.", hliquid("water"));
-            exercise(A_WIS, TRUE);
-            break;
-        case 27: /* Find a gem in the sparkling waters. */
-            if (!FOUNTAIN_IS_LOOTED(u.ux, u.uy)) {
-                dofindgem();
-                break;
-            }
-            /*FALLTHRU*/
-        case 28: /* Water Nymph */
-            dowaternymph();
-            break;
-        case 29: /* Scare */
-        {
-            register struct monst *mtmp;
-
-            pline("This %s gives you bad breath!",
-                  hliquid("water"));
-            for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
-                if (DEADMONSTER(mtmp))
-                    continue;
-                monflee(mtmp, 0, FALSE, FALSE);
-            }
-            break;
-        }
-        case 30: /* Gushing forth in this room */
-            dogushforth(TRUE);
-            break;
-        default:
-            pline("This tepid %s is tasteless.",
-                  hliquid("water"));
-            break;
-        }
-    }
-    dryup(u.ux, u.uy, TRUE);
-}
-
-void
-dipfountain(register struct obj *obj)
-{
-    int er = ER_NOTHING;
-
-    if (Levitation) {
-        floating_above("fountain");
-        return;
-    }
-
-    if (obj->otyp == LONG_SWORD && u.ulevel >= 5 && !rn2(6)
-        /* once upon a time it was possible to poly N daggers into N swords */
-        && obj->quan == 1L && !obj->oartifact
-        && !exist_artifact(LONG_SWORD, artiname(ART_EXCALIBUR))) {
-        static const char lady[] = "Lady of the Lake";
-
-        if (u.ualign.type != A_LAWFUL) {
-            /* Ha!  Trying to cheat her. */
-            pline("A freezing mist rises from the %s and envelopes the sword.",
-                  hliquid("water"));
-            pline_The("fountain disappears!");
-            curse(obj);
-            if (obj->spe > -6 && !rn2(3))
-                obj->spe--;
-            obj->oerodeproof = FALSE;
-            exercise(A_WIS, FALSE);
-            livelog_printf(LL_ARTIFACT,
-                           "was denied %s!  The %s has deemed %s unworthy",
-                           artiname(ART_EXCALIBUR), lady, uhim());
-        } else {
-            /* The lady of the lake acts! - Eric Backus */
-            /* Be *REAL* nice */
-            pline(
-              "From the murky depths, a hand reaches up to bless the sword.");
-            pline("As the hand retreats, the fountain disappears!");
-            obj = oname(obj, artiname(ART_EXCALIBUR),
-                        ONAME_VIA_DIP | ONAME_KNOW_ARTI);
-            discover_artifact(ART_EXCALIBUR);
-            bless(obj);
-            obj->oeroded = obj->oeroded2 = 0;
-            obj->oerodeproof = TRUE;
-            exercise(A_WIS, TRUE);
-            livelog_printf(LL_ARTIFACT, "was given %s by the %s",
-                           artiname(ART_EXCALIBUR), lady);
-        }
-        update_inventory();
-        set_levltyp(u.ux, u.uy, ROOM); /* updates level.flags.nfountains */
-        levl[u.ux][u.uy].flags = 0;
-        newsym(u.ux, u.uy);
-        if (in_town(u.ux, u.uy))
-            (void) angry_guards(FALSE);
-        return;
-    } else {
-        er = water_damage(obj, NULL, TRUE);
-
-        if (er == ER_DESTROYED || (er != ER_NOTHING && !rn2(2))) {
-            return; /* no further effect */
-        }
-    }
-
-    switch (rnd(30)) {
-    case 16: /* Curse the item */
-        if (obj->oclass != COIN_CLASS && !obj->cursed) {
-            curse(obj);
-        }
-        break;
-    case 17:
-    case 18:
-    case 19:
-    case 20: /* Uncurse the item */
-        if (obj->cursed) {
-            if (!Blind)
-                pline_The("%s glows for a moment.", hliquid("water"));
-            uncurse(obj);
-        } else {
-            pline("A feeling of loss comes over you.");
-        }
-        break;
-    case 21: /* Water Demon */
-        dowaterdemon();
-        break;
-    case 22: /* Water Nymph */
-        dowaternymph();
-        break;
-    case 23: /* an Endless Stream of Snakes */
-        dowatersnakes();
-        break;
-    case 24: /* Find a gem */
-        if (!FOUNTAIN_IS_LOOTED(u.ux, u.uy)) {
-            dofindgem();
-            break;
-        }
-        /*FALLTHRU*/
-    case 25: /* Water gushes forth */
-        dogushforth(FALSE);
-        break;
-    case 26: /* Strange feeling */
-        pline("A strange tingling runs up your %s.", body_part(ARM));
-        break;
-    case 27: /* Strange feeling */
-        You_feel("a sudden chill.");
-        break;
-    case 28: /* Strange feeling */
-        pline("An urge to take a bath overwhelms you.");
-        {
-            long money = money_cnt(gi.invent);
-            struct obj *otmp;
-            if (money > 10) {
-                /* Amount to lose.  Might get rounded up as fountains don't
-                 * pay change... */
-                money = somegold(money) / 10;
-                for (otmp = gi.invent; otmp && money > 0; otmp = otmp->nobj)
-                    if (otmp->oclass == COIN_CLASS) {
-                        int denomination = objects[otmp->otyp].oc_cost;
-                        long coin_loss =
-                            (money + denomination - 1) / denomination;
-                        coin_loss = min(coin_loss, otmp->quan);
-                        otmp->quan -= coin_loss;
-                        money -= coin_loss * denomination;
-                        if (!otmp->quan)
-                            delobj(otmp);
-                    }
-                You("lost some of your gold in the fountain!");
-                CLEAR_FOUNTAIN_LOOTED(u.ux, u.uy);
-                exercise(A_WIS, FALSE);
-            }
-        }
-        break;
-    case 29: /* You see coins */
-        /* We make fountains have more coins the closer you are to the
-         * surface.  After all, there will have been more people going
-         * by.  Just like a shopping mall!  Chris Woodbury  */
-
-        if (FOUNTAIN_IS_LOOTED(u.ux, u.uy))
-            break;
-        SET_FOUNTAIN_LOOTED(u.ux, u.uy);
-        (void) mkgold((long) (rnd((dunlevs_in_dungeon(&u.uz) - dunlev(&u.uz)
-                                   + 1) * 2) + 5),
-                      u.ux, u.uy);
-        if (!Blind)
-            pline("Far below you, you see coins glistening in the %s.",
-                  hliquid("water"));
-        exercise(A_WIS, TRUE);
-        newsym(u.ux, u.uy);
-        break;
-    default:
-        if (er == ER_NOTHING)
-            pline("Nothing seems to happen.");
-        break;
-    }
-    update_inventory();
-    dryup(u.ux, u.uy, TRUE);
-}
-
-void
-breaksink(coordxy x, coordxy y)
-{
-    if (cansee(x, y) || u_at(x, y))
-        pline_The("pipes break!  Water spurts out!");
-    /* updates level.flags.nsinks and level.flags.nfountains */
-    set_levltyp(x, y, FOUNTAIN);
-    levl[x][y].looted = 0;
-    levl[x][y].blessedftn = 0;
-    SET_FOUNTAIN_LOOTED(x, y);
-    newsym(x, y);
-}
-
-void
-drinksink(void)
-{
-    struct obj *otmp;
-    struct monst *mtmp;
-
-    /* If the player is levitating, they can't drink from the sink. */
-	if (Levitation) {
-	    floating_above("sink");
-	    return;
-	}
-	
-	/* Randomly determine what happens when the player drinks from the sink. */
-	switch (rn2(20)) {
-	case 0:
-	    You("take a sip of very cold %s.", hliquid("water"));
-	    break;
-	case 1:
-	    You("take a sip of very warm %s.", hliquid("water"));
-	    break;
-	case 2:
-	    You("take a sip of scalding hot %s.", hliquid("water"));
-	    if (Fire_resistance) {
-	        pline("It seems quite tasty.");
-	        monstseesu(M_SEEN_FIRE);
-	    } else {
-	        losehp(rnd(6), "sipping boiling water", KILLED_BY);
-	        monstunseesu(M_SEEN_FIRE);
-	    }
-	    /* Boiling water burns are considered fire damage. */
-	    break;
-	case 3:
-	    /* Spawn a sewer rat in the sink, unless they're already gone. */
-	    if (gm.mvitals[PM_SEWER_RAT].mvflags & G_GONE)
-	        pline_The("sink seems quite dirty.");
-	    else {
-	        mtmp = makemon(&mons[PM_SEWER_RAT], u.ux, u.uy, MM_NOMSG);
-	        if (mtmp)
-	            pline("Eek!  There's %s in the sink!",
-	                  (Blind || !canspotmon(mtmp)) ? "something squirmy"
-	                                               : a_monnam(mtmp));
-	    }
-	    break;
-	case 4:
-	    /* Spawn a potion that isn't water. */
-	    for (;;) {
-	        otmp = mkobj(POTION_CLASS, FALSE);
-	        if (otmp->otyp != POT_WATER)
-	            break;
-	        /* Reject water and try again. */
-	        obfree(otmp, (struct obj *) 0);
-	    }
-	    otmp->cursed = otmp->blessed = 0;
-	    pline("Some %s liquid flows from the faucet.",
-	          Blind ? "odd" : hcolor(OBJ_DESCR(objects[otmp->otyp])));
-	    otmp->dknown = !(Blind || Hallucination);
-	    otmp->quan++;       /* Avoid panic upon useup() */
-	    otmp->fromsink = 1; /* Kludge for docall() */
-	    (void) dopotion(otmp);
-	    obfree(otmp, (struct obj *) 0);
-	    break;
-	case 5:
-	    /* Spawn a ring in the sink, unless one has already been looted. */
-	    if (!(levl[u.ux][u.uy].looted & S_LRING)) {
-	        You("find a ring in the sink!");
-	        (void) mkobj_at(RING_CLASS, u.ux, u.uy, TRUE);
-	        levl[u.ux][u.uy].looted |= S_LRING;
-	        exercise(A_WIS, TRUE);
-	        newsym(u.ux, u.uy);
-	    } else
-	        pline("Some dirty %s backs up in the drain.", hliquid("water"));
-	    break;
-	case 6:
-	    /* Break the sink. */
-	    breaksink(u.ux, u.uy);
-	    break;
-	case 7:
-	    /* Spawn a water elemental in the sink. */
-	    pline_The("%s moves as though of its own will!", hliquid("water"));
-	    if ((gm.mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE)
-	        || !makemon(&mons[PM_WATER_ELEMENTAL], u.ux, u.uy, MM_NOMSG))
-	        pline("But it quiets down.");
-	    break;
-	case 8:
-	    /* Drinking the water gives the player experience and a level-up. */
-	    pline("Yuk, this %s tastes awful.", hliquid("water"));
-	    more_experienced(1, 0);
-	    newexplevel();
-	    break;
-	case 9:
-	    /* Drinking sewage causes the player to vomit and become hungry. */
-	    pline("Gaggg... this tastes like sewage!  You vomit.");
-	    morehungry(rn1(30 - ACURR(A_CON), 11));
-	    vomit();
-	    break;
-	case 10:
-	    /* Drinking toxic waste polymorphs the player. */
-	    pline("This %s contains toxic wastes!", hliquid("water"));
-	    if (!Unchanging) {
-	        You("undergo a freakish metamorphosis!");
-	        polyself(POLY_NOFLAGS);
-	    }
-	    break;
-	/* More odd messages. */
-	case 11:
-	    Soundeffect(se_clanking_pipe, 50);
-	    You_hear("clanking from the pipes...");
-	    break;
-	case 12:
-	    Soundeffect(se_sewer_song, 100);
-	    You_hear("snatches of song from among the sewers...");
-	    break;
-	case 13:
-	    /* Drinking the water creates a gas cloud. */
-	    pline("Ew, what a stench!");
-	    create_gas_cloud(u.ux, u.uy, 1, 4);
-	    break;
-	case 19:
-	    /* Drinking the water causes something to grab at the player's hand, unless they're hallucinating. */
-	    if (Hallucination) {
-	        pline("From the murky drain, a hand reaches up... --oops--");
-	        break;
-	    }
-	    /*FALLTHRU*/
-	default:
-	    /* Drinking the water has no special effect. */
-	    You("take a sip of %s %s.",
-	        rn2(3) ? (rn2(2) ? "cold" : "warm") : "hot",
-	        hliquid("water"));
-	}
-}
-
-/*fountain.c*/
diff --git a/ljh.txt b/ljh.txt
deleted file mode 100644
index c21b5de..0000000
--- a/ljh.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-用例名:eat
-执行者:玩家
-目标:通过吃东西来补充角色的饥饿值
-前置条件:
-	玩家拥有至少一个可食用物品
-	玩家处于可以吃东西的状态(例如,非战斗状态)
-	玩家饥饿值未满
-后置条件:
-	食物使用后,玩家的饥饿值恢复
-	玩家的状态可能因食物效果而改变
-主要场景:
-  玩家选择一个食物。
-  玩家点击“使用”选项。
-  游戏判断玩家是否满足使用该道具的条件(例如,是否饥饿,是否非战斗)。
-  如果满足条件,游戏将吃掉食物,并恢复饥饿值。
-如果为特殊食物,赋予特殊效果
-  使用后食物消失
-  玩家可以查看食物使用后的效果和状态变化。
-交互动作:
-	(1)玩家遇到特殊情况后下达命令cmd.c并apply.c执行来选择使用食物
-	(2)检查是否饥饿,若饥饿则使用食物
-	(3)根据食物使用更新内存分配alloc.c并记录时间date.c参数;若食物有效果则用apply.c应用效果
-用例交互图 
-                                           玩家                                             
-
-|   | 选择食物  |---------->| 判断条件饥饿值是否小于90  |---------->| 显示效果 |---------->| 恢复饥饿值更新状态  |---------->| 更新UI   |---------->| 反馈   | 
-   
-                                        游戏系统                                     
-    
-|   | 触发条件    |---------->| 验证玩家  |---------->| 获取道具信息|---------->| 执行效果|---------->| 更新UI |---------->| 返回结果 | 
-  
-
-
-