private void incubate()
{
foreach (string organismID in _organismIDList)
{
OrganismState organismState = _newWorldState.GetOrganismState(organismID);
if (organismState == null || !organismState.IsAlive || !organismState.IsIncubating) continue;
if (organismState.IncubationTicks == EngineSettings.TicksToIncubate)
{
Point newPosition = findEmptyPosition(organismState.CellRadius, Point.Empty);
if (newPosition != Point.Empty)
{
// Only birth an organism if there is space
NewOrganism newOrganism = new NewOrganism(
((Species) organismState.Species).InitializeNewState(newPosition,
organismState.Generation + 1),
(organismState.CurrentReproduceAction.Dna == null)
? (new byte[0])
: ((byte[]) organismState.CurrentReproduceAction.Dna.Clone()));
_newOrganismQueue.Enqueue(newOrganism);
}
else
{
// Kill the organism since there is no place to put it
OnEngineStateChanged(new EngineStateChangedEventArgs(EngineStateChangeType.Other,
"A '" +
((Species) organismState.Species).Name +
"' died during birth: couldn't find an open spot quickly enough."));
}
organismState.OrganismEvents.ReproduceCompleted =
new ReproduceCompletedEventArgs(organismState.CurrentReproduceAction.ActionID,
organismState.CurrentReproduceAction);
organismState.ResetReproductionWait();
organismState.CurrentReproduceAction = null;
}
else
{
// Only incubate if the organism isn't hungry
if (organismState.EnergyState >= EnergyState.Normal)
{
if (organismState is AnimalState)
{
organismState.BurnEnergy(organismState.Radius*
EngineSettings.AnimalIncubationEnergyPerUnitOfRadius);
}
else
{
Debug.Assert(organismState is PlantState);
organismState.BurnEnergy(organismState.Radius*
EngineSettings.PlantIncubationEnergyPerUnitOfRadius);
}
organismState.AddIncubationTick();
}
}
}
}