package io.vivarium.audit; 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 BreedingPatternRecord extends AuditRecord { static { ClassRegistry.getInstance().register(BreedingPatternRecord.class); } // The action tally is a 4x dimensional counter of breeding actions. // index 1 generation (numeric, index is generation-1) // index 2 gender of 'first' partner (0 is male, 1 is female, 2 is pregnant female) // index 3 gender of 'second' partner (0 is male, 1 is female, 2 is pregnant female, 3 is none) // index 4 success (0 is failure, 1 is success) @SerializedParameter int[][][][] _tally = new int[16][3][4][2]; protected BreedingPatternRecord() { } protected BreedingPatternRecord(CreatureBlueprint creatureBlueprint) { super(creatureBlueprint); } @Override public void record(World world, int tick) { // TODO: FIX THIS } public int getMaximumGeneration() { int maximumGeneration = 0; generation: for (int i = 0; i < _tally.length; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { for (int l = 0; l < 2; l++) { if (_tally[i][j][k][l] > 0) { maximumGeneration = i; continue generation; } } } } } return maximumGeneration + 1; } public int getRecord(int generation, BreedingGender creature, BreedingGender targetCreature, boolean wasSuccessful) { return _tally[generation - 1][creature.index][targetCreature.index][wasSuccessful ? 1 : 0]; } public static enum BreedingGender { MALE(0), FEMALE(1), PREGNANT(2), NONE(3); public final int index; BreedingGender(int index) { this.index = index; } } }