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 crittersHT_WATER, // Water crittersHT_LAVA, // Lava crittersHT_ROCK, // Rock critters
HT_LAND = 0, // Land crittersHT_AMPHIBIOUS_LAND, // Amphibious land-preferring crittersHT_AMPHIBIOUS_WATER, // Amphibious water-preferring crittersHT_WATER, // Water crittersHT_LAVA, // Lava crittersHT_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.