package io.vivarium.core;
import io.vivarium.core.processor.Multiplexer;
import io.vivarium.core.processor.ProcessorBlueprint;
import io.vivarium.core.sensor.Compass;
import io.vivarium.core.sensor.CreatureRadar;
import io.vivarium.core.sensor.EnergySensor;
import io.vivarium.core.sensor.FoodRadar;
import io.vivarium.core.sensor.GenderRadar;
import io.vivarium.core.sensor.HealthSensor;
import io.vivarium.core.sensor.PathableRadar;
import io.vivarium.core.sensor.Sensor;
import io.vivarium.serialization.ClassRegistry;
import io.vivarium.serialization.SerializedParameter;
import io.vivarium.serialization.VivariumObject;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@EqualsAndHashCode(callSuper = true)
@ToString
@SuppressWarnings("serial") // Default serialization is never used for a durable store
public class CreatureBlueprint extends VivariumObject
{
static
{
ClassRegistry.getInstance().register(CreatureBlueprint.class);
}
// Physical traits
@SerializedParameter
private double _femaleProportion = 0.6;
@SerializedParameter
private int _maximumAge = 20000;
@SerializedParameter
private int _maximumGestation = 2000;
@SerializedParameter
private int _maximumFood = 2000;
@SerializedParameter
private int _maximumHealth = 2000;
// Energy Uses
@SerializedParameter
private int _breedingFoodRate = -10;
@SerializedParameter
private int _eatingFoodRate = 500;
@SerializedParameter
private int _movingFoodRate = -1;
@SerializedParameter
private int _turningFoodRate = 0;
@SerializedParameter
private int _baseFoodRate = -1;
@SerializedParameter
private int _pregnantFoodRate = -1;
@SerializedParameter
private int _fightingDamageAmount = -50;
@SerializedParameter
private int _fightingFoodRate = -2;
// World Generation
@SerializedParameter
private double _initialGenerationProbability = 0.2;
// Neurology
@SerializedParameter
private Multiplexer _multiplexer = null;
@SerializedParameter
private ProcessorBlueprint[] _processorBlueprints = null;
@SerializedParameter
private int _sensorInputCount;
@SerializedParameter
private int _controllerOutputCount = 7;
@SerializedParameter
private int _memoryUnitCount = 0;
@SerializedParameter
private int _soundChannelCount = 0;
@SerializedParameter
private int _signChannelCount = 0;
// Sensors
@SerializedParameter
private Sensor[] _sensors;
private CreatureBlueprint()
{
}
public double getFemaleThreshold()
{
return _femaleProportion;
}
public int getMaximumAge()
{
return _maximumAge;
}
public int getMaximumFood()
{
return _maximumFood;
}
public int getMaximumHealth()
{
return _maximumHealth;
}
public int getMaximumGestation()
{
return _maximumGestation;
}
public double getInitialGenerationProbability()
{
return this._initialGenerationProbability;
}
public void setInitialGenerationProbability(double probability)
{
this._initialGenerationProbability = probability;
}
public void setMaximumFood(int maximumFood)
{
this._maximumFood = maximumFood;
}
public int getBreedingFoodRate()
{
return _breedingFoodRate;
}
public void setBreedingFoodRate(int breedingFoodRate)
{
_breedingFoodRate = breedingFoodRate;
}
public int getEatingFoodRate()
{
return _eatingFoodRate;
}
public void setEatingFoodRate(int eatingFoodRate)
{
_eatingFoodRate = eatingFoodRate;
}
public int getMovingFoodRate()
{
return _movingFoodRate;
}
public void setMovingFoodRate(int movingFoodRate)
{
_movingFoodRate = movingFoodRate;
}
public int getBaseFoodRate()
{
return _baseFoodRate;
}
public void setBaseFoodRate(int baseFoodRate)
{
_baseFoodRate = baseFoodRate;
}
public int getPregnantFoodRate()
{
return _pregnantFoodRate;
}
public void setPregnantFoodRate(int pregnantFoodRate)
{
_pregnantFoodRate = pregnantFoodRate;
}
public int getFightingDamageAmount()
{
return _fightingDamageAmount;
}
public int getFightingFoodRate()
{
return _fightingFoodRate;
}
public static CreatureBlueprint makeDefault()
{
return makeDefault(0, 0, 0);
}
private static Sensor[] defaultSensors()
{
Sensor[] sensors = new Sensor[7];
sensors[0] = new GenderRadar(0, 0, 0, 0);
sensors[1] = new FoodRadar(0, 1, 0, 0);
sensors[2] = new CreatureRadar(1, 1, 0, 0);
sensors[3] = new PathableRadar(1, 1, 0, 0);
sensors[4] = new EnergySensor();
sensors[5] = new HealthSensor();
sensors[6] = new Compass();
return sensors;
}
public static CreatureBlueprint makeDefault(int memoryCount, int soundChannelCount, int signChannelCount)
{
return makeWithSensors(defaultSensors(), memoryCount, soundChannelCount, signChannelCount);
}
public static CreatureBlueprint makeWithSensors(Sensor[] sensors, int memoryCount, int soundChannelCount,
int signChannelCount)
{
CreatureBlueprint s = new CreatureBlueprint();
s.finalizeSerialization();
s._sensors = sensors;
for (Sensor sensor : sensors)
{
s._sensorInputCount += sensor.getSensorInputCount();
}
s._memoryUnitCount = memoryCount;
s._soundChannelCount = soundChannelCount;
s._signChannelCount = signChannelCount;
s._processorBlueprints = new ProcessorBlueprint[] {
ProcessorBlueprint.makeDefault(s.getMultiplexerInputCount(), s.getMultiplexerOutputCount()) };
s._multiplexer = Multiplexer.makeWithSequentialProcessors(s.getMultiplexerInputCount(),
s.getMultiplexerOutputCount(), s._processorBlueprints);
return s;
}
@Override
public void finalizeSerialization()
{
// Do nothing
}
public static void main(String[] args)
{
System.out.println(CreatureBlueprint.makeDefault());
}
public ProcessorBlueprint[] getProcessorBlueprints()
{
return _processorBlueprints;
}
public void setProcessorBlueprints(ProcessorBlueprint[] processorBlueprints)
{
_processorBlueprints = processorBlueprints;
}
public int getHardProcessorInputs()
{
return _sensorInputCount;
}
public int getHardProcessorOutputs()
{
return _controllerOutputCount;
}
public int getMemoryUnitCount()
{
return this._memoryUnitCount;
}
public int getSoundChannelCount()
{
return this._soundChannelCount;
}
public int getSignChannelCount()
{
return this._signChannelCount;
}
public int getMultiplexerInputCount()
{
return this._sensorInputCount + this._memoryUnitCount + this._soundChannelCount + this._signChannelCount;
}
public int getMultiplexerOutputCount()
{
return this._controllerOutputCount + this._memoryUnitCount + this._soundChannelCount + this._signChannelCount;
}
public Sensor[] getSensors()
{
return _sensors;
}
public Multiplexer getMultiplexer()
{
return _multiplexer;
}
}