Do the beastmaster want the entire 500lbs corpse or is he happy if I (h)ack up the corpse and take him some meat?
Beastmaster Quests - Can I hack up the corpse?
Collapse
X
-
Tags: None
-
It's usually recommended to eat from the corpse before hacking (since that will provide the necessary resists right off the bat). Though the damage is based on the weight of the corpse, and the cap is very high if there's a cap at all; even with double resist, a Great Hell Wyrm might do a lot of damage.
... I should check this in debug mode.
Edit: yeah okay, double resist is enough, you'll take < 50 HP damage from a Great Hell Wyrm corpse. Single resist OTOH is definitely not enough, my test character took over 600.
Interestingly, eating from the corpse works even for a Great Wyrm of Power corpse, which will otherwise kill you instantly with a blast of (unresistable) raw mana. Funny, I don't remember seeing anything like that in the code...Last edited by fiery_mews; March 23, 2021, 21:16.Comment
-
Thanks for the responses!
I did not even know that eating the meat will do something!
I just wanted to get the corpse preservation and monster lore skills!Comment
-
Eating a monster's meat has no effects, good or bad. Eating corpses can have good effects, bad effects, or both. In general IIRC it is unwise to eat the remains of anything with necromantic powers, but I'd have to check the code for other stuff.Comment
-
So... extensive spoilers follow...
I think the main function we want is this
in cmd6.cc (for ToME 2.4, the C++ port).Code:/* * Determine the effects of eating a corpse. A corpse can be * eaten whole or cut into pieces for later. */ static void corpse_effect(object_type *o_ptr, bool cutting)
So this is for elemental and poison damage based on monster's melee attacks. IDK what determines pval in this case, or what it indicates. Dam dice and sides are gotten from the monster's physical attack power when it was alive. Weight seems to reduce the damage, which uh might be a bug? IDK my brain isn't fully working right now.Code:/* Immediate effects - poison, acid, fire, etc. */ if (!cutting) { for (i = 0; i < 4; i++) { /* skip empty blow slot */ if (!r_ptr->blow[i].method) continue; method = r_ptr->blow[i].method; effect = r_ptr->blow[i].effect; d_dice = r_ptr->blow[i].d_dice; d_side = r_ptr->blow[i].d_side; dam = damroll(d_dice, d_side) * o_ptr->pval / o_ptr->weight / 2; idam = damroll(d_dice, d_side) * ((o_ptr->weight / o_ptr->pval > 2) ? o_ptr->weight / o_ptr->pval : 2); mdam = maxroll(d_dice, d_side) * 2;
The TL;DR though is that monsters with elemental melee attacks will damage you with those elements when eaten; ones that cause confusion or hallucination on hit, will cause those statuses when eaten; ones that paralyze or reduce stats, likewise, etc.
Nice. And anything that drains experience in melee will drain it when eaten too.Code:/* Don't eat Morgoth's corpse :) */ case RBE_LOSE_ALL: { do_dec_stat(A_STR, STAT_DEC_NORMAL); do_dec_stat(A_INT, STAT_DEC_NORMAL); do_dec_stat(A_WIS, STAT_DEC_NORMAL); do_dec_stat(A_DEX, STAT_DEC_NORMAL); do_dec_stat(A_CON, STAT_DEC_NORMAL); do_dec_stat(A_CHR, STAT_DEC_NORMAL); o_ptr->pval = 1; break; } case RBE_SANITY: { msg_print("You feel your sanity slipping away!"); take_sanity_hit(dam, "eating an insane monster"); break; }
For elemental breathers, hacking hits you with the given element, capped at max elemental breath damage. But eating the corpse directly makes you resistant, and doesn't hit you for damage.Code:/* * The organ that supplies breath attacks is not * immediately emptied upon death, although some types * of breath have no effect. * AMHD's make rather risky meals, and deadly snacks. */ /* Acid */ if ((r_ptr->spells & SF_BR_ACID) && brpow > 0) { brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3)); msg_print("You are hit by a gush of acid!"); /* Total Immunity */ if (!(p_ptr->immune_acid || (brdam <= 0))) { /* Take damage */ acid_dam(brdam, "a gush of acid"); harmful = true; } o_ptr->pval = 1; } else if (r_ptr->spells & SF_BR_ACID) { set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10); }
Nether and confusion breathers OTOH don't offer resistance if eaten directly, they just hit you with damage and status effects. Chaos breathers likewise.
So that "raw mana" is from disenchantment breathers, and it's not actually raw mana - it's disenchantment damage, and resistance to that will protect you. Plasma breathers will also hit you up for damage and stunning, as in life.Code:/* Disenchantment */ if ((r_ptr->spells & SF_BR_DISE) && brpow > 0) { brdam = ((brpow / 6) > 500 ? 500 : (brpow / 6)); msg_print("You are blasted by raw mana!"); if (p_ptr->resist_disen) { brdam *= 6; brdam /= (randint(6) + 6); } else { apply_disenchant(0); } /* Take damage */ take_hit(brdam, "raw mana"); o_ptr->pval = 1; }
Kobolds: not edible unless you're also a kobold.Code:/* * Hack -- Jellies, kobolds, spiders, icky things, molds, and mushrooms * are immune to poison because their body already contains * poisonous chemicals. */ if (strchr("ijkmS,", r_ptr->d_char) && (r_ptr->flags & RF_IM_POIS)) { if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { set_poisoned(p_ptr->poisoned + rand_int(15) + 10); } harmful = true; }
Ah so it's not breath attacks that have positive effects, it's resistances and elemental immunities! And summoning spells. Mind, these are only for corpses that are not flagged "harmful" earlier in the code, and definitely not if you're hacking them or eating their meat; only if eating from them directly.Code:/* * Bad effects override good effects * and hacked-up corpses lose intrinsics. */ if (!harmful && !cutting && (o_ptr->sval != SV_CORPSE_MEAT)) { if (r_ptr->flags & RF_IM_ACID) { set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10); } if (r_ptr->flags & RF_IM_ELEC) { set_oppose_elec(p_ptr->oppose_elec + rand_int(10) + 10); } if (r_ptr->flags & RF_IM_FIRE) { set_oppose_fire(p_ptr->oppose_fire + rand_int(10) + 10); } if (r_ptr->flags & RF_IM_COLD) { set_oppose_cold(p_ptr->oppose_cold + rand_int(10) + 10); } if (r_ptr->flags & RF_IM_POIS) { set_oppose_pois(p_ptr->oppose_pois + rand_int(10) + 10); } if (r_ptr->flags & RF_RES_NETH) { set_protevil(p_ptr->protevil + rand_int(25) + 3 * r_ptr->level); } if (r_ptr->flags & RF_RES_PLAS) { set_oppose_fire(p_ptr->oppose_fire + rand_int(20) + 20); } if (r_ptr->flags & RF_SHAPECHANGER) { /* DGDGDG set_mimic(20 , rand_int(MIMIC_VALAR)); */ } if (r_ptr->flags & RF_DEMON) { /* DGDGDG set_mimic(30 , MIMIC_DEMON); */ } if (r_ptr->flags & RF_UNDEAD) { /* DGDGDG set_mimic(30 , MIMIC_VAMPIRE); */ } if (r_ptr->flags & RF_NO_FEAR) { set_afraid(0); } if (r_ptr->flags & RF_NO_STUN) { set_stun(0); } if (r_ptr->flags & RF_NO_CONF) { set_confused(0); } if (r_ptr->spells & SF_S_THUNDERLORD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_THUNDERLORD, false); } if (r_ptr->spells & SF_S_DEMON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON, false); } if (r_ptr->spells & SF_S_KIN) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_KIN, false); } if (r_ptr->spells & SF_S_HI_DEMON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DEMON, false); } if (r_ptr->spells & SF_S_MONSTER) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, false); } if (r_ptr->spells & SF_S_MONSTERS) { int k; for (k = 0; k < 8; k++) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, false); } } if (r_ptr->spells & SF_S_UNDEAD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD, false); } if (r_ptr->spells & SF_S_DRAGON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON, false); } if (r_ptr->spells & SF_S_ANT) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT, false); } if (r_ptr->spells & SF_S_SPIDER) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER, false); } if (r_ptr->spells & SF_S_HOUND) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND, false); } if (r_ptr->spells & SF_S_HYDRA) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA, false); } if (r_ptr->spells & SF_S_ANGEL) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL, false); } if (r_ptr->spells & SF_S_HI_DRAGON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON, false); } if (r_ptr->spells & SF_S_HI_UNDEAD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD, false); } if (r_ptr->spells & SF_S_WRAITH) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH, false); } if (r_ptr->spells & SF_S_UNIQUE) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE, false); } }Comment
-
This kind of thing:
Is a microcosm of the Poschengband code in general. I mean, it is obviously much worse to write:Code:brdam *= 6; brdam /= (randint(6) + 6);
Than to miss a chance to use the rare assignment operator /=Code:brdam = (brdam * 6) / (randint(6) + 6);
It is also magnificent to nest a block of 31 non-exclusive if statements in still another conditional.Comment
-
@Pete Mack
The original T2 codebase is even more horrifying; I'm still in awe of AnonymousHero, TBH. (My own contributions to the C++ port were pretty minimal.)
@Yottle
Nope, hacked meat still doesn't work. Note
I actually can't get the summoning to work in debug mode with a bunch of summoner corpses, maybe most of them will get their corpses flagged harmful by other stuff? Though I do remember summoning a mob one time by accident from eating of a unique summoner's corpse.Code:if (!harmful && !cutting && (o_ptr->sval != SV_CORPSE_MEAT))
Comment
Comment