
Moonshine Murder is a multiple-choice narrative game where you try to solve an investigation. Talk to the various regulars at your bar, dig into the discussion to uncover their secrets.
This project is a multiple-choice narrative game made during my Third year of game programming studies at IIM.
It's the result of one month work by a team of nine people :
- 3 game programmers
- 3 game artists
- 2 game designers
- 1 producers / game artist
You want to try Moonshine Murder ?
My Contribution
For this project, as we were working on a game requiring a lot of narrative integration by the game designers, and we had a fairly tight deadline, we insisted more than usual on giving them tools to facilitate this integration.
As a result, I worked on the following tools & game mechanics, as well as the game loop and numerous game feel and juiciness elements.

Dialog Graph Tool
I programmed a dialog graph tool to ease dialogs' integration process.
This tool is one of the central element of the game, allowing game designers to create a dialog tree in a Unity graph, and associate dialogs with it. It can also contain choices (see below) and make action calls (see below) to give game designers maximum control over the flow of the game.
I created this tool from an empty graph on Unity, and then recreated everything from scratch (which was the main difficulty). This includes creating and linking nodes, saving them, loading them, exporting them as ScriptableObject data and using them in “DialogDisplayers”, so that the tool can be used for different types of game.
Therefore, the tool is suitable for multiple-choice games, rpg, etc., with several dialogs for different characters.
Action caller graph Tool
The dialog tool also contains an action caller system.
In addition to creating their own dialog tree, game designers can also assign as many actions as they like to each node.
To do this, they simply drag and drop an object from the scene onto the node, choosing the method they want to trigger, and then, when that node is executed in the dialog tree, all the actions will be performed.
It's through this that characters enter and exit the scene, but also that clues are unlocked, choices are made available, and the flow of the game and its staging unfolds.
This system was surely the most challenging to make, especially to ensure that it was unbreakable and highly reliable, so as to avoid any strange behavior.
This system also comes with another tool I created for the other programmers, a permanent ID assigner, which in this case allows me to find references to actions in the scene.


Mutliple-choice System
Finally, the tool also takes into account the player's choices.
As I said above, it's a dialogue tree, so it allows you to customize the different dialogue paths according to the player's choices.
But there's more to it than that. There's also a system of consequences/conditions for choices.
This system is associated with an inventory dialog that can be filled in as the graph progresses by game designers using the action caller (see above), and then game designers can add conditions to make a choice available or not. This then allows choices to be saved, so that consequences can be applied to them.
The dialog inventory can also be filled outside the graph. This is how alcohol effects make some choices available or unavailable to the player.
The game's clue system also works with this system, making choices available if the player has obtained the clue through a certain dialogue, for example.
All these systems combined make it a perfect tool for games with dialogs, that can support multiple choices, as in this game.
Dev Anim Tool & juiciness
I also made a visual dev anim tool for programmers, as well as some gamefeel and juiciness elements.
In fact, I've created a visual editor interface that makes it easy to create numerous animations useful for the game's gamefeel and juiciness.
These include color transitions, fade-in/fade-out, animated movements, scale effects, idle effects and more. It can also be used to trigger specific events at certain points in the animation, as well as to create sequences of several animations.
The tool is an interface for animations scripted with Dotween, making these animations available in the editor with their customization.
All you have to do is trigger them with a Unity Event, for example, or a certain Action caller... (see above).


Localization Tool
I did the game's localization system.
Instead of using the Unity system for localization, I recreated a system allowing game designers to easily integrate their dialogues.
They can write their dialogues on an Excel spreadsheet in different languages, assign them a key and export the spreadsheet as a CSV file.
The tool I've made then transforms the CSV in the editor into a ScriptableObject that the localization system can understand. All you have to do is assign the keys to the right texts and you're done.
The system also works perfectly with the dialog tool, without the two being dependent on each other to avoid a complex architecture.
Sound System
I finally re-used a sound system I had developed during a game jam (see in Game Jams : Plié d'Avance), which I improved.
It uses Unity's sound class and mixer system. I've added easy-to-use methods for fadeOut / fadeIn music transitions, as well as random pitch options for greater diversification.
It uses Unity's sound class and mixer system. I've added easy-to-use methods for fadeOut / fadeIn music transitions, as well as random pitch options for greater diversification.
The biggest change, however, is in the way sounds are launched. Now sounds are assigned to data, and it's just a matter of calling the sound data in the editor (through a Unity Event, for example) to launch the sound correctly.
The system then processes the sound, taking into account the parameters set in the data.
