/*******************************************************************************
* 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.util.Random;
import com.sproutlife.Settings;
import com.sproutlife.model.GameModel;
import com.sproutlife.model.echosystem.Organism;
import com.sproutlife.model.seed.SeedFactory.SeedType;
public class GameStep extends Step {
public static enum StepType {
GAME_STEP,
LIFE_STEP,
SPROUT_STEP,
MUTATION_STEP,
PRUNE_STEP,
COLOR_STEP,
STEP_BUNDLE
}
GameStepListener gameStepListener;
LifeStep lifeStep;
SproutStep sproutStep;
MutationStep mutationStep;
RetireAndPruneStep retireAndPruneStep;
ColorsStep colorsStep;
public GameStep(GameModel gameModel) {
super(gameModel);
lifeStep = new LifeStep(gameModel);
sproutStep = new SproutStep(gameModel);
mutationStep = new MutationStep(gameModel);
retireAndPruneStep = new RetireAndPruneStep(gameModel);
colorsStep = new ColorsStep(gameModel);
//Mutation m = new Mutation(new Point(1,-2),5);
//gameModel.getEchosystem().getOrganisms().iterator().next().getGenetics().addMutation(m);
}
public void perform() {
// initStats();
retireAndPruneStep.perform();
fireStepPerformed(StepType.PRUNE_STEP);
colorsStep.perform();
fireStepPerformed(StepType.COLOR_STEP);
if(getEchosystem().getOrganisms().size()<40) {
if (getTime()%200==0) {
int lifespan = Math.max(16,getEchosystem().getDefaultOrgLifespan());
if (lifespan>getSettings().getInt(Settings.MAX_LIFESPAN)) {
lifespan = 15;
}
getEchosystem().setDefaultOrgLifespan(lifespan+1);
}
}
lifeStep.perform();
fireStepPerformed(StepType.LIFE_STEP);
mutationStep.perform();
fireStepPerformed(StepType.MUTATION_STEP);
sproutStep.setSeedBorder(1);
sproutStep.perform();
fireStepPerformed(StepType.SPROUT_STEP);
updateStats();
fireStepPerformed(StepType.GAME_STEP);
}
/*
* Only expecting one gameStepListener for now, therefore a "set" method
*/
public void setGameStepListener(GameStepListener gameStepListener) {
this.gameStepListener = gameStepListener;
}
private void fireStepPerformed(StepType stepType) {
if (gameStepListener!=null) {
GameStepEvent event = new GameStepEvent(stepType);
gameStepListener.stepPerformed(event);
}
}
private void updateStats() {
getStats().updateSmoothedPopulation();
if (getTime()%100==0) {
getStats().update();
//getStats().printChildEnergy();
}
}
}