Dev Blog #50 - Artwork, Exteriors, Water Effects and More! (Patreon)
Content
Happy Saturday everyone!
We did it, we’ve arrived at number #50! I’ve been re-reading older blog posts these last couple of days and it’s so much fun to see how much things have changed, or how things/problems are frequently mentioned the past, which eventually are fixed in a later blog post. Quite a trip, that was fun! It’s been 3 weeks (THREE WEEKS !!) since our last Blog Post, so let's not waste any time and get right into it.
April Review
Let's start by briefly talking about how April went, and discuss a potential problem.
For the past few weeks, we’ve decided to put most of our efforts into the game itself and kind of leave the marketing aspect of the game behind us for a while. This, unfortunately, is having an effect on our Patreon. We noticed that making a constant internet presence to promote the game as much as possible, was slowing us down drastically. It was effective from a marketing standpoint, but managing actual development time was difficult when there’s also a game that needs to be made. We decided to cut back on marketing and focus on the thing that matters; the game.
We are currently facing the consequence where we are not getting as many backers as we used to, and the monthly budget is slowly dropping. We've reached a record low when it comes to the amount of new Patreon subscribers. It’s not the end of the world, thankfully, but it does make budget management a bit more challenging.
There’s a light at the end of the tunnel, though! This has been a pretty good month when it comes to wishlists, and all it happened by sheer luck. Someone posted a video of our Toilet Bug and posted it on TikTok, which ended up becoming a viral video with 650.000 views, LevelCapGaming made a video about anticipated Boomer Shooters which Selaco was included in (232.000 views), and we reached the front page of /r/PCGaming on Reddit due to our silly, and very serious, release date. The result was a very nice uptick in the average wishlists per day, illustrated below! While it’s unfortunate how these often do not transfer into Patrons, they at least give us some reassurance when we launch Selaco in the future.
Water Effects
Played the demo? Did you ever decide to shoot a bunch of bullets into a small puddle just to learn that the bullet completely ignores it? Me too, and it sucks! We’ve stepped up our game up here, making it so that all kinds of objects properly react to water surfaces.
Let's start by taking a look at the current demo version. The version you can play right now, has bullets react to water like this:
Truly a disgrace to any shooter game and we can’t have that. Time to get to work!
First things first, let's have bullets properly cause a splash. Oddly enough, we had to make an engine tweak to GZDoom to be able to pull this off, as hitscans are a bit limiting in that regard (BONUS: This engine tweak also allowed us to fix the issue where plants would block your shots!). We needed the water to intersect with the hitscan while still allowing the bullet to pass through and hit the surface underneath it. Then, we also had to find the nearest 3D Sector (which we use to create water areas) and spawn the splash on there, but the GZDoom function did not work as expected, so we tweaked it and made our own
Lo and behold, bullets being fired on a swimmable water surface! (Effects WIP)
Now, obviously, this being Selaco, we did not stop at just bullets! We made *everything* react to water.
Bullet casings:
Objects, based on velocity:
(Enemy)Movement
I’ve been wanting to add this for a long time now, and I’m happy to finally have it in the game! Combined with a few other details not mentioned here, the water feels a lot more water-y than ever! We’re still planning on improving the actual effects as I’m not entirely sold on them yet, and fix an awkward rendering problem, but at least the groundwork is there!
Floor-dependent Impact Effects
Another improvement that bothered me for a long time. We always had the ability to spawn different effects based on the texture of a wall (e.g. spawn sparks for Metal walls, wood for wooden walls etc). But we could not do the same for our floors because it was written in ACS! Long time Patrons are probably already aware of the pain ACS has caused us. ACS is a level scripting tool that we actively used back in the day. Zscript (the language we currently use) was still in its early years and I was not familiar enough with it to feel comfortable using it. So instead, I abused ACS in such a way that it was used for gameplay mechanics. Noticed how your footsteps made different sounds in the demo? That worked because the footstep system was made using ACS, and all the material data for floor textures was stored there. But here is the problem: Our impact effects are done using Zscript (the 'better' language), there was no way to use that data without using very dirty hacks and refused to go that route. It would be too hard to maintain.
So we did the time consuming thing instead; We rewrote our entire footstep system from the ground up in Zscript. Not only is the codebase for it much cleaner now, it also improves game performance (since we no longer have to seek through a gigantic array with every step! More on that later) and allows for more flexibility. Now, every surface you shoot will react accordingly!
Performance Optimization
Improved Texture Seeking
In the current demo, whenever a bullet hits a wall, or an actor walks over the floor, the game is required to seek through a gigantic list of textures until it finds the texture it needs. For example, if a soldier stands on a wood texture called ''WODLO53", it seeks through a list, going through Metal, Sand, Dirt, Gravel, Rock textures all the way until it finally reaches the Wood textures. If it sees WODLO53, a hit is found, and the game can recognize that it's a Wood texture. I always knew this was inefficient, but figured it would be fine for the time being. Fast forward 5 years into the future, and we suddenly have thousands upon thousands of textures to seek through. For a game where a single-thread is used for game logic, this adds up and increases the potential of the dreaded stutter. Imagine you’re in combat, and a shotgunner fires his weapon at you. You dodge, but all 12 Shotgun Pellets hit the wall right behind you. At the same time, you and other characters are moving around. That’s a lot of textures the game has to seek through in a single frame and there is only so much a CPU (especially slower ones!) can execute in a single tick*, so we had to optimize it.
We improved this drastically! Currently, when a level is loading, a function reads all the texture data in the level, and assigns a tag to every single Sector (floor/ceiling) and Linedef (Walls). Now, if a bullet hits a wall or floor, all it has to do is check which tag is assigned to the floor to spawn the appropriate effects. Much better!
*A tick refers to a point in time where the game is executing game logic. In GZDoom’s case, this happens 35 times in a second. Every single calculation is handled in a game tick. If a tick gets overloaded and your CPU cannot keep up, a stutter happens since the engine code also needs to be processed in a tick!
Improved logics
I can’t be too specific about this one, but I’ve spent a good couple of days going through all the code that we have, and making a big chunk of improvements wherever possible. Small examples? High quantities of smoke can on longer spawn inside of each other. Before the tweak, smoke would often stack inside of each other, making it unable to see through them. However, their alpha was still being rendered despite it not being visible. This adds a unnecessary load to the performance and how now been ironed out. Pathfinding is now done in smaller steps to reduce the load whenever a soldier needs a path to traverse and the logic is now spaced out to prevent a single tick from getting too much work. I’m also in the middle of getting rid of our ACS code, which is slower compared to Zscript.
Level Design
Still hard at work on the third level (we don't develop levels in chronological order!) of the game, The Selaco Streets! Joe has finished designing Level 3-2, so that’s the one we currently giving a major art pass as Joe continues working on 3-3. One area of the level takes place in a very old-timey library. Have some screenshots
IMPORTANT: All screenshots are still getting an art pass! Especially the exterior sections
There is still a ton of work left in these levels, but they are shaping up to be fantastic and a perfect change of pace after the interior sections that came before it.
Artwork
I’m sure you’ve seen the thumbnail, but here it is again! We are replacing our current Steam Banner (the picture you see when you find Selaco on the Steam Store) with something a bit more representative, featuring Dawn sliding towards the enemy, shooting guns and evading incoming fire. This piece is 95% finished, we’re just giving it a small layer of polish before putting the stamp on it! Here is a quick time lapse for now:
I’ll share the full res completed version in #Patreon-Showcase when it’s ready to go! Without a logo, of course.
Mod Options
Another thing we are going to be working on, is a Mod Settings menu where players can manage the settings of the mods they’ve downloaded. The above menu is a in-game mock-up and has not been properly implemented yet.
Conclusion
Despite Patreon performing a little rougher than usual, the game itself is progressing steadily. So far, we are well on track to hit our Release Date target (which we won't share yet!) in the future.
Currently, our focus is:
- Implement highly performant, highly detailed Rain Effects. Exterior levels take place in the rain and we want to pull it off well. We would a way to achieve this by coding a shader combined with a few actors. We’ll elaborate when the time comes!
- Animate 3 new enemy types unique to a later level in the game
- Art pass for Level 3-2
- Level design and asset creation for Level 3-3
- Continue the endless journey for smooth performance!
Thank you all for sticking around and supporting the game! <3
Wesley de Waart