Decent. And that image really does look great like that.
To take things a little further if appropriate, and to ensure the variety does not diminish as we go up in Game Stage, it is possible to bring in additional zombies to make up the numbers of empty group lists.
For example, from GS01 to GS40's we consistently see 11 types of regular Grunt Zombie in a list of a possible 14.
However, from GS35 onwards, there are ever decreasing types. In fact, GS97 only shows 5.
The same applies for stronger Grunt Zombie lists there after.
By looking for the most commonly appearing zombie, or simply adding a batch add for all groups, we can ensure these groups maintain variety.
This is just from GS1 to G40's groups since TFP cycle in and out zombies during different waves. 14 possibilities and how often they appear in all Horde Night groups.
zombieJoe appears in 131 groups of 322 possibilities.
zombieNurse appears in 142 groups of 322 possibilities.
zombieUtilityWorker appears in 135 groups of 322 possibilities.
zombieBoe appears in 132 groups of 322 possibilities.
zombieMoe appears in 114 groups of 322 possibilities.
zombieMarlene appears in 120 groups of 322 possibilities.
zombieYo appears in 113 groups of 322 possibilities.
zombieJanitor appears in 149 groups of 322 possibilities.
zombieTomClark appears in 139 groups of 322 possibilities.
zombieSteve appears in 133 groups of 322 possibilities.
zombieDarlene appears in 130 groups of 322 possibilities.
zombiePartyGirl appears in 134 groups of 322 possibilities.
zombieArlene appears in 161 groups of 322 possibilities.
zombieBusinessMan appears in 127 groups of 322 possibilities.
A little later come some of the slightly stronger types.
zombieBiker appears in 137 groups of 322 possibilities.
zombieMaleHazmat appears in 179 groups of 322 possibilities.
zombieSkateboarder appears in 134 groups of 322 possibilities.
zombieFemaleFat appears in 133 groups of 322 possibilities.
zombieLumberjack appears in 122 groups of 322 possibilities.
zombieFatHawaiian appears in 122 groups of 322 possibilities.
zombieBowler appears in 112 groups of 322 possibilities.
zombieSoldier appears in 120 groups of 322 possibilities.
Don't appear during Horde Night, but are still pretty viable.
zombieInmate
zombieLab
zombieWight
We can do additions based on a single zombie type, or simply do a batch add to all groups. This is a batch add.
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="add">
zombieMarlene, .99
zombiePartyGirl, .99
zombieNurse, .99
zombieJoe, .99
zombieSteve, .99
zombieTomClark, .99
zombieBusinessMan, .99
zombieBoe, .99
zombieMaleHazmat, .99
zombieJanitor, .99
zombieMoe, .99
zombieDarlene, .99
zombieYo, .99
zombieUtilityWorker, .99
zombieBiker, .99
zombieLumberjack, .99
zombieFemaleFat, .99
zombieFatHawaiian, .99
zombieBowler, .99
zombieSkateboarder, .99
zombieSoldier, .99
</csv>
And for those terribly empty groups, it could have been applied to an individual entity, but this broad spread servers up the consist variety.
The config dump now looks like this with these additions. The .99 probability was selected because the game doesn't like the same things in the same list. However, it their probability is different it will accept it. This is done by TFP to increase appearances of the Demotion entity.
<entitygroup name="feralHordeStageGS1">
zombieJoe
zombieNurse
zombieUtilityWorker
zombieBoe
zombieMoe
zombieMarlene
zombieYo
zombieJanitor
zombieTomClark
zombieSteve
zombieDarlene
zombiePartyGirl
zombieMarlene, .99
zombiePartyGirl, .99
zombieNurse, .99
zombieJoe, .99
zombieSteve, .99
zombieTomClark, .99
zombieBusinessMan, .99
zombieBoe, .99
zombieMaleHazmat, .99
zombieJanitor, .99
zombieMoe, .99
zombieDarlene, .99
zombieYo, .99
zombieUtilityWorker, .99
zombieBiker, .99
zombieLumberjack, .99
zombieFemaleFat, .99
zombieFatHawaiian, .99
zombieBowler, .99
zombieSkateboarder, .99
zombieSoldier, .99<!--Content CSV manipulated by: "V1_AdenoClassicZombieBM"--></entitygroup>
This gives us GS1070 in the snow and the mix up is all of the Grunts rather than just a couple which is going to be a thing.
Instead of just Tom Clark and Janitor,
<entitygroup name="feralHordeStageGS1070">zombieTomClark
zombieJanitor
zombieMarlene, .99
zombiePartyGirl, .99
zombieNurse, .99
zombieJoe, .99
zombieSteve, .99
zombieTomClark, .99
zombieBusinessMan, .99
zombieBoe, .99
zombieMaleHazmat, .99
zombieJanitor, .99
zombieMoe, .99
zombieDarlene, .99
zombieYo, .99
zombieUtilityWorker, .99
zombieBiker, .99
zombieLumberjack, .99
zombieFemaleFat, .99
zombieFatHawaiian, .99
zombieBowler, .99
zombieSkateboarder, .99
zombieSoldier, .99
<!--Content CSV manipulated by: "V1_AdenoClassicZombieBM"--></entitygroup>
This has been updated for the Github download. It matches the last image you shared for variety very well.
<configs>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">zombieSpider*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">zombieFatCop*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">zombieDemolition*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">animalZombieDog*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">animalDireWolf*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">animalZombieVulture*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">*Feral*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="remove">*Radiated*</csv>
<csv xpath="/entitygroups/entitygroup[starts-with(@name, 'feralHordeStageGS')]/text()" delim="\n" op="add">
zombieMarlene, .99
zombiePartyGirl, .99
zombieNurse, .99
zombieJoe, .99
zombieSteve, .99
zombieTomClark, .99
zombieBusinessMan, .99
zombieBoe, .99
zombieMaleHazmat, .99
zombieJanitor, .99
zombieMoe, .99
zombieDarlene, .99
zombieYo, .99
zombieUtilityWorker, .99
zombieBiker, .99
zombieLumberjack, .99
zombieFemaleFat, .99
zombieFatHawaiian, .99
zombieBowler, .99
zombieSkateboarder, .99
zombieSoldier, .99
</csv>
</configs>
There are other ways of doing things like applying to the single Horde Night Game Stage group, or a single entity, but this is a nice broad coverage which brings in a few stronger ones earlier than expected but nothing major.