diff options
author | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-03-13 23:05:12 +0000 |
---|---|---|
committer | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-03-13 23:05:12 +0000 |
commit | f01463de3abf61a8c3057b7aa70841e000cf55f4 (patch) | |
tree | fdfd3e692097c5a6ce0531a33cd591bd7655367c /crawl-ref/source/items.cc | |
parent | 2f4c72e5d1f2a84ddc6ac24b3b4628edc4e43dc3 (diff) | |
download | crawl-ref-f01463de3abf61a8c3057b7aa70841e000cf55f4.tar.gz crawl-ref-f01463de3abf61a8c3057b7aa70841e000cf55f4.zip |
Overhauled potions of blood and vampires.
1.) Vampires can only suck blood from creatures with M_COLD_BLOOD or
M_WARM_BLOOD set (no insects anymore!)
These restrictions are the same for blood spatter.
Also, the monster's corpse must be of type contaminated (e.g. gnoll)
or clean. Everything will be rejected.
2.) At xl 6 vampires gain the ability to create potions of blood from
butchered corpses. The delay is the same as for butchering, and they also
need a butchering tool (since I now think fangs don't really cut it);
only the messaging is different, and the result, of course.
If the monster doesn't meet the restrictions in (1), the corpse gets
butchered instead (important when there are necromancers roaming about)
and the resulting chunks don't get the THROWN flag set because vampires
are unlikely to want to pick them up.
3.) Potions of blood can turn bad.
They last about 1200 turns which is a rather long time, though of course
not infinite. Potions created from corpses take the corpse age into
account. From age 199 downwards potions of blood are described as
"congealed blood". The effect when quaffing is entirely the same, it's
just a warning that the potion will soon disappear.
I've moved the potion descriptions over into item.plus, so that I could
use item.special for the timer to allow for easy comparison in
update_corpses() etc.
Ideally each stack of potions of blood would have a props vector
attached (similarly to decks) with the timeout turns stored in order
oldest to newest, so that you'd always drink the oldest potion first, and
if a potion was too old it (and it's time value) would just drop out of
the stack.
Since I haven't got this to work yet, instead the weighted average age
of two substacks is calculated and used for the combined stack.
Congealed (age < 200) and comparatively fresh (age >= 200) potions of
blood will never stack.
As suggested in FR 191314, !blood are a now an additional power source for
Sublimation of Blood, and the used potion turns into decay. And speaking of
decay, I've modified the mummy curse to only affect a substack if the
to-be-decayed potions are blood because I think losing your food source that
way would be the equivalent of spores destroying all your food at the same
time.
I think that's it; might still be buggy though I *did* test with some
vampires, both wiz-mode and not, and because of the special -> plus change
for potions, existing potions will now all look alike (clear potions).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3626 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/items.cc')
-rw-r--r-- | crawl-ref/source/items.cc | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc index 8e31a5e8ff..8afba9f8b8 100644 --- a/crawl-ref/source/items.cc +++ b/crawl-ref/source/items.cc @@ -1302,7 +1302,9 @@ bool items_stack( const item_def &item1, const item_def &item2, // both items must be stackable if (!force_merge && (!is_stackable_item( item1 ) || !is_stackable_item( item2 ))) + { return (false); + } // base and sub-types must always be the same to stack if (item1.base_type != item2.base_type || item1.sub_type != item2.sub_type) @@ -1336,19 +1338,30 @@ bool items_stack( const item_def &item1, const item_def &item2, ISFLAG_DROPPED | ISFLAG_THROWN | \ ISFLAG_NOTED_ID | ISFLAG_NOTED_GET | \ ISFLAG_BEEN_IN_INV) - if ((item1.flags & NON_IDENT_FLAGS) != - (item2.flags & NON_IDENT_FLAGS)) + + if ((item1.flags & NON_IDENT_FLAGS) != (item2.flags & NON_IDENT_FLAGS)) { return false; } - // Thanks to mummy cursing, we can have potions of decay - // that don't look alike... so we don't stack potions - // if either isn't identified and they look different. -- bwr - if (item1.base_type == OBJ_POTIONS && item1.special != item2.special && - (!item_type_known(item1) || !item_type_known(item2))) + if (item1.base_type == OBJ_POTIONS) { - return false; + // Thanks to mummy cursing, we can have potions of decay + // that don't look alike... so we don't stack potions + // if either isn't identified and they look different. -- bwr + if (item1.plus != item2.plus + && (!item_type_known(item1) || !item_type_known(item2))) + { + return false; + } + + // Don't stack congealed potions of blood with non-congealed ones. + if (item1.sub_type == POT_BLOOD + && (item1.special < 200 && item2.special >= 200 + || item2.special < 200 && item1.special >= 200)) + { + return false; + } } // The inscriptions can differ if one of them is blank, but if they @@ -1524,6 +1537,14 @@ int move_item_to_player( int obj, int quant_got, bool quiet ) you.inv[m].inscription = mitm[obj].inscription; } + if (mitm[obj].base_type == OBJ_POTIONS + && mitm[obj].sub_type == POT_BLOOD) + { + // use average age + int age = you.inv[m].special * you.inv[m].quantity + + mitm[obj].special * quant_got; + you.inv[m].special = age / (you.inv[m].quantity + quant_got); + } inc_inv_item_quantity( m, quant_got ); dec_mitm_item_quantity( obj, quant_got ); burden_change(); @@ -1726,6 +1747,13 @@ bool copy_item_to_grid( const item_def &item, int x_plos, int y_plos, { if (items_stack( item, mitm[i] )) { + if (item.base_type == OBJ_POTIONS && item.sub_type == POT_BLOOD) + { + // calculate average age + int age = mitm[i].special * mitm[i].quantity + + item.special * quant_drop; + mitm[i].special = age / (mitm[i].quantity + quant_drop); + } inc_mitm_item_quantity( i, quant_drop ); // If the items on the floor already have a nonzero slot, |