From 5d20eb4db82714641d53b63f60480ff094b0e3a9 Mon Sep 17 00:00:00 2001 From: sleet01 Date: Sun, 19 Nov 2023 22:58:23 -0800 Subject: [PATCH] Fix for 3095 - no +1 TMM for jumping WiGE Fixes issue #3095, but only for non-airborne WiGE that jump. Airborne jumping WiGE are already getting a +1 TMM from being airborne. Also fixes an issue where immobile / crashing WiGE are treated as other land vehicles and sink immediately; in fact by TW pg 55 they float and treat water as clear terrain and do not sink due to being immoble (q.v.) Close #3095. --- megamek/src/megamek/common/Compute.java | 30 ++++++++++++++------- megamek/src/megamek/server/GameManager.java | 5 ++-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/megamek/src/megamek/common/Compute.java b/megamek/src/megamek/common/Compute.java index 9dfc899a8c5..91ff99544c3 100644 --- a/megamek/src/megamek/common/Compute.java +++ b/megamek/src/megamek/common/Compute.java @@ -2534,20 +2534,30 @@ public static ToHitData getTargetMovementModifier(Game game, int entityId) { return toHit; } + // Compile various state information to determine if the entity jumped, "jumped", or is VTOL + // Airborne non-ASF vehicles like WiGE can get +1 TMM for jumping _or_ being airborne, but not both. + // Non-flying WiGE _can_ get +1 TMM for jumping. + // See TW: pg. 307, "Attack Modifiers Table" + boolean jumped = !entity.isAirborneVTOLorWIGE() + && ( + (entity.moved == EntityMovementType.MOVE_JUMP) + || (entity.moved == EntityMovementType.MOVE_VTOL_RUN) + || (entity.moved == EntityMovementType.MOVE_VTOL_WALK) + || (entity.moved == EntityMovementType.MOVE_VTOL_SPRINT) + ); + + boolean isVTOL = (entity.moved == EntityMovementType.MOVE_VTOL_RUN) + || (entity.moved == EntityMovementType.MOVE_VTOL_WALK) + || (entity.getMovementMode() == EntityMovementMode.VTOL) + || (entity.moved == EntityMovementType.MOVE_VTOL_SPRINT); + ToHitData toHit = Compute .getTargetMovementModifier( entity.delta_distance, - (entity.getMovementMode() != EntityMovementMode.WIGE) - && ((entity.moved == EntityMovementType.MOVE_JUMP) - || (entity.moved == EntityMovementType.MOVE_VTOL_RUN) - || (entity.moved == EntityMovementType.MOVE_VTOL_WALK) - || (entity.moved == EntityMovementType.MOVE_VTOL_SPRINT)), - - (entity.moved == EntityMovementType.MOVE_VTOL_RUN) - || (entity.moved == EntityMovementType.MOVE_VTOL_WALK) - || (entity.getMovementMode() == EntityMovementMode.VTOL) - || (entity.moved == EntityMovementType.MOVE_VTOL_SPRINT), + jumped, + isVTOL, game); + if (entity.moved != EntityMovementType.MOVE_JUMP && entity.delta_distance > 0 && entity instanceof Mech && ((Mech) entity).getCockpitType() == Mech.COCKPIT_DUAL diff --git a/megamek/src/megamek/server/GameManager.java b/megamek/src/megamek/server/GameManager.java index 3f301cefc90..fc5ea96d7f1 100644 --- a/megamek/src/megamek/server/GameManager.java +++ b/megamek/src/megamek/server/GameManager.java @@ -12488,6 +12488,7 @@ else if ((waterDepth > 0) && (entity.getMovementMode() != EntityMovementMode.HYDROFOIL) && (entity.getMovementMode() != EntityMovementMode.NAVAL) && (entity.getMovementMode() != EntityMovementMode.SUBMARINE) + && (entity.getMovementMode() != EntityMovementMode.WIGE) && (entity.getMovementMode() != EntityMovementMode.INF_UMU)) { vPhaseReport.addAll(destroyEntity(entity, "a watery grave", false)); } else if ((waterDepth > 0) @@ -27866,6 +27867,7 @@ else if (waterDepth > 0) { && (entity.getMovementMode() != EntityMovementMode.HYDROFOIL) && (entity.getMovementMode() != EntityMovementMode.NAVAL) && (entity.getMovementMode() != EntityMovementMode.SUBMARINE) + && (entity.getMovementMode() != EntityMovementMode.WIGE) && (entity.getMovementMode() != EntityMovementMode.INF_UMU)) { vPhaseReport.addAll(destroyEntity(entity, "a watery grave", false)); return vPhaseReport; @@ -33718,8 +33720,7 @@ private Vector vehicleMotiveDamage(Tank te, int modifier, boolean noRoll // which for these particular purposes may or may not be the intent of // the rules in all cases. // Immobile hovercraft on water sink... - if (!te.isOffBoard() && (((te.getMovementMode() == EntityMovementMode.HOVER) - || ((te.getMovementMode() == EntityMovementMode.WIGE) && (te.getElevation() == 0))) + if (!te.isOffBoard() && (te.getMovementMode() == EntityMovementMode.HOVER && (te.isMovementHitPending() || (te.getWalkMP() <= 0)) // HACK: Have to check for *pending* hit here and below. && (game.getBoard().getHex(te.getPosition()).terrainLevel(Terrains.WATER) > 0)