/* * MegaMekLab - Copyright (C) 2009 * * 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.ui.Vehicle.Printing; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.util.ArrayList; import java.util.Calendar; import java.util.Vector; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.standard.PrintQuality; import megamek.common.Crew; import megamek.common.Engine; import megamek.common.MiscType; import megamek.common.SupportTank; import megamek.common.Tank; import megamek.common.TechConstants; import megameklab.com.util.ImageHelper; import megameklab.com.util.ImageHelperVehicle; import megameklab.com.util.UnitUtil; public class PrintVehicle implements Printable { private Tank tank = null; private Tank tank2 = null; private ArrayList<Tank> tankList; private int secondPageMargin = 371; // How far down the text should be private boolean singlePrint = false; PrinterJob masterPrintJob; // printed for a second vehicle. public PrintVehicle(ArrayList<Tank> list, boolean singlePrint, PrinterJob masterPrintJob) { tankList = list; this.singlePrint = singlePrint; this.masterPrintJob = masterPrintJob; } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex >= 1) { return Printable.NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; // f.setPaper(this.paper); printImage(g2d, pageFormat); return Printable.PAGE_EXISTS; } public void printImage(Graphics2D g2d, PageFormat pageFormat) { if (g2d == null) { return; } System.gc(); g2d.drawImage(ImageHelper.getRecordSheet(tank, false), 18, 18, 558, 368, null); if (tank.hasNoDualTurret() && !tank.hasNoTurret()) { g2d.drawImage(ImageHelperVehicle.getTurretImage(tank), 441, 173, 77, 96, null); g2d.drawImage(ImageHelperVehicle.getTurretLabelImage(), 297, 248, 34, 11, null); } if (tank2 == null) { g2d.drawImage(ImageHelperVehicle.getTableImage(tank), 18, 18 + secondPageMargin, 558, 368, null); } else { g2d.drawImage(ImageHelper.getRecordSheet(tank2, false), 18, 18 + secondPageMargin, 558, 368, null); if (tank2.hasNoDualTurret() && !tank2.hasNoTurret()) { g2d.drawImage(ImageHelperVehicle.getTurretImage(tank2), 441, 173 + secondPageMargin, 77, 96, null); g2d.drawImage(ImageHelperVehicle.getTurretLabelImage(), 297, 248 + secondPageMargin, 34, 11, null); } } printTankData(g2d); printArmor(g2d); printWeaponsNEquipment(g2d); // Armor Pips printFrontArmor(g2d, tank.getOArmor(Tank.LOC_FRONT), false, tank.hasModularArmor(Tank.LOC_FRONT)); printLeftArmor(g2d, tank.getOArmor(Tank.LOC_LEFT), false, tank.hasModularArmor(Tank.LOC_LEFT)); printRightArmor(g2d, tank.getOArmor(Tank.LOC_RIGHT), false, tank.hasModularArmor(Tank.LOC_RIGHT)); printRearArmor(g2d, tank.getOArmor(Tank.LOC_REAR), false, tank.hasModularArmor(Tank.LOC_REAR)); printTurretArmor(g2d, tank.getOArmor(Tank.LOC_TURRET), false, tank.hasModularArmor(Tank.LOC_TURRET)); // Internal Pips printFrontStruct(g2d, tank.getOInternal(Tank.LOC_FRONT), false); printLeftStruct(g2d, tank.getOInternal(Tank.LOC_LEFT), false); printRightStruct(g2d, tank.getOInternal(Tank.LOC_RIGHT), false); printRearStruct(g2d, tank.getOInternal(Tank.LOC_REAR), false); printTurretStruct(g2d, tank.getOInternal(Tank.LOC_TURRET), false); if (tank2 != null) { // Armor Pips printFrontArmor(g2d, tank2.getOArmor(Tank.LOC_FRONT), true, tank2.hasModularArmor(Tank.LOC_FRONT)); printLeftArmor(g2d, tank2.getOArmor(Tank.LOC_LEFT), true, tank2.hasModularArmor(Tank.LOC_LEFT)); printRightArmor(g2d, tank2.getOArmor(Tank.LOC_RIGHT), true, tank2.hasModularArmor(Tank.LOC_RIGHT)); printRearArmor(g2d, tank2.getOArmor(Tank.LOC_REAR), true, tank2.hasModularArmor(Tank.LOC_REAR)); printTurretArmor(g2d, tank2.getOArmor(Tank.LOC_TURRET), true, tank2.hasModularArmor(Tank.LOC_TURRET)); // Internal Pips printFrontStruct(g2d, tank2.getOInternal(Tank.LOC_FRONT), true); printLeftStruct(g2d, tank2.getOInternal(Tank.LOC_LEFT), true); printRightStruct(g2d, tank2.getOInternal(Tank.LOC_RIGHT), true); printRearStruct(g2d, tank2.getOInternal(Tank.LOC_REAR), true); printTurretStruct(g2d, tank2.getOInternal(Tank.LOC_TURRET), true); } printTankImage(g2d); g2d.scale(pageFormat.getImageableWidth(), pageFormat.getImageableHeight()); } private void printTankData(Graphics2D g2d) { String tankName = tank.getChassis() + " " + tank.getModel(); g2d.setFont(UnitUtil.getNewFont(g2d, tankName, true, 180, 10.0f)); g2d.drawString(tankName, 49, 120); Font font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); if ((tank.getCrew() != null) && !tank.getCrew().getName().equalsIgnoreCase("unnamed")) { Crew pilot = tank.getCrew(); g2d.drawString(pilot.getName(), 270, 120); g2d.drawString(String.valueOf(pilot.getGunnery()), 295, 132); g2d.drawString(String.valueOf(pilot.getPiloting()), 365, 132); } g2d.drawString(Integer.toString(tank.getWalkMP()), 79, 144); if (!tank.hasWorkingMisc(MiscType.F_MASC, MiscType.S_SUPERCHARGER)) { g2d.drawString(Integer.toString(tank.getRunMP()), 79, 154); } else { int mascMP = tank.getRunMP(); g2d.drawString(Integer.toString(tank.getRunMPwithoutMASC()) + " [" + mascMP + "]", 79, 154); } if (tank.getJumpMP() > 0){ font = UnitUtil.deriveFont(true, 8f); g2d.setFont(font); g2d.drawString("Jump:", 92, 154f); font = UnitUtil.deriveFont(false, 8f); g2d.setFont(font); g2d.drawString(Integer.toString(tank.getJumpMP()), 120, 154f); } g2d.drawString(tank.getMovementModeAsString(), 88, 165); String engineName = "Fusion Engine"; switch (tank.getEngine().getEngineType()) { case Engine.COMBUSTION_ENGINE: engineName = "I.C.E."; break; case Engine.LIGHT_ENGINE: engineName = "Light Fusion Engine"; break; case Engine.XL_ENGINE: engineName = "XL Fusion Engine"; break; case Engine.XXL_ENGINE: engineName = "XXL Fusion Engine"; break; case Engine.COMPACT_ENGINE: engineName = "Compact Fusion Engine"; break; case Engine.FUEL_CELL: if (tank instanceof SupportTank) { engineName = "Electric (Fuel Cell) Engine"; } else { engineName = "Fuel Cell Engine"; } break; case Engine.FISSION: engineName = "Fission Engine"; break; case Engine.SOLAR: engineName = "Electric (Solar) Engine"; break; case Engine.BATTERY: engineName = "Electric (Batteries) Engine"; break; case Engine.STEAM: engineName = "Steam Engine"; break; case Engine.MAGLEV: engineName = "MagLev Engine"; break; case Engine.NONE: engineName = "None"; break; default: break; } g2d.drawString(engineName, 79, 176); if (tank.getWeight() >= 5) { int tonnage = (int) Math.ceil(tank.getWeight()); g2d.drawString(Integer.toString(tonnage), 177, 133); } else { g2d.drawString(String.format("%1$,.1f", tank.getWeight()), 177, 133); } int nextDataLine = 153; int startLine = 188; int lineFeed = 8; switch (tank.getTechLevel()) { case TechConstants.T_INTRO_BOXSET: ImageHelper.printCenterString(g2d, "(Intro)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_TW_NON_BOX: case TechConstants.T_IS_TW_ALL: case TechConstants.T_CLAN_TW: break; case TechConstants.T_IS_ADVANCED: case TechConstants.T_CLAN_ADVANCED: ImageHelper.printCenterString(g2d, "(Advanced)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_EXPERIMENTAL: case TechConstants.T_CLAN_EXPERIMENTAL: ImageHelper.printCenterString(g2d, "(Experimental)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_UNOFFICIAL: case TechConstants.T_CLAN_UNOFFICIAL: ImageHelper.printCenterString(g2d, "(Unofficial)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; } String techBase = "Inner Sphere"; if (tank.isMixedTech()) { if (tank.isClan()) { techBase = "Mixed Tech (Clan)"; } else { techBase = "Mixed Tech (I.S.)"; } } else if (tank.isClan()) { techBase = "Clan"; } g2d.drawString(techBase, 177, 144); if ((tank.getSource() != null) && (tank.getSource().trim().length() > 0)) { String sourceFluff = "Era: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(sourceFluff, 138, nextDataLine); font = UnitUtil.getNewFont(g2d, tank.getSource(), false, 51, 8.0f); g2d.setFont(font); g2d.drawString(tank.getSource(), 177, nextDataLine); } else { String yearFluff = "Year: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(yearFluff, 138, nextDataLine); font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); g2d.drawString(String.format("%1$s", tank.getYear()), 177, nextDataLine); } // g2d.drawString(Integer.toString(tank.getYear()), 188, 155); // Cost/BV // DecimalFormatSymbols unusualSymbols = // new DecimalFormatSymbols(); // unusualSymbols.setDecimalSeparator('.'); // unusualSymbols.setGroupingSeparator(','); // DecimalFormat myFormatter = new DecimalFormat("#,###", // unusualSymbols); double bv = tank.calculateBattleValue(true, true); if (bv != -1) { font = UnitUtil.deriveFont(true, 8); g2d.setFont(font); g2d.drawString("BV: ", 35, 357); font = UnitUtil.deriveFont(false, 8); g2d.setFont(font); g2d.drawString(String.format("%1$,d", tank.calculateBattleValue(true, true)), 50, 357); } // myFormatter = new DecimalFormat("#,###.##", unusualSymbols); // g2d.drawString(myFormatter.format(tank.getCost(true)) + " C-bills", // 52, 357); if (UnitUtil.hasBAR(tank)) { font = UnitUtil.deriveFont(true, 9.0f); g2d.drawString("BAR: " + UnitUtil.getLowestBARRating(tank), 400, 64); } font = UnitUtil.deriveFont(true, 7f); g2d.setFont(font); g2d.drawString(Integer.toString(Calendar.getInstance().get(Calendar.YEAR)), 62.5f, 374.5f); g2d.drawString(Integer.toString(Calendar.getInstance().get(Calendar.YEAR)), 62.5f, 374.5f + secondPageMargin); if (tank2 != null) { printTank2Data(g2d); } } private void printTank2Data(Graphics2D g2d) { String tankName = tank2.getChassis().toUpperCase() + " " + tank2.getModel().toUpperCase(); g2d.setFont(UnitUtil.getNewFont(g2d, tankName, true, 180, 10.0f)); g2d.drawString(tankName, 49, 120 + secondPageMargin); Font font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); if ((tank2.getCrew() != null) && !tank2.getCrew().getName().equalsIgnoreCase("unnamed")) { Crew pilot = tank2.getCrew(); g2d.drawString(pilot.getName(), 270, 120 + secondPageMargin); g2d.drawString(String.valueOf(pilot.getGunnery()), 295, 132 + secondPageMargin); g2d.drawString(String.valueOf(pilot.getPiloting()), 365, 132 + secondPageMargin); } g2d.drawString(Integer.toString(tank2.getWalkMP()), 79, 144 + secondPageMargin); if (!tank.hasWorkingMisc(MiscType.F_MASC, MiscType.S_SUPERCHARGER)) { g2d.drawString(Integer.toString(tank.getRunMP()), 79, 155 + secondPageMargin); } else { int mascMP = tank.getRunMP(); g2d.drawString(Integer.toString(tank.getRunMPwithoutMASC()) + " [" + mascMP + "]", 79, 155 + secondPageMargin); } g2d.drawString(tank2.getMovementModeAsString(), 88, 166 + secondPageMargin); String engineName = "Fusion Engine"; switch (tank2.getEngine().getEngineType()) { case Engine.COMBUSTION_ENGINE: engineName = "I.C.E."; break; case Engine.LIGHT_ENGINE: engineName = "Light Fusion Engine"; break; case Engine.XL_ENGINE: engineName = "XL Fusion Engine"; break; case Engine.XXL_ENGINE: engineName = "XXL Fusion Engine"; break; case Engine.COMPACT_ENGINE: engineName = "Compact Fusion Engine"; break; case Engine.FUEL_CELL: engineName = "Fuel Cell Engine"; break; case Engine.NONE: engineName = "None"; break; default: break; } g2d.drawString(engineName, 79, 177 + secondPageMargin); if (tank2.getWeight() >= 5) { int tonnage = (int) Math.ceil(tank2.getWeight()); g2d.drawString(Integer.toString(tonnage), 177, 134 + secondPageMargin); } else { // DecimalFormatSymbols unusualSymbols = // new DecimalFormatSymbols(); // unusualSymbols.setDecimalSeparator('.'); // unusualSymbols.setGroupingSeparator(','); // DecimalFormat myFormatter = new DecimalFormat("#.###", // unusualSymbols); g2d.drawString(String.format("%1$,d", tank2.getWeight()), 177, 134 + secondPageMargin); } int nextDataLine = 155 + secondPageMargin; int startLine = 188; int lineFeed = 8; switch (tank2.getTechLevel()) { case TechConstants.T_INTRO_BOXSET: ImageHelper.printCenterString(g2d, "(Intro)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_TW_NON_BOX: case TechConstants.T_IS_TW_ALL: case TechConstants.T_CLAN_TW: break; case TechConstants.T_IS_ADVANCED: case TechConstants.T_CLAN_ADVANCED: ImageHelper.printCenterString(g2d, "(Advanced)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_EXPERIMENTAL: case TechConstants.T_CLAN_EXPERIMENTAL: ImageHelper.printCenterString(g2d, "(Experimental)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_UNOFFICIAL: case TechConstants.T_CLAN_UNOFFICIAL: ImageHelper.printCenterString(g2d, "(Unofficial)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; } String techBase = "Inner Sphere"; if (tank2.isMixedTech()) { if (tank2.isClan()) { techBase = "Mixed Tech (Clan)"; } else { techBase = "Mixed Tech (I.S.)"; } } else if (tank2.isClan()) { techBase = "Clan"; } g2d.drawString(techBase, 177, 145 + secondPageMargin); if ((tank2.getSource() != null) && (tank2.getSource().trim().length() > 0)) { String sourceFluff = "Era: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(sourceFluff, 138, nextDataLine); font = UnitUtil.getNewFont(g2d, tank2.getSource(), false, 51, 8.0f); g2d.setFont(font); g2d.drawString(tank2.getSource(), 177, nextDataLine); } else { String yearFluff = "Year: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(yearFluff, 138, nextDataLine); font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); g2d.drawString(String.format("%1$s", tank2.getYear()), 177, nextDataLine); } // Cost/BV // DecimalFormatSymbols unusualSymbols = // new DecimalFormatSymbols(); // unusualSymbols.setDecimalSeparator('.'); // unusualSymbols.setGroupingSeparator(','); // DecimalFormat myFormatter = new DecimalFormat("#,###", // unusualSymbols); double bv = tank2.calculateBattleValue(true, true); if (bv != -1) { font = UnitUtil.deriveFont(true, 8); g2d.setFont(font); g2d.drawString("BV: ", 35, 357 + secondPageMargin); font = UnitUtil.deriveFont(false, 8); g2d.setFont(font); g2d.drawString(String.format("%1$,d", tank2.calculateBattleValue(true, true)), 50, 357 + secondPageMargin); } // myFormatter = new DecimalFormat("#,###.##", unusualSymbols); // g2d.drawString(myFormatter.format(tank2.getCost(true)) + " C-bills", // 52, 357 + secondPagemMargin); if (UnitUtil.hasBAR(tank2)) { font = UnitUtil.deriveFont(true, 9.0f); g2d.drawString("BAR: " + UnitUtil.getLowestBARRating(tank2), 400, 64 + secondPageMargin); } font = UnitUtil.deriveFont(true, 7); g2d.setFont(font); } private void printArmor(Graphics2D g2d) { // Armor Font font = UnitUtil.deriveFont(true, 9.0f); g2d.setFont(font); font = UnitUtil.deriveFont(true, 11.0f); g2d.setFont(font); ImageHelper.printCenterString(g2d, ImageHelperVehicle.getVehicleArmorTypeString(tank), g2d.getFont(), 478, 48); font = UnitUtil.deriveFont(true, 9.0f); g2d.setFont(font); g2d.drawString("(" + Integer.toString(tank.getArmor(Tank.LOC_FRONT)) + ")", 467, 64); g2d.drawString("(" + tank.getArmor(Tank.LOC_RIGHT) + ")", 559, 230); g2d.drawString("(" + tank.getArmor(Tank.LOC_LEFT) + ")", 384, 175); g2d.drawString("(" + Integer.toString(tank.getArmor(Tank.LOC_REAR)) + ")", 467, 342); if (tank.getOInternal(Tank.LOC_TURRET) > 0) { g2d.drawString("(" + Integer.toString(tank.getArmor(Tank.LOC_TURRET)) + ")", 455, 186); } if (tank2 != null) { font = UnitUtil.deriveFont(true, 11.0f); g2d.setFont(font); ImageHelper.printCenterString(g2d, ImageHelperVehicle.getVehicleArmorTypeString(tank2), g2d.getFont(), 478, 48 + secondPageMargin); //g2d.drawString(ImageHelperVehicle.getVehicleArmorTypeString(tank2), 463, 48 + secondPageMargin); font = UnitUtil.deriveFont(true, 9.0f); g2d.setFont(font); g2d.drawString("(" + Integer.toString(tank2.getArmor(Tank.LOC_FRONT)) + ")", 467, 64 + secondPageMargin); g2d.drawString("(" + Integer.toString(tank2.getArmor(Tank.LOC_RIGHT)) + ")", 559, 230 + secondPageMargin); g2d.drawString("(" + tank2.getArmor(Tank.LOC_LEFT) + ")", 384, 175 + secondPageMargin); g2d.drawString("(" + Integer.toString(tank2.getArmor(Tank.LOC_REAR)) + ")", 467, 342 + secondPageMargin); if (tank2.getOInternal(Tank.LOC_TURRET) > 0) { g2d.drawString("(" + Integer.toString(tank2.getArmor(Tank.LOC_TURRET)) + ")", 455, 186 + secondPageMargin); } } } private void printWeaponsNEquipment(Graphics2D g2d) { ImageHelperVehicle.printTankWeaponsNEquipment(tank, g2d); if (tank2 != null) { ImageHelperVehicle.printTankWeaponsNEquipment(tank2, g2d, secondPageMargin); } } public void print(HashPrintRequestAttributeSet aset) { try { for (int pos = 0; pos < tankList.size(); pos++) { PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintService(masterPrintJob.getPrintService()); aset.add(PrintQuality.HIGH); PageFormat pageFormat = new PageFormat(); pageFormat = pj.getPageFormat(null); Paper p = pageFormat.getPaper(); p.setImageableArea(0, 0, p.getWidth(), p.getHeight()); pageFormat.setPaper(p); pj.setPrintable(this, pageFormat); tank = tankList.get(pos); pj.setJobName(tank.getChassis() + " " + tank.getModel()); if (!singlePrint && ((pos + 1) < tankList.size())) { tank2 = tankList.get(++pos); } else { tank2 = null; } try { pj.print(aset); } catch (Exception ex) { ex.printStackTrace(); } finally { System.gc(); } } } catch (Exception ex) { ex.printStackTrace(); } } private void printExtraFrontArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { float[] topColumn = { 442, 90 }; float[] middleColumn = { 498, 125 }; float[] bottomColumn = { 493, 136.2f }; float[] pipShift = { 6, 6 }; float[][] extraArmor = { { 429, 90 }, { 429, 97 }, { 518, 90 }, { 518, 97 }, { 436f, 93.5f }, { 436f, 100.5f }, { 513f, 93.5f }, { 513f, 100.5f }, { 513f, 107.5f }, { 436f, 107.5f } }; if (secondImage) { topColumn[1] += secondPageMargin; middleColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; for (int pos = 0; pos < extraArmor.length; pos++) { extraArmor[pos][1] += secondPageMargin; } } if (totalArmor < 1) { return; } Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= 72; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % 12) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } pipShift[0] *= -1; for (int pos = 1; pos <= 16; pos++) { pipPlotter.add(new float[] { middleColumn[0], middleColumn[1] }); middleColumn[0] += pipShift[0]; if ((pos % 8) == 0) { middleColumn[1] += pipShift[1]; pipShift[0] *= -1; middleColumn[0] += pipShift[0]; } } for (int pos = 1; pos <= 18; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; if ((pos % 6) == 0) { bottomColumn[1] += pipShift[1] - 0.5f; pipShift[0] *= -1; bottomColumn[0] += pipShift[0]; } } for (int pos = 0; pos < 10; pos++) { pipPlotter.add(new float[] { extraArmor[pos][0], extraArmor[pos][1] }); } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printFrontArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { float[] topColumn = { 444, 90 }; float[] middleColumn = { 500, 125 }; float[] bottomColumn = { 493, 132 }; float[] pipShift = { 7, 7 }; float[][] extraArmor = { { 430, 90 }, { 430, 97 }, { 519, 90 }, { 519, 97 }, { 437f, 93.5f }, { 437f, 100.5f }, { 513f, 93.5f }, { 513f, 100.5f }, { 513f, 107.5f }, { 437f, 107.5f } }; if (secondImage) { topColumn[1] += secondPageMargin; middleColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; for (int pos = 0; pos < extraArmor.length; pos++) { extraArmor[pos][1] += secondPageMargin; } } if (totalArmor < 1) { return; } if (totalArmor > 86) { printExtraFrontArmor(g2d, totalArmor, secondImage, hasModularArmor); return; } Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= 50; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % 10) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } for (int pos = 1; pos <= 8; pos++) { pipPlotter.add(new float[] { middleColumn[0], middleColumn[1] }); middleColumn[0] += pipShift[0]; } for (int pos = 1; pos <= 18; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; if ((pos % 6) == 0) { bottomColumn[1] += pipShift[1]; pipShift[0] *= -1; bottomColumn[0] += pipShift[0]; } } for (int pos = 1; pos <= 10; pos++) { pipPlotter.add(new float[] { extraArmor[pos - 1][0], extraArmor[pos - 1][1] }); } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printRearArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { if (totalArmor > 51) { printExtraRearArmor(g2d, totalArmor, secondImage, hasModularArmor); return; } int[] topColumn = new int[] { 422, 291 }; int[] middleColumn = new int[] { 422, 298 }; int[] bottomColumn = new int[] { 422, 305 }; int[] pipShift = new int[] { 7, 7 }; if (secondImage) { topColumn[1] += secondPageMargin; middleColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = 17; Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; } pips = 17; for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { middleColumn[0], middleColumn[1] }); middleColumn[0] += pipShift[0]; } pips = 17; for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printExtraRearArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { int[] topColumn = new int[] { 420, 291 }; int[] middleColumn = new int[] { 420, 298 }; int[] bottomColumn = new int[] { 420, 305 }; int[] pipShift = new int[] { 5, 5 }; if (secondImage) { topColumn[1] += secondPageMargin; middleColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = 24; Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; } pips = 24; for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { middleColumn[0], middleColumn[1] }); middleColumn[0] += pipShift[0]; } pips = 24; for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; } pipPlotter.add(new float[] { 482, 312 }); ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, 7.0f, hasModularArmor); } private void printTurretArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { if (totalArmor < 1) { return; } if (totalArmor > 52) { printExtraTurretArmor(g2d, totalArmor, secondImage, hasModularArmor); return; } float[] topColumn = new float[] { 458f, 233f }; float[] bottomColumn = new float[] { 451.5f, 240f }; float[] pipShift = new float[] { 6f, 6f }; // float fontSize = 8.0f; if (secondImage) { topColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = 7; Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; } for (int pos = 1; pos <= 45; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; if ((pos % 9) == 0) { bottomColumn[1] += pipShift[1]; pipShift[0] *= -1; bottomColumn[0] += pipShift[0]; } } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printExtraTurretArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { if (totalArmor < 1) { return; } float[] topColumn = new float[] { 456.5f, 232f }; float[] bottomColumn = new float[] { 453.5f, 238f }; float[] pipShift = new float[] { 4.5f, 4.5f }; float fontSize = 5.5f; if (secondImage) { topColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = 9; Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= pips; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; } for (int pos = 1; pos <= 70; pos++) { pipPlotter.add(new float[] { bottomColumn[0], bottomColumn[1] }); bottomColumn[0] += pipShift[0]; if ((pos % 11) == 0) { bottomColumn[1] += pipShift[1]; pipShift[0] *= -1; bottomColumn[0] += pipShift[0]; } } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, fontSize, hasModularArmor); } private void printLeftArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { float[] topColumn = new float[] { 418.5f, 92.5f }; float[] pipShift = new float[] { 7, 7 }; if (secondImage) { topColumn[1] += secondPageMargin; } Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= 90; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); switch (pos) { case 1: case 2: topColumn[1] += pipShift[1]; break; case 4: case 6: case 9: case 12: case 21: case 27: case 46: case 49: case 52: case 70: case 74: case 85: case 88: topColumn[1] += pipShift[1]; pipShift[0] *= -1; break; case 78: topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] -= 1.3; break; case 82: topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += 1.3; break; case 43: topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; break; case 39: topColumn[1] += pipShift[1]; pipShift[0] = Math.abs(pipShift[0]); topColumn[0] -= pipShift[0] * 5.2; break; case 55: topColumn[1] += pipShift[1]; topColumn[0] -= pipShift[0] * 2.2; break; case 58: case 60: case 62: case 64: topColumn[1] += pipShift[1]; topColumn[0] -= pipShift[0] * 1.25; break; case 66: topColumn[1] += pipShift[1] * 1.3; topColumn[0] -= pipShift[0]; break; case 16: case 33: topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] -= pipShift[0] * .5; break; case 79: case 81: case 87: topColumn[0] += pipShift[0] * .85; break; default: topColumn[0] += pipShift[0]; break; } } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printRightArmor(Graphics2D g2d, int totalArmor, boolean secondImage, boolean hasModularArmor) { float[] topColumn = new float[] { 530f, 92 }; float[] pipShift = new float[] { 7, 7 }; if (secondImage) { topColumn[1] += secondPageMargin; } Vector<float[]> pipPlotter = new Vector<float[]>(20); for (int pos = 1; pos <= 90; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); switch (pos) { case 1: case 2: topColumn[1] += pipShift[1]; break; case 4: case 6: case 9: case 12: case 16: case 21: case 27: case 33: case 46: case 49: case 52: case 70: case 74: // case 78: case 85: case 82: case 88: topColumn[1] += pipShift[1]; pipShift[0] *= -1; break; case 78: topColumn[1] += pipShift[1]; topColumn[0] += 1.5f; pipShift[0] *= -.9f; break; case 43: topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] -= pipShift[0]; break; case 39: topColumn[1] += pipShift[1]; pipShift[0] = Math.abs(pipShift[0]); topColumn[0] += pipShift[0] * 5.5; break; case 55: topColumn[1] += pipShift[1]; topColumn[0] += pipShift[0] * 2.2; break; case 58: case 60: case 62: case 64: topColumn[1] += pipShift[1]; topColumn[0] += pipShift[0] * 1.25; break; case 66: topColumn[1] += pipShift[1] * 1.25; topColumn[0] += pipShift[0]; break; case 89: topColumn[0] -= pipShift[0] * .9; break; default: topColumn[0] -= pipShift[0]; break; } } ImageHelperVehicle.printArmorPoints(g2d, pipPlotter, totalArmor, hasModularArmor); } private void printFrontStruct(Graphics2D g2d, int totalArmor, boolean secondImage) { int[] topColumn = new int[] { 462, 148 }; int[] bottomColumn = new int[] { 462, 156 }; int[] pipShift = new int[] { 7, 7 }; if (secondImage) { topColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = Math.min(5, totalArmor); totalArmor -= pips; topColumn[0] += pipShift[0] * ((5 - pips) / 2); for (int pos = 1; pos <= pips; pos++) { ImageHelperVehicle.drawTankISPip(g2d, topColumn[0], topColumn[1]); topColumn[0] += pipShift[0]; } bottomColumn[0] += pipShift[0] * ((5 - totalArmor) / 2); for (int pos = 1; pos <= totalArmor; pos++) { ImageHelperVehicle.drawTankISPip(g2d, bottomColumn[0], bottomColumn[1]); bottomColumn[0] += pipShift[0]; } } private void printTurretStruct(Graphics2D g2d, int totalArmor, boolean secondImage) { int[] topColumn = new int[] { 462, 210 }; int[] bottomColumn = new int[] { 462, 218 }; int[] pipShift = new int[] { 7, 7 }; if (totalArmor < 1) { return; } if (secondImage) { topColumn[1] += secondPageMargin; bottomColumn[1] += secondPageMargin; } int pips = Math.min(5, totalArmor); totalArmor -= pips; topColumn[0] += pipShift[0] * ((5 - pips) / 2); for (int pos = 1; pos <= pips; pos++) { ImageHelperVehicle.drawTankISPip(g2d, topColumn[0], topColumn[1]); topColumn[0] += pipShift[0]; } bottomColumn[0] += pipShift[0] * ((5 - totalArmor) / 2); for (int pos = 1; pos <= totalArmor; pos++) { ImageHelperVehicle.drawTankISPip(g2d, bottomColumn[0], bottomColumn[1]); bottomColumn[0] += pipShift[0]; } } private void printLeftStruct(Graphics2D g2d, int totalArmor, boolean secondImage) { int[] column = new int[] { 444, 164 }; int[] pipShift = new int[] { 2, 7 }; if (secondImage) { column[1] += secondPageMargin; } for (int pos = 1; pos <= totalArmor; pos++) { ImageHelperVehicle.drawTankISPip(g2d, column[0], column[1]); column[0] -= pipShift[0]; column[1] += pipShift[1]; } } private void printRightStruct(Graphics2D g2d, int totalArmor, boolean secondImage) { int[] column = new int[] { 505, 164 }; int[] pipShift = new int[] { 2, 7 }; if (secondImage) { column[1] += secondPageMargin; } for (int pos = 1; pos <= totalArmor; pos++) { ImageHelperVehicle.drawTankISPip(g2d, column[0], column[1]); column[0] += pipShift[0]; column[1] += pipShift[1]; } } private void printRearStruct(Graphics2D g2d, int totalArmor, boolean secondImage) { int[] column = new int[] { 445, 275 }; int[] pipShift = new int[] { 7, 7 }; if (secondImage) { column[1] += secondPageMargin; } column[0] += pipShift[0] * ((10 - totalArmor) / 2); for (int pos = 1; pos <= totalArmor; pos++) { ImageHelperVehicle.drawTankISPip(g2d, column[0], column[1]); column[0] += pipShift[0]; } } private void printTankImage(Graphics2D g2d) { Image img = ImageHelper.getFluffImage(tank, ImageHelper.imageVehicle); int width = Math.min(148, img.getWidth(null)); int height = Math.min(99, img.getHeight(null)); int drawingX = 235 + ((148 - width) / 2); int drawingY = 270 + ((99 - height) / 2); g2d.drawImage(img, drawingX, drawingY, width, height, Color.BLACK, null); if (tank2 != null) { img = ImageHelper.getFluffImage(tank2, ImageHelper.imageVehicle); width = Math.min(148, img.getWidth(null)); height = Math.min(99, img.getHeight(null)); drawingX = 235 + ((148 - width) / 2); drawingY = 268 + ((99 - height) / 2) + secondPageMargin; g2d.drawImage(img, drawingX, drawingY, width, height, Color.BLACK, null); } } }