Allow monsters (including player ghosts) to use fire storm and ice storm, give Lom Lobon ice storm and Cerebov fire storm. Lom Lobon also gets conjure ball lightning.
Mnoleg gets Summon Horrible Things instead of polymorph/shadow creatures.
Gloorx gets symbol of torment instead of summon demon.
Hellion hellfire burst now behaves the same way for both hellion vs player and hellion vs monster.
Merged monster vs player and m vs m handling for direct spell effects such as smiting.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6621 c06c8d41-db1a-0410-9941-cceddc491573
UAJN2CFA2QHYDHW2UFAVPPHDQFCD54RKM6V2UC4AMEDJUBBLNWIQC
K25HMGF5625EQYQENFEWILNFIBK5FAZYYURPJV6UPIPIRWW5FNXAC
XLFUVG5L5ESJZAGXKU4QQE6FUJPOQG75TWOVCBWFMD6EDIEIE3OAC
XWEI2LM5HPH3F4Y5TS7B6FWXQLERWJP2MHW36KGYW5TIAOORHYUAC
7OUAAZXWRGOXSQR5ELUZ25KQ5DMWAZBBPFIIZNSEXTTANSJKONLAC
ZM4MC3B3VK22S3VI76JIXIGFMLB4FPMQUEBNUROYF2GG5KAFLW5QC
G3BHIB4AOVZ7P4DF7RMRI2C2O6HPSJYRMYQLF2LYBFLKHN6UUIZAC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
CHO4U5JC3RNTLXVIDXXJYZMOBZJ4VXW2GVJWDOTBRKK3AJ36LDLQC
AUFEDZ4RUY32ZAXOPTZ5OX6X6GUUYJHNDEFZD4GHUBBAFOQCVPWQC
T47W6FG7GCHCFEWR6MPVLDYVYG7Y4U4F3VY3FXKJNXV5R7HH544QC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
SCXTTP2FDNB2A7F4XXGXSSOEKZQ7ODDGN5YBCTZXGZ22CLCEH3WQC
WQIEW3O4MANA2KKYRUWEZP44KHVJ4RRHEZTDXSF4EDELX66LO26QC
JBB7GZTVO3UJSPFVELSP4WPJZ5SC5LY36FJJ7WF2BJGZTVPNIV3AC
5ETBQI75XWCYG5UALQR6TKD7FCJYTCVQEN64D6OHXVOGO3QB3AKAC
WLMMF4LM4KVLTRFJCM57UYLN6DS37L6UR7TS6TA3EYDGRCQGOUIAC
SG76BPJKTQGDFNP5QFMAVR6H72FMMAYCECVGSWWSCLMAVQX7E3FQC
Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC
3RNRFLMD2X4RUFTDVITLXAP377YB6F6YMQLL3DAXSUZDZBTWSLRQC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
542UIZKI65UDRNEMGFFDBWYD5XC7AYLTZ3JZQRR2GHYJALD3YY6QC
5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
FLDIOEND63BONSOAIZ7WYAVNQLJ35O3VFY3PTVRWWYOJL4JXREHAC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
33ZMPQC6OXTESW7SRW765GRNJUEJRSYONRVZVIEUDAUEJ2PPMB4AC
6GT5JAWOIIL4SQ5MWIID6ZVO3KKQFWDQDZNVFHZ6DNK5QCBXJ4UAC
UW4XQAAAV3S2ZVBLMSK6VQG6AMYR6DRKXFP64HHBC6Z3QIUWPVXQC
JJULXW764V5C2HJKZNWQAEWB6QM5YZADD7ZCE35LYTBFEM6PMYCAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
47WMN3S37XT6E2JM5S77CNZ37SD5IZKMSHINGY3CDY4QOOS7CLXQC
KS4WBDOLZ45T5Q742JZQIRN3H7XZTYDPM4TCIAILIRO3OV7ANR2AC
EJYK3CKIEMP4NMZUCMUYLHIBE7A3LPZOU7DUON5V7CPHY7QEKLEAC
UEOAUCQN2CGVHV2EYBZL3M4QKTINCOLY4INQ4Z4NNGMRWSIIPXQAC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
CLIEHAE2PP7ZIGLLIMYCWM4FC54KBOAN5AILOLAZJ5S26GTJM4RQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
2O3C3MTT2ZBYIFGPJ4MF5R4AXBYUHOEN62KAUWFWF6JWHIIVLRNQC
DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC
NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC
7EI4HMXZ7TAWZKFZG2SXHDAX3FWFBCZLUAKOALPRFF72FS7NKVBQC
EJKHYV2Z6UPRVYUAL4WRW33GBNHYBFPMPA57HMBX2LQKXHIUO5VQC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
RBKHIKKQ5LSNWJA7ZIJ6B7HF36UA6LPZLVEWOJ3X5CUSQUOJGFZQC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
GSJA56E3ORVIBCBA6T6WU2HE4DCLJ6NZPW76O7L54N4CYPKLJOWQC
5K2ANIEXD3CPJM4XNKNPZINP2G4NT7SJBKRN62WNBUKJXFERTILQC
O7S3ILRELHICJXXTDGMF7KPPZWYHPYCNDPV2I77FZXXH4I454B4QC
M4DJQJHLPTFQNOI6S5TDLCTGNQK5SW7H5PTG5M7YWHRGWZGJ72QQC
ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC
5BPJZOGZ6VTUNTJXBTP22KIPGT5NNNSXZVW5J2BGQYBP4MTCZ3CQC
B3MFLKPJ34I2USQX7UM3SPDIFVGACB5HXYLEKT3FDULL57QOE2LAC
3EUPIYJNWOMOQBP2Z5SGSMWK453BXJD6KL2WFTR3NM565MEBYASAC
PQ5IPCENBLGCTUKM7AHXQKUCALLLAX5KAM3OQLAWFY2RDX57NYYQC
3KRKUK3HCBBZWS5MXFAMM4R5PGWWTSURBSFXEEZPRRCFAZ5EZTCAC
#if 0
// last updated 24may2000 {dlb}
/* ***********************************************************************
* called from: ability - spell
* *********************************************************************** */
char cast_greater_healing(void);
// last updated 24may2000 {dlb}
/* ***********************************************************************
* called from: ability
* *********************************************************************** */
char cast_greatest_healing(void);
// last updated 24may2000 {dlb}
/* ***********************************************************************
* called from: ability - spell
* *********************************************************************** */
char cast_lesser_healing(void);
#endif
fire_beam(pbolt);
if (spell_is_direct_explosion(spell_cast))
{
const actor *foe = monster->get_foe();
const bool need_more =
foe && (foe == &you || see_grid(foe->pos()));
explosion(pbolt, false, false, true, true, need_more);
}
else
fire_beam(pbolt);
// Convenience for the hapless innocent who assumes that this
// damn function does all possible setup. [ds]
if (!pbolt.target_x && !pbolt.target_y)
{
pbolt.target_x = monster->target_x;
pbolt.target_y = monster->target_y;
}
beam.is_explosion = true;
break;
case SPELL_FIRE_STORM:
setup_fire_storm(mons, power / 2, beam);
beam.foe_ratio = random_range(40, 55);
break;
case SPELL_ICE_STORM:
beam.name = "great blast of cold";
beam.colour = BLUE;
beam.range = 9 + random2(5);
beam.damage = calc_dice( 10, 18 + power / 2 );
beam.damage.num = 0; // only does explosion damage
beam.hit = 20 + power / 10; // 50: 25 100: 30
beam.ench_power = power; // used for radius
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.flavour = BEAM_ICE; // half resisted
beam.is_explosion = true;
beam.foe_ratio = random_range(40, 55);
break;
case SPELL_HELLFIRE_BURST:
beam.aux_source = "burst of hellfire";
beam.name = "hellfire";
beam.ex_size = 1;
beam.flavour = BEAM_HELLFIRE;
case DMNBM_HELLFIRE:
pbolt.aux_source = "burst of hellfire";
pbolt.name = "hellfire";
pbolt.ex_size = 1;
pbolt.flavour = BEAM_HELLFIRE;
pbolt.is_explosion = true;
pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP);
pbolt.colour = RED;
pbolt.thrower = KILL_MON_MISSILE;
pbolt.aux_source.clear();
pbolt.is_beam = false;
pbolt.is_tracer = false;
pbolt.hit = 20;
pbolt.damage = dice_def( 3, 20 );
explosion( pbolt );
break;
case DMNBM_SMITING:
mpr( "Something smites you!" );
case SPELL_SMITING:
if (mons_defender)
simple_monster_message(dynamic_cast<monsters*>(defender),
" is smitten.");
else
mpr( "Something smites you!" );
mpr("Something feeds on your intellect!");
xom_is_stimulated(50);
// lose_stat() must come last {dlb}
if (one_chance_in(3)
&& lose_stat(STAT_INTELLIGENCE, 1, source))
{
mpr("Something feeds on your intellect!");
xom_is_stimulated(50);
}
else
mpr("Something tries to feed on your intellect!");
ouch(damage_taken, pbolt.beam_source, KILLED_BY_BEAM,
pbolt.aux_source.c_str());
}
return;
} // end direct_effect()
// monster-to-monster
void mons_direct_effect(struct bolt &pbolt, int i)
{
// note the translation here - important {dlb}
int o = menv[i].foe;
monsters *monster = &menv[o];
int damage_taken = 0;
// annoy the target
behaviour_event(monster, ME_ANNOY, i);
switch (pbolt.type)
{
case DMNBM_HELLFIRE:
simple_monster_message(monster, " is engulfed in hellfire.");
pbolt.name = "hellfire";
pbolt.flavour = BEAM_LAVA;
damage_taken = 5 + random2(10) + random2(5);
damage_taken = mons_adjust_flavoured(monster, pbolt, damage_taken);
break;
case DMNBM_SMITING:
simple_monster_message(monster, " is smitten.");
pbolt.name = "smiting";
pbolt.flavour = BEAM_MISSILE;
damage_taken += 7 + random2avg(11, 2);
break;
case DMNBM_BRAIN_FEED: // Not implemented here (nor, probably, can be).
break;
case DMNBM_MUTATION:
if (mons_holiness(monster) != MH_NATURAL
|| mons_immune_magic(monster))
{
simple_monster_message(monster, " is unaffected.");
}
else if (check_mons_resist_magic( monster, pbolt.ench_power ))
simple_monster_message(monster, " resists.");
if (mdef)
mdef->hurt(source, damage_taken);
monster_polymorph(monster, RANDOM_MONSTER);
break;
}
// Apply damage and handle death, where appropriate {dlb}
if (damage_taken > 0)
{
hurt_monster(monster, damage_taken);
if (monster->hit_points < 1)
monster_die(monster, KILL_MON_MISSILE, i);
ouch(damage_taken, pbolt.beam_source, KILLED_BY_BEAM,
pbolt.aux_source.c_str());
(pbolt.is_beam) ? "beam" : "missile",
(pbolt.is_explosion) ? "*" :
(pbolt.is_big_cloud) ? "+" : "",
(pbolt.is_tracer) ? " tracer" : "",
pbolt.source_x, pbolt.source_y,
pbolt.target_x, pbolt.target_y,
pbolt.type, pbolt.colour, pbolt.flavour,
pbolt.hit, pbolt.damage.num, pbolt.damage.size,
pbolt.range);
(pbolt.is_beam) ? "beam" : "missile",
(pbolt.is_explosion) ? "*" :
(pbolt.is_big_cloud) ? "+" : "",
(pbolt.is_tracer) ? " tracer" : "",
pbolt.name.c_str(),
pbolt.source_x, pbolt.source_y,
pbolt.target_x, pbolt.target_y,
pbolt.type, pbolt.colour, pbolt.flavour,
pbolt.hit, pbolt.damage.num, pbolt.damage.size,
pbolt.range);
// Foe ratio for summoning greater demons & undead -- they may be
// summoned, but they're hostile and would love nothing better
// than to nuke the player and his minions.
if (mons_att_wont_attack(pbolt.attitude)
&& !mons_att_wont_attack(monster->attitude))
// If there's a specifically requested foe_ratio, honour it.
if (!pbolt.foe_ratio)
pbolt.foe_ratio = 25;
pbolt.foe_ratio = 80; // default - see mons_should_fire()
// Foe ratio for summoning greater demons & undead -- they may be
// summoned, but they're hostile and would love nothing better
// than to nuke the player and his minions.
if (mons_att_wont_attack(pbolt.attitude)
&& !mons_att_wont_attack(monster->attitude))
{
pbolt.foe_ratio = 25;
}