summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-03-21 11:47:59 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-03-21 11:47:59 +0000
commit101ce9277219b6925dc9e7c70692984c6544c5cd (patch)
treef6995b47d38f62eaf261c332b812acd7e227dee2
parentd04f647d2a64423af89b497c4daab8b452e7bf1c (diff)
downloadcrawl-ref-101ce9277219b6925dc9e7c70692984c6544c5cd.tar.gz
crawl-ref-101ce9277219b6925dc9e7c70692984c6544c5cd.zip
Added wizmode command to simulate monster vs player combat (&^F).
Apply 4.1ish monster to-hit calculations. M_FIGHTER monsters get bonus to-hit. Split melee and beam to-hit calculations again. Melee to-hit is now largely 4.1ish, but uses randomised player evasion. Applied 4.1 unique rebalancing. Higher level uniques now hit harder and have more hp. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1074 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/source/acr.cc4
-rw-r--r--crawl-ref/source/beam.cc10
-rw-r--r--crawl-ref/source/beam.h2
-rw-r--r--crawl-ref/source/debug.cc471
-rw-r--r--crawl-ref/source/debug.h2
-rw-r--r--crawl-ref/source/defines.h2
-rw-r--r--crawl-ref/source/externs.h12
-rw-r--r--crawl-ref/source/fight.cc44
-rw-r--r--crawl-ref/source/mon-data.h200
9 files changed, 346 insertions, 401 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 1766076e1f..e31ec340c2 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -571,6 +571,10 @@ static void handle_wizard_command( void )
debug_make_shop();
break;
+ case CONTROL('F'):
+ debug_fight_statistics(false, true);
+ break;
+
case 'f':
debug_fight_statistics(false);
break;
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 484e0926c5..593f6c3cc3 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -2977,7 +2977,7 @@ static bool fuzz_invis_tracer(bolt &beem)
// A first step towards to-hit sanity for beams. We're still being
// very kind to the player, but it should be fairer to monsters than
// 4.0.
-bool test_hit(int attack, int defence)
+bool test_beam_hit(int attack, int defence)
{
return (random2(attack) >= random2avg(defence, 2));
}
@@ -3040,7 +3040,7 @@ static int affect_player( struct bolt &beam )
you.mutation[MUT_REPULSION_FIELD] == 3)
beamHit -= random2(beamHit / 2);
- if (!test_hit(beamHit, dodge))
+ if (!test_beam_hit(beamHit, dodge))
{
mprf("The %s misses you.", beam.name.c_str());
return (0); // no extra used by miss!
@@ -3087,7 +3087,7 @@ static int affect_player( struct bolt &beam )
// miss message
- if (!test_hit(beamHit, dodge))
+ if (!test_beam_hit(beamHit, dodge))
{
mprf("The %s misses you.", beam.name.c_str());
return (0);
@@ -3581,9 +3581,9 @@ static int affect_monster(struct bolt &beam, struct monsters *mon)
const bool engulfs = (beam.is_explosion || beam.is_big_cloud);
// FIXME We're randomising mon->evasion, which is further
- // randomised inside test_hit. This is so we stay close to the 4.0
+ // randomised inside test_beam_hit. This is so we stay close to the 4.0
// to-hit system (which had very little love for monsters).
- if (!engulfs && !test_hit(beam.hit, random2(mon->ev)))
+ if (!engulfs && !test_beam_hit(beam.hit, random2(mon->ev)))
{
// if the PLAYER cannot see the monster, don't tell them anything!
if (player_monster_visible( &menv[tid] ) && mons_near(mon))
diff --git a/crawl-ref/source/beam.h b/crawl-ref/source/beam.h
index 8aa1e53255..f95477fb29 100644
--- a/crawl-ref/source/beam.h
+++ b/crawl-ref/source/beam.h
@@ -20,7 +20,7 @@
dice_def calc_dice( int num_dice, int max_damage );
// Test if the to-hit (attack) beats evasion (defence).
-bool test_hit(int attack, int defence);
+bool test_beam_hit(int attack, int defence);
/* ***********************************************************************
* called from: bang - it_use2 - monstuff - mstuff2
diff --git a/crawl-ref/source/debug.cc b/crawl-ref/source/debug.cc
index 9f32e14913..80da858529 100644
--- a/crawl-ref/source/debug.cc
+++ b/crawl-ref/source/debug.cc
@@ -62,17 +62,6 @@
#include "version.h"
#include "view.h"
-#if DEBUG && WIN
-#define MyDebugBreak() _asm {int 3}
-#endif
-
-//-----------------------------------
-// Internal Variables
-//
-#if WIN
-static HANDLE sConsole = NULL;
-#endif
-
// ========================================================================
// Internal Functions
// ========================================================================
@@ -92,30 +81,6 @@ static void BreakStrToDebugger(const char *mesg)
int* p = NULL; // but this gives us a stack crawl...
*p = 0;
-#elif WIN
- MSG msg; // remove pending quit messages so the message box displays
-
- bool quitting = (bool)::PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
-
- char text[2500];
-
- int flags = MB_YESNO + // want abort and ignore buttons
- // (too bad we can't ditch the retry button...)
- MB_ICONERROR + // display the icon for errors
- MB_TASKMODAL + // don't let the user do anything else in the app
- MB_SETFOREGROUND; // bring the app to the front
-
- strcpy(text, mesg);
- strcat(text, "\nDo you want to drop into the debugger?");
-
- int result = MessageBoxA(NULL, text, "Debug Break", flags);
-
- if (result == IDYES)
- MyDebugBreak();
-
- if (quitting)
- PostQuitMessage(msg.wParam);
-
#else
fprintf(stderr, "%s\n", mesg);
abort();
@@ -123,192 +88,6 @@ static void BreakStrToDebugger(const char *mesg)
}
#endif
-
-//---------------------------------------------------------------
-//
-// IsDebuggerPresent95
-//
-// From March 1999 Windows Developer's Journal. This should only
-// be called if we're running on Win 95 (normally I'd add an
-// ASSERT, but that's a bit dicy since this is called by ASSERT...)
-//
-//---------------------------------------------------------------
-#if WIN
-static bool IsDebuggerPresent95()
-{
- bool present = false;
-
- const DWORD kDebuggerPresentFlag = 0x000000001;
- const DWORD kProcessDatabaseBytes = 190;
- const DWORD kOffsetFlags = 8;
-
- DWORD threadID = GetCurrentThreadId();
- DWORD processID = GetCurrentProcessId();
- DWORD obfuscator = 0;
-
-#if __MWERKS__
- asm
- {
- mov ax, fs
- mov es, ax
- mov eax, 0x18
- mov eax, es:[eax]
- sub eax, 0x10 xor eax,[threadID] mov[obfuscator], eax
- }
-
-#else
- _asm
- {
- mov ax, fs
- mov es, ax
- mov eax, 18 h
- mov eax, es:[eax]
- sub eax, 10 h xor eax,[threadID] mov[obfuscator], eax
- }
-#endif
-
- const DWORD *processDatabase =
- reinterpret_cast< const DWORD * >(processID ^ obfuscator);
-
- if (!IsBadReadPtr(processDatabase, kProcessDatabaseBytes))
- {
- DWORD flags = processDatabase[kOffsetFlags];
-
- present = (flags & kDebuggerPresentFlag) != 0;
- }
-
- return present;
-}
-#endif
-
-
-//---------------------------------------------------------------
-//
-// IsDebuggerPresent
-//
-//---------------------------------------------------------------
-#if WIN
-bool IsDebuggerPresent()
-{
- bool present = false;
-
- typedef BOOL(WINAPI * IsDebuggerPresentProc) ();
-
- HINSTANCE kernelH = LoadLibrary("KERNEL32.DLL");
-
- if (kernelH != NULL)
- { // should never fail
-
- IsDebuggerPresentProc proc =
- (IsDebuggerPresentProc)::GetProcAddress( kernelH,
- "IsDebuggerPresent" );
-
- if (proc != NULL) // only present in NT and Win 98
- present = proc() != 0;
- else
- present = IsDebuggerPresent95();
- }
-
- return present;
-}
-#endif
-
-
-//---------------------------------------------------------------
-//
-// CreateConsoleWindow
-//
-//---------------------------------------------------------------
-#if WIN
-static void CreateConsoleWindow()
-{
- ASSERT(sConsole == NULL);
-
- // Create the console window
- if (::AllocConsole())
- {
- // Get the console window's handle
- sConsole =::GetStdHandle(STD_ERROR_HANDLE);
- if (sConsole == INVALID_HANDLE_VALUE)
- sConsole = NULL;
-
- // Set some options
- if (sConsole != NULL)
- {
- VERIFY(::SetConsoleTextAttribute(sConsole, FOREGROUND_GREEN));
- // green text on a black background (there doesn't appear to
- // be a way to get black text)
-
- VERIFY(::SetConsoleTitle("Debug Log"));
-
- COORD size = { 80, 120 };
-
- VERIFY(::SetConsoleScreenBufferSize(sConsole, size));
- }
- else
- DEBUGSTR(L "Couldn't get the console window's handle!");
- }
- else
- DEBUGSTR(L "Couldn't allocate the console window!");
-}
-#endif
-
-
-#if DEBUG
-//---------------------------------------------------------------
-//
-// TraceString
-//
-//---------------------------------------------------------------
-static void TraceString(const char *mesg)
-{
- // Write the string to the debug window
-#if WIN
- if (IsDebuggerPresent())
- {
- OutputDebugStringA(mesg); // if you're using CodeWarrior you'll need to enable the "Log System Messages" checkbox to get this working
- }
- else
- {
- if (sConsole == NULL) // otherwise we'll use a console window
- CreateConsoleWindow();
-
- if (sConsole != NULL)
- {
- unsigned long written;
-
- VERIFY(WriteConsoleA(sConsole, mesg, strlen(mesg), &written, NULL));
- }
- }
-#else
- fprintf(stderr, "%s", mesg);
-#endif
-
- // Write the string to the debug log
- static bool inited = false;
- static FILE *file = NULL;
-
- if (!inited)
- {
- ASSERT(file == NULL);
-
- const char *fileName = "DebugLog.txt";
-
- file = fopen(fileName, "w");
- ASSERT(file != NULL);
-
- inited = true;
- }
-
- if (file != NULL)
- {
- fputs(mesg, file);
- fflush(file); // make sure all the output makes it to the file
-
- }
-}
-#endif
-
// ========================================================================
// Global Functions
// ========================================================================
@@ -356,27 +135,6 @@ void DEBUGSTR(const char *format, ...)
}
#endif
-
-//---------------------------------------------------------------
-//
-// TRACE
-//
-//---------------------------------------------------------------
-#if DEBUG
-void TRACE(const char *format, ...)
-{
- char mesg[2048];
-
- va_list args;
-
- va_start(args, format);
- vsprintf(mesg, format, args);
- va_end(args);
-
- TraceString(mesg);
-}
-#endif // DEBUG
-
#ifdef WIZARD
static int debug_prompt_for_monster( void )
@@ -1254,7 +1012,6 @@ void stethoscope(int mwh)
mpr( info, MSGCH_DIAGNOSTICS );
-
// print enchantments
strncpy( info, "ench: ", INFO_SIZE );
for (j = 0; j < 6; j++)
@@ -1767,15 +1524,18 @@ static void fsim_set_ranged_skill(int skill, const item_def *item)
}
static void fsim_item(FILE *out,
- bool melee,
- const item_def *weap,
- int wskill, unsigned long damage,
- long iterations, long hits,
- int maxdam, unsigned long time)
+ bool melee,
+ const item_def *weap,
+ const char *wskill,
+ unsigned long damage,
+ long iterations, long hits,
+ int maxdam, unsigned long time)
{
double hitdam = hits? double(damage) / hits : 0.0;
int avspeed = (int) (time / iterations);
- fprintf(out, " %2d | %3ld%% | %5.2f | %5.2f | %5.2f | %3d | %2ld\n",
+ fprintf(out,
+ " %-5s| %3ld%% | %5.2f | %5.2f |"
+ " %5.2f | %3d | %2ld\n",
wskill,
100 * hits / iterations,
double(damage) / iterations,
@@ -1785,6 +1545,25 @@ static void fsim_item(FILE *out,
time / iterations);
}
+static void fsim_defence_item(FILE *out, long cum, int hits, int max,
+ int speed, long iters)
+{
+ // AC | EV | Arm | Dod | Acc | Av.Dam | Av.HitDam | Eff.Dam | Max.Dam | Av.Time
+ fprintf(out, "%2d %2d %2d %2d %3ld%% %5.2f %5.2f %5.2f %3d"
+ " %2d\n",
+ player_AC(),
+ player_evasion(),
+ you.skills[SK_DODGING],
+ you.skills[SK_ARMOUR],
+ 100 * hits / iters,
+ double(cum) / iters,
+ hits? double(cum) / hits : 0.0,
+ double(cum) / iters * speed / 10,
+ max,
+ 100 / speed);
+}
+
+
static bool fsim_ranged_combat(FILE *out, int wskill, int mi,
const item_def *item, int missile_slot)
{
@@ -1821,19 +1600,51 @@ static bool fsim_ranged_combat(FILE *out, int wskill, int mi,
if (damage > maxdam)
maxdam = damage;
}
- fsim_item(out, false, item, wskill, cumulative_damage,
- iter_limit, hits, maxdam, time_taken);
+ fsim_item(out, false, item, make_stringf("%2d", wskill).c_str(),
+ cumulative_damage, iter_limit, hits, maxdam, time_taken);
return (true);
}
+static bool fsim_mon_melee(FILE *out, int dodge, int armour, int mi)
+{
+ you.skills[SK_DODGING] = dodge;
+ you.skills[SK_ARMOUR] = armour;
+
+ const int yhp = you.hp;
+ const int ymhp = you.hp_max;
+ unsigned long cumulative_damage = 0L;
+ long hits = 0L;
+ int maxdam = 0;
+ no_messages mx;
+
+ for (long i = 0; i < Options.fsim_rounds; ++i)
+ {
+ you.hp = you.hp_max = 5000;
+ monster_attack(mi);
+ const int damage = you.hp_max - you.hp;
+ if (damage)
+ hits++;
+ cumulative_damage += damage;
+ if (damage > maxdam)
+ maxdam = damage;
+ }
+
+ you.hp = yhp;
+ you.hp_max = ymhp;
+
+ fsim_defence_item(out, cumulative_damage, hits, maxdam, menv[mi].speed,
+ Options.fsim_rounds);
+ return (true);
+}
+
static bool fsim_melee_combat(FILE *out, int wskill, int mi,
const item_def *item)
{
monsters &mon = menv[mi];
unsigned long cumulative_damage = 0L;
unsigned long time_taken = 0L;
- long hits = 0L;
+ long hits = 0L;
int maxdam = 0;
fsim_set_melee_skill(wskill, item);
@@ -1856,8 +1667,8 @@ static bool fsim_melee_combat(FILE *out, int wskill, int mi,
if (damage > maxdam)
maxdam = damage;
}
- fsim_item(out, true, item, wskill, cumulative_damage, iter_limit, hits,
- maxdam, time_taken);
+ fsim_item(out, true, item, make_stringf("%2d", wskill).c_str(),
+ cumulative_damage, iter_limit, hits, maxdam, time_taken);
return (true);
}
@@ -1975,6 +1786,26 @@ static void fsim_title(FILE *o, int mon, int ms)
fprintf(o, "Skill | Accuracy | Av.Dam | Av.HitDam | Eff.Dam | Max.Dam | Av.Time\n");
}
+static void fsim_defence_title(FILE *o, int mon)
+{
+ fprintf(o, CRAWL " version " VERSION "\n\n");
+ fprintf(o, "Combat simulation: %s vs. %s %s (%ld rounds) (%s)\n",
+ menv[mon].name(DESC_PLAIN).c_str(),
+ species_name(you.species, you.experience_level),
+ you.class_name,
+ Options.fsim_rounds,
+ fsim_time_string().c_str());
+ fprintf(o, "Experience: %d\n", you.experience_level);
+ fprintf(o, "Strength : %d\n", you.strength);
+ fprintf(o, "Intel. : %d\n", you.intel);
+ fprintf(o, "Dexterity : %d\n", you.dex);
+ fprintf(o, "Base speed: %d\n", player_speed());
+ fprintf(o, "\n");
+ fsim_mon_stats(o, menv[mon]);
+ fprintf(o, "\n");
+ fprintf(o, "AC | EV | Dod | Arm | Acc | Av.Dam | Av.HitDam | Eff.Dam | Max.Dam | Av.Time\n");
+}
+
static int cap_stat(int stat)
{
return (stat < 1 ? 1 :
@@ -1982,7 +1813,82 @@ static int cap_stat(int stat)
stat);
}
-static bool debug_fight_sim(int mindex, int missile_slot)
+static bool fsim_mon_hit_you(FILE *ostat, int mindex, int)
+{
+ fsim_defence_title(ostat, mindex);
+
+ for (int sk = 0; sk <= 27; ++sk)
+ {
+ mesclr();
+ mprf("Calculating average damage for %s at dodging %d",
+ menv[mindex].name(DESC_PLAIN).c_str(),
+ sk);
+
+ if (!fsim_mon_melee(ostat, sk, 0, mindex))
+ return (false);
+
+ fflush(ostat);
+ // Not checking in the combat loop itself; that would be more responsive
+ // for the user, but slow down the sim with all the calls to kbhit().
+ if (kbhit() && getch() == 27)
+ {
+ mprf("Canceling simulation\n");
+ return (false);
+ }
+ }
+
+ for (int sk = 0; sk <= 27; ++sk)
+ {
+ mesclr();
+ mprf("Calculating average damage for %s at armour %d",
+ menv[mindex].name(DESC_PLAIN).c_str(),
+ sk);
+
+ if (!fsim_mon_melee(ostat, 0, sk, mindex))
+ return (false);
+
+ fflush(ostat);
+ // Not checking in the combat loop itself; that would be more responsive
+ // for the user, but slow down the sim with all the calls to kbhit().
+ if (kbhit() && getch() == 27)
+ {
+ mprf("Canceling simulation\n");
+ return (false);
+ }
+ }
+
+ mprf("Done defence simulation with %s",
+ menv[mindex].name(DESC_PLAIN).c_str());
+
+ return (true);
+}
+
+static bool fsim_you_hit_mon(FILE *ostat, int mindex, int missile_slot)
+{
+ fsim_title(ostat, mindex, missile_slot);
+ for (int wskill = 0; wskill <= 27; ++wskill)
+ {
+ mesclr();
+ mprf("Calculating average damage for %s at skill %d",
+ fsim_weapon(missile_slot).c_str(), wskill);
+ if (!debug_fight_simulate(ostat, wskill, mindex, missile_slot))
+ return (false);
+
+ fflush(ostat);
+ // Not checking in the combat loop itself; that would be more responsive
+ // for the user, but slow down the sim with all the calls to kbhit().
+ if (kbhit() && getch() == 27)
+ {
+ mprf("Canceling simulation\n");
+ return (false);
+ }
+ }
+ mprf("Done fight simulation with %s", fsim_weapon(missile_slot).c_str());
+ return (true);
+}
+
+static bool debug_fight_sim(int mindex, int missile_slot,
+ bool (*combat)(FILE *, int mind, int mslot))
{
FILE *ostat = fopen("fight.stat", "a");
if (!ostat)
@@ -2016,34 +1922,14 @@ static bool debug_fight_sim(int mindex, int missile_slot)
you.intel = cap_stat(Options.fsim_int);
you.dex = cap_stat(Options.fsim_dex);
- fsim_title(ostat, mindex, missile_slot);
- for (int wskill = 0; wskill <= 27; ++wskill)
- {
- mesclr();
- mprf("Calculating average damage for %s at skill %d",
- fsim_weapon(missile_slot).c_str(), wskill);
- if (!debug_fight_simulate(ostat, wskill, mindex, missile_slot))
- goto done_combat_sim;
-
- fflush(ostat);
- // Not checking in the combat loop itself; that would be more responsive
- // for the user, but slow down the sim with all the calls to kbhit().
- if (kbhit() && getch() == 27)
- {
- success = false;
- mprf("Canceling simulation\n");
- goto done_combat_sim;
- }
- }
+ combat(ostat, mindex, missile_slot);
+
you.skills = skill_backup;
you.strength = ystr;
you.intel = yint;
you.dex = ydex;
you.experience_level = yxp;
- mprf("Done fight simulation with %s", fsim_weapon(missile_slot).c_str());
-
-done_combat_sim:
fprintf(ostat, "-----------------------------------\n\n");
fclose(ostat);
@@ -2108,7 +1994,7 @@ int fsim_kit_equip(const std::string &kit)
// average damage the player does to the p. bag over 10000 hits is noted,
// advancing the weapon skill from 0 to 27, and keeping fighting skill to 2/5
// of current weapon skill.
-void debug_fight_statistics(bool use_defaults)
+void debug_fight_statistics(bool use_defaults, bool defence)
{
int punching_bag = get_monster_by_name(Options.fsim_mons);
if (punching_bag == -1 || punching_bag == MONS_PROGRAM_BUG)
@@ -2120,25 +2006,26 @@ void debug_fight_statistics(bool use_defaults)
mprf("Failed to create punching bag");
return;
}
-
- if (!use_defaults)
- {
- debug_fight_sim(mindex, -1);
- goto fsim_mcleanup;
- }
- for (int i = 0, size = Options.fsim_kit.size(); i < size; ++i)
+ you.exp_available = 0;
+
+ if (!use_defaults || defence)
+ debug_fight_sim(mindex, -1,
+ defence? fsim_mon_hit_you : fsim_you_hit_mon);
+ else
{
- int missile = fsim_kit_equip(Options.fsim_kit[i]);
- if (missile == -100)
+ for (int i = 0, size = Options.fsim_kit.size(); i < size; ++i)
{
- mprf("Aborting sim on %s", Options.fsim_kit[i].c_str());
- goto fsim_mcleanup;
+ int missile = fsim_kit_equip(Options.fsim_kit[i]);
+ if (missile == -100)
+ {
+ mprf("Aborting sim on %s", Options.fsim_kit[i].c_str());
+ break;
+ }
+ if (!debug_fight_sim(mindex, missile, fsim_you_hit_mon))
+ break;
}
- if (!debug_fight_sim(mindex, missile))
- break;
}
-fsim_mcleanup:
monster_die(&menv[mindex], KILL_DISMISSED, 0);
}
diff --git a/crawl-ref/source/debug.h b/crawl-ref/source/debug.h
index fbf138d6eb..6f0a136097 100644
--- a/crawl-ref/source/debug.h
+++ b/crawl-ref/source/debug.h
@@ -145,7 +145,7 @@ void stethoscope(int mwh);
void debug_item_scan( void );
void debug_get_religion( void );
void debug_change_species( void );
-void debug_fight_statistics( bool use_init_defaults );
+void debug_fight_statistics( bool use_init_defaults, bool defence = false );
void debug_make_trap( void );
void debug_make_shop( void );
void debug_set_stats( void );
diff --git a/crawl-ref/source/defines.h b/crawl-ref/source/defines.h
index d71743bc2e..9f1a642503 100644
--- a/crawl-ref/source/defines.h
+++ b/crawl-ref/source/defines.h
@@ -143,6 +143,8 @@
// This value is used to make test_hit checks always succeed
#define AUTOMATIC_HIT 1500
+#define MIN_HIT_MISS_PERCENTAGE 5
+
// grids that monsters can see
#define MONSTER_LOS_RANGE 8
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 99c4ba3268..9793c5cc34 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -818,6 +818,18 @@ struct mon_attack_def
class ghost_demon;
class level_id;
+struct mon_enchant
+{
+ enchant_type ench;
+ kill_category who; // Who set this enchantment?
+ int degree;
+
+ mon_enchant(enchant_type e, int deg = 1, kill_category whose = KC_OTHER)
+ : ench(e), who(whose), degree(deg)
+ {
+ }
+};
+
class monsters : public actor
{
public:
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index ac77cda8d7..14257e3861 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -99,6 +99,44 @@ static void mons_lose_attack_energy(monsters *attacker, int wpn_speed,
**************************************************
*/
+bool test_melee_hit(int to_hit, int ev)
+{
+ int roll = -1;
+ int margin = AUTOMATIC_HIT;
+
+ ev *= 2;
+
+ if (to_hit >= AUTOMATIC_HIT)
+ return (true);
+ else if (random2(1000) < 10 * MIN_HIT_MISS_PERCENTAGE)
+ margin = (coinflip() ? 1 : -1) * AUTOMATIC_HIT;
+ else
+ {
+ roll = random2( to_hit + 1 );
+ margin = (roll - random2avg(ev, 2));
+ }
+
+#if DEBUG_DIAGNOSTICS
+ float miss;
+
+ if (to_hit < ev)
+ miss = 100.0 - static_cast<float>( MIN_HIT_MISS_PERCENTAGE ) / 2.0;
+ else
+ {
+ miss = static_cast<float>( MIN_HIT_MISS_PERCENTAGE ) / 2.0
+ + static_cast<float>( (100 - MIN_HIT_MISS_PERCENTAGE) * ev )
+ / static_cast<float>( to_hit );
+ }
+
+ mprf( MSGCH_DIAGNOSTICS,
+ "to hit: %d; ev: %d; miss: %0.2f%%; roll: %d; result: %s%s (%d)",
+ to_hit, ev, miss, roll, (margin >= 0) ? "hit" : "miss",
+ (roll == -1) ? "!!!" : "", margin );
+#endif
+
+ return (margin >= 0);
+}
+
// This function returns the "extra" stats the player gets because of
// choice of weapon... it's used only for giving warnings when a player
// weilds a less than ideal weapon.
@@ -2875,7 +2913,8 @@ void melee_attack::mons_perform_attack_rounds()
if (!shield_blocked)
{
const int defender_evasion = defender->melee_evasion(attacker);
- if (attacker == defender || test_hit(to_hit, defender_evasion))
+ if (attacker == defender
+ || test_melee_hit(to_hit, defender_evasion))
{
this_round_hit = did_hit = true;
perceived_attack = true;
@@ -2974,7 +3013,8 @@ bool melee_attack::mons_attack_you()
int melee_attack::mons_to_hit()
{
- int mhit = 16 + atk->hit_dice;
+ const int hd_mult = mons_class_flag(atk->type, M_FIGHTER)? 25 : 15;
+ int mhit = 18 + atk->hit_dice * hd_mult / 10;
if (water_attack)
mhit += 5;
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 79f63c0807..537bcd2551 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -159,7 +159,7 @@
{
MONS_RED_DEVIL, '4', RED, "red devil",
- M_FLIES | M_EVIL,
+ M_FIGHTER | M_FLIES | M_EVIL,
MR_RES_POISON | MR_RES_HELLFIRE | MR_VUL_COLD,
0, 10, MONS_RED_DEVIL, MONS_RED_DEVIL, MH_DEMONIC, -7,
{ {AT_HIT, AF_PLAIN, 18}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -445,7 +445,7 @@
{
MONS_ANGEL, 'A', WHITE, "Angel",
- M_FLIES | M_SPELLCASTER | M_SEE_INVIS,
+ M_FIGHTER | M_FLIES | M_SPELLCASTER | M_SEE_INVIS,
MR_RES_POISON | MR_RES_ELEC,
0, 10, MONS_ANGEL, MONS_ANGEL, MH_HOLY, -8,
{ {AT_HIT, AF_PLAIN, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -761,7 +761,7 @@
{
MONS_ORC_WARRIOR, 'o', YELLOW, "orc warrior",
- M_WARM_BLOOD | M_EVIL,
+ M_FIGHTER | M_WARM_BLOOD | M_EVIL,
MR_NO_FLAGS,
0, 10, MONS_ORC, MONS_ORC, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -797,7 +797,7 @@
{
MONS_ORC_KNIGHT, 'o', LIGHTCYAN, "orc knight",
- M_WARM_BLOOD | M_EVIL,
+ M_FIGHTER | M_WARM_BLOOD | M_EVIL,
MR_NO_FLAGS,
0, 10, MONS_ORC, MONS_ORC, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -1029,7 +1029,7 @@
{
MONS_MINOTAUR, 'm', LIGHTRED, "minotaur",
- M_WARM_BLOOD,
+ M_FIGHTER | M_WARM_BLOOD,
MR_NO_FLAGS,
1500, 10, MONS_MINOTAUR, MONS_MINOTAUR, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 35}, {AT_BUTT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -1138,7 +1138,7 @@
{
MONS_REAPER, '2', LIGHTGREY, "reaper",
- M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SEE_INVIS | M_EVIL,
MR_RES_POISON | MR_RES_COLD,
0, 10, MONS_REAPER, MONS_REAPER, MH_DEMONIC, MAG_IMMUNE,
{ {AT_HIT, AF_PLAIN, 32}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -1358,7 +1358,7 @@
{
MONS_HELL_KNIGHT, '@', RED, "hell knight",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_EVIL,
MR_RES_FIRE,
550, 10, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 13}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -1787,7 +1787,7 @@
// to examine them.
{
MONS_DANCING_WEAPON, '(', BLACK, "dancing weapon",
- M_LEVITATE,
+ M_FIGHTER | M_LEVITATE,
MR_RES_POISON | MR_RES_HELLFIRE | MR_RES_COLD | MR_RES_ELEC,
0, 10, MONS_DANCING_WEAPON, MONS_DANCING_WEAPON, MH_NONLIVING, MAG_IMMUNE,
{ {AT_HIT, AF_PLAIN, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -1799,7 +1799,7 @@
{
MONS_TITAN, 'C', MAGENTA, "titan",
- M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
MR_RES_ELEC,
3500, 12, MONS_HILL_GIANT, MONS_TITAN, MH_NATURAL, -7,
{ {AT_HIT, AF_PLAIN, 55}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2011,7 +2011,7 @@
{
MONS_FIRE_GIANT, 'C', RED, "fire giant",
- M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
MR_RES_FIRE,
2400, 11, MONS_HILL_GIANT, MONS_FIRE_GIANT, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2023,7 +2023,7 @@
{
MONS_FROST_GIANT, 'C', LIGHTBLUE, "frost giant",
- M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_WARM_BLOOD | M_SEE_INVIS | M_EVIL,
MR_RES_COLD,
2600, 11, MONS_HILL_GIANT, MONS_FROST_GIANT, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 35}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2393,7 +2393,7 @@
{
MONS_EXECUTIONER, '1', LIGHTGREY, "Executioner",
- M_SPELLCASTER | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_EVIL,
MR_RES_ELEC | MR_RES_FIRE | MR_RES_COLD | MR_RES_POISON,
0, 14, MONS_EXECUTIONER, MONS_EXECUTIONER, MH_DEMONIC, -9,
{ {AT_HIT, AF_PLAIN, 30}, {AT_HIT, AF_PLAIN, 10}, {AT_HIT, AF_PLAIN, 10}, {AT_NONE, AF_PLAIN, 0} },
@@ -2429,7 +2429,7 @@
{
MONS_BALRUG, '1', RED, "Balrug",
- M_SPELLCASTER | M_FLIES | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_FLIES | M_SEE_INVIS | M_EVIL,
MR_RES_POISON | MR_RES_HELLFIRE | MR_VUL_COLD,
0, 14, MONS_BALRUG, MONS_BALRUG, MH_DEMONIC, -9,
{ {AT_HIT, AF_FIRE, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2640,10 +2640,10 @@
{
MONS_MNOLEG, '&', LIGHTGREEN, "Mnoleg",
- M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE,
+ 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,
- { {AT_HIT, AF_PLAIN, 23}, {AT_HIT, AF_PLAIN, 23}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 35}, {AT_HIT, AF_PLAIN, 23}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 17, 0, 0, 199 },
10, 13, 13, 7, MST_MNOLEG, CE_CONTAMINATED, Z_NOZOMBIE, S_BUZZ, I_HIGH,
MONUSE_OPEN_DOORS, SIZE_LARGE
@@ -2652,7 +2652,7 @@
{
MONS_LOM_LOBON, '&', LIGHTBLUE, "Lom Lobon",
- M_LEVITATE | M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE,
+ 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,
{ {AT_HIT, AF_PLAIN, 40}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2664,10 +2664,10 @@
{
MONS_CEREBOV, '&', RED, "Cerebov",
- M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
+ 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,
- { {AT_HIT, AF_PLAIN, 50}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 60}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 21, 0, 0, 253 },
15, 8, 10, 7, MST_CEREBOV, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_GIANT
@@ -2676,10 +2676,10 @@
{
MONS_GLOORX_VLOQ, '&', DARKGREY, "Gloorx Vloq",
- M_LEVITATE | M_SEE_INVIS | M_SPELLCASTER | M_SPEAKS | M_EVIL | M_UNIQUE,
+ 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, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 40}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 16, 0, 0, 234 },
10, 10, 10, 7, MST_GLOORX_VLOQ, CE_CONTAMINATED, Z_NOZOMBIE, S_MOAN, I_HIGH,
MONUSE_OPEN_DOORS, SIZE_LARGE
@@ -2707,7 +2707,7 @@
{
MONS_NAGA_WARRIOR, 'N', BLUE, "naga warrior",
- M_SPELLCASTER | M_SEE_INVIS | M_WARM_BLOOD,
+ M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_WARM_BLOOD,
MR_RES_POISON,
750, 12, MONS_NAGA, MONS_NAGA, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2719,7 +2719,7 @@
{
MONS_ORC_WARLORD, 'o', RED, "orc warlord",
- M_WARM_BLOOD | M_EVIL,
+ M_FIGHTER | M_WARM_BLOOD | M_EVIL,
MR_NO_FLAGS,
600, 15, MONS_ORC, MONS_ORC, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 32}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2731,7 +2731,7 @@
{
MONS_DEEP_ELF_SOLDIER, 'e', CYAN, "deep elf soldier",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD,
+ M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_FIGHTER,
MR_NO_FLAGS,
450, 10, MONS_ELF, MONS_ELF, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 6}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2743,7 +2743,7 @@
{
MONS_DEEP_ELF_FIGHTER, 'e', LIGHTBLUE, "deep elf fighter",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD,
+ M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_FIGHTER,
MR_NO_FLAGS,
450, 10, MONS_ELF, MONS_ELF, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 9}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2755,7 +2755,7 @@
{
MONS_DEEP_ELF_KNIGHT, 'e', BLUE, "deep elf knight",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD,
+ M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_FIGHTER,
MR_NO_FLAGS,
450, 10, MONS_ELF, MONS_ELF, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -2938,8 +2938,8 @@
M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -3,
- { {AT_HIT, AF_PLAIN, 3}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 1, 0, 0, 14 },
+ { {AT_HIT, AF_PLAIN, 5}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 1, 0, 0, 20 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -2950,7 +2950,7 @@
M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -3,
- { {AT_HIT, AF_PLAIN, 4}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 5}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 1, 0, 0, 10 },
0, 10, 10, 7, MST_ORC_WIZARD_I, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
@@ -2995,11 +2995,11 @@
{
MONS_EDMUND, '@', RED, "Edmund",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 6}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 4, 0, 0, 27 },
+ { 4, 0, 0, 44 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3011,7 +3011,7 @@
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 7}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 5, 0, 0, 24 },
+ { 5, 0, 0, 39 },
0, 12, 13, 7, MST_ORC_WIZARD_III, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3024,7 +3024,7 @@
MR_RES_ELEC,
0, 20, MONS_OGRE, MONS_OGRE, MH_NATURAL, -7,
{ {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 6, 0, 0, 45 },
+ { 6, 0, 0, 54 },
3, 7, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_LARGE
}
@@ -3032,11 +3032,11 @@
{
MONS_DONALD, '@', BLUE, "Donald",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 8}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 5, 0, 0, 33 },
+ { 5, 0, 0, 54 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3044,11 +3044,11 @@
{
MONS_URUG, 'o', RED, "Urug",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_ORC, MONS_ORC, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 12}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 6, 0, 0, 38 },
+ { 6, 0, 0, 66 },
0, 11, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3060,7 +3060,7 @@
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 9}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 6, 0, 0, 36 },
+ { 6, 0, 0, 50 },
0, 10, 10, 7, MST_ORC_WIZARD_III, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3068,11 +3068,11 @@
{
MONS_JOSEPH, '@', CYAN, "Joseph",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 9}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 7, 0, 0, 42 },
+ { 7, 0, 0, 66 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3084,7 +3084,7 @@
MR_NO_FLAGS,
0, 20, MONS_TROLL, MONS_TROLL, MH_NATURAL, -6,
{ {AT_BITE, AF_PLAIN, 20}, {AT_CLAW, AF_PLAIN, 15}, {AT_CLAW, AF_PLAIN, 15}, {AT_NONE, AF_PLAIN, 0} },
- { 8, 0, 0, 45 },
+ { 8, 0, 0, 96 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_OPEN_DOORS, SIZE_LARGE
}
@@ -3096,7 +3096,7 @@
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 10}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 9, 0, 0, 43 },
+ { 9, 0, 0, 64 },
0, 11, 11, 7, MST_WIZARD_II, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3108,7 +3108,7 @@
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 11}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 9, 0, 0, 47 },
+ { 9, 0, 0, 69 },
0, 10, 10, 7, MST_NECROMANCER_I, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3116,11 +3116,11 @@
{
MONS_HAROLD, '@', LIGHTGREEN, "Harold",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
{ {AT_HIT, AF_PLAIN, 12}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 9, 0, 0, 51 },
+ { 9, 0, 0, 76 },
0, 8, 10, 7, MST_HELL_KNIGHT_II, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3128,11 +3128,11 @@
{
MONS_NORBERT, '@', BROWN, "Norbert",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 10, 0, 0, 53 },
+ { {AT_HIT, AF_PLAIN, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 10, 0, 0, 105 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3140,11 +3140,11 @@
{
MONS_JOZEF, '@', LIGHTMAGENTA, "Jozef",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 11, 0, 0, 60 },
+ { {AT_HIT, AF_PLAIN, 18}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 11, 0, 0, 90 },
0, 9, 10, 7, MST_GUARDIAN_NAGA, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3152,11 +3152,11 @@
{
MONS_AGNES, '@', LIGHTBLUE, "Agnes",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 11}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 11, 0, 0, 64 },
+ { {AT_HIT, AF_PLAIN, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 11, 0, 0, 140 },
0, 10, 15, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3164,11 +3164,11 @@
{
MONS_MAUD, '@', RED, "Maud",
- M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
+ M_FIGHTER | M_WARM_BLOOD | M_SPEAKS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 13, 0, 0, 55 },
+ { {AT_HIT, AF_PLAIN, 24}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 13, 0, 0, 118 },
0, 10, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3179,8 +3179,8 @@
M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD | M_UNIQUE,
MR_RES_ELEC,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 12}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 13, 0, 0, 52 },
+ { {AT_HIT, AF_PLAIN, 17}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 13, 0, 0, 106 },
0, 10, 10, 7, MST_WIZARD_IV, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3192,8 +3192,8 @@
| M_SEE_INVIS | M_EVIL | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 12}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 14, 0, 0, 67 },
+ { {AT_HIT, AF_PLAIN, 19}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 14, 0, 0, 110 },
0, 10, 10, 7, MST_ORC_HIGH_PRIEST, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3205,8 +3205,8 @@
| M_SEE_INVIS | M_EVIL | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 11}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 14, 0, 0, 70 },
+ { {AT_HIT, AF_PLAIN, 29}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 14, 0, 0, 121 },
0, 10, 10, 7, MST_ORC_HIGH_PRIEST, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3218,8 +3218,8 @@
| M_SEE_INVIS | M_UNIQUE,
MR_RES_ELEC,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 13}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 16, 0, 0, 80 },
+ { {AT_HIT, AF_PLAIN, 21}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 16, 0, 0, 123 },
0, 10, 10, 7, MST_WIZARD_IV, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3231,8 +3231,8 @@
| M_SEE_INVIS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 17, 0, 0, 78 },
+ { {AT_HIT, AF_PLAIN, 22}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 17, 0, 0, 140 },
1, 10, 7, 7, MST_ORC_PRIEST, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3244,8 +3244,8 @@
| M_SEE_INVIS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 14}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 18, 0, 0, 83 },
+ { {AT_HIT, AF_PLAIN, 22}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 18, 0, 0, 136 },
0, 10, 10, 7, MST_ORC_WIZARD_I, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3256,7 +3256,7 @@
M_SEE_INVIS | M_FLIES | M_SPECIAL_ABILITY | M_UNIQUE,
MR_RES_POISON | MR_RES_FIRE | MR_VUL_COLD,
0, 20, MONS_DRAGON, MONS_DRAGON, MH_NATURAL, -7,
- { {AT_BITE, AF_PLAIN, 29}, {AT_CLAW, AF_PLAIN, 17}, {AT_CLAW, AF_PLAIN, 17}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_BITE, AF_PLAIN, 35}, {AT_CLAW, AF_PLAIN, 20}, {AT_CLAW, AF_PLAIN, 17}, {AT_NONE, AF_PLAIN, 0} },
{ 19, 0, 0, 133 },
15, 7, 10, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_ROAR, I_NORMAL,
MONUSE_OPEN_DOORS, SIZE_HUGE
@@ -3265,12 +3265,12 @@
{
MONS_NORRIS, '@', LIGHTRED, "Norris",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SPEAKS | M_WARM_BLOOD
| M_SEE_INVIS | M_EVIL | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 16}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 20, 0, 0, 95 },
+ { {AT_HIT, AF_PLAIN, 36}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 20, 0, 0, 214 },
1, 9, 9, 7, MST_MYSTIC, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3282,8 +3282,8 @@
| M_SEE_INVIS | M_EVIL | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 17}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 21, 0, 0, 105 },
+ { {AT_HIT, AF_PLAIN, 27}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 21, 0, 0, 159 },
0, 10, 10, 7, MST_LICH_IV, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3295,8 +3295,8 @@
| M_SEE_INVIS | M_UNIQUE,
MR_NO_FLAGS,
0, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -5,
- { {AT_HIT, AF_PLAIN, 18}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 22, 0, 0, 119 },
+ { {AT_HIT, AF_PLAIN, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 22, 0, 0, 164 },
0, 10, 10, 7, MST_EFREET, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_NORMAL,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
}
@@ -3308,8 +3308,8 @@
| M_UNIQUE,
MR_RES_POISON | MR_RES_COLD | MR_RES_ELEC,
0, 23, MONS_LICH, MONS_LICH, MH_UNDEAD, -11,
- { {AT_HIT, AF_PLAIN, 15}, {AT_TOUCH, AF_DRAIN_XP, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
- { 22, 0, 0, 99 },
+ { {AT_HIT, AF_PLAIN, 25}, {AT_TOUCH, AF_DRAIN_XP, 15}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { 22, 0, 0, 154 },
12, 10, 10, 7, MST_LICH_IV, CE_CONTAMINATED, Z_SMALL, S_SHOUT, I_HIGH,
MONUSE_STARTING_EQUIPMENT, SIZE_MEDIUM
}
@@ -3318,10 +3318,10 @@
{
MONS_GERYON, '&', GREEN, "Geryon",
- M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
+ M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
MR_NO_FLAGS,
0, 25, MONS_GERYON, MONS_GERYON, MH_DEMONIC, -6,
- { {AT_HIT, AF_PLAIN, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 35}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 15, 0, 0, 240 },
15, 6, 10, 7, MST_GERYON, CE_CONTAMINATED, Z_NOZOMBIE, S_ROAR, I_NORMAL,
MONUSE_STARTING_EQUIPMENT, SIZE_GIANT
@@ -3330,10 +3330,10 @@
{
MONS_DISPATER, '&', MAGENTA, "Dispater",
- M_SPELLCASTER | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
+ 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,
- { {AT_HIT, AF_PLAIN, 15}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 50}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 16, 0, 0, 222 },
15, 3, 6, 7, MST_DISPATER, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH,
MONUSE_WEAPONS_ARMOUR, SIZE_LARGE
@@ -3342,10 +3342,10 @@
{
MONS_ASMODEUS, '&', LIGHTMAGENTA, "Asmodeus",
- M_SPELLCASTER | M_FLIES | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
+ M_FIGHTER | M_SPELLCASTER | M_FLIES | M_SEE_INVIS | M_SPEAKS | M_EVIL | M_UNIQUE,
MR_RES_ELEC | MR_RES_POISON | MR_RES_HELLFIRE,
0, 25, MONS_ASMODEUS, MONS_ASMODEUS, MH_DEMONIC, -12,
- { {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 50}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 17, 0, 0, 245 },
12, 7, 9, 7, MST_ASMODEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH,
MONUSE_WEAPONS_ARMOUR, SIZE_LARGE
@@ -3355,10 +3355,10 @@
// Antaeus is now demonic so that he'll resist torment. -- bwr
{
MONS_ANTAEUS, 'C', LIGHTCYAN, "Antaeus",
- M_SPELLCASTER | M_SPEAKS | M_UNIQUE,
+ 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, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_COLD, 55}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 22, 0, 0, 250 },
10, 4, 7, 7, MST_ANTAEUS, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH,
MONUSE_WEAPONS_ARMOUR, SIZE_GIANT
@@ -3370,7 +3370,7 @@
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,
- { {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 40}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 18, 0, 0, 238 },
15, 6, 9, 7, MST_ERESHKIGAL, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH,
MONUSE_WEAPONS_ARMOUR, SIZE_LARGE
@@ -3404,7 +3404,7 @@
{
MONS_VAULT_GUARD, '@', CYAN, "vault guard",
- M_WARM_BLOOD | M_SEE_INVIS,
+ M_FIGHTER | M_WARM_BLOOD | M_SEE_INVIS,
MR_NO_FLAGS,
0, 12, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 20}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -3430,10 +3430,10 @@
{
MONS_VAMPIRE_KNIGHT, 'V', CYAN, "vampire knight",
- M_SPELLCASTER | M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_SEE_INVIS | M_EVIL,
MR_RES_POISON | MR_RES_COLD,
0, 13, MONS_VAMPIRE, MONS_VAMPIRE, MH_UNDEAD, -6,
- { {AT_HIT, AF_PLAIN, 33}, {AT_BITE, AF_VAMPIRIC, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
+ { {AT_HIT, AF_PLAIN, 33}, {AT_BITE, AF_VAMPIRIC, 15}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 11, 3, 7, 0 },
10, 10, 10, 7, MST_VAMPIRE_KNIGHT, CE_NOCORPSE, Z_NOZOMBIE, S_SHOUT, I_HIGH,
MONUSE_WEAPONS_ARMOUR, SIZE_MEDIUM
@@ -3466,7 +3466,7 @@
{
MONS_ORB_GUARDIAN, 'X', MAGENTA, "Orb Guardian",
- M_NO_SKELETON | M_SEE_INVIS,
+ M_FIGHTER | M_NO_SKELETON | M_SEE_INVIS,
MR_NO_FLAGS,
0, 20, MONS_ORB_GUARDIAN, MONS_ORB_GUARDIAN, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 45}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -3478,7 +3478,7 @@
{
MONS_DAEVA, 'A', YELLOW, "Daeva",
- M_LEVITATE | M_SPELLCASTER | M_SEE_INVIS,
+ M_FIGHTER | M_LEVITATE | M_SPELLCASTER | M_SEE_INVIS,
MR_RES_POISON,
0, 12, MONS_ANGEL, MONS_DAEVA, MH_HOLY, -8,
{ {AT_HIT, AF_PLAIN, 25}, {AT_HIT, AF_PLAIN, 10}, {AT_HIT, AF_PLAIN, 10}, {AT_NONE, AF_PLAIN, 0} },
@@ -3503,7 +3503,7 @@
{
MONS_GREATER_NAGA, 'N', RED, "greater naga",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_SEE_INVIS | M_WARM_BLOOD,
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_SEE_INVIS | M_WARM_BLOOD,
MR_RES_POISON,
750, 10, MONS_NAGA, MONS_NAGA, MH_NATURAL, MAG_IMMUNE,
{ {AT_HIT, AF_PLAIN, 24}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -3563,7 +3563,7 @@
{
MONS_GUARDIAN_MUMMY, 'M', YELLOW, "guardian mummy",
- M_SEE_INVIS | M_EVIL,
+ M_FIGHTER | M_SEE_INVIS | M_EVIL,
MR_RES_POISON | MR_RES_COLD,
0, 13, MONS_MUMMY, MONS_GUARDIAN_MUMMY, MH_UNDEAD, -5,
{ {AT_HIT, AF_PLAIN, 30}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -3599,7 +3599,7 @@
{
MONS_CENTAUR_WARRIOR, 'c', YELLOW, "centaur warrior",
- M_WARM_BLOOD,
+ M_WARM_BLOOD | M_FIGHTER,
MR_NO_FLAGS,
1500, 12, MONS_CENTAUR, MONS_CENTAUR, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 16}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -3611,7 +3611,7 @@
{
MONS_YAKTAUR_CAPTAIN, 'c', RED, "yaktaur captain",
- M_WARM_BLOOD,
+ M_WARM_BLOOD | M_FIGHTER,
MR_NO_FLAGS,
2000, 10, MONS_YAKTAUR, MONS_YAKTAUR, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 23}, {AT_HIT, AF_PLAIN, 0}, {AT_HIT, AF_PLAIN, 0} },
@@ -4047,7 +4047,7 @@
{
MONS_SKELETAL_WARRIOR, 'z', CYAN, "skeletal warrior",
- M_SPELLCASTER | M_ACTUAL_SPELLS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_ACTUAL_SPELLS | M_EVIL,
MR_RES_POISON | MR_RES_COLD,
0, 10, MONS_SKELETAL_WARRIOR, MONS_SKELETAL_WARRIOR, MH_UNDEAD, -7,
{ {AT_HIT, AF_PLAIN, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -4061,7 +4061,7 @@
/* player ghost - only one per level. stats are stored in ghost struct */
{
MONS_PLAYER_GHOST, 'p', DARKGREY, "",
- M_SPEAKS | M_SPELLCASTER | M_ACTUAL_SPELLS | M_FLIES | M_UNIQUE,
+ M_FIGHTER | M_SPEAKS | M_SPELLCASTER | M_ACTUAL_SPELLS | M_FLIES | M_UNIQUE,
MR_RES_POISON,
0, 15, MONS_PHANTOM, MONS_PLAYER_GHOST, MH_UNDEAD, -5,
{ {AT_HIT, AF_PLAIN, 5}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -4074,7 +4074,7 @@
/* random demon in pan - only one per level. stats are stored in ghost struct */
{
MONS_PANDEMONIUM_DEMON, '&', BLACK, "&",
- M_SPELLCASTER | M_SPEAKS | M_EVIL,
+ M_FIGHTER | M_SPELLCASTER | M_SPEAKS | M_EVIL,
MR_RES_POISON,
0, 14, MONS_PANDEMONIUM_DEMON, MONS_PANDEMONIUM_DEMON, MH_DEMONIC, -5,
{ {AT_HIT, AF_PLAIN, 5}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
@@ -4123,7 +4123,7 @@
{ // mv: was another lava thing
MONS_SALAMANDER, 'S', LIGHTRED, "salamander",
- M_WARM_BLOOD,
+ M_FIGHTER | M_WARM_BLOOD,
MR_RES_FIRE | MR_VUL_COLD,
0, 10, MONS_SALAMANDER, MONS_SALAMANDER, MH_NATURAL, -3,
{ {AT_HIT, AF_FIRE, 23}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },