replace it with two new habitats: HT_AMPHIBIOUS_LAND and HT_AMPHIBIOUS_WATER, to indicate which habitat a monster prefers. This effectively gives amphibious monsters primary and secondary habitats; check both when trying to place such monsters. With these changes, merfolk can be placed on land properly (via wizard mode's &M) when no water is around. The one monster that can move through rock is affected as well: rock is its primary habitat, while land is its secondary one.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7142 c06c8d41-db1a-0410-9941-cceddc491573
JFDTUUUT6AKIGPBKGYFC7HZKGQUZOMG7EUWU4QYKSDVXXPQBBFHAC
I2UIX4LBENTAJRYGJ7RPDYKODNKTOV2SUXIQ7YHLUWKUR5P3K7GAC
LOLAFYU5JORDOHWN3NVKUS7HJQKG2NXADPPVLER3NSW6WX4VUJOAC
BWKYSN365TJINNF346TS7YKUK56OQEQ4ZWZBTJKADZOBBOHDTU3AC
H4VCSFXOHBCHQOV2WCZRXP77MINVI53WYU2JLXFCQKOUTGIZLGUQC
3RSGUIHINKZQ467SKRG23I7G56OV7NLS72S7FHXTZEGGL2T64UMAC
W4NSRSRRGLNYFSAHRXGXXZSQ4XCNFSDCPZOYJPDPIXYOXHUBWWPQC
IBITKTCFECTUF6E6WMQVWXQT5Z52O5B4IZBWOLP5DWXGUHGC62AQC
MHI3OM6VJY6LZUD577O22XREHPOPMWDVR3UT2JWGFDAKD7SO6Y3QC
5WGGUYUI4QLCKZUO76C7ZFZWEIZVG7J2FMSKZOABXFHGRNLQVX7AC
O7OBYGSZTPWMK3EADTZWXQ6VAEMMFEK2I4MXTCMOQJKVJMLYEB5AC
YKVVFNKT2M5WG2KBURRTOJG23BJVI6WUBP5JOGYPHQBS4RNGFGWQC
22ORIULMB2NHLFZNJFK2AF275Q6XBKOBE4ZRMOADY64VK5FAUUSQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
UCEAWJ4I6AEFR64SSUFQSX6Q62JGLMJQ5BOO5MQSV3XIE7KAS6CQC
SXUKGEXMGRRN6UO2GJW4HSVU5TSUNUHIHBMMF7CAG7QMLKZYWTKQC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
NWUWP5QCMJ7ZZMLCVB74PW7HDEFB6ICEQHNDHCGG7UWDQNNLGVMQC
WMHFDQKUDCUGM3R245LLVZ5NNEZSCXFDSTNMVS2O5EFUHHO7HU3AC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
7AREIGBWRJPQI7N7UMSXYWGOI5D6OFUKX656PX3GOZVY3ALY75BAC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
KWKVXUJSWKBWPRXD6JVI6K4YHHHNRO525VHPPDQ52XCGQRUHVXQAC
PM65H4V4GNPVIJFUQW57DC3VDB7TRUUNXKVZONQKEFZSK3AXX5GQC
F7Q5PX44SLPANIZXCY67TG2W5JTRVJMHGQW54VJLGB4XRH7R6JBQC
NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC
SQDS2YBPOYDDDCW3GGARBZ2HQIUHCQKL7SSHKFQWDENOL5YNNVNQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
AS2IQQJNNCEQNXXKTGYHLB7RO3ZKCF4F7GK6FJH66BOOKDDRGNIQC
MDFQRJ6QZNFUBVSFWLXUJ6EBXOU47T3CVDI2XKBGNNRF4DXDKESQC
CG4TL4AKSN4J7CMATZFJ5N7PSDCQXLS3QYX7PZ3K67KMMBT675OQC
5DIBLX3RXK752JKG2BQQM76GYEOMQ5E2YKTLROH3QQGHCVLAGRJQC
TK2DI6PDNMQWV3WGYEFTRNITLFJ6YXSEMKRDP3FIFGS4W4LSPSMQC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
22MF6OUN62WDBJR5QFNJTKU7Q5TIQ76XWCEIRBFWAZDMZUSKJGCAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
ABYG7KPBG5FZFQQB5QYJKZCEDJLQBJDBS6KAV2ZFKQU5QY4WDGWQC
SELQ6AD2GNYLGHJVONUUFDHSCMGYMMNQF5D72D7KTAYOV36T2BBAC
ISSEUTHG7EH3QTFLS23GXFIOQXCI5HJPJMK6GWNFMC6NDRD2H34QC
SJDOBXECX7F3ZPPVR7FPURE53D47PP2TFIF4SB6XPS456PZV3DQAC
VEVPRVWGRHRKBBUTO64ELK3NPZANUQI3ZZ7F23YXJQLKIORUW3HQC
OPNCHI4UGN7WBIYPAXVV2C4N22ZSWROA435FJCY5UZVXKWRYQ42QC
FLDIOEND63BONSOAIZ7WYAVNQLJ35O3VFY3PTVRWWYOJL4JXREHAC
3V52MSSK7QX7FWLLUW63DTWCBAJEK674EFZLKP45FLZ5KZKVARHAC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC
RGE3P266JGL6TUMCAMIJB3AIVU5GSQGIH43ZITKXF5WCCXLHKKVQC
6RJVKSL7RVZIZIZIC4TWIYJQ24RUSB346ODS3NYGDHUIRTC4Z5FQC
RX6575DZOHRUXQUZH34YZGPZJF4STUPLBQDIVTINA2L6LVCKRIGQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
ILOED4VB4I6VPAUTR75ZWX6MXDYXB5DO2EDK2UH67O3HNKWV23RQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
247OW5JFN34ZV3GRVHRE25AXLLISUBPOX5YRGUE64BCM2V7QNEHAC
SYGI2ZUUWAD7IEJ6D6SSDEK5BD7CV4Y6XS4BP7FZJJNUJIFV5IAQC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
ACDPN464TK2LKLHSDN3YVRHAPF7WLSLLU3UHIYEXKFDEZPEU3XSQC
VX2D7IVDD7OFX55ZVY5NKPITC3XWNJX4WSEBBTYASMXKJY5E7VBAC
ZMED4SUEZTGX762DHBTMAZYNJZDV7RFFKMELFSTCM4KZFX553H5AC
GDMMLW5HKFUFEVA7BKREZGIAHV3KAXN2I7DY55RQFHXS5NVAAZZQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
UEOAUCQN2CGVHV2EYBZL3M4QKTINCOLY4INQ4Z4NNGMRWSIIPXQAC
VQD5BW56OTUNPILMCASXZ6YZ3OQGXKQ7CSNDMNZUX72AQZXKOE3QC
BX6P2BQYNZH2FM4ADLPULHK5FCWEAVXFEUYNHYLCUTSQCOWGNWAQC
3IUPEZKGA22SJUYY6662PQHCBCBGKUAEOSXDWPCOQEJA6I42TBWAC
LSAVA5BJQO4Z2MYXVQOM4AOXTCLKDNQMOS3DZ4SDNO4LI422LA3AC
O7S3ILRELHICJXXTDGMF7KPPZWYHPYCNDPV2I77FZXXH4I454B4QC
4SWAT5KCKQV527NKELAXFQ5XA4Q5HONQXD4VBXMUZNPVPQKPCPNAC
JPBP7PZSMLAI3DCMQZ3RB5EBDFAXJLZJE5MMUHADIJE5VYEMD5KQC
5NV5FF4MDZFC5E3UQQSGX2CTESAGBSSEVCR5UIPRZRBYL6TSDGBQC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
{
return (true);
}
// Amphibious critters are happy in water or on land.
if (mons_class_amphibious(monster_class)
&& (preferred_habitat == DNGN_FLOOR
&& grid_compatible(DNGN_DEEP_WATER, actual_grid)
|| preferred_habitat == DNGN_DEEP_WATER
&& grid_compatible(DNGN_FLOOR, actual_grid)))
// Rock wall critters are native to walls but are happy on
// the floor as well.
if (preferred_habitat == DNGN_ROCK_WALL
&& grid_compatible(DNGN_FLOOR, actual_grid))
{
return (true);
}
dungeon_feature_type grid_wanted =
habitat2grid(mons_habitat_by_type(montype));
const dungeon_feature_type grid_preferred =
habitat2grid(mons_class_primary_habitat(montype));
const dungeon_feature_type grid_nonpreferred =
habitat2grid(mons_class_secondary_habitat(montype));
HT_LAND = 0, // Land critters
HT_WATER, // Water critters
HT_LAVA, // Lava critters
HT_ROCK, // Rock critters
HT_LAND = 0, // Land critters
HT_AMPHIBIOUS_LAND, // Amphibious land-preferring critters
HT_AMPHIBIOUS_WATER, // Amphibious water-preferring critters
HT_WATER, // Water critters
HT_LAVA, // Lava critters
HT_ROCK, // Rock critters
// Use mons_habitat(const monster *) wherever possible since the other
// variant does not handle zombies correctly.
habitat_type mons_habitat(const monsters *m);
habitat_type mons_habitat_by_type(int mc);
// Use mons_habitat() and mons_primary_habitat() wherever possible,
// since the class variants do not handle zombies correctly.
habitat_type mons_class_habitat(int mc);
habitat_type mons_habitat(const monsters *mon);
habitat_type mons_class_primary_habitat(int mc);
habitat_type mons_primary_habitat(const monsters *mon);
habitat_type mons_class_secondary_habitat(int mc);
habitat_type mons_secondary_habitat(const monsters *mon);
const int type = mons_is_zombified(mon) ? mons_zombie_base(mon)
: mon->type;
const int montype = mons_is_zombified(mon) ? mons_zombie_base(mon)
: mon->type;
return (mons_class_amphibious(montype));
}
bool mons_class_wall_shielded(int mc)
{
return (mons_class_habitat(mc) == HT_ROCK);
}
habitat_type mons_habitat(const monsters *m)
habitat_type mons_habitat(const monsters *mon)
{
return mons_class_habitat(mons_is_zombified(mon) ? mons_zombie_base(mon)
: mon->type);
}
habitat_type mons_class_primary_habitat(int mc)
{
habitat_type ht = mons_class_habitat(mc);
if (ht == HT_AMPHIBIOUS_LAND)
ht = HT_LAND;
else if (ht == HT_AMPHIBIOUS_WATER)
ht = HT_WATER;
return (ht);
}
habitat_type mons_primary_habitat(const monsters *mon)
{
return mons_class_primary_habitat(mons_is_zombified(mon) ? mons_zombie_base(mon)
: mon->type);
}
habitat_type mons_class_secondary_habitat(int mc)
return mons_habitat_by_type( mons_is_zombified(m) ? mons_zombie_base(m)
: m->type );
habitat_type ht = mons_class_habitat(mc);
if (ht == HT_AMPHIBIOUS_LAND)
ht = HT_WATER;
else if (ht == HT_AMPHIBIOUS_WATER || ht == HT_ROCK)
ht = HT_LAND;
return (ht);
return (monster->attitude == ATT_FRIENDLY
&& mons_intel(monster->type) >= I_NORMAL);
return mons_class_secondary_habitat(mons_is_zombified(mon) ? mons_zombie_base(mon)
: mon->type);
}
bool intelligent_ally(const monsters *mon)
{
return (mon->attitude == ATT_FRIENDLY && mons_intel(mon->type) >= I_NORMAL);
// (HT_LAND, such as hydras) and those that favour water
// (HT_WATER, such as merfolk), but that's something we
// can think about.
// (HT_AMPHIBIOUS_LAND, such as hydras) and those that
// favour water (HT_AMPHIBIOUS_WATER, such as merfolk), but
// that's something we can think about.