==== Tile Data ===

Tiles, hosts, and ores are defined by a contiguous block of non-empty lines
in plain-text files under `config/strata/tiledata/<modid>` for files on disk
or `assets/strata/config/strata/tiledata/<modid>` for files in a resource pack.
Files under each <modid> directory are only processed if that mod is active.
Lines work as key-value pairs (or with multiple values or no value), are read
sequentially, and will replace any value set directly or indirectly by a
previous key-value. Line order does not matter unless stated otherwise.
Tiles with a parent tile type must be defined after their parent. Tile sets
cannot be split across multiple files and should be limited to one per file.
Tile data file names should match their contained tile set for consistency.

`` refers to a key
'' refers to a variable part of the key or value
<> values are required
[] values are optional

--- Data Structures & Bound Primitives ---

Type: BlendMode
Description:
    A string that matches an entry in Strata's BlendMode enum.

Type: EnumPlantType
Description:
    A string that matches an entry in Minecraft's EnumPlantType enum.
    This enum is mutable and mods may add to it at any time.

Type: meta
Description:
    An integer from 0 to 15 (inclusive).

Type: MetaResourceLocation
Description:
    A string of the form "<ResourceLocation>[:<meta>]".
    The meta value defaults to zero when omitted.

Type: normal
Description:
    A floating-point value from 0.0 to 1.0 (inclusive).

Type: ResourceLocation
Description:
    A string of the form "[<domain>:]<path>".
    The domain defaults to "minecraft" when omitted.

Type: RPNExpression
Description:
    A string representing a mathematical expression in Reverse Polish Notation, such as "1 2 + 3 *".
    Be aware that doubles are used internally which may lead to rounding errors and faulty logic.
    Numeric operators: +, add, -, sub, *, mul, /, div, %, mod, ^, pow
    Boolean operators: >, gt, >=, ge, <, lt, <=, le, ==, eq, !=, ne, !, not, ?, if, ?:, ifelse
    Functions: abs, ceil, dec, dup, floor, fmod, inc, log, log10, log1p, neg, max, min, pop, rand, recip,
        round, sign, sqrt
    Variables may be provided by the evaluation context but cannot be set within the expression.

Type: SoundEvent
    A ResourceLocation to audio data defined in a "sounds.json" file.
    These files may be provided by any mod or resource pack in addition to the base game.

Type: SoundType
Description:
    A set of break, step, place, hit, and fall SoundEvents which share a volume and pitch multiplier.

Type: TileType
Description:
    A string that matches an entry in Strata's TypeType enum.

--- Key-values ---

Key: generate
Value: <tileSetName> <TileType>
Description:
    Creates a tile set's tile type.
    Recipes, some drops, and other properties are determined using tiles in the same set.
    Double slabs are special and should not be explicitly defined.

Key: host
Value: <MetaResourceLocation>
Description:
    Registers the block as one from which ores may acquire various properties.
    When used with `generate`, Value is unnecessary and ignored, and only applies to primary tile types.
    Does not apply to ores.

Key: ore
Value: <oreName>
Description:
    Creates the block as an ore.

Key: oreDict
Value: <itemBlockOreDictionaryName> [itemOreDictionaryName] [fragmentItemOreDictionaryName]
Description:
    Adds the block item, ore item, and/or fragment item to the ore dictionary.
    Each may equate to a different item. Omit, or use a hyphen, to skip it.
    'itemOreDictionaryName' defaults to 'itemBlockOreDictionaryName'.
    'itemOreDictionaryName' does not apply when used with `generate`.
    For each entry, Strata will replicate the first furnace recipe found. Vanilla recipes are prioritized.
    Only applies to ores and primary tile types.

Key: tileType
Value: <TileType>
Description:
    Sets several common block properties such as harvest tool, sound type, and block state.
    Value is redundant with `generate`.

Key: harvestTool
Value: <String>
Description:
    Sets the type of tool that breaks the block at full speed.
    The tool itself is normally set by the tile type.
    Use a hyphen to unset the effective tool.

Key: harvestLevel
Value: <int>
Default: 0
Description:
    Sets the level of tool required to harvest the block.
    If the tile type has a parent, the parent's value is the default.
    For ores, the value will factor into block break speed but harvest checks will use the host's harvest level.

Key: hardness
Value: <float>
Default: 3.0 if ore, 1.5 otherwise
Description:
    Sets the harvest difficulty which influences break speed.
    If the tile type has a parent, the parent's value is the default.
    For ores, the hardness of the host will factor in as well.

Key: explosionResistance
Value: <float>
Default: 5.0 if ore, 10.0 otherwise
Description:
    Sets the amount of explosion power absorbed by the block.
    If the tile type has a parent, the parent's value is the default.

Key: sustains
Value: <EnumPlantType1|MetaResourceLocation1> ... [EnumPlantTypeN|MetaResourceLocationN]
Description:
    Allows the block to sustain EnumPlantType(s) and/or what is sustained by other block(s).
    Due to mod load ordering, MetaResourceLocation(s) cannot omit the domain.
    Only applies to primary tile types.
    Disclaimer: This may not work due to caching Strata cannot intercept. Some plants check for specific block(s).

Key: burnTime
Value: <int>
Default: 0
Description:
    The number of ticks the item will burn in a furnace.
    For reference, there are 20 ticks per second and it takes 10 seconds to smelt an item. Vanilla coal is 1600.
    Only applies to ores and primary tile types.

Key: lightLevel
Value: <int>
Default: 0
Description:
    The amount of light (0-15) the block will emit.
    If the tile type has a parent, the parent's value is the default.

Key: lightOpacity
Value: <int>
Description:
    The amount of light blocked by the block.
    If the tile type has a parent, the parent's value is the default.

Key: meltsAtInto
Value: <int> <MetaResourceLocation>
Description:
    Randomly replaces the block with another when any adjacent block light level meets or exceeds the threshold.
    If the block emits a sufficient amount of light it can melt itself regardless of neighbouring light levels.
    Drops will be forfeit to prevent infinite duplication.
    Only applies to primary tile types.

Key: sublimatesAtInto
Value: <int> <MetaResourceLocation>
Description:
    Randomly replaces the block with another when any adjacent block light level meets or exceeds the threshold.
    If the block emits a sufficient amount of light it can sublimate itself regardless of neighbouring light levels.
    Drops will be forfeit to prevent infinite duplication.
    Only applies to primary tile types.

Key: slipperiness
Value: <float>
Default: 0.6
Description:
    Affects the acceleration and drag of entities moving on top of the block.
    As slipperiness increases, acceleration and drag decrease.
    If the tile type has a parent, the parent's value is the default.
    Does not apply to ores and non-generated hosts.

Key: texture[Caps|Sides|Up|Down|North|South|East|West]
Value: [<ResourceLocation> <BlendMode> <opacity:float>]* <ResourceLocation>
Description:
    Generates a texture for the block model using an optional array of layers blended onto a required base.
    Only `texture` is required. The other keys override a side or group of sides.
    If the tile type has a parent, the parent's complete texture map is the default.
    Specifying any of these keys will generate a new and distinct texture map.
    Only the first frame of an animated texture will be used when multiple layers are involved.
    Although Strata does not generate host blocks, these textures are used for their particles.
    Must come after `generate`, `host`, or `ore`.

Key: oreItemTexture
Value: [<ResourceLocation> <BlendMode> <opacity:float>]* <ResourceLocation>
Description:
    Generates a texture for the ore item model using an optional array of layers blended onto a required base.
    A reasonable default will be created using a block texture if omitted.

Key: soundEvents
Value: [<volume:float> <pitch:float>] <break:SoundEvent> <step:SoundEvent> <place:SoundEvent> <hit:SoundEvent> <fall:SoundEvent>
Description:
    Creates a SoundType composed of a set of SoundEvents.
    SoundEvent resources outside of Strata's domain are expected to be registered by the owner of that domain.
    If the tile type's default sound type matches the parent's default, the parent's sound events will be used.
    For example, LEVER will not inherit a custom sound type from COBBLE because they normally sound different.
    volume and pitch are multipliers and default to 1.0.
    Must come after `generate`.
    Does not apply to ores and non-generated hosts.

Key: ambientSound
Value: [<volume:float> <pitch:float>] <SoundEvent>
Description:
    Randomly play a SoundEvent from the block like the crackle of an active furnace (but a lot less often).
    volume and pitch are multipliers and default to 1.0.
    If the tile type has a parent, the parent's value is the default.
    Does not apply to non-generated hosts.

Key: blockState
Value: <ResourceLocation>
Description:
    Sets the block state which maps block variant(s) to their model(s).
    The block state is normally set by the tile type but may be changed to improve texture alignment or other visuals.
    Strata's standard block state files are found in the JAR under "assets/strata/blockstates".
    Custom block states provided by resource packs cannot omit variants.
    Does not apply to non-generated hosts.

Key: breaksInto
Value: <MetaResourceLocation>
Description:
    Replaces the block with another when harvested without silk touch.
    Drops will be forfeit to prevent infinite duplication.
    Only applies to ores and primary tile types.

Key: convertsTo
Value: <MetaResourceLocation>
Description:
    Overrides the vanilla-equivalent item defined by the tile type used for recipe creation and replication.
    A value of "-" will prevent this behaviour entirely and extends to all descendant tile types.
    For ores, this applies to the ore item, not the creative mode item block, and functions like `proxyOre`.

Key: convertsToIn
Value: <MetaResourceLocation> <recipeNameRegex1> ... [recipeNameRegexN]
Description:
    Allows the item to substitute for another in matching recipes.
    Does not conflict with `convertsTo`.
    Must come after `generate`.

Key: furnaceResult
Value: <MetaResourceLocation>
Description:
    Adds a furnace recipe or overrides `oreDict`'s behaviour.
    Only applies to ores and primary tile types.

Key: furnaceExperience
Value: <float>
Default: 0.0
Description:
    Sets the experience given for smelting the item in a furnace.
    If unset, the experience of the first furnace recipe found producing `furnaceResult` will be used.
    Only used with `furnaceResult`.

Key: fragmentTexture
Value: [<ResourceLocation> <BlendMode> <opacity:float>]* <ResourceLocation>
Description:
    Generates a texture for the fragment item using an optional array of layers blended onto a required base.
    This key-value implies a fragment will be created. A dedicated key is redundant.
    STONE fragments prioritize reassembling into COBBLE and COBBLE will drop STONE fragments.
    Only applies to primary tile types.

Key: fragments
Value: [minimum:int[-<maximum:int>]]
OR: <minDropExpr:RPNExpression>[ ~ <maxBonusDropExpr:RPNExpression>]
Default: 4
Description:
    Controls the number of fragments dropped by a primary tile type.
    The "minimum only" form (e.g. "4") will always drop the exact amount.
    The "minimum-maximum" form (e.g. "1-4") will use vanilla's standard fortune formula.
    The RPN form (e.g. "1 ~ f 2 *") will drop 'minDropExpr' and up to and including 'maxBonusDropExpr' more.
    'maxBonusDropExpr' will use a discrete uniform distribution (all values equally probable).
    The game difficulty replaces the variable "d".
    The level of fortune replaces the variable "f".
    The position of the block is not available and the variables "x", "y", and "z" will evaluate to zero.
    Other enchantments are not available and will evaluate to zero.
    Expression results are rounded to the nearest integer. Negative results are clamped to zero.
    For example, "0 ~ 0.2 f *" has a 50% chance of dropping one fragment with Fortune III.
    Never drops more than four fragments to prevent infinite duplication.

Key: fragmentConvertsTo
Value: <MetaResourceLocation>
Description:
    Creates a one-way, one-to-one conversion recipe to another item for compatibility purposes.

Key: fragmentFurnaceResult
Value: <MetaResourceLocation>
Description:
    Adds a furnace recipe for the fragment or overrides `oreDict`'s behaviour.

Key: fragmentFurnaceExperience
Value: <float>
Default: 0.0
Description:
    Sets the experience given for smelting the fragment in a furnace.
    If unset, the experience of the first furnace recipe found producing `fragmentFurnaceResult` will be used.
    Only used with `fragmentFurnaceResult`.

Key: fragmentBurnTime
Value: <int>
Default: 0
Description:
    Sets the number of ticks the fragment will burn in a furnace.
    For reference, there are 20 ticks per second and it takes 10 seconds to smelt an item. Vanilla coal is 1600.

Key: proxyOre
Value: <MetaResourceLocation>
Description:
    Displays the name, shows the tooltip, drops the drops, sustains the plants, etc. of the specified block instead.
    Equivalent key-values are still important should the block specified by MetaResourceLocation not exist.
    Only applies to ores, and specifically, their blocks. Use `convertsTo` to do the same for the ore item.

Key: hostAffinities
Value: <MetaResourceLocation1> ... [MetaResourceLocationN]
Description:
    Prioritizes one or more hosts for an ore in descending order.
    Default host selection heuristics apply if the ore is not adjacent to a listed host.

Key: forceHost
Value: <MetaResourceLocation>
Description:
    Forces the ore to acquire a specific host if it exists.
    This is provided for compatibility but is not what Strata was designed for.

Key: dropGroup.<groupName>
Value: [weight:int] <ResourceLocation> [minimum:int[-<maximum:int>]]
OR: [weight:int] <ResourceLocation> <minDropExpr:RPNExpression>[ ~ <maxBonusDropExpr:RPNExpression>]
Description:
    Replaces an ore's default item drop or supplements a natural primary tile type's block or fragment drop.
    'groupName' identifies a set of mutually-exclusive drops.
    Multiple of the same key may be used as values are additive.
    'weight' affects how likely a drop is within a group and defaults to 100.
    'weight' is treated as a ratio. The sum of weights does not have to equal 100.
    ResourceLocation refers to the item or block that will drop.
    ResourceLocation may also be "*" to represent the ore's own item or "-" to represent no drop.
    A drop whose ResourceLocation does not resolve to an item or block will have no effect on the group.
    The "minimum only" form (e.g. "5") will always drop the exact amount.
    The "minimum-maximum" form (e.g. "4-9" for lapis) will use vanilla's standard fortune formula.
    The RPN form (e.g. "1 ~ f 2 *") will drop 'minDropExpr' and up to and including 'maxBonusDropExpr' more.
    'maxBonusDropExpr' will use a discrete uniform distribution (all values equally probable).
    The game difficulty replaces the variable "d".
    The level of fortune replaces the variable "f".
    The position of the block replaces the variables "x", "y", and "z".
    Enchantment levels replace resource location variables (e.g. "fortune", "minecraft:fortune", or "mymod:myenchant").
    Expression results are rounded to the nearest integer. Negative results are clamped to zero.
    For example, "0 ~ 0.2 f *" has a 50% chance of dropping one item with Fortune III.
    A single drop is selected from each group and is limited to a full stack.
    Silk touch has no effect on ores but will prevent supplemental drops from natural primary tile types.
    Must come after `generate` or `ore`.

Key: experience
Value: [minimum:int[-<maximum:int>]]
OR: <minDropExpr:RPNExpression>[ ~ <maxBonusDropExpr:RPNExpression>]
Default: 0
Description:
    Controls the amount of experience a block can drop.
    The "minimum only" form (e.g. "5") will always drop the exact amount.
    The "minimum-maximum" form (e.g. "4-9") will use vanilla's standard fortune formula.
    The RPN form (e.g. "1 ~ f 2 *") will drop 'minDropExpr' and up to and including 'maxBonusDropExpr' more.
    'maxBonusDropExpr' will use a discrete uniform distribution (all values equally probable).
    The game difficulty replaces the variable "d".
    The level of fortune replaces the variable "f".
    The position of the block replaces the variables "x", "y", and "z".
    Other enchantments are not available and will evaluate to zero.
    Expression results are rounded to the nearest integer. Negative results are clamped to zero.
    For example, "0 ~ 0.2 f *" has a 50% chance of dropping one experience with Fortune III.
    Only applies to ores and naturally-placed, primary tile types.

Key: lang.<language>[_<region>]
Value: <String>
Description:
    Sets the display name for a locale.
    Text format codes (like "§e") are supported.
    The locale format parallels BCP 47 but varies slightly to match what Forge provides. ("en_us", "uk_ua", etc.)
    A region takes priority over a generic language if both exist. ("en_us" > "en")
    A region will not fall back onto another region.
    If no translation is found for the current locale, "en" will be used, if present. ("pt_pt" > "pt" > "en")
    The registry name will be used as the final fallback.

Key: tooltip.<language>[_<region>]
Value: <String>
Description:
    Sets the tooltip for a locale.
    Text format codes (like "§e") and newlines ("\n") are supported.
    The locale format parallels BCP 47 but varies slightly to match what Forge provides. ("en_us", "uk_ua", etc.)
    A region takes priority over a generic language if both exist. ("en_us" > "en")
    A region will not fall back onto another region.
    If no translation is found for the current locale, "en" will be used, if present. ("pt_pt" > "pt" > "en")

Key: activatable
Value: N/A
Description:
    Fine-tunes implementation details and should not be used unless you know what it does.

Key: affectedByGravity
Value: N/A
Description:
    Causes the block to fall when unsupported like sand and gravel regardless of the actual tile type.
    Only applies to primary and secondary tile types.

Key: dragonImmune
Value: N/A
Description:
    Prevents the Ender Dragon from destroying the block.
    Does not apply to non-generated hosts.

Key: fireSource
Value: N/A
Description:
    Prevents fire on top of the block from being extinguished by natural means (like netherrack).
    Does not apply to non-generated hosts.

Key: notReconstitutable
Value: N/A
Description:
    Prevents crafting a block from its fragments.
    Only applies to primary tile types.

Key: hasEffect
Value: N/A
Description:
    Gives the item an enchanted glint.
    Does not apply to non-generated hosts.

Key: noSilkTouch
Value: N/A
Description:
    Prevents the effects of silk touch.
    Only applies to primary tile types.

Key: witherImmune
Value: N/A
Description:
    Prevents the Wither from destroying the block.
    Does not apply to non-generated hosts.
