Skip to content

Commit

Permalink
Fix for 3095 - no +1 TMM for jumping WiGE
Browse files Browse the repository at this point in the history
Fixes issue MegaMek#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 MegaMek#3095.
  • Loading branch information
Sleet01 committed Nov 20, 2023
1 parent 8ac139f commit 5d20eb4
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 12 deletions.
30 changes: 20 additions & 10 deletions megamek/src/megamek/common/Compute.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions megamek/src/megamek/server/GameManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -33718,8 +33720,7 @@ private Vector<Report> 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)
Expand Down

0 comments on commit 5d20eb4

Please sign in to comment.