Tail Between My Legs

"A kind being both takes and gives, while a saintly being only does the latter. When that gift is death, suddenly, everything changes. Why is that?"

  • Flavour text of Share the Fruits of Faith, Form component

The Games Foxes Play

(complete source code on github | view all previous posts | play 0.4.3 online in browser on itch.io!)

Well well well well well. Look at me coming back to the JavaScript libraries with my tail between my legs, moments after I said I was done. I tried to resume feature development normally, but after entering the crafting room and seeing my FPS become a slideshow presentation, I realized that my game code has reached its limit. It is bloated by gore and unholy practices from back when I was literally using my own game as motivation to learn how to code. I see now why Kyzrati said "don't make your dream roguelike right away unless you like starting over".

Well I do kind of like starting over. It's refreshing to grab a big metaphorical axe and butcher up the unworthy who think parasiting my 256MB of VRAM with their 1500+ drawSprite() calls every 15 milliseconds is funny.

  • Possibly about half of the game's entire code has just been vaporized out of existence.
  • The entire graphics and UI module has been rewritten from scratch, this time using PIXI.js.
  • In addition to being playable in browser, the game has been turned into a standalone app using Tauri.
  • Tons upon tons of mechanics that had been concocted back when I didn't really know where I was bringing this project have been expunged.
  • Many fundamental concepts, like monsters existing and moving around, have been significantly changed to ensure the player character is no longer some special snowflake with unique functions, but rather just another creature with some "is Controllable" flag set to true.
  • The "Great Wall of Global Variables" has terrorized the populace for too long, and has been rightfully destroyed.

This hurt. It really did. So many hours of work, just gone. But proved to be a worthy sacrifice. At last, I have:

  • Pure 60 FPS crispy goodness (well, when using Tauri, that is)
  • A 1920x1080 resolution that actually makes sense
  • A gloriously juicy UI redesign, unfinished (still need to readd the minimap and many other features...) but already showing promise
  • A code architecture that does not instill desires in me to abandon society and live in the woods when I look at it

That one unholy multicoloured text function had to be redone from scratch, and it was just as horrible the second time around as it was the first time. I spent an unreasonable amount of time trying to get some random npm library to do the work for me, but got crushed under the might of a thousand compatibility errors, and had to do things my way instead. But hey. Now I can have bold and italic text!

I have also unlocked a lot more visual tricks to add some pizazz to my otherwise minimalist graphics, like this annoying blur effect. It is giving me delusions of grandeur to make this game actually look good despite my non-existent art skills. Please dispense a slap to my facial regions to knock some sense into me.

Selves Malleable As Clay

"Most known for his revolutionary political theory, this squid scribe eventually traded away sanity in his endless quest for a truly equal society. In his utopia, each body would only be temporary refuge, and each soul would come to know the pride of commanding an Ordered garrison, the delight in using Vile business tactics, the brutality of Feral infighting and the illumination that comes with Sainthood - all in a single day."

  • Zenorium, Who Dreams of Broken Hierarchies - Artistic Function

The Games Foxes Play

(complete source code on github | view all previous posts | play 0.4.3 online in browser on itch.io!)

It's tough to still channel the discipline to hammer out lines of code after each 9-to-5 toiling in the data mines. Anyone who has released a game while simultaneously working full-time, I bow to you. I've set up a tight personal schedule and have done well in following it thus far.

Selves Malleable As Clay

I am getting waaaay too ahead of myself already working on this feature when the UI is still half-broken from last week's 16:9 aspect ratio modifications. Plus, I haven't even finished equipping every entity with cutting-edge Axioms yet to make this mechanic truly universal.

But I was just too hyped to not at least start.

Enter: Soulswapping. Currently accessible as a Function spell component (named "Zenorium"), it will shuffle around the souls of every affected creature, being quite unimpressive when used on two enemies together. However, when the player joins in on the fun... true chaos is abound. This allows one to play as any creature in the game and use their innate ability to your advantage, while the... previous owner of your new flesh vessel is now thrashing around in your body, spamming your own spells and potentially trying to swap themselves back. New meta: craft deliberately horrible suicide spells and soul swap with a boss and watch them self-detonate? We get there when we get there.

Quick video demonstration here. I, the player character on the top (@), have only 1 HP remaining. I swap my soul with this pink fellow, who is quite slow and can only move every other turn - but successfully slay my old body despite this drawback, and leave the room, my existence now cursed with constant slowness. Thankfully, one will eventually revert to their old body after a few turns.

All enemy-native Axiom spells are now also accessible to the player, allowing their abilities to be crafted and used for general purpose occasions. This has invited me to write a considerable amount of flavour text - I quite like this one.

Knowledge Forks Among Many Paths

Nope. No libraries. I am done. I spent 6 hours trying to redesign my code around PixiJS. It's not impossible and I made progress, but having to run a webserver to test any little thing is tedious beyond words, and I noticed no real performance improvements. I am not ready to make these sacrifices.

I'll do it my way. It has served me well so far. I've already cooked up a very basic tool to help me build my UI that lets me move my mouse around to place things instead of writing trial and error X and Y coordinates in my drawSprite() functions.

It's tedious work, but the UI has received a couple more repairs and overhaul following the aspect ratio transition. Unfortunately, there are some artifacts of my lack of front-end design experience that are now pretty baked into the code and which would take at least an entire week's worth of dev-time to fully root out. Notably, the game can only be devoid of visual artifacts when rendered in multiples of 16 pixels.

1792x1008, fun stuff.

Hey, it's legally a native resolution. I have tried adding an option to resize the resolution, but it completely butchers up the UI as not every element is perfectly scaled according to the window width and height. I give up for now. The default setting looks great on every normal computer I have tried, from laptops to desktops. Supporting a few edge cases (Roguelikes in the movie theatre, anyone??) will be a later thing. When I, you know, actually have a good game.

The research tree screen has received a significant overhaul, as I just had to capitalize on all this sweet extra space. Behold. It was starting to be an actual puzzle trying to place everything in the tiny space of the previous iteration - a fun puzzle I must say, but I am not here to play a game, I am here to make one. So, enter seven tabs of separated content, one for general knowledge and six others for all of the castes and their Axiom components. They are:

  • Saintly - grace, healing and non-violence
  • Ordered - authority, resilience and structure
  • Artistic - craftiness, creativity and passion
  • Unhinged - rage, destruction and zeal
  • Feral - freedom, motion and randomness
  • Vile - illusion, suffering and control

All these placements will be very relevant when I actually add the loss condition I have been designing and daydreaming about for way too long now. I have so, so much to do, but it is not like I am pressed for time. This game isn't a product to be sold, it is a vessel of self-expression.