What I'm Up To

That looks pretty cool! I just fired it up, and it does as advertised, even with a save from a scenario. Merging it in sounds like a good idea.

I'm also becoming very aware as I add stuff that the Game.cs that goes with C7Game.tscn will soon be bursting at the seams. I'm thinking I want to start creating custom nodes, e.g. the status area at the right could probably be one, and that could help with it. Even the map probably could be one. But I'm also kind of waiting to hear from WildWeazel; right now C7Game/Game.cs is pretty much all the game things whatsoever (logic and UI), and we'll want that split out eventually. WildWeazel probably remembers the plan for that better than I do, and I don't want to try to figure it out myself while tired. That usually only results in code with errors.
 
I just merged much of the TempTiles display code (but not the file dialog or actual map drawing yet) into C7Game, and merged it into my local Development shortly after you pushed. It actually doesn't seem to conflict, but my Internet has been bouncing today and suddenly git can't find github.com, but hopefully I'll get it pushed soon.

The downside is that your new UI elements also zoom and scroll, but yeah breaking the code up and zooming only the map should go hand-in-hand. My UI bar is locked to the window. I don't offhand recall how I did that, but encapsulating the graphical UI elements that way should work, too. I think. If not, then just stacked scenes.

Edit: Ok, pushed.
Edit 2: Heh, I love git (screenshot). I got worried when we both committed to the same file in the same time frame, but there were no merge issues at all.
 

Attachments

  • Screen Shot 2021-11-01 at 9.05.51 PM.png
    Screen Shot 2021-11-01 at 9.05.51 PM.png
    40.5 KB · Views: 22
Last edited:
I just fired it up, and it does as advertised, even with a save from a scenario.

Oh yeah! It's supposed to successfully display custom scenario terrain graphics, but I don't think I've tested it. Did you have custom terrain? Did it display correctly?

Edit: Hmm. I just tried starting a game with Snoopy's terrain mod (shipped with Steam Complete), and it seems to be showing the default terrain. Oh well, I'll have to look into that.

I just noticed that the tiles don't seem to be stitching together smoothly. It's like tiny pinpricks in the terrain, and I can see it better on Windows than Mac for some reason, but it's definitely the isotile pattern the pinpricks are laid out in. But it's subtle, not like a straight dotted line.

My first thought was maybe it's because I'm pulling a random grass all-grass or all-ocean tile out of several dozen choices, but no some pretty specific terrain combinations seem to have it, too. Something else to look into...maybe it has to do with scaling.

Edit 2: Weird. I went back to before I started mucking with TempTiles, and I don't see the spots in either TempTiles or the random terrain scene. And now that I look closely with a magnifying glass, it *is* a steady dotted line. The texture just plays with my eyes.

Edit 3: Meh, I'll come back to it later. It's not a big deal short-term. I'll just remember it started with today's changes, even if I can't figure out what graphics-wise might have changed.
 
Last edited:
See screenshots. Using the mod-specified art appears to be doable with little extra effort. (Famous last words.)

For these I just hard-coded the mod path to be sure it displayed as I hoped. I can see where the mod path is in the SAV file, and I have a boolean to indicate if there is a custom BIC. The thing I'm not fully confident of is the relative pathing. Sn00py's terrain is in a bix under civ3PTW/Scenarios/<folder>/ and has a path starting with ..\civ3PTW\...

Oh I think I get it. I think we assume all civ content are relative paths from <install>/Scenarios. At least that would be sort-of consistent with how the media path sequence works.

Edit: New theory: The path is relative from the Conquests folder (for Conquests/Complete SAV files.) Based on creating a SAV with one of the Conquests. *Or* the path is relative from the original install folder but runs the same media selector path gauntlet (which would be consistent with the media references), and/or the '..\' was a really odd coincidence as it starts 3 characters before the path of the scenario file.

Ugh, if the starting byte of the path changes from SAV to SAV this may be non-trivial.
 

Attachments

  • Screen Shot 2021-11-01 at 10.54.49 PM.png
    Screen Shot 2021-11-01 at 10.54.49 PM.png
    1.7 MB · Views: 25
  • Screen Shot 2021-11-01 at 11.02.53 PM.png
    Screen Shot 2021-11-01 at 11.02.53 PM.png
    1.6 MB · Views: 25
Last edited:
That looks pretty gnarly! I can confirm that the zooming and panning is working here as well, after giving Godot a reboot.

And I believe what you wrote it correct - the relative paths are from the Scenarios folder. I've seen mods in Conquests use .. to go up and then back down into PTW to use e.g. the dinosaurs that shipped with PTW. Although I've also seen mods use .. for reasons that appear unnecessary to me; whether they really are or not, I am not sure.

It occurred to me that the Open functionality you have could be wired up to the "Load Game" function on the main menu. I used it on one of my SAVs, and it worked just fine. Of course then we'd still have the problem of not having a map to display for New Game. I wonder if we should generate a random map to use as a Godot resource and default New Game/Quick Start map until we have map generation capabilities? Edit: I keep forgetting that I can just play the game scene and skip the menu scene. Which sort of makes it less important what New Game/Quick Start is wired to, but I suppose the "what's the default map going to be?" question would still exist.
 
Thanks!

It occurred to me that the Open functionality you have could be wired up to the "Load Game" function on the main menu. I used it on one of my SAVs, and it worked just fine. Of course then we'd still have the problem of not having a map to display for New Game. I wonder if we should generate a random map to use as a Godot resource and default New Game/Quick Start map until we have map generation capabilities?

I intended to do that, but different scenes/objects. So the file dialog would be in the main menu scene. It's probably not too difficult, but it's going to take a little bit of thinking to figure out if I'm passing just a string path to the game scene or what. In the real game we'll want to catch loading exceptions at the main menu screen I think, or wherever the load dialog is launched. Then again, we're handling absolutely no exceptions at all yet, and it's fun as hell to make it look pretty and do things!

I also figured on just having the current "random map" as default for a "new game". It might be a fun diversion to whip up something that might make blobs instead of each-square-is-random.
 
I just saw what you meant about pin-pricks on the map. I suspect it is a zoom artifact; they don't appear at default zoom. But I also hadn't seen them in the tile test. Still, I agree it's a low priority, can-be-looked-at-later thing.
 
Good point re: figuring out how to pass things to the game scene. My first thought was I agree that exceptions should be caught at the main menu, but as I recall, Civ often catches them on the game scene. E.g. if I take the SOE scenario, rename a unit folder, and load it, it'll take me in game and be loading up the progress bar and then realize it can't find a file, and give an error message there (and then probably throw me back to the menu?). Although I think I remember getting error messages from the menu area at times, too. Maybe it's the difference between the BIQ/SAV content being corrupt (menu) and artwork missing (game).

In other words, I'm not overly concerned about the decision at this point.

My only suggestion for the current random map is we should probably make it larger, so it isn't all visible at once at 1024x768. Thought I haven't dived in to the map code yet, while focusing on adding more pretty artwork.

And it really is fun to make things pretty and to make them do things! It probably says a lot about human nature that one of the first things I got working the way it's supposed to work is a blinking light!
 
The map code in the current C7Game.cs is probably not what you want to look at. Look at how TempTiles.cs uses LegacyMap.

C7Game.cs's code was the proof of concept, and LegacyMap is my first attempt at trying to both simplify and future-proof the map representation, both visually and logically. I tried to make inerfaces to not put blockers in to experimenting heavily with the logical structure of a map tile. Heck, I could even imagine doing away with tiles as individual objects, but that's a bit "out there". We'll always have coordinates, of course.

Also, the parts that read map/BIC/SAV data will change from having to search for the section offset and then getting an offset from that. The QueryCiv3 project will have convenience getters for all that info, so you'll do something like "int foo = Sav.Tiles[0].BaseTerrain" or similar. And sooner rather than later I think.
 
I am now properly extracting the mod path from the SAV file. Oddly it is relative from Conquests/ for the stuff I've seen so far, but the PTW extras content (Winter terrain, European Terrain) is in Civ3PTW/Extras (at least on my Steam version) but the relative mod paths are looking for it in Civ3PTW/Scenarios . :p

That's merged into TempTiles (and QueryCiv3) now.

Civ3 displays the graphics fine while the mod path in the SAV is just wrong. I guess I'll just have to add Civ3PTW/Extras in as a search path.

Edit: Added and pushed the extras folder search. Interestingly C3C capitalizes Civ3PTW in the in-SAV path, but it's uncapitalized civ3PTW on the filesystem. I may need to do something about that to make it work on Mac & Linux someday. Not sure how many people besides me are copying Win file trees to Mac/Linux just for development, though. If they're playing custom mods on Mac/Linux, then they've probably already figured out how to work around the case sensitivity problem. Dunno.

Edit 2: Why is it 3am?
 
Last edited:
Almost 6 hours of sleep later... I think there is still work to do around custom Bics.

I found a reference to a bic-specific media path, but I noticed that using a custom bic doesn't necessarily include custom rules. I'm pretty sure I've heard that before, but it's just now hitting me that it's going to cause issues with how I currently have things coded. It's not huge changes needed, just to understand where the flag is indicating whether it has a custom ruleset so I know to use the default biq for convenience getters.

Also, I found yet another media path that actually specifies the extras folder. That's good, but it's relative to the bic file which is really weird as there is no straightforward "rePath1" + "relPath2" to combine that I can currently see.

Maybe it's just relative to the local Scenarios folder?

Hell, maybe I'll just search the whole damn dir tree for matching folder names. (Not really.)

Not sure I'll start on that, though. I might start on getting the "view real map" in the main project working.
 
I changed TempTiles to mostly use the convenience getters.

There are both more and less convenience getters already implemented than I remember. If I need something, it's usually not there yet. But I seem to have a LOT of CITY and LEAD getters for some reason.


Thinking crazy thoughts again, I'm hatching an idea to combine a lot of the stuff I've done and wanted to do in the C7 project. What if there is the regular C7 game menu, but there are also one or two more menus or scene trees.

One would be "CivAssist Mode". We're reading maps and data and displaying them; were' not very far from our own CivAssist (for C3C games).

And then mod tools. I'm still thinking of "Civ Parade" where you would use Lua script to animate unit(s) freeform. I saw a somewhat recent thread asking how to get individual frames of FLCs. I can already do that, and it's trivial do display in Godot.

On the one hand, why add civ-helper features to C7? On the other hand, we can get the C7 project in front of a lot more people if it's both a helper program and a new game in progress.

*If* I do anything like this, for now I'll just make a separate branch.

---

Meanwhile, I want some overlay terrain, but I have little idea where to start. Unlike base terrain, the graphics are very non-uniform. Maybe I'll start dumb and just hard-code one mountain for all mountains, etc..
 
Last edited:
Hmm, that's an interesting idea. The two thoughts that jump to the front of my mind are, "that would be a distraction from progressing on the game" and "that would be a way to make it more immediately useful to a wider audience". Assuming I'm interpreting the idea as you meant it, in both cases.

Which, in terms of my understanding, is the CivAssist Mode would be used for the existing Conquests, as last updated to 1.22 in 2004, not for assisting with any future C7 games (well, at least, not in 2021, maybe in the future). And displaying individual FLC frames would be a purpose-specific utility.

I suppose it comes down to if it's an easy thing to do and there's motivation for it, and a fairly certain audience (e.g. the type of "I'd really like this CAII thing but CAII doesn't work for me on Win10" message I've received occasionally over the years), why not? But we don't want to spend so much time on it that a year from now we look at the project and find, "it's a nice replacement for 2/3 of the functionality of CAII, and works well on Windows 10, but there's no gameplay yet." At least, not with our current goals. If we've got some gameplay but it's not ready for prime time, but there's also a couple dozen people using it because it replaces the most critical 25% of CAII, that could be a net benefit.

-----------

I never did fully figure out which overlay goes where. I got kinda close for mountains, but there's about 10% of the time that the game uses a different one than my editor. With forests and jungles, I gave up after spending far too much time on that and realizing it really wasn't that important in an editor, compared to all the other things that could be worked on.

If the goal is just a proof of concept for layered tile maps or drawing overlays, I'd probably go with mines or something that will be consistent tile to tile.

But if you prefer mountain, here's my code from the editor for figuring out which mountain to draw. It always chooses the most "logical" one based on which sides of the mountains border other mountains, and thus should have elevated terrain; as mentioned, sometimes Civ doesn't choose the most "logical" one, but most of the time it does.

It returns an index into the art file, and as you can see, evaluates all the directly neighboring tiles. The null checks are in case the tile being evaluated is at the edge of a map.

Code:
    private int getMountainIndex(int xIndex, int yIndex) {
        //TODO: This can probably be combined with getIrrigationIndex with the help of functional operations
        int mtnIndex = 0;
        //check for nulls first.
        //This would be nice and easy with Groovy's nullsafe dot operator
        //Unfortunately Civ seems to only use this as an occasionally way to do things
        //At first it appeared Snow Mtns didn't count hills as neighbors, but that didn't solve it either
        //Annoying Mountains.biq illustrates the madness of deciding which mtn is which
        TILE center = getTile(xIndex, yIndex);
        TILE northEast = center.neighbor(MapDirection.NORTHEAST);
        TILE southEast = center.neighbor(MapDirection.SOUTHEAST);
        TILE southWest = center.neighbor(MapDirection.SOUTHWEST);
        TILE northWest = center.neighbor(MapDirection.NORTHWEST);
        if (northEast == null)
            ;
        else if(northEast.getRealTerrain() == TERR.MOUNTAIN || northEast.getRealTerrain() == TERR.HILLS  || northEast.getRealTerrain() == TERR.VOLCANO)
            mtnIndex+=2;     //Northeast
        if (southWest == null)
            ;
        else if(southWest.getRealTerrain() == TERR.MOUNTAIN || southWest.getRealTerrain() == TERR.HILLS || southWest.getRealTerrain() == TERR.VOLCANO)
            mtnIndex+=4;     //Southwest
        if (southEast == null)
            ;
        else if(southEast.getRealTerrain() == TERR.MOUNTAIN || southEast.getRealTerrain() == TERR.HILLS || southEast.getRealTerrain() == TERR.VOLCANO)
            mtnIndex+=8;
        if (northWest == null)
            ;
        else if(northWest.getRealTerrain() == TERR.MOUNTAIN || northWest.getRealTerrain() == TERR.HILLS || northWest.getRealTerrain() == TERR.VOLCANO)
            mtnIndex++;
        return mtnIndex;
    }

This integer is then used in my drawHillyTerrain method. I do not suggest following the same approach of bitmapping the graphics now that we have nodes and an actual game engine, just including it for context. Although it does remind us that the hills and mountains both have greater height than the base terrain, so that has to be accounted for.

Code:
private void drawHillyTerrain(TILE tile, int defaultXPosition, int defaultYPosition, Graphics canvas) {
        final int HILLS_Y_POS = defaultYPosition - 12;
        final int MOUNTAINS_Y_POS = defaultYPosition - 24;
    
        if (tile.getRealTerrain() == TERR.MOUNTAIN || tile.getRealTerrain() == TERR.HILLS || tile.getRealTerrain() == TERR.VOLCANO) {
            int graphicsIndex = getMountainIndex(tile.xPos, tile.yPos);   // THIS LINE CALLS THE METHOD QUOTED ABOVE.  <---------------------- LOOK HERE
            int forestJungleCheck = useForestOrJungleHillVariant(tile);

            if (tile.getRealTerrain() == TERR.HILLS) {
                if (tile.isLandmark()) {
                    canvas.drawImage(assets.lmHillGraphics[graphicsIndex], defaultXPosition, HILLS_Y_POS, null);
                }
                else {
                    if (forestJungleCheck == TERR.FOREST) {
                        canvas.drawImage(assets.forestHillGraphics[graphicsIndex], defaultXPosition, HILLS_Y_POS, null);
                    }
                    else if (forestJungleCheck == TERR.JUNGLE) {
                        canvas.drawImage(assets.jungleHillGraphics[graphicsIndex], defaultXPosition, HILLS_Y_POS, null);
                    }
                    else {
                        canvas.drawImage(assets.hillGraphics[graphicsIndex], defaultXPosition, HILLS_Y_POS, null);
                    }
                }
            }

As for what e.g. forestHillGraphics looks like, the PCX is chopped up into an array with this method:

Code:
    private BufferedImage[] importGraphics(String fileName, int xDim, int yDim, int heightEach, int heightOffset)
    {

        String mtnName = null;
        try{
            mtnName = utils.findFile(fileName, "Art" + fileSlash + "Terrain" + fileSlash, biq);
        }
        catch(FileNotFoundException e){
            logger.error("Could not find " + fileName + "; civInstallDir = " + settings.civInstallDir, e);
            JOptionPane.showMessageDialog(null, "Could not find " + fileName + ".  The civ install dir (" + settings.civInstallDir + ") being incorrect may cause this problem.  This can be changed by clicking on the Settings button.\nError: " + e.getMessage());
            return null;
        }
        Civ3PCXFilter mtns = new Civ3PCXFilter(mtnName);
        mtns.readFile();
        mtns.parse();
        mtns.createBufferedImage();
        BufferedImage[]mountainGraphics = new BufferedImage[xDim * yDim];
        //j is rows of PCX files
        for (int j = 0; j < 4; j++)
        {
            //k is columns of PCX files
            for (int k = 0; k < 4; k++)
            {
                mountainGraphics[j*4 + k] = mtns.getBufferedImage().getSubimage(k*128, j*heightEach + heightOffset, 128, heightEach);
            }
        }
        return mountainGraphics;
    }

So for example (the unused last parameter defaulting to zero)

Code:
BufferedImage[]jungleHillGraphics = importGraphics("hill jungle.pcx", 4, 4, 72);

I haven't looked at the map code in enough detail to know how you've been dividing up those graphics yet, but since that's working you probably already have a good solution in that area.
 
Last edited:
"that would be a distraction from progressing on the game"

Well, I didn't actually come back here to work on C7. I was motivated to get my SAV file reader more feature complete for an online upload-and-view-stats tool. I was going to extend my Go-based one but decided I may as well extend the C# version instead as I knew I'd want to eventually, anyway.

WildWeazel popping in and getting everyone interested is what distracted me from what I was doing otherwise and wanting to get C7 in a state where someone else can download it and want to say "neat" and maybe want to follow progress.

Now whether my making a CivAssist mode distracts others who would otherwise be focused on C7 is a different question I honestly hadn't considered.

"that would be a way to make it more immediately useful to a wider audience"

Yeah, like I said, I'm basically scratching my own itch, but if I'm doing that anyway, putting that functionality in C7 might draw more interest to C7. It could potentially put C7 in front of more eyeballs.

On the other hand, it could also confuse things I guess if people start thinking of C7 as only a helper tool and just ignore the game side of it.

Which, in terms of my understanding, is the CivAssist Mode would be used for the existing Conquests, as last updated to 1.22 in 2004

Right. I mean I figure that functionality will either be built into C7 or at least scriptable, but the segregated feature would be for the old game in particular.
 
Speaking of distractions, last night for my own amusement I tried my hand at map generation. Not as a serious study for a future well-balanced C7 game, but just to make semi-plausible blobs of grass and plains in an otherwise all-coastal-waters instead of the messy (but properly-matched!) jumble of tiles in C7 now.

Yeah, I want to get the load sav working, but we need a generated "new game" stand-in, too. And I'm hesitant to make incremental progress in the main C7 game because at least 3 of us are touching it, and I'm trying to start adding in overlay terrain, so I'm afraid it could make a big knot to untie if I just stuff in changes now. (But I'll totally add stuff to TempTiles as the model for how it will go into C7Game.)

I also want to note that it's probably important to keep the display logic and the game mechanic logic of a tile separate for now, because a future native logical tile and a future native visual tile are probably going to be very different than what we're doing now.

Oh, I got distracted from my distraction. So, world generation... I tried making an 80x80 grid–which is wrong because of Civ3's checkerboard coordinate system, but I was going to sample from it–and seeding 2 plains tiles and 2 grassland tiles, and the rest of the values -1. I then looped over all the tiles, and when it found a land tile, it would loop the surrounding 9 tiles. If they were -1, there was a 10% chance that tile would be a coastal tile. Else there was a 90% chance it would be the same as the center tile, and otherwise it would change from grass to plains or vice versa. After either the land reached an edge or all land tiles were surrounded by coast or land, the rest of the -1s would be changed to coast.

That...didn't go as I imagined. It heavily favored the direction of the loop (S and E) because new land tiles in those directions got expanded on the same loop. So the southern half looked more or less like what we have now, but with a little more clumping of grass or plains, and then there was a Northern coast and the top 20% or so was coastal waters with a rather smoothish horizontal coastline. (Attached; it always looks similar.)

I got lost searching for generation algorithms for a while before realizing surely Godot probably has something to say about that.

https://www.gdquest.com/tutorial/godot/pcg/world-map/
https://github.com/GDQuest/godot-procedural-generation



The first link looks close to what I had in mind. If you download and run that scene it never seems to change, but if you drill into the gradient texture noise source and change the random number seed it will change.

I'll probably try using the same noise texture and just making everything above a certain value land and the rest coast. I might make a non-noisy gradient multiplier to encourage two continents and keeping land away from the map edges. And maybe I'll do something similar with a second noisy gradient texture to choose between plains & grass while keeping each clustered to parts of the map.
 

Attachments

  • Screen Shot 2021-11-03 at 11.44.45 AM.png
    Screen Shot 2021-11-03 at 11.44.45 AM.png
    1.2 MB · Views: 20
A future thought distraction: What if you want to place a tundra tile next to a desert tile? Or an ocean next to grass?

I've said before that our future tile format can't possibly ape the Civ3 format because each adjacent tile combination has to have at least one transition graphic for all four cardinal directions, and we want to remove limits on terrain types which would increase the need for tile graphics exponentially.

But while investigating the map generation question I started thinking about procedural tile blending again.

It occurs to me that we *might* be able to take existing civ3 terrain graphics and put an ocean next to desert or other "impossible" tile layout.

Idea 1: For example, ocean and desert: take an all-ocean tile and an all-desert tile and get some stats on color. Take one of their transition tiles for another terrain type (or several) to figure out which pixels belong to the original tile type. Then use that info to blend an all-ocean and all-desert together into an ocean-desert transition.

Idea 2: Similar, but maybe adapt the gradient noise method for terrain generation to define the shape of the transition boundary.

Idea 3: Create a big blob tile layout and operate on a larger shape instead of individual tiles. This idea is very fuzzy even in my head, but I keep thinking it might be useful to abandon a tile-by-tile painting and instead identify shapes and fill them. This idea is taking that idea and trying to fill out sample blobs from Civ3 tile collections.

This is all just crazy ideas for the future. I can't even think of how I would start experimenting with this now even if I wanted to.
 
Just found these two videos that hit the bullseye of what I was aiming for in the short term. (For using noise for world map generation.) The first explains the simplex noise generator for Godot, and the second is using it for terrain generation.

It's exactly what I was trying to simplify to from the starting point of the pcg/world-map repo linked post before last. All I need is the generator object. Geez I may need to just barely modify what I have now. Cool.

-
-

Edit: <sigh>, I tried to just show links for the video, but the forum "helpfully" embeds them. Oh well.
 
Well that was pretty simple. The hard part was figuring out how to make it simple, because most of the examples besides the videos I posted make it complex.

This is just a 2d gradient. If you treat the values as height, all tiles below a certain height are water, then grass, then the highest points are plains.

Ok, it's a little more complex than that. There are a lot of levers you could pull, but I just used the default values and then sampled tile values at different multiples to get roughly the right size and number of land masses.

Changes are pushed. Default zoom and scroll are adjusted, too. Kind of a hack for now, but it looks better.

Edit: I'm starting to see a path to how to use gradients to perhaps make future 'sensible' maps. A height gradient, a wetness gradient, and a temperature gradient. Some noise randomness, some manual guardrails, and some more deterministic algorithmic procedures could mitigate the likelihood of a desert tile randomly appearing by a tundra or jungle tile. And since it's a gradient it would be easier to figure out that if a desert and grass tile appear together that one of them needs to be turned into a plains tile.

I'm not sure how to enforce any sort of player territory fairness at this point, but then again I'm not sure Civ3 does, either.

Edit 2: And, of course, while I'm speaking for a Civ3-alike map, I'm thinking future-proof, too. Map dimensions like height, temperature, and humidity would be repurposable and expandable/replaceable. Ideally.
 

Attachments

  • Screen Shot 2021-11-03 at 4.35.13 PM.jpg
    Screen Shot 2021-11-03 at 4.35.13 PM.jpg
    389.2 KB · Views: 20
Last edited:
That looks pretty good. I like the gradient idea. As I understand it, a lot of late 1990s games with variable height terrains, and more options for how high the terrain was than just flat/hills/mountains (e.g. Sim City 2000, Railroad Tycoon II, Civilization II, Sid Meier's Alpha Centauri) supported creating a map based on color-coded gradients in an image of a topographic map. I'm not aware of any of them also using that for wetness and temperature, but I see no reason why that couldn't be added in - and perhaps SMAC did have something like that.

Another resource we could mine for ideas is Civ IV map generation; I know there are quite a few modded ones for Civ IV. It may not translate 100% to Civ3 and the isometric system, but I suspect some of the concepts would transfer.

Map generation is also an area that's pretty cool for C7 since we could include a bunch of options, unlike in regular Civ III where we have one option with a few knobs, albeit one that for the most part gives pretty good maps. I don't think it pays too much attention to fairness, beyond not starting too close to someone else, though - I recall some pictures of exceptionally bad starts in the Screenshots thread in Civ3 General Discussions, and on any large map it seems like someone winds up by a bunch of tundra, desert, or just hills with inadequate food resources. But I also don't think it would be as interesting if all positions were equal - although perhaps our Starting Location generator should have an option to ensure minimum viability of some sort. Which goes back to what you said about guardrails.

And it's kind of funny, I didn't really swing by intending to work on C7 either, but WildWeazel's posts clearly resulted in some level of inspiration for doing so.
 
I've been enamored with map generation techniques lately. I've figured out learned from the Internet (but it makes perfect sense to me) how to wrap the axes. It's not in the main working branch so far.

...because I'm playing with a segregated map generator function in a feat-mapgen branch. I'm adding it to the C7GameData folder recently added by Quintillus and in that branch have the C7Game scene call the new code for a noise field using a non-Godot noise generator.

I have it "working" and properly wrapping the X axis, but I need to tweak the noise generator to be more parametric like the Godot-based one. The generated maps just don't look as good yet as when using the Godot-provided noise. (I think at this point wrapping Y axis, and then X *and* Y axes is trivial.)

A side effect of learning some of the map gen techniques is that I have some new ideas on how to analyze the Civ3 map data and the overlay terrain graphics. Once I read about marching squares I realized it's more or less identical to how the base terrain tiles are chosen. I think I can figure out a generic lookup algorithm that should help with several tiled graphics types...maybe.

I'm also now wondering if there is a Perlin noise field hidden in the map data. If that exists i might help explain why there so many ocean tile choices and how the raised edges of mountain tiles are selected. But now I have ideas on how to look for it.
 
Top Bottom