############ GENERAL SETTINGS ############ always_show_gems = true more_gem_info = true default_manual_training = true autofight_stop = 55 hp_warning = 20 note_hp_percent = 20 show_more = false show_travel_trail = true travel_delay = -1 explore_delay = -1 rest_delay = -1 tile_map_scale = 0.8 prompt_menu = false action_panel_orientation = vertical action_panel_scale = 50 monster_list_colour += good_neutral:blue drop_disables_autopickup = true force_spell_targeter += Animate Dead # Critical for necromancers! # ****************** explore_auto_rest = false force_spell_targeter += Permafrost Eruption force_ability_targeter += Bend Time ############ TERMINAL COLOURS ############ # Default colours # lightmagenta #fd59fa # magenta #cd21cb # lightblue #b325b3 # blue #005afa # lightred #ef2929 # black #000000 lol # brown #8f5902 custom_text_colours = lightmagenta:#ff87d9 custom_text_colours += magenta:#af43a5 custom_text_colours += lightblue:#7f9fff custom_text_colours += blue:#0f73da custom_text_colours += lightred:#f73f3f custom_text_colours += brown:#af7920 ## Redefine black, since afaict this has no effect on anything but text custom_text_colours += black:#c780ff ############ AUTO INSCRIBES ############ # This list used to be a lot longer, but there are now natural prompts for most dangerous scrolls and potions, which are clever about when to prompt. This system is better than using autoinscriptions. ai := autoinscribe ai += throwing net:!f ai += scroll of (butterflies|summoning):!r ############ FORCE MORES ############ ## General ## more := force_more_message more += LOW HITPOINT more += Ouch! That really hurt! more += wielding .*(distort|chaos) more += wracked with pain more += you convulse more += watched by something more += mighty Pandemonium lord more += finished your manual of more += s you\!\!\! more += feel a terrible chill more += burns you terribly more += strangely unstable more += power of Zot more += expect to remain undetected more += your icy armour evaporates more += training target.*reached more += you miscast more += no longer charmed : if you.race() ~= "Formicid" then more += enters a dispersal trap : end more += carrying a wand more += mark forms upon you more += surroundings.*seem.*different more += Vehumet offers you knowledge more += a new sacrifice more += Ashenzari invites you to partake more += time is quickly running out more += life is in your own more += Your body becomes as fragile as glass more += suddenly lose the ability to move more += slowing down more += Your blazeheart golem falls apart # Let's not force a more message for every skill increase for Djinn and Gnolls # TODO Figure out whether we can make this work better for Gnolls or Djinn with # manuals... : if you.race() == "Djinni" then more += (Fighting|Maces|Axes|Blades|Polearms|Combat|Weapons|Staves|Armour|Dodging|Shields|Stealth|Invo|Evo|Shape|Alchemy).*skill increases more += you have mastered .* (Fighting|Maces|Axes|Blades|Polearms|Combat|Weapons|Staves|Armour|Dodging|Shields|Stealth|Invo|Evo|Shape|Alchemy) : elseif you.race() ~= "Gnoll" then more += skill increases more += levels and is now at more += you have mastered : else more += (Invocations|Evocations|Alchemy|Shapeshifting) skill increases more += you have mastered (Invocations|Spellcasting|Alchemy|Shapeshifting) : end more += cannot teleport more += cannot blink flash_screen_message += cannot teleport flash_screen_message += cannot blink ## Dangerous enemies entering LOS ## # Always dangerous : if you.race() == ("Demonspawn" or "Mummy" or "Vampire" or "Ghoul") then more += wielding .*holy more += (pearl dragon|ophan|seraph).*come : end #more += guardian serpent.*into view #more += ghost moth.*into view #more += lich.*into view #more += orbs? of fire.*into view #more += curse toe.*into view #more += fiend.*into view #more += tzit.*into view #more += (mummy priest|royal mumm).*into view #more += hellion.*into view #more += tormentor.*into view #more += javelineer.*into view #more += aquamancer.*into view #more += warden.*into view #more += ironbrand convoker.*into view #more += curse skull.*into view #more += quivering.*throwing net # Uniques more += Agnes.*into view more += Aizul.*into view more += Amaemon.*into view more += Asterion.*into view more += Azrael.*into view more += Bai Suzhen.*into view more += Blork.*into view more += Boris.*into view more += Yuif.*into view more += Dowan.*into view more += Duvessa.*into view more += Donald.*into view more += Edmund.*into view more += Erica.*into view more += Enchantress.*into view more += Erolcha.*into view more += Eustachio.*into view more += Fannar.*into view more += Frances.*into view more += Frederick.*into view more += Gastronok.*into view more += Grinder.*into view more += Grum.*into view more += Grunn.*into view more += Harold.*into view more += Ijyb.*into view more += Jeremiah.*into view more += Jessica.*into view more += Jorgrun.*into view more += Jory.*into view more += Joseph.*into view more += Khufu.*into view more += Kirke.*into view more += Lodul.*into view more += Louise.*come more += Mar.*come more += Maggie.*come more += Maurice.*come more += Men.*come more += Mlioglotl.*come more += Natasha.*come more += Nergalle.*come more += Nessos.*come more += Nikola.*come more += Norris.*come more += Pikel.*come more += Prince Ribbit.*come more += Psyche.*come more += Parg.*come more += Robin.*come more += Rupert.*come more += Roka.*come more += Sigmund.*come more += Sonja.*come more += Snorg.*come more += Sojobo.*come more += Terence.*come more += Urug.*come more += Xtahua.*come more += Vv.*come more += Zenata.*come more += Ilsuiw.*come more += Polyphemus.*come more += Vashnia.*come more += Arachne.*come more += Lernaean hydra.*come more += Tiamat.*come more += Dissolution.*come more += Royal Jelly.*come more += Murray.*come more += Serpent of Hell.*come more += Antaeus.*come more += Asmodeus.*come more += Dispater.*come more += Ereshkigal.*come more += Ignacio.*come more += Mnoleg.*come more += Cerebov.*come more += Lom Lobon.*come more += Gloorx Vloq.*come # Dynamic force mores (credit to UV4 and other historic and current members of the DCSS community for the boilerplate code here, which I have dramatically cleaned up!) Idea: force more for neutralisable threats only when said threat is actually dangerous. ############ ITEM AND SPELL SLOTS ############# islot := item_slot sslot := spell_slot ## Scrolls ## islot += scrolls? of identify:+r islot += scrolls? of blinking:+x islot += scrolls? of teleport:+t islot += scrolls? of (summoning|butterflies):+u islot += scrolls? of fog:+o islot += scrolls? of fear:+e ## Potions ## islot += potions? of curing:+q islot += potions? of heal:+h islot += potions? of haste:+f islot += potions? of brilliance:+i islot += potions? of might:+m islot += potions? of magic:+z islot += potions? of resistance:+s islot += potions? of cancel:+c ## Rings ## islot += ring of protection from fire:+F islot += ring of protection from cold:+C islot += ring of positive energy:+Y islot += ring of poison resistance:+P islot += ring of resist corrosion:+R islot += ring of willpower:+W islot += ring of see invis:+Z islot += ring of evasion:+EV islot += ring of protection:+AT islot += ring of slaying:+S ## Spells ## sslot += Orb of Des:+z sslot += Blink:+X ## Abilities ## ability_slot += Potion Pet:+P ability_slot += Call Merchant:+M ############ ITEM COLOURS ############ menu := menu_colour menu = ############ ITEM COLOURS ############ menu := menu_colour menu = # Colours are approximately as follows # black - unused (this doesn't work very well!) # darkgrey - useless/melded # red - forbidden # lightred - cursed items/scrolls of noise # white - artefacts (as in default crawl), wands of digging # lightcyan - unrands (as in default crawl), also acq/experience # yellow - unidentified items and equipped items (note: no overlap) # lightgrey - default/unexciting items, e.g. +stats, rN+ # lightblue - meaningful resistances/"use early" items # blue - scrolls of enchantment, decent egos # black (redefined to violet) - willpower items # green - good items, medium escape items # lightgreen - the best emergency items only # brown - mixed bag, useful items/egos # lightmagenta (redefined to pink) - risky but usually good items # magenta - risky, usually bad items # cyan - magical items ## General ## menu += darkgrey:(melded) menu += red:.*forbidden.* menu += lightred:cursed menu += inventory:darkgrey:.*useless_item.* menu += pickup:darkgrey:.*useless_item.* menu += shop:darkgrey:.*useless_item.* menu += equip:darkgrey:.*useless_item.* menu += unequip:darkgrey:.*useless_item.* menu += stash:darkgrey:.*useless_item.* ## Armour/Weapons on stats screen whyyyyyy ## menu += stats:lightcyan:.*unrand.* menu += stats:white:.*artefact.* menu += stats:brown:(protection|spectral|holy wrath) menu += stats:lightblue:(flaming|freezing|heavy) menu += stats:blue:(venom|draining|pain) menu += stats:cyan:(electrocution|speed) menu += stats:lightmagenta:(distortion|antimagic) menu += stats:green:vampiric menu += stats:magenta:chaos menu += stats:lightgrey:weapon ## More general menu += inventory:yellow:equipped menu += use_item:yellow:equipped menu += lightcyan:.*unrand.* menu += white:.*artefact.* menu += yellow:^unidentified .*(jewellery|potion|scroll|wand).* menu += yellow:^unidentified .*armour.*(embroidered|dyed|glowing|shiny|runed) menu += yellow:^unidentified .*weapon.*(glowing|runed) ## Consumables ## menu += lightred:scrolls? of noise menu += green:scrolls? of (fear|fog|teleportation|butterflies) menu += lightgreen:scrolls? of blinking menu += cyan:scrolls? of summoning menu += blue:scrolls? of (brand|enchant) (weapon|armour) menu += lightblue:scrolls? of (identify|amnesia) menu += brown:scrolls? of revelation menu += lightmagenta:scrolls? of (vulnerability|silence) # torment and poison have special logic menu += lightgreen:potions? of heal wounds menu += green:potions? of (haste|invisibility|cancellation) menu += lightblue:potions? of (might|brilliance|resistance|berserk rage) menu += black:potions? of enlightenment menu += lightmagenta:potions? of ambrosia menu += magenta:potions? of (mutation|attraction|lignification) menu += lightcyan:(potions? of experience|scrolls? of acquirement) # potions of curing/magic have special logic ## Equippables ## menu += blue:amulet of reflection menu += brown:amulet of guardian spirit menu += lightblue:amulet of the acrobat menu += lightmagenta:amulet of faith menu += green:amulet of regeneration menu += cyan:amulet of magic regeneration menu += lightmagenta:ring of (fire|ice) menu += brown:ring of (dex|int|str) menu += lightblue:ring of (poison|protection from fire|protection from cold|resist corrosion) menu += black:ring of willpower menu += lightgray:ring of (flight|positive energy|see invisible) menu += green:ring of (.*evasion|.*protection|.*slaying) menu += cyan:ring of (magical power|wizardry) # stats rings are lightgrey ## Armour/Weapons ## menu += brown:(protection|strength|intelligence|dexterity) menu += blue:(invisibility|repulsion|reflection|hurling) menu += green:(of resistance|golden dragon scales) menu += black:quicksilver menu += lightblue:(resistance|preservation) menu += black:of willpower menu += green:troll leather armour menu += lightgray:(shadow|pearl|steam) dragon scales menu += lightblue: dragon scales menu += magenta:of (harm|guile|mayhem|wrath|ponderousness) menu += lightmagenta:of (shadows|energy|rampaging) menu += cyan:(Archmagi|infusion) menu += black:spellbook # All other egos get lightgrey. Work in progress to fix this: ideally # egos should be coloured and non-egos lightgrey. ## Weapon brands ## # idea - all brands have a colour, non-brands don't menu += brown:protection menu += lightblue:(flaming|freezing|heavy) menu += blue:(venom|draining) menu += cyan:(electrocution|speed|spectral) menu += lightmagenta:(distortion|antimagic) menu += green:vampiric menu += magenta:chaos ## Evocables ## menu += brown:wand of (charming|paralysis|mindburst) menu += black:wand of polymorph menu += white:wand of digging menu += cyan:wand of (acid|light|quicksilver) menu += lightblue:wand of (roots|iceblast|warping) menu += lightgray:wand of flame menu += darkgray:inert menu += lightblue:phial of floods menu += green:Gell's gravitambourine menu += lightblue:lightning rod menu += blue:box of beasts menu += blue:sack of spiders menu += black:phantom mirror menu += cyan:.*tremor.* menu += cyan:condenser vane menu += lightmagenta:horn of Geryon menu += lightgreen:figurine of a ziggurat ## Throwing ## menu += green:(throwing net|curare|dispersal) menu += magenta:datura menu += cyan:silver menu += lightblue:(boomerang|javelin|dart|large rock) menu += lightgray:stone ## Runes/Orb ## menu += lightgreen:rune of Zot menu += white:orb of Zot menu += lightcyan:gem menu += cyan:manual { species_wills = { Spriggan = 7, Felid = 6, ["Purple Draconian"] = 6, Mummy = 5, ["Vine Stalker"] = 5, Coglin = 5, Demigod = 4, ["Mountain Dwarf"] = 4, ["Deep Elf"] = 4, Formicid = 4, Oni = 4, Vampire = 4 } -- All other species are 3 species_holy_vuln = { Demonspawn = true, Ghoul = true, Mummy = true, Vampire = true } -- end species_holy_vuln transform_torm_immune = { death = true, tree = true, wisp = true, shadow = true } -- end transform_torm_immune species_dispellable = { Ghoul = true, Mummy = true } -- end species_dispellable function get_species_will() return species_wills[you.race()] or 3 end -- Calculate the player's exact willpower. None of this "++" business. function you_will() local basewill = you.willpower() * 40 local extra = (get_species_will() * you.xl()) if you.status("weak-willed") then extra = extra / 2 end extra = extra % 40 return math.min(basewill + extra, 200) end function you_not_holy_vuln() return you.transform() ~= death and not species_holy_vuln[you.race()] end function you_torm_immune() return (you.get_base_mutation_level("torment resistance") >= 2 or transform_torm_immune[you.transform()] or you.race() == "Vampire" and you.status("bloodless")) end -- We want torment to do at most 30% of HP (on average) for this criterion function you_torm_resistant() return (you_torm_immune() or you.get_base_mutation_level("torment resistance") >= 1 or you.transform() == "statue" or you.god() == "Kikubaaqudgha" and you.piety_rank() >= 5) end function you_immune_to_calcifying_dust() body_armour = items.equipped_at("Body Armour") return (you.immune_to_hex("Petrify") or you.god() == "Qazlal" or body_armour and body_armour.name():find("robe of Clouds")) end function you_immune_to_poison_paralyse() return you.immune_to_hex("Paralyse") or you.res_poison() == 3 end -- Dispel undead vulnerability is almost the perfect inverse of torm immunity! function you_dispel_immune() return (you.transform() == "tree" or you.transform() == "wisp" or not you_torm_immune()) end function you_miasma_immune() return (you.res_poison() == 3 or you.god() == "Qazlal" or you.get_base_mutation_level("foul stench") >= 1) end -------------- DYNAMIC FORCE MORES -------------- -- Original credit for this idea goes to Ultraviolent4. -- I originally took this from Hordes' rcfile, but I have since -- modified it beyond recognition. Please feel free to copy this if you -- wish into your rcfile, but I would appreciate being given credit for it. function xl_checker(cutoff) return function () return you.xl() >= cutoff end end function hp_checker(cutoff) return function () local hp, maxhp = you.hp() return maxhp > cutoff end end function hex_checker(hex, cutoff) return function () return you.immune_to_hex(hex) or you_will() > cutoff end end function banish_checker(cutoff) return function () return you.xl() >= 23 or you_will() > cutoff end end function shrike_checker(resistance) return function () resist_val = resistance() if resist_val == true then resist_val = 1 elseif resist_val == false then resist_val = 0 end return resist_val >= 1 and hp_checker(160)() and you.xl() >= 23 end end fm_patterns = { -- Enemies whose difficulty generally depends on XL -- Note willpower checks will also be dealt with in willpower section XL5 = { checker = xl_checker(5), pattern = "(adder|gnoll).*into view" }, XL7 = { checker = xl_checker(7), pattern = "orc wizard.*into view" }, XL9 = { checker = xl_checker(9), pattern = "sleepcap.*into view" }, XL11 = { checker = xl_checker(11), pattern = "wielding.*(venom|elec|draining)" }, XL17 = { checker = xl_checker(17), pattern = "(ogre mag|occultist|arcanist|ironbrand|vault|tengu reaver|juggernaut|(fire|frost|stone) giant|ettin|vampire knight).*into view" }, -- Enemies whose difficulty generally depends on maxhp (early game only) ["orc priest"] = { checker = hp_checker(51), pattern = "(centaur|orc priest).*into view" }, ogre = { checker = hp_checker(82), pattern = "(ogre|acid dragon).*into view" }, ["two-headed ogre"] = { checker = hp_checker(110), pattern = "(two-headed ogre|troll|deep elf annihilator|boulder beetle).*into view" }, -- Paralyse - don't force more when immune (except liches) ["orc sorcerer"] = { checker = hex_checker("Paralyse", 135), pattern = "orc sorcerer.*into view" }, ["ogre mage"] = { checker = hex_checker("Paralyse", 139), pattern = "ogre mag.*into view" }, ["vampire knight"] = { checker = hex_checker("Paralyse", 143), pattern = "vampire knight.*into view" }, sphinx = { checker = hex_checker("Paralyse", 154), pattern = "(sphinx|fenstrider witch).*into view" }, -- Petrify - don't force more when immune (except liches) basilisk = { checker = hex_checker("Petrify", 135), pattern = "basilisk.*into view" }, ["calcifying dust"] = { checker = you_immune_to_calcifying_dust, pattern = "calcifying dust hits you" }, -- Golden Eyes - force more only if repeated confusion likely, i.e. < 120 will ["golden eye"] = { checker = hex_checker("Confusion Gaze", 120), pattern = "golden eye.*into view" }, -- Banish - don't force more when XL >= 23 (i.e. banish not a serious threat) ["deep elf sorcerer"] = { checker = banish_checker(150), pattern = "deep elf (sorcerer|demonologist).*into view" }, occultist = { checker = banish_checker(145), pattern = "occultist.*into view" }, -- Sleep - don't force more when immune satyr = { checker = hex_checker("Sleep", 145), pattern = "satyr.*into view" }, ["dream sheep"] = { checker = hex_checker("Sleep", 200), pattern = "dream sheep.*into view" }, -- Mesm/Mark (less important, cutoff here is low% not 0%) ["vault sentinel"] = { checker = hex_checker("Sentinel's Mark", 120), pattern = "vault sentinel.*into view" }, mesmerise = { checker = hex_checker("Mesmerise", 120), pattern = "(siren|avatar|obsidian statue|tainted leviathan).*into view" }, -- Torment and dispel undead torment = { checker = you_torm_immune, pattern = "(curse toe|curse skull|Ice Fiend|tormentor|mummy priest|royal mumm).*into view" }, ["dispel undead"] = { checker = you_dispel_immune, pattern = "(black sun|revenant|ushabti).*into view" }, -- Other special conditions (hornet para, holy wrath, spark wasps, shrikes) ["poison paralyse"] = { checker = you_immune_to_poison_paralyse, pattern = "(hornet|jorogumo|formless jellyf).*into view" }, holy = { checker = you_not_holy_vuln, pattern = "(pearl dragon|ophan|seraph).*come|wielding.*holy" }, ["spark wasp"] = { checker = function () return you.res_shock() >= 1 end, pattern = "(spark wasp|titan).*into view" }, miasma = { checker = you_miasma_immune, pattern = "(death drake|ushabti|putrid mouth).*into view" }, ["caustic shrike"] = { checker = shrike_checker(you.res_corr), pattern = "caustic shrike.*into view" }, ["shard shrike"] = { checker = shrike_checker(you.res_cold), pattern = "shard shrike.*into view" } } -- end fm_patterns NOTIFY_FORCE_MORES = true function init_force_mores() for name, data in pairs(fm_patterns) do data.active = false end end function update_force_mores() local activated = {} local deactivated = {} for name, data in pairs(fm_patterns) do local msg = "(" .. data.pattern .. ")" local should_be_active = not data.checker() local action if data.active ~= should_be_active then if data.active then table.insert(deactivated, name) sign = "-" else table.insert(activated, name) sign = "+" end local opt = "force_more_message " .. sign .. "= " .. msg crawl.setopt(opt) data.active = not data.active end end if #activated > 0 and NOTIFY_FORCE_MORES then crawl.mpr("Activating force_mores: " .. table.concat(activated, ", ")) end if #deactivated > 0 and NOTIFY_FORCE_MORES then crawl.mpr("Deactivating force_mores: " .. table.concat(deactivated, ", ")) end end -------------- DYNAMIC MENU COLOURS -------------- -- Vary the menu colour of some items, whose effectiveness changes according -- to your current stats and equipment. -------------- DYNAMIC MENU COLOURS -------------- -- Vary the menu colour of some items, whose effectiveness changes according -- to your current stats and equipment. function torment_colour_picker() return (you_torm_immune() and "cyan" or you_torm_resistant() and "lightmagenta" or "magenta") end function poison_colour_picker() return you.res_poison() >= 1 and "cyan" or "lightmagenta" end function immolation_colour_picker() return you.res_fire() >= 1 and "lightmagenta" or "magenta" end function curing_colour_picker() return (you.get_base_mutation_level("no potion heal") == 2 and "green" or "lightgreen") end function magic_colour_picker() return (you.spirit_shield() == 1 and "lightgreen" or you.god() == "Trog" and "darkgray" or "cyan") end function mutation_colour_picker() return you.god() == "Zin" and you.piety_rank() == 6 and "cyan" or "magenta" end function pain_colour_picker() return (you.skill("Necromancy") >= 1 + you.xl()/3 and "cyan" or you.skill("Necromancy") >= 1 and "blue" or "lightgray") end function holy_wrath_colour_picker() return you_not_holy_vuln() and "brown" or "lightgray" end mc_patterns = { -- Dangerous scrolls - with the relevant resistance, they become strictly -- positive, or less dangerous, accordingly. torment = { picker = torment_colour_picker, pattern = "scrolls? of torment" }, poison = { picker = poison_colour_picker, pattern = "scrolls? of poison" }, immolation = { picker = immolation_colour_picker, pattern = "scrolls? of immolation" }, -- Potions whose effectiveness may vary curing = { picker = curing_colour_picker, pattern = "potions? of curing" }, magic = { picker = magic_colour_picker, pattern = "potions? of magic" }, mutation = { picker = mutation_colour_picker, pattern = "potions? of mutation" }, -- Weapon brands with special requirements pain = { picker = pain_colour_picker, pattern = "of pain" }, ["holy wrath"] = { picker = holy_wrath_colour_picker, pattern = "of holy wrath" }, } -- end mc_patterns function update_menu_colours() for name, data in pairs(mc_patterns) do local correct_colour = data.picker() if data.colour ~= correct_colour then if data.colour then remove = "menu_colour -= " .. data.colour .. ":" .. data.pattern crawl.setopt(remove) end add = "menu_colour += " .. correct_colour .. ":" .. data.pattern crawl.setopt(add) data.colour = correct_colour end end end -------------- SPECIAL AUTOPICKUP -------------- -- Autopickup aux slots until we have one in the slot (unless useless) -- Turn off autopickup once the player has enough identify scrolls -- to last the rest of the game. add_autopickup_func( function (it, name) if it.is_useless then return end if it.class(true) == "armour" then local slots = { cloak = "Cloak", helmet = "Helmet", gloves = "Gloves", boots = "Boots" } subtyp, _ = it.subtype() if slots[subtyp] and not items.equipped_at(slots[subtyp]) then return true end end end ) -------------- READY -------------- -- The `ready` function runs every time the player sends a command to the -- game. This includes fiddling with menus. We use this last_turn trick -- to prevent updates unless the player actually took an action. last_turn = nil init_force_mores() function ready() if last_turn ~= you.turns() then update_force_mores() update_menu_colours() last_turn = you.turns() end end }