Besiders difficulty, is there a way to determine a monster’s sacrifice value (specifically, is there a chart or list)

nethack

After a couple of years of playing, I've realized the importance of altars, but I've yet to find any real info as to how sacrifices are valued for Prayer TO, alignment, luck, gifting, etc.. Besides difficulty (duh) which is vague to say the least, is there any guidance as to absolute or relative value? For example, what's a newt worth (I know it's nutrition and there's a chance to restore a bit of magic, but I don't know if it's worth sacrificing v eating early on. Same for chance for intrinsics or attributes. Or, what if I kill sacrifice something way above my level, does that increase its value (same for sacrificing geckos @ XL 30, does that make them less valuable than pet food?)

Best Answer

Note: This answer applies to version 3.4.3. I doubt anything about this mechanism has changed in 3.6.0, but I can't say for sure.


Let's go source diving!

src/pray.c, lines 1160 to 1165:

    if (otmp->corpsenm == PM_ACID_BLOB
        || (monstermoves <= peek_at_iced_corpse_age(otmp) + 50)) {
        value = monstr[otmp->corpsenm] + 1;
        if (otmp->oeaten)
        value = eaten_stat(value, otmp);
    }

monstr is the array of "monster strengths" (see src/monstr.c for the huge array)—that is, their "difficulty" value. This is an actual number, not a vague statement. So a corpse's sacrifice value is, very simply, the monster's difficulty number plus 1.

See the wiki for a full list of monsters and their difficulties.

Partly eaten corpses, as you can also see in the code pasted above, will have their value decreased accordingly with how much they have been eaten. (TDT really does TOE...)

Aside from that, there are a few other special cases:

    } else if (otmp->oxlth && otmp->oattached == OATTACHED_MONST
            && ((mtmp = get_mtraits(otmp, FALSE)) != (struct monst *)0)
            && mtmp->mtame) {
        /* mtmp is a temporary pointer to a tame monster's attributes,
         * not a real monster */
        pline("So this is how you repay loyalty?");
        adjalign(-3);
        value = -1;
        HAggravate_monster |= FROMOUTSIDE;

Sacrificing a former pet automatically sets the value to -1 (which makes your god angry, leading to all sorts of nasty things), gets you a -3 alignment record hit, and gives you the aggravate monster intrinsic to boot. Don't do that.

    } else if (is_undead(ptr)) { /* Not demons--no demon corpses */
        if (u.ualign.type != A_CHAOTIC)
        value += 1;

Sacrificing an undead (the only ones that can be sacrificed are wraiths because only they can leave non-aged corpses) as a lawful or neutral will give you a small bonus.

    } else if (is_unicorn(ptr)) {
        int unicalign = sgn(ptr->maligntyp);

        /* If same as altar, always a very bad action. */
        if (unicalign == altaralign) {
        pline("Such an action is an insult to %s!",
              (unicalign == A_CHAOTIC)
              ? "chaos" : unicalign ? "law" : "balance");
        (void) adjattrib(A_WIS, -1, TRUE);
        value = -5;
        } else if (u.ualign.type == altaralign) {
        /* If different from altar, and altar is same as yours, */
        /* it's a very good action */
        if (u.ualign.record < ALIGNLIM)
            You_feel("appropriately %s.", align_str(u.ualign.type));
        else You_feel("you are thoroughly on the right path.");
        adjalign(5);
        value += 3;
        } else
        /* If sacrificing unicorn of your alignment to altar not of */
        /* your alignment, your god gets angry and it's a conversion */
        if (unicalign == u.ualign.type) {
            u.ualign.record = -1;
            value = 1;
        } else value += 3;
    }

Sacrificing unicorns leads to either really, really bad effects if you don't know what you're doing, or good effects if you do it properly. As a general rule, sacrificing a cross-aligned unicorn on a co-aligned altar is always good.

    if (otmp->otyp == FAKE_AMULET_OF_YENDOR) {
        if (flags.soundok)
        You_hear("a nearby thunderclap.");
        if (!otmp->known) {
        You("realize you have made a %s.",
            Hallucination ? "boo-boo" : "mistake");
        otmp->known = TRUE;
        change_luck(-1);
        return 1;
        } else {
        /* don't you dare try to fool the gods */
        change_luck(-3);
        adjalign(-1);
        u.ugangr += 3;
        value = -3;
        }
    } /* fake Amulet */

Finally, attempting to sacrifice a known fake Amulet of Yendor is a Bad Idea™.


As for strategy, that's very opinion-based, of course. Personally, if I can sacrifice a corpse, I always do, instead of eating it. This is only because sac'ing stuff decreases your prayer timeout, and a single prayer is worth far more than a few corpses (I never eat non-corpses / pray-due-to-hunger in early-game until I'm Weak anyway.)

Once you've reached late game, unless you have a specific goal in mind (repeatedly praying for the various boons, getting a specific artifact, etc.), sacrificing becomes significantly less useful (IMO).