Auto_butcher=Very Full
#메세지가 너무 많이 떴을 때 강제로 more 띄우지 않게 함

#이렇게 설정하고 지나간 메세지를 보고싶다면 컨트롤 p로 확인하는게 무조건 훨씬 더 좋고 편함

#다른 rc는 다 안쓰더라도 이것만은 진짜 무조건 쓰는게 좋음 무조건임

show_more = false





#게임 시작부터 스킬 경험치 투자를 메뉴얼로 설정

#이 게임은 스킬 경험치 투자를 오토로 할 이유가 전혀 없음. 까먹고 오토로 올려서 망캐가 되지 않도록 해줌

default_manual_training = true





#유니크 몬스터가 출현했을 때 more를 강제로 띄워줌

#탭질 신나게하다가 유니크 몹이 등장했을 때 게임을 멈춰서 제대로 집중해서 전투할 수 있게 해줌

#패치로 유니크몹이 추가되면 맞춰서 수정해줘야함

force_more_message += .*(Agnes|Aizul|Amaemon|Antaeus|Arachne|Asmodeus|Azrael|Bai suzhen|Blork the orc|Boris|Cerebov|Crazy Yiuf|Dispater|Dissolution|Donald|Dowan|Duvessa|Edmund|the Enchantress|Ereshkigal|Erica|Erolcha|Eustachio|Fannar|Frances|Frederick|Gastronok|Geryon|Gloorx Vloq|Grinder|Grum|Grunn|Harold|Ignacio|Ijyb|Ilsuiw|Jessica|Jorgrun|Jory|Joseph|Josephina|Josephine|Khufu|Kirke|the Lernaean hydra|Lodul|Lom Lobon|Louise|Maggie|Mara|Margery|Maurice|Menkaure|Mlioglotl|Mennas|Mnoleg|Murray|Nergalle|Natasha|Nessos|Nikola|Pan|Parghit|Pikel|Polyphemus|Prince Ribbit|Psyche|Purgy|Robin|Roxanne|the royal jelly|Rupert|Saint Roka|the Serpent of Hell|Sigmund|Snorg|Sojobo|Sonja|Terence|Tiamat|Urug|Vashnia|Vv|Xtahua|Zenata).*comes? into view





#위험한 몬스터 출현 시 more를 강제로 띄워줌

#패치로 위험한 몬스터가 추가되면 맞춰서 수정해줘야함

force_more_message += ((giant|floating|shining) eye|eye of draining).*into view

force_more_message += (moth of wrath|ghost moth|torpor snail).*into view

force_more_message += (guardian serpent|draconian shifter|convoker).*into view

force_more_message += (flayed ghost|royal mummy|mummy priest|fiend|tzitzimitl).*into view

force_more_message += (tormentor|curse toe|curse skull).*into view

force_more_message += (hellion|hell sentinel|deep elf sorcerer).*into view

force_more_message += (deep elf high priest|scorcher).*into view

force_more_message += (ancient lich|orb of fire|executioner|juggernaut|shrike).*into view

force_more_message += (wretched star|lurking horror).*into view

force_more_message += (neqoxec|cacodemon|doom hound).*into view

force_more_message += 27-headed.* comes? into view

force_more_message += (radroach|entropy weaver|meliai).*into view

force_more_message += (salamander tyrant|ironbound frostheart).*into view

force_more_message += (walking crystal tome|walking divine tome|walking earthen tome|walking frostbound tome).*into view





#몬스터가 위험한 몬스터로 변신 시 more를 강제로 띄워줌

#패치로 위험한 몬스터가 추가되면 맞춰서 수정해줘야함

force_more_message += changes into.*((giant|floating|shining) eye|eye of draining)

force_more_message += changes into.*(moth of wrath|ghost moth|torpor snail)

force_more_message += changes into.*(guardian serpent|draconian shifter|convoker)

force_more_message += changes into.*(flayed ghost|royal mummy|mummy priest|fiend|tzitzimitl)

force_more_message += changes into.*(tormentor|curse toe|curse skull)

force_more_message += changes into.*(hellion|hell sentinel|deep elf sorcerer)

force_more_message += changes into.*(deep elf high priest|scorcher)

force_more_message += changes into.*(ancient lich|orb of fire|executioner|juggernaut|shrike)

force_more_message += changes into.*(wretched star|lurking horror)

force_more_message += changes into.*(neqoxec|cacodemon|doom hound)

force_more_message += changes into.*(radroach|entropy weaver|meliai)

force_more_message += changes into.*(salamander tyrant|ironbound frostheart)

force_more_message += changes into.*(walking crystal tome|walking divine tome|walking earthen tome|walking frostbound tome)





#왜곡무기 장비한 몬스터, 춤추는 왜곡무기 출현 시 more를 띄워주고 화면이 번쩍이는 효과를 줌

#왜곡무기는 피격 시 어비스로 추방될 수 있기 때문에 가장 주의해야되는 공격 중 하나임.

force_more_message += It is wielding.*of distortion

force_more_message += She is wielding.*of distortion

force_more_message += He is wielding.*of distortion

force_more_message += wielding.* distortion.* comes? into view

flash_screen_message += It is wielding.*of distortion

flash_screen_message += She is wielding.*of distortion

flash_screen_message += He is wielding.*of distortion

flash_screen_message += wielding.* distortion.* comes? into view

flash_screen_message += distortion.* comes? into view

#폰트를 Consolas로 바꿈

#Consolas가 아마 제일 많이 쓰는 폰트인 듯? 이거 쓰면 대문자 I(아이)랑 소문자 l(엘) 구분 안돼서 소모품 날리는 개좆같은 상황 안 생김

#나는 크롬으로 웹죽하는데 가끔 폰트 적용이 안되는 버그가 생김. 그럴 때는 브라우저 껐다가 키면 다시 적용 되더라

tile_font_crt_family = Consolas

tile_font_stat_family = Consolas

tile_font_msg_family = Consolas

tile_font_lbl_family = Consolas
#그물, 쿠라레, 다투라 던지기 전 확인

#독다트 막 던지다가 그물 쿠라레 다투라 실수로 낭비하는거 방지 가능

autoinscribe += throwing net:!f

autoinscribe += curare:!f

autoinscribe += datura:!f





#위험도를 노란색, 빨간색만 표시

#기본 설정은 아마 빨간색만 표시되는 걸로 아는데 노란색까지 표시해주는게 오카와루 듀얼 권능 쓸 때도 좋고 훨씬 낫다고 봄

tile_show_threat_levels = tough nasty





#애니메이션 속도 빠르게(기본값=600)

#플레이어나 몬스터가 행동할 때 애니메이션의 속도를 조절하는 건데 기본값 600은 너무 느려서 답답한 경우가 종종 있음

view_delay = 200















#자동줍기 관련 설정들

#내가 쓰는 자동줍기 설정임. 호불호가 조금 갈릴만한 부분이 있는데 그래도 기본 설정보다는 내 설정이 더 좋다고 생각함.



#골드, 스크롤, 포션, 책, 장신구, 완드, 스태프, 잡동사니를 자동으로 주움

autopickup = $?!:"/|}



#그물, 쿠라레 자동으로 주움

autopickup_exceptions += <throwing net

autopickup_exceptions += <curare



#보라색 아이템도 자동으로 주움

autopickup_exceptions ^= <(immolation|lignification|mutation|attraction|vulnerability|torment|scroll of poison|scrolls of poison)

autopickup_exceptions ^= <tin of tremorstones



#아트로파 다트, 디스퍼설 부레랑 자동줍기 해제

autopickup_exceptions ^= >(atropa|dispersal)



#전혀 쓸모 없는 아이템은 줍지 않도록 함

autopickup_exceptions ^= >useless_item


#캐릭터 타일 변화 구문
tile_player_tile = tile: Mons_Orb_of_fire


# macros

macros += M 1 za
macros += M 2 zb
macros += M 3 zc
macros += M 4 zd

# autofight hp
autofight_stop = 50

# zot, gem timer
always_show_zot = true
always_show_gems = true
more_gem_info = true

# show more
show_more = false

# spell, ability confirmation

confirm_action += Cacophony, Blink, Confusing Touch
confirm_action += Forge Lightning Spire, Forge Blazeheart Golem
confirm_action += Sublimation of Blood
confirm_action += Ivoke Invisibility
confirm_action += Malign Gateway
confirm_action += Death's Door
confirm_action += Irradiate, Silence, Polar Vortex, Shatter

# for Wiglaf the Gunnerdwarf cctt challenge
confirm_action += Channel Magic, Forget Spell, Divine Exegesis

# death's door almost end force more

force_more_message += Your time is quickly running out!

# death channel expiring force more

force_more_message += Your unholy channel is weakening.

# Rebind move to safe moving. and shift-move to original move

bindkey = [h] CMD_SAFE_MOVE_LEFT

bindkey = [j] CMD_SAFE_MOVE_DOWN

bindkey = [k] CMD_SAFE_MOVE_UP

bindkey = [l] CMD_SAFE_MOVE_RIGHT

bindkey = [y] CMD_SAFE_MOVE_UP_LEFT

bindkey = [u] CMD_SAFE_MOVE_UP_RIGHT

bindkey = [b] CMD_SAFE_MOVE_DOWN_LEFT

bindkey = [n] CMD_SAFE_MOVE_DOWN_RIGHT



bindkey = [H] CMD_MOVE_LEFT

bindkey = [J] CMD_MOVE_DOWN

bindkey = [K] CMD_MOVE_UP

bindkey = [L] CMD_MOVE_RIGHT

bindkey = [Y] CMD_MOVE_UP_LEFT

bindkey = [U] CMD_MOVE_UP_RIGHT

bindkey = [B] CMD_MOVE_DOWN_LEFT

bindkey = [N] CMD_MOVE_DOWN_RIGHT

# display stats with gdr

{

function with_gdr()

    local armour_class = you.ac()

    local gdr = math.floor(16 * math.sqrt(math.sqrt(math.max(0, armour_class))))

    crawl.formatted_mpr(string.format("GDR: %d%%", gdr))

    crawl.sendkeys('@')

end



crawl.setopt("macros += M \@ ===with_gdr")

}

## DDoor

{
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("<white>It will be ended in 5-10 turns......      </white>")
  door = false
  end
  if not you.status("in death's door (expiring)") then
  door = true
  end
end
}

{
local counter = you.turns()
function DDoorCounter()
 if you.status("in death's door (expiring)") then
 crawl.mpr("<white>Count "..you.turns() - counter.."......</white>")
 end
 if not you.status("in death's door (expiring)") then
 counter = you.turns()+1
 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 scro = true
function Blurry_Check()
 if scro and you.mutation("blurry vision") > 0 and you.status("in death's door (expiring)") and you.mp() < 8 then
 crawl.yesno("Warning: Your reading rate is slowed while standing at death's door! (Y or N to confirm.)", false, false, true, true)
 scro = false
 end
 if not scro and not you.status("in death's door (expiring)") then
 scro = true
 end
end
}


## display damage, healing, exhausted (sepcially serpent's lash)
{
------- hp, mp, exhaust
local last_hp = you.hp()
local last_mp = you.mp()
local last_turn = you.turns()
local exhausted_start_turn = nil
local EXHAUSTED_BASE_DURATION = 14  -- serpent's lash의 기본 exhaust

function get_damage_color(damage, max_hp)
  local damage_percent = (damage / max_hp) * 100
  if damage_percent >= 25 then          -- 1/4 이상 데미지
    return "lightmagenta"               -- 매우 심각
  elseif damage_percent >= 15 then      -- 1/6.67 데미지
    return "lightred"                   -- 매우 위험
  elseif damage_percent >= 10 then      -- 1/10 데미지
    return "red"                        -- 위험
  elseif damage_percent >= 5 then       -- 1/20 데미지
    return "yellow"                     -- 주의
  elseif damage > 1 or damage_percent > 2 then  -- 2% 초과 또는 2 이상의 모든 데미지
    return "white"
  else
    return "lightgray"                  -- 1 데미지나 2% 이하만 회색으로
  end
end

------- monster warning
-- 키 바인딩 설정: Ctrl+M 키를 사용
crawl.setopt("macros += M \\{^T} ===toggle_monster_warning")

-- 몬스터 경고 기능 활성화 상태
monster_warning_enabled = false

-- 몬스터 경고 색상
monster_warning_color = "lightred"

-- 시야 내 몬스터 확인 및 경고
function check_visible_monsters()
  -- 경고 기능이 꺼져 있으면 아무것도 하지 않음
  if not monster_warning_enabled then
    return
  end
  
  -- 시야 내 적대적 몬스터 확인
  local hostile_monsters = {}
  local has_dangerous = false
  
  -- 플레이어 시야 범위 내에서만 탐색 (LOS_RADIUS = 7)
  local LOS_RADIUS = 7
  for x = -LOS_RADIUS, LOS_RADIUS do
    for y = -LOS_RADIUS, LOS_RADIUS do
      -- 유효한 좌표인지 확인: you.see_cell 함수 사용
      if you.see_cell(x, y) then
        -- pcall을 사용하여 안전하게 함수 호출
        local success, mon = pcall(function() return monster.get_monster_at(x, y) end)
        
        if success and mon and mon:attitude() == 0 then  -- 0은 적대적 몬스터
          -- 식물 관련 몬스터인지 확인
          local plant_patterns = {"plant", "bush", "briar patch", "ballistomycete", 
                                  "fungus", "toadstool", "oklob", "vine", "withered"}
          local is_plant = false
          
          for _, pattern in ipairs(plant_patterns) do
            if string.find(string.lower(mon:name()), pattern) then
              is_plant = true
              break
            end
          end
          
          -- 식물이 아닌 경우에만 목록에 추가
          if not is_plant then
            table.insert(hostile_monsters, mon:name())
            
            -- 특별히 위험한 몬스터 확인
            local danger_patterns = {"dragon", "lich", "ancient", "titan", 
              "fiend", "balrug", "executioner", "pandemonium", "orb of fire"}
            for _, pattern in ipairs(danger_patterns) do
              if string.find(string.lower(mon:name()), pattern) then
                has_dangerous = true
                break
              end
            end
          end
        end
      end
    end
  end
  
  -- 적대적 몬스터가 있으면 경고
  if #hostile_monsters > 0 then
    local msg = "경고: "
    if #hostile_monsters == 1 then
      msg = msg .. hostile_monsters[1] .. "이(가) 시야 내에 있습니다!"
    else
      msg = msg .. #hostile_monsters .. "마리의 몬스터가 시야 내에 있습니다!"
    end
    
    -- 특별히 위험한 몬스터가 있으면 강조
    if has_dangerous then
      crawl.mpr(msg, "red")
    else
      crawl.mpr(msg, monster_warning_color)
    end

    crawl.more()
  end
end

-- 경고 기능 토글 함수
function toggle_monster_warning()
  monster_warning_enabled = not monster_warning_enabled
  if monster_warning_enabled then
    crawl.mpr("몬스터 경고 시스템이 켜졌습니다.", "green")
  else
    crawl.mpr("몬스터 경고 시스템이 꺼졌습니다.", "lightgrey")
  end
end

------- ready
function ready()
  local current_hp, max_hp = you.hp()
  local current_mp, max_mp = you.mp()
  
  -- Exhausted 상태 체크
  if you.exhausted() then
    -- exhausted 시작 시점 기록
    if not exhausted_start_turn then
      exhausted_start_turn = you.turns()
    end
  else
    -- exhausted가 끝나면 시작 시점 초기화
    exhausted_start_turn = nil
  end
  
  -- 메시지 표시는 턴이 변경되었을 때만
  if you.turns() ~= last_turn then
    -- 몬스터 경고
    check_visible_monsters()

    -- HP 변화 체크
    local hp_change = current_hp - last_hp
    if hp_change ~= 0 then
      local msg
      if hp_change < 0 then
        local damage = -hp_change
        local color = get_damage_color(damage, max_hp)
        msg = string.format("You took <%s>%d</%s> damage!", 
                           color, damage, color)
      else
        msg = string.format("You recovered <lightgreen>%d</lightgreen> HP!", 
                           hp_change)
      end
      crawl.formatted_mpr(msg)
    end
    
    -- MP 변화 체크
    local mp_change = current_mp - last_mp
    if mp_change > 0 then
      local msg = string.format("You recovered <lightgreen>%d</lightgreen> MP!", 
                               mp_change)
      crawl.formatted_mpr(msg)
    
    elseif mp_change < 0 then
      local mp_consumed = -mp_change
      local msg = string.format("You consumed <yellow>%d</yellow> MP.",
                               mp_consumed)
      crawl.formatted_mpr(msg)
    end
    
    -- Exhausted 상태 메시지
    if exhausted_start_turn then
      local current_turn = you.turns()
      local elapsed_turns = current_turn - exhausted_start_turn + 1  -- +1을 해서 1부터 시작하도록 수정
      local max_duration = EXHAUSTED_BASE_DURATION + 4  -- 최대 지속시간 (14 + 0~4)
      local remaining_turns = max_duration - elapsed_turns + 1  -- 남은 턴도 1부터 시작하도록 조정
      
      -- 최소/최대 남은 시간 계산
      local min_remaining = math.max(1, remaining_turns - 4)
      local max_remaining = math.max(1, remaining_turns)
      
      local remaining_str
      if min_remaining == max_remaining then
        remaining_str = string.format("%d remaining", min_remaining)
      else
        remaining_str = string.format("%d-%d remaining", min_remaining, max_remaining)
      end
      
      local msg = string.format("<brown>Exhausted</brown>: %d turns (%s)", 
                               elapsed_turns,
                               remaining_str)
      crawl.formatted_mpr(msg)
    end
  end
  
  -- 현재 상태 저장
  last_hp = current_hp
  last_mp = current_mp
  last_turn = you.turns()
  
  DDoorWarning()
  DDoorCounter()
  Slowed_Check()
end
}

# Magical Staff Percentage
{
function calc_staff_info(school_level, evo_level, multiplier)
    -- multiplier 파라미터 추가, 기본값은 1.575
    multiplier = multiplier or 1.575
    local max_damage = multiplier * (school_level + evo_level/2)
    local activation = (evo_level + school_level/2) * 6.66
    if activation > 100 then activation = 100 end
    return max_damage, activation
end

function staff_info_display()
    local evo = you.skill("Evocations")
    local output = ""
    
    -- Fire staff
    local fire = you.skill("Fire Magic")
    local fire_dmg, fire_chance = calc_staff_info(fire, evo)
    output = output .. string.format("[<lightred>Fire</lightred>] D: 0-%.1f, P: %.1f%% \n", fire_dmg, fire_chance)
    
    -- Cold staff  
    local ice = you.skill("Ice Magic")
    local cold_dmg, cold_chance = calc_staff_info(ice, evo)
    output = output .. string.format("[<lightblue>Cold</lightblue>] D: 0-%.1f, P: %.1f%% \n", cold_dmg, cold_chance)
    
    -- Earth staff (1.5x 공식)
    local earth = you.skill("Earth Magic")
    local earth_dmg, earth_chance = calc_staff_info(earth, evo, 1.5)
    output = output .. string.format("[<brown>Earth</brown>] D: 0-%.1f, P: %.1f%% (33%% to flying)\n", earth_dmg, earth_chance)
    
    -- Air staff (1.25x 공식)
    local air = you.skill("Air Magic")
    local air_dmg, air_chance = calc_staff_info(air, evo, 1.25)
    output = output .. string.format("[<lightcyan>Air</lightcyan>] D: 0-%.1f, P: %.1f%% (Half AC)\n", air_dmg, air_chance)
    
    -- Alchemy staff
    local alchemy = you.skill("Alchemy")
    local poison_dmg, poison_chance = calc_staff_info(alchemy, evo)
    output = output .. string.format("[<lightgreen>Alchemy</lightgreen>] D: 0-%.1f, P: %.1f%% \n", poison_dmg, poison_chance)
    
    -- Death staff
    local necro = you.skill("Necromancy")
    local death_dmg, death_chance = calc_staff_info(necro, evo)
    output = output .. string.format("[<magenta>Death</magenta>] D: 0-%.1f, P: %.1f%% \n", death_dmg, death_chance)
    
    -- Conjuration staff (1.25x 공식)
    local conj = you.skill("Conjurations")
    local conj_dmg, conj_chance = calc_staff_info(conj, evo, 1.25)
    output = output .. string.format("[<white>Conj</white>] D: 0-%.1f, P: %.1f%% (Irresistible)", conj_dmg, conj_chance)
    
    crawl.formatted_mpr(output)
end

crawl.setopt("macros += M \\{F2} ===staff_info_display")
}

# cosplay