##### 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
##### Ancient versions ##############################################
# If you're used to the interface of ancient versions of Crawl, you may
# get back parts of it by uncommenting the following options:
# include = 034_command_keys.txt
# And to revert monster glyph and colouring changes:
# include = 052_monster_glyphs.txt
# include = 060_monster_glyphs.txt
# include = 071_monster_glyphs.txt
# include = 080_monster_glyphs.txt
# include = 0.9_monster_glyphs.txt
# include = 0.12_monster_glyphs.txt
# include = 0.13_monster_glyphs.txt
# include = 0.14_monster_glyphs.txt
{
function ready()
AnnounceDamage()
HitChance()
end
}
{
function sum(t)
s = 0
for _,v in pairs(t) do
s = s + v
end
return s
end
function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
function more_or_equal(attack, ev)
more_or_eq = 0
less = 0
for a,_ in pairs(attack) do
for e,_ in pairs(ev) do
if a >= e then more_or_eq = more_or_eq + attack[a]*ev[e]
else less = less + attack[a]*ev[e] end
end
end
s = more_or_eq + less
return more_or_eq/s
end
function averge(ch)
ch2 = {}
for k,_ in pairs(ch) do
ch2[math.floor(k/2)] = ch[k]
end
return ch2
end
function inc_base(ch, value)
ch2 = {}
for k,_ in pairs(ch) do
ch2[k+value] = ch[k]
end
return ch2
end
function roll_chance(ch)
ch2 = {}
for i,_ in pairs(ch) do
for j = 0, i+1 do
k = math.max(0, j-1)
if ch2[k] == nil then ch2[k] = ch[i]
else ch2[k] = ch2[k] + ch[i] end
end
end
s = sum(ch2)
for i,_ in pairs(ch2) do
ch2[i]=ch2[i]/s
end
return ch2
end
function calc_chance(skill)
whole = math.floor(skill)
ch = {}
for i=0,whole do
if ch[i] == nil then ch[i] = 1
else ch[i] = ch[i] + 1 end
end
fraction = skill - whole
if fraction > 0 then
ch[whole] = fraction
end
s = sum(ch)
for k,_ in pairs(ch) do
ch[k]=ch[k]/s
end
if ch == {} then
ch[0] = 1
end
return ch
end
function mult_chances(ch1, ch2)
ch3 = {}
for i,_ in pairs(ch1) do
for j,_ in pairs(ch2) do
if ch3[i+j] == nil then ch3[i+j] = ch1[i]*ch2[j]
else ch3[i+j] = ch3[i+j] + ch1[i]*ch2[j] end
end
end
return ch3
end
function calc_armour_penalty(e, a, s)
return ((40*e*e*(450-10*a)/(5*(s+3)))/450)/20
end
function calc_chance_armour(pen)
if pen == 0 then return { [0]=1 } end
ch = {}
whole = math.floor(pen)
step = 1
if whole+1 < 0 then step = -1 end
for i = 1, whole+1, step do
if ch[-i] == nil then ch[-i] = 1
else ch[-i] = ch[-i] + 1 end
end
fraction = pen - whole
if fraction == 0 then
ch[-whole-1] = fraction
end
s = sum(ch)
for i,_ in pairs(ch) do
ch[i] = ch[i] / s
end
if ch == {} then ch[0] = 1 end
return ch
end
local monsters = {["D:1"] = {"goblin", 12},
["D:2"] = {"adder", 15},
["D:3"] = {"orc wizard", 12},
["D:4"] = {"orc wizard", 12},
["D:5"] = {"bullfrog", 12},
["D:6"] = {"bullfrog", 12} }
function try_get_ev(where)
r = {"goblin", 12}
if monsters[where] then
r = monsters[where]
end
return r
end
function HitChance()
if crawl.regex("(\(weapon\))|empty-handed|finish taking off|finish putting on"):matches(crawl.messages(1)) == false
or you.feel_safe() == false then
return
end
basevalue = 15
dexterity = you.dexterity()
strength = you.strength()
fighting = you.skill("Fighting")
f_ch = calc_chance(fighting)
armour = you.skill("Armour")
e_rating = 0
a1 = items.equipped_at("Armour")
if a1 then
e_rating = a1.encumbrance
end
weapon = 0
accuracy = 0
w = items.equipped_at("Weapon")
if w == nil then
weapon = you.skill("Unarmed")
accuracy = 2
if you.has_claws() > 0 then accuracy = 4 end
else
weapon = you.skill(w.weap_skill)
accuracy = w.accuracy + w.plus
end
w_ch = calc_chance(weapon)
m_ch = mult_chances(f_ch, w_ch)
e_penalty = calc_armour_penalty(e_rating, armour, strength)
e_ch = calc_chance_armour(e_penalty)
m_ch = mult_chances(m_ch, e_ch)
s = items.equipped_at("Shield")
if s then
shields = you.skill("Shields")
size = 0
race = you.race()
if race == "Spriggan" then size = 4
elseif race == "Kobold" or race == "Halfling" then size = 2
elseif race == "Centaur" or race == "Naga"
or race == "Formicid" or race == "Ogre" or race == "Troll" then size = -2
end
ev_penalty = s.encumbrance
s_hit_penalty = ev_penalty - (shields)/(5 + size)
sh_ch = calc_chance_armour(s_hit_penalty)
m_ch = mult_chances(m_ch, sh_ch)
end
basevalue = basevalue + math.floor(dexterity/2) + accuracy
inc_v = inc_base(m_ch, basevalue)
roll_c = roll_chance(inc_v)
ev = try_get_ev(you.where())[2]
ev_ch = averge(mult_chances(calc_chance(2*ev), calc_chance(2*ev)))
hit = more_or_equal(roll_c, ev_ch)
w_name = "fists"
if you.has_claws() > 0 then w_name = "claws" end
if w then w_name = w.name() end
crawl.mpr("Chance to hit "..try_get_ev(you.where())[1].." with ".. w_name.." is "
..tostring(math.floor(hit*1000)/10).."%")
end
}
# Ask HilariousDeathArtist to fix things
# To use this you must add have a call to AnnounceDamage() in the ready() function like below:
# This is important if you override this ready() function
###############
# Damage Calc #
###############
{
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"))
--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("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
if hp_difference > (max_hp * 0.20) then
crawl.mpr("MASSIVE DAMAGE!!")
end
end
--On gaining more than 1 health
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("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.")
elseif current_hp <= (max_hp * 0.50) then
crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.")
elseif current_hp <= (max_hp * 0.70) then
crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.")
elseif current_hp <= (max_hp * 0.90) then
crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.")
else
crawl.mpr("You regained " .. health_inturn .. " hp, and now have " .. current_hp .. "/" .. max_hp .. " hp.")
end
end
if (current_hp == max_hp) then
crawl.mpr("Health restored: " .. current_hp .. "")
end
end
--On gaining more than 1 magic
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("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.")
elseif current_mp < (max_mp * 0.50) then
crawl.mpr("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.")
else
crawl.mpr("You regained " .. mp_inturn .. " mp, and now have " .. current_mp .. "/" .. max_mp .. " mp.")
end
end
if (current_mp == max_mp) then
crawl.mpr("MP restored: " .. current_mp .. "")
end
end
--On losing magic
if current_mp < previous_mp then
if current_mp <= (max_mp / 5) then
crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.")
elseif current_mp <= (max_mp / 2) then
crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.")
else
crawl.mpr("You now have " .. current_mp .. "/" ..max_mp .." mp.")
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
}