careful checks for habitat were ignored (default is HT_LAND) because the base type for undead wasn't chosen until after the position. I now added another habitat check during the base type selection loop and now everything works. :)
Add a warning inscription !D that ignores such items during actions like sacrificing items, destroying weapons (Ely), burning books (Trog) or casting sticks to snakes. The failure messages are very clumsy now, but they do get the point across, I hope.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5472 c06c8d41-db1a-0410-9941-cceddc491573
MDFQRJ6QZNFUBVSFWLXUJ6EBXOU47T3CVDI2XKBGNNRF4DXDKESQC
RGE3P266JGL6TUMCAMIJB3AIVU5GSQGIH43ZITKXF5WCCXLHKKVQC
EVDZD4MDODICQF3ZEN3EVR3IKQHN7O2GWIHYIZZZXBBXQIY3UPOQC
ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC
VIHJ3Z75JN7BXWNOPWV3CWQZEA7K5DK36EKHCYMZC7SOSJYH2XHQC
4LNIHTHZTCOEZEHZ4GW6WCZH4UCDWKK5UVUKEDODEBBS4YH2KONQC
R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC
PDOFPXD2X6VI23AHKCGQ5RVDBG74CNP2E3YOHKXLOARHHBXEK3HQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC
WZNB427K3EUNV3FMVXLQTM4UIHER4FIKQXWLUUXRNQC3OQ33VQYAC
V4F3SDV2H4HBH6G6W5M3REN3BDSSE4IDF2RNM7PJMKRW3IDJ7PNAC
KYVZGUJXV23ELA4CKPVQZO3NTJCODXMCWYAZJYWVWJVLPETNHLGQC
LZUTEJNAVTXSZJX35HC4VIHNIHPCJ7WNQUNWB2SUE6IY7A5HAC7AC
XDHIIBQZLHLXAHIPJMXWH3FJ2X5PO7IB7HXQMVZDWM5JZFAG3HAQC
FS4MVTH4EEEECLEAO2FTNK5CLF2PHFYO2JZHC2YEOKYLWXRDRU6AC
C7Q5QY7S5TTMJ3XO2SIO3FY5ZENWYYETS4NKEKCAJMENEHJC6Y2AC
WXZQJUZXMYS7R6ORNB7DWE5KEUXT262GXWMRPOJYYB4I3BFGYLLAC
P2OYYNPHIBGOLT4CRLNTTIXDN34EU2QCMFQJNLAMUAHQXZTEDPXQC
E42EFZ3RINKLTGOJJZAH2N5QF3P4S5NCO5T52HLXJRMBPP463HTAC
KC4WE63EQMVI6QBPDO3EAEPMFLAOS7H5WUAFL7JPRIE3V7CR333AC
UKN6HTZXDUUOWKNWNKWPHKGUGL474JIAQN5JU3DM3DU26WGMNP4AC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
JD3FMKAAAUQZSNPGFLVX7F5H5SWGUSYOFZU4X5W4XYNV6HUKDBKAC
TZ55IZNANEJO2WDTKYWVLY2W2VV6BR7WKIN7XLNISAMMFT6LG2WQC
3V52MSSK7QX7FWLLUW63DTWCBAJEK674EFZLKP45FLZ5KZKVARHAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
TPZWAV3USKO7RX4IGHLZKVPRN36K33PJPSZYL6FZMX4XBHTYOQYAC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
BRNMISYGZGT3XGXA2VCDTPDDROEWX6O23VNEPWMHYVEQEKUVVWOQC
NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC
GLHJZ2VIFB3BMTNJ2P6E6OO26QGKSURY7X4ACAGWPSCUSUFNZRGQC
SQDS2YBPOYDDDCW3GGARBZ2HQIUHCQKL7SSHKFQWDENOL5YNNVNQC
CG4TL4AKSN4J7CMATZFJ5N7PSDCQXLS3QYX7PZ3K67KMMBT675OQC
ID373JATLMWAY526Q6Q5FXHRNFWMEOFXPHGPAUUY5OAMPFDN5SJAC
AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC
IE3INS4WUXZOBVXB5VWRBYPVPXADD2U2W5H3TBTOYNWJ3EGRSGQQC
WDEFQ6YABDQIGJXW5KT3OGR3EO6FZHXZELIRVIXQ4XDYTVOV5V6AC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
2DORUQ4B574MDOOMRYWGU5I72AKHMCSTZ6B3VSHQBUQOZYHRC7FAC
RX6575DZOHRUXQUZH34YZGPZJF4STUPLBQDIVTINA2L6LVCKRIGQC
LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
6GSPAIEMWJXYSCR5EC2WBOGYDEDR6ESIZC6TKN2FVE2CVPSHUHXAC
AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC
ISSEUTHG7EH3QTFLS23GXFIOQXCI5HJPJMK6GWNFMC6NDRD2H34QC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
LWVP2PEWXDDSVOYQDOMHBW267KDDT6FS7ZN7IZUYRENTSSZMVIUQC
VJMZ3UWE4TY2RPKX32HI2K6OAZJKULKWJISAOTU2W5UHKUJ463NQC
5P6MEKBISK6NI4MULM75HHFBQW5MXITSZJDGLLIDKJ7G24F7XYNAC
MO63IVZZMRHBHHH5BTVC7YHHZ4AZIRJ7BMPPTVBCNJ67TMGJWQUAC
QGVAXJZXG2HUCLELWAN6LJJOBSP2BS6TIZMPJTDOAGI2E2SUCOCQC
E3X5HVN5UN75OMTJA6JFQBNZ54P37NDZLZZF7EFBZZC45KR73YGAC
P25D567E2UEAQHNI7LAZPNY7KAI3J4OE77YKLWOIEEALC5RREJHAC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
37U62WZZUVEKYMTBNX57ZUUFXHGH5EWS4CGHQO4QXGJIJU4RLBPAC
BRCSZ3GW5VFJW2OGZSUVYJTOOS4NGEX63DNFBJYEILHSCLAA4C4QC
UFGBNLXSCQWIKCFRAPQNAMQOW3KGAIFXSNQ26PH5CXGF3DXXJ4SQC
// burn only squares in sight
if (!see_grid(xpos, ypos))
continue;
// If a grid is blocked, books lying there will be ignored.
// Allow bombing of monsters.
const int cloud = env.cgrid[xpos][ypos];
if (grid_is_solid(grd[ xpos ][ ypos ])
|| cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_FIRE)
{
continue;
}
// if a grid is blocked, books lying there will be ignored
// allow bombing of monsters
const int cloud = env.cgrid[xpos][ypos];
if (grid_is_solid(grd[ xpos ][ ypos ]) ||
// mgrd[ xpos ][ ypos ] != NON_MONSTER ||
(cloud != EMPTY_CLOUD && env.cloud[cloud].type != CLOUD_FIRE))
{
continue;
}
int count = 0;
int rarity = 0;
i = igrd[xpos][ypos];
while (i != NON_ITEM)
{
const int next = mitm[i].link; // in case we can't get it later
int count = 0;
int rarity = 0;
i = igrd[xpos][ypos];
while (i != NON_ITEM)
{
const int next = mitm[i].link; // in case we can't get it later.
if (mitm[i].base_type != OBJ_BOOKS
|| mitm[i].sub_type == BOOK_MANUAL
|| mitm[i].sub_type == BOOK_DESTRUCTION)
{
i = next;
continue;
}
if (mitm[i].base_type != OBJ_BOOKS
|| mitm[i].sub_type == BOOK_MANUAL
|| mitm[i].sub_type == BOOK_DESTRUCTION)
{
i = next;
continue;
}
// Ignore {!D} inscribed books.
if (!check_warning_inscriptions(mitm[i], OPER_DESTROY))
{
mpr("Won't ignite {!D} inscribed book.");
i = next;
continue;
}
if ( _is_risky_sacrifice(item)
|| item.inscription.find("=p") != std::string::npos)
// Ignore {!D} inscribed items.
if (!check_warning_inscriptions(item, OPER_DESTROY))
{
mpr("Won't sacrifice {!D} inscribed item.");
i = next;
continue;
}
if (_is_risky_sacrifice(item)
|| item.inscription.find("=p") != std::string::npos)
static monster_type resolve_monster_type(monster_type mon_type,
proximity_type proximity,
monster_type base_type,
coord_def &pos,
unsigned mmask,
dungeon_char_type *stair_type,
int *lev_mons)
static monster_type _resolve_monster_type(monster_type mon_type,
proximity_type proximity,
monster_type base_type,
coord_def &pos,
unsigned mmask,
dungeon_char_type *stair_type,
int *lev_mons)
// Let's recheck these even for PROX_NEAR_STAIRS, just in case
// occupied?
// Let's recheck these even for PROX_NEAR_STAIRS, just in case.
// Occupied?
// setting attitude will always make the
// monster wander.. if you want sleeping
// hostiles, use BEH_SLEEP since the default
// Setting attitude will always make the monster wander...
// If you want sleeping hostiles, use BEH_SLEEP since the default
!D prompt before performing an action that might destroy this item
If you're attempting to destroy an item thus inscribed by
sacrificing it, destroying a weapon, or burning a book in the
name of various deities, the game won't even ask you for
confirmation but silently ignore this item. It also protects
against accidentally casting Sticks to Snakes on your favourite
weapon. Won't protect against lava accidents or hungry jellies.