Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # TEAMCAPTAIN apparentbliss
- # include all HDA except HDAtravel
- include += HilariousDeathArtist.rc
- msg_condense_repeats=true
- easy_eat_chunks=true
- auto_eat_chunks=true
- rest_wait_both=true
- rest_wait_percent=100
- # caster automagic settings
- # use a when autofighting, stop at 20% MP, don't melee automatically
- automagic_enable=true
- automagic_slot=a
- automagic_stop=20
- automagic_fight=false
- # personal version of HDA travel with bug fixes for trunk
- ##################
- # solHDAtravel #
- ##################
- -- 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 solHDAtravel()
- : 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 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 have_no_chunks = number_of_chunks() == 0
- : local have_no_blood = number_of_potions_of_blood() == 0
- : local you_do_not_eat = string.find(you.race(), "Spriggan") or you_are_mummy or you_are_vampire
- : local need_to_recover = should_rest(hp, mp, max_hp, max_mp)
- : 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_fedhas = string.find(you.god(), "Fedhas")
- : 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 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 or you_are_fedhas)) and you_know_animate_skeleton and mp>1 and (not can_not_animate())
- : local should_animate_dead = (not (you_are_good or you_are_fedhas)) 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 have_no_chunks and (want_to_eat or you_want_spare_chunks)) or (you_are_vampire and number_of_potions_of_blood() < 5) or (you_are_ghoul and number_of_chunks() < 6)
- : --crawl.mpr(string.format("you_are_fedhas is: %s", you_are_fedhas and "True" or "False"))
- : --crawl.mpr(string.format("should_animate_skeleton is: %s", should_animate_skeleton and "True" or "False"))
- : --crawl.mpr(string.format("need_to_recover is: %s", need_to_recover and "True" or "False"))
- : --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_potions_of_blood is: %s", number_of_potions_of_blood()))
- : --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("<lightcyan>Autocasting Sublimation of Blood.</lightcyan>")
- : sendkeys('zm')
- : elseif should_channel_mp and you_are_sif and (you.piety_rank() > 0) then
- : crawl.mpr("<lightcyan>Autochanneling using Sif.</lightcyan>")
- : sendkeys('aa')
- : elseif should_regen_hp and can_cast_regen then
- : crawl.mpr("<green>Autocasting Regen.</green>")
- : --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("<cyan>Switching to staff of energy.</cyan>")
- : sendkeys('w1')
- : end
- : crawl.mpr("<lightcyan>Autochanneling using staff of energy.</lightcyan>")
- : 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("<cyan>Switching to unarmed.</cyan>")
- : sendkeys('w-')
- : else
- : crawl.mpr("<cyan>Switching to main weapon.</cyan>")
- : sendkeys('wa')
- : end
- : elseif want_to_eat and number_of_chunks() > 0 then
- : crawl.mpr("<cyan>Autoeating chunks.</cyan>")
- : 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("<cyan>Autocasting Animate Skeleton for chunks.</cyan>")
- : sendkeys('zA')
- : else
- : crawl.mpr("<cyan>Autochopping corpse.</cyan>")
- : 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("<yellow>You may need something to eat soon, looking for food.</yellow>")
- : find_corpses()
- : elseif you_are_starving_or_near() and have_no_chunks 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("<cyan>Eat a ration?</cyan>", 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("<lightred>That was your last ration! You should go get more.</lightred>")
- : end
- : else
- : crawl.mpr("<red>No rations left! You should look for food.</red>")
- : end
- : elseif need_to_recover and not you_are_starving() then
- : if you_are_bloodless and have_potion_of_blood then
- : crawl.mpr("<cyan>Autoquaffing potion of blood.</cyan>")
- : 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("<cyan>Autocasting Mass Animate Remains.</cyan>")
- : 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("<cyan>Autocasting Animate Dead.</cyan>")
- : sendkeys('zA')
- : elseif (not sacrifice_god) and on_corpses() and should_animate_skeleton then
- : crawl.mpr("<cyan>Autocasting Animate Skeleton.</cyan>")
- : sendkeys('zA')
- : elseif you_are_yred and (you.piety_rank() >= 1) and on_corpses() then
- : crawl.mpr("<cyan>Autocasting Animate Remains.</cyan>")
- : 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")
- local bloodless_vampire = (number_of_potions_of_blood() == 0) and (you.hunger_name() == "bloodless")
- local can_not_regen = you_are_deep_dwarf or bloodless_vampire
- local missing_hp = (hp < (max_hp*0.80)) or ((max_hp-hp) > 30)
- local missing_mp = (mp < (max_mp*0.80)) or ((max_mp-mp) > 20)
- return missing_mp
- or (missing_hp and not can_not_regen)
- 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_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") and string.find(it.name(), "flesh") and not food.dangerous(it) then
- return it.quantity
- end
- end
- return 0
- end
- function number_of_potions_of_blood()
- for it in inventory() do
- if string.find(it.name(), "potion") and string.find(it.name(), "blood") 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")
- and not string.find(it.name(), "kobold") 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&&!!kobold&&!!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 = -7,7 do
- for y = -7,7 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()
- >
Add Comment
Please, Sign In to add comment