From 101ce9277219b6925dc9e7c70692984c6544c5cd Mon Sep 17 00:00:00 2001 From: dshaligram Date: Wed, 21 Mar 2007 11:47:59 +0000 Subject: 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 --- crawl-ref/source/acr.cc | 4 + crawl-ref/source/beam.cc | 10 +- crawl-ref/source/beam.h | 2 +- crawl-ref/source/debug.cc | 471 +++++++++++++++++--------------------------- crawl-ref/source/debug.h | 2 +- crawl-ref/source/defines.h | 2 + crawl-ref/source/externs.h | 12 ++ crawl-ref/source/fight.cc | 44 ++++- crawl-ref/source/mon-data.h | 200 +++++++++---------- 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( MIN_HIT_MISS_PERCENTAGE ) / 2.0; + else + { + miss = static_cast( MIN_HIT_MISS_PERCENTAGE ) / 2.0 + + static_cast( (100 - MIN_HIT_MISS_PERCENTAGE) * ev ) + / static_cast( 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} }, -- cgit v1.2.3-54-g00ecf