##### 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://github.com/crawl/crawl/blob/master/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 # Alternative vi bindings for Neo users. # include = neo_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 # Recommended settings sounds_on = true sound_pack += https://sound-packs.nemelex.cards/DCSS-UST/v1.0.1.zip sound_pack += https://osp.nemelex.cards/build/latest.zip:["init.txt"] one_SDL_sound_channel = true sound_fade_time = 1 bgm_volume = 0 always_show_zot = true translation_language = ko ###################################################################### # SOHEE / SANGDON DCSS SMART RC PACK # 목적: # 1) artefact 전부 자동줍기 # 2) 비어 있는 방어구 슬롯 자동줍기 # 3) 자동탐색/강제 more/위험 아이템 inscribe/QoL 세팅 ###################################################################### ############################ # 기본 조작 / 자동줍기 ############################ default_manual_training = true default_autopickup = true # 현재 문서 기준 기본 autopickup류: 금, 스크롤, 포션, 장신구, 완드, 책, 보석 등. # 방어구/무기는 Lua에서 필요한 것만 주움. autopickup = $?!+"/♦ pickup_thrown = true drop_disables_autopickup = true assign_item_slot = backward pickup_menu_limit = 1 autopickup_search = true # autopickup_exceptions alias ae := autopickup_exceptions # 무조건 관심 대상 ae ^= useless_item ae += >bad_item ae += >dangerous_item ############################ # 핵심: artefact + 빈 장비 슬롯 자동줍기 ############################ # - artefact는 종류 불문 자동줍기 # - 망토/헬멧/장갑/부츠/갑옷/방패 슬롯이 비어 있으면 해당 부위 자동줍기 # - 이미 찬 보조방어구 슬롯에는 ego/branded만 추가로 주움 # - body armour / shield까지 줍기 싫으면 아래 true를 false로 바꾸면 됨 { local PICKUP_EMPTY_BODY_ARMOUR = true local PICKUP_EMPTY_SHIELD = true local PICKUP_EGO_AUX_UPGRADES = true local armour_slots = { cloak = "Cloak", helmet = "Helmet", hat = "Helmet", gloves = "Gloves", boots = "Boots", body = "Armour", shield = "Shield", } local function has_ego_or_brand(it) return it.artefact or it.branded or (it.ego and it:ego() ~= nil) end local function smart_equipment_pickup(it, name) -- artefact는 무조건 줍는다. Crawl 내부 표기는 artefact. if it.artefact then return true end local class = it:class(true) if class == "armour" then if it.is_useless then return false end local subtype = it:subtype() local slot = armour_slots[subtype] if not slot then return nil end local equipped = items.equipped_at(slot) -- 빈 슬롯이면 줍기 if not equipped then if subtype == "body" then return PICKUP_EMPTY_BODY_ARMOUR elseif subtype == "shield" then return PICKUP_EMPTY_SHIELD else return true end end -- 이미 찬 보조 방어구는 ego/branded만 줍기 if PICKUP_EGO_AUX_UPGRADES and (subtype == "cloak" or subtype == "helmet" or subtype == "hat" or subtype == "gloves" or subtype == "boots") then if has_ego_or_brand(it) then return true end end return nil end return nil end add_autopickup_func(smart_equipment_pickup) } ############################ # 자동탐색 / 여행 QoL ############################ explore_greedy = true explore_greedy_visit += artefacts,glowing_items,stacks explore_stop += artefacts,runes,portals,branches,runed_doors explore_stop += greedy_pickup_smart,greedy_visited_item_stack travel_delay = -1 explore_delay = -1 rest_delay = -1 view_delay = 0 reduce_animations = true rest_wait_percent = 100 explore_auto_rest = true explore_auto_rest_status += all_negative,all_cooldown,contam,transformation travel_key_stop = true easy_floor_use = true easy_unequip = true equip_unequip = true jewellery_prompt = false warn_hatches = true ############################ # 탭질 안전장치 ############################ hp_warning = 50 mp_warning = 20 ############################ # 메뉴 / 표시 ############################ sort_menus = true : equipped, art, ego, charged, identified, usefulness, basename, qualname, curse, qty show_paged_inventory = true show_game_time = true show_resist_percent = true equip_bar = true mlist_min_height = 4 monster_item_view_coordinates = true hp_colour = 100:green, 75:yellow, 50:lightred, 25:red mp_colour = 100:green, 75:yellow, 50:lightred, 25:red stat_colour = 3:red, 7:lightred monster_list_colour += trivial:darkgrey, easy:lightgrey, tough:yellow, nasty:lightred, unusual:lightmagenta # 몬스터가 이상한 물건 들고 있으면 위협 표시 unusual_monster_items += wand unusual_monster_items += distortion,chaos unusual_monster_items += curare,atropa,datura,dispersal unusual_monster_items += throwing net ############################ # 위험 아이템 자동 inscribe ############################ # !q = 마실 때 확인 # !r = 읽을 때 확인 # !V = evoke 확인 # !f = 던질 때 확인 autoinscribe += potion.*mutation:!q autoinscribe += potion.*lignification:!q autoinscribe += potion.*ambrosia:!q autoinscribe += potion.*berserk rage:!q autoinscribe += potion.*haste:!q autoinscribe += potion.*heal wounds:!q autoinscribe += potion.*curing:!q autoinscribe += scroll.*blinking:!r autoinscribe += scroll.*teleportation:!r autoinscribe += scroll.*fear:!r autoinscribe += scroll.*summoning:!r autoinscribe += scroll.*immolation:!r autoinscribe += scroll.*vulnerability:!r autoinscribe += scroll.*torment:!r autoinscribe += scroll.*silence:!r autoinscribe += scroll.*poison:!r autoinscribe += wand of polymorph:!V autoinscribe += wand of paralysis:!V autoinscribe += wand of charming:!V autoinscribe += throwing net:!f autoinscribe += curare:!f ############################ # 소모품 단축 슬롯 ############################ # 최신 문서 기준 item_slot보다 consumable_shortcut / gear_slot 쪽이 맞음. consumable_shortcut += potion of curing:q consumable_shortcut += potion of heal wounds:h consumable_shortcut += potion of haste:H consumable_shortcut += potion of might:m consumable_shortcut += potion of resistance:R consumable_shortcut += potion of cancellation:C consumable_shortcut += scroll of identify:r consumable_shortcut += scroll of teleportation:t consumable_shortcut += scroll of blinking:B consumable_shortcut += scroll of fear:F consumable_shortcut += scroll of fog:g consumable_shortcut += scroll of summoning:S consumable_shortcut += scroll of revelation:v gear_slot ^= .*throwing net:f gear_slot ^= .*curare:f ############################ # 강제 More: 위험 몬스터 ############################ monster_alert += -nasty monster_alert += -uniques monster_alert += -unusual force_more_message += (orb of fire|ancient lich|dread lich|juggernaut|shrike).*into view force_more_message += (caustic shrike|golden dragon|storm dragon|shadow dragon).*into view force_more_message += (fiend|tzitzimitl|hell sentinel|hellion|tormentor).*into view force_more_message += (curse toe|curse skull|greater mummy|mummy priest).*into view force_more_message += (moth of wrath|ghost moth|torpor snail).*into view force_more_message += (guardian serpent|draconian shifter|vault warden|ironbound convoker).*into view force_more_message += (deep elf annihilator|deep elf sorcerer|deep elf demonologist|deep elf high priest).*into view force_more_message += (neqoxec|cacodemon|shining eye|wretched star).*into view force_more_message += (sphinx|great orb of eyes|vampire knight|orc sorcerer).*into view force_more_message += (centaur warrior|yaktaur captain|merfolk javelineer).*into view ############################ # 자동 제외 ############################ auto_exclude += oklob plant auto_exclude += obsidian statue auto_exclude += orange crystal statue auto_exclude += Roxanne auto_exclude += player ghost auto_exclude += ancient lich auto_exclude += orb of fire auto_exclude += curse toe auto_exclude += curse skull ############################ # 타겟팅 안전 ############################ allow_self_target = prompt show_invis_targeter = true force_scroll_targeter += fear force_scroll_targeter += silence force_scroll_targeter += vulnerability force_scroll_targeter += immolation force_scroll_targeter += torment ############################ # 첫 턴에 스킬창 열기 ############################ # 싫으면 이 블록 전체 삭제. { local old_ready = ready local opened_skill_menu = false function ready() if old_ready then old_ready() end if you.turns() == 0 and not opened_skill_menu then opened_skill_menu = true crawl.sendkeys("m") end end } ###################################################################### # HARDCORE MAGE TRAINING AUTOPILOT # 이전 STARTUP_SKILL_FILTER 블록 삭제하고 이걸 사용. ###################################################################### default_manual_training = true skill_focus = true default_show_all_skills = true { local HARD_MAGE_AUTOTRAIN = true local OPEN_SKILL_MENU_ON_START = true local PRINT_PHASE_CHANGES = true local all_skills = { "Fighting", "Short Blades", "Long Blades", "Axes", "Maces & Flails", "Polearms", "Staves", "Ranged Weapons", "Slings", "Bows", "Crossbows", "Throwing", "Armour", "Dodging", "Stealth", "Shields", "Unarmed Combat", "Spellcasting", "Conjurations", "Hexes", "Summonings", "Necromancy", "Translocations", "Forgecraft", "Fire Magic", "Ice Magic", "Air Magic", "Earth Magic", "Alchemy", "Poison Magic", "Transmutations", "Invocations", "Evocations", "Shapeshifting" } local function safe_str(f) if type(f) ~= "function" then return "" end local ok, v = pcall(f) if ok and v then return v end return "" end local function bg() return safe_str(you.class) end local function species() return safe_str(you.species) end local function god() return safe_str(you.god) end local function can_train(skill) if type(you.can_train_skill) ~= "function" then return false end local ok, v = pcall(you.can_train_skill, skill) return ok and v end local function skill_level(skill) if type(you.base_skill) == "function" then local ok, v = pcall(you.base_skill, skill) if ok and v then return v end end if type(you.skill) == "function" then local ok, v = pcall(you.skill, skill) if ok and v then return v end end return 0 end local function train(skill, level) if not can_train(skill) then return false end local ok = pcall(you.train_skill, skill, level) return ok end local function set_target(skill, target) if type(you.set_training_target) ~= "function" then return end if not can_train(skill) then return end pcall(you.set_training_target, skill, target) end local function tmerge(...) local out = {} for i = 1, select("#", ...) do local t = select(i, ...) if t then for k, v in pairs(t) do if v and v > 0 then if not out[k] or v > out[k] then out[k] = v end end end end end return out end local function set_from_list(list) local s = {} for _, v in ipairs(list or {}) do s[v] = true end return s end local plans = { ["Fire Elementalist"] = { focus = {"Fire Magic"}, early = {["Spellcasting"]=3, ["Fire Magic"]=5, ["Conjurations"]=3}, mid = {["Spellcasting"]=6, ["Fire Magic"]=8, ["Conjurations"]=6}, late = {["Spellcasting"]=10, ["Fire Magic"]=12, ["Conjurations"]=10} }, ["Ice Elementalist"] = { focus = {"Ice Magic"}, early = {["Spellcasting"]=3, ["Ice Magic"]=5, ["Summonings"]=2}, mid = {["Spellcasting"]=6, ["Ice Magic"]=8, ["Summonings"]=5}, late = {["Spellcasting"]=10, ["Ice Magic"]=12, ["Summonings"]=8} }, ["Air Elementalist"] = { focus = {"Air Magic"}, early = {["Spellcasting"]=3, ["Air Magic"]=5, ["Conjurations"]=3}, mid = {["Spellcasting"]=6, ["Air Magic"]=8, ["Conjurations"]=6}, late = {["Spellcasting"]=10, ["Air Magic"]=12, ["Conjurations"]=10} }, ["Earth Elementalist"] = { focus = {"Earth Magic"}, early = {["Spellcasting"]=3, ["Earth Magic"]=5, ["Conjurations"]=3}, mid = {["Spellcasting"]=6, ["Earth Magic"]=8, ["Conjurations"]=6}, late = {["Spellcasting"]=10, ["Earth Magic"]=12, ["Conjurations"]=10} }, ["Alchemist"] = { focus = {"Alchemy"}, early = {["Spellcasting"]=3, ["Alchemy"]=5}, mid = {["Spellcasting"]=6, ["Alchemy"]=8, ["Fire Magic"]=4}, late = {["Spellcasting"]=10, ["Alchemy"]=12, ["Fire Magic"]=8} }, ["Venom Mage"] = { focus = {"Poison Magic"}, early = {["Spellcasting"]=3, ["Poison Magic"]=5, ["Conjurations"]=2}, mid = {["Spellcasting"]=6, ["Poison Magic"]=8, ["Conjurations"]=5}, late = {["Spellcasting"]=10, ["Poison Magic"]=12, ["Conjurations"]=8} }, ["Conjurer"] = { focus = {"Conjurations"}, early = {["Spellcasting"]=3, ["Conjurations"]=5}, mid = {["Spellcasting"]=6, ["Conjurations"]=9}, late = {["Spellcasting"]=10, ["Conjurations"]=14} }, ["Summoner"] = { focus = {"Summonings"}, early = {["Spellcasting"]=3, ["Summonings"]=5}, mid = {["Spellcasting"]=6, ["Summonings"]=9}, late = {["Spellcasting"]=10, ["Summonings"]=14} }, ["Necromancer"] = { focus = {"Necromancy"}, early = {["Spellcasting"]=3, ["Necromancy"]=5}, mid = {["Spellcasting"]=6, ["Necromancy"]=9}, late = {["Spellcasting"]=10, ["Necromancy"]=14} }, ["Forgewright"] = { focus = {"Forgecraft"}, early = {["Spellcasting"]=3, ["Forgecraft"]=5}, mid = {["Spellcasting"]=6, ["Forgecraft"]=9}, late = {["Spellcasting"]=10, ["Forgecraft"]=14} }, ["Hedge Wizard"] = { focus = {"Spellcasting", "Conjurations"}, early = { ["Spellcasting"]=4, ["Conjurations"]=4, ["Summonings"]=3, ["Necromancy"]=3, ["Translocations"]=2 }, mid = { ["Spellcasting"]=7, ["Conjurations"]=7, ["Summonings"]=5, ["Necromancy"]=5, ["Translocations"]=4 }, late = { ["Spellcasting"]=11, ["Conjurations"]=10, ["Summonings"]=8, ["Necromancy"]=8, ["Translocations"]=7 } }, ["Wizard"] = { focus = {"Spellcasting", "Conjurations"}, early = { ["Spellcasting"]=4, ["Conjurations"]=4, ["Summonings"]=3, ["Necromancy"]=3, ["Translocations"]=2 }, mid = { ["Spellcasting"]=7, ["Conjurations"]=7, ["Summonings"]=5, ["Necromancy"]=5, ["Translocations"]=4 }, late = { ["Spellcasting"]=11, ["Conjurations"]=10, ["Summonings"]=8, ["Necromancy"]=8, ["Translocations"]=7 } }, ["Enchanter"] = { focus = {"Hexes", "Stealth"}, early = {["Spellcasting"]=3, ["Hexes"]=5, ["Stealth"]=5, ["Short Blades"]=4}, mid = {["Spellcasting"]=5, ["Hexes"]=8, ["Stealth"]=8, ["Short Blades"]=8}, late = {["Spellcasting"]=8, ["Hexes"]=12, ["Stealth"]=12, ["Short Blades"]=12} }, ["Hexslinger"] = { focus = {"Ranged Weapons", "Hexes"}, early = {["Spellcasting"]=3, ["Hexes"]=5, ["Ranged Weapons"]=5}, mid = {["Spellcasting"]=5, ["Hexes"]=8, ["Ranged Weapons"]=10}, late = {["Spellcasting"]=8, ["Hexes"]=12, ["Ranged Weapons"]=16} }, ["Warper"] = { focus = {"Translocations"}, early = {["Spellcasting"]=3, ["Translocations"]=5, ["Fighting"]=3}, mid = {["Spellcasting"]=5, ["Translocations"]=8, ["Fighting"]=6}, late = {["Spellcasting"]=8, ["Translocations"]=12, ["Fighting"]=10} }, ["Reaver"] = { focus = {"Conjurations"}, early = {["Spellcasting"]=3, ["Conjurations"]=5, ["Fighting"]=4}, mid = {["Spellcasting"]=5, ["Conjurations"]=8, ["Fighting"]=7}, late = {["Spellcasting"]=8, ["Conjurations"]=12, ["Fighting"]=11} }, ["Cinder Acolyte"] = { focus = {"Fire Magic"}, early = {["Spellcasting"]=3, ["Fire Magic"]=5, ["Fighting"]=4}, mid = {["Spellcasting"]=5, ["Fire Magic"]=8, ["Fighting"]=7}, late = {["Spellcasting"]=8, ["Fire Magic"]=12, ["Fighting"]=11} } } local function defense_targets() local sp = species() local t = {["Fighting"]=4, ["Dodging"]=5, ["Stealth"]=4} if sp:find("Felid") or sp:find("Spriggan") then t["Fighting"] = 5 t["Dodging"] = 8 t["Stealth"] = 7 elseif sp:find("Tengu") then t["Fighting"] = 4 t["Dodging"] = 8 t["Stealth"] = 4 elseif sp:find("Gargoyle") or sp:find("Mountain Dwarf") then t["Fighting"] = 5 t["Dodging"] = 3 t["Stealth"] = 2 t["Armour"] = 4 elseif sp:find("Oni") or sp:find("Troll") then t["Fighting"] = 7 t["Dodging"] = 4 t["Stealth"] = 2 elseif sp:find("Draconian") or sp:find("Demonspawn") then t["Fighting"] = 5 t["Dodging"] = 6 t["Stealth"] = 4 end return t end local function utility_targets() local t = {["Evocations"]=5, ["Fighting"]=7, ["Dodging"]=9, ["Stealth"]=5} -- 방패를 들 수 있거나 이미 들었다면 이쯤부터 Shields를 챙김. if can_train("Shields") then t["Shields"] = 5 end local g = god() if g == "Makhleb" or g == "Nemelex Xobeh" or g == "Qazlal" or g == "Elyvilon" or g == "Zin" or g == "The Shining One" or g == "Okawaru" or g == "Uskayaw" or g == "Fedhas" then t["Invocations"] = 6 end return t end local function endgame_survival_targets() local t = {["Fighting"]=11, ["Dodging"]=13, ["Evocations"]=8, ["Stealth"]=7} if can_train("Shields") then t["Shields"] = 9 end if can_train("Armour") then t["Armour"] = 6 end return t end local function all_reached(targets) local considered = 0 for skill, target in pairs(targets or {}) do if target > 0 and can_train(skill) then considered = considered + 1 if skill_level(skill) + 0.05 < target then return false end end end return considered > 0 end local function phase_for(plan) local def = defense_targets() local util = utility_targets() local enddef = endgame_survival_targets() if not all_reached(plan.early) then return "1. kill-spell online", plan.early, plan.focus end if not all_reached(def) then return "2. basic survival", def, {"Fighting", "Dodging"} end if not all_reached(plan.mid) then return "3. midgame spell power", plan.mid, plan.focus end if not all_reached(util) then return "4. lair/orc stabilizer", util, {"Fighting", "Dodging", "Evocations"} end local final = tmerge(plan.late, enddef) return "5. rune-ready scaling", final, plan.focus end local last_phase = nil local function apply_training(targets, focus_list) local focus = set_from_list(focus_list) for _, skill in ipairs(all_skills) do train(skill, 0) end local enabled = {} for skill, target in pairs(targets or {}) do if can_train(skill) and skill_level(skill) + 0.05 < target then set_target(skill, target) if focus[skill] then train(skill, 2) else train(skill, 1) end table.insert(enabled, skill .. "→" .. target) end end -- 전부 목표치에 닿아 비는 경우: 마법사는 결국 Fighting/Dodging/Spellcasting에 계속 투자. if #enabled == 0 then local fallback = {"Fighting", "Dodging", "Spellcasting", "Evocations"} for _, skill in ipairs(fallback) do if can_train(skill) then train(skill, 1) table.insert(enabled, skill .. "∞") end end end return enabled end local function hardcore_mage_training(force) if not HARD_MAGE_AUTOTRAIN then return false end local b = bg() local plan = plans[b] if not plan then return false end local phase, targets, focus = phase_for(plan) local enabled = apply_training(targets, focus) if PRINT_PHASE_CHANGES and (force or phase ~= last_phase) then crawl.mpr("Mage training: " .. b .. " / " .. phase .. "") crawl.mpr("Training: " .. table.concat(enabled, ", ") .. "") last_phase = phase end return true end local old_ready = ready function ready() if old_ready then old_ready() end if you.turns() == 0 then local handled = hardcore_mage_training(true) if handled and OPEN_SKILL_MENU_ON_START then crawl.sendkeys("m") end else hardcore_mage_training(false) end end local old_skill_training_needed = skill_training_needed function skill_training_needed() if hardcore_mage_training(true) then return true end if old_skill_training_needed then return old_skill_training_needed() end return false end local old_choose_stat_gain = choose_stat_gain function choose_stat_gain() if plans[bg()] then return "i" end if old_choose_stat_gain then return old_choose_stat_gain() end return nil end } autofight_stop = 0