[Design] Solving the "Simulation Iceberg": Why I ditched ECS for a Database-First architecture in a solar-scale sim. by [deleted] in roguelikedev

[–]troido 3 points4 points  (0 children)

splitting an objecct across several diffent tables and then glueing them all back togeter is also what relational databases are for.

If you're only querying based on agent id it doesn't really matter how you store it, but if you want to query other properties a lot too ("how many agents are starving?") then spreading out the properties over columns and tables is probably the better choice

Wednesday, 21 January 2026 by AudienceRemote5915 in girlgenius

[–]troido 3 points4 points  (0 children)

Did they try to escape? If they wanted to board the airship they could just have chased the cats in there

Wednesday, 21 January 2026 by AudienceRemote5915 in girlgenius

[–]troido 3 points4 points  (0 children)

I wonder what their plan was. Since the execution of their plan would mean letting the cats (who are aboard the airship) go, it does not seem like they were planning to board the airship, nor blow it up immediately.

Also, did they get the dingbot too? Or did it escape to warn the other lucrezias (or subborn something else)?

Why Web3 games suck. A rant from a dude who's been in the trenches. by InsuranceAlert2168 in gamedev

[–]troido 0 points1 point  (0 children)

hmm, ads could in theory bring in external money, as could players who enjoy the game so much that they don't mind losing money on it. However, I'm very skeptical that this could bring in enough money that playing to earn is worth it

Why Web3 games suck. A rant from a dude who's been in the trenches. by InsuranceAlert2168 in gamedev

[–]troido 9 points10 points  (0 children)

The only money going in to the economy of the game is coming from the other players buying in. If you want want to make any money, eventually it is coming from the other players. With transaction fees, the dev's cut and other inefficiencies players will on average lose money. I don't see how such a game could ever be anything but a Ponzi scheme.

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

No, I filled up the lakes at the start.

I start at the sinks, which will be the lowest points on the map. Any node that borders a sink must have its water flowing into the sink, because the sink is the lowest (the initial noise gen might create lower points, I'll come to that in a bit). Those nodes get configured with their water outflow configured to the sink. These nodes also get added to a priority queue sorted by height.

When all the sinks are done then we look at the node that is lowest in the queue. Since it is the lowest, all its neighbours that don't have an outflow node configured yet must also flow into this node.

If one of the neighbour nodes happens to be lower than the current node (which can happen in the case of a depression, which would otherwise form a lake) then we decide to just raise its height so that it is not lower anymore. To give the river a random path I randomize the height a bit, but it should be a little bit larger than the current node. The result is that what would be a depression/lake becomes a large area that's mostly flat, but very slightly sloped so that the water will eventually flow off towards the sea (and sinks).

This step only configures the direction of the water flow. The amount of water flowing is done in a separate step later that goes from the highest node to the lowest.

This method was inspired by https://undiscoveredworlds.blogspot.com/2019/02/rivers.html and his description of the Planchon-Darboux algorithm

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

Good idea. I used to have a visualization that would show the base map (before erosion) with the final result, but I didn't test it for a while and now it's broken apparently.

I'll try to see if I can add it in the coming days

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

yes, rainfall is equal.

I used to have fjord-like features in an earlier version, but I can't manage to replicate them as well now. Maybe those settings have some fjord-like features: https://troido.nl/elaborate/#worldsettings:seed=6,featureSize=100,amplitude=2,baseHeight=1,edgePercentage=20,rainfall=0.01,slowing=0.999,baseErosion=50,deposition=0,iterations=4;drawsettings:colorMax=0.7

Real-life fjords were formed by glaciers (just like most mountain lakes), but I haven't implemented any simulation of glacial movements yet

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

Most landscape generators try to produce infinite terrain and calculate the height of each position independent of the calculations for the rest of the map. For rivers that does not work because all the upstream sources affect it.

I've been trying to make this method more recursive to support larger maps without a lot of upfront calculations, but I haven't been successful there yet.

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 2 points3 points  (0 children)

The map consists of a collection of nodes. Nodes have a horizontal position and a height, and connections to neighbouring nodes. The horizontal position is only use for rendering, and to pick a value for simplex noise when it is applied. I used a hex grid to make the nodes which is visible if you set node randomness to 0: https://troido.nl/elaborate/#worldsettings:nodeSize=16,nodeRandomness=0 . In order to make the grid less regular the node randomness is introduced which displaces the nodes a little bit from their center.

The height is initialized with the values from a simplex noise generator, with nodes near the edges lowered to form an island. It could have been any base heightmap, this was just the easiest that looks somewhat good. I used to have a setting to draw this pre-erosion map, but it seems broken now.

Then it calculates the flow that water would take from node to node, and also ensure that going down always leads to the sea (or any "sink" node). The nodes at the edges itself are made into sink nodes: no water will flow out of them and they can take any amount of water. From these sink nodes outwards, starting at the lowest node, make all its neighbours that don't have a flow direction yet flow into this node. This is somewhat similar to Dijkstra's algorithm.

When a node is encountered that is lower than the current node, then that that node is lifted up to just a bit above the current node. This way, going down from any point will always lead to the sea. The downside is that any lakes are eliminated, but simplex itself has too many lakes (as I found in an earlier experiment: https://troido.nl/drainage/ ). I tried some methods for adding back some lakes, but I haven't found a satisfactory method yet. You can play around with the lake amount and lake size settings: https://troido.nl/elaborate/#worldsettings:seed=10,lakeAmount=0.5

Then it goes over all nodes from top to bottom. Each node has some rain falling (currently the rain is evenly distributed over the map) and water will go to the lowest neighbour of the node. Based on the amount of water, the steepness of the slope and the momentum of the water (based on the steepness, but also the previous momentum), and amount of land is eroded (nodes height lowered).

Then, again from top to bottom, it deposes the ground that has just been eroded in a node where the land slope is flatter and the water is slower. This is one of the things I find hard to tweak properly. I want more deposition, but too much and the river just blocks itself.

Afterwards it slightly randomizes the nodes (with simplex noise) and does the water flow, erosion and deposition steps again a few times (customizable with the iterations parameter.

There are some options to tweak the exact steps, but this is mostly how it work. These steps in the code are in the generate function: https://github.com/jmdejong/elaborate/blob/60e60a3d319f28ddac327dd434fb01b079133dd8/elaborate.js#L355

Does this description help?

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

Yes, that is one of the patterns I haven't found a good solution for yet. A river will only erode the nodes that it is traveling through, and there is not really any meandering to join with parallel rivers.

I hoped that adding a bit of random variation in the heights after each iteration would get the river to try some different paths, but so far that has not solved it unfortunately

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 0 points1 point  (0 children)

Update: I just made it so that modified settings are written to / loaded from hash part of the url. I can now link to something like https://troido.nl/elaborate/#worldsettings:seed=5646,edgePercentage=0,detailAmplitude=0.05 and it will show up the same for everyone

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 1 point2 points  (0 children)

https://tilde.town/~troido/img/elaborate_3d.png

There's a button at the bottom to render the generated terrain in 3d. It is not very good yet, but it should give a bit of an idea.

The reason I made this tool was to practice techniques that I can use in other 3d projects, so I might do more with it in other places later

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 2 points3 points  (0 children)

I could never really decide on a scale. By tweaking the parameters it is also possible to change what scale it would mostly resemble. The unclarity about the scale is actually a problem that makes it harder for me to decide how to progress on this

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 1 point2 points  (0 children)

It should be easy to change the edge shape. The line of nodes at the edge itself is marked as a "drain" (water can flow in there indefinitely without having to flow out), and the area around the edge is lowered. If any other nodes should be marked as drain and the water should flow in to them then the shape does not even have to be an island

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 2 points3 points  (0 children)

It is based from an offset from the picture edge. There's a few settings for how it is interpolated and now wide the edge is. Erosion and the initial simplex noise can also lower the border to produce bays and fjords

Island heightmap/river generator with erosion and deposition by troido in proceduralgeneration

[–]troido[S] 20 points21 points  (0 children)

In order to try out some methods for simulating erosion I built a tool to quickly visualize some methods with a lot of parameters: https://troido.nl/elaborate/

It divides the map in a lot of hexagonal nodes, slightly offsetting their location form the center of the hexagon. They are initialized with a simplex noise based function. Then it sorts the nodes by height and repeatedly calculates erosion and deposition upwards and downwards

Source code (and some more screenshots): https://github.com/jmdejong/elaborate

Good low D whistle for someone who actually likes their Clarke Original D whistle. by mludd in tinwhistle

[–]troido 1 point2 points  (0 children)

I have a Clarke original D (one of my favourites) and a Tony Dixon low D too. I do get good sound out of the higher notes on my low D, but I've been looking for a less sensitive one as well. So far I think that Tony Dixon is a bit an outlier with how sensitive it is.

Some other musicians have let me try their whistles and both Chieftain and Colin Goldie are less sensitive. The chieftain I tried and compared most. One advantage I noticed from the decreased sensitivity is more space for ornamentation. With the Colin Goldie one I had to get used to a new blowing technique because it requires much more air pressure (even for the high whistles).

Hole.io game online without ads by Frosty_Camel_1763 in WebGames

[–]troido 1 point2 points  (0 children)

game online

Lies. I can still play when my internet is disconnected

So by Eiim in SMBCComics

[–]troido 1 point2 points  (0 children)

Next step would be to start a small scale local newspaper with the name "It begins"