Soul Reviews

I Don't Know What I'm Doing

Monastic Inversion Dev Log 4 🏰

Christos Anesti!

What was that I said about plans in the dev log #21 again?

"Rule #1 about planning and estimates, your plans change and your estimates sucks."

Turns out I'm not alone in this as the Acerola Jam 0 voting period got an extension2. Which is rather fortuitous because I spent most of this week practicing shaders instead of crossing items off the "post-jam release fix list".

Change Log πŸ“ƒ

Interpolating Movement 🚢

One of the largest pieces of post-jam feedback I got was that character movement felt "stiff" and "stop-and-go":

img

This movement is achieved by having a discrete start and end that I tween the camera transform's over:

img

Out of some of the solutions, I decided just speeding up the player wouldn't be sufficient because it wouldn't make things any less "stop-n-go", making the movement increments smaller was tempting, but also felt like a half measure, giving the player full 3D movement would make level design harder/pacing harder3, and going with HEXES feels like a bridge to far(and another project), so I decided to implement the only solution I had left, checking if the player still had the move key held at a certain threshold, stopping if they didn't and continuing at the same pace if they did.

img

Watching it all sail by is kind of serene.

What's not peaceful was the first way I tried doing things:

img

My approach went like this:

This was a bad idea. My general rule about getting smart with lerp / slerp is that if I have to THINK about them, I've gone to far. This, for example:

var mouse_pos = lerp(mouse_pos, get_global_mouse_pos(), delta*time_scale) 
set_shader_paramter("mouse_pos", mouse_pos)

This makes sense, it's two lines and can be easily explained within the life-cycle as "every frame, the mouse position for the shader is updated by an amount linear to the time that's passed, scaled by some value", it's not spread across the player's three different movement speed states, a life-cycle, and a branching logic check.

Like the dumb monkey I am, I over-engineered. To solve this, I just move the player in the movement direction by some increment every frame, checking if they reached the point, snapping them to the transform to get rid of error, and it just works. Even now, I'm thinking "hey maybe if you just looked over the math again it'd make more sense." and I'm telling myself "It's good enough and if you don't agree I'll listen to Phonk when you're trying to write shaders". That outta shut me up.

Polish ⭐

I have a daily do-out to make some ui/ux improvement every day. It's usually something as simple as making sure a button is disabled, adding a sound effect where there is none, or right-sizing a panel, maybe like a %0.05 improvement to the game, but playing the thing, I feel the difference.

img

My philosophy here is that if I have roughly 310 more days until release, and I do one little improvement every single day, then the game will be 15-20% better on release. So if my game is worth 100 steam reviews at it's base, It'll get 120 instead and if it's worth 250, It'll get 287. Steam games sell at roughly 30 times the number of reviews5, so if I charge $10, and make $7 per copy, then in the 100 review example I'll get $4,200 and in the 250 review example, I'll get $7,770. So that's $140/h and $259/h respectively for what should be about a five minute tweak every day.

Not so bad for some idle chore!

Now, I AM of the mind that a game's sales potential is dominated by quality, which is in turn dominated by how fun the game is. However, part of what makes an enjoyable experience, especially for an RPG IS a nice, clickitly interface that welcomes you in like Grandma with a strawberry desert, so in this case, interface quality directly impacts game quality.6

Speaking of polish:

You Like Shaders? ✨

I've been doing a lot of studying up on shaders, partly because I want to take full advantage of all the fun ways I can blow holes in the my dudes, but also because I have aspirations to make my own game engine after this project is complete, and knowing my way around graphics programming concepts would be very useful for that.

My main practice has been to download a shader from godotshaders.com7 and try to break down everything it's doing. This taught me some things, like how transparency is a gargantuan pain in 3D, you can apply floor to a sin wave and displace it up to increase the size of "on" bands, and the difference between World and Veiw space, but I started to notice I was tripping over a few of the same concepts too often.

So, in order to rebuild and fortify my fundamental knowledge about these wired parallel and procedural programs, I went more basic and am now going one-by-one through the snippet section of the site8. Creating some graphics for the good ole' notes database:

img

img

Man, drop shadow + stroke goes a LONG way to making an image readable and appealing. I wouldn't trust these images 100%, since I don't do graphics programming for a living(yet), but I am crafting these with the intention of sharing, which I think makes me hold myself to a higher standard of:

It might seem a little exhaustive and a lot of design work, but it's really not much more then an hour or two a day and I'm pretty used to going fast in Krita, and will only get faster with the design stage as I iron out the friction.

What I'm trying to be careful about here is not forcing myself to understand every little thing or even feel compelled to use a particular technique in the game. As I come to grok more tricks, I'll find matches to ideas I want to implement or just makes discoveries, like how simple circle shaders can be combined, used to mask each other, and fake lights9 on textures:

img

As for not trying to grok everything all at once, it's critical with shaders because, in the same way as you can't bench big weights without training unless you're a freak of nature10, the human brain cannot understand parallel processes without repeated exposure. I am benching shaders daily in a way that wont cause my brain injury, so, if I happen to miss why a term or two needs to be added in a fragment shader, I'll give myself some grace and not lose sleep over it.

This is something Josh Gambrell, who makes courses for 3D modeling software, another complex subject, has also noted11

… What I noticed is that over time as more and more information was accumulated into my brain, this tricky topic basically solved itself…

Lent is Over πŸŸͺ

It's been about fifty days since I set off on daily game dev progress and I'm pretty happy with the progress I've made. We'll see if I can keep it up in the coming months.

This next weeks goals are:

This'll put me in good standing to start re-balancing spells and expanding the level. The goal here is to have a polished version of the content in the jam in the next twenty days as a vertical slice I can use to base future developments on.

Footnotes

1 https://soulreviews.net/blog/Monastic-Inversion-DevLog-2

2 https://itch.io/jam/acerola-jam-0

3 Although I might consider free-look along with auto-walk so the player can take in a scene rather then just hold down the move key, eyes glazed over, going "ugggghhhhh, I wish he'd stuck a teleport here….". Take notes Palworld.

4 lerp is just a placeholder while I got things working, I swear.

5 https://vginsights.com/insights/article/how-to-estimate-steam-video-game-sales

6 There's a larger discussion to be had here around concepts such as Mental Outlooks and Fortune, which I'd like to save for next year after I release.

7 https://godotshaders.com/

8 https://godotshaders.com/snippet/useful-code-snippets/

9 fake/genuine is not a dichotomy I understand in Graphics Programming. It seems like anything that's not Global Illumination is "fake" and I'll say my ad-hoc "slap some light on that texture, make it look pretty" is super-fake by that measure.

10 An absolute beast, a Unit onto himself, destined for something great, I salute you.

11 https://www.youtube.com/watch?v=bWAeda_ewnc