Faction Support

Just a quick post today. I have implemented the faction back-end for Daggerfall Unity, which is a key pillar of quests and NPC dialog. Here’s the data shown as a flat list in the Unity editor. All parent-child relationships are actually in place, list is just drawn flat for debugging.

Factions

Starting faction data is parsed from FACTION.TXT and your save games are supported too! Importing a classic save will now also import your standing with all factions.

While there isn’t much happening with factions yet in Daggerfall Unity, it’s impossible to implement many gameplay systems without them. I look forward to doing much more with this data in a future build.

Building Names

One of Daggerfall’s long-running puzzles is how to generate the correct building name for any given building in a location. Daggerfall’s binary data exposes this information only as a seed value with no obvious correlation to the final name. From today, I’m happy to say this has been solved and I will be able to generate proper building names in the future. This article is a summary of the technical journey, minus all the dead ends and frustration.

The seed value used to generate building names has been known about for some time. This can be found in the BuildingData structure (link to UESP). The first step along the way was to generate some known values by changing a known seed value in MAPS.BSA. I started at the location Ashfield Hall in the Daggerfall province, which has a single tavern and some residences. Taverns are a great place to start as they have a very obvious PartA + PartB structure. For example The Bat And Skull. In Ashfield Hall, our single tavern is the The Howling Stag with a name seed value of 27748.

The first thing I did was change the name seed value for The Howling Stag in MAPS.BSA then start up Daggerfall to see how the name changes. Here’s a small sample of names generated from seeds 0-3. Keep this list in mind as we’ll return to it later.

0 = The Dancing Chasm
1 = The Knave and Scorpian
2 = The Pig and Ogre
3 = The Thirsty Fairy

Now I have somewhere to begin. I know the building is a tavern and have a sample group of seeds that result in specific names. The next trick is to work out how Daggerfall derives these names from the seed value.

I open up FALL.EXE in a hex viewer and search through for strings like “The Dancing” and “Chasm”. These strings are easy enough to locate, but these are just resources packed into the executable. What I need is the actual PartA and PartB tables Daggerfall is selecting from at runtime.

To get this information, I first have to use the DOSBox debugger to dump out memory from Daggerfall while it’s running. I can then search not just for strings, but for memory offsets pointing to those strings. I write a small bit of code to do the searches for me, and it doesn’t take long to find the correct offset tables for Part A and Part B of tavern names. Just think of this as a pair of arrays. In this case, both arrays are 36 elements long. Here they are as captured from the spreadsheet I dumped them out to.

TavernNamePartsAB

So how do we go from a seed of 0 to The Dancing Chasm? This is where most of the difficulty started. It was obvious Daggerfall used a random number generator to pick both parts, but the trick was to find the correct random number generator used by Daggerfall’s C compiler circa 1994-1996. Fortunately, I also needed this for correct texture table generation (still an open problem at time of writing) and had previously researched the correct random generator, known as a linear congruential generator, specific to Daggerfall. Here it is for completeness.

static ulong next;
public static void srand(int seed)
{
    next = (uint)seed;
}
public static uint rand()
{
    next = next * 1103515245 + 12345;
    return ((uint)((next >> 16) & 0x7FFF));
}

There are two methods here, one to set the seed (srand) and another to generate the next random number from that seed (rand). This is pretty much the standard ANSI LCG but specific to Daggerfall’s needs. Implementing this manually ensures that critical random number generation will always work just like Daggerfall, regardless of platform.

Now that I have the right random number generator, let’s feed it our test seeds from earlier and see what comes out. Starting with seed=0 and generating two numbers (indices into Part A and Part B name tables above), I get the following results.

PartA = 0
PartB = 12

First obvious thing is the spreadsheet starts from 1, not from 0. Just need to +1 each number to match the tables above (although zero-based arrays will be used in actual code). Matching these numbers to the above name table we get: Chasm The Dancing. OK, so Daggerfall obviously generates PartB first then PartA. Let’s try that again with the +1 and order swapped.

Seed = 0
  PartA = 13 (The Dancing)
  PartB = 1  (Chasm)
  Result: The Dancing Chasm

Using our handy table we can match row 13 with row 1 and we get The Dancing Chasm. Good! Let’s run some more tests and prove the concept.

Seed = 1
  PartA = 35 (The Knave and)
  PartB = 27 (Scorpion)
  Result: The Knave and Scorpion

Seed = 2
  PartA = 30 (The Pig and)
  PartB = 9  (Ogre)
  Result: The Pig and Ogre

Seed = 3
  PartA = 16 (The Thirsty)
  PartB = 36 (Fairy)
  Result: The Thirsty Fairy

So far, so good! Building names are output just like Daggerfall given the same inputs. Let’s try the original, unmodified seed value of 27748 which should give us The Howling Stag.

Seed = 27748
  PartA = 21 (The Howling)
  PartB = 33 (Stag)
  Result: The Howling Stag

And there we have it! Building name generation from initial seed value resulting in a string exactly matching Daggerfall.

From here, I still need to extract hard-coded name tables for other building types like armorers and weapon-smiths. This isn’t hard though, I just need to find the tables using the same methods as taverns. I also need to assign full building data from MAPS.BSA to the correct models in Unity scene and wire up API methods to query this data when inspecting or entering a building. One challenge at a time though.

For regular small updates on Daggerfall Unity, I can be found on Twitter @gav_clayton.

Daggerfall Unity 0.2.9 (Updated)

I’ve released a small patch to version 0.2.9. Latest download is on the standalone download page.

Patch notes for recent versions below:

0.2.7
  • Reverted minor change to terrain tilemap shader. This might fix black ground issue on older DX9 systems.
  • Implemented floating origin for Y axis to correct flickering shadows at high elevations. This still requires full testing.
  • Items imported from classic saves will have dye synced to material type at import time.
  • Settings INI now saves floats with invariant culture.
  • Update to Uncanny_Valley’s grass mod.
  • Added restart button to options UI.
  • Nystul fixed white interior textures when reflections mod enabled. Also fixes stalled fireplace animation.
  • Arrows should now always display correct inventory icon.
  • Can no longer equip arrows to hands.
  • Disabled bows until archery is implemented.
  • Can now open inventory from character window.
  • Weapon manager now resets sheathe state and equipped hand on new game / load.
0.2.8
  • Fixed floating origin issue that would start player high in the air when exiting a building at higher altitudes.
  • Nystul fix for resetting dungeon map on new game.
0.2.9
  • Disabled floating origin Y implementation for now. This means lighting and shadow issues at high elevations will return, particularly when using distant enhanced mod (which has a much higher vertical scale than default terrain).
  • Camera now clears background when inside a dungeon allowing you better see within the void.
  • Lypyl: Fix for white film on travel map. New console commands to display FPS and trigger action objects.
  • Nystul: Automap camera settings now preserved when opening automap.

For regular small updates on Daggerfall Unity, I can be found on Twitter @gav_clayton.

Daggerfall Unity 0.2 Release

This post is a mirror of the new standalone download page. Please refer to this page for the latest version.

Daggerfall Unity 0.2

Daggerfall Unity 0.2 is now available for general download. Key features of this build are:

  • Nearly complete item back-end. Monster loot and treasure piles coming soon.
  • Inventory UI.
  • Setup helper UI.
  • Persistent data for settings, keybinds, and saves.
  • Hundreds of small bug fixes and enhancements.
  • Travel map (Lypyl).
  • Almost complete support of dungeon actions (Lypyl).
  • Updates to enhanced sky (Lypyl)
  • Dungeon and interior auto-map (Nystul).
  • Realtime reflections (Nystul).
  • Animated grass and birds (Uncanny_Valley).

 

Download

Current version: 0.2.9 (9 April 2016)

Windows

[ddownload id=”2415″ text=”Download Daggerfall Unity Test (Windows)”]

Linux

[ddownload id=”2416″ text=”Download Daggerfall Unity Test (Linux)”]

Mac

[ddownload id=”2451″ text=”Download Daggerfall Unity Test (Mac)”]

Note: Mac build is experimental as I don’t own a Mac to test on. Please let me know how you go with it on forums (see below).

 

Game Files

For convenience, here is a universal archive of compatible Daggerfall game files. This is primarily for platforms where installing Daggerfall is more difficult (e.g. Linux) but can be used on any supported desktop platform.

Note: This download contains game data only for Daggerfall Unity. It is not a standalone version of Daggerfall.

DaggerfallGameFiles.zip (Google Drive link)

 

Controls

General

  • Mouse to look.
  • W, S, A, D to move.
  • C to toggle crouch.
  • SHIFT (hold) to run.
  • SPACE to jump.
  • LEFT-CLICK mouse to open doors, enter dungeons, operate switches, etc.
  • ESC to pause game or go back to previous window.
  • F5 to open Character Sheet.
  • F6 to open inventory.
  • M to open interior automap (indoors only).
  • V to open travel map (outdoors only).
  • ` (backquote) to open console. Enter help to list console commands.

Weapons

  • Z to unsheathe / sheathe weapon.
  • H to switch equipped hands.
  • RIGHT-CLICK and drag mouse to swing weapon.

Save/Load

  • F9 to quick-save.
  • F12 to quick-load.

Note: Keys can be rebound by editing keybinds.txt. See manual for more details. A full key-binding UI will be implemented in a future release.

 

Manual

A PDF manual is included with the download, but you can also download a standalone copy.

 

Feedback

If you would like to offer feedback and bug reports, please use this thread on the forums or contact me directly.