• 📚 Admin Project Update: I've added a major feature to PictureBooks.io called Avatar Studio! You can now upload photos to instantly turn your kids (and pets! 🐶) into illustrated characters that star in their own stories. Give it a try and let me know what you think!
Resource icon

C3X: EXE Mod including Bug Fixes, Stack Bombard, and Much More Release 26

@robotlincoln It's a complete different dynamic on economic and logistics scale. You field huge army, but producing single unit still takes as long as it would in a regular game, distances are much larger and since tech is slow nobody has access to railroads, so transferring freshly made units from the core cities to the front via roads can take 20+ turns for 1 speed units, 10+ for faster units.
In a regular game its whatever, you bunch your units into a single or two power stacks and walk plow through entire empires. In the game I'm playing right now I must be very careful about unit placement and which fights do I take, not to mention the constant risk of being attack by a different AI at one end of my borders, while I'm fighting a war at a far away other end of empire. In a regular game that's a non-issue because a small opponent would have so little units you can easily fight off and attack with a relatively small garrison especially with a presence of artillery, but here even the little guys have as many military units as I do total.
I am constantly one mistake away from losing my entire empire and that, combined with the insane scale and complexity of everything really, makes for quite unique experience that I enjoy. The set of challenges encountered is also entertaining - regular game is "pick republic and win", here I was forced to pick monarchy and constantly suffered from no gold income due to having to make bigger and bigger army just to catch up with AIs - had to prioritize reaching banking and economics "produce wealth" my way into maintaining an army capable of withstanding enemies. It wasn't until 15 turns ago before I could finally afford, and have any benefits from, switching to republic, which also isn't as straight forward as in normal game, you can guess what such large armies combat does to war weariness points. :lol:
Honestly this is the first time any other forms of govt have worthwhile perks, even feudalism with its whip+small town unit support suddenly look like a very strong option to chose, when in regular game you'd never do that. A food for thought.
 
Just wanted to mention an observation I had testing an AI vs AI game. The AI does not understand that bombarding a unit that has 1 HP is a waste.
I noticed this too back when I was working on allowing the AI to use artillery at all. It shouldn't be too difficult to fix. I've found the function that evaluates possible bombard targets for the AI and have written a function that determines if a unit can damage a tile by bombarding it (for use by stack bombard). It's only a matter of combining those, though I'd have to figure out a natural way to do it.

It was here, this crashed the game (from my test plays), random crash anywhere around 300-600 turns into the game (not right away).
That's very inconvenient that the crash only happens after 300 turns. That makes it very difficult to reproduce if I even could without that specific scenario. I'll make note of this for now and what I could do, maybe if I have time after the next version of Tides of Crimson is done, is to try putting the bug back in by renaming that unit to have parenthesis again.

Anything that loops through same data set, will be accelerated greatly, BUT if the code touches the data only once, it wont, because the additional X3D cache isn't a fully fledged associative cache, instead it's a much simpler to implement victim cache - the CPU cannot preload new data into it, it only can dump the data it already used previously to it.
Civ 3's game data is small enough that it could fit entirely in the X3D cache, it shouldn't end up in main memory at all unless it's being accessed very rarely in which case it's not a problem. Some numbers: Tile objects are 220 bytes, so a maximum size map is 14.4 MB. Units are 1000 bytes, so 10000 units is 10 MB. The rest of the game data is small by comparison. A full 2048 cities is 2.8 MB, a full 32 players takes 0.27 MB, the scenario data object is 0.15 MB, 1000 unit type definitions would occupy 0.31 MB. For comparison, the 9800X3D has 64 MB of 3D v-cache. Granted, other applications are competing for that cache, but then there's also more space in L3/2/1.

It's actually impressive in a bad way that the game manages to run out of memory. One reason I think it's allocating separate unit art for each unit on the map is that I can't think of how it could otherwise occupy as much memory as it does. That and the fact that >90% of the memory is allocated by the graphics or sound DLLs. Even loading all the graphics and sounds for all the units in vanilla, PTW, and Conquests doesn't come close to filling the 32-bit address space if you load each only once. But in terms of turn times, the graphics wouldn't matter. The game doesn't redraw anything unless it has to pause turn processing to show a popup to the player. That was actually inconvenient for me when I was working on converting popups into multiplayer-style messages at the edge of the screen. I had to figure out how to trigger a redraw otherwise the messages wouldn't appear until turn processing finished.

At least as of it is right now, I don't feel any advantage of that quite large total L3 size of my CPU while playing civ3 - turns just take as long as they did on my previous 3570K...
Technically speaking the memory on both systems has almost the same effective latency...
That's pretty disappointing and suggests the game really is just waiting for memory all the time. In that case, X3D should help a lot. All this talk about performance is tempting me to start working on it again. It would be an interesting experiment to downclock the CPU and see how that affects turn times versus downclocking RAM. Increasing memory latency should be much worse if that's the bottleneck. However I can't let myself get more distracted. I already have several distractions keeping me from working on what really matters: Lua.

Yeah AMD Faildozer era was terrible, I seriously thought AMD was cooked and will go bankrupt at that time (their shares did even fall below 1 USD a pop), they were really lucky with their next CEO choice, Lisa Su really pulled a miracle there
I made a few thousand dollars on AMD stock buying it around $7 back in, I think, 2011 or so. In retrospect I mostly got lucky. Also now that I think about it, I did follow CPU news for a while after Bulldozer because I remember it being a big deal that Jim Keller was at AMD during those first few years of Zen. He became something of a meme on the internet communities that discuss these kind of things.

Even though I’ve been playing Civilization III for the past 15 years, using C3X has made the game more enjoyable than ever. So I wanted to write down a few additional ideas I’ve been thinking about. I don’t expect all of these to be implemented; I just believe they might be useful as references or inspiration when new features are added in the future.
I'm glad you're enjoying my mod. I'll copy these ideas to my list of things to consider during and after implementing Lua scripting since they're mostly what I would consider post-Lua things. In fact some are things I would consider perfect examples of what I want to make possible using Lua, like the combat bonus for cavalry attacking onto flat terrain. Once there's a hook allowing Lua to modify combat odds and an interface letting it access units, unit types, tiles, and terrain, that would be very easy.

Also, it's not exactly what you asked for, but I'll point out that C3X has the option of making certain artillery unit types do damage like they used to in PTW, meaning they have a two thirds chance of damaging a city instead of the units on top of it. That could be used to create a difference between different kinds of artillery units. Like archers have lower bombard strength but always target units when possible versus siege units which are stronger but tend to pound cities into rubble.
 
That's very inconvenient that the crash only happens after 300 turns. That makes it very difficult to reproduce if I even could without that specific scenario. I'll make note of this for now and what I could do, maybe if I have time after the next version of Tides of Crimson is done, is to try putting the bug back in by renaming that unit to have parenthesis again.
That sounds like a good idea, thanks for your help looking into this! Could possibly be the interplay with some of my script.txt updates combined with the parenthesized unit name. We'll know soon enough! =) I'll let you know if I find out anything new in the meantime!
 
One reason I think it's allocating separate unit art for each unit on the map is that I can't think of how it could otherwise occupy as much memory as it does.

Yeah, I'm confident it does this - I remember one time I was messing around, had a game open with a couple of galleys, changed the #animname entry in the pediaicons file to point to a different unit folder and saved it while the game was still running, and subsequent galleys I built had the new graphics while the ones already on the map had the old graphics. Of course the next time I loaded a save they all had the "new" graphics.
 
The idea of differentiating bombard unit types is great for smart weapons in the modern age as well. An land artillery unit without PTW style targeting could represent smart munition. It would be great if the AI could use bombard units flagged with "Artillery" strategy to execute precision strikes. But unless I'm mistaken they only do that with "Air Bombard" strategy units as this special order was only meant for those in stock game.
 
That's pretty disappointing and suggests the game really is just waiting for memory all the time. In that case, X3D should help a lot. All this talk about performance is tempting me to start working on it again. It would be an interesting experiment to downclock the CPU and see how that affects turn times versus downclocking RAM. Increasing memory latency should be much worse if that's the bottleneck. However I can't let myself get more distracted. I already have several distractions keeping me from working on what really matters: Lua.
I could test that and measure the times, give me the worst save file you've got in terms of AI turns (hopefully the AI makes same move on each reload, I could restart civ3 and run same save 3 times to make sure it results with same time taken) and I will test that right away.
I have my CPU with manual overclock locked at one frequency so there is no frequency boost and throttling behavior at all, unlike the default setup of every consumer PC where CPUs constantly jump in the clocks frequency. Also I can set it to any static lower clocks same fashion at will.
Checking for memory speed will be even easier - just disabling the XMP will result in memory dropping from 3200MHz to 2133MHz while staying at the exactly same Clock Latencies (which is bad for the user, because normal 2133 memory should run at like CL11, but good for the test, because at CL16 2133 memory has 40% slower access time than it does at 3200, and I could always manually drop the clocks even lower while staying at CL16, basically this test on my current setup is piece of cake).

I remember it being a big deal that Jim Keller was at AMD during those first few years of Zen.
He tends to talk humbly of his work but he actually was extremely pivotal to performance and efficiency of Ryzen CPUs. The design decisions he made for the entire team made those CPUs what they are today, the stuff that him and other AMD engineers talked about in the interviews are unreal level of insane things going down during the development of that architecture.
And it goes from small things, like him licensing a branch prediction design that was originally made (and won 1#) at Intel competition for best brench prediction (I have no idea how he managed to license it given that :wow:), the Infintiy Fabric (which is also a repurposed HyperTransport, which was for all intent and purpose an abandoned thing that saw a last update in 2008, that ironically Jim Keller worked on creating it for Athlon 64 back in early 2000's), exec units design, cache design an all that.
He set the goal that they MUST match Intel in IPC performance, not a single engineer at AMD believed they can do that till the very end when chips were being taped out at semi foundry. Or rather it was even worse, since all the engineers were on full defeatism like "Jim, I don't think we are that good, we will never be able to match Intel CPUs".

And it goes for big things as well, he managed to convince Rory and Lisa to basically have all engineers drop all the separate projects/tasks/existing products support that they are doing at that time and focus them into one large group, so he had all 500+ people working on the Zen. AMD switching from outdated 32nm SOI process of GloBo to Samsung/TSMC FinFET 14nm (thats now at 3nm/4nm FinFET for newest Ryzens) is also because of him - this thing alone is beyond insane, because AMD somehow managed to get Samsung to give license for it to, and help set it up at the, GloBo (Global Foundries, the ex-AMD semi foundries that they sold off in 2006 but still kept a 49% or 51% shares stake in), when neither GloBo wanted to deal with it, nor Samsung to license it, and AMD didn't have any cash to offer for licensing... like what?! How did they pull it? That's some crazy level of "guy 1 knows guys 2 and likes guy 0 enough to agree to help them out as a favor" that just doesn't happen in day to day cut-throat business. But I guess that are the perks you get when you worked with half of the USA's CPU engineers and big corpo wigs since 1980's, that dude went through important CPU architect/lead architect/VP positions at DEC/Apple/Broadcom etc. before rejoining AMD for Zen.
 
Last edited:
I noticed this too back when I was working on allowing the AI to use artillery at all. It shouldn't be too difficult to fix. I've found the function that evaluates possible bombard targets for the AI and have written a function that determines if a unit can damage a tile by bombarding it (for use by stack bombard). It's only a matter of combining those, though I'd have to figure out a natural way to do it.


That's very inconvenient that the crash only happens after 300 turns. That makes it very difficult to reproduce if I even could without that specific scenario. I'll make note of this for now and what I could do, maybe if I have time after the next version of Tides of Crimson is done, is to try putting the bug back in by renaming that unit to have parenthesis again.


Civ 3's game data is small enough that it could fit entirely in the X3D cache, it shouldn't end up in main memory at all unless it's being accessed very rarely in which case it's not a problem. Some numbers: Tile objects are 220 bytes, so a maximum size map is 14.4 MB. Units are 1000 bytes, so 10000 units is 10 MB. The rest of the game data is small by comparison. A full 2048 cities is 2.8 MB, a full 32 players takes 0.27 MB, the scenario data object is 0.15 MB, 1000 unit type definitions would occupy 0.31 MB. For comparison, the 9800X3D has 64 MB of 3D v-cache. Granted, other applications are competing for that cache, but then there's also more space in L3/2/1.

It's actually impressive in a bad way that the game manages to run out of memory. One reason I think it's allocating separate unit art for each unit on the map is that I can't think of how it could otherwise occupy as much memory as it does. That and the fact that >90% of the memory is allocated by the graphics or sound DLLs. Even loading all the graphics and sounds for all the units in vanilla, PTW, and Conquests doesn't come close to filling the 32-bit address space if you load each only once. But in terms of turn times, the graphics wouldn't matter. The game doesn't redraw anything unless it has to pause turn processing to show a popup to the player. That was actually inconvenient for me when I was working on converting popups into multiplayer-style messages at the edge of the screen. I had to figure out how to trigger a redraw otherwise the messages wouldn't appear until turn processing finished.


That's pretty disappointing and suggests the game really is just waiting for memory all the time. In that case, X3D should help a lot. All this talk about performance is tempting me to start working on it again. It would be an interesting experiment to downclock the CPU and see how that affects turn times versus downclocking RAM. Increasing memory latency should be much worse if that's the bottleneck. However I can't let myself get more distracted. I already have several distractions keeping me from working on what really matters: Lua.


I made a few thousand dollars on AMD stock buying it around $7 back in, I think, 2011 or so. In retrospect I mostly got lucky. Also now that I think about it, I did follow CPU news for a while after Bulldozer because I remember it being a big deal that Jim Keller was at AMD during those first few years of Zen. He became something of a meme on the internet communities that discuss these kind of things.


I'm glad you're enjoying my mod. I'll copy these ideas to my list of things to consider during and after implementing Lua scripting since they're mostly what I would consider post-Lua things. In fact some are things I would consider perfect examples of what I want to make possible using Lua, like the combat bonus for cavalry attacking onto flat terrain. Once there's a hook allowing Lua to modify combat odds and an interface letting it access units, unit types, tiles, and terrain, that would be very easy.

Also, it's not exactly what you asked for, but I'll point out that C3X has the option of making certain artillery unit types do damage like they used to in PTW, meaning they have a two thirds chance of damaging a city instead of the units on top of it. That could be used to create a difference between different kinds of artillery units. Like archers have lower bombard strength but always target units when possible versus siege units which are stronger but tend to pound cities into rubble.
It makes a lot of sense.
From your reply, it feels like getting Lua scripting in place is far more important and higher priority than adding individual features right now.

Thanks for taking the time to explain your direction, and thank you for all the work you’re putting into C3X.
 
That would be cool, get them to chose targets that they could actually damage. It is not a huge problem in my games, but I do not know if the AI is doing it to each other. They will capture cats (short hand for any bombardment unit) and not move them towards safety. Where a human would try to get them cover or lacking that I would disband, so he AI does not recover them.

Better targeting would make the AI a better foe. An AI vs AI is not a great test as they turn it into basically an AW match (oh, I had use aggressive setting). They frequently cannot finish an opponent. I see them get a civ down to two towns and make peace. In this one Persia had 70 cities and made peace. Then the Mongols planted a bunch of towns.

Anyway it is nice to have an option.
 
I could test that and measure the times, give me the worst save file you've got in terms of AI turns (hopefully the AI makes same move on each reload, I could restart civ3 and run same save 3 times to make sure it results with same time taken) and I will test that right away.
You probably have better saves than I do to test this since you play with so many units. The worst save I've ever run into on my own, which I've attached, is more of a torture test for the sea trade calculations than the AI. This is the save that ran up to 15 minutes between turns and got me working on optimizing the trade net. After that, I got it down to about 3 minutes with roughly half spent on the trade network and half on everything else. I think I remembered to turn on preserve random seed for this save and that turns times were very consistent but it's been a couple of years since I worked with it.

By the way, in case you weren't aware, C3X has an option to measure turn times. It's named, not surprisingly, measure_turn_times. It shows a popup at the start of each turn with the time elapsed since the player ended the last turn. The mod will deduct time spent on the city screen, popups, and advisor screens from the overall turn time, and you should take care not to do anything else between turns like expand your palace so as not to interfere with the measurement.

It is not a huge problem in my games, but I do not know if the AI is doing it to each other.
They probably are. I watched many AI-only games in debug mode while I was working on enabling the AI to use artillery and I saw it do so many frustratingly dumb things. One of the biggest limitations of the AI is that there's almost no coordination among its units. Other than units escorting one another, it's pretty much each unit for itself. So the AI can end up with stacks of artillery bombarding cities turn after turn while all its attacker units are off elsewhere, because the unit AI for the attackers never considers artillery and vice-versa. Similarly, the reason the AI wanders captured artillery around unprotected is that none of the surrounding units pay the artillery any mind and vice-versa. The captured artillery must return to a city so it can be assigned an escorter. The solution would probably be to patch in some kind of stack unit AI but that's a lot of work. At least fixing it bombarding tiles it can't damage would be relatively easy.
 

Attachments

You probably have better saves than I do to test this since you play with so many units.
Mine actually aren't that good because AIs are at peace between each other, so they only shuffle single freshly made units and workers. I can feel how much longer turns are taking when just one AI is at war with me and moves all of its 2000+ units.
Should I set any specific settings in default c3x config file for that save, like expanded city working size, specific city limit number above 512, etc?

By the way, in case you weren't aware, C3X has an option to measure turn times. It's named, not surprisingly, measure_turn_times.
Sweet, I was about to have a timer bound to spacebar keypress globally so I would have it start when I end the turn but I'd have to manually watch and stop it when the next turn begins. With your function I don't have to worry about it, I will still probably run a timer in the background just to make sure there isn't any issue with the function getting frozen/sleeping but it's still a good reduction in manual workload.

Speaking of repeat testing accuracy, here's stability of my rigs clocks... after 48 hours of software monitoring + during few loops of full 100% all core load. Yes, I don't turn off/hibernate my PC. :lol:
 

Attachments

  • HWiNFO64_251214_161632.png
    HWiNFO64_251214_161632.png
    196.7 KB · Views: 36
  • CINEBENCH_Windows_64_Bit_251214_161929.png
    CINEBENCH_Windows_64_Bit_251214_161929.png
    278.3 KB · Views: 31
Flintlock, I have a very good use for your upcoming great option to adjust the overall appearance rate of bonus resources, especially for sea bonus resources ! :thumbsup:
 
Mine actually aren't that good because AIs are at peace between each other, so they only shuffle single freshly made units and workers. I can feel how much longer turns are taking when just one AI is at war with me and moves all of its 2000+ units.
Should I set any specific settings in default c3x config file for that save, like expanded city working size, specific city limit number above 512, etc?
Makes sense. There are a lot of wars going on in that save. I think that's what caused the sea trade calculations to become so expensive too, because wars disrupt trade routes and it's a lot more work for the game to try and fail to find a path between two cities when there isn't one compared to finding an available path. It has to check every possible path before it can conclude there aren't any. That save doesn't need any special C3X settings. It's from before I'd even added the option to expand city work areas or lift the city limit.

Flintlock, I have a very good use for your upcoming great option to adjust the overall appearance rate of bonus resources, especially for sea bonus resources ! :thumbsup:
Glad to hear it. R26 will be ready very soon now. Just putting the final touches on it.
 
There have been many discussions and opinions regarding unit AI in Civilization III.
I would like to outline my proposed solution to these issues below.

The biggest problems with the current Civilization III AI are piecemeal unit commitment, rule-less attacks, and the lack of force concentration.

The combat system I propose keeps Civilization III’s fundamental structure — Stack of Doom combat — but changes the decisive factor of battles from sheer unit count to unit composition and order of engagement.

To achieve this, several design premises are introduced.

First, the number of roads is limited so that large armies are forced to collide on specific tiles rather than spreading out freely.
Second, archer units receive increased attack strength and gain a stealth attack ability, allowing them to selectively target specific unit classes.
Any unit that engages in combat or is hit by bombardment loses fortification for that turn, and cavalry units receive an attack bonus when attacking unfortified units on flat terrain.
Additionally, retreat is allowed even when movement points are equal.


---

Combat Resolution Order

Under this system, combat follows a clear and consistent sequence:

1. Archer skirmishing occurs first.


2. Assault infantry charge to remove enemy fortifications.


3. Cavalry charge against unfortified enemies to deliver the decisive blow.



Once archers gain stealth attack, assault infantry and cavalry can no longer hide behind defensive infantry.
As a result, every engagement naturally begins with an attempt to eliminate the enemy’s archers.

The side that wins the archer skirmish can then attack the enemy’s low-defense assault infantry and cavalry with little interference.
For archer AI behavior, the appropriate attack priority is:

Archers → Cavalry → Assault Infantry


---

Role of Assault Infantry

After the skirmishing phase, assault infantry become critical.

Charging cavalry directly into fortified infantry wastes expensive units and provides no attack bonus.
Therefore, assault infantry must first be committed to break enemy fortifications.

Only after sufficient fortifications have been removed should cavalry be committed to decide the battle.


---

Enforced Combined-Arms Balance

The core strength of this system is that it forces balanced army composition.

Overproducing archers and assault infantry leads to collapse when the enemy’s assault infantry breaks the defensive line, followed by cavalry counter-charges that slaughter exposed archers.

Overproducing cavalry alone fails because fortified infantry cannot be broken.


To win, an army must include:

Archers to win skirmishing,

Assault infantry to remove fortifications,

Defensive infantry to hold the line,

Cavalry to deliver the decisive strike.


It is still possible to brute-force battles with overwhelming assault infantry, but this becomes a high-loss strategy rather than an optimal one.


---

AI Advantages

The greatest advantage of this system is that it is highly AI-friendly.

By simply:

Concentrating forces into a Stack of Doom,

Enforcing unit ratios,

And following a fixed attack order,


the AI can avoid its current problems of fragmented attacks and scattered forces.

No complex flanking logic is required to achieve meaningful strategic depth.
Since Civilization III is not Total War, combat should emphasize strategic decision-making over tactical micromanagement, and this system aligns with that philosophy.


---

Industrial Era and Later Combat System

From the Industrial Era onward, units with archer-like stealth attack no longer exist.
As a result, the skirmish-centric flow of pre-medieval combat disappears, and the system becomes structurally simpler.

Combat in this era largely preserves Civilization III’s existing mechanics, with two key pillars:

Concentrated force via Stack of Doom

Large-scale preparatory bombardment using artillery and aircraft


Industrial warfare is fundamentally about breaking fortified infantry walls.
Artillery becomes fully effective in field battles, and after the introduction of tanks, aircraft gradually assume part of the artillery’s preparatory role.

In short:

Enemy defenses are weakened through artillery and air bombardment,

Tanks break through the front line,

Concentrated forces then secure and hold the breakthrough.


This alone is sufficient to produce strategically deep and coherent warfare in the Industrial and Modern eras without adding unnecessary complexity.
 
Flintlock updated C3X with a new update entry:

Release 26

New in this version:
  • Add some options to make land transports viable, controlled by land_transport_rules setting
    • LTs may be loaded into naval transports
    • Empty LTs may join armies
    • Units inside an LT may be prevented from defending their tile, performing defensive bombard, or intercepting air units
    • Units inside an LT can be destroyed when the LT itself is destroyed or captured
  • Add resource placement settings
    • ...

Read the rest of this update entry...
 
Alright, version 26 is done! Obviously the headline feature is the districts, which are now themselves at version 1.0. It also contains a set of optional rule changes to make land transports more viable, options related to resource placement (can increase the number of bonus resources, luxuries, and can let resources of different types be placed adjacent so there are more possible spots), and some things contributed by others on GitHub. Those contributions are allowing city work areas to vary based on buildings by Philiquaz and an option to allow sale of small wonders by dobragab. Lastly, I fixed civ era aliases not applying to the espionage screen. That bug was caused by the fact that the game doesn't go through the player objects to get country names on that screen, it instead looks them up from the Civilopedia. Go figure.

Additionally, retreat is allowed even when movement points are equal.
This sounded familiar and I wondered for a moment if I'd already added it, but I haven't. This must have been requested before and been something I intended to do but never got around to. I'll put it on the short list for future versions because it would be easy. It'll be implemented as an if-not-slower retreat rule, like if-faster but also allowing retreat for units with the same speed.
 
You probably have better saves than I do to test this since you play with so many units. The worst save I've ever run into on my own, which I've attached, is more of a torture test for the sea trade calculations than the AI. This is the save that ran up to 15 minutes between turns and got me working on optimizing the trade net. After that, I got it down to about 3 minutes with roughly half spent on the trade network and half on everything else. I think I remembered to turn on preserve random seed for this save and that turns times were very consistent but it's been a couple of years since I worked with it.

I finally got around to benchmarking that save, got delayed by my left ctrl+win button dying on my mechanical keyboard, had to disassembly it fully clean it out with 99.99% isopropanol, drying it out and in the end the key are still dead :( Had to resort to rebinding them to the numpad, luckily my keyboard supports firmware level key rebinds else I wouldn't be able to access fully the UEFI BIOS overclock settings for savegame benchmarking.

My benchmarking procedure was to have as little things as possible running in the background + run 3 save game passes and in between close the civ3, start firefox play a YT video for few seconds to make sure CPU cache is fully purged and won't be affecting next passes. Your command for display turn time came in really clutch, having a separate timer becomes useless with all the non-diasbleable trade embargo pop ups in your save. Also the times between passes have been extremely consistent so at least the AIs repeat the same moves everytime.
I've also ran a single pass of my save game turn for comparison - 22 AIs remain and I am at war with 1 AI that is actively moving about 1500~2000 units during it's turn.
Here are the results + their settings:

Edit: How annoying that this forum engine doesn't support tabbing/space formatting - last screenshot shows how the results in post should look like...
Also the image thumbnails get shuffled out of uploading order, what a mess.
Benchmarking save 3 passes / my save 1 pass stuffed in to save on excess new lines
CPU 4400MHz RAM 3200MHz/CL16
Turn Time: 67.356s | 67.484s | 67.333s / 285.253s
City conn: 14.824s | 14.788s | 14.754s (265 calls) / 0.077s (25 calls)
Flood fill: 0.111s | 0.110s | 0.107s / 0.003s

CPU 2200MHz RAM 3200MHz/CL16 - beware that on Ryzen CPUs the cache clocks are in sync with core clocks, they dropped in half as well
Turn time: 135.321s | 135.527s | 135.526s / 556.597s
City conn: 29.666s | 29.722s | 29.625s (265 calls) / 0.153s (25 calls)
Flood fill: 0.212s | 0.214s | 0.214s / 0.005s

CPU 4400MHz RAM 1600MHz/CL16 + Memory Controller/Infinity Fabric clocks halved from 1600MHz to 800MHz (forced by 1:1 RAM/IF ratio - unmitigable, CPU doesn't support running IF/Mem Controller at higher clocks than RAM)
Turn time: 68.453s | 68.330s | 68.245s / 291.301s
City conn: 14.915s | 14.934s | 14.917s (265 calls) / 0.078s (25 calls)
Flood fill: 0.123s | 0.122s | 0.124s / 0.003s

Bonus experimental pass - CPU 4400MHz RAM 3200MHz/CL16 + Mem Controller/Infinity Fabric at 800MHz/1067MHz
Turn time: 68.303s / 285.801s
City conn: 14.933s / 0.077s (25 calls)
Flood fill: 0.133s / 0.003s

Big NOTE: The passes with 1600MHz RAM clocks, have different secondary memory timings (tRC being at 56 instead of 75, etc.) while the primary timings remained the same (16-18-18-38 | CL-tRC-tRP-tRAS). I had to manually set the timings for that run because apparently my Gigabyte motherboard would tighten secondary timings automatically while setting the ram speed from 3200 to 1600, and not only that, the motherboard also lies about the timings it reports that it did auto set for my regular 3200 daily setup, so setting them manually to what it reported resulted in the disparity there.
I've got no software way to re-check the secondary timings in Windows as even the specialized software doesn't show the affected ones, and trying to run the system with manually set timings (to what the motherboard reported to be at 3200MHz) while working for 1600MHz setup and passes, it wouldn't even pass the POST during system boot up. Thanks Gigabyte for it I guess, even if it didn't affect the results by any significant amount I'd still rather let this be known.

I'm gonna see if I can attach the screenshots from the runs
 

Attachments

  • CPU4400_RAM1600_251217_035325.png
    CPU4400_RAM1600_251217_035325.png
    765.1 KB · Views: 18
  • CPU4400_RAM3200_MEMCTR800_IF1067_251217_031221.png
    CPU4400_RAM3200_MEMCTR800_IF1067_251217_031221.png
    794.7 KB · Views: 15
  • MySave_CPU4400_RAM3200_251217_043024.png
    MySave_CPU4400_RAM3200_251217_043024.png
    903.8 KB · Views: 17
  • MySave_CPU2200_RAM3200_251217_025624.jpg
    MySave_CPU2200_RAM3200_251217_025624.jpg
    830.6 KB · Views: 15
  • MySave_CPU4400_RAM1600_251217_040240.png
    MySave_CPU4400_RAM1600_251217_040240.png
    905.8 KB · Views: 15
  • MySave_CPU4400_RAM3200_MEMCTR800_IF1067_251217_032216.png
    MySave_CPU4400_RAM3200_MEMCTR800_IF1067_251217_032216.png
    956.2 KB · Views: 17
  • CPU4400_RAM1600_251217_035049.jpg
    CPU4400_RAM1600_251217_035049.jpg
    638.9 KB · Views: 16
  • CPU4400_RAM1600_251217_034810.jpg
    CPU4400_RAM1600_251217_034810.jpg
    638.9 KB · Views: 17
  • CPU2200_RAM3200_251217_023352.jpg
    CPU2200_RAM3200_251217_023352.jpg
    638.9 KB · Views: 15
  • CPU2200_RAM3200_251217_022929.jpg
    CPU2200_RAM3200_251217_022929.jpg
    638.8 KB · Views: 17
  • CPU2200_RAM3200_251217_022424.jpg
    CPU2200_RAM3200_251217_022424.jpg
    757.7 KB · Views: 16
  • CPU4400_RAM3200_251217_021053.jpg
    CPU4400_RAM3200_251217_021053.jpg
    638.9 KB · Views: 15
  • CPU4400_RAM3200_251217_020825.jpg
    CPU4400_RAM3200_251217_020825.jpg
    638.9 KB · Views: 10
  • CPU4400_RAM3200_251217_020353.jpg
    CPU4400_RAM3200_251217_020353.jpg
    639 KB · Views: 12
  • firefox_251217_060952.png
    firefox_251217_060952.png
    31.1 KB · Views: 16
  • why on earth it doesnt keep the order.png
    why on earth it doesnt keep the order.png
    274.5 KB · Views: 15
Last edited:
Flintlock and all other members of the C3X team, congratulations and a big thank you very much for releasing the R26 version of C3X !

:thanx:

Speaking about the retreat options in C3X there is something important, that could be improved in the "defensive_retreat_on_water". At present this flag can only be activated for all naval units in general, but such a general option, that would be very helpful for submarines, is poison for the pirate ships in my mods as it is very difficult to enslave a ship with a single pirate ship with that general option activated.

Could it be possible that this defensive naval retreat option can be combined with a function, where the ships that are allowed to retreat defensivly, can be named in brackets, as it is possible in some other features of C3X [Submarine] ? Even better would be a flag where submarines can escape from beeing attacked even when the attack against a submarine is started and the attacking ship looses its ability to attack again in the same turn if it doesn´t have the blitz option (failed attack - something like the stealth option for air units).
 
Last edited:
I finally got around to benchmarking that save, got delayed by my left ctrl+win button dying on my mechanical keyboard, had to disassembly it fully clean it out with 99.99% isopropanol, drying it out and in the end the key are still dead :( Had to resort to rebinding them to the numpad, luckily my keyboard supports firmware level key rebinds else I wouldn't be able to access fully the UEFI BIOS overclock settings for savegame benchmarking.

My benchmarking procedure was to have as little things as possible running in the background + run 3 save game passes and in between close the civ3, start firefox play a YT video for few seconds to make sure CPU cache is fully purged and won't be affecting next passes. Your command for display turn time came in really clutch, having a separate timer becomes useless with all the non-diasbleable trade embargo pop ups in your save. Also the times between passes have been extremely consistent so at least the AIs repeat the same moves everytime.
I've also ran a single pass of my save game turn for comparison - 22 AIs remain and I am at war with 1 AI that is actively moving about 1500~2000 units during it's turn.
Here are the results + their settings:

Edit: How annoying that this forum engine doesn't support tabbing/space formatting - last screenshot shows how the results in post should look like...
Also the image thumbnails get shuffled out of uploading order, what a mess.
Benchmarking save 3 passes / my save 1 pass stuffed in to save on excess new lines
CPU 4400MHz RAM 3200MHz/CL16
Turn Time: 67.356s | 67.484s | 67.333s / 285.253s
City conn: 14.824s | 14.788s | 14.754s (265 calls) / 0.077s (25 calls)
Flood fill: 0.111s | 0.110s | 0.107s / 0.003s

CPU 2200MHz RAM 3200MHz/CL16 - beware that on Ryzen CPUs the cache clocks are in sync with core clocks, they dropped in half as well
Turn time: 135.321s | 135.527s | 135.526s / 556.597s
City conn: 29.666s | 29.722s | 29.625s (265 calls) / 0.153s (25 calls)
Flood fill: 0.212s | 0.214s | 0.214s / 0.005s

CPU 4400MHz RAM 1600MHz/CL16 + Memory Controller/Infinity Fabric clocks halved from 1600MHz to 800MHz (forced by 1:1 RAM/IF ratio - unmitigable, CPU doesn't support running IF/Mem Controller at higher clocks than RAM)
Turn time: 68.453s | 68.330s | 68.245s / 291.301s
City conn: 14.915s | 14.934s | 14.917s (265 calls) / 0.078s (25 calls)
Flood fill: 0.123s | 0.122s | 0.124s / 0.003s

Bonus experimental pass - CPU 4400MHz RAM 3200MHz/CL16 + Mem Controller/Infinity Fabric at 800MHz/1067MHz
Turn time: 68.303s / 285.801s
City conn: 14.933s / 0.077s (25 calls)
Flood fill: 0.133s / 0.003s

Big NOTE: The passes with 1600MHz RAM clocks, have different secondary memory timings (tRC being at 56 instead of 75, etc.) while the primary timings remained the same (16-18-18-38 | CL-tRC-tRP-tRAS). I had to manually set the timings for that run because apparently my Gigabyte motherboard would tighten secondary timings automatically while setting the ram speed from 3200 to 1600, and not only that, the motherboard also lies about the timings it reports that it did auto set for my regular 3200 daily setup, so setting them manually to what it reported resulted in the disparity there.
I've got no software way to re-check the secondary timings in Windows as even the specialized software doesn't show the affected ones, and trying to run the system with manually set timings (to what the motherboard reported to be at 3200MHz) while working for 1600MHz setup and passes, it wouldn't even pass the POST during system boot up. Thanks Gigabyte for it I guess, even if it didn't affect the results by any significant amount I'd still rather let this be known.

I'm gonna see if I can attach the screenshots from the runs
So, in conclusion, RAM speed doesn't matter, only raw cpu power?

Have you ever tried to tie CL to 14 or even 13? I wonder how much difference could it make?

Apart from that, 2 minute wait worst case scenario is not bad, but you miss the fun when city number raised to 1200+.
 
The new districts seem to be a great expansion to conquests 3. But we didn't get it to work in multiplayer. The worker buttons to built the districts don't appear.
And the day/night-cycle seems also not to work in multiplayer.
Is that true, or did we just miss some switch or so?
 
Back
Top Bottom