Scrap Gunsmith
Scrap Gunsmith is an action packed twin-stick shooter set in the post apocalypse. Progress through randomly generated levels, taking out nasty robots along the way! Don’t forget to spend your well earned scrap at the shop to upgrade your gun into the ultimate rust-bucket recycler!
The game features weapon customization and a simple shop system that enables replayability and unique player builds.
- Platform: PC
- Engine: Unreal
- Playtime: 15 minutes
- Team Size: 9
- Roles: AI and Systems Design
- Timeframe: 4 weeks
- Download Here
The game Pitch
Scrap Gunsmith is a rouge-like, top down, twin-stick shooter, that mixes in gun-part customization. The core loop of the game is clearing levels to get loot in order to keep clearing harder levels. The game’s main inspirations are Nuclear Throne and Hades.
My Responsibilities
- Leading the team as the Project Owner.
- Designing and implementing the AI and enemy abilities.
- Designing and implementing the “Loop” and difficulty scaling system.
- Balancing the drop rates, power, and cost of weapon components.
- Implementing the currency and shop systems.
- Establishing and maintaining a simple narrative.
Table of Contents
Systems Design
From the beginning of production for Scrap Gunsmith the whole team knew that, compared to past projects, this game would require a greater focus on systems. We started by establishing that folks were not going to play this game for a fascinating plot or intricate world. This was a “come home, sit on the couch, and vibe out for an hour” type of game.
At the heart of everything for the project, our goal was to make the game arcadey and generate “simple fun”. The art style should be over the top and comedic. The gameplay should be fun and understandable. The player should be challenged and engaged, but only in relatively expected and comfortable ways.
Enemy Design
Scrap Gunsmith has two different types of enemies: ranged and melee. They both followed a few design goals:
- Understandable and Consistent
- Display “Mook Chivalry“
- Provide Chaos through Numbers
Both the melee and ranged robots have a relatively simple AI behavior tree to chase after the player when in range, and give up if the player escapes from them. They both also use Unreal’s EQS (Environment Query System), which allows me to tweak how and when they approach the player.
As stated above, an important aspect of the enemy design was their large number. Having many enemies on screen however, caused some issues, as they had a tendency to freak out and run into each other. It turned out to be issues with collision settings, an issue that would turn up frequently in production.
Despite some initial problems, I got the AI 90% complete quickly which was essential for testing the core gameplay loop fast and getting to implement the other features early.
Difficulty Scaling Design
Keeping in mind the project’s limited amount of time, and my own inexperience with combat design, I steered clear of adding new enemy archetypes as a difficulty scaler and instead relied on modifying the existing archetypes with:
- Stat Adjustments
- Elite Variants
- Encounter Compositions.
Before getting into those, however, I briefly should mention that Scrap Gunsmith uses a “loop system” that tracks how many levels you’ve cleared. All of the above methods use this loop count as their rate of increase.
Stat Adjustments:
The enemies had a few simple variables that were accessible and changeable. The three I tweaked for the difficulty curve were:

Green, Linear Scaling: Y=1.2X + 1
Red, Logarthim Scaling: Y=log(2.5, X+2.5)
- Max Health
- Attack Damage
- Movement Speed
For health and damage scaling I used Risk of Rain 2’s difficulty scaling as a jumping off point. They increase health by 30% and damage by 20%. This seemed to work well in testing. Increasing health faster than damage meant that they were “stickier” and lived longer but their damage to the player didn’t accelerate too quickly.
The speed scaling was a little trickier though. In testing, we quickly realized a linear scale [Y=mX + b] for speed meant that if m was too small, the effect wasn’t noticeable, but if m was too big it got out of hand quickly. So to combat this I used a logarithmic equation to slow down the acceleration and level off at a limit.
Increasing difficulty through direct number increases was the easiest method, albeit an unattractive one. I knew that relying purely on increasing health, speed, and damage would not cut it and just result in un-fun bullet sponges.
Elite Variants:
Despite just saying “relying purely on increasing health, speed, and damage would not cut it,” I did do exactly that with my first iteration of elites. I started by making a slower, larger, Tank Elite and another faster, smaller, higher damage Speed Elite.
Despite being “boring” changes this implementation of stat adjustments worked and made the game feel different. If the game is a rollercoaster, the previous stat adjustments simply ensure that the speed of the ride feels constant and never comes to a halt. These elite variants, however, add occasional high incline slopes along the track to give more variety.
The best variety however is of course brand new mechanics. Fortunately for me, my coworker Adnan had just implemented Slowing and Burning effects for player projectiles. With a bit of tinkering I was able to reuse the system for enemies and make brand new elites out of them: Frost and Fire elites. This is a very efficient way to create new enemies.

Similarly to the scaling of speed, I use a logarithm to scale the spawn rate of elites, so that it doesn’t get out of hand too quickly.
Encounter Compositions:
The last tool I use for balancing difficulty is tweaking custom makeups of enemy compositions. Because of Scrap Gunsmith’s goal of rogue-like replayability, we wanted each map/loop to feel distinct. Our Pesudo-procedurally generated map helps with this, but having a number of different “Encounters” helps too.
With my limited number of enemies, it was difficult to find interesting differences between Encounters. However, because Encounter variation was only a piece of difficulty variance, I didn’t worry about it too much.
Through testing I identified three “sections” of gameplay:
- Early (Loop 0-1): This is before the player has any substantial upgrades
- Mid (Loop 2-4): This is when the player has a few weapon upgrades, but still not many epics or legendaries.
- Late (Loop 5+): This is while the player is getting close to maxing out their build or has done so.
Using these three sections, I created a number of encounters, stored in a Data Table, that could be randomly selected depending on what stage of the game the player was in.
Takeaways
Throughout the short development span of Scrap Gunsmith I was often worried about it coming together and actually working. While there are a number of things I would change, I’m super pleased with the end product and the development process.
Pros/Stuff I liked
- We stuck to our core vision of “simple fun” and made it work! The game is genuinely fun, like play in my own free time fun, and that’s no small feat.
- The enemies struck a good balance of simple but influential to the player experience.
Cons/Stuff I didn’t like
- The systems for handling prefixes/modifiers for weapon parts was a mess. Although it wasn’t my direct responsibility, as the team leader I definitely could have done a better job making sure that that crucial system was managed cleanly.
- There were a number of UX tweaks and fixes that would’ve been good to pay attention to. We focused too much on systems, letting a lot of QoL things fall to the side.
- It’s a budget/time restriction… but the game would’ve benefited from a boss. Right now the core loop is a little “same-y” and needs more difficulty spikes that a boss could bring.