A Modern Mage Out

Core system demos : crafing your ammunition
Ennemy trailer
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.

Insanely high cognitive load
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.
Agency is limited
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.
Not a single opponent yet
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.

Untitled

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:

MagicSystemNeeds.png

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.

CraftingOverview.png
This document is made up for this portfolio. The one used in production was a big presentation.

We loved this new system, experimenting with it is a delight. Design-wise, it has major benefits:

Splitting theorycraft and combat moments
This makes sure player have a clear and reliable set of tools during combat.
Extremely systemic
The crafting system is able to create a crazy lot of different FPS behaviors and effects.
Clear outcomes from crafting
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!

Crafting a bullet with many effects stacked
Crafting a bouncy automatic rifle
Crafting a sniper bullet and a zoning bullet
Crafting a flying build! Dash bursts + rocket jumping
Image12486456.png

Generating weaponfeel

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

DynamicWeaponFeelSystem.png

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
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

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.

ShiftRefocusDataStructure.png
Recap of all parameters. Excerpt from the recoil design document I wrote

Each component of the crafted bullet contains this data. For the full bullet recoil, these data are combined following some rules:

Camera animations are added together and multiplied by all shift multipliers
The longest camera animation determines the total shift duration
The longest refocus duration is multiplied by all refocus duration multipliers to determine the bullets refocus duration
The aI'm displacement vector is randomly chosen between the biggest and smallest aI'm displacement vector bounds

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).

Image453431.png
Excerpt from dispersion design doc

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

This weaponfeel design allowed me to have precise control over one components gamefeel. This is great to give each component a distinctive identity.

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.

With more content, this problem wouldnt be adressable this way, and I would need to redesign this system. Thankfully, this experience led me to great learnings.
Key takeways

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!

Untitled
Untitled
Untitled
Untitled