⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movementdisplay.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                    }                } 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 + -