Package forestry.core.gui

Source Code of forestry.core.gui.GuiAlyzer

/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.core.gui;

import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IAlleleTolerance;
import forestry.api.genetics.IBreedingTracker;
import forestry.api.genetics.IClassification;
import forestry.api.genetics.IClassification.EnumClassLevel;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IMutation;
import forestry.api.genetics.ISpeciesRoot;
import forestry.core.config.Defaults;
import forestry.core.gadgets.TileForestry;
import forestry.core.genetics.EnumMutateChance;
import forestry.core.proxy.Proxies;
import forestry.core.utils.StringUtil;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import org.apache.commons.lang3.StringUtils;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Stack;

public abstract class GuiAlyzer extends GuiForestry<TileForestry> {

  protected static final int COLUMN_0 = 12;
  protected static final int COLUMN_1 = 85;
  protected static final int COLUMN_2 = 150;

  protected IInventory inventory;
  protected ISpeciesRoot speciesRoot;
  protected IBreedingTracker breedingTracker;

  protected String guiName;

  protected HashMap<String, ItemStack> iconStacks = new HashMap<String, ItemStack>();

  public GuiAlyzer(ISpeciesRoot speciesRoot, EntityPlayer player, ContainerForestry container, IInventory inventory, int pageMax, int pageSize) {
    super(Defaults.TEXTURE_PATH_GUI + "/beealyzer2.png", container);

    xSize = 246;
    ySize = 238;

    this.inventory = inventory;
    this.speciesRoot = speciesRoot;
    this.breedingTracker = speciesRoot.getBreedingTracker(player.worldObj, player.getGameProfile());
  }

  protected final int getColorCoding(boolean dominant) {
    if (dominant)
      return fontColor.get("gui.beealyzer.dominant");
    else
      return fontColor.get("gui.beealyzer.recessive");
  }

  protected final void drawLine(String text, int x, IIndividual individual, Enum<?> chromosome, boolean inactive) {
    if (!inactive)
      drawLine(text, x, getColorCoding(individual.getGenome().getActiveAllele(chromosome.ordinal()).isDominant()));
    else
      drawLine(text, x, getColorCoding(individual.getGenome().getInactiveAllele(chromosome.ordinal()).isDominant()));
  }

  protected final void drawSplitLine(String text, int x, int maxWidth, IIndividual individual, Enum<?> chromosome, boolean inactive) {
    if (!inactive)
      drawSplitLine(text, x, maxWidth, getColorCoding(individual.getGenome().getActiveAllele(chromosome.ordinal()).isDominant()));
    else
      drawSplitLine(text, x, maxWidth, getColorCoding(individual.getGenome().getInactiveAllele(chromosome.ordinal()).isDominant()));
  }

  protected final void drawRow(String text0, String text1, String text2, IIndividual individual, Enum<?> chromosome) {
    drawRow(text0, text1, text2, fontColor.get("gui.screen"), getColorCoding(individual.getGenome().getActiveAllele(chromosome.ordinal()).isDominant()),
        getColorCoding(individual.getGenome().getInactiveAllele(chromosome.ordinal()).isDominant()));
  }

  protected final void drawSpeciesRow(String text0, IIndividual individual, Enum<?> chromosome, String customPrimaryName, String customSecondaryName) {
    IAlleleSpecies primary = individual.getGenome().getPrimary();
    IAlleleSpecies secondary = individual.getGenome().getSecondary();

    drawLine(text0, column0);
    int columnwidth = column2 - column1 - 16;

    RenderHelper.enableStandardItemLighting();
    drawItemStack(iconStacks.get(primary.getUID()), adjustToFactor(guiLeft + column1 + columnwidth - 4), adjustToFactor(guiTop + getLineY()));
    drawItemStack(iconStacks.get(secondary.getUID()), adjustToFactor(guiLeft + column2 + columnwidth - 2), adjustToFactor(guiTop + getLineY()));
    RenderHelper.disableStandardItemLighting();

    String primaryName;
    String secondaryName;

    primaryName = customPrimaryName == null ? primary.getName() : customPrimaryName;
    secondaryName = customSecondaryName == null ? secondary.getName() : customSecondaryName;

    drawSplitLine(primaryName, column1, columnwidth, individual, chromosome, false);
    drawSplitLine(secondaryName, column2, columnwidth, individual, chromosome, true);

    newLine();
    newLine();

  }

  protected final void drawSpeciesRow(String text0, IIndividual individual, Enum<?> chromosome){
    drawSpeciesRow(text0, individual, chromosome, null, null);
  }

  protected final String checkCustomName(String key){
    if(StringUtil.canTranslate(key)){
      return StringUtil.localize(key);
    } else {
      return null;
    }
  }

  @Override
  protected void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) {
    super.drawGuiContainerBackgroundLayer(f, mouseX, mouseY);
    widgetManager.clear();
  }

  protected void drawAnalyticsOverview() {

    startPage();

    newLine();
    String title = StringUtil.localize(guiName).toUpperCase();
    drawCenteredLine(title, 8, 208);
    newLine();

    fontRendererObj.drawSplitString(StringUtil.localize(guiName + ".help"), (int) ((guiLeft + COLUMN_0 + 4) * (1 / factor)),
        (int) ((guiTop + 42) * (1 / factor)), (int) (195 * (1 / factor)), fontColor.get("gui.screen"));
    newLine();
    newLine();
    newLine();
    newLine();

    drawLine(StringUtil.localize("gui.alyzer.overview") + ":", COLUMN_0 + 4);
    newLine();
    drawLine("I  : " + StringUtil.localize("gui.general"), COLUMN_0 + 4);
    newLine();
    drawLine("II : " + StringUtil.localize("gui.environment"), COLUMN_0 + 4);
    newLine();
    drawLine("III: " + StringUtil.localize("gui.produce"), COLUMN_0 + 4);
    newLine();
    drawLine("IV : " + StringUtil.localize("gui.evolution"), COLUMN_0 + 4);

    newLine();

    String mode = breedingTracker.getModeName();
    if (mode != null && !mode.isEmpty()) {
      newLine();
      String rules = StringUtil.localize(guiName + ".behaviour") + ": " + StringUtil.capitalize(mode);
      drawCenteredLine(rules, 8, 208, fontColor.get(guiName + ".binomial"));
    }

    endPage();
  }

  protected final void drawAnalyticsPageClassification(IIndividual individual) {

    startPage();

    drawLine(StringUtil.localize("gui.alyzer.classification") + ":", 12);
    newLine();

    Stack<IClassification> hierarchy = new Stack<IClassification>();
    IClassification classification = individual.getGenome().getPrimary().getBranch();
    while (classification != null) {

      if (classification.getScientific() != null && !classification.getScientific().isEmpty())
        hierarchy.push(classification);
      classification = classification.getParent();
    }

    boolean overcrowded = hierarchy.size() > 5;
    int x = 12;
    IClassification group = null;

    while (!hierarchy.isEmpty()) {

      group = hierarchy.pop();
      if (overcrowded && group.getLevel().isDroppable())
        continue;

      drawLine(group.getScientific(), x, group.getLevel().getColour());
      drawLine(group.getLevel().name(), 155, group.getLevel().getColour());
      newLine();
      x += 10;
    }

    // Add the species name
    String binomial = individual.getGenome().getPrimary().getBinomial();
    if (group != null && group.getLevel() == EnumClassLevel.GENUS)
      binomial = group.getScientific().substring(0, 1) + ". " + binomial.toLowerCase(Locale.ENGLISH);

    drawLine(binomial, x, 0xebae85);
    drawLine("SPECIES", 155, 0xebae85);

    newLine();
    newLine();
    drawLine(StringUtil.localize("gui.alyzer.authority") + ": " + individual.getGenome().getPrimary().getAuthority(), 12);
    if (AlleleManager.alleleRegistry.isBlacklisted(individual.getIdent())) {
      String extinct = ">> " + StringUtil.localize("gui.alyzer.extinct").toUpperCase() + " <<";
      fontRendererObj.drawStringWithShadow(extinct, adjustToFactor(guiLeft + 208) - fontRendererObj.getStringWidth(extinct),
          adjustToFactor(guiTop + getLineY()), fontColor.get("gui.beealyzer.dominant"));
    }

    newLine();
    String description = individual.getGenome().getPrimary().getDescription();
    if (StringUtils.isBlank(description) || description.startsWith("for.description."))
      drawSplitLine(StringUtil.localize("gui.alyzer.nodescription"), 12, 208, 0x666666);
    else {
      String tokens[] = description.split("\\|");
      drawSplitLine(tokens[0], 12, 208, 0x666666);
      if (tokens.length > 1)
        fontRendererObj.drawStringWithShadow("- " + tokens[1], adjustToFactor(guiLeft + 208) - fontRendererObj.getStringWidth("- " + tokens[1]),
            adjustToFactor(guiTop + 145 - 14), 0x99cc32);
    }

    endPage();

  }

  protected void drawAnalyticsPage4(IIndividual individual) {

    float factor = this.factor;
    this.setFactor(1.0f);

    startPage(COLUMN_0, COLUMN_1, COLUMN_2);
    drawLine(StringUtil.localize("gui.beealyzer.mutations") + ":", COLUMN_0);
    newLine();

    RenderHelper.enableGUIStandardItemLighting();

    HashMap<IMutation, IAllele> combinations = new HashMap<IMutation, IAllele>();

    for (IMutation mutation : speciesRoot.getCombinations(individual.getGenome().getPrimary()))
      combinations.put(mutation, individual.getGenome().getPrimary());

    for (IMutation mutation : speciesRoot.getCombinations(individual.getGenome().getSecondary()))
      combinations.put(mutation, individual.getGenome().getSecondary());

    int columnWidth = 50;
    int x = 0;

    for (Map.Entry<IMutation, IAllele> mutation : combinations.entrySet()) {

      if (breedingTracker.isDiscovered(mutation.getKey()))
        drawMutationInfo(mutation.getKey(), mutation.getValue(), COLUMN_0 + x);
      else {
        // Do not display secret undiscovered mutations.
        if (mutation.getKey().isSecret())
          continue;

        drawUnknownMutation(mutation.getKey(), mutation.getValue(), COLUMN_0 + x);
      }

      x += columnWidth;
      if (x >= columnWidth * 4) {
        x = 0;
        newLine();
        newLine();
      }
    }

    endPage();

    this.setFactor(factor);
  }

  protected void drawMutationInfo(IMutation combination, IAllele species, int x) {

    ItemStack partnerBee = iconStacks.get(combination.getPartner(species).getUID());
    widgetManager.add(new ItemStackWidget(x, getLineY(), partnerBee));

    drawProbabilityArrow(combination.getBaseChance(), adjustToFactor(guiLeft) + x + 18, adjustToFactor(guiTop) + getLineY() + 4);

    IAllele result = combination.getTemplate()[EnumBeeChromosome.SPECIES.ordinal()];
    ItemStack resultBee = iconStacks.get(result.getUID());
    widgetManager.add(new ItemStackWidget(x + 33, getLineY(), resultBee));
  }

  protected void drawUnknownMutation(IMutation combination, IAllele species, int x) {

    drawQuestionMark(adjustToFactor(guiLeft) + x, adjustToFactor(guiTop) + getLineY());

    drawProbabilityArrow(combination.getBaseChance(), adjustToFactor(guiLeft) + x + 18, adjustToFactor(guiTop) + getLineY() + 4);

    drawQuestionMark(adjustToFactor(guiLeft) + x + 32, adjustToFactor(guiTop) + getLineY());
  }

  protected void drawQuestionMark(int x, int y) {
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect(x, y, 78, 240, 16, 16);
  }

  protected void drawProbabilityArrow(float chance, int x, int y) {
    int line = 247;
    int column = 100;
    switch (EnumMutateChance.rateChance(chance)) {
      case HIGHEST:
        column = 100;
        break;
      case HIGHER:
        column = 100 + 15;
        break;
      case HIGH:
        column = 100 + 15 * 2;
        break;
      case NORMAL:
        column = 100 + 15 * 3;
        break;
      case LOW:
        column = 100 + 15 * 4;
        break;
      case LOWEST:
        column = 100 + 15 * 5;
      default:
        break;
    }

    // Probability arrow
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect(x, y, column, line, 15, 9);
  }

  protected void drawToleranceInfo(IAlleleTolerance toleranceAllele, int x) {
    int textColor = getColorCoding(toleranceAllele.isDominant());
    EnumTolerance tolerance = toleranceAllele.getValue();
    String text = "(" + toleranceAllele.getName() + ")";

    // Enable correct lighting.
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

    switch (tolerance) {
    case BOTH_1:
    case BOTH_2:
    case BOTH_3:
    case BOTH_4:
    case BOTH_5:
      drawBothSymbol(x, getLineY() - 1);
      drawLine(text, x + (int) (20 * factor), textColor);
      break;
    case DOWN_1:
    case DOWN_2:
    case DOWN_3:
    case DOWN_4:
    case DOWN_5:
      drawDownSymbol(x, getLineY() - 1);
      drawLine(text, x + (int) (20 * factor), textColor);
      break;
    case UP_1:
    case UP_2:
    case UP_3:
    case UP_4:
    case UP_5:
      drawUpSymbol(x, getLineY() - 1);
      drawLine(text, x + (int) (20 * factor), textColor);
      break;
    default:
      drawNoneSymbol(x, getLineY() - 1);
      drawLine("(0)", x + (int) (20 * factor), textColor);
      break;
    }
  }

  private void drawDownSymbol(int x, int y) {
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect((int) ((guiLeft + x) * (1 / factor)), (int) ((guiTop + getLineY()) * (1 / factor)), 0, 247, 15, 9);
  }

  private void drawUpSymbol(int x, int y) {
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect((int) ((guiLeft + x) * (1 / factor)), (int) ((guiTop + getLineY()) * (1 / factor)), 15, 247, 15, 9);
  }

  private void drawBothSymbol(int x, int y) {
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect((int) ((guiLeft + x) * (1 / factor)), (int) ((guiTop + getLineY()) * (1 / factor)), 30, 247, 15, 9);
  }

  private void drawNoneSymbol(int x, int y) {
    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect((int) ((guiLeft + x) * (1 / factor)), (int) ((guiTop + getLineY()) * (1 / factor)), 45, 247, 15, 9);
  }

  protected void drawFertilityInfo(int fertility, int x, int textColor, int texOffset) {
    // Enable correct lighting.
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

    Proxies.common.bindTexture(textureFile);
    drawTexturedModalRect((int) ((guiLeft + x + 14) * (1 / factor)), (int) ((guiTop + getLineY()) * (1 / factor)), 60, 240 + texOffset, 12, 8);

    drawLine(Integer.toString(fertility) + " x", x, textColor);
  }

}
TOP

Related Classes of forestry.core.gui.GuiAlyzer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.