call monster_die(). (This behaviour can be overriden.) Minor code cleanups elsewhere, removal of dead code from bolt.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7123 c06c8d41-db1a-0410-9941-cceddc491573
5FHWTG7M6FW4B3I33YI7QSM3OZIB6ZGC6TI6JISSLY5Y43HI56VAC
FWR2SQFT5VG5BG7DJQQ7NKT2O5OMS3ID2OKLSR4L2CSZUL3RJJYQC
3GQ4LKESL3LNEHHTXK334UMJJV75ZKL6O763V6RMYPDUBY5GUPZAC
72YZIOXMMSYZ5L6H7O3XGOUP4KTAPEUN2LMXMCXI73QL5B5ZDWCQC
2TZT4GURBCNHSVOXO5ZMN7XEIO3K4GWJCDPVSYUCMVZ6UFDL4DIQC
PWY4VZVHDLYL7UVNCCOW7BM7LYK2BOGTL23P75HXUJ33MHJPEJPQC
JLAGD2FAV3CWVO7PLXTHLT7MBI23TUSYLSNHFAWP5IB5UO77VKJAC
IHRRXPRJZMKQHVYBZP3UWKWGBS47JCYB4H6L6K52C7UY3JAYC7MAC
27JI3J23EXDY2G4X7NHTFTSHSEUDGDPFOYPG6P53UNSSJP3DDQTAC
BDRWN2OYH6DP6NFUQRLTQMTQZYZ3TSG7VKG2EC3C3RJQKQTKOF7QC
XHA6B4P5FAI5OTUQOA6J4VS2SBBR2MAFL2KMEBGD54O55WNSOGTQC
OYANFNGKCXG2NLQMYW4TNFU3LFK3533XQ3HFGI3LNMY4JGMDMK5QC
CK7CT5TUFUL2AQY7FUHB5JI3FC2KSPWUWHXC6VEUJJ7G4OWUQFTAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
5XNQ3SSNBFXFNWA6DPM74W6FH65NX665P3DMH6YCWVFOPZTJSYCQC
6ZZO2QBB46RZM6OXVS7OIKC5M3SEAULSSJFXW5PJG556JDKKUHWAC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC
K7J2IGELTIQL5KAMBV62MFVIVMEZEWCOLZ7GHFXHYPANYIF7BRZAC
KATZLWENEIQMKKWIV4ZLXJ5HFUW6SU5K4ZU6NENBOL4XAAVTDUKAC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
S5CIJLSFFXV445G6CH2AQ3YDU3P7RLSIHWV7GBJ4MZ4C26BWCY6AC
UH3CJQMQ3NPICXD34NTCTUZJWOCEF4P5XEGXFLLNDDFLZK7QPUBQC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
IGN3Q5YCLHXKWFZQRSRABCHW2JFW5TFVU7TM5EXE2EW7PDBBSQWAC
MT73EUNHNCLN5AQW6TT2PSM26PJCFQL5SF53NUYQ2T27UHATQNUAC
X6PDJWFXOZ4NUKXNOEP54CYQ6PCQJQK2KALAYY75XDAFCJJYWE6AC
S7Y7P3MDUUYVAMPT3AEPDS6ACEQSLBYTYZGEPEWZCT4VJ2GINATQC
G6EMU6AVVUJOJRN6NZK7HYS7KSPKTYLMSB3ERG7YWE7V2ZTLZJSQC
Z7FLGOQODOWQ2FDJRMCNM6MM3FOVORG6BMJZ3AA5HADPNJTYZD2QC
XIXBLWIVUPWM3P6XQIB7CS45JOOIYE6OBYYYERCFAYYO4VOWOYUQC
Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
7UIFNKK5IU2VUAGKWDB6KOETOVQOCOVDHZHB4OPAM2CQRCWV4AGQC
URFOQPK5U6ANCKMHK2R2BYIITZZESHYUNBAEI3WNJCYO7Q66WHNQC
ZDKKOOQAQW2HDRQKTSSYDB4P5PNGTG7XEOZUORFNUPG7PQ3KQ6QAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
HNHYJBQVNHG7A3GO24D2EG4NQEEJEZKKRJEBYWDWZNRD2DZYRDOAC
GE7XFWXEYNZXWNCKWHBHYIBSYQPZMBAE43PN7RW4B7WOCJKM7DZQC
WFED7ME7LXUZCZY3TWX7PCPW4EAA55W626CM2OOYVJTLI2BWFTVAC
6L4EP4ZRWWYLT55PD5KTTJON5J2JB5VV5MWNHF5VPZQZ5BKEYZ4QC
IPYQUTCWLI46CL62UXHR6PULPO4JPPXPFAJCGZULBQM67SHGPXTAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
B62ICMDTN5V7R7RBL4JALFVKEMVOOVLRSJASRNYS6CGFWBEEF5JQC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
PR42BCP5BPRFD2MP5H6CIJP7E57Q6TKL6SOXZWFKMFVR2OZWHT7AC
ITA3XNJBFNQONTIPJYRSVAOY55PUWSYYEZXZTVBQBH5XA3A5MNJAC
CRCKW7MAFIP2MB6ZNPVZXUHBGSPQNTYHGDVF2TCM2K6XLRUTUW4QC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
ITDUEUO7XAZANPC4GRB3SEDFBOV7GLFPNPTYE5LYNC3CS6BSVZTQC
JCWJWGMQIKQGSSFJUQRKNIWW3HBOJSHYDTOPPE5BWOJTIJTDYUTAC
K33CV7EYR37TTSEXQWQ6QPHSEUFO545AIPUZOA2C47QTUCUWFPAAC
RQFQSU37Y3ZBFR634JWYHE77LIOOINGBRNL4KUHPPRA3ZR6W5QIAC
LUH6GAJODIQXNPBEHMSUTKH3KA3DYVRCKZ6GJJ4HHNHOIMMUEP6QC
2ODNACUINBPZDCVQRADEJ5UOF5EMIBPBX77JW2RLRA5REY2X3IFAC
IZZKCZ2TOAFFDUXYN3XRPNKEEO7GHD4UDBPDJ4ULH446KACLBSIAC
KX6HOBTF5OBZLH2VNEFHH6YAX66FSE6JGBY5I2WIAW5IEJUGNL6AC
YVBTWF7VNCQ3MSY7YQFFSR4E35OCSP5JUB5ADODDB6V7W7K3TV4AC
EYHC4V76YSCWY22DQIXLVTAP5SKZLBSBQWYFPDVEXF6IW552HR5QC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
IIDDQROLZFP47VSCQUUCI4A5VGV762RJBTT3GM2K4AFRE5KZ4BFAC
FUEEIUKGHHFPIRZCN3N753GONWAZTWQ2ZWR53IBJAAZ6FZUNGOMAC
TDE7UVSZX4XJDAQWKCAPZ5IU25C75KKYUHXFI53JRIWHKK5SAGHQC
DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC
3JKKL6VSKQHBBTKEBSADZVCNXZLL4S6KN2W7G2CY5OBOMMUTIWXQC
UAJN2CFA2QHYDHW2UFAVPPHDQFCD54RKM6V2UC4AMEDJUBBLNWIQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
UN4CXQWERF622PXUR3ZM4CJWR6R7OOFVELMY22WLVVT7RD3G2XYAC
ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
GT7BSR54BVJKHUCLEBTELGBMNBFFDQW52EVC4XKVEMUVG2UGZMDAC
NDCVITU5R7TBEUC4FILNFRKWQGUNCJUGW5HA5KW3CQTU6AYRLYWQC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
3EUPIYJNWOMOQBP2Z5SGSMWK453BXJD6KL2WFTR3NM565MEBYASAC
AOAJ6D3OKSELEYKAT55XCVU5LYJ7SMCZKC6DIEGLLB3TF2LEENWQC
AS2IQQJNNCEQNXXKTGYHLB7RO3ZKCF4F7GK6FJH66BOOKDDRGNIQC
OFH2B2UZBK43QLFQBZ54FOCFLFNE54BZVDNCEUGDTBCUGNVZULIQC
Z3YHSEJ2ELRDG5DIDLP4MQSHNDRCTD5BSMVRBWOLF2S7TLRBGSBAC
KZIHM6RUX43HHKXG6HGJHVEEYUPVVNBFIWMT4SKPD2GAH5ZMA3KAC
NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC
5K2ANIEXD3CPJM4XNKNPZINP2G4NT7SJBKRN62WNBUKJXFERTILQC
QDBILCQHREAKSVXBJJGE2EPNR4ATTQWUZMV7BLJYZWWUI737TSKQC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
53VTPOTV7TI7QYFYS2ZKDXUJGYGFITOHJ7AO7CGRSFK2SOKXKWRAC
IDTLZ6PEPJP67PO7K5TODLXTBFAEVIE4C3HZCXIQK6OIAQKRVDUQC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
RWCCZ64BG3HSOTM54ANIGENC3F3AIR42LJFRYSAKMCPCIUSOZY5QC
IMC2HA2YWCU7SLGGVQQVUEUIST4ILSOEAUYXNZAW2PJZ475GXLDAC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
MG6LLF3XYCOEBQRX7TJ4MUTKM3IROYWUMZGCMYVW4TGDG36CJMJQC
FBJB2WMCYNDOICZJZT356VEMMD5L2FFRTKUARKSPIWIM2LHGBLTQC
P5ID2SF6YHSZ75EEU4CQ25HCZ74CWU2JQ2FH536KZEKD4DO3M3FQC
O2A7I25VYURCVDZEGRMFCP6X6DEYT4EB3TZESZSDCDDJE2U7QYVAC
FZKMVCODMWQEVVBBQHTTXFBRO4LZEYLB646ZPVUMLHH6EER7FAOAC
C5U3HSOOQ7BKXKXIDS7MLVXUKDTHAWJ5NXNX6YDXTM3GWY5UWX4QC
BTO5WE4OEK64DZQVNYLOESM74KKQNE7KSNMQVF5UDB26OBKP7ORQC
7EI4HMXZ7TAWZKFZG2SXHDAX3FWFBCZLUAKOALPRFF72FS7NKVBQC
4PBRMB7TK2TXL7VSDKMUQMT4QFK3SGRU4TUVMEM7V2VS7KKKILAQC
EQDLV5OMIFO5ZPYNE27VQLLZEIRMSALGNEFWVSCFXJN22A43GCWQC
ENOQQ6DEA6ECRNTBGYYNK7G3DFEILMKQBNKP4SUQIZW2L6HWVR7QC
2U47I7M3TKXUM3KHMO3UH7KGMRKOGHJQFVYPC4CTAWBV22T2HTEQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
OWERGKLVPNPGIIS23FZ7ZDOBWUIXCKYAFG3URXU75JAUDX3N5ENAC
BJPPSWEN35BG4KP3XTXPDMAJ2GAUMHXKHCNALAZ4B4OS6B3KDSUQC
4ZFFJ2D4IE2FXSGONGJWPOTHX4CFIGLVQOGZYV2KFAGYDUBJYCCQC
35TYXBLIHC45BQJX6VNVICEVZ35KR2VRA7EWW2JWVHX4XZPTHGPQC
GSJA56E3ORVIBCBA6T6WU2HE4DCLJ6NZPW76O7L54N4CYPKLJOWQC
BTAITFZ3R4D5YR62MU7ECSBQQHRVHEJMXGSHV5HXWPOJDQD4SD7QC
52FEQPZJXSIC2RBEQDRP4CW56AQTFKQ434GI6PBMEOUGM6KUMHMAC
KAFCZ5PNUDUJMOEOILTX7V5GDAMBS7VQCBVH7PFDN35DOQ77YRZQC
OREY5XZ7FHN4UHDW4E6EQKGZHQUGK26LOGVHLKFN3YJI3B2734BAC
NULVQ2A7ES5N3BBQAH6YKFST6UPVKD4KYYFFHYTUKSYLHXR4OYSAC
TQLWCGVXVZ75H7MDBJD3DJDUFNW62WOAEDJUVKCHQTAXKBP47CSAC
int dice_def::roll() const
{
return roll_dice(this->num, this->size);
}
hurt_monster( &menv[monster], damage );
if (menv[monster].hit_points > 0)
{
const monsters *mons = static_cast<const monsters*>(&menv[monster]);
print_wounds(mons);
}
else
{
monster_die(&menv[monster], KILL_YOU, NON_MONSTER);
return (true);
}
m.hurt(&you, damage);
if (m.alive())
print_wounds(&m);
hurt_monster( monster, damage );
if (monster->hit_points < 1)
monster_die(monster, KILL_YOU, NON_MONSTER);
else
print_wounds( monster );
return;
monster->hurt(&you, damage);
if (monster->alive())
print_wounds(monster);
hurt_monster(monster, 7 + (random2(power) * 33 / 191));
if (monster->hit_points < 1)
monster_die(monster, KILL_YOU, NON_MONSTER);
else
monster->hurt(&you, 7 + (random2(power) * 33 / 191));
if (monster->alive())
if (monster->hit_points < 1)
monster_die(monster, KILL_YOU, NON_MONSTER);
else
monster->hurt(&you, hurted);
if (monster->alive())
int hurt = mons_adjust_flavoured(monster,beam,roll_dice(dam_dice));
if (hurt > 0)
hurt_monster(monster, hurt);
int hurt = mons_adjust_flavoured(monster, beam, dam_dice.roll());
monster->hurt(&you, hurt, BEAM_COLD);
// Kill monster if necessary; cold-blooded creatures can be slowed.
if (monster->hit_points < 1)
monster_die(monster, KILL_YOU, NON_MONSTER);
else if (mons_class_flag(monster->type, M_COLD_BLOOD) && coinflip())
// Cold-blooded creatures can be slowed.
if (monster->alive()
&& mons_class_flag(monster->type, M_COLD_BLOOD)
&& coinflip())
{
if (monster->type == -1)
return;
if (monster->hit_points == monster->max_hit_points
|| monster->hit_points < 1)
{
if (!monster->alive() || monster->hit_points == monster->max_hit_points)
if (def->hit_points < 1)
{
monster_die(def, KILL_YOU, NON_MONSTER);
return (true);
}
special_damage = def->hurt(&you, special_damage);
// These used to be handled in the colour field:
BEAM_SLOW, // BLACK
BEAM_HASTE, // BLUE
BEAM_HEALING, // GREEN
BEAM_PARALYSIS, // CYAN
BEAM_CONFUSION, // RED - 30
BEAM_INVISIBILITY, // MAGENTA
BEAM_DIGGING, // BROWN
BEAM_TELEPORT, // LIGHTGREY
BEAM_POLYMORPH, // DARKGREY
BEAM_CHARM, // LIGHTBLUE - 35
BEAM_BANISH, // LIGHTGREEN
BEAM_DEGENERATE, // LIGHTCYAN
BEAM_ENSLAVE_UNDEAD, // LIGHTRED
BEAM_PAIN, // LIGHTMAGENTA
BEAM_DISPEL_UNDEAD, // YELLOW - 40
BEAM_DISINTEGRATION, // WHITE
BEAM_ENSLAVE_DEMON, // colour "16"
// Enchantments
BEAM_FIRST_ENCHANTMENT,
BEAM_SLOW = BEAM_FIRST_ENCHANTMENT,
BEAM_HASTE,
BEAM_HEALING,
BEAM_PARALYSIS,
BEAM_CONFUSION,
BEAM_INVISIBILITY,
BEAM_DIGGING,
BEAM_TELEPORT,
BEAM_POLYMORPH,
BEAM_CHARM,
BEAM_BANISH,
BEAM_DEGENERATE,
BEAM_ENSLAVE_UNDEAD,
BEAM_PAIN,
BEAM_DISPEL_UNDEAD,
BEAM_DISINTEGRATION,
BEAM_ENSLAVE_DEMON,
retval = 1;
if (!monster->alive())
{
monster_die(monster, KILL_YOU, NON_MONSTER);
return retval;
}
}
if (monster->speed_increment >= 25)
monster->speed_increment -= 20;
bool is_enchant; // no block/dodge, but mag resist
bool is_energy; // mostly energy/non-physical attack
bool is_launched; // was fired from launcher?
bool is_thrown; // was thrown from hand?
bool target_first; // targeting by direction
/* ***********************************************************************
* called from: bang - it_use2 - monstuff - mstuff2
* *********************************************************************** */
// last updated 12may2000 {dlb}
/* ***********************************************************************
* called from: ability - it_use3 - item_use - mstuff2 - religion -
* spells - spells4
* *********************************************************************** */
/* ***********************************************************************
* called from: ability - item_use - spell
* returns true if messages were generated during the enchantment
* *********************************************************************** */
// returns true if messages were generated during the enchantment
/* ***********************************************************************
* called from: fight - monstuff - mstuff2
* *********************************************************************** */
int mons_ench_f2( monsters *monster, struct bolt &pbolt );
mon_resist_type mons_ench_f2(monsters *monster, bolt &pbolt);
/* ***********************************************************************
* called from: monstuff
* *********************************************************************** */
static void _monster_die(monsters *mons, const bolt &beam);
static bool _nasty_beam(monsters *mon, bolt &beam);
static bool _nice_beam(monsters *mon, bolt &beam);
static bool _nasty_beam(monsters *mon, const bolt &beam);
static bool _nice_beam(monsters *mon, const bolt &beam);
if ((monster->hit_points -= hurted) < 1)
{
_monster_die(monster, beam);
mondied = true;
}
monster->hurt(beam.agent(), hurted, BEAM_POISON);
// !@#*( affect_monster_enchantment() has side-effects on
// the beam structure which screw up range_used_on_hit(),
// so call it now and store.
int rangeUsed = _range_used_on_hit(beam);
if (mon->hit_points < 1)
{
_monster_die(mon, beam);
}
else
if (mon->alive())
if (check_mons_resist_magic( mon, beam.ench_power )
&& !beam.aimed_at_feet)
{
return (mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST);
}
case BEAM_HASTE:
case BEAM_HEALING:
case BEAM_INVISIBILITY:
case BEAM_DISPEL_UNDEAD:
case BEAM_ENSLAVE_DEMON: // it has a different saving throw
rc = false;
break;
default:
break;
}
return rc;
}
if (mons_near(mon) && player_monster_visible(mon))
beam.obvious_effect = true;
bool _ench_flavour_affects_monster(beam_type flavour, const monsters* mon)
{
bool rc = true;
switch (flavour)
{
case BEAM_POLYMORPH:
rc = mon->can_mutate();
break;
if (beam.flavour == BEAM_BLINK)
{
if (!beam.aimed_at_feet
&& check_mons_resist_magic( mon, beam.ench_power ))
{
return mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST;
}
case BEAM_DISPEL_UNDEAD:
rc = (mons_holiness(mon) == MH_UNDEAD);
break;
monster_blink( mon );
return (MON_AFFECTED);
case BEAM_PAIN:
rc = !mons_res_negative_energy(mon);
break;
case BEAM_SLEEP:
rc = !mon->has_ench(ENCH_SLEEP_WARY) // slept recently
&& mons_holiness(mon) == MH_NATURAL // no unnatural
&& mons_res_cold(mon) <= 0; // can't be hibernated
break;
default:
break;
if (beam.flavour == BEAM_POLYMORPH)
static mon_resist_type _affect_monster_enchantment(bolt &beam, monsters *mon)
{
// Early out if the enchantment is meaningless.
if (!_ench_flavour_affects_monster(beam.flavour, mon))
return (MON_UNAFFECTED);
// Check magic resistance.
if (_beam_has_saving_throw(beam))
if (check_mons_resist_magic( mon, beam.ench_power ))
return (mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST);
switch (beam.flavour)
{
case BEAM_TELEPORT:
if (you.can_see(mon))
beam.obvious_effect = true;
monster_teleport(mon, false);
return (MON_AFFECTED);
case BEAM_BLINK:
if (you.can_see(mon))
beam.obvious_effect = true;
monster_blink(mon);
return (MON_AFFECTED);
case BEAM_POLYMORPH:
}
if (beam.flavour == BEAM_DEGENERATE)
{
if (mons_holiness(mon) != MH_NATURAL
|| mon->type == MONS_PULSATING_LUMP)
{
return (MON_UNAFFECTED);
}
if (check_mons_resist_magic( mon, beam.ench_power ))
return mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST;
hurt_monster( mon, roll_dice( beam.damage ) );
death_check = true;
}
mon->hurt(beam.agent(), beam.damage.roll());
return (MON_AFFECTED);
if (mon->attitude == ATT_FRIENDLY)
return (MON_UNAFFECTED);
if (check_mons_resist_magic(mon, beam.ench_power))
return mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST;
if (beam.flavour == BEAM_ENSLAVE_DEMON
&& mons_holiness(mon) == MH_DEMONIC)
{
case BEAM_ENSLAVE_DEMON:
// Already friendly.
if (mons_friendly(mon))
return (MON_UNAFFECTED);
}
//
// Everything past this point must pass this magic resistance test.
//
// Using check_mons_resist_magic here since things like disintegrate
// are beyond this point. -- bwr
// death_check should be set true already if one of the beams above
// did its thing but wants to see if the monster died.
//
if (!death_check
&& check_mons_resist_magic( mon, beam.ench_power )
&& beam.flavour != BEAM_HASTE
&& beam.flavour != BEAM_HEALING
&& beam.flavour != BEAM_INVISIBILITY)
{
return mons_immune_magic(mon) ? MON_UNAFFECTED : MON_RESIST;
}
if (beam.flavour == BEAM_PAIN) /* pain/agony */
{
if (mons_res_negative_energy( mon ))
return (MON_UNAFFECTED);
if (beam.name.find("agony") != std::string::npos)
{
// AGONY
mon->hit_points = mon->hit_points / 2;
if (mon->hit_points < 1)
mon->hit_points = 1;
}
else
{
// PAIN
hurt_monster( mon, roll_dice( beam.damage ) );
}
death_check = true;
}
if (beam.name.find("agony") != std::string::npos) // agony
mon->hit_points = std::max(mon->hit_points/2, 1);
else // pain
mon->hurt(beam.agent(), beam.damage.roll(), beam.flavour);
return (MON_AFFECTED);
hurt_monster( mon, roll_dice( beam.damage ) );
death_check = true;
}
if (beam.flavour == BEAM_SLEEP)
{
if (mon->has_ench(ENCH_SLEEP_WARY)) // slept recently
return (MON_RESIST);
if (mons_holiness(mon) != MH_NATURAL) // no unnatural
return (MON_UNAFFECTED);
// Cold res monsters resist hibernation (for consistency
// with mass sleep).
if (mons_res_cold(mon) > 0)
return (MON_UNAFFECTED);
mon->hurt(beam.agent(), beam.damage.roll(), beam.flavour);
return (MON_AFFECTED);
case BEAM_SLEEP:
if (mon->hit_points < 1)
_monster_die(mon, beam);
else
{
print_wounds(mon);
if (mons_is_mimic( mon->type ))
mimic_alert(mon);
}
actor* bolt::agent() const
{
if (YOU_KILL(this->thrower))
return (&you);
else if (this->beam_source != NON_MONSTER)
return (&menv[this->beam_source]);
else
return (NULL);
}
bool bolt::is_enchantment() const
{
return (this->flavour >= BEAM_FIRST_ENCHANTMENT
&& this->flavour <= BEAM_LAST_ENCHANTMENT);