Modding Daggerfall Tools for Unity

I just started an open conversation around modding Daggerfall Tools for Unity on the forums. Please feel free to jump in and let us know your thoughts.

Daggerfall Tools for Unity Mod Discussion

If you are planning to start a project for texture replacement, model replacement, etc. let me know about it, I’d be happy to feature your work. I can also create a new forum room for larger projects to help discussions and organisation.

New Workshop Members

Daggerfall Workshop is expanding today. I’d like everyone to welcome Nystul, InconsolableCellist, and LypyL to the site!

Over the last several months, I have been amazed by the contributions these three have made to Daggerfall Tools for Unity. They have all selflessly offered code, reported bugs, raised ideas, and generally helped to refine the vision of these tools. But most importantly, they demonstrated the power of open source at work inside a passionate community. They have each shown what is now possible with Daggerfall and Unity.

Anyone following me on Twitter or watching the DFTFU Subreddit may be familiar with their work already. Here’s a sampling, just to be sure.

Nystul

Nystul created a Terrain Extender script for the default Streaming World terrain. This enlarges the default draw distance of a few miles out to insane distances. Nothing shows this better than a couple of screenshots.

Below screenshot was taken just above Direnni Tower using the default Streaming World setup in Daggerfall Tools for Unity.

direnni_near

Not bad! Definitely a huge improvement over the painfully short draw distances in vanilla Daggerfall. But check below for how this same spot looks with Nystul’s Terrain Extender.

direnni_far

That popping sound you heard was my brain exploding. You can see clear across the Isle of Balfiera archipelago to the mainland. Simply amazing! And here’s another lovely far terrain screenshot.

mountains_far

 

LypyL

LypyL is the creator of the jaw-dropping Multiplayer Demo. This was literally a Daggerfall world-first, allowing you to explore the Illiac Bay and its thousands of locations with other players. If you missed out dungeon crawling with mates, I strongly recommend you give it a shot by clicking on that link!

Besides multiplayer and other enhancements (e.g. climbing and flying), LypyL has also proved to be a fearless experimenter, showing us the mad fun you can have with an open source Daggerfall. The below videos put me in mind of the vast mod potential enjoyed by later Elder Scrolls titles.

This kind of spirited tongue-in-cheek modding is exactly what I was hoping to empower everyone with from the outset. Not only can we remake Daggerfall, you can use Daggerfall Tools for Unity however you like!

Oh, and LypyL has also been working on a dynamic sky system for Daggerfall Tools for Unity.

 

InconsolableCellist

Speaking of remaking Daggerfall, this last contributor is by no means least. With the stated goal of creating a fully playable version of Daggerfall, InconsolableCellist is working towards the outcome I think everyone wants to see the most. He has also proven to be a great contributor, expanding the default tools and building all the scaffolding of a real game.

Obviously there’s a fantastic amount of work to do, and much of it is hard to show off visually. But InconsolableCellist has been working very hard indeed, building GUI systems, a text console interface, monster spawners, timers, quest logic, and much more. Best of all, he is continuing the spirit of open source by keeping everything available to the community on his Daggerfall Unity GutHub repository.

Below is an early look at InconsolableCellist’s quest system back-end in action.

And here is a screenshot of the text interface a bit further along, looking more like Daggerfall.

ic_dialog

InconsolableCellist has also experimented with running Daggerfall on the Oculus Rift. This was simply a proof-of-concept (and based on a much earlier version of Daggerfall Tools for Unity), but it demonstrates that we can one day play Daggerfall on VR headsets.

What Happens Now?

Daggerfall Tools for Unity is an interesting project all by itself, but the real story is what other people do with those tools. We have finally reached a point where the story becomes less about me and more about those who build on what I started.

InconsolableCellist, LypyL, and Nystul are now full posting members of Daggerfall Workshop. This means they can show off their progress right here and entertain us with the occasional blog post.

These three will also have collaborator rights to the Daggerfall Tools for Unity GitHub repository, allowing them to post changes to support their own work, help support others, and expand our tools into the future.

For my part, I will continue working just as I have been in the past. I will keep on reverse-engineering bits of Daggerfall, adding new features, fixing bugs, and help oversee the continued vision and quality of code changes. My job as tool creator is to help keep the tools useful and free for everyone.

The real story of Daggerfall Tools for Unity is just beginning! The more people who contribute, and the more this community grows, then the more amazing stories we’ll have to tell. I look forward to seeing what this all means for Daggerfall in the future.

Stay tuned! There is more exciting news still to come this week.

Unity 5 Transition Progress

I’m working through code changes required to transition Daggerfall Tools for Unity to Unity 5. The first priority is full compatibility then I can look at taking advantage of new features.

Here is a summary of compatibility tasks I am working on and those which have been completed. I will update this list as I progress and release a Unity 5-compatible Developer Preview of 1.3 when ready. This should be available within a week.

Notice

Initial Unity 5 compatibility update is now available on git. I still need to do more work and testing but it should be mostly good to go. Just avoid the new Deferred Shading path for now.

In Progress

  • Fix billboard batch shaders self-shadowing in Deferred Shading path.
  • Update Streaming World Demo with effects now available to all users.

Completed

  • Fix default reference changes.
  • Fix white terrain textures.
  • Fix MIDI synthesizer not running.
  • Fix MIDI synthesizer sample speed.
  • Fix sound effects based on audio changes.
  • Fix obsolete methods/properties and other warnings.
  • Fix DaggerfallActionDoor collider errors.
  • Fix PlayerMouseLook exploding/bugging out.
  • Update integrated iTween to latest version.
  • Fix fog in Deferred Shading path. (N/A. Requires new Global Fog effect). This will be part of new demo scenes in future update.

Unity 5 Released!

Unity 5 has been released, and with it comes the new Personal version with all the same core engine features as Professional. This is great news for Daggerfall Tools for Unity! Here’s why.

  • Deferred path for everyone. Daggerfall uses many small dynamic point lights, ideally suited for deferred rendering. Up until now Free users were limited to the Forward path, which struggled with Daggerfall’s lighting. As an added bonus the new Deferred Shading path is even sexier than the old Deferred Lighting pre-pass (now called Legacy).
  • Render-to-texture. There are many real-time effects that can only be accomplished when rendering direct to a texture. This feature was completely absent in the old Free, which means I couldn’t make use of it in the tools.
  • Post processing and advanced water. All of these Pro-only features are now available to everyone, and we can finally make use of them as standard.
  • 64-bit editor. The new editor performs substantially faster on city imports and in many other areas.
  • Improved physics. As in, hugely improved! Moving static colliders now incurs almost zero cost, which fixes several problems around a floating origin in streaming world.
  • Physically Based Shading, real-time shadows on any light, and general sexiness. Now there are even more ways to spice up Daggerfall’s boxy models to look their best.

And that’s just the main stuff. There are also improvements to audio system and throughout Unity as a whole.

Considering the number of awesome features now available to all Unity users, I will be shifting Daggerfall Tools for Unity up to 5.0 and dropping a 1.3 Developer Preview as soon as possible.

Streaming World 1.2 Release Demo

I had this buried in the 1.2 release post earlier and forgot to post it to the Demos page, which means a few people might have missed out the latest demo code. Reposting just in case!

WayrestInWinter

 

Features

  • Huge streaming world over 340,000 km/2 created at runtime.
  • Over 15,000 fully explorable locations and dungeons.
  • MIDI synthesis and context song manager.
  • Full day/night cycle, seasons, and weather effects.
  • Enemies in dungeons, including random enemies based on dungeon type.
  • Basic combat system.

Streaming World 1.2 Release Demo

Controls

General

  • Mouse move to look.
  • W, S, A, D to move.
  • SHIFT (hold) to run.
  • SPACE to jump.
  • LEFT-CLICK mouse to open doors, enter dungeons, operate switches, etc.
  • ESC to exit game (standalone).

Weapons

  • Z to toggle weapons.
  • Right-click and drag mouse to swing weapon.

Transport

  • R (while outside) for random location, season, time of day, and weather.
  • R (while in dungeon) to recall back to dungeon start.
  • 1-7 for preset location (keeps current season, weather, etc.).

Music

  • P to toggle songs on/off.
  • [ to play previous song in context playlist.
  • ] to player next song in context playlist.

Timescale

  • – to reduce timescale (0-8 steps).
  • = to increase timescale (0-8 steps).

Other

  • I to toggle mouse invert on/off.
  • H to toggle high speed running on/off.
  • L to toggle debug text on/off.

Text And Localization – First Look

Text, text, text! There’s so much text in Daggerfall – from “Rat just died” all the way up to multi-page books. Before it’s possible to tackle many gameplay elements, something must be done about all this text. All the better if the text engine provides localization features at the same time.

Rather than start from scratch, I have integrated the excellent free Unity asset Smart Localization into Daggerfall Tools for Unity. On this solid foundation, I’m building import tools to convert Daggerfall’s various text sources into a format that can be easily localized and consumed at runtime.

Let’s take a look at the basic workflow. Everything starts with creating a “Localization Workspace” in your project Assets. By the way, it’s possible to work on translations without Unity installed, more on this towards the end.

SmartLocalizationSetup

What you see above is the Smart Localization workspace. I have already created 3 languages for English – en, French – fr, and German – de. There is also a Root Language File, which needs a bit more explanation.

The Root Language is a database of native key/object pairs that can be morphed into other supported languages. In addition to strings, the Root Language also supports images, sounds, and other game objects.

I am writing one-click importers that transfer text data out of Daggerfall’s various files (even the .exe) into their own text namespace. See below for an example after importing the contents of TEXT.RSC.

RootKeyImportFromDaggerfall

There’s a fair bit going on here, so I’ll break down all the parts.

Type is the type of asset being worked with. These are all STRING for now, but GAME_OBJECT, AUDIO, and TEXTURE are also supported.

Key is the unique key for this resource. As we’re importing from Daggerfall, the tool maintains each unique key in its own namespace. RSC means that TEXT.RSC was the source and the following digits are the unique ID for that text record. Each distinct resource will have its own three-letter namespace (BOK, IMG, SND, etc.) and unique ID.

Comment is the actual value, or contents, of that record. Anyone that has worked with Daggerfall’s text data will be familiar with the % codes. What’s a little different are how the control bytes are parsed into text format, for example [0xFD] for end of line. This is done because the control bytes are not valid characters for XML (which is how everything is saved to disk) and they are not generally human readable. The [0x00] format makes it very clear where control bytes are used and simple for a human to edit. It’s also trivial to parse these back into byte format.

A little more on those control bytes for anyone unfamiliar with them. They are basically for TTY-styled formatting. They control things like text position, justification, and font, and are very specific to the native Daggerfall GUI at 320×200 resolution. It’s very likely that future developers will prefer not to use the control bytes for their modern scalable UI. However, I pass through the control bytes exactly as-is and its up to the end developer how they wish to use them. If you would like read more about Daggerfall’s text then this article would be of use.

Once the Root Lanuage is ready, it’s time to create our translations. As the text is already in English – en it’s just a simple matter of opening that language and copying all values from Root.

TranslationEN

Now the great thing about Smart Localization is that it supports CSV import/export. This means you can export out your language data to CSV file to edit in Excel or similar tool.

SpreadsheetEN

Because everything is uniquely keyed, translation teams can build “master” CSV files that implementors can use to quickly add/update languages in their projects. For example, below is the CSV for German – de from their TEXT.RSC file.

SpreadsheetDE

And then imported into Unity ready to use in a game project.

TranslationDE

One issue with existing translations is that localization teams have needed to squeeze more complicated character sets down into Daggerfall’s 8-bit format. The good news is this is no longer necessary – you are no longer limited by Daggerfall’s engine. The bad news is that a lot of text will probably need to be rewritten for true character set translations for modern platforms. I will work with international Daggerfall fans to ensure they can use native character sets in the translation tool chain.

So we can create a giant resource database and spin-off various translations. How does this get used in a game project?

Accessing localized resources is very easy. For example, to retrieve a localized text string above, you would use the following code. Other resources are just as easy.

string textValue = LanguageManager.Instance.GetTextValue("RSC.1004");

As the native IDs are preserved, it will be easy for upstream developers to call for the correct translations as linked from quests and elsewhere. You can also add custom values for your own project, just need to give them a unique key.

Fell free to hit me up in the comments or via email if you have any question.

Daggerfall Tools for Unity 1.2!

The huge 1.2 world update is finally live! The tools have come so far since 1.1 and a big thank you is in order to everyone who tested Developer Preview versions and sent me feedback. You’ve all helped 1.2 become more than it could have been without you.

DaggerfallUnity

What’s New!

Core

  • Now requires Unity 4.6. (and not yet compatible with 5.0).
  • Vast streaming world can be created procedurally at runtime.
  • Blazing-fast billboard system for dense trees.
  • Tilemap shader for retro-style ground textures.
  • Enter any valid building or dungeon.
  • Random encounter tables in dungeons.
  • MIDI synthesizer with custom SoundFont support.
  • Hundreds of bug fixes and small improvements.

Demo

  • Complete streaming world demo scene included with all code.
  • Weather effects with Weather Manager.
  • Helpers to change lighting based on time of day, season, dungeon.
  • Contextual Song Manager to play music appropriate to player.
  • Ambient Effects Player to play sound effects in dungeons, etc.
  • A player compass.
  • Footstep Manager to change footstep sounds in winter.
  • Example enemy and player scripts for basic combat setup.
  • Many more small helpers and one-shot classes to learn from.

Get The Release!

Watch The 1.2 Feature Video!

Play The Demo!

Controls

General

  • Mouse move to look.
  • W, S, A, D to move.
  • SHIFT (hold) to run.
  • SPACE to jump.
  • LEFT-CLICK mouse to open doors, enter dungeons, operate switches, etc.
  • ESC to exit game (standalone).

Weapons

  • Z to toggle weapons.
  • Right-click and drag mouse to swing weapon.

Transport

  • R (while outside) for random location, season, time of day, and weather.
  • R (while in dungeon) to recall back to dungeon start.
  • 1-7 for preset location (keeps current season, weather, etc.).

Music

  • P to toggle songs on/off.
  • [ to play previous song in context playlist.
  • ] to player next song in context playlist.

Timescale

  • – to reduce timescale (0-8 steps).
  • = to increase timescale (0-8 steps).

Other

  • I to toggle mouse invert on/off.
  • H to toggle high speed on/off.
  • L to toggle debug text on/off.