Voyager (2D sandbox game) (Cancelled)

alloys could be a very important part of this game. Because since alloys need two materials, its inherently harder to get, and depending on how rare, very hard.

alloys will need to be combined in a high-temperature furnace

Yes smart… that too.

That being said i dont want it to get TOO complex yknow, cuz then the game is too hard lol. The perfect balance gives you exploration and reward in trying to do so.

Want to explore easier? you need better equipment

Yes, so don’t make the metals too hard to find. You want the player to be able to get to flying a rocket at most in half an hour

Really? Because there is a lot to explore on the ground too. The underside, biomes, loot is a main mechanic, id say in a focused playthru, they would learn to get a rocket (assuming they had the blueprint), maybe 1 hour or half an hour if they didnt care much about exploring the world first. Realistically, for a casual player going in blind, maybe 3 hours.

I think it should be like a mid game thing, you think “ah well the overworld is cool whats next”

Space
Whats next?
more space

btw i entirely forgot to mention theres a story to the game

True, true, you must make it a point to emphasise that one of the early game goals is gathering materials to build a rocket

I think just like minecraft, it should be open to letting players just do what they want at whatever pace.

For example, some people get to the nether instantly, whilst others spend more time finishing builds in the overworld, and only then do they find the end.

Whilst to some, 1 base and the end is the only goal, and get there in a few hours.

Its kinda like that here

BTW, the story kinda goes as follows:

Summary

At the beginning of the game there is a cutscene of sorts that reads:

“1,153 years ago, to now.”
This establishes a timeframe of events, but doesnt explain what year it actually is.

“Theres myth, and magic.”
There are various writings such as books scattered across loot chests, some of which being mythological, and others being diary entries/accounts that fall into an order. As for magic, we will get to that.

“The world, divided in two forces.”
These two forces being groups, one wearing masks of bats, with their headquarters underground, and one force above ground, wearing a different mask which hasnt been decided. The bats use magic, whilst the others and the player do not inherently, until the player takes over the bats, and manages to gain their magic power, making fighting the other force easier in some ways.

“You are the third.”
The player is the third force that comes to dismantle all other ones, and restore peace.

“Begin, voyager.”
The player is the “voyager”, and the following journey is the “voyage”.

Is the player… Batman?

That’d be what Starbound (another Terraria-Like) has

oh, it has been done before…

i definitely give up on this game, theres no point anymore, so im gonna make the paper thing i wrote on terrain generation public in the hopes to help other people

Summary

A paper on procedural generation in Voyager

My world generation system is sort of modular, and uses something i’ve called “passes”.

There are five types of passes in my logic:

  • Base
  • Additive
  • Subtractive
  • Detail
  • Utility

Preface

Before I continue explaining, I should explain that the world itself is a large tilemap object, which is 1024x1024 blocks in size. It however, uses the worldsize variable, which is set to 1024. This will be important for later.

Each one of these passes is contained inside of an event group, like this:

Types of events used

The most common and important events used in my generation system are:

  • Repeat X times
  • While X is true, do Y

And further more, the two most important variables used are worldgenx, and worldgeny.

Think of those variables as pointers for the terrain generation, like which block it is operating on. These are not screen coordinates either though, they’re the coordinates on the grid of the tilemap.

Passes

Time to explain each pass!

Base pass

The base pass is the most simple type of pass, and pretty much is only used at the beginning of the generation, aka beginning of the scene.

Block IDs & Ambush

This is a table of the ID of every block in the game, as viewed in Ambush.
Ambush is an internal development software created to aid in the process of developing Voyager.

Now, pay close attention to the block selected that is shown on the left panel of Ambush. Block ID 4 is shown as Stone.

This very simple pass makes the entire world made of stone.

How it works

Repeat worldsize times means the following actions will be repeated however many times that variable is, which as we defined earlier is 1024. Meaning, it will repeat this for the whole size of the world. Trigger once is used, else in my experiements, it runs the code ℵ¹⁰²⁴ times. Thats bad.

A lot of nesting is used in all of these events, however this base pass doesnt have something all other passes do. The first Repeat worldsize times event is supposed to be nested in a Trigger Once event, with its actions setting worldgeny to -1.

I’ll get back to why that is important later.

So in the image I included earlier of the base pass, the first event is worldgeny + 1, and then worldgenx being set to 0. What its doing is it’s going in rows, and setting each one to stone.

Theres another Repeat event nested inside of that one, with the same value of worldsize. Meaning it will do the width and the height of the world.

For each time that repeat event repeats once, it repeats 1024 times within itself, meaning 1,048,576 times in total.

Heres a helpful image to explain its exact process:

Notice how it starts outside the grid at the beginning (top left)? This is because once that 1024 finished in the sub repeat event, it needs to move down, which the parent of the child repeat event does. It makes sense to always make the initial values of both worldgenx and worldgeny to both be 0, but else, id need to make the code skip the first action to move the y down. Making worldgeny start as -1 is a quicker fix, as its quickly added to making it 0 anyway, you will see this fix across every other pass in the generation now.

Cave tunnel pass (subtractive type)

The caves in this game are the result of an important discovery I made in 2024 towards better cave generation and exploration in procedural world generation. Yes, i’ve been working towards this since 2024…and 2023, actually, likely since 2016, started by the hard work of my brother.

This is the first pass to use noise, and so let me show you a simple image of some noise.

This looks…boring, of course.
But the way I was originally creating caves, was I thought that I could only use the high or low ends of the noise map, like in this image:

The red areas being high, and the blue areas being low. Basically from light to dark, I thought I could only use those extremes.

Then I looked at it…What if I used neither, and I used everything but it? Using the mid ranges, instead of highs or lows.

See? the caves are just as interesting, but if you subtract the green from the base pass from earlier, you get connected, more interesting caves!

Implementation

This is the code for generating caves, and is the first pass to use noise.

My explanations will be less involved now that some basis of understanding is in place, and to save both of our time.

The thing this does different is it doesn’t set blocks each time worldgenx or worldgeny is moved. It has a sub event that checks whether or not a noise value at the variable pointers equals a 1. You may ask, how do we do the whole selecting the middle thing, not highs or lows? Thats where the * 4 comes in. Basically, it spreads the noise across 4 numbers, and it only picks 1, which isn’t 4, or 0, its a fine balance.

It sets the blocks not to 3, but instead to 0. If you look on our Block ID chart from earlier, 0 is actually air. We don’t remove blocks using the remove tile action in voyager, everything is a block, one just doesn’t have a texture.

Loot pass (detail)

This is the first detail pass, a pass that adds details to the world, that dont directly involve terrain.

I honestly don’t even know how this pass works, I did it first try and it ended up working kinda, and I never touched it again. Maybe you can understand it if you look at it long enough. (It spawns pots in caves). I would not recommend implementing…anything like this. Today, I would’ve picked a random position in the world, and checked if it’s air. If it is, use a while loop to move it down until it reaches the floor of a cave, then place the pot.

Ore passes

These passes are not very complicated, however use fine tuned parameters to create small blotches of ores in the world.

You will notice a reoccurring theme of using 3d noise to make things different from each other, almost like a second seed within the first seed.

I should mention the “loot” noise generator is the same as the world noise generator, it just has less noise so everything is more predictable.

Terrain pass (subtractive)

This pass is more interesting! I skipped a few passes that just use altered code for spawning ores, such as dirt in caves.

This pass cuts hills and mountains into everything, giving a surface to the world. The thing about this, is it doesn’t really do things the exact same way we said earlier.

It doesn’t change the x based on noise, it only changes the y based on noise.

It sets the starting position of worldgeny actually to somewhere in the top half of the world, plus a random noise value.

Then, it uses a while loop to delete all blocks above that position we just set.

Terrain (dirt) pass (additive)

the dirt pass works very similar, except it changes the position to be slightly higher. It does one more thing, it ever so slightly changes the 3d noise value to be SLIGHTLY different from the one used in the first terrain pass. Also, it works down, placing dirt until it finds stone.

Terrain (grass) pass (additive)

This is like the dirt pass, except it just creates a line of grass.

Second cave pass

Lastly, the cave pass is ran again with things that spawn inside caves excluded. This is because the terrain passes clog the cave openings.

Conclusion

Okay! thats it! if you have any questions, please ask, as i didn’t explain every single pass in the game. I hope I didn’t miss something you were most interested in like the Underside.

im not gonna make a big deal out of this like a lot of people do, if you wanna talk to me about it just message me about it privately because id rather not bring more attention to the game

well if you’re giving up on this game it was nice testing it out, son :saluting_face:

Important news

I really don’t wanna edge this like so many other people do when “cancelling” a game, but i’m still working on it technically.

This is because I changed so many things since the last build, and promised some things, that I don’t want to throw away the new additions or make it so people cant play Voyager anymore.

The goal is a minimum viable product with minor filler updates, and then thats it.

After that point, the game will release publicly under the Studio Qubix gd.games account. And who knows, within the development time, I might figure something out that will save the game.

Thank you for understanding

Reminder -
If you think you could be of help, you can join Studio Qubix by contacting hello@studioqubix.com
Submission rules at We Need Developers! Help out in our journey