Daggerfall stores textures inside archives which contains multiple images. These are either opaque textures shared by meshes (building and a few props) or sprites with transparency, which are used for vegetation, npcs and enemies. Additionally there are other texture files with different formats for UI, weapons and other images.
Daggerfall Unity organize modding support for textures around asset bundles (StreamingAssets/Mods) and loose files (StreamingAssets/Textures), not so differently from modern Bethesda games. Bundles contains materials (for meshes) or individual textures (sprites, ui images). Images in png format are imported from loose files and used to create materials at run time. Xml files can be used for further customization.
- Daggerfall Imaging 2
Opens and exports Daggerfall’s image files.
Materials can be injected with dfmods. Name the material assets archive_record-frame.mat and pack them with the mod builder. An example is 009_1-0. If you aren’t familiar with daggerfall naming, the first number is the name of the package where textures are stored (ARCHIVE.XXX, ARCHIVE.009 in our example), the second number indicates this is the n texture of the archive (1 means is the second one), and the third number is the frame, used only for animated billboards. Textures for static models always have frame -0.
Alternatively, individual textures can be imported as loose files, from the StreamingAssets/Textures folder. Nomenclature is archive_record-frame.png for albedo and archive_record-frame_MapTag.png for others (for example 009_1-0_Normal.png). Xml files can also be used to edit Metallic and Smoothness parameters.
<?xml version="1.0"?> <properties> <metallic>0.5</metallic> <smoothness>0.5</smoothness> </properties>
Supported texture uniforms
- Albedo (no map tag)
- Emission (white, actual color is set for daytime)
It is possible to import albedo, normal and metallicgloss maps for terrain, provided the texture array system is supported on the local platform and enabled (you can check it from the advanced settings window). Terrain textures are imported individually, following nomenclature explained above, rather than as unity materials.
Advanced: Texture Arrays allow to store textures with the same resolution and format efficiently, but they are not supported on all platforms. On legacy platforms the terrain fallbacks to a simpler shader that doesn’t support imported textures.
It’s important to note that all textures from an archive must be present and they must have the same resolution. For example, you can use 512×512 for albedo and 128×128 for normal, but all the albedo must be 512×512 and so on. MetallicGloss is an exception as a default map for all the missing textures will be created automatically.
Advanced: On most modern platforms, individual textures are merged in a texture array by copying data on the gpu, which is fast and efficient; on legacy platform this is done by creating a copy on the cpu and then uploading it to gpu, which is slower and requires Read/Write flag on all source textures, meaning that a texture copy is also stored on system memory. It’s up to modders to choose between legacy support and lower memory usage toggling this flag.
Billboard textures can be imported via dfmods or loose files (StreamingAssets/Textures). In both cases textures must be named archive_record-frame.png and, when required, archive_record-frame_Emission.png. When you pack a dfmod remember to set alpha transparency on textures.
Optionally, xml files can be included to provide billboard configuration. Individual keys can be safely omitted to always use default value.
Static billboards inside houses and dungeons are replaced on a per-record basis, meaning that all frames for a given record must be provided. The same is true for emission maps.
<?xml version="1.0"?> <info> <renderMode>Cutout</renderMode> <emission>False</emission> <uvX>0</uvX> <uvY>0</uvY> <scaleX>1</scaleX> <scaleY>1</scaleY> </info>
All textures from an archive are placed on a 4096×4096 atlas, so the total size of your textures must not exceed this value or they will be silently resized. If you don’t provide the entire archive, imported textures are used together with vanilla without issues.
<?xml version="1.0"?> <info> <scaleX>1</scaleX> <scaleY>1</scaleY> </info>
Mobile billboards, such as wandering npcs and enemies, are replaced on a per-archive basis. Texture replacement is enabled for a given archive if the first record (archive_0-0) is provided. Similarly, an archive is marked as emissive if the emission map for the first record is provided (archive_0-0_Emission) or if enabled from xml configuration. Albedo is reused as an emission map when the latter is not provided.
<?xml version="1.0"?> <info> <renderMode>Cutout</renderMode> <emission>False</emission> </info>
<?xml version="1.0"?> <info> <uvX>0</uvX> <uvY>0</uvY> <scaleX>1</scaleX> <scaleY>1</scaleY> </info>
The following are the names to use for UI images for both mods and loose files, including the directories for the latter. A good import option for ui images provided by mods is Texture Type: GUI with mipmaps disabled and Alpha is Transparency if required.
- .IMG: filename.png (ex: MAP100I0.IMG.png) in StreamingAssets\Textures\Img
- .CIF, .RCI: filename_record-frame.png (ex: INVE16I0.CIF_3-0.png) in StreamingAssets\Textures\CifRci
Weapons used by the player have several variations for different kinds of metal. Vanilla textures use a color tint to achieve this; when importing custom textures, we use entirely different images. The full name is WEAPON**.CIF-Record-Frame_MetalType for weapons with metal type variations, WEAPON**.CIF_Record-Frame for others such as hands and feet.
Daggerfall uses the same texture for several variations of an item, applying different color tints. Custom texture should be provided with an additional tag to identify which variation they are meant to replace; the full name is Archive_Record-Frame for Chain and Silver (no tint) and Archive_Record-Frame_DyeColor for all other dyes.
Weapon and armour
Paperdoll items are placed in a stack where textures on the top hides the layers below. Additionally, some layers requires a mask; for example the helm clears hair that would otherwise visible. For more informations on paperdoll implementation see Items Part 3 – Paper Doll. If Name is the name of the main texture, a texture named Name_Mask can be used to override the default mask, with full opacity on the alpha channel to mark masked area, and trasparency to mark non-masked area. If this texture is provided from a mod, the texture type Single Channel should be chosen to automatically pick format with minimum amount of memory used; additionally, Read/Write Enabled flag must be set.
The position on the paperdoll can also be changed with an xml file, with the same name as the texture, providing a rect in pixels with the origin on the top-left corner. The original paperdoll has a resolution of 110×184, which is scaled eight times in Daggerfall Unity to achieve a resolution of 880×1472. The xml file should define the scale on which the rect is based, which allows the game to correctly convert the rect to the actual paperdoll scale, ensuring compatibility with future resolution changes.
<?xml version="1.0"?> <info> <rect scale="8"> <x>248</x> <y>0</y> <width>400</width> <height>344</height> </rect> </info>
Certain UI images need additional informations. These are provided using .xml files, each one with the same name as the texture file it refers to and placed in the same folder. width and height parameters affect the size on screen. Here are provided the defaults values, but it’s possible to customize them.
- HUD Compass
<?xml version="1.0"?> <info> <width>322</width> <height>14</height> </info>
<?xml version="1.0"?> <info> <width>69</width> <height>17</height> </info>
Crosshair.png and Crosshair.xml in StreamingAssets\Textures
<?xml version="1.0"?> <info> <width>22</width> <height>22</height> </info>
Cursor can be overriden with a texture provided by mod using Cursor texture type and Read/Write flag enabled. Import from loose files is not supported.
Horse and cart textures are, respectively, MRED00I0.CFA and MRED01I0.CFA. While the original textures can’t be exported with Daggerfall Imaging, overrides can be provided inside the CifRci folder (ex: MRED00I0.CFA_0-0.png).
High resolution overlays can be imported along with the main map texture following the naming TRAV0I00.IMG-RegionName. For example, the overlay for the Ilessan Hills region should be named TRAV0I00.IMG-Ilessan Hills.
This is the list of region names:
"Alik'r Desert", "Dragontail Mountains", "Glenpoint Foothills", "Daggerfall Bluffs", "Yeorth Burrowland", "Dwynnen", "Ravennian Forest", "Devilrock", "Malekna Forest", "Isle of Balfiera", "Bantha", "Dak'fron", "Islands in the Western Iliac Bay", "Tamarilyn Point", "Lainlyn Cliffs", "Bjoulsae River", "Wrothgarian Mountains", "Daggerfall", "Glenpoint", "Betony", "Sentinel", "Anticlere", "Lainlyn", "Wayrest", "Gen Tem High Rock village", "Gen Rai Hammerfell village", "Orsinium Area", "Skeffington Wood", "Hammerfell bay coast", "Hammerfell sea coast", "High Rock bay coast", "High Rock sea coast", "Northmoor", "Menevia", "Alcaire", "Koegria", "Bhoraine", "Kambria", "Phrygias", "Urvaius", "Ykalon", "Daenia", "Shalgora", "Abibon-Gora", "Kairou", "Pothago", "Myrkwasa", "Ayasofya", "Tigonus", "Kozanset", "Satakalaam", "Totambu", "Mournoth", "Ephesus", "Santaki", "Antiphyllos", "Bergama", "Gavaudon", "Tulune", "Glenumbra Moors", "Ilessan Hills", "Cybiades"
The following is a list of limitations for the current version of Daggerfall Unity, which might be resolved with a future update.
- Replacement of sky textures (SKYxx.DAT) is not supported.