Beispiel #1
0
  /**
   * Creates the sprite for this entity. Fortunately it is no longer an extra pain to create
   * transparent images in AWT.
   */
  @Override
  public void prepare() {
    final IBoard board = bv.game.getBoard();

    // recalculate bounds & label
    getBounds();

    // create image for buffer
    GraphicsConfiguration config =
        GraphicsEnvironment.getLocalGraphicsEnvironment()
            .getDefaultScreenDevice()
            .getDefaultConfiguration();
    image = config.createCompatibleImage(bounds.width, bounds.height, Transparency.TRANSLUCENT);
    Graphics2D graph = (Graphics2D) image.getGraphics();
    GUIPreferences.AntiAliasifSet(graph);

    // translate everything (=correction for label placement)
    graph.translate(-hexOrigin.x, -hexOrigin.y);

    if (!bv.useIsometric()) {
      // The entity sprite is drawn when the hexes are rendered.
      // So do not include the sprite info here.
      if (onlyDetectedBySensors()) {
        graph.drawImage(bv.getScaledImage(radarBlipImage, true), 0, 0, this);
      } else {
        // draw the unit icon translucent if:
        // hidden from the enemy (and activated graphics setting); or
        // submerged
        boolean translucentHiddenUnits =
            GUIPreferences.getInstance()
                .getBoolean(GUIPreferences.ADVANCED_TRANSLUCENT_HIDDEN_UNITS);
        boolean shouldBeTranslucent =
            (trackThisEntitiesVisibilityInfo(entity) && !entity.isVisibleToEnemy())
                || entity.isHidden();
        if ((shouldBeTranslucent && translucentHiddenUnits) || (entity.relHeight() < 0)) {
          graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
        }
        graph.drawImage(
            bv.getScaledImage(bv.tileManager.imageFor(entity, secondaryPos), true), 0, 0, this);
        graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
      }
    }

    // scale the following draws according to board zoom
    graph.scale(bv.scale, bv.scale);

    boolean isInfantry = (entity instanceof Infantry);
    boolean isAero = (entity instanceof Aero);

    if ((isAero && ((Aero) entity).isSpheroid() && !board.inSpace()) && (secondaryPos == 1)) {
      graph.setColor(Color.WHITE);
      graph.draw(bv.facingPolys[entity.getFacing()]);
    }

    if ((secondaryPos == -1) || (secondaryPos == 6)) {

      // Gather unit conditions
      ArrayList<Status> stStr = new ArrayList<Status>();
      criticalStatus = false;

      // Determine if the entity has a locked turret,
      // and if it is a gun emplacement
      boolean turretLocked = false;
      int crewStunned = 0;
      boolean ge = false;
      if (entity instanceof Tank) {
        turretLocked = !((Tank) entity).hasNoTurret() && !entity.canChangeSecondaryFacing();
        crewStunned = ((Tank) entity).getStunnedTurns();
        ge = entity instanceof GunEmplacement;
      }

      // draw elevation/altitude if non-zero
      if (entity.isAirborne()) {
        if (!board.inSpace()) {
          stStr.add(new Status(Color.CYAN, "A", SMALL));
          stStr.add(new Status(Color.CYAN, Integer.toString(entity.getAltitude()), SMALL));
        }
      } else if (entity.getElevation() != 0) {
        stStr.add(new Status(Color.CYAN, Integer.toString(entity.getElevation()), SMALL));
      }

      // Shutdown
      if (entity.isManualShutdown()) {
        stStr.add(new Status(Color.YELLOW, "SHUTDOWN"));
      } else if (entity.isShutDown()) {
        stStr.add(new Status(Color.RED, "SHUTDOWN"));
      }

      // Prone, Hulldown, Stuck, Immobile, Jammed
      if (entity.isProne()) stStr.add(new Status(Color.RED, "PRONE"));
      if (entity.isHiddenActivating()) stStr.add(new Status(Color.RED, "ACTIVATING"));
      if (entity.isHidden()) stStr.add(new Status(Color.RED, "HIDDEN"));
      if (entity.isHullDown()) stStr.add(new Status(Color.ORANGE, "HULLDOWN"));
      if ((entity.isStuck())) stStr.add(new Status(Color.ORANGE, "STUCK"));
      if (!ge && entity.isImmobile()) stStr.add(new Status(Color.RED, "IMMOBILE"));
      if (isAffectedByECM()) stStr.add(new Status(Color.YELLOW, "Jammed"));

      // Turret Lock
      if (turretLocked) stStr.add(new Status(Color.YELLOW, "LOCKED"));

      // Grappling & Swarming
      if (entity.getGrappled() != Entity.NONE) {
        if (entity.isGrappleAttacker()) {
          stStr.add(new Status(Color.YELLOW, "GRAPPLER"));
        } else {
          stStr.add(new Status(Color.RED, "GRAPPLED"));
        }
      }
      if (entity.getSwarmAttackerId() != Entity.NONE) {
        stStr.add(new Status(Color.RED, "SWARMED"));
      }

      // Transporting
      if ((entity.getLoadedUnits()).size() > 0) {
        stStr.add(new Status(Color.YELLOW, "T", SMALL));
      }

      // Hidden, Unseen Unit
      if (trackThisEntitiesVisibilityInfo(entity)) {
        if (!entity.isEverSeenByEnemy()) {
          stStr.add(new Status(Color.GREEN, "U", SMALL));
        } else if (!entity.isVisibleToEnemy()) {
          stStr.add(new Status(Color.GREEN, "H", SMALL));
        }
      }

      // Crew
      if (entity.getCrew().isDead()) stStr.add(new Status(Color.RED, "CrewDead"));
      if (crewStunned > 0) {
        stStr.add(new Status(Color.YELLOW, "STUNNED", new Object[] {crewStunned}));
      }

      // Infantry
      if (isInfantry) {
        int dig = ((Infantry) entity).getDugIn();
        if (dig == Infantry.DUG_IN_COMPLETE) {
          stStr.add(new Status(Color.PINK, "D", SMALL));
        } else if (dig != Infantry.DUG_IN_NONE) {
          stStr.add(new Status(Color.YELLOW, "Working", DIRECT));
          stStr.add(new Status(Color.PINK, "D", SMALL));
        } else if (((Infantry) entity).isTakingCover()) {
          stStr.add(new Status(Color.YELLOW, "TakingCover"));
        }
      }

      // Aero
      if (isAero) {
        Aero a = (Aero) entity;
        if (a.isRolled()) stStr.add(new Status(Color.YELLOW, "ROLLED"));
        if (a.getFuel() <= 0) stStr.add(new Status(Color.RED, "FUEL"));
        if (a.isEvading()) stStr.add(new Status(Color.GREEN, "EVADE"));

        if (a.isOutControlTotal() & a.isRandomMove()) {
          stStr.add(new Status(Color.RED, "RANDOM"));
        } else if (a.isOutControlTotal()) {
          stStr.add(new Status(Color.RED, "CONTROL"));
        }
      }

      if (GUIPreferences.getInstance().getShowDamageLevel()) {
        Color damageColor = getDamageColor();
        if (damageColor != null) {
          stStr.add(new Status(damageColor, 0, SMALL));
        }
      }

      // Unit Label
      // no scaling for the label, its size is changed by varying
      // the font size directly => better control
      graph.scale(1 / bv.scale, 1 / bv.scale);

      // Label background
      if (criticalStatus) {
        graph.setColor(LABEL_CRITICAL_BACK);
      } else {
        graph.setColor(LABEL_BACK);
      }
      graph.fillRoundRect(labelRect.x, labelRect.y, labelRect.width, labelRect.height, 5, 10);

      // Label text
      graph.setFont(labelFont);
      Color textColor = LABEL_TEXT_COLOR;
      if (!entity.isDone() && !onlyDetectedBySensors()) {
        textColor =
            GUIPreferences.getInstance().getColor(GUIPreferences.ADVANCED_UNITOVERVIEW_VALID_COLOR);
      }
      if (isSelected) {
        textColor =
            GUIPreferences.getInstance()
                .getColor(GUIPreferences.ADVANCED_UNITOVERVIEW_SELECTED_COLOR);
      }
      bv.drawCenteredText(
          graph,
          getAdjShortName(),
          labelRect.x + labelRect.width / 2,
          labelRect.y + labelRect.height / 2 - 1,
          textColor,
          (entity.isDone() && !onlyDetectedBySensors()));

      // Past here, everything is drawing status that shouldn't be seen
      // on a sensor return, so we'll just quit here
      if (onlyDetectedBySensors()) {
        graph.dispose();
        return;
      }

      // Draw all the status information now
      drawStatusStrings(graph, stStr);

      // from here, scale the following draws according to board zoom
      graph.scale(bv.scale, bv.scale);

      // draw facing
      graph.setColor(Color.white);
      if ((entity.getFacing() != -1)
          && !(isInfantry
              && !((Infantry) entity).hasFieldGun()
              && !((Infantry) entity).isTakingCover())
          && !(isAero && ((Aero) entity).isSpheroid() && !board.inSpace())) {
        graph.draw(bv.facingPolys[entity.getFacing()]);
      }

      // determine secondary facing for non-mechs & flipped arms
      int secFacing = entity.getFacing();
      if (!((entity instanceof Mech) || (entity instanceof Protomech))) {
        secFacing = entity.getSecondaryFacing();
      } else if (entity.getArmsFlipped()) {
        secFacing = (entity.getFacing() + 3) % 6;
      }
      // draw red secondary facing arrow if necessary
      if ((secFacing != -1) && (secFacing != entity.getFacing())) {
        graph.setColor(Color.red);
        graph.draw(bv.facingPolys[secFacing]);
      }
      if ((entity instanceof Aero) && this.bv.game.useVectorMove()) {
        for (int head : entity.getHeading()) {
          graph.setColor(Color.red);
          graph.draw(bv.facingPolys[head]);
        }
      }

      // armor and internal status bars
      int baseBarLength = 23;
      int barLength = 0;
      double percentRemaining = 0.00;

      percentRemaining = entity.getArmorRemainingPercent();
      barLength = (int) (baseBarLength * percentRemaining);

      graph.setColor(Color.darkGray);
      graph.fillRect(56, 7, 23, 3);
      graph.setColor(Color.lightGray);
      graph.fillRect(55, 6, 23, 3);
      graph.setColor(getStatusBarColor(percentRemaining));
      graph.fillRect(55, 6, barLength, 3);

      if (!ge) {
        // Gun emplacements don't have internal structure
        percentRemaining = entity.getInternalRemainingPercent();
        barLength = (int) (baseBarLength * percentRemaining);

        graph.setColor(Color.darkGray);
        graph.fillRect(56, 11, 23, 3);
        graph.setColor(Color.lightGray);
        graph.fillRect(55, 10, 23, 3);
        graph.setColor(getStatusBarColor(percentRemaining));
        graph.fillRect(55, 10, barLength, 3);
      }
    }

    graph.dispose();
  }