lose hit points until back in water, using ENCH_AQUATIC_LAND. (Bug 2824663)
Also fix tiles compilation (patch 2824632) and add DATA_DIR_PATH to tiled icons (patch 2824635). Both patches (and some more) by Trent W. Buck.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10364 c06c8d41-db1a-0410-9941-cceddc491573
IXO5VNCDYDYI46Y5QWNJMD7TURKYO526CJA4TIMH5PDDAYHMK5YQC
YNCC74HJ2NIZJZOZHLP2A6R67LCGNIMSQXZRIVDRAK7UZOZOUN5QC
Z33GKNF7MW2XPHU6ELQK6XPEHTGVAR4R6RVZC3SPJDVQUDO4ISEAC
XOFGRJ3AHO4OL4YIYQD3UKJNY2EU4WLWCSJTEOCAUKWE764MADEAC
7L67UJPKQ6LLDUYAK4TB4BNK67TCALXNWYCPNXND52BFF7G6E2PAC
LZN527GR3AULRHWIBA537RR4WSCNNYY4XSEZ6VFF7TKGYSUSBOCAC
UU5JLKAKZSTWFQJLUTPQZJ3ZQY7BEU2KROZETUNSKC6LFG6XVSZQC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
SCXTTP2FDNB2A7F4XXGXSSOEKZQ7ODDGN5YBCTZXGZ22CLCEH3WQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
S7Y7E2KDAFMTLDIXUTR673SYL5N35VXYGLRU67L42WHVYG5SEPBQC
ZX6XMFMK46FKFKJZGLSKQM2Z6GKCBMJU2PLOWMSN2D6OXQE4VI3QC
UPA65AL4JXYLIHH4D42IWJHRTOAF2BPOVZOAKOXBLZBYIMDZDFFQC
DZD6YG52TXNI4CJ2FRGFULBH6G5MDLRVQV3X3V35AW533Z3TVBKAC
AA3I6WU2SPJUPKRIPGXCLU4EZOV4QELVVZ7EIAW3H73GES5DSFXQC
XGPPA2X3G3266EVSTXGQ7ZWYOCJ32FEYPEUJV55AI5TGFYHTYTQQC
4SWAT5KCKQV527NKELAXFQ5XA4Q5HONQXD4VBXMUZNPVPQKPCPNAC
MG2J6HQGH4DWFH3PC2SZB45NGKK5ISPBADQD24GWAZCZTDLOA33AC
2RJUPYKEDZZCW4GDG6WLEDVYF32ADC4W5I42KSKHN3MWEBCWSAHQC
DKISJVKAJJK2SVZSXGJ37K5SOVTDARVX6RPK3MAKVNGC36Z4YAZQC
TXVL24IFH5SK7EJAN7JAUHAZJHJV7GB364UU65P745GUBWJS6Q6AC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
PKENI7REL6MQ5KKGSBIOVMPJKITY6OLQRXHVD4Z6PU7HMS23XM7AC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
2UO6ZOW7UCP5XJ2TJ26PJNQABILK2BZ4J3BAKLOKMZPJDQHW24MAC
3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC
JESCEQPAFC23D6BUZMBOB4M54XT3GQZJYT7NCJ556LEUCHRER3SQC
NNG27Y5ZQAZX6UD7F7M4F6KEZBEDFXPEEC3LFUSX4ESKT7K6UJQAC
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
GZ4FB5VKL4C22KK3GSKQPLJYMRGLFXUDCOBNEBC2OKK6KVZL3OSQC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
CK7CT5TUFUL2AQY7FUHB5JI3FC2KSPWUWHXC6VEUJJ7G4OWUQFTAC
JFDTUUUT6AKIGPBKGYFC7HZKGQUZOMG7EUWU4QYKSDVXXPQBBFHAC
5WGGUYUI4QLCKZUO76C7ZFZWEIZVG7J2FMSKZOABXFHGRNLQVX7AC
SYGI2ZUUWAD7IEJ6D6SSDEK5BD7CV4Y6XS4BP7FZJJNUJIFV5IAQC
2G7MZ653N3JUHJ4DA5Q7VRO3S5T27DLPKDCJEKB6DGYSTXULUVWAC
5WVUTEZLEZEML54CKPR6GACQBYY3EMVNXMLJOREN6SSEUZGC47AQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
XYBPIU6AQ77EID4VNOMI7KQZULZI4VBZHHIGBRYO7QRJVCODEKYAC
C55G5JGGSVWMU7XVEJL6YZZLDXQZGRN7JQOAALS6WIKFPX3L2U6QC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC
23PFLB2E4QHL5SF3Q2YV5FXRH6MFHENEU2ACVC572ZCYDXCBZVQAC
OY7HY5MTXM2OO43HM2GYUS5U3MBTKDM66IALE5OXAXF2EGYVAEGQC
KZWOHH536QBWAPWROR32EOXEK5LRY6I5VHVL7HHI7GOFKCMQTCSQC
KQNMFSLV62B4ANDKTUZ7LQH2MD2NDGNCP55MKM5YAATQ4T52H2PQC
AOAJ6D3OKSELEYKAT55XCVU5LYJ7SMCZKC6DIEGLLB3TF2LEENWQC
6TAQWWURX3QF4XXV7YGJEL5VKFLFEB2HV2PGJ5ARYNNRRRNVTFUAC
32TNF7QPH765BC6VP4KVA4R2REGP6VI7CJ7QW2OOGP66Y7CUNQWQC
J44YLLLSMPKEY3IXV3CPOM257PQZW45A4QWSSBYVFXS5T5XGQQWAC
PAYI4UTJCR3XZSFOX5L35EURHRXQ6STO4Z7AQ3525QPNL3QYLNBAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
// Pop submerged status (this may be a little too nice
// because it will affect trapdoor spiders, not just fish).
if (monster_vic)
monster_vic->del_ench(ENCH_SUBMERGED);
// Pop submerged status.
if (mons && mons_habitat(mons) == HT_WATER)
{
mons->del_ench(ENCH_SUBMERGED);
if (ftype == DNGN_FLOOR)
mons->add_ench(mon_enchant(ENCH_AQUATIC_LAND, 0, KC_YOU));
}
}
// If a water monster is currently flopping around on land, it cannot
// really control where it wants to move, though there's a 50% chance
// of flopping into an adjacent water grid.
if (monster->has_ench(ENCH_AQUATIC_LAND))
{
std::vector<coord_def> adj_water;
std::vector<coord_def> adj_move;
for (adjacent_iterator ai(monster->pos()); ai; ++ai)
{
if (!grid_is_solid(*ai))
{
adj_move.push_back(*ai);
if (grid_is_watery(grd(*ai)))
adj_water.push_back(*ai);
}
}
if (adj_move.empty())
{
simple_monster_message(monster, " flops around on dry land!");
return (false);
}
std::vector<coord_def> moves = adj_water;
if (adj_water.empty() || coinflip())
moves = adj_move;
coord_def newpos = monster->pos();
int count = 0;
for (unsigned int i = 0; i < moves.size(); ++i)
if (one_chance_in(++count))
newpos = moves[i];
const monsters *mon2 = monster_at(newpos);
if (newpos == you.pos() && mons_wont_attack(monster)
|| (mon2 && mons_wont_attack(monster) == mons_wont_attack(mon2)))
{
simple_monster_message(monster, " flops around on dry land!");
return (false);
}
return _do_move_monster(monster, newpos - monster->pos());
break;
case ENCH_AQUATIC_LAND:
// Aquatic monsters lose hit points every turn they spend on dry land.
ASSERT(mons_habitat(this) == HT_WATER
&& !grid_is_watery( grd(pos()) ));
// Zombies don't take damage from flopping about on land.
if (mons_is_zombified(this))
break;
// We don't have a reasonable agent to give.
// Don't clean up the monster in order to credit properly.
hurt(NULL, 1 + random2(5), BEAM_NONE, false);
// Credit the kill.
if (hit_points < 1)
{
monster_die(this, me.killer(), me.kill_agent());
break;
}
// monsters stepping on traps:
if (alive() && has_ench(ENCH_AQUATIC_LAND))
{
if (!grid_is_watery( grd(pos()) ))
simple_monster_message(this, " flops around on dry land!");
else if (!grid_is_watery( grd(oldpos) ))
{
simple_monster_message(this, " dives back into the water!");
del_ench(ENCH_AQUATIC_LAND);
}
}
// Monsters stepping on traps: