# Crawl Init file # See the README for further details: # https://github.com/gammafunk/dcss-rc/blob/master/README.md # NOTE: This RC has things enabled only for my username. If you're just # including this RC file in your own with # # include = gammafunk.rc # # then you don't have to worry about these. However if you're copy all or parts # of gammafunk.rc directly into your own RC file, look for any sections # conditioned on my username and follow notes in the comments for removing or # modifying them. ############### ### Display ### ############### #"black", "blue", "green", "cyan", "red", "magenta", "brown", # "lightgrey", "darkgrey", "lightblue", "lightgreen", "lightcyan", # "lightred", "lightmagenta", "yellow", "white" view_delay = 300 hp_colour = 100:green, 99:lightgray, 75:yellow, 50:lightred, 25:red mp_colour = 100:green, 99:lightgray, 75:yellow, 50:lightred, 25:red hp_warning = 50 mp_warning = 50 # enemy_hp_colour = green green brown brown red magenta enemy_hp_colour = green lightgreen yellow lightred red magenta monster_list_colour = monster_list_colour += friendly:green,neutral:brown monster_list_colour += good_neutral:brown,strict_neutral:brown monster_list_colour += trivial:darkgrey,easy:lightgrey monster_list_colour += tough:yellow,nasty:lightred ############### ### Console ### ############### # Enable use of darkgrey. bold_brightens_foreground=true # Monster List mlist_allow_alternate_layout = true monster_item_view_coordinates = true ## For item_glyph, subsequent matches override previous ones. item := item_glyph ## Reasonable defaults item += potion:lightgrey item += scroll:lightgrey item += wand:lightgrey item += dangerous_item:blue item += useless_item:darkgrey ### Potions ### item += potions? of.*(curing|flight):lightgrey : if you.race() == "Vampire" then item += potions? of blood:lightgrey : end item += potions? of.*berserk:brown item += potions? of.*might:yellow item += potions? of.*cancellation:cyan item += potions? of.*ambrosia:blue item += potions? of.*experience:lightred item += potions? of.*heal wounds:white item += potions? of.*(resistance|agility):green item += potions? of.*(haste|invisibility):lightgreen item += potions? of.*mutation:lightcyan item += potions? of.*brilliance:magenta item += potions? of.*magic:lightmagenta ### Scrolls ### : if you.race() == "Vampire" or you.race() == "Mummy" : or you.race() == "Ghoul" then item += scroll.*holy word:darkgrey item += scroll.*torment:brown : else item += scroll.*holy word:brown item += scroll.*torment:darkgrey : end item += scroll.*acquirement:white item += scroll.*(summoning):yellow item += scroll.*identify:cyan item += scroll.*magic mapping:lightcyan item += scroll.*(silence|vulnerability|immolation):blue item += scroll.*remove curse:lightgrey item += scroll.*(fog|teleport):green item += scroll.*(fear|blink):lightgreen item += scroll.*(recharging):magenta item += scroll.*(enchant|brand weapon):lightmagenta ### Wands ### # Sometimes dangerous item += wand of.*random effects:blue # Single target piercing. item += wand of.*lightning:brown item += wand of.*acid:yellow item += wand of.*flame:lightgrey item += wand of.*clouds:white item += wand of.*digging:green # Single-turn AOE item += wand of.*iceblast:cyan item += wand of.*scattershot:lightcyan item += wand of.*(disintegration|confusion|polymorph):magenta item += wand of.*(paralysis|enslavement):lightmagenta ### General Identification ### item += (identified|known).*(jewellery|magical staff):brown item += identified.*spellbook:magenta item += unidentified.*(potion|scroll|jewellery|wand|magical staff).*:lightblue item += unidentified.*book:lightmagenta item += manual:lightcyan item += manual of:cyan ### Jewellery ### item += known.*(ring of (dexterity|strength|intelligence|slaying|evasion|protection(?! from))|amulet of reflection):magenta item += identified.*artefact.*(jewellery):white item += unidentified.*artefact.*(jewellery).*:lightmagenta item += (a )?stones?$:lightgray ### Food ### item += chunks?.*flesh:lightgrey item += evil_eating.*chunk:red item += ( ration):green # Want this to override anything above item += useless:darkgrey # Only mark these types when forbidden; for other types it looks odd. item += forbidden.*(potion|scroll|food):red mons := mon_glyph # Monsters that can be easy to miss mons ^= * : ✱ mons ^= dancing weapon : cyan { mons ^= spectral weapon : lightcyan { # Classed Demonspawn mon += blood saint:9 mon += warmonger:9 mon += corrupter:9 mon += black sun:9 # Wall glyphs; requires a font and terminal that can render these. feature += crystal wall {░} feature += stone wall {▒} feature += metal wall {▓} feature += unnaturally hard rock wall {█} feature += altar {⚑} ############# ### Tiles ### ############# tile_window_width = 1300 tile_window_height = 700 tile_full_screen = false tile_map_pixels = 3 ################### ### Menu Colors ### ################### # These should match the item_glyph colours exactly when possible. # For menu_colour, the first match ignores subsequent matches. menu := menu_colour menu = # Many of the entries below come from dat/defaults/menu_colours.txt, # which we have to duplicate here since we want only some of the # entries from that file. menu += notes:white:Reached XP level ### General Inventory### # Items currently not affecting you. menu += darkgrey:(melded) # Items disliked by your god. menu += red:forbidden # Useless items, comes here to override artefacts etc. menu += darkgrey:.*useless.* # Handle cursed and equipped items early to override other colour settings. menu += lightred:.*equipped.* cursed menu += red: (a|the) cursed menu += inventory:lightgreen:.*equipped.* # Colouring of autoinscribed god gifts menu += pickup:lightred:god gift # Highlight (partly) selected items menu += inventory:white:\w \+\s menu += inventory:white:\w \#\s ### Food ### # Color chunks, put ordinary ones on lightgrey. menu += red:evil_eating.*chunk menu += blue:mutagenic.*chunk menu += lightgrey: +(chunks?$|chunks? +) # Other food menu += green:( ration) ### Potions ### : if you.race() == "Vampire" then menu += lightgrey:potions? of blood : end menu += lightgrey:potions? of.*(curing|flight) menu += brown:potions? of.*berserk menu += yellow:potions? of.*might menu += cyan:potions? of.*cancellation menu += blue:potions? of.*(lignification|ambrosia) menu += lightred:potions? of.*experience menu += white:potions? of.*heal wounds menu += green:potions? of.*(resistance|agility) menu += lightgreen:potions? of.*(haste|invisibility) menu += lightcyan:potions? of.*mutation menu += magenta:potions? of.*brilliance menu += lightmagenta:potions? of.*magic ### Scrolls ### : if you.race() == "Vampire" or you.race() == "Mummy" : or you.race() == "Ghoul" then menu += darkgrey:scroll.*holy word menu += brown:scroll.*torment : else menu += brown:scroll.*holy word menu += darkgrey:scroll.*torment : end menu += white:scroll.*acquirement menu += yellow:scroll.*(summoning) menu += cyan:scroll.*identify menu += lightcyan:scroll.*magic mapping menu += blue:scroll.*(noise|silence|vulnerability|immolation) menu += lightgrey:scroll.*remove curse menu += green:scroll.*(fog|teleport) menu += lightgreen:scroll.*(fear|blink) menu += magenta:scroll.*(recharging) menu += lightmagenta:scroll.*(enchant|brand weapon) ### Wands ### # Can be harmful menu += blue:wand of.*random effects # Damaging beam. menu += brown:wand of.*flame menu += yellow:wand of.*acid menu += white:wand of.*clouds menu += green:wand of.*digging # Explosion menu += cyan:wand of.*iceblast menu += lightcyan:wand of.*scattershot # MR-checking menu += magenta:wand of.*(disintegration|polymorph) menu += lightmagenta:wand of.*(paralysis|enslavement) ### General identification ### menu += cyan:manual of menu += lightcyan:manual menu += lightmagenta:unidentified.*artefact.* menu += white:.*artefact.* menu += lightblue:unidentified .*(potion|scroll|wand|jewellery|spellbook|rod|magical staff) menu += magenta:.*known .*(ring of (dexterity|strength|intelligence|slaying|evasion|protection(?! from))|amulet of reflection) menu += inventory:lightgray:.*(book|jewellery|magical staff) # Ego items menu += lightblue:unidentified.*weapon.*(runed|glowing|enchanted) menu += lightblue:unidentified.*armour.*(runed|glowing|embroidered|shiny|dyed) ################# ### Interface ### ################# default_manual_training = true equip_unequip = true sort_menus = true:equipped,identified,basename,art,ego,glowing,qualname,curse,charged,slot # show_more = false autofight_caught = true # Spam autofight is bad autofight_warning = 250 # Manual throwing only. Especially since I tend to use javelins, and they pierce, but also lava is a thing. #autofight_throw = false #autofight_throw_nomove = false # If you are actually injuried, autofight is probably a terrible idea. autofight_stop = 75 delay_safe_poison = 10:5 # No movement on regular tab bindkey = [^I] CMD_AUTOFIGHT_NOMOVE # Move as normal on g. bindkey = [g] CMD_AUTOFIGHT auto_butcher = true auto_butcher_max_chunks = 10 easy_eat_chunks = true runrest_ignore_message ^= You feel.*sick ############################ ### Travel & Exploration ### ############################ rest_wait_both = true travel_delay = 1 explore_delay = 1 rest_delay = -1 show_travel_trail = true explore_stop += greedy_items wall_jump_move = false explore_wall_bias = 4 travel_key_stop = false explore_auto_rest = true warn_hatches = true ################ # Keybindings to override the vi movement keys. # CMD_NO_CMD_DEFAULT results in "Unknown command." # See docs/keybind.txt for other commands. ################ bindkey = [h] CMD_NO_CMD_DEFAULT bindkey = [j] CMD_NO_CMD_DEFAULT bindkey = [k] CMD_NO_CMD_DEFAULT bindkey = [l] CMD_NO_CMD_DEFAULT bindkey = [H] CMD_NO_CMD_DEFAULT bindkey = [J] CMD_NO_CMD_DEFAULT bindkey = [K] CMD_NO_CMD_DEFAULT bindkey = [L] CMD_NO_CMD_DEFAULT bindkey = [^H] CMD_NO_CMD_DEFAULT bindkey = [^J] CMD_NO_CMD_DEFAULT bindkey = [^K] CMD_NO_CMD_DEFAULT bindkey = [^L] CMD_NO_CMD_DEFAULT bindkey = [y] CMD_NO_CMD_DEFAULT bindkey = [u] CMD_NO_CMD_DEFAULT bindkey = [b] CMD_NO_CMD_DEFAULT bindkey = [n] CMD_NO_CMD_DEFAULT bindkey = [Y] CMD_NO_CMD_DEFAULT bindkey = [U] CMD_NO_CMD_DEFAULT bindkey = [B] CMD_NO_CMD_DEFAULT bindkey = [N] CMD_NO_CMD_DEFAULT bindkey = [^Y] CMD_NO_CMD_DEFAULT bindkey = [^U] CMD_NO_CMD_DEFAULT bindkey = [^B] CMD_NO_CMD_DEFAULT bindkey = [^N] CMD_NO_CMD_DEFAULT ################ # Auto Exclude # ################ ## dangerous monsters ## auto_exclude += ancient lich, death drake, hydra, ice statue, jelly, orb of fire ## Cancer Monsters auto_exclude += orb of fire, Shining eye, Cacodemon, Neqoxec ## paralysing monsters and uniques ## auto_exclude += [^c] wizard, ancient lich, Ereshkigal, Erolcha, eyeball, Grinder, Jory, lich auto_exclude += Norris, ogre-mage, orb of eyes, orc sorcerer, Rupert, sphinx, vampire knight ## other uniques and unique followers ## auto_exclude += Agnes, Aizul, Arachne, Asterion, Blork, Boris, Crazy Yiuf, Donald, Dowan auto_exclude += Duvessa, Edmund, Erica, Eustachio, Fannar, Frances, Frederick, Gastronok auto_exclude += Grum, Harold, Ijyb, Jessica, Jorgrun, Joseph, Kirke, Louise, Mara, Maud auto_exclude += Maurice, Menkaure, Mennas, Natasha, Nergalle, Nessos, Nikola, Pikel auto_exclude += Polyphemus, Prince Ribbit, Psyche, Roxanne, Saint Roka, Sigmund, Snorg auto_exclude += Sojobo, Sonja, Terence, Urug, Wiglaf, Xtahua, hog, slave ################## ### Autopickup ### ################## # Add staves, rods, misc; note you can't use += with this option. autopickup = $?!:"/%}|\ #All useful, at least early game. #Its only later that you would want to just remove these. ae := autopickup_exceptions ae += scrolls? of silence # ae += >(crystal ball of energy|disc of storm) # Don't ever need a second stave ae += staff of .* ################ ### Messages ### ################ channel.multiturn = mute msc := message_colour msc += mute:returns to your side # msc += mute:a demon appears msc += lightgrey:The deck of cards disappears # msc += mute:puff of smoke msc += mute:carefully avoids msc += mute:is recalled msc += mute:wall.*burn.*your # msc += mute:dissolves? into (sparkling lights|shadows) # msc += mute:(crumbles|melts) away\. # msc += mute:(merges|forms) itself .* the air msc += mute:you swap places msc += mute:your.*(looks stronger|shudders|resists) msc += mute:your.*(stumbles backwards|holds.*ground) msc += mute:your.*(blinks|safely over) msc += mute:(phases out.*|misses) (your|something).* msc += mute:your.*(picks up|drops) # msc += mute:your.*basks in the mutagenic energy msc += mute:your.*(struggles|tears|pulls away).*(web|net) more := force_more_message : if you.god() == "Ashenzari" then more += You have a vision of.*gates? : end more += The mighty Pandemonium lord .* resides here # Interrupts more += You don't .* that spell more += You fail to use your ability more += You miscast.*(Blink|Borgnjor|Door|Invisibility) more += You can't (read|drink|do) more += You cannot .* while unable to breathe more += You cannot .* in your current state more += when .*silenced more += too confused more += There's something in the way more += There's nothing to (close|open) nearby more += not good enough to have a special ability more += You are too berserk more += no means to grasp more += That item cannot be evoked more += This wand has no charges more += You are held in a net more += You don't have any such object more += You can't unwield more += enough magic points more += You don't have the energy to cast that spell more += You are unable to access your magic # Bad things more += Your surroundings flicker more += You cannot teleport right now more += A sentinel's mark forms upon you more += (blundered into a|invokes the power of) Zot more += enter a teleport trap more += Ouch! That really hurt! more += dispelling energy hits you more += You are blasted by holy energy! more += You are (blasted|electrocuted)! more += You are.*(confused|poisoned) more += flesh rotting more += (starving|devoid of blood) more += god:(sends|finds|silent|anger) more += You feel a surge of divine spite more += disloyal to dabble more += lose consciousness more += You are too injured to fight blindly more += calcifying dust hits more += Space warps.*around you more += Space bends around you more += watched by something more += flickers and vanishes! more += doesn't seem very happy more += is no longer charmed # Hell effects more += hell_effect: # Expiring effects more += You feel yourself slow down more += You are starting to lose your buoyancy more += Your hearing returns more += Your transformation is almost over more += You have a feeling this form more += You feel yourself come back to life more += time is quickly running out more += life is in your own hands more += Your shroud falls apart more += You start to feel a little slower more += You feel less protected from missiles # Others more += You have reached level more += You rejoin the land of the living more += You have finished (your manual|forgetting about) more += Your scales start more += You feel monstrous more += Jiyva alters your body : if you.god() == "Xom" then more += god: : end # Dangerous monsters we force_more when first seen. # Things with ranged (or extremely fast), irresistable effects. more += ((floating|shining) eye|dream sheep|death drake).*into view more += (wretched star|apocalypse crab|death drake).*into view more += (entropy weaver|torpor snail|spriggan druid).*into view more += (vault (warden|sentinel)|merfolk (avatar|siren)).*into view more += (guardian serpent|draconian shifter|convoker|death cob).*into view more += (phantasmal warrior|air elemental).*into view # Paralysis/Petrify/Banish more += (orc sorcerer|(?> note_items += experience,of resistance, Archmagi note_items += crystal plate armour,pearl dragon scales note_items += artefact note_messages += You feel monstrous note_messages += You pass through the gate note_messages += cast .* Abyss # Noteable monsters # Undead note_monsters += ancient lich,curse skull,curse toe,greater mummy # Depths note_monsters += caustic shrike # Special hall_of_zot spawns note_monsters += killer klown,electric golem,orb of fire dump_message_count = 1000 dump_order = header,hiscore,stats,misc,mutations,skills,spells,inventory dump_order += overview,screenshot,monlist,messages,skill_gains,action_counts dump_order += vaults,notes,kills,turns_by_place,xp_by_level dump_kill_places = all dump_item_origins = all dump_book_spells = false ########### ### Lua ### ########### { -- Cancer Monsters fm_danger = {"Unarmed Combat", "Short Blades", "Long Blades", "Axes", "Maces & Flails", "Polearms", "Staves"} --fm_danger = { -- "orb of fire", -- "shining eye", -- "cacodemon", -- "neqoxec", -- "troll" -- } function danger() --los = you.los() --for i = -los,los do --for j = -los,los do -- local mm = monster.get_monster_at (i,j) -- if mm then -- local mon_threat = mm:threat() -- local mon_name = mm:name() -- -- if util.contains(danger_patterns,mon_name) == true then -- -- crawl.mpr("CANCER! " .. mon_name .." !!!!!!", 5) -- -- crawl.more() -- -- end -- if mon_threat == 3 then -- crawl.mpr("DANGER! " .. mon_name .." !!!!!!", 5) -- crawl.more() -- end -- if mon_threat == 2 then -- crawl.mpr(mon_name, 5) -- crawl.more() -- end -- end --end --end end } { -- Equipment autopickup (by Medar and various others) local function pickup_equipment(it, name) if it.is_useless then return end local class = it.class(true) if class == "armour" then local good_slots = {cloak="Cloak", helmet="Helmet", gloves="Gloves", boots="Boots"} st, _ = it.subtype() -- Autopickup found aux armour if 1) we don't have any or 2) it's artefact, -- or 3) if we don't have artefact or ego armour, and the found armour is -- ego. if good_slots[st] ~= nil then if good_slots[st] == "Gloves" and you.has_claws() > 0 then return end if it.artefact then return true end local cur = items.equipped_at(good_slots[st]) if cur == nil then return true end if cur.branded or cur.artefact then return end if it.branded then return true end -- Autopickup found body armour of the same kind we're wearing, according -- to conditions (2) and (3) above used for aux slots. elseif st == "body" then local cur = items.equipped_at("armour") if cur == nil then return end if cur.name("qual") ~= it.name("qual") then return end if it.artefact then return true end if cur.branded or cur.artefact then return end if it.branded then return true end end end return end add_autopickup_func(pickup_equipment) -- Spellcasting spam reduction by monqy local function generic_cast_spell(cmd) crawl.mpr('Cast which spell?') crawl.flush_prev_message() crawl.process_keys(cmd) end function cast_spell() generic_cast_spell('z') end function force_cast_spell() generic_cast_spell('Z') end } # Note: My final RC file has code from lua files found at: # https://github.com/gammafunk/dcss-rc/blob/master/README.md # starting from the line below. { --------------------------- ---- Begin force_mores ---- --------------------------- -- See README.md for documentation. last_turn = you.turns() -- Each entry must have a 'name' field with a descriptive name, a 'pattern' -- field, a 'cond' field giving the condition type, and a 'cutoff' field giving -- the max value for where the force_more will apply. Possible values for -- 'cond' are xl and maxhp. -- -- The 'pattern' field's value can be either a regexp string or array of regexp -- strings matching the appropriate monster(s). Any values are joined by "|" to -- make a new force_more of the form: -- -- ((?!spectral )VALUE1|VALUE2|...)(?! (skeleton|zombie|simularcrum)).*into view". -- -- To allow derived undead forms of a monster to match, include 'spectral ' at -- the beginning of and/or ' (skeleton|zombie|simularcrum)' at the end of your -- pattern for that monster. fm_patterns = { -- Fast, early game Dungeon problems for chars with low mhp. {name = "30mhp", cond = "maxhp", cutoff = 30, pattern = "adder|hound"}, -- Dungeon monsters that can damage you for close to 50% of your mhp with a -- ranged attack. {name = "40mhp", cond = "maxhp", cutoff = 40, pattern = "orc priest|electric eel"}, {name = "60mhp", cond = "maxhp", cutoff = 60, pattern = "acid dragon|steam dragon|manticore"}, {name = "70mhp", cond = "maxhp", cutoff = 70, pattern = "centaur(?! warrior)|meliai|yaktaur(?! captain)"}, {name = "80mhp", cond = "maxhp", cutoff = 80, pattern = "gargoyle|orc (warlord|knight)"}, {name = "90mhp", cond = "maxhp", cutoff = 90, pattern = {"centaur warrior", "deep elf archer", "efreet", "molten gargoyle", "tengu conjurer"} }, {name = "110mhp", cond = "maxhp", cutoff = 110, pattern = {"centaur warrior", "deep elf (mage|knight)", "cyclops", "efreet", "molten gargoyle", "tengu conjurer", "yaktaur captain", "necromancer", "deep troll earth mage", "hell knight", "stone giant"} }, {name = "160mhp", cond = "maxhp", cutoff = 160, pattern = {"(fire|ice|quicksilver|shadow|storm) dragon", "(fire|frost) giant", "war gargoyle", "draconian (knight|stormcaller"} }, } -- end fm_patterns active_fm = {} -- Set to true to get a message when the fm change notify_fm = false -- Wrapper of crawl.mpr() that prints text in white by default. if not mpr then mpr = function (msg, color) if not color then color = "white" end crawl.mpr("<" .. color .. ">" .. msg .. "") end end function init_force_mores() for i,v in ipairs(fm_patterns) do active_fm[#active_fm + 1] = false end end function update_force_mores() local activated = {} local deactivated = {} local hp, maxhp = you.hp() for i,v in ipairs(fm_patterns) do local msg = nil if type(v.pattern) == "table" then for j, p in ipairs(v.pattern) do if msg == nil then msg = p else msg = msg .. "|" .. p end end else msg = v.pattern end msg = "(?= v.cutoff then action = "-" elseif not active_fm[i] and you.xl() < v.cutoff then action = "+" end elseif v.cond == "maxhp" then if active_fm[i] and maxhp >= v.cutoff then action = "-" elseif not active_fm[i] and maxhp < v.cutoff then action = "+" end end if action == "+" then activated[#activated + 1] = fm_name elseif action == "-" then deactivated[#deactivated + 1] = fm_name end if action ~= nil then local opt = "force_more_message " .. action .. "= " .. msg crawl.setopt(opt) active_fm[i] = not active_fm[i] end end if #activated > 0 and notify_fm then mpr("Activating force_mores: " .. table.concat(activated, ", ")) end if #deactivated > 0 and notify_fm then mpr("Deactivating force_mores: " .. table.concat(deactivated, ", ")) end end local last_turn = nil function force_mores() if last_turn ~= you.turns() then update_force_mores() last_turn = you.turns() end end init_force_mores() ------------------------- ---- End force_mores ---- ------------------------- } { ----------------------------- ---- Begin char_defaults ---- ----------------------------- -- See README.md for documentation. weapon_skills = {"Unarmed Combat", "Short Blades", "Long Blades", "Axes", "Maces & Flails", "Polearms", "Staves"} ranged_skills = {"Throwing", "Bows", "Crossbows", "Slings"} other_skills = {"Fighting", "Armour", "Dodging", "Shields", "Spellcasting", "Conjurations", "Hexes", "Charms", "Summonings", "Necromancy", "Translocations", "Transmutations", "Fire Magic", "Ice Magic", "Air Magic", "Earth Magic", "Poison Magic", "Invocations", "Evocations","Stealth"} skill_glyphs = { [1] = "+", [2] = "*" } chdat = nil char_combo = you.race() .. you.class() loaded_attempted = false -- Wrapper of crawl.mpr() that prints text in white by default. if not mpr then mpr = function (msg, color) if not color then color = "white" end crawl.mpr("<" .. color .. ">" .. msg .. "") end end function skill_message(prefix, skill, skill_type, value) local msg = "" if prefix then msg = prefix .. ";" end if skill_type then msg = msg .. skill_type .. "(" .. skill .. "):" .. value else msg = msg .. skill .. ":" .. value end return msg end function save_char_defaults(quiet) if you.class() == "Wanderer" then return end if not c_persist.char_defaults then c_persist.char_defaults = { } end c_persist.char_defaults[char_combo] = { } chdat = c_persist.char_defaults[char_combo] local msg = nil local have_weapon = false for _,sk in ipairs(weapon_skills) do if you.train_skill(sk) > 0 then chdat["Weapon"] = you.train_skill(sk) msg = skill_message(nil, sk, "Weapon", skill_glyphs[chdat["Weapon"]]) have_weapon = true break end end if not have_weapon then chdat["Weapon"] = nil end local have_ranged = false for _,sk in ipairs(ranged_skills) do if you.train_skill(sk) > 0 then chdat["Ranged"] = you.train_skill(sk) msg = skill_message(msg, sk, "Ranged", skill_glyphs[chdat["Ranged"]]) have_ranged = true break end end if not have_ranged then chdat["Ranged"] = nil end for _,sk in ipairs(other_skills) do if you.train_skill(sk) > 0 then chdat[sk] = you.train_skill(sk) msg = skill_message(msg, sk, nil, skill_glyphs[chdat[sk]]) else chdat[sk] = nil end end if not quiet then mpr("Saved default for " .. char_combo .. ": " .. msg) end end function have_defaults() return you.class() ~= "Wanderer" and c_persist.char_defaults ~= nil and c_persist.char_defaults[char_combo] ~= nil end function load_char_defaults(quiet) if not have_defaults() then return end local msg = nil local found_weapon = false chdat = c_persist.char_defaults[char_combo] for _,sk in ipairs(weapon_skills) do if you.base_skill(sk) > 0 and chdat["Weapon"] then you.train_skill(sk, chdat["Weapon"]) msg = skill_message(msg, sk, "Weapon", skill_glyphs[chdat["Weapon"]]) found_weapon = true else you.train_skill(sk, 0) end end if chdat["Weapon"] and not found_weapon then you.train_skill("Unarmed Combat", chdat["Weapon"]) msg = skill_message(msg, "Unarmed Combat", "Weapon", skill_glyphs[chdat["Weapon"]]) end local found_ranged = false for _,sk in ipairs(ranged_skills) do if you.base_skill(sk) > 0 and chdat["Ranged"] then you.train_skill(sk, chdat["Ranged"]) msg = skill_message(msg, sk, "Ranged", skill_glyphs[chdat["Ranged"]]) found_ranged = true else you.train_skill(sk, 0) end end if chdat["Ranged"] and not found_ranged then you.train_skill("Throwing", chdat["Ranged"]) msg = skill_message(msg, "Throwing", "Ranged", skill_glyphs[chdat["Ranged"]]) end for _,sk in ipairs(other_skills) do if chdat[sk] then you.train_skill(sk, chdat[sk]) msg = skill_message(msg, sk, nil, skill_glyphs[chdat[sk]]) else you.train_skill(sk, 0) end end if not quiet and msg ~= "" then mpr("Loaded default for " .. char_combo .. ": " .. msg) end end function char_defaults(quiet) if you.turns() ~= 0 then return end if not load_attempted then load_char_defaults(quiet) load_attempted = true -- Open the skill menu if we don't have settings to load. if not have_defaults() then crawl.sendkeys("m") end end end --------------------------- ---- End char_defaults ---- --------------------------- } # The ready() function is needed for code that has to process each turn or UI # action. { function ready() -- Open skill screen on turn 0. if not skills_set and you.turns() == 0 then crawl.sendkeys("m") skills_set = true end -- force_mores.lua force_mores() -- char_defaults.lua char_defaults() -- AnnounceDamage() AnnounceDamage() -- Danger Test danger() 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 # < # function ready() # AnnounceDamage() # end # > ############### # 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 } ############# ### Debug ### ############# fsim_rounds = 10000