📄 movementdisplay.java
字号:
} } else if (entity instanceof Tank) { if ((step.getMovementType() == IEntityMovementType.MOVE_WALK) || (step.getMovementType() == IEntityMovementType.MOVE_VTOL_WALK) || (step.getMovementType() == IEntityMovementType.MOVE_RUN) || (step.getMovementType() == IEntityMovementType.MOVE_VTOL_RUN)) { // For Tanks, we need to check if the tank had more MPs because it was moving along a road if (step.getMpUsed() > entity.getRunMP(false) && !step.isOnlyPavement()) { rollTarget = entity.checkMovedTooFast(step); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } } // If the tank was moving on a road, he got a +1 bonus. // N.B. The Ask Precentor Martial forum said that a 4/6 // tank on a road can move 5/7, **not** 5/8. else if (step.getMpUsed() > entity.getRunMP(false) + 1) { rollTarget = entity.checkMovedTooFast(step); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } } } } } // Handle non-infantry moving into a building. int buildingMove = entity.checkMovementInBuilding(step, prevStep, curPos, lastPos); if (buildingMove > 0) { // Get the building being exited. Building bldgExited = null; if ((buildingMove & 1) == 1) bldgExited = client.game.getBoard().getBuildingAt(lastPos); // Get the building being entered. Building bldgEntered = null; if ((buildingMove & 2) == 2) bldgEntered = client.game.getBoard().getBuildingAt(curPos); if (bldgExited != null && bldgEntered != null && !bldgExited.equals(bldgEntered)) { // Exiting one building and entering another. // Brave, aren't we? rollTarget = entity.rollMovementInBuilding(bldgExited, distance, "exiting"); nagReport.append(addNag(rollTarget)); rollTarget = entity.rollMovementInBuilding(bldgEntered, distance, "entering"); nagReport.append(addNag(rollTarget)); } else { Building bldg; if (bldgEntered == null) { // Exiting a building. bldg = bldgExited; } else { // Entering or moving within a building. bldg = bldgEntered; } if (bldg != null) { rollTarget = entity.rollMovementInBuilding(bldg, distance, ""); nagReport.append(addNag(rollTarget)); } } } if (step.getType() == MovePath.STEP_GO_PRONE) { rollTarget = entity.checkDislodgeSwarmers(step); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } } // update lastPos, prevStep, prevFacing & prevHex lastPos = new Coords(curPos); prevStep = step; /* Bug 754610: Revert fix for bug 702735. if (prevHex != null && !curHex.equals(prevHex)) { */ if (!curHex.equals(prevHex)) { prevFacing = curFacing; } prevHex = curHex; firstStep = false; } // running with destroyed hip or gyro needs a check rollTarget = entity.checkRunningWithDamage(overallMoveType); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } // but the danger isn't over yet! landing from a jump can be risky! if (overallMoveType == IEntityMovementType.MOVE_JUMP && !entity.isMakingDfa()) { // check for damaged criticals rollTarget = entity.checkLandingWithDamage(); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } // jumped into water? IHex hex = client.game.getBoard().getHex(curPos); int waterLevel = hex.terrainLevel(Terrains.WATER); if (hex.containsTerrain(Terrains.ICE) && waterLevel > 0) { nagReport.append(Messages.getString("MovementDisplay.IceLanding")); } rollTarget = entity.checkWaterMove(waterLevel); if (rollTarget.getValue() != TargetRoll.CHECK_FALSE) { nagReport.append(addNag(rollTarget)); } } return nagReport.toString(); } /** * Returns the current entity. */ private synchronized Entity ce() { return client.game.getEntity(cen); } /** * Returns new MovePath for the currently selected movement type */ private void currentMove(Coords dest) { if (shiftheld || gear == GEAR_TURN) { cmd.rotatePathfinder(cmd.getFinalCoords().direction(dest)); } else if (gear == GEAR_LAND || gear == GEAR_JUMP) { cmd.findPathTo(dest, MovePath.STEP_FORWARDS); } else if (gear == GEAR_BACKUP) { cmd.findPathTo(dest, MovePath.STEP_BACKWARDS); } else if (gear == GEAR_CHARGE) { cmd.findPathTo(dest, MovePath.STEP_CHARGE); } else if (gear == GEAR_DFA) { cmd.findPathTo(dest, MovePath.STEP_DFA); } else if (gear == GEAR_SWIM) { cmd.findPathTo(dest, MovePath.STEP_SWIM); } } // // BoardListener // public synchronized void hexMoused(BoardViewEvent b) { final Entity ce = ce(); // Are we ignoring events? if (isIgnoringEvents()) { return; } // ignore buttons other than 1 if (!client.isMyTurn() || (b.getModifiers() & MouseEvent.BUTTON1_MASK) == 0) { return; } // control pressed means a line of sight check. // added ALT_MASK by kenn if ((b.getModifiers() & InputEvent.CTRL_MASK) != 0 || (b.getModifiers() & InputEvent.ALT_MASK) != 0) { return; } // check for shifty goodness if (shiftheld != ((b.getModifiers() & MouseEvent.SHIFT_MASK) != 0)) { shiftheld = (b.getModifiers() & MouseEvent.SHIFT_MASK) != 0; } if (b.getType() == BoardViewEvent.BOARD_HEX_DRAGGED) { if (!b.getCoords().equals(clientgui.getBoardView().getLastCursor()) || shiftheld || gear == MovementDisplay.GEAR_TURN) { clientgui.getBoardView().cursor(b.getCoords()); // either turn or move if (ce != null) { currentMove(b.getCoords()); clientgui.bv.drawMovementData(cmd); } } } else if (b.getType() == BoardViewEvent.BOARD_HEX_CLICKED) { Coords moveto = b.getCoords(); clientgui.bv.drawMovementData(cmd); clientgui.getBoardView().select(b.getCoords()); if (shiftheld || gear == MovementDisplay.GEAR_TURN) { butDone.setText(Messages.getString("MovementDisplay.Move")); //$NON-NLS-1$ // Set the button's label to "Done" // if the entire move is impossible. MovePath possible = (MovePath) cmd.clone(); possible.clipToPossible(); if (possible.length() == 0) { butDone.setText(Messages.getString("MovementDisplay.Done")); //$NON-NLS-1$ } return; } if (gear == MovementDisplay.GEAR_CHARGE) { // check if target is valid final Targetable target = chooseTarget(b.getCoords()); if (target == null || target.equals(ce)) { clientgui.doAlertDialog(Messages.getString("MovementDisplay.CantCharge"), Messages.getString("MovementDisplay.NoTarget")); //$NON-NLS-1$ //$NON-NLS-2$ clearAllMoves(); return; } // check if it's a valid charge ToHitData toHit = new ChargeAttackAction(cen, target.getTargetType(), target.getTargetId(), target.getPosition()).toHit(client.game, cmd); if (toHit.getValue() != ToHitData.IMPOSSIBLE) { // Determine how much damage the charger will take. int toAttacker = 0; if (target.getTargetType() == Targetable.TYPE_ENTITY) { Entity te = (Entity) target; toAttacker = ChargeAttackAction.getDamageTakenBy(ce, te, client.game.getOptions().booleanOption("maxtech_charge_damage"), cmd.getHexesMoved()); //$NON-NLS-1$ } else if ((target.getTargetType() == Targetable.TYPE_FUEL_TANK) || (target.getTargetType() == Targetable.TYPE_BUILDING)) { Building bldg = client.game.getBoard().getBuildingAt(moveto); toAttacker = ChargeAttackAction.getDamageTakenBy(ce, bldg); } // Ask the player if they want to charge. if (clientgui.doYesNoDialog (Messages.getString("MovementDisplay.ChargeDialog.title", new Object[]{target.getDisplayName()}), //$NON-NLS-1$ Messages.getString("MovementDisplay.ChargeDialog.message", new Object[]{//$NON-NLS-1$ toHit.getValueAsString(), new Double(Compute.oddsAbove(toHit.getValue())), toHit.getDesc(), new Integer(ChargeAttackAction.getDamageFor(ce, cmd.getHexesMoved())), toHit.getTableDesc(), new Integer(toAttacker)}))) { // if they answer yes, charge the target. cmd.getLastStep().setTarget(target); moveTo(cmd); } else { // else clear movement clearAllMoves(); } return; } // if not valid, tell why clientgui.doAlertDialog(Messages.getString("MovementDisplay.CantCharge"), //$NON-NLS-1$ toHit.getDesc()); clearAllMoves(); return; } else if (gear == MovementDisplay.GEAR_DFA) { // check if target is valid final Targetable target = chooseTarget(b.getCoords()); if (target == null || target.equals(ce)) { clientgui.doAlertDialog(Messages.getString("MovementDisplay.CantDFA"), Messages.getString("MovementDisplay.NoTarget")); //$NON-NLS-1$ //$NON-NLS-2$ clearAllMoves(); return; } // check if it's a valid DFA ToHitData toHit = DfaAttackAction.toHit(client.game, cen, target, cmd); if (toHit.getValue() != ToHitData.IMPOSSIBLE) { // if yes, ask them if they want to DFA if (clientgui.doYesNoDialog (Messages.getString("MovementDisplay.DFADialog.title", new Object[]{target.getDisplayName()}), //$NON-NLS-1$ Messages.getString("MovementDisplay.DFADialog.message", new Object[]{//$NON-NLS-1$ toHit.getValueAsString(), new Double(Compute.oddsAbove(toHit.getValue())), toHit.getDesc(), new Integer(DfaAttackAction.getDamageFor(ce)), toHit.getTableDesc(), new Integer(DfaAttackAction.getDamageTakenBy(ce))}))) { // if they answer yes, DFA the target cmd.getLastStep().setTarget(target); moveTo(cmd); } else { // else clear movement clearAllMoves(); } return; } // if not valid, tell why clientgui.doAlertDialog(Messages.getString("MovementDisplay.CantDFA"), //$NON-NLS-1$ toHit.getDesc()); clearAllMoves(); return; } butDone.setText(Messages.getString("MovementDisplay.Move")); //$NON-NLS-1$ updateProneButtons(); updateRACButton(); updateSearchlightButton(); updateLoadButtons(); updateElevationButtons(); } } private synchronized void updateProneButtons() { final Entity ce = ce(); if (ce != null && !ce.isImmobile()) { setGetUpEnabled(cmd.getFinalProne() || cmd.getFinalHullDown()); setGoProneEnabled(!(butUp.isEnabled()) && ce instanceof Mech); setHullDownEnabled(!(butUp.isEnabled()) && ce.canGoHullDown()); } else { setGetUpEnabled(false); setGoProneEnabled(false); setHullDownEnabled(false); } } private void updateRACButton() { final Entity ce = ce(); if (null == ce) { return; } setUnjamEnabled(ce.canUnjamRAC() && (gear == MovementDisplay.GEAR_LAND || gear == MovementDisplay.GEAR_TURN || gear == MovementDisplay.GEAR_BACKUP) && cmd.getMpUsed() <= ce.getWalkMP()); } private void updateSearchlightButton() { final Entity ce = ce(); if (null == ce) { return; } setSearchlightEnabled(ce.hasSpotlight() && !cmd.contains(MovePath.STEP_SEARCHLIGHT), ce().isUsingSpotlight()); } private synchronized void updateElevationButtons() { final Entity ce = ce(); if (null == ce) { return; } setRaiseEnabled(ce.canGoUp(cmd.getFinalElevation(), cmd.getFinalCoords()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -