Table of contents

Introduction


Cassandra’s Fate is a CRPG cooperative video game project started in 2021 by a young studio, Random Synapse Studio, founded by a group of freshly graduated friends with their love for cooperative RPGs.

All the team, espacially the funders, was deeply involved in this project. We didn’t count our time passed on the features, learning day after day, week after week.

We were all juniors, reunited around an objective, ambitious, certainly, and driven by our passion for making and playing video games.

We were looking for financial solutions to continue the development of Cassandra’s Fate. Unfortunately, after a little more than a year, without successfully finding resources to continue, Cassandra’s Fate had to be put aside and most of the team had to move on. This is, sadly, the true and realistic life of 99.9% of this kind of projects.

You maybe have noticed that I’ve used the pronon “we” instead of “they”, and this is natural to me as we all were so involved that this was OUR project, even as a freelance.

Why did I join the project?


In Septembre 2021, I was finishing more than one year on Unity projects as a freelance, during my 4th and last year of my studies. I absolutely wanted to work with Unreal more seriously.

I heard a ton of good things on this engine and I was convinced that I should learn and cut my teeth with it for the future. In addition, I was really attracted, naturally, by Unreal Engine since a while!

That’s why we found each other with Thibaud Vegreville (project leader of Cassandra’s Fate back then and funder of Random Synapse Studio) and the rest of the team.

I needed a project to build my knowledge, experiment, learn, and I was thirsty about it (and I still really am!). Furthermore, I love cooperative and RPG, this was the perfect project for me! I found a relentless and determined team, loving to learn as much as I do. I’m proud to say we grew up in the game making together.


Back to top 🔼

The Team


Name Role
Thibaud VEGREVILLE Lead Programmer / Game designer
Damien SIEST Executive / HR
Laurent DI SARIO Scenarist / Game Designer
Robin ABOU Scrum Master / Community Manager
Théo HAGRY Programmer
Adrian GRATTEPANCHE Graphic Designer / Artist
Fabrice ROS PATURAUX Art Director
Matthis LE TEXIER Programmer


Back to top 🔼

My Missions


During my time on the project, we were really focused on core gameplay mechanics such as the battle system, in turn by turn, leaving the lore and scenaristic systems behind for the moment (but sadly we never had the time to work on this part seriously). Thus, I have worked a lot on a thing I truely love in RPG : battle of statistics! Equipment, abilities, statistics,.. So much fun!

I even found myself programming bash scripts to translate excel files into proper CSV format to import in our data system in Unreal Engine and fluidify Game Design process.

See the helper command I could retrieve from our old discord server (I have sadly no more access to the project's cloud drive as I'm writing this in 2025 😔)...
Expand Me
        PS D:\Unreal\Cassandras-Fate\Script> Get-Help .\ExcelConverter.ps1 -full

        NAME
            D:\Unreal\Cassandras-Fate\Script\ExcelConverter.ps1

        SYNOPSIS
            Convert a table located in a worksheet of an excel file into an Unreal formatted CSV.


        SYNTAX
            D:\Unreal\Cassandras-Fate\Script\ExcelConverter.ps1 [[-XLPath] <String>] [[-SheetName] <String>] [[-StartCell] <Int32[]>] [[-OutputFolder] <String>] [[-OutputName] <String>] [-UseRowName]
            [<CommonParameters>]


        DESCRIPTION
            Unreal datatable systeme uses CSV format to import/export. This script can convert part of the GameDesigner's data located in excel files into a format
            that can be imported as DataTable in Unreal, aka CSV.
        PARAMETERS
            -XLPath <String>
                Specifies the path to the excel file.

                Required?                    false
                Position?                    1
                Default value
                Accept pipeline input?       false
                Accept wildcard characters?  false

            -SheetName <String>
                Specifies the name of the worksheet where belong the data table to convert to CSV.

                Required?                    false
                Position?                    2
                Default value
                Accept pipeline input?       false
                Accept wildcard characters?  false

            -StartCell <Int32[]>
                Specifies the left up corner coordinates of the data table to look up for in the worksheet, aka the starting cell. (1,1) by default (A1).

                Required?                    false
                Position?                    3
                Default value                @(1,1)
                Accept pipeline input?       false
                Accept wildcard characters?  false

            -OutputFolder <String>
                Specifies where the output CSV will be saved.

                Required?                    false
                Position?                    4
                Default value                UnrealCSV
                Accept pipeline input?       false
                Accept wildcard characters?  false

            -OutputName <String>
                Specifies the name of the output CSV.

                Required?                    false
                Position?                    5
                Default value
                Accept pipeline input?       false
                Accept wildcard characters?  false
            -UseRowName [<SwitchParameter>]
                The first column of the Unreal DataTable is the "RowName".
                If this parameter is specified, the first column of the table in the excel will be used as the RowName column.

                Required?                    false
                Position?                    named
                Default value                False
                Accept pipeline input?       false
                Accept wildcard characters?  false

            <CommonParameters>
                This cmdlet supports the common parameters: Verbose, Debug,
                ErrorAction, ErrorVariable, WarningAction, WarningVariable,
                OutBuffer, PipelineVariable, and OutVariable. For more information, see
                about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216).
        INPUTS
            None. You cannot pipe objects to ExcelConverter.ps1.


        OUTPUTS
            If successfull, creates or override (with confirmation) a CSV file into $(Get-Location)/UnrealCSV by default. This can be overrided with the OutputFolder parameter.
            The file name would be as follow if not specified : ExcelFilename_WorksheetName.csv. This can be overrided with the OutputName parameter.


            -------------------------- EXAMPLE 1 --------------------------

            PS>.\ExcelConverter.ps1 -XLPath ./MyExcel.xlsx -SheetName Sheet1






            -------------------------- EXAMPLE 2 --------------------------

            PS>.\ExcelConverter.ps1 -XLPath ./MyExcel.xlsx -SheetName Sheet1 -OutputFolder ./MyOutputFolder -OutputName MyOutput






            -------------------------- EXAMPLE 3 --------------------------

            PS>.\ExcelConverter.ps1 -XLPath ./MyExcel.xlsx -SheetName Sheet1 -UseRowName
    


Back to top 🔼


1. User Interface

I remember that I spent a looooot of time on the User Interface. Nobody, in the programmer team (we were 3..) wanted to do it. And I never did it so I was pretty excited about it (cool, a new thing to learn !). Back in time, I did a bit of web development because I was satisfying to code and see the results in realtime with HTML/CSS.

In the same way, that’s the reason why I appreciate to build and develop tools for my team: my work is directly in the hands of the user and help him/her!

In the early stage, I had to do mockups and placeholder interfaces for the game. It’s really straightforward and classic widgets for an RPG as you can see.

The true challenges was to apprehend the UMG (Unreal Motion Graphics) tool to build-up the interfaces and connect them to the ton of datas we had in the gameplay.

Knowing that we were using the Gameplay Ability System framework.


Back to top 🔼


1.1. UI System

At first, every menus was fullscreen, like the character details:

Notice the humble design change depending on the class you play, amazing 👀


Further back in time, we changed our plan and wanted to have a window/panel system for the interfaces, you know that one, notably from famous MMORPG!

Thus, I developed a complete system from scratch with UMG tools I had at my disposal, mainly using drag and drop system:

The objective was to have windows you can drag and drop anywhere, with focus system and draw priority system, where windows draw on top of each other. When clicking on a window you can see behind, you regain the focus on it and it brings it back on top of others.

For the widget architecture, I created a parent for all panel widget containing:

This way, to create a new panel, it’s as simple as creating a child blueprint of W_BasePanel, and fill the NamedSlot with new content. Panel header’s title will be filled with the Name variable and every panel has now the same behavior with different content, and voilà!


Back to top 🔼


Cassandra’s fate was using a lot of datas for character statistics, attributes, abilities,… We were coupling Data Driven logic, with data assets, and Gameplay Ability System framework to consume those datas.

My additional work on the UI was to

Here are some examples of mock-ups for different panels in the game:






Back to top 🔼


2. Gameplay Core


Coming...


3. Art integration

During the entire time in the project, I had the mission to work closely with the art team.

I was in charge to help import and integrate art asset into Unreal: