As part of an advanced prototyping assignment, me and Arthur Ă„rlig built a diegetic inventory and weapons system. I have always been passionate about combat gameplay and the systems surrounding it, so this was a perfect opportunity to build something like that.
While collaborating on both systems, I focused on the weapons, and they focused on the inventory.
While combat wasn't at focus, we based the core loop on a basic combat interaction with hostiles.
All weapons used the same modular platform for their functionality, and had weapon type damage bonuses against specific hostiles.
The interesting challenge was not in the technical make-up of the system, but in the designs and balance.
The balancing of weapon damage and bonus damage heeded a few factors:
These factors are then plotted on a weapons table and a balancing chart, joined by a few conversion formulae for the damage bonus when pitted against enemy types.
I enjoy doing it this way because I find it visually pleasing and easily digestible. Most importantly, it displays any pitfalls in the weapons designs and balances.
To showcase the reasoning, let's view the Longsword as an example. The factors come in play accordingly:
We found the optimal damage values by testing. The enemy encounters needed to feel fun and interesting, without sacrificing challenge. The focus shifted from only weapons balance, to balancing the encounters as well.
* In hindsight, we should have made a trace system instead of collision based, and the reach of the weapon would have been the distance of the trace.
I wanted to keep the implementation simple, and be easy to tweak. In the 'Damage' blueprint, all that was needed was a reference to the Weapons component and the Weapon data struct.
Do damage based on Weapon Type
The 'Damage Calculation' function inside the AI blueprint was also kept simple. It calculated incoming damage, defenses, and weaknesses.
Calculate Damage based on enemy Type
Most importantly, that I love making weapons gameplay and systems. Second, that collision based systems are better suited for non-sensitive mechanics. As a bonus, I learned advanced technical implementations and clean coding.