Vac-Attack
Vac-Attack is a wave-based shooter where you use a vacuum to suck up objects and shoot them at your enemies.
This game was created by implementing 1 feature per day over the course of December 2020, then published on January 1st.
#GameDevember
In November 2020, a friend of mine proposed a "Game Devember" idea:
"Artists draw a piece every day for October, so I'd like to propose game devs make a project and add one feature every day for December and release the result on New Year's."
Systems Design
Gameplay Design
The core game loop is to suck up items in your vacuum and shoot them at enemies.
This is inspired by Blinx The Time Sweeper.
I really wanted to see how a "find your own ammo" resource would work in an FPS, and the result was promising.
Gameplay UX - Power Scaling
Enemies are scaled to make new weapons feel powerful.
Before a wave introduces harder enemies, it throws previous wave enemies at players to showcase how much stronger the new weapon feels.
Gameplay UI - Ability Info
The game is fast paced, so I had to make sure information was relayed to the player intuitively.
1. "OUT OF AMMO"
2. Ability Cooldown
3. Thruster Cooldown
Skills and Abilities

Vac-Attack has a few ways players can approach each round.
I broke up the skill tree into three different branches to allow players to choose skills that fit towards their playstyles.
Offensive Skills
Critical Strike
More Damage
Rage
Even More Damage
Bigger Capacity
Rage+
Rage ability increases damage
Defensive Skills
More Armor
More Gold
Solid
Even More Armor
More EXP
Solid+
Solid ability negates damage but slows player.
Utility Skills
Thruster
More Health
Improved Thruster
Double Jump
Even More Health
Health Regen
Thruster boosts the player in desired direction
Additional UX
When a wave ends, there is a pause before the player can initiate the next round.
Additionally, a prompt appears if the player doesn't enter the shop AND skill tree.
This was to prevent the player from starting a new round without new equipment.
Weapon Design
Suck Blaster
Regular Vacuum with no gimmicks.
For players who want a basic experience.
Play Style: Standard Play
Fire
Deals damage over time.
For players who want to shoot an enemy and let them die while they fight others.
Play Style: Damage Over Time
Ice
Freezes enemies in place.
For players who want to limit enemy movement for better positioning.
Play Style: Tactical/Placement
Retrospective: Ice would be a better utility if the player had two weapons to swap from.
Double Shooter
Fires two projectiles
For players who want to hit multiple enemies at once.
Play Style: Trick Shots
Rapid Shooter
Fires projectiles rapidly
For players who like to rapidly click and see damage ticks.
Play Style: Quick Damage
Heavy
Hits HARD but fires slowly
For players who want strong attacks and save resources.
Play Style: One-Hitters
Combat Design
Designing the combat system was a huge challenge in this project. Taking up just about 1/3 of the total time I worked on it, lots of math and numbers were handled to "perfect" the system.
Total System
The expected values of my systems. Each wave is broken up into Wave Power, Player Power, Skill Points, Gold. These numbers helped gauge the difficulty curve of each wave and how much Gold/Points the player is awarded.

Player Power
Calculated by how much Attack, Armor, and HP the player has.

This chart helped me identify how strong the player was expected to be at the start of each Wave.
It's not a perfect calculation as it is very dependent on if the player chooses specific skill boosts.
Example:
HP Average is calculated by taking the base health, 100, and averaging it between that between the boosts (200 HP or 300HP) to give me an "expected health" value to calculate against.
Weapon Power
Basic calculation of Damage Per Second
I get the DPS of each weapon at their base strength, along with if the player has the Damage Boost Skills. I then average all three of those powers to calculate the Average Power.
The Expected Value (EV) takes the average between all the new weapons that are available in the that wave, and that is the number I use to calculate Player Power.

Wave Power
Total power of the enemies in a given wave.

Enemies are broken up by Ranged and Melee and each have 6 different tiers of power.
Wave Power Calculation:
(((AtkR + HpR) * QuantityR) + ((AtkM + HpM) * QuantityM)) / ((QuantityR + QuantityM))
R = Ranged Enemies
M = Melee Enemies
This formula calculates the power of Ranged enemies and Melee enemies by adding their Attack and HP together then multiplying it by how many will spawn. That number is then divided by the total number of enemies.
Retrospective:
This formula is a little clunky and would've been more clear if I calculated the individual powers of each enemies then calculated that against the number of enemies, rather than doing ALL of that calculation in a single formula.
Gold is also calculated here as each tier of enemy drops a specific range of gold per death.
Economy Design
Distribution of Gold and Skill Points

Gold became an arbitrary number to calculate. I let the enemies judge how much gold the player earns. I had to play around with a few numbers to ensure all gold earn felt good. Once I found a good number for how much gold enemies dropped, it came down to how much players earn at the end of each round to calculate how much each weapon costs.
TD;LR: Gold calculation was more influenced by Game Feel rather than System Design

This chart displayed the expected gold to receive from every enemy type.
The range is calculated between base earning and earning with the More Gold Skill acquired together to get the EVs.
Skill points were alsof arbitrary. EXP earned is a fixed number per enemy tier so it came down to a bunch of basic addition to calculate how much the player would earn each wave. This helped me create the pace in which skills can be unlocked in the game.
Daily Updates
Every day I posted my new feature
GameDevember
Day 1 - Movement


Day 1 - Movement

Day 2

Day 3

Day 4
Note: Day 20 did not have a video because it was purely systems design with no visual change. Days 27-31 were playtest and iteration on playtests.
.png)