# TEAMCAPTAIN ASCIIPhilia
##### 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
#################################
# macros
macros += M 1 za
macros += M 2 zb
macros += M 3 zc
macros += M 4 zd
# autofight hp
autofight_stop = 80
# rest_wait_percent = 80
# explore_auto_rest = false
# 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, Spellspark Servitor
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("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 counter = you.turns()
function DDoorCounter()
if you.status("in death's door (expiring)") then
crawl.mpr("Count "..you.turns() - counter.."......")
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 %d 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 %d MP!",
mp_change)
crawl.formatted_mpr(msg)
elseif mp_change < 0 then
local mp_consumed = -mp_change
local msg = string.format("You consumed %d 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("Exhausted: %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("[Fire] 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("[Cold] 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("[Earth] 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("[Air] 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("[Alchemy] 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("[Death] 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("[Conj] D: 0-%.1f, P: %.1f%% (Irresistible)", conj_dmg, conj_chance)
crawl.formatted_mpr(output)
end
crawl.setopt("macros += M \\{F2} ===staff_info_display")
}
# cosplay
# tile_player_tile = tile:MONS_FREDERICK
translation_language = ko
translation_debug = true