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);elseprint_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, // BLACKBEAM_HASTE, // BLUEBEAM_HEALING, // GREENBEAM_PARALYSIS, // CYANBEAM_CONFUSION, // RED - 30BEAM_INVISIBILITY, // MAGENTABEAM_DIGGING, // BROWNBEAM_TELEPORT, // LIGHTGREYBEAM_POLYMORPH, // DARKGREYBEAM_CHARM, // LIGHTBLUE - 35BEAM_BANISH, // LIGHTGREENBEAM_DEGENERATE, // LIGHTCYANBEAM_ENSLAVE_UNDEAD, // LIGHTREDBEAM_PAIN, // LIGHTMAGENTABEAM_DISPEL_UNDEAD, // YELLOW - 40BEAM_DISINTEGRATION, // WHITEBEAM_ENSLAVE_DEMON, // colour "16"
// EnchantmentsBEAM_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 resistbool is_energy; // mostly energy/non-physical attackbool 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 throwrc = 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 hibernatedbreak;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){// AGONYmon->hit_points = mon->hit_points / 2;if (mon->hit_points < 1)mon->hit_points = 1;}else{// PAINhurt_monster( mon, roll_dice( beam.damage ) );}
death_check = true;}
if (beam.name.find("agony") != std::string::npos) // agonymon->hit_points = std::max(mon->hit_points/2, 1);else // painmon->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 recentlyreturn (MON_RESIST);if (mons_holiness(mon) != MH_NATURAL) // no unnaturalreturn (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]);elsereturn (NULL);}bool bolt::is_enchantment() const{return (this->flavour >= BEAM_FIRST_ENCHANTMENT&& this->flavour <= BEAM_LAST_ENCHANTMENT);