Is This a Fester's Quest Spiritual Successor?
Wow. You really clicked on this didn't you? Welcome to my gamedev blog I guess.
Introducing my Game, Fester's Torment
This project was intended to be a cross between Halls of Torment -- a Vampire Survivors clone featuring an infinite, wrapping map that spawns hordes of enemies -- and Fester's Quest, the infamous NES game based on the Addam's Family character. I say was because the direction of the game changed halfway through making it.
And I'm honestly not sure if the end result has any connection to Fester's Quest at all.
As a Vampire Survivors Clone
During the first iteration, a few challenges were overcome working towards this goal that make this influence extremely obvious.
Infinitely Wrapping Map
When you cross one boundary, you teleport seamlessly to the other side. It creates an illusion that makes the map feels like it goes infinitely in every direction. It not only wraps the player, but it has to look for everything on screen from enemies to powerups to projectiles to particle effects and wrap all of those things with the player so that the transition appears seamless.
Other things go into this that you don't think about, like enemy AI has to be aware of if the player is closer via wrapping or not wrapping. Pretty much every feature that is added has to account in some way for the map wrapping and I like to think the solution is fairly robust at this point, although I hate having to open it back up to find that it needs extension.
Optimizing the Horde
The first bottle neck you encounter when rendering a large number of enemies as a horde in Defold is the default collision system, Box2D, which starts dropping collisions when a large number of them happen at once. I observed this myself and then confirmed that others face this issue from these write ups on similar games.
[ Performance optimizations in Lands of Blight ]
[ Void Scrappers post mortem ]
In Void Scrappers they switched to handling collisions with a third party library, which I may try if I run into issues again, but the primary approach that I use is to give the enemies AI that makes them avoid unnecessary collision.
Rather than just pushing forward, they use a raycast to look around them and decide if where they would move is occupied by something they will have to collide with, and if so, they will take a route that isn't occupied. A secondary benefit of this approach is that enemies are more intelligent in how they pursue the player. It also causes the horde to spread out just a little and occupy more space with fewer enemies without dispersing enough that it's noticed. The original version resulted in pretty jerky, unappealing movement but I managed to smooth it out somehow.
I was planning to add sprite pooling but chose not to based on this thread. What I did instead is set a limit for the number of sprites that will spawn before it will look for offscreen enemies that are far away from the player to recycle, move to the new spawn position, and use as a newly spawned enemy. This allows the horde to continually throw itself at the player and never run out of sprites.
You've spent a lot of time reading about the game at this point.
Why not [ Try it out ] at the currently described stage. Fair warning: It's terrible.
As a Shoot 'Em Up
If you tried the demo above you observed some of the problems which led to the changing direction. I was ready to throw the game in the trash and didn't think about coming back to it for an entire month before the new vision formed in my mind.
Let's identify some of the challenges I was only able to overcome by simplifying things.
Easier to Balance Game
In this game, the only effective upgrade strategy was clear:
- One point in damage
- All other points in fire rate
- Increase bullet size
- Add more HP
- Profit
If you don’t follow this path, you’re making a mistake, which raises the question: why offer so many choices?
Initially, I enjoyed playing with hardcoded values that felt right. However, once I integrated the upgrade system, everything changed. Bullets and player movement felt sluggish, making the game frustrating. If you know the upgrade strategy, you become overpowered too quickly, creating the opposite issue.
While I could tweak values one by one to find balance, it felt overwhelming. Every change affected something else, making me long for the simplicity of those satisfying hardcoded values.
That's when I realized this is how Shoot 'Em Ups work. Your upgrades aren't just choices on a screen; they're items you pick up, dramatically changing your capabilities from one cool thing to another. For that matter, this is how Fester's Quest works as well.
More Satisfying Upgrades
The upgrade selection screen on level-up should be an exciting, dopamine-fueled moment, where players eagerly anticipate their next power-up. Instead, mine feels like a nagging chore: "Not this again. What do you want this time?"
I don't doubt that creating a satisfying upgrade experience is possible, but it's challenging to get right. After replacing the upgrade screen with a dropped item — a crystal — the game flow never breaks, and it feels so much better. This change also simplifies balancing; I only need to consider how often upgrades should drop, streamlining the entire experience.
I have a table that looks like this.
local upgrade_types = {
{ sprite = "crystal-green", likelihood = 35, max_picks = 0, id = "upgrade_max_hp", times_chosen = 0 },
{ sprite = "crystal-grey", likelihood = 15, max_picks = 0, id = "upgrade_nothing", times_chosen = 0 },
{ sprite = "crystal-red", likelihood = 50, max_picks = 1, id = "upgrade_bullet_damage", times_chosen = 0 },
{ sprite = "crystal-orange", likelihood = 12, max_picks = 5, id = "upgrade_pickup_proximity", times_chosen = 0 },
{ sprite = "crystal-pink", likelihood = 10, max_picks = 3, id = "upgrade_fire_cooldown", times_chosen = 0 },
{ sprite = "crystal-blue", likelihood = 30, max_picks = 5, id = "upgrade_bullet_range", times_chosen = 0 },
{ sprite = "crystal-aqua", likelihood = 20, max_picks = 10, id = "upgrade_bullet_speed", times_chosen = 0 },
{ sprite = "crystal-indigo", likelihood = 15, max_picks = 10, id = "upgrade_bullet_scale", times_chosen = 0 },
{ sprite = "crystal-violet", likelihood = 15, max_picks = 10, id = "upgrade_oscillation", times_chosen = 0 },
{ sprite = "crystal-yellow", likelihood = 20, max_picks = 6, id = "upgrade_player_speed", times_chosen = 0 },
}
You can probably guess how it works.
As a Hybrid Genre Game
A Shoot 'Em Up (SHMUP) is a very specific genre. Traditionally, it features an auto-scrolling camera, with the player able to move freely while firing in one direction at waves of enemies that spawn from the opposite side. While many games have evolved beyond this formula, it still serves as the core identity of a SHMUP: intense action, tight movement, and enemy patterns that demand skillful evasion and precise shooting.
In my game, the direction you move doesn't matter—enemies will spawn ahead of you and relentlessly pursue you from all sides. They appear in patterns that force you to weave through them carefully, just like in a SHMUP. However, unlike the typical auto-scrolling mechanic, the emphasis here is on free movement while constantly managing the threat of incoming enemies. Like a traditional SHMUP, survival requires a mix of offense and defense, as dodging and eliminating threats become inseparable parts of game play.
In contrast, Vampire Survivors clones start with slow, manageable waves of enemies that the player can farm while building up power gradually. Over time, the horde becomes overwhelming, and the challenge shifts to outlasting the swarm, often using meta-progression after each attempt. The satisfaction comes from growing stronger through ability combinations.
While my game is clearly inspired by both genres, it aligns more closely with the tension and pacing of a SHMUP. Instead of leisurely farming enemies like in a VS clone, you're constantly running from them, managing your resources, and picking off enemies that allow you to collect experience without risking your life. You can’t just circle around and farm endlessly; every move matters. This hybrid demands strategic positioning and decision-making while keeping the core SHMUP thrill of dodging and shooting alive.
Okay, Where Is This Game?
The second version is coming soon, and I’m 100 times more proud of it than the original (which I wasn’t proud of at all).
I could go on about the new systems—waypoints, notifications, day-night cycles, sound design, art (or lack of it), and what’s left to finish.
For now, expect most of my posts to be about this game, so stay tuned!