hack.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@949 c06c8d41-db1a-0410-9941-cceddc491573
AOAJ6D3OKSELEYKAT55XCVU5LYJ7SMCZKC6DIEGLLB3TF2LEENWQC
NFOXLH722RGWYY5D63VV6SF2XEJBEOQEFQME6FSA4HZRK3CPLSRQC
QNKMXCJSGRBEPE6ZNPEXU5EQIOME6EI4DECVC56GLOBCMGWWE6MQC
RYT42Z6CED4KV5CCJ45CHZ3DQGLFMDCVH6CSQZNXOILULDG4MXVQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
SE6T5ILU7BD6ICIOP7BTIQIBNBDEJX3J5OBO7Z2DZA336ETTHYJAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
}
// Give the monster its action energy (aka speed_increment).
static void monster_add_energy(monsters *monster)
{
int energy_gained = (monster->speed * you.time_taken) / 10;
// Slow monsters might get 0 here. Maybe we should factor in
// *how* slow it is...but a 10-to-1 move ratio seems more than
// enough.
if ( energy_gained == 0 && monster->speed != 0 )
energy_gained = 1;
monster->speed_increment += energy_gained;
if (you.slow > 0)
monster->speed_increment += energy_gained;
}
// Do natural regeneration for monster.
static void monster_regenerate(monsters *monster)
{
// regenerate:
if (monster_descriptor(monster->type, MDSC_REGENERATES)
|| (monster->type == MONS_FIRE_ELEMENTAL
&& (grd[monster->x][monster->y] == DNGN_LAVA
|| env.cgrid[monster->x][monster->y] == CLOUD_FIRE
|| env.cgrid[monster->x][monster->y] == CLOUD_FIRE_MON))
|| (monster->type == MONS_WATER_ELEMENTAL
&& (grd[monster->x][monster->y] == DNGN_SHALLOW_WATER
|| grd[monster->x][monster->y] == DNGN_DEEP_WATER))
|| (monster->type == MONS_AIR_ELEMENTAL
&& env.cgrid[monster->x][monster->y] == EMPTY_CLOUD
&& one_chance_in(3))
|| one_chance_in(25))
{
heal_monster(monster, 1, false);
}
int energy_gained = (monster->speed * you.time_taken) / 10;
// Slow monsters might get 0 here. Maybe we should factor in
// *how* slow it is...but a 10-to-1 move ratio seems more than
// enough.
if ( energy_gained == 0 && monster->speed != 0 )
energy_gained = 1;
monster->speed_increment += energy_gained;
if (you.slow > 0)
{
monster->speed_increment += energy_gained;
}
monster_add_energy(monster);
// regenerate:
if (monster_descriptor(monster->type, MDSC_REGENERATES)
|| (monster->type == MONS_FIRE_ELEMENTAL
&& (grd[monster->x][monster->y] == DNGN_LAVA
|| env.cgrid[monster->x][monster->y] == CLOUD_FIRE
|| env.cgrid[monster->x][monster->y] == CLOUD_FIRE_MON))
|| (monster->type == MONS_WATER_ELEMENTAL
&& (grd[monster->x][monster->y] == DNGN_SHALLOW_WATER
|| grd[monster->x][monster->y] == DNGN_DEEP_WATER))
|| (monster->type == MONS_AIR_ELEMENTAL
&& env.cgrid[monster->x][monster->y] == EMPTY_CLOUD
&& one_chance_in(3))
|| one_chance_in(25))
{
heal_monster(monster, 1, false);
}
monster->speed_increment = 0;
if (simple_monster_message(monster, " suddenly stops moving!"))
pbolt.obvious_effect = true;
if (grd[monster->x][monster->y] == DNGN_LAVA
|| grid_is_water(grd[monster->x][monster->y]))
{
if (mons_flies(monster) == 1)
{
// don't worry about invisibility - you should be able to
// see if something has fallen into the lava
if (is_near)
mprf("%s falls into the %s!",
ptr_monam(monster, DESC_CAP_THE),
(grd[monster->x][monster->y] == DNGN_LAVA) ? "lava" :
"water");
switch (pbolt.thrower)
{
case KILL_YOU:
case KILL_YOU_MISSILE:
monster_die(monster, KILL_YOU, pbolt.beam_source);
break; /* " " */
case KILL_MON:
case KILL_MON_MISSILE:
monster_die(monster, KILL_MON_MISSILE, pbolt.beam_source);
break; /* dragon breath &c */
}
}
}
beam_paralyses_monster(pbolt, monster);
strncpy( buff, ptr_monam( monster, DESC_CAP_THE ), sizeof(buff) );
if (mons_add_ench(monster, ENCH_INVIS))
{
const std::string monster_name = ptr_monam(monster, DESC_CAP_THE);
if (!mons_has_ench(monster, ENCH_INVIS)
&& mons_add_ench(monster, ENCH_INVIS))
}
static void beam_paralyses_monster(bolt &pbolt, monsters *monster)
{
if (!mons_has_ench(monster, ENCH_PARALYSIS)
&& mons_add_ench(monster, ENCH_PARALYSIS))
{
if (simple_monster_message(monster, " suddenly stops moving!"))
pbolt.obvious_effect = true;
const int grid = grd(monster->pos());
if (grid == DNGN_LAVA || grid_is_water(grid))
{
if (mons_flies(monster) == 1)
{
// don't worry about invisibility - you should be able to
// see if something has fallen into the lava
if (mons_near(monster))
mprf("%s falls into the %s!",
ptr_monam(monster, DESC_CAP_THE),
(grid == DNGN_LAVA ? "lava" : "water"));
monster_die(monster, pbolt);
}
}
}
int bolt::killer() const
{
if (flavour == BEAM_BANISH)
return (KILL_RESET);
switch (thrower)
{
case KILL_YOU:
case KILL_YOU_MISSILE:
return (flavour == BEAM_PARALYSIS? KILL_YOU : KILL_YOU_MISSILE);
case KILL_MON:
case KILL_MON_MISSILE:
return (KILL_MON_MISSILE);
default:
return (KILL_MON_MISSILE);
}
}