When are these metrics updated? Never? Per wave? Per mob death?
If they aren't updated, then you having to deal with creep metrics that are independent of the player's tower choices. For example, creeps facing a player whom uses poison towers (low tick damage that is unblockable) versus a player who uses high damage low firing rate weapons. If they are updated, then when are they updated? If it is after every creep death, then doesn't that require a creep to be spawned to get an "evaluation" to be spawned again. If a creep is marked to be very bad in its metrics initially, then it has a very low chance of being spawned again. Thus allowing the player to switch tower arrangements to be more efficient, given that they can manipulate the spawning logic. If you do some sort of universal per wave manipulations, then have to abstract out many things, for example, how effective an AOE healer creep is. I'm not sure that is very viable either.
The basic plan is to be running some evaluation tests in the background between waves while the player is building towers. So while the creeps will always be compared against what the player's doing the information will be out of date slightly (depending on how many waves in the future the plans are for (undetermined yet) as well as explicitly not taking into account what towers the player
just built) the game is reacting to them.
Creeps will be continually generated and having their metrics scored. There's little to no need to worry about having a creep get devalued and "never spawned again" as there's not going to be much "ongoing memory of what we tried before." Just "here's 30 random results, score them." They might be the same, they might be different. Next time we score, we throw out everything we have and start from scratch. Or I might throw out the "oldest 30" and generate a new 30 and score a running collection of 90.*
*How many I can score at a given time isn't known yet. Based on
previous experience I should be able to simulate an entire wave in a few fractions of a second. I'll have to refactor some code from what I have right now, but I'm prepared to do that.
Bear in mind that the performance of a creep type may vary wildly with the types of other creeps in the wave and the ordering.
I am certainly aware! Just that there isn't a simple method of testing for stuff like that. Changing one factor can completely throw a wrench in what worked well, so figuring out why a given mix worked is an impossible task, programmatically.
Also, varying the weighting of metrics from wave to wave can assist in procedurally finding the "chinks" in the player's defenses. Like going for 100% Distance-Traveled one wave, and 100% Damage-Taken in the next. And maybe in the one after that starting with a group of Damage-Taken creeps, followed by a group of Damage-To-Towers creeps, followed by a group of Distance-Traveled creeps.
That's why I want
at least six different metrics.
The point is to only send 2 to 4 different creep types per wave, so with six metrics, that does exactly that. As well as mixing up the order. In a multi-path map, while you'll be getting creep types A, B, and C the different paths might get them in a
different order. ABC vs. CAB vs. BCA.
Another survival-oriented-metric might be "time-on-target absorbed", in other words, how much dedicated attention from towers that creep took up before it died. So if a single-target tower with a 0.5 second reload fired 3 shots at it, that's 1.5s total. If it took 2 such towers, then 3s, and so on. Possibly with multipliers for the total resource cost of the tower. AOE towers might not count towards this at all, depending on the mechanic involved and whether it can really be saturated or not.
Ahh, good good. I think that might end up being some kind of hybrid between "damage taken" and "damage avoided" but it is a different score. Worth seeing the results to determine if its a useful metric at the very least.
Another metric which seems weaker but might fill out the set is "time alive". That's less important than distance traveled or how much tower time it soaked, but it helps catch creep types that are surviving by not being eligible for incoming fire, and even aside from that sometimes you can throw a player off by just having a lot of creeps still in the maze, etc.
That one might be a hard metric to actually test for, but I'm writing it down none the less. It's definitely a metric that depends on other creeps being around. I'll think on how to test for that. Might end up being tested during a wave, so that it's a creep that shows up from the last wave based on that metric, while the others get shuffled about.
Another thing which you might measure predictively rather than experientially is "is this creep type vulnerable to any of the towers covering the first X distance-units of the path?". In the sense of those towers getting a multiplier or whatever. A combination of low-vulnerability and damage-to-towers could make a good pick-style for the first group of maybe 20% of waves.
Multipliers are based on an elemental system: water beats fire beats wood, etc. Elemental types won't be considered during the testing phase anyway, as that'll be a modifier that will get applied to the group such that a given group isn't always the same elemental type. So you'll get "Fire bruisers" and "water bruisers" in the same miniwave, and while that'll give the creeps slightly different stats (fire increasing damage, earth creeps having more health) it'll provide a mix of elements to fill that particular role.
I'm also pondering a modifier based on what metric is scored well at. So the creeps that get a good score in Distance Traveled and are chosen as the "fast creep" (regardless of their actual speed value) might get a modifier that boosts their armor, allowing them to survive just a
little longer. "Damage dealt" creeps might get a boost to their speed, allowing them to get to a target sooner. And so on, the modifier not directly effecting the attribute primarily responsible for the high score in the metric (so "damage taken" doesn't get a boost to HP) but still allows them to perform better in the category.