water grids nearby if the player recently moved (or restarted a game) and if a non-adjacent monster tries to reach the player.
Remove now unneeded lua code (was used for the old pickup.lua) and make monsters switch away from ranged weapons when engaging you in melee. If a monster will still insist on hitting you with a sling it's a sure sign said sling is cursed (doesn't autoID, though).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5755 c06c8d41-db1a-0410-9941-cceddc491573
NWUWP5QCMJ7ZZMLCVB74PW7HDEFB6ICEQHNDHCGG7UWDQNNLGVMQC
TQ4JWVDZWJEI2GFQZSUFLKR6GTJQ6Z2QMGG44THBE4QM5UHD2T4QC
EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC
EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
75M6AVUSS3G5EJECJJRB67V5UYDOIV26FZNB2FFCMBZ33EK7FVIQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
VCG3BRIYRTNNWYC3LOXD6KFGXOX37HAFW2HNV7WXVG2V7EUHLDZQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
247OW5JFN34ZV3GRVHRE25AXLLISUBPOX5YRGUE64BCM2V7QNEHAC
HIPFIMUOA7DFOFV3DQ55YZJVGNU2GNDYFUCB4MRPUR5DTYDO5YMAC
SKV6JBDAWUWTFECFSQARSNA3DDPUFCR7N3T7D5J35NYTEDMXLP3QC
RM2JXW3ATVYRYHF3NMG5ALGI64OJ7IP2F3MDUDPUT5TBKSSN4KVQC
DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
F2ZJ55CL3T66DFM34BQWCJNHIT4XJFCGTWTA5KESV6NHWFLTGUYAC
LH4OYDEWEON5QNUCM74R7MNBJDP7O4XRETY74ZMYSXUXYQV427PAC
SXUKGEXMGRRN6UO2GJW4HSVU5TSUNUHIHBMMF7CAG7QMLKZYWTKQC
PM65H4V4GNPVIJFUQW57DC3VDB7TRUUNXKVZONQKEFZSK3AXX5GQC
3V52MSSK7QX7FWLLUW63DTWCBAJEK674EFZLKP45FLZ5KZKVARHAC
ISSEUTHG7EH3QTFLS23GXFIOQXCI5HJPJMK6GWNFMC6NDRD2H34QC
WMHFDQKUDCUGM3R245LLVZ5NNEZSCXFDSTNMVS2O5EFUHHO7HU3AC
CG4TL4AKSN4J7CMATZFJ5N7PSDCQXLS3QYX7PZ3K67KMMBT675OQC
UH3CJQMQ3NPICXD34NTCTUZJWOCEF4P5XEGXFLLNDDFLZK7QPUBQC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
4GYZYBY7FFORRNPIEFTV4ZM2C7Z6D2KTQOM537ZCC2YBXT2TNSHAC
KX23OEQBBLMQHTFCA4TYYEGLHCETXVZCXALYR5U5RELKJMMB66SAC
QUFPPRIIRXHUFEDH3EFES7CSHTA7GG2DAXTRHUAUQBYMSWK4BP6AC
JK3HFJG76OOQHJMXJUSZRTR5CX5ZMS52LRVBLOR7E2NBI6PRSHHAC
Z42PAEBKCSMEQ5ALBM25HERM3QDIUWMQTQODJOPRVOJAEGIWU3UAC
M2HMYLYYXSP5XGX6MCI77IT6UW5K4YSEUJWHPQPYXVSW5L36BJ2AC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
QRD2M37AMG76CPGCALZQ3N2PZ3OZ3MFETMVAEHBJJVVH2BCPVGUAC
BIZDHHK5LIO57S5AKHEPJFLWV5DAFKZIKYBGOUNGICSWTX7DCXKAC
EIJQB5HNBFGK6MQ7OOM6TC3BKONFXF3CIDM7HTL7VKE44ZM6ACJQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
43ZTEB57FU7KE5EVMYWZONNVJBZCGF3JEAJZIY25LC4LGE65PG5QC
P25D567E2UEAQHNI7LAZPNY7KAI3J4OE77YKLWOIEEALC5RREJHAC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
const int xmarg =
Options.scroll_margin_x + LOS_RADIUS <= viewhalfsz.x
? Options.scroll_margin_x
: viewhalfsz.x - LOS_RADIUS;
const int ymarg =
Options.scroll_margin_y + LOS_RADIUS <= viewhalfsz.y
? Options.scroll_margin_y
: viewhalfsz.y - LOS_RADIUS;
const int xmarg = Options.scroll_margin_x + LOS_RADIUS <= viewhalfsz.x
? Options.scroll_margin_x
: viewhalfsz.x - LOS_RADIUS;
const int ymarg = Options.scroll_margin_y + LOS_RADIUS <= viewhalfsz.y
? Options.scroll_margin_y
: viewhalfsz.y - LOS_RADIUS;
// Check all grids in LoS and mark lava and/or water as seen if the
// appropriate grids are encountered, so we later only need to do the
// visibility check for monsters that can't pass a feature potentially in
// the way. We don't care about shallow water as most monsters can safely
// cross that, and fire elementals alone aren't really worth the extra
// hassle. :)
static void _check_lava_water_in_sight()
{
// Check the player's vision for lava or deep water,
// to avoid unnecessary pathfinding later.
you.lava_in_sight = you.water_in_sight = 0;
coord_def gp;
for (gp.y = (you.y_pos - 8); (gp.y <= you.y_pos + 8); gp.y++)
for (gp.x = (you.x_pos - 8); (gp.x <= you.x_pos + 8); gp.x++)
{
if (!in_bounds(gp))
continue;
const coord_def ep = gp - you.pos() + coord_def(9, 9);
if (env.show(ep))
{
dungeon_feature_type feat = grd[gp.x][gp.y];
if (feat == DNGN_LAVA)
{
you.lava_in_sight = 1;
if (you.water_in_sight > 0)
break;
}
else if (feat == DNGN_DEEP_WATER)
{
you.water_in_sight = 1;
if (you.lava_in_sight > 0)
break;
}
}
}
}
if (mons_flies(monster) != FL_NONE
|| habitat != HT_LAND
|| mons_amphibious(monster))
{
okmove = DNGN_MINMOVE;
}
|| (grd(newpos) == DNGN_SECRET_DOOR
&& (mons_intel(monster_index(monster)) == I_HIGH
|| mons_intel(monster_index(monster)) == I_NORMAL)))
|| grd(newpos) == DNGN_SECRET_DOOR
&& mons_intel(monster_index(monster)) >= I_NORMAL)
// Used to divide a given potion into one of four categories:
// 0 : unknown potion
// 1 : always beneficial
// 2 : always bad
// 3 : depends on species etc.
static int l_item_potion_type(lua_State *ls)
{
LUA_ITEM(item, 1);
int val = 99;
if (item && item->base_type == OBJ_POTIONS)
{
if (!item_type_known(*item))
{
val = 0;
}
else
{
switch(item->sub_type)
{
// good potions:
case POT_HEALING:
case POT_HEAL_WOUNDS:
case POT_SPEED:
case POT_MIGHT:
case POT_LEVITATION:
case POT_INVISIBILITY:
case POT_EXPERIENCE:
case POT_MAGIC:
case POT_RESTORE_ABILITIES:
case POT_RESISTANCE:
val = 1;
break;
// bad potions:
case POT_POISON:
case POT_STRONG_POISON:
case POT_SLOWING:
case POT_PARALYSIS:
case POT_CONFUSION:
case POT_DEGENERATION:
case POT_DECAY:
case POT_MUTATION:
val = 2;
break;
// Need more refined handling:
// for eating habits
case POT_BLOOD:
case POT_BLOOD_COAGULATED:
case POT_WATER:
case POT_PORRIDGE:
// for undead
case POT_BERSERK_RAGE:
case POT_GAIN_STRENGTH:
case POT_GAIN_DEXTERITY:
case POT_GAIN_INTELLIGENCE:
case POT_CURE_MUTATION:
default:
val = 3;
}
}
}
lua_pushnumber(ls, val);
return (1);
}
static void _check_lava_water_in_sight()
{
// Check the player's vision for lava or deep water,
// to avoid unnecessary pathfinding later.
you.lava_in_sight = you.water_in_sight = false;
coord_def gp;
for (gp.y = (you.y_pos - 8); (gp.y <= you.y_pos + 8); gp.y++)
for (gp.x = (you.x_pos - 8); (gp.x <= you.x_pos + 8); gp.x++)
{
if (!in_bounds(gp))
continue;
const coord_def ep = gp - you.pos() + coord_def(9, 9);
if (env.show(ep))
{
dungeon_feature_type feat = grd[gp.x][gp.y];
if (feat == DNGN_LAVA)
you.lava_in_sight = true;
else if (feat == DNGN_DEEP_WATER)
you.water_in_sight = true;
if (you.lava_in_sight && you.water_in_sight)
break;
}
}
}