monsters to submerge if it's a cloud tpye the monster wants to avoid, rather than always for all cloud types, and prevent lurking monsters from unsubmerging if it would expose them to a cloud type they want to avoid.
Monsters submerging now consume some energy, except for air elementals and vapours submerging into the air.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7531 c06c8d41-db1a-0410-9941-cceddc491573
LG7XJWUXOV4ZBMOTZX7R5NUC5IONVNCF5O42M4QVYLHNZ62AV25AC
2UO6ZOW7UCP5XJ2TJ26PJNQABILK2BZ4J3BAKLOKMZPJDQHW24MAC
4C4D3H4E5MDQ3KT5CWXN5K6H4FVT567PN66GAAHHIWVROHZWG5CQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
Y5YQ2AXS6XTWCHEQFDXRYU2IDQTBW7WXNJFES22GSKYQ2JGZ3U5AC
CG4TL4AKSN4J7CMATZFJ5N7PSDCQXLS3QYX7PZ3K67KMMBT675OQC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
URFOQPK5U6ANCKMHK2R2BYIITZZESHYUNBAEI3WNJCYO7Q66WHNQC
ZDKKOOQAQW2HDRQKTSSYDB4P5PNGTG7XEOZUORFNUPG7PQ3KQ6QAC
542UIZKI65UDRNEMGFFDBWYD5XC7AYLTZ3JZQRR2GHYJALD3YY6QC
AV3TMWHWB3XBXQCT34UPMZBSIIKVXIGWQPNEFU4CZSBS3ZOF2CUQC
3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC
PM65H4V4GNPVIJFUQW57DC3VDB7TRUUNXKVZONQKEFZSK3AXX5GQC
ZNGET7722J4PJXQM7IISUIIUFGB6D7WBD4IXR4QQENHERHXOG7KQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC
LTX72QGIPNUGWQN5ULPOMFCOPZTK7472DQY4AYX5WM3WHSUVXI5QC
BLN5LDH5NRRJPBY77A36Q4THEY75N42MVCJMZRUZ2D5YSXTDL4HQC
}
static bool _mons_avoids_cloud(const monsters *monster, cloud_type cl_type)
{
switch (cl_type)
{
case CLOUD_MIASMA:
// Even the dumbest monsters will avoid miasma if they can.
return (mons_res_miasma(monster) <= 0);
case CLOUD_FIRE:
if (mons_res_fire(monster) > 1)
return (false);
if (monster->hit_points >= 15 + random2avg(46, 5))
return (false);
break;
case CLOUD_STINK:
if (mons_res_poison(monster) > 0)
return (false);
if (x_chance_in_y(monster->hit_dice - 1, 5))
return (false);
if (monster->hit_points >= random2avg(19, 2))
return (false);
break;
case CLOUD_COLD:
if (mons_res_cold(monster) > 1)
return (false);
if (monster->hit_points >= 15 + random2avg(46, 5))
return (false);
break;
case CLOUD_POISON:
if (mons_res_poison(monster) > 0)
return (false);
if (monster->hit_points >= random2avg(37, 4))
return (false);
break;
case CLOUD_GREY_SMOKE:
// This isn't harmful, but dumb critters might think so.
if (mons_intel(monster) > I_ANIMAL || coinflip())
return (false);
if (mons_res_fire(monster) > 0)
return (false);
if (monster->hit_points >= random2avg(19, 2))
return (false);
break;
default:
break;
}
// Exceedingly dumb creatures will wander into harmful clouds.
if (is_harmless_cloud(cl_type) || mons_intel(monster) == I_PLANT)
return (false);
// If we get here, the cloud is potentially harmful.
return (true);
monster->speed_increment -= entry->energy_usage.swim;
break;
}
if (mons_is_submerged(monster))
{
monster->speed_increment -= entry->energy_usage.swim;
break;
}
if (monster->type == -1)
{
monster->speed_increment -= entry->energy_usage.move;
break; // problem with vortices
if (monster->type == -1)
{
monster->speed_increment -= entry->energy_usage.move;
break; // problem with vortices
}
switch (targ_cloud_type)
{
case CLOUD_MIASMA:
// Even the dumbest monsters will avoid miasma if they can.
return (mons_res_miasma(monster) > 0);
case CLOUD_FIRE:
if (mons_res_fire(monster) > 1)
return (true);
if (monster->hit_points >= 15 + random2avg(46, 5))
return (true);
break;
case CLOUD_STINK:
if (mons_res_poison(monster) > 0)
return (true);
if (x_chance_in_y(monster->hit_dice - 1, 5))
return (true);
if (monster->hit_points >= random2avg(19, 2))
return (true);
break;
case CLOUD_COLD:
if (mons_res_cold(monster) > 1)
return (true);
if (monster->hit_points >= 15 + random2avg(46, 5))
return (true);
break;
case CLOUD_POISON:
if (mons_res_poison(monster) > 0)
return (true);
if (monster->hit_points >= random2avg(37, 4))
return (true);
break;
case CLOUD_GREY_SMOKE:
// This isn't harmful, but dumb critters might think so.
if (mons_intel(monster) > I_ANIMAL || coinflip())
return (true);
if (mons_res_fire(monster) > 0)
return (true);
if (monster->hit_points >= random2avg(19, 2))
return (true);
break;
default:
return (true); // harmless clouds
}
// If we get here, the cloud is potentially harmful.
// Exceedingly dumb creatures will still wander in.
if (mons_intel(monster) != I_PLANT)
return (false);
return !_mons_avoids_cloud(monster, targ_cloud_type);