@Nullable private static IChromosome[] mutateSpecies(World world, IButterflyNursery nursery, IGenome genomeOne, IGenome genomeTwo) { IChromosome[] parent1 = genomeOne.getChromosomes(); IChromosome[] parent2 = genomeTwo.getChromosomes(); IGenome genome0; IGenome genome1; IAllele allele0; IAllele allele1; if (rand.nextBoolean()) { allele0 = parent1[EnumButterflyChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = parent2[EnumButterflyChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeOne; genome1 = genomeTwo; } else { allele0 = parent2[EnumButterflyChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = parent1[EnumButterflyChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeTwo; genome1 = genomeOne; } for (IButterflyMutation mutation : ButterflyManager.butterflyRoot.getMutations(true)) { float chance = mutation.getChance(world, nursery, allele0, allele1, genome0, genome1); if (chance > rand.nextFloat() * 100) { return ButterflyManager.butterflyRoot.templateAsChromosomes(mutation.getTemplate()); } } return null; }
@Override public boolean isGeneticEqual(IGenome other) { IChromosome[] genetics = other.getChromosomes(); if (chromosomes.length != genetics.length) { return false; } for (int i = 0; i < chromosomes.length; i++) { IChromosome chromosome = chromosomes[i]; IChromosome otherChromosome = genetics[i]; if (chromosome == null && otherChromosome == null) { continue; } if (chromosome == null || otherChromosome == null) { return false; } if (!chromosome.getPrimaryAllele().getUID().equals(otherChromosome.getPrimaryAllele().getUID())) { return false; } if (!chromosome.getSecondaryAllele().getUID().equals(otherChromosome.getSecondaryAllele().getUID())) { return false; } } return true; }
@Override public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) { if (this.isInCreativeTab(tab)) { for (ISpeciesRoot root : AlleleManager.alleleRegistry.getSpeciesRoot().values()) { for (IIndividual template : root.getIndividualTemplates()) { if (template.getGenome().getPrimary().isSecret()) { continue; } IGeneItem geneItem = new GeneArrayItem(); for (IChromosomeType type : root.getKaryotype()) { IChromosome chromosome = template.getGenome().getChromosomes()[type.ordinal()]; if (chromosome != null) { IAllele active = chromosome.getActiveAllele(); geneItem.addGene(new Gene(active, type, root)); } } ItemStack array = new ItemStack(this); geneItem.writeToItem(array); items.add(array); } } } }
IIndividual original = speciesRoot.getMember(target); Preconditions.checkNotNull(original); IChromosome[] chromosomes = original.getGenome().getChromosomes(); IAllele[] primaryAlleles = new IAllele[chromosomes.length]; IAllele[] secondaryAlleles = new IAllele[chromosomes.length];