##### 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 }