Localizing Strings in Daggerfall Unity – Part 3

Series
Localizing Strings in Daggerfall Unity – Part 1
Localizing Strings in Daggerfall Unity – Part 2
Localizing Strings in Daggerfall Unity – Part 3
Localizing Strings in Daggerfall Unity – Part 4
Localizing Strings in Daggerfall Unity – Part 5
Localizing Strings in Daggerfall Unity – Part 6

Editing Strings

In Part 1, we setup the string tables to receive our localized text. In Part 2, we imported strings to configure initial data for each locale with either English text or legacy translations from TEXT.RSC.

Before we edit a few strings into their respective language, we’re going to set all string tables to preload. This means their data is fully loaded sooner and region switching will be faster later in this tutorial. This is recommended when creating translation mods.

  1. Click Window menu > Asset Management > Localization Tables to open string editor.
  2. Drop-down Selected Table Collection and select Demo_Strings (StringTable).
  3. Click the metadata button above any of the string tables and put a tick in Preload All Tables. This will automatically select Preload Table for every locale.
  4. Repeat steps 2-3 for Demo-RSC (StringTable)

With that out of the way, let’s take a closer look at the string table and make our first edits.

The left-hand column of string table holds the unique key each for item. This key is how Daggerfall Unity looks up a string for any language. Never change the key value or this will break string lookup in-game.

Then for each language, there is a value field which contains data for that key. All languages share the same key, only the value needs to be translated.

Note: Daggerfall Unity will occasionally add new keys and values which must also be added to your translation mod. Syncing new keys to maintain your mod will be covered in a future tutorial in this series.

We’re now going to change the value of pleaseSelectYourHomeProvince for each locale. This is one of the first strings seen when starting a new character, and also near the top of list, so it’s a good place to start. Copy and paste the following text into each locale’s value field next to the pleaseSelectYourHomeProvince key.

Czech (ch) : Vyberte svou domovskou provincii…
French (fr) : Veuillez sélectionner votre province d’origine…
German (de) : Bitte wählen Sie Ihre Heimatprovinz…
Korean (ko) : 거주 지역을 선택하십시오…

Note: Translations were created using Google Translate.

Once this is completed, your string table should look like below (click for full size).

You can now close the Localization Tables editor.

Setting Play Mode Script

Before we take a look at these translations in-game, we’re going to check the Play Mode Script for addressables in Unity. We won’t go into this in detail, but we need to ensure the correct setting is selected before proceeding.

  1. Click Window menu > Asset Management > Addressables > Groups
  2. Click Play Mode Script and confirm Use Asset Database (fastest) is selected
  3. Close the Addressables Groups UI

The Play Mode Script is how Unity will load addressable assets like string tables during play. For simplicity and speed, we will only select Use Asset Database (fastest) in this tutorial. This is also the default setting.

Assign String Tables To TextManager

The final step to see our translations in-game is to tell Daggerfall Unity how to load our translated assets.

You should already have the DaggerfallGameScene open from Part 2. If not, locate this scene in Project view under Assets/Scenes and open it now.

Locate and select the TextManager component then look to the Inspector view. We must now change the Live String Tables to reference our custom translations instead of the default English language in core game. Make the highlighted edits in below screenshot.

The names Demo_Strings and Demo_RSC match the two string table collections we created back in Part 1. Changing these settings will redirect string lookups to our custom string tables.

To quickly summarise the purpose of each string table collection:

  • Internal Strings – Are all strings previously extracted from FALL.EXE and other hardcoded locations. Their key is in plain text and represents the text being translated.
  • RSC Strings – Are all strings extracted from TEXT.RSC. Their key is a numeric value matching an ID in TEXT.RSC.
  • BOK Strings – Will be all strings extracted from books in game data. This is under development and will be available in a future release of Daggerfall Unity.

Testing In-Game

To quickly recap everything we’ve done so far:

  1. Setup Unity 2019.4.10 and cloned the full Daggerfall Unity project
  2. Created empty string table collections Demo_Strings and Demo_RSC.
  3. Imported initial text to populate our two new string table collections, using legacy translations from French and German TEXT.RSC, and remapped back to correct character codes.
  4. Set all string tables to preload.
  5. Translated string values for “Please select your home province…” into multiple languages.
  6. Set the Play Mode Script to Use Asset Database (fastest).
  7. Opened the DaggerfallUnityGame scene.
  8. Assigned our string table collection to Live String Tables in TextManager inspector.

Click Play button to start the game. Because we have the DaggerfallUnityGame scene open, it will open straight to the title menu. Just click to dismiss any videos that play at startup.

Once game has started, take note of the language dropdown towards top-right of play window.

Note: Depending on your locale settings, you might have another language other than English (en) above.

Whatever your language is, use this dropdown and change the selected locale to French (fr). Then click Start New Game. If everything is working properly, you should see our translated text in French.

Note: There might be a short delay when Unity first preloads string data. You may need to click Start New Game twice after changing language.

Now press Escape key to return to title menu and change language to German (de). Click Start New Game again and the text should now be in German.

Finally, press Escape key back to title menu again, then change language to Korean (ko) and click Start New Game.

So what’s gone wrong here? Why are we seeing question marks? Everything looked OK when creating the translated string in the editor.

These question marks indicate Daggerfall Unity was unable to locate font characters matching one or more codes in source text. The default fonts in Daggerfall Unity have a full complement of Latin characters, but they do not have characters for non-Latin languages. When the game attempts to render these unknown characters, it will display question marks instead.

To fix this, we need to provide new fonts with locale-specific characters to Daggerfall Unity. Fonts will be covered in a future tutorial in this series.

We have a little more ground to cover first in Localizing Strings in Daggerfall Unity – Part 4.

Localizing Strings in Daggerfall Unity – Part 2

Series
Localizing Strings in Daggerfall Unity – Part 1
Localizing Strings in Daggerfall Unity – Part 2
Localizing Strings in Daggerfall Unity – Part 3
Localizing Strings in Daggerfall Unity – Part 4
Localizing Strings in Daggerfall Unity – Part 5
Localizing Strings in Daggerfall Unity – Part 6

Playing in Unity Editor

If you’ve followed tutorial up to this point, you should have the full Daggerfall Unity project open inside Unity 2019.4.10 and created some new locales and empty string tables.

As we progress, we’ll begin testing our translations directly inside of the Unity Editor. To make sure everything is working as expected, let’s begin by opening the startup scene.

  1. In Project view, navigate to Assets/Scenes
  2. Double-click DaggerfallUnityStartup scene to open it in the editor

The DaggerfallUnityStartup scene is the launcher window you see when running a game build. You should see the following structure in your Hierarchy view.

Now click the Play button to start Daggerfall Unity inside editor.

If you’ve previously setup Daggerfall Unity for regular play, it will open straight to the launcher UI in your Game view as normal.

If you’ve never setup Daggerfall Unity for play, you’ll first need to provide a good set of game files. We recommend the DaggerfallGameFiles zip available on Live Builds page.

For more information on setting up Daggerfall Unity for play, head over to Installing Daggerfall Unity and Other Information topic on our forums.

Try playing the game and loading a save if you have one. Everything should work inside the editor as if you were playing Daggerfall Unity normally from a build. When you’re ready, click Unity’s Play button once again to stop the game.

At this point, we’re ready to begin importing text and testing it in game. For convenience, we’re going to open the DaggerfallUnityGame scene to bypass the launcher and go straight into game.

  1. In Project view, navigate to Assets/Scenes
  2. Double-click DaggerfallUnityGame scene to open it in the editor

You’ll notice in Hierarchy there’s more inside the game scene. One particular object you should take note of is TextManager.

The TextManager object is our global interface to string tables and importing text. We’ll get back to this shortly, just remember where it is for now.

Understanding Legacy Translations

Before we bulk import text into our new string tables, some understanding is required about strings in classic Daggerfall.

If you’ve been around for a while and maybe helped translate classic Daggerfall, you will have encountered the problem of its limited 8-bit character set not being able to correctly code accented characters like ç or û.

The way translators had to work around this back then was to remap each accented character to one within Daggerfall’s available character set. For example, the following text:

compétences liées à la volonté

Would be written in modified TEXT.RSC data as:

comp<tences li<es @ la volont<

Then to make these characters appear correctly in game, font glyphs for < and @ were redrawn to look like é and à. Finally, when classic Daggerfall rendered this remapped text in game, it appears correct to the player. But underneath it all, the source text still uses < and @ in place of real character codes.

This means classic translators had to write various degrees of gibberish using remapped characters. And if the target language does not even resemble Latin characters (e.g. Cyrillic), then the work became even harder.

Daggerfall Unity has no such character limitation and can use text written normally with accented or non-Latin characters. It supports standard international character codes and fonts with any number of glyphs.

Unfortunately, legacy translations for classic Daggerfall were all created using remapped characters. When importing classic text data, e.g. from TEXT.RSC, these characters are imported as-is and the translated text just looks like gibberish as written.

Rather than discard legacy translations and start from scratch, Daggerfall Unity has the ability to undo character remappings back to their original character codes while performing a bulk import. This is handled by providing a TextMappingTable to string importer.

Understanding TextMappingTable

The TextMappingTable is a simple data file in .txt format providing conversion from a remapped character code back to their original character. Conversions for multiple locales can be stored in one TextMappingTable.

This tutorial provides a sample TextMappingTable for French (fr) and German (de) legacy strings. To create this table, copy the entire of below into a new text document.

-Character mapping database for importing classic text with remapped character data

schema: *key,locale,source,replacement

-French (fr)
0,   fr, $ , ç
1,   fr, < , é
2,   fr, # , è
3,   fr, @ , à
4,   fr, ^ , ê
5,   fr, ~ , ù
6,   fr, \ , â
7,   fr, ` , û
8,   fr, * , ë
9,   fr, { , ï
10,  fr, } , î
11,  fr, | , ô

-German (de)
12,  de, @ , Ä
13,  de, # , ä
14,  de, $ , Ö
15,  de, & , ö
16,  de, { , Ü
17,  de, } , ü
18,  de, * , ß

Save this text document as TextMappingTable.txt in your DemoTranslationMod/Resources folder created in previous tutorial.

If you’ve already saved document elsewhere, you can also drag and drop it into above path in Unity’s Project view.

If you need to add more locales to your TextMappingTable, follow the example above and be sure that each new line as a unique number for key. For example, the next available key in sequence above is 19.

Note: providing a TextMappingTable is not required if you plan to start from scratch with fresh translations, or don’t have legacy classic translations available.

Download Legacy Translations

We’re almost ready to bulk import classic text data into our string tables.

As a convenience, this tutorial provides legacy translated TEXT.RSC files for French (fr) and German (de). Please download the following zip and extract somewhere.

Download

The files in above download were created by the French and German communities respectively, and all credit belongs to those communities for their work:

When you unzip this archive, you will see it contains two TEXT.RSC files, each with a very specific filename.

The file “TEXT_fr.RSC.bytes” is the French TEXT.RSC file, and “TEXT_de.RSC.bytes” is the German TEXT.RSC. The file data is unchanged from source, only the names are changed so that Daggerfall Unity can identify which file belongs to which locale.

The “.bytes” extension is a Unity convention so resource loader knows the file is a binary asset.

Now that you have a couple of legacy translations available, you need to place them into your mod project.

  1. In Project view, navigate to DemoTranslationMod/Resources
  2. Drag and drop the translated and renamed TEXT.RSC files directly into your Resources folder

This will add the files to Resources along with the TextMappingTable.txt file we added earlier. Your DemoTranslationMod/Resources folder should now contain three files like below.

Note that Unity does not display the .bytes or .txt file extensions in editor.

Initialize String Table Collections

Everything is now in place to bulk import text from classic Daggerfall into your string table collections, which initializes all of them at once with the correct keys and starting text.

If you’ve provided the files above to DemoTranslationMod/Resources, the pre-translated text from TEXT.RSC in French (fr) and German (de) locales will be used, and their remapped character codes will be converted back to normal character codes thanks to the TextMappingTable.

All other locales will be initialised using the English (en) language as a starting point.

Note: As localization is still in Preview, not all text sources are supported for translations. At time of writing, Daggerfall Unity supports localization of strings from TEXT.RSC and strings exported from FALL.EXE. However, only TEXT.RSC is supported for bulk import at this time. Other than Quests and Books, this constitutes around 95%+ of all text in game. Support for more text sources, including Quests and Books, will be added in future.

Remember the TextManager in the Game scene from earlier? Click on this now to select it.

Then locate your Inspector view in editor and you will see that TextManager has a custom editor tool attached.

The Live String Tables are used by game at runtime. We’ll get to this in a later tutorial in series.

For now, we’re just going to copy our source text into the empty string table collections we created in first tutorial. For this we’ll use the Copy String Tables tool.

Enter settings as shown below and click Copy All. Don’t worry about BOK Strings for now. This field will be used later once Books are supported by localization.

After clicking Copy All, you should see information like below output to the Console view. This means the bulk import has completed to the target string collections we specified in Copy String Tables. For simplicity, the importer will copy strings for all locales in a single pass.

If TextManager was able to find pre-translated TEXT.RSC files for a locale, it will import strings from those files. If a TextMappingTable exists for those locales, characters will be automatically remapped back to correct character codes.

Checking Imported Strings

We can now check on our imported strings to make sure everything worked as expected.

  1. Open the Localization Tables editor using Window menu > Asset Management > Localization Tables
  2. Click Selected Table Collection and select Demo_RSC (StringTable).

You should see a fully populated string table collection for all of the locales we configured earlier.

Note the French (fr) and German (de) string tables have been populated by our translated TEXT.RSC files, and accented character codes have been restored. All other locales have been configured with English as a starting point.

You will also notice special RSC markup tags like [/center] and [/end]. These will be covered further in a later tutorial in series.

For now, move on to Localizing Strings in Daggerfall Unity – Part 3.

Localizing Strings in Daggerfall Unity – Part 1

Series
Localizing Strings in Daggerfall Unity – Part 1
Localizing Strings in Daggerfall Unity – Part 2
Localizing Strings in Daggerfall Unity – Part 3
Localizing Strings in Daggerfall Unity – Part 4
Localizing Strings in Daggerfall Unity – Part 5
Localizing Strings in Daggerfall Unity – Part 6

In this technical series, we’ll cover how to create a string localization mod for Daggerfall Unity then distribute it as a .dfmod file alongside built string assets.

The process of creating a string localization mod is similar to creating any other .dfmod for Daggerfall Unity, so parts of this tutorial will assume at least some familiarity with the Unity Engine and modding Daggerfall Unity in general.

If you get stuck with the basics of mod creation, please reach out to the wider modding community on our forums. There are dozens of experienced modders who are more than happy to share their knowledge and help you learn. And Unity has thousands of resources and communities online to learn more about the engine itself.

Throughout this series, please keep in mind that Daggerfall Unity is currently in Beta and the localization feature is considered to be in Preview. This feature will continue to expand through to 1.0 and beyond, and the information in this series is subject to change. Once localization is out of Preview, this tutorial series will be updated and included with the general modding documentation.

Setting Up

To get started, you will first need to download and install Unity 2019.4.10 (specifically this version) from the Unity Download Archive. The Unity Hub download is the easiest way to initiate this process.

Then you need to clone the full Daggerfall Unity source project from GitHub. You can just download a zip file of the source, but it’s recommended to fork Daggerfall Unity to your own GitHub repo so that you can collaborate with others and maintain your translation mod long-term. As Daggerfall Unity continues to grow and reach new versions, your mod will need to be kept up to date to remain compatible.

If you’re not overly familiar with git conventions and GitHub, using GitHub Desktop is the easiest way to get started.

Once you have Unity 2019.4.10 installed and the source project cloned locally, proceed to open the Daggerfall Unity project and we can begin.

Prepare Mod Folder Structure

The first step to creating any .dfmod is to prepare a folder structure to organise all the files your mod needs. In this tutorial, we’ll put everything inside the Assets/Game/Mods folder. Locate this folder in the Project view and create the folder hierarchy as shown below in blue.

Create New Locales

Daggerfall Unity ships with only the English (en) locale. To add strings for additional languages, we first need to generate additional locales.

You will probably only want to create a single translation for your mod, but for the purposes of this tutorial, we’re going to create multiple languages to gain a better understanding of how everything works together.

  1. Click Edit menu > Project Settings
  2. Select Localization
  3. Click Locale Generator
  4. Find and select the French (fr), German (de), Korean (ko), Czech (cs) locales
  5. Once these locales are selected, click the Generate Locales button
  6. Navigate to your prepared DemoTranslationMod/Assets/Locales folder and click Select Folder

You should now have the following languages displayed in the Localization window. If not, just click Locale Generator again and add the missing locales.

Then inside your mod’s Locales folder, you should see the following files. You’ll note that English (en) is not included, that’s because this locale is already part of the core game.

Create String Tables

Now that we’ve created our locales, we can generate new String Table Collections for translated text.

A string table is basically a text database where all strings in the game are held. Each string is uniquely identified by a key that remains the same across all locales. When the game needs to display a string to the player, it will lookup that key within the string tables for current locale.

In this tutorial, we’re going to create a custom English (en) translation to demonstrate that it’s also possible to change core text through the localization system.

  1. Window menu > Asset Management > Localization Tables
  2. Click New Table Collection
  3. Ensure all locales are selected
  4. Enter new Table Collection Name of Demo_Strings
  5. Click Create String Table Collection button
  6. Navigate to your prepared DemoTranslationMod/Assets/StringTables and click Select Folder

Repeat the above process to create a second set of string tables called Demo_RSC.

Once this is completed, you should see the following collection of files inside your DemoTranslationMod/Assets/StringTables folder.

You don’t need to be overly concerned about these files or how they work. Just having them present in the right folder is all that’s needed for now.

To open your string tables for editing, click Window menu > Asset Management > Localization Tables.

Use Selected Table Collection to select between your mod’s Demo_Strings and Demo_RSC string tables.

You’ll notice new string tables are all empty. This is where we get to the next step and import text from classic Daggerfall with all the right keys so we can begin writing translated text.

This will be covered in Localizing Strings in Daggerfall Unity – Part 2.

Daggerfall Unity Beta 0.11.1

Welcome back everyone to the first release of 2021! Daggerfall Unity Beta 0.11.1 is now available from Live Builds page. Following is changelist by contributor.

General Fixes & Improvements

Deepfighter

  • Include BIOGfix patched BIOG files to base game

Ralzar

  • Move skill check for Stealth into Formula Helper to support modding

Ferital

  • Ensure both Mages Guild songs can be played
  • Fix several naming macros to be more deterministic
  • Fix %pcn macro written as %pfn and missing apostrophes
  • Fix model 729 entrance left door texture

XJDHDR

  • Set DoorModelIndex public for mods
  • Add ability to bash doors placed by CustomDoors

Hazelnut

  • Fix horse base speed for mods – i.e. galloping fix
  • Refactor nature layout to own class and interface to support modding
  • Ensure last location is stored when entering a building
  • Update paymoney quest action to only allow gold to be accepted if desired
  • Adjust position of item-based player torch to throw some visible shadows
  • Add NameSeed to building overrides
  • Add a way to query for a specific building override without need to set last location first
  • Vary NameSeed in world replacement data so names differ in each place block is used

TheLacus

  • Store enabled mod build targets in editor
  • Fix and improve code XML documentation
  • Fix runtime materials when dungeon models used outside of dungeon
  • Automatically import mod manifest after creation or changed in editor window
  • Refresh cursor at start to fix issue with disabled cursor mods

Pango

  • Fix black screen bug with Alternate Music enabled in some dungeons
  • Fix improper “you wake up” in rest UI after rest previously being interrupted
  • Fix additional seams in classic sky background
  • Recursively update MeshRenderers in Automap for better compatibility with modded models
  • Fix “can’t carry anymore” when picking up maps

Jefetienne

  • Fix multiple bugs with default bindings and primary/secondary bindings
  • Set mod warning box default button to “yes”

Inconsolable Cellist

  • Fix %pcnf to %pcn typo in dialog file

Kamer

  • Fix unused face data for male Nord

Interkarma

  • Fix monsters like Atronachs and Dreughs incorrectly hitting for bonus damage even when hit missed
  • Use MagicItemTemplates JSON for generating magic items so items are not generated using legacy unpatched gamedata
  • Remove per-task click rearming for “clicked npc”, ” clicked foe”, “toting item and clicked npc” to fix click clearing prematurely in some cases
  • Use Woodland Hills nature set in MountainWoods biome
  • Refactor huge text block in ID 9000 (class questionnaire text) to individual records 9000.1 through 9000.40 for easier editing and formatting
  • Travel map now gets location name and initial discovered state from world replacement data
  • Spellbook list now always accepts keyboard input, not just when mouse over control
  • Refactor BIOG reading to use StreamingData as source over classic gamedata, allowing inclusion of fixed data

 

New Localization Tutorials

I’ll soon begin posting a new series of localization tutorials to the front page of dfworkshop.net. This will cover the process of creating a text localization mod covering multiple languages. It will show the full process of setting up assets, localizing text, assigning custom fonts, and building your mod for distribution. If you’ve never created mods for Daggerfall Unity, please take a look through the Modding System documentation. Localization mods need to be built and distributed as .dfmod files, which requires Unity to create and package mod. A lot of the steps for creating a localization mod are common to creating any mod, so it’s helpful to have some experience here.

Once the tutorial series is completed and DFU’s localization system is no longer in preview, this tutorial series will be maintained as part of the Modding System documentation.

Daggerfall Unity Beta 0.11.0 – Milestone Accomplished

The first official beta release for Daggerfall Unity is now ready to download from Live Builds page. This is only a small update over 0.10.28 release, which was a “pre-beta” test just to make sure there were no showstopping bugs before Beta proper. If you haven’t already, please read that article for more information about recent builds.

So yeah – beta. The game is feature complete and working well. If you’ve been waiting to play Daggerfall with smooth controls, quality of life improvements, and epic mod support, there has never been a better time than now. We still have some quirks and bugs that need to be fixed, but after 18 months of intensive fixes and improvements during alpha, this game is in pretty good shape. The feedback loop of near-monthly releases to community with rapid fixes over several years has proven to be a good formula for this kind of game. This will continue right through to 1.0 and beyond to make the best version of Daggerfall possible. Only the frequency and magnitude of updates will slow down as there’s not much left on the plate beyond fixing bugs and gradually expanding mod support.

If this is your first time here – welcome! You might also be wondering what Daggerfall Unity is, how it came to be, and who were the people involved? So rather than just info-dump the small number of changes in this release (scroll to the end for that), I thought it might be a good time to take a look back at the journey leading up to this point. We only get to reach beta once, so pull up a chair and settle in for the ultra-condensed version. I won’t bore you with the full history, you can check out the About page and this tweetstorm for more about me and this whole journey.

 

The Early Days 1996-2003

My name is Gavin “Interkarma” Clayton and Daggerfall Workshop is my site. After buying Daggerfall in 1996, I fell in love with the game. So much so that by 2000/2001, I began writing tools to view textures and 3D models from the game, including small chunks of locations called “blocks”. This culminated in a program called Daggerfall Explorer written for Windows 95, which incredibly still works today. Daggerfall Explorer was written in C++ and used a custom 3D engine on top of DirectX 8.1 which I called the Alchemy Engine. Sweet name, right?

 

Notable other people around this time were Dave Humphrey who founded the UESP, and Donald Tipton who made several excellent tools. There were many others hacking away at the game data formats back then, and my early efforts build directly on the knowledge they shared. Not everything was well understood, however. Some real basics like how UV coordinates were stored and several other file formats were still a complete mystery. These would continue to be understood as the years rolled by thanks to a sharing and wonderful community.

I continued to build more tools for Daggerfall such as Daggerfall Cartographer (view full cities), Daggerfall Imaging (view and export textures), and Daggerfall Jukebox (play and export music). Late in this tool-building stage, around 2003, I actually attempted a Daggerfall remake that didn’t get off the ground. I didn’t have the experience and the necessary social framework for this kind of project simply didn’t exist, so this attempt failed rather quickly. It was a good learning experience, but my interest faded for a while after that.

 

More Tools 2009-2012

In 2009, I got back to work building more Daggerfall tools. This time around, I constructed a C# library called Daggerfall Connect to read the game data formats and update with some of the new understanding of file formats that had emerged through the intervening years. This culminated in Daggerfall Imaging 2 and Daggerfall Modelling, both evolutions of my previous tools. By this point, it was possible to explore entire cities and dungeons, and even export models to COLLADA format.

 

A code library written in C# turned out to be a great decision. This library was very fast and portable between engines – even operating systems. Without realising it, I was laying the foundation of would eventually become Daggerfall Unity.

 

Daggerfall Tools for Unity 2014

Looking around for something to do while learning the Unity engine in 2014, my wife suggested doing something Daggerfall related. Start with something familiar to learn something new. After a few hours of tinkering, I found my old C# Daggerfall Connect library would plug directly into Unity, and I had the foundation of what became Daggerfall Tools for Unity.

 

In a couple of months, I had the whole world working with basic exploration and combat, and it was obvious we had something special on our hands. It wasn’t a full remake just yet, but even at this early stage a few contributors had appeared like Lypyl and Nystul, helping to expand the tools and show just how easy it was to create cool Daggerfall stuff. Remixing and rebuilding Daggerfall had never been more open and easy to all-comers.

 

Daggerfall Unity 2015-Present

By mid-2015, the number of voices asking for a true remake became overwhelming. I drafted a Mission Statement and a Roadmap that would define the next several years of my life, and the lives of many others. By November 2015, the first test build of Daggerfall Unity was released with Character Creation and most of the game’s framework in place. It was pretty raw and I still had no idea how to do a lot of stuff, but the bones were solid and the heart was beating strongly.

This is where other serious contributors started appearing and helping to build the game. After Lypyl and Nystul came TheLacus, InconsolableCellist, Allofich, Hazelnut, Numidium, Meteoric Dragon, Pango, Jay_H, Ferital, JorisVanEijden, and jefetienne. These were the contributors who made frequent and substantial contributions to the game and it’s underlying code.

It’s simply not possible to cover everyone’s work over the last several years in full detail, but I’ll try to cover the highlights. Read back through the update archive on this site for the full history or review our GitHub Contributors page to see just how much work has gone into this game. I’ll keep expanding this list out as the right words come to me. If anyone feels left out here, it’s not intentional. There are just too many people involved and so many years of work to think of everything. If I’ve missed something you’re proud of, please contact me and I’ll add it below.

Lypyl was the very first contributor and champion of Daggerfall Tools for Unity. He reverse engineered and implemented pretty much all remaining dungeon action records, and did some truly wild and wonderful things with DFTFU. He created the Enhanced Sky mod and architected the foundations of the mod system we still use today.

Nystul implemented the Automap and Talk UIs, and some amazing early mods like Distant Terrain and Realtime Reflections. Nystul was also involved in several other systems critical to the game’s early development.

TheLacus is most known for dialling the mod system up to 11 and building on top of Lypyl’s early foundations. TheLacus also documented the Daggerfall Unity API and mod systems in great detail, and created excellent tools around mod and quest authoring. Without this important work, the mod scene would be much smaller than it is today.

Allofich famously excavated the guts of classic Daggerfall to help DFU stay true to classic’s formulas and behaviours. Allofich also implemented advanced enemy AI and much more. His insights into Daggerfall’s inner workings advanced our knowledge well beyond the Chronicles and UESP alone. The game we have today would be far more divergent without him.

Ferital also reverse engineered several vital systems from classic and helped them reach parity in DFU. The talk and reputation systems particularly were refined extensively by Ferital. He’s also known for fixing many texture issues and other small gripes with classic game data so that DFU can be a better experience. On a personal note, Ferital was one of the first to encourage and support my exploring tools back in the early 2000s.

Hazelnut burst onto the scene with horse riding and went on to implement guild services, taverns, potion maker, and much, much more. Hazelnut is also a powerful force in the modding community, building support and helping others come to grips with the mod system. His mods are legendary, including Archaeologists, Roleplay & Realism (with Ralzar in parts), Basic Roads, and more. He is not only one of the most prolific contributors to Daggerfall Unity, he has been a true friend and supported me privately through some of the darker months. There’s no way to accurately capture just how important Hazelnut is to this project.

Meteoric Dragon built Advanced Climbing and other movement & camera systems. He also helped refine systems like underwater swimming, climbing out of water, and smoothly mantling onto a surface. If you walk, run, jump, swim, climb, or fly in Daggerfall Unity then you’ve experienced Meteoric Dragon’s work. He also added some work to the effect system and a few other subsystems beyond movement.

Jay_H was our resident quest ninja, building hundreds of new quests for Quest Pack 1 while performing deep fixes and improvements to the classic quests. Jay_H was also a positive force in the community helping others come to grips with the quest system and always ready with kindness for others. He helped moderate the forums and keep our little corner of the web a nice place to visit.

JorisVanEijden expanded our knowledge of the quest system, helping it to reach closer parity with classic. He also refined many subsystems and expanded on areas where my work could be considered “placeholder” at best. Joris was another one who patiently supported me when I struggled to understand something fully. The game is better in several places thanks to his help.

Jefetienne constructed the controller input system while overhauling and improving many part of input and related UIs. He is also known for opening some parts of the core game up to mod system, and helping to find and fix several bugs. He also created the screenshot feature and advanced keybinds UI.

Numidium is best known for custom class creator, class questionnaire, and many fixes and improvements across the core game. Numidium also implemented several artifacts for the effect system and bug fixes in other parts of the game.

Pango is another prolific core contributor to Daggerfall Unity. He worked hard through every system of the game, fixing bugs and improving as he went. I’ve watched him support people on several platforms in multiple languages. There just aren’t enough words for how important Pango was to this whole process. There was no job too big or too small for him to take on. He filled in the blanks where my own knowledge was lacking, and remained patient with me when I lacked understanding. Daggerfall Unity would be half the game it is today without his patient and clever hands on the wheel alongside us.

On the modding side, there are also many notable figures who deserve a mention.

King of Worms created the amazing D.R.E.A.M. mod which enhances almost every part of Daggerfall Unity from the textures to the music, to little touches like night and day dungeon exits. His work became so familiar that to many people it’s simply impossible to play Daggerfall Unity without his mods installed.

AlexanderSig crafted the sublime handpainted 3D models to uplift the base assets and even replace many 2D objects with true 3D objects. His work is also closely associated with Daggerfall Unity.

Uncanny_Valley is behind Taverns Redone, Mountains & Hills, and more.

Ralzar has created almost a dozen fantastic mods like Climates & Calories, Torch Taker, Realistic Wagon, Unlevelled Loot, and more. He has also been active helping users across the forums and on reddit.

Kamer is the mastermind behind the fiendish Warm Ashes quest mods pack, adding dangerous encounters around dungeons, wilderness encounters, sieges, and more. He has also created visual mods adding Rocks and Windmills, and expanded on town populations in Villager Immersion Overhaul.

There are so many others who made important contributions helping Daggerfall Unity become what it is today. Head over to the Credits topic on forums to see a complete list. In total, more than 45 people helped to make Daggerfall Unity. That’s just on the development side, it doesn’t count the modders and scores of community members reporting bugs over the years. Something that started as a small solo project quickly exploded into one of the most comprehensive and successful fan recreations of a classic game to date. Even if you hold no love for this project, it’s hard to deny just how hard everyone worked, how much love was involved, and how successful the project model proved to be.

 

Plea for a Future

Daggerfall Unity is made by the Daggerfall community out of love and love alone. This project has never been and will never be monetised. This site has no advertisements and no donation button. I didn’t create a Patreon for the whole of Daggerfall Unity’s development. Every time someone offered to contribute money to me or the project, I politely refused. At every turn, I tried to send a clear message this project is not about making money from Bethesda’s intellectual property. Even the name Daggerfall Unity is more a play on words – it references the engine used but is really a testament to the open development process. Daggerfall Community Edition would have been just as good a name.

Furthermore, you must own a copy of Daggerfall for the asset files essential to make Daggerfall Unity work. It’s a drop-in engine replacement over the original game, not a standalone product. Thankfully, Daggerfall itself has been freely available from Bethesda themselves and many other places online for several years. This means DFU is really a free upgrade to a free game, made by the community for the community.

For all these years, Bethesda has quietly tolerated our tiny presence working in their shadow to rebuild and reimagine their greatest early game. They could have squashed this project at any time, but mercifully chose to let it thrive as an offshoot to the wider Elder Scrolls modding scene. For that, I want to say thankyou. From the bottom of my heart – thank you. This game means the world to me and many thousands of other people. I’ve been contacted by people who said this game played a part in helping them out of depression and reconnecting with friends, that it made their lives better. I believe these heartfelt words and it brings me joy to know all these years of work have brought other people some happiness.

With that, I want to make a simple plea. Please let Daggerfall Unity continue to thrive in the hands of the community who created it. As ownership of The Elder Scrolls passes to Microsoft and into new hands, please let this project continue to be everything it can be. This is something special and virtually unique. A functioning and complete fan recreation that survived not only its own development but the potential of being shut down at any time. It’s a strange and beautiful thing that has no real right to exist, and yet here it is. Please let it continue to be.

 

Conclusion

That’s all from me for now. Daggerfall Unity is feature complete and can only get better from here. The beta builds are ready for download and Nexus has well over a hundred Daggerfall Unity mods all ready for your enjoyment. Go play and be happy, then send us some feedback. We made it so far thanks to positivity and encouragement from others, and I’m confident that will continue into the future as we approach 1.0. Even as our many developers come and go, the project itself lives on with its singular spirit of collaboration.

As promised, there are a few changes in the 0.11.0 release. Here’s a quick list for anyone wanting the patch notes for this version.

  • Alternate Music setting to play FM versions of songs (Numidium)
  • Allow custom Renderer for ObjectPositioner (TheLacus)
  • Improve indoor guard spawns to use farthest entrance (Numidium)
  • Harden SettingsManager against bad values read to reduce most cases of broken settings.ini causing a black screen (Interkarma)
  • Flag emission for special case windows 036_2, 151_3, 154_3, 351_3 (Interkarma)
  • Fix desert Mages Guild window emission (Interkarma)

Daggerfall Unity 0.10.28

The latest update for Daggerfall Unity is now available on Live Builds page. If all goes well, this will be the last release under the Alpha tag and there will be a minor update soon into Beta. That’s right! Daggerfall Unity is feature complete and I marked off the final items on Alpha roadmap the other day. This release is a pre-beta test just to catch any last minute showstoppers before rolling over.

Does that mean Daggerfall Unity is done and dusted? Not quite yet, but it does mean work on new features is now at an end. From this point the only changes will be bug fixes, minor refinements, and incremental progress to modding/localization support. This is the real final stretch to 1.0, which I hope to reach in 2021 once I’m happy with overall state of game.

For the last year or so communicating where DFU is up to has been a challenge, as it’s a really a couple of projects in one. The core goal of the game has always been to recreate classic Daggerfall with some refinement and quality of life features. Then we have loads of features unique to DFU like epic mod support and some wild and wonderful core features that emerged along the journey (such as personal torches and advanced climbing). This means DFU is a also a superset of classic Daggerfall, and is why I often refer to it as Classic Daggerfall Plus. It’s the same game, with more.

This led to a situation where the core game has been essentially complete and very playable for over a year while these superset features continued development. We stayed in Alpha because DFU as a whole still wasn’t done. This in turn created confusion as people wondered how finished the game could be if it was still considered Alpha. This undermined what an incredibly functional and playable bit of software Daggerfall Unity really is. So it gives me great pleasure to finally tear off that Alpha bandaid and give this game the credit it deserves after so many people have worked so very hard to bring it into existence.

Let’s take a look at what’s in this release.

New Features

Large HUD

For some Daggerfall players, the large HUD represents a tiny piece of its soul. The large buttons and compass help us recall our early days playing Daggerfall and provide a big visual connection to the past. So this feature is best summarised with a few screenshots. Here’s Daggerfall Unity running with Retro Rendering 320×200, palettization, and large HUD. The only “modern” feature I left enabled is shadows.

 

 

Of course, it’s not just for retro modes. You can enable the large HUD at any time by deselecting the Fullscreen box on pause menu. And in typical Daggerfall Unity fashion, this feature can be tuned to fit a wide variety of displays so most people will be able find a setup they like when choosing to play with this HUD. Let’s upack this thing.

Docked or Undocked?

By default the large HUD works just like classic. That means it shrinks the rendering viewport to area above the HUD and the crosshair position will be raised to become centred in smaller viewport. The HUD itself will scale to fit entirely along bottom of display, which might entail some stretching if you have an ultra wide display. In this state, the large HUD is considered docked to bottom of display.

 

If you jump into settings.ini and set LargeHUDDocked=False then your large HUD will instead sit on top of a fullscreen render without shrinking the viewport area. Crosshair position will remain in the same place as fullscreen mode. When undocked, you can adjust the scale of large HUD by changing value in LargeHUDUndockedScale. This is best for very wide displays where the large HUD might otherwise become too stretched.

 

Other Customisation

Other than docked/undocked, you can tweak the HUD in a few ways in settings.ini. I’ll list all the new settings here and what they do.

LargeHUDDocked – Set True to be docked and False to be undocked as above.

LargeHUDUndockedScale – Sets your undocked HUD scale between 0.25 and 2.0 depending on preference. Only works with undocked HUD.

LargeHUDUndockedAlignment – Set 0 for default (which is centred), 1 for left-aligned, 2 for centred, 3 for right-aligned. Only works with undocked HUD.

LargeHUDUndockedOffsetWeapon – Set True to offset weapon position above undocked HUD height and False to draw weapon against bottom of screen. Depending on your HUD scale, you might prefer to raise weapon above HUD or not. It’s not recommended to enable this setting with small scale HUDs or weapon will appear to be floating. Only works with undocked HUD.

LargeHUDOffsetHorse – Set True to offset horse above HUD height or False to draw horse against bottom of screen. This is True by default to match classic, but you can set this one for both docked and undocked HUDs. The horse takes up a lot of screen estate and it’s nice to drop it below the HUD to clean up the view some more.

 

Using Large HUD

For some people this will be their first time using Daggerfall’s large HUD, so it’s worth going through what all the buttons do. But first, how do you click those big juicy buttons anyway?

Just as in classic, use the Activate Cursor keybind to toggle cursor active/inactive while playing game (i.e. not paused). By default Activate Cursor is bound to the Enter key. While the cursor is active, you’ll be able to mouse over the large HUD and click buttons with either the left or right mouse buttons, which sometimes initiate different actions. When the cursor is active, you can also click on world objects like doors, levers, and NPCs using the mouse cursor rather than activating under crosshair as usual. To get back to mouselook, hit the Enter again to make the cursor inactive.

Now that you can click on the HUD, here’s what all the various bits do.

Portrait. Opens the Character Sheet.

 

Vital Indicators. Displays your current health (green), fatigue (red), and spellpoints (blue).

 

Options. Pauses game and opens pause menu.

 

Spellbook. Opens spellbook UI.

 

Interaction Mode. Cycles interaction mode through steal, grab, info, dialogue. Left mouse will cycle to next, right mouse will cycle to previous.

 

Inventory. Opens the inventory UI.

 

Ready Weapon. Raises or lowers the weapon in your equipped hand.

 

Use Magic Item. Opens the use magic item UI (if you have any usable magic items). This uses a popup list for consistency rather than fitting inside HUD area like classic.

 

Change Transport Mode. Opens transportation UI to set transport mode between foot, horse, cart, and ship.

 

Automap / Travel Map. Opens local automap or travel map. Left mouse click to open automap, right mouse click to open travel map.

 

Rest. Opens rest UI. Careful resting in town!

 

Big Spinny Compass. This is the real deal, made from the finest magnetic pixels. Click to open info status pop-up.

 

That covers everything about the large HUD for now. Just something worth mentioning, this HUD isn’t related to Cursor Mode movement (i.e. move by pushing mouse around screen) and classic’s View Mode with mouselook will remain the only control scheme into foreseeable future. With that said, all the work on large HUD recently has laid the groundwork for Cursor Mode, so this is likely to be added as a Beta stretch goal in the future. I’ll add this item to roadmap when confirmed.

 

Movement Review and Jumping Skill

Not so much a new feature as an attempt to better match movement (Walking/Running, Jumping, Falling) to classic Daggerfall. Part of this review was to implement the effects of Jumping skill on jump height.

Because classic Daggerfall itself doesn’t have well-defined movement elements, and CPU speed can change the speed and “feel” of these elements, it’s not really possible to match these perfectly with classic. So instead, I approached this with the mindset of ensuring that low-level characters always have functional running and jumping (e.g. run from trouble and jump low obstacles) while high-level characters still feel powerful and acrobatic. What this means in practise is a level 1 can jump onto the throne lift in Privateer’s Hold and run from that skeleton, and a fully buffed character at 100 SPD with max Jumping, Enhanced Athleticism, and spellcraft will run like the wind and be able to leap from rooftop to rooftop with ease. Here’s a summary of changes.

Walking – Carefully measuring walk speed in classic vs. DFU found that characters in DFU walked faster than in classic. This was tuned to match classic within a small margin of difference at various SPD levels. Interestingly, walking in DFU still feels faster as the framerate is smoother. But timing over long distance walks yields very similar timings to classic.

Running – This had received some tuning previously and already closely matched classic. Further tuning brought this into a smaller margin of difference. Again, running can feel faster in DFU due to smoother framerates.

Jumping – The largest difference is to jumping. The jump height in pre-beta DFU had received no tuning and was unaffected by Jumping skill. This means all characters were making huge leaps regardless of their skill at jumping. Now a character with a low Jumping skill will make smaller jumps than one with a high skill. You’ll always be able to jump onto low obstacles, but you’ll need to skill up to truly make those epic leaps. Athleticism will give player a +10% to jump height, Improved Athleticism another +10%, and Jumping spell will give you +60%. These all stack together so that a fully buffed character can leap onto low rooftops with ease. As an added bonus, the Jumping spell now grants air control. Rather than propel yourself helplessly past your target, you’ll be able to move slightly while airborne when the Jumping spell is active. This just makes it a bit more fun and magical, not to mention useful.

Falling – Measurement found that falling speed in DFU was marginally faster than classic – about 20%. But due to the effect of smoother framerate, a faster falling speed just feels better. Sticking with the classic falling speed makes falling and jumping feel floaty, something that isn’t so apparent in classic due to the clunky framerate giving it a heavier feel. For that reason, gravity and falling were left unchanged in DFU.

 

General Fixes & Improvements

  • Fix several errors in TEXT.RSC data via localization tables (Ferital)
  • Fix guild greetings for unique NPCs (Ferital)
  • Correct “Bhoriane” spelling everywhere (Ferital)
  • Remove %2com as not implemented in classic (Ferital)
  • Show RunInBackground setting in launcher, enable run in background by default (Pango)
  • Adjust dungeon micromap resolution and use square pixels (Pango)
  • Fix backstabbing transforming Seducers, they are now always considered facing player (Pango)
  • Apply bank loan default reputation loss only once (Pango)
  • Publicize parts of PlayerActivate and DaggerfallBaseWindow.NativePanel (jefetienne)
  • Publicize CurrentRestMode (jefetienne)
  • Remove SetupDefaults and add autofill parameter to ResetDefaults (jefetienne)
  • Ensure models with registered actions are not combined for RMB and interiors (Hazelnut)
  • Fix exploit for Knightly Order armor service (Hazelnut)
  • Fix “potion of <LocalText-NotFound>” and support localization of potion name (Interkarma)
  • Fix potion recipe name being blank or displaying “<LocaleText-NotFound>” (Interkarma)
  • Fix null exception when no rumours available (Interkarma)
  • Fix variant count of Formal Eodoric (Interkarma)
  • Fix Short Shirt variant counts (Interkarma)
  • Fix active spell tooltips not working when cursor active (Interkarma)
  • Fix texture cracking in vertical scroll thumb (Interkarma)
  • Fix inventory crash against certain corrupted/modded items (Interkarma)
  • Chance-based potion effects now always succeed to be consistent with other magic items (Interkarma)
  • Fix LocalScale in Panel fill texture (Interkarma)
  • Store DFU version in quest state to help identify version quest compiled under (Interkarma)
  • Implemented “add potion” console command (Interkarma)
  • Use “target at range” not “touch” for action object spells to fix null exception (Interkarma)
  • Start groundwork of book localization – not yet ready in game (Interkarma)
  • Disable camera recoil when cursor active (Interkarma)
  • Use available snow textures for swamp castles (Interkarma)
  • Use smaller dungeon state as set when quest compiled to prevent target ending up in void (Interkarma)
  • Groundwork for further refinements towards full smaller dungeon support (Interkarma)

 

I hope you enjoy this release!