Summary

  • Project developed as part of the « Principles and Development of Video Games » course at UQAC
  • 4 Members
  • Role: Game Designer / Producer / Programmer
  • Date: September 2022 – December 2022
  • Tools: Unity3D, C#, Unity URP, Perforce, Mixamo, Trello

Description

Messy Potions is a 3D Solo Action RPG in a medieval fantasy world. The player controls Audric, a small (literally, very small) magician with a complex about his height. Audric makes and uses his potions to defeat orcs, giants and undead who guard the potion that will allow him to grow to the size of his peers. 

Game Design

For this project, I was in charge of the whole game design and level design part. This game is mainly based on a combat system that we want to be original and fun, with a simple and fluid management of resources (creation and dissolution of potions). In addition to these systems that we will start to detail so that you understand the game better, the objective was to provide three secondary emotions:

  • A fun and goofy aspect, throughout the whole adventure.
  • The impression of a full world, where you can explore and discover during the periods without combat*
  • A slight stress that punctuates the combat phases.

You can also watch the One-Pager and the GDD of the game (only in french). 

Combat System

The player has no weapons, only the possibility to use potions. When these potions explode against a surface, they generate an effect on nearby individuals. Some potions have positive effects (Invincibility, damage bonus, speed bonus, attack speed bonus) and others have negative effects (Damage, slowdown, freezing, …). Moreover, each potion has 5 different levels. It goes without saying that the higher the level of the potion, the more powerful it is, improving the duration or the power of the potion’s effect.

Different potions
Potions levels

I found this mechanic very interesting because it forces the player to be careful when using his potions. If they improve their enemies, they are very quickly handicapped. In the same way, if they use aggressive potions on their feet, they can handicap themselves.

However, this leads to a major problem. If a potion has the same effect for an enemy and  for the player, they cannot be balanced! For example, if the freezing potion hits the player, they will be immobilized for several seconds. Being frozen for such a long time certainly implies the death of the player.

Solving the potion balancing issue

To address this problem, I divided the effects for the player and the enemies. 

  • Some potions simply have different values. For example, the Volcanic Essence potion does more damage to enemies than to the player. 
  • Other potions have different effects depending on whether the individual is the player or an enemy. For example, the dancing potion prevents the player from fighting but still allows them to move. This avoids killing the player for sure. Another example would be the Flexible Grace. Increasing the attack speed of an enemy is not really interesting as long as the player can move. For this reason I preferred to replace this effect with a damage increase. 
  • Finally, some « overpowered » potions require the player to sacrifice some health points.

Progression in an RPG and goofy aspect

An RPG is generally defined as a game where the player can develop his character. Moreover, I wanted to bring a certain zany aspect to the game, to break with traditional games. The story plays a certain role (the introduction of a very small character complexed by his size) but it was not enough. Let’s see how I linked these two aspects! 

Progression in an RPG

With a combination of two ingredients and an empty bottle, the player can create each of the potions in the game. The level of the bottle determines the level of the resulting potion.

Ingredients and empty vials available in the game

Each potion is related to one of the five types of alchemy (Alteration, Destruction, Restoration, Element and Enchantment) and each type corresponds to two potions. When the player creates a potion, they improve the linked alchemy skill.

The alchemy level gives a probability of success for the creation of a potion. At first, I had envisioned that if the creation fails, the player simply loses the ingredients.

The menu for creating potions
The probability of successfully creating a potion according to the level of alchemy skill
Alteration
Destruction
Restoration
Element
Enchantment
Goofy aspect

Finally, I came up with the idea of the mystery potion. If the potion creation fails, the player receives a mystery potion. It can have any of the 10 effects of the potions presented above. Knowing that there are positive and negative potions, the player might improve his enemies or get hurt if they use them at their feet. I found that it enhanced the zany aspect of the game! Just imagine that the player strengthens his enemies by making them invincible for example or that they make themselves dance. Moreover, the dancing potion also reinforces this wacky aspect because it is fun! And who’s going to stop me from adding such a fun potion to the game? 😉

Delirium Frenzy - the potion that makes you dance!
Failed to create a potion and won a mystery potion
Make the player use the mystery potions

We want the player to use the mystery potions at least a little bit. It’s a core mechanic and it’s fun! But the player may not use them because of their random nature. 

In this case, two ideas have been introduced to encourage the player to use them.

  1. First of all, level 4 and 5 potions are truly more powerful than other potions. This encourages the player to create these potions. However, even with strong alchemy skills, the probability of creating level 4 and 5 potions is not 100%. So the player gets mystery potions and because they are powerful, has every interest in using them despite their randomness.
  2. Secondly, the player is given powerful mystery potions and classic potions of lower level via chests. The loot is not random at all, it has been decided linearly and it remains the same after each game. We have balanced it with several waves of playtests. You can find the balance of resources via the Excel table below.
Final game balancing 

In Messy Potions, there are 4 elements that are interconnected because they directly affect the gameplay: Alchemy skills, resources, potion effects and enemy health. You cannot change one of these elements without immediately affecting the others.

That’s why I proceeded in order. I had an idea of the gameflow at the beginning of the GDD. I wanted the player to progress quickly through the types of alchemy and to create at most about a hundred potions during his adventure. So I started balancing the alchemy skills with the resources allocated to the player.

Gameflow

Then I set values for the potions (damage, duration of effects, etc.) before adjusting the HP of the enemies. Eventually, I used feedback from a few friends to balance the effects of the potions again.

Balancing of enemies health points

Creation of potions

From the beginning, my goal was to make sure that the player could only create potions at a certain moment, between two fights (refer to the Gameflow above).

For that, I created what I call a « Transition Zone » that the player crosses systematically at the end of each level. Inside there is a cauldron that allows players to create potions and an enchantment table that we will talk about later. To reach it, they teleport at the end of a level via magic pedestals, acting as teleporters. They can use a teleporter again to go to the next level.

The transition area
Solving the save and the possibility of changing potion problem

When the player dies, they must be able to come back to life in the transition zone with their potions and ingredients. Except, it would be very interesting to offer the player the possibility to change the potions they have created. However, we don’t want the player to have to systematically recreate all their potions. Moreover, how to manage the randomness of the creation of potions? For example, the player would get a mystery potion and then, after dying, they would make the same potion and this time, the creation would work?

  • First idea | Multiple saves

To address these issues, I tried to develop a whole system based on two saves and the player could choose between retrieving their ingredients or keeping the potions they created previously. I would also freeze the seed in Unity to partially solve the randomness problem. The diagram below summarizes the sequence of saves and game mechanics that I had imagined. 

First idea to solve the save problem - It was not kept
  • Second idea | Possibility to undo potions

Finally, I had a second idea. The use of an enchantment table that would allow to undo the potions. The disenchantment would allow to recover the ingredients of the potions. There would be again the probabilities according to the types of alchemy except that this time, if there is a failure, the ingredients and the potion would be lost.

With percentages a little lower than for creation, this mechanic invites the player to think carefully if they really wants to try to recover the ingredients.

To avoid decrafting and then recrafting potions over and over again to gain experience, decrafting a potion causes the player to lose experience in the target alchemy type. Also, mystery potions cannot be disenchanted.

What is the point of this system? The player’s inventory is stored only once and they can quickly restart the levels. However, if the player wishes to adapt his strategy, they can do so by simply disenchanting his potions.

Menu for disenchanting potions
The probability of successfully disenchanting a potion according to the level of alchemy skill

Level Design

In addition to working on the RPG side and the zany dynamics of the game, I wanted to give the player two emotions: the feeling of exploration with a living world and make sure that the battles were stressful.

Combining emotions

Exploration

To give the player this feeling, I used several ideas.

  1. First, the player must discover the purpose of the potions. Since there are 10 of them, we can estimate that the player needs 2 to 4 levels to see all the effects of the potions. This gives the player a sense of discovery.
  2. By working a lot on the level design, I tried to have different and amazing environments for the player. The goal was to surprise the player and invite them to discover the world where they play.
Example of the large number of potions available
Final design of some environments

3. Many « surprise » chests have been added to the game, hidden in several places. They only contain extra ingredients and the balancing has been done in such a way that the player doesn’t really need to find them to complete the levels. They are still handy though, offering more possibilities in terms of potion creation.

I could have put some of these bonus ingredients in the classic chests. So why bother with hidden chests? Well, with these, the player has the impression of evolving in a living world. Every corner can hide a chest for the player. As soon as the player understands the existence of these surprise chests (via a custom visual), they will start searching for them and thus really explore the world of Messy Potions.

4. Finally, I tried to make the player naturally understand where they are in relation to the environment. For the first three ingredients, which are plants to be harvested along the way, I identified them with themes (Poisonous zones for the Mystic Purple, icy zones for the Impetuous Flames and zones full of life for the Regenerative Mushroom).

Mystic Purple
Impetuous Flames
Regenerative Mushroom
Toxic zones (Mystic Purple)
Frozen zones (Impetuous Flames)
Areas related to life (Regenerative Mushroom)
Slight combat stress

The enemies work in groups. As soon as an enemy belonging to a group is attacked or sees the player, the whole group tries to attack the player. To make the fights interesting, I « hid » some enemies behind pillars or corners. This way, when the player attacks a group, they can have enemies behind his back. This improves the combat experience.

The player can also adapt his strategy if they take the time to examine which enemy belongs to which group. I tried to show the belonging of the enemies via the colors of the props (banners, tents, …). I also adapted the skin color of the enemies to make it easy to recognize the groups. However, in order to have the disappearing shader of the corpses, I had to abandon this idea and keep the same material (green skin color) for all enemies.

You can see which group it is thanks to the colored accessories.
Example of a level with many pillars

Time problem, speeding up the level design

I used a lot of time, trying to create rich levels and learning for the first time really to design worlds that don’t look too empty. Since the game had to have 10 levels with two specific locations (caves populated by orcs and a castle populated by the undead), I had to speed up the pace.

To save time, I got the demo scene from the recovered assets (Synty Studio – POLYGON). I cut this scene into several levels and quickly adjusted them to match our expectations (rescaling some levels, adding elements such as chests or teleporters, etc.).

Example of a level cut from the demo scene

I also had to remove one level, bringing the number down to 9. I preferred to stop adding content and instead improve the content already built because I realized we had a major problem. The first levels created were not the same size as the levels in the demo scene. Indeed, my first levels tended to be too big. They were not fun to navigate, they seemed very empty. 

My two biggest mistakes

Metrics

My biggest mistake in the level design was not to use a metric, i.e. to create levels without any scale reference. I absolutely wanted the player to feel that Audric is small in the game. So I created levels that were completely disproportionate without realizing it. Also, the quality of my first levels was not as good as my last ones. Even though there are not many of them, I improved my level design skills so the content was not of the same quality for each level. 

So I was forced to partially rework the first 5 levels. This was very time consuming. The use of metrics would have helped.

The levels in the caves (Right) are much larger than the levels in the castle (Left)
GDD Update

Once the initial GDD was written (this was a noted task due at the beginning of the project), I updated it very little. I kept many things in mind, without always taking the time to inform my team.

As a result, my team members, who were following the GDD to the letter, were forced to rework certain parts. If I had continued to update the GDD, making it more and more detailed, I would have saved some time to the programmers.

Programming and Management

This article is mostly focused on my work in Game/Level design. However, I also worked on two additional aspects of the game: programming and management. I’ll talk about it briefly.

Programming

I took care of all the inventory scripts, loot scripts and the potion creation/cancellation system. The inventory system alone has over 20 scripts.

I also tried to have a data oriented approach with the use of Unity’s Scriptable Object.

Unity's Scriptable Object
Management

I was the producer throughout the project, i.e. I ensured the good practice of agile methods within the team. I used Trello and tried to make sure that all the developers in the team had tasks in their backlog.

As time went on, I found it hard to get a clear picture of each sprint because of delays or even some developers who were ahead of schedule on their tasks. I plan to work on these problems with my future projects.

Lots of scripts for a clean code architecture
Project Trello - Most tickets are in French, sorry!