A Modern Mage Out is a solo FPS built around player expression. Craft your own bullets, defining your projectiles behavior and playstyle, and wreak demonic havoc on the boss!
A.M.M.O. was made by a team of 9 students during our studies at ENJMIN (3 artists, 1 audio designer, 2 programmers, 3 game designers including me). We also had 6 other students helping occasionally on specific parts of the game. The project lasted 4 months.
The only way to reliably know what the next bullet will be, is to learn by heart the cylinder sequence. This needs a lot of cognitive load, and has to be redone each time a player would change its cylinder, thus punishing exploration of systemic possibilities.
While shooting, players don't have much agency, they can only shoot the current bullet type, or reload the revolver to reset the cycle. While agency is supposed to be enhanced by the spells in the 2nd prototype, spells need players to use specific ammunitions in their cylinder to be applied. These dependancies create a lot of constraints for player freedom.
All these problems would become even worse in a combat situation.
All these problems were due to the nature of the system. So we decided it was not worth the effort to iterate on it, and decided to trash it in favor of designing another system, more robust.
We all were very happy of our process. Prototyping early allowed us to avoid significan't issues.

Crafting A.M.M.O.s crafting system
As the prototype failed, I worked on a new system with another designer. We rewrote our needs:

We explored multiple designs and I came up with the following one, which we collectively choosed.
Players would craft their ammunition, using several categories of components. They would equip these ammunitions in one of the 2 slots of their revolver, each one being affected to a mouse click.

We loved this new system, experimenting with it is a delight. Design-wise, it has major benefits:
This makes sure player have a clear and reliable set of tools during combat.
The crafting system is able to create a crazy lot of different FPS behaviors and effects.
Each component has a distinct behavior. Crafting is then predictable and flexible, contrary to the first prototype where spells had weird limitations and hard to predict outputs.
We were able to design and implement 19 components, leading to a rich variety of crafted bullets. One can also take advantage of having 2 bullets to create insane combos!

Generating weaponfeel
Each component contains a lot of different informations to generate crafted bullets weaponfeel.

On this scheme, each part of the weaponfeel was owned by a different team member. I owned the recoil part, as well as a few other key weaponfeel characteristics.
Recoil generation
Recoil generation is quite complex. Lets first have a look at how we would play the recoil from a single component. Recoil is split among Shift and Refocus phases.
Shift is when the players camera moves away from its firing position.
The camera movement is defined by a camera animation (animation on 7 parameters : pitch, yaw, roll, X, Y, Z positions and FOV). The camera animation can be independantly increased or decreased for each of the 7 parameters thanks to shift multipliers.
The animation duration is stored in a shift delay parameter. Once the animation is done playing, we enter Refocus phase.
Refocus is when the camera automatically goes back to the original firing position.
The refocus is a linear movement on all 7 parameters, made during a set refocus duration. However refocus doesnt exactly go back to the firing position, rather a slightly offset one. This offset is called aI'm displacement vector and is random within set bounds.
When Refocus is done, the recoil is finished.

Each component of the crafted bullet contains this data. For the full bullet recoil, these data are combined following some rules:
Last but not least, each component can have multiple camera animations. Only one can be played at a time, either randomly or cycling through them.
Other weaponfeel characteristics
I managed other parameters related to weaponfeel : dispersion and firing rate.
Firing rate is very straight-forward. Each component has a time interval parameter and these are added to create the interval between 2 shots.
Dispersion is when a projectile isnt fired slightly offset to the camera center. In AMMO, the offset is random within a dispersion cone (in polar coordinates).

Components have a dispersion cone radius parameter. All components cone radius are added together for the bullets dispersion cone. On fire, a random dispersion within this cone is chosen.
Reflecting on the design
However, it also made components interaction sometimes unpredictable, occasionally leading to strange camera animations. I managed this problem testing as many combinations as possible and restricting animations amplitude.
For systemic design, separate a system from the systems feeding it data
The simpler the data structures to combine, the more predictable the output is
I applied these great learnings in the systemic design of my jam game Memes Die Too!
Looking back, A.M.M.O. was extremely ambitious design-wise, especially for students. Almost every feature is tied to bullet crafting, thus bullet crafting has to address a ton of different issues. The project could have crashed on multiple difficult topics. It turned out very good!



