lab_use_click_to_send_chat = true tile_show_threat_levels = tough nasty view_delay = 200 default_manual_training = true autofight_caught = true macros += M \{-274} ===use_unidentified_consumable macros += M \{96} \{9}o macros += M \{-265} za macros += M \{-266} zb macros += M \{-267} zc macros += M \{-268} zd macros += M \{-269} ze macros += M \{-270} zf macros += M \{-271} zg macros += M \{-272} zh message_colour ^= mute:are too injured to fight recklessly message_colour ^= mute:are monsters nearby message_colour ^= mute:target in view message_colour ^= mute:^.* is nearby[.!]?$ message_colour ^= mute:^Key pressed.stopping explore.$ #message_colour ^= mute:^Partly explored. message_colour ^= mute:^No reachable target in view[.!]?$ #message_colour ^= mute:^Done exploring.$ message_colour ^= mute:^You are caught.* message_colour ^= mute:^You are held.* message_colour ^= mute:^You are too confused.* force_more_message -= You have reached level ############## # Autopickup # ############## autopickup = $?!"/}(+ pickup_thrown = true ############################ # Autopickup Exceptions ############################ ae := autopickup_exceptions ae += useless_item ae += forbidden ae += scroll of noise ae += >stone ae += equipped_tier then return false end return (candidate.plus or 0) <= (equipped.plus or 0) end local function is_inferior_to_equipped_weapon( equipped, candidate ) if equipped == nil or candidate == nil then return false end if not equipped.is_weapon or not candidate.is_weapon then return false end if not is_plain_equipment(candidate) then return false end if equipped.weap_skill == nil or candidate.weap_skill ~= equipped.weap_skill then return false end if not same_weapon_handedness( equipped, candidate ) then return false end local equipped_tier = weapon_tiers[weapon_base_name(equipped)] local candidate_tier = weapon_tiers[weapon_base_name(candidate)] if equipped_tier == nil or candidate_tier == nil then return false end if candidate_tier < equipped_tier then return (candidate.plus or 0) <= (equipped.plus or 0) end if candidate_tier > equipped_tier then return false end if weapon_base_name(candidate) ~= weapon_base_name(equipped) then return false end local equipped_brand = equipment_brand(equipped) local candidate_brand = equipment_brand(candidate) if candidate_brand == equipped_brand then return (candidate.plus or 0) <= (equipped.plus or 0) end if equipped_brand ~= "" and candidate_brand == "" then return (candidate.plus or 0) <= (equipped.plus or 0) end return false end local function is_inferior_to_current_equipment( candidate, wanted_kind ) if wanted_kind == "armour" then return is_inferior_to_equipped_armour( nil, candidate ) end if wanted_kind == "weapon" then return is_inferior_to_equipped_weapon( items.equipped_at("Weapon"), candidate ) end return false end local function inventory_item_dominates( better_item, worse_item ) if better_item == nil or worse_item == nil then return false end local better_kind = item_kind_string(better_item) local worse_kind = item_kind_string(worse_item) if better_kind == nil or better_kind ~= worse_kind then return false end if better_kind == "weapon" then if not better_item.is_weapon or not worse_item.is_weapon then return false end if better_item.weap_skill == nil or worse_item.weap_skill ~= better_item.weap_skill then return false end if not same_weapon_handedness( better_item, worse_item ) then return false end local better_tier = weapon_tiers[weapon_base_name(better_item)] local worse_tier = weapon_tiers[weapon_base_name(worse_item)] if better_tier == nil or worse_tier == nil then return false end if better_tier < worse_tier then return false end if (better_item.plus or 0) < (worse_item.plus or 0) then return false end local better_brand = equipment_brand(better_item) local worse_brand = equipment_brand(worse_item) if better_brand ~= "" and worse_brand == "" then return true end if better_brand ~= worse_brand then return false end if better_tier > worse_tier then return true end if (better_item.plus or 0) > (worse_item.plus or 0) then return true end return weapon_base_name(better_item) == weapon_base_name(worse_item) end if better_kind == "armour" then local better_slot, better_tier = armour_slot_and_tier(better_item) local worse_slot, worse_tier = armour_slot_and_tier(worse_item) if better_slot == nil or better_slot ~= worse_slot then return false end if better_tier == nil or worse_tier == nil then return false end if better_tier < worse_tier then return false end if (better_item.plus or 0) < (worse_item.plus or 0) then return false end local better_brand = equipment_brand(better_item) local worse_brand = equipment_brand(worse_item) if better_brand ~= "" and worse_brand == "" then return true end if better_brand ~= worse_brand then return false end if better_tier > worse_tier then return true end if (better_item.plus or 0) > (worse_item.plus or 0) then return true end return armour_base_name(better_item) == armour_base_name(worse_item) end return false end local function already_have_same_or_better_item( floor_item, wanted_kind ) if is_inferior_to_current_equipment( floor_item, wanted_kind ) then return true end for _, inv_item in ipairs(items.inventory()) do if item_kind_string(inv_item) == wanted_kind and inventory_item_dominates( inv_item, floor_item ) then return true end end return false end local martial_jobs = { ["Fighter"] = true, ["Gladiator"] = true, ["Monk"] = true, ["Berserker"] = true, ["Hunter"] = true, ["Brigand"] = true, ["Delver"] = true, ["Artificer"] = true, ["Shapeshifter"] = true, ["Chaos Knight"] = true, ["Cinder Acolyte"] = true } local function is_martial_job() return martial_jobs[you.class()] == true end local weapon_skills = { "Short Blades", "Long Blades", "Axes", "Maces & Flails", "Polearms", "Staves", "Ranged Weapons", "Unarmed Combat" } local function is_most_trained_weapon(it) if not it.is_weapon or it.weap_skill == nil then return false end local item_skill_level = you.base_skill(it.weap_skill) for _, skill_name in ipairs(weapon_skills) do if you.base_skill(skill_name) > item_skill_level then return false end end return true end function use_unidentified_consumable() local best_item = nil local best_quantity = 0 for _, it in ipairs(items.inventory()) do local class = it.class(true) local quantity = tonumber(it.quantity) or 0 if not it.is_identified and quantity >= 2 and (class == "potion" or class == "scroll") then if quantity > best_quantity then best_item = it best_quantity = quantity end end end if best_item == nil then crawl.mpr("No unidentified consumable stacks of 2+.") return end local class = best_item.class(true) local letter = items.index_to_letter(best_item.slot) if class == "potion" then crawl.sendkeys("q" .. letter) return end if class == "scroll" then crawl.sendkeys("r" .. letter) return end end add_autopickup_func(function(it, name) if it.class(true) == "armour" then if it.is_useless then return false end if it.artefact then return true end if not armour_is_light_enough(it) then return false end if already_have_same_or_better_item( it, "armour" ) then return false end return true end if it.is_weapon then if it.artefact then return true end if not is_martial_job() then if is_plain_equipment(it) then return false end if already_have_same_or_better_item( it, "weapon" ) then return false end return true end if not is_most_trained_weapon(it) then return false end if already_have_same_or_better_item( it, "weapon" ) then return false end return true end return nil end) local function is_drop_protected(it) if it.equipped then return true end if it.artefact then return true end local inscription = tostring(it.inscription or "") if inscription:find( "!d", 1, true ) then return true end return false end local function process_inventory_inferior_drops() if not you.feel_safe() then return false end local inventory = items.inventory() for worse_index, worse_item in ipairs(inventory) do if not is_drop_protected(worse_item) then if worse_item.class(true) == "armour" and is_plain_equipment(worse_item) then local worse_slot = armour_slot_and_tier(worse_item) if worse_slot == "body" and not armour_is_light_enough( worse_item ) then local dropped_name = tostring(worse_item.name()) if worse_item:drop() then crawl.mpr( "Dropped unusable armour: " .. dropped_name ) return true end end end for better_index, better_item in ipairs(inventory) do if better_index ~= worse_index and inventory_item_dominates( better_item, worse_item ) then local dropped_name = tostring(worse_item.name()) if worse_item:drop() then crawl.mpr( "Dropped inferior item: " .. dropped_name ) return true end end end end end return false end local skill_setup_done = false local all_skills = { "Fighting", "Short Blades", "Long Blades", "Axes", "Maces & Flails", "Polearms", "Staves", "Ranged Weapons", "Throwing", "Armour", "Dodging", "Stealth", "Shields", "Unarmed Combat", "Spellcasting", "Conjurations", "Hexes", "Summonings", "Necromancy", "Translocations", "Forgecraft", "Fire Magic", "Ice Magic", "Air Magic", "Earth Magic", "Alchemy", "Invocations", "Evocations", "Shapeshifting" } local weapon_skill_targets = { ["dagger"] = 10, ["quick blade"] = 16, ["short sword"] = 10, ["rapier"] = 14, ["athame"] = 14, ["falchion"] = 14, ["long sword"] = 14, ["scimitar"] = 14, ["demon blade"] = 14, ["eudemon blade"] = 12, ["double sword"] = 16, ["great sword"] = 20, ["triple sword"] = 22, ["hand axe"] = 14, ["war axe"] = 16, ["broad axe"] = 18, ["battleaxe"] = 20, ["executioner's axe"] = 24, ["club"] = 14, ["whip"] = 12, ["mace"] = 14, ["flail"] = 14, ["morningstar"] = 16, ["demon whip"] = 12, ["sacred scourge"] = 12, ["dire flail"] = 14, ["eveningstar"] = 16, ["great mace"] = 20, ["giant club"] = 18, ["giant spiked club"] = 22, ["spear"] = 12, ["trident"] = 14, ["halberd"] = 16, ["partisan"] = 20, ["demon trident"] = 14, ["trishula"] = 14, ["glaive"] = 20, ["bardiche"] = 24, ["staff"] = 12, ["quarterstaff"] = 14, ["lajatang"] = 14, ["sling"] = 14, ["hand cannon"] = 24, ["shortbow"] = 14, ["orcbow"] = 16, ["arbalest"] = 24, ["longbow"] = 20, ["triple crossbow"] = 26 } local function get_weapon_skill_target(weapon) if weapon == nil or not weapon.is_weapon then crawl.mpr("Weapon target debug: invalid weapon") return nil end local base = weapon_base_name(weapon) local target = weapon_skill_targets[base] crawl.mpr( "Weapon target debug: " .. tostring(base) .. " -> " .. tostring(target) ) return target end local function get_starting_weapon() local weapon = items.equipped_at("Weapon") if weapon and weapon.is_weapon and weapon.weap_skill then return weapon end return nil end local previous_ch_stop_running = ch_stop_running function ch_stop_running(kind) if previous_ch_stop_running then previous_ch_stop_running(kind) end if kind ~= "explore" and kind ~= "explore_greedy" then return end if not you.feel_safe() then return end local messages = tostring(crawl.messages(5) or "") if messages:find( "Done exploring", 1, true ) or messages:find( "Partly explored", 1, true ) then crawl.sendkeys("X>") end end function ready() if not skill_setup_done and you.turns() == 0 then local job = you.class() if martial_jobs[job] then local weapon = get_starting_weapon() if weapon ~= nil then local weapon_skill = weapon.weap_skill local weapon_target = get_weapon_skill_target( weapon ) skill_setup_done = true for _, skill in ipairs(all_skills) do you.train_skill( skill, 0 ) end you.train_skill( "Fighting", 1 ) you.train_skill( weapon_skill, 2 ) you.set_training_target( "Fighting", 4 ) if weapon_target ~= nil then you.set_training_target( weapon_skill, weapon_target ) end else skill_setup_done = true if you.can_train_skill( "Unarmed Combat" ) then for _, skill in ipairs(all_skills) do you.train_skill( skill, 0 ) end you.train_skill( "Fighting", 1 ) you.train_skill( "Unarmed Combat", 2 ) you.set_training_target( "Fighting", 3 ) end end end end if process_inventory_inferior_drops() then return end end } ######################################################################