From the Burrow
TaleSpire Dev Log 63
WARNING: We want to be open in these technical blogs so you are reading unfinished, unproven ideas. This should not be taken as a promise of anything.
Today @Ree and I have been white-boarding a replacement for the floor system. We need to do this as the current system has a number of issues including (but not limited to):
- Tiles are revealed by floor which means large features need to be built on multiple floors or built in a huge stack from one floor which intersects the others
- building raised platforms that belong to one floor requires stacking and then deleting tiles as tiles always try to drop to the floor.
- hair loss
- Can’t delete or position floors as the floor is infinitely wide. If you have a town and delete a floor it deletes that floor for every building in the town.
There are also a bunch of other things that fall out of this regarding how fog of war works, which is another area where the current version of the game has issues
We are making progress but it’s a very extensive change. The goal is to let you create floor plains that are separate from each other. You will be able to adjust their height from the previous floor (in fixed increments) and they will grow as you place more tiles. The footprint is maintained down the whole stack of floors.
This would let you have buildings where you can set floor height, delete floors, etc. Building raised platforms is easy and you just build the plain and build on top of it.
Tile reveal and fog of war is also not ideal in open areas like towns right now. You build lovely multi story buildings and don’t see them until you switch floor. Also, as we reveal what your character can walk to, players don’t see roofs often either. We are musing on inverting the logic of fog of war, where you place a origin for the fog (let’s call it a fog-machine for now :D) and then scroll (or something) to adjust how far the fog flows. this gives the GM control over what is shown and the same (or similar) method we have now is used to uncover it. Each ‘body’ of fog is separate so it should hug walls in a better way improving on the current tile reveal.. we also need some more shader magic to improve the look too.
So yup, massive changes could be afoot. This is ALL just thoughts and musings right now. We are going to start prototyping the gameplay side of floor building tonight and I’m musing on ways to maintain some of the nicer qualities of the fog of war whilst getting some of the new stuff.
I expect I’ll do a stream soon to talk about the problem and the design space even if we have nothing new to show. We’ll keep you posted with things as they happen.
Peace!
TaleSpire Dev Log 62
A slightly unusual one today. I needed to prototype the approach I want to use for TaleSpire’s line of sight and I decided to try doing it in a couple of hours on my lisp stream. Here is the result:
We got it working but right at the very end of the stream so there isnt a sexy payoff. We’ll revisit this to make sure it’s working as expected and then reimplement it in Unity.
WARNING: The stream contains a lot of parens :D It’s also built on prototypes from other episodes so sorry that we dotn go into detail on how most of it works.
TaleSpire Dev Log 61
I’ve changed the name until I get my arse back in gear and start doing these daily again.
The weekend was rather eventful. We had a collection of bugs that acted together to corrupt peoples boards. The good news is that a while back we started making checkpoint saves of boards on each session so we are able to revert to those un-borked version.
The principle bug was a mistake is some of the serialization code that made an assumption that the number of Assets in a Tile didn’t change. This was a very dumb assumption and it was really just luck that this hadn’t bitten us sooner. This was compounded by the fact that, on failing to load, the game didn’t recognize this and jump back to the empty board. No, instead it decided the board was out of date and saved the now broken board back to the server : |
Needless to say that changed my Sunday plans. Thanks to some invaluable help from those affected (extra props to Blappo here) we were able to replicate the issue and get a patch out a few hours later. I’m currently working on a proper fix for this but it needs to be done carefully so we don’t slip in any more problems.
Also in a couple of days I’ll be meeting up with @Ree so we can start work on the next revision of the floor system in TaleSpire. No spoilers today but news (and pics) will come soon.
Alright, time to wrap up,
Seeya
TaleSpire Dev Daily 60
Hey again, I’ve not written for a few days as it would have been a ‘still working on the same thing’ post.
I’m done with the issues with unique creatures for now. As ever it doesn’t feel like it’s in its final form but it’ will certainly address a few of the issues:
- When a player joins a board their permissions over unique creatures were not always maintained
- Uniques spawned into unsynced board disappeared on first sync
- Only first GM gets the unique creature panel populated
- Renaming unique creatures doesn’t update the UI promptly
This stuff should be in the next update and we hope to get that out soon. That (if all goes well) should coincide with the next batch of invites. The backend has been fine with the first batch and with the bugs we have fixed recently it makes sense to get more folks in.
I’m going to pick a few simpler tickets now so I can get through a bunch over the coming days. Along with that I need to do some work on the client so we can support ‘props’ that are separate from tiles. More news on that soon as it should be a fun one :)
Ok folks, until next time.
TaleSpire Dev Daily 59
Hey again, it’s been a satisfying day. I spent the morning tracing through the logic that handles creature ownership and some users have seen a bug where people lose control of unique creatures seemingly randomly. By doing that I found one mistake that was causing 2 bugs:
- a unique creature deleted and respawned from the unique creature panel has incorrect ownership
- making a creature unique gives the GM permissions to the unique on the server even if they didn’t have that previously have that client side.
Luckily the bugs came from human error rather than something fundamentally wrong with the design of the system, so that was nice. I also managed to consistently reproduce another bug:
- If a player joins a room that already contains a unique creature they should have permission to, it doesnt give them that permission.
I expect this is a mistake is how we setup the synchronized version of the board.
I think tomorrow I should be able to get that bug fixed with plenty of time to spare. With the rest of the I want to go after a more fleeting and thus trickier bug. I have seen cases where I have dragged in a unique and all seems to be fine, but then the unique disappears. It almost looks like twhat happens when a unique is summoned to another board so I’ll probably start debugging there and see what comes up.
I’d be quiet happy if I can just get a reliable way to reproduce the bug tomorrow. I’ll then be in a good place to fix it Monday, or over the weekend if I fancy.
After the month or so of crunch I am really trying to get back in the habit of doing things other than TaleSpire in my free time so I don’t burn out. I’ve been playing ff9 again after a 2 month break and I really want to start looking back into my personal projects again. Maybe next Wednesday I’ll restart the lisp streams.
Right, time to get some rest.
Peace.
TaleSpire Dev Daily 58
Evening all, only a quick one tonight as I’m super tired. However I can let you know that we just had a pretty exciting planning session where we went through a bunch of designs of ways to improve the building system. From walls to thin corridors and from floors to props, the next iteration of the building system could be very interesting.
Not everything will be solved in the way that seems most obvious but when we have finished some prototype and have something to back up our ramblings we’ll put out a video (maybe a stream) where we talk about the design issue, our findings and where we are taking it.
Probably a month out but we’ll certainly keep you posted. Also don’t worry this wont delay the next batch of people admitted to the alpha, we’ll be letting more of you in before the new system lands.
Until tomorrow,
Ciao
TaleSpire Dev Daily 57
Quick rundown of client-side from today:
- Fix a bug that occurred in battle mode when clicking next with an empty creature list
- Made the
?
button hide the help if already open - Made the atmosphere music loop with a configurable delay between each loop.
- Fixed drag-select so that it would work properly when you let go over a UI element
- Atmosphere block are now drag-selectable
- Try to ensure that steam definitely knows that the game has shutdown [0]
- Don’t sync board if you are leaving due to the board being deleted.
I also started on the following
- Can’t stand on
dirt (Tilled)
- Unique creature panel is not updated on creature rename.
The dirt one I though would be a doddle and it was missing some required information, however after adding that it still doesn’t work. It’ll be something stupid I’m overlooking but that’s where it is now
The unique creature ticket is the start of a few issues I’ll be working on in this area. For some reason the ui is not updating when the rename is applied and I have to close the panel and open it again.
After that I’ve got to look into some issues with creature ownership. Those are annoying as I don’t know what triggers them so it’s gonna be a lot of logging, testing and code review. We’ve already seen this mess with people’s streams so it’s a high priority one for me right now
I also took a couple of hours to look at some work I need to do on the backend. One of the pressing tickets is that, currently, there is no limit to the number of older versions of your boards we store. We obviously need this as storing more that we need increases our costs and thus limits how far each sale of TS can take us. It’s not a hard task but having some time to muse over the best way to structure the queries was nice. The second backend task was to design a basic stats collecting module so we can start getting better info on how many people are active at different times of day and, on average, what kinds of requests they make. This is important so we can make some better guesses at how load etc will increase as we move from hundreds to thousands of users and beyond.
One last thing, when I went to bed last night I realized that the line of sight technique is pretty simple if we limit the number of creatures involved. It goes roughly like this (for this example we will use 256 as the max number of creatures):
- make an ssbo which contains an array of 256 bools
- find all creatures in range and give each an id between 0 & 256
- clear the ssbo so all entries are false
- render the scene from the selected creatures position, in the 6 cardinal directions, into a cubemap
- render the occluders as black and creatures with their red color component based on their id. e.g.
vec4(id/255)
- draw a quad and use the fragment stage to read a single texel from each face. Write
true
into the array using the red component of the texel as the index into the ssbo array e.g.result[(int)(sample.r * 256)] = true
- pull the data back to the cpu side.
The slots that are true state that the respective creature is in line of sight. We can use a 512x512 texture to trade off accuracy for speed but given that we only need this once per time something moves it should be no problem to have something a little higher res.
I haven’t thought of a way to do it without an ssbo (or writable image) yet though.
I might make a prototype of this in lisp as a stream next week. Sounds pretty achievable in 2 hours.
Goodnight folks, back tomorrow with more.
[0] We can the Steamworks shutdown call in an OnDestroy which should have been triggered on all normal terminations. However sometimes it still didnt work, so we’ve added another call to it from a method that is explicitly called on shutdown. !
TaleSpire Dev Daily 56
Hey again folks, these dailies had to be put to the side during the crunch to get the alpha out of the door, but now a few days have passed I’m ready to get them started again.
Today has been a slow day as I guess my sleep schedule is still somewhat recovering, however I worked on a couple of bugs.
The first was ‘Ambient lighting stacks rather than replaces prior atmospheric lighting’. This turned out to have a simple mistake which took me a while to find as I was sure it was an error in the LUT post-process. Instead it was that some atmospheres don’t specify new values for the lighting and, instead of the defaults being used, the previous value just remained.
The next were ‘Line of sight is behaving oddly’ & ‘Line of sight indicators show for creatures on all floors’. These ones have a number of components to it that make it fiddly so currently I’m working on some tweaks (hacks?) to what we have so that the result is more acceptable whilst we come up with a better approach to replace it in future.
Previous, in order to see if one creature could see another we just had a simple sphere cast between the two.
Issues included not taking creature eye position into account and that if the ray clipped some scenery, as in the case above, the creature would disappear even though most of it was in view.
To mitigate this I’m now taking multiple raycasts between an approximation of the head positions of the two creatures. We take one ray from the center of the head, one from slightly to the left and again from slightly to the right. On the destination creature we aim a bit wider in order to take the model size into account.
We also cast 1 ray from the source creature’s head to close to the base of the target creature. This lets us catch cases where a creature can part of another creature on a lower floor.
As mentioned before, these are really tweaks to patch over issues with the current approach. One thing we’ve mused over is capturing a low res version of the scene into a cubemap (as in some lightprobe techniques) but naturally instead of rendering the colors of the scene we render IDs of creatures into the result. we can then see exactly what the creature would be able to see (more or less) and could accumulate the IDs into an SSBO (or similar buffer) to be used the following frame for showing/hiding the creatures in view.
The only non-trivial[0] part is the accumulation pass but it sounds like a perfect task for a simple compute shader.
I’ll write more about the new approach when I have done some more work there.
I’m gonna push my line of sight tweaks tonight so the rest of the team can have a play with them. Hopefully they’ll be out in the next update.
In non technical news it’s amazing to have the alpha out there. It’s mind blowing how quickly you see things you didn’t think of (someone playing chess in it for example :D ) and it’s intimidating how quickly the community content overpowers your ability to both keep up to date, and get work done. Some folks have already been amazing at filing really good bug reports in our issue tracker and guiding the new people as they first settle in, so it bodes very well for this as it scales.
Another thing I’ve not personally found a good avenue for is feature requests. Any game, tool, whatever.. feels a certain way due as much to what it doesn’t do as what it does. Setting good limits and excelling in your space makes for a better experience than piling it all on. Some features are non-brainers and we will definitely want to get them in, however there is larger set of perfectly reasonable features that just aren’t a good fit for this project. I guess this is part of the reason I see TS to be part of the roleplaying ecosystem rather than something that’s trying to replace anything. I’d sooner see 5 focused competitors than one bloated tool without focus.
The issue then is handling these tickets. If you’ve seen sites like the now dead Ubuntu Brainstorm you’ll know the issue. Things that are accepted get fixed but the things that don’t accumulate and can become little foci of disappointment. You can prune these but that too has to be done with care as otherwise you either get a lot of duplicate requests or you could piss off the great folks that took the time to request in the first place. I have no answer to this and I may just be over-thinking it anyway. I expect we’ll just put up a trello (or something similar) and just see how we go.
Tomorrow I’m kicking off with some work on ‘atmosphere music not looping’, some small UI bugs and then I’ll dive back into the big pool of bugs and see which can be swatted next.
Until then,
Peace.
p.s. After going to be I quickly realized it’s easy to do the line of sight stuff just using fragment shaders. Trade off is fixed max number of creatures (e.g. 256) but that seems ttoally fine given the current numbers of creatures we are dealing with.
[0] non-trivial as I haven’t done much compute work and none in Unity so far.
TaleSpire Dev Daily 55
A fairly productive day today.
- Cleaned up client & backend code for Steam signup/signin. Feels good now
- return validated alias from backend on signin
- tweaks to how creature’s memories of boards are handled for serializing
- refactored how and when unique creatures leave board and when they are name non-unique
- tweaks to summon creature to allow specifying the location it will be summoned to.
I also had been working on the fog of war to fix a bug where doors & walls flush against a zone boundary would not be shown if the character with on in the adjacent zone. I was pretty happy with how it was behaving earlier but I must have had some spurious data as now I’m seeing some very odd cases where tiles aren’t appearing. Beats me how that happened but I’ll need to fix that up in the morning.
I’m also off to Jonny’s tomorrow so we can work a bit closer of a few bugs & features. Remote working is great but occasionally it really helps to jump on the train and yell at the same monitor :)
Peace
TaleSpire Dev Daily 54
It’s a quick post as I’m still working for an hour or so.
Save & sync on exit is working fine now. I made a few changes on the backend to support user aliases that are separate from signin_names (for those in future who will log in without using something like steam). Aliases are allowed to clash with the aliases of others (like profile name in steam).
I’m close with the steam signin but there is something I’m missing as I’m getting an error message back from steam on the server side. I’ll get it soon but it may be tomorrow as I’m running out of hours for today :(
C’est la vie.
Back to work.
[EDIT 23:07]:
It works! well, it crashes past the point where Steam has accepted the token, so yay. Login will be done real damn soon :)