Author Topic: AI War 2 v0.610 Released! "Pay No Attention To The Golem Behind The Curtain"  (Read 643 times)

Offline keith.lamothe

  • Arcen Games Staff
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 19,504
Release notes here!

This one is an assortment of changes, including another graphics pipeline shift from Chris and some neat stuff from community member BadgerBadger (if you notice a wormhole name glowing red to tell you where a wave is coming from, that's who to thank).

There are also some further efforts to limit shots being wasted on overkill, so that units on all sides fight "smarter". In the process of doing that, I might have transformed the Devourer from an imposing menace to an unstoppable killing machine.

One long-anticipated change was support for variable-intensity minor factions. Only the Dyson has it right now, but it can be added to other factions easily now.

Oh, and the game will actually tell you if you've won or lost now.

Enjoy!
Keith
Have ideas or bug reports for one of our games? Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline x4000

  • Chris Park, Arcen Games Founder and Lead Designer
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 31,002
The additions from Badger on the wave-canceling when destroying warp gates is just one of those brilliant little details that I love.  It's the sort of thing that really adds, in a positive way, to the complexity of a game like this. 

That sort of feature will almost never matter -- it's just too niche of circumstances to really come up all that often where it is both in a situation where you can do it, you realize you can do it, you have time to do it, and you have a desire to do it.  BUT.  Sometime, some game, it will be this awesome thing that you knew you could do because gosh darn it you know the game well, and it will be super satisfying to make use of an obscure mechanic in a really clutch way all of a sudden.

It's also the sort of thing that starts really mattering on 10/10 style difficulty, for that matter.

For me, it's things like that which transform a game from what AI War Classic was, into something more like what Dwarf Fortress is -- in terms of depth, not surface complexity. ;)  I hope to see many more little micro-mechanics like that from modders.  It's one of the things I was really focused on doing a ton with TLF when I added a lot of  mechanics along the lines of"this is almost never useful, but the TotalBiscuit pollutes a planet to death and makes an animated video about it because it was so epic."

Badger, already this game wouldn't be remotely the same without you, and that's putting it mildly.  Now we need more folks like you! ;)
Have ideas or bug reports for one of our games?  Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline BadgerBadger

  • Hero Member Mark II
  • *****
  • Posts: 821
  • BadgerBadgerBadgerBadger
Aww, thanks Chris! I'm glad you've liked my ideas. Unfortunately there's only one of me, but I do what I can.

And I like the look of these changes, though after glancing through the changelog I no longer have the desire to read the word "this" anymore. For a long time. I do look forward to outfitting the Nanocaust with Intensity as well.

And now for my bug reports du jour. While the mouseover text for the resource bar works again now, scrolling the screen up by using the mouse (ie putting the mouse at the top of the window in the hopes of changing the section of planet/galaxy I am looking at) no longer works. This was happening in an earlier release too, though once the tooltips for the resource bar stopped working you could scroll properly. Current workaround: set the UI Scaling to < 1 and then scroll at the edge of the screen where the resource bar isn't anymore.


If I mess around in the Game Start window for too long (say disabling and reenabling a few factions, looking at a few randomly chosen maps) and then start the game, the Quit button won't work and PerSimStep seems not to be being run (minor factions don't do anything that would require a PerSimStep; Dyson Sphere doesn't spawn, Devourer doesn't pick a new planet to go to, etc). Someone else reported a similar problem. I've seen this on OSX and linux. I think this is the same problem that we were hoping got dealt with in .602 ( "Added warning messages if a long-range-planning thread takes longer than 10 seconds...").

Just at a guess, I'm suspicious of the fact that in Window_GameSetup.cs it will queue a new GameCommand every time an option changes. I added some logging code to report whenever a new GameCommand was queued. It seemed like the more commands that got queued the more likely it was that the Quit button would get stuck (for example, I had poor reproduction rates with 2 changes. Moderate reproduction rates with 3, and so on). To further confuse the issue, if I invoke AIWar2 through gdb then the problem no longer reproduces. (Yes I know gdb isn't the optimal tool for this, but I use what I know)

Offline x4000

  • Chris Park, Arcen Games Founder and Lead Designer
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 31,002
Haha, cheers.  Hopefully there will be more modders taking an interest after a certain point, but anyway they'll all be following in your things on your feet at this point.  :D
Have ideas or bug reports for one of our games?  Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline keith.lamothe

  • Arcen Games Staff
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 19,504
And I like the look of these changes, though after glancing through the changelog I no longer have the desire to read the word "this" anymore. For a long time.
Haha, sorry, I didn't know you looked through it at that detail. I told ReSharper to make the references consistent, so it did.

Quote
And now for my bug reports du jour. While the mouseover text for the resource bar works again now, scrolling the screen up by using the mouse (ie putting the mouse at the top of the window in the hopes of changing the section of planet/galaxy I am looking at) no longer works. This was happening in an earlier release too, though once the tooltips for the resource bar stopped working you could scroll properly. Current workaround: set the UI Scaling to < 1 and then scroll at the edge of the screen where the resource bar isn't anymore.
Hmm, ok. Well, I'll try having the mousehandling part of the resource bar not go quite all the way to the top of the screen.

You can test this locally by going into KDL_UIWindows.xml and replacing:

Code: [Select]
<element prefab_lookup_name="SimpleWindowBackground" x="-10" width="120" height="9" type_name="tBackground" />
<element prefab_lookup_name="BasicMousehandlingText" width="11" height="3" font_size="11" type_name="tTime_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" y="3" width="11" height="3" font_size="11" type_name="tTime_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" y="6" width="11" height="3" font_size="11" type_name="tTime_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" width="12" height="3" font_size="11" type_name="tMetal_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" y="3" width="12" height="3" font_size="11" type_name="tMetal_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" y="6" width="12" height="3" font_size="11" type_name="tMetal_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" width="11" height="3" font_size="11" type_name="tFuel_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" y="3" width="11" height="3" font_size="11" type_name="tFuel_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" y="6" width="11" height="3" font_size="11" type_name="tFuel_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" width="11" height="3" font_size="11" type_name="tPower_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" y="3" width="11" height="3" font_size="11" type_name="tPower_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" y="6" width="11" height="3" font_size="11" type_name="tPower_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" width="11" height="3" font_size="11" type_name="tScience_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" y="3" width="11" height="3" font_size="11" type_name="tScience_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" y="6" width="11" height="3" font_size="11" type_name="tScience_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" width="11" height="3" font_size="11" type_name="tHacking_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" y="3" width="11" height="3" font_size="11" type_name="tHacking_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" y="6" width="11" height="3" font_size="11" type_name="tHacking_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" width="11" height="3" font_size="11" type_name="tAIProgress_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" y="3" width="11" height="3" font_size="11" type_name="tAIProgress_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" y="6" width="11" height="3" font_size="11" type_name="tAIProgress_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" width="11" height="3" font_size="11" type_name="tThreat_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" y="3" width="11" height="3" font_size="11" type_name="tThreat_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" y="6" width="11" height="3" font_size="11" type_name="tThreat_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" width="11" height="3" font_size="11" type_name="tAttack_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" y="3" width="11" height="3" font_size="11" type_name="tAttack_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" y="6" width="11" height="3" font_size="11" type_name="tAttack_BottomLine" />

with:

Code: [Select]
<element prefab_lookup_name="SimpleWindowBackground" x="-10" width="120" height="10" type_name="tBackground" />
<element prefab_lookup_name="BasicMousehandlingText" y="1" width="11" height="3" font_size="11" type_name="tTime_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" y="4" width="11" height="3" font_size="11" type_name="tTime_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" y="7" width="11" height="3" font_size="11" type_name="tTime_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" y="1" width="12" height="3" font_size="11" type_name="tMetal_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" y="4" width="12" height="3" font_size="11" type_name="tMetal_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="11.0" y="7" width="12" height="3" font_size="11" type_name="tMetal_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" y="1" width="11" height="3" font_size="11" type_name="tFuel_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" y="4" width="11" height="3" font_size="11" type_name="tFuel_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="23.0" y="7" width="11" height="3" font_size="11" type_name="tFuel_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" y="1" width="11" height="3" font_size="11" type_name="tPower_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" y="4" width="11" height="3" font_size="11" type_name="tPower_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="34.0" y="7" width="11" height="3" font_size="11" type_name="tPower_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" y="1" width="11" height="3" font_size="11" type_name="tScience_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" y="4" width="11" height="3" font_size="11" type_name="tScience_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="45.0" y="7" width="11" height="3" font_size="11" type_name="tScience_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" y="1" width="11" height="3" font_size="11" type_name="tHacking_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" y="4" width="11" height="3" font_size="11" type_name="tHacking_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="56.0" y="7" width="11" height="3" font_size="11" type_name="tHacking_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" y="1" width="11" height="3" font_size="11" type_name="tAIProgress_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" y="4" width="11" height="3" font_size="11" type_name="tAIProgress_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="67.0" y="7" width="11" height="3" font_size="11" type_name="tAIProgress_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" y="1" width="11" height="3" font_size="11" type_name="tThreat_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" y="4" width="11" height="3" font_size="11" type_name="tThreat_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="78.0" y="7" width="11" height="3" font_size="11" type_name="tThreat_BottomLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" y="1" width="11" height="3" font_size="11" type_name="tAttack_TopLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" y="4" width="11" height="3" font_size="11" type_name="tAttack_MiddleLine" />
<element prefab_lookup_name="BasicMousehandlingText" x="89.0" y="7" width="11" height="3" font_size="11" type_name="tAttack_BottomLine" />

edit: you'll also want to change the window's height="9" to height="10" so that the sidebar and the tooltips bump down appropriately, rather than being slightly overlapped by the resource bar's background.

If you try it, please let me know if it works. It seems to work in my testing.

Quote
If I mess around in the Game Start window for too long (say disabling and reenabling a few factions, looking at a few randomly chosen maps) and then start the game, the Quit button won't work and PerSimStep seems not to be being run (minor factions don't do anything that would require a PerSimStep; Dyson Sphere doesn't spawn, Devourer doesn't pick a new planet to go to, etc). Someone else reported a similar problem. I've seen this on OSX and linux. I think this is the same problem that we were hoping got dealt with in .602 ( "Added warning messages if a long-range-planning thread takes longer than 10 seconds...").

Just at a guess, I'm suspicious of the fact that in Window_GameSetup.cs it will queue a new GameCommand every time an option changes. I added some logging code to report whenever a new GameCommand was queued. It seemed like the more commands that got queued the more likely it was that the Quit button would get stuck (for example, I had poor reproduction rates with 2 changes. Moderate reproduction rates with 3, and so on).
The GameCommand is how it triggers a regeneration of the game, which needs to happen whenever an option is changed (in theory it could just hold it as a pending change and you click a button to regenerate, but inevitably someone will forget and it would need a "pending changes" label showing next to the start button which would be disabled until it was regenerated, etc, etc... more complicated UX). That's so it works in the MP case, since GameCommand's are executed on all machines.

Either way, yes, the problem appears to be in the game getting backed up trying to regenerate the game multiple times in a row. Possibly it's due to the side-threads not properly terminating. I'm a little surprised they're even running before the actual start-game (unpause) command is sent, so maybe it's as simple as making sure they don't run until then.
« Last Edit: December 09, 2017, 12:08:21 PM by keith.lamothe »
Have ideas or bug reports for one of our games? Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline BadgerBadger

  • Hero Member Mark II
  • *****
  • Posts: 821
  • BadgerBadgerBadgerBadger
If I didn't look through your changelogs in that detail I'd hardly be able to do what I do without Intellisense magic ;-)

Your UI Window changes solve the problem, thanks!

It occurs to me that I might be able to implement setting your player-color via the same mechanism as the Intensity settings. Should I give that a try? Or do you have other designs in mind for that code (or you are already doing it). It would probably be easiest to add a new field to Arcen.AIW2.Core.DataForFaction_CustomFieldDefinition_OptionSource for it though, so probably best that you do it.

Lets talk about Wave modifiers now. There are a couple obvious tunables that a player might want to control. 
How much warning you get before a wave hits you
Proposed settings:
No Warnings
Short Warnings:  You are warned 1 minute before the wave hits
Long Warnings: You are warned as soon as the previous wave is dispatched
Medium Warnings: You are warned after 50% of the time between waves has elapsed
Partial Warnings: You are warned, but the warning is only "A wave is coming at X:YY", without telling you the composition, strength or target

I think this should eventually be settable on a per-AI faction basis, but right we don't have support for multiple AI factions (and there's not space in the UI), so I propose sticking them in Options along with "Start with first planet").

Incidentally, I further propose that the AI eventually have access to a structure makes all waves Partial Warning waves; it can be justified in lore as some sort of AI jamming device. Then allow the Nemesis to build these Wave Detection Jammers. Now you have a sidequest; do you destroy the jammer and risk leaving your planets vulnerable to the Nemesis, or do you  live partial wave warnings.

Wave types
Proposed settings:
"Waves can spawn as threat" (disabled by default)
"Waves can spawn at warp gates and travel to the target planet" (disabled by default)
"Waves can spawn directly on target" (enabled by default)
This way you can say "I want waves to spawn only at warp gates" or "I want waves that spawn as threat or directly on the target"

Planning to stick these in Options as well for the moment.

I think also the Nemesis having access to a "All waves spawn as threat" device (in lore: "The Nemesis is hijacking the warp gate network to reroute all incoming waves to its armada") that the player could destroy would be nifty.
« Last Edit: December 09, 2017, 01:39:33 PM by BadgerBadger »

Offline keith.lamothe

  • Arcen Games Staff
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 19,504
It occurs to me that I might be able to implement setting your player-color via the same mechanism as the Intensity settings. Should I give that a try? Or do you have other designs in mind for that code (or you are already doing it).
Yep, that's precisely how I intended to do it :) If you want to do so, I'd be very grateful.

The wave warning options sound fine, and would be good for a variety of players.

Quote
I think this should eventually be settable on a per-AI faction basis
I agree in general, though I wonder whether having it be per-AI is setting us up to need a "duplicate this faction" button so that people aren't having to set up multiple AIs from scratch if they want them all to have the same warning/etc settings. Still, we will want a lot of things to be per-AI, so that's a problem that will come up one way or the other.

Quote
but right we don't have support for multiple AI factions (and there's not space in the UI), so I propose sticking them in Options along with "Start with first planet")
Given that we'd just move it later, and I think there is room now, I suggest just going ahead and putting it on the AI faction setting. If there's not room even now then I'll do the "options that won't fit" support sooner than later. That wouldn't be a bad thing.

Quote
Incidentally, I further propose that the AI eventually have access to a structure makes all waves Partial Warning waves; it can be justified in lore as some sort of AI jamming device. Then allow the Nemesis to build these Wave Detection Jammers. Now you have a sidequest; do you destroy the jammer and risk leaving your planets vulnerable to the Nemesis, or do you  live partial wave warnings.
Yea, that would be interesting. Many players will adopt the "only have one way in" approach, but we'll see how balance works out on that front.

Quote
Wave types
Proposed settings:
"Waves can spawn as threat" (disabled by default)
"Waves can spawn at warp gates and travel to the target planet" (disabled by default)
"Waves can spawn directly on target" (enabled by default)
This way you can say "I want waves to spawn only at warp gates" or "I want waves that spawn as threat or directly on the target"

Planning to stick these in Options as well for the moment.
As with the wave warning stuff, if we're going to have these per-AI eventually I'd like to not put them in Options first. So I suggest just putting them on the AI and I'll rearrange the UI accordingly.


Great stuff :)
Have ideas or bug reports for one of our games? Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline BadgerBadger

  • Hero Member Mark II
  • *****
  • Posts: 821
  • BadgerBadgerBadgerBadger
Okay, here is the ability to change a faction's color! You can add the remaining colours in GameData/Configuration/SpecialFaction/KDL_VanillaEntries.xml at your  convenience. Note that this approach is in principle applicable to any faction, though I am currently only doing it for the humans.

The actual setting of the faction's color in C# is a bit hacky. I just forcibly set it in the human faction's PerSimStep. I'm not entirely sure where the best place to set this is (since it also needs to get set on game re-load), so I suspect you'll want to move it.

Here is a picture and some code. It should be easy to add this code to the other factions (as you see fit) via cut/paste.

It is a pleasure to actually code up one of the first things I asked for in my initial feedback for the game.
« Last Edit: December 09, 2017, 04:32:57 PM by BadgerBadger »

Offline keith.lamothe

  • Arcen Games Staff
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 19,504
Awesome! Thanks :)
Have ideas or bug reports for one of our games? Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!

Offline BadgerBadger

  • Hero Member Mark II
  • *****
  • Posts: 821
  • BadgerBadgerBadgerBadger
So I tried just adding the Color field to the AI as well to make sure having multiple Configs per faction worked. I immediately saw errors like
-----------
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
Stack Trace: System.Collections.Generic.List`1[Arcen.AIW2.Core.DataForFaction_CustomFieldDefinition].get_Item (Int32 index) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:635)
Arcen.AIW2.External.Window_GameSetup+dColorConfig.get_FactionField ()
Arcen.AIW2.External.Window_GameSetup+dColorConfig.OnUpdate ()
Arcen.Universal.ArcenUI_Dropdown.OnUpdate_Subclass () (at C:/vcprojs/arcengames_aiw_ultra/ArcenUniversal/src/ArcenUI/ArcenUI_Dropdown.cs:97)
Arcen.Universal.ArcenUI_Element.UpdateFromUI () (at C:/vcprojs/arcengames_aiw_ultra/ArcenUniversal/src/ArcenUI/ArcenUI_Element.cs:244)
Arcen.Universal.ArcenUI_Window.OnUpdate () (at C:/vcprojs/arcengames_aiw_ultra/ArcenUniversal/src/ArcenUI/ArcenUI_Window.cs:89)
Arcen.Universal.ArcenUI.OnUpdate () (at C:/vcprojs/arcengames_aiw_ultra/ArcenUniversal/src/ArcenUI/ArcenUI.cs:181)
Arcen.Universal.Engine_Universal.OnUpdate () (at C:/vcprojs/arcengames_aiw_ultra/ArcenUniversal/src/Engine_Universal.cs:926)
ArcenGameController.Update () (at C:/vcprojs/arcengames_aiw_ultra/AIW2Unity/Assets/ArcenCode/ArcenGameController.cs:39)

I'm not sure what's up with this; the Color code worked fine for the human faction. At a guess there's some sort of bug with having multiple drop downs for a single faction (or I did something wrong).

Also having multiple config options does not scale well. There are two very long dropdown windows, the second of which stretches nearly past the greyed out box. Given that we will probably want a very large number of AI tunables, this approach isn't going to scale past 2 options. I don't have a great solution to this except perhaps having each faction get 1 or 2 drop downs and then a "Click for all options" button, which brings up a new Tab with all of that faction's options? It sounds like you already have something in mind for the scaling case though.

Edit:
Also, my checkin to add multiple types of Clusters broke ClustersMicrocosm. This version of MapGeneration.cs fixes that.

On a somewhat related node, how would you feel about making ClustersMicrocosm available as an option on Clusters instead of being its own map type? We could do the same for Maze A-D. I'm not sure what your philosophy on such things is, but it feels a bit weird to have 6 items in the list (4 mazes, 2 clusters) representing only 2 classes of maps.
« Last Edit: December 10, 2017, 12:37:45 AM by BadgerBadger »

Offline keith.lamothe

  • Arcen Games Staff
  • Administrator
  • Zenith Council Member Mark III
  • *****
  • Posts: 19,504
Thanks for the initial implementation of the color thing. I redid it to use a new technique that ties directly into a table (the TeamColorDefinition table, in this case), and otherwise patched it up.

There was indeed a bug in how it handled multiple custom fields; some bad bitwise math from me. Fixed now, and now all factions support color picking :)

Put in your patch to clusters-microcosm.

Folding microcosm into clusters is fine with me. Same with Grid/Lattice/Crosshatch/MazeA/B/C/D and other types that are just variations on a theme.

On scaling to multiple config options, yes, it is my plan to have a ui element that "selects" a faction and makes use of the space above to show any and all other options for that faction.

In general faction custom fields are a very different ballgame in the next version; the new implementation of the AIType dropdown (and the similar sub-type dropdown for the special forces faction) is a good place to look for how things were changed. As well as the way the color dropdowns wound up.
Have ideas or bug reports for one of our games? Mantis for Suggestions and Bug Reports. Thanks for helping to make our games better!