summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-18 13:12:08 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-18 13:12:08 +0000
commit520d68077bf669ded9ec54a1811c0ce04dd68e28 (patch)
tree7f5c5170855aec735bfc42f02869f9d51473c3a8 /crawl-ref/source
parent33ca99ed1554de6bff222448b0e8c334fcf624f1 (diff)
downloadcrawl-ref-520d68077bf669ded9ec54a1811c0ce04dd68e28.tar.gz
crawl-ref-520d68077bf669ded9ec54a1811c0ce04dd68e28.zip
Extend Enne's blood potion destruction fix to potions on the floor.
Fix monsters "upgrading" their ammunition even if its brand cancels out with the launcher. Also make sure monsters aren't generated with launcher/ammo with opposing brands. Fix 2021310: no longer disallow blowgun acquirement. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6601 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/decks.cc2
-rw-r--r--crawl-ref/source/effects.cc3
-rw-r--r--crawl-ref/source/makeitem.cc38
-rw-r--r--crawl-ref/source/misc.cc3
-rw-r--r--crawl-ref/source/mon-util.cc20
-rw-r--r--crawl-ref/source/ouch.cc6
-rw-r--r--crawl-ref/source/religion.cc20
7 files changed, 63 insertions, 29 deletions
diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc
index 1328c4e0d3..ed25476877 100644
--- a/crawl-ref/source/decks.cc
+++ b/crawl-ref/source/decks.cc
@@ -1681,7 +1681,7 @@ static bool _damaging_card(card_type card, int power, deck_rarity_type rarity)
card_name(card));
if (spell_direction(target, beam, DIR_NONE, TARG_ENEMY, true, true, info)
- && player_tracer(ztype, power/4, beam))
+ && player_tracer(ZAP_DEBUGGING_RAY, power/4, beam))
{
zapping(ztype, random2(power/4), beam);
}
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index 4ad8841591..05850e6ef0 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -876,8 +876,7 @@ static int _find_acquirement_subtype(object_class_type class_wanted,
int count = 0;
int skill = SK_FIGHTING;
- // Can't do much with launchers, so we'll avoid them for now -- bwr
- for (int i = SK_SHORT_BLADES; i < SK_DARTS; i++)
+ for (int i = SK_SHORT_BLADES; i <= SK_DARTS; i++)
{
if (i == SK_UNUSED_1)
continue;
diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc
index f15fa47a27..f52373fb6c 100644
--- a/crawl-ref/source/makeitem.cc
+++ b/crawl-ref/source/makeitem.cc
@@ -1417,21 +1417,21 @@ static brand_type _determine_weapon_brand(const item_def& item, int item_level)
case WPN_CROSSBOW:
{
const int tmp = random2(1000);
- if ( tmp < 375 )
+ if (tmp < 375)
rc = SPWPN_FLAME;
- else if ( tmp < 750 )
+ else if (tmp < 750)
rc = SPWPN_FROST;
- else if ( tmp < 920 )
+ else if (tmp < 920)
rc = SPWPN_PROTECTION;
- else if ( tmp < 980 )
+ else if (tmp < 980)
rc = SPWPN_VORPAL;
else
rc = SPWPN_SPEED;
break;
}
- // quarterstaff - not powerful, as this would make
- // the 'staves' skill just too good
+ // Quarterstaff - not powerful, as this would make
+ // the 'staves' skill just too good.
case WPN_QUARTERSTAFF:
if (one_chance_in(30))
rc = SPWPN_PAIN;
@@ -1758,7 +1758,7 @@ static void _generate_missile_item(item_def& item, int force_type,
0);
}
- // no fancy rocks -- break out before we get to racial/special stuff
+ // No fancy rocks -- break out before we get to racial/special stuff.
if (item.sub_type == MI_LARGE_ROCK)
{
item.quantity = 2 + random2avg(5,2);
@@ -1783,7 +1783,7 @@ static void _generate_missile_item(item_def& item, int force_type,
_determine_missile_brand(item, item_level) );
}
- // reduced quantity if special
+ // Reduced quantity if special.
if (item.sub_type == MI_JAVELIN
|| get_ammo_brand( item ) == SPMSL_CURARE
|| get_ammo_brand( item ) == SPMSL_RETURNING)
@@ -1798,7 +1798,7 @@ static void _generate_missile_item(item_def& item, int force_type,
if (x_chance_in_y(11 + item_level, 100))
item.plus += random2(5);
- // elven arrows and dwarven bolts are quality items
+ // Elven arrows and dwarven bolts are quality items.
if (get_equip_race(item) == ISFLAG_ELVEN && item.sub_type == MI_ARROW
|| get_equip_race(item) == ISFLAG_DWARVEN && item.sub_type == MI_BOLT)
{
@@ -1835,7 +1835,10 @@ static bool _try_make_armour_artefact(item_def& item, int force_type,
// 10% of boots become barding.
if (item.sub_type == ARM_BOOTS && one_chance_in(10))
- item.sub_type = coinflip() ? ARM_NAGA_BARDING : ARM_CENTAUR_BARDING;
+ {
+ item.sub_type = coinflip() ? ARM_NAGA_BARDING
+ : ARM_CENTAUR_BARDING;
+ }
// Determine enchantment and cursedness.
if (one_chance_in(5))
@@ -2759,7 +2762,7 @@ int items( int allow_uniques, // not just true-false,
item.quantity = 1; // generally the case
- // determine sub_type accordingly {dlb}:
+ // Determine sub_type accordingly. {dlb}
switch (item.base_type)
{
case OBJ_WEAPONS:
@@ -3637,7 +3640,7 @@ static item_make_species_type _give_weapon(monsters *mon, int level,
if (mons_genus(mon->type) == MONS_NAGA)
item_race = MAKE_ITEM_NO_RACE;
- // only happens if something in above switch doesn't set it {dlb}
+ // Only happens if something in above switch doesn't set it. {dlb}
if (item.base_type == OBJ_UNASSIGNED)
return (item_race);
@@ -3708,6 +3711,17 @@ static void _give_ammo(monsters *mon, int level,
_got_curare_roll(level) ? SPMSL_CURARE
: SPMSL_POISONED);
}
+ else
+ {
+ // Sanity check to avoid useless brands.
+ const int bow_brand = get_bow_brand(*launcher);
+ const int ammo_brand = get_ammo_brand(mitm[thing_created]);
+ if (bow_brand == SPWPN_FLAME && ammo_brand != SPMSL_NORMAL
+ || bow_brand == SPWPN_FROST && ammo_brand != SPMSL_NORMAL)
+ {
+ mitm[thing_created].special = SPMSL_NORMAL;
+ }
+ }
// Master archers get double ammo - archery is their only attack.
if (mon->type == MONS_DEEP_ELF_MASTER_ARCHER)
diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc
index f5be8ee92e..719e2fea0d 100644
--- a/crawl-ref/source/misc.cc
+++ b/crawl-ref/source/misc.cc
@@ -741,6 +741,7 @@ bool maybe_coagulate_blood_potions_inv(item_def &blood)
return (true);
}
+// Removes the oldest timer of a stack of blood potions.
// Mostly used for (q)uaff, (f)ire, and Evaporate.
long remove_oldest_blood_potion(item_def &stack)
{
@@ -759,7 +760,7 @@ long remove_oldest_blood_potion(item_def &stack)
timer.pop_back();
// The quantity will be decreased elsewhere.
- return val;
+ return (val);
}
// Used whenever copies of blood potions have to be cleaned up.
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index e0916f6e92..453bd1a00f 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -3668,6 +3668,14 @@ bool monsters::pickup_melee_weapon(item_def &item, int near)
int eslot = -1;
item_def *weap;
+ // FIXME: A monster already wielding a melee weapon can put a second-rate
+ // weapon into its alternate slot but never use it.
+ // To fix this, this strange loop will have to be improved:
+ // - get weapons of first and second slot
+ // - compare weapons (or their non-existence) to the new one
+ // - ignore ranged weapons (we're picking up a melee weapon)
+ // - replace an existing melee weapon by a better one
+ // - else don't do anything
for (int i = MSLOT_WEAPON; i <= MSLOT_ALT_WEAPON; ++i)
{
weap = mslot_item(static_cast<mon_inv_type>(i));
@@ -3945,7 +3953,8 @@ bool monsters::pickup_missile(item_def &item, int near, bool force)
// Monsters in a fight will only pick up missiles if doing so
// is worthwhile.
- if (!mons_is_wandering(this) && (!mons_friendly(this) || foe != MHITYOU)
+ if (!mons_is_wandering(this)
+ && (!mons_friendly(this) || foe != MHITYOU)
&& (item.quantity < 5 || miss && miss->quantity >= 7))
{
return (false);
@@ -3967,13 +3976,20 @@ bool monsters::pickup_missile(item_def &item, int near, bool force)
launch = mslot_item(static_cast<mon_inv_type>(i));
if (launch)
{
+ const int bow_brand = get_bow_brand(*launch);
+ const int item_brand = get_ammo_brand(item);
// If this ammunition is better, drop the old ones.
+ // Don't upgrade to ammunition whose brand cancels the
+ // launcher brand or doesn't improve it further.
if (fires_ammo_type(*launch) == item.sub_type
&& (fires_ammo_type(*launch) != miss->sub_type
|| item.plus > miss->plus
|| item.plus == miss->plus
&& get_ammo_brand(*miss) == SPMSL_NORMAL
- && get_ammo_brand(item) != SPMSL_NORMAL))
+ && item_brand != SPMSL_NORMAL
+ && (bow_brand != SPWPN_FLAME
+ || item_brand == SPMSL_POISONED)
+ && bow_brand != SPWPN_FROST))
{
if (!drop_item(MSLOT_MISSILE, near))
return (false);
diff --git a/crawl-ref/source/ouch.cc b/crawl-ref/source/ouch.cc
index a0415148a0..4e0df5df79 100644
--- a/crawl-ref/source/ouch.cc
+++ b/crawl-ref/source/ouch.cc
@@ -559,7 +559,11 @@ void expose_items_to_element(beam_type flavour, int x, int y, int strength)
if (x_chance_in_y(strength, 100))
{
num_dest++;
- dec_mitm_item_quantity(si->index(), 1);
+ if (!dec_mitm_item_quantity(si->index(), 1)
+ && is_blood_potion(*si))
+ {
+ remove_oldest_blood_potion(*si);
+ }
}
}
}
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 7317e0c5f5..7fb387ea2f 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -3049,7 +3049,7 @@ bool is_evil_item(const item_def& item)
break;
}
- return retval;
+ return (retval);
}
bool good_god_dislikes_item_handling(const item_def &item)
@@ -3069,10 +3069,9 @@ bool god_dislikes_item_handling(const item_def &item)
if (you.religion == GOD_ZIN)
{
- if (((item.base_type == OBJ_POTIONS
- && item.sub_type == POT_MUTATION)
- || (item.base_type == OBJ_WANDS
- && item.sub_type == WAND_POLYMORPH_OTHER))
+ if ((item.base_type == OBJ_POTIONS && item.sub_type == POT_MUTATION
+ || item.base_type == OBJ_WANDS
+ && item.sub_type == WAND_POLYMORPH_OTHER)
&& item_type_known(item))
{
return (true);
@@ -3087,21 +3086,22 @@ bool god_dislikes_item_handling(const item_def &item)
if (you.religion == GOD_SHINING_ONE)
{
+ if (!item_type_known(item))
+ return (false);
+
if (item.base_type == OBJ_WEAPONS)
{
const int item_brand = get_weapon_brand(item);
- if (item_brand == SPWPN_VENOM && item_type_known(item))
+ if (item_brand == SPWPN_VENOM)
return (true);
}
else if (item.base_type == OBJ_MISSILES)
{
const int item_brand = get_ammo_brand(item);
- if (item_type_known(item) &&
- (item_brand == SPMSL_POISONED
- || item_brand == SPMSL_POISONED_II
- || item_brand == SPMSL_CURARE))
+ if (item_brand == SPMSL_POISONED
+ || item_brand == SPMSL_CURARE)
{
return (true);
}