Attached Files |
0001-Dragon-form-changes-for-draconians.patch [^] (14,086 bytes) 2010-10-21 01:27 [Show Content] [Hide Content]From 92cc30b6d30027eb64d968bfafc2f92b1cb9b65b Mon Sep 17 00:00:00 2001
From: Shayne Halvorson <N78291@gmail.com>
Date: Wed, 20 Oct 2010 19:12:45 -0400
Subject: [PATCH] Dragon form changes for draconians
---
crawl-ref/source/abl-show.cc | 37 ++++++++++++++++++++++++++-----------
crawl-ref/source/beam.cc | 10 ++++++----
crawl-ref/source/mon-stuff.cc | 9 ++++-----
crawl-ref/source/player.cc | 26 ++++++++++++++++++++++----
crawl-ref/source/spl-cast.cc | 3 ++-
crawl-ref/source/spl-util.cc | 8 ++++++--
crawl-ref/source/transform.cc | 28 +++++++++++++++++++++++++++-
crawl-ref/source/transform.h | 1 +
8 files changed, 94 insertions(+), 28 deletions(-)
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc
index 25b5ef0..a246818 100644
--- a/crawl-ref/source/abl-show.cc
+++ b/crawl-ref/source/abl-show.cc
@@ -1393,7 +1393,9 @@ static bool _do_ability(const ability_def& abil)
break;
case ABIL_BREATHE_FROST:
- if (!zapping(ZAP_BREATHE_FROST, you.experience_level, beam, true,
+ if (!zapping(ZAP_BREATHE_FROST,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true,
"You exhale a wave of freezing cold."))
{
return (false);
@@ -1413,15 +1415,18 @@ static bool _do_ability(const ability_def& abil)
break;
case ABIL_SPIT_ACID:
- if (!zapping(ZAP_BREATHE_ACID, you.experience_level, beam, true,
- "You spit acid."))
+ if (!zapping(ZAP_BREATHE_ACID,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true, "You spit acid."))
{
return (false);
}
break;
case ABIL_BREATHE_POWER:
- if (!zapping(ZAP_BREATHE_POWER, you.experience_level, beam, true,
+ if (!zapping(ZAP_BREATHE_POWER,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true,
"You spit a bolt of incandescent energy."))
{
return (false);
@@ -1429,7 +1434,9 @@ static bool _do_ability(const ability_def& abil)
break;
case ABIL_BREATHE_STICKY_FLAME:
- if (!zapping(ZAP_BREATHE_STICKY_FLAME, you.experience_level, beam, true,
+ if (!zapping(ZAP_BREATHE_STICKY_FLAME,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true,
"You spit a glob of burning liquid."))
{
return (false);
@@ -1437,7 +1444,9 @@ static bool _do_ability(const ability_def& abil)
break;
case ABIL_BREATHE_STEAM:
- if (!zapping(ZAP_BREATHE_STEAM, you.experience_level, beam, true,
+ if (!zapping(ZAP_BREATHE_STEAM,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true,
"You exhale a blast of scalding steam."))
{
return (false);
@@ -1445,7 +1454,9 @@ static bool _do_ability(const ability_def& abil)
break;
case ABIL_BREATHE_MEPHITIC:
- if (!zapping(ZAP_BREATHE_MEPHITIC, you.experience_level, beam, true,
+ if (!zapping(ZAP_BREATHE_MEPHITIC,
+ (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) ? 2 * you.experience_level : you.experience_level,
+ beam, true,
"You exhale a blast of noxious fumes."))
{
return (false);
@@ -2265,8 +2276,8 @@ std::vector<talent> your_talents(bool check_confused)
}
// Draconians don't maintain their original breath weapons
- // if shapechanged, but green draconians do get spit poison
- // in spider form.
+ // if shapechanged into a non-dragon form, but green draconians
+ // do get spit poison in spider form.
if (transform_changed_physiology())
{
if (you.species == SP_GREEN_DRACONIAN
@@ -2274,7 +2285,7 @@ std::vector<talent> your_talents(bool check_confused)
{
ability = ABIL_SPIT_POISON; // spit, not breath
}
- else
+ else if (you.attribute[ATTR_TRANSFORMATION] != TRAN_DRAGON)
ability = ABIL_NON_ABILITY;
}
@@ -2398,11 +2409,15 @@ std::vector<talent> your_talents(bool check_confused)
//jmf: Check for breath weapons - they're exclusive of each other, I hope!
// Make better ones come first.
- if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+ if ((you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+ && dragon_form_dragon_type() == MONS_DRAGON
+ && you.species != SP_RED_DRACONIAN)
|| player_mutation_level(MUT_BREATHE_FLAMES))
{
_add_talent(talents, ABIL_BREATHE_FIRE, check_confused);
}
+
+
// Checking for unreleased Delayed Fireball.
if (you.attribute[ ATTR_DELAYED_FIREBALL ])
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 4e045a6..6786a03 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -2936,7 +2936,7 @@ bool bolt::harmless_to_player() const
return (player_res_poison(false));
case BEAM_POTION_STINKING_CLOUD:
- return (player_res_poison(false) || player_mental_clarity(false));
+ return (player_res_poison(false) || player_mental_clarity(false) || you.is_unbreathing());
case BEAM_ELECTRICITY:
return (player_res_electricity(false));
@@ -3756,8 +3756,9 @@ bool bolt::determine_damage(monster* mon, int& preac, int& postac, int& final,
postac = preac;
- // Hellfire ignores AC.
- if (flavour != BEAM_HELLFIRE && name != "freezing breath")
+ // Hellfire and white draconian breath ignores AC.
+ if (flavour != BEAM_HELLFIRE && name != "freezing breath"
+ && name != "chilling blast")
{
postac -= maybe_random2(1 + mon->ac, !is_tracer);
@@ -4010,7 +4011,8 @@ void bolt::monster_post_hit(monster* mon, int dmg)
}
}
- if (name == "bolt of energy") // purple draconian breath
+ if (name == "bolt of energy"
+ || origin_spell == SPELL_QUICKSILVER_BOLT) // purple draconian breath
debuff_monster(mon);
if (wake_mimic && mons_is_mimic(mon->type))
diff --git a/crawl-ref/source/mon-stuff.cc b/crawl-ref/source/mon-stuff.cc
index 19dd791..47b7296 100644
--- a/crawl-ref/source/mon-stuff.cc
+++ b/crawl-ref/source/mon-stuff.cc
@@ -2970,7 +2970,7 @@ void corrode_monster(monster* mons)
item_def *has_shield = mons->mslot_item(MSLOT_SHIELD);
item_def *has_armour = mons->mslot_item(MSLOT_ARMOUR);
- if (one_chance_in(3) && (has_shield || has_armour))
+ if (!one_chance_in(3) && (has_shield || has_armour))
{
item_def &thing_chosen = (has_armour ? *has_armour : *has_shield);
if (is_artefact(thing_chosen)
@@ -3003,11 +3003,10 @@ void corrode_monster(monster* mons)
}
}
}
- else if (one_chance_in(3) && !(has_shield || has_armour)
- && mons->holiness() == MH_NATURAL &&
- !(mons->res_acid() || mons_is_slime(mons)))
+ else if (!one_chance_in(3) && !(has_shield || has_armour)
+ && mons->can_bleed() && !mons->res_acid())
{
- mons->add_ench(mon_enchant(ENCH_BLEED, 1, KC_OTHER, (1 + random2(5))*10));
+ mons->add_ench(mon_enchant(ENCH_BLEED, 3, KC_OTHER, (5 + random2(5))*10));
if (you.can_see(mons))
{
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 2f6b03a..f40f0a8 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -1375,9 +1375,15 @@ int player_res_fire(bool calc_unid, bool temp, bool items)
rf--;
break;
case TRAN_DRAGON:
+ {
+ monster_type form = dragon_form_dragon_type();
+ if (form == MONS_DRAGON)
rf += 2;
+ else if (form == MONS_ICE_DRAGON)
+ rf--;
break;
}
+ }
}
if (rf < -3)
@@ -1424,8 +1430,14 @@ int player_res_cold(bool calc_unid, bool temp, bool items)
rc += 3;
break;
case TRAN_DRAGON:
+ {
+ monster_type form = dragon_form_dragon_type();
+ if (form == MONS_DRAGON)
rc--;
+ else if (form == MONS_ICE_DRAGON)
+ rc += 2;
break;
+ }
case TRAN_LICH:
rc++;
break;
@@ -1487,7 +1499,8 @@ int player_res_cold(bool calc_unid, bool temp, bool items)
int player_res_acid(bool calc_unid, bool items)
{
int res = 0;
- if (!transform_changed_physiology())
+ if (!transform_changed_physiology()
+ || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
{
if (you.species == SP_YELLOW_DRACONIAN)
res += 2;
@@ -5535,7 +5548,9 @@ int player::armour_class() const
if (attribute[ATTR_TRANSFORMATION] == TRAN_NONE
|| attribute[ATTR_TRANSFORMATION] == TRAN_LICH
- || attribute[ATTR_TRANSFORMATION] == TRAN_BLADE_HANDS)
+ || attribute[ATTR_TRANSFORMATION] == TRAN_BLADE_HANDS
+ || (attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON
+ && player_genus(GENPC_DRACONIAN)))
{
// Being a lich doesn't preclude the benefits of hide/scales -- bwr
//
@@ -5548,6 +5563,9 @@ int player::armour_class() const
if (player_genus(GENPC_DRACONIAN))
{
AC += 300 + 100 * (you.experience_level / 3); // max 12
+
+ if (attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON)
+ AC += 700;
}
else
{
@@ -5583,8 +5601,8 @@ int player::armour_class() const
AC += (100 + 100 * skills[SK_ICE_MAGIC] / 4); // max +7
break;
- case TRAN_DRAGON:
- AC += (700 + 100 * skills[SK_FIRE_MAGIC] / 3); // max 16
+ case TRAN_DRAGON: // Draconians handled above
+ AC += (700 + 100 * skills[SK_FIRE_MAGIC] / 3); // max 16
break;
case TRAN_STATUE: // main ability is armour (high bonus)
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 9e6b699..eb079ac 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -2230,8 +2230,9 @@ std::string spell_schools_string(spell_type spell)
std::string desc;
bool already = false;
+
for (int i = 0; i <= SPTYP_LAST_EXPONENT; ++i)
- {
+ {
if (spell_typematch(spell, (1<<i)))
{
if (already)
diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc
index d125fed..ee04840 100644
--- a/crawl-ref/source/spl-util.cc
+++ b/crawl-ref/source/spl-util.cc
@@ -465,13 +465,17 @@ const char *get_spell_target_prompt(spell_type which_spell)
bool spell_typematch(spell_type which_spell, unsigned int which_discipline)
{
- return (_seekspell(which_spell)->disciplines & which_discipline);
+ return (get_spell_disciplines(which_spell) & which_discipline);
}
//jmf: next two for simple bit handling
unsigned int get_spell_disciplines(spell_type spell)
{
- return (_seekspell(spell)->disciplines);
+ unsigned int dis = _seekspell(spell)->disciplines;
+ if (spell == SPELL_DRAGON_FORM && player_genus(GENPC_DRACONIAN))
+ dis &= (~SPTYP_FIRE);
+
+ return dis;
}
int count_bits(unsigned int bits)
diff --git a/crawl-ref/source/transform.cc b/crawl-ref/source/transform.cc
index 987b929..366c689 100644
--- a/crawl-ref/source/transform.cc
+++ b/crawl-ref/source/transform.cc
@@ -437,7 +437,7 @@ monster_type transform_mons()
case TRAN_ICE_BEAST:
return MONS_ICE_BEAST;
case TRAN_DRAGON:
- return MONS_DRAGON;
+ return dragon_form_dragon_type();
case TRAN_LICH:
return MONS_LICH;
case TRAN_BAT:
@@ -459,6 +459,32 @@ std::string blade_parts(bool terse)
return "hands";
}
+monster_type dragon_form_dragon_type()
+{
+ switch(you.species)
+ {
+ case SP_WHITE_DRACONIAN:
+ return MONS_ICE_DRAGON;
+ case SP_GREEN_DRACONIAN:
+ return MONS_SWAMP_DRAGON;
+ case SP_YELLOW_DRACONIAN:
+ return MONS_GOLDEN_DRAGON;
+ case SP_GREY_DRACONIAN:
+ return MONS_IRON_DRAGON;
+ case SP_BLACK_DRACONIAN:
+ return MONS_STORM_DRAGON;
+ case SP_PURPLE_DRACONIAN:
+ return MONS_QUICKSILVER_DRAGON;
+ case SP_MOTTLED_DRACONIAN:
+ return MONS_MOTTLED_DRAGON;
+ case SP_PALE_DRACONIAN:
+ return MONS_STEAM_DRAGON;
+ default:
+ return MONS_DRAGON;
+ }
+}
+
+
// Transforms you into the specified form. If force is true, checks for
// inscription warnings are skipped, and the transformation fails silently
// (if it fails). If just_check is true the transformation doesn't actually
diff --git a/crawl-ref/source/transform.h b/crawl-ref/source/transform.h
index 4965be6..dd88c1b 100644
--- a/crawl-ref/source/transform.h
+++ b/crawl-ref/source/transform.h
@@ -52,6 +52,7 @@ bool transform_allows_wearing_item(const item_def& item,
transformation_type transform);
monster_type transform_mons();
std::string blade_parts(bool terse = false);
+monster_type dragon_form_dragon_type();
// Check your current transformation.
bool transform_allows_wearing_item(const item_def& item);
--
1.6.5.1
|