Kandria
Moving Ahead on Moving Platforms
Another week of a variety of changes and things to work on!
GDC
As announced previously, we'll be at this year's GDC 35, with a virtual booth at the Swiss Games Pavillion! We finally put our booth together yesterday, after a bunch of trouble with GDC's backend that prevented me from editing our booth for days. Luckily though the support was very friendly and they ultimately managed to figure out what was going wrong and correct it.
I'm looking forward to GDC! I wish it were in person, as that would be a lot more exciting still, but nevertheless it's amazing to finally take part in something I've only ever really seen from the outside for years and years!
We still have some more work to do to prepare for it as well, such as checking the press list and seeing which people we want to try and contact during the week, and of course see if there's any interesting talks to follow.
Again, a big thanks goes to Prohelvetia and SwissNex for making this possible!
Speaking of Prohelvetia, they also approved us for Gamescom and Devcom, so we'll be taking part in those as well! Again online only this year, though.
UI Improvements
I finally got around to fixing the UI to fully work with controllers. Previously there were a few bugs and inefficiencies in the menu that made it hard to impossible to use it with just a controller, and I'm glad I finally rectified that.
Moving Platforms
So this is something I've been pushing out for weeks, probably months, even. Debugging collision stuff is typically very, very frustrating. I had meant to work on it last week, even, but got so angry I had to push it out again. Anyway, I finally invested some time in better debugging facilities (single-stepping) and managed to figure out a couple of regression problems that had slipped in.
Moving platforms used to work just fine a year ago, so I knew there had to be something new that changed, but I didn't know what. Both mistakes turned out to be oversights. The first was how I was doing the broad phase:
When I added a bounding volume hierarchy to speed up collision testing with a broad phase, I didn't really test properly for the case of moving to moving collisions. Prior to the fix, I was simply checking the region that the object along its current trajectory would occupy. This isn't enough though, as another object could be moving into that path, as well. Having the broad phase only deliver items within the first object's trajectory however, we would completely miss out on this collision.
The problem here is that we can't consider both objects "simultaneously" and instead have to process them one by one, and thus don't see the other object during collision checks. There's two solutions I can think of for this problem:
Separate out the physics step into a phase where the largest velocity is computed, and then use that velocity along with the currently tested object to widen the broad phase.
Simply use a constant broadening factor, ignoring higher speed collisions.
I opted for the second part, as I already have speed caps on everything, and it's trivial to implement. That takes care of the broad phase collision miss.
The second issue is more complicated to explain, but I'll try anyway: during collision resolution for a frame, the current velocity might need to be adjusted to follow along the surface of a slope. However, directly manipulating the object's velocity leads to the character feeling odd to control, so instead we split the velocity into two parts; the objects 'continuous velocity', and the 'current frame velocity'.
Every time a physics step takes place we take user input into account and adjust the continuous velocity appropriately. We then add the velocity to the frame velocity and proceed to collision resolution. Collision resolution should only look at the frame velocity and adjust as necessary, repeating collision testing until either the frame velocity is zero, or we don't detect any collisions. Finally we add the remaining frame velocity to the object's position and set the frame velocity to zero.
This works fine for everything except resolving collisions between two moving objects, as now the order in which we process the objects matters again: if object A processes before B, once B gets its turn, A's frame velocity will have been set to zero, making B miss a potential collision that should have occurred within that frame.
There's multiple ways in which this problem can be solved: make A push B, make A also process B on collision to make sure they are processed "simultaneously", or consider the continuous velocity if the frame velocity is zero. The last one is a hack, but it is again trivial to implement, so I went with it. Both pushing and processing out of order make the whole resolution mechanism a lot more complicated again and I wanted to avoid introducing larger changes like that.
Anyway, with those (and some other minor issues) figured out, moving platforms work fine again:
Fishing
Fishing is now properly in and there's three different spots already. Each of them also have different sets of fish to catch, with different rarities as well. I unfortunately won't get the time to make the fishing encyclopedia very soon, as next month is going to be all about combat refining, but hopefully I can get it done before the September deadline!
Tim
This week I researched more games to add to our marketing list, so we can find out the influencers and journalists that have covered them, and reach out when the time is right. For this next batch of games I've followed the key advice we got from Chris Zukowski, which was to avoid non-combat games (like Celeste) and roguelikes (like Dead Cells); this has led me towards 2D indie platformers and RPGs (even if they're top-down); I think it's the players of these narrative-led exploration games, with traditional progression, whom Kandria will most appeal to.
I've also added dialogue to the new tutorial, hooked it up to the start of the game, and adjusted dialogue in the following quests to better fit with this new intro. It now feels like Catherine has found you abandoned in the caves and brought you online, before leading you back up to the surface - with you learning the controls along the way!
Fred
This week I mostly focused on small critters that will appear in the game to add some extra life to the world. They re especially fun to animate because being small sprites with limited colors I can go all in on the number of frames to make pretty smooth movements. Its also a nice challenge to try to convey say, the head of a bat cleaning themself when the head is just 3 pixel big. Forces to find tricks with colors and lighting to convey the shape and movement.
Mikel
After completing the underground ambience's 'normal' version, this week I finished the 'chill' version which is a very ambient take on the original. By muting a lot of the rhythmic instruments, adding some extra synth pads, pianos and textural strings, the track is a lot more airy and atmospheric. Next step is to implement it in the game and see how both tracks transition between themselves!
Next week for me will be making a 'battle' version which should be fun! I think I'll be doing the opposite, adding even more rhythmic and percussive elements to keep you pumped up during a fight! Will let you know how it goes, have a good week :)