From d887cc791d969dd970c1cfa66cdb9693075c4cd0 Mon Sep 17 00:00:00 2001 From: HoneySkull Date: Sat, 13 Jan 2024 22:20:22 -0600 Subject: [PATCH 1/3] Update Aero movement envelope when accelerating or decelerating. --- .../client/ui/swing/MovementDisplay.java | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 56330183b0e..44a411e2265 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -342,6 +342,12 @@ public static MoveCommand[] values(int f, GameOptions opts, boolean forwardIni) public static final int GEAR_STRAFE = 12; public static final String turnDetailsFormat = "%s%-3s %-14s %1s %2dMP%s"; + // Keep track of acceleration for Aero units to dynamically update their move envelope. + private static final int ZERO_DELTA_V = 0; + private static final int INC_DELTA_V = 1; + private static final int DEC_DELTA_V = -1; + private int deltaV = 0; + /** * Creates and lays out a new movement phase display for the specified * clientgui.getClient(). @@ -474,7 +480,11 @@ public boolean shouldPerformAction() { @Override public void performAction() { removeLastStep(); - computeMovementEnvelope(ce()); + if (ce() instanceof Aero) { + computeAeroMovementEnvelope(ce(), ZERO_DELTA_V); + } else { + computeMovementEnvelope(ce()); + } } }); @@ -492,7 +502,11 @@ public boolean shouldPerformAction() { @Override public void performAction() { removeIllegalSteps(); - computeMovementEnvelope(ce()); + if (ce() instanceof Aero) { + computeAeroMovementEnvelope(ce(), ZERO_DELTA_V); + } else { + computeMovementEnvelope(ce()); + } } }); @@ -1320,6 +1334,9 @@ public void clear() { clientgui.getBoardView().cursor(null); clientgui.getBoardView().clearMovementEnvelope(); + // Clear Aero deltaV back to 0. + deltaV = ZERO_DELTA_V; + if (ce == null) { return; } @@ -4542,6 +4559,46 @@ public void computeMovementEnvelope(Entity suggestion) { .getRunMP(), en.getJumpMP(), mvMode); } + /** + * Computes possible moves for entities of Aero units. This is similar to the + * `computeMovementEnvelope()` method; however, it keeps track of a deltaV so + * that a dynamic movement envelope can be calculated when an Aerospace unit + * accelerates or de-accelerates during the movement phase before the "move" button + * is pressed. + * + * @param entity - Suggested entity to use to compute Aero move envelope. + * @param deltaV - Delta Velocity from units current velocity. The temporary + * deltaV will be updated by this amount (positive or negative) + * @return - This method will do nothing if the Entity passed in is null or + * is not an Aero based unity. + */ + private void computeAeroMovementEnvelope(Entity entity, int deltaV) { + if ((entity == null) || !(entity instanceof Aero)) { + return; + } + + // Update deltaV with total change in velocity during movement. + this.deltaV += deltaV; + + // Increment the entity's delta-v then compute the movement envelope. + Aero ae = (Aero)entity; + int currentVelocity = ae.getCurrentVelocity(); + ae.setCurrentVelocity(currentVelocity + this.deltaV); + + // Refresh the new velocity envelope on the map. + try { + computeMovementEnvelope(ae); + } catch (Exception e) { + LogManager.getLogger().error("An error occured trying to compute the move envelope for an Aero."); + } finally { + // Reset the bird's velocity back to original velocity no-matter-what. It will be updated when + // the 'move' button is clicked and the move is processed. + ae.setCurrentVelocity(currentVelocity); + } + + return; + } + public void computeModifierEnvelope() { if (ce() == null) { return; @@ -5061,8 +5118,10 @@ public synchronized void actionPerformed(ActionEvent ev) { addStepToMovePath(MoveStepType.DECN); } else if (actionCmd.equals(MoveCommand.MOVE_ACC.getCmd())) { addStepToMovePath(MoveStepType.ACC); + computeAeroMovementEnvelope(ce, INC_DELTA_V); } else if (actionCmd.equals(MoveCommand.MOVE_DEC.getCmd())) { addStepToMovePath(MoveStepType.DEC); + computeAeroMovementEnvelope(ce, DEC_DELTA_V); } else if (actionCmd.equals(MoveCommand.MOVE_EVADE.getCmd())) { addStepToMovePath(MoveStepType.EVADE); } else if (actionCmd.equals(MoveCommand.MOVE_BOOTLEGGER.getCmd())) { From 0fc2718c8052334c7d61bb217f4d98e4084bbdf7 Mon Sep 17 00:00:00 2001 From: HoneySkull Date: Sun, 14 Jan 2024 15:24:16 -0600 Subject: [PATCH 2/3] Re-worked delta-v with existing code and fixed edge case. --- .../client/ui/swing/MovementDisplay.java | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 44a411e2265..048ec8ca588 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -342,12 +342,6 @@ public static MoveCommand[] values(int f, GameOptions opts, boolean forwardIni) public static final int GEAR_STRAFE = 12; public static final String turnDetailsFormat = "%s%-3s %-14s %1s %2dMP%s"; - // Keep track of acceleration for Aero units to dynamically update their move envelope. - private static final int ZERO_DELTA_V = 0; - private static final int INC_DELTA_V = 1; - private static final int DEC_DELTA_V = -1; - private int deltaV = 0; - /** * Creates and lays out a new movement phase display for the specified * clientgui.getClient(). @@ -481,7 +475,7 @@ public boolean shouldPerformAction() { public void performAction() { removeLastStep(); if (ce() instanceof Aero) { - computeAeroMovementEnvelope(ce(), ZERO_DELTA_V); + computeAeroMovementEnvelope(ce()); } else { computeMovementEnvelope(ce()); } @@ -503,7 +497,7 @@ public boolean shouldPerformAction() { public void performAction() { removeIllegalSteps(); if (ce() instanceof Aero) { - computeAeroMovementEnvelope(ce(), ZERO_DELTA_V); + computeAeroMovementEnvelope(ce()); } else { computeMovementEnvelope(ce()); } @@ -1334,9 +1328,6 @@ public void clear() { clientgui.getBoardView().cursor(null); clientgui.getBoardView().clearMovementEnvelope(); - // Clear Aero deltaV back to 0. - deltaV = ZERO_DELTA_V; - if (ce == null) { return; } @@ -4572,18 +4563,15 @@ public void computeMovementEnvelope(Entity suggestion) { * @return - This method will do nothing if the Entity passed in is null or * is not an Aero based unity. */ - private void computeAeroMovementEnvelope(Entity entity, int deltaV) { - if ((entity == null) || !(entity instanceof Aero)) { + private void computeAeroMovementEnvelope(Entity entity) { + if ((entity == null) || !(entity instanceof Aero) || (cmd == null)) { return; } - // Update deltaV with total change in velocity during movement. - this.deltaV += deltaV; - // Increment the entity's delta-v then compute the movement envelope. Aero ae = (Aero)entity; int currentVelocity = ae.getCurrentVelocity(); - ae.setCurrentVelocity(currentVelocity + this.deltaV); + ae.setCurrentVelocity(cmd.getFinalVelocity()); // Refresh the new velocity envelope on the map. try { @@ -5118,10 +5106,10 @@ public synchronized void actionPerformed(ActionEvent ev) { addStepToMovePath(MoveStepType.DECN); } else if (actionCmd.equals(MoveCommand.MOVE_ACC.getCmd())) { addStepToMovePath(MoveStepType.ACC); - computeAeroMovementEnvelope(ce, INC_DELTA_V); + computeAeroMovementEnvelope(ce); } else if (actionCmd.equals(MoveCommand.MOVE_DEC.getCmd())) { addStepToMovePath(MoveStepType.DEC); - computeAeroMovementEnvelope(ce, DEC_DELTA_V); + computeAeroMovementEnvelope(ce); } else if (actionCmd.equals(MoveCommand.MOVE_EVADE.getCmd())) { addStepToMovePath(MoveStepType.EVADE); } else if (actionCmd.equals(MoveCommand.MOVE_BOOTLEGGER.getCmd())) { From f27e4d4d7176146c9491e3f15cf3374a9da7a5a6 Mon Sep 17 00:00:00 2001 From: HoneySkull Date: Sun, 14 Jan 2024 15:40:22 -0600 Subject: [PATCH 3/3] Forgot to fix comments. --- megamek/src/megamek/client/ui/swing/MovementDisplay.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/MovementDisplay.java b/megamek/src/megamek/client/ui/swing/MovementDisplay.java index 048ec8ca588..4cb94c63e09 100644 --- a/megamek/src/megamek/client/ui/swing/MovementDisplay.java +++ b/megamek/src/megamek/client/ui/swing/MovementDisplay.java @@ -4552,14 +4552,11 @@ public void computeMovementEnvelope(Entity suggestion) { /** * Computes possible moves for entities of Aero units. This is similar to the - * `computeMovementEnvelope()` method; however, it keeps track of a deltaV so - * that a dynamic movement envelope can be calculated when an Aerospace unit - * accelerates or de-accelerates during the movement phase before the "move" button - * is pressed. + * `computeMovementEnvelope()` method; however, it uses the `MovePath` + * final velocity to temporarily set units velocity to draw the move envelope. + * This method always sets the original entity velocity back to it's orginial. * * @param entity - Suggested entity to use to compute Aero move envelope. - * @param deltaV - Delta Velocity from units current velocity. The temporary - * deltaV will be updated by this amount (positive or negative) * @return - This method will do nothing if the Entity passed in is null or * is not an Aero based unity. */