Yeah, it actually took a lot less time than you'd think to get the procedural gen part working. Same principles as something like minecraft, just at a simpler level.
Initial version had two scales of noise that I sampled for height and moisture to determine water/dirt/grass placement. And then I just spawned random foliage per square based on a different kind of noise. That got me to 90% of what you see in this version. I wasn't happy though with fully random foliage though and so for the end result I got a little fancier and have independent noise channels for each foliage type to get the "density" of foliage at each spot, and then roll a random foliage based on the weighted random list generated based on that. That got pretty good clumping and mixing of various tree types and such, so thats where I left it.
Then, I just save out the changes that the player makes to the world so that we don't respawn trees they cut down or re-grow dirt that was planted on, etc.