top of page
TotallySpiesCyberMission_image1600w_edited.jpg

Totally Spies! - Cyber Mission

Developed by Balio Studio, published by Microids, licensed through ZK&FF.

Totally Spies! - Cyber Mission is an action game with stealth mechanics.

In this project I mostly worked on core and mechanics systems such as objectives, interactable, and save.

Save System

The base system is not overly complicated. It's a dictionary of keys and values in a JSON structure and the Newtonsoft.Json API.

​

The difficult part was, during the missions, properly saving the state of the game and restoring it afterwards. Because it's a mostly narrative driven game, there were a lot of unique scenarios to account for. Thankfully though, it wasn't about saving at "any" given time like a quick save in a Bethesda game, but at controlled save at given, safe checkpoints.

​

The items to save were many but for each of them I had them represent their "state" to save with an integer., and most of the time 0 and 1 sufficed. These are easy, they've either been activated or haven't.

Different items which states need to be saved.

Mission_2B_Envi_1080p_22.05_edited.jpg
Mission_5B_Envi_1080p_21.05_edited.jpg
Mission_5B_Envi_1080p_21.05_edited.jpg
Mission_1A_Envi_1080p_22.05_edited.jpg

To collect and set this state, I made an interface ISaveLoad with the methods int GetState() and void SetState(int state), that each "saveable" item had to implement to determine its current state, and how to apply said state. Then they also had a component ItemSaveLoad which would contain the corresponding ID and would act as the monobehavior anchor point.

For example, a chest would set himself up as open and non interactable if it had been open previous to the last checkpoint.

Mission_5B_Envi_1080p_21.05_edited.jpg

Chest loaded at state 0

Mission_5B_Envi_1080p_21.05_edited.jpg

Chest loaded at state 1

The MissionManager would, in the editor, collect all the items of the mission, sort them into lists (enemies, coins, interactables,) and give them an ID (to their ItemSaveLoad). ​​

Totally Spies.png

Then at runtime, when reaching a checkpoint, the MissionManager collects all the states from the previously saved lists and sends those states back if the player loses (gets caught, a timer runs out, etc.) or quits the game and gets back. (A coin reappears, a door closes, an enemy is no longer stunned and  starts patrolling from the beginning, etc. the UI objectives and guides also has to be reset)

Mission_1A_Envi_1080p_22.05_edited.jpg
Mission_1A_Envi_1080p_22.05_edited.jpg
Mission_1A_Envi_1080p_22.05_edited.jpg

Spy freezes an enemy

Spy gets caught before reaching the next checkpoint

Enemy resets to state 0

after reloading from checkpoint

Some unique collectables have a second layer of save/load. If the unique item has already been collected in a previous run of the same mission, then it won't show up again, unlike coins. (In the coins case, it's because it's the total amount of coins grabbed by the end of the mission that matters, not the uniqueness of each coin)

​

​

Mission_1A_Envi_1080p_22.05_edited.jpg

Blueprint

Mission_1A_Envi_1080p_22.05_edited.jpg

Mechanical Coin

Mission_1A_Envi_1080p_22.05_edited.jpg

Lost Item

Mission_1A_Envi_1080p_22.05_edited.jpg

Rare chest

(contains one of the previous items)

Objectives/Guidance System

The objectives system shows in UI the current overall objective, concrete objective, and, if available, subobjectives. The guidances are also UI elements that guide the players towards the objectives or subobjectives positions (if there is one). Both objectives and guidance work in tandem. The UI side of the guidance system was done by Fabrice Mereau, also at Balio Studio, and I was responsible for calling the guidance when a new (sub)objective appeared.

Just like the SaveSystem had the ISaveLoad and ItemSaveLoad to track each GameObject in need of a save individually, each GameObject that could influence the tracking of the objectives had a component QuestAction with them.

​

The ObjectiveManager has, for each mission, the list of objectives and the QuestAction related to them.

An objective might involve disabling a certain number of enemies, collecting a specific item, or just reaching a point. All of those would have a QuestAction component, and would call a void CompleteObjective() method upon triggered, which in turn would tell the ObjectiveManager. The ObjectiveManager would check if the concerned QuestAction is part of the current objective, and if it is, it checks it. If there are no more sub-objectives (e.g. you need to pick multiple items and you still have some items left), then it'd go on to the next objective, which would imply updating the objective UI and the guidance position in the screen

Totally Spies Objectives 3.drawio.png

Transmitters, Receivers and Cables

For the interactables, I decided to split it into two categories.

Transmitter : the player interacts with them one way or another, and these send a boolean signal (true or false) to receivers depending on their states. 

Receiver: they receive the signals from one or multiple transmitters, and decide what to do depending on the signals outcome and a bitwise operator. A door may be connected to three levers, and may need for all three of them to be powered for the door to open (AND), or may need one or more (OR), or may need exactly one positive and no more(not quite XOR but it's the idea), for it to open, but if a second signal comes, it closes down.  

​

Transmitters

Mission_2A_Envi_1080p_21.05_edited.jpg

Capsule

(Positive signal as long as a spy is holding it)

Mission_2A_Envi_1080p_21.05_edited.jpg

Button

(Is positive until interaction, can't revert to negative)

Mission_2A_Envi_1080p_21.05_edited.jpg

Lever

(Signal can be switched to positive or negative at any time)

Receivers

Mission_3B_Envi_1080p_21.05_edited.jpg

Door/Gate

Open or closed

Mission_3A_Envi_1080p_21.05_edited.jpg

Lasers

Turned on or off

Mission_1B_Envi_1080p_21.05_edited.jpg

Camera System

For story progress

For the player to understand what the transmitter does or how to activate a receiver, cables between transmitters and receiver have been placed. Their visual helps following the source, and whether or not the transmitter is on.

CablesONOFF.png

Other mechanics

Puzzle Tiles

Puzzle Tiles is one of the different puzzles in the game. The puzzle acts like transmitters; you complete them to open a door for instance. In this one, you need to go through the correct tiles in a specific order in order to complete it. Should you fail, you'd need to restart the puzzle anew.

At first each tile had a square, uniform symbol, but it turned out to be too easy to complete, so the designer decide to add randomized arrows to confuse the players a bit. 

Lasers

Lasers are a type of enemy that when triggered, sound the alarm and the player automatically loses, so it has to either go around them, or if possible, deactivate them (via a transmitter). They can also move!

Spies VFX
Other VFX (non exhaustive)
Main shader features (ft. Adriano Baglio, creative director at Balio Studio)
Final comments

This was a fun project to work with at Balio Studio. I'm sure the sentiment is shared with many developers at many studios, but in retrospectives, there's still a lot I could have done better, lots of visual feedbacks, lots of polishing, but we work with the time we have, and sometimes once you've finished a specific thing, you can't come back to it, the project has to move on! But still it's all experience to further improve future projects.

bottom of page