/* * MegaMekLab - Copyright (C) 2008 * * 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.util.Comparator; import megamek.common.Aero; import megamek.common.AmmoType; import megamek.common.Dropship; import megamek.common.Entity; import megamek.common.EquipmentType; import megamek.common.Mech; import megamek.common.MiscType; import megamek.common.Mounted; import megamek.common.WeaponType; import megamek.common.actions.ClubAttackAction; import megamek.common.actions.KickAttackAction; import megamek.common.weapons.ACWeapon; import megamek.common.weapons.ArtilleryCannonWeapon; import megamek.common.weapons.ArtilleryWeapon; import megamek.common.weapons.BPodWeapon; import megamek.common.weapons.CLERSmallPulseLaser; import megamek.common.weapons.CLMicroPulseLaser; import megamek.common.weapons.CLPlasmaCannon; import megamek.common.weapons.CLSmallPulseLaser; import megamek.common.weapons.CLVehicularGrenadeLauncher; import megamek.common.weapons.FlamerWeapon; import megamek.common.weapons.HAGWeapon; import megamek.common.weapons.ISBombastLaser; import megamek.common.weapons.ISC3M; import megamek.common.weapons.ISC3RemoteSensorLauncher; import megamek.common.weapons.ISHGaussRifle; import megamek.common.weapons.ISLargeVariableSpeedPulseLaser; import megamek.common.weapons.ISMediumVariableSpeedPulseLaser; import megamek.common.weapons.ISPlasmaRifle; import megamek.common.weapons.ISSilverBulletGauss; import megamek.common.weapons.ISSmallPulseLaser; import megamek.common.weapons.ISSmallVariableSpeedPulseLaser; import megamek.common.weapons.ISSmallXPulseLaser; import megamek.common.weapons.ISSnubNosePPC; import megamek.common.weapons.ISThunderBolt10; import megamek.common.weapons.ISThunderBolt15; import megamek.common.weapons.ISThunderBolt20; import megamek.common.weapons.ISThunderBolt5; import megamek.common.weapons.ISVehicularGrenadeLauncher; import megamek.common.weapons.LBXACWeapon; import megamek.common.weapons.LRMWeapon; import megamek.common.weapons.MGWeapon; import megamek.common.weapons.MRMWeapon; import megamek.common.weapons.MekMortarWeapon; import megamek.common.weapons.NarcWeapon; import megamek.common.weapons.PPCWeapon; import megamek.common.weapons.RLWeapon; import megamek.common.weapons.SRMWeapon; import megamek.common.weapons.ScreenLauncherWeapon; import megamek.common.weapons.StreakLRMWeapon; import megamek.common.weapons.StreakSRMWeapon; import megamek.common.weapons.TAGWeapon; import megamek.common.weapons.ThunderBoltWeapon; import megamek.common.weapons.UACWeapon; import megamek.common.weapons.battlearmor.CLBAERSmallPulseLaser; import megamek.common.weapons.battlearmor.CLBALBX; import megamek.common.weapons.battlearmor.CLBAMicroPulseLaser; import megamek.common.weapons.battlearmor.CLBASmallPulseLaser; import megamek.common.weapons.battlearmor.ISBAMediumVariableSpeedPulseLaser; import megamek.common.weapons.battlearmor.ISBAPopUpMineLauncher; import megamek.common.weapons.battlearmor.ISBASmallPulseLaser; import megamek.common.weapons.battlearmor.ISBASmallVariableSpeedPulseLaser; import megamek.common.weapons.infantry.InfantryWeapon; public class StringUtils { public static Comparator<? super EquipmentType> equipmentTypeComparator() { return new Comparator<EquipmentType>() { public int compare(EquipmentType eq1, EquipmentType eq2) { String s1 = eq1.getName().toLowerCase(); String s2 = eq2.getName().toLowerCase(); return s1.compareTo(s2); } }; } public static Comparator<? super EquipmentInfo> equipmentInfoComparator() { return new Comparator<EquipmentInfo>() { public int compare(EquipmentInfo eq1, EquipmentInfo eq2) { String s1 = eq1.name.toLowerCase(); String s2 = eq2.name.toLowerCase(); return s1.compareTo(s2); } }; } public static Comparator<Mounted> mountedComparator() { return new Comparator<Mounted>() { public int compare(Mounted m1, Mounted m2) { String s1 = m1.getName().toLowerCase(); String s2 = m2.getName().toLowerCase(); return s1.compareTo(s2); } }; } public static String getEquipmentInfo(Dropship unit, Mounted mount, Mounted bay) { String info = ""; if (mount.getType() instanceof WeaponType) { WeaponType weapon = (WeaponType) mount.getType(); if (weapon.getAmmoType() == AmmoType.T_AR10) { int barracudaAmmo = 0; int killerwhaleAmmo = 0; int whitesharkAmmo = 0; for (int ammoIndex : bay.getBayAmmo()) { Mounted ammoMount = unit.getEquipment(ammoIndex); try { AmmoType aType = (AmmoType)ammoMount.getType(); if ((mount.getLinked() != null) && (aType.getRackSize() == weapon.getRackSize()) && (aType.getAmmoType() == weapon.getAmmoType())) { if (aType.hasFlag(AmmoType.F_AR10_BARRACUDA)) { barracudaAmmo += ammoMount.getUsableShotsLeft(); } else if (aType.hasFlag(AmmoType.F_AR10_KILLER_WHALE)) { killerwhaleAmmo += ammoMount.getUsableShotsLeft(); } else if (aType.hasFlag(AmmoType.F_AR10_WHITE_SHARK)) { whitesharkAmmo += ammoMount.getUsableShotsLeft(); } } } catch (Exception ex) { ex.printStackTrace(); } } info = ""; if (barracudaAmmo > 0) { info += String.format("[%1$s Barracuda misl]", barracudaAmmo); } if (killerwhaleAmmo > 0) { info += String.format("[%1$s Killer Whale misl]", killerwhaleAmmo); } if (whitesharkAmmo > 0) { info += String.format("[%1$s White Shark misl]", whitesharkAmmo); } } else if (weapon.getAmmoType() == AmmoType.T_MML) { int lrmAmmo = 0; int srmAmmo = 0; for (int ammoIndex : bay.getBayAmmo()) { Mounted ammoMount = unit.getEquipment(ammoIndex); try { AmmoType aType = (AmmoType)ammoMount.getType(); if ((mount.getLinked() != null) && (aType.getRackSize() == weapon.getRackSize()) && (aType.getAmmoType() == weapon.getAmmoType())) { if (aType.hasFlag(AmmoType.F_MML_LRM)) { lrmAmmo += ammoMount.getUsableShotsLeft(); } else { srmAmmo += ammoMount.getUsableShotsLeft(); } } } catch (Exception ex) { ex.printStackTrace(); } } info = String.format("[%1$s LRM rnds][%2$s SRM rnds]", lrmAmmo, srmAmmo); } else { int totalAmmo = 0; for (int ammoIndex : bay.getBayAmmo()) { Mounted ammoMount = unit.getEquipment(ammoIndex); try { if ((mount.getLinked() != null) && (ammoMount.getType() == mount.getLinked().getType())) { totalAmmo += ammoMount.getUsableShotsLeft(); } } catch (Exception ex) { ex.printStackTrace(); } } if (weapon instanceof ScreenLauncherWeapon) { info = String.format("[%1$s Screens]", totalAmmo); } else if (weapon.hasFlag(WeaponType.F_BALLISTIC) || weapon.hasFlag(WeaponType.F_MISSILE) || weapon.hasFlag(WeaponType.F_ARTILLERY) || (weapon.getAtClass() == WeaponType.CLASS_CAPITAL_MISSILE)) { info = String.format("[%1$s rnds]", totalAmmo); } } } return info; } public static String getEquipmentInfo(Entity unit, Mounted mount) { String info = ""; if (mount.getType() instanceof WeaponType) { WeaponType weapon = (WeaponType) mount.getType(); if (weapon instanceof InfantryWeapon) { info = Integer.toString(weapon.getDamage()); if (weapon.hasFlag(WeaponType.F_BALLISTIC)) { info += " (B)"; } else if (weapon.hasFlag(WeaponType.F_ENERGY)) { info += " (E)"; } else if (weapon.hasFlag(WeaponType.F_MISSILE)) { info += " (M)"; } else if (weapon.hasFlag(WeaponType.F_INF_POINT_BLANK)) { info += " (P)"; } if (weapon.hasFlag(WeaponType.F_INF_BURST)) { info += "B"; } if (weapon.hasFlag(WeaponType.F_INF_AA)) { info += "A"; } if (weapon.hasFlag(WeaponType.F_FLAMER)) { info += "F"; } if (weapon.hasFlag(WeaponType.F_INF_NONPENETRATING)) { info += "N"; } } else if (weapon.hasFlag(WeaponType.F_MGA)) { info = " [T]"; } else if ((weapon instanceof ISC3M) || (weapon instanceof TAGWeapon)) { info = " [E]"; } else if (weapon instanceof ISC3RemoteSensorLauncher) { info = " [M,E]"; } else if (weapon.getDamage() < 0) { if (weapon instanceof StreakSRMWeapon) { info = "2/Msl [M,C]"; } else if ((weapon instanceof SRMWeapon) || (weapon instanceof MekMortarWeapon)) { info = "2/Msl [M,C,S]"; } else if ((weapon instanceof StreakLRMWeapon)) { info = "1/Msl [M,C]"; } else if ((weapon instanceof LRMWeapon)) { info = "1/Msl [M,C,S]"; } else if ((weapon instanceof MRMWeapon) || (weapon instanceof RLWeapon)) { info = "1/Msl [M,C]"; } else if (weapon instanceof ISSnubNosePPC) { info = "10/8/5 [DE,V]"; } else if ((weapon instanceof ISSmallVariableSpeedPulseLaser) || (weapon instanceof ISBASmallVariableSpeedPulseLaser)) { info = "5/4/3 [P,V]"; } else if ((weapon instanceof ISMediumVariableSpeedPulseLaser) || (weapon instanceof ISBAMediumVariableSpeedPulseLaser)) { info = "9/7/5 [P,V]"; } else if (weapon instanceof ISLargeVariableSpeedPulseLaser) { info = "11/9/7 [P,V]"; } else if (weapon instanceof ISHGaussRifle) { info = "25/20/10 [DB,X]"; } else if (weapon instanceof ISPlasmaRifle) { info = "10 [DE,H,AI]"; } else if (weapon instanceof CLPlasmaCannon) { info = "[DE,H,AI]"; } else if (weapon instanceof HAGWeapon) { info = Integer.toString(weapon.getRackSize()); info += " [C,F,X]"; } else if (weapon instanceof ArtilleryWeapon) { info = Integer.toString(weapon.getRackSize()); info += "[AE,S,F]"; } else if (weapon instanceof ArtilleryCannonWeapon) { info = Integer.toString(weapon.getRackSize()); info += "[DB,AE]"; } else if (weapon instanceof ThunderBoltWeapon) { if (weapon instanceof ISThunderBolt5) { info = "5"; } else if (weapon instanceof ISThunderBolt10) { info = "10"; } else if (weapon instanceof ISThunderBolt15) { info = "15"; } else if (weapon instanceof ISThunderBolt20) { info = "20"; } info += "[M]"; } else if (weapon instanceof NarcWeapon) { info = "[M]"; } else if (weapon instanceof ISBAPopUpMineLauncher) { info = "4"; } else { info = Integer.toString(weapon.getRackSize()); } } else if (weapon instanceof UACWeapon) { info = Integer.toString(weapon.getDamage()); info += "/Sht [DB,R/C]"; } else if ((weapon instanceof ISVehicularGrenadeLauncher) || (weapon instanceof CLVehicularGrenadeLauncher)) { info = "[AE,OS]"; } else { if (!UnitUtil.isAMS(weapon)) { info = Integer.toString(weapon.getDamage()); } info += " ["; if (weapon.hasFlag(WeaponType.F_BALLISTIC) && !UnitUtil.isAMS(weapon)) { info += "DB,"; } if (UnitUtil.isAMS(weapon) || (weapon.hasFlag(WeaponType.F_B_POD))) { info += "PD,"; } else if (weapon.hasFlag(WeaponType.F_PULSE)) { info += "P,"; } else if (weapon.hasFlag(WeaponType.F_ENERGY) || weapon.hasFlag(WeaponType.F_PLASMA)) { info += "DE,"; } if (weapon instanceof ISBombastLaser) { info += "V,"; } if ((weapon instanceof LBXACWeapon) || (weapon instanceof ISSilverBulletGauss)) { info += "C/F/"; } if (weapon instanceof CLBALBX) { info += "C,F,"; } if (UnitUtil.hasSwitchableAmmo(weapon)) { info += "S,"; } if (weapon.hasFlag(WeaponType.F_FLAMER) || weapon.hasFlag(WeaponType.F_PLASMA)) { info += "H,"; } if ((weapon instanceof MGWeapon) || (weapon instanceof BPodWeapon) || (weapon instanceof CLERSmallPulseLaser) || (weapon instanceof CLBAERSmallPulseLaser) || (weapon instanceof ISSmallXPulseLaser) || (weapon instanceof ISSmallPulseLaser) || (weapon instanceof ISBASmallPulseLaser) || (weapon instanceof CLSmallPulseLaser) || (weapon instanceof CLBASmallPulseLaser) || (weapon instanceof CLMicroPulseLaser) || (weapon instanceof CLBAMicroPulseLaser) || (weapon.hasFlag(WeaponType.F_FLAMER) || (weapon.hasFlag(WeaponType.F_BURST_FIRE)))) { info += "AI,"; } if (weapon.isExplosive(mount) && !(weapon instanceof ACWeapon) && (!(weapon instanceof PPCWeapon) || ((mount.getLinkedBy() != null) && mount.getLinkedBy().getType().hasFlag(MiscType.F_PPC_CAPACITOR)))) { info += "X,"; } if (weapon.hasFlag(WeaponType.F_ONESHOT)) { info += "OS,"; } info = info.substring(0, info.length() - 1) + "]"; } } else if ((mount.getType() instanceof MiscType) && (mount.getType().hasFlag(MiscType.F_CLUB) || mount.getType().hasFlag(MiscType.F_HAND_WEAPON))) { if (mount.getType().hasSubType(MiscType.S_VIBRO_LARGE) || mount.getType().hasSubType(MiscType.S_VIBRO_MEDIUM) || mount.getType().hasSubType(MiscType.S_VIBRO_SMALL)) { // manually set vibros to active to get correct damage mount.setMode(1); } if (mount.getType().hasSubType(MiscType.S_CLAW) || mount.getType().hasSubType(MiscType.S_CLAW_THB)) { info = Integer.toString((int) Math.ceil(unit.getWeight() / 7.0)); } else { info = Integer.toString(ClubAttackAction.getDamageFor(unit, mount, false)); } } else if ((mount.getType() instanceof MiscType) && (mount.getType().hasFlag(MiscType.F_AP_POD))) { info = "[PD,OS,AI]"; } else if ((mount.getType() instanceof MiscType) && mount.getType().hasFlag(MiscType.F_TALON)) { info = Integer.toString(KickAttackAction.getDamageFor(unit, Mech.LOC_LLEG, false)); } else { info = " [E]"; } return info; } public static String getEquipmentInfo(Aero unit, Mounted mount) { String info = ""; if (mount.getType() instanceof WeaponType) { WeaponType weapon = (WeaponType) mount.getType(); if (weapon instanceof InfantryWeapon) { info = Integer.toString(weapon.getDamage()); if (weapon.hasFlag(WeaponType.F_BALLISTIC)) { info += " (B)"; } else if (weapon.hasFlag(WeaponType.F_ENERGY)) { info += " (E)"; } else if (weapon.hasFlag(WeaponType.F_MISSILE)) { info += " (M)"; } else if (weapon.hasFlag(WeaponType.F_INF_POINT_BLANK)) { info += " (P)"; } if (weapon.hasFlag(WeaponType.F_INF_BURST)) { info += "B"; } if (weapon.hasFlag(WeaponType.F_INF_AA)) { info += "A"; } if (weapon.hasFlag(WeaponType.F_FLAMER)) { info += "F"; } if (weapon.hasFlag(WeaponType.F_INF_NONPENETRATING)) { info += "N"; } } else if (weapon.hasFlag(WeaponType.F_MGA)) { info = "[T]"; } else if (weapon instanceof ISC3M) { info = "[E]"; } else if (weapon.getDamage() < 0) { if (weapon instanceof SRMWeapon) { info = "[M,C]"; } else if ((weapon instanceof LRMWeapon) || (weapon instanceof MekMortarWeapon)) { info = "[M,C,S]"; } else if ((weapon instanceof MRMWeapon) || (weapon instanceof RLWeapon)) { info = "[M,C]"; } else if ((weapon instanceof ISSnubNosePPC) || (weapon instanceof ISBombastLaser)) { info = "[DE,V]"; } else if (weapon instanceof ISSmallVariableSpeedPulseLaser) { info = "[P,V]"; } else if (weapon instanceof ISMediumVariableSpeedPulseLaser) { info = "[P,V]"; } else if (weapon instanceof ISLargeVariableSpeedPulseLaser) { info = "[P,V]"; } else if (weapon instanceof ISHGaussRifle) { info = "[DB,X]"; } else if (weapon instanceof ISPlasmaRifle) { info = "[DE,H,AI]"; } else if (weapon instanceof CLPlasmaCannon) { info = "[DE,H,AI]"; } else if (weapon instanceof HAGWeapon) { info = "[C,F]"; } else if (weapon instanceof ArtilleryWeapon) { info = "[AE,S,F]"; } else if (weapon instanceof ArtilleryCannonWeapon) { info = "[DB,AE]"; } else if (weapon instanceof ThunderBoltWeapon) { info = "[M]"; } else if (weapon instanceof NarcWeapon) { info = "[M]"; } else { info = ""; } } else if (weapon instanceof UACWeapon) { info = "[DB,R/C]"; } else { info = " ["; if (weapon.hasFlag(WeaponType.F_BALLISTIC)) { info += "DB,"; } if (UnitUtil.isAMS(weapon) || (weapon instanceof BPodWeapon)) { info += "PD,"; } else if (weapon.hasFlag(WeaponType.F_PULSE)) { info += "P,"; } else if (weapon.hasFlag(WeaponType.F_ENERGY)) { info += "DE,"; } if ((weapon instanceof LBXACWeapon) || (weapon instanceof ISSilverBulletGauss)) { info += "C/F,"; } if (UnitUtil.hasSwitchableAmmo(weapon)) { info += "S,"; } if ((weapon instanceof MGWeapon) || (weapon instanceof BPodWeapon) || (weapon instanceof CLERSmallPulseLaser) || (weapon instanceof ISSmallXPulseLaser) || (weapon instanceof ISSmallPulseLaser) || (weapon instanceof CLSmallPulseLaser) || (weapon instanceof CLMicroPulseLaser)) { info += "AI,"; } if (weapon instanceof FlamerWeapon) { info += "H,AI,"; } if (weapon.isExplosive(mount) && !(weapon instanceof ACWeapon) && (!(weapon instanceof PPCWeapon) || ((mount.getLinkedBy() != null) && mount.getLinkedBy().getType().hasFlag(MiscType.F_PPC_CAPACITOR)))) { info += "X,"; } if (weapon.hasFlag(WeaponType.F_ONESHOT)) { info += "OS,"; } info = info.substring(0, info.length() - 1) + "]"; } } else { info = "[E]"; } return info; } public static int countOccurrences(String haystack, char needle) { int count = 0; for (int i=0; i < haystack.length(); i++) { if (haystack.charAt(i) == needle) { count++; } } return count; } }