# CRAWL.NEMELEX.CARDS
##### 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

## 젬클락 표시 ##



always_show_gems = true





## 마우스 이동 막기 ##



tile_web_mouse_control = false





## 조트클락 표시 ##



always_show_zot = true





## 악마 티어 타일로 표시 ##



tile_show_demon_tier = true





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



tile_show_threat_levels = tough,nasty,unusual_highlight





## 자동줍기 해제 시 다음 장 (투명몹 대비) ##



force_more_message += Deactivating autopickup





## 안 보이는 무언가에게 마나가 빨리면 다음 장 ##



force_more_message += watched by something





## 자동공격이 멈추는 체력 비율 ##



autofight_stop = 70





## 왜곡무기 장비한 몬스터, 춤추는 왜곡무기 출현 시 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





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



show_more = false





## 이펙트 딜레이 ##



view_delay = 200





## 플레이어 타일을 해당 종족으로 변경 ##



tile_show_player_species = true





## 폰트 변경 ##



tile_font_crt_family = Consolas



tile_font_stat_family = Consolas



tile_font_msg_family = Consolas



tile_font_lbl_family = Consolas





## 방을 이동해도 채팅을 지우지 않음 ##



#$ lab_disable_chat_clear = true





## vi방식 이동키 비활성화 ##



include = no_vi_command_keys.txt





## 사운드 자동 켜기 ##



#$ lab_sound_on = true





## 스킬 경험치 메뉴얼 설정 ##



default_manual_training = true





## 자동탐사 딜레이 ##



travel_delay = -1





## 탐험 딜레이 ##



explore_delay = -1





## 휴식 딜레이 ##



rest_delay = -1





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



autopickup_exceptions += <throwing net



autopickup_exceptions += <curare





## 화폭 볼텍스가 탐색이나 휴식 시 멈추는거 방지 ##



runrest_ignore_message += Your fire (vortexlvortices).*something



runrest_ignore_message += something .* fire (vortexlvortices)





## HP/MP 알림 ##



{

  local need_skills_opened = true

  local previous_hp = 0

  local previous_mp = 0

  local previous_form = ''

  local was_berserk_last_turn = false

  function announce_damage_ko()

    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





    --Skips message on initializing game

    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('Now you have [' .. current_hp .. '/' .. max_hp .. '] HP')

        else

          crawl.mpr('Now you have [' .. current_hp .. '/' .. max_hp .. '] HP')

        end

      else







        --체력 잃을때

        if (current_hp < previous_hp) then

          if current_hp <= (max_hp * 0.30) then

            crawl.mpr('<lightred>You take ' .. hp_difference .. ' HP,</lightred> <red>and have [' .. current_hp .. '/' .. max_hp .. '] HP</red>')

          elseif current_hp <= (max_hp * 0.50) then

            crawl.mpr('<yellow>You take ' .. hp_difference .. ' HP,</yellow> <lightred>and have [' .. current_hp .. '/' .. max_hp .. '] HP</lightred>')

          elseif current_hp <= (max_hp *  0.70) then

            crawl.mpr('<brown>You take ' .. hp_difference .. ' HP,</brown> <green>and have [' .. current_hp .. '/' .. max_hp .. '] HP</green>')

          elseif current_hp <= (max_hp * 0.90) then

            crawl.mpr('<darkgrey>You take ' .. hp_difference .. ' HP,</darkgrey> <green>and have [' .. current_hp .. '/' .. max_hp .. '] HP</green>')

          else

            crawl.mpr('<darkgrey>You take ' .. hp_difference .. ' HP,</darkgrey> <lightgreen>and have [' .. current_hp .. '/' .. max_hp .. '] HP</lightgreen>')

          end

          if hp_difference > (max_hp * 0.20) then

            crawl.mpr('<lightred>!!!!! HP Warning !!!!!</lightred>')

          end

        end







        --체력 얻을때

        if (current_hp > previous_hp) then

          --Removes the negative sign

          local health_inturn = (0 - hp_difference)

          if (health_inturn > 1) and not (current_hp == max_hp) then

            if current_hp <= (max_hp * 0.30) then

              crawl.mpr('<darkgrey>You gain ' .. health_inturn .. ' hp,</darkgrey> <red>and have [' .. current_hp .. '/' .. max_hp .. '] hp.</red>')

            elseif current_hp <= (max_hp * 0.50) then

              crawl.mpr('<yellow>You gain ' .. health_inturn .. ' HP,</yellow> <lightred>and have [' .. current_hp .. '/' .. max_hp .. '] hp.</lightred>')

            elseif current_hp <= (max_hp *  0.70) then

              crawl.mpr('<lightgreen>You gain ' .. health_inturn .. ' HP,</lightgreen> <green>and have [' .. current_hp .. '/' .. max_hp .. '] HP</green>')

            elseif current_hp <= (max_hp * 0.90) then

              crawl.mpr('<white>You gain ' .. health_inturn .. ' HP</white>, <lightgreen>and have [' .. current_hp .. '/' .. max_hp ..'] HP</lightgreen>')

            else

              crawl.mpr('<lightgreen>You gain ' .. health_inturn .. ' HP, and have [' .. current_hp .. '/' .. max_hp .. '] HP</lightgreen>')

            end

          end

          if (current_hp == max_hp) then

            crawl.mpr('<lightmagenta> HP Full. (' .. current_hp .. ')</lightmagenta>')

          end

        end







        --마력 얻을때

        if (current_mp > previous_mp) then

          --Removes the negative sign

          local mp_inturn = (0 - mp_difference)

          if (mp_inturn > 1) and not (current_mp == max_mp) then

            if current_mp < (max_mp * 0.25) then

              crawl.mpr('<darkgrey>You gain ' .. mp_inturn .. ' MP,</darkgrey> <brown>and have [' .. current_mp .. '/' .. max_mp .. '] MP</brown>')

            elseif current_mp < (max_mp * 0.50) then

              crawl.mpr('<lightblue>You gain ' .. mp_inturn .. ' MP,</lightblue> <blue>and have [' .. current_mp .. '/' .. max_mp .. '] MP</blue>')

            else

              crawl.mpr('<lightblue>You gain ' .. mp_inturn .. ' MP,</lightblue> <lightcyan>and have [' .. current_mp .. '/' .. max_mp .. '] MP</lightcyan>')

            end

          end

          if (current_mp == max_mp) then

            crawl.mpr('<lightcyan>MP Full (' .. current_mp .. ')</lightcyan>')

          end

        end



        --마력 잃을때

        if current_mp < previous_mp then

          if current_mp <= (max_mp * 0.25) then

            crawl.mpr('<darkgrey>You lose ' .. mp_difference .. 'MP,</darkgrey> <white>and have [' .. current_mp .. '/' ..max_mp ..'] MP</white>')

          elseif current_mp <= (max_mp * 0.50) then

            crawl.mpr('<blue>You lose ' .. mp_difference .. 'MP,</blue> <lightblue>and have [' .. current_mp .. '/' ..max_mp ..'] MP</lightblue>')

          else

            crawl.mpr('<darkgrey>You lose ' .. mp_difference .. 'MP,</darkgrey> <lightcyan>and have [' .. current_mp .. '/' ..max_mp ..'] MP</lightcyan>')

          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

function ready()



  -- Enable AnnounceDamage.

  announce_damage_ko()

  if you.turns() == 0 and need_skills_opened then

    need_skills_opened = false

    crawl.sendkeys("m")

  end

end

} 



## 우클릭시 채팅창에 아이템 공유 ##



lab_use_click_to_send_chat = true



## F2 누르면 마법 스태프 예상데미지 출력 ##



{



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")



}



## @ 누르면 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")



}



## 사운드 ##



sound_on = true



sound_volume = 0.5



# CNC Open Sound Pack

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



## 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()



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



------- ready

function ready()

  local current_hp, max_hp = you.hp()

  local current_mp, max_mp = you.mp()

  

  -- 메시지 표시는 턴이 변경되었을 때만

  if you.turns() ~= last_turn then

    -- 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)

    end

    

  end

  

  -- 현재 상태 저장

  last_hp = current_hp

  last_mp = current_mp

  last_turn = you.turns()

end

}