DevLog #3 – You need to cleanse the corrupted world!
I hope you had a great holiday season, and I wish you all the best for this new year 2023!
For my part, I hope to make good progress on my second game Destroy The Monoliths. I implemented all the main features and systems and I am now getting really close to the “now let’s add a lot of content” production phase. So hopefully I will release an alpha version in the upcoming weeks or months! But today, let’s resume where we ended last devlog and talk about the meta progression layer.
Your mission is to cleanse the world
A game of Destroy The Monoliths consists of a campaign, i.e. a set of missions (16 at the moment, but this number may change). You play as a drone-ball and you are sent to a distant world that needs your help. Indeed, strange corrupted monoliths stand in several sectors of this planet (whoever built them seem to be long gone…). You have to destroy all the monoliths in each zone to complete all the missions, cleanse the world and thus win the campaign.
You can see below a screenshot of the procedurally generated campaign board. Each mission has its unique set of characteristics like the terrain shape or the biome. Mission get more difficult the further from the center (i.e. bigger map and more / stronger monoliths).
A few technical details
I use OpenSimplex noise to generate the world map. I combine two noise textures, one for the terrain shape and another for the biomes. Then I use a shader to color the pixels with a gradient depending on the noise values and some thresholds. For instance, negative shape noise values show as a sea, and negative biome noise values show as colder biomes. This map does not serve a visual purpose only, it also determines the mission characteristics. I scan all the pixels in the sector and then pick the most represented biome, and compute the map shape from the percentage of solid ground. I have currently implemented 6 different map shapes (e.g. archipelago, inner sea or river). More about that in a future devlog dedicated to terrain generation!
To generate the missions, I divide the world map with a grid and pick random positions to have at most one point per tile. I also create an underlying graph to manage the mission order. When you complete a mission, the board unlocks its neighbors if they were still locked. To build this graph, I use a Delaunay triangulation with the mission points, and remove some edges to refine the look (but carefully to make sure everything stays connected to the center!).
Last devlog, we talked about temporary upgrades that you get by mining special blocks and keep only until the end of the mission. Since missions get more difficult the further into the campaign, we also need some system to get permanently stronger. I decided to opt for a roguelike technology tree. Let’s discuss a few aspects of this.
There are three types of technologies you can get: new weapons, new building blueprints, and relics with various effects.
When you receive an upgrade, you get to choose between four random technologies. This happens a few times per mission after destroying a monolith. Also, you always get to choose a new technology on the campaign board before starting a mission. At each upgrade, the game tries to always give a choice between one weapon, one building, and two relics.
These technologies are permanently acquired only if you win the mission during which you got them. If you lose the mission, the game removes the technologies from your abilities and may offer them again later depending on the rng. Concerning the starting tech at the beginning of a mission, the pool remain the same after a defeat but previous choices become locked (except the last one to ensure you still get a new tech even if you lost numerous times). This mechanics adds a bit of challenge and tension. Losing is not really punishing because you can simply restart the mission or try another, but I think it feels better to win when defeat has a few consequences regarding the upgrades you carry over.
Internally, the game organizes the technologies in a tree. Each time you pick one, it unlocks new cards that may appear in future choices. The tree is a table of numbers, but I wrote a script to display it nicely with nomnoml. It helps to brainstorm and check errors in the table!
Status menu overhaul
I also reworked the status menu to show all your current weapons, buildings, relics and temporary upgrades.
That’s all for today’s devlog, I hope you liked it!
Lately, I polished a lot of internal code to make sure adding content will be as easy as possible in the future. This includes automating what can be and removing all harcoded data to use csv tables instead. Also, I reworked a bit the minimap, added a system for status effects like slowness, poison, etc, worked on new biome textures, a key artwork, and made a few tracks for the OST. I’m very happy with everything I managed to get done in the end of 2022 and I will be glad to showcase all of this in future posts! I try to produce one devlog every two weeks so I’m always a bit ahead in development to have more hindsight when writing 😉
See you next time!