Cardboard Chronicles has players take control of Doodle an innocent kid who's been sucked into his hand-crafted world of cardboard known as DoodleBurg! Help him save the people from an alien threat that seeks to flatten out all of DoodleBurg!
Role - Design Lead, Engineer, Narrative Design
Project Duration - 5 Months
Engine - Unreal Engine 5 then 4.27
Time Size - 13 People
Gameplay!
Screenshots
Design Lead
Narrative Revision from prototype stage. Worked on all revisions of the gameplay and narrative till we got to the final version which is currently locked in.
Leading Meetings for designers and narratives.
Ensuring a connection between narrative and design decisions for ludo-narrative harmony
Breaking down design ideas into design documents with proper asset lists for Artists and Engineers.
Became a point of contact for Designers, Engineers, and Narrative Team. Any decision that involved design of the game or helping with implementation of the game I became an invaluable asset that was referred to during these decisions.
Giving feedback and solutions to issues and problems in level design and the narrative team might have when working on the project. Level design I wanted to ensure that every level had a function and helped evoke a certain feeling or emotion especially towards the end of the game.
Here's some photos of the design process and our planning process. We wanted to make sure that all ideas were entertained and put to use.
UI Engineering
I created a Cutscene System so people could play .mp4 videos which is what our artists had given us for the cutscenes. This had started off as a way of playing the Dog Petting Videos, but once I was able to figure that out the artists could make cutscene videos outside engine where they felt they had more control and power over them.
For the cutscene system, I also helped out with creating the Skip function as well. This was a tougher function to figure out, so another Engineer and I sat down and figured out how to make it work, which involved a mix of making sure media was being opened, closing it when certain seconds had passed and creating events relating it. The logic is more or less straight forward once we ran tests, but Unreal 4's Media Player has a lot of quirks we had to learn and figure out a lot.
Did the current Title Sequence for the game. I was given the .PSD files from the artist and made modifications to it for the current Title Screen present in the game including using masks and isolating parts of the title screen so it could be brought up one at a time.
Implemented Health UI. This included using flipbook animations that the artists would create and implementing those within Widget Blueprints to add life and personality to the UI as a whole.
Creating UI for Whack-A-Mole Round Start. The individual art components were made by the artists, but the animations and entire implementation of them were done by me in-engine.
Had to look into the Whack-A-Mole system made by our Engineer and had to coax out the information from said system I needed to display for that mini-game.
Updated Previously created UI to be intractable with just the controller so no Mouse Input would be needed without using Common UI.
Technical Designer
Implemented all of the current NPC interactions present in the game. At the time of writing this there are 6 implemented NPC interactions and things for the player to interact with. These are there to add life and interaction to the game to make it feel more reactive to the player themself.
I created sequencer events for making interactions flow better in the game. This includes implementing Fades, changing Game states using Sequencer Events, and using character animations.
I also had to connect and work with three different systems made by three different engineers as they had a huge amount of overlap which is Puzzle System, Dialogue System, and Combat System. What made it slightly easier for me to do this is that the Dialogue System is based on the logic and implementation that I had done in the previous semester.
The hardest part of the game with this role was the Town Center. I had to move around characters, change dialogue, and make sure certain scenarios are met to change the town center depending on it.
A great example is that of the Mayor NPC, who also went through a lot of revisions on where they need to be, what dialogues they would say, and what their dialogues would trigger.
In an initial passthrough the flow was that the Player would have to talk to Mayor, which would then spawn in creatures after that dialogue sequence. Once that combat encounter was done, the Mayor would teleport to the middle of the starting area and talk to the player, which would open up another interaction that would get rid of a blocked path up ahead.
This lead to the code having to be checked in this manner then.
This path changed again and instead became:
Now this was fine on the town center when everything was in one place, but due to the open world-esque structure of the world we ended up needing to save those states and run checks when players would load in and out of maps. This would force me to rethink my logic I had implemented before, but on top of that the thing that made this harder than it needed to be was the placement of one of the bell pieces in the Town Center itself. So, I needed some way of hearing those events as they were triggered even if the player was in the town level.
I then adopted a back to forth approach to the logic while coding them. I needed to check their last task which was if the town bell was rung or not. If it was run then I can just teleport him and change his dialogue to the last branch it needs to be.
If it's not I'd create a listener for the event, on bell rung, in case the player found the bell pieces and still hasn't rung the bell.
I then needed to check if the Player had collected the three bell pieces,
The first block you see refers to checking if the Town Bell has been rung or not. That was considered a "Puzzle" by our Engineers, so I was able to use the Puzzle Enum and run a simple true or false.
If true, code was straight forward, just teleport the Mayor near the Tower and then give them the final branch of dialogue.
However, if it was false that's where things got tricky. Due to the event being able to be triggered in the scene itself and I was only running this check on EventBeginPlay, I needed to create a Listener and launch that sequence of events which is where I bind the event to Object Trigger. I then need to check if a previous condition in chronological order has been reached or not, so I call another event (CollectBell) after creating the Listener Event.
This block of code (CollectBell) more or less does the same as this where it checks if all the pieces are collected or not.
This is a little bit more spicy code and more to talk about. Over here you can see I started using the Game Param System which was our way of saving things from level to level so things wouldn't automatically set back when moving back and forth between levels without calling everything a Puzzle and placing it there. I could create several events and reference them, but it required such an attention to detail as any misspellings or difference in letters would cause a crash on PC and on the Switch.
So again, this is where the backwards approach helped me, if the player had destroyed the rubble in the town center, I just needed the Mayor to stand somewhere else as my other previous code blocks would handle moving the Mayor to the Bell Tower when needed. This area was very dialogue dependent, so what I needed to do was do dialogue checks then. We want the Mayor to change his dialogue to a more generic dialogue after the first introduction so the player had a reminder of what they needed to do without going through the entirety of the Introduction dialogue.
This is using the Enemy Spawner Code to destroy obstacles and open up the Town Center for the Player to Explore More.