##### Crawl Init file ############################################### # For descriptions of all options, as well as some more in-depth information # on setting them, consult the file # options_guide.txt # in your /docs directory. If you can't find it, the file is also available # online at: # https://gitorious.org/crawl/crawl/source/HEAD:crawl-ref/docs/options_guide.txt # # Crawl uses the first file of the following list as its option file: # * init.txt in the -rcdir directory (if specified) # * .crawlrc in the -rcdir directory (if specified) # * init.txt (in the Crawl directory) # * ~/.crawl/init.txt (Unix only) # * ~/.crawlrc (Unix only) # * ~/init.txt (Unix only) # * settings/init.txt (in the Crawl directory) ##### Some basic explanation of option syntax ####################### # Lines beginning with '#' are comments. The basic syntax is: # # field = value or field.subfield = value # # Only one specification is allowed per line. # # The terms are typically case-insensitive except in the fairly obvious # cases (the character's name and specifying files or directories when # on a system that has case-sensitive filenames). # # White space is stripped from the beginning and end of the line, as # well as immediately before and after the '='. If the option allows # multiple comma/semicolon-separated terms (such as # autopickup_exceptions), all whitespace around the separator is also # trimmed. All other whitespace is left intact. # # There are three broad types of Crawl options: true/false values (booleans), # arbitrary values, and lists of values. The first two types use only the # simple =, with later options - which includes your options that are different # from the defaults - overriding earlier ones. List options allow using +=, ^=, # -=, and = to append, prepend, remove, and reset, respectively. Usually you will # want to use += to add to a list option. Lastly, there is := which you can use # to create an alias, like so: # ae := autopickup_exceptions # From there on, 'ae' will be treated as if it you typed autopickup_exceptions, # so you can save time typing it. # ##### Other files ################################################### # You can include other files from your options file using the 'include' # option. Crawl will treat it as if you copied the whole text of that file # into your options file in that spot. You can uncomment some of the following # lines by removing the beginning '#' to include some of the other files in # this folder. # Some useful, more advanced options, implemented in LUA. # include = advanced_optioneering.txt # Alternative vi bindings for Dvorak users. # include = dvorak_command_keys.txt # Alternative vi bindings for Colemak users. # include = colemak_command_keys.txt # Override the vi movement keys with a non-command. # include = no_vi_command_keys.txt # Turn the shift-vi keys into safe move, instead of run. # include = safe_move_shift.txt ##### Ancient versions ############################################## # If you're used to the interface of ancient versions of Crawl, you may # get back parts of it by uncommenting the following options: # include = 034_command_keys.txt # And to revert monster glyph and colouring changes: # include = 034_monster_glyphs.txt # include = 052_monster_glyphs.txt # include = 060_monster_glyphs.txt # include = 071_monster_glyphs.txt # include = 080_monster_glyphs.txt # include = 0.9_monster_glyphs.txt # include = 0.12_monster_glyphs.txt # include = 0.13_monster_glyphs.txt # include = 0.14_monster_glyphs.txt travel_delay = -1 explore_delay = -1 rest_delay = -1 runrest_stop_message += Your transformation is almost over. force_more_message += Your transformation is almost over. runrest_stop_message += You feel yourself come back to life. force_more_message += You feel yourself come back to life. force_more_message += The blast of calcifying dust hits you show_more = false tile_cell_pixels = 32 # tile_filter_scaling = true # Ask HilariousDeathArtist to fix things # To use this you must add have a call to AnnounceDamage() in the ready() function like below: # This is important if you override this ready() function < function ready() AnnounceDamage() end > ############### # Damage Calc # ############### < local previous_hp = 0 local previous_mp = 0 local previous_form = "" local was_berserk_last_turn = false function AnnounceDamage() local current_hp, max_hp = you.hp() local current_mp, max_mp = you.mp() --Things that increase hp/mp temporarily really mess with this local current_form = you.transform() local you_are_berserk = you.berserk() local max_hp_increased = false local max_hp_decreased = false if (current_form ~= previous_form) then if (previous_form:find("dragon") or previous_form:find("statue") or previous_form:find("tree") or previous_form:find("ice")) then max_hp_decreased = true elseif (current_form:find("dragon") or current_form:find("statue") or current_form:find("tree") or current_form:find("ice")) then max_hp_increased = true end end if (was_berserk_last_turn and not you_are_berserk) then max_hp_decreased = true elseif (you_are_berserk and not was_berserk_last_turn) then max_hp_increased = true end --crawl.mpr(string.format("previous_form is: %s", previous_form)) --crawl.mpr(string.format("current_form is: %s", current_form)) --crawl.mpr(string.format("max_hp_increased is: %s", max_hp_increased and "True" or "False")) --crawl.mpr(string.format("max_hp_decreased is: %s", max_hp_decreased and "True" or "False")) --crawl.mpr(string:format("you_are_berserk is: %s", you_are_berserk and "True" or "False")) --crawl.mpr(string:format("was_berserk_last_turn is: %s", was_berserk_last_turn and "True" or "False")) --Skips message on initializing game if previous_hp > 0 then local hp_difference = previous_hp - current_hp local mp_difference = previous_mp - current_mp if max_hp_increased or max_hp_decreased then if max_hp_increased then crawl.mpr("You now have " .. current_hp .. "/" .. max_hp .. " hp.") else crawl.mpr("You now have " .. current_hp .. "/" .. max_hp .. " hp.") end else --On losing health if (current_hp < previous_hp) then if current_hp <= (max_hp * 0.30) then crawl.mpr("You take " .. hp_difference .. " damage, and have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.50) then crawl.mpr("You take " .. hp_difference .. " damage, and have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.70) then crawl.mpr("You take " .. hp_difference .. " damage, and have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.90) then crawl.mpr("You take " .. hp_difference .. " damage, and have " .. current_hp .. "/" .. max_hp .. " hp.") else crawl.mpr("You take " .. hp_difference .. " damage, and have " .. current_hp .. "/" .. max_hp .. " hp.") end if hp_difference > (max_hp * 0.20) then crawl.mpr("MASSIVE DAMAGE!!") end end --On gaining more than 1 health if (current_hp > previous_hp) then --Removes the negative sign local health_inturn = (0 - hp_difference) if (health_inturn > 1) and not (current_hp == max_hp) then if current_hp <= (max_hp * 0.30) then crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.50) then crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.70) then crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.") elseif current_hp <= (max_hp * 0.90) then crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.") else crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.") end end if (current_hp == max_hp) then crawl.mpr("Health restored: " .. current_hp .. "") end end --On gaining more than 1 magic if (current_mp > previous_mp) then --Removes the negative sign local mp_inturn = (0 - mp_difference) if (mp_inturn > 1) and not (current_mp == max_mp) then if current_mp < (max_mp * 0.25) then crawl.mpr("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.") elseif current_mp < (max_mp * 0.50) then crawl.mpr("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.") else crawl.mpr("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.") end end if (current_mp == max_mp) then crawl.mpr("MP restored: " .. current_mp .. "") end end --On losing magic if current_mp < previous_mp then if current_mp <= (max_mp / 5) then crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.") elseif current_mp <= (max_mp / 2) then crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.") else crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.") end end end end --Set previous hp/mp and form at end of turn previous_hp = current_hp previous_mp = current_mp previous_form = current_form was_berserk_last_turn = you_are_berserk end > -- To use this create a macro with the following function call in game -- ===HDAtravel -- This file can be included in your rc file with the following line: -- include += HDAtravel.rc # This still has plenty of bugs, submit them at: # https://github.com/HilariousDeathArtist/DCSSConfigFile # or find me on crawl.s-z.org confirm_butcher = never easy_eat_chunks = true auto_eat_chunks = true auto_drop_chunks = yes easy_eat_contaminated = true autoinscribe += bread ration:@e1 autoinscribe += meat ration:@e2 autoinscribe += chunk:@w0 autoinscribe += staff of energy:@w1 ################## # HDAtravel # ################## -- Rests up to at least 75% hp (or missing at least 30hp) and 50% mp (or missing at least 20mp) -- Eats chunks automatically, handled by auto_eat_chunks interface option -- Travels to the nearest corpse if we have no chunks and are at Very Hungry or Hungry or using Gourmand and at Full -- Automatically chops valid corpses if we are standing on them and we have no chunks -- Will stop autotravel at Near Starving -- Channels MP if you have staff of energy or worship Sif when you have extra chunks -- Casts regen out of combat if you have spare chunks and are missing hp -- TODO: better detection of non-edible corpses before standing on them -- TODO: Fix up for Vampire, Ghoul, and possibly Spriggan/Mummy -- NOTE: If you don't have rP you will still chop poisonous corpses, but not pick up their chunks : function HDAtravel() : local mp, max_mp = you.mp() : local hp, max_hp = you.hp() : local first_monster = next(getMonsterList()) : local already_checked = (no_results() or dont_know_how_to_get_there()) : local you_are_barbed = (have_barbs() and not removed_barbs()) : local is_safe = (first_monster == nil) : local missing_mp = (mp < max_mp) : local missing_hp = (hp < max_hp) : local need_to_recover = should_rest(hp, mp, max_hp, max_mp) : local have_no_chunks = have_no_chunks() : local you_are_sif = string.find(you.god(), "Sif") : local you_are_yred = string.find(you.god(), "Yred") : local you_are_zin = string.find(you.god(), "Zin") : local you_are_good = string.find(you.god(), "Shining") or string.find(you.god(), "Elyvilon") or you_are_zin : local sacrifice_god = you_worship_sacrifice_god() : local you_are_mummy = string.find(you.race(), "Mummy") : local you_are_vampire = string.find(you.race(), "Vampire") : local you_are_bloodless = you.hunger_name() == "bloodless" : local you_are_ghoul = string.find(you.race(), "Ghoul") : local you_are_bloodless = you.hunger_name() == "bloodless" : local you_do_not_eat = string.find(you.race(), "Spriggan") or you_are_mummy : local lichform = string.find(you.transform(), "lich") : local bladehands = string.find(you.transform(), "blade") : local dragonform = string.find(you.transform(), "dragon") : local melded_weapon = (bladehands or dragonform) : local you_are_regen = you.regenerating() : local you_know_sublimation = known_spells["Sublimation of Blood"] and (spells.fail("Sublimation of Blood") < 20) and (mp>3) : local you_know_animate_skeleton = known_spells["Animate Skeleton"] and (spells.fail("Animate Skeleton") < 20) and (mp>1) : local you_know_animate_dead = known_spells["Animate Dead"] and (spells.fail("Animate Dead") < 20) and (mp>4) : local chunks_are_equipped = is_weapon("chunk") : local distort_weapon = is_weapon("distort") : local vamp_weapon = is_weapon("vamp") and not chunks_are_equipped : local have_a_weapon = weapon_in_inventory() : local gourmand_and_hungry = you_are_gourmand() and not (you_are_very_full() or you_are_engorged() or you_are_ghoul) : local ghoul_missing_hp = you_are_ghoul and ((hp < (max_hp - 5)) or you.rot() > 0) : local want_to_eat = (you_are_hungry() or gourmand_and_hungry or ghoul_missing_hp) and not you_do_not_eat : local have_spare_chunks = not have_no_chunks and not you_are_hungry() : local you_have_staff_of_energy = is_in_inventory("staff of energy") : local have_potion_of_blood = is_in_inventory("potion of blood") or is_in_inventory("potions of blood") : local staff_of_energy_is_equipped = is_weapon("staff of energy") : local staff_of_power_is_equipped = is_weapon("staff of power") : local staff_of_energy_letter = find_item_letter("staff of energy") : local chunks_letter = find_item_letter("chunk") : local you_are_hungerless = you_are_mummy or lichform : local no_food_issues = (you_are_hungerless or have_spare_chunks) : local should_channel_mp = ((max_mp - mp) > 5) and no_food_issues : local can_cast_regen = known_spells["Regeneration"] and (mp>3) and (spells.fail("Regeneration") < 20) : local you_have_regen_ring = is_in_inventory("regeneration") : local regen_ring_letter = find_item_letter("regeneration") : local regen_ring_is_equipped = is_ring("regeneration") : local should_regen_hp = (not (you_are_good or you_are_regen or lichform)) and ((hp/max_hp) < 0.80) and (you_have_regen_ring or can_cast_regen) and not you_are_bloodless : local should_sublimate = (not (you_are_good or lichform)) and ((mp/max_mp) < 0.60) and you_know_sublimation and mp>2 and ((hp/max_hp) > 0.95) : local should_animate_skeleton = (not you_are_good) and you_know_animate_skeleton and mp>1 and (not can_not_animate()) : local should_animate_dead = (not you_are_good) and you_know_animate_dead and mp>4 and (not can_not_animate()) : local you_want_spare_chunks = (not (have_spare_chunks or you_do_not_eat)) and (can_cast_regen or you_have_staff_of_energy or you_are_sif) : local you_want_chunks = (not you_are_hungerless and (number_of_chunks() == 0) and (want_to_eat or you_want_spare_chunks)) or you_are_vampire or (you_are_ghoul and number_of_chunks() < 4) : --crawl.mpr(string.format("you.piety_rank() is: %s", you.piety_rank())) : --crawl.mpr(string.format("you_want_chunks is: %s", you_want_chunks and "True" or "False")) : --crawl.mpr(string.format("want_to_eat is: %s", want_to_eat and "True" or "False")) : --crawl.mpr(string.format("number_of_chunks is: %s", number_of_chunks())) : --crawl.mpr(string.format("ghoul_missing_hp is: %s", ghoul_missing_hp and "True" or "False")) : --crawl.mpr(string.format("you.hunger_name() is: %s", you.hunger_name())) : --crawl.mpr(string.format("have_spare_chunks is: %s", have_spare_chunks and "True" or "False")) : --crawl.mpr(string.format("can_cast_regen is: %s", can_cast_regen and "True" or "False")) : --crawl.mpr(string.format("you_are_not_ghoul is: %s", you_are_not_ghoul and "True" or "False")) : --crawl.mpr(string.format("you_want_spare_chunks is: %s", you_want_spare_chunks and "True" or "False")) : --crawl.mpr(string.format("you_are_hungerless is: %s", you_are_hungerless and "True" or "False")) : --crawl.mpr(string.format("have_no_chunks is: %s", have_no_chunks and "True" or "False")) : if (is_safe) then : if you_are_barbed then : rest() : elseif should_sublimate and not (you_are_vampire or lichform) then : crawl.mpr("Autocasting Sublimation of Blood.") : sendkeys('zm') : elseif should_channel_mp and you_are_sif and (you.piety_rank() > 0) then : crawl.mpr("Autochanneling using Sif.") : sendkeys('aa') : elseif should_regen_hp and can_cast_regen then : crawl.mpr("Autocasting Regen.") : --This assumes casting regen is bound to zr : sendkeys('zr') : elseif (not melded_weapon) and (should_channel_mp and you_have_staff_of_energy and no_food_issues) and (not (distort_weapon or vamp_weapon)) and you_are_not_felid() then : if not staff_of_energy_is_equipped then : crawl.mpr("Switching to staff of energy.") : sendkeys('w1') : end : crawl.mpr("Autochanneling using staff of energy.") : sendkeys('v') : elseif (weapon_in_slot_a() or uses_unarmed()) and (no_weapon() and have_a_weapon) or (staff_of_energy_is_equipped and (not (staff_of_energy_letter == 'a')) or (chunks_are_equipped and (not (chunks_letter == 'a')))) then : if uses_unarmed() then : crawl.mpr("Switching to unarmed.") : sendkeys('w-') : else : crawl.mpr("Switching to main weapon.") : sendkeys('wa') : end : elseif want_to_eat and number_of_chunks() > 0 then : crawl.mpr("Autoeating chunks.") : sendkeys('e') : elseif you_want_chunks and on_corpses() and not on_chunks() and (not can_not_butcher()) then : if should_animate_skeleton then : crawl.mpr("Autocasting Animate Skeleton for chunks.") : sendkeys('zA') : else : crawl.mpr("Autochopping corpse.") : sendkeys('c') : end : elseif you_want_chunks and (not (you_are_zin or need_to_recover or on_chunks() or on_corpses() or already_checked)) then : crawl.mpr("You may need something to eat soon, looking for food.") : find_corpses() : elseif you_are_starving_or_near() and (number_of_chunks == 0) and (not (on_chunks() or on_corpses())) then : local have_bread = is_in_inventory("bread ration") : local have_meat = is_in_inventory("meat ration") : if have_bread or have_meat then : local result = crawl.yesnoquit("Eat a ration?", true, 'e') : if result == 1 and have_bread then : sendkeys('e1') : elseif result == 1 then : sendkeys('e2') : elseif result == 0 then : autoexplore() : end : if not (is_in_inventory("bread ration") or is_in_inventory("meat ration")) then : crawl.mpr("That was your last ration! You should go get more.") : end : else : crawl.mpr("No rations left! You should look for food.") : end : elseif need_to_recover and not you_are_starving() then : if you_are_bloodless and have_potion_of_blood then : crawl.mpr("Autoquaffing potion of blood.") : sendkeys('q1') : else : rest() : end : elseif you_are_yred and (you.piety_rank() >= 3) and (item_in_view("corpse") or item_in_view("skeleton") or on_corpses()) and not recently_mass_animated() then : crawl.mpr("Autocasting Mass Animate Remains.") : sendkeys('aa') : elseif (not sacrifice_god) and (item_in_view("corpse") or item_in_view("skeleton") or on_corpses()) and should_animate_dead and not already_animated() then : crawl.mpr("Autocasting Animate Dead.") : sendkeys('zA') : elseif (not sacrifice_god) and on_corpses() and should_animate_skeleton then : crawl.mpr("Autocasting Animate Skeleton.") : sendkeys('zA') : elseif you_are_yred and (you.piety_rank() >= 1) and on_corpses() then : crawl.mpr("Autocasting Animate Remains.") : sendkeys('aa') : else : --This does the general travelling : autoexplore() : end : else : --This will provide the "foo is nearby" message : autoexplore() : end : end < function sendkeys(command) crawl.flush_input() crawl.sendkeys(command) coroutine.yield(true) crawl.flush_input() end function should_rest(hp, mp, max_hp, max_mp) local you_are_mummy = string.find(you.race(), "Mummy") local you_are_deep_dwarf = string.find(you.race(), "Deep Dwarf") return (mp < (max_mp*0.50) or ((max_mp-mp) > 20) or ((hp < (max_hp*0.80)) or ((max_hp-hp) > 30) and not you_are_deep_dwarf) or you.slowed() or you.poisoned() or you.confused() or you.exhausted() or (((hp < max_hp) or (mp < max_mp)) and you_are_mummy)) end -- Hungry, Very Hungry, Near Starving, Starving function you_are_hungry() return not you_are_not_hungry() and ((string.find(you.hunger_name(), "hungry")) or you_are_starving_or_near()) end -- Normal Satiation function you_are_not_hungry() return (string.find(you.hunger_name(), "not hungry")) end -- Engorged function you_are_engorged() return (string.find(you.hunger_name(), "completely stuffed")) end -- Very full function you_are_very_full() return (string.find(you.hunger_name(), "very full")) end -- Near Starving function you_are_near_starving() return (string.find(you.hunger_name(), "near starving")) end -- Near Starving, Starving function you_are_starving_or_near() return (string.find(you.hunger_name(), "starving")) end -- Starving function you_are_starving() return you_are_starving_or_near() and not you_are_near_starving() end function autoexplore() sendkeys('o') end function have_barbs() return string.find(crawl.messages(10), escape("The barbed spikes become lodged in your body")) or string.find(crawl.messages(10), escape("The barbed spikes dig painfully into your body as you move")) end function already_animated() return string.find(crawl.messages(20), escape("Autocasting Animate Dead")) end function removed_barbs() return string.find(crawl.messages(10), escape("You carefully extract the manticore spikes from your body")) or string.find(crawl.messages(10), escape("The manticore spikes snap loose")) end function no_results() return string.find(crawl.messages(10), escape("Can't find anything matching that")) or string.find(crawl.messages(10), escape("You may need something to eat soon")) end function dont_know_how_to_get_there() return string.find(crawl.messages(10), escape("know how to get there")) or string.find(crawl.messages(10), escape("Have to go through")) end function can_not_animate() return string.find(crawl.messages(10), escape("There is nothing here that can be animated")) end function can_not_bottle() return string.find(crawl.messages(10), escape("There isn't anything to bottle here")) end function recently_mass_animated() return string.find(crawl.messages(10), escape("Autocasting Mass Animate Remains")) end function can_not_butcher() return string.find(crawl.messages(10), escape("anything suitable to butcher here")) end function can_not_eat_that() return string.find(crawl.messages(10), escape("You can't eat that")) --These strings don't seem to show up in messages --or string.find(crawl.messages(10), escape("Not only inedible but also greatly harmful")) --or string.find(crawl.messages(10), escape("It is caustic")) end function rest() sendkeys('5') end function you_are_gourmand() return you.gourmand() or (not you_are_not_ghoul()) or (not you_are_not_felid()) or (not you_are_not_troll()) or (string.find(you.race(), "Kobold")) end function have_no_chunks() for it in inventory() do if string.find(it.name(), "chunk") then return false end end return true end function have_rotten_chunks() for it in inventory() do if string.find(it.name(), "chunk") and string.find(it.name(), "rott") then return false end end return true end function number_of_chunks() for it in inventory() do --if string.find(it.name(), "chunk") then --crawl.mpr(it.name() .." is edible: " .. (food.can_eat(it) and "True" or "False") .. " and dangerous: " .. (food.dangerous(it) and "True" or "False")) --end if string.find(it.name(), "chunk") and (not string.find(it.name(), "book")) and food.can_eat(it) and not food.dangerous(it) then return it.quantity end end return 0 end function is_in_inventory(str) for it in inventory() do if string.find(it.name(), str) then return true end end return false end function weapon_in_inventory() for it in inventory() do if string.find(it.class(true), "weapon") then return true end end return false end function weapon_in_slot_a() local it = items.inslot(0) if it then return string.find(it.class(true), "weapon") else return false end end function find_item_letter(str) for i = 0,51 do it = items.inslot(i) if it then if string.find(it.name(), str) then return items.index_to_letter(i) end end end return false end function you_worship_sacrifice_god() return string.find(you.god(), "Trog") --or string.find(you.god(), "Oka") --or string.find(you.god(), "Makhleb") or string.find(you.god(), "Beogh") or string.find(you.god(), "Lugonu") --or string.find(you.god(), "Nemelex") end function on_corpses() local fl = you.floor_items() for it in iter.invent_iterator:new(fl) do if string.find(it.name(), "corpse") and not string.find(it.name(), "rotting") and not string.find(it.name(), "plague") then return true end end return false end function on_chunks() for it in floor_items() do if string.find(it.name(), "chunk") then return true else return false end end end function you_are_carnivore() return you.saprovorous() end function you_are_not_ghoul() return not (string.find(you.race(), "Ghoul")) end function you_are_not_troll() return not (string.find(you.race(), "Troll")) end function you_are_not_felid() return not (string.find(you.race(), "Felid")) end function you_are_not_octopode() return not (string.find(you.race(), "Octopode")) end function find_corpses() local race = you.race() local god = you.god() local exclude_this = "" if string.find(god, "Shining") then exlude_this = race end sendkeys(string.char(6) .. "@corpse&&!!rott&&!!skel&&!!sky&&!!necrop&&!!ugly&&!!vampire&&!!corpse rot&&!!&&!!botono" .. exclude_this .. "\ra\r") end function inventory() return iter.invent_iterator:new(items.inventory()) end function floor_items() return iter.invent_iterator:new(you.floor_items()) end function no_weapon() return (items.equipped_at("Weapon") == nil) and not uses_unarmed() end function uses_unarmed() return not you_are_not_ghoul() or not you_are_not_troll() or not you_are_not_felid() or (you.skill("Unarmed Combat") >= 3) end function is_weapon(str) local weapon = items.equipped_at("Weapon") if weapon then return string.find(weapon.name(), str) else return false end end function is_ring(str) local ring1 = items.equipped_at("Left Ring") local ring2 = items.equipped_at("Right Ring") if ring1 and ring2 then return string.find(ring1.name(), str) or string.find(ring2.name(), str) elseif ring1 then return string.find(ring1.name(), str) elseif ring2 then return string.find(ring2.name(), str) else return false end end function item_in_view(str) local x,y for x = -8,8 do for y = -8,8 do if not (x == 0 and y == 0) then local pile = items.get_items_at(x,y) if pile ~= nil then for it in iter.invent_iterator:new(pile) do if string.find(it.name(), str) and you.see_cell_no_trans(x,y) then return true end end end end end end return false end -- Returns a table where the key is the monster description and value is the total number of that mob in your vision function getMonsterList() local monsters = {} for x = -7,7 do for y = -7,7 do m = monster.get_monster_at(x, y) local attitude_hostile = 0 if m and (m:attitude() == attitude_hostile) and not (m:is_firewood()) then desc = m:desc() if (monsters[desc] == nil) then monsters[desc] = 1 else monsters[desc] = monsters[desc] + 1 end end end end return monsters end --Escapes the special characters in a string for pattern matching function escape(str) --Escapes parens and dash "()-" local escaped = str:gsub('[%(%)%-]','%\%1') --Removes any coloration parts of the string return (escaped:gsub('<[^<]*>','')) end local function init_spells() local spell_list = {} for _, spell_name in ipairs(you.spells()) do spell_list[spell_name] = true end return spell_list end known_spells = init_spells() > # Got suggestions/improvements? # https://github.com/HilariousDeathArtist/DCSSConfigFile # or find me on crawl.s-z.org # I will try to keep my rc files up to date on CSZO and CAO # If you are playing on these servers you can include this file in your config with the following line # include += HilariousDeathArtist.rc # SUCH EXCITEMENT!!! # language = !!! # To override this setting, add the following line after include += HilariousDeathArtist.rc # language = en # To override other settings you don't like, you may redefine them after the include like the language setting # Logs chat messages into the notes note_chat_messages = true < function ready() AnnounceDamage() --SpoilerAlert() OpenSkills() end > #################### # Included RcFiles # #################### # Just Message colors # include += HDAMessageColors.rc # Just Item colors # include += HDAItemColors.rc # Monster warning messages -- disabled by default # Uncomment the next line and the call to SpoilerAlert() in the ready function to use it # include += SpoilerAlert.rc # The damage announcement messages # include += HDamage.rc # Force More prompts # include += HDAForceMore.rc # Message and Item colors # include += HDAColors.rc # The ===HDAtravel autotravel replacement macro # include += HDAtravel.rc message_colour += mute:you're not good enough to have a special ability message_colour += mute:@corpse #################### # Opens skill menu # #################### < local need_skills_opened = true function OpenSkills() if you.turns() == 0 and need_skills_opened then need_skills_opened = false sendkeys("m") end end > ############# # Autofight # ############# # Do/don't throw stuff when autofighting autofight_throw = true autofight_throw_nomove = true # If true. items are autofired stopping at the monsters feet (same as firing using .) autofight_fire_stop = true fire_order = launcher, return fire_order += rock, javelin, tomahawk, stone # Prevent me from tab-fighting to death by keeping this high autofight_stop = 60 # Enables automagic attacks automagic_enable = false automagic_slot = a # Percentage of MP to stop automagic at automagic_stop = 50 # If set to true, resort to melee when automagic_stop is active automagic_fight = true ############## # Autopickup # ############## # Used # $ = gold # ? = scroll # ! = potion # : = book # " = jewellery # / = wand # % = food # } = miscellaneous # \ = rods # | = staves : if (you.god():find("Trog")) then autopickup += $?!:"/%}\ : else autopickup += $?!:"/%}\| : end # Unused # ) = weapon # ( = missiles # [ = armour # X = corpses # Allows easily dropping multiple items drop_mode += multi # Always show the full list of items when you pick up a stack pickup_mode += multi # Allows followers to pick up ANYTHING (take care not to lose artefacts) default_friendly_pickup += all # Set Alias for Autopickup Exceptions ae := autopickup_exceptions ae += useless_item, dangerous_item, evil_item # Don't pick up potion(s) of [coagulated] blood if you are not a vampire : if you.race() ~= "Vampire" then ae += potions? of.*blood : end # Autopickup artefacts ae += 2) or armourname:find("dragon") or armourname:find("troll") then return it.artefact else return it.artefact or it.branded or it.ego end end return true end if (sub_type == "shield") then if equipped_item then return it.artefact or it.branded or it.ego end end end if (class == "weapon") then if it.is_useless then return false end if (you.xl() < 12) or (you.god():find("Nemelex") or (you.god():find("Yred")) or (you.god():find("Beogh"))) then if it.branded and not (it.name() == "club") then return false end end local weapon = items.equipped_at("Weapon") if weapon then if (weapon.branded or weapon.artefact) then return false else local weapon_name = weapon.name() local sb = you.skill("Short Blades") local lb = you.skill("Long Blades") local axe = you.skill("Axes") local mf = you.skill("Maces & Flails") local pole = you.skill("Polearms") local staff = you.skill("Staves") if sb > 6 then if name:find("quick blade") then return true end end if lb > 8 then if name:find("demon blade") then return true end if name:find("bastard sword") then return true end if name:find("double sword") then return true end end if lb > 14 then if name:find("claymore") then return true end if name:find("triple sword") then return true end end if axe > 8 and mf <= 8 then if name:find("battleaxe") then return true end if name:find("broad axe") then return true end if name:find("war axe") then return true end if name:find("executioner") then return true end end if axe > 18 then if name:find("executioner") then return true end end if mf > 8 and staff <= 8 and axe <= 8 then if name:find("eveningstar") then return true end if name:find("demon whip") then return true end if name:find("sacred scourge") then return true end if name:find("dire flail") then return true end end if mf > 14 and staff <= 14 and axe <= 14 then if name:find("great mace") then return true end end if pole > 8 and staff <= 8 then if name:find("trident") then return true end if name:find("demon trident") then return true end if name:find("trishula") then return true end end if pole > 14 and staff <= 14 then if name:find("glaive") then return true end if name:find("bardiche") then return true end end if staff > 8 then if name:find("lajatang") then return true end end end elseif (you.skill("Unarmed Combat") < 3) then return false end end end) } ############### # Spell slots # ############### # Set Alias for Spell Slots slot := spell_slot # Try to keep in alphabetic order (by keybind) slot += Freeze:a slot += Shroud:a slot += Blink:b slot += Call Canine Familiar:c slot += Call Imp:c slot += Confuse:c slot += Conjure Flame:c slot += Control Undead:c slot += Freezing Aura:c slot += Petrify:c slot += Spider Form:c slot += Deflect Missiles:d slot += Lethal Infusion:d slot += Repel Missiles:d slot += Fire Brand:f slot += Fireball:f slot += Apportation:g slot += Haste:h slot += Sublimation of Blood:m slot += Abjuration:q slot += Recall:r slot += Regeneration:r slot += Condensation Shield:s slot += Shroud of Golubria:s slot += Slow:s slot += Sticks to Snakes:s slot += Sticky Flame:s slot += Stoneskin:s slot += Swiftness:s slot += Passwall:w slot += Corona:v slot += Blade Hands:x slot += Iskenderun's Mystic Blast:x slot += Lightning Bolt:x slot += Mephitic Cloud:x slot += Stone Arrow:x slot += Throw Flame:x slot += Throw Frost:x slot += Throw Icicle:x slot += Vampiric Draining:x slot += Iskenderun's Battlesphere:z slot += Lee's Rapid Deconstruction:z slot += Spectral Weapon:z slot += Animate Dead:A slot += Animate Skeleton:A slot += Ozocubu's Armour:A slot += Controlled Blink:B slot += Summon Butterflies:B slot += Control Teleport:C slot += Death's Door:D slot += Flight:F slot += Cure Poison:P slot += Borgnjor's Revivification:R slot += Phase Shift:S slot += Song of Slaying:S ################ # Auto Exclude # ################ ## dangerous monsters ## auto_exclude += ancient lich, death drake, hydra, ice statue, jelly, orb of fire ## paralysing monsters and uniques ## auto_exclude += [^c] wizard, ancient lich, Ereshkigal, Erolcha, eyeball, Grinder, Jory, lich auto_exclude += Norris, ogre-mage, orb of eyes, orc sorcerer, Rupert, sphinx, vampire knight ## other uniques and unique followers ## auto_exclude += Agnes, Aizul, Arachne, Asterion, Blork, Boris, Crazy Yiuf, Donald, Dowan auto_exclude += Duvessa, Edmund, Erica, Eustachio, Fannar, Frances, Frederick, Gastronok auto_exclude += Grum, Harold, Ijyb, Jessica, Jorgrun, Joseph, Kirke, Louise, Mara, Maud auto_exclude += Maurice, Menkaure, Mennas, Natasha, Nergalle, Nessos, Nikola, Pikel auto_exclude += Polyphemus, Prince Ribbit, Psyche, Roxanne, Saint Roka, Sigmund, Snorg auto_exclude += Sojobo, Sonja, Terence, Urug, Wiglaf, Xtahua, hog, slave ############### # Auto Travel # ############### # Set travel delay to -1 for instant-travel, set to 1 to see travel paths travel_delay = -1 explore_stop = glowing_items,artefacts,greedy_pickup_smart explore_stop += greedy_visited_item_stack,stairs,shops explore_stop += altars,portals,branches,runed_doors,greedy_sacrificeable # Adjusts how much autoexplore favours attempting to discover room perimeters and corners. # At values higher than 0, autoexplore will more heavily favour visiting squares that are next to walls # reasonable values range from 0 to 10 maybe? explore_wall_bias = 1 explore_improved = true # Make auto travel sacrifice corpses sacrifice_before_explore = true auto_sacrifice = true # Disables key press from stopping autoexplore travel_key_stop = false runrest_ignore_poison = 3:30 runrest_ignore_monster += butterfly:1 trapwalk_safe_hp = dart:15,needle:25,arrow:25,bolt:30,spear:20,axe:40,blade:50 # Only stop resting when both HP/MP are full rest_wait_both = true # Set Alias' stop := runrest_stop_message ignore := runrest_ignore_message ignore += You regained.*mp # Annoyances -- Don't stop autotravel for these events ignore += A.*toadstool withers and dies ignore += disappears in a puff of smoke ignore += engulfed in a cloud of smoke ignore += engulfed in white fluffiness ignore += grinding sound ignore += in your inventory.*rotted away ignore += safely over a trap ignore += standing in the rain ignore += toadstools? grow ignore += You feel.*sick ignore += You walk carefully through the # Jiyva Messages ignore += Jiyva appreciates your sacrifice ignore += Jiyva gurgles merrily ignore += Jiyva says: Divide and consume ignore += You hear.*splatter # Qazlal ignore += The plant is engulfed ignore += You destroy the (bush|fungus|plant) ignore += You displace your # Bad things -- Stop autotravel for these events (duplicates some of HDAForceMore) stop += (blundered into a|invokes the power of) Zot stop += (devoid of blood|starving) stop += A huge blade swings out and slices into you[^r] stop += An alarm trap emits a blaring wail stop += flesh start stop += found a zot trap stop += hear a soft click stop += lose consciousness stop += sense of stasis stop += Wait a moment stop += wrath finds you stop += You fall through a shaft # Expiring spells effects -- Stop to allow recasts (duplicates some of HDAForceMore) # Control Teleport stop += you feel uncertain # Death's Door more += time is quickly running out more += life is in your own # Enslavement more += is no longer charmed # Flight more += You are starting to lose your buoyancy stop += You lose control over your flight # Haste more += You feel yourself slow down # Phase Shift more += You feel closer to the material plane # Repel/Deflect stop += missiles spell is about to expire # Shroud of Golubria stop += shroud begins to fray stop += shroud unravels more += Your shroud falls apart # Swiftness stop += start to feel a little slower # Transmutations more += Your transformation is almost over more += You have a feeling this form more += Your skin feels tender more += You feel yourself come back to life # Ghouls (Not part of HDAForceMore) : if you.race() == "Ghoul" then stop += smell.*(rott(ing|en)|decay) stop += something tasty in your inventory : end # Good things - Bad things wearing off (Duplicates some of HDAForceMore) stop += contamination has completely stop += You are no longer firmly anchored in space #Ally actions? #ignore += pray: #ignore += friend_spell: #ignore += friend_enchant: #ignore += friend_action: #ignore += sound: ############# # Interface # ############# allow_self_target = prompt sort_menus = true #WARNING TO KEYPAD USERS: The number 7 is mapped to the letter 'y' easy_confirm = all confirm_butcher = never easy_eat_chunks = true auto_eat_chunks = true auto_drop_chunks = yes easy_eat_contaminated = true equip_unequip = true #hp_warning = 25 -- Damage Calc overrides these #mp_warning = 25 -- Damage Calc overrides these hp_colour = 100:green, 99:lightgrey, 75:yellow, 50:lightred, 25:red mp_colour = 100:green, 99:lightgrey, 75:yellow, 50:lightred, 25:red stat_colour = 3:red, 7:lightred # Removes the more prompts when outputting more than one screen of messages show_more = false small_more = true # Setting this to false changes the turn display to show player turns (used for scoring) show_game_turns = true msg_min_height=7 msg_max_height=10 default_manual_training = true #################### # Autoinscriptions # #################### # Set Alias ai := autoinscribe # Overwrite annoying inscriptions with your own # Inscribe vampiric weapons if you are not a vampire : if you.race() ~= "Vampire" then ai += vampiric:!w # Inscribe potions of blood if you are a vampire : else ai += potion.*blood:@q1 : end # Inscribe distortion weapons if you are not worshipping Lugonu : if you.god() ~= "Lugonu" then ai += distortion:!w ai += (Sonja|Psyche):!w : end # Misc ai += rod of [^s][^t]:!a ai += [Mm]anual of:!d ai += dispersal:=f ai += large rock:!d ai += throwing net:=f, !d ai += tome of destruction:!d # Consumables ai += (bad|dangerous)_item.*potion:!q ai += potions? of berserk rage:!q ai += potions? of cure mutation:!q ai += (bad|dangerous)_item.*scroll:!r ai += scrolls? of blinking:!r ai += scrolls? of holy word:!r ai += scrolls? of magic mapping:!r ai += scrolls? of vulnerability:!r # Body Armour ai += fire dragon (armour|hide):rF++, rC- ai += gold dragon (armour|hide):rC+, rF+, rPois ai += ice dragon (armour|hide):rC++, rF- ai += mottled dragon (armour|hide):rSticky ai += pearl dragon (armour|hide):rN+ ai += quicksilver dragon armour:MR+ ai += shadow dragon (armour|hide):Stlth++++ ai += steam dragon (armour|hide):rSteam ai += storm dragon (armour|hide):rElec ai += swamp dragon (armour|hide):rPois ai += troll (hide|leather armour):regen # Body Armour Egos #ai += ([^l] leather armour|mail|plate armour|robe|skin) of cold resistance:rC+ #ai += ([^l] leather armour|mail|plate armour|robe|skin) of fire resistance:rF+ #ai += (leather armour|mail|plate armour|robe) of magic resistance:MR+ #ai += (leather armour|mail|plate armour|robe) of positive energy:rN+ #ai += (leather armour|mail|plate armour) of poison resistance:rPois #ai += plate armour of ponderousness:Speed- #ai += robe of resistance:rC+, rF+ #ai += robe of the archmagi:Spellpower+ #ai += troll leather armour of cold resistance:, rC+ #ai += troll leather armour of fire resistance:, rF+ # Accessory Egos #ai += (barding|boots|buckler|cloak|gloves|hat|helmet|shield) of cold resistance:rC+ #ai += (barding|boots|buckler|cloak|gloves|hat|helmet|shield) of fire resistance:rF+ #ai += (barding|boots) of flight:+Fly #ai += (barding|boots) of stealth:Stlth+ #ai += (barding|boots) of running:Speed+ #ai += (barding|boots) of jumping:+Jump #ai += (buckler|cloak|shield) of poison resistance:rPois #ai += (buckler|shield) of positive energy:rN+ #ai += (buckler|shield) of protection:AC+3 #ai += (buckler|shield) of reflection:Reflect #ai += (buckler|shield) of resistance:rC+, rF+ #ai += (cloak|hat|helmet) of magic resistance:MR+ #ai += (hat|helmet) of intelligence:Int+3 #ai += (hat|helmet) of see invisible:sInv #ai += cloak of darkness:+Inv #ai += gloves of strength:Str+3 #ai += gloves of dexterity:Dex+3 #ai += gloves of archery:Ranged Slay+4 #ai += hat of spirit shield:Spirit # Amulets ai += amulet of clarity:Clar, !d ai += amulet of faith:Faith, !P ai += amulet of guardian spirit:Spirit ai += amulet of rage:+Rage, !d ai += amulet of regeneration:+regen, !d ai += amulet of resist corrosion:rCorr, !d ai += amulet of resist mutation:rMut, !d ai += amulet of stasis:Stasis, !d ai += amulet of the gourmand:Gourm, !d ai += amulet of warding:Ward, rN+, !d # Rings ai += ring of fire:rF+, rC- ai += ring of flight:+Fly, !d ai += ring of ice:rC+, rF- ai += ring of invisibility:+Inv, !d ai += ring of loudness:Stlth- ai += ring of magical power:MP+9 ai += ring of poison resistance:rPois, !d ai += ring of positive energy:rN+ ai += ring of protection from cold:rC+, !d ai += ring of protection from fire:rF+, !d ai += ring of protection from magic:MR+, !d ai += ring of see invisible:sInv, !d ai += ring of stealth:Stlth+ ai += ring of sustain abilities:SustAb ai += ring of teleport control:cTele, !d ai += ring of teleportation:+/*tele, !d ai += ring of wizardry:Wiz+, !d # Obsolete in 0.16 ai += ring of regeneration:regen, !d # Staves ai += staff of air:rElec ai += staff of cold:rC+ ai += staff of conjuration:!a ai += staff of death:rN+ ai += staff of energy:+MP, hungerless spells, !d!a ai += staff of fire:rF+ ai += staff of poison:rPois ai += staff of power:MP+17, !a ai += staff of summoning:!a ai += staff of wizardry:wiz+, !a # Save fruit for abilities under Fedhas : if you.god() == "Fedhas" then ai += fruit:!e : end autoinscribe_cursed = false show_god_gift = unident ################## # Character Dump # ################## dump_item_origins = all dump_item_origin_price = 100 dump_message_count = 100 #dump_order = header,hiscore,stats,misc,mutations,skills,spells,overview,inventory #dump_order += screenshot,monlist,messages,action_counts,vaults,notes,kills dump_order += vaults, turns_by_place, kills_by_place dump_book_spells = false ood_interesting = 6 note_hp_percent = 25 note_all_skill_levels = true note_xom_effects = true note_items += of Zot,rod,acquirement note_messages += Your scales start note_messages += protects you from harm note_messages += You fall through a shaft note_messages += [bB]anish.*Abyss note_monsters += orb of fire,silver star,pearl dragon,ancient lich