From b08c24c1f3eb36dd1cda0669a8f7b900d0e67202 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 18:47:21 -0500 Subject: [PATCH 01/33] Added beast mounted infantry data. --- megamek/src/megamek/common/InfantryMount.java | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 megamek/src/megamek/common/InfantryMount.java diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java new file mode 100644 index 00000000000..594d4dc2523 --- /dev/null +++ b/megamek/src/megamek/common/InfantryMount.java @@ -0,0 +1,208 @@ +/* + * MegaMek - + * Copyright (c) 2023 - The MegaMek Team. All Rights Reserved. + * + * 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 megamek.common; + +/** + * Stats for beast mounted infantry units. See TO:AU&E, p. 106 + */ +public class InfantryMount { + public enum BeastSize { + LARGE(1, 21, 0, 0, true, true, 0), + VERY_LARGE(2, 7, -1, 2, true, false, 1), + MONSTROUS(4, 2, -2, 3, false, false, 2); + + /** Maximum number of troopers that can be mounted on each beast. For values > 2, + * each creature is a separate squad. */ + public final int troopsPerCreature; + /** Maximum number of creatures allowed in a single platoon */ + public final int creaturesPerPlatoon; + /** Modifer to attack rolls against the beast-mounted infantry due to size */ + public final int toHitMod; + /** Maximum number of support weapons allowed per creature. Divide weapon crew needs by 2, rounding up */ + public final int supportWeaponsPerCreature; + /** Whether the infantry unit is permitted to make anti-mech leg attacks */ + public final boolean canMakeLegAttacks; + /** Whether the infantry unit is permitted to make anti-=mech swarm attacks */ + public final boolean canMakeSwarmAttacks; + /** Additional MP required to enter a building hex. The building takes twice this much CF damage. */ + public final int buildingMP; + + BeastSize(int troopsPerCreature, int creaturesPerPlatoon, int toHitMod, + int supportWeaponsPerCreature, boolean canMakeLegAttacks, + boolean canMakeSwarmAttacks, int buildingMP) { + this.troopsPerCreature = troopsPerCreature; + this.creaturesPerPlatoon = creaturesPerPlatoon; + this.toHitMod = toHitMod; + this.supportWeaponsPerCreature = supportWeaponsPerCreature; + this.canMakeLegAttacks = canMakeLegAttacks; + this.canMakeSwarmAttacks = canMakeSwarmAttacks; + this.buildingMP = buildingMP; + } + }; + + private final String name; + private final BeastSize size; + private final double weight; + private final int movementPoints; + private final EntityMovementMode movementMode; + private final int burstDamage; + private final int vehicleDamage; + private final double damageDivisor; + private final int maxWaterDepth; + private final int secondaryGroundMP; + private final int uwEndurance; + + public InfantryMount(String name, BeastSize size, double weight, int movementPoints, + EntityMovementMode movementMode, int burstDamage, + int vehicleDamage, double damageDivisor, int maxWaterDepth, + int secondaryGroundMP, int uwEndurance) { + this.name = name; + this.size = size; + this.weight = weight; + this.movementPoints = movementPoints; + this.movementMode = movementMode; + this.burstDamage = burstDamage; + this.vehicleDamage = vehicleDamage; + this.damageDivisor = damageDivisor; + this.maxWaterDepth = maxWaterDepth; + this.secondaryGroundMP = secondaryGroundMP; + this.uwEndurance = uwEndurance; + } + + /** + * @return The name of the beast. + */ + public String getName() { + return name; + } + + /** + * @return The size class of the beast. + */ + public BeastSize getSize() { + return size; + } + + /** + * @return The weight of each beast in tons. Add 2t per trooper to get total weight. + */ + public double getWeight() { + return weight; + } + + /** + * @return The number of movement points using the primary movement node. + */ + public int getMP() { + return movementPoints; + } + + /** + * @return The primary movement mode. + */ + public EntityMovementMode getMovementMode() { + return movementMode; + } + + /** + * + * @return The number of damage dice to use as burst damage against conventional infantry + * in the same hex. + */ + public int getBurstDamageDice() { + return burstDamage; + } + + /** + * @return The amount of additonal damage done to vehicles in the same hex. + */ + public int getVehicleDamage() { + return vehicleDamage; + } + + /** + * @return The number used to divide any damage received in combat. + */ + public double getDamageDivisor() { + return damageDivisor; + } + + /** + * @return The maximum depth of water the unit may enter. + */ + public int getMaxWaterDepth() { + return maxWaterDepth; + } + + /** + * @return For units with a primary movement mode other than ground, this is + * the number of ground MP available. + */ + public int seconaryGroundMP() { + return secondaryGroundMP; + } + + /** + * @return For creatures with underwater movement, this is the number of turns they + * can stay underwater before needing to resurface. + */ + public int getUWEndurance() { + return uwEndurance; + } + + public static final InfantryMount DONKEY = new InfantryMount("Donkey", BeastSize.LARGE, + 0.15, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0, + 0, 0, 0); + + public static final InfantryMount COVENTRY_KANGAROO = new InfantryMount("Coventry Kangaroo", BeastSize.LARGE, + 0.11, 3, EntityMovementMode.INF_LEG, 1, 1, 1.0, + 0, 0, 0); + + public static final InfantryMount HORSE = new InfantryMount("Horse", BeastSize.LARGE, + 0.5, 3, EntityMovementMode.INF_LEG, 0, 0, 1.0, + 0, 0, 0); + + public static final InfantryMount CAMEL = new InfantryMount("Camel", BeastSize.LARGE, + 0.65, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0, + 0, 0, 0); + + public static final InfantryMount BRANTH = new InfantryMount("Branth", BeastSize.LARGE, + 0.72, 6, EntityMovementMode.VTOL, 2, 1, 1.0, + 0, 0, 0); + + public static final InfantryMount ODESSAN_RAXX = new InfantryMount("Odessan Raxx", BeastSize.LARGE, + 2.4, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0, + 0, 0, 0); + + public static final InfantryMount TABIRANTH = new InfantryMount("Tabiranth", BeastSize.LARGE, + 0.25, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0, + 0, 0, 0); + + public static final InfantryMount TARIQ = new InfantryMount("Tariq", BeastSize.LARGE, + 0.51, 5, EntityMovementMode.INF_LEG, 0, 0, 1.0, + 0, 0, 0); + + public static final InfantryMount ELEPHANT = new InfantryMount("Elephant", BeastSize.VERY_LARGE, + 6.0, 2, EntityMovementMode.INF_LEG, 1, 1, 2.0, + 1, 0, 0); + + public static final InfantryMount ORCA = new InfantryMount("Orca", BeastSize.VERY_LARGE, + 7.2, 5, EntityMovementMode.SUBMARINE, 2, 1, 2.0, + Integer.MAX_VALUE, 0, 180); + + public static final InfantryMount HIPPOSAUR = new InfantryMount("Hipposaur", BeastSize.MONSTROUS, + 35.5, 2, EntityMovementMode.SUBMARINE, 10, 4, 4.0, + Integer.MAX_VALUE, 1, 2); +} From ad3c60180e24beb97a02ae0ecc2546f4157402d4 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 19:22:32 -0500 Subject: [PATCH 02/33] Added code for beast-mounted infanry to Infantry. --- megamek/src/megamek/common/Infantry.java | 103 +++++++++++------- megamek/src/megamek/common/InfantryMount.java | 2 +- 2 files changed, 67 insertions(+), 38 deletions(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 32a23e7df9b..64dadf3e27f 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -119,6 +119,7 @@ public class Infantry extends Entity { private boolean isTakingCover = false; private boolean canCallSupport = true; private boolean isCallingSupport = false; + private InfantryMount mount = null; /** The maximum number of troopers in an infantry platoon. */ public static final int INF_PLT_MAX_MEN = 30; @@ -346,33 +347,36 @@ public boolean getIsCallingSupport() { @Override public int getWalkMP(MPCalculationSetting mpCalculationSetting) { int mp = getOriginalWalkMP(); - // Encumbering armor (TacOps, pg. 318) - if (encumbering) { - mp = Math.max(mp - 1, 1); - } - if ((getSecondaryWeaponsPerSquad() > 1) - && !hasAbility(OptionsConstants.MD_TSM_IMPLANT) - && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR) - && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT) - && !getMovementMode().isTracked() - && !getMovementMode().isJumpInfantry()) { - mp = Math.max(mp - 1, 0); - } - // PL-MASC IntOps p.84 - if ((null != getCrew()) - && hasAbility(OptionsConstants.MD_PL_MASC) - && getMovementMode().isLegInfantry() - && isConventionalInfantry()) { - mp += 1; - } + // Beast mounted infantry depends entirely on the creature + if (mount == null) { + // Encumbering armor (TacOps, pg. 318) + if (encumbering) { + mp = Math.max(mp - 1, 1); + } + if ((getSecondaryWeaponsPerSquad() > 1) + && !hasAbility(OptionsConstants.MD_TSM_IMPLANT) + && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR) + && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT) + && !getMovementMode().isTracked() + && !getMovementMode().isJumpInfantry()) { + mp = Math.max(mp - 1, 0); + } + // PL-MASC IntOps p.84 + if ((null != getCrew()) + && hasAbility(OptionsConstants.MD_PL_MASC) + && getMovementMode().isLegInfantry() + && isConventionalInfantry()) { + mp += 1; + } - if ((null != getCrew()) && hasAbility(OptionsConstants.INFANTRY_FOOT_CAV) - && ((getMovementMode().isLegInfantry()) || (getMovementMode().isJumpInfantry()))) { - mp += 1; - } + if ((null != getCrew()) && hasAbility(OptionsConstants.INFANTRY_FOOT_CAV) + && ((getMovementMode().isLegInfantry()) || (getMovementMode().isJumpInfantry()))) { + mp += 1; + } - if (hasActiveFieldArtillery()) { - mp = Math.min(mp, 1); + if (hasActiveFieldArtillery()) { + mp = Math.min(mp, 1); + } } if (!mpCalculationSetting.ignoreWeather && (null != game)) { @@ -428,14 +432,16 @@ public int getRunMP(MPCalculationSetting mpCalculationSetting) { @Override public int getJumpMP(MPCalculationSetting mpCalculationSetting) { int mp = hasUMU() ? 0 : getOriginalJumpMP(); - if ((getSecondaryWeaponsPerSquad() > 1) - && !hasAbility(OptionsConstants.MD_TSM_IMPLANT) - && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR) - && !getMovementMode().isSubmarine() - && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)) { - mp = Math.max(mp - 1, 0); - } else if (movementMode.isVTOL() && getSecondaryWeaponsPerSquad() > 0) { - mp = Math.max(mp - 1, 0); + if (mount == null) { + if ((getSecondaryWeaponsPerSquad() > 1) + && !hasAbility(OptionsConstants.MD_TSM_IMPLANT) + && !hasAbility(OptionsConstants.MD_DERMAL_ARMOR) + && !getMovementMode().isSubmarine() + && (null != secondaryWeapon) && secondaryWeapon.hasFlag(WeaponType.F_INF_SUPPORT)) { + mp = Math.max(mp - 1, 0); + } else if (movementMode.isVTOL() && getSecondaryWeaponsPerSquad() > 0) { + mp = Math.max(mp - 1, 0); + } } if (!mpCalculationSetting.ignoreGravity) { @@ -558,12 +564,16 @@ public boolean isLocationProhibited(Coords c, int currElevation) { } if ((hex.terrainLevel(Terrains.WATER) <= 0) && getMovementMode().isSubmarine()) { - return true; + return (mount == null) || (mount.getSecondaryGroundMP() == 0); } if ((hex.terrainLevel(Terrains.WATER) > 0) && !hex.containsTerrain(Terrains.ICE)) { - return !getMovementMode().isHover() && !getMovementMode().isUMUInfantry() - && !getMovementMode().isSubmarine() && !getMovementMode().isVTOL(); + if (mount == null) { + return !getMovementMode().isHover() && !getMovementMode().isUMUInfantry() + && !getMovementMode().isSubmarine() && !getMovementMode().isVTOL(); + } else { + return hex.terrainLevel(Terrains.WATER) <= mount.getMaxWaterDepth(); + } } return false; } @@ -577,7 +587,7 @@ public String getMovementString(EntityMovementType mtype) { case MOVE_RUN: switch (getMovementMode()) { case INF_LEG: - return "Walked"; + return mount == null ? "Walked" : "Rode"; case INF_MOTORIZED: return "Biked"; case HOVER: @@ -1447,6 +1457,18 @@ public void setMicrolite(boolean microlite) { this.isMicrolite = microlite; } + public void setMount(InfantryMount mount) { + this.mount = mount; + setMovementMode(mount.getMovementMode()); + if (mount.getMovementMode().isLegInfantry()) { + setOriginalWalkMP(mount.getMP()); + } else { + setOriginalWalkMP(mount.getSecondaryGroundMP()); + setOriginalJumpMP(mount.getMP()); + } + setArmorDamageDivisor(mount.getDamageDivisor()); + } + /** * Used to check for standard or motorized SCUBA infantry, which have a maximum depth of 2. * @return true if this is a conventional infantry unit with non-mechanized SCUBA specialization @@ -1619,6 +1641,13 @@ public boolean canMakeAntiMekAttacks() { @Override public double getWeight() { + if (mount != null) { + if (mount.getSize().troopsPerCreature > 1) { + return (mount.getWeight() + 0.2 * getSquadSize()) * getSquadCount(); + } else { + return (mount.getWeight() + 0.2) * activeTroopers; + } + } double mult; switch (getMovementMode()) { case INF_MOTORIZED: diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index 594d4dc2523..6ffd58bcc40 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -150,7 +150,7 @@ public int getMaxWaterDepth() { * @return For units with a primary movement mode other than ground, this is * the number of ground MP available. */ - public int seconaryGroundMP() { + public int getSecondaryGroundMP() { return secondaryGroundMP; } From e13ea21a1485f005a3e951ca4b208a13e903ecd9 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 19:27:10 -0500 Subject: [PATCH 03/33] Check mount size before adding anti-mech attacks. --- megamek/src/megamek/common/Infantry.java | 21 +++++++++++------ .../src/megamek/common/MechFileParser.java | 23 +++++++++++-------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 64dadf3e27f..8dea3c0c3b7 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -21,6 +21,7 @@ import megamek.MMConstants; import megamek.client.ui.swing.calculationReport.CalculationReport; +import megamek.common.annotations.Nullable; import megamek.common.cost.InfantryCostCalculator; import megamek.common.enums.AimingMode; import megamek.common.enums.GamePhase; @@ -1459,14 +1460,20 @@ public void setMicrolite(boolean microlite) { public void setMount(InfantryMount mount) { this.mount = mount; - setMovementMode(mount.getMovementMode()); - if (mount.getMovementMode().isLegInfantry()) { - setOriginalWalkMP(mount.getMP()); - } else { - setOriginalWalkMP(mount.getSecondaryGroundMP()); - setOriginalJumpMP(mount.getMP()); + if (mount != null) { + setMovementMode(mount.getMovementMode()); + if (mount.getMovementMode().isLegInfantry()) { + setOriginalWalkMP(mount.getMP()); + } else { + setOriginalWalkMP(mount.getSecondaryGroundMP()); + setOriginalJumpMP(mount.getMP()); + } + setArmorDamageDivisor(mount.getDamageDivisor()); } - setArmorDamageDivisor(mount.getDamageDivisor()); + } + + public @Nullable InfantryMount getMount() { + return mount; } /** diff --git a/megamek/src/megamek/common/MechFileParser.java b/megamek/src/megamek/common/MechFileParser.java index c27c6828853..222fa04f21a 100644 --- a/megamek/src/megamek/common/MechFileParser.java +++ b/megamek/src/megamek/common/MechFileParser.java @@ -733,15 +733,20 @@ else if (m.getType().hasFlag(MiscType.F_APOLLO) // physical attacks for conventional infantry else if ((ent instanceof Infantry) && ((Infantry) ent).canMakeAntiMekAttacks()) { try { - ent.addEquipment(EquipmentType.get(Infantry.SWARM_MEK), - Infantry.LOC_INFANTRY, false, - BattleArmor.MOUNT_LOC_NONE, false); - ent.addEquipment(EquipmentType.get(Infantry.STOP_SWARM), - Infantry.LOC_INFANTRY, false, - BattleArmor.MOUNT_LOC_NONE, false); - ent.addEquipment(EquipmentType.get(Infantry.LEG_ATTACK), - Infantry.LOC_INFANTRY, false, - BattleArmor.MOUNT_LOC_NONE, false); + InfantryMount mount = ((Infantry) ent).getMount(); + if ((mount == null) || mount.getSize().canMakeSwarmAttacks) { + ent.addEquipment(EquipmentType.get(Infantry.SWARM_MEK), + Infantry.LOC_INFANTRY, false, + BattleArmor.MOUNT_LOC_NONE, false); + ent.addEquipment(EquipmentType.get(Infantry.STOP_SWARM), + Infantry.LOC_INFANTRY, false, + BattleArmor.MOUNT_LOC_NONE, false); + } + if ((mount == null) || mount.getSize().canMakeLegAttacks) { + ent.addEquipment(EquipmentType.get(Infantry.LEG_ATTACK), + Infantry.LOC_INFANTRY, false, + BattleArmor.MOUNT_LOC_NONE, false); + } } catch (LocationFullException ex) { throw new EntityLoadingException(ex.getMessage()); } From 3d5957d0aafa964f14d4481ddfc22518c0dfa7cb Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 19:36:38 -0500 Subject: [PATCH 04/33] Add bonus damage at range 0. --- .../weapons/infantry/InfantryWeaponHandler.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java index a51836a8cb0..197438f34a1 100644 --- a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java @@ -91,9 +91,16 @@ protected int calcHits(Vector vPhaseReport) { double damage = calculateBaseDamage(ae, weapon, wtype); if ((ae instanceof Infantry) - && nRange == 0 - && ae.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) { - damage += 0.14; + && (nRange == 0)) { + if (ae.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) { + damage += 0.14; + } + InfantryMount mount = ((Infantry) ae).getMount(); + if ((mount != null) && target.isConventionalInfantry() && (mount.getBurstDamageDice() > 0)) { + damage += Compute.d6(mount.getBurstDamageDice()); + } else if ((mount != null) && target.isVehicle()) { + damage += mount.getVehicleDamage(); + } } int damageDealt = (int) Math.round(damage * troopersHit); From ed37a60f083d6815dcf50b143ee2691682808677 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 20:38:03 -0500 Subject: [PATCH 05/33] Apply damage to buildings from beasts entering. --- megamek/src/megamek/common/InfantryMount.java | 7 +++++++ megamek/src/megamek/server/GameManager.java | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index 6ffd58bcc40..b07364c32ea 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -50,6 +50,13 @@ public enum BeastSize { this.canMakeSwarmAttacks = canMakeSwarmAttacks; this.buildingMP = buildingMP; } + + /** + * @return The amount of CF damage done to a building when entering its hex. + */ + public int buildingDamage() { + return buildingMP * 2; + } }; private final String name; diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index f675a862b89..8606be1d45f 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -30704,13 +30704,20 @@ private void passBuildingWall(Entity entity, Building bldg, Coords lastPos, Coor } } - // Infantry and BA are damaged by buildings but do not damage them + // Damage the building. The CF can never drop below 0. + int toBldg; + // Infantry and BA are damaged by buildings but do not damage them, except large beast-mounted infantry if (entity instanceof Infantry) { - return; + InfantryMount mount = ((Infantry) entity).getMount(); + if ((mount != null) && (mount.getSize().buildingDamage() > 0)) { + toBldg = mount.getSize().buildingDamage(); + } else { + return; + } + } else { + toBldg = (int) Math.floor(bldg.getDamageToScale() + * Math.ceil(entity.getWeight() / 10.0)); } - // Damage the building. The CF can never drop below 0. - int toBldg = (int) Math.floor(bldg.getDamageToScale() - * Math.ceil(entity.getWeight() / 10.0)); int curCF = bldg.getCurrentCF(entering ? curPos : lastPos); curCF -= Math.min(curCF, toBldg); bldg.setCurrentCF(curCF, entering ? curPos : lastPos); From 5d18c70bf52c1947f54973deaba8bf3bad0c791f Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 20:42:09 -0500 Subject: [PATCH 06/33] Add building mp cost. --- megamek/src/megamek/common/MoveStep.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/megamek/src/megamek/common/MoveStep.java b/megamek/src/megamek/common/MoveStep.java index be865b08d71..d307cbf8d9c 100644 --- a/megamek/src/megamek/common/MoveStep.java +++ b/megamek/src/megamek/common/MoveStep.java @@ -3150,6 +3150,8 @@ && getClearance() == 0) { } else if (isMechanizedInfantry) { // mechanized infantry pays 1 extra mp += 1; + } else if (isInfantry && (((Infantry) entity).getMount() != null)) { + mp += ((Infantry) entity).getMount().getSize().buildingMP; } } From de5a23fb969d12a4e215ca4255d5f1de2a6997b5 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 20:49:38 -0500 Subject: [PATCH 07/33] Add hit modifier for beast size. --- megamek/i18n/megamek/client/messages.properties | 1 + .../src/megamek/common/actions/WeaponAttackAction.java | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index fb5f8bad7a5..c2cbfc3a20c 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -3792,6 +3792,7 @@ WeaponAttackAction.TeNonAeroAirborne=targeting non-aerospace airborne unit WeaponAttackAction.PutOutInferno=target is inferno fire WeaponAttackAction.SensorShadow=Target in Sensor Shadow WeaponAttackAction.SquadTarget=infantry squad target +WeaponAttackAction.MountSize=mount size WeaponAttackAction.TeGroundAttack=target making air-to-ground attack WeaponAttackAction.TeSuperheavyMech=target is superheavy mech WeaponAttackAction.TeLargeSupportUnit=target is large support unit diff --git a/megamek/src/megamek/common/actions/WeaponAttackAction.java b/megamek/src/megamek/common/actions/WeaponAttackAction.java index 4b79892cdc9..5b4e6e0f0e4 100644 --- a/megamek/src/megamek/common/actions/WeaponAttackAction.java +++ b/megamek/src/megamek/common/actions/WeaponAttackAction.java @@ -4392,7 +4392,13 @@ else if ((atype != null) // infantry squads are also hard to hit if ((te instanceof Infantry) && te.isConventionalInfantry() && ((Infantry) te).isSquad()) { - toHit.addModifier(1, Messages.getString("WeaponAttackAction.SquadTarget")); + if (((Infantry) te).isSquad()) { + toHit.addModifier(1, Messages.getString("WeaponAttackAction.SquadTarget")); + } + InfantryMount mount = ((Infantry) te).getMount(); + if ((mount != null) && (mount.getSize().toHitMod != 0)) { + toHit.addModifier(mount.getSize().toHitMod, Messages.getString("WeaponAttackAction.MountSize")); + } } // pl-masc makes foot infantry harder to hit - IntOps p.84 From 1ee065e283be01a8a8d8e6dd4d2d29a1789a3af9 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 21:32:35 -0500 Subject: [PATCH 08/33] String encoding and decoding for beast mounts. --- megamek/src/megamek/common/InfantryMount.java | 109 +++++++++++++++--- 1 file changed, 95 insertions(+), 14 deletions(-) diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index b07364c32ea..edcde8b416d 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -14,6 +14,9 @@ */ package megamek.common; +import java.util.List; +import java.util.StringJoiner; + /** * Stats for beast mounted infantry units. See TO:AU&E, p. 106 */ @@ -57,7 +60,7 @@ public enum BeastSize { public int buildingDamage() { return buildingMP * 2; } - }; + } private final String name; private final BeastSize size; @@ -70,11 +73,12 @@ public int buildingDamage() { private final int maxWaterDepth; private final int secondaryGroundMP; private final int uwEndurance; + private final boolean custom; - public InfantryMount(String name, BeastSize size, double weight, int movementPoints, + private InfantryMount(String name, BeastSize size, double weight, int movementPoints, EntityMovementMode movementMode, int burstDamage, int vehicleDamage, double damageDivisor, int maxWaterDepth, - int secondaryGroundMP, int uwEndurance) { + int secondaryGroundMP, int uwEndurance, boolean custom) { this.name = name; this.size = size; this.weight = weight; @@ -86,8 +90,18 @@ public InfantryMount(String name, BeastSize size, double weight, int movementPoi this.maxWaterDepth = maxWaterDepth; this.secondaryGroundMP = secondaryGroundMP; this.uwEndurance = uwEndurance; + this.custom = custom; } + public InfantryMount(String name, BeastSize size, double weight, int movementPoints, + EntityMovementMode movementMode, int burstDamage, + int vehicleDamage, double damageDivisor, int maxWaterDepth, + int secondaryGroundMP, int uwEndurance) { + this(name, size, weight, movementPoints, movementMode, burstDamage, vehicleDamage, damageDivisor, + maxWaterDepth, secondaryGroundMP, uwEndurance, true); + } + + /** * @return The name of the beast. */ @@ -169,47 +183,114 @@ public int getUWEndurance() { return uwEndurance; } + @Override + public String toString() { + if (custom) { + StringJoiner sj = new StringJoiner(","); + sj.add(name).add(size.name()).add(String.valueOf(weight)).add(String.valueOf(movementPoints)) + .add(movementMode.name()).add(String.valueOf(burstDamage)).add(String.valueOf(vehicleDamage)) + .add(String.valueOf(damageDivisor)).add(String.valueOf(maxWaterDepth)) + .add(String.valueOf(secondaryGroundMP)).add(String.valueOf(uwEndurance)); + return "Beast:Custom:" + sj; + } else { + return "Beast:" + name; + } + } + + public static InfantryMount parse(String str) { + final String toParse = str.trim().replace("Beast:", ""); + if (toParse.startsWith("Custom:")) { + // Provide some decent information about which field is causing the problem + String[] fields = toParse.replace("Custom:", "").split(","); + if (fields.length < 11) { + throw new IllegalArgumentException("Infantry mount string " + str + " does not have enough fields."); + } + BeastSize size; + try { + size = BeastSize.valueOf(fields[1]); + } catch (Exception ex) { + throw new IllegalArgumentException("Could not parse BeastSize " + fields[1]); + } + double weight; + try { + weight = Double.parseDouble(fields[2]); + } catch (Exception ex) { + throw new IllegalArgumentException("Could not parse InfantryMount movementMode " + fields[4]); + } + EntityMovementMode mode; + try { + mode = EntityMovementMode.valueOf(fields[4]); + } catch (Exception ex) { + throw new IllegalArgumentException("Could not parse InfantryMount movementMode " + fields[4]); + } + double divisor; + try { + divisor = Double.parseDouble(fields[7]); + } catch (Exception ex) { + throw new IllegalArgumentException("Could not parse InfantryMount damageDivisor " + fields[7]); + } + return new InfantryMount(fields[0], size, weight, parseIntField(fields[3], "movementPoints"), + mode, parseIntField(fields[5], "burstDamage"), parseIntField(fields[6], "vehicleDamage"), + divisor, parseIntField(fields[8], "maxWaterDepth"), parseIntField(fields[9], "secondaryGroundMP"), + parseIntField(fields[10], "uwEndurance")); + } else { + return sampleMounts.stream().filter(it -> it.name.equals(toParse)).findFirst() + .orElseThrow(() -> new IllegalArgumentException("Could not parse beast mount " + toParse)); + } + } + + private static int parseIntField(String field, String fieldName) { + try { + return Integer.parseInt(field); + } catch (Exception ex) { + throw new IllegalArgumentException("Could not parse InfantryMount field " + fieldName + " value " + field); + } + } + public static final InfantryMount DONKEY = new InfantryMount("Donkey", BeastSize.LARGE, 0.15, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount COVENTRY_KANGAROO = new InfantryMount("Coventry Kangaroo", BeastSize.LARGE, 0.11, 3, EntityMovementMode.INF_LEG, 1, 1, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount HORSE = new InfantryMount("Horse", BeastSize.LARGE, 0.5, 3, EntityMovementMode.INF_LEG, 0, 0, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount CAMEL = new InfantryMount("Camel", BeastSize.LARGE, 0.65, 2, EntityMovementMode.INF_LEG, 0, 0, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount BRANTH = new InfantryMount("Branth", BeastSize.LARGE, 0.72, 6, EntityMovementMode.VTOL, 2, 1, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount ODESSAN_RAXX = new InfantryMount("Odessan Raxx", BeastSize.LARGE, 2.4, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount TABIRANTH = new InfantryMount("Tabiranth", BeastSize.LARGE, 0.25, 2, EntityMovementMode.INF_LEG, 1, 1, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount TARIQ = new InfantryMount("Tariq", BeastSize.LARGE, 0.51, 5, EntityMovementMode.INF_LEG, 0, 0, 1.0, - 0, 0, 0); + 0, 0, 0, false); public static final InfantryMount ELEPHANT = new InfantryMount("Elephant", BeastSize.VERY_LARGE, 6.0, 2, EntityMovementMode.INF_LEG, 1, 1, 2.0, - 1, 0, 0); + 1, 0, 0, false); public static final InfantryMount ORCA = new InfantryMount("Orca", BeastSize.VERY_LARGE, 7.2, 5, EntityMovementMode.SUBMARINE, 2, 1, 2.0, - Integer.MAX_VALUE, 0, 180); + Integer.MAX_VALUE, 0, 180, false); public static final InfantryMount HIPPOSAUR = new InfantryMount("Hipposaur", BeastSize.MONSTROUS, 35.5, 2, EntityMovementMode.SUBMARINE, 10, 4, 4.0, - Integer.MAX_VALUE, 1, 2); + Integer.MAX_VALUE, 1, 2, false); + + public static final List sampleMounts = List.of(DONKEY, COVENTRY_KANGAROO, HORSE, CAMEL, BRANTH, + ODESSAN_RAXX, TABIRANTH, TARIQ, ELEPHANT, ORCA, HIPPOSAUR); } From 006e0d08a69ff5bb973aae0246523ed2e5debf67 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 5 Sep 2023 21:37:43 -0500 Subject: [PATCH 09/33] BLK file import/export for beast-mounted infantry. --- .../src/megamek/common/loaders/BLKFile.java | 6 +++- .../common/loaders/BLKInfantryFile.java | 28 +++++++++---------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/megamek/src/megamek/common/loaders/BLKFile.java b/megamek/src/megamek/common/loaders/BLKFile.java index fee0c2482ca..18667a452c9 100644 --- a/megamek/src/megamek/common/loaders/BLKFile.java +++ b/megamek/src/megamek/common/loaders/BLKFile.java @@ -595,7 +595,11 @@ public static BuildingBlock getBlock(Entity t) { } blk.writeBlockData("type", type); - blk.writeBlockData("motion_type", t.getMovementModeAsString()); + if ((t instanceof Infantry) && ((Infantry) t).getMount() != null) { + blk.writeBlockData("motion_type", ((Infantry) t).getMount().toString()); + } else { + blk.writeBlockData("motion_type", t.getMovementModeAsString()); + } if(t.getTransports().size() > 0) { // We should only write the transporters block for units that can and do diff --git a/megamek/src/megamek/common/loaders/BLKInfantryFile.java b/megamek/src/megamek/common/loaders/BLKInfantryFile.java index 9db1a166463..cb27ffa9dd6 100644 --- a/megamek/src/megamek/common/loaders/BLKInfantryFile.java +++ b/megamek/src/megamek/common/loaders/BLKInfantryFile.java @@ -13,13 +13,7 @@ */ package megamek.common.loaders; -import megamek.common.Entity; -import megamek.common.EntityMovementMode; -import megamek.common.EquipmentType; -import megamek.common.Infantry; -import megamek.common.LocationFullException; -import megamek.common.MiscType; -import megamek.common.WeaponType; +import megamek.common.*; import megamek.common.util.BuildingBlock; import megamek.common.weapons.infantry.InfantryWeapon; @@ -81,15 +75,19 @@ public Entity getEntity() throws EntityLoadingException { } String sMotion = dataFile.getDataAsString("motion_type")[0]; t.setMicrolite(sMotion.equalsIgnoreCase("microlite")); - EntityMovementMode nMotion = EntityMovementMode.parseFromString(sMotion); - if (nMotion.isNone()) { - throw new EntityLoadingException("Invalid movement type: " + sMotion); - } - if (nMotion == EntityMovementMode.INF_UMU - && sMotion.toLowerCase().contains("motorized")) { - t.setMotorizedScuba(); + if (sMotion.startsWith("Beast:")) { + t.setMount(InfantryMount.parse(sMotion)); } else { - t.setMovementMode(nMotion); + EntityMovementMode nMotion = EntityMovementMode.parseFromString(sMotion); + if (nMotion.isNone()) { + throw new EntityLoadingException("Invalid movement type: " + sMotion); + } + if (nMotion == EntityMovementMode.INF_UMU + && sMotion.toLowerCase().contains("motorized")) { + t.setMotorizedScuba(); + } else { + t.setMovementMode(nMotion); + } } // get primary and secondary weapons From 42d54d4854e3b3675784d2ba370fe8b29fd90cce Mon Sep 17 00:00:00 2001 From: cwspain Date: Wed, 6 Sep 2023 19:19:13 -0500 Subject: [PATCH 10/33] Added tech advancement for beast-mounted infantry. --- megamek/src/megamek/common/Infantry.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 8dea3c0c3b7..3cf6a9b440e 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -171,6 +171,17 @@ public CrewType defaultCrewType() { return CrewType.INFANTRY_CREW; } + public TechAdvancement getMotiveTechAdvancement() { + return getMotiveTechAdvancement(mount == null ? getMovementMode() : EntityMovementMode.NONE); + } + + /** + * Generates the {@link TechAdvancement} for the unit's motive type. A value of EntityMovementMode.NONE indicates + * Beast-mounted infantry. + * + * @param movementMode An infantry movement mode. + * @return The Tech Advancement data for the movement mode. + */ public static TechAdvancement getMotiveTechAdvancement(EntityMovementMode movementMode) { TechAdvancement techAdvancement = new TechAdvancement(TECH_BASE_ALL) .setAdvancement(DATE_PS, DATE_PS, DATE_PS) @@ -216,6 +227,11 @@ public static TechAdvancement getMotiveTechAdvancement(EntityMovementMode moveme .setAvailability(RATING_D, RATING_D, RATING_D, RATING_D) .setStaticTechLevel(SimpleTechLevel.ADVANCED); break; + case NONE: + // Beast-mounted + techAdvancement.setAdvancement(DATE_PS, DATE_PS).setTechRating(RATING_A) + .setAvailability(RATING_A, RATING_A, RATING_A, RATING_A) + .setStaticTechLevel(SimpleTechLevel.ADVANCED); case INF_LEG: default: techAdvancement.setTechRating(RATING_A) @@ -290,7 +306,7 @@ public static TechAdvancement getAntiMekTA() { @Override protected void addSystemTechAdvancement(CompositeTechLevel ctl) { super.addSystemTechAdvancement(ctl); - ctl.addComponent(Infantry.getMotiveTechAdvancement(movementMode)); + ctl.addComponent(getMotiveTechAdvancement()); if (hasSpecialization(COMBAT_ENGINEERS)) { ctl.addComponent(Infantry.getCombatEngineerTA()); } @@ -1610,7 +1626,7 @@ public void setMovementMode(EntityMovementMode movementMode) { default: setOriginalWalkMP(1); } - addTechComponent(Infantry.getMotiveTechAdvancement(movementMode)); + addTechComponent(getMotiveTechAdvancement()); } } From 2154c517aa7a7648bc2a75662b9273691497190e Mon Sep 17 00:00:00 2001 From: cwspain Date: Wed, 6 Sep 2023 19:39:16 -0500 Subject: [PATCH 11/33] Added beast-mounted as a motive option for conventional infantry. --- .../megamek/common/verifier/TestInfantry.java | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/megamek/src/megamek/common/verifier/TestInfantry.java b/megamek/src/megamek/common/verifier/TestInfantry.java index 27719f314d9..da8893a5008 100644 --- a/megamek/src/megamek/common/verifier/TestInfantry.java +++ b/megamek/src/megamek/common/verifier/TestInfantry.java @@ -17,6 +17,8 @@ import megamek.common.Entity; import megamek.common.EntityMovementMode; import megamek.common.Infantry; +import megamek.common.InfantryMount; +import megamek.common.annotations.Nullable; import megamek.common.options.OptionsConstants; /** @@ -152,14 +154,14 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) { } } - max = maxSquadSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1)); + max = maxSquadSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1), inf.getMount()); if (inf.getSquadSize() > max) { buff.append("Maximum squad size is " + max + "\n\n"); correct = false; } max = maxUnitSize(inf.getMovementMode(), inf.hasMicrolite() || (inf.getAllUMUCount() > 1), - inf.hasSpecialization(Infantry.COMBAT_ENGINEERS | Infantry.MOUNTAIN_TROOPS)); + inf.hasSpecialization(Infantry.COMBAT_ENGINEERS | Infantry.MOUNTAIN_TROOPS), inf.getMount()); if (inf.getShootingStrength() > max) { buff.append("Maximum platoon size is " + max + "\n\n"); correct = false; @@ -197,27 +199,33 @@ public static int maxSecondaryWeapons(Infantry inf) { * * @param movementMode The platoon's movement mode * @param alt True indicates that VTOL is microlite and INF_UMU is motorized. + * @param mount The mount if the unit is beast-mounted, otherwise null. * @return The maximum size of a squad. */ - public static int maxSquadSize(EntityMovementMode movementMode, boolean alt) { - switch (movementMode) { - case HOVER: - case SUBMARINE: - return 5; - case WHEELED: - return 6; - case TRACKED: - return 7; - case INF_UMU: - return alt? 6 : 10; - case VTOL: - return alt? 2 : 4; - default: - return 10; + public static int maxSquadSize(EntityMovementMode movementMode, boolean alt, @Nullable InfantryMount mount) { + if ((mount == null) || (mount.getSize().troopsPerCreature == 1)) { + switch (movementMode) { + case HOVER: + case SUBMARINE: + return 5; + case WHEELED: + return 6; + case TRACKED: + return 7; + case INF_UMU: + return alt ? 6 : 10; + case VTOL: + return alt ? 2 : 4; + default: + return 10; + } + } else { + return mount.getSize().troopsPerCreature; } } - public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, boolean engOrMountain) { + public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, boolean engOrMountain, + InfantryMount mount) { int max; switch (movementMode) { case INF_UMU: @@ -238,12 +246,15 @@ public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, bool max = 28; break; case VTOL: - max = maxSquadSize(movementMode, alt) * 4; + max = maxSquadSize(movementMode, alt, mount) * 4; break; default: max = 30; break; } + if (mount != null) { + max = Math.max(max, mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature); + } if (engOrMountain) { max = Math.min(max, 20); } From ca956f189fb39d636b5de56fa6a57233910c7910 Mon Sep 17 00:00:00 2001 From: cwspain Date: Sat, 4 Nov 2023 22:40:03 -0500 Subject: [PATCH 12/33] Improvements to mount table. --- megamek/i18n/megamek/common/messages.properties | 6 +++++- megamek/src/megamek/common/InfantryMount.java | 14 ++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties index a9d87770aa0..3e981af33d6 100644 --- a/megamek/i18n/megamek/common/messages.properties +++ b/megamek/i18n/megamek/common/messages.properties @@ -622,4 +622,8 @@ MiscType.ton=ton PilotingSPA.EnvSpec.RainSpec=Rain Specialist PilotingSPA.EnvSpec.SnowSpec=Snow Specialist -PilotingSPA.EnvSpec.WindSpec=Wind Specialist \ No newline at end of file +PilotingSPA.EnvSpec.WindSpec=Wind Specialist + +BeastSize.large=Large +BeastSize.very_large=Very Large +BeastSize.monstrous=Monstrous \ No newline at end of file diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index edcde8b416d..4bee9f7e39b 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -22,9 +22,9 @@ */ public class InfantryMount { public enum BeastSize { - LARGE(1, 21, 0, 0, true, true, 0), - VERY_LARGE(2, 7, -1, 2, true, false, 1), - MONSTROUS(4, 2, -2, 3, false, false, 2); + LARGE(1, 21, 0, 0, true, true, 0, "BeastSize.large"), + VERY_LARGE(2, 7, -1, 2, true, false, 1, "BeastSize.very_large"), + MONSTROUS(4, 2, -2, 3, false, false, 2, "BeastSize.monstrous"); /** Maximum number of troopers that can be mounted on each beast. For values > 2, * each creature is a separate squad. */ @@ -41,10 +41,11 @@ public enum BeastSize { public final boolean canMakeSwarmAttacks; /** Additional MP required to enter a building hex. The building takes twice this much CF damage. */ public final int buildingMP; + private final String messageId; BeastSize(int troopsPerCreature, int creaturesPerPlatoon, int toHitMod, int supportWeaponsPerCreature, boolean canMakeLegAttacks, - boolean canMakeSwarmAttacks, int buildingMP) { + boolean canMakeSwarmAttacks, int buildingMP, String messageId) { this.troopsPerCreature = troopsPerCreature; this.creaturesPerPlatoon = creaturesPerPlatoon; this.toHitMod = toHitMod; @@ -52,6 +53,7 @@ public enum BeastSize { this.canMakeLegAttacks = canMakeLegAttacks; this.canMakeSwarmAttacks = canMakeSwarmAttacks; this.buildingMP = buildingMP; + this.messageId = messageId; } /** @@ -60,6 +62,10 @@ public enum BeastSize { public int buildingDamage() { return buildingMP * 2; } + + public String displayName() { + return Messages.getString(messageId); + } } private final String name; From d2bc76face5a73af8854c16babe775dc7c52497a Mon Sep 17 00:00:00 2001 From: cwspain Date: Sun, 5 Nov 2023 16:10:16 -0600 Subject: [PATCH 13/33] Update mount when selected --- megamek/src/megamek/common/Infantry.java | 5 +++++ megamek/src/megamek/common/verifier/TestInfantry.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 911d4d4f4e8..75803975c21 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -1485,6 +1485,11 @@ public void setMount(InfantryMount mount) { setOriginalJumpMP(mount.getMP()); } setArmorDamageDivisor(mount.getDamageDivisor()); + } else { + EquipmentType armorKit = getArmorKit(); + if (armorKit != null) { + setArmorDamageDivisor(((MiscType) armorKit).getDamageDivisor()); + } } } diff --git a/megamek/src/megamek/common/verifier/TestInfantry.java b/megamek/src/megamek/common/verifier/TestInfantry.java index da8893a5008..97d94224848 100644 --- a/megamek/src/megamek/common/verifier/TestInfantry.java +++ b/megamek/src/megamek/common/verifier/TestInfantry.java @@ -253,7 +253,7 @@ public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, bool break; } if (mount != null) { - max = Math.max(max, mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature); + max = Math.min(max, mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature); } if (engOrMountain) { max = Math.min(max, 20); From 59baefbe0d70b6fb364b4fc98e9197fc1a2797ac Mon Sep 17 00:00:00 2001 From: cwspain Date: Sun, 5 Nov 2023 17:13:58 -0600 Subject: [PATCH 14/33] Fix max platoon and squad size calculation for beast-mounted. --- .../megamek/common/verifier/TestInfantry.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/megamek/src/megamek/common/verifier/TestInfantry.java b/megamek/src/megamek/common/verifier/TestInfantry.java index 97d94224848..900169f5025 100644 --- a/megamek/src/megamek/common/verifier/TestInfantry.java +++ b/megamek/src/megamek/common/verifier/TestInfantry.java @@ -203,7 +203,7 @@ public static int maxSecondaryWeapons(Infantry inf) { * @return The maximum size of a squad. */ public static int maxSquadSize(EntityMovementMode movementMode, boolean alt, @Nullable InfantryMount mount) { - if ((mount == null) || (mount.getSize().troopsPerCreature == 1)) { + if (mount == null) { switch (movementMode) { case HOVER: case SUBMARINE: @@ -219,6 +219,8 @@ public static int maxSquadSize(EntityMovementMode movementMode, boolean alt, @Nu default: return 10; } + } else if (mount.getSize().troopsPerCreature == 1) { + return 10; // use foot infantry limit } else { return mount.getSize().troopsPerCreature; } @@ -227,33 +229,34 @@ public static int maxSquadSize(EntityMovementMode movementMode, boolean alt, @Nu public static int maxUnitSize(EntityMovementMode movementMode, boolean alt, boolean engOrMountain, InfantryMount mount) { int max; - switch (movementMode) { - case INF_UMU: - if (alt) { - max = 12; - } else { + if (mount == null) { + switch (movementMode) { + case INF_UMU: + if (alt) { + max = 12; + } else { + max = 30; + } + break; + case HOVER: + case SUBMARINE: + max = 20; + break; + case WHEELED: + max = 24; + break; + case TRACKED: + max = 28; + break; + case VTOL: + max = maxSquadSize(movementMode, alt, mount) * 4; + break; + default: max = 30; - } - break; - case HOVER: - case SUBMARINE: - max = 20; - break; - case WHEELED: - max = 24; - break; - case TRACKED: - max = 28; - break; - case VTOL: - max = maxSquadSize(movementMode, alt, mount) * 4; - break; - default: - max = 30; - break; - } - if (mount != null) { - max = Math.min(max, mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature); + break; + } + } else { + max = mount.getSize().creaturesPerPlatoon * mount.getSize().troopsPerCreature; } if (engOrMountain) { max = Math.min(max, 20); From 3194d31cbd0137d0a4633fcb4aa472e5df7fb9d8 Mon Sep 17 00:00:00 2001 From: cwspain Date: Mon, 6 Nov 2023 12:02:19 -0600 Subject: [PATCH 15/33] Added missing break --- megamek/src/megamek/common/Infantry.java | 1 + 1 file changed, 1 insertion(+) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 75803975c21..9b0d38c0d52 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -232,6 +232,7 @@ public static TechAdvancement getMotiveTechAdvancement(EntityMovementMode moveme techAdvancement.setAdvancement(DATE_PS, DATE_PS).setTechRating(RATING_A) .setAvailability(RATING_A, RATING_A, RATING_A, RATING_A) .setStaticTechLevel(SimpleTechLevel.ADVANCED); + break; case INF_LEG: default: techAdvancement.setTechRating(RATING_A) From 946bebb1c103359c3da95c870de651ef4c1d4d91 Mon Sep 17 00:00:00 2001 From: cwspain Date: Mon, 6 Nov 2023 12:24:49 -0600 Subject: [PATCH 16/33] Manage damage divisor from armor kit, mount, and implants. --- megamek/src/megamek/common/Infantry.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 9b0d38c0d52..263b9e573c1 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -1243,7 +1243,6 @@ public void setArmorKit(EquipmentType armorKit) { } catch (LocationFullException ex) { LogManager.getLogger().error("", ex); } - damageDivisor = ((MiscType) armorKit).getDamageDivisor(); encumbering = (armorKit.getSubType() & MiscType.S_ENCUMBERING) != 0; spaceSuit = (armorKit.getSubType() & MiscType.S_SPACE_SUIT) != 0; dest = (armorKit.getSubType() & MiscType.S_DEST) != 0; @@ -1251,10 +1250,15 @@ public void setArmorKit(EquipmentType armorKit) { sneak_ir = (armorKit.getSubType() & MiscType.S_SNEAK_IR) != 0; sneak_ecm = (armorKit.getSubType() & MiscType.S_SNEAK_ECM) != 0; } + calcDamageDivisor(); } public double calcDamageDivisor() { - double divisor = damageDivisor; + double divisor = 1.0; + EquipmentType armorKit = getArmorKit(); + if (armorKit != null) { + divisor = ((MiscType) armorKit).getDamageDivisor(); + } // TSM implant reduces divisor to 0.5 if no other armor is worn if ((divisor == 1.0) && hasAbility(OptionsConstants.MD_TSM_IMPLANT)) { divisor = 0.5; @@ -1263,6 +1267,9 @@ public double calcDamageDivisor() { if (hasAbility(OptionsConstants.MD_DERMAL_ARMOR)) { divisor += 1.0; } + if (mount != null) { + divisor += mount.getDamageDivisor() - 1; + } return divisor; } @@ -1486,12 +1493,8 @@ public void setMount(InfantryMount mount) { setOriginalJumpMP(mount.getMP()); } setArmorDamageDivisor(mount.getDamageDivisor()); - } else { - EquipmentType armorKit = getArmorKit(); - if (armorKit != null) { - setArmorDamageDivisor(((MiscType) armorKit).getDamageDivisor()); - } } + calcDamageDivisor(); } public @Nullable InfantryMount getMount() { From 11b1069c89f62c2d26e2c95a362a46bd1c2afb05 Mon Sep 17 00:00:00 2001 From: cwspain Date: Mon, 6 Nov 2023 12:35:45 -0600 Subject: [PATCH 17/33] Show mount name on movement line in MechView. --- megamek/src/megamek/common/MechView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/megamek/src/megamek/common/MechView.java b/megamek/src/megamek/common/MechView.java index f3e5bd4083c..a5ceccc6046 100644 --- a/megamek/src/megamek/common/MechView.java +++ b/megamek/src/megamek/common/MechView.java @@ -340,6 +340,9 @@ public MechView(final Entity entity, final boolean showDetail, final boolean use .append(warningEnd()); } } + if (entity.isConventionalInfantry() && ((Infantry) entity).getMount() != null) { + moveString.append(" (").append(((Infantry) entity).getMount().getName()).append(")"); + } // TODO : Add STOL message as part of the movement line if (isConvFighter && ((Aero) entity).isVSTOL()) { From 32c6d736659b5c9fc6ac78596d876df6634e11fa Mon Sep 17 00:00:00 2001 From: cwspain Date: Mon, 6 Nov 2023 12:47:46 -0600 Subject: [PATCH 18/33] Added beast-mounted details to TRO view. --- .../i18n/megamek/common/messages.properties | 3 ++ .../common/templates/InfantryTROView.java | 46 ++++++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties index 3e981af33d6..4a058731154 100644 --- a/megamek/i18n/megamek/common/messages.properties +++ b/megamek/i18n/megamek/common/messages.properties @@ -577,6 +577,7 @@ TROView.BAModularTurret=Configurable Turret Mount TROView.Foot=Foot TROView.Mechanized=Mechanized TROView.MechanizedSCUBA=Mechanized SCUBA +TROView.BeastMounted=Beast-Mounted TROView.InfantryNote.FieldGuns=%d %s with %d rounds of ammo each. Each gun requires %d soldiers to operate. TROView.InfantryNote.SingleFieldGun=1 %s with %d rounds of ammo. Requires %d soldiers to operate. TROView.InfantryNote.SCUBA=Weapon range is halved (round down) underwater. @@ -590,6 +591,8 @@ TROView.InfantryNote.CamoArmor=+3/+2/+1 to-hit modifier to attackers if unit doe TROView.InfantryNote.IRArmor=Non-infantry units suffer a +1/+1/+2 to-hit modifier for S/M/L ranges. TROView.InfantryNote.ECMArmor=Invisible to standard/light active probes. TROView.InfantryNote.Augmented=Cybernetically enhanced infantry: +TROView.InfantryNote.MountInfantryDamage.format=+%dD6 damage vs. infantry +TROView.InfantryNote.MountVehicleDamage.format=+%d damage vs. Vehicles/'Mechs MovementType.None=None MovementType.Biped=Biped MovementType.Quad=Quad diff --git a/megamek/src/megamek/common/templates/InfantryTROView.java b/megamek/src/megamek/common/templates/InfantryTROView.java index d5c806a3778..4e4dd78e263 100644 --- a/megamek/src/megamek/common/templates/InfantryTROView.java +++ b/megamek/src/megamek/common/templates/InfantryTROView.java @@ -77,22 +77,26 @@ protected void initModel(EntityVerifier verifier) { setModelData("notes", String.join(" ", notes)); } - switch (inf.getMovementMode()) { - case INF_LEG: - setModelData("motiveType", Messages.getString("TROView.Foot")); - break; - case TRACKED: - case HOVER: - case WHEELED: - setModelData("motiveType", - Messages.getString("TROView.Mechanized") + "/" + inf.getMovementModeAsString()); - break; - case SUBMARINE: - setModelData("motiveType", Messages.getString("TROView.MechanizedSCUBA")); - break; - default: - setModelData("motiveType", inf.getMovementModeAsString()); - break; + if (inf.getMount() != null) { + setModelData("motiveType", Messages.getString("TROView.BeastMounted") + ", " + inf.getMount().getName()); + } else { + switch (inf.getMovementMode()) { + case INF_LEG: + setModelData("motiveType", Messages.getString("TROView.Foot")); + break; + case TRACKED: + case HOVER: + case WHEELED: + setModelData("motiveType", + Messages.getString("TROView.Mechanized") + "/" + inf.getMovementModeAsString()); + break; + case SUBMARINE: + setModelData("motiveType", Messages.getString("TROView.MechanizedSCUBA")); + break; + default: + setModelData("motiveType", inf.getMovementModeAsString()); + break; + } } StringJoiner sj = new StringJoiner(", "); for (int i = 0; i < Infantry.NUM_SPECIALIZATIONS; i++) { @@ -193,6 +197,16 @@ private void addWeaponNotes(List notes) { notes.add(Messages.getString("TROView.InfantryNote.Heat")); } } + if (inf.getMount() != null) { + if (inf.getMount().getBurstDamageDice() > 0) { + notes.add(String.format(Messages.getString("TROView.InfantryNote.MountInfantryDamage.format"), + inf.getMount().getBurstDamageDice())); + } + if (inf.getMount().getVehicleDamage() > 0) { + notes.add(String.format(Messages.getString("TROView.InfantryNote.MountVehicleDamage.format"), + inf.getMount().getVehicleDamage())); + } + } } private void addArmorNotes(List notes, EquipmentType armorKit) { From 34f23203ba974ec212868621f760d280d12b178a Mon Sep 17 00:00:00 2001 From: cwspain Date: Mon, 6 Nov 2023 13:35:52 -0600 Subject: [PATCH 19/33] Make InfantryMount serializable. --- megamek/src/megamek/common/InfantryMount.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index 4bee9f7e39b..31733ffd7bd 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -14,13 +14,14 @@ */ package megamek.common; +import java.io.Serializable; import java.util.List; import java.util.StringJoiner; /** * Stats for beast mounted infantry units. See TO:AU&E, p. 106 */ -public class InfantryMount { +public class InfantryMount implements Serializable { public enum BeastSize { LARGE(1, 21, 0, 0, true, true, 0, "BeastSize.large"), VERY_LARGE(2, 7, -1, 2, true, false, 1, "BeastSize.very_large"), From dff5674e87568c18741092b70ca3b9a0047fdc35 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 7 Nov 2023 10:27:29 -0600 Subject: [PATCH 20/33] Include mount in cost calculations. --- megamek/src/megamek/common/cost/InfantryCostCalculator.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/cost/InfantryCostCalculator.java b/megamek/src/megamek/common/cost/InfantryCostCalculator.java index b0d27da9383..7ede4d0dbef 100644 --- a/megamek/src/megamek/common/cost/InfantryCostCalculator.java +++ b/megamek/src/megamek/common/cost/InfantryCostCalculator.java @@ -92,11 +92,13 @@ public static double calculateCost(Infantry infantry, CalculationReport costRepo costs[idx++] = -infantry.getPriceMultiplier(); // add in field gun costs - costs[idx] = infantry.originalFieldWeapons().stream() + costs[idx++] = infantry.originalFieldWeapons().stream() .mapToDouble(m -> m.getType().getCost(infantry, false, m.getLocation())).sum(); + costs[idx] = infantry.getMount() == null ? 0 : 5000 * infantry.getWeight(); + double cost = CostCalculator.calculateCost(costs); - String[] systemNames = { "Weapons", "Armor", "Multiplier", "Field Gun" }; + String[] systemNames = { "Weapons", "Armor", "Multiplier", "Field Gun", "Mount" }; CostCalculator.fillInReport(costReport, infantry, ignoreAmmo, systemNames, -1, cost, costs); return cost; } From 8b91967531e6a46e36f3c7ffd3d2be7d9273bc0d Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 7 Nov 2023 10:29:04 -0600 Subject: [PATCH 21/33] Apply rules clarification to damage divisor. --- megamek/src/megamek/common/Infantry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 263b9e573c1..6b7488f9b78 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -1268,7 +1268,7 @@ public double calcDamageDivisor() { divisor += 1.0; } if (mount != null) { - divisor += mount.getDamageDivisor() - 1; + divisor *= mount.getDamageDivisor(); } return divisor; } From a25494d5ba1452f5e151c21e06dedb1bab6c49c1 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 7 Nov 2023 10:31:59 -0600 Subject: [PATCH 22/33] Apply rules clarification about vehicle damage. --- megamek/src/megamek/common/InfantryMount.java | 2 +- .../megamek/common/weapons/infantry/InfantryWeaponHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index 31733ffd7bd..559a5860896 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -154,7 +154,7 @@ public int getBurstDamageDice() { } /** - * @return The amount of additonal damage done to vehicles in the same hex. + * @return The amount of additonal damage done to units other than conventional infantry in the same hex. */ public int getVehicleDamage() { return vehicleDamage; diff --git a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java index a4062fe34c4..d12327c0ece 100644 --- a/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java +++ b/megamek/src/megamek/common/weapons/infantry/InfantryWeaponHandler.java @@ -98,7 +98,7 @@ protected int calcHits(Vector vPhaseReport) { InfantryMount mount = ((Infantry) ae).getMount(); if ((mount != null) && target.isConventionalInfantry() && (mount.getBurstDamageDice() > 0)) { damage += Compute.d6(mount.getBurstDamageDice()); - } else if ((mount != null) && target.isVehicle()) { + } else if ((mount != null) && !target.isConventionalInfantry()) { damage += mount.getVehicleDamage(); } } From fe7ef64a7eff68305121823d513593dd7b33ea78 Mon Sep 17 00:00:00 2001 From: cwspain Date: Tue, 7 Nov 2023 11:41:55 -0600 Subject: [PATCH 23/33] Track rounds spent underwater. --- megamek/src/megamek/common/Entity.java | 1 + megamek/src/megamek/common/MovePath.java | 7 +++++++ megamek/src/megamek/common/MoveStep.java | 20 ++++++++++++++------ megamek/src/megamek/server/GameManager.java | 5 +++++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index 423dc5e681e..371cc08a0b1 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -289,6 +289,7 @@ public abstract class Entity extends TurnOrdered implements Transporter, Targeta public int coolFromExternal = 0; public int delta_distance = 0; public int mpUsed = 0; + public int underwaterRounds = 0; public EntityMovementType moved = EntityMovementType.MOVE_NONE; public EntityMovementType movedLastRound = EntityMovementType.MOVE_NONE; private boolean movedBackwards = false; diff --git a/megamek/src/megamek/common/MovePath.java b/megamek/src/megamek/common/MovePath.java index 91dcb05abf1..64b4c43f106 100644 --- a/megamek/src/megamek/common/MovePath.java +++ b/megamek/src/megamek/common/MovePath.java @@ -1669,6 +1669,13 @@ public boolean automaticWiGELanding(boolean includeMovePathHexes) { } } + /** + * @return Whether the entire path is submerged under water + */ + public boolean isAllUnderwater() { + return steps.stream().allMatch(MoveStep::isUnderwater); + } + protected static class MovePathComparator implements Comparator { private final Coords destination; boolean backward; diff --git a/megamek/src/megamek/common/MoveStep.java b/megamek/src/megamek/common/MoveStep.java index d86e35c9734..41aea2f495e 100644 --- a/megamek/src/megamek/common/MoveStep.java +++ b/megamek/src/megamek/common/MoveStep.java @@ -98,6 +98,7 @@ public class MoveStep implements Serializable { private boolean isTakingCover = false; private int wigeBonus = 0; private int nWigeDescent = 0; + private boolean isUnderwater = false; /** * The Entity that is taking this MoveStep. @@ -1302,12 +1303,15 @@ public void setFromEntity(Entity entity, Game game) { } // if entity already moved into water it can't run now if (curHex.containsTerrain(Terrains.WATER) - && (entity.getElevation() < 0) && (distance > 0) - && (nMove != EntityMovementMode.NAVAL) - && (nMove != EntityMovementMode.HYDROFOIL) - && (nMove != EntityMovementMode.SUBMARINE) - && (nMove != EntityMovementMode.INF_UMU)) { - isRunProhibited = true; + && (entity.getElevation() < 0)) { + isUnderwater = true; + if ((distance > 0) + && (nMove != EntityMovementMode.NAVAL) + && (nMove != EntityMovementMode.HYDROFOIL) + && (nMove != EntityMovementMode.SUBMARINE) + && (nMove != EntityMovementMode.INF_UMU)) { + isRunProhibited = true; + } } } } @@ -1461,6 +1465,10 @@ public boolean isEvading() { return isEvading; } + public boolean isUnderwater() { + return isUnderwater; + } + public boolean isShuttingDown() { return isShuttingDown; } diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index a6abb115d10..dedfb0a7a57 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -8419,6 +8419,11 @@ else if ((step.getElevation() + entity.height()) == 0) { entity.delta_distance = distance; entity.moved = moveType; entity.mpUsed = mpUsed; + if (md.isAllUnderwater()) { + entity.underwaterRounds++; + } else { + entity.underwaterRounds = 0; + } entity.setClimbMode(curClimbMode); if (!sideslipped && !fellDuringMovement && !crashedDuringMovement && (entity.getMovementMode() == EntityMovementMode.VTOL)) { From 828573c840baa481fbb9300cc94ec3307bde16a8 Mon Sep 17 00:00:00 2001 From: cwspain Date: Wed, 8 Nov 2023 10:06:46 -0600 Subject: [PATCH 24/33] Show remaining air for underwater mounts on summary panel and tooltip. --- .../i18n/megamek/client/messages.properties | 2 ++ .../client/ui/swing/tooltip/UnitToolTip.java | 11 ++++++++++ megamek/src/megamek/common/Infantry.java | 2 +- megamek/src/megamek/common/MovePath.java | 11 ++++++++-- megamek/src/megamek/common/MoveStep.java | 20 ++++++------------- megamek/src/megamek/server/GameManager.java | 2 +- 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index 792fdb073f4..f9f564b6b86 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -498,6 +498,7 @@ BoardView1.Tooltip.HotLoaded=Hot-Loaded BoardView1.Tooltip.HotLoadedParens=(Hot-Loaded) BoardView1.Tooltip.Immobile=Immobile BoardView1.Tooltip.InfSpec=Specialization: {0} +BoardView1.Tooltip.InfUWDuration=Rounds of Air: {0} BoardView1.Tooltip.Internals=Internal: {0} BoardView1.Tooltip.Jammed=Jammed by Enemy ECM BoardView1.Tooltip.JumpBoosters=Jump Boosters @@ -4074,6 +4075,7 @@ GeneralInfoMapSet.over=Over: GeneralInfoMapSet.vehicle.mpL1=Cruise: GeneralInfoMapSet.vehicle.mpL2=Flank: GeneralInfoMapSet.curMoveL=Currently: +GeneralInfoMapSet.uwCounterL=Rounds of Air Remaining: GeneralInfoMapSet.currentSensorsL=Current Sensors: GeneralInfoMapSet.capacity=capacity GeneralInfoMapSet.heatL=Heat: diff --git a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java index 7d46ea42e26..b21962f103e 100644 --- a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java +++ b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java @@ -1316,6 +1316,17 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo } } + if (entity instanceof Infantry) { + InfantryMount mount = ((Infantry) entity).getMount(); + if ((mount != null) && (entity.underwaterRounds > 0)) { + String uw = "
" + addToTT("InfUWDuration", NOBR, mount.getUWEndurance() - entity.underwaterRounds).toString(); + if (entity.underwaterRounds >=mount.getUWEndurance()) { + uw = guiScaledFontHTML(GUIP.getWarningColor()) + uw + ""; + } + result += uw; + } + } + String sAeroInfo = ""; if (entity.isAero()) { diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 6b7488f9b78..03272d5baa2 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -590,7 +590,7 @@ public boolean isLocationProhibited(Coords c, int currElevation) { return !getMovementMode().isHover() && !getMovementMode().isUMUInfantry() && !getMovementMode().isSubmarine() && !getMovementMode().isVTOL(); } else { - return hex.terrainLevel(Terrains.WATER) <= mount.getMaxWaterDepth(); + return hex.terrainLevel(Terrains.WATER) > mount.getMaxWaterDepth(); } } return false; diff --git a/megamek/src/megamek/common/MovePath.java b/megamek/src/megamek/common/MovePath.java index 64b4c43f106..746065698b0 100644 --- a/megamek/src/megamek/common/MovePath.java +++ b/megamek/src/megamek/common/MovePath.java @@ -1672,8 +1672,15 @@ public boolean automaticWiGELanding(boolean includeMovePathHexes) { /** * @return Whether the entire path is submerged under water */ - public boolean isAllUnderwater() { - return steps.stream().allMatch(MoveStep::isUnderwater); + public boolean isAllUnderwater(Game game) { + for (MoveStep step : steps) { + Hex hex = game.getBoard().getHex(step.getPosition()); + if (!hex.containsTerrain(Terrains.WATER) + || (step.getElevation() >= 0)) { + return false; + } + } + return true; } protected static class MovePathComparator implements Comparator { diff --git a/megamek/src/megamek/common/MoveStep.java b/megamek/src/megamek/common/MoveStep.java index 41aea2f495e..d86e35c9734 100644 --- a/megamek/src/megamek/common/MoveStep.java +++ b/megamek/src/megamek/common/MoveStep.java @@ -98,7 +98,6 @@ public class MoveStep implements Serializable { private boolean isTakingCover = false; private int wigeBonus = 0; private int nWigeDescent = 0; - private boolean isUnderwater = false; /** * The Entity that is taking this MoveStep. @@ -1303,15 +1302,12 @@ public void setFromEntity(Entity entity, Game game) { } // if entity already moved into water it can't run now if (curHex.containsTerrain(Terrains.WATER) - && (entity.getElevation() < 0)) { - isUnderwater = true; - if ((distance > 0) - && (nMove != EntityMovementMode.NAVAL) - && (nMove != EntityMovementMode.HYDROFOIL) - && (nMove != EntityMovementMode.SUBMARINE) - && (nMove != EntityMovementMode.INF_UMU)) { - isRunProhibited = true; - } + && (entity.getElevation() < 0) && (distance > 0) + && (nMove != EntityMovementMode.NAVAL) + && (nMove != EntityMovementMode.HYDROFOIL) + && (nMove != EntityMovementMode.SUBMARINE) + && (nMove != EntityMovementMode.INF_UMU)) { + isRunProhibited = true; } } } @@ -1465,10 +1461,6 @@ public boolean isEvading() { return isEvading; } - public boolean isUnderwater() { - return isUnderwater; - } - public boolean isShuttingDown() { return isShuttingDown; } diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index dedfb0a7a57..32f1203fb9b 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -8419,7 +8419,7 @@ else if ((step.getElevation() + entity.height()) == 0) { entity.delta_distance = distance; entity.moved = moveType; entity.mpUsed = mpUsed; - if (md.isAllUnderwater()) { + if (md.isAllUnderwater(game)) { entity.underwaterRounds++; } else { entity.underwaterRounds = 0; From f0b2600ce0cfd23d3b61e7960f49f7aeba27765d Mon Sep 17 00:00:00 2001 From: cwspain Date: Wed, 8 Nov 2023 10:30:59 -0600 Subject: [PATCH 25/33] Destroy marine beast-mounted infantry units that do not surface in time. --- megamek/i18n/megamek/client/messages.properties | 1 + .../megamek/common/report-messages.properties | 1 + .../client/ui/swing/MovementDisplay.java | 17 ++++++++++++++++- megamek/src/megamek/server/GameManager.java | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties index f9f564b6b86..9a5b98d8a7f 100644 --- a/megamek/i18n/megamek/client/messages.properties +++ b/megamek/i18n/megamek/client/messages.properties @@ -2469,6 +2469,7 @@ MovementDisplay.ConfirmPilotingRoll=You must make the following piloting\nskill MovementDisplay.ConfirmSprint=Are you sure you want to sprint? MovementDisplay.ConfirmSuperchargerRoll=The movement you have selected will require a roll of {0} or higher\nto avoid Supercharger failure. Do you wish to proceed? MovementDisplay.ConfirmLandingGearDamage=Landing in a rough or rubble hex will damage the landing ger.\n\nAre you sure you want to land here? +MovementDisplay.ConfirmMountSuffocation=This unit will be destroyed if it does not surface for air this round.\nDo you wish to proceed? MovementDisplay.DFADialog.message=To Hit: {0} ({1}%) ({2})\nDamage to Target: {3} (in 5pt clusters){4}\nDamage to Self: {5} (in 5pt clusters) (using Kick table) MovementDisplay.DFADialog.title=D.F.A. {0}? MovementDisplay.Done=Done diff --git a/megamek/i18n/megamek/common/report-messages.properties b/megamek/i18n/megamek/common/report-messages.properties index dba621a1c8c..f7763be873b 100755 --- a/megamek/i18n/megamek/common/report-messages.properties +++ b/megamek/i18n/megamek/common/report-messages.properties @@ -209,6 +209,7 @@ 2404= () takes additional damage from beginning and ending movement in a magma hex! 2405= () is damaged by the extreme heat of liquid magma! 2410= () breaks through ice from below +2412= () runs out of air and is destroyed. 2415= collapes due to nuclear explosion ground zero. 2420= () automatically avoids the skid. 2425= () needs to avoid the skid (), rolls . diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 71ba509c442..faf483751d8 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -1703,7 +1703,7 @@ && ce().getGame().getBoard().getHex(cmd.getFinalCoords()) if (landingPath.stream().map(c -> game().getBoard().getHex(c)).filter(Objects::nonNull) .anyMatch(h -> h.containsTerrain(Terrains.ROUGH) || h.containsTerrain(Terrains.RUBBLE))) { ConfirmDialog nag = new ConfirmDialog(clientgui.frame, - Messages.getString("MovementDisplay.areYourSure"), + Messages.getString("MovementDisplay.areYouSure"), Messages.getString("MovementDisplay.ConfirmLandingGearDamage"), false); nag.setVisible(true); @@ -1718,6 +1718,21 @@ && ce().getGame().getBoard().getHex(cmd.getFinalCoords()) isUsingChaff = false; } + if (ce() instanceof Infantry) { + InfantryMount mount = ((Infantry) ce()).getMount(); + if ((mount != null) && (ce().underwaterRounds >= mount.getUWEndurance()) + && cmd.isAllUnderwater(game())) { + ConfirmDialog nag = new ConfirmDialog(clientgui.frame, + Messages.getString("MovementDisplay.areYouSure"), + Messages.getString("MovementDisplay.ConfirmMountSuffocation"), + false); + nag.setVisible(true); + if (!nag.getAnswer()) { + return; + } + } + } + disableButtons(); clientgui.getBoardView().clearMovementData(); clientgui.getBoardView().clearMovementEnvelope(); diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index 32f1203fb9b..f7750a4867e 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -8421,6 +8421,13 @@ else if ((step.getElevation() + entity.height()) == 0) { entity.mpUsed = mpUsed; if (md.isAllUnderwater(game)) { entity.underwaterRounds++; + if ((entity instanceof Infantry) && (((Infantry) entity).getMount() != null) + && entity.underwaterRounds > ((Infantry) entity).getMount().getUWEndurance()) { + r = new Report(2412); + r.addDesc(entity); + addReport(r); + destroyEntity(entity, "mount drowned"); + } } else { entity.underwaterRounds = 0; } From d1aface4a7f68d19035306e61cf78369173eef89 Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 10:27:31 -0600 Subject: [PATCH 26/33] Show attacker to-hit mod due to size on the TRO view and record sheet. --- megamek/i18n/megamek/common/messages.properties | 1 + megamek/src/megamek/common/templates/InfantryTROView.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/megamek/i18n/megamek/common/messages.properties b/megamek/i18n/megamek/common/messages.properties index 4a058731154..05eed7b3bfb 100644 --- a/megamek/i18n/megamek/common/messages.properties +++ b/megamek/i18n/megamek/common/messages.properties @@ -593,6 +593,7 @@ TROView.InfantryNote.ECMArmor=Invisible to standard/light active probes. TROView.InfantryNote.Augmented=Cybernetically enhanced infantry: TROView.InfantryNote.MountInfantryDamage.format=+%dD6 damage vs. infantry TROView.InfantryNote.MountVehicleDamage.format=+%d damage vs. Vehicles/'Mechs +TROView.InfantryNote.MountSizeMod.format=%d attacker to-hit MovementType.None=None MovementType.Biped=Biped MovementType.Quad=Quad diff --git a/megamek/src/megamek/common/templates/InfantryTROView.java b/megamek/src/megamek/common/templates/InfantryTROView.java index 4e4dd78e263..2227f13c342 100644 --- a/megamek/src/megamek/common/templates/InfantryTROView.java +++ b/megamek/src/megamek/common/templates/InfantryTROView.java @@ -206,6 +206,10 @@ private void addWeaponNotes(List notes) { notes.add(String.format(Messages.getString("TROView.InfantryNote.MountVehicleDamage.format"), inf.getMount().getVehicleDamage())); } + if (inf.getMount().getSize().toHitMod != 0) { + notes.add(String.format(Messages.getString("TROView.InfantryNote.MountSizeMod.format"), + inf.getMount().getSize().toHitMod)); + } } } From 93c207e82cc48a93aa41e2c7b560b3cdb26c3cbf Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 11:05:49 -0600 Subject: [PATCH 27/33] Make very large and monstrous mounted infantry 2 levels high. --- .../src/megamek/client/ui/swing/MovementDisplay.java | 2 +- .../megamek/client/ui/swing/tooltip/UnitToolTip.java | 2 +- megamek/src/megamek/common/Infantry.java | 5 +++++ megamek/src/megamek/common/InfantryMount.java | 10 ++++++---- megamek/src/megamek/common/MovePath.java | 4 ++-- megamek/src/megamek/server/GameManager.java | 4 +++- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index faf483751d8..39ab6c74e55 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -1720,7 +1720,7 @@ && ce().getGame().getBoard().getHex(cmd.getFinalCoords()) if (ce() instanceof Infantry) { InfantryMount mount = ((Infantry) ce()).getMount(); - if ((mount != null) && (ce().underwaterRounds >= mount.getUWEndurance()) + if ((mount != null) && ce().getMovementMode().isSubmarine() && (ce().underwaterRounds >= mount.getUWEndurance()) && cmd.isAllUnderwater(game())) { ConfirmDialog nag = new ConfirmDialog(clientgui.frame, Messages.getString("MovementDisplay.areYouSure"), diff --git a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java index b21962f103e..3b9dbb9717e 100644 --- a/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java +++ b/megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java @@ -1318,7 +1318,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo if (entity instanceof Infantry) { InfantryMount mount = ((Infantry) entity).getMount(); - if ((mount != null) && (entity.underwaterRounds > 0)) { + if ((mount != null) && entity.getMovementMode().isSubmarine() && (entity.underwaterRounds > 0)) { String uw = "
" + addToTT("InfUWDuration", NOBR, mount.getUWEndurance() - entity.underwaterRounds).toString(); if (entity.underwaterRounds >=mount.getUWEndurance()) { uw = guiScaledFontHTML(GUIP.getWarningColor()) + uw + ""; diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index 03272d5baa2..cd199961851 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -500,6 +500,11 @@ public int getAllUMUCount() { return hasUMU() ? jumpMP : 0; } + @Override + public int height() { + return mount == null ? 0 : mount.getSize().height; + } + @Override public boolean antiTSMVulnerable() { if (!hasAbility(OptionsConstants.MD_TSM_IMPLANT)) { diff --git a/megamek/src/megamek/common/InfantryMount.java b/megamek/src/megamek/common/InfantryMount.java index 559a5860896..32e1a3ea353 100644 --- a/megamek/src/megamek/common/InfantryMount.java +++ b/megamek/src/megamek/common/InfantryMount.java @@ -23,9 +23,9 @@ */ public class InfantryMount implements Serializable { public enum BeastSize { - LARGE(1, 21, 0, 0, true, true, 0, "BeastSize.large"), - VERY_LARGE(2, 7, -1, 2, true, false, 1, "BeastSize.very_large"), - MONSTROUS(4, 2, -2, 3, false, false, 2, "BeastSize.monstrous"); + LARGE(1, 21, 0, 0, true, true, 0, 0, "BeastSize.large"), + VERY_LARGE(2, 7, -1, 2, true, false, 1, 1, "BeastSize.very_large"), + MONSTROUS(4, 2, -2, 3, false, false, 2, 1, "BeastSize.monstrous"); /** Maximum number of troopers that can be mounted on each beast. For values > 2, * each creature is a separate squad. */ @@ -42,11 +42,12 @@ public enum BeastSize { public final boolean canMakeSwarmAttacks; /** Additional MP required to enter a building hex. The building takes twice this much CF damage. */ public final int buildingMP; + public final int height; private final String messageId; BeastSize(int troopsPerCreature, int creaturesPerPlatoon, int toHitMod, int supportWeaponsPerCreature, boolean canMakeLegAttacks, - boolean canMakeSwarmAttacks, int buildingMP, String messageId) { + boolean canMakeSwarmAttacks, int buildingMP, int height, String messageId) { this.troopsPerCreature = troopsPerCreature; this.creaturesPerPlatoon = creaturesPerPlatoon; this.toHitMod = toHitMod; @@ -54,6 +55,7 @@ public enum BeastSize { this.canMakeLegAttacks = canMakeLegAttacks; this.canMakeSwarmAttacks = canMakeSwarmAttacks; this.buildingMP = buildingMP; + this.height = height; this.messageId = messageId; } diff --git a/megamek/src/megamek/common/MovePath.java b/megamek/src/megamek/common/MovePath.java index 746065698b0..4374b4ee55e 100644 --- a/megamek/src/megamek/common/MovePath.java +++ b/megamek/src/megamek/common/MovePath.java @@ -1670,13 +1670,13 @@ public boolean automaticWiGELanding(boolean includeMovePathHexes) { } /** - * @return Whether the entire path is submerged under water + * @return Whether the entire path is submerged */ public boolean isAllUnderwater(Game game) { for (MoveStep step : steps) { Hex hex = game.getBoard().getHex(step.getPosition()); if (!hex.containsTerrain(Terrains.WATER) - || (step.getElevation() >= 0)) { + || (step.getElevation() >= -entity.height())) { return false; } } diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index f7750a4867e..3e15ce43b89 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -8422,6 +8422,7 @@ else if ((step.getElevation() + entity.height()) == 0) { if (md.isAllUnderwater(game)) { entity.underwaterRounds++; if ((entity instanceof Infantry) && (((Infantry) entity).getMount() != null) + && entity.getMovementMode().isSubmarine() && entity.underwaterRounds > ((Infantry) entity).getMount().getUWEndurance()) { r = new Report(2412); r.addDesc(entity); @@ -11642,7 +11643,8 @@ public Vector doSetLocationsExposure(Entity entity, Hex hex, entity.setLocationStatus(Mech.LOC_CLEG, ILocationExposureStatus.WET); vPhaseReport.addAll(breachCheck(entity, Mech.LOC_CLEG, hex)); } - } else { + // Beast-mounted infantry can sit above the water level + } else if (!entity.isConventionalInfantry() || (hex.terrainLevel(Terrains.WATER) > entity.height())) { for (int loop = 0; loop < entity.locations(); loop++) { entity.setLocationStatus(loop, ILocationExposureStatus.WET); vPhaseReport.addAll(breachCheck(entity, loop, hex)); From fc017fb414f55fad3774893e6141155838b64fa6 Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 14:34:16 -0600 Subject: [PATCH 28/33] Fix issues with aquatic beast infantry with height 2. --- .../megamek/client/ui/swing/DeploymentDisplay.java | 4 +++- megamek/src/megamek/common/MovePath.java | 5 +++-- megamek/src/megamek/server/GameManager.java | 14 +++++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java index 78f626d89ae..447df21f3dc 100644 --- a/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java +++ b/megamek/src/megamek/client/ui/swing/DeploymentDisplay.java @@ -530,10 +530,12 @@ public void hexMoused(BoardViewEvent b) { } else if (!isAero && !isWiGE) { // hovers and naval units go on the surface if ((ce().getMovementMode() == EntityMovementMode.NAVAL) - || (ce().getMovementMode() == EntityMovementMode.SUBMARINE) || (ce().getMovementMode() == EntityMovementMode.HYDROFOIL) || (ce().getMovementMode() == EntityMovementMode.HOVER)) { ce().setElevation(0); + } else if (ce().getMovementMode().isSubmarine()) { + // submarines have one level above the surface + ce().setElevation(-ce().height()); } else if (isVTOL) { // VTOLs go to elevation 1... unless set in the Lounge. // or if mechanized BA, since VTOL movement is then illegal diff --git a/megamek/src/megamek/common/MovePath.java b/megamek/src/megamek/common/MovePath.java index 4374b4ee55e..0dcc284d871 100644 --- a/megamek/src/megamek/common/MovePath.java +++ b/megamek/src/megamek/common/MovePath.java @@ -1670,7 +1670,7 @@ public boolean automaticWiGELanding(boolean includeMovePathHexes) { } /** - * @return Whether the entire path is submerged + * @return Whether the entire path is submerged. A unit is only considered submerged when entirely undewater. */ public boolean isAllUnderwater(Game game) { for (MoveStep step : steps) { @@ -1680,7 +1680,8 @@ public boolean isAllUnderwater(Game game) { return false; } } - return true; + return game.getBoard().getHex(entity.getPosition()).containsTerrain(Terrains.WATER) + && entity.relHeight() < 0; } protected static class MovePathComparator implements Comparator { diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index 3e15ce43b89..e6362e70af8 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -11644,11 +11644,23 @@ public Vector doSetLocationsExposure(Entity entity, Hex hex, vPhaseReport.addAll(breachCheck(entity, Mech.LOC_CLEG, hex)); } // Beast-mounted infantry can sit above the water level - } else if (!entity.isConventionalInfantry() || (hex.terrainLevel(Terrains.WATER) > entity.height())) { + } else if (!entity.isConventionalInfantry() || (entity.relHeight() < 0)) { for (int loop = 0; loop < entity.locations(); loop++) { entity.setLocationStatus(loop, ILocationExposureStatus.WET); vPhaseReport.addAll(breachCheck(entity, loop, hex)); } + } else { + int status = ILocationExposureStatus.WET; + if (entity.isConventionalInfantry() && (entity.relHeight() >= 0)) { + status = game.getPlanetaryConditions().isVacuum() ? + ILocationExposureStatus.VACUUM : ILocationExposureStatus.NORMAL; + } + for (int loop = 0; loop < entity.locations(); loop++) { + entity.setLocationStatus(loop, status); + if (status == ILocationExposureStatus.WET) { + vPhaseReport.addAll(breachCheck(entity, loop, hex)); + } + } } } else { for (int loop = 0; loop < entity.locations(); loop++) { From 7720659d0884efe932cda0a5509a31cd64a1924a Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 17:16:11 -0600 Subject: [PATCH 29/33] Handle uw beast-mounted infantry entering and leaving the water. --- megamek/src/megamek/common/Entity.java | 15 +++++++-------- megamek/src/megamek/common/Infantry.java | 15 +++++++++++++++ megamek/src/megamek/common/MoveStep.java | 3 ++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/megamek/src/megamek/common/Entity.java b/megamek/src/megamek/common/Entity.java index 371cc08a0b1..9a49f73ed52 100644 --- a/megamek/src/megamek/common/Entity.java +++ b/megamek/src/megamek/common/Entity.java @@ -1948,7 +1948,7 @@ public void setElevation(int elevation) { /** * A helper function for fiddling with elevation. Takes the current hex, a * hex being moved to, returns the elevation the Entity will be considered - * to be at w/r/t it's new hex. + * to be at w/r/t its new hex. */ public int calcElevation(Hex current, Hex next, int assumedElevation, boolean climb, boolean wigeEndClimbPrevious) { @@ -1991,12 +1991,11 @@ public int calcElevation(Hex current, Hex next, int assumedElevation, } // Elevation is this height of the level above the actual surface elevation of the hex. retVal = nextLevel - next.getLevel(); - } else if ((getMovementMode() == EntityMovementMode.SUBMARINE) - || ((getMovementMode() == EntityMovementMode.INF_UMU) + } else if (((getMovementMode().isSubmarine() || getMovementMode().isUMUInfantry()) && next.containsTerrain(Terrains.WATER) && current.containsTerrain(Terrains.WATER)) - || (getMovementMode() == EntityMovementMode.VTOL) - || ((getMovementMode() == EntityMovementMode.QUAD_SWIM) && hasUMU()) - || ((getMovementMode() == EntityMovementMode.BIPED_SWIM) && hasUMU())) { + || getMovementMode().isVTOL() + || (getMovementMode().isQuadSwim() && hasUMU()) + || (getMovementMode().isBipedSwim() && hasUMU())) { retVal += current.getLevel(); retVal -= next.getLevel(); } else { @@ -2351,8 +2350,8 @@ && getMovementMode() == EntityMovementMode.INF_UMU) { } // only mechs can move underwater if (hex.containsTerrain(Terrains.WATER) - && (assumedAlt < hex.getLevel()) && !(this instanceof Mech) - && !(this instanceof Protomech)) { + && (assumedAlt < hex.getLevel()) && !(this instanceof Mech) + && !(this instanceof Protomech)) { return false; } // can move on the ground unless its underwater diff --git a/megamek/src/megamek/common/Infantry.java b/megamek/src/megamek/common/Infantry.java index cd199961851..e7dd34a47ef 100644 --- a/megamek/src/megamek/common/Infantry.java +++ b/megamek/src/megamek/common/Infantry.java @@ -602,6 +602,21 @@ public boolean isLocationProhibited(Coords c, int currElevation) { } @Override + public boolean isElevationValid(int assumedElevation, Hex hex) { + if (mount != null) { + // Mounted infantry can enter water hexes if the mount allows it + if (hex.containsTerrain(Terrains.WATER) && (hex.terrainLevel(Terrains.WATER) <= mount.getMaxWaterDepth())) { + return true; + } + // Aquatic mounts may be able to move onto land + if (!hex.containsTerrain(Terrains.WATER) && movementMode.isSubmarine()) { + return mount.getSecondaryGroundMP() > 0; + } + } + return super.isElevationValid(assumedElevation, hex); + } + + @Override public String getMovementString(EntityMovementType mtype) { switch (mtype) { case MOVE_NONE: diff --git a/megamek/src/megamek/common/MoveStep.java b/megamek/src/megamek/common/MoveStep.java index d86e35c9734..4740d116d7a 100644 --- a/megamek/src/megamek/common/MoveStep.java +++ b/megamek/src/megamek/common/MoveStep.java @@ -2334,7 +2334,8 @@ && getClearance() < 0) { if ((getEntity().getMovementMode() == EntityMovementMode.BIPED_SWIM) || (getEntity().getMovementMode() == EntityMovementMode.QUAD_SWIM) || ((getEntity() instanceof Infantry - && getEntity().getMovementMode() == EntityMovementMode.SUBMARINE))) { + && getEntity().getMovementMode().isSubmarine() + && (currHex.terrainLevel(Terrains.WATER) > 0)))) { tmpWalkMP = entity.getActiveUMUCount(); } From 18e683707d4a0d1a0ba13fbf1b5d86ce9dd27d79 Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 19:33:16 -0600 Subject: [PATCH 30/33] Fix mount size attacker mod. --- megamek/src/megamek/common/actions/WeaponAttackAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/actions/WeaponAttackAction.java b/megamek/src/megamek/common/actions/WeaponAttackAction.java index e9cbb1e6024..f24806450a7 100644 --- a/megamek/src/megamek/common/actions/WeaponAttackAction.java +++ b/megamek/src/megamek/common/actions/WeaponAttackAction.java @@ -4208,8 +4208,8 @@ else if ((atype != null) toHit.addModifier(1, Messages.getString("WeaponAttackAction.BaTarget")); } - // infantry squads are also hard to hit - if ((te instanceof Infantry) && te.isConventionalInfantry() && ((Infantry) te).isSquad()) { + if ((te instanceof Infantry) && te.isConventionalInfantry()) { + // infantry squads are also hard to hit if (((Infantry) te).isSquad()) { toHit.addModifier(1, Messages.getString("WeaponAttackAction.SquadTarget")); } From f0addbf47da556a76d0bba7f2b41347083fe8e2d Mon Sep 17 00:00:00 2001 From: cwspain Date: Thu, 9 Nov 2023 20:02:09 -0600 Subject: [PATCH 31/33] Implement mount effects on secondary weapon limits. --- .../src/megamek/common/verifier/TestInfantry.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/verifier/TestInfantry.java b/megamek/src/megamek/common/verifier/TestInfantry.java index 900169f5025..5fbe9625110 100644 --- a/megamek/src/megamek/common/verifier/TestInfantry.java +++ b/megamek/src/megamek/common/verifier/TestInfantry.java @@ -139,6 +139,10 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) { if (inf.getSecondaryWeapon() != null) { int secondaryCrew = inf.getSecondaryWeapon().getCrew(); + // Beast mounted infantry divide crew requirement in half, rounding up. + if (inf.getMount() != null) { + secondaryCrew = secondaryCrew / 2 + secondaryCrew % 2; + } if (inf.getCrew() != null) { if (inf.hasAbility(OptionsConstants.MD_TSM_IMPLANT)) { secondaryCrew--; @@ -171,12 +175,17 @@ public boolean correctEntity(StringBuffer buff, int ammoTechLvl) { } public static int maxSecondaryWeapons(Infantry inf) { - int max = 2; - if (inf.getMovementMode() == EntityMovementMode.VTOL) { + int max; + if (inf.getMount() != null) { + max = inf.getMount().getSize().supportWeaponsPerCreature; + } else if (inf.getMovementMode() == EntityMovementMode.VTOL) { max = inf.hasMicrolite() ? 0 : 1; } else if (inf.getMovementMode() == EntityMovementMode.INF_UMU) { max = inf.getAllUMUCount(); + } else { + max = 2; } + if (inf.hasSpecialization(Infantry.COMBAT_ENGINEERS)) { max = 0; } From 92417836a512c6d1c14d91c14dcefb217cc2faab Mon Sep 17 00:00:00 2001 From: HammerGS Date: Tue, 14 Nov 2023 15:50:59 -0700 Subject: [PATCH 32/33] Data: Adding some units and first set of sprites for them. No default sprites set as not sure of the naming conventions yet. --- megamek/data/images/units/Infantry/Branth.png | Bin 0 -> 2027 bytes megamek/data/images/units/Infantry/Camel.png | Bin 0 -> 1395 bytes megamek/data/images/units/Infantry/Donkey.png | Bin 0 -> 1464 bytes megamek/data/images/units/Infantry/Horse.png | Bin 0 -> 1525 bytes megamek/data/images/units/mechset.txt | 6 ++ .../3085/Marik/Beast Infantry (Aerial).blk | 69 ++++++++++++++++ .../Beast Infantry (Branth)(Auto Rifle).blk | 57 +++++++++++++ .../Beast Infantry (Branth)(Gyrojet).blk | 61 ++++++++++++++ .../Beast Infantry (Branth)(Laser Rifle).blk | 57 +++++++++++++ .../Beast Infantry (Branth)(Needler).blk | 61 ++++++++++++++ .../Beast Infantry (Branth)(Pulse Laser).blk | 61 ++++++++++++++ .../Branth/Beast Infantry (Branth)(SMG).blk | 57 +++++++++++++ .../Beast Infantry (Branth)(Shotgun).blk | 61 ++++++++++++++ .../Beast Infantry (Branth)(Sniper).blk | 61 ++++++++++++++ .../Beast Infantry (Camel)(Auto Rifle).blk | 61 ++++++++++++++ .../Camel/Beast Infantry (Camel)(Gyrojet).blk | 61 ++++++++++++++ .../Beast Infantry (Camel)(Laser Rifle).blk | 61 ++++++++++++++ .../Camel/Beast Infantry (Camel)(Needler).blk | 61 ++++++++++++++ .../Beast Infantry (Camel)(Pulse Laser).blk | 61 ++++++++++++++ .../Camel/Beast Infantry (Camel)(SMG).blk | 61 ++++++++++++++ .../Camel/Beast Infantry (Camel)(Shotgun).blk | 61 ++++++++++++++ .../Camel/Beast Infantry (Camel)(Sniper).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(Auto Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(Gyrojet).blk | 61 ++++++++++++++ ...Beast Infantry (Kangaroo)(Laser Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(Needler).blk | 61 ++++++++++++++ ...Beast Infantry (Kangaroo)(Pulse Laser).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(SMG).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(Shotgun).blk | 61 ++++++++++++++ .../Beast Infantry (Kangaroo)(Sniper).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Auto Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Gyrojet).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Laser Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Needler).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Pulse Laser).blk | 61 ++++++++++++++ .../Donkey/Beast Infantry (Donkey)(SMG).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Shotgun).blk | 61 ++++++++++++++ .../Beast Infantry (Donkey)(Sniper).blk | 61 ++++++++++++++ ...ast Infantry (Elephant)(Auto-Rifle_MG).blk | 73 +++++++++++++++++ .../Beast Infantry (Elephant)(Gyrojet_GL).blk | 69 ++++++++++++++++ ...t Infantry (Elephant)(Laser Rifle_MRR).blk | 69 ++++++++++++++++ ...ry (Elephant)(Laser Rifle_Support PPC).blk | 69 ++++++++++++++++ ...Beast Infantry (Elephant)(Needler_SRM).blk | 69 ++++++++++++++++ ...ast Infantry (Elephant)(Pistol_Mortar).blk | 69 ++++++++++++++++ ...y (Elephant)(Pulse Laser_Plasma Rifle).blk | 69 ++++++++++++++++ ... (Elephant)(Pulse Laser_Support Pulse).blk | 69 ++++++++++++++++ ...ry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk | 77 ++++++++++++++++++ ...t Infantry (Hipposaur)(Auto-Rifle_LRR).blk | 77 ++++++++++++++++++ ...t Infantry (Hipposaur)(Auto-Rifle_SRM).blk | 77 ++++++++++++++++++ ...try (Hipposaur)(Auto-Rifle_Support MG).blk | 77 ++++++++++++++++++ ...t Infantry (Hipposaur)(Laser Rifle_GL).blk | 77 ++++++++++++++++++ .../Beast Infantry (Hipposaur)(SMG_GL).blk | 77 ++++++++++++++++++ .../Beast Infantry (Horse)(Auto Rifle).blk | 61 ++++++++++++++ .../Horse/Beast Infantry (Horse)(Gyrojet).blk | 61 ++++++++++++++ .../Beast Infantry (Horse)(Laser Rifle).blk | 61 ++++++++++++++ .../Horse/Beast Infantry (Horse)(Needler).blk | 61 ++++++++++++++ .../Beast Infantry (Horse)(Pulse Laser).blk | 61 ++++++++++++++ .../Horse/Beast Infantry (Horse)(SMG).blk | 61 ++++++++++++++ .../Horse/Beast Infantry (Horse)(Shotgun).blk | 61 ++++++++++++++ .../Horse/Beast Infantry (Horse)(Sniper).blk | 61 ++++++++++++++ ...st Infantry (Odessan Raxx)(Auto-Rifle).blk | 61 ++++++++++++++ ...Beast Infantry (Odessan Raxx)(Gyrojet).blk | 61 ++++++++++++++ ...t Infantry (Odessan Raxx)(Laser Rifle).blk | 61 ++++++++++++++ ...Beast Infantry (Odessan Raxx)(Needler).blk | 61 ++++++++++++++ ...t Infantry (Odessan Raxx)(Pulse Laser).blk | 61 ++++++++++++++ .../Beast Infantry (Odessan Raxx)(SMG).blk | 61 ++++++++++++++ ...Beast Infantry (Odessan Raxx)(Shotgun).blk | 61 ++++++++++++++ .../Beast Infantry (Odessan Raxx)(Sniper).blk | 61 ++++++++++++++ ...Infantry (Orca)(Gyrojet_Support Laser).blk | 69 ++++++++++++++++ .../Beast Infantry (Orca)(Laser Rifle).blk | 61 ++++++++++++++ ...Beast Infantry (Tabiranth)(Auto Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Tabiranth)(Gyrojet).blk | 61 ++++++++++++++ ...east Infantry (Tabiranth)(Laser Rifle).blk | 61 ++++++++++++++ .../Beast Infantry (Tabiranth)(Needler).blk | 61 ++++++++++++++ ...east Infantry (Tabiranth)(Pulse Laser).blk | 61 ++++++++++++++ .../Beast Infantry (Tabiranth)(SMG).blk | 61 ++++++++++++++ .../Beast Infantry (Tabiranth)(Shotgun).blk | 61 ++++++++++++++ .../Beast Infantry (Tabiranth)(Sniper).blk | 61 ++++++++++++++ .../Beast Infantry (Tariq)(Auto-Rifle).blk | 61 ++++++++++++++ .../Tariq/Beast Infantry (Tariq)(Gyrojet).blk | 61 ++++++++++++++ .../Beast Infantry (Tariq)(Laser Rifle).blk | 61 ++++++++++++++ .../Tariq/Beast Infantry (Tariq)(Needler).blk | 61 ++++++++++++++ .../Beast Infantry (Tariq)(Pulse Laser).blk | 61 ++++++++++++++ .../Tariq/Beast Infantry (Tariq)(SMG).blk | 61 ++++++++++++++ .../Tariq/Beast Infantry (Tariq)(Shotgun).blk | 61 ++++++++++++++ .../Tariq/Beast Infantry (Tariq)(Sniper).blk | 61 ++++++++++++++ 86 files changed, 5115 insertions(+) create mode 100644 megamek/data/images/units/Infantry/Branth.png create mode 100644 megamek/data/images/units/Infantry/Camel.png create mode 100644 megamek/data/images/units/Infantry/Donkey.png create mode 100644 megamek/data/images/units/Infantry/Horse.png create mode 100644 megamek/data/mechfiles/infantry/3085/Marik/Beast Infantry (Aerial).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk create mode 100644 megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk diff --git a/megamek/data/images/units/Infantry/Branth.png b/megamek/data/images/units/Infantry/Branth.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea70b127472b81572dcbda07ce016e2dd008e19 GIT binary patch literal 2027 zcmVEX>4Tx04R}tkv&MmKp2MKri!9f2aAX}WT;LSK}8%(6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~>f)s6A|-y86k5c1$8itueecWNcYshYGu7;f0IFsg z$yij(WLL$mSM;JELo_EPX6o_OVj7;~>mEM7--UUWcio?(Psy1K@QK6`rW+RV2J!5s zrE}gV4zi-85T6rI7<576N3P2*zi}=&Ebz>rkxtGN2Z_Z(8_R9XiiS!&LmX06jq-(z z%L?Z$&T6^Jn)l={4CJ(x6xV5uB8DZzk$?ypRg_SMg)r?JDJGJ19`*2#IQ|5=WO9|j z$gzM5R7j2={11Nj*33^&xk-U2(D`E9A7en*F3_mi_V=-EH%~USZpP!(hprN6m zqN1Xsqobsxq@|^$rlzK;si~{0tE{Z7t*x!DuCA}IuduMNv9YnUv$M3cw6(Rhwzjsn zx3{>sxVgExy1Kf%ySu!+yuQA^zrVl0z`()5!NS7A!^6YG#KgtL#m2_Q$jHda$;ryf z%FD~k%*@Qq&CSlv&e74))YR0~)z#P6*V)lt)=I7_<=;-L_>FMg~>g??7?(XjI@9**P@$&NW^Yioc^z`-h_4oJp`1ttw z`T6?#`uqF){QUg={r&#_{{R2~)y~dj00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG z010qNS#tmYE+YT{E+YYWr9XB6000McNliru=L-%NB?msHT|NK+02FjZSad^gZEa<4 zbO2{*W;ALsGBGwFARx*hw&RcryD zP--g_NeiUKB!Cz^9wILlFqb0`NH#W6v{-FHq%;Mh0YOdn&phuE9~feYvi#D?HG~mxC^Lt%1RvNCtrmuq|pOY_#PyT?sY94MnwNqeZAj>C}&yLYjxlCDe*LrT%k@xiZjcGMSazd47i| zmhy zsR*!9_=Gca^Wa}LknW1yM$q!9C|0qlH|kd{BjJ=9iD@+Wquv|B*`n@!gxCL zQ8p_IKtLfyUwT&3b-QJ$@yOzl#wCmWx|Htpc@-8xm@mq4<0$!#RKpnqwx**^HV|{Z z?^M}vFzal$qTH}=?WRY+#hMrEw^OMUT45 zm*1r})}ANSR?IThOth$Fb}&6E5u1My4x;J57XN9Azoj}-*VX9UOc>q%=jJrf~YB5k_WOL8IPXsEAi7y3Nt&)CZm9E7=1ZS7e5 zf6>P?{)-KDd$crt^7NUiABExCH&eZY@jWDV+taBkmoN}~)b|qc+o0c{8=G|5ZRhnm zU8;&|G#a|f=59=xEhrS=nFGe+bc#N4=DQ1?nX6MEC#o&4KYqSOuhZ%_-9gcML(MA{ z{f*;zYSReC)z&&4i{mgCN`G^RrgfP$zoNNo|B{M=*z<|ZpQ!S`Os7} zyY~(&=3PFCQI_h*@Sk4z=yH2YN$(oQ2&!K~)s#MUv3viOp?*G&BUWN1ny&6Lj>P@! zY6Qx}P|dLpV_Sb0yK6`ks!)^VWz)5S8M!=IZ6)YWwYj#%f9bW9-FhgQLD0tq)UtCuhZK~ za%WSzvY7mVS65y_9xZAxl1GhhW*1%}EX>4Tx04R}tkv&MmKp2MKri!9f2aAX}WT;LSK}8%(6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~>f)s6A|-y86k5c1$8itueecWNcYshYGu7;f0IFsg z$yij(WLL$mSM;JELo_EPX6o_OVj7;~>mEM7--UUWcio?(Psy1K@QK6`rW+RV2J!5s zrE}gV4zi-85T6rI7<576N3P2*zi}=&Ebz>rkxtGN2Z_Z(8_R9XiiS!&LmX06jq-(z z%L?Z$&T6^Jn)l={4CJ(x6xV5uB8DZzk$?ypRg_SMg)r?JDJGJ19`*2#IQ|5=WO9|j z$gzM5R7j2={11Nj*33^&xk-U2(D`E9A7en*F3_mi_V=-EH%~U%CMPE+C@3f?DJd!{Dl021EG#T7EiEoC zE-x=HFfcGNF)=bSGB`LmK|w)6LPA4BLq$bJMn*nhqkB^U# zkdTs+l9Q8@mX?;7n3$QFnVXxNoSdAXprEIxr>Ll?tE;Q5tgNrEud%VQv$M0cwY9dk zwzs#py1Kf+z`()5!N$hM&(F`()6>}4*xlXT-{0Tj;^OJ)>FVn0>+9?6?CkFD?(*{T z_4W1t|Np^-8aDs{00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm001r{001r{ z0eGc9b^rhX2XskIMF-~#4i+T{t{FhD0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJ zAV*0}P*;Ht7XSbP8A(JzR9M69nAcLmP!vUvfM7#HVn7Y{-YfQsUF^Mn%l&nYWi)cj zK2csA&a<<1!ML&}B+7798U5#@tz{U^9%cW0)b6?M%kV~9jiZfQw?&sVszrOhw#Eym zpEIgQ`?!XJ&H7CBXrDh+a9E>yw2w<|JL=D#xM*)zC(>(8LSz`DS~UM^N0Wz7$F68% zjB3&Rs~Jh2JfB*rG(2iR^DmxQxqp7N#~pOkgy#RD`Rcj(^^HCIsu>(Lp}k&gIyPLN zN-w)N8F18u=8sO!CN?|I-MfbtY*dZ*?VF2Eba^M;`RgqBnJUq~3n5a~-rF%VWx436 z0_{}@yrR1GBRtsNU4RiFih5E)$DzbHDmP!wnZAw-9kjxG-v zqYAX35TawdTj>Q{C4}0_VYpx=tA#SW8KTppFiLT2U$lb#xHciZUUnql2(klnOx^9fY-_ zR0zuGAgmRoLQqBrfvs371Wj}h*oq}W&_xHKt@u+2y67Od6+JvU2yVq3?idQyiiVz| zP_1a_DGJq!hMuBOt!U^e3e}2+o+36I&{M=_1A2EX>4Tx04R}tkv&MmKp2MKri!9f2aAX}WT;LSK}8%(6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~>f)s6A|-y86k5c1$8itueecWNcYshYGu7;f0IFsg z$yij(WLL$mSM;JELo_EPX6o_OVj7;~>mEM7--UUWcio?(Psy1K@QK6`rW+RV2J!5s zrE}gV4zi-85T6rI7<576N3P2*zi}=&Ebz>rkxtGN2Z_Z(8_R9XiiS!&LmX06jq-(z z%L?Z$&T6^Jn)l={4CJ(x6xV5uB8DZzk$?ypRg_SMg)r?JDJGJ19`*2#IQ|5=WO9|j z$gzM5R7j2={11Nj*33^&xk-U2(D`E9A7en*F3_mi_V=-EH%~U{0D=aK5EiElBE-o)G zFEB7LF)=YRGBPtWGdDLkJ3Bi*K0ZG`KR`f0LPA1CMMX(TNlQyhQc_Y=Q&Uw{RaRD3 zSXfwIUS45gVPaxpV`F1vWMpP$W@u<=X=!O{YHDk1YjSdOb8~Zbb#-=jc6fMrdwY9) ze0+ULl?udlDLu&}YQv9-0ewzjsnx3{>sxVgExySux*yu7}?zQDl1!NI}9!^6bH#LLUe z%*@Qv($dz}*4Nk9+uPgU-{0ou=IQC_>gww2>+9_7?C$RF@$vEX_4WDr`L26TEC2ui z0d!JMQvg8b*k%9#00Cl4M??UK1szBL000SaNLh0L04^f{04^f|c%?sf00007bV*G` z2j>e879|L-89=W9000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006v zNklET&wG7q_cm+aZ^c9p@R%4HLmv&AS0eIvfaZSXR7@hrLc{Kp7Yzy~m1Ch#7tc28 z6;LY2LepPMYZ@q(W1-LMzGS)-e-@Qvp)IxVyq*Z3DwX4)ZsdIqq6i)UnPZ?;ed+JT zWk2HsCY@uTsh8;=3!A}k2%vP1hPp*(V)xJSa&Xir|9Cn_L!EJFB<+Pivw!7(ipeq1 z_hYH~&i(Aa(BbyFQijU|)!w@Jc;t@9iA>P!IRzR!)MN#N6+F--r8R z=j5jSt`{zba9`}43>{q9J6R9mzSub#`sUlg`Bnh;#m>pl*Yi84>t2ZV#m_t&0VyCItf4Q&Lw0ZfC0Hmv64-2kRRL4)p+-NV`qU>ZheGS+SY z(=a-dv38?XHVvaQnVY*&15Cr{OyEX>4Tx04R}tkv&MmKp2MKri!9f2aAX}WT;LSK}8%(6^me@v=v%)FuC*(nlvOS zE{=k0!NH%!s)LKOt`4q(Aov5~>f)s6A|-y86k5c1$8itueecWNcYshYGu7;f0IFsg z$yij(WLL$mSM;JELo_EPX6o_OVj7;~>mEM7--UUWcio?(Psy1K@QK6`rW+RV2J!5s zrE}gV4zi-85T6rI7<576N3P2*zi}=&Ebz>rkxtGN2Z_Z(8_R9XiiS!&LmX06jq-(z z%L?Z$&T6^Jn)l={4CJ(x6xV5uB8DZzk$?ypRg_SMg)r?JDJGJ19`*2#IQ|5=WO9|j z$gzM5R7j2={11Nj*33^&xk-U2(D`E9A7en*F3_mi_V=-EH%~U{0D=aK5EiElBE-o)G zFEB7LF)=YRGBPzaH8(dmJ3Bi)Jv}}?K0`x8MMXtMMn*|VNls2qPft%!P*77-Q&m+} zR#sM5S65wKU0+{cU|?WlV`F4wWMyS#XlQ6@X=!R|YHMq2Z*OmMa&mKXb98icb#--i zc6N7ncX)Vsd3kwydU||(e1Cs`f`WpBgM)^KhKGlTh=_=bi;Iqqj*pLzl9G~?l$4c~ zm6({AnwpxMo13GfqokyyrKP2(r>Co{tE{Z7uCA`Iu&}nawzs#pxVX5vxw*Q!y1To( zyu7@=zP`Y~z`?=6!otGC!^6bH#M9H$)YR19-{0rw=jrL`>gww3?CkLH@bvWb_4W1n z`T0T=+ByIL00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm001r{001r{0eGc9 zb^rhX2XskIMF-~#4i+T|*&c8?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0} zP*;Ht7XSbPYe_^wR9M69m|IiRP!xrCPTGPgq)F3Mt3^ejctdFc1uvk2qH-xJAS&Xm zT0r~_`RhKIF(hZ7oqaOn3=ipR&-$iqy1vy0g8%S<9GXK<2egq9O6BSw>zSZbuG%`h z=4XJCx#8{OPhJKnnX@(z-e-Z5xsmdU)5-uPb0gNQJ)ypmkR>-53_o{+z}JORxza7` z_2V5c@HC-hu5i=Z>VB|oM-xisiZ`sSqrJ*(RTE0(N(+U~lUJ)R+#hGPpk&T`V9uNw za<*%IUkhs9mvfEi$%n=D(eJgxqjP%Dc`0{71?Jq93!kqp_I1CfQZA+fbgEA1FI3u0Ax8i>bi4GyQb!T~+_>Cvq_ri1udhcwhgO zicTySSAl46^nUN#Rc+{W_e3tC0&#ow>(3p#q6;l`*1tu$VnPLC=1sS<>}dP6aQAJL zOR7Lj-dh@4c2%Pbs%0)t%`KI~oU8&N2FlNBs?n98_1*Al6wJXehpC_uUNv-dlTf#H zF!7fZod0*V5fwD4(FJLlf9-{z+(kkK^yq?gsK4u_tAHL|kPlT_=_;T{7kJAIW4J=_ z(FNWzD-@y_UEnRV(e7djQH(C|mf4s>6`~kj;4QP5#1x_$U0^OVst{~+C8+99LLt=X zBG7sDqDKk|Qkw>xLotOgng+}|Mhamx4VZOQIUa2q@ah;aM;CwlDT~f)8nEi9hN4Xa zRvncOylKEWL{YJ(0p}3;Qjw+s=MYInng*;oru_5wIX@ +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry + + + +(Aerial) + + + +12 + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +Branth Irregulars, 5th Legion, Beta Regiment + + + +TRO 3085 + + + +7 + + + +1 + + + +Elephant Gun + + + +Free Worlds League Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk new file mode 100644 index 00000000000..7b00e154243 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Auto Rifle).blk @@ -0,0 +1,57 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Auto-Rifle) + + + +2401 + + + +2401 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +InfantryAssaultRifle + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk new file mode 100644 index 00000000000..e896b76f41b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk new file mode 100644 index 00000000000..ebcd449140c --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Laser Rifle).blk @@ -0,0 +1,57 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Laser Rifle) + + + +2401 + + + +2401 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Laser Rifle + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk new file mode 100644 index 00000000000..a96038d99e5 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk new file mode 100644 index 00000000000..230dcb4c0da --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk new file mode 100644 index 00000000000..b7fff2fc755 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(SMG).blk @@ -0,0 +1,57 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(SMG) + + + +2401 + + + +2401 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Submachine Gun + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk new file mode 100644 index 00000000000..8a972c94a5b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk new file mode 100644 index 00000000000..acbfaca839c --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Branth/Beast Infantry (Branth)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Branth) + + + +(Sniper) + + + +2500 + + + +2500 + + + +IS Level 3 + + + +Beast:Branth + + + + + + +7 + + + +1 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk new file mode 100644 index 00000000000..7c5c46c8058 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Auto Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Auto-Rifle) + + + +2000 + + + +2000 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk new file mode 100644 index 00000000000..eda6f3b2dec --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk new file mode 100644 index 00000000000..c3226da46dd --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Laser Rifle) + + + +2230 + + + +2230 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk new file mode 100644 index 00000000000..8d1833b632b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk new file mode 100644 index 00000000000..7b610ff75eb --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk new file mode 100644 index 00000000000..a37c06bfedb --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(SMG) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk new file mode 100644 index 00000000000..698d328f0db --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk new file mode 100644 index 00000000000..cd840dc41bd --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Camel/Beast Infantry (Camel)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Camel) + + + +(Sniper) + + + +2500 + + + +2500 + + + +IS Level 3 + + + +Beast:Camel + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk new file mode 100644 index 00000000000..8cd49629a3d --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Auto Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Auto-Rifle) + + + +2380 + + + +2380 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk new file mode 100644 index 00000000000..ce18e845153 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk new file mode 100644 index 00000000000..8d0ff35d185 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Laser Rifle) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk new file mode 100644 index 00000000000..6cfd9dda540 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk new file mode 100644 index 00000000000..a5ce67dd644 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk new file mode 100644 index 00000000000..a84eea0fdb0 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(SMG) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk new file mode 100644 index 00000000000..d5e5e1db0c5 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk new file mode 100644 index 00000000000..ce8bfacf847 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Coventry Kangaroo/Beast Infantry (Kangaroo)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Kangaroo) + + + +(Sniper) + + + +2380 + + + +2380 + + + +IS Level 3 + + + +Beast:Coventry Kangaroo + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk new file mode 100644 index 00000000000..47fa0da618f --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Auto Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Auto-Rifle) + + + +2000 + + + +2000 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk new file mode 100644 index 00000000000..26592f00d94 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk new file mode 100644 index 00000000000..953b07aae80 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Laser Rifle) + + + +2230 + + + +2230 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk new file mode 100644 index 00000000000..3c9abf3dce1 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk new file mode 100644 index 00000000000..0751007cc22 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk new file mode 100644 index 00000000000..3dcf440a13b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(SMG) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk new file mode 100644 index 00000000000..a98f2aa4db9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk new file mode 100644 index 00000000000..5a36c3f50c9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Donkey/Beast Infantry (Donkey)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Donkey) + + + +(Sniper) + + + +2500 + + + +2500 + + + +IS Level 3 + + + +Beast:Donkey + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk new file mode 100644 index 00000000000..5d1b1348e8d --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Auto-Rifle_MG).blk @@ -0,0 +1,73 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Auto-Rifle/MG) + + + +2000 + + + +2000 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +InfantryAssaultRifle + + + +Machine Gun (Support) + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + + +2.0 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk new file mode 100644 index 00000000000..e3281229497 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Gyrojet_GL).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Gyrojet/GL) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Gyrojet Rifle + + + +InfantryAutoGL + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk new file mode 100644 index 00000000000..08b36053964 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_MRR).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Laser Refile/MRR) + + + +2230 + + + +2230 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Laser Rifle + + + +InfantryMRR + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk new file mode 100644 index 00000000000..5f09e7c2d49 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Laser Rifle_Support PPC).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Laser Rifle/Support PPC) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Laser Rifle + + + +Particle Cannon (Semi-Portable) + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk new file mode 100644 index 00000000000..d3bd45e09c6 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Needler_SRM).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Needler/SRM) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Needler Rifle + + + +InfantryStandardSRMInferno + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk new file mode 100644 index 00000000000..c5674f4a553 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pistol_Mortar).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Pistol/Mortar) + + + +2000 + + + +2000 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +InfantryAssaultRifle + + + +InfantryLightMortar + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk new file mode 100644 index 00000000000..e363a55f715 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Plasma Rifle).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Pulse Laser/Plasma Rifle) + + + +3065 + + + +3065 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Pulse Laser Rifle (Inner Sphere) + + + +Plasma Rifle (Man-Portable) + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk new file mode 100644 index 00000000000..5a2fadb9294 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Elephant/Beast Infantry (Elephant)(Pulse Laser_Support Pulse).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Elephant) + + + +(Pulse Laser/Support Pulse) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Elephant + + + + + + +2 + + + +5 + + + +1 + + + +Pulse Laser Rifle (Inner Sphere) + + + +Support Pulse Laser + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk new file mode 100644 index 00000000000..3fce5bfec93 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Auto-Cannon).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(Auto-Rifle/Auto-Cannon) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +InfantryAssaultRifle + + + +Autocannon (Semi-Portable) + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk new file mode 100644 index 00000000000..0554bfb9389 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_LRR).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(Auto-Rifle/LRR) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +InfantryAssaultRifle + + + +InfantryLRR + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk new file mode 100644 index 00000000000..f8a2309f7f4 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_SRM).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(Auto-Rifle/SRM) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +Laser Rifle + + + +InfantryStandardSRM + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk new file mode 100644 index 00000000000..af738ae1276 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Auto-Rifle_Support MG).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(Auto-Rifle/Support MG) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +InfantryAssaultRifle + + + +Machine Gun (Support) + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk new file mode 100644 index 00000000000..18d1280ec7c --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(Laser Rifle_GL).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(Laser Rifle/GL) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +Laser Rifle + + + +InfantryAutoGL + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk new file mode 100644 index 00000000000..a3b97d2c9d5 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Hipposaur/Beast Infantry (Hipposaur)(SMG_GL).blk @@ -0,0 +1,77 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Hipposaur) + + + +(SMG/GL) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Hipposaur + + + + + + +2 + + + +4 + + + +2 + + + +Submachine Gun + + + +InfantryAutoGL + + + +Environment Suit, Hostile + + + +true + + + +true + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk new file mode 100644 index 00000000000..6168c398fb1 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Auto Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Auto-Rifle) + + + +2000 + + + +2000 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk new file mode 100644 index 00000000000..2e3fd6a12ea --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk new file mode 100644 index 00000000000..9a5aa6cf4ad --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Laser Rifle) + + + +2230 + + + +2230 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk new file mode 100644 index 00000000000..e9f6f07b9b1 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk new file mode 100644 index 00000000000..1c94fe0ea29 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk new file mode 100644 index 00000000000..a9ce40e6b2e --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(SMG) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk new file mode 100644 index 00000000000..8d2c68ed52a --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk new file mode 100644 index 00000000000..653fc5e600d --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Horse/Beast Infantry (Horse)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Horse) + + + +(Sniper) + + + +2500 + + + +2500 + + + +IS Level 3 + + + +Beast:Horse + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk new file mode 100644 index 00000000000..ca5b2c401b9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Auto-Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Auto-Rifle) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk new file mode 100644 index 00000000000..9eaaca4e3ab --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk new file mode 100644 index 00000000000..8f06deabe36 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Laser Rifle) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk new file mode 100644 index 00000000000..38739d412a6 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk new file mode 100644 index 00000000000..7e20cc45f51 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk new file mode 100644 index 00000000000..a98cbefaa25 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(SMG) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk new file mode 100644 index 00000000000..c4e9fca8fa6 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Shotgun) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk new file mode 100644 index 00000000000..cac46f96bf9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Odessan Raxx/Beast Infantry (Odessan Raxx)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Odessan Raxx) + + + +(Sniper) + + + +2340 + + + +2340 + + + +IS Level 3 + + + +Beast:Odessan Raxx + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk new file mode 100644 index 00000000000..aae0afb5553 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Gyrojet_Support Laser).blk @@ -0,0 +1,69 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Orca) + + + +(Gyrojet/Support Laser) + + + +2570 + + + +2570 + + + +IS Level 3 + + + +Beast:Orca + + + + + + +2 + + + +5 + + + +1 + + + +Gyrojet Rifle + + + +Support Laser (Heavy) + + + +Environment Suit, Hostile + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk new file mode 100644 index 00000000000..d52cbd8017e --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Orca/Beast Infantry (Orca)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Orca) + + + +(Laser Rifle) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Orca + + + + + + +2 + + + +5 + + + +Laser Rifle + + + +Environment Suit, Hostile + + + +4096 + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk new file mode 100644 index 00000000000..4de8fb70348 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Auto Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Auto-Rifle) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk new file mode 100644 index 00000000000..aa438804bbf --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Gyrojet) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk new file mode 100644 index 00000000000..9e637a84062 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Laser Rifle) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk new file mode 100644 index 00000000000..ebec8f76d82 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Needler) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk new file mode 100644 index 00000000000..4093a6f80e9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Pulse Laser) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk new file mode 100644 index 00000000000..310c15ac9db --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(SMG) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk new file mode 100644 index 00000000000..6456fdaa36b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Shotgun) + + + +2680 + + + +2680 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk new file mode 100644 index 00000000000..c45981683d6 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tabiranth/Beast Infantry (Tabiranth)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tabiranth) + + + +(Sniper) + + + +2300 + + + +2300 + + + +IS Level 3 + + + +Beast:Tabiranth + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk new file mode 100644 index 00000000000..9ed4e71f1b7 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Auto-Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Auto-Rifle) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +InfantryAssaultRifle + + + +5 + + + +Clothing, Fatigues/Civilian/Non-Armored + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk new file mode 100644 index 00000000000..4b1635edd03 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Gyrojet).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Gyrojet) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Gyrojet Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk new file mode 100644 index 00000000000..e08e751449b --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Laser Rifle).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Laser Rifle) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Laser Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk new file mode 100644 index 00000000000..59fe1e8c9e6 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Needler).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Needler) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Needler Rifle + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk new file mode 100644 index 00000000000..553694e4481 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Pulse Laser).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Pulse Laser) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Pulse Laser Rifle (Inner Sphere) + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk new file mode 100644 index 00000000000..4f3b4b682c9 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(SMG).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(SMG) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Submachine Gun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk new file mode 100644 index 00000000000..ba90216b183 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Shotgun).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Shotgun) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Auto-Shotgun + + + +5 + + + +Generic Infantry Kit + + diff --git a/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk new file mode 100644 index 00000000000..0d870a82774 --- /dev/null +++ b/megamek/data/mechfiles/infantry/Beast Mounted/Tariq/Beast Infantry (Tariq)(Sniper).blk @@ -0,0 +1,61 @@ +#building block data file + +1 + + +##Write the version number just in case... + +MAM0 + + + +Infantry + + + +Beast Infantry (Tariq) + + + +(Sniper) + + + +2750 + + + +2750 + + + +IS Level 3 + + + +Beast:Tariq + + + + + + +7 + + + +3 + + + +Sniper Rifle (Bolt Action) + + + +5 + + + +Generic Infantry Kit + + From 4f3dd8192e9186639ee268a8341f30c7a65fee28 Mon Sep 17 00:00:00 2001 From: cwspain Date: Wed, 15 Nov 2023 13:31:41 -0600 Subject: [PATCH 33/33] Apply the underwater weapons checks to other height 2+ units. --- megamek/src/megamek/server/GameManager.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index e6362e70af8..38f97537c0f 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -11643,15 +11643,9 @@ public Vector doSetLocationsExposure(Entity entity, Hex hex, entity.setLocationStatus(Mech.LOC_CLEG, ILocationExposureStatus.WET); vPhaseReport.addAll(breachCheck(entity, Mech.LOC_CLEG, hex)); } - // Beast-mounted infantry can sit above the water level - } else if (!entity.isConventionalInfantry() || (entity.relHeight() < 0)) { - for (int loop = 0; loop < entity.locations(); loop++) { - entity.setLocationStatus(loop, ILocationExposureStatus.WET); - vPhaseReport.addAll(breachCheck(entity, loop, hex)); - } } else { int status = ILocationExposureStatus.WET; - if (entity.isConventionalInfantry() && (entity.relHeight() >= 0)) { + if (entity.relHeight() >= 0) { status = game.getPlanetaryConditions().isVacuum() ? ILocationExposureStatus.VACUUM : ILocationExposureStatus.NORMAL; }