summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-08-17 00:35:45 +0000
committerennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-08-17 00:35:45 +0000
commit7f599ba676f88c4d0491fea9268701821241ced4 (patch)
treea987c6c5e77533fc3438b341466477f4dde9b669 /crawl-ref/source
parent82f5633bfbcc8058b7a5be4838cf8c08b2f72410 (diff)
downloadcrawl-ref-7f599ba676f88c4d0491fea9268701821241ced4.tar.gz
crawl-ref-7f599ba676f88c4d0491fea9268701821241ced4.zip
[2046134] Fixing segfault when random dracos are specified with 'nothing' as equipment.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6830 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/mapdef.cc15
-rw-r--r--crawl-ref/source/mon-util.cc20
2 files changed, 31 insertions, 4 deletions
diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc
index 876da5a091..f4a7dc9ae2 100644
--- a/crawl-ref/source/mapdef.cc
+++ b/crawl-ref/source/mapdef.cc
@@ -1991,13 +1991,20 @@ mons_list::mons_spec_slot mons_list::parse_mons_spec(std::string spec)
if (mspec.items.size() > 0)
{
- if (mspec.mid == RANDOM_MONSTER)
+ monster_type mid = (monster_type)mspec.mid;
+ if (mid == RANDOM_DRACONIAN
+ || mid == RANDOM_BASE_DRACONIAN
+ || mid == RANDOM_NONBASE_DRACONIAN)
+ {
+ mid = MONS_DRACONIAN;
+ }
+
+ if (mid >= NUM_MONSTERS)
{
error = "Can't give spec items to a random monster.";
return (slot);
- };
-
- if (mons_itemuse(mspec.mid) < MONUSE_STARTING_EQUIPMENT)
+ }
+ else if (mons_itemuse(mid) < MONUSE_STARTING_EQUIPMENT)
{
error = make_stringf("Monster '%s' can't use items.",
mon_str.c_str());
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index e0c03e2ed3..40cffed0c8 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -387,11 +387,13 @@ mon_holy_type mons_holiness(const monsters *mon)
mon_holy_type mons_class_holiness(int mc)
{
+ ASSERT(smc);
return (smc->holiness);
}
bool mons_class_is_confusable(int mc)
{
+ ASSERT(smc);
return (smc->resist_magic < MAG_IMMUNE
&& mons_class_holiness(mc) != MH_NONLIVING
&& mons_class_holiness(mc) != MH_PLANT);
@@ -399,6 +401,7 @@ bool mons_class_is_confusable(int mc)
bool mons_class_is_slowable(int mc)
{
+ ASSERT(smc);
return (smc->resist_magic < MAG_IMMUNE);
}
@@ -575,16 +578,19 @@ bool mons_foe_is_mons(const monsters *mons)
int mons_zombie_size(int mc)
{
+ ASSERT(smc);
return (smc->zombie_size);
}
int mons_weight(int mc)
{
+ ASSERT(smc);
return (smc->weight);
}
corpse_effect_type mons_corpse_effect(int mc)
{
+ ASSERT(smc);
return (smc->corpse_thingy);
}
@@ -596,6 +602,12 @@ monster_type mons_species(int mc)
monster_type mons_genus(int mc)
{
+ if (mc == RANDOM_DRACONIAN || mc == RANDOM_BASE_DRACONIAN
+ || mc == RANDOM_NONBASE_DRACONIAN)
+ {
+ return MONS_DRACONIAN;
+ }
+ ASSERT(smc);
return (smc->genus);
}
@@ -687,6 +699,7 @@ static bool _shout_fits_monster(int type, int shout)
// for a pandemonium lord trying to shout.
shout_type mons_shouts(int mc, bool demon_shout)
{
+ ASSERT(smc);
shout_type u = smc->shouts;
// Pandemonium lords use this to get the noises.
@@ -775,6 +788,7 @@ int mons_class_colour(int mc)
mon_itemuse_type mons_itemuse(int mc)
{
+ ASSERT(smc);
return (smc->gmon_use);
}
@@ -863,6 +877,7 @@ mon_attack_def mons_attack_spec(const monsters *mons, int attk_number)
if (zombified)
mc = mons_zombie_base(mons);
+ ASSERT(smc);
mon_attack_def attk = smc->attack[attk_number];
if (attk.flavour == AF_KLOWN)
{
@@ -884,6 +899,7 @@ int mons_damage(int mc, int rt)
{
if (rt < 0 || rt > 3)
rt = 0;
+ ASSERT(smc);
return smc->attack[rt].damage;
}
@@ -1982,18 +1998,21 @@ monsterentry *get_monster_data(int p_monsterid)
static int _mons_exp_mod(int mc)
{
+ ASSERT(smc);
return (smc->exp_mod);
}
int mons_speed(int mc)
{
+ ASSERT(smc);
return (smc->speed);
}
mon_intel_type mons_intel(int mc)
{
+ ASSERT(smc);
return (smc->intel);
}
@@ -2018,6 +2037,7 @@ bool intelligent_ally(const monsters *monster)
int mons_power(int mc)
{
// For now, just return monster hit dice.
+ ASSERT(smc);
return (smc->hpdice[0]);
}