(Note to self: Putting the word Infinite in the subject of a post acts like a buglight for responses... :) )
Nice job!
(My posts tend to be long winded and rambling, and this is no exception. I'm just trying to be as helpful as I can given my own experience.)
It looks like you are thinking more in terms of a top-down game with fleets and armies. Risk and Diplomacy come to mind.
It also looks like you are trying to provide an infinite variety of game boards. One game I know of that does this is called Slay:
http://www.windowsgames.co.uk/slay.htmlIt's not Blitz and it's a hex-based game, so no real terrain mapping, but it's an awesome game, partly because of the enormous variety of boards. The variety is managed with randomizer seed numbers acting as board numbers; i.e. board number 1, 2, 3, etc. Presumably these are the actual seeds used in the randomizer: seedrnd(boardseed) instead of seedrnd(millisecs()).
I think Slay has an editor as well; in your game you might instead want to use a random button and/or a next button to traverse the seeds, and a bookmarking system to save the favorites boards. That would be cool.
Tiling:
I wanted to put my two cents in regarding the tiling issue. With Perlin noise I know of two general approaches: Pre- and Post- generation.
Pre-generation is done in each of the original Perlin sub-arrays by setting the right and bottom edges equal to the opposide side value. This (supposedly) causes the resulting noise map to tile seamlessly.
Post-generation is necessary if you are making modifications to the Perlin noise map after generation that might involve the edges (and would thus ruin the tiling). The issue is surprisingly weird and difficult, but kind of challenging and fun if you have the time and the need.
Below is my silly treatise on this issue, which is what happened to me when I tried it. What you have already looks good enough for your purposes, but someone here may find this amusing or even interesting:
At first you think, "Well, I'll just take the right 25% or so and gradually adjust it toward the opposite edge value". That is, average the existing height with the opposite edge and weight that average with the distance from the edge.
Result; stretched-looking and not good.
Then you think, "Ok, instead I'll average the current value not with the opposite edge but with the corresponding pixel at the same distance from the opposite side." (Let's call this the reference point)
The result is much better but you'll notice a ridge (or valley) along the seam, which becomes like a mirror image as you get closer to the edge.
Then you realize, "Aha! I need to invert that value vertically so the slopes approach the edge from opposite vertical directions! I'll average the current value not with the reference point itself, but with the inverse of that value (up vs. down). But what is the inverse? It must be the value that is the same vertical distance from the edge pixel, but in the opposite vertical direction. But wait! Oh no! That could easily go beyond the height range of the map. And no, you can't just clamp it, Clampett. You'll have weird plateaus all around the edges of your map.
You have to take not just the same vertical distance from the edge point, but rather the same vertical _proportion_ of the range from the height of the edge pixel to the maximum height (or minimum height, depending which way you are going). Then you say "Ouch my head hurts!"
Here is some code that does this for my terrain editor (WIP). It only does the right side, so you'd have to adapt it for the bottom. It is buggy and confusing and I don't even remember how it works exactly, but here it is:
For terx#=3.0*(tersize/4.0) To tersize-1
; fltersize#=tersize
amount#=(terx-3.0*(tersize/4.0))/((tersize-1)-3.0*(tersize/4.0))
If terx=100 Then huh#=amount
amount=amount*amount
For terz#=0 To tersize-1
;If amount=0 Then Stop
;amount=1.0
clchange#=cloudlayer(terx,terz,1)
clto#=cloudlayer(tersize-terx,terz,1)
clinvert#=1-(clchange/clto)*(1-clto)
;cloudlayer(terx,terz,1)=(1.0-amount)*cloudlayer(terx,terz,1)+amount*(cloudlayer(tersize-terx,terz,1))
cloudlayer(terx,terz,1)=(1.0-amount)*cloudlayer(terx,terz,1)+amount*(cloudlayer(0,terz,1))
; cloudlayer(terx,terz,1)=cloudlayer(terx,terz,1)*(1-amount)+amount*clinvert
ModifyTerrain(terrain,terx,terz,cloudlayer(terx,terz,1))
Next
; Text(600,0,"amount="+amount+" (1.0-amount)="+(1.0-amount))
; Flip
progress#=100*(terx-3*tersize/4)/(tersize-3*tersize/4)
showprogress(progress,"Wrapping the borders around...")
Next
I hope this was useful for someone. Good luck with the project Ryan!