private void calculateTopStats(List<Creature> creatures)
{
toolStripProgressBar1.Value = 0;
toolStripProgressBar1.Maximum = Values.V.speciesNames.Count();
toolStripProgressBar1.Visible = true;
Int32[] bestStat;
List<Creature>[] bestCreatures;
bool noCreaturesInThisSpecies;
int specInd;
foreach (string species in Values.V.speciesNames)
{
specInd = Values.V.speciesNames.IndexOf(species);
toolStripProgressBar1.Value++;
bestStat = new Int32[] { -1, -1, -1, -1, -1, -1, -1, -1 };
bestCreatures = new List<Creature>[Enum.GetNames(typeof(StatName)).Count()];
noCreaturesInThisSpecies = true;
foreach (Creature c in creatures)
{
if (c.species != species)
continue;
noCreaturesInThisSpecies = false;
// reset topBreeding stats for this creature
c.topBreedingStats = new bool[8];
c.topBreedingCreature = false;
// if not available, continue
if (c.status != CreatureStatus.Available)
continue;
for (int s = 0; s < Enum.GetNames(typeof(StatName)).Count(); s++)
{
if (c.levelsWild[s] == bestStat[s] && c.levelsWild[s] > 0)
{
bestCreatures[s].Add(c);
}
else if (c.levelsWild[s] > bestStat[s])
{
bestCreatures[s] = new List<Creature>();
bestCreatures[s].Add(c);
bestStat[s] = c.levelsWild[s];
}
}
}
if (noCreaturesInThisSpecies)
{
continue;
}
if (!topStats.ContainsKey(species))
{
topStats.Add(species, bestStat);
}
// beststat and bestcreatures now contain the best stats and creatures for each stat.
// set topness of each creature (== mean wildlevels/mean top wildlevels in permille)
int sumTopLevels = 0, sumCreatureLevels;
for (int s = 0; s < 8; s++)
{
if (considerStatHighlight[s])
sumTopLevels += bestStat[s];
}
if (sumTopLevels > 0)
{
foreach (Creature c in creatures)
{
if (c.species != species)
continue;
sumCreatureLevels = 0;
for (int s = 0; s < 8; s++)
{
if (considerStatHighlight[s])
sumCreatureLevels += c.levelsWild[s];
}
c.topness = (Int16)(100 * sumCreatureLevels / sumTopLevels);
}
}
// if any male is in more than 1 category, remove any male from the topBreedingCreatures that is not top in at least 2 categories himself
for (int s = 0; s < Enum.GetNames(typeof(StatName)).Count(); s++)
{
if (bestCreatures[s] == null || bestCreatures[s].Count == 0)
{
continue; // no creature has levelups in this stat or the stat is not used for this species
}
if (bestCreatures[s].Count == 1)
{
bestCreatures[s][0].topBreedingCreature = true;
continue;
}
for (int c = 0; c < bestCreatures[s].Count; c++)
{
bestCreatures[s][c].topBreedingCreature = true;
if (bestCreatures[s][c].gender != Gender.Male)
continue;
Creature currentCreature = bestCreatures[s][c];
// check how many best stat the male has
int maxval = 0;
for (int cs = 0; cs < Enum.GetNames(typeof(StatName)).Count(); cs++)
{
if (currentCreature.levelsWild[cs] == bestStat[cs])
maxval++;
}
if (maxval > 1)
{
// check now if the other males have only 1.
for (int oc = 0; oc < bestCreatures[s].Count; oc++)
{
if (bestCreatures[s][oc].gender != Gender.Male)
continue;
if (oc == c)
continue;
Creature otherMale = bestCreatures[s][oc];
int othermaxval = 0;
for (int ocs = 0; ocs < Enum.GetNames(typeof(StatName)).Count(); ocs++)
{
if (otherMale.levelsWild[ocs] == bestStat[ocs])
othermaxval++;
}
if (othermaxval == 1)
bestCreatures[s][oc].topBreedingCreature = false;
}
}
}
}
if (noCreaturesInThisSpecies)
{
continue;
}
// now we have a list of all candidates for breeding. Iterate on stats.
for (int s = 0; s < Enum.GetNames(typeof(StatName)).Count(); s++)
{
if (bestCreatures[s] != null)
{
for (int c = 0; c < bestCreatures[s].Count; c++)
{
// flag topstats in creatures
bestCreatures[s][c].topBreedingStats[s] = true;
}
}
}
foreach (Creature c in creatures)
c.setTopStatCount(considerStatHighlight);
}
toolStripProgressBar1.Visible = false;
}