/*
* MegaMekLab - Copyright (C) 2010
*
* Original author - jtighe (torren@users.sourceforge.net)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*/
package megameklab.com.util;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import megamek.common.Aero;
import megamek.common.AmmoType;
import megamek.common.Bay;
import megamek.common.Dropship;
import megamek.common.Entity;
import megamek.common.EntityMovementMode;
import megamek.common.Mounted;
import megamek.common.TechConstants;
import megamek.common.weapons.BayWeapon;
public class ImageHelperDropShip {
public static final String[] LOCATION_ABBRS_SPHEROID = { "N", "LF", "RF", "A", "FL",
"FR", "AL", "AR", "FL/FR", "AL/AR" };
public static final String[] LOCATION_ABBRS_AERODYNE = { "N", "LF", "RF", "A", "LW",
"RW", "LW(R)", "RW(R)", "LW/RW", "LW(R)/RW(R)" };
public static final int[] LOCATION_PRINT = { 0, 1, 2, 4, 5, 8, 9, 6, 7, 3 };
public static final int LOC_FL = 4;
public static final int LOC_FR = 5;
public static final int LOC_AL = 6;
public static final int LOC_AR = 7;
public static final int LOC_FL_FR = 8;
public static final int LOC_AL_AR = 9;
public static void printDropShipCargo(Dropship dropship, Graphics2D g2d,
float pointY) {
if (dropship.getTransportBays().size() < 1) {
return;
}
float pointX = 22;
double lineFeed = ImageHelper.getStringHeight(g2d, "H", g2d.getFont());
Font font = UnitUtil.deriveFont(true, g2d.getFont().getSize2D());
g2d.setFont(font);
pointY += lineFeed;
g2d.drawString("Cargo: ", pointX, pointY);
pointY += lineFeed;
font = UnitUtil.deriveFont(g2d.getFont().getSize2D());
g2d.setFont(font);
Map<Integer, List<Bay>> baySetup = new HashMap<Integer, List<Bay>>();
for (Bay bay : dropship.getTransportBays()) {
if (baySetup.get(bay.getBayNumber()) == null) {
List<Bay> list = new ArrayList<Bay>();
list.add(bay);
baySetup.put(bay.getBayNumber(), list);
} else {
baySetup.get(bay.getBayNumber()).add(bay);
}
}
for (int bayNumber : baySetup.keySet()) {
List<Bay> bays = baySetup.get(bayNumber);
if (bayNumber == 0) {
for (Bay bay : bays) {
g2d.drawString(ImageHelperDropShip.getBayString(bay),
pointX, pointY);
pointY += lineFeed;
}
} else {
String bayString = "Bay " + bayNumber + ": ";
g2d.drawString(bayString, pointX, pointY);
float offsetWidth = ImageHelper.getStringWidth(g2d, bayString,
g2d.getFont());
for (Bay bay : bays) {
g2d.drawString(ImageHelperDropShip.getBayString(bay),
pointX + offsetWidth, pointY);
pointY += lineFeed;
}
}
}
}
public static void drawDropshipArmorPip(Graphics2D g2d, float width,
float height) {
ImageHelperDropShip.drawDropshipArmorPip(g2d, width, height, 9.0f);
}
public static void drawDropshipArmorPip(Graphics2D g2d, float width,
float height, float fontsize) {
Font font = new Font("Arial", Font.PLAIN, 6);
font = font.deriveFont(fontsize);
g2d.setFont(font);
g2d.setColor(Color.BLACK);
g2d.setBackground(Color.WHITE);
g2d.drawString("O", width, height);
}
public static void drawDropshipISPip(Graphics2D g2d, int width, int height, int circleSize, int fillCircleSize) {
Dimension circle = new Dimension(circleSize, circleSize);
Dimension fillCircle = new Dimension(fillCircleSize, fillCircleSize);
g2d.setColor(Color.black);
g2d.fillOval(width, height, circle.width, circle.height);
g2d.setColor(Color.white);
g2d.fillOval(width + 1, height + 1, fillCircle.width, fillCircle.height);
}
public static Font getDropShipWeaponsNEquipmentFont(Graphics2D g2d,
boolean bold, float stringHeight,
ArrayList<Vector<EquipmentInfo>> equipmentLocations,
ArrayList<Vector<EquipmentInfo>> capitalEquipmentLocations,
float pointSize) {
Font font = UnitUtil.deriveFont(bold, pointSize);
boolean hasCapital = false;
boolean hasSubCapital = false;
int weaponCount = 1;
for (int pos = Aero.LOC_NOSE; pos <= ImageHelperDropShip.LOC_AL_AR; pos++) {
Vector<EquipmentInfo> eqVector = equipmentLocations.get(pos);
if (eqVector.size() < 1) {
continue;
}
hasSubCapital = true;
weaponCount += (2*eqVector.size());
}
for (int pos = Aero.LOC_NOSE; pos <= Aero.LOC_WINGS; pos++) {
Vector<EquipmentInfo> eqVector = capitalEquipmentLocations.get(pos);
if (eqVector.size() < 1) {
continue;
}
hasCapital = true;
for (EquipmentInfo eqi : eqVector) {
weaponCount+=2;
if (eqi.isWeapon) {
if (eqi.isAR10) {
weaponCount += eqi.ar10AmmoTypes;
}
/*
* else { if (ImageHelper.getStringWidth(g2d,
* eqi.damage.trim(), font) > 22) { weaponCount++; } }
*/
}
}
}
if (hasCapital) {
weaponCount += 2;
}
if (hasSubCapital) {
weaponCount += 2;
}
while (((ImageHelper.getStringHeight(g2d, "H", font) * weaponCount) > stringHeight)
&& (pointSize > 0)) {
pointSize -= .1;
font = UnitUtil.deriveFont(bold, pointSize);
}
return font;
}
public static void printDropshipWeaponsNEquipment(Dropship dropship,
Graphics2D g2d) {
int qtyPoint = 26;
int typePoint = 38;
int locPoint = 111;
int heatPoint = 135;
int shtPoint = 151;
int medPoint = 169;
int longPoint = 192;
int erPoint = 211;
int nameSize = 65;
float linePoint = 210f;
float lineFeed = 6.7f;
float maxHeight = 140f;
float stringHeight = 0;
float fontSize = 7.0f;
boolean newLineNeeded = false;
boolean hasCapital = false;
boolean hasSubCapital = false;
String[] locAbbr = dropship.isSpheroid()?LOCATION_ABBRS_SPHEROID:LOCATION_ABBRS_AERODYNE;
ArrayList<Vector<EquipmentInfo>> equipmentLocations = new ArrayList<Vector<EquipmentInfo>>(
locAbbr.length);
ArrayList<Vector<EquipmentInfo>> capitalEquipmentLocations = new ArrayList<Vector<EquipmentInfo>>(
locAbbr.length);
if (dropship.getMovementMode() == EntityMovementMode.AERODYNE) {
linePoint = 201;
}
for (int pos = 0; pos < locAbbr.length; pos++) {
equipmentLocations.add(pos, new Vector<EquipmentInfo>());
capitalEquipmentLocations.add(pos, new Vector<EquipmentInfo>());
}
for (Mounted eq : dropship.getWeaponBayList()) {
if ((eq.isWeaponGroup() || (eq.getType() instanceof AmmoType))
|| (eq.getLocation() == Entity.LOC_NONE)
|| !UnitUtil.isPrintableEquipment(eq.getType())) {
continue;
}
Vector<EquipmentInfo> eqHash = equipmentLocations.get(eq
.getLocation());
Vector<EquipmentInfo> capitalEqHash = capitalEquipmentLocations
.get(eq.getLocation());
String equipmentName = "";
if (eq.isRearMounted()) {
switch (eq.getLocation()) {
case Aero.LOC_LWING:
eqHash = equipmentLocations
.get(ImageHelperDropShip.LOC_AL);
capitalEqHash = capitalEquipmentLocations
.get(ImageHelperDropShip.LOC_AL);
break;
case Aero.LOC_RWING:
eqHash = equipmentLocations
.get(ImageHelperDropShip.LOC_AR);
capitalEqHash = capitalEquipmentLocations
.get(ImageHelperDropShip.LOC_AR);
break;
}
}
if ((eq.getType() instanceof BayWeapon)
&& ((BayWeapon) eq.getType()).isCapital()) {
EquipmentInfo eqi = null;
for (int weaponIndex : eq.getBayWeapons()) {
Mounted weapon = dropship.getEquipment(weaponIndex);
if ((eqi == null)
|| (equipmentName == "")
|| !equipmentName.equalsIgnoreCase(UnitUtil
.getCritName(dropship, weapon.getType()))
|| (weapon.getType().getTechLevel(
dropship.getTechLevelYear()) != eqi.techLevel)) {
if (eqi != null) {
eqi = new EquipmentInfo(dropship, weapon, eq);
equipmentName = eqi.name;
eqi.shouldIndent = true;
capitalEqHash.add(eqi);
} else {
eqi = new EquipmentInfo(dropship, weapon, eq);
capitalEqHash.add(eqi);
equipmentName = eqi.name;
}
} else {
eqi.count++;
}
}
} else {
EquipmentInfo eqi = null;
for (int weaponIndex : eq.getBayWeapons()) {
Mounted weapon = dropship.getEquipment(weaponIndex);
if ((eqi == null)
|| (equipmentName == "")
|| !equipmentName.equalsIgnoreCase((UnitUtil
.getCritName(dropship, weapon.getType())))
|| (weapon.getType().getTechLevel(
dropship.getTechLevelYear()) != eqi.techLevel)) {
if (eqi != null) {
eqi = new EquipmentInfo(dropship, weapon, eq);
eqi.shouldIndent = true;
eqHash.add(eqi);
equipmentName = eqi.name;
} else {
eqi = new EquipmentInfo(dropship, weapon, eq);
eqHash.add(eqi);
equipmentName = eqi.name;
}
} else {
eqi.count++;
}
}
}
}
equipmentLocations.get(ImageHelperDropShip.LOC_FL_FR).addAll(
equipmentLocations.get(Aero.LOC_LWING));
equipmentLocations.get(Aero.LOC_LWING).clear();
equipmentLocations.get(Aero.LOC_RWING).clear();
equipmentLocations.get(ImageHelperDropShip.LOC_AL_AR).addAll(
equipmentLocations.get(ImageHelperDropShip.LOC_AL));
equipmentLocations.get(ImageHelperDropShip.LOC_AL).clear();
equipmentLocations.get(ImageHelperDropShip.LOC_AR).clear();
capitalEquipmentLocations.get(ImageHelperDropShip.LOC_FL_FR).addAll(
capitalEquipmentLocations.get(Aero.LOC_LWING));
capitalEquipmentLocations.get(Aero.LOC_LWING).clear();
capitalEquipmentLocations.get(Aero.LOC_RWING).clear();
capitalEquipmentLocations.get(ImageHelperDropShip.LOC_AL_AR).addAll(
capitalEquipmentLocations.get(ImageHelperDropShip.LOC_AL));
capitalEquipmentLocations.get(ImageHelperDropShip.LOC_AL).clear();
capitalEquipmentLocations.get(ImageHelperDropShip.LOC_AR).clear();
Font font = ImageHelperDropShip.getDropShipWeaponsNEquipmentFont(g2d,
true, maxHeight, equipmentLocations, capitalEquipmentLocations,
fontSize);
g2d.setFont(font);
fontSize = font.getSize2D();
stringHeight = ImageHelper.getStringHeight(g2d, "H", font);
lineFeed = stringHeight;
for (int pos = 0; pos < LOCATION_PRINT.length; pos++) {
Vector<EquipmentInfo> eqHash = capitalEquipmentLocations
.get(LOCATION_PRINT[pos]);
if (eqHash.isEmpty()) {
continue;
}
// damage has to be combined for all stuff in a bay
for (int i = 0; i < eqHash.size(); i++) {
EquipmentInfo eqi = eqHash.get(i);
if (!eqi.shouldIndent) {
// first, calculate the damage values here, so we can add
// other
// weapons in the same bay in the next step
eqi.heat *= eqi.count;
if (eqi.shtRange > 0) {
eqi.shtRange *= eqi.count;
}
if (eqi.medRange > 0) {
eqi.medRange *= eqi.count;
}
if (eqi.longRange > 0) {
eqi.longRange *= eqi.count;
}
if (eqi.erRange > 0) {
eqi.erRange *= eqi.count;
}
// now, get all the equipmentinfos after this that are
// shouldIndent and as such belong in the same bay
for (int j = i + 1; j < eqHash.size(); j++) {
EquipmentInfo eqiBay = eqHash.get(j);
if (eqiBay.shouldIndent) {
eqi.heat += (eqiBay.heat * eqiBay.count);
eqiBay.heat = -1;
if (eqiBay.shtRange > 0) {
eqi.shtRange += (eqiBay.shtRange * eqiBay.count);
}
if (eqiBay.medRange > 0) {
eqi.medRange += (eqiBay.medRange * eqiBay.count);
}
if (eqiBay.longRange > 0) {
eqi.longRange += (eqiBay.longRange * eqiBay.count);
}
if (eqiBay.erRange > 0) {
eqi.erRange += (eqiBay.erRange * eqiBay.count);
}
eqiBay.shtRange = -1;
eqiBay.medRange = -1;
eqiBay.longRange = -1;
eqiBay.erRange = -1;
i++;
} else {
break;
}
}
}
}
if (!hasCapital) {
hasCapital = true;
g2d.drawString("Capital Scale", typePoint, linePoint);
font = UnitUtil.getNewFont(g2d,
"(1-12) (13-24) (25-40) (41-50)", true, 75, fontSize);
g2d.setFont(font);
g2d.drawString("(1-12) (13-24) (25-40) (41-50)", shtPoint,
linePoint);
linePoint += lineFeed;
font = UnitUtil.getNewFont(g2d, "Bay", true, 68, fontSize);
g2d.setFont(font);
g2d.drawString("Bay", typePoint, linePoint);
g2d.drawString("Loc", locPoint, linePoint);
g2d.drawString("Ht", heatPoint, linePoint);
g2d.drawString("SRV", shtPoint, linePoint);
g2d.drawString("MRV", medPoint, linePoint);
g2d.drawString("LRV", longPoint, linePoint);
g2d.drawString("ERV", erPoint, linePoint);
linePoint += lineFeed;
}
for (EquipmentInfo eqi : eqHash) {
newLineNeeded = false;
if (eqi.shouldIndent) {
qtyPoint += 5;
typePoint += 5;
nameSize -= 10;
}
font = UnitUtil.deriveFont(false, fontSize);
g2d.setFont(font);
g2d.drawString(Integer.toString(eqi.count), qtyPoint, linePoint);
String name = eqi.name.trim();
if (eqi.hasArtemis) {
name = name + " w/Artemis IV FCS";
} else if (eqi.hasArtemisV) {
name = name + " w/Artemis V FCS";
} else if (eqi.hasApollo) {
name = name + " w/Apollo FCS";
}
font = UnitUtil
.getNewFont(g2d, name, false, nameSize, fontSize);
g2d.setFont(font);
if (eqi.c3Level == EquipmentInfo.C3I) {
ImageHelper.printNavalC3Name(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3EM) {
ImageHelper.printC3EmName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3S) {
ImageHelper.printC3sName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3M) {
ImageHelper.printC3mName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3SB) {
ImageHelper.printC3sbName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3MB) {
ImageHelper.printC3mbName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3REMOTESENSOR) {
ImageHelper.printC3RemoteSensorName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.isMashCore) {
ImageHelper.printMashCore(g2d, typePoint, linePoint, font,
false, dropship);
} else if (eqi.isDroneControl) {
ImageHelper.printDroneControl(g2d, typePoint, linePoint,
font, false, dropship);
} else {
g2d.drawString(name, typePoint, linePoint);
if ((eqi.damage.trim().length() > 0) && !eqi.isAR10) {
g2d.drawString(eqi.damage, typePoint, linePoint
+ lineFeed);
newLineNeeded = true;
}
}
if (eqi.shouldIndent) {
qtyPoint -= 5;
typePoint -= 5;
nameSize += 10;
}
String location = locAbbr[LOCATION_PRINT[pos]];
ImageHelper.printCenterString(g2d, location, font,
locPoint + 5, linePoint);
if ((eqi.heat != -1) && !eqi.isAR10) {
ImageHelper.printCenterString(g2d,
Integer.toString(eqi.heat), font, heatPoint + 4,
linePoint);
}
font = UnitUtil.deriveFont(Math.min(6f, fontSize));
g2d.setFont(font);
if (eqi.isAR10) {
int ammoLines = StringUtils.countOccurrences(eqi.damage,
'[');
String ammoString = eqi.damage;
for (int i = 0; i < ammoLines; i++) {
String printString = ammoString.substring(0,
ammoString.indexOf("]") + 1);
ammoString = ammoString.substring(ammoString
.indexOf("]") + 1);
linePoint += lineFeed;
g2d.drawString(printString, typePoint, linePoint);
String damage = "";
if (printString.indexOf("Barracuda") != -1) {
ImageHelper.printCenterString(g2d,
Integer.toString(10 * eqi.count), font,
heatPoint + 4, linePoint);
int baseDam = 2 * eqi.count;
int baseDamNormalScale = 20 * eqi.count;
if (baseDamNormalScale < 100) {
damage = baseDam + " (" + baseDamNormalScale
+ ")";
} else {
damage = Integer.toString(baseDam);
}
} else if (printString.indexOf("White Shark") != -1) {
ImageHelper.printCenterString(g2d,
Integer.toString(15 * eqi.count), font,
heatPoint + 4, linePoint);
int baseDam = 3 * eqi.count;
int baseDamNormalScale = 30 * eqi.count;
if (baseDamNormalScale < 100) {
damage = baseDam + " (" + baseDamNormalScale
+ ")";
} else {
damage = Integer.toString(baseDam);
}
} else if (printString.indexOf("Killer Whale") != -1) {
ImageHelper.printCenterString(g2d,
Integer.toString(20 * eqi.count), font,
heatPoint + 4, linePoint);
int baseDam = 4 * eqi.count;
int baseDamNormalScale = 40 * eqi.count;
if (baseDamNormalScale < 100) {
damage = baseDam + " (" + baseDamNormalScale
+ ")";
} else {
damage = Integer.toString(baseDam);
}
}
g2d.drawString(damage, shtPoint, linePoint);
g2d.drawString(damage, medPoint, linePoint);
g2d.drawString(damage, longPoint, linePoint);
g2d.drawString(damage, erPoint, linePoint);
}
} else if (eqi.shtRange > 0) {
if ((eqi.shtRange * 10) < 100) {
g2d.drawString(String.format("%1$d (%2$d)",
eqi.shtRange, eqi.shtRange * 10), shtPoint,
linePoint);
} else {
g2d.drawString(String.format("%1$d", eqi.shtRange),
shtPoint, linePoint);
}
if (eqi.medRange > 0) {
if ((eqi.medRange * 10) < 100) {
g2d.drawString(String.format("%1$d (%2$d)",
eqi.medRange, eqi.medRange * 10), medPoint,
linePoint);
} else {
g2d.drawString(String.format("%1$d", eqi.medRange),
medPoint, linePoint);
}
} else if (eqi.medRange != -1) {
g2d.drawString("\u2014", medPoint, linePoint);
}
if (eqi.longRange > 0) {
if ((eqi.longRange * 10) < 100) {
g2d.drawString(String.format("%1$d (%2$d)",
eqi.longRange, eqi.longRange * 10),
longPoint, linePoint);
} else {
g2d.drawString(
String.format("%1$d", eqi.longRange),
longPoint, linePoint);
}
} else if (eqi.longRange != -1) {
g2d.drawString("\u2014", longPoint, linePoint);
}
if (eqi.erRange > 0) {
if ((eqi.erRange * 10) < 100) {
g2d.drawString(String.format("%1$d (%2$d)",
eqi.erRange, eqi.erRange * 10), erPoint,
linePoint);
} else {
g2d.drawString(String.format("%1$d", eqi.erRange),
erPoint, linePoint);
}
} else if (eqi.erRange != -1) {
g2d.drawString("\u2014", erPoint, linePoint);
}
} else if (eqi.shtRange != -1) {
g2d.drawString("\u2014", shtPoint, linePoint);
} else if (eqi.isAMS) {
g2d.drawString("Point Defense", medPoint, linePoint);
}
linePoint += lineFeed;
if (newLineNeeded) {
linePoint += lineFeed;
}
}
}
g2d.setFont(UnitUtil.deriveFont(true, g2d.getFont().getSize2D()));
for (int pos = 0; pos < LOCATION_PRINT.length; pos++) {
Vector<EquipmentInfo> eqHash = equipmentLocations
.get(LOCATION_PRINT[pos]);
if (eqHash.isEmpty()) {
continue;
}
// damage has to be combined for all stuff in a bay
for (int i = 0; i < eqHash.size(); i++) {
EquipmentInfo eqi = eqHash.get(i);
if (!eqi.shouldIndent) {
// first, calculate the damage values here, so we can add
// other
// weapons in the same bay in the next step
eqi.heat *= eqi.count;
if (eqi.shtRange > 0) {
eqi.shtRange *= eqi.count;
}
if (eqi.medRange > 0) {
eqi.medRange *= eqi.count;
}
if (eqi.longRange > 0) {
eqi.longRange *= eqi.count;
}
if (eqi.erRange > 0) {
eqi.erRange *= eqi.count;
}
// now, get all the equipmentinfos after this that are
// shouldIndent and as such belong in the same bay
for (int j = i + 1; j < eqHash.size(); j++) {
EquipmentInfo eqiBay = eqHash.get(j);
if (eqiBay.shouldIndent) {
eqi.heat += eqiBay.heat * eqiBay.count;
eqiBay.heat = -1;
if (eqiBay.shtRange > 0) {
eqi.shtRange += eqiBay.shtRange * eqiBay.count;
}
if (eqiBay.medRange > 0) {
eqi.medRange += eqiBay.medRange * eqiBay.count;
}
if (eqiBay.longRange > 0) {
eqi.longRange += eqiBay.longRange
* eqiBay.count;
}
if (eqiBay.erRange > 0) {
eqi.erRange += eqiBay.erRange * eqiBay.count;
}
eqiBay.shtRange = -1;
eqiBay.medRange = -1;
eqiBay.longRange = -1;
eqiBay.erRange = -1;
i++;
} else {
break;
}
}
}
}
if (!hasSubCapital) {
hasSubCapital = true;
g2d.drawString("Standard Scale", typePoint, linePoint);
font = UnitUtil.getNewFont(g2d, "(1-6) (7-12) (13-20) (21-25)",
true, 75, fontSize);
g2d.setFont(font);
g2d.drawString("(1-6) (7-12) (13-20) (21-25)", shtPoint,
linePoint);
linePoint += lineFeed;
font = UnitUtil.getNewFont(g2d, "Bay", true, 68, fontSize);
g2d.setFont(font);
g2d.drawString("Bay", typePoint, linePoint);
g2d.drawString("Loc", locPoint, linePoint);
g2d.drawString("Ht", heatPoint, linePoint);
g2d.drawString("SRV", shtPoint, linePoint);
g2d.drawString("MRV", medPoint, linePoint);
g2d.drawString("LRV", longPoint, linePoint);
g2d.drawString("ERV", erPoint, linePoint);
linePoint += lineFeed;
}
for (EquipmentInfo eqi : eqHash) {
newLineNeeded = false;
if (eqi.shouldIndent) {
qtyPoint += 5;
typePoint += 5;
nameSize -= 10;
}
font = UnitUtil.deriveFont(false, fontSize);
g2d.setFont(font);
g2d.drawString(Integer.toString(eqi.count), qtyPoint, linePoint);
String name = eqi.name.trim();
if (eqi.hasArtemis) {
name = name + " w/Artemis IV FCS";
} else if (eqi.hasArtemisV) {
name = name + " w/Artemis V FCS";
} else if (eqi.hasApollo) {
name = name + " w/Apollo FCS";
}
font = UnitUtil.getNewFont(g2d, name, false, 68, fontSize);
g2d.setFont(font);
if (eqi.c3Level == EquipmentInfo.C3I) {
ImageHelper.printNavalC3Name(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3S) {
ImageHelper.printC3sName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3M) {
ImageHelper.printC3mName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3SB) {
ImageHelper.printC3sbName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3MB) {
ImageHelper.printC3mbName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3REMOTESENSOR) {
ImageHelper.printC3RemoteSensorName(
g2d,
typePoint,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else {
g2d.drawString(name, typePoint, linePoint);
if ((eqi.damage.trim().length() > 0) && !eqi.isMML) {
g2d.drawString(eqi.damage, typePoint, linePoint
+ lineFeed);
newLineNeeded = true;
}
}
if (eqi.shouldIndent) {
qtyPoint -= 5;
typePoint -= 5;
nameSize += 10;
}
String location = locAbbr[LOCATION_PRINT[pos]];
ImageHelper.printCenterString(g2d, location, font,
locPoint + 5, linePoint);
if (eqi.heat != -1) {
ImageHelper.printCenterString(g2d,
Integer.toString(eqi.heat), font, heatPoint + 4,
linePoint);
}
if (eqi.isMML) {
String lrmAmmoString = eqi.damage.substring(0,
eqi.damage.indexOf("]") + 1);
String srmAmmoString = eqi.damage.substring(eqi.damage
.indexOf("]") + 1);
linePoint += lineFeed;
g2d.drawString(srmAmmoString, typePoint, linePoint);
String damage = String.format("%1$d (%2$d)",
Math.round((eqi.shtRange * 2) / 10f),
eqi.shtRange * 2);
font = UnitUtil
.getNewFont(g2d, damage, false, 17, fontSize);
g2d.setFont(font);
g2d.drawString(damage, shtPoint, linePoint);
font = UnitUtil.deriveFont(false, fontSize);
g2d.setFont(font);
g2d.drawString("\u2014", medPoint, linePoint);
g2d.drawString("\u2014", longPoint, linePoint);
g2d.drawString("\u2014", erPoint, linePoint);
linePoint += lineFeed;
g2d.drawString(lrmAmmoString, typePoint, linePoint);
damage = String.format("%1$d (%2$d)",
Math.round((eqi.shtRange) / 10f), eqi.shtRange);
font = UnitUtil
.getNewFont(g2d, damage, false, 17, fontSize);
g2d.setFont(font);
g2d.drawString(damage, shtPoint, linePoint);
g2d.drawString(damage, medPoint, linePoint);
g2d.drawString(damage, longPoint, linePoint);
g2d.drawString("\u2014", erPoint, linePoint);
font = UnitUtil.deriveFont(false, fontSize);
g2d.setFont(font);
} else if (eqi.shtRange > 0) {
String damage = String.format("%1$d (%2$d)",
Math.round((eqi.shtRange) / 10f), eqi.shtRange);
font = UnitUtil
.getNewFont(g2d, damage, false, 17, fontSize);
g2d.setFont(font);
g2d.drawString(damage, shtPoint, linePoint);
font = UnitUtil.deriveFont(fontSize);
g2d.setFont(font);
} else if (eqi.shtRange != -1) {
g2d.drawString("\u2014", shtPoint, linePoint);
}
if (eqi.isAMS) {
g2d.drawString("Point Defense", medPoint, linePoint);
} else {
if ((eqi.medRange > 0) && !eqi.isMML) {
String damage = String.format("%1$d (%2$d)",
Math.round((eqi.medRange) / 10f), eqi.medRange);
font = UnitUtil.getNewFont(g2d, damage, false, 17,
fontSize);
g2d.setFont(font);
g2d.drawString(damage, medPoint, linePoint);
font = UnitUtil.deriveFont(fontSize);
g2d.setFont(font);
} else if (!eqi.isMML && (eqi.medRange != -1)) {
g2d.drawString("\u2014", medPoint, linePoint);
}
if ((eqi.longRange > 0) && !eqi.isMML) {
String damage = String.format("%1$d (%2$d)",
Math.round((eqi.longRange) / 10f),
eqi.longRange);
font = UnitUtil.getNewFont(g2d, damage, false, 17,
fontSize);
g2d.setFont(font);
g2d.drawString(damage, longPoint, linePoint);
font = UnitUtil.deriveFont(fontSize);
g2d.setFont(font);
} else if (!eqi.isMML && (eqi.longRange != -1)) {
g2d.drawString("\u2014", longPoint, linePoint);
}
if ((eqi.erRange > 0) && !eqi.isMML) {
String damage = String.format("%1$d (%2$d)",
Math.round((eqi.erRange) / 10f), eqi.erRange);
font = UnitUtil.getNewFont(g2d, damage, false, 17,
fontSize);
g2d.setFont(font);
g2d.drawString(damage, erPoint, linePoint);
font = UnitUtil.deriveFont(fontSize);
g2d.setFont(font);
} else if (!eqi.isMML && (eqi.erRange != -1)) {
g2d.drawString("\u2014", erPoint, linePoint);
}
}
linePoint += lineFeed;
if (newLineNeeded && !eqi.isMML) {
linePoint += lineFeed;
}
}
}
int pointX = 22;
boolean notesPrinted = false;
font = UnitUtil.deriveFont(true, g2d.getFont().getSize2D());
EquipmentInfo eq = null;
Vector<EquipmentInfo> eqHash = new Vector<EquipmentInfo>();
for (Mounted mount : dropship.getEquipment()) {
if ((mount.getLocation() == Entity.LOC_NONE) && UnitUtil.isPrintableEquipment(mount.getType())) {
eq = new EquipmentInfo(dropship, mount, null);
eqHash.add(eq);
}
}
for (EquipmentInfo eqi : eqHash) {
if (!notesPrinted) {
g2d.setFont(font);
g2d.drawString("Notes: ", pointX, linePoint);
linePoint += lineFeed;
font = UnitUtil.deriveFont(g2d.getFont().getSize2D());
notesPrinted = true;
g2d.setFont(font);
}
if (eqi.c3Level == EquipmentInfo.C3I) {
ImageHelper
.printNavalC3Name(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3EM) {
ImageHelper
.printC3EmName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3S) {
ImageHelper
.printC3sName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3M) {
ImageHelper
.printC3mName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3SB) {
ImageHelper
.printC3sbName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3MB) {
ImageHelper
.printC3mbName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.c3Level == EquipmentInfo.C3REMOTESENSOR) {
ImageHelper
.printC3RemoteSensorName(
g2d,
pointX,
linePoint,
font,
false,
dropship.isMixedTech()
&& TechConstants.isClan(dropship
.getTechLevel()));
} else if (eqi.isMashCore) {
ImageHelper.printMashCore(g2d, pointX, linePoint, font, false,
dropship);
} else if (eqi.isDroneControl) {
ImageHelper.printDroneControl(g2d, pointX, linePoint, font,
false, dropship);
} else {
g2d.drawString(eqi.name, pointX, linePoint);
}
linePoint += lineFeed;
}
ImageHelperDropShip.printDropShipCargo(dropship, g2d, linePoint);
}
public static String getBayString(Bay bay) {
StringBuffer returnString = new StringBuffer(bay.getUnusedString(false));
if (bay.getDoors() > 0) {
returnString.append(" (");
returnString.append(bay.getDoors());
returnString.append(bay.getDoors() > 1 ? " doors)" : " door)");
}
return returnString.toString();
}
static public void printISPoints(Graphics2D g2d,
Vector<float[]> pipPlotter, float totalArmor, int circleSize, int fillCircleSize) {
pipPlotter.trimToSize();
float pipSpace = 1;
for (float pos = 0; pos < pipPlotter.size(); pos += pipSpace) {
int currentPip = (int) pos;
ImageHelperDropShip.drawDropshipISPip(g2d,
(int) pipPlotter.get(currentPip)[0],
(int) pipPlotter.get(currentPip)[1], circleSize, fillCircleSize);
if (--totalArmor <= 0) {
return;
}
}
}
static public void printArmorPoints(Graphics2D g2d,
Vector<float[]> pipPlotter, float totalArmor) {
pipPlotter.trimToSize();
float pipSpace = 1;
for (float pos = 0; pos < pipPlotter.size(); pos += pipSpace) {
int currentPip = (int) pos;
ImageHelperDropShip.drawDropshipArmorPip(g2d,
pipPlotter.get(currentPip)[0],
pipPlotter.get(currentPip)[1], 5.0f);
if (--totalArmor <= 0) {
return;
}
}
}
static public int printTotalDoors(Aero aero, Bay bay) {
int result = 0;
for (Bay next : aero.getTransportBays()) {
if (next.getType().equals(bay.getType())) {
result += next.getDoors();
}
}
return result;
}
}