Using procedural generation to capture a feeling of discovery
Hey everyone! I rarely return to a project post jam, so I wanted to talk about why I decided to do something more with this one.
After a game jam I always want to add more to my games, but a lack of time and motivation usually gets the best of me. This project was different for one simple reason: much of the content in this game is procedurally generated, meaning I could add a lot of playability without overloading my schedule! In addition to that, I feel we really managed to capture a good sense of adventure with this project, and I was keen to refine what was started in the jam.
With that out of the way, I wanted to talk a little bit about how we tried to use procedural generation to make this small world feel vast, and to reward exploration!
To facilitate the adventure, we wanted the player to succeed by slowly unraveling the world. A key aspect of making the game work, was rewarding the player for interacting with the world, wether from fishing, combat, or even just shooting at random objects. Our hope was that the multitude of interactions would incentivize players to explore the map! We wanted the player to make small discoveries that led them to other bigger discoveries, eventually pulling them into the game's main quest.
Simple in theory, but heres how we went about it. To start, my brother and I brainstormed a bunch of simple interactions that could hopefully be expanded into multiple unique challenges. The player can interact with their environment by clicking on points of interest or by shooting, and we tried to keep from adding mechanics unnecessarily. To this end we came up with several island types:
- Dig islands, that simply require you to find and dig up a hidden item
- Puzzle islands, that require you to solve a puzzle to gain an item
- Combat islands, that require you to defeat a bunch of enemies
- And finally adventure islands, that require you to find your way to the treasure
Here's a small selection of the islands we made:
You may have noticed that ultimately the reward for completing any island is an item of some sort. The combat and adventure islands are self contained, meaning you can start and finish them without any additional outside info (unlike the puzzle and dig islands). To create our quest sequences, the items we placed on these self contained islands were hints for where to dig, or how to solve puzzles, setting the seeds that will lead the player through their quest. Then we were able to hide more important items on those secondary islands, creating a chain of small quests for the player to undertake. By tying the outcomes of these quests together in a sequence we wanted to create the feeling of unravelling a mystery.
On a technical level, this was easiest to do backwards. We place the final island, and decide what key items are needed to unlock it, then those items are hidden on the appropriate island, and a hint to their location is generated. Now that we have hints, we can hide them on some of our early islands. Lastly we place your starting island. After all of our progress based islands are placed, we fill out the rest of the world with small optional things. Shops, minigames, even a bit of random terrain.
There are a number of unique islands of each type, and every new game will contain a random assortment. Since islands are chosen and placed at random, we wanted to give the player tools to keep track of what they've done so far. So after placing all of the islands, we iterate over the world and store map data for its current iteration, revealing it to the player as they explore.
The procedural generation in The Mariner is our first foray into generating a game world as opposed to hand placing it, and we still have a lot to learn about the subject, but I hope this gives you a little bit of insight on how we did it. We wanted to create a unique adventure for every player and we feel the final result is pretty fun!
Thanks for reading! And if you played the game, we would love to hear from you!
Leave a comment
Log in with itch.io to leave a comment.