##### 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
#tile_player_tile = tile:felid_3
equip_unequip = true
tile_show_player_species = false
item_slot ^= identify:i
item_slot ^= blinking:k
item_slot ^= teleportation:t
ai += scrolls? of teleportation:@r4
tile_show_threat_levels
show_travel_trail = true
tile_full_screen = true
easy_eat_chunks = true
auto_eat_chunks = true
auto_butcher = true
item_slot += potion of blood:q
item_slot += chunk of flesh:e
travel_open_doors = true
default_manual_training = true
autofight_stop = 74
need_skills_open = true
message_colour = cyan:hits
message_colour += purple:hits you
view_delay = 900
explore delay = 20
travel_delay = -1
show_more = false
<
---------------------------
---- Begin RandomTiles ----
---------------------------
-- See README.md for documentation.
-- RandomTile options
-- If you set randtile_options elsewhere in your rc, we don't override it.
if not randtile_options then
randtile_options = {
-- Change the tile every N turns
turns_change = 50,
-- Which setting for tile_player_tile to use when disabling RandomTiles
-- with toggle_random_tile(). Can set to e.g. "normal", "playermons",
-- or a fixed mons/tile.
disabled_setting = "tile:felid_3",
-- If true, print the what tile we're changing to as if it were a
-- god message from our current god or the default_god below when we
-- have no god. If false, print a more generic message.
god_message = true,
default_god = "You",
-- Cute speech string templates. In these %g is replaced with the
-- god name, %am with the monster's name with an article, and %m
-- with the monster's name without an article.
god_speech = {["You"] = "%g become %am!",
-- Used when the god has no entry
["default"] = "%g says: Become %am!",
["Sif Muna"] = "%g whispers: Become %am.",
["Trog"] = "%g roars: Now %m!!!",
["Xom"] = "%g titters: I'd like %am!",
["Nemelex Xobeh"] = "%g says: Let's draw a card...%m!"},
-- Colour of tile change message.
message_colour = "lightblue" }
end
-- player_tiles defines the default array of player tiles from which
-- RandomTiles chooses. New tiles entries can be added anywhere in this array,
-- and lines can be removed or comment out to disable a tile, but remember that
-- a comma must come after each entry. Each entry must have at minimum a `mons'
-- field defined with a name for the entry. The actual tile to use can come
-- from this `mons' field or either of the optional fields `tile' and
-- `tileset', which are described later. If neither `tile' nor `tileset' are
-- defined, then `mons' must be the monster name as seen under xv in-game (and
-- as defined in the source file mon-data.h). For example, the entry:
--
-- {mons = "hell sentinel"},
--
-- is equivalent to the rc option:
--
-- tile_player_tile = mons:hell sentinel
--
-- If the `mons' field isn't the monster's name, either because you've renamed
-- it or because the corresponding monster doesn't exist, set the `tile' field
-- to the tile's full name. The player_name_pairs[] array in the source file
-- rltiles/tiledef-player.cc defines these names for all player tiles, and only
-- tiles defined in this file can be used. These are the tiles you see in
-- crawl's tilesheet file player.png.
--
-- For example, the following entry:
--
-- {mons = "a Zot statue", tile = "mons_zot_statue"},
--
-- is equivalent to the rc option:
--
-- tile_player_tile = tile:mons_zot_statue
--
-- For monsters like butterflies that have variant tiles, you can set the field
-- `num_var' to the number of variants in order to use them. The array
-- _tile_player_count[] in rltiles/tiledef-player.cc defines how many variants
-- exist for each tile, but it's easier to look in the folders under
-- rltiles/mon where the individual tile images are and see how many variants a
-- tile has. Since rltiles/mon/animals has butterfly.png through
-- butterfly10.png, which means 11 variants, the entry is:
--
-- {mons = "butterfly", tile = "mons_butterfly", num_var=11},
--
-- By default RandomTiles chooses a new variant with each UI action (i.e. any
-- keystroke that's not in a menu or prompt), even if the player's turn
-- didn't change. Set the field `var_type' to "fixed", "sequence", or
-- "oscillate" to change this behavior. With "fixed" a single variant is
-- chosen when the entry is chosen, and with "sequence" and "oscillate",
-- variants are progressed through in order (sequence) or forward-reverse
-- order (oscillate) with each UI action.
--
-- You can define a custom set of variants for use in an entry using the
-- `tileset' field. For example, here's an entry for the Serpent of Hell that
-- randomly chooses a Hell variant with every UI action:
--
-- {mons = "The Serpent of Hell",
-- tileset = {"mons_serpent_of_hell_tartarus",
-- "mons_serpent_of_hell_cocytus",
-- "mons_serpent_of_hell_dis",
-- "mons_serpent_of_hell_gehenna"}},
--
-- Custom tilesets can use any of the `var_type' values described above.
--
-- When the `tileset' field is used, there are special `var_type' values of
-- "terrain", "status", "percent_hp", and "xl" available, which will change
-- the tile based on a condition. To use one of these, make the
-- tileset field into an an array of arrays, with the first entry in the
-- inner array giving the condition value and the second giving the
-- corresponding tile applied under that condition. The first entry in
-- `tileset' must have an inner array value of "default" for when no other
-- entry matches.
--
-- For numeric `var_type' values like "percent_hp" and "xl", the first
-- condition value for each non-default entries must be a number, and the
-- tile of an entry is used if the player's current value is in less than or
-- equal to the entry's condition value and greater than any other
-- non-default entry in the tileset. For string values like "terrain" and
-- "status", the first condition value will be a string that is matched
-- against the player's current value. For "status", multiple status values
-- can be active for the player, so we always use the first matching entry,
-- and they should be listed in tileset in order of preference.
--
-- See the entry for Ilsiuw to see a var_type example of "terrain", and the
-- entry for Bai Suzhen to see an example of "percent_hp". Here is an
-- example entry using a var_type of "status" that will use the Purgy tile
-- normally, the Snorg tile when berserking, and the torpor snail tile when
-- slowed (but not fast+slow):
--
-- {mons = "Snorgy Snail", tileset = {{"default", "mons_purgy"},
-- {"berserk", "mons_snorg"},
-- -- entry below matches fast and fast+slow
-- {"fast", "mons_purgy"},
-- {"slow", "mons_torpor_snail"}},
-- var_type = "status"},
--
-- The status names can be seen under the @ listing on the % screen, and
-- these are the short_text values from the duration_data[] array defined in
-- the source file duration-data.h. String value conditions are matched as
-- lua patterns, so substring matches and wildcards will work; see the lua
-- reference for details: http://www.lua.org/pil/20.2.html
--
-- begin player_tiles array
if not player_tiles then
player_tiles = {
{mons = "acid blob"},
{mons = "acid dragon"},
{mons = "adder"},
{mons = "Agnes"},
{mons = "air elemental"},
{mons = "Aizul"},
{mons = "alligator"},
{mons = "alligator snapping turtle"},
{mons = "ancient champion"},
{mons = "angel"},
{mons = "Antaeus"},
{mons = "ancient lich"},
{mons = "ancient zyme"},
{mons = "apis"},
{mons = "apocalypse crab"},
{mons = "Arachne", tile = "mons_arachne_staveless"},
{mons = "Asmodeus"},
{mons = "Asterion"},
{mons = "Azrael"},
{mons = "azure jelly"},
{mons = "anaconda", weapon_offsets = "0,0", shield_offsets = "-2,5"},
{mons = "Bai Suzhen", tileset = {
{"default", "mons_bai_suzhen"},
{0.5, "mons_bai_suzhen_dragon"}},
var_type = "percent_hp"},
{mons = "ball lightning"},
{mons = "ball python"},
{mons = "ballistomycete", max_version = 0.23,
tileset = {"mons_ballistomycete_inactive",
"mons_hyperactive_ballistomycete"}, var_type = "sequence"},
{mons = "ballistomycete", min_version = 0.24},
{mons = "ballistomycete spore"},
{mons = "balrug"},
{mons = "bat"},
{mons = "battlemage"},
{mons = "battlesphere"},
{mons = "basilisk"},
{mons = "bennu"},
{mons = "big kobold"},
{mons = "black bear"},
{mons = "black draconian"},
{mons = "black mamba"},
{mons = "blink frog", weapon_offsets = "5,-3", shield_offsets = "0,0"},
{mons = "blizzard demon"},
{mons = "block of ice", tile = "mons_block_of_ice", num_var = 2,
var_type="fixed"},
{mons = "Blork the orc"},
{mons = "bog body"},
{mons = "boggart"},
{mons = "bone dragon"},
{mons = "Boris"},
{mons = "briar patch"},
{mons = "brimstone fiend"},
{mons = "bullfrog"},
{mons = "burning bush"},
{mons = "bush", tile = "mons_bush", num_var = 4, var_type = "fixed"},
{mons = "butterfly", tile = "mons_butterfly", num_var = 11},
{mons = "cacodemon", weapon_offsets = "3,0", shield_offsets = "0,0"},
{mons = "catoblepas"},
{mons = "caustic shrike", weapon_offsets = "-3,0",
shield_offsets = "0,0"},
{mons = "centaur"},
{mons = "centaur warrior"},
{mons = "Cerebov"},
{mons = "chaos spawn", tile = "mons_chaos_spawn", num_var = 5},
{mons = "cherub"},
{mons = "Chuck"},
{mons = "Cigotuvi's monster", tile = "mons_cigotuvis_monster"},
{mons = "Cloud Mage"},
{mons = "crawling corpse"},
{mons = "Crazy Yiuf"},
{mons = "crocodile"},
{mons = "crystal guardian"},
{mons = "crimson imp"},
{mons = "curse skull"},
{mons = "curse toe"},
{mons = "cyclops"},
{mons = "daeva"},
{mons = "dart slug"},
{mons = "death drake"},
{mons = "death knight"},
{mons = "death ooze"},
{mons = "death scarab", weapon_offsets = "-2,0",
shield_offsets = "-12,0"},
{mons = "death yak", weapon_offsets = "-4,0", shield_offsets = "-2,0"},
{mons = "deep elf archer"},
{mons = "deep elf annihilator"},
{mons = "deep elf blademaster"},
{mons = "deep elf death mage"},
{mons = "deep elf demonologist"},
{mons = "deep elf elementalist"},
{mons = "deep elf high priest"},
{mons = "deep elf knight"},
{mons = "deep elf mage"},
{mons = "deep elf master archer"},
{mons = "deep elf sorcerer"},
{mons = "deep dwarf"},
{mons = "deep troll"},
{mons = "deep troll earth mage", weapon_offsets = "-3,6",
shield_offsets = "0,0"},
{mons = "deep troll monk ghost", tile = "mons_faint_deep_troll_monk"},
{mons = "deep troll shaman", weapon_offsets = "-3,6",
shield_offsets = "0,0"},
{mons = "deathcap"},
{mons = "death cob"},
{mons = "deformed elf", tile = "mons_deformed_elf"},
{mons = "deformed human", tile = "mons_deformed_human"},
{mons = "deformed orc", tile = "mons_deformed_orc"},
{mons = "demigod"},
{mons = "demonic crawler"},
{mons = "demonic plant", tile = "mons_demonic_plant"},
{mons = "demonspawn"},
{mons = "demonspawn monk ghost", tile = "mons_faint_demonspawn_monk"},
{mons = "diamond obelisk"},
{mons = "dimme", tile = "mons_dimme"},
{mons = "dire elephant", weapon_offsets = "-2,3",
shield_offsets = "0,0"},
{mons = "Dispater"},
{mons = "Dissolution"},
{mons = "doom hound"},
{mons = "Donald"},
{mons = "Dowan", tile = "mons_dowan", num_var = 2,
var_type = "sequence"},
{mons = "draconian", tile = "draco_base"},
{mons = "draconian monk ghost", tile = "mons_faint_grey_draconian_monk"},
{mons = "dream sheep"},
{mons = "drowned soul"},
{mons = "dryad"},
{mons = "Duvessa", tile = "mons_duvessa", num_var = 2,
var_type = "sequence"},
{mons = "dwarf"},
{mons = "Edmund"},
{mons = "earth elemental"},
{mons = "efreet"},
{mons = "electric eel"},
{mons = "electric golem"},
{mons = "Eustachio"},
{mons = "eidolon"},
{mons = "eldritch tentacle", tile = "mons_eldritch_tentacle_portal_9"},
{mons = "elemental wellspring"},
{mons = "elephant", weapon_offsets = "-2,3", shield_offsets = "0,0"},
{mons = "elf"},
{mons = "emperor scorpion"},
{mons = "the Enchantress"},
{mons = "entropy weaver"},
{mons = "Ereshkigal", weapon_offsets = "0,-20", shield_offsets = "2,-8"},
{mons = "Erica"},
{mons = "Erolcha"},
{mons = "ettin"},
{mons = "eye of devastation"},
{mons = "eye of draining"},
{mons = "executioner"},
{mons = "Fannar"},
{mons = "faun"},
{mons = "felid", tile = "felid", num_var = 10, var_type = "fixed"},
{mons = "fire bat"},
{mons = "fire crab"},
{mons = "fire dragon"},
{mons = "fire elemental"},
{mons = "fire giant"},
{mons = "fire vortex", tile = "mons_fire_vortex", num_var = 4,
var_type = "sequence"},
{mons = "flayed ghost"},
{mons = "flesh golem", tile = "mons_flesh_golem"},
{mons = "floating eye"},
{mons = "flying skull"},
{mons = "formicid"},
{mons = "Frances"},
{mons = "Frederick"},
{mons = "freezing wraith"},
{mons = "frilled lizard"},
{mons = "frost giant"},
{mons = "fulminant prism", tile = "mons_fulminant_prism", num_var = 4,
var_type = "sequence"},
{mons = "fungus", tile = "mons_fungus", num_var = 9, var_type = "fixed"},
{mons = "gargoyle"},
{mons = "Gastronok"},
{mons = "Geryon"},
{mons = "ghost", tile = "mons_player_ghost"},
{mons = "ghost crab"},
{mons = "ghost moth"},
{mons = "ghoul"},
{mons = "THE GIAGGOSTUONO", tile = "mons_giaggostuono"},
{mons = "giant cockroach"},
{mons = "gigabat", tile = "mons_gigabat"},
{mons = "Gloorx Vloq"},
{mons = "glowing orange brain"},
{mons = "gnoll"},
{mons = "gnoll sergeant"},
{mons = "gnoll shaman"},
{mons = "goblin"},
{mons = "golden dragon"},
{mons = "golden eye"},
{mons = "great orb of eyes"},
{mons = "greater mummy"},
{mons = "green death"},
{mons = "green draconian"},
{mons = "grey draconian"},
{mons = "Grinder"},
{mons = "Grum"},
{mons = "guardian golem"},
{mons = "guardian mummy"},
{mons = "guardian serpent"},
{mons = "halazid warlock"},
{mons = "halfling"},
{mons = "Harold"},
{mons = "harpy"},
{mons = "Hellbinder"},
{mons = "hellephant"},
{mons = "hellion"},
{mons = "hellwing"},
{mons = "hell beast"},
{mons = "hell hog"},
{mons = "hell hound"},
{mons = "hell knight"},
{mons = "hell rat"},
{mons = "hell sentinel"},
{mons = "hell wizard",
tileset = {"mons_hell_wizard_1",
"mons_hell_wizard_2",
"mons_hell_wizard_3"},
var_type = "oscillate"},
{mons = "hexer"},
{mons = "hippogriff"},
{mons = "hobgoblin"},
{mons = "hog"},
{mons = "holy swine"},
{mons = "hornet"},
{mons = "hound"},
{mons = "howler monkey"},
{mons = "human"},
{mons = "hungry ghost"},
{mons = "hydra", tile = "mons_hydra", num_var = 5, var_type = "oscillate"},
{mons = "ice beast"},
{mons = "ice fiend"},
{mons = "ice devil"},
{mons = "ice dragon"},
{mons = "ice statue"},
{mons = "iguana"},
{mons = "Ignacio"},
{mons = "Ijyb"},
{mons = "Ilsuiw", tileset = {
{"default", "mons_ilsuiw"},
{"water", "mons_ilsuiw_water"}},
var_type = "terrain"},
{mons = "imperial myrmidon"},
{mons = "insubstantial wisp"},
{mons = "ironbrand convoker"},
{mons = "ironheart preserver"},
{mons = "iron dragon"},
{mons = "iron elemental"},
{mons = "iron giant"},
{mons = "iron golem"},
{mons = "iron imp"},
{mons = "iron troll", weapon_offsets = "-3,6", shield_offsets = "0,0"},
{mons = "jackal"},
{mons = "jelly"},
{mons = "Jessica"},
{mons = "jiangshi", weapon_offsets = "1,3", shield_offsets = "2,2"},
{mons = "Jorgrun"},
{mons = "Jörmungandr", tile = "mons_jormungandr"},
{mons = "Jory"},
{mons = "Joseph"},
{mons = "Josephine"},
{mons = "juggernaut"},
{mons = "jumping spider"},
{mons = "Khufu"},
{mons = "killer bee"},
{mons = "killer klown", tile = "mons_killer_klown", num_var = 5},
{mons = "Kirke"},
{mons = "knight"},
{mons = "kobold"},
{mons = "kobold demonologist"},
{mons = "komodo dragon"},
{mons = "kraken"},
{mons = "Lamia", tile = "mons_lamia"},
{mons = "large abomination", tile = "mons_abomination_large",
num_var = 7, var_type = "fixed"},
{mons = "lava snake", weapon_offsets = "0,0", shield_offsets = "-10,4"},
{mons = "leopard gecko"},
{mons = "Lernaean Hydra", tile = "mons_lernaean_hydra",
var_type = "oscillate", num_var = 10},
{mons = "lich"},
{mons = "lightning spire"},
{mons = "lindwurm", weapon_offsets = "-3,-2", shield_offsets = "0,0"},
{mons = "Lom Lobon"},
{mons = "lorocyproca"},
{mons = "lost soul"},
{mons = "Louise"},
{mons = "lurking horror"},
{mons = "macabre mass"},
{mons = "mana viper", weapon_offsets = "8,0", shield_offsets = "-2,2"},
{mons = "manticore"},
{mons = "Mara"},
{mons = "Margery"},
{mons = "Maud", tile = "mons_maud"},
{mons = "Maurice"},
{mons = "meliai"},
{mons = "Menkaure"},
{mons = "Mennas"},
{mons = "merfolk", tileset = {
{"default", "mons_merfolk"},
{"water", "mons_merfolk_water"}},
var_type = "terrain"},
{mons = "merfolk aquamancer", tileset = {
{"default", "mons_merfolk_aquamancer"},
{"water", "mons_merfolk_aquamancer_water"}},
var_type = "terrain"},
{mons = "merfolk avatar", tileset = {
{"default", "mons_merfolk_avatar"},
{"water", "mons_merfolk_avatar_water"}},
var_type = "terrain"},
{mons = "merfolk impaler",
tileset = {
{"default", "mons_merfolk_impaler"},
{"water", "mons_merfolk_impaler_water"}},
var_type = "terrain"},
{mons = "merfolk javelineer",
tileset = {
{"default", "mons_merfolk_javelineer"},
{"water", "mons_merfolk_javelineer_water"}},
var_type = "terrain"},
{mons = "merfolk siren", tileset = {
{"default", "mons_merfolk_siren"},
{"water", "mons_merfolk_siren_water"}},
var_type = "terrain"},
{mons = "minotaur"},
{mons = "Mnoleg"},
{mons = "molten gargoyle"},
{mons = "moon troll", weapon_offsets = "-3,6", shield_offsets = "0,0"},
{mons = "moth of wrath"},
{mons = "mummy"},
{mons = "mummy priest"},
{mons = "Murray"},
{mons = "mutant beast", tile = "mutant_beast_base", num_var = 5,
var_type = "oscillate"},
{mons = "mutant fire beast", tile = "mutant_beast_fire", num_var = 5,
var_type = "oscillate"},
{mons = "naga"},
{mons = "nagaraja"},
{mons = "naga mage"},
{mons = "naga ritualist"},
{mons = "naga sharpshooter"},
{mons = "naga warrior"},
{mons = "Natasha"},
{mons = "necromancer"},
{mons = "necrophage"},
{mons = "Nellie"},
{mons = "neqoxec"},
{mons = "Nergalle"},
{mons = "Nessos"},
{mons = "Nikola"},
{mons = "obsidian statue"},
{mons = "octopode"},
{mons = "ogre"},
{mons = "ogre mage"},
{mons = "oklob plant"},
{mons = "oklob sapling"},
{mons = "ooze"},
{mons = "ophan"},
{mons = "orange crystal statue"},
{mons = "orange demon"},
{mons = "orb fetus", tile = "mons_orb_guardian_fetus"},
{mons = "orb guardian"},
{mons = "orb of destruction", tile = "mons_orb_of_destruction",
num_var = 3, var_type = "sequence"},
{mons = "orb of electricity", tile = "mons_orb_of_electricity"},
{mons = "orb of fire"},
{mons = "orb of ice", tile = "mons_orb_of_ice"},
{mons = "orb spider"},
{mons = "orc"},
{mons = "orc high priest"},
{mons = "orc knight"},
{mons = "orc priest"},
{mons = "orc sorcerer"},
{mons = "orc warlord"},
{mons = "orc warrior"},
{mons = "orc wizard"},
{mons = "master elementalist", tile = "mons_master_elementalist"},
{mons = "pale draconian"},
{mons = "pandemonium lord"},
{mons = "peacekeeper"},
{mons = "pearl dragon"},
{mons = "phantasmal warrior"},
{mons = "phantom"},
{mons = "phase bat", tile = "mons_phase_bat"},
{mons = "Pikel"},
{mons = "pillar of salt", weapon_offsets = "3,0",
shield_offsets = "0,0"},
{mons = "plant"},
{mons = "polar bear"},
{mons = "porcupine"},
{mons = "Polyphemus"},
{mons = "Prince Ribbit", weapon_offsets = "5,-3",
shield_offsets = "0,0"},
{mons = "profane servitor"},
{mons = "Psyche"},
{mons = "Purgy"},
{mons = "purple draconian"},
{mons = "quasit"},
{mons = "queen ant"},
{mons = "queen bee"},
{mons = "quicksilver dragon"},
{mons = "quokka"},
{mons = "ragged hierophant"},
{mons = "raiju"},
{mons = "rakshasa"},
{mons = "rat"},
{mons = "reaper"},
{mons = "redback"},
{mons = "red devil"},
{mons = "red draconian"},
{mons = "revenant"},
{mons = "rime drake"},
{mons = "river rat"},
{mons = "Robin"},
{mons = "Roxanne"},
{mons = "the Royal Jelly"},
{mons = "Rupert"},
{mons = "rust devil"},
{mons = "Saint Roka"},
{mons = "salamander"},
{mons = "salamander mystic"},
{mons = "saltling"},
{mons = "satyr"},
{mons = "scorpion"},
{mons = "sea snake", weapon_offsets = "-4,5", shield_offsets = "-4,4"},
{mons = "seraph"},
{mons = "The Serpent of Hell", tileset = {
"mons_serpent_of_hell_tartarus",
"mons_serpent_of_hell_cocytus",
"mons_serpent_of_hell_dis",
"mons_serpent_of_hell_gehenna"}},
{mons = "servant of whispers"},
{mons = "shadow"},
{mons = "shadow demon"},
{mons = "shadow dragon"},
{mons = "shadow imp"},
{mons = "shadow wraith"},
{mons = "shambling mangrove"},
{mons = "shapeshifter", tileset = {
"mons_glowing_shapeshifter",
"mons_shapeshifter"},
var_type="sequence"},
{mons = "shard shrike", weapon_offsets = "8,0", shield_offsets = "0,0"},
{mons = "shining eye"},
{mons = "shock serpent", weapon_offsets = "3,0",
shield_offsets = "-2,3"},
{mons = "Sigmund"},
{mons = "silent spectre"},
{mons = "sixfirhy"},
{mons = "skeletal warrior"},
{mons = "sky beast"},
{mons = "slave"},
{mons = "slime creature", num_var = 5, var_type = "oscillate",
tile = "mons_slime_creature"},
{mons = "small abomination"},
{mons = "smoke demon"},
{mons = "snapping turtle", tileset = {
"mons_snapping_turtle",
"mons_alligator_snapping_turtle"},
var_type="sequence"},
{mons = "Snorg"},
{mons = "soldier ant"},
{mons = "Sojobo"},
{mons = "Sonja"},
{mons = "soul eater"},
{mons = "spark wasp"},
{mons = "spatial maelstrom", tile = "mons_spatial_maelstrom",
num_var = 4, var_type = "sequence"},
{mons = "spatial vortex", tile = "mons_spatial_vortex", num_var = 4,
var_type = "sequence"},
{mons = "spellforged servitor"},
{mons = "sphinx"},
{mons = "spiny frog", weapon_offsets = "5,-3", shield_offsets = "0,0"},
{mons = "spooky ghost", tile = "mons_ghost"},
{mons = "spriggan"},
{mons = "spriggan air mage"},
{mons = "spriggan berserker"},
{mons = "spriggan defender"},
{mons = "spriggan druid"},
{mons = "spriggan rider"},
{mons = "steam dragon"},
{mons = "stone giant"},
{mons = "storm dragon"},
{mons = "sun demon"},
{mons = "starcursed mass"},
{mons = "swamp dragon"},
{mons = "swamp drake"},
{mons = "swamp worm"},
{mons = "tarantella"},
{mons = "tengu"},
{mons = "tengu conjurer"},
{mons = "tengu reaver"},
{mons = "tengu warrior"},
{mons = "tentacled monstrosity"},
{mons = "tentacled starspawn"},
{mons = "Terence"},
{mons = "test spawner"},
{mons = "thorn hunter"},
{mons = "thrashing horror"},
{mons = "Tiamat", tile = "mons_tiamat", num_var = 9},
{mons = "titan"},
{mons = "toadstool", tile = "mons_toadstool", num_var = 2,
var_type = "fixed"},
{mons = "toenail golem"},
{mons = "tormentor"},
{mons = "torpor snail", weapon_offsets = "9,-2", shield_offsets = "0,0"},
{mons = "training dummy"},
{mons = "tree", tile = "tran_tree"},
{mons = "troll"},
{mons = "twister", tile = "mons_twister", num_var = 4,
var_type = "sequence"},
{mons = "two-headed ogre"},
{mons = "tyrant leech"},
{mons = "tzitzimitl"},
{mons = "ufetubus"},
{mons = "ugly thing", tile = "mons_ugly_thing", num_var = 6},
{mons = "unseen horror"},
{mons = "the Unspeakable", tile = "mons_unspeakable"},
{mons = "Urug"},
{mons = "ushabti"},
{mons = "vampire"},
{mons = "vampire bat"},
{mons = "vampire knight"},
{mons = "vampire mage"},
{mons = "vampire mosquito"},
{mons = "Vashnia"},
{mons = "vault guard"},
{mons = "vault sentinel"},
{mons = "vault warden"},
{mons = "very ugly thing", tile = "mons_very_ugly_thing", num_var = 6},
{mons = "vine stalker"},
{mons = "wandering mushroom"},
{mons = "war gargoyle"},
{mons = "water elemental"},
{mons = "water moccasin"},
{mons = "water nymph"},
{mons = "warg"},
{mons = "white draconian"},
{mons = "white imp"},
{mons = "wind drake"},
{mons = "wight"},
{mons = "Wiglaf", tile = "mons_wiglaf"},
{mons = "withered plant", tile = "mons_withered_plant"},
{mons = "wizard"},
{mons = "wolf"},
{mons = "wolf spider"},
{mons = "worker ant"},
{mons = "worldbinder"},
{mons = "worm"},
{mons = "wretched star"},
{mons = "wraith"},
{mons = "wyvern"},
{mons = "XTAHUA"},
{mons = "yak", weapon_offsets = "-4,0", shield_offsets = "-2,0"},
{mons = "yaktaur"},
{mons = "yaktaur captain"},
{mons = "yellow draconian"},
{mons = "ynoxinul"},
{mons = "Zonguldrok", tile = "mons_zonguldrok_lich"},
{mons = "a Zot statue", tile = "mons_zot_statue"},
} -- end player_tiles array
end
-- Note: No further configuration past this point.
-- A list of tiles that are valid and compatible with our version.
valid_tiles = {}
rtdat = nil
-- 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 .. "" .. color .. ">")
end
end
-- Populate valid_tiles
function init_random_tiles(tiles)
local version = tonumber(crawl.version("major"))
for i,v in ipairs(player_tiles) do
if v.mons
and (not v.min_version or version >= tonumber(v.min_version))
and (not v.max_version or version <= tonumber(v.max_version)) then
valid_tiles[#valid_tiles + 1] = v
end
end
-- state data
local default_state = {index = 1 + crawl.random2(#valid_tiles),
last_index_change = you.turns(),
last_variant = -1,
forward_direction = true,
last_xl = tonumber(you.xl()),
enabled = true,
timer_enabled = true}
if not c_persist.randomtile_state then
c_persist.randomtile_state = {}
end
rtdat = c_persist.randomtile_state
for key,val in pairs(default_state) do
if rtdat[key] == nil then
rtdat[key] = val
end
end
if rtdat.enabled then
enable_random_tile(true)
else
disable_random_tile(true)
end
end
-- Print a message about a tile set change
function tile_change_message()
if not randtile_options.god_message then
return
end
local god = you.god()
if god == "No God" then
god = randtile_options.default_god
end
if randtile_options.god_speech[god] then
msg_template = randtile_options.god_speech[god]
else
msg_template = randtile_options.god_speech["default"]
end
local msg = msg_template:gsub("%%g", god)
local amons = crawl.grammar(valid_tiles[rtdat.index].mons, "A")
local mons = valid_tiles[rtdat.index].mons
msg = msg:gsub("%%am", amons)
mons = mons:gsub("^[tT][hH][eE] ", "")
mons = mons:gsub("^[aA][nN]? ", "")
msg = msg:gsub("%%m", mons)
mpr(msg, randtile_options.message_colour)
end
function get_terrain()
local feat = view.feature_at(0,0)
-- Set to "air" when flying so water and lava features under the
-- player don't cause spurious matches.
if you.status():find("flying") then
feat = "air"
end
return feat
end
function get_percent_hp()
local hp, mhp = you.hp()
return hp / mhp
end
if not var_functions then
var_functions = {
["percent_hp"] = get_percent_hp,
["status"] = you.status,
["terrain"] = get_terrain,
["xl"] = you.xl,
}
end
-- Change the current tile using the tileset entry with the given index in
-- valid_tiles. This will update the randtile state as necessary.
function change_tile(index, force)
local tileopt = nil
local change_index = force or index ~= rtdat.index
local entry = valid_tiles[index]
local num_var = entry.num_var
if not num_var and entry.tileset then
num_var = table.getn(entry.tileset)
end
if num_var then
local var_type = entry.var_type
if not var_type then
var_type = "random"
end
local variant = 1
if var_type == "random" or var_type == "fixed" then
variant = crawl.random2(num_var) + 1
-- Iterate the sequence variant if we have valid state for it.
elseif var_type == "sequence"
and not change_index
and rtdat.last_variant >= 1
and rtdat.last_variant < num_var then
variant = rtdat.last_variant + 1
elseif var_type == "oscillate"
and not change_index
and rtdat.last_variant >= 1 then
if rtdat.forward_direction and rtdat.last_variant == num_var then
rtdat.forward_direction = false
elseif not rtdat.forward_direction and rtdat.last_variant == 1 then
rtdat.forward_direction = true
end
variant = rtdat.last_variant + (rtdat.forward_direction and 1 or -1)
elseif var_functions[var_type] ~= nil then
local comp_value = var_functions[var_type]()
local comp_string = true
if type(comp_value) == "number" then
comp_string = false
end
for i, v in pairs(entry.tileset) do
if i > 1
and (comp_string and comp_value:find(v[1])
or not comp_string and comp_value <= v[1]) then
variant = i
-- For string values, take the first match
if comp_string then
break
end
end
end
end
rtdat.last_variant = variant
-- custom-defined tilesets or an variant set defined by crawl itself.
if entry.tileset then
-- For var_type values that use var_functions
if type(entry.tileset[variant]) == "table" then
tileopt = entry.tileset[variant][2]
else
tileopt = entry.tileset[variant]
end
elseif entry.tile then
local var_suf
if variant == 1 then
var_suf = ""
else
var_suf = "_" .. variant - 1
end
tileopt = entry.tile .. var_suf
end
tileopt = "tile:" .. tileopt
elseif entry.tile then
tileopt = "tile:" .. entry.tile
elseif entry.mons then
tileopt = "mons:" .. entry.mons
end
if not tileopt then
return
end
if change_index then
rtdat.index = index
rtdat.last_index_change = you.turns()
end
crawl.setopt("tile_player_tile = " .. tileopt)
if valid_tiles[index].weapon_offsets then
crawl.setopt("tile_weapon_offsets = "
.. valid_tiles[index].weapon_offsets)
else
crawl.setopt("tile_weapon_offsets = reset")
end
if valid_tiles[index].shield_offsets then
crawl.setopt("tile_shield_offsets = "
.. valid_tiles[index].shield_offsets)
else
crawl.setopt("tile_shield_offsets = reset")
end
if change_index then
tile_change_message()
end
end
-- Change the tile by partial match of name to the mons entries in
-- valid_tiles. Reads name from input if it's not given as an argument.
function set_tile_by_name(name)
if name == nil then
crawl.formatted_mpr("Enter a tile name search string: ", "prompt")
name = crawl.c_input_line()
if not name then
return
end
end
local first_match = nil
name = name:lower()
for i,v in ipairs(valid_tiles) do
local mname = v.mons:lower()
if mname == name then
first_match = i
break
elseif mname:find(name) and not first_match then
first_match = i
end
end
if first_match then
change_tile(first_match, true)
else
mpr("Unable to match a player_tile mons value with " .. name, "lightred")
end
end
-- Checks the randtile state, changing the tile when necessary. A change of the
-- tile index will cause a tile change message to be displayed. The tile may be
-- changed to a new tileset variant even if the index is unchanged, depending
-- on the definition of the current tileset. If force_change is true, the tile
-- index will always be changed.
function random_tile(force_change)
if not valid_tiles or not rtdat.enabled then
return
end
local num_tiles = #valid_tiles
local xl_changed = tonumber(you.xl()) ~= rtdat.last_xl
if xl_changed then
rtdat.last_xl = tonumber(you.xl())
end
local turns_passed = tonumber(you.turns()) - randtile_options.turns_change
local change_index = force_change or rtdat.timer_enabled
and (xl_changed or turns_passed >= rtdat.last_index_change)
local index
if change_index then
index = 1 + crawl.random2(num_tiles)
else
index = rtdat.index
end
local entry = valid_tiles[index]
local var_type = "random"
if (entry.num_var or entry.tileset) and entry.var_type then
var_type = entry.var_type
end
if not change_index and var_type == "fixed" then
return
end
-- We're changing the player tile because of an index change or because we
-- are using a variant tileset that changes with every UI input.
change_tile(index)
end
-- Force a tile change
function new_random_tile()
random_tile(true)
end
-- Toggle the turn/xl timer to disable/enable index changing.
function toggle_tile_timer()
if rtdat.timer_enabled then
mpr("Disabling tile changes by turn or XL.")
else
mpr("Enabling tile changes by turn and XL.")
end
rtdat.timer_enabled = not rtdat.timer_enabled
end
function enable_random_tile(quiet)
if not quiet then
mpr("Enabling RandomTiles.")
end
rtdat.enabled = true
-- Don't attempt to load an invalid index
if rtdat.index == nil or rtdat.index > #valid_tiles then
rtdat.index = 1 + crawl.random2(#valid_tiles)
end
change_tile(rtdat.index, true)
end
function disable_random_tile(quiet)
rtdat.enabled = false
crawl.setopt("tile_player_tile = " .. randtile_options.disabled_setting)
crawl.setopt("tile_weapon_offsets = reset")
crawl.setopt("tile_shield_offsets = reset")
if not quiet then
mpr("Disabling RandomTiles.")
end
end
-- Toggle RandomTiles, setting it tile_player_tile to default setting if we're
-- disabling.
function toggle_random_tile()
if rtdat.enabled then
disable_random_tile()
else
enable_random_tile()
end
end
-- Initialize the tileset, removing any invalid tile entries.
init_random_tiles(player_tiles)
-------------------------
---- End RandomTiles ----
-------------------------
>
}
# The ready() function is needed for code that has to process each turn or UI
# action.
{
function ready()
-- Open skill screen on turn 0.
-- RandomTiles
random_tile()
end
}
$danger = lightred - For messages you should most likely pay attention to
$item_dmg = red - For messages about health or item destruction, or other very bad things
$warning = yellow - For messages you should probably pay attention to, includes when stuff makes noise
$boring = darkgrey - For messages you probably don't need to pay attention to
$negative = brown - For messages that describe damage to you or an ally
$good = lightblue - For messages that describe you or an ally doing damage to an enemy
$positive = green - For messages that describe a beneficial effect that doesn't do damage
$verypositive = lightgreen - For messages that describe when something dies or something good occurs
$awesome = lightmagenta - For messages that describe gaining good mutations
$interface = cyan - For messages that describe something to the player
$takesaction = blue - For messages that describe when either you or an enemy attacks/casts
$godaction = magenta - For messages relating to Gods
# Variables for message highlighting
$danger := lightred
$item_dmg := red
$warning := yellow
$boring := darkgrey
$negative := brown
$good := lightblue
$positive := green
$verypositive := lightgreen
$awesome := lightmagenta
$interface := cyan
$takesaction := blue
$godaction := magenta
$mp := lightcyan
###############
# 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