package io.vivarium.audit;
import java.util.ArrayList;
import io.vivarium.core.CreatureBlueprint;
import io.vivarium.core.World;
import io.vivarium.serialization.ClassRegistry;
import io.vivarium.serialization.SerializedParameter;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@EqualsAndHashCode(callSuper = true)
@ToString
@SuppressWarnings("serial") // Default serialization is never used for a durable store
public class CensusRecord extends AuditRecord
{
static
{
ClassRegistry.getInstance().register(CensusRecord.class);
}
@SerializedParameter
private AuditBlueprint _auditBlueprint;
@SerializedParameter
private ArrayList<Integer> _recordTicks;
@SerializedParameter
private ArrayList<Integer> _creaturePopulation;
private CensusRecord()
{
}
public CensusRecord(CensusBlueprint auditBlueprint, CreatureBlueprint creatureBlueprint)
{
super(creatureBlueprint);
_auditBlueprint = auditBlueprint;
_creaturePopulation = new ArrayList<>();
_recordTicks = new ArrayList<>();
}
public ArrayList<Integer> getRecordTicks()
{
return _recordTicks;
}
public ArrayList<Integer> getPopulationRecords()
{
return _creaturePopulation;
}
@Override
public void record(World world, int tick)
{
// always record the starting population
if (_creaturePopulation.size() < 1)
{
_recordTicks.add(tick);
_creaturePopulation.add(world.getCount(_trackedCreatureBlueprint));
}
else
{
// Now get the current population and only record the new value if it has changed from the last record
int currentCount = world.getCount(_trackedCreatureBlueprint);
if (_creaturePopulation.get(_creaturePopulation.size() - 1) != currentCount)
{
_recordTicks.add(tick);
_creaturePopulation.add(world.getCount(_trackedCreatureBlueprint));
}
}
}
public static CensusRecord makeUninitialized()
{
return new CensusRecord();
}
}