Sections:
About
Hookwinked is a chaotic game where you play as a fish just trying to make it through the day. As your once safe waters become a hotspot for fishermen, survival becomes more difficult by the day. But before all hope fades, a strange opportunity gives you the chance to fight back and end the cycle.
Design
Highlights
Gameplay
One thing my previous games lacked was the sense of variety and progression that makes more long-term gameplay satisfying. In Hookwinked, however, I aimed to design various gameplay elements that work together to create a rewarding loop of challenge and progression.
The core gameplay loop consists of:
Over time, this loop is layered with new challenges for the player, like shark encounters and fishermen tossing deadly shock grenades into the water.
Systems
At its core, Hookwinked challenges players' multitasking and resource management skills. With a constantly draining energy bar that also functions as the fish’s health, players have to prioritize hunting prey to stay alive for the ~3 minute duration of each day. As new gameplay elements are introduced over time, they’re expected to adapt by upgrading perks and improving their ability to juggle the increasing number of threats and tasks. I intentionally structured the game this way to create pressure that builds over time and naturally scales alongside player progressesion.
While I didn't want to spend too much time overengineering this project, I did think it was necessary to create a simple system that adjusts the difficulty for less adept players. To achieve this, I made it so two extra prey are added to the spawn pool every time a player fails a day, up to a maximum of 1.5 times the original amount. In playtests, I found that this approach was quite effective. Players who were struggling on particular days felt less frustration on their reattempts and didn’t feel patronized, thanks to the subtlety of the assistance.
AI/Enemies
Fishermen and sharks are the two main threats to the player’s survival. In game, fishermen are represented by boats that spawn on the surface of the water. Each boat can spawn 1-2 fishing lures, which the player must avoid confusing for real prey. When a player tries to eat a lure, they have to survive a simple mini-game or else they will be snatched out of the water. Successfully completing the game will free the player but use 10 points of their energy.
On the final day, fishermen also deploy shock grenades as a latch ditch effort to kill the player. The grenades have a spherical AOE and will cost the player 15 energy points if they're within range when they go off. Grenades are spawned randomly every 10-25 seconds and are thrown down from the surface in front of the player so that they have to make a concerted effort to dodge them. I added the grenades to further challenge the player’s ability to manage multiple threats and make the final day feel the most intense.
Sharks start appearing day 3, after the player has had the chance to get used to the basic mechanics. I wanted the player’s first shark encounter to catch them off guard, so sharks appear silently and without any warning that day. To make sure they pose a real threat, I made them head in the player’s general direction every 15-30 seconds. If the player is paying attention, they can avoid the shark without too much difficulty. Otherwise, a bite will cost them 30 energy points.
Programming
Highlights
Simulating realistic fish movement can be a bit of a challenge as fish can move in any direction on all axes of a 3D space. As a result, avoiding obstacles requires a different approach than the typical 2D path-finding used for bipedal characters. To start, I created a function that allows the fish AI to constantly check if there are any obstacles within a specified angle of the direction of their current target location, allowing them to know whether or not they need to go in a different direction. To make this more performant, the fish have sphere triggers that only allow this function to run depending on whether objects with an “obstacle” tag have entered the trigger.
What was more challenging though was figuring out how fish should react and adapt once an obstacle is detected in their path. Initially, I tried a simple approach that involved the fish simply rotating left or right until the line traces didn’t hit obstacles, but I found this to look quite unnatural. In addition, it failed to account for instances where it made more sense for the fish to go up or down.
After doing some research, I decided to uniformly project points on a sphere around the AI fish using the golden ratio. With these points, the AI can project lines outward in virtually all directions until a direction with no obstacles is found. When a potentially safe direction is found, a final overlap box check is done just to make sure the AI will have enough room to move. If everything is clear, the AI will smoothly rotate to the new direction and continue on with its journey.