# 수정본: DECj 자동 스킬 육성 + RC 오류 정리 (2026년 10월 05일) # Alchemy 4.4 -> Alchemy 6 + Spellcasting/Conjurations ON # Alchemy 6 -> Alchemy 7 + Translocations/Fighting/Evocations ON # ready() 중복 제거 / DDoor 변수명 수정 / Lua 블록 닫힘 수정 # DECJ 고수 되고싶다 (작성자 : sirohebi) # 기존 DECJ 고수님들 RC 감사합니다 #기본 combo = DECj hp_colour =85:lightgreen, 67:lightcyan, 50:yellow, 33:lightmagenta, 15:red rest_wait_percent = 100 explore_auto_rest = true show_more = false prompt_menu = true spell_menu = true easy_confirm = safe #딜레이 관련 rest_delay = -1 #travel_delay = 15 explore_delay = -1 view_delay = 100 #번역 및 사운드 translation_language = ko sound_on = true one_SDL_sound_channel = true sound_fade_time = 0.5 sound_pack += https://osp.nemelex.cards/build/latest.zip:["init.txt"] # BindTheEarth 추가 Sound Pack sound_pack += https://sound-packs.nemelex.cards/Autofire/BindTheEarth/BindTheEarth.zip #사운드 조절 밸류 범위=0~1 sound_volume = 0.4 #오토픽업 autopickup = $?!:/|= ae := autopickup_exceptions ae += >scrolls? of silence ae += >scrolls? of brand weapon ae += >scrolls? of enchant weapon ae += >scrolls? of poison ae += >scrolls? of vuln.* ae += >potions? of attraction ae += >potions? of lignification ae += >staff of .* ae ^= = 100 and you.res_fire() >= 2 then return true end if you.res_fire() < 1 and not you.status("death's door") then local double_check = crawl.yesno("REALLY go through flame without fire resistance? (y/n)", true, "n") if double_check then return true else return false end end return nil end if prompt:find("freezing vapour") and you.res_cold() < 1 and not you.status("death's door") then if crawl.yesno("REALLY go through icy clouds without cold resistance?",false,'n') then return end end end } --this function is module, so don't change its name { function choose_stat_gain() if DECj then return "i" else return end end } { function prompt(str) crawl.formatted_mpr(str, "prompt") return crawl.c_input_line() end } { function set_option() opt = prompt("Set which option? ") val = prompt("Input value to configure: " .. opt .. "=") if (opt == nil) or (val == nil) then crawl.mpr("Configuration cancelled.") else crawl.setopt(opt .. "=" .. val) crawl.mpr("Set option '" .. opt .. "=" .. val .. "'.") end end } { function confirmed_rest() if Hp_percent() == 100 and Mp_percent() == 100 and not string.find(you.status(), "cooldown") then if crawl.yesno("Really wait turns while HP and MP are full?", true, 'n') then crawl.process_keys("5") else crawl.mpr("Rest command was denied by confirmation process.") end else crawl.process_keys("5") end if spells.memorised("Fulminant Prism") then crawl.sendkeys("X") crawl.sendkeys({5}) crawl.sendkeys({27}) end end } { function autobanish() if you.xl() == 27 then if crawl.yesno("Really attempt to banish yourself?",true,'n') then crawl.sendkeys("w-iiwYw-Y") else return end else crawl.mpr("You must become XL 27 to use autobanish macro.") end end } { function Hp_percent() a,b=you.hp() return 100*a/b end } { function Mp_percent() a,b=you.mp() return 100*a/b end } { function Petrifying_Check() if you.petrifying() then crawl.yesno("You are now being petrified so your action will be checked. (Y or N to confirm.)", false, false, true, true) crawl.mpr("Consider using tele/blink, Yara, cancellation or other emergency measures......") end end } { local speed = true function Slowed_Check() if speed and string.find(crawl.messages(8), "yourself slow down") and you.status("in death's door (expiring)") then crawl.yesno("Warning: You are slowed while DDoor running out! (Y or N to confirm.)", false, false, true, true) speed = false end if not speed and not you.status("in death's door (expiring)") then speed = true end end } { local wand = true function Wand_Check() if you.xl() <= 12 and wand and string.gmatch(crawl.messages(5), "carrying a wand")() then crawl.yesno("Warning: an enemy near you is armed with a wand! (Y or N to confirm.)", false, false, true, true) crawl.mpr("Neutralize or avoid the wand carrier ASAP!") wand = false end if string.gmatch(crawl.messages(1), "restored")() then wand = true end end } { local throw = true function Throw_Check() if you.xl() <= 6 and throw and string.gmatch(crawl.messages(5), "quivering")() then crawl.yesno("Warning: an enemy near you is armed with missiles! (Y or N to confirm.)", false, false, true, true) crawl.mpr("Neutralize or avoid the thrower ASAP!") throw = false end if string.gmatch(crawl.messages(1), "restored")() then throw = true end end } { local manu = true function Manual_Check() if manu and string.gmatch(crawl.messages(30), "toss it away")() then crawl.yesno("Your manual has been consumed. (Y or N to confirm.)", false, false, true, true) crawl.mpr("Re-allocate skill distribution!") manu = false end if not manu and not string.gmatch(crawl.messages(30), "toss it away")() then manu = true end end } { local early = true function HpWarning_Early() if you.hp() < 21 and Hp_percent() < 30 and you.xl() < 12 and early then crawl.yesno("Low HP: Be careful! (Y or N to confirm.)", false, false, true, true) crawl.mpr("The dice are ABSOLUTELY not on your side......") early = false end if you.hp() > 20 and Hp_percent() > 29 and you.xl() < 12 then early = true end end } { local mid = true function HpWarning_Mid() if you.hp() < 51 and you.xl() < 21 and you.xl() > 11 and mid then crawl.yesno("Low HP: Be careful! (Y or N to confirm.)", false, false, true, true) crawl.mpr("Consider to using tele/blink, potion or other emergency measures......") mid = false end if you.hp() > 50 and you.xl() < 21 and you.xl() > 11 then mid = true end end } { local late = true function HpWarning_Late() if you.hp() < 60 and you.xl() == 27 and not you.status("in death's door") and not you.status("in death's door (expiring)") and late then crawl.yesno("Low HP: Be careful! (Y or N to confirm.)", false, false, true, true) crawl.mpr("Keep play prudently even in late-game......") late = false end if you.hp() > 59 and you.xl() == 27 then late = true end end } { 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")) 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 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 } { local door = true function DDoorWarning() if you.status("in death's door (expiring)") and door then crawl.yesno("DDoor is almost expired! (Y or N to confirm.)", false, false, true, false) crawl.mpr("It will be ended in 5-10 turns...... ") door = false end if not you.status("in death's door (expiring)") then door = true end end } { local ddoor_start_time = 0 function DDoorCounter() if you.status("in death's door (expiring)") then if ddoor_start_time == 0 or ddoor_start_time == nil then if ddoor_start_time == nil then crawl.mpr("Warning: DDoor counter timer has been wiped out!") end ddoor_start_time = you.time() end local elapsed_aut = you.time() - ddoor_start_time local elapsed_turns = string.format("%.1f", elapsed_aut / 10) crawl.mpr("... " .. elapsed_turns .. "turns elapsed...") else ddoor_start_time = 0 end end } { local gaunt = true function NoticeGa() if string.find(crawl.messages(4), "gauntlet on this level") and gaunt then gaunt = false crawl.yesno("Hurry, A gateway to the gauntlet has been detected! (Y or N to confirm.)", false, false, true, true) end end } { local bail = true function NoticeBa() if string.find(crawl.messages(4), "bailey on this level") and bail then bail = false crawl.yesno("Hurry, A gateway to a bailey has been detected! (Y or N to confirm.)", false, false, true, true) end end } { local cave = true function NoticeIc() if string.find(crawl.messages(4), "cave on this level") and cave then cave = false crawl.yesno("Hurry, A gateway to an ice cave has been detected! (Y or N to confirm.)", false, false, true, true) end end } { local needgold = true function GoldLimiter() if you.gold() > 6000 and needgold then crawl.mpr("Gold pickup was deactivated by Limiter function.") crawl.setopt("autopickup_exceptions ^= gold") needgold = false end end } { --Never use autopickup_exceptions without ^ or +. otherwise, rest of autopickup settings will be nullified. local PhaseA = true local PhaseB = true local PhaseC = true local PhaseD = true function XL_DEWz() if you.xl() >= 9 and PhaseA then crawl.setopt("rest_wait_percent = 100") crawl.setopt("autopickup_exceptions ^= >poisoned") crawl.setopt("autopickup_exceptions ^= = 14 and PhaseB then crawl.setopt("autopickup_exceptions ^= >potion.*might") crawl.setopt("autopickup_exceptions ^= >potion.*berserk rage") crawl.setopt("autopickup_exceptions ^= >wand.*random effects") crawl.setopt("autopickup_exceptions ^= >wand.*polymorph") crawl.setopt("autopickup_exceptions ^= >curare") crawl.setopt("autopickup_exceptions ^= >throwing net") PhaseB = false end if you.num_runes() >= 2 and PhaseC then crawl.setopt("autopickup_exceptions ^= >wand.*flame") crawl.setopt("autopickup_exceptions ^= >wand.*charming") crawl.setopt("autopickup_exceptions ^= >phantom mirror") crawl.setopt("autopickup_exceptions ^= >box of beasts") PhaseC = false end if ((spells.memorised("Death's Door") and spells.fail("Death's Door") <= 15) or you.skill("fighting") >= 18) and PhaseD then crawl.setopt("rest_wait_percent = 50") crawl.setopt("autopickup_exceptions ^= >wand.*mindburst") crawl.setopt("autopickup_exceptions ^= >scroll.*fear") crawl.setopt("autopickup_exceptions ^= >scroll.*summoning") crawl.setopt("autopickup_exceptions ^= >scroll.*butterflies") crawl.setopt("autopickup_exceptions ^= = 4.4 and not skill_phase_1_done then if you.get_training_target("Alchemy") < 7 then you.set_training_target("Alchemy", 7) end if you.skill("Alchemy") < 7 then you.train_skill("Alchemy", 1) end if you.skill("Spellcasting") < 11 then you.train_skill("Spellcasting", 1) end if you.skill("Conjurations") < 11 then you.train_skill("Conjurations", 1) end crawl.mpr("Alchemy 4.4: Alchemy target -> 7, Spellcasting/Conjurations training ON.") skill_phase_1_done = true end -- 2단계: Alchemy 6 도달 -- Alchemy는 6 도달 -- Alchemy는 7 까지 -- Translocations 4 / Fighting 8 / Evocations 9 훈련 시작. if alchemy_lvl >= 6 and not skill_phase_2_done then you.train_skill("Alchemy", 1) if you.skill("Translocations") < 4 then you.train_skill("Translocations", 1) end if you.skill("Fighting") < 8 then you.train_skill("Fighting", 1) end if you.skill("Evocations") < 9 then you.train_skill("Evocations", 1) end crawl.mpr("Alchemy 6: Translocations/Fighting/Evocations training ON.") skill_phase_2_done = true end -- 3단계 -- Alchemy 7 도달하면 연금술 종료 if alchemy_lvl >= 7 and not skill_phase_3 then you.train_skill("Alchemy", 0) crawl.mpr("Alchemy 7 reached: Alchemy training stopped.") skill_phase_3 = true end end } < if last_silencers == nil then last_silencers = {} end local function get_direction_string(x, y) if x == 0 and y == 0 then return "Here (여기)" end local dir = "" local ko_dir = "" if y < 0 then dir = "North" ko_dir = "위" elseif y > 0 then dir = "South" ko_dir = "아래" end if x > 0 then dir = dir .. "East" ko_dir = ko_dir .. "오른쪽" elseif x < 0 then dir = dir .. "West" ko_dir = ko_dir .. "왼쪽" end return dir .. " (" .. ko_dir .. ")" end local function get_all_silencers() local silencers = {} for x = -8, 8 do for y = -8, 8 do local enemy = monster.get_monster_at(x, y) if enemy then local spell_list = enemy:spells() if spell_list then for _, spell_name in ipairs(spell_list) do if spell_name == "Silence" then local name = enemy:name() silencers[name] = { dir = get_direction_string(x, y), x = x, y = y } break end end end end end end return silencers end function SilencerWarning() local current_silencers = get_all_silencers() local has_silencer = false local any_new_alert = false for name, info in pairs(current_silencers) do has_silencer = true if not last_silencers[name] then any_new_alert = true local dir_text = info.dir or "Unknown" local x_val = info.x or 0 local y_val = info.y or 0 local loc_str = "at [" .. dir_text .. "] (x=" .. x_val .. ", y=" .. y_val .. ")" local msg = "Warning: the silencer named " .. name .. " detected " .. loc_str .. "! (Press Y or N to confirm.)" if not crawl.yesno(msg, false, false, true, true) then crawl.sendkeys(" ") end crawl.mpr("Take down the silencer named " .. name .. " " .. loc_str .. "!") end end if has_silencer then if any_new_alert then last_silencers = current_silencers end return true end local hp, max_hp = you.hp() local mp, max_mp = you.mp() if hp == max_hp and mp == max_mp then last_silencers = {} end return false end > # 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 Messages ignore += The plant is engulfed ignore += You destroy the (bush|fungus|plant) ignore += You displace your #주문 실패 확률 경고를 제거( 4 or 0 ) fail_severity_to_confirm = 4 #플레이어 타일에 상태이상 slow, fragile, petr, mark, will/2, haste, weak, corr, might, brill, -move 아이콘을 표시 tile_player_status_icons = slow, constr #매크로 키 설정 macros += M 1 za macros += M 2 zb macros += M 3 zc macros += M 4 zd #몬스터가 위험한 몬스터로 변신 시 more를 강제로 띄워 주는 명단 ######## Force More ######################## more := force_more_message more += (?-i:[A-Z]).* comes? into view more += (?-i:[A-Z]).* opens? the more += You feel yourself slow down more += dispelling energy hits you more += You convulse more += Space .* around you more += .*orbs? of fire.* comes? into view more += ((floating|shining) eye|dream sheep|doom hound).*into view more += .*(s|player) ghost.* comes? into view more += It is wielding.*of distortion more += She is wielding.*of distortion more += He is wielding.*of distortion more += Found .* abyssal rune of Zot more += (blundered into a|invokes the power of) Zot more += Deactivating autopickup more += Ouch! That really hurt! more += A sentinel's mark forms upon you more += calcifying dust hits more += watched by something #more += You feel less protected from missiles #more += You hear a zap more += Found a staircase to the Ecumenical Temple more += You fail to use your ability more += You miscast.*(Blink|Borgnjor|Door|Invisibility) more += Your thoughts seem clearer ######## Autoexplore Interruption ######################## stop := runrest_stop_message stop += Your transformation is almost over ######## Flash Warning ######################## ;flash_screen_message += carrying a wand of .* ######## Annoyances ######################## ;ignore += grinding sound ;ignore += contamination has completely ;ignore += your breath back runrest_ignore_message += fire vortex .* runrest_ignore_message ^= fire vortex .* ## 마우스 사용 기능을 활성화 및 유지 ## tile_web_mouse_control = true #움짤 이미지를 실시간으로 움직임 tile_realtime_anim = true #악마 계열 몬스터에게 별 표시 tile_show_demon_tier = True #자동 탐험할 때의 발자국을 표시 show_travel_trail = true #조트 클락을 표시 always_show_zot = true ## 젬 정보를 표시 ## always_show_gems = true more_gem_info = true =========