use of forestry.api.genetics.IGenome in project Binnie by ForestryMC.
the class IsolatorLogic method onFinishTask.
@Override
protected void onFinishTask() {
super.onFinishTask();
final Random rand = this.getMachine().getWorld().rand;
MachineUtil util = this.getUtil();
final ISpeciesRoot root = AlleleManager.alleleRegistry.getSpeciesRoot(util.getStack(Isolator.SLOT_TARGET));
if (root == null) {
return;
}
final IIndividual individual = root.getMember(util.getStack(Isolator.SLOT_TARGET));
if (individual == null) {
return;
}
IChromosomeType[] karyotype = root.getKaryotype();
IChromosomeType chromosome = karyotype[rand.nextInt(karyotype.length)];
IGenome genome = individual.getGenome();
IAllele allele = rand.nextBoolean() ? genome.getActiveAllele(chromosome) : genome.getInactiveAllele(chromosome);
Gene gene = Gene.create(allele, chromosome, root);
final ItemStack serum = ItemSequence.create(gene);
util.setStack(Isolator.SLOT_RESULUT, serum);
util.decreaseStack(Isolator.SLOT_SEQUENCER_VIAL, 1);
if (rand.nextFloat() < TARGET_LOSS_CHANCE) {
util.decreaseStack(Isolator.SLOT_TARGET, 1);
}
util.drainTank(Isolator.TANK_ETHANOL, ETHANOL_PER_PROCESS);
}
use of forestry.api.genetics.IGenome in project Binnie by ForestryMC.
the class InoculatorLogic method isValidSerum.
@Nullable
public ErrorState isValidSerum() {
final ItemStack serum = this.getUtil().getStack(Inoculator.SLOT_SERUM_VIAL);
final ItemStack target = this.getUtil().getStack(Inoculator.SLOT_TARGET);
final IGene[] genes = Engineering.getGenes(serum);
if (genes.length == 0) {
return new ErrorState(GeneticsErrorCode.INVALID_SERUM_NO);
}
if (!genes[0].getSpeciesRoot().isMember(target)) {
return new ErrorState(GeneticsErrorCode.INVALID_SERUM_MISMATCH);
}
final IIndividual individual = genes[0].getSpeciesRoot().getMember(target);
if (individual != null) {
final IGenome genome = individual.getGenome();
for (final IGene gene : genes) {
final IAllele a = genome.getActiveAllele(gene.getChromosome());
final IAllele b = genome.getInactiveAllele(gene.getChromosome());
if (!a.getUID().equals(gene.getAllele().getUID()) || !b.getUID().equals(gene.getAllele().getUID())) {
return null;
}
}
}
return new ErrorState(GeneticsErrorCode.DEFUNCT_SERUM);
}
use of forestry.api.genetics.IGenome in project Binnie by ForestryMC.
the class ToleranceSystem method alter.
public ItemStack alter(final ItemStack stack, final ItemStack acc) {
final Random rand = new Random();
final float effect = this.type.getEffect(acc);
if (rand.nextFloat() > Math.abs(effect)) {
return stack;
}
final IIndividual member = AlleleManager.alleleRegistry.getIndividual(stack);
final IGenome genome = member.getGenome();
final IAlleleTolerance tolAllele = (IAlleleTolerance) genome.getActiveAllele(this.chromosomeType);
final Tolerance tol = Tolerance.get(tolAllele.getValue());
final Tolerance newTol = Acclimatiser.alterTolerance(tol, effect);
if (rand.nextFloat() > 1.0f / (-newTol.getBounds()[0] + newTol.getBounds()[1])) {
return stack;
}
final ISpeciesRoot root = AlleleManager.alleleRegistry.getSpeciesRoot(stack);
boolean setPrimary = rand.nextBoolean();
boolean setSecondary = !setPrimary;
Gene gene = new Gene(newTol.getAllele(), this.chromosomeType, root);
Splicer.setGene(gene, stack, setPrimary, setSecondary);
return stack;
}
Aggregations