From 2fd7717a242e81f52a1e6ca1f4b6a9c94900bc08 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Sun, 27 Jan 2008 12:20:50 +0000 Subject: Fixed unique demon lord stats so they're more of a challenge. May need some tweaks, some of them may be too nasty now (such as Gloorx Vloq). Fixed broken monster self-teleport. Players do not get to resist dispel undead - may need to revisit this, low level necro ghosts could destroy undead characters. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3345 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/beam.cc | 1 + crawl-ref/source/mon-data.h | 70 ++++++++++++++++++++++---------------------- crawl-ref/source/mon-spll.h | 22 +++++++------- crawl-ref/source/mon-util.cc | 6 +++- crawl-ref/source/monstuff.cc | 65 ++++++++++++++++++++++++---------------- crawl-ref/source/mstuff2.cc | 12 +++++++- 6 files changed, 103 insertions(+), 73 deletions(-) (limited to 'crawl-ref') diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index 445aaf25a1..a3694362d6 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -3245,6 +3245,7 @@ static int affect_player( bolt &beam ) && beam.flavour != BEAM_INVISIBILITY && beam.flavour != BEAM_HEALING && beam.flavour != BEAM_POLYMORPH + && beam.flavour != BEAM_DISPEL_UNDEAD && ((beam.flavour != BEAM_TELEPORT && beam.flavour != BEAM_BANISH) || !beam.aimed_at_feet) && you_resist_magic( beam.ench_power )) diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h index 5b1d63de84..4c1fa40ed7 100644 --- a/crawl-ref/source/mon-data.h +++ b/crawl-ref/source/mon-data.h @@ -1139,11 +1139,11 @@ // random { MONS_BEAST, '4', BROWN, "beast", - M_EVIL, + M_EVIL | M_FIGHTER, MR_NO_FLAGS, 0, 10, MONS_BEAST, MONS_BEAST, MH_DEMONIC, -3, - { {AT_CLAW, AF_PLAIN, 12}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 5, 3, 5, 0 }, + { {AT_BITE, AF_PLAIN, 28}, {AT_CLAW, AF_PLAIN, 20}, AT_NO_ATK, AT_NO_ATK }, + { 7, 9, 6, 0 }, 0, 0, MST_NO_SPELLS, CE_CONTAMINATED, Z_NOZOMBIE, S_RANDOM, I_NORMAL, HT_LAND, 0, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE }, @@ -2461,10 +2461,10 @@ MONS_MNOLEG, '&', LIGHTGREEN, "Mnoleg", M_FIGHTER | M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_ELEC | MR_RES_POISON | MR_RES_FIRE, - 0, 25, MONS_MNOLEG, MONS_MNOLEG, MH_DEMONIC, MAG_IMMUNE, + 0, 15, MONS_MNOLEG, MONS_MNOLEG, MH_DEMONIC, MAG_IMMUNE, { {AT_HIT, AF_PLAIN, 35}, {AT_HIT, AF_PLAIN, 23}, AT_NO_ATK, AT_NO_ATK }, - { 17, 0, 0, 199 }, - 10, 13, MST_MNOLEG, CE_CONTAMINATED, Z_NOZOMBIE, S_BUZZ, I_HIGH, + { 17, 0, 0, 250 }, + 10, 25, MST_MNOLEG, CE_CONTAMINATED, Z_NOZOMBIE, S_BUZZ, I_HIGH, HT_LAND, 13, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE }, @@ -2472,21 +2472,21 @@ MONS_LOM_LOBON, '&', LIGHTBLUE, "Lom Lobon", M_FIGHTER | M_LEVITATE | M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_POISON | MR_RES_FIRE | MR_RES_COLD | MR_RES_ELEC, - 0, 25, MONS_LOM_LOBON, MONS_LOM_LOBON, MH_DEMONIC, MAG_IMMUNE, + 0, 15, MONS_LOM_LOBON, MONS_LOM_LOBON, MH_DEMONIC, MAG_IMMUNE, { {AT_HIT, AF_PLAIN, 40}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 19, 0, 0, 223 }, - 10, 7, MST_LOM_LOBON, CE_CONTAMINATED, Z_NOZOMBIE, S_SCREAM, I_HIGH, - HT_LAND, 8, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE + { 19, 0, 0, 250 }, + 10, 20, MST_LOM_LOBON, CE_CONTAMINATED, Z_NOZOMBIE, S_SCREAM, I_HIGH, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE }, { MONS_CEREBOV, '&', RED, "Cerebov", M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_ELEC | MR_RES_POISON | MR_RES_HELLFIRE, - 0, 25, MONS_CEREBOV, MONS_CEREBOV, MH_DEMONIC, -6, + 0, 15, MONS_CEREBOV, MONS_CEREBOV, MH_DEMONIC, -6, { {AT_HIT, AF_PLAIN, 60}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 21, 0, 0, 253 }, - 15, 8, MST_CEREBOV, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL, + { 21, 0, 0, 650 }, + 30, 8, MST_CEREBOV, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL, HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_GIANT, }, @@ -2494,11 +2494,11 @@ MONS_GLOORX_VLOQ, '&', DARKGREY, "Gloorx Vloq", M_FIGHTER | M_LEVITATE | M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_POISON | MR_RES_COLD | MR_RES_ELEC, - 0, 25, MONS_GLOORX_VLOQ, MONS_GLOORX_VLOQ, MH_DEMONIC, -14, - { {AT_HIT, AF_PLAIN, 40}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 16, 0, 0, 234 }, + 0, 15, MONS_GLOORX_VLOQ, MONS_GLOORX_VLOQ, MH_DEMONIC, -14, + { {AT_HIT, AF_PLAIN, 45}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, + { 16, 0, 0, 350 }, 10, 10, MST_GLOORX_VLOQ, CE_CONTAMINATED, Z_NOZOMBIE, S_MOAN, I_HIGH, - HT_LAND, 10, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE + HT_LAND, 20, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, SIZE_LARGE }, /* ****************************************************************** @@ -3111,9 +3111,9 @@ M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_FLIES | M_UNIQUE, MR_NO_FLAGS, - 0, 25, MONS_GERYON, MONS_GERYON, MH_DEMONIC, -6, + 0, 15, MONS_GERYON, MONS_GERYON, MH_DEMONIC, -6, { {AT_HIT, AF_PLAIN, 35}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 15, 0, 0, 240 }, + { 15, 0, 0, 300 }, 15, 6, MST_GERYON, CE_CONTAMINATED, Z_NOZOMBIE, S_ROAR, I_NORMAL, HT_LAND, 10, DEFAULT_ENERGY, MONUSE_STARTING_EQUIPMENT, SIZE_GIANT, }, @@ -3122,11 +3122,11 @@ MONS_DISPATER, '&', MAGENTA, "Dispater", M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_ELEC | MR_RES_POISON | MR_RES_HELLFIRE | MR_RES_COLD, - 0, 25, MONS_DISPATER, MONS_DISPATER, MH_DEMONIC, -10, + 0, 15, MONS_DISPATER, MONS_DISPATER, MH_DEMONIC, -10, { {AT_HIT, AF_PLAIN, 50}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 16, 0, 0, 222 }, - 15, 3, MST_DISPATER, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, - HT_LAND, 6, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE + { 16, 0, 0, 450 }, + 40, 3, MST_DISPATER, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE }, { @@ -3135,9 +3135,9 @@ MR_RES_ELEC | MR_RES_POISON | MR_RES_HELLFIRE, 0, 25, MONS_ASMODEUS, MONS_ASMODEUS, MH_DEMONIC, -12, { {AT_HIT, AF_PLAIN, 50}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 17, 0, 0, 245 }, - 12, 7, MST_ASMODEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, - HT_LAND, 9, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE + { 17, 0, 0, 450 }, + 30, 7, MST_ASMODEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE }, // Antaeus is now demonic so that he'll resist torment. -- bwr @@ -3145,22 +3145,22 @@ MONS_ANTAEUS, 'C', LIGHTCYAN, "Antaeus", M_FIGHTER | M_SPELLCASTER | M_SPEAKS | M_UNIQUE, MR_RES_ELEC | MR_VUL_FIRE | MR_RES_COLD, - 0, 25, MONS_HILL_GIANT, MONS_ANTAEUS, MH_DEMONIC, -9, - { {AT_HIT, AF_COLD, 75}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 22, 0, 0, 250 }, - 10, 4, MST_ANTAEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, - HT_LAND, 7, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_GIANT, + 0, 15, MONS_HILL_GIANT, MONS_ANTAEUS, MH_DEMONIC, -9, + { {AT_HIT, AF_COLD, 75}, {AT_HIT, AF_COLD, 30}, AT_NO_ATK, AT_NO_ATK }, + { 22, 0, 0, 700 }, + 28, 4, MST_ANTAEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, + HT_LAND, 10, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_GIANT, }, { MONS_ERESHKIGAL, '&', WHITE, "Ereshkigal", M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE, MR_RES_ELEC | MR_RES_POISON | MR_RES_COLD, - 0, 25, MONS_ERESHKIGAL, MONS_ERESHKIGAL, MH_DEMONIC, -10, + 0, 15, MONS_ERESHKIGAL, MONS_ERESHKIGAL, MH_DEMONIC, -10, { {AT_HIT, AF_PLAIN, 40}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 18, 0, 0, 238 }, - 15, 6, MST_ERESHKIGAL, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, - HT_LAND, 9, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE + { 18, 0, 0, 250 }, + 10, 30, MST_ERESHKIGAL, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH, + HT_LAND, 14, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, SIZE_LARGE }, { diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h index 7a49b88d9c..0e49b5ed2c 100644 --- a/crawl-ref/source/mon-spll.h +++ b/crawl-ref/source/mon-spll.h @@ -349,7 +349,7 @@ SPELL_BOLT_OF_DRAINING, SPELL_NO_SPELL, SPELL_SYMBOL_OF_TORMENT, - SPELL_NO_SPELL, + SPELL_DISPEL_UNDEAD, SPELL_SUMMON_DEMON } }, @@ -497,8 +497,8 @@ { SPELL_BOLT_OF_DRAINING, SPELL_BOLT_OF_COLD, - SPELL_SUMMON_DEMON, - SPELL_PAIN, + SPELL_SUMMON_GREATER_DEMON, + SPELL_SYMBOL_OF_TORMENT, SPELL_PARALYSE, SPELL_LESSER_HEALING } }, @@ -515,7 +515,7 @@ { MST_MNOLEG, { - SPELL_SUMMON_DEMON, + SPELL_SUMMON_GREATER_DEMON, SPELL_SMITING, SPELL_INVISIBILITY, SPELL_POLYMORPH_OTHER, @@ -527,7 +527,7 @@ { SPELL_LIGHTNING_BOLT, SPELL_BOLT_OF_COLD, - SPELL_LESSER_HEALING, + SPELL_GREATER_HEALING, SPELL_SUMMON_DEMON, SPELL_TELEPORT_SELF, SPELL_TELEPORT_SELF } @@ -537,20 +537,20 @@ { SPELL_BOLT_OF_FIRE, SPELL_BOLT_OF_IRON, - SPELL_NO_SPELL, + SPELL_HASTE, SPELL_FIREBALL, - SPELL_CALL_IMP, - SPELL_NO_SPELL } + SPELL_SUMMON_GREATER_DEMON, + SPELL_HASTE } }, { MST_GLOORX_VLOQ, { SPELL_POISON_ARROW, - SPELL_SLOW, + SPELL_MIASMA, SPELL_SUMMON_DEMON, SPELL_BOLT_OF_DRAINING, - SPELL_SUMMON_DEMON, - SPELL_NO_SPELL } + SPELL_DISPEL_UNDEAD, + SPELL_INVISIBILITY } }, { MST_TITAN, diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc index d7f8d89bfb..c49abd1bd9 100644 --- a/crawl-ref/source/mon-util.cc +++ b/crawl-ref/source/mon-util.cc @@ -1924,6 +1924,7 @@ bool ms_useful_fleeing_out_of_sight( const monsters *mon, spell_type monspell ) case SPELL_HASTE: case SPELL_INVISIBILITY: case SPELL_LESSER_HEALING: + case SPELL_GREATER_HEALING: case SPELL_ANIMATE_DEAD: return (true); @@ -1956,6 +1957,7 @@ bool ms_low_hitpoint_cast( const monsters *mon, spell_type monspell ) case SPELL_TELEPORT_SELF: case SPELL_TELEPORT_OTHER: case SPELL_LESSER_HEALING: + case SPELL_GREATER_HEALING: ret = true; break; @@ -2036,6 +2038,7 @@ bool ms_waste_of_time( const monsters *mon, spell_type monspell ) break; case SPELL_LESSER_HEALING: + case SPELL_GREATER_HEALING: if (mon->hit_points > mon->max_hit_points / 2) ret = true; break; @@ -2125,6 +2128,7 @@ static bool ms_ranged_spell( spell_type monspell ) { case SPELL_HASTE: case SPELL_LESSER_HEALING: + case SPELL_GREATER_HEALING: case SPELL_TELEPORT_SELF: case SPELL_INVISIBILITY: case SPELL_BLINK: @@ -4839,7 +4843,7 @@ int monsters::base_speed(int mcls) speed = 6 + random2avg(7, 2); break; case MONS_BEAST: - speed = 8 + random2(5); + speed = 10 + random2(8); break; } diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 862e75da5d..fdce44abda 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -3701,37 +3701,42 @@ static bool handle_spell( monsters *monster, bolt & beem ) else { spell_type spell_cast = SPELL_NO_SPELL; - monster_spells hspell_pass = monster->spells; + monster_spells hspell_pass(monster->spells); if (!enemies_around(monster)) { // forces the casting of dig when player not visible - this is EVIL! - if (hspell_pass[4] == SPELL_DIG && monster->behaviour == BEH_SEEK) + if (monster->has_spell(SPELL_DIG) + && monster->behaviour == BEH_SEEK) { spell_cast = SPELL_DIG; finalAnswer = true; } - else if (hspell_pass[2] == SPELL_LESSER_HEALING + else if ((monster->has_spell(SPELL_LESSER_HEALING) + || monster->has_spell(SPELL_GREATER_HEALING)) && monster->hit_points < monster->max_hit_points) { // The player's out of sight! // Quick, let's take a turn to heal ourselves. -- bwr - spell_cast = SPELL_LESSER_HEALING; + spell_cast = + monster->has_spell(SPELL_GREATER_HEALING)? + SPELL_GREATER_HEALING : SPELL_LESSER_HEALING; finalAnswer = true; } else if (monster->behaviour == BEH_FLEE) { // Since the player isn't around, we'll extend the monster's // normal fleeing choices to include the self-enchant slot. - if (ms_useful_fleeing_out_of_sight(monster,hspell_pass[5])) - { - spell_cast = hspell_pass[5]; - finalAnswer = true; - } - else if (ms_useful_fleeing_out_of_sight(monster,hspell_pass[2])) + + int foundcount = 0; + for (int i = NUM_MONSTER_SPELL_SLOTS - 1; i >= 0; --i) { - spell_cast = hspell_pass[2]; - finalAnswer = true; + if (ms_useful_fleeing_out_of_sight(monster, hspell_pass[i]) + && one_chance_in(++foundcount)) + { + spell_cast = hspell_pass[i]; + finalAnswer = true; + } } } else if (monster->foe == MHITYOU && !monsterNearby) @@ -3745,11 +3750,11 @@ static bool handle_spell( monsters *monster, bolt & beem ) if (!finalAnswer && enemies_around(monster) && mons_is_caught(monster) && one_chance_in(4)) { - for (int i = 0; i < 6; i++) + for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; i++) { if (ms_quick_get_away( monster, hspell_pass[i] )) { - spell_cast = hspell_pass[5]; + spell_cast = hspell_pass[i]; finalAnswer = true; break; } @@ -3764,17 +3769,26 @@ static bool handle_spell( monsters *monster, bolt & beem ) // Note: There should always be at least some chance we don't // get here... even if the monster is on its last HP. That // way we don't have to worry about monsters infinitely casting - // Healing on themselves (e.g. orc priests). + // Healing on themselves (e.g. orc high priests). if (monster->behaviour == BEH_FLEE && ms_low_hitpoint_cast( monster, hspell_pass[5] )) { spell_cast = hspell_pass[5]; finalAnswer = true; } - else if (ms_low_hitpoint_cast( monster, hspell_pass[2] )) + + if (!finalAnswer) { - spell_cast = hspell_pass[2]; - finalAnswer = true; + int found_spell = 0; + for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; ++i) + { + if (ms_low_hitpoint_cast( monster, hspell_pass[i] ) + && one_chance_in(++found_spell)) + { + spell_cast = hspell_pass[i]; + finalAnswer = true; + } + } } } @@ -3787,18 +3801,16 @@ static bool handle_spell( monsters *monster, bolt & beem ) return (false); } - // should monster not have selected dig by now, it never will: - if (hspell_pass[4] == SPELL_DIG) - hspell_pass[4] = SPELL_NO_SPELL; - // remove healing/invis/haste if we don't need them int num_no_spell = 0; - for (int i = 0; i < 6; i++) + for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; i++) { if (hspell_pass[i] == SPELL_NO_SPELL) num_no_spell++; - else if (ms_waste_of_time( monster, hspell_pass[i] )) + else if (ms_waste_of_time( monster, hspell_pass[i] ) + // should monster not have selected dig by now, it never will: + || hspell_pass[i] == SPELL_DIG) { hspell_pass[i] = SPELL_NO_SPELL; num_no_spell++; @@ -3806,8 +3818,11 @@ static bool handle_spell( monsters *monster, bolt & beem ) } // If no useful spells... cast no spell. - if (num_no_spell == 6 && draco_breath == SPELL_NO_SPELL) + if (num_no_spell == NUM_MONSTER_SPELL_SLOTS + && draco_breath == SPELL_NO_SPELL) + { return (false); + } // up to four tries to pick a spell. for (int loopy = 0; loopy < 4; loopy ++) diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc index ff02fa2ebd..31054162f6 100644 --- a/crawl-ref/source/mstuff2.cc +++ b/crawl-ref/source/mstuff2.cc @@ -530,6 +530,14 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) default: break; + case SPELL_GREATER_HEALING: + if (heal_monster(monster, 50 + random2avg(monster->hit_dice * 10, 2), + false)) + { + simple_monster_message(monster, " is healed."); + } + return; + case SPELL_BERSERKER_RAGE: monster->go_berserk(true); return; @@ -854,6 +862,7 @@ void setup_mons_cast(const monsters *monster, struct bolt &pbolt, int spell_cast switch (spell_cast) { case SPELL_SUMMON_SMALL_MAMMAL: + case SPELL_GREATER_HEALING: case SPELL_VAMPIRE_SUMMON: case SPELL_SHADOW_CREATURES: // summon anything appropriate for level case SPELL_FAKE_RAKSHASA_SUMMON: @@ -937,7 +946,8 @@ void monster_teleport(struct monsters *monster, bool instan, bool silent) { if (!silent) simple_monster_message(monster, " looks slightly unstable."); - monster->add_ench( mon_enchant(ENCH_TP, coinflip()? 3 : 4) ); + monster->add_ench( mon_enchant(ENCH_TP, 0, KC_OTHER, + coinflip()? 2 : 3) ); } return; -- cgit v1.2.3-54-g00ecf