/*******************************************************************************
* Copyright (c) 2016 Alex Shapiro - github.com/shpralex
* This program and the accompanying materials
* are made available under the terms of the The MIT License (MIT)
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*******************************************************************************/
package com.sproutlife.model.step;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
import com.sproutlife.Settings;
import com.sproutlife.model.GameModel;
import com.sproutlife.model.echosystem.Cell;
import com.sproutlife.model.echosystem.Organism;
import com.sproutlife.model.seed.BitPattern;
import com.sproutlife.model.seed.Seed;
import com.sproutlife.model.seed.SeedFactory;
import com.sproutlife.model.seed.SymmetricSeed;
import com.sproutlife.model.seed.SeedFactory.SeedType;
import com.sproutlife.model.seed.SeedSproutPattern;
public class RetireAndPruneStep extends Step {
GameModel gameModel;
public RetireAndPruneStep(GameModel gameModel) {
super(gameModel);
}
public void perform() {
//pruneInitialSpinners();
retireOrganisms() ;
pruneRetiredOrganisms();
pruneEmptyOrganisms();
pruneParentTree();
}
/*
* Prune early organisms that only go in circles without reproducing
*/
private void pruneInitialSpinners() {
if (getTime()>10000) {
return;
}
HashSet<Organism> pruneOrgs = new HashSet<Organism>();
pruneOrgs.addAll(getEchosystem().getOrganisms());
for (Organism org : pruneOrgs) {
Organism parent = org.getParent();
boolean hasCousins = false;
for (int i=0;i<15 && parent!=null;i++) {
if (parent.getChildren().size()>1) {
hasCousins = true;
}
parent = parent.getParent();
}
if (!hasCousins && parent!=null) {
getEchosystem().removeOrganism(org);
}
}
}
public void retireOrganisms() {
HashSet<Organism> retireOrgs = new HashSet<Organism>();
retireOrgs.addAll(getOrganisms());
for (Organism o : retireOrgs) {
if (o.getAge()>Math.min(o.lifespan,getSettings().getInt(Settings.MAX_LIFESPAN))) {
getEchosystem().retireOrganism(o);
}
}
}
public void pruneRetiredOrganisms() {
HashSet<Organism> pruneOrgs = new HashSet<Organism>();
pruneOrgs.addAll(getEchosystem().getRetiredOrganisms());
for (Organism org : pruneOrgs) {
if (org.getTimeOfDeath()<getTime()- getEchosystem().getRetirementTimeSpan()) {
getEchosystem().removeRetired(org);
}
}
}
public void pruneEmptyOrganisms() {
getEchosystem().pruneEmptyOrganisms();
}
public void pruneParentTree() {
for (Organism o : getEchosystem().getOrganisms()) {
while (o.getParent()!=null) {
o=o.getParent();
if (!o.isAlive() && (getTime()-o.getTimeOfDeath()>1000)) {
o.setParent(null);
}
}
}
}
}