A little about our game, from its Itch page:
“Ransacked is a stealth thieving game in the third-person perspective, where a player controls a thief who can steal almost anything. During the experience the player travels between the Thieves’ Guild and a nearby village, looting homes for their items, avoiding guards, and selling stolen goods for gold.”
On a team of 11, I served as Tech Lead for this projects 16 weeks of development. My main responsibilities were to create and assign tasks between the other two programmers and myself, to implement a broad range of game systems, and to help all members of the group debug their work.
As of June 2nd, 2018, we have been featured in PCGamer’s and RockPaperShotgun’s “Free Games of the Week” section!
Key Tasks Completed:
Just about every object in the village is able to be stolen. From plates or the tables they are on, to coins or the chests they are in, the player can take it. Only buildings, light fixtures, and puzzle environment pieces are exceptions to this.
It was my job to make the creation of these assets as simple and fast as possible for our designers, as we will have hundreds of pickups in the game by the end of production. To do this, I created a parent class with all of the desired variables stored in a struct, as to easily move around the different types of data. Each pickup is simply a static mesh with one more more materials and this struct of data. Things like the name, value, weight, rarity, mesh, materials, and more are all stored here.
Every time an item is picked up, it scales from 1 to 0 and moves to the players bag. Every time an item is dropped (see Endless Bag .gif below), the parent class pickup is spawned, and attributes are given to the item from the inventory array of structs. The pickup then scales from 0 to 1 and falls due to physics being enabled.
Picking up and item also causes any nearby items to automatically be selected for the player. Nearby small pickups are prioritized, then furniture.
The endless bag has a minimum and maximum size, controlled by a value between 0 and 1. The bag itself is able to grow through the implementation of morph targets, which needed to be exported using the modeling software, in this case Maya. Each item has a volume value, and the bag has a maximum volume value. These values are able to be changed at will and results will be immediately apparent if the difference is great enough.
Game Progression / Evolving HUB World:
The player’s progression through the game is based on how many legendary items they have collected. This progress is shown to the player in the Thieves’ Guild, which is in shambles at the beginning of the game. By the end however, gold fills the halls and banners are hung throughout, while all ruined items are removed from the area.
To accomplish this, I created a blueprint that contained arrays of meshes. When loading into the level each time, a quick check of how many legendary items the player has is performed, and each blueprint will change meshes accordingly.
This approach allowed the use of keyboard shortcuts to be used to test out the results, and allowed designers to be fast and precise in placement of these assets.
Puzzle Logic / Object Animations:
To take a break from building core mechanics, I was pleased to be able to work on scripting animations throughout the game. All of the 3-D animations (non-character) played during the game were created using sequences of lerp functions to create effects like the one shown above.
By keeping the manipulated transforms local, these locks and any other animated object can be placed anywhere and will work after assigning which object will trigger the animation in the editor.
Inside of the Thieves’ Guild is a store where the player can buy as many gadgets as they can afford. To purchase one of these gadgets, the player looks at the items and picks it up the same as they would for any item they are stealing.
When purchased, a short animation is played above the gold count, and the item is added to the player’s inventory, displayed in the bottom left. The item then is restocked and the player can continue to purchase more.
These items all derive from the same class “Buyable”, so another item could be created in less than a minute, assuming the mesh and material are ready to go.
Saving / Loading:
This was my first project in which local save files were to be used to keep track of progress for the player. All saving and loading was handled through the same blueprint as to be able to debug any issues with ease.
If the player tries to press “New Game” on the main menu, then a check is performed to see if a save file exists. If one doesn’t, then the transition to the introductory cutscene happens immediately. If one does, then a prompt is given to the player, asking if they are sure that they want to start a new game, as the old file will be deleted.
The same check causes the “Continue” button to be grey if a save file does not yet exist.
Character Animations Implementation:
Though it’s not completely code, I was also responsible for the implementation of all character animations. They were created in Maya by our animator, though the lack of a Windows OS on his part meant that someone else needed to implement them.
Necessary were the creation of animation blueprints, blend spaces, and immense amounts of testing, which I do for all of my work.