zelgadis). Also added notes for getting penance, and small fix (patch 1786893 by dolorous).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2047 c06c8d41-db1a-0410-9941-cceddc491573
UWMN4HLG6YA2YFQEVIVMDISD6APKEPIZXMMPMNUYCBQDSAUYSXPQC
QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC
FLKXPXQ7SRFZPJPDM35D5CG6M52WP4SL32QNEZNSHGBNZYTKYGYAC
BDFIS53HAIHOCXQ5BE7WCO2MEOFCUQPFY4JGUWVLWY6JO3IFMEKQC
KYGKLJ3SYIIDSHRSFQUZCDHUIFU7D7EB6QIPIWGCWIAWZCLLUAIAC
ANOEQTM6IGCBTESKKQ5PCBSDTZ7VGRCMDIOAFEH4R7DJHKWKDFAAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
LLKV4OYGEDB4GVJS5JVBZP5JQFW7VMPZ2CBRSITJ5XCFS3QNWIBQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
SOGYI2OBNZHL6HZN3ZJR5ITQHTYITILKR4D4EZPKBO23UYZW3JQAC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
P52QVYEFQXNK6IXNN2EMZIBLOIHHGQ7LODWIGWPJLANGVIPQK5IAC
XPCGZBHHSL6MB3ORMUJI64BAERU6AZTIY6RK56BBW7SNB3IK24IAC
EIULXYQC3OPXDGTBRDOI7ITILQ22RGEGG6UFCGY2O5HD7SN5NUUQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
43ZTEB57FU7KE5EVMYWZONNVJBZCGF3JEAJZIY25LC4LGE65PG5QC
R325RPUV26YH65VIJKYEFZ2XCVXQHO5N3ELPX6RNQ5TSI3JJNQGQC
ZP2KE7A2LE7Z2S7AC45WE4CXDSEVDTWIMV2EM4IBUKXYJIDU6R7QC
UDYVF65OZSNPANLHDI3ODBEGUAKAVZ4KH4OZFAKR2CQJPO4AXU6QC
45CWQUPQHKUFUJ4MVL5K3KCVCCKLY2Z7RZWZ53UT723RV5STPSRAC
MRM4SLSXJTRYJPH2YYTAFTO2CAOXLP2OCMRNYRTIRRYOMWM7NMFAC
CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
XYJ5Y635KCRCTL2BFPP53NWQRK3NUHS6T3ARPIXV5A3CHWBW7VCQC
bool i_feel_safe(bool announce)
bool mons_is_safe(const struct monsters *mon, bool want_move)
{
bool is_safe = mons_friendly(mon) ||
(Options.safe_zero_exp &&
mons_class_flag( mon->type, M_NO_EXP_GAIN ));
#ifdef CLUA_BINDINGS
bool moving = ((!you.delay_queue.empty() &&
is_run_delay(you.delay_queue.front().type) &&
you.delay_queue.front().type != DELAY_REST) ||
you.running < RMODE_NOT_RUNNING || want_move);
int dist = grid_distance(you.x_pos, you.y_pos,
mon->x, mon->y);
bool result = is_safe;
if (clua.callfn("ch_mon_is_safe", "Mbbd>b",
mon, is_safe, moving, dist,
&result))
is_safe = result;
#endif
return is_safe;
}
bool i_feel_safe(bool announce, bool want_move)
-----------------------------------------------------------------------
g_rr_monsters = { {}, {} }
g_rr_monsters_moving = { {}, {} }
function rr_add_monster(mons_table, s)
local parts = crawl.split(s, ":")
if #parts ~= 2 then
return
end
local regexp = parts[1]
local dist = tonumber(parts[2])
if dist == 0 then
return
end
table.insert( mons_table[1], crawl.regex( regexp ) )
table.insert( mons_table[2], dist )
end
function rr_add_monsters(key, value)
local mons_table
if (key == "runrest_ignore_monster") then
mons_table = g_rr_monsters
elseif (key == "runrest_ignore_monster_moving") then
mons_table = g_rr_monsters_moving
else
return
end
local segs = crawl.split(value, ',')
for _, s in ipairs(segs) do
rr_add_monster(mons_table, s)
end
end
function ch_mon_is_safe(mon, default_is_safe, moving, dist)
if default_is_safe then
return true
end
local mons_table
-- If player is moving and the monster is in g_rr_monsters_moving,
-- then we do the distance comparison without decreasing the
-- distance value.
if moving then
mons_table = g_rr_monsters_moving
for i = 1, #mons_table[1] do
local m = mons_table[1][i]
local min_dist = mons_table[2][i]
if m:matches(mon.name) then
return min_dist <= dist
end
end
end
mons_table = g_rr_monsters
-- Reduce distance by 1 if moving, since the safety check is
-- done *before* moving closer to the monster
if moving then
dist = dist - 1
end
for i = 1, #mons_table[1] do
local m = mons_table[1][i]
local min_dist = mons_table[2][i]
if m:matches(mon.name) then
return min_dist <= dist
end
end
return false
end
chk_lua_option.runrest_ignore_monster = rr_add_monsters
chk_lua_option.runrest_ignore_monster_moving = rr_add_monsters
std::string text = get_monster_desc(mon, false);
text += " comes into view.";
print_formatted_paragraph(text, get_number_of_cols(), MSGCH_WARN);
// Only say "comes into view" if the monster wasn't in view
// during the previous turn.
if (testbits(mon->flags, MF_WAS_IN_VIEW))
{
switch(random2(4))
{
case 0:
mprf(MSGCH_WARN, "%s's nearness makes you nervous.",
mon->name(DESC_CAP_THE).c_str());
break;
case 1:
mprf(MSGCH_WARN, "%s is too close now for your liking.",
mon->name(DESC_CAP_THE).c_str());
break;
case 2:
mprf(MSGCH_WARN, "You feel that %s is too close now for comfort.",
mon->name(DESC_NOCAP_THE).c_str());
break;
default:
mprf(MSGCH_WARN, "%s's presence makes you stop your activity.",
mon->name(DESC_CAP_THE).c_str());
break;
}
}
else
{
std::string text = get_monster_desc(mon, false);
text += " comes into view.";
print_formatted_paragraph(text, get_number_of_cols(), MSGCH_WARN);
}