private List<int> determineDinoRaceFromStats(float[] stats, string name)
{
List<int> possibleDinos = new List<int>();
// for wild dinos, we can get the name directly.
System.Globalization.TextInfo textInfo = new System.Globalization.CultureInfo("en-US", false).TextInfo;
name = textInfo.ToTitleCase(name.ToLower());
int sI = Values.V.speciesNames.IndexOf(name);
if (sI >= 0)
{
possibleDinos.Add(sI);
return possibleDinos;
}
double baseValue;
double incWild;
double possibleLevel;
bool possible;
for (int i = 0; i < Values.V.species.Count; i++)
{
possible = true;
// check that all stats are possible (no negative levels)
for (int s = 7; s >= 0; s--)
{
baseValue = Values.V.species[i].stats[s].BaseValue;
incWild = Values.V.species[i].stats[s].IncPerWildLevel;
if (incWild > 0)
{
//possibleLevel = ((statIOs[s].Input - Values.V.species[i].stats[s].AddWhenTamed) - baseValue) / (baseValue * incWild); // this fails if creature is wild
possibleLevel = (statIOs[s].Input - baseValue) / (baseValue * incWild);
if (possibleLevel < 0)
{
possible = false;
break;
}
}
}
if (!possible)
continue;
// check that torpor is integer
baseValue = Values.V.species[i].stats[7].BaseValue;
incWild = Values.V.species[i].stats[7].IncPerWildLevel;
possibleLevel = ((statIOs[7].Input - Values.V.species[i].stats[7].AddWhenTamed) - baseValue) / (baseValue * incWild);
double possibleLevelWild = (statIOs[7].Input - baseValue) / (baseValue * incWild);
if (possibleLevelWild < 0 || Math.Round(possibleLevel, 3) > (double)numericUpDownLevel.Value - 1 || (Math.Round(possibleLevel, 3) % 1 > 0.001 && Math.Round(possibleLevelWild, 3) % 1 > 0.001))
continue;
bool likely = true;
// food and oxygen are stats that are unlikely to be levelled for most dinos, so let's order the possibilities with those first
/*
baseValue = Stats.statValue(i, 3).BaseValue;
incWild = Stats.statValue(i, 3).IncPerWildLevel;
possibleLevel = ((statIOs[3].Input - Stats.statValue(i, 3).AddWhenTamed) - baseValue) / (baseValue * incWild);
if (possibleLevel < 0 || possibleLevel > (double)numericUpDownLevel.Value - 1)
continue;
if (possibleLevel != (int)possibleLevel)
likely = false;
*/
// now oxygen
baseValue = Values.V.species[i].stats[4].BaseValue;
incWild = Values.V.species[i].stats[4].IncPerWildLevel;
possibleLevel = ((statIOs[4].Input - Values.V.species[i].stats[4].AddWhenTamed) - baseValue) / (baseValue * incWild);
if (possibleLevel < 0 || possibleLevel > (double)numericUpDownLevel.Value - 1)
continue;
if (Math.Round(possibleLevel, 3) != (int)possibleLevel || possibleLevel > (double)numericUpDownLevel.Value / 2)
likely = false;
if (statIOs[4].Input != 0 && baseValue == 0)
likely = false; // having an oxygen value for non-oxygen dino is a disqualifier
if (likely)
possibleDinos.Insert(0, i);
else
possibleDinos.Add(i);
}
return possibleDinos;
}