public void drawBestParents(BreedingMode breedingMode, bool updateBreedingData = false)
{
SuspendLayout();
Cursor.Current = Cursors.WaitCursor;
ClearControls();
// chosen Creature (only consider this one for its gender)
bool considerChosenCreature = chosenCreature != null;
Gender chosenCG = (considerChosenCreature ? chosenCreature.gender : Gender.Unknown);
labelTitle.Text = currentSpecies + (considerChosenCreature ? " (only pairings with \"" + chosenCreature.name + "\")" : "");
if (females != null && males != null && females.Count > 0 && males.Count > 0)
{
combinedTops[0].Clear();
combinedTops[1].Clear();
comboScore.Clear();
comboOrder.Clear();
double t = 0, tt = 0, pTS = 1;
int o = 0, nrTS = 0;
Int16[] bestPossLevels = new Int16[7]; // best possible levels
for (int f = 0; f < females.Count; f++)
{
if (considerChosenCreature && chosenCG == Gender.Female && females[f] != chosenCreature)
continue;
for (int m = 0; m < males.Count; m++)
{
if (considerChosenCreature && chosenCG == Gender.Male && males[m] != chosenCreature)
continue;
combinedTops[0].Add(f);
combinedTops[1].Add(m);
t = 0;
nrTS = 0; // number of possible top-stats
pTS = 1;
for (int s = 0; s < 7; s++)
{
bestPossLevels[s] = 0;
tt = statWeights[s] * (0.7 * Math.Max(females[f].levelsWild[s], males[m].levelsWild[s]) + 0.3 * Math.Min(females[f].levelsWild[s], males[m].levelsWild[s])) / 40;
if (tt <= 0) { tt = 0; }
else if (breedingMode == BreedingMode.TopStatsLucky)
{
if (females[f].topBreedingStats[s] || males[m].topBreedingStats[s])
{
if (females[f].topBreedingStats[s] && males[m].topBreedingStats[s])
tt *= 1.142;
}
else if (bestLevels[s] > 0)
tt *= .01;
}
else if (breedingMode == BreedingMode.TopStatsConservative && bestLevels[s] > 0)
{
bestPossLevels[s] = (Int16)Math.Max(females[f].levelsWild[s], males[m].levelsWild[s]);
tt *= .01;
if (females[f].topBreedingStats[s] || males[m].topBreedingStats[s])
{
nrTS++;
pTS *= ((females[f].topBreedingStats[s] && males[m].topBreedingStats[s]) ? 1 : 0.7);
}
}
t += tt;
}
if (breedingMode == BreedingMode.TopStatsConservative)
{
if (females[f].topStatsCountBP < nrTS && males[m].topStatsCountBP < nrTS)
t += nrTS * pTS;
else
t += .1 * nrTS * pTS;
// check if the best possible stat outcome already exists in a male
bool maleExists = false;
foreach (Creature cr in males)
{
maleExists = true;
for (int s = 0; s < 7; s++)
{
if (cr.levelsWild[s] != bestPossLevels[s])
{
maleExists = false;
break;
}
}
if (maleExists)
break;
}
if (maleExists)
t *= .2; // another male with the same stats is not worth much
else
{
// check if the best possible stat outcome already exists in a female
bool femaleExists = false;
foreach (Creature cr in females)
{
femaleExists = true;
for (int s = 0; s < 7; s++)
{
if (cr.levelsWild[s] != bestPossLevels[s])
{
femaleExists = false;
break;
}
}
if (femaleExists)
break;
}
if (femaleExists)
t *= .5; // another female with the same stats may be useful, but not so much in conservative breeding
}
t *= 2; // scale conservative mode as it rather displays improvement, but only scarcely
}
comboScore.Add(t * 1.25);
comboOrder.Add(o++);
}
}
comboOrder = comboOrder.OrderByDescending(c => comboScore[c]).ToList();
// draw best parents
int row = 0;
// scrolloffsets
int xS = AutoScrollPosition.X;
int yS = AutoScrollPosition.Y;
PedigreeCreature pc;
Bitmap bm;
Graphics g;
PictureBox pb;
for (int i = 0; i < maxSuggestions && i < comboOrder.Count; i++)
{
pc = new PedigreeCreature(females[combinedTops[0][comboOrder[i]]], enabledColorRegions, comboOrder[i]);
pc.Location = new Point(10 + xS, 5 + 35 * row + yS);
pc.CreatureClicked += new PedigreeCreature.CreatureChangedEventHandler(CreatureClicked);
pc.CreatureEdit += new PedigreeCreature.CreatureEditEventHandler(CreatureEdit);
pc.BPRecalc += new BPRecalcEventHandler(BPRecalc);
pc.BestBreedingPartners += new PedigreeCreature.CreaturePartnerEventHandler(BestBreedingPartners);
panelCombinations.Controls.Add(pc);
pcs.Add(pc);
pc = new PedigreeCreature(males[combinedTops[1][comboOrder[i]]], enabledColorRegions, comboOrder[i]);
pc.Location = new Point(350 + xS, 5 + 35 * row + yS);
pc.CreatureClicked += new PedigreeCreature.CreatureChangedEventHandler(CreatureClicked);
pc.CreatureEdit += new PedigreeCreature.CreatureEditEventHandler(CreatureEdit);
pc.BPRecalc += new BPRecalcEventHandler(BPRecalc);
pc.BestBreedingPartners += new PedigreeCreature.CreaturePartnerEventHandler(BestBreedingPartners);
panelCombinations.Controls.Add(pc);
pcs.Add(pc);
// draw score
pb = new PictureBox();
pbs.Add(pb);
panelCombinations.Controls.Add(pb);
pb.Size = new Size(87, 15);
pb.Location = new Point(261 + xS, 19 + 35 * row + yS);
bm = new Bitmap(pb.Width, pb.Height);
g = Graphics.FromImage(bm);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
Brush br = new SolidBrush(Utils.getColorFromPercent((int)(comboScore[comboOrder[i]] * 12.5), 0.5));
Brush brd = new SolidBrush(Utils.getColorFromPercent((int)(comboScore[comboOrder[i]] * 12.5), -.2));
g.FillRectangle(brd, 0, 5, 87, 5);
g.FillRectangle(brd, 20, 0, 47, 15);
g.FillRectangle(br, 1, 6, 85, 3);
g.FillRectangle(br, 21, 1, 45, 13);
g.DrawString(comboScore[comboOrder[i]].ToString("N4"), new System.Drawing.Font("Microsoft Sans Serif", 8.25f), new System.Drawing.SolidBrush(System.Drawing.Color.Black), 24, 2);
pb.Image = bm;
g.Dispose();
row++;
}
if (updateBreedingData)
setBreedingData(currentSpecies);
if (comboOrder.Count > 0)
setParents(comboOrder[0]);
else
setParents(-1);
}
else
{
labelInfo.Text = "No possible pairings found for " + currentSpecies + ". Make sure at least one female and male are available in your library.";
labelInfo.Visible = true;
if (updateBreedingData)
setBreedingData(currentSpecies);
}
Cursor.Current = Cursors.Default;
ResumeLayout();
}