##I found that when exploring manually, i stumble too close to monsters after noticing them, ##so this makes all shift+direction movement "safe" - lets me explore quickly (without having to check if monsters are in sight after every move) by holding down shift use_iso_mode = true #Current implementation uses a workaround, because i couldn't figure out how to bind numpad keys to a command directly (like bindkey = [\{-241}] CMD_SAFE_MOVE_LEFT). equip_unequip = true bindkey = [Q] CMD_MAP_ADD_WAYPOINT # Bind shift-move to safe moving. 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 ##when on laptop comment these in #bindkey = [H] CMD_SAFE_MOVE_UP_LEFT #bindkey = [J] CMD_SAFE_MOVE_UP_RIGHT #bindkey = [h] CMD_MOVE_UP_LEFT #bindkey = [j] CMD_MOVE_UP_RIGHT ##and these out: macros += K \{-241} H macros += K \{-242} J macros += K \{-243} K macros += K \{-240} L macros += K \{-238} Y macros += K \{-235} U macros += K \{-237} B macros += K \{-234} N #macros += K \{-252} h #macros += K \{-253} j #macros += K \{-254} k #macros += K \{-251} l #macros += K \{-1007} y #macros += K \{-1009} u #macros += K \{-1001} b #macros += K \{-1003} n #bind shift+5 to wait 1 turn, not rest. macros += K /5 . #tile_player_tile = playermons note_chat_messages = true automagic_enable = false #fake_lang = jagerkin : if (you.race() == "Centaur") then tile_player_tile = mons:centaur warrior : end wall_jump_move = false # automatically butcher edible corpses upon standing on them auto_butcher = true #:if (you.religion == GOD_FEDHAS) then #auto_butcher = false #: end ##The rest is copied from murphy.rc. With minor tweaks, lines commented out by me ## are marked by "#!". ##### Murphy's Crawl Init file ############################################### #use_animations = false include +=HDAColors.rc include +=SpoilerAlerts.rc include +=HDamage.rc #include +=HDAForceMore.rc #!tile_player_tile = playermons autofight_throw = false auto_switch = true auto_sacrifice = true sacrifice_before_explore = true explore_stop += book autofight_stop = 50 show_more = false warn_hatches = false interrupt_eat = message_colour += mute:(HP|Magic) restored #!show_god_gift = unident auto_exclude +=electric eel auto_exclude +=a web warn_web = true # ---------------------- --------------------------- #shots will stop at the target (like "f.") rather than continuing past autofight_fire_stop = true # don't auto-explore over deep water travel_avoid_terrain = deep water #When resting, if your HP or MP is below this percentage of being full, it will stop resting when this percent of maximum HP or MP is refilled. rest_wait_percent = 100 #auto-explore waits until your HP and MP are both at rest_wait_percent before moving. explore_auto_rest = true # no longer have to turn manual on for every starting character default_manual_training = true #skill_focus = false #never asks if u want to butcher any corpses confirm_butcher = never # show "Cloud" status when in a cloud cloud_status = true #never force capitals on Y/N questions easy_confirm = all # ------------------------ AUTOPICKUP EXCEPTIONS ----------------------------- ae := autopickup_exceptions # inclusions ae += < throwing nets|arrows|stones|sling bullets|bolts|needles|tomahawks| javelins : if (you.race() == "Ogre" or you.race() == "Troll") then ae += scrolls? of (amnesia) #!ae += >ring of (wizardry|positive energy|protection from cold|protection from fire|protection from magic|fire|ice|magical power|stealth|strength|intelligence|dexterity) drop_filter += forbidden, useless, bad_item, dangerous_item # ------------------ CONSTANT ABILITY AND SPELL SLOTS ------------------------ spell_slot ^= Regeneration:r spell_slot ^= Repel Missiles:m spell_slot ^= Blink:B spell_slot ^= Passwall: p item_slot += fruit:e item_slot += bread:e item_slot += meat:e item_slot += scroll of identify:r item_slot += wand of heal wounds:v item_slot += potion of curing:q ai := autoinscribe ai += identify:@r1 ai += remove curse:@r2 ai += scrolls? of teleportation:@r3 ai += scrolls? of blinking:@r4 ai += scrolls? of fear:@r5 ai += scrolls? of fog:@r4 ai += curing:@q1 ai += potions? of heal wounds:@q2 ai += potions? of haste:@q3 ai += potions? of might:@q4 ai += potions? of agility:@q5 ai += wand of heal wounds:@v1 ai += wand of teleportation:@v2 ai += wand of hasting:@v3 ai += wand of digging:@v4 ai += wand of enslavement:@v5 ai += (meat|bread) ration:@e1 ai += (beef jerk|fruit|pizza):@e2 ai += royal jelly:@e3 ############ ## Macros ## ############ #casting spells a-h using F1- F8 macros += M \{-1011} za macros += M \{-1012} zb macros += M \{-1013} zc macros += M \{-1014} zd macros += M \{-1015} ze macros += M \{-1016} zf macros += M \{-1017} zg macros += M \{-1018} zh #using abilities a-d via key 1-4 #macros += M 1 aa #macros += M 2 ab #macros += M 3 ac #macros += M 4 ad # resting and autoexplore with / and enter #macros += M / 5 #macros += M \{13} o #move and take next stairs down using - #macros += M - X>\{13}> #move and pick up next item and try to wear it #macros += M 0 XI\{13},W #macros += M < ===safe_upstairs # -------------------------- FORCE_MORE_MESSAGE ------------------------------ # force "more" when these happen # alias first more := force_more_message more += finished your manual more += Xom is getting BORED more += transformation is almost over more += normal fleshy form # only for manual exploring, otherwise it's too annoying #more += comes? into view # dangerous monsters in sight # corrupters, temporary or permanent more += (giant eyeball|shining eye|cacodemon|neqoxec|corrupter|wretched star).*into view # tormentors more += (curse toe|curse skull|fiend|tzitzimitl|tormentor|mummy priest|greater mummy).*into view # damnators more += (deep elf high priest|deep elf sorcerer|draconian scorcher|draconian zealot|hell sentinel|hellion).*into view # summoners and displacers more += (deep elf demonologist|doom hound|draconian shifter|guardian serpent|ironbrand convoker|shadow demon).*into view # just plain strong more += (ancient lich|caustic shrike|iron giant|juggernaut|orb of fire).*into view # nasty statuses more += (ancient zyme|death cob|death drake|entropy weaver|flayed ghost|ghost moth|moth of wrath|floating eye|starcursed mass|vault warden|warmonger).*into view # uniques or pan lords, also Killer Klown, Orb Guardian and some others more += (?-i:[A-Z]).* comes? into view # dispel undead : if (you.race() == "Mummy" or you.race() == "Ghoul" or you.race() == "Vampire") then more += (anubis guard|revenant).*into view : end # distortion weapons more += Space warps horribly around you more += Space bends around you more += hits you.*distortion more += warns you.*of distortion more += is wielding.*of distortion # holy wrath weapons : if (you.race() == "Mummy" or you.race() == "Ghoul" or you.race() == "Vampire") then more += hits you.*holy wrath more += warns you.*of holy wrath more += is wielding.*of holy wrath : end # invisible ghost moth more += watched by something # hit by Airstrike while flying more += The air twists around and violently strikes you in flight # ironbrand convoker's delayed summon more += begins to recite a word of recall # teleported onto exact same tile more += Your surroundings flicker # manual gone more += You have finished your manual # miscast more += You miscast # transmutation spell starts to run out more += Your transformation is almost over # bad mutations! (some will have the same text for multiple levels) # berserk more += You feel a little pissed off more += You feel angry more += You feel extremely angry at everything! # blurry vision more += Your vision blurs # teleportitis more += You feel weirdly uncertain more += You feel even more weirdly uncertain # deformed body more += Your body twists and deforms # frail more += You feel frail # --spell power +wiz more += Your connection to magic feels subdued more += Your connection to magic feels more subdued more += Your connection to magic feels nearly dormant # -wiz ++spell power more += You feel less in control of your magic more += You feel your magical power running wild # no device heal (only lvl 2-3) more += Your system mostly rejects artificial healing more += Your system completely rejects artificial healing # low regen (only lvl 3) - text changed in trunk on 19th Sep '16 more += Your regeneration stops completely # hit by a catopblepas' petrifying cloud more += The blast of calcifying dust hits you # petrification setting in more += You are slowing down # Fainting level of hunger, this is for hungry ghosts more += You are fainting from starvation # entering a rune level in Pandemonium more += The mighty Pandemonium lord .* resides here # entering holy Pan more += The tension of great conflict fills the air! # volcano about to erupt more += The air gets thick with the scent of sulphur ########### ### Lua ### ########### ------------------------------------------------------------------- - For players who are prone to leave labyrinths without picking up the -loot, here is a way to avoid that: put the following snippet in your -options file (init.txt or .crawlrc) and then macro the '<' key to - ===safe_upstairs (do it in-game by pressing '~' or Ctrl-D). { function safe_upstairs() if you.branch() == "Lab" then crawl.formatted_mpr("Really leave this labyrinth?", "prompt") local res = crawl.getch() if string.lower(string.char(res)) == "y" then crawl.sendkeys("<") end else crawl.sendkeys("<") 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 --------------------------------------- ---- Begin conditional force_mores ---- --------------------------------------- last_turn = you.turns() -- Conditions are in the fm_patterns array. For now only one condition -- per monster is allowed until (if) I get better at lua to modify -- the script further. Each array entry works as follows: -- pattern = monster name -- cond = attribute to check; behaviour is defined later on -- cutoff = if attribute's value is equal or higher, don't force more for these -- name = an identifier for the entry in the array fm_patterns = { -- early threats {pattern = "adder|gnoll", cond = "xl", cutoff = 5, name = "XL5"}, -- early poisonous threats -- {pattern = "worker ant|scorpion", cond = "xl", cutoff = 7, name = "XL7"), -- the frog of doom and a merry lizard {pattern = "spiny frog|komodo dragon", cond = "xl", cutoff = 12, name = "XL12"}, -- biggest lair threats {pattern = "death yak|dire elephant|black mamba|wolf spider|hydra", cond = "xl", cutoff = 15, name = "XL15"}, -- biggest orc threat {pattern = "orc warlord", cond = "xl", cutoff = 17, name = "XL17"}, -- no rF {pattern = "fire giant|balrug", cond = "rf", cutoff = 1, name = "rF1"}, -- no rC {pattern = "ice giant|white draconian|blizzard demon|azure jelly", cond = "rc", cutoff = 1, name = "rC1"}, -- no rElec {pattern = "spark wasp|titan", cond = "relec", cutoff = 1, name = "rE1"}, -- no rPois {pattern = "swamp drake|swamp dragon|green draconian|golden dragon", cond = "rpois", cutoff = 1, name = "rP1"}, -- no rCorr (boolean) {pattern = "rust devil|acid blob", cond = "rcorr", cutoff = 999, name = "rA1"}, -- low MR (MR not directly exposed to clua yet) -- {pattern = "basilisk|deep elf archer|bog body|faun|ogre mag", cond = "mr", cutoff = 40, name = "MR1"}, -- {pattern = "orc sorcerer|siren|satyr|great orb of eyes", cond = "mr", cutoff = 80, name = "MR2"}, -- {pattern = "merfolk avatar|vault sentinel|vampire knight|golden eye|wizard|sphinx", cond = "mr", cutoff = 120, name = "MR3"}, -- no rN {pattern = "deep elf death mag|eidolon", cond = "rn", cutoff = 1, name = "rN1"}, -- airstrike (boolean) {pattern = "wind drake|spriggan air mag", cond = "fly", cutoff = 999, name = "fly"}, -- HP {pattern = "annihilator", cond = "mhp", cutoff = 120, name = "HP3"} } -- end fm_patterns active_fm = {} -- Set to true to get a message when the fm change notify_fm = false 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 = "(" .. v.pattern .. ").*into view" local action = nil local fm_name = v.pattern if v.name then fm_name = v.name end if not v.cond and not active_fm[i] then action = "+" elseif v.cond == "xl" then if active_fm[i] and you.xl() >= v.cutoff then action = "-" elseif not active_fm[i] and you.xl() < v.cutoff then action = "+" end elseif v.cond == "rf" then if active_fm[i] and you.res_fire() >= v.cutoff then action = "-" elseif not active_fm[i] and you.res_fire() < v.cutoff then action = "+" end elseif v.cond == "rc" then if active_fm[i] and you.res_cold() >= v.cutoff then action = "-" elseif not active_fm[i] and you.res_cold() < v.cutoff then action = "+" end elseif v.cond == "relec" then if active_fm[i] and you.res_shock() >= v.cutoff then action = "-" elseif not active_fm[i] and you.res_shock() < v.cutoff then action = "+" end elseif v.cond == "rpois" then if active_fm[i] and you.res_poison() >= v.cutoff then action = "-" elseif not active_fm[i] and you.res_poison() < v.cutoff then action = "+" end elseif v.cond == "rcorr" then if active_fm[i] and you.res_corr() then action = "-" elseif not active_fm[i] and not you.res_corr() then action = "+" end elseif v.cond == "rn" then if active_fm[i] and you.res_draining() >= v.cutoff then action = "-" elseif not active_fm[i] and you.res_draining() < v.cutoff then action = "+" end elseif v.cond == "fly" then if active_fm[i] and not you.flying() then action = "-" elseif not active_fm[i] and you.flying() then action = "+" end elseif v.cond == "mhp" 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 ---- ------------------------- local need_skills_opened = true function ready() -- Dynamic force-mores. force_mores() --Y/N *before* entering a command, whenever you are petrifying. if you.petrifying() then if not crawl.yesno("You are petrifying!!! Press Y to continue entering your action.") then crawl.sendkeys("h") end end -- To automatically open the skill menu when starting a new game. if you.turns() == 0 and need_skills_opened then need_skills_opened = false crawl.sendkeys("m") end end }