To begin, I want to talk about what makes this project a ‘Metroidvania’ rather than just being linear platformer generation (Spelunky, Terraria, and company). To me, a ‘Metroidvania’ is a game with an overarching, game-wide puzzle. A lock-and-key puzzle where the locks are terrain obstacles and the keys are new items that allow the player to traverse these obstacles.
For this project, I’m going to separate the Metroid-like map into sections – into planets, actually. The player will crash land on the initial planet. Upon finding and defeating the first boss, the player will find what he needs to fix the ship. From there, the player can roam space freely.
To begin, I’d like to discuss how I plan on setting up some of the high level functionality of this whole thing. Creating a new procedural generation system is quite a task. It can seem daunting and it’s hard to gather all of the information about your world prior to the initial prototyping stages. For example, I may need to have a special case for generation shops on certain planets. I have no way of knowing how that will work or even if it’ll happen. This makes it hard to find a starting point.
What I do know is that ‘Metroidvanias’ follow a formula. In my case, the player will complete the game when they have finished between five and seven tasks of my choosing. I’ll give an example:
1) Defeat Boss#1 and obtain ‘Engine Parts’
2) Fly to planet that contains morphball powerup
3) Use the morphball to reach Boss#2 and obtain the swimming ability
4) There was water on the morphball planet. Return there and swim to Boss#3. Obtain heat-immune suit
5) Fly to the lava planet that you’ve been avoiding. Find missiles.
6) Return to initial planet and bust through wall to get key card.
7) Use key card to access final boss.
BOOM! Something like that. We can randomize the items so that you get them in different orders, in different locations, etc. Maybe one play through you get the ice immune suit instead of heat. Maybe you get double jump instead of morphball. Etc. We’ll mix it up.
We’ll generate simple planet templates like the one above. We know that some planets will need to be visited multiple times. This could be an example for planet one. The white room could be the landing site. The green rooms are rooms accessible from the start of the game. The red box in the bottom-right is the boss that gives you the parts to fix your vehicle.
The interesting and complex part here is the yellow and the small blue of the map. The yellow will represent a section that you can’t reach to begin with. In this case, it was missiles. The blue room is a ‘choke point’. Choke points are areas that will limit the player’s mobility in some way. We could place a door that requires a key card or terrain that requires missiles to blow through.
Basically, this planet has two distinct areas. When we generate the world, we’ll need to store the level of each of these areas. Because this is planet one, the green area will be accessible from the start, but that won’t always be true. The yellow section will be given a level equal to that of the item required to progress. The missiles were task five, so perhaps that choke point will know to create a level five obstacle.
This is a cool system because choke points require players to have everything up to that level to reach them. Having missiles means you also have the morphball and are heat-immune (in this play through), so that yellow area could be a lava tileset with a bunch of narrow passage ways.
That’s all for now. I’ll get to the low-level stuff as I prototype ideas. I don’t want this series of posts to surpass what I actually have working. Also, HackyZack is taking priority.
Hopefully this is enough to get you thinking about possibly generating and entire ‘Metroidvania’ adventure.