From the Burrow

2023-12-09 12:21:25 +0000

Heya folks!

In preparation for creature modding feature shipping, we are making the tool available so you can try it out, and we can fix any egregious bugs you find.

You can find a guide on how to get the tool and how to use it over here:

https://talespire.com/taleweaverlite-guide

NOTE: You cannot load the mods into TaleSpire today. This is simply a build of the tooling used to make the mods.

What is this (and what is it not)

TaleSpire is going to have a couple of ways for you to add new creatures to the game:

  • In-game creature creator: A way of building creatures out of a palette of configurable parts
  • Mods: mod-files are composed of pre-made assets outside of TaleSpire

TaleWeaverLite is for the second approach. It is a very minimal tool for composing pre-made assets into a creature mod that is ready to be used by TaleSpire.

It is not a modeling or posing tool. It expects content in specific formats and with specific layouts.

The expected usage is that the mesh and textures are prepared in other tools, such as Blender, and using TaleWeaverLite is the final step in making a mod.

The good

Once you are producing meshes and textures in the correct format, it’s trivial to turn them into a mod. Simply drag them into the Unity project, set the fields in the creature panel, and save.

The meh

We’ve been using Unity for our asset tools for a long time. It handled processing assets for us and gave us a UI we could use to make tools.

This means that to use TaleWeaverLite, you need to install the free version of Unity.

We have mixed feelings about this, as packaging this stuff for public use has not been as easy as we had hoped. Your feedback will help us decide whether to stick with this in the long term or to start moving to a more standalone tool.

The future

We are busy working on the backend changes needed to support the new creatures. Once we have that done, we’ll wrap up the needed changes in TaleSpire and get ready to ship. We are pushing hard for this and hope we can get this in your hands very soon.

By getting TaleWeaverLite out now, there might even be some new creature mods ready to ship the moment that TaleSpire gets the feature!

Until then, thanks for stopping by.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

TaleSpire Dev Log 422

2023-11-13 23:33:56 +0000

Heya folks,

Today was a tedious one.

I finished up last week by moving a whole bunch of code out of our Unity project and into a separate C# project that referenced the Unity DLLs. We are doing this as we want to ship TaleWeaver as compiled code[0].

I finished that task, and the TaleSpire project compiled, but when I ran it, it crashed immediately. The reason is that by moving all the code to a separate project, all of the references from prefabs and scenes to that code broke.

To understand why, we have to know that Unity wants developers to be able to rename and move things without breaking all those references. So, rather than referring to the classes by name[1], they create a GUID for everything in the project. As they can’t push those GUIDs into the files they are identifying, they instead make a separate file called a meta file, which stores the ID and any other metadata for that thing[2].

As meta files are a Unity concept, I can’t include them in our new C# library. So, by moving the code, I broke all the references!

Of course, Unity does need a way to identify types inside a C# library, and I found this unofficial info talking about how it works: https://www.robinryf.com/blog/2017/10/30/unity-behaviour-in-dlls.html

I now have the tools I need to fix this issue.

  • First, I will check out a build from before I moved the code out to the separate library.
  • Then, I will write a script to collect the GUID for every script in the project[3]. I will make a lookup table between the GUIDs and the fully-qualified type names.
  • I can then check out the most recent code (the one with all the broken references), scan the project for any use broken references, and use the GUID to find the fully qualified type name.
  • With the type and the sample code from the link above, I can calculate the new reference information and replace the broken reference.

If I’m correct, I can automate the entire repair, which is a relief as I have done fixes for issues like this before, and they SUCKED.

In the future, I might even be able to use this knowledge to make tools to help fix issues that occur during merges sometimes.

Well, wish me luck for tomorrow. We’ll see how this all turns out.

Peace.

p.s. The MD4 hashing code from the linked blog post was helpful but performed a bunch of unnecessary heap allocations. I ended up procrastinating earlier today by tweaking it to be more efficient. You can find that here: https://gist.github.com/baggers-br/48bba51a9e0b1c5a0632c57537f84534 It is almost entirely untested, so please beware.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

[0] I know, I know. Byte-code. But still, you know what I mean. [1] Fully-qualified or otherwise [2] If you are very curious, you can find some info about this here: https://unityatscale.com/unity-meta-file-guide [3] In fact I’m only including subclasses of MonoBehaviour

TaleSpire Dev Log 421

2023-11-10 12:07:23 +0000

Heya folks!

After a few weeks of public activity, it feels weird to be quiet again, but things are progressing well.

My big task is restructuring our projects so we can ship the creature modding tools as DLLs.

This task involves some decoupling from Unity, so I’ve been removing the dependency on Unity.Entities. We didn’t use the ECS they provided at all, but they had a zero-copy data format, which was pretty handy.

I wrote our own format the other day, so for the last couple of days, I have been updating all the code to use that. I’ll admit that a lot of that time was me trying to find what I thought were bugs but turned out to be me screwing up.

My task for today is to work out how I will handle conditional compilation (e.g. ConditionalAttribute and #if) with this library. We’ll see how that goes.

Catch ya soon.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

TaleSpire Dev Log 420

2023-11-02 00:11:39 +0000

‘Allo folks.

Today went well. I’ve got a texture format I think we can work with, and I’ve made a de/serializer for it. Here is a quick pic.

textured mesh loaded from our formats

There isn’t really a way to tell it’s from our format, but I guess that’s the point :P

I need to put this all together into a file format, but that is easy with the work from the other day.

The next unknown I need to tackle is building dlls from Unity projects. This is required for the project we will ship to let you make creature mods.

We’ll keep you posted on the progress.

Peace

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

TaleSpire Dev Log 419

2023-10-31 18:13:46 +0000

Hi again folks,

Today, I continued working on our custom mesh format. The image below shows some of the progress.

first mesh loaded from custom format

This is the first mesh I’ve taken from Unity to our format and back again.

With that working, my next task for creature modding is to work on how we will store textures on disk. I should be able to work on that tomorrow, although there may be other Bouncyrock work that will take precedence. We shall see :)

That’s all for today,

Ciao.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

TaleSpire Dev Log 418

2023-10-30 19:38:26 +0000

Heya folks! I’ve not written in the last couple of weeks as we’ve been going hell for leather, trying to ship two patches a week.

That’s been very successful, and it’s a lot of fun to do from time to time, but it is pretty unsustainable when you hit bigger features. So this week, we are only aiming to ship the board folders. The good news, however, is that the feature I’m chipping away at now is creature mods.

So, where are we at?

Unity can pack stuff into things called AssetBundles. They are very flexible, but one downside is that you need to build one for each platform you are targeting. That isn’t nice for modding, and it also makes upgrading the Unity version stressful, as the AssetBundle format can change over time.

As we don’t need[0] all the features AssetBundles provide, we are opting to make our own cross-platform format that only supports the very few things we need.

The first task was defining a low-level format that only specifies blocks of bytes and an index. That was nice and simple to design, and I’ve left the save/loading code for another day, as it should be pretty straightforward.

From there, I’m making a format for storing meshes that is compatible with Unity’s low-level mesh APIs. We want to use that low-level format as it allows us to create meshes across multiple threads and also do so with a minimal number of copies. I got a nice draft of that format finished in the morning and then started fleshing out the implementation of a zero-copy de/serializer[1].

Until now, we have used Unity’s blob asset reference system. However, it means we need a dependency on an additional Unity library, and I’m no longer comfortable with any unnecessary dependency on Unity systems (due to how Unity has acted this year[2]).

I think I’m about 70% of the way through writing the zero-copy stuff. Tomorrow, I’ll start pushing meshes through this thing and see how it handles it. I’m sure I’ll hit plenty of things I forgot up to that point.

As soon as meshes are working, I’m looking into how we will handle textures. I’ve been giving it some thought already, so it should be quick to make some progress.

I’ll be sure to come back and update you once I’ve got some news to share on the texture progress. Especially as, from there, I should be able to dive into the UI that you folks will be interacting with!

I hope you’re having a good day,

Peace.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

[0] And actually we actively do not want all the features

[1] Feels weird to call it that when the point is that you don’t need an explicit deserialize step as you just load it into memory and use it.. but meh. I can’t recall a better term right now.

[2] This might seem moot after they rolled back their proposed fee changes for many folks, but I disagree, and I furthermore think the same applies to WOTC. The company is still run by mostly the same people, they still want money, and it stands to reason that sooner or later, they are going to try and extract it from us again. “Fool me once” can be overused, but it feels appropriate here.

TaleSpire Dev Log 417

2023-10-13 01:53:47 +0000

Well yesterday was nice! Borodust migrated the database without any major hitches and Golbin shipped another asset pack. I’ve been helping out but my main focus has been on board folders and the slab-browser.

My first pass at my server-side code was a little more broken than I thought, but all the fixes were easy enough. The UI side is also coming along.

That’s all from me for today, see you folks around.

Disclaimer: This DevLog is from the perspective of one developer. It doesn’t reflect everything going on with the team

TaleSpire Dev Log 416

2023-10-11 02:35:24 +0000

Heya folks,

It felt good to get the slab-browser beta out, and while I do have things to fix before it is ready for prime time, I couldn’t help but take a swing at a different feature. One we have all wanted for a while. Board folders.

janky unfinished folder with a board in it

Today was mostly spent writing server code for this feature. I tested some of it but wanted to get some UI in before trying the rest. To that end, I’ve been hacking the basics together.

For the first version, changing a board’s folder will be done via a dropdown. Really, I’d prefer to make it possible to just drag boards into folders, but I’m not familiar with how to do that yet, and I don’t want to spend too much time on this as I NEED to get moving with the creature modding support. So, the first version will be functional, if a bit basic. I’m also not adding arbitrary nesting of folders for now.

Jumping back to the creature modding, I read more about what kinds of access Unity gives us to mesh data. I’m satisfied that I can make something to cover all the bases very quickly. It’s also tempting to look into Zeux’s excellent mesh optimizer.

That’s enough for today.

See you in the next one.

Disclaimer: This DevLog is from the perspective of one developer. It doesn’t reflect everything going on with the team

TaleSpire Dev Log 415

2023-09-28 19:47:05 +0000

Heya folks,

For the last two days, I’ve been working on the slab upload. It’s going very well.

I’m currently cleaning up a lot of little issues with it, and then it’ll be ready to show it off. The main focus the last two days was being able to edit the details of mods you have already published. That was a slog until about six hours ago when it all started to click.

I’m also pleased to say we support multiple kinds of authentication with mod.io. This means you can sign in via Steam, email, browser, and even QR code.

This is all very meh without some video to show it working, however, so I’ll come back when I have fixed the remaining visual issues.

The big issue right now is that the list that shows published mods doesn’t like certain kinds of filtering and thus can leave gaps between items. I know what to do, but it’s gonna take some hours to code.

Right, seeya folks soon.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

TaleSpire Dev Log 414

2023-09-26 23:19:20 +0000

With yesterday’s realization that some of Unity’s handling of overlapping keybindings is broken, I needed to add our own workaround.

I knew I didn’t want to try and build a complete solution, so the first version was just to handle the issue that caused undo/redo on Mac to be broken.

To recap on Mac, Undo is Command+z, and Redo is Command+Shift+z. This is an overlap; in order to hit the keys for Redo on Mac, you also need to hit the keys for Undo.

I’ve added a simple handler that detects multiple actions happening on the same frame and picks the one with the longest chain of modifiers. This works for the Mac undo/redo issue as both actions will fire on the same frame as z is the last key pressed and is the one that causes both to fire.

We will need to handle more cases in the future, but that’s a problem for another day.

I’ve got some new builds progressing through the build pipeline, so tomorrow, I should be able to ship a fix for that. Then, I can get back to business.

Hope you folks are well,

Seeya in the next log.

Disclaimer: This DevLog is from the perspective of one developer. So it doesn’t reflect everything going on with the team

Mastodon