{----------------------------------------------------------------------------------------------webtiles pre- movecareful=AP
--WIP rc file, no promises
--"The difference between the <> and {} is when the code gets executed.
--Code {}, it is executed right away. Other Lua code is executed only
--after the entire init file is read in."
--order: {...}; read options; execute options, :... and <...> in order.
VERSION=tonumber(crawl.version("major"))
--intended for 0.26+
LAST_DEST=(VERSION<.31 and "\13" or "\9") --key to select the last destination in the goto menu. Enter or Tab
----------------------------------------------------------------------------------------------
--movekeys
--enter the move keys you use here, similar to bindkey format
--
movekeys={
["CMD_MOVE_UP_LEFT"] = "u",
["CMD_MOVE_LEFT"] = "j",
["CMD_MOVE_DOWN_LEFT"] = "m",
["CMD_MOVE_UP"] = "i",
["CMD_MOVE_DOWN"] = ",",
["CMD_MOVE_UP_RIGHT"] = "o",
["CMD_MOVE_RIGHT"] = "l",
["CMD_MOVE_DOWN_RIGHT"] = "."}
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
-- utilities
--
----------------------------------------------------------------------------------------------
function utf8char(unicode)
-- mostly cited from https://github.com/Stepets/utf8.lua/blob/master/utf8.lua
if unicode <= 0x7F then return string.char(unicode) end
if (unicode <= 0x7FF) then
local Byte0 = 0xC0 + math.floor(unicode / 0x40);
local Byte1 = 0x80 + (unicode % 0x40);
return string.char(Byte0, Byte1);
end;
if (unicode <= 0xFFFF) then
local Byte0 = 0xE0 + math.floor(unicode / 0x1000);
local Byte1 = 0x80 + (math.floor(unicode / 0x40) % 0x40);
local Byte2 = 0x80 + (unicode % 0x40);
return string.char(Byte0, Byte1, Byte2);
end;
if (unicode <= 0x10FFFF) then
local code = unicode
local Byte3= 0x80 + (code % 0x40);
code = math.floor(code / 0x40)
local Byte2= 0x80 + (code % 0x40);
code = math.floor(code / 0x40)
local Byte1= 0x80 + (code % 0x40);
code = math.floor(code / 0x40)
local Byte0= 0xF0 + code;
return string.char(Byte0, Byte1, Byte2, Byte3);
end;
error 'Unicode cannot be greater than U+10FFFF!'
end
----------------------------------------------------------------------------------------------
--get_command
--depends on utf8char
--dummy_keys_made=0
dummy_keys_made=1 --TD:modularize
function get_command(cmd,nodummy,bindkey)
--returns key combo of cmd, ready to be plugged into sendkeys
--makes dummy keys from U+10FFFF downward if it can't get the keycode, or that keycode can't be send with sendkeys
--because sendkeys is less buggy than do_commands
--use bindkey to plug into bindkey instead
local ok=true
local result=crawl.get_command(cmd)
result=result:gsub("Space",' ')
--theoretical To-Do: Reverse all special cases of keycode_to_name in https://github.com/crawl/crawl/blob/master/crawl-ref/source/macro.cc
--just add special cases in that line above as needed. Or accept adding dummy keys!
local modifier=""..(result:match("Ctrl.") and (bindkey and "^" or "\*") or "")..(result:match("Shift.") and "\/" or "")
if modifier=="\*\/" or modifier:match("\/") and bindkey then ok=false else
result=result:gsub("Ctrl.",""):gsub(".ppercase.",""):gsub("Shift.","")
--if result=="0" then
----crawl.setopt("bindkey [
--error 'error in rc function get_command, no bound key'
--end
--if result:match("Numpad") then result=result:gsub("Numpad ","100") end
if not(result==result:match("[%w%s%p]"))
and not pcall(function()
if #result==1 then
--pcall(function() result=utf8char(string.byte(result)) end)
result=utf8char(string.byte(result))
elseif result:match("%d") and not(result:match("F")) and not(result:match("%-")) then
result=utf8char(tonumber(result:match("%d+")))
else--if bindkey and result==result:match("F%d+") then --TD check if works
ok=false
end
end)
then ok=false end
end
if not ok then --make a dummy key instead
if nodummy then
error 'get_command can not get command.' --TD ask player and use crawl.getch and save result and use result next time
else
local number=1114111-dummy_keys_made
dummy_keys_made=dummy_keys_made+1
crawl.setopt("bindkey=[\\{"..tostring(number).."}] "..cmd)
return utf8char(number)
end
else
return modifier..result
end
end
----------------------------------------------------------------------------------------------------------------
--r_td
--usage: add r_run_r_td() at the very end of ready()
r_td={}
--table of functions to call in ready()
--table.insert(r_td,functionname) to run functionname() once in ready
--functionname may add itself to r_td to be run next time again
--r_td is empty by the time the loop through the functions is running
--r_td[functionname]=n can be used to remember how often the function was added, for example.
--only the ipairs sequence starting at 1 will be run. Don't have positive keys outside of the sequence.
function r_run_r_td()
if next(r_td) then
local td={}
for k in pairs(r_td) do
td[k]=r_td[k]
r_td[k]=nil
end
for k in ipairs(td) do
td[k]()
td[k]=nil
end
end
end
----------------------------------------------------------------------------------------------------------------
--r_funcs
--usage: add r_run_r_funcs() to ready()
r_funcs={}
function r_run_r_funcs()
for k in ipairs(r_funcs) do
r_funcs[k]()
end
end
----------------------------------------------------------------------------------------------------------------
--cmsg_funcs
--usage: add cmsg_run_cmsg_funcs(msg, ch) to c_message(msg, ch)
cmsg_funcs={}
function cmsg_run_cmsg_funcs(msg, ch)
for k in ipairs(cmsg_funcs) do
cmsg_funcs[k](msg, ch)
end
end
------------------------------------------------------------------------------------------------------------
--interrupt
--some things depend on it.
--intent: call do_interrupt(string) if out-of-combat automatic actions should stop doing something asap, because of information your code just detected.
--depends on r_td
interrupt=false
lastinterrupt={}
interrupt_num=0
--local interrupt_turn=-100
--local interrupt_was
function reset_interrupt()
--echoall("---"..tostring(interrupt))--
--if interrupt then interrupt_was=interrupt end
interrupt=false
--interrupt_turn=you.turns()
interrupt_num=0
end
function do_interrupt(reason)
if reason then
interrupt_num=interrupt_num+1
if not(interrupt) then interrupt={} end
interrupt[interrupt_num]=reason
if interrupt then lastinterrupt=interrupt end
for k in pairs(r_td) do
local v=r_td[k]
if v==reset_interrupt then
table.remove(r_td,k)
end
end
table.insert(r_td, (function() table.insert(r_td, 1, reset_interrupt) end)) --TD reset should be at the very end of next turns ready, or very beginning of the ready after that. This only does that in respect to r_td, assuming that other ready functions don't use do_interrupt... redo this with an r_interrupt function
end
end
function tmatchall(t, ...)
--return a match if all elements of t match with some argument
local args={...}
local res=nil
for _,e in pairs(t) do
local res_e=nil
for _,s in pairs(args) do
local m=e:match(s)
if m then res_e=m end
end
if not res_e then return end
res=res_e
end
return res
end
function tmatch(t, ...)
--return a match if one element of t matches with an argument
local args={...}
for _,e in pairs(t) do
for _,s in pairs(args) do
local m=e:match(s)
if m then return m end
end
end
end
----------------------------------------------------------------------------------------------------------------
function autopickup_item_within(r)
for x = -r,r do
for y = -r,r do
for k,it in pairs(items.get_items_at(x,y) or {}) do
if not(it.dropped) and ch_force_autopickup(it, it:name()) then return true end
end
end
end
return false
end
----------------------------------------------------------------------------------------------------------------
function delta_to_cmd(dx, dy) --cited from autofight lua
local d2v = {
[-1] = { [-1] = "CMD_MOVE_UP_LEFT", [0] = "CMD_MOVE_LEFT", [1] = "CMD_MOVE_DOWN_LEFT"},
[0] = { [-1] = "CMD_MOVE_UP", [1] = "CMD_MOVE_DOWN"},
[1] = { [-1] = "CMD_MOVE_UP_RIGHT", [0] = "CMD_MOVE_RIGHT", [1] = "CMD_MOVE_DOWN_RIGHT"}, }
return d2v[dx][dy]
end
function delta_to_safe_cmd(dx, dy)
local d2v = {
[-1] = { [-1] = "CMD_SAFE_MOVE_UP_LEFT", [0] = "CMD_SAFE_MOVE_LEFT", [1] = "CMD_SAFE_MOVE_DOWN_LEFT"},
[0] = { [-1] = "CMD_SAFE_MOVE_UP", [1] = "CMD_SAFE_MOVE_DOWN"},
[1] = { [-1] = "CMD_SAFE_MOVE_UP_RIGHT", [0] = "CMD_SAFE_MOVE_RIGHT", [1] = "CMD_SAFE_MOVE_DOWN_RIGHT"}, }
return d2v[dx][dy]
end
function target_delta_to_cmd(dx, dy)
local d2v = {
[-1] = { [-1] = "CMD_TARGET_UP_LEFT", [0] = "CMD_TARGET_LEFT", [1] = "CMD_TARGET_DOWN_LEFT"},
[0] = { [-1] = "CMD_TARGET_UP", [1] = "CMD_TARGET_DOWN"},
[1] = { [-1] = "CMD_TARGET_UP_RIGHT", [0] = "CMD_TARGET_RIGHT", [1] = "CMD_TARGET_DOWN_RIGHT"}, }
return d2v[dx][dy]
end
-------------------------------------------------------------------------------------------------------------
--utilities end
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
--move careful
--move careful, automatically!
--more prompt when danger starts, including things trying to be invisible
--other warnings, such as yes/no prompts for being slowed
--rebinds movement keys to CMD_SAFE_MOVE keys while out of danger
--also what warn_more_monsters does. TD:modularize warn_more_monsters?
--TD:generalize bindkeys. Done?
--depends on: movekeys, utilities, (TD: r_funcs, cmsg_funcs, start_funcs, save_funcs), macro_save
--assumes manual entries in ready, cmsg, chmon, and manual calls at start and save macro
----------------------------------------------------------------------------------------------------------------
move_careful = false --mostly you.feel_safe, true if manual exploring is expected and enforced to be "careful" with --more--
dma_table={} --for compatibility with disable_move_attack
local AUTO_WMM=true --setting this to false here probably deactivates the warn_more_monsters part
local wmm_on = false
local monster_warning = false
local reset_more_message_options = false
local resume_ap=true --true: resume AP when move_careful would resume. False: Don't automatically resume AP. Only false if AP is off.
local shouldnt_feel_safe=false --only true if you.feel_safe is true, but it's kinda wrong.
--initialised by c_persist
local autopickup_is_on = true --the last known state of options.autopick_on
local td_start_deactivate_autopickup=true
function r_meta_move_careful()
--the only function actually called in ready()
--echoall("mmc")--
r_cmsg_warnings()
r_warnings()
r_chmon_warn_more_monsters()
r_is_autopickup_on()
r_chk_fov()
r_move_careful()
r_warn_more_monsters()
r_monster_warning()
end
--local movekeys={}--getting this via get_command does not work depending on keybinds. Basically ignores that movekeys are usually bound to both letters and number keys
function set_safe_move_keys(safe_move_keys)
if not(safe_move_keys) then
for x = -1,1 do
for y = -1,1 do
local cmd=delta_to_cmd(x,y)
if cmd then
local key=movekeys[cmd]
crawl.setopt("bindkey = ["..key.."] "..delta_to_cmd(x,y))
end
end
end
else
for x = -1,1 do
for y = -1,1 do
local cmd=delta_to_cmd(x,y)
if cmd then
if not movekeys[cmd] then
movekeys[cmd]=get_command(cmd,true,true)
echoall(movekeys[cmd], cmd)--TD
end
local key=movekeys[cmd]
crawl.setopt("bindkey = ["..key.."] "..delta_to_safe_cmd(x,y))
end
end
end
end
end
function toggle_move_careful_on()
if resume_ap then crawl.setopt("default_autopickup=true"); autopickup_turns_on() end
if AUTO_WMM and wmm_on then toggle_warn_more_monsters(true) end
move_careful = true
--crawl.setopt("force_more_message -= into view")
--crawl.setopt("force_more_message += You are feeling hungry")
set_safe_move_keys(true)
--crawl.setopt("bindkey = [j] CMD_SAFE_MOVE_LEFT")
--crawl.setopt("bindkey = [,] CMD_SAFE_MOVE_DOWN")
--crawl.setopt("bindkey = [i] CMD_SAFE_MOVE_UP")
--crawl.setopt("bindkey = [l] CMD_SAFE_MOVE_RIGHT")
--crawl.setopt("bindkey = [u] CMD_SAFE_MOVE_UP_LEFT")
--crawl.setopt("bindkey = [o] CMD_SAFE_MOVE_UP_RIGHT")
--crawl.setopt("bindkey = [m] CMD_SAFE_MOVE_DOWN_LEFT")
--crawl.setopt("bindkey = [.] CMD_SAFE_MOVE_DOWN_RIGHT")
dma_table={}
crawl.mpr("No danger in sight...")
end
function toggle_move_careful_off()
crawl.flush_input()
you.stop_activity()
if autopickup_is_on then deactivate_autopickup() end
--if not(wmm_on) then crawl.more() end
if not(monster_warning) then
monster_warning = true
crawl.mpr("!")
crawl.more()
end
--if AUTO_WMM and wmm_on==false then toggle_warn_more_monsters(true) end --already done in next line
toggle_move_careful_off_noprompt()
end
function toggle_move_careful_off_noprompt()
crawl.flush_input()
you.stop_activity()
if autopickup_is_on then deactivate_autopickup() end
if AUTO_WMM and wmm_on==false then toggle_warn_more_monsters(true) end
move_careful = false
--reset_more_message_options = true
set_safe_move_keys(false)
--crawl.setopt("bindkey = [j] CMD_MOVE_LEFT")
--crawl.setopt("bindkey = [,] CMD_MOVE_DOWN")
--crawl.setopt("bindkey = [i] CMD_MOVE_UP")
--crawl.setopt("bindkey = [l] CMD_MOVE_RIGHT")
--crawl.setopt("bindkey = [u] CMD_MOVE_UP_LEFT")
--crawl.setopt("bindkey = [o] CMD_MOVE_UP_RIGHT")
--crawl.setopt("bindkey = [m] CMD_MOVE_DOWN_LEFT")
--crawl.setopt("bindkey = [.] CMD_MOVE_DOWN_RIGHT")
dma_table={}
end
function r_move_careful()
--force more if danger starts
--move careful, aka explore manually. Also used to decide whether it is safe to equip things
if move_careful then
if (not(you.feel_safe()) or shouldnt_feel_safe or you.silenced()) then
toggle_move_careful_off() --this also sends a --more--
else
if not(autopickup_is_on) then
toggle_move_careful_off()
end
end
else
if you.feel_safe() and not(shouldnt_feel_safe or you.silenced()) then
if autopickup_is_on or resume_ap then
toggle_move_careful_on()
else
crawl.mpr("AP is off.",4)
end
end
end
--
--if not(move_careful) and reset_more_message_options then --reset to default: Here used when there is danger
--reset_more_message_options = false
--if not(AUTO_WMM) then crawl.setopt("force_more_message += into view") end
--crawl.setopt("force_more_message -= You are feeling hungry")
--end
end
function r_chk_fov()
--react to "indirectly" visible invisible monster
--also safeguards against you.feel_safe false positives
if resume_ap then
shouldnt_feel_safe=false
local detected=false
local LOS=you.los()
for x = -LOS,LOS do
for y = -LOS,LOS do
if you.see_cell_no_trans(x, y) then
local monster=monster.get_monster_at(x,y)
if view.invisible_monster(x,y) then
crawl.mpr("There is something invisible around!")
if autopickup_is_on then deactivate_autopickup() else crawl.more() end
resume_ap=false
detected=true; break
elseif
you.feel_safe()
and monster
and not(
monster:is_firewood()
or monster:attitude()>2
or monster:name():match("fire vortex") --TD:deduplicate
or monster:name():match("spatial vortex")
)
then
crawl.mpr(" you.feel_safe() is true.")
shouldnt_feel_safe=true
--detected=true; break
end
end
end
if detected then break end
end
end
end
------------------------------------------------------------------------------------------------------------
function start_deactivate_autopickup()
if c_persist.ap==nil then
c_persist.ap={}
end
if c_persist.ap[you.name()]==nil then
c_persist.ap[you.name()]=true
end
--autopickup_is_on = c_persist.ap[you.name()]
td_start_deactivate_autopickup=not(c_persist.ap[you.name()])
c_persist.ap[you.name()]=nil
--if save_is_autopickup_off then autopickup_is_on=false td_start_deactivate_autopickup=true end
--if not(autopickup_is_on) then autopickup_turns_off() end
if td_start_deactivate_autopickup then
if not(you.turns()==0) then
crawl.mpr("Autopickup was off when saving.")
deactivate_autopickup()
resume_ap=false
end
--if not(autopickup_is_on) then td_start_deactivate_autopickup=false end
end
end
function save_is_autopickup_on()
c_persist.ap[you.name()]=(autopickup_is_on or resume_ap)
end
local cmsg_sending = false
function deactivate_autopickup()
--crawl.mpr("lua detected that AP should be OFF:")
--crawl.do_commands({"CMD_TOGGLE_AUTOPICKUP"})
--crawl.sendkeys( get_command("CMD_TOGGLE_AUTOPICKUP") )
crawl.setopt("default_autopickup = false") --this does turn AP off, not just the default
if autopickup_is_on then
if not(cmsg_sending) then--todo
cmsg_sending=true
crawl.mpr("Turning AP off.")
cmsg_sending=false
end
autopickup_turns_off()
end
end
function r_is_autopickup_on()
if not(options.autopick_on==autopickup_is_on) then
if autopickup_is_on then
resume_ap=false --this should only be done here if you turned it off manually, or crawl turned it off for you.
autopickup_turns_off()
else
autopickup_turns_on()
end
end
--if used_deactivate_autopickup then crawl.mpr("Turning AP off."); used_deactivate_autopickup=false end
end
function cmsg_is_autopickup_on(msg) --goes in c_message(msg, ch)
--if not(msg:match("%-%-%-")) then crawl.mpr("---"..msg) end
if msg:match("utopickup is now off") then resume_ap=false end
if msg:match("utopickup is now on") then resume_ap=true end
if
msg:match(".omething.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.? misses you%p") or
msg:match(".omething enters a") or
msg:match(".omething sets off the alarm") or
msg:match(".omething launches a net") or
msg:match("web moves frantically as something is caught in it") or
msg:match("ou feel you are being watched by something")
then
crawl.setopt("default_autopickup = false")
if resume_ap then
resume_ap=false
if not(cmsg_sending) then
cmsg_sending=true
crawl.mpr("There is something invisible around!!")
cmsg_sending=false
end
end
if autopickup_is_on then
--deactivate_autopickup()
autopickup_turns_off()
else
crawl.more()
end
end
end
--function r_reset_cmsg_sending()
--cmsg pauses and calls itself if it sends a message
--always check cmsg_sending and set cmsg_sending=true before sending something in cmsg
--actually, because it pauses you can just reset it immediately, so this function is unnecessary
--unused, this can be deleted
--cmsg_sending = false
--end
local wmm_noap_on = false
function autopickup_turns_off()
autopickup_is_on=false
if AUTO_WMM and not(resume_ap) then
if wmm_on==false then --TD:is this ever nil? replace comp with not
toggle_warn_more_monsters(true)
else
toggle_warn_more_monsters(true)
toggle_warn_more_monsters(true)
end
end
--crawl.setopt("force_more_message -= into view")
end
function autopickup_turns_on()
autopickup_is_on=true
if not(AUTO_WMM) and wmm_on then toggle_warn_more_monsters(true) end
--if not(move_careful) and not(AUTO_WMM) then crawl.setopt("force_more_message += into view") end
end
-------------------------------------------------------------------------------------------------------------
--warn_more_monsters: info about monsters entering sight that are new since wmm was activated, sending a more prompt if needed
--limitations: Only identifies monsters by name. Doesn't count down as monsters die or leave FOV, but that's also kinda the point sometimes
local wmm_just_on = false
local wmm_list = {}
local r_wmm_list = {}
local new_monsters = ""
function toggle_warn_more_monsters(silent) --silent means called by ap turning off, or AUTO_WMM. state of silent is noted in wmm_noap_on, but that is unused otherwise.
--must be silent if called from cmsg!
if wmm_on then
wmm_on = false
wmm_list={}
if not(silent) then crawl.mpr("warn_more_monsters off") end
wmm_noap_on=false
else
wmm_on = true
wmm_just_on = true
if not(silent) then
crawl.mpr("warn_more_monsters on")
else
wmm_noap_on=true
end
end
end
--crawl.setopt("runrest_ignore_monster ^= fire vortex:2") --overwritten by ch_mon
--crawl.setopt("runrest_ignore_monster ^= spatial vortex:2")
local wmm_options="of distortion, carrying a wand of"
if VERSION<.28 then
crawl.setopt("flash_screen_message +=".." is wielding.*distortion, there is a.*distortion, of distortion comes into view, carrying a wand of")
end
function is_in_wlist(name,id,wlist)
if not(wlist[name]==nil) and wlist[name]>=id then
return true
else
return false
end
end
function wmm_count_monster(monster)
local x=monster:x_pos()
local y=monster:y_pos()
if
not(monster:attitude()>2)
and not(monster:status():match("summoned"))
--and not(monster:name():match("fire vortex"))
--and not(monster:name():match("spatial vortex"))
and you.see_cell_no_trans(x, y)
then
local w_monster_name = monster:name()
local wmm_count = (r_wmm_list[w_monster_name] or 0)+1
r_wmm_list[w_monster_name] = wmm_count
--crawl.mpr(w_monster_name.."w"..tostring(wmm_count))--
if not(is_in_wlist(w_monster_name,wmm_count,wmm_list)) then
wmm_list[w_monster_name] = wmm_count
if not(new_monsters=="") then new_monsters = new_monsters..", " end
if VERSION>.27 then
new_monsters = new_monsters..monster:target_desc().." "..tostring(wmm_count)
--TD monster:speed_description() for abominations?
else
new_monsters = new_monsters..w_monster_name.." "..tostring(wmm_count)
--TD add status?
end
end
end
end
local wmm_turn_knowledge={} --wmm_turn_knowledge[name][n]={ x, y }
local wmm_turn_endstate={} --[x][y]=name
local wmm_chmon_turnover=false
local wmm_turn_knowledge2={} --debug
function chmon_warn_more_monsters(monster, is_safe, moving, dis)
--[[
1. things as before your action
2. things as they are after your action instantly happened
3. things that change in between (still same timestamp)
4. things as they are when your turn starts (next timestamp)
could identify 1 with the last 4, not used
starttime, notturnover: 1,2
starttime, turnover: 2,3
endtime, turnover: 4 sometimes
endtime, notturnover: 4
currently assumes that only one turn happens between ready() calls
--TD: make wmm_chmon_turnover less hacky, add timestamps for ready and chmon calls
]]
if true then--debug
local v=tostring(you.time()).." "..tostring(wmm_chmon_turnover).." "..tostring(you.turn_is_over())..": "..tostring(monster:x_pos()).." "..tostring(monster:y_pos()).." "..monster:name().." "..monster:status()..(is_safe and " is_safe" or "")..(monster:attitude()>2 and " "..tostring(monster:attitude()) or "")
if wmm_turn_knowledge2[v]==nil then
wmm_turn_knowledge2[v]=false
table.insert(wmm_turn_knowledge2, v)
end
end
if
monster:name():match("fire vortex")
or monster:name():match("spatial vortex")
then
return dis>2
end
if
not(is_safe)
or not(monster:attitude()>2)
and (
monster:name():match("tentacle segment")
or monster:status("slightly transparent")
)
then
if wmm_on==false and AUTO_WMM then toggle_warn_more_monsters(true) end
local x=monster:x_pos()
local y=monster:y_pos()
local name=monster:name()
--if monster:status("slightly transparent") and not(you.see_invisible()) thentodo
--crawl.mpr("ch_mon info leak: "..name.." "..tostring(x).." "..tostring(y))
--if autopickup_is_on then deactivate_autopickup() end
--if resume_ap then resume_ap=false; crawl.more() end
----TD does this happen outside of wizmode?
--end
if not(wmm_chmon_turnover) then
wmm_chmon_turnover=you.time()
you.stop_activity()
--crawl.flush_input() --TD necessary? works? annoys xsummon?
do_interrupt("chmon_saw_monster")
end
if move_careful and autopickup_item_within(0) then deactivate_autopickup() end--this prevents AP picking up something you just moved onto, even though a monster entered and left the screen
if wmm_chmon_turnover==you.time() then
if you.turn_is_over() then
if not(wmm_turn_knowledge[name]) then
wmm_turn_knowledge[name]={}
end
local len=#wmm_turn_knowledge[name]
if
len==0
or not( wmm_turn_knowledge[name][len][1]==x
and wmm_turn_knowledge[name][len][2]==y )
then
table.insert(wmm_turn_knowledge[name],{ x, y })
end
end
elseif not(you.turn_is_over()) then
if not(wmm_turn_endstate[name]) then
wmm_turn_endstate[name]=1
end
if not(wmm_turn_endstate[x]) then
wmm_turn_endstate[x]={}
end
if wmm_turn_endstate[x][y]==nil then
wmm_turn_endstate[x][y]=name
wmm_count_monster(monster)
--
--local v=tostring(you.time()).." "..tostring(you.turn_is_over()).." "..tostring(monster:x_pos()).." "..tostring(monster:y_pos()).." "..monster:name().." "..monster:status()
--table.insert(wmm_turn_knowledge2, v)
elseif wmm_turn_endstate[x][y]~=name then
echoall("chmon_warn_more_monsters warning: "..name.." where there is expected to be "..wmm_turn_endstate[x][y].."at"..tostring(x).." "..tostring(y))
wmm_turn_endstate[x][y]=name
wmm_count_monster(monster)
end
end
if is_safe and monster:name():match("tentacle segment") then
return is_safe --otherwise the game spams "N tentacle segments come into view"
else
return false
end
end
return is_safe
end
local cleartrail=false
function r_chmon_warn_more_monsters()
wmm_chmon_turnover=false
wmmtest=""
for k in ipairs(wmm_turn_knowledge2) do--debug
--if wmm_turn_knowledge2[k] then crawl.mpr(wmm_turn_knowledge2[k]) end
if wmm_turn_knowledge2[k] then wmmtest=wmmtest..","..wmm_turn_knowledge2[k] end
wmm_turn_knowledge2[k] = nil
end
wmm_turn_knowledge2={}
if wmm_on then
local leaving
for name in pairs(wmm_turn_knowledge) do
if not(wmm_turn_endstate[name]) then
local path=wmm_turn_knowledge[name]
local x=path[#path][1]
local y=path[#path][2]
--if monster.get_monster_at(x, y) and monster.get_monster_at(x, y):name()==name then
--wmm_count_monster(monster.get_monster_at(x, y))
--false positive if multiple monsters of the same name
--this would only be needed for, bats, maaaybe
--else
--crawl.mpr("that "..name.." was in your LOS!")
leaving=(leaving and leaving..", " or "")..name.." at "..tostring(x).." "..tostring(y)
if not(move_careful) and not(is_in_wlist(name,(r_wmm_list[name] or 0)+1,wmm_list)) then
crawl.mpr(""..name.." last seen at "..tostring(x).." "..tostring(y).."")
end
if VERSION<.28 then
if not(you.branch()=="Abyss") then --no exclusions in Abyss
for k in pairs(path) do
pcall(function() travel.set_exclude(path[k][1],path[k][2],0) end)
end
--else
--crawl.mpr(name.." last seen at "..tostring(x).." "..tostring(y))
end
else
cleartrail=true
for k in pairs(path) do
if not(pcall(function()
travel.set_travel_trail(path[k][1],path[k][2])
end)) then
crawl.mpr("couldn't mark "..tostring(path[k][1]).." "..tostring(path[k][2]))
end
end
if #path==1 then
if not(pcall(function()
travel.set_travel_trail( x-( y==0 and (x==0 and 0 or math.abs(x)/x) or 0) , y-(y==0 and 0 or math.abs(y)/y) )
end)) then
crawl.mpr("couldn't mark delta at "..tostring(x).." "..tostring(y))
end
end
--echoall("markings set?")--
end
--end
else
wmm_turn_knowledge[name] = nil
end
end
wmm_turn_endstate={}
if leaving then
if VERSION<.28 then crawl.redraw_screen() end
if move_careful and new_monsters=="" then
--do_interrupt("lua_saw_monster") --done in ch_mon
crawl.mpr("Lua eyes saw: "..leaving.."")
--if autopickup_is_on and autopickup_item_within(0) then deactivate_autopickup() end --this runs too late to ever matter
if not(monster_warning) then
crawl.redraw_screen()
monster_warning = true
crawl.more()
end
end
if VERSION<.28 then
if not(you.branch()=="Abyss") then
for name in pairs(wmm_turn_knowledge) do
local path=wmm_turn_knowledge[name]
for k in pairs(path) do
travel.del_exclude(path[k][1],path[k][2])
end
end
end
--else
--travel.clear_travel_trail()
end
--if VERSION<.28 then crawl.redraw_screen() end
else
if VERSION>=.28 and cleartrail then travel.clear_travel_trail(); cleartrail=false; end
end
wmm_turn_knowledge={}
else
if VERSION>=.28 and cleartrail then travel.clear_travel_trail(); cleartrail=false; end
end
end
function r_warn_more_monsters()
if wmm_on then
if new_monsters=="" then
r_wmm_list={}
local w_monster
local LOS=you.los()
for x = -LOS,LOS do
for y = -LOS,LOS do
local w_monster_obj = monster.get_monster_at(x, y)
if
not(w_monster_obj==nil)
and not(w_monster_obj:is_safe())
then
wmm_count_monster(w_monster_obj)
end
end
end
end
if not(new_monsters=="") and (VERSION>.27 or not(wmm_just_on)) then
if VERSION>.27 then crawl.setopt("flash_screen_message +="..wmm_options) end
crawl.mpr(new_monsters)
if VERSION>.27 then crawl.setopt("flash_screen_message -="..wmm_options) end
if not(monster_warning) and not(wmm_just_on) then
monster_warning = true
crawl.more()
end
end
new_monsters = ""
wmm_just_on = false
r_wmm_list = {}
end
end
-------------------------------------------------------------------------------------------------------------
function monster_warning_td()
if not(monster_warning) then
monster_warning = "td"
elseif monster_warning=="skip" then
monster_warning = "skipchk"
end
end
--crawl.setopt("message_color += yellow:out of view")
last_msg, last_ch = "", ""
function cmsg_warnings(msg, ch)
--if not(msg:match("%-%-%-")) then
--crawl.mpr("---"..msg.."-"..last_msg)
--if last_ch=="monster_warning" and not(msg:match("out of view")) then
--if false and monster_warning=="skip" then
--monster_warning = "skipchk"
--else
--monster_warning=true
--crawl.more()
--end
--elseif
if last_msg:match("ou are slowing down") and you.status("petrifying") then
if not(cmsg_sending) then
cmsg_sending = true
--crawl.mpr("You are petrifying soon!")
while not(crawl.yesno("-- Do you realize you are petrifying? --",true,"n",true)) do end
crawl.mpr("...",2)
cmsg_sending = false
end
elseif last_msg:match("ou feel yourself slow down") then
if not(cmsg_sending) then
cmsg_sending = true
if you.slowed() then
if you.hasted() then
while not(crawl.yesno("-- Do you realize your haste was cancelled out? --",true,"n",true)) do end
else
while not(crawl.yesno("-- Do you realize you are SLOWED? --",true,"n",true)) do end
end
else
while not(crawl.yesno("-- Do you realize your haste has expired? --",true,"n",true)) do end
end
crawl.mpr("...",2)
cmsg_sending = false
end
--elseif last_msg:match("flickers and vanishes") and not(autopickup_is_on) then
--crawl.more()
elseif last_msg:match("finished your manual") then
if not(cmsg_sending) then
cmsg_sending = true
while not(crawl.yesno("-- press y --",true,"n",true)) do end
crawl.mpr("...",2)
cmsg_sending = false
end
end
--alternative to the last_ch handling, sometimes one less more, but sometimes slower at interrupting input, doesnt catch all out of view with the more
if--TD replace(d)?
ch=="monster_warning"
then
spotted_monster()
end
--if msg:match("out of view") and not(msg:match("ortex")) then
--if not(cmsg_sending)then
--cmsg_sending=true
----crawl.mpr(msg:gsub("moves out of view.","is about to move out of view!"):gsub("lightgrey","yellow"),2)
--crawl.mpr(msg:gsub("moves out of view.","is about to move out of view!"):gsub("%a+>","yellow>"),2)
--monster_warning=true
--crawl.more()
--cmsg_sending = false
--end
--end
last_msg, last_ch = msg, ch
--end
end
local deltable={}
if VERSION>=.28 then deltable=nil end
function mark_positions(x,y)
local function f(x,y)
if VERSION<.28 then
if not(you.branch()=="Abyss") then --no exclusions in Abyss
travel.set_exclude(x,y,0)
table.insert(deltable, { x, y })
end
else
--table.insert(deltable, { x, y })
--table.insert(deltable, true)
travel.set_travel_trail( x+( y==0 and (x==0 and 0 or math.abs(x)/x) or 0) , y+(y==0 and 0 or math.abs(y)/y) )
travel.set_travel_trail(x,y)
end
if not(r_td[rtd_mark_positions]) then
table.insert(r_td, rtd_mark_positions)
r_td[rtd_mark_positions]=1
end
end
if not(x) then
local LOS=you.los()
for x = -LOS,LOS do
for y = -LOS,LOS do
if
not( monster.get_monster_at(x, y)==nil )
and not( ( monster.get_monster_at(x, y):is_safe()
and monster.get_monster_at(x, y):is_stationary() ) )
and not(monster.get_monster_at(x, y):attitude()>2)
and you.see_cell(x, y)
then
f(x,y)
end
end
end
else
f(x,y)
end
end
function rtd_mark_positions()
if VERSION<.28 then
for k in pairs(deltable) do
travel.del_exclude(deltable[k][1],deltable[k][2])
end
deltable={}
else
travel.clear_travel_trail()
end
end
function spotted_monster(x,y)
mark_positions(x,y)
monster_warning_td()
end
function r_cmsg_warnings()
cmsg_warnings("","")
end
function r_warnings()
if monster_warning=="td" then
crawl.more()
elseif monster_warning=="skipchk" and you.feel_safe() then --something went into view, and out of view. would work with "out of view" handling above, but that's not needed since mark_positions is used
crawl.mpr("you immediately lose sight...")
crawl.more()
end
end
function r_monster_warning()
if monster_warning then
--if monster_warning=="td" then
--crawl.more()
--else
monster_warning=false
end
end
--move careful end
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
--disable move attack
--depends on movekeys and utilities: r_funcs, get_command, delta_to_cmd, delta_to_safe_cmd
--should work with and without move_careful
move_careful=false
dma_table={}
--local movekeys={} --TD:does not work depending on keybinds. Basically ignores that movekeys are usually bound to both letters and number keys
function r_disable_move_attack()
--crawl.mpr("rdma")
local LOS=you.los()
for x = -1,1 do
for y = -1,1 do
local monster_obj = monster.get_monster_at(x, y)
local cmd=delta_to_cmd(x,y) --nil if 0, 0, but there's never a monster at 0, 0 so it's fine
if
not( monster_obj==nil )
and not(monster_obj:attitude()>2)
or view.invisible_monster(x,y)
then
if not(dma_table[cmd]) then
if not movekeys[cmd] then movekeys[cmd]=get_command(cmd,true,true) end
local key=movekeys[cmd]
crawl.setopt("bindkey = ["..key.."] CMD_NO_CMD_DEFAULT")
--crawl.mpr("bindkey = ["..key.."] CMD_NO_CMD_DEFAULT")
dma_table[cmd]=true
end
else
if dma_table[cmd] then
local current_cmd
if not(move_careful) then
current_cmd=delta_to_cmd(x,y)
else
current_cmd=delta_to_safe_cmd(x,y)
end
local key=movekeys[cmd]
crawl.setopt("bindkey = ["..key.."] "..current_cmd)
--crawl.mpr("bindkey = ["..key.."] "..current_cmd)
dma_table[cmd]=false
end
end
end
end
end
table.insert(r_funcs, r_disable_move_attack)
------------------------------------------------------------------------------------------------------------
--===show_enemy_beam_path
--dependencies: r_td if crawl version below .28
local path
function show_enemy_beam_path()
crawl.mpr("Select enemy:",2)
local x, y = crawl.get_target()
local x0=0
local y0=0
if x==nil and y==nil then return
elseif monster.get_monster_at(x, y)==nil or monster.get_monster_at(x, y):attitude()>3 then
x0, y0 = x, y
crawl.mpr("Selected Start. Select enemy:",2)
x, y = crawl.get_target()
end
path=spells.path("Magic Dart",x0,y0,x,y)
--path=spells.path("Lightning Bolt",x0,y0,x,y)
if VERSION<.28 then
if not(you.branch()=="Abyss") then --no exclusions in Abyss
for k in pairs(path) do
travel.set_exclude(path[k][1],path[k][2],0)
end
end
table.insert(r_td, rtd_show_enemy_beam_path)
else
for k in pairs(path) do
travel.set_travel_trail(path[k][1],path[k][2])
end
end
end
function rtd_show_enemy_beam_path()
if not(you.branch()=="Abyss") then
for k in pairs(path) do
travel.del_exclude(path[k][1],path[k][2])
end
else
local found=false
crawl.mpr("Select tile:",2)
local x, y = crawl.get_target()
while x do
for k in pairs(path) do
if x==path[k][1] and y==path[k][2] then
crawl.mpr("Tile is in beam path.",2)
found=true
break;
end
end
if found then break end
crawl.mpr("Tile is not in beam path.",6)
x, y = crawl.get_target()
end
end
end
-------------------------------------------------------------------------------------------------------------
--===wait_weapon
--===wait_ring
--===wait_ring2
--unequips or reequips the respective item. Automatically selects a "weapon" for felids at load.
--depend on: nothing
--assume: default bindkeys for w, P and R
--TD remember states
local function get_toymouse()
local inv=items.inventory()
for _,it in pairs(inv) do
if it:class()=="Miscellaneous" then return items.index_to_letter(it.slot) end
end
for _,it in pairs(inv) do
if it:class()=="Wands" then return items.index_to_letter(it.slot) end
end
for _,it in pairs(inv) do
if it:class()=="Potions" or it:class()=="Scrolls" then return items.index_to_letter(it.slot) end
end
return ""
end
wait_x_last=""--just for info, used in rest_for
wait_x_equip_off=false
wait_weapon_equip=(you.race()=="Felid" and get_toymouse() or "")
if wait_weapon_equip:match(".") then wait_x_last="wait_weapon" end
function wait_weapon()
if you.transform()=="snake" then crawl.mpr("you're a snake."); crawl.more(); wait_x_last=""; return end
wait_x_last="wait_weapon"
--r_meta_move_careful()
if not(items.equipped_at(0)==nil) then
wait_weapon_equip=items.index_to_letter(items.equipped_at(0).slot)
crawl.sendkeys("w-")
wait_x_equip_off=not(you.race()=="Felid")
else
crawl.sendkeys("w*"..wait_weapon_equip)
wait_x_equip_off=(you.race()=="Felid")
end
end
wait_ring_equip=""
function wait_ring()
wait_x_last="wait_ring"
--r_meta_move_careful()
if not(items.equipped_at(7)==nil) then
wait_ring_equip=items.index_to_letter(items.equipped_at(7).slot)
if (items.equipped_at(8)==nil) and not(wait_ring_equip2=="none") then
crawl.sendkeys("R")
else
crawl.sendkeys("R"..wait_ring_equip)
wait_x_equip_off=true
end
else
crawl.sendkeys("P"..wait_ring_equip)
wait_x_equip_off=false
end
end
wait_ring_equip2=""
function wait_ring2()
wait_x_last="wait_ring2"
--r_meta_move_careful()
if not(items.equipped_at(8)==nil) then
wait_ring_equip2=items.index_to_letter(items.equipped_at(8).slot)
if (items.equipped_at(7)==nil) and not(wait_ring_equip=="none") then
crawl.sendkeys("R")
else
crawl.sendkeys("R"..wait_ring_equip2)
wait_x_equip_off=true
end
else
crawl.sendkeys("P"..wait_ring_equip2)
wait_x_equip_off=false
end
end
function start_wait_x()
if c_persist.wait_x==nil then
c_persist.wait_x={}
end
if c_persist.wait_x[you.name()]==nil then
c_persist.wait_x[you.name()]={}
return
end
wait_x_last = c_persist.wait_x[you.name()][1]
wait_x_equip_off = c_persist.wait_x[you.name()][2]
--c_persist.wait_x[you.name()]=nil
end
function save_wait_x()
c_persist.wait_x[you.name()][1] = wait_x_last
c_persist.wait_x[you.name()][2] = wait_x_equip_off
end
------------------------------------------------------------------------------------------------------------
--===remindMe
--reminder that was once used for PoG abuse. PoG rework when?
--depends: r_td
--issues: doesn't interrupt anything. Idc about this one
local reminding = false
local remind_start=0
function remindMe()
reminding=true
remind_start=you.time()
crawl.mpr("reminder set!")
table.insert(r_td,rtd_remindMe)
end
function rtd_remindMe()
if reminding then
--if you.time()>remind_start+1500 then
if you.time()+10>remind_start+230 then
--crawl.mpr("time to eat!")
crawl.mpr("Reminder reminding you to do the thing!",4)
reminding = false
crawl.more()
else
table.insert(r_td,rtd_remindMe)
end
end
end
-------------------------------------------------------------------------------------------------------------
--rested() tries to return true exactly when there would be no point in resting.
--not perfect
--depends: cmsg_funcs
--currently assumes: hell effect rework happened
--TD: understand hp drain...
local cooldownstatus=0
function rested(minmpmult)
return ( (({you.hp()})[1]==({you.hp()})[2] or you.status("non-regenerating"))
and ( ({you.mp()})[1]==({you.mp()})[2]
or minmpmult and ({you.mp()})[1]>=({you.mp()})[2]*minmpmult )
and you.contaminated()==0 and you.swift()==0
and (you.corrosion()==0 or (you.branch()=="Dis" and you.corrosion()<=2))
and not( you.slowed() or you.confused() or you.breath_timeout() or you.on_fire() or you.poisoned()
or you.petrifying() or you.teleporting() or you.silencing() or you.exhausted()
or you.status("can't hop") or you.status("doom-hounded") or you.status("frozen")
or (you.status("weak-willed") and not you.branch()=="Tar")
or you.status("no potions") --only the killer clown effect
or you.status("sap magic")
or you.status("barbed spikes")
or you.transform()=="pig" or you.transform()=="fungus" or you.transform()=="wisp"
or you.status():match("vulnerable") --only fire vulnerable atm, I think
or you.status("berserk cooldown") or you.status("berserking")
or you.status():match("weakened")--"Weak"
--or (you.status("glowing") and TD:notalwaysglowing)
-- -Recite, -Vortex -TD
-- -Dragoncall:
or cooldownstatus>0
))
end
function cmsg_cooldownstatus(msg, ch)
if msg:match("roar of the dragon horde subsides") then
cooldownstatus=cooldownstatus+1
elseif msg:match("ou can once more reach out to the dragon horde") then
cooldownstatus=math.max(cooldownstatus-1,0)
end
end
table.insert(cmsg_funcs,cmsg_cooldownstatus)
-------------------------------------------------------------------------------------------------------------
--===rest_for_turn
--waits in a way that disrupts spells that need waiting.
--uses the last used of the below functions, if any
--depends: wait_weapon, wait_ring, wait_ring2
function rest_for_turn()
if wait_x_last=="" then
crawl.mpr("You wait.")
crawl.do_commands({"CMD_WAIT"})
else
_G[wait_x_last]()
end
end
-------------------------------------------------------------------------------------------------------------
--===k_rest_for
--TD:document
restfor=100
function k_rest_for()
--rest_for(230)
rest_for(restfor)
end
local restingf = false
local restingf_start=0
local restingf_end=0
local restingf_till_reminding=false
local restingf_useless_anyway=false
function rest_for(n)
restingf = true
restingf_start=you.time()
restingf_end=restingf_start+n
if reminding then restingf_till_reminding=true end
crawl.mpr("You start waiting...")
end
function r_rest_for()
local hp, mhp = you.hp()
local mp, mmp = you.mp()
local interrupt = (interrupt and not(tmatchall(interrupt,"mod.rr warning.<.*>You feel")))
if restingf then
if
not(move_careful) or interrupt
or (not(restingf_till_reminding) and you.time()+1>restingf_end)
--or rested() or you.hunger()<1 or (restingf_till_reminding and not(reminding)) then--HUNGER
or (rested() and not(restingf_useless_anyway))
or (restingf_till_reminding and not(reminding))
--or rested()
then
restingf = false
restingf_till_reminding=false
restingf_useless_anyway=false
crawl.mpr("You stop waiting.")
if you.time()==restingf_start then
--if crawl.yesno("Really wait?",true,"N") then
crawl.more()
restingf_useless_anyway=true
restingf = true
--rest_for_turn()
--else
--crawl.mpr("You don't start waiting.")
--end
else
if (wait_x_equip_off and move_careful and not(interrupt)) then
rest_for_turn()
end
--wait_x_last="" --toggle for reset every time
end
else
rest_for_turn()
end
end
end
-------------------------------------------------------------------------------------------------------------
--===togglable_wait
--===toggle_togglable_wait
--...
function togglable_wait_base()
crawl.mpr("waiting...")
crawl.sendkeys("h")
end
togglable_wait=rest_for_turn
function toggle_togglable_wait()
if togglable_wait==rest_for_turn then
togglable_wait=togglable_wait_base
crawl.mpr("wait=normal or channeling")
else
togglable_wait=rest_for_turn
crawl.mpr("wait=possibly swapping")
end
end
function cmsg_toggle_togglable_wait(msg,ch)
if togglable_wait==rest_for_turn and (
msg:match("to maintain the ray")
or msg:match("to continue charging")
or msg:match("to intensify the flame waves")
)
then
table.insert(r_td, toggle_togglable_wait)
end
end
table.insert(cmsg_funcs, cmsg_toggle_togglable_wait)
-------------------------------------------------------------------------------------------------------------
function you_wait()
crawl.mpr("You wait.")
crawl.do_commands({"CMD_WAIT"})
wait_x_last=""
end
-------------------------------------------------------------------------------------------------------------
function rest_with_prompt()
if autopickup_is_on then
if
rested()
then
if crawl.yesno("Really wait for up to 100 decaAut?",true,"N") then
--crawl.do_commands({"CMD_REST"})
crawl.sendkeys(get_command("CMD_REST"))
else
crawl.mpr("You don't start waiting.")
end
else
--crawl.do_commands({"CMD_REST"}) --leads to a bug in an older version when you use the repeating command
crawl.sendkeys(get_command("CMD_REST"))
end
else
crawl.mpr("You don't start waiting.")
end
end
------------------------------------------------------------------------------------------------------------
local rest_wait_percent = 100
function toggle_rest_wait_percent()
if rest_wait_percent == 100 then
rest_wait_percent = 98
crawl.setopt("rest_wait_percent = 98")
crawl.mpr("rest_wait_percent = 98")
else
rest_wait_percent = 100
crawl.setopt("rest_wait_percent = 100")
crawl.mpr("rest_wait_percent = 100")
end
end
function start_rest_wait_percent()
--if you.xl()<14 then
if true then
rest_wait_percent = 100
crawl.setopt("rest_wait_percent = 100")
else
rest_wait_percent = 98
crawl.setopt("rest_wait_percent = 98")
end
end
-------------------------------------------------------------------------------------------------------------
--local super_resting = false
function super_rest()
--super_resting=true
--crawl.setopt("rest_wait_both = true")
--crawl.setopt("runrest_ignore_message ^= magic, HP, contam")
crawl.setopt("rest_wait_percent = 100")
--crawl.do_commands({"CMD_REST"})
rest_with_prompt()
table.insert(r_td,rtd_super_rest)
end
function rtd_super_rest()
--super resting
--if super_resting then
--crawl.setopt("rest_wait_both = false")
--crawl.setopt("runrest_ignore_message -= magic, HP, contam")
--crawl.setopt("rest_wait_percent = 98")
crawl.setopt("rest_wait_percent = "..tostring(rest_wait_percent))
--super_resting = false
--end
end
------------------------------------------------------------------------------------------------------------
local togglable_rest_is="normal"
function toggle_togglable_rest()
if togglable_rest_is=="normal" then
togglable_rest_is="until"
crawl.mpr("using equip rest")
else
togglable_rest_is="normal"
crawl.mpr("using regular rest")
end
end
function togglable_rest()
if togglable_rest_is=="normal" then
rest_with_prompt()
else
rest_until()
end
end
-------------------------------------------------------------------------------------------------------------
local avoidapproach="approach"
local travel_open_doors = avoidapproach
crawl.setopt("travel_open_doors = open") --it's only set to travel_open_doors in explore_simpler
function toggle_travel_open_doors()
if travel_open_doors == avoidapproach then
travel_open_doors = "open"
--crawl.setopt("travel_open_doors = open") --commeted out bc explore function sets it.
crawl.mpr("travel_open_doors = open")
else
travel_open_doors = avoidapproach
--crawl.setopt("travel_open_doors = "..avoidapproach)
crawl.mpr("travel_open_doors = "..avoidapproach)
end
end
function toggle_avoidapproach()
if avoidapproach == "avoid" then
avoidapproach = "approach"
if travel_open_doors == "avoid" then
travel_open_doors=avoidapproach
end
else
avoidapproach = "avoid"
if travel_open_doors == "approach" then
travel_open_doors=avoidapproach
end
end
crawl.mpr("travel_open_doors = "..(((travel_open_doors:match("open") or "")..", would be "):match("open, would be ") or "")..avoidapproach)
end
-------------------------------------------------------------------------------------------------------------
local just_exploring = false
local exploring = false
function r_meta_explore()
r_just_explore()
r_explore_simpler()
end
crawl.setopt("explore_auto_rest = true")
function just_explore()
just_exploring=true
crawl.setopt("explore_auto_rest = false")
explore_simpler()
end
function r_just_explore()
if just_exploring then
crawl.setopt("explore_auto_rest = true")
just_exploring=false
end
end
function explore_simpler() --TD merge with just_explore
exploring=true
monster_warning="skip" --skip it during next round, but only if monsters are in view
--toggle_move_careful_off_noprompt()
if travel_open_doors == avoidapproach then crawl.setopt("travel_open_doors = "..avoidapproach) end
if not(you.branch()=="Shoals" and you.flying()) or crawl.yesno("Really autoexplore?",true,"N") then crawl.sendkeys( get_command("CMD_EXPLORE") ) end
end
function r_explore_simpler()
if exploring then
crawl.setopt("travel_open_doors = open")
exploring=false
end
end
------------------------------------------------------------------------------------------------------------
local ctrl_exploring=false --says whether it should run
local ctrl_explore_timestamp=-1 -- negatives tell you that the rtd isn't active and for what reason
function ctrl_explore()
ctrl_exploring=true
if ctrl_explore_timestamp<0 then
--table.insert(r_td,rtd_ctrl_explore)
rtd_ctrl_explore()
--ctrl_explore_timestamp=-1
--toggle_move_careful_off_noprompt()
crawl.setopt("message_color ^= mute:ove the cursor to view the level map")
crawl.setopt("message_color ^= mute:eturning to the game...")
end
end
function rtd_ctrl_explore()
--crawl.mpr("cx")--
if ctrl_exploring then
if ctrl_explore_timestamp-1) then
if move_careful then
table.insert(r_td,rtd_ctrl_explore)
ctrl_explore_timestamp=you.time()
--if travel_open_doors == avoidapproach then crawl.setopt("travel_open_doors = "..avoidapproach) end
crawl.sendkeys(get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE"))
return
else
if ctrl_explore_timestamp<0 then
crawl.mpr("Not exploring.",6); crawl.more()
end
ctrl_explore_timestamp=-1 --default, or danger if not move_careful
ctrl_exploring=false
end
else
ctrl_explore_timestamp=-3 --ctrl_explore was deactivated by interrupt
ctrl_exploring=false
end
else
ctrl_explore_timestamp=-2 --player exited map mode
ctrl_exploring=false
end
else
ctrl_explore_timestamp=-4 --ctrl_explore in particular was deactivated by something
end
crawl.setopt("message_color -= mute:ove the cursor to view the level map")
crawl.setopt("message_color -= mute:eturning to the game...")
--echoall(ctrl_explore_timestamp)--
--if crawl.kbhit()==1 then crawl.flush_input(); crawl.more() end
--if crawl.flush_input() then crawl.more() end --TD?
--crawl.setopt("travel_open_doors = open")
end
--crawl.setopt("runrest_stop_message ^= into view")
--crawl.setopt("runrest_stop_message ^= [Ff]ound")
------------------------------------------------------------------------------------------------------------
--TD: deal with longer doors
--TD: don't rely on waypoints not changing this turn.
local mcxtot_exclusions=0
local mcxtot_exclusions_table={} --exclusions at waypoint 0, at waypoint 9, and at coords in this table, relative to 0
function map_cx_try_other_target()--
--crawl.sendkeys(get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_ADD_WAYPOINT").."0\27"..get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE"))--sets the waypoint wrong??
local function tideup()--
--echoall(mcxtot_exclusions)
if mcxtot_exclusions>1 then
if mcxtot_exclusions>2 then
local len=#mcxtot_exclusions_table
--echoall("remove rel", mcxtot_exclusions_table[len][1], mcxtot_exclusions_table[len][2])
local x=-({ travel.waypoint_delta(0) })[1]+mcxtot_exclusions_table[len][1]
local y=-({ travel.waypoint_delta(0) })[2]+mcxtot_exclusions_table[len][2]
travel.del_exclude(x,y)
table.remove(mcxtot_exclusions_table)
else
local x=-({ travel.waypoint_delta(9) })[1]
local y=-({ travel.waypoint_delta(9) })[2]
travel.del_exclude(x,y)
--echoall("remove 9:", x, y)
end
mcxtot_exclusions=mcxtot_exclusions-1
else
crawl.setopt("message_color -= mute:prompt:.*")
crawl.setopt("message_color -= mute:[Ww]aypoint")
crawl.setopt("message_color -= mute:\\(")
local x=-({ travel.waypoint_delta(0) })[1]
local y=-({ travel.waypoint_delta(0) })[2]
travel.del_exclude(x,y)
--echoall("remove 0:", x, y)
mcxtot_exclusions=0
end
end
if mcxtot_exclusions>0 then
if mcxtot_exclusions>1 then
local x=-({ travel.waypoint_delta(9) })[1]+({ travel.waypoint_delta(0) })[1]
local y=-({ travel.waypoint_delta(9) })[2]+({ travel.waypoint_delta(0) })[2]
table.insert(mcxtot_exclusions_table, {x,y})
--echoall("add rel:", x, y)
end
crawl.sendkeys(get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_ADD_WAYPOINT").."9\27"..get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_EXPLORE"))
mcxtot_exclusions=mcxtot_exclusions+1
else
crawl.setopt("message_color ^= mute:prompt:.*")
crawl.setopt("message_color ^= mute:[Ww]aypoint")
crawl.setopt("message_color ^= mute:\\(")
--crawl.setopt("message_color ^= mute:ove the cursor to view")--
--crawl.setopt("message_color ^= mute:urning to the game")
crawl.sendkeys(get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_ADD_WAYPOINT").."0\27"..get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_EXCLUDE_AREA")..get_command("CMD_MAP_EXPLORE"))
mcxtot_exclusions=1
end
table.insert(r_td, 1, tideup)
end
--function map_cx_try_other_target()--
--map_cx_try_other_target2()
--crawl.sendkeys("\27")
--table.insert(r_td, (function()
--local x=-({ travel.waypoint_delta(0) })[1]
--local y=-({ travel.waypoint_delta(0) })[2]
--echoall("add 0:", x, y)
--map_cx_try_other_target2()
--crawl.sendkeys("\27")
--table.insert(r_td, (function()
--map_cx_try_other_target2()
--crawl.sendkeys("\27")
--table.insert(r_td, (function()
--map_cx_try_other_target2()
--table.insert(r_td, (function()
--local x=-({ travel.waypoint_delta(9) })[1]
--local y=-({ travel.waypoint_delta(9) })[2]
--echoall("add 9:", x, y)
--end))
--table.insert(r_td, tideup)
--table.insert(r_td, tideup)
--table.insert(r_td, tideup)
--table.insert(r_td, tideup)
--end))
--end))
--end))
--end
------------------------------------------------------------------------------------------------------------
local manual_explore=false --only used in explore_summon so far
local togglable_explore_is = "ctrl_explore"
function togglable_explore()
manual_explore=false
_G[togglable_explore_is]()
end
function toggle_togglable_explore()
if togglable_explore_is=="just_explore" then
togglable_explore_is = "ctrl_explore"
else
togglable_explore_is = "just_explore"
end
echoall(togglable_explore_is)
end
------------------------------------------------------------------------------------------------------------
--compatible with wait_weapon
xsummon=nil--="k"--spell key, to be set using ingame lua console
xsummon2=nil--="k" --second spell key, set nil if unused
xsummonsbeforedelay=2--TD save persistently?
minresummondauts = 10 --left global for setting ingame, probably could be local
local function min_resummon_aut_delay() return 10*minresummondauts*(xsummon2 and 1 or 2) end
local RESUMMON_LIMIT = 16 --should be even. Safeguard against auto-explore running in circles because summons keep interrupting it.
local resummons=0 --TD:rename to xsummons
local xsummonalt=false
local xsummonfloor=""
local xsummontime
--local extra_ready_run=false
xdog=false
local xdogpet=false
function explore_summon()
if xsummon then
if resummons~=0 then
--end the running rtd
--xsummonfloor=false
--if not(extra_ready_run) then
--extra_ready_run=true
--ready()
----r_run_r_td()
--extra_ready_run=false
--end
explore_summon_reset(false)
--for k in pairs(r_td) do
--local v=r_td[k]
--if v==rtd_explore_summon then
--table.remove(r_td,k)
--crawl.mpr("restarting explore_summon.")
--break
--end
--end
crawl.mpr("restarting explore_summon.")
do_interrupt("stop_explore_summon")
end
xsummonfloor=you.where()
xsummontime=you.time()
if VERSION>.30 and you.spell_table()[xsummon]=="Call Canine Familiar" then xdog=true else xdog=false end
interrupt=false
explore_summon_parameter()
else
togglable_explore()
end
end
function explore_summon_manual()
if resummons~=0 then return end
xsummonfloor=you.where()
xsummontime=you.time()-min_resummon_aut_delay()
--explore_summon_parameter(false,true)
manual_explore=true
if VERSION>.30 and you.spell_table()[xsummon]=="Call Canine Familiar" then xdog=true else xdog=false end
table.insert(r_td,rtd_explore_summon)
end
function pet_dog()
--if dog in range, pet to reset CD
--return whether successful
for x=-1,1 do
for y=-1,1 do
mo=monster.get_monster_at(x,y)
if not(mo==nil) then
if mo:name()=="inugami" and mo:attitude()==4 then
--crawl.mpr(mo:name())
crawl.setopt("message_color ^= mute:prompt:.*")
crawl.setopt("message_color ^= mute:our.* disappears in a puff of smoke") --TD chk if this solves last_dest hiccups
table.insert(r_td, (function()
crawl.setopt("message_color -= mute:prompt:.*")
crawl.setopt("message_color -= mute:our.* disappears in a puff of smoke")
end))
local direction=get_command(target_delta_to_cmd(x, y))
--crawl.mpr(get_command("CMD_PRIMARY_ATTACK")..direction..get_command("CMD_TARGET_SELECT_FORCE_ENDPOINT"))
crawl.sendkeys(get_command("CMD_PRIMARY_ATTACK")..direction..get_command("CMD_TARGET_SELECT_FORCE_ENDPOINT"))
return true
end
end
end
end
crawl.mpr("Inugami out of reach.")
return false
end
function ans_pet_dog(msg)
if msg:match("eally attack while wielding") and wait_x_equip_off and wait_x_last=="wait_weapon"
--and xdogpet
then return true end
end
local xsummon_resume_ctrl_x=false
function explore_summon_parameter(autocall,manual) --summons, then schedules rtd_explore_summon
if autocall and interrupt and tmatch(interrupt,"stop_explore_summon") then return end
if not(xsummon) or you.where()~=xsummonfloor then
explore_summon_reset(xsummonfloor)
return
end
if move_careful and (not(interrupt) or tmatchall(interrupt,"full_mp","xsummon_interrupt","no_allies")) then
--execute summon or inugami shenanigans
if xsummonalt and xsummon2 then
crawl.sendkeys("y"..xsummon2)
xsummonalt=false
else
if xdog then
if xdogpet then
xdogpet=false
else
xdogpet=true
if pet_dog() then
--if autocall then
--table.insert(r_td,rtd_explore_summon);
--else
table.insert(r_td, (function()
explore_summon_parameter(autocall,manual)
end))
return
--end
end
end
end
if not( xdog and (you.status():match("inugami") or you.status():match("unable to call your familiar")) ) then
crawl.sendkeys("y"..xsummon)
xsummonalt=true
else
crawl.mpr("Can't resummon.")
explore_summon_reset(true)
return
end
end
resummons=resummons+1
--echoall(resummons,you.time()-xsummontime,manual)--
xsummontime=you.time()+10--always called before input is processed, so +10
if not(manual) then --resume travel if applicalbe, schedule rtd
--local interrupt_at_call=interrupt --unused
table.insert(r_td, (function()
if interrupt and tmatch(interrupt,"stop_explore_summon") then return end
--echoall("r esp")--
--echoall(autocall)--
if move_careful then
if not(interrupt) then
if togglable_explore_is=="ctrl_explore" and autocall
and tmatch(lastinterrupt,"full_mp","xsummon_interrupt") and tmatchall(lastinterrupt,"full_mp","xsummon_interrupt","no_allies")
--no_allies only applies when summoning inugami
--TD auto-rest if no_allies otherwise?
then
--assert(ctrl_explore_timestamp>=0) --wrong if already G running
--rtd_ctrl_explore()
--echoall("G")
crawl.sendkeys(get_command("CMD_INTERLEVEL_TRAVEL")..LAST_DEST)
manual_explore=false --now works similar to just_explore, until at the target
xsummon_resume_ctrl_x=true
else
manual_explore=false
togglable_explore()
--if ctrl_explore_timestamp>0 then ctrl_explore_timestamp=ctrl_explore_timestamp+10 end
end
if autocall or resummons==1 then table.insert(r_td,rtd_explore_summon) end
elseif not( tmatch(interrupt,"miscast") and tmatchall(interrupt,"miscast","full_mp","no_allies") ) then
crawl.mpr("Cancelling due to interrupt."); testinterrupt=interrupt
explore_summon_reset()
else
manual_explore=true
if autocall or resummons==1 then table.insert(r_td,rtd_explore_summon) end
end
else
explore_summon_reset(true)
end
end))
else
table.insert(r_td,rtd_explore_summon)
end
else
if interrupt then crawl.mpr("Summon interrupted."); testinterrupt=interrupt end
explore_summon_reset(true)
end
end
function rtd_explore_summon()
if interrupt and tmatch(interrupt,"stop_explore_summon") then return end
--does one of: reschedule itself, reschedule itself and explore, explore_summon_parameter, explore_summon_reset
--echoall("xs")--
xsummon_interrupt_chk(true)
if not(xsummon) or you.where()~=xsummonfloor then
explore_summon_reset(xsummonfloor)
return
end
local restedv=( ({you.mp()})[1]==({you.mp()})[2] )
--rested()--TD ignore hp and low contamination... only mp?
--echoall("xs",move_careful, restedv, resummons)
if move_careful and ( not(restedv) or xsummon_delay_condition() ) then
--echoall("xsm")
manual_explore=not(ctrl_exploring or xsummon_resume_ctrl_x)
table.insert(r_td,rtd_explore_summon)
--echoall(xsummon_resume_ctrl_x)--
if xsummon_resume_ctrl_x then
xsummon_resume_ctrl_x=false
togglable_explore()
end
else --not movecarful or rested
--ctrl_expl is going to be interrupted this round
--if ctrl_exploring then manual_explore=false end--unn bc already done when starting cx
--if we just ended map mode, r fires, we aren't in this else block yet,
--but manual is set as false bc cx fires after this.
--If we take a step in the next round, it might go in this block, so we need to check that cx wasn't ended by interrupt, because otherwise manual=false is intended.
--echoall(ctrl_explore_timestamp)--
if togglable_explore_is=="ctrl_explore" and ctrl_explore_timestamp<0 and ctrl_explore_timestamp~=-3 then
--echoall(ctrl_explore_timestamp)--
manual_explore=true
end
--echoall(resummons,xsummonalt)
if restedv then
if resummons=xsummonsbeforedelay and you.time()0
and xsummon_delay_condition()
then
xsummon_interrupt=true
else
crawl.mpr("MP restored.")
result=true
end
end
end
--if iname=="full_mp" then echoall(xsummon, (ctrl_exploring or just_exploring)) end
if result then
--echoall("cia cx false")--
--echoall("---n "..tostring(iname))
--echoall("---c "..tostring(cause))--
--echoall("---e "..tostring(extra))
do_interrupt(iname..(iname=="message" and (" "..tostring(cause).." "..tostring(extra)) or ""))
end
return result
end
end
--echoall("m",chk_interrupt_activity.macro)
--local old_chk_interrupt_activity_macro = chk_interrupt_activity.macro
--chk_interrupt_activity.macro = function(iname,cause,extra)
--return chk_interrupt_activity.travel(iname,cause,extra)
--and move_careful
----and old_chk_interrupt_activity_macro(iname,cause,extra)
--or false --ensure that it never sends nil
--end
--chk_interrupt_activity.run = chk_interrupt_activity.travel
--chk_interrupt_activity.rest = chk_interrupt_activity.run
--local old_chk_interrupt_activities=chk_interrupt_activities
--function chk_interrupt_activities(iname, cause, extra)
--return chk_interrupt_activity.run(iname, cause, extra) and old_chk_interrupt_activities(iname, cause, extra) end
--local old_c_interrupt_activity= c_interrupt_activity
--function c_interrupt_activity(aname, iname, cause, extra)
--echoall(aname)
--return old_c_interrupt_activity(aname, iname, cause, extra)
--end --
function xsummon_interrupt_chk(nostop)
if xsummon_interrupt then
if not(xsummon_delay_condition()) then
if you.turn_is_over() and not(nostop) then you.stop_activity() end
--echoall("xsic")--
do_interrupt("xsummon_interrupt")
xsummon_interrupt=false
end
end
end
function ch_mon_is_safe(monster, is_safe, moving, dis) --hook
xsummon_interrupt_chk() --hack to do the check while travelling with ally in view
return chmon_warn_more_monsters(monster, is_safe, moving, dis)
--return is_safe
end
local function mod_rr_handle_message(mess,ch)
--local ch, mess = rr_split_channel(cause)
chnum=crawl.msgch_num(ch)
for _, x in ipairs(g_rr_ignored) do
if chnum and x.filter:matches(mess, chnum) then
return x.value
end
end
return false
end
local function ally_attacked_out_of_view_msg_test(msg, ch)
--TD what if ally is destroyed before identified? test
--assumes rr_handle_message found the message sus
--used to decide whether to send a monster warning more prompt
local LOS=you.los()
for x = -LOS,LOS do
for y = -LOS,LOS do
local monster_obj = monster.get_monster_at(x, y)
if
not( monster_obj==nil )
and monster_obj:attitude()>3
and you.see_cell(x, y)
then
local name = monster_obj:name()
if msg:find("your "..name,0,true) then return true end
end
end
end
return false
end
function no_other_ally_in_view(msg)
--stationaries dont count
local LOS=you.los()
local found=false
for x = -LOS,LOS do
for y = -LOS,LOS do
local monster_obj = monster.get_monster_at(x, y)
if
not( monster_obj==nil )
and monster_obj:attitude()>3
and you.see_cell(x, y)
then
local name = monster_obj:name()
--echoall("---"..name)
if msg:find(name,0,true) then
if not(found) then
found=true
else
return false --found two with that name
end
elseif not(monster_obj:is_stationary()) then
return false --found a different one that's mobile
end
end
end
end
return true
end
crawl.setopt("runrest_ignore_message ^= prompt:[Ww]here to\?")
local first_turn=you.time()
function cmsg_xsummon(msg, ch)
--if msg:match("you miscast") then
if move_careful then
if
xsummon
and msg:match("our.* disappears in a puff of smoke")
and no_other_ally_in_view(msg)
--it still exists during the message
--when resummoning, for this brief moment both new and old exist
--so it's false in that case
--which is desired, but feels hacky to rely on that phenomon
--but otherwise it would be no_ally_in_view, and then it would also just work.
then
if you.turn_is_over() then you.stop_activity() end
--echoall("---cm xf")
table.insert(r_td, (function() crawl.mpr("No more allies in sight.") end))
do_interrupt("no_allies")
xsummonalt=false
elseif mod_rr_handle_message(msg,ch) then
--if not(you.time()==first_turn and ch:match("god")) then --TD: make that unnecessary, done?
you.stop_activity() --so that you don't check again in chk_interrupt
--echoall("---cm xff"..msg)
do_interrupt("mod_rr "..ch..":"..msg)
if ally_attacked_out_of_view_msg_test(msg, ch) then
monster_warning_td()
end
--end
end
end
end
table.insert(cmsg_funcs,cmsg_xsummon)
------------------------------------------------------------------------------------------------------------
function start_explore_summon()
if c_persist.xs==nil then
c_persist.xs={}
end
if c_persist.xs[you.name()]==nil then
c_persist.xs[you.name()]={ xsummon, xsummon2, xsummonalt }
end
xsummon=c_persist.xs[you.name()][1]
xsummon2=c_persist.xs[you.name()][2]
xsummonalt=c_persist.xs[you.name()][3]
c_persist.xs[you.name()]=nil
if not(xsummon) then crawl.mpr("no explore summon set.") end
end
function save_explore_summon()
c_persist.xs[you.name()]={ xsummon, xsummon2, xsummonalt }
end
-------------------------------------------------------------------------------------------------------------
function explore_chk_and_summon_toggle()
local function f()
crawl.setopt("message_color ^= mute:prompt:.*")
crawl.setopt("message_color ^= mute:[Ww]aypoint")
crawl.setopt("message_color ^= mute:ove the cursor to view")
crawl.setopt("message_color ^= mute:urning to the game")
crawl.setopt("message_color ^= mute:\\(")
crawl.sendkeys(get_command("CMD_DISPLAY_MAP")..get_command("CMD_MAP_EXPLORE")..get_command("CMD_MAP_ADD_WAYPOINT").."0\27")
table.insert(r_td, (function()
crawl.setopt("message_color -= mute:prompt:.*")
crawl.setopt("message_color -= mute:[Ww]aypoint")
crawl.setopt("message_color -= mute:ove the cursor to view")
crawl.setopt("message_color -= mute:urning to the game")
crawl.setopt("message_color -= mute:\\(")
if ({ travel.waypoint_delta(0) })[1]==0 and ({ travel.waypoint_delta(0) })[2]==0 then
just_explore()
else
crawl.mpr("not fully explored.")
end
end))
end
if xsummon and you.where()==xsummonfloor then
--xsummonfloor=""
explore_summon_reset(true)
do_interrupt("stop_explore_summon")
f()
else
crawl.mpr("starting explore_summon")
explore_summon_manual()
table.insert(r_td, 1, f)
end
end
-------------------------------------------------------------------------------------------------------------
local rest_until_normal_mp = {}
rest_until_normal_mp.a = false --if true, run rest_until again
rest_until_normal_mp.z = false --if true, the original equip should be reequipped when rested
local mp_buff=0
local original_equip={}
local old_original_equip={}
function rest_until()
----equips staff at p, rings at Y, and then Z, if those are of magical power, then regenerates as if these weren't equipped
-- then equips back to old stuff unless you were interrupted by a monster
-- basically calls itself in ready() by setting variables
---uses rest_with_prompt(), but could be crawl.sendkeys( get_command("CMD_REST") )
---inscribe mpp, mpY or mpZ repectively
---to do this with artefacts
---atm this is always necessary because !R autoinsciption is not considered
---to undo change the three conditions back
mp_buff=0 --will be increased according to your equip, so that the function knows how much to rest
------------if you have +mp equip that isn't at slots p, Y or Z, it will not be taken into account; this is a feature.
local turn_free=true --will be toggled to false if we equip something
local badletters=false --will be toggled to true if you named the ring on your left hand Z or the ring on your right hand Y
--the next code blocks check the equip and slots, then equip something if necessary
if (not(items.inslot(items.letter_to_index("p"))==nil)) and (items.inslot(items.letter_to_index("p")):name():match("staff of powernever") or items.inslot(items.letter_to_index("p")).inscription:match("mpp")) then
crawl.mpr("mpp")
if (items.equipped_at(0)==nil) then
turn_free=false
crawl.process_keys("wp")
else
if not(items.equipped_at(0):name()=="staff of power" or items.equipped_at(0).inscription:match("mpp")=="mpp") then
original_equip.weapon=items.index_to_letter(items.equipped_at(0).slot)
turn_free=false
crawl.process_keys("wp")
crawl.mpr("test")
end
end
if items.inslot(items.letter_to_index("p")):name()=="staff of power" then
mp_buff=mp_buff+15
else
mp_buff=mp_buff+9
end
end
if turn_free and (not(items.inslot(items.letter_to_index("Y"))==nil)) and (items.inslot(items.letter_to_index("Y")):name():match("ring of magical powernever") or items.inslot(items.letter_to_index("Y")).inscription:match("mpY")) then
if not(items.equipped_at(8)==nil) and items.index_to_letter(items.equipped_at(8).slot)=="Y" then
crawl.mpr("Please assign correct letters for your rings and check your equip.")
rest_until_normal_mp.a=false
rest_until_normal_mp.z=false
badletters=true
original_equip={}
else
if (items.equipped_at(7)==nil) then
turn_free=false
crawl.process_keys("PY")
else
if not(items.equipped_at(7):name()=="ring of magical power" or items.equipped_at(7).inscription:match("mpY")) then
original_equip.lring=items.index_to_letter(items.equipped_at(7).slot)
turn_free=false
crawl.process_keys("R"..original_equip.lring.."PY")
end
end
mp_buff=mp_buff+9
end
end
if turn_free and (not(items.inslot(items.letter_to_index("Z"))==nil)) and (items.inslot(items.letter_to_index("Z")):name():match("ring of magical powernever") or items.inslot(items.letter_to_index("Z")).inscription:match("mpZ")) then
if not(items.equipped_at(7)==nil) and items.index_to_letter(items.equipped_at(7).slot)=="Z" then
crawl.mpr("Please assign correct letters for your rings and check your equip.")
rest_until_normal_mp.a=false
rest_until_normal_mp.z=false
badletters=true
original_equip={}
else
if (items.equipped_at(8)==nil) then
turn_free=false
crawl.process_keys("PZ")
else
if not(items.equipped_at(8):name()=="ring of magical power" or items.equipped_at(8).inscription:match("mpZ")=="mpZ") then
original_equip.rring=items.index_to_letter(items.equipped_at(8).slot)
turn_free=false
crawl.process_keys("R"..original_equip.rring.."PZ")
end
end
mp_buff=mp_buff+9
end
end
--now to use the variables we set, and set globals to call the function again in the next turn, if needed:
--local hp, mhp = you.hp()
local mp, mmp = you.mp()
if not(badletters) then
if mp_buff==0 then
rest_with_prompt()
else
if turn_free then
local percent = math.floor(100*(mmp-mp_buff)/mmp)
crawl.setopt("rest_wait_percent = "..percent)
rest_until_normal_mp.z=true
if not(mp>(mmp-mp_buff-2)) then
rest_with_prompt()
end
else
crawl.mpr("equipped something")
rest_until_normal_mp.a=true
end
end
end
end
function r_rest_until() --this runs in ready()
local hp, mhp = you.hp()
local mp, mmp = you.mp()
if rest_until_normal_mp.a then
rest_until_normal_mp.a=false
if move_careful then
rest_until()
end
else
if rest_until_normal_mp.z and ( mp>(mmp-mp_buff-2) or not(you.feel_safe()) or not(move_careful) ) then
--crawl.mpr("test2")
crawl.setopt("rest_wait_percent = "..rest_wait_percent)
if not(you.feel_safe()) or not(move_careful) then
rest_until_normal_mp.z=false
if
not(original_equip.weapon==nil)
and not(original_equip.lring==nil)
and not(original_equip.rring==nil)
then
old_original_equip=original_equip
original_equip={}
else
crawl.mpr("original_equip=={}")
end
crawl.mpr("Danger! Your equip may be inadequate!")
else
if not(original_equip.weapon==nil) then
crawl.process_keys("w"..original_equip.weapon)
original_equip.weapon=nil
elseif not(original_equip.lring==nil) then
crawl.process_keys("RYP"..original_equip.lring)
original_equip.lring=nil
elseif not(original_equip.rring==nil) then
crawl.process_keys("RZP"..original_equip.rring)
original_equip.rring=nil
rest_until_normal_mp.z=false
end
if original_equip.weapon==nil and original_equip.lring==nil and original_equip.rring==nil then
rest_until_normal_mp.z=false
end
end
end
end
end
function rest_until_restore_equip()
original_equip=old_original_equip
rest_until_normal_mp.z=true
if not(original_equip.weapon==nil) then
crawl.process_keys("w"..original_equip.weapon)
original_equip.weapon=nil
else
if not(original_equip.lring==nil) then
crawl.process_keys("RYP"..original_equip.lring)
original_equip.lring=nil
else
if not(original_equip.rring==nil) then
crawl.process_keys("RZP"..original_equip.rring)
original_equip.rring=nil
rest_until_normal_mp.z=false
end
end
end
if original_equip.weapon==nil and original_equip.lring==nil and original_equip.rring==nil then rest_until_normal_mp.z=false end
end
-------------------------------------------------------------------------------------------------------------
local crystal_ball_notified = false
function r_crystal_ball_notify()
if (not(items.inslot(items.letter_to_index("c"))==nil)) and items.inslot(items.letter_to_index("c")):name()=="crystal ball of energy" then
local mp, mmp = you.mp()
local evo = you.skill("evocations")
if ( (mp-9)/mmp<(76-2*math.floor(evo))/100 ) then
if not(crystal_ball_notified) then
crawl.mpr("You need to stay over "..tostring(math.floor(mmp*(76-2*math.floor(evo))/100)+1).." MP to use the crystal ball!",7)
crawl.more()
crystal_ball_notified = true
end
else
crystal_ball_notified = false
end
end
end
---------------------------------------------------
function use_ball()
if you.status("vitalised") or crawl.yesno("Really use the crystal ball?",true) then
crawl.process_keys("Vc")
else
crawl.mpr("ok then.",2)
end
end
-------------------------------------------------------------------------------------------------------------
function bad_key()
crawl.mpr("this key doesn't do anything right now!")
crawl.more()
end
-------------------------------------------------------------------------------------------------------------
gourm_reminded=true
function r_chk_gourm_fullness()
if you.gourmand() then
if you.hunger()==6 and not(gourm_reminded) then
crawl.mpr("You are no longer engorged.")
crawl.more()
gourm_reminded=true
elseif you.hunger()==7 and gourm_reminded then
gourm_reminded=false
end
end
end
-------------------------------------------------------------------------------------------------------------
function wiz_spell_costs()
crawl.mpr("spc="..you.skill_cost("spellcasting").." spc*2="..(2*you.skill_cost("spellcasting")).." conj*3="..3*you.skill_cost("conjurations").." air="..you.skill_cost("air magic").." fire="..you.skill_cost("fire magic").." tl="..you.skill_cost("translocations").." hx="..you.skill_cost("hexes"))
--crawl.mpr("spc*4="..(4*you.skill_cost("spellcasting")).." conj*3="..(3*you.skill_cost("conjurations")).." air*3+fire*2="..(3*you.skill_cost("air magic")+2*you.skill_cost("fire magic")).. " 4*spc-tl-hx="..(4*you.skill_cost("spellcasting")-you.skill_cost("translocations")-you.skill_cost("hexes")))
crawl.mpr("spc*4="..(4*you.skill_cost("spellcasting")).." conj*2="..(2*you.skill_cost("conjurations")).." 2*tl="..(2*you.skill_cost("translocations")).." 2*hx="..(2*you.skill_cost("hexes")).." 2(tl+hx)="..(2*you.skill_cost("translocations")+2*you.skill_cost("hexes")))
end
-------------------------------------------------------------------------------------------------------------
--see if you have all spells in sstspls, broken by .31
local sstnum=0
local sstspls = {"Apportation",
"Confusing Touch",
"Magic Dart",
"Foxfire",
"Blink",
"Passwall",
"Slow",
"Swiftness",
"Ozocubu's Armour",
"Mephitic Cloud",
"Gell's Gravitas",
"Cause Fear",
"Leda's Liquefaction",
"Enfeeble",
"Fulminant Prism",
"Iskenderun's Mystic Blast",
"Fireball",
"Iskenderun's Battlesphere",
"Yara's Violent Unravelling",
"Deflect Missiles",
"Dispersal",
"Orb of Destruction",
"Discord",
"Disjunction",
"Fire Storm",
"Polar Vortex",
"Shatter",
"Chain Lightning",
"Lehudib's Crystal Spear",
"Summon Lightning Spire",
"Teleport Other",
"Airstrike",
"Spellforged Servitor",
"Summon Guardian Golem",
"Vile Clutch",
"Death's Door",
"Necromutation",
"Borgnjor's Revivification",
"Iron Shot",
"Ignition",
"Passage of Golubria",
"Summon Butterflies",
"Regeneration",
"Confuse",
"Force Lance",
"Agony",
"Aura of Abjuration",
"Bolt of Cold",
"Bolt of Fire",
"Ring of Flames",
"Glaciate",
"Tornado",
"Controlled Blink",
"Invisibility",
"Darkness",}
local sst_responses={}
function sif_spells_test()
sstnum=1
end
function r_sif_spells_test()
if sstnum>0 then --sstnum==0 means nothing should be done
if sstnum<=table.maxn(sstspls) then
if sstnum>1 then
table.insert(sst_responses,crawl.messages(1))
end
crawl.sendkeys("Ä\6")
crawl.sendkeys(sstspls[sstnum])
crawl.sendkeys("\13a")
sstnum=sstnum+1
else
table.insert(sst_responses,crawl.messages(1))
sstnum=0
local maxn=table.maxn(sstspls)
for i=1,maxn,1 do
if sst_responses[i]:match("Okay, then.")=="Okay, then." and not(spells.memorised(sstspls[i])) then
crawl.mpr(sstspls[i])
else if sst_responses[i]=="Memorise" then
table.remove(sst_responses,i+1)
end
end
end
sst_responses={}
end
end
end
function ans_sif_spells_test() --called in c_answer_prompt()
if sstnum>0 then
table.insert(sst_responses,"Memorise")
crawl.sendkeys("N")
end
end
-------------------------------------------------------------------------------------------------------------
function prompt_orb()
local mo=nil
local orb_near=false
for x=-1,1 do
for y=-1,1 do
mo=monster.get_monster_at(x,y)
if
not(mo==nil) and
(mo:name()=="orb of destruction"
or mo:name()=="battlesphere" and prompt_orb_battlesphere(x,y))
then
orb_near=true
break
end
end
end
if not(orb_near) or crawl.yesno("Really cast Orb of Destruction?",true,"n") then
crawl.sendkeys("YM")
else
crawl.mpr("ok then.",2)
end
end
function prompt_orb_battlesphere(x0,y0)
local mo=nil
local orb_near=false
for x=-1,1 do
for y=-1,1 do
mo=monster.get_monster_at(x0+x,y0+y)
if not(mo==nil) and mo:name()=="orb of destruction" then
orb_near=true
break
end
end
end
return orb_near
end
----------------------------------------------------------------------------------------------------------------
--unused, delete?
local autopickup_gold=true
crawl.setopt("autopickup = $?!+\"/")
--crawl.setopt("autopickup_exceptions += gold piece")
--crawl.setopt("autopickup_exceptions -= 1 then
--crawl.sendkeys("V"..items.index_to_letter(items.equipped_at(0).slot))
--crawl.do_commands({"CMD_EVOKE_WIELDED"})
--crawl.do_commands({"CMD_PRIMARY_ATTACK"})
attack_ignore_inscription()
elseif false then
--elseif items.fired_item() and items.fired_item().is_throwable then
crawl.sendkeys("F\13")
--crawl.do_commands({"CMD_EVOKE_WIELDED"})
--crawl.do_commands({"CMD_PRIMARY_ATTACK"})
else
attack_ignore_inscription()
end
end
end
local attack_ignore_inscription_undo = 0
function attack_ignore_inscription()
local direction = ""
if target_delta_to_cmd(d.x, d.y) then
direction=get_command(target_delta_to_cmd(d.x, d.y))
--echoall(direction)
end
local insc = get_command("CMD_INSCRIBE_ITEM")
local v = get_command("CMD_PRIMARY_ATTACK")
crawl.setopt("message_color ^= mute:inscri")
crawl.setopt('message_color ^= mute:'..util.trim(items.index_to_letter(items.equipped_at(0).slot))..'.-.')
if items.equipped_at(0).inscription:find("!a") then
if items.equipped_at(0).inscription:find("!a!a") then
crawl.sendkeys(insc..items.index_to_letter(items.equipped_at(0).slot).."\8\8\8\8\13"..v..direction..firemaybe)
else
crawl.sendkeys(insc..items.index_to_letter(items.equipped_at(0).slot).."\8\8\13"..v..direction..firemaybe)
end
attack_ignore_inscription_undo = 2
else
crawl.sendkeys(v..direction..firemaybe)
end
--attack_ignore_inscription_undo = 2
attack_ignore_inscription_undo = 3
end
function r_attack_ignore_inscription()
if attack_ignore_inscription_undo==2 then
local insc = get_command("CMD_INSCRIBE_ITEM")
crawl.sendkeys(insc..items.index_to_letter(items.equipped_at(0).slot).."!a\13")
attack_ignore_inscription_undo = 3
elseif attack_ignore_inscription_undo==3 then
attack_ignore_inscription_undo = 0
crawl.setopt("message_color -= mute:inscri")
crawl.setopt('message_color -= mute:'..util.trim(items.index_to_letter(items.equipped_at(0).slot))..'.-.')
end
end
----------------------------------------------------------------------------------------------------------------
local last_thrown_letter --in the next function, is actually next thrown
function throw()
used_spell=false
used_throw=true
--crawl.sendkeys("F")
local last_thrown_exists=false
--echoall(last_thrown_letter)
for k in pairs(items.inventory()) do
if items.inventory()[k].is_throwable then
--echoall(items.index_to_letter(items.inventory()[k].slot))
if items.index_to_letter(items.inventory()[k].slot)==last_thrown_letter then
crawl.mpr("+"..items.index_to_letter(items.inventory()[k].slot).."-"..items.inventory()[k]:name_coloured())
last_thrown_exists=true
else
crawl.mpr("-"..items.index_to_letter(items.inventory()[k].slot).."-"..items.inventory()[k]:name_coloured())
end
end
end
crawl.mpr("throw what?",2)
--local input=crawl.c_input_line()
local input=crawl.getch()
input=utf8char(input)
--if input and #input==1 and ( input:match("%l") or input:match("%u") ) then
if input:match("%l") or input:match("%u") then
last_thrown_letter=input
last_thrown_exists=true
--elseif input==nil or #input>0 or last_thrown_letter==nil then
elseif not(input=="\13") or last_thrown_letter==nil then
crawl.mpr("...",2)
return
end
if last_thrown_exists then
crawl.sendkeys("F"..last_thrown_letter)
else
crawl.mpr("ammunition not found.",2)
end
end
----------------------------------------------------------------------------------------------------------------
--Y.\{216}
local repeat_spellvar = {}
repeat_spellvar.a=false
function repeat_spell()
if used_spell then
crawl.setopt("message_colour -= mute:Casting:")
crawl.setopt("message_colour ^= mute:know that spell")
crawl.setopt("message_colour ^= mute:kay. then")
repeat_spellvar.a=true
--repeat_spellvar.m=crawl.messages(1)
crawl.sendkeys("Y\27")
elseif used_throw then
--crawl.sendkeys("F\13f")
if
last_thrown_letter
and items.inslot(items.letter_to_index(last_thrown_letter))
and items.inslot(items.letter_to_index(last_thrown_letter)).is_throwable
then
crawl.sendkeys("F"..last_thrown_letter.."f")
else
crawl.mpr("ammunition not found.",2)
crawl.more()
end
else
evoke_prompt()
crawl.sendkeys("f")
--crawl.process_keys("f")
end
end
function r_repeat_spell()
if repeat_spellvar.a then
local msg=crawl.messages(1)
--crawl.mpr("f"..msg)
--crawl.mpr("R"..crawl.trim(repeat_spellvar.m))
crawl.setopt("message_colour ^= mute:Casting:")
crawl.setopt("message_colour -= mute:know that spell")
crawl.setopt("message_colour -= mute:kay. then")
if msg:match("Casting:")=="Casting:" then
msg=msg:gsub("Casting: ","")
msg=msg:gsub(" %(.+","")
if spells.dir_or_target(msg) then
--crawl.mpr("f")
--if msg=="Searing Ray" then
--crawl.sendkeys(get_command("CMD_WAIT"))
--else
crawl.sendkeys("Y.!")
--end
else
--if utf8char(crawl.getch())=="d" then
if
msg=="Shatter"
or msg=="Foxfire"
or msg=="Starburst"
or msg=="Lee's Rapid Deconstruction"
--or utf8char(crawl.getch())=="f"
then
crawl.sendkeys("Y\13")
else
crawl.mpr("...",2)
end
end
end
repeat_spellvar.a=false
end
end
----------------------------------------------------------------------------------------------------------------
function ans_attack_noprompt(msg) --TD:generalize and expand
if
msg:match("eally attack near your battlesphere%?")
or msg:match("eally attack near your spellforged servitor%?")
or msg:match("eally attack near your spellforged servitor and battlesphere%?")
or msg:match("eally attack near your battlesphere and spellforged servitor%?")
or msg:match("eally attack your inugami%?")
then
--if not(cmsg_sending) then
--cmsg_sending=true
--crawl.sendkeys("Y")
--cmsg_sending=false
--end
return true
end
end
----------------------------------------------------------------------------------------------------------------
--if c_persist.branches==nil then
--c_persist.branches={}
--c_persist.branches[you.name()]={}
--else
--if c_persist.branches[you.name()]==nil then
--c_persist.branches[you.name()]={}
--end end
--local branches = c_persist.branches[you.name()]
local branches = {}
function r_annotate_branchend()
--except branches with just 2 floors
if
not(branches[you.branch()])
and you.depth()==travel.find_deepest_explored(you.branch())
then
if you.depth()==1 then
branches[you.branch()]=0 --just entered new branch
else
branches[you.branch()]=-1
--this value means, first time visiting the latest branch level since reload
--otherwise, it will be deepest explored depth of the branch before this turn
--or nil, if you haven't reached the latest branch level since reload
--if you reloaded while still on first lvl of branch, it will think you just entered it
--to fix that, you would need to assign branches[x]=deepest for all branches when loading, or use c_persist, or maybe just you.turns_on_level()
--not needed atm
end
end
if branches[you.branch()] and you.depth()>branches[you.branch()] then
--you just went down further than before
if you.depth()>1 and not(branches[you.branch()]==-1) then
--skip depth=1 because you cant calculate the branchend
--dont change annotations if you just reloaded
local branchend=(you.depth()-1)/you.depth_fraction()+1 --nan if you.depth()==1
if (you.depth()>branchend-1.5 and you.depth()!\13")--annotate next level
elseif you.depth()>branchend-0.5 then
crawl.sendkeys("!.\8\8\8\8\8\8\8\8\8\8\13")--delete annotation of this lvl
end
end
branches[you.branch()]=math.max(travel.find_deepest_explored(you.branch()), you.depth())--c_persist.branches[you.name()][you.branch()]=
end
end
----------------------------------------------------------------------------------------------------------------
function krepeat()
--crawl.sendkeys("`") --just repeats the macro instead of the previous action, looping forever
end
----------------------------------------------------------------------------------------------------------------
local safety_on = 0
local safety_time = 0
function r_safety_precaution()
local hp, mhp = you.hp()
if hpsafety_time then
crawl.mpr("calling crawl.delay for 15 seconds.")
if crawl.messages(1):match("crawl.delay") then
crawl.delay(15000)
crawl.mpr("...")
end
safety_time=you.time()
end
else
safety_on=0
end
end
---------------------------------------------------------------------------------------------------------------------------------------------------------
-- ===dump_all1, ...
-- show all global variables
local seen={}
function dump(t,i,dontclear,start,limit)
seen[t]=true
local s={}
local n=0
for k in pairs(t) do
n=n+1 s[n]=k
end
table.sort(s)
for k,v in ipairs(s) do
if ( not(start) or k>=start ) and ( not(limit) or k, bug?
{
local turn_of_last_climb=0
local floor_of_last_climb=-1
function climbprompt(cmd)
if
(you.absdepth()==floor_of_last_climb or floor_of_last_climb==-1 or turn_of_last_climb=({you.hp()})[2]*.5 )
and ( cmd=="<" or rested(0.6) or not(view.feature_at(0,0):match("stairs")) )
or crawl.yesno("really climb?",true)
then
crawl.sendkeys(cmd)
turn_of_last_climb=you.turns()+2 --processed before sendkeys, which takes 2 turns if actually climbing
floor_of_last_climb=you.absdepth()
else
crawl.mpr("ok, then.",2)
turn_of_last_climb=0
end
end
function climbup()
climbprompt("<")
end
function climbdown()
climbprompt(">")
end
}
macros += M < ===climbup
macros += M > ===climbdown
#ß\{223} ^H\{8} ^Ö \{150}\{246} ^J\{10} ^L\{12} ^K\{11} ^Ä \{132}\{228}error ^Ü \{156} ^s 19
macros += M \{19} ===macro_save_now
macros += M S ===macro_save
#macros += M \{11} ===toggle_move_careful_on
macros += M \{11} ===show_enemy_beam_path
#macros += M H ===rest_until
#macros += M \{8} ===rest_until_restore_equip
macros += M \{8} ===toggle_togglable_rest
macros += M H ===rest_until_restore_equip
#macros += M \{246} ===explore_simpler
macros += M \{246} ===explore_chk_and_summon_toggle
#macros += M \{246} ===togglable_explore
#just_explore
macros += M \{10} ===k_rest_for
macros += M \{12} ===remindMe
macros += M \{223} ===wiz_spell_costs
#macros += M ] ===sif_spells_test
macros += M v ===evoke_prompt
macros += M \{248} ===toggle_warn_more_monsters
#^B\{2}
macros += M B ===throw
#macros += M ¹
#^8
macros += M \{-40} ===wait_ring
#^9
macros += M \{-39} ===wait_ring2
#^7
macros += M \{-41} ===wait_weapon
#^8
macros += M 8 ===wait_ring
#^9
macros += M 9 ===wait_ring2
#^7
macros += M 7 ===wait_weapon
#macros += M 9 ===super_rest
#macros += M 8 ===super_rest
#"K:" default,
#"K1:" level-map,
#"K2:" targeting or
#"K3:" confirmation.
#K4: menu as of .31
#ö 246 =x-61-74 => x-61=320
#ä 228 =x-61-92 => x-61=320
#ü x-61-68=252
#Ö 214
#Ä 196
#Ü 220
#W 23
#esc 27
#tab 9
#F8 - F9
macros += K \{-1073741889} =
macros += K \{-1073741890} =
macros += K \{-272} =
macros += K \{-273} =
macros += K - <
macros += K _ >
macros += K4 - <
macros += K4 _ >
#macros += K - -
#macros += K _ _
#bindkey = [-] CMD_GO_UPSTAIRS
#bindkey = [_] CMD_GO_DOWNSTAIRS
#macros += K < -
#macros += K > _
#f11,12
macros += K \{-1073741892} -
macros += K \{-1073741893} _
macros += K \{-275} -
macros += K \{-276} _
#shaltgr-,altgr-
macros += K \{8212} -
macros += K \{8211} _
macros += K1 - <
macros += K1 _ >
#macros += K1 < -
#macros += K1 > _
macros += K1 < <
macros += K1 > >
macros += K1 n ]
macros += K1 y [
macros += K1 q \{23}
#why was this vvv commented out?
macros += K2 f !
#! dont't stop at target, @ stop, both ignore range
macros += K2 t @
#space as esc in targeting
macros += K2 \{32} \{27}
macros += K2 \{228} \{27}
macros += K2 \{246} +
macros += K2 x !\{1000}
#hopefully not actually a key at 1000
macros += M \{1000} ===remindMe
macros += K3 y Y
#doesnt seem to work -.-
macros += M # '
macros += M ' #
macros += M + =s!
#macros += M H 5
#macros += M H ===rest_with_prompt
#enter \{13}
#happens to be ^M as well
macros += M \{13} p
#macros += M p ===rest_with_prompt
macros += M p ===togglable_rest
#ä
#macros += M \{228} N!
macros += K \{228} `
#spell_menu = true
#Disables "you dont know that spell" message, and with it the more prompt I expect
#macros += M z Y*!
macros += M z y
macros += M a YH
macros += M s YJ
macros += M d YK
macros += M f YL
#macros += M x YX now M
macros += M x ===prompt_orb
macros += M A yh
macros += M S yj
macros += M D yk
macros += M F yl
macros += M X ym
#altgrF
macros += M \{273} F
macros += M E EA
#macros += M y Y*
#macros += M N D
#macros += M y n
macros += M y d\\
#macros += M n Y*
macros += M n y
macros += M N Y*!
macros += M Y D
#macros += M B A
#for nagas?^B\{2}, used to be B
macros += M \{2} ag
#macros += M Y a
#macros += M Y Vc
#place crystal ball at c
#no more ball
#macros += M Y ===use_ball
#macros += M b v
macros += M b a
#Ü
macros += M \{220} =i
#tab
#macros += M \{9} *
#no more hunger
#macros += M D e
#macros += M D n #see spellmacros
macros += M k k!
macros += M * N
#mouse
#ctrl u to altgr u
macros += M \{21} \{8595}
macros += M \{8595} ===rest_for_turn
#ctrl p to altgr p
macros += M \{16} \{254}
macros += M \{254} ===k_rest_for
#fixing mouse clearing more() not
#macros += M \{-9992} ===bad_key
#macros += K \{-9999} ==bad_key
#tab to shift-tab
#macros += M \{9} \{-233}
#macros += M \{-233} \{9}
#macros += M e ===just_explore
#macros += M e ===explore_simpler
macros += M e ===togglable_explore
########left numbers p ü+ ä enter uoÖ 789ß
# 2 1 345
# F 4 3 12 5
# " Z §
#^1 ü
macros += M 1 \{252}
#macros += M \{-15} \{252}
macros += M 2 ===togglable_rest
macros += M " ===rest_until_restore_equip
#local
##^2
macros += M \{-46} ===rest_with_prompt
##^3
#macros += M \{-45} ===toggle_togglable_rest
macros += M \{-45} ===toggle_togglable_explore
##^4
macros += M \{-44} ===toggle_rest_wait_percent
##^5
macros += M \{-43} ===toggle_travel_open_doors
##^6
macros += M \{-42} ===toggle_avoidapproach
#tiles
#^2
macros += M \{-14} ===rest_with_prompt
#^3
#macros += M \{-13} ===toggle_togglable_rest
macros += M \{-13} ===toggle_togglable_explore
#^4
macros += M \{-12} ===toggle_rest_wait_percent
#^5
macros += M \{-11} ===toggle_travel_open_doors
#^6
macros += M \{-10} ===toggle_avoidapproach
#macros += M 3 ===wait_weapon
#macros += M 4 ===wait_ring
#macros += M 5 ===wait_ring2
macros += M 3 ===explore_summon
macros += M 4 tr
macros += M 5 tt
#§ to Ö
macros += M \{167} \{214}
macros += M Z =s
#^Z
macros += M \{26} N
#^v to Ö
macros += M \{22} '
#F1-7
macros += M \{-1073741882} \{8595}
macros += M \{-1073741883} \{15}
macros += M \{-1073741884} ===rest_for_turn
macros += M \{-1073741885} ===k_rest_for
macros += M \{-1073741886} p
macros += M \{-1073741887} \\
macros += M \{-1073741888} \\-
macros += M \{-265} \{8595}
macros += M \{-266} \{15}
macros += M \{-267} ===rest_for_turn
macros += M \{-268} ===k_rest_for
macros += M \{-269} p
macros += M \{-270} \\
macros += M \{-271} \\-
##^o
#macros += M 1 \{15}
##^u 21
#macros += M 2 \{21}
#macros += M " ===switch_autopickup_gold
#macros += M 3 ===toggle_rest_wait_percent
#macros += M § ===toggle_rest_wait_percent
#macros += M 4 ===rest_until_restore_equip
#macros += M 5 ===rest_with_prompt
#12345 F1234 "§%
#æ 230
#bindkey = [æ] CMD_QUAFF
#macros += M 1 \{230}
#macros += M 1 \{-233}
#macros += M x ===rest_until
#` repeat
#bindkey = [q] CMD_PREV_CMD_AGAIN
#recast last used spell
#macros += M z ===repeat_spell
#macros += M x ===repeat_spell
macros += M c ===repeat_spell
#macros += M x ===bad_key
#macros += M q
#ü inventory
#macros += M w \{252}
#exploreenter
#rest
#macros += M r ===rest_with_prompt
#macros += M t ===super_rest
########
#` repeat
#bindkey = [\{9}] CMD_PREV_CMD_AGAIN
##shifttab
#macros += M 1 \{-233}
##ü inventory
#macros += M 2 \{252}
##explore
#macros += M 3 ===just_explore
##rest
#macros += M 4 ===rest_with_prompt
#macros += M 5 ===super_rest
###########
#macros += M \{9} h
#macros += M \{-233} ===rest_for_turn
macros += M \{9} ===togglable_wait
macros += M h ===togglable_wait
macros += M \{-233} ===toggle_togglable_wait
#macros += K1 \{246} v
:if VERSION>.26 then
macros += M \{1114111} ===map_cx_try_other_target
macros += K1 \{246} \{27}\{1114111}
:if dummy_keys_made==0 then dummy_keys_made=1 end
:else
macros += M 1 ===map_cx_try_other_target
macros += K1 \{246} v
:end
:if you.wizard() then
macros += M 1 ===wiz1
:end
#disabling swing-only keys when not overwritten by bindkey
bindkey = [^H] CMD_NO_CMD_DEFAULT
bindkey = [^J] CMD_NO_CMD_DEFAULT
#bindkey = [^K] CMD_NO_CMD_DEFAULT
bindkey = [^L] CMD_NO_CMD_DEFAULT
bindkey = [^Y] CMD_NO_CMD_DEFAULT
bindkey = [^U] CMD_NO_CMD_DEFAULT
#bindkey = [^B] CMD_NO_CMD_DEFAULT
#bindkey = [^N] CMD_NO_CMD_DEFAULT
#not sure if it thinks it's the keycode... --TD
#bindkey = [1] CMD_NO_CMD_DEFAULT
#bindkey = [2] CMD_NO_CMD_DEFAULT
#bindkey = [3] CMD_NO_CMD_DEFAULT
#bindkey = [4] CMD_NO_CMD_DEFAULT
#bindkey = [6] CMD_NO_CMD_DEFAULT
#bindkey = [7] CMD_NO_CMD_DEFAULT
#bindkey = [8] CMD_NO_CMD_DEFAULT
#bindkey = [9] CMD_NO_CMD_DEFAULT
macros += M 6 \{27}
bindkey = [Ø] CMD_TARGET_SELECT_FORCE
bindkey = [ł] CMD_MAP_ANNOTATE_LEVEL
bindkey = [n] CMD_TARGET_CANCEL
#https://github.com/crawl/crawl/blob/master/crawl-ref/source/command-type.h
bindkey = [h] CMD_WAIT
bindkey = [j] CMD_MOVE_LEFT
bindkey = [,] CMD_MOVE_DOWN
bindkey = [i] CMD_MOVE_UP
bindkey = [l] CMD_MOVE_RIGHT
bindkey = [u] CMD_MOVE_UP_LEFT
bindkey = [o] CMD_MOVE_UP_RIGHT
bindkey = [m] CMD_MOVE_DOWN_LEFT
bindkey = [.] CMD_MOVE_DOWN_RIGHT
bindkey = [J] CMD_RUN_LEFT
bindkey = [;] CMD_RUN_DOWN
bindkey = [I] CMD_RUN_UP
bindkey = [L] CMD_RUN_RIGHT
bindkey = [U] CMD_RUN_UP_LEFT
bindkey = [O] CMD_RUN_UP_RIGHT
bindkey = [M] CMD_RUN_DOWN_LEFT
bindkey = [:] CMD_RUN_DOWN_RIGHT
bindkey = [j] CMD_TARGET_LEFT
bindkey = [,] CMD_TARGET_DOWN
bindkey = [i] CMD_TARGET_UP
bindkey = [l] CMD_TARGET_RIGHT
bindkey = [u] CMD_TARGET_UP_LEFT
bindkey = [o] CMD_TARGET_UP_RIGHT
bindkey = [m] CMD_TARGET_DOWN_LEFT
bindkey = [.] CMD_TARGET_DOWN_RIGHT
bindkey = [J] CMD_TARGET_DIR_LEFT
bindkey = [;] CMD_TARGET_DIR_DOWN
bindkey = [I] CMD_TARGET_DIR_UP
bindkey = [L] CMD_TARGET_DIR_RIGHT
bindkey = [U] CMD_TARGET_DIR_UP_LEFT
bindkey = [O] CMD_TARGET_DIR_UP_RIGHT
bindkey = [M] CMD_TARGET_DIR_DOWN_LEFT
bindkey = [:] CMD_TARGET_DIR_DOWN_RIGHT
bindkey = [j] CMD_MAP_MOVE_LEFT
bindkey = [,] CMD_MAP_MOVE_DOWN
bindkey = [i] CMD_MAP_MOVE_UP
bindkey = [l] CMD_MAP_MOVE_RIGHT
bindkey = [u] CMD_MAP_MOVE_UP_LEFT
bindkey = [o] CMD_MAP_MOVE_UP_RIGHT
bindkey = [m] CMD_MAP_MOVE_DOWN_LEFT
bindkey = [.] CMD_MAP_MOVE_DOWN_RIGHT
bindkey = [J] CMD_MAP_JUMP_LEFT
bindkey = [;] CMD_MAP_JUMP_DOWN
bindkey = [I] CMD_MAP_JUMP_UP
bindkey = [L] CMD_MAP_JUMP_RIGHT
bindkey = [U] CMD_MAP_JUMP_UP_LEFT
bindkey = [O] CMD_MAP_JUMP_UP_RIGHT
bindkey = [M] CMD_MAP_JUMP_DOWN_LEFT
bindkey = [:] CMD_MAP_JUMP_DOWN_RIGHT
bindkey = [p] CMD_MAP_ADD_WAYPOINT
bindkey = [a] CMD_MAP_EXPLORE
bindkey = [k] CMD_MAP_FIND_YOU
bindkey = [s] CMD_MAP_FIND_YOU
bindkey = [w] CMD_MAP_GOTO_TARGET
#bindkey = [3] CMD_MAP_GOTO_TARGET
macros += K1 3 w
#macros += K1 w e
bindkey = [e] CMD_MAP_DESCRIBE
bindkey = [r] CMD_MAP_EXCLUDE_AREA
bindkey = [x] CMD_MAP_EXCLUDE_AREA
bindkey = [^X] CMD_MAP_CLEAR_EXCLUDES
bindkey = [X] CMD_MAP_FIND_EXCLUDED
bindkey = [^Z] CMD_MAP_WIZARD_FORGET
bindkey = [q] CMD_MAP_EXIT_MAP
#bindkey = [b] CMD_EXPLORE
#bindkey = [B] CMD_OPEN_DOOR
#bindkey = [h] CMD_DISPLAY_INVENTORY
#bindkey = [h] CMD_MAP_FIND_STASH
#bindkey = [H] CMD_DISPLAY_SPELLS
#bindkey = [y] CMD_DISPLAY_RELIGION
#bindkey = [Y] CMD_MAKE_NOTE
#bindkey = [n] CMD_DISPLAY_SKILLS
#bindkey = [N] CMD_MEMORISE_SPELL
bindkey = [b] CMD_EXPLORE
bindkey = [B] CMD_OPEN_DOOR
bindkey = [ü] CMD_DISPLAY_INVENTORY
bindkey = [ü] CMD_MAP_FIND_STASH
bindkey = [N] CMD_DISPLAY_SPELLS
bindkey = [þ] CMD_DISPLAY_RELIGION
bindkey = [Ö] CMD_REPLAY_MESSAGES
bindkey = [^N] CMD_MAKE_NOTE
bindkey = [p] CMD_DISPLAY_SKILLS
bindkey = [Ä] CMD_MEMORISE_SPELL
bindkey = [^X] CMD_LOOK_AROUND
bindkey = [K] CMD_DISPLAY_MAP
#bindkey = [] CMD_INTERLEVEL_TRAVEL
bindkey = [g] CMD_PICKUP
bindkey = [n] CMD_DROP
#bindkey = [N] CMD_NO_CMD_DEFAULT to spells for makro
bindkey = [z] CMD_NO_CMD_DEFAULT
bindkey = [Z] CMD_NO_CMD_DEFAULT
bindkey = [y] CMD_CAST_SPELL
bindkey = [Y] CMD_FORCE_CAST_SPELL
#altgr u
bindkey = [↓] CMD_RESISTS_SCREEN
bindkey = [k] CMD_FULL_VIEW
bindkey = [^B] CMD_FIRE
#CMD_FIRE_ITEM_NO_QUIVER
bindkey = [k] CMD_TARGET_TOGGLE_BEAM
bindkey = [ł] CMD_LUA_CONSOLE
#small_more = true
more := force_more_message
stop := runrest_stop_message
ignore := runrest_ignore_message
stop += prompt:\?, danger:., warning:., monster_warning:., mutation:.
#stop ^= sound:.
#done by lua now:
#force_more_message += into view, too close, being watched by
#force_more_message += into view, being watched by
#force_more_message += being watched by
#force_more_message += into view
#force_more_message += out of view
#force_more_message += deactivating autopickup
#force_more_message+=autopickup is now off
#timed portals
#more += timed_portal:^\W*(\b(\w\w\w\w\w\w+|\w\w?\w?\w?|([^H\W]..|H[^u\W].|Hu[^r\W])\w\w)\b\W*)+$, vibrate strangely
more += timed_portal:yellow, vibrate strangely
runrest_stop_message ^= timed_portal:., vibrate strangely
#
more += mutation:.
#force_more_message += increases to level, levels and is now at level
#flash_screen_message += increases to level, levels and is now at level
#done by c_msg now
#force_more_message += finished your manual
#flash_screen_message += finished your manual
# Dangerous weapons, handled by wmm_monsters()
#flash_screen_message += is wielding.*distortion
## dancing weapons require special handling...
#flash_screen_message += there is a.*distortion
#flash_screen_message += of distortion comes into view
#
#flash_screen_message += carrying a wand of
#flash_screen_message += wielding .* of distortion
##force_more_message += (?!.*(Here|Aim):)^.*wielding.*of distortion
#removing default made redundant by move_careful
force_more_message -= Marking area around .* as unsafe
more += [Yy]ou sense a monster nearby
more += magic feels tainted
more += lose access to your magic
more += [Yy]ou miscast
stop ^= [Yy]ou miscast
#more += [Nn]othing appears to happen
#stop ^= [Nn]othing appears to happen
force_more_message += You cannot blink
force_more_message += Your stasis prevents you from teleporting
force_more_message += [Yy]ou can't wield
# Interrupts from gammafunk.rc
more += You don't .* that spell
more += You fail to use your ability
more += You miscast.*(Blink|Borgnjor|Door|Invisibility)
more += You can't (read|drink|do)
more += You cannot .* while unable to breathe
more += You cannot .* in your current state
more += when .*silenced
more += too confused
more += There's something in the way
more += There's nothing to (close|open) nearby
more += not good enough to have a special ability
more += You are too berserk
more += no means to grasp
more += That item cannot be evoked
more += You are held in a net
more += You don't have any such object
more += You can't unwield
more += enough magic points
more += You don't have the energy to cast that spell
more += You are unable to access your magic
#debuffs
#force_more_message += contaminate
force_more_message += You become entangled
more += You are held in a net
more += calcifying dust hits you\W
more += floating eye.s view
more += floating eye seems to glare
more += floating eye gazes
#traps
force_more_message += ou hear a loud .Zot.
force_more_message += Your surroundings
# suddenly seem different.
force_more_message += wrath finds you
more += You are.*confused
# Bad things, gammafunk.rc
more += Your surroundings flicker
more += You cannot teleport right now
more += A sentinel's mark forms upon you
more += (blundered into a|invokes the power of) Zot
more += enter a teleport trap
more += Ouch! That really hurt!
#more += dispelling energy hits you
more += You are blasted by holy energy!
more += You are (blasted|electrocuted)!
#more += You are.*(confused|poisoned)
more += god:(sends|finds|silent|anger)
more += You feel a surge of divine spite
more += disloyal to dabble
more += lose consciousness
more += You are too injured to fight blindly
#more += calcifying dust hits
more += Space warps.*around you
more += Space bends around you
#more += watched by something #done by lua
#more += flickers and vanishes! #l
more += doesn't seem very happy
more += is no longer charmed
# Hell effects
more += hell_effect:
#buffs running out
more += finish channelling
force_more_message += Your divine stamina fades away.
force_more_message += Your ring of flames is guttering out
more += You feel less protected from missiles
#more += dispelling energy hits you
force_more_message += Your magical effects are unravelling
# Expiring effects, gammafunk
#more += You feel yourself slow down #l
more += You are starting to lose your buoyancy
more += Your hearing returns
more += Your transformation is almost over
more += You have a feeling this form
more += You feel yourself come back to life
more += time is quickly running out
more += life is in your own hands
more += You start to feel a little slower
# monster Item Use, magus.rc
more += drinks a potion
more += evokes.*(amulet|ring)
more += reads a scroll
more += zaps a (wand|rod)
force_more_message -= You have reached level
force_more_message += You have reached level 2
force_more_message += You have reached level 3
force_more_message += You have reached level 4
force_more_message += You have reached level 5
force_more_message += You have reached level 26
# Others, gfunk
#more += You have reached level
more += You rejoin the land of the living
#more += You have finished (your manual|forgetting about)
more += You have finished forgetting about
more += Your scales start
more += You feel monstrous
more += Jiyva alters your body
: if you.god() == "Xom" then
more += god:
: end
#########travel stuff
:if you.god() == "Xom" then
stop += god:
:else
ignore += god:
:end
# Bad things
stop ^= A huge blade swings out and slices into you
stop ^= starving
stop ^= wrath finds you
stop ^= lose consciousness
stop ^= hell_effect:
# Expiring effects
stop ^= You feel yourself slow down
stop ^= You are starting to lose your buoyancy
stop ^= Your hearing returns
stop ^= Your transformation is almost over
stop ^= back to life
stop ^= time is quickly running out
stop ^= life is in your own hands
stop ^= is no longer charmed
ability_slot += Fly|flight:lF
ability_slot += Stop Flying:L
ability_slot += Breathe:t
ability_slot += Invisibility:iv
# Abilities prone to miskeys.
ability_slot += Blink:IB
ability_slot += Berserk:k
ability_slot += Corrupt:C
ability_slot += Enter the Abyss:E
######################################
confirm_action += [Ss]ilence
force_spell_targeter += silence
force_more_message += eally cast .ilence
#force_more_message += magical contamination has completely faded away
#for vampire
runrest_ignore_message ^= very thirsty, almost devoid of blood, You feel devoid of blood, blood rots away, blood rot away
rest_wait_both = true
#runrest_ignore_message ^= HP
#runrest_ignore_message ^= magical contamination|(magic)
#runrest_ignore_message ^= magic(?!al contamination)
#runrest_ignore_message ^= magic
#flash_screen_message += (?!foo)^.*bar
#contam
#runrest_stop_message ^= magical contamination
flash_screen_message += There is something invisible around
message_colour += yellow:There is something invisible around
#done by c_msg
#more += You feel yourself slow down
#flash_screen_message += You feel yourself slow down
message_colour += magenta:You feel yourself slow down
flash_screen_message +=you feeling lethargic
message_colour += magenta:you feeling lethargic
runrest_stop_message ^= gateway leading out appears
runrest_stop_message ^= ound a gateway leading out
runrest_stop_message ^= pressed. stopping travel
message_colour += mute:Cast which spell
message_colour += mute:Press: . . help. Shift.Dir
message_colour += mute:Press: . . help. Dir . move target cursor
message_colour += mute:Casting:
message_colour += mute:Confirm with . or Enter. or press . or . to list all spells
message_colour += mute:Your battlesphere fires
message_colour += mute:fulminant prism comes into view
#^--TD? make safer for future enemies conjuring prisms
message_colour += mute:Press: . . help. Dir . move target
message_colour += mute:^Aiming\:
message_colour += mute:^Reach\:
message_colour += mute:^Shoot\:
message_colour += mute:^Attack\:
message_colour += mute:^Hit\:
message_color += mute:t -\s[A-Z][a-z]+!
message_color += mute:.rders for allies
message_color += mute:r...Retreat.*s...Stop.attacking
message_color += mute:g...Guard the area.*f...Follow.me
message_color += mute:(a|A)nything.else...Cancel
channel.sound = lightgreen
message_colour += lightgreen:You feel a bit more experienced
message_colour += cyan:battlesphere wa, cyan:battlesphere expends
#rest_wait_percent = 98
#set by lua
cloud_status = true
#confirm_action += ^Blink,
#auto_butcher = true
#confirm_butcher = never
#auto_eat_chunks = true
#explore_auto_rest = true
default_manual_training = true
#clear_messages = true
show_more = false
dump_message_count = 100
note_all_skill_levels = true
#online defaults
travel_delay = -1
rest_delay = -1
show_travel_trail = true
#travel_delay = 1
#show_travel_trail = false
runrest_stop_message ^= .omething.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.? misses you\.
runrest_stop_message ^= .omething enters a
runrest_stop_message ^= .omething sets off the alarm
runrest_stop_message ^= .omething launches a net
runrest_stop_message ^= You feel you are being watched by something
runrest_stop_message ^= .omething ?\w* \w+ your
runrest_stop_message ^= appears from out of your range of vision
runrest_stop_message ^= [Yy]our .+ resists
runrest_stop_message ^= reminder
#runrest_stop_message ^= your.* disappears in a puff of smoke
message_colour ^= cyan:your.* disappears in a puff of smoke
runrest_stop_message ^= battlesphere wavers
sort_menus = true : equipped, basename, identified, slot
####################################################################################################
# Item slots and @ inscriptions
item_slot += potions? of lig:t
item_slot += potions? of cur:C
item_slot += potions? of magic:G
item_slot += potions? of ambros:A
item_slot += potions? of brill:B
item_slot += potions? of cancel:X
item_slot += potions? of hast:Q
item_slot += potions? of heal w:W
item_slot += potions? of invis:V
item_slot += potions? of resis:R
item_slot += scrolls? of blinking:K
item_slot += scrolls? of fear:J
item_slot += scrolls? of fog:O
item_slot += scrolls? of id:y
item_slot += scrolls? of pois:P
item_slot += scrolls? of torm:H
item_slot += scrolls? of magic mapping:M
item_slot += scrolls? of revelation:M
item_slot += scrolls? of sil:I
item_slot += scrolls? of sum:U
item_slot += scrolls? of butter:U
item_slot += scrolls? of tel:N
item_slot += scrolls? of vuln:L
autoinscribe += wand of flame:@v1
autoinscribe += wand of iceb:@v2
autoinscribe += wand of roots:@v2
autoinscribe += wand of acid:@v3
autoinscribe += wand of quicks:@v3
autoinscribe += wand of light:@v3
autoinscribe += wand of mindb:@v4
autoinscribe += wand of disint:@v4
autoinscribe += wand of charm:@v5
autoinscribe += wand of para:@v5
autoinscribe += wand of poly:@v6
autoinscribe += wand of dig:@v7
#upper left: deflstyz
#lower left: abcdefghijklmnopqrsuvwxz
item_slot += scrolls? of amn:-k
#item_slot += scrolls? of enchant arm:
#item_slot += scrolls? of acqu:
#item_slot += scrolls? of brand:
#item_slot += scrolls? of enchant weap:
item_slot += scrolls? of immo:-z
#item_slot += scrolls? of noise:
#item_slot += potions? of degen:
#item_slot += potions? of att:-
item_slot += potions? of flight:-l
item_slot += potions? of enlightenment:-l
#item_slot += potions? of might:-
item_slot += potions? of berserk:-n
item_slot += potions? of mut:-m
#item_slot += potions? of exp:
{
--put all letters used
scrollletters="KJOPHMIUNL"
potionletters="tCGABXQWVR"
wandletters=""
reservedletters="y" --reserved should include y w r and q
freelettersdrop="klmnz" --non-overwriting letters of consumables I'll likely drop later, in order of most likely to keep
--put all unused letters, preferably in alphabetical order
freeletters="cdefghijopsux"
freecapitalletters="DEFST"
freecapitallettersreserved="Y" --should be Y
freelettersamulet="Z"
freelettersreserved="rwq" --reserved should include y w r and q. Used for rings, or wands, which ingame should be used by number.
freelettersweapons="vab"--letters reserved for weapons
noslotletters=freeletters..freelettersdrop:reverse()..freecapitalletters:reverse()..potionletters..scrollletters..wandletters..freelettersweapons..freelettersamulet..freelettersreserved..reservedletters..freecapitallettersreserved
--add all patterns for consumables that didn't get a letter
--keep enchant arm, enchant wep, brand wep in this category, so those are never matched later
noslotstring="scrolls? of enchant arm|scrolls? of acqu|scrolls? of brand|scrolls? of enchant weap|scrolls? of noise|potions? of degen|item_slot += potions? of att|potions? of might|potions? of exp|scrolls? of remove curse"
--add all patterns for consumables that got a weak letter
dropslotitems="scrolls? of amn|scrolls? of immo|potions? of flight|potions? of enlightenment|potions? of berserk|potions? of mut"
noslotitems="(unidentified (scroll|potion)|"..noslotstring..")"
}
#unidentifed and unlisted pots and scrolls:
:crawl.setopt("item_slot += "..noslotitems..":-"..noslotletters)
:crawl.setopt("item_slot += "..dropslotitems..":-"..freelettersdrop)
:--crawl.setopt("item_slot += \\bmisc\\b:"..freecapitalletters)
#DEFST 0 left:89
item_slot += lightning rod:F
item_slot += phial of floods:T
item_slot += phantom mirror:D
#item_slot += piece from Xom.s chessboard:
autoinscribe += piece from Xom.s chessboard:@v0
item_slot += box of beasts:S
item_slot += sack of spiders:S
item_slot += tin of tremorstones:E
item_slot += condenser vane:E
#item_slot += figurine of a ziggurat:
#item_slot += horn of Geryon:
#item_slot += quad damage:
:if you.race()=="Felid" then
:crawl.setopt("item_slot +=\\bwand\\b:-"..freecapitallettersreserved..freelettersreserved..reservedletters.."abv")
:else
item_slot += \b(weapon|staff)\b:bav
:crawl.setopt("item_slot += \\barmour\\b:"..freecapitallettersreserved)
:crawl.setopt("item_slot +=\\bwand\\b:-"..freelettersreserved..reservedletters..freecapitallettersreserved)
:end
:crawl.setopt("item_slot += \\b(amulet|necklace)\\b:"..freelettersamulet)
# qr w
# klmn z
#cdefghijklmnopqrsuwxz
#cdefghij oprsuwxy
item_slot += \bring\b.*(cold|rC\+):cd
item_slot += \bring\b.*(n of fire|rF\+):ef
item_slot += \bring\b.*ice:gh
item_slot += \bring\b.*fire:ij
item_slot += \bring\b.*(positive|rN\+):op
item_slot += \bring\b.*[Cc]orr:w
item_slot += \bring\b.*rElec:q
item_slot += \bring\b.*(willp|Will\+):rs
item_slot += \bring\b.*[Pp]ois:x
item_slot += \bring\b.*(flight|fly):u
item_slot += \b(weapon|staff|ring)\b:spjhfd
:crawl.setopt("item_slot += \\b(weapon|staff|ring)\\b:"..freeletters:reverse()..freelettersdrop)
:crawl.setopt("item_slot += \\bring\\b:"..freelettersreserved..reservedletters)
:crawl.setopt("item_slot +=\\bwand\\b:-"..noslotletters)
{
--enforce item_slot options
--depends: r_td, macro_save (--TD:make that a global table), cmsg_funcs, item_slot options with a structure as above
--sets hook: c_assign_invletter
--inscribe smth with "noslot" to exclude it from enforcement
slots={} --table of item names, returning their last known slot if that slot should be enforced on re-pickup
local noslotregex=crawl.regex("("..noslotitems.."|"..dropslotitems..")")
testslots=nil --debug
function update_slots()
for _,it in pairs(items.inventory()) do
local name=it:name()
local class=it:class()
if
it.fully_identified
and not(name:match("noslot"))
and (
it:subtype():match("ring")
and (
name:match("fire")
or name:match("cold")
or name:match("r%a%+")
or name:match("positive")
or name:match("willp")
or name:match("Will%+")
or name:match("[Pp]ois")
or name:match("rElec")
or name:match("[Cc]orr")
or name:match("ring of flight")
or name:match("fly")
)
or (
class:match("Potions")
or class:match("Scrolls")
)
and not(noslotregex:matches(name))
or class:match("[Ww]eapons")
or class:match("Staves")
or class:match("Miscellaneous")
and(
name:match("lightning rod")
or name:match("phial of floods")
or name:match("phantom mirror")
--or name:match("piece from Xom.s chessboard")
or name:match("box of beasts")
or name:match("sack of spiders")
or name:match("tin of tremorstones")
or name:match("condenser vane")
)
)
then
slots[id(it)]=it.slot
if testslots then echoall("s set",id(it),it.slot) end --debug
end
end
end
function id(it)
--item identifier disregarding quanitity and enchantment level
--TD:disregard player inscriptions?
--TD:don't distinguish unidentified item stacks by whether there are multiple
return
(it.class():match("Potions") or it.class():match("Scrolls")) and it.name("base")..(it.subtype() or it.name():match("[%a%s]*"))
or it.class():match("Miscellaneous") and it.subtype()
or it.artefact and it.name()
or (it.damage or it.ac) and it.name("base")..(it.ego() or "")
or it.name()
end
table.insert(cmsg_funcs,(function(msg,ch)
if msg:match("^<.*>%a %- %a+") then
if not(r_td[update_slots]) then
r_td[update_slots]=1
table.insert(r_td,update_slots)
end
end
end))
function c_assign_invletter(it)
--always give dropped items that qualify for the slots table their old slot back
--unless the slots table also includes the item in that slot
--(instead of taking the second best item_slot option for some reason)
local name=id(it)
if slots[name] then
table.insert(r_td,1,(function()
if
not(items.inslot(slots[name]))
or
id(items.inslot(slots[name]))~=name --something else is where this was last time
and slots[id(items.inslot(slots[name]))]~=slots[name] --slots doesn't give it the same slot
then
local currentslot
for _,it in pairs(items.inventory()) do
if id(it)==name then currentslot=it.slot; break; end
end
items.swap_slots(currentslot,slots[name])
crawl.mpr("Swap: "..items.inslot(slots[name]).name("inv")..(items.inslot(currentslot) and ", "..items.inslot(currentslot).name("inv") or ""))
end
--update_slots()
end))
return slots[name]
--else
--table.insert(r_td,1,update_slots)
end
end
function start_slots()
if c_persist.slots==nil then
c_persist.slots={}
end
if c_persist.slots[you.name()]==nil then
c_persist.slots[you.name()]={}
end
slots=c_persist.slots[you.name()]--
--for name,slot in pairs(slots or {}) do
--echoall("init",name, slot)
--end
update_slots()
end
start_slots()
function save_slots()
c_persist.slots[you.name()]=slots
end
--table.insert(save_funcs,save_slots)
}
####################################################################################################
spell_slot ^= dispersal:q
spell_slot ^= mystic:w
spell_slot ^= disjunction:r
spell_slot ^= armour:e
spell_slot ^= dart:H
spell_slot ^= hail:a
spell_slot ^= prism:J
spell_slot ^= clutch:K
spell_slot ^= fireball:d
spell_slot ^= deconstruct:f
spell_slot ^= searing:Ls
spell_slot ^= stone arrow:Ls
spell_slot ^= iron shot:L
spell_slot ^= crystal spear:L
spell_slot ^= star:H
spell_slot ^= orb:M
spell_slot ^= slow:ASD
spell_slot ^= enfeeble:ASD
spell_slot ^= confusion:ASD
spell_slot ^= tukima:ASD
spell_slot ^= petrif:ASD
spell_slot ^= fear:F
spell_slot ^= violent unrav:g
#spell_slot ^= summon:kjhl
#hjklmHJKLM
spell_slot ^= spire:H
spell_slot ^= mammal:J
spell_slot ^= imp:K
spell_slot ^= canine:L
spell_slot ^= guardian:M
spell_slot ^= cactus:h
spell_slot ^= gateway:j
spell_slot ^= viper:k
spell_slot ^= monstrous:l
spell_slot ^= hydra:m
spell_slot ^= forest:J
spell_slot ^= servitor:k
spell_slot ^= horrible:m
spell_slot ^= haunt:HMa
spell_slot ^= foxfire:h
spell_slot ^= battlesphere:kl
spell_slot ^= discord:c
spell_slot ^= polar vortex:x
spell_slot ^= shatter:h
spell_slot ^= fire storm:H
spell_slot ^= ignition:h
spell_slot ^= form:z
spell_slot ^= irradiate:v
spell_slot ^= blink:b
:if not(you.race()=="Ghoul" or you.race()=="Mummy") then
autopickup_exceptions ^= potions? of might
#autopickup_exceptions ^= >potions? of degeneration
#autopickup_exceptions ^= >useless
ai := autoinscribe
autoinscribe += datura:!f
#autoinscribe += magical power:!R
autoinscribe += MP\+:!R!T!w
autoinscribe += potions? of resis:rElec rC+ rF+ rCorr rPois
#autoinscribe += weapon:!a
#autoinscribe += w - :!w --TD:do with cmsg
ai += potions? of berserk rage:!q
ai += scrolls? of silence:!r
--ai += scrolls? labelled:!r
--ai += scrolls? of:
tile_tooltip_ms = 0
{
add_autopickup_func(function(it, name)
--Pickup aux armour you haven't found yet.
--Also picks up ego/artefact aux armour if you can wear it.
--Doesn't pick up shields or body armour.
--cited from somewhere
if it.is_useless then return false end
local class = it.class(true)
if class == "armour" then
local good_slots = {cloak="Cloak", helmet="Helmet",
gloves="Gloves", boots="Boots"}
st, _ = it.subtype()
if good_slots[st] ~= nil and items.equipped_at(good_slots[st]) == nil then
return true
--elseif st ~= "body" and st ~= "shield" and (it.artefact or it.branded) then return true
end
end
--crawl.mpr(it:class().." "..(it:subtype() or ""))
--crawl.mpr("<"..it:name_coloured())
return nil
end)
}
#tile_full_screen = true
#buggy?
tile_window_width = -90
tile_window_height = -90
tile_full_screen = false
tile_skip_title = true
#msg_min_height = 6
#monster_item_view_coordinates = true --inconsistent with lua coords, Y axis flipped
action_panel_filter -= attraction
explore_greedy_visit = artefacts
#,glowing_items
#explore_greedy_visit = asdf
#explore_greedy_visit -= asdf
#explore_greedy_visit -= glowing_items
explore_greedy_visit -= stacks
explore_stop += greedy_pickup
explore_stop -= greedy_pickup_smart
#explore_greedy=false
#show_more = true
:if tonumber(crawl.version("major"))>.26 then
#default 3
#fail_severity_to_confirm = 3
:crawl.setopt("fail_severity_to_confirm = 4")
:end
tile_viewport_scale = 1.0
#tile_map_scale = 0.5
tile_map_scale = 0.75
tile_level_map_hide_messages = false
tile_level_map_hide_sidebar = false
#explore_wall_bias = -1000
##tile_lava_col = #552211
#tile_lava_col = #440000
##tile_trap_col = #aa6644
#tile_trap_col = #aacc00
##tile_explore_horizon_col = #6b301b
##tile_explore_horizon_col = #6b301b
##feature += explore horizon {,,red,red,red,red,red}
#tile_display_mode=hybrid
#defaults
#tile_player_col = white
#tile_monster_col = #660000
#tile_neutral_col = #660000
#tile_peaceful_col = #664400
#tile_friendly_col = #664400
#tile_plant_col = #446633
#tile_item_col = #005544
#tile_floor_col = #333333
#tile_wall_col = #666666
#tile_door_col = #775544
#tile_explore_horizon_col = #6b301b
#tile_unseen_col = black
#tile_mapped_floor_col = #222266
#tile_mapped_wall_col = #444499
#tile_upstairs_col = cyan
#tile_downstairs_col = #ff00ff
#tile_branchstairs_col = #ff7788
#tile_portal_col = #ffdd00
#tile_transporter_col = #0000ff
#tile_transporter_landing_col = #5200aa
#tile_feature_col = #997700
#tile_trap_col = #aa6644
#tile_water_col = #114455
#tile_deep_water_col = #001122
#tile_lava_col = #552211
#tile_excluded_col = #552266
#tile_excl_centre_col = #552266
#tile_window_col = #558855
#
#0f 1f 3f 7f ff double the last category... delta of 1f*2^n
# 16 2d 5a b4 between those for shift
#r down branch
#m tla excl trap
#my
#ryy lava door mon
# floor wall transp player
# mfl mwl horizon
#gy
#cy sea wat portal
#c friend
#g feat plant up
#no items
#almost invis: feat, tland
tile_player_col = white
tile_monster_col = #ffb400
tile_neutral_col = #ffb400
tile_peaceful_col = #1f3f3f
tile_friendly_col = #1f3f3f
tile_plant_col = #007f00
tile_item_col = #1f1f1f
tile_floor_col = #1f1f1f
tile_wall_col = #3f3f3f
tile_door_col = #7f5a00
tile_explore_horizon_col = #b4b4ff
tile_unseen_col = black
tile_mapped_floor_col = #5a5aff
tile_mapped_wall_col = #7f7fff
tile_upstairs_col = #1fff1f
tile_downstairs_col = #7f0000
tile_branchstairs_col = #7f1f1f
tile_transporter_col = #7f7f7f
tile_transporter_landing_col = #2d002d
tile_portal_col = #7fffff
tile_feature_col = #002d2d
tile_trap_col = #ff00ff
tile_water_col = #3f7fff
tile_deep_water_col = #2d5aff
tile_lava_col = #3f2d00
tile_excluded_col = #3f003f
tile_excl_centre_col = #3f003f
tile_window_col = #558855
#tile_layout_priority = abilities, commands, inventory, memorisation, minimap, monsters, navigation, skills, spells, system commands
tile_layout_priority = monsters, minimap
#https://github.com/crawl/crawl/blob/master/crawl-ref/source/rltiles/dc-mon.txt
#https://github.com/crawl/crawl/blob/master/crawl-ref/source/rltiles/dc-player.txt
#https://github.com/crawl/crawl/blob/master/crawl-ref/source/rltiles/dc-zombie.txt
#tile_player_tile = tile:MONS_SALAMANDER_MYSTIC
#tile_shield_offsets = 0,-8
:if not(you.race()=="Felid") then
#tile_player_tile = playermons
tile_player_tile = tile:MONS_SERVANT_OF_WHISPERS
#tile_player_tile = tile:MONS_WIZARD
#tile_player_tile = tile:MONS_SPRIGGAN_DEFENDER
:else
#tile_player_tile = playermons
:if tonumber(crawl.version("major"))<.31 then
tile_player_tile = tile:FELID_2
:else
:crawl.setopt("tile_player_tile = tile:FELID_SILLY")
:end
:end
explore_item_greed = 3