It is hard to say and really depends on how you want to structure your project. I have done a few larger projects with Godot, and I have found that the biggest factor in deciding scene/object structure is performance and personally preference.
Here are my thoughts based on what I've read. Please keep in mind I am not a Godot expert in any means, and what works for me may not work for you or someone else.
For general terrain rendering, you probably do not want to use a separate scene for each individual block/tile/voxel, as that would require instancing hundreds to thousands of nodes. While a couple thousand nodes may work, depending on what you are doing, it can impact performance due to Godot having to initialize and update each node individually.
For a game like Minecraft, you probably want to dynamically generate your terrain using Voxels and break the world up into chunks. Each chunk would represent a small portion of the game world, like 16x16x16 individual voxels. Then the chunk would handling updating and rendering the terrain.
There the Godot_Voxel module for generating several different types of Voxel terrains. I have also written a tutorial on generating Voxel terrain in Godot using the SurfaceTool. There are also a lot of interesting development logs/posts on social media if you search "Godot Voxel Terrain" that might be helpful.
For a game like DwarfFortress, you probably want to use a TileMap node for the world. If you want to have background/foreground tiles, then you will likely need to use multiple TileMap nodes, where each of the TIleMap nodes have different Z-Index values so they are drawn on different layers relative to the scene. Unfortunately, I do now of any references for this type of world creation right off...
Here are some references for 2D that might be helpful:
For handling things like fire, water, sand, etc, that is where it gets a little bit tricky and honestly I'm not sure what the best way to handle this would be.
For voxel terrain, I would probably generate an Area node and have voxels like fire/water/etc generate their collision shapes into the Area node. Then I would probably do a check if _physics_process
that goes through every node within the Area, checks which voxel they at by converting form world-space to voxel-space, and then call a function that handles what happens when the in a certain voxel. It is not ideal and I'm not sure how feasible it would be, but that is probably the route I would take initially.
For 2D terrain, I'm not sure. I do not really do much 2D Godot development so I have little experience. For one of my jam games, Paralysis Platformer, I used a TileMap for the static terrain and instanced scenes for the Water, Lava, enemy spawner, and enemies in the game. That said, the levels in my jam game are fairly small and the terrain cannot be modified, so I'm not sure it would work when trying to make a game like Dwarf Fortress.
Making a game like Minecraft, Dwarf Fortress, or RimWorld is complicated and I'm sure the design structure of all those games changed as development went along. None of those games were made quickly and I'm sure the initial prototype/plan for the game and the finished result look very different.
I think the best advice I can give is to keep making games and see what works best for you. One of the biggest factors when trying to make bigger projects, especially if you are not used to it, is to not get discouraged! Game development is hard and takes time, experience, and lots of trial and error!
Hopefully this helps a bit :smile:
(Side note: Welcome to the forums!)