g_rr_ignored = { }
chk_interrupt_activity.run = function (iname, cause, extra)
if not rr_check_params() then
return false
end
if iname == 'message' then
return rr_handle_message(cause, extra)
end
if iname == 'hp_loss' then
return rr_handle_hploss(cause, extra)
end
return false
end
chk_interrupt_activity.rest = chk_interrupt_activity.run
chk_interrupt_activity.travel = chk_interrupt_activity.run
function rr_handle_message(cause, extra)
local ch, mess = rr_split_channel(cause)
for _, m in ipairs(g_rr_ignored) do
if m:matches(mess, ch) then
return nil
end
end
return false
end
function rr_split_channel(s)
local chi = string.find(s, ':')
local channel = -1
if chi and chi > 1 then
local chstr = string.sub(s, 1, chi - 1)
channel = crawl.msgch_num(chstr)
end
local sor = s
if chi then
s = string.sub(s, chi + 1, -1)
end
return channel, s
end
function rr_handle_hploss(hplost, source)
if not g_rr_yhpmin or not g_rr_hplmax or source ~= 1 then
return false
end
if hplost <= g_rr_hplmax and you.hp() >= g_rr_yhpmin then
return nil
end
return false
end
function rr_check_params()
if g_rrim ~= options.runrest_ignore_message then
g_rrim = options.runrest_ignore_message
rr_add_messages(nil, g_rrim)
end
if ( not g_rr_hplmax or not g_rr_yhpmin )
and options.runrest_ignore_poison
then
local opt = options.runrest_ignore_poison
local hpl, hpm
_, _, hpl, hpm = string.find(opt, "(%d+)%s*:%s*(%d+)")
if hpl and hpm then
g_rr_hplmax = tonumber(hpl)
g_rr_yhpmin = tonumber(hpm)
end
end
return true
end
function rr_add_message(s)
local channel, str = rr_split_channel(s)
table.insert( g_rr_ignored, crawl.message_filter( str, channel ) )
end
function rr_add_messages(key, value)
local segs = crawl.split(value, ',')
for _, s in ipairs(segs) do
rr_add_message(s)
end
end
chk_lua_option.runrest_ignore_message = rr_add_messages
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 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
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