Procedural Terrain Generation

Procedural Terrain Generation Showing Different Biomes

Back to Building: Health, Recovery, and Procedural Worlds

It’s been nearly two years since my last update here on CodeBiome, and I wanted to take a moment to share what’s been going on, both in life and in development.

A while back, I mentioned dealing with some health issues, and at the time, I was hopeful things were improving. Unfortunately, that didn’t last long. I developed atrial fibrillation, which brought on a cascade of new complications and made it incredibly difficult to focus on anything outside of basic day-to-day life.

In November 2024, I had a pulse field ablation a procedure designed to correct the irregular heart rhythm. Thankfully, it was a success. Since then, I’ve been recovering well, feeling stronger, and finally getting back to the creative work I’ve missed so much.

Now that I’m on the mend, I’ve been diving back into Godot (currently using 4.3), and rekindling a long-standing passion project: building a procedurally generated 2D world game.

So far, I’ve set up a basic biome generation system driven by three layered noise maps (Height, Temperature, and Moisture):

These values combine to populate terrain with color-coded tiles representing different biomes. It’s still early, but it’s been exciting to watch a world begin to take shape. Right now, I’m focused on improving biome edges getting more natural-looking transitions between regions and refining the noise logic to support rivers and unique features down the line.

Between my full-time job and running my photography business at AstroMammoth.com, time is always limited. But I’ve committed to moving forward with this game project at my own pace. My goal is to post updates here whenever I can no pressure, just steady progress.

I may also experiment with recording some of my development sessions, both to track my own progress and to share a bit more of the behind-the-scenes process. If that sounds interesting, let me know, feedback is always welcome.

Thanks to everyone who stuck with the site through its long silence. It feels good to be back and even better to be building again.

Back to Building: Health, Recovery, and Procedural Worlds Read More »

Migration to LibGDX Framework Complete

Mountains Working Again
Two layers of mountains are procedurally generating into the world.

This week I was able to complete coding everything from my previous version into the new LibGDX version. So, now I should be able to start implementing new things.  I was able to get two layers of mountains procedurally generating again in the game world.  There are still a few bugs where I am not checking some special cases but overall, it is looking pretty good.  Additionally, I was able to fix the rabbit animation problems I was having from the previous week. 

 I recently made a list of the next items on my list to work on.  It is very long but I would like to start working on attack animations and sprites.  Then I would like to work on adding an inventory system and an item system.  I would also like to work on animated tiles to make the world look more alive.  Every week I seem to talk about working on a noise algorithm for placing objects around the world better,  but I keep putting that on hold.  Hopefully, I can start working on that soon as well. 

Hopefully the next post will have something more interesting to talk about. I spent most of my time this week working on fixing unexpected bugs and getting everything working as good as or better than before. I am looking forward to starting work on the next pieces of the project.

On the end of the post every week I am going add a list of changes that I made during the week and add them to the end of the post.

Full Change List:

  • Fixed Bug: particle spawner had a null pointer exception because there was no sprite for the spawner.  (put spawners into a new type of entity called non render entities) 
  • Fixed Bug: particle spawner not removed during cleanup after it is used. (Empty object was still in memory)
  • Fixed: Rabbit movement animations.  Each rabbit needed its own copy of the animation sprites.
  • Implemented: Mountain Tiles have been added to the game world. (2 layers)
  • Code change: Moved Rendering into each class.  Many calls instead of one giant one.
  • Code change: Created a class for levels.  Moved a lot of the level data out of the game class.
  • Implemented: Entity Sorting for rendering.
  • Fixed Bug: Entity Sorting crashing when sorting Trees.  (Trees at same y height caused the crash)

Migration to LibGDX Framework Complete Read More »

Week 3 Game Engine Progress

Game Engine Work:

This week I continued working on the generation of the 2D map for the game. I decided for now to take out the moisture map and solely base the map generation on a Perlin noise map of different heights. I set thresholds for areas of water, sand, grass, dense forest, desert, and snow. Most likely I am going to change the desert to mountains or rocky terrain. That way this part of the generation is determining the type of area it is, but not the Biome. For now, the map is not determined by other factors such as how much rain occurs in the area. The moisture map will most likely be needed to determine more Biomes and river generation in the future.

I wanted to simplify the map as much as possible for now so I could work on the edge cases between different types of tiles. I did not want it to just look like squares of color with nothing to break up the edges. You can see what the map currently looks like in the short video above. In the video you can see several of the different terrain types. Including 2 colors of water, sand, grass, and a tile I am currently using to represent a dense forest area. It is just a grass block for now. I decided to have 2 water colors to show the deeper water areas. I may use this for adding fishing to the game in the future. Where certain fish come from only deep water.

In the future I would like the map to have different heights in all the landmass areas. So, I need to figure out a way to randomly generate elevation change in the tiles, so they don’t look out of place. I only want a couple of levels of height, so the map does not look so flat. I will also need to figure out how I am going to handle river generation. Furthermore, I will need to work on adding trees, brush, and other objects like ores to the map. I am going to be looking at Poisson disk sampling to do those parts of the map generation.

Map Generation Next Steps:

The next steps of the map generation, is to figure out how to manage the transitions between the various regions. For instance, between the water and the beach there would need to be a tile in between that has both water and sand to break up the flat look. The same would need to happen for every area that has an edge between two terrain types.

I believe that the following cases would need to be checked for a tile that has two terrain types around it. The lighter tiles would be one terrain type and the darker tiles would be another. The X marks show tiles that we would not care about during each tile check.

Edge Cases Figure
The Figure showing edge cases of tiles

The center tile in each case is the one you are testing to see whether it has neighbors that are not of the same type. The different cases above would need to have art assets for each specific case. From what I have been able to find on the subject I need to have art asset tiles that would look like the image below. So, each case above matches up with the art asset below.

Edge Cases Art Figure
Shows the different art assets that would need to be made for each edge case.

Game Art Work:

This week I worked on coloring the main character sprite. I was trying to make the character look like a ranger. I wanted the outfit to be dark green with leather accents. So, for now I made the clothes a dark green with a brown leather belt. I used a lighter green to highlight some areas. Most likely I will take the black out of the forward-facing hair because it does not fit with the rest of the directions. It just looks funny to me. The main character in the game will probably start out with nothing or just very basic weapons. Currently the character movement is working but I need to create assets for weapons, and assets for different attack animations for the character.

Main Character Sprite Sheet Color
The Colored Main Character Sprite Sheet

I also worked on some water / grass edge tiles. I think it is a good start, but I may need to change them. Once I start working on the edge cases I may decide that these tiles look to detailed for what I am going for. I also started work on the water/ sand edge tiles, but I am not done with them yet. This week I am going to try and focus on finishing the edge tiles and getting all the basic tiles done so the map can start looking like something.

Water Edge Tiles So Far
Water Edge tiles done so far

Week 3 Game Engine Progress Read More »