In the Solar Skipper post, I talked about switching from Godot to a smaller, harder better faster stronger game engine.
It's been 4 months using high_impact. That's a win compared to my experience with Löve2D or Raylib. I especially like how it supports only one format of each asset type, which reduces its size even further.
And what's best, unlike during most of the last decade, the Super Note project is progressing.
Choosing high_impact
Several reasons for that game engine:
- It's made in a language I know (C), and an efficient one at that.
- It makes binaries below 100 kilobytes for both desktop and web.
- Despite that, it's not too restricted in tech like emulated old consoles or fantasy consoles.
High_impact is perfect for 2D action games (side-scrolling or topdown), or other games with a bit of work.
As of now, I only made one change to high_impact: adding a subtractive blend mode. It's great for the tavern or caves which need moody lighting.
It has a special music format which is limited in many ways, but compact.
Underengineering
For games, I feel like deliberately "underengineering" can help me avoid premature optimization. Try to forget complicated design patterns, and build the game without them. Examples:
- All the code in one source file. Helpful if you just have a folder of small games or you use a raw text editor instead of an IDE. However, not ideal for elaborate games beyond, say, 500 lines of code (LOC). LOC is a number you don't want to see go up. I gave up that one for Super Note and use several files.
- Do visual effects with regular code instead of a shader. Nowadays CPUs are fast.
- Ignore Entity-Component-System (ECS) and even full Object-Oriented Programming (OOP). Use simpler versions of those.
Underscoping is a related concept: only add to the game what you can add, and then remove things that don't click. Examples:
- There is only one menu for pause/title/credits/settings.
- Player animation is restricted to 2 frames. Enough for idling, running and falling. Slipping is a nice addition to platformers and I'll allow it in scope. In this case it uses the falling frame.
- There is one enemy type. Maybe I'll go up to 3 for a full game.
I also have a paper notebook with smaller pages, so my to-do lists are shorter term. That forces me to break goals into even smaller tasks than before. Great when you have not much free time for the project.
Emergence
or: nerding out about game design
At first in Super Note Adventure, systems weren't interacting much with each other. For example, it is an immutable fact that coins hover in midair and you can shoot really high. I didn't search for possible interactions until recently when I added the ability to shoot at coins to make them fall down. The result was interesting:
- Coins that were inaccessible now test your aim.
- To catch coins above a bottomless pit, you have to jump at the right time, or they will be lost forever. That creates tension.
- Shooting enemies isn't the only way to get "juice", or satisfying feedback, from your shot.
The level was fun even without enemies. Now, with the same mindset, let's break down how enemies should work:
- Enemies are like the hero: they're both "actors".
- The hero dies if they touch an enemy. (basic gameplay)
Note: Super Note can't stomp on enemies to kill them, because they have a lightning bolt crystal thing on their heads. - Enemies change direction when they meet each other. (mario inspiration)
- If you touch an enemy you die (2). If you fall off a cliff you die (basic gameplay). So when you touch an enemy, your death animation is accompanied by you falling off. (associating ideas & mario inspiration)
- Because of (1), when enemies die, they fall off too (4).
- Therefore: falling enemies (5) bounce against other enemies (3), and maybe back towards you, and you die (2).
- Also, when you die, you have a similar behavior to 6 (1) that make you bounce against several enemies (3) like a pinball.
Did you say pinball? Well, looks like we have a fun system!
Note that I didn't spell it out until now, it was more a "fuck around and find out" thing. But here is how that process seems to work:
- List what entities you absolutely need (a hero, enemies, items…)
- For each possible interaction, find inspiration in games (or non-games) you like
- To broaden the interaction, and to improve the player's mental model, search for similarities between entities
I tried to speed up that process with an object matrix: comparing everything with everything else one by one. But that was a bit confusing to sketch out, and it misses the positioning/state context, so I went back to the old empiric method. It may be very slow, but it works!
So yeah, that's the progress on Super Note Adventure. My end goal is to finish (or more exactly be satisfied by the state of) that project some day.
Conclusion
And now for another screenshot. It may look pretty, but there's not much to do in the game for now. On that, see ya in the next one!