I was the lead programmer for our latest group project for our storytelling course. We developed a 3D first person horror game in Unity3D where I was in charge of game design, story development, AI, player mechanics, psychological horror moments, and aiding my team with programming.
We developed a series of prototypes while following the agile process to playtest implemented mechanics and design decisions. We wrote a study for each prototype containing what our purpose was, research questions, establishing the playtest methodology and a protocol script for the intended gameplay experience. These provided us with lots of insight into our project and improvements we could make.
I developed a smooth player controller that utilized unity's character controller, but contained a few hundred lines of self-written code for a customized movement system that was smooth, satisfying, thouroughly tested and polished. The AI uses a NavMeshAgent for movement, but has a custom written script for more developed behaviour the player can experience. I made the AI patrol randomly throughout the asylum, touching or throwing any small interactable objects which makes noise the player could hear. Once the player's sanity decreases to a specific point, the AI becomes visible and actively chases the player on sight. The player's vision also changes depending on their sanity, which decreases in the dark, and slowly increases in the light.
The asylum contains a series of puzzles the player has to solve in order to spawn in soul shards they can collect, and deposit into a pedestal in the starting room. The puzzles vary from searching for evidence in crates, entering keycodes, and problem solving to find the location of patients by reading newspapers and books describing past events that also reveal more about the story of the game.
One of the core experiences we envisioned for this game was terror or psychological horror. We avoided the use of jumpscares because naturally, there is relief after a jumpscare. We wanted to gradually build up pressure on the player as the game progressed through the sanity system, and a series of moments that uncover as the player completes more puzzles. We have moments that have the ghost peaking at the player from a doorway, lights breaking, the ghost crying in a corner, and lots of ghosts hanged in the patient room. These are not randomly inserted into the game but contribute to the story as the player character's past gets revealed.
This project was combined into two courses, game design and development where we incorporate everything we learn from designing games, and unity experience. We wrote lots of documentation involving the game design document that taught us how to design the concept, rules, core mechanics, core loop, dynamics, aesthetics, player demographics, interest curves, prototyping and lots more. The plan for this project was to provide a fast-paced action experience for the player in our roguelike.
My main contribution was directed towards the AI, enemies and bosses the player would be fighting through 95% of the game. Using polymorphism I created different kinds of enemies, melee, ranged, enemies that heal others while running from the player, and the dragon boss. They are all animated with blend tree movement, attack and death animations. Enemies have an aggro range, suspicion and continue to chase the player for a little bit when the player leaves their aggro range. Healers approach any nearest enemy with low health to heal them, while fleeing the player if the player is closer to them than other aggressive enemies. The dragon boss contains chasing animations, and an animation for raining bullets all over the map.
This was a personal project of mine I developed during my CST diploma program. Using JavaFX for graphics and Java as the main programming language, I created a 2D turn based strategy game with pass-and-play gameplay. My future plan for this project is to incorporate singleplayer mechanics with AI using the Minimax algorithm to determine the best outcomes with movement, unit creation or city captures.
Using what I learned from a chess and wildlife simulator I developed for previous assignments. I decided on heavy usage of object-oriented programming for this game, with fifty classes including many child/parent relationships and interfaces. You can select how many players are in the game, then I wrote an algorithm to randomly generate a world with a somewhat belieavable environment that affects gameplay. It also randomly spawns player starting cities and neutral cities other players can capture.
Every turn cities generate gold, so player's objectives are to capture neutral cities and destroy all other players on the map by eliminating their cities. Cities can be clicked on which opens a panel for unit creation, where each unit has unique stats and abilities (rogues are invisible in forests and do not suffer terrain penalties, clerics can heal friendly units, sorcerers deal explosive damage, ballistas pierce, necromancers resurrect dead units etc.). Units cost gold and the more powerful the unit is, the more gold it costs.
The in-depth movement system was my proudest achievement in this game. I developed a Vector class utilizing the Dijkstra algorithm that incorporates unit speed, abilities, and terrain penalties. Fields are easy to move through, forests are more difficult and mountains are very difficult, however terrain with movement penalties also provides a defense bonus. I started with generic horizontal/vertical movement, but improved on it with the algorithm for diagonals, and terrain penalties to find the shortest path to any tile compatible with the selected unit's movement speed. To fight, a unit simply has to click on an enemy unit within range, and if it is able to retaliate, it fights back with decreased attack.