Search in sources :

Example 1 with MoveDescription

use of games.strategy.triplea.delegate.dataObjects.MoveDescription in project triplea by triplea-game.

the class HistoryDetailsPanel method render.

@Override
@SuppressWarnings("unchecked")
public void render(final HistoryNode node) {
    removeAll();
    mapPanel.setRoute(null);
    final Insets insets = new Insets(5, 0, 0, 0);
    title.setText(node.getTitle());
    add(scroll, new GridBagConstraints(0, 0, 1, 1, 1, 0.1, GridBagConstraints.NORTH, GridBagConstraints.BOTH, insets, 0, 0));
    final GridBagConstraints mainConstraints = new GridBagConstraints(0, 1, 1, 1, 1, 0.9, GridBagConstraints.NORTH, GridBagConstraints.BOTH, insets, 0, 0);
    if (node instanceof Renderable) {
        final Object details = ((Renderable) node).getRenderingData();
        if (details instanceof DiceRoll) {
            final DicePanel dicePanel = new DicePanel(mapPanel.getUiContext(), data);
            dicePanel.setDiceRoll((DiceRoll) details);
            add(dicePanel, mainConstraints);
        } else if (details instanceof MoveDescription) {
            final MoveDescription moveMessage = (MoveDescription) details;
            renderUnits(mainConstraints, moveMessage.getUnits());
            mapPanel.setRoute(moveMessage.getRoute());
            if (!mapPanel.isShowing(moveMessage.getRoute().getEnd())) {
                mapPanel.centerOn(moveMessage.getRoute().getEnd());
            }
        } else if (details instanceof PlacementDescription) {
            final PlacementDescription placeMessage = (PlacementDescription) details;
            renderUnits(mainConstraints, placeMessage.getUnits());
            if (!mapPanel.isShowing(placeMessage.getTerritory())) {
                mapPanel.centerOn(placeMessage.getTerritory());
            }
        } else if (details instanceof Collection) {
            final Collection<Object> objects = (Collection<Object>) details;
            final Iterator<Object> objIter = objects.iterator();
            if (objIter.hasNext()) {
                final Object obj = objIter.next();
                if (obj instanceof Unit) {
                    final Collection<Unit> units = (Collection<Unit>) details;
                    renderUnits(mainConstraints, units);
                }
            }
        } else if (details instanceof Territory) {
            final Territory t = (Territory) details;
            if (!mapPanel.isShowing(t)) {
                mapPanel.centerOn(t);
            }
        }
    }
    add(Box.createGlue());
    validate();
    repaint();
}
Also used : DiceRoll(games.strategy.triplea.delegate.DiceRoll) GridBagConstraints(java.awt.GridBagConstraints) Territory(games.strategy.engine.data.Territory) Insets(java.awt.Insets) Renderable(games.strategy.engine.history.Renderable) MoveDescription(games.strategy.triplea.delegate.dataObjects.MoveDescription) PlacementDescription(games.strategy.triplea.delegate.dataObjects.PlacementDescription) Iterator(java.util.Iterator) Collection(java.util.Collection) Unit(games.strategy.engine.data.Unit) DicePanel(games.strategy.triplea.ui.DicePanel)

Example 2 with MoveDescription

use of games.strategy.triplea.delegate.dataObjects.MoveDescription in project triplea by triplea-game.

the class AbstractMovePanel method waitForMove.

final MoveDescription waitForMove(final IPlayerBridge bridge) {
    setUp(bridge);
    waitForRelease();
    cleanUp();
    final MoveDescription returnValue = moveMessage;
    moveMessage = null;
    clearDependencies();
    return returnValue;
}
Also used : MoveDescription(games.strategy.triplea.delegate.dataObjects.MoveDescription)

Example 3 with MoveDescription

use of games.strategy.triplea.delegate.dataObjects.MoveDescription in project triplea by triplea-game.

the class TripleAPlayer method move.

private void move(final boolean nonCombat, final String stepName) {
    if (getPlayerBridge().isGameOver()) {
        return;
    }
    final IMoveDelegate moveDel;
    try {
        moveDel = (IMoveDelegate) getPlayerBridge().getRemoteDelegate();
    } catch (final ClassCastException e) {
        final String errorContext = "PlayerBridge step name: " + getPlayerBridge().getStepName() + ", Remote class name: " + getPlayerBridge().getRemoteDelegate().getClass();
        // for some reason the client is not seeing or getting these errors, so print to err too
        System.err.println(errorContext);
        ClientLogger.logQuietly(errorContext, e);
        throw new IllegalStateException(errorContext, e);
    }
    final PlayerID id = getPlayerId();
    if (nonCombat && !soundPlayedAlreadyNonCombatMove) {
        ClipPlayer.play(SoundPath.CLIP_PHASE_MOVE_NONCOMBAT, id);
        soundPlayedAlreadyNonCombatMove = true;
    }
    if (!nonCombat && !soundPlayedAlreadyCombatMove) {
        ClipPlayer.play(SoundPath.CLIP_PHASE_MOVE_COMBAT, id);
        soundPlayedAlreadyCombatMove = true;
    }
    // getMove will block until all moves are done. We recursively call this same method
    // until getMove stops blocking.
    final MoveDescription moveDescription = ui.getMove(id, getPlayerBridge(), nonCombat, stepName);
    if (moveDescription == null) {
        if (GameStepPropertiesHelper.isRemoveAirThatCanNotLand(getGameData())) {
            if (!canAirLand(true, id)) {
                // continue with the move loop
                move(nonCombat, stepName);
            }
        }
        if (!nonCombat) {
            if (canUnitsFight()) {
                move(nonCombat, stepName);
            }
        }
        return;
    }
    final String error = moveDel.move(moveDescription.getUnits(), moveDescription.getRoute(), moveDescription.getTransportsThatCanBeLoaded(), moveDescription.getDependentUnits());
    if (error != null) {
        ui.notifyError(error);
    }
    move(nonCombat, stepName);
}
Also used : IMoveDelegate(games.strategy.triplea.delegate.remote.IMoveDelegate) PlayerID(games.strategy.engine.data.PlayerID) MoveDescription(games.strategy.triplea.delegate.dataObjects.MoveDescription)

Example 4 with MoveDescription

use of games.strategy.triplea.delegate.dataObjects.MoveDescription in project triplea by triplea-game.

the class HistoryLog method printRemainingTurn.

public void printRemainingTurn(final HistoryNode printNode, final boolean verbose, final int diceSides, final Collection<PlayerID> playersAllowed) {
    final PrintWriter logWriter = printWriter;
    final String moreIndent = "    ";
    // print out the parent nodes
    final TreePath parentPath = (new TreePath(printNode.getPath())).getParentPath();
    PlayerID currentPlayer = null;
    if (parentPath != null) {
        final Object[] pathToNode = parentPath.getPath();
        for (final Object pathNode : pathToNode) {
            final HistoryNode node = (HistoryNode) pathNode;
            for (int i = 0; i < node.getLevel(); i++) {
                logWriter.print(moreIndent);
            }
            logWriter.println(node.getTitle());
            if (node.getLevel() == 0) {
                logWriter.println();
            }
            if (node instanceof Step) {
                currentPlayer = ((Step) node).getPlayerId();
            }
        }
    }
    final Collection<PlayerID> players = new HashSet<>();
    if (playersAllowed != null) {
        players.addAll(playersAllowed);
    }
    if (currentPlayer != null) {
        players.add(currentPlayer);
    }
    final List<String> moveList = new ArrayList<>();
    boolean moving = false;
    DefaultMutableTreeNode curNode = printNode;
    final Map<String, Double> hitDifferentialMap = new HashMap<>();
    do {
        // keep track of conquered territory during combat
        StringBuilder conquerStr = new StringBuilder();
        final Enumeration<?> nodeEnum = curNode.preorderEnumeration();
        while (nodeEnum.hasMoreElements()) {
            final HistoryNode node = (HistoryNode) nodeEnum.nextElement();
            final String title = node.getTitle();
            final StringBuilder indent = new StringBuilder();
            for (int i = 0; i < node.getLevel(); i++) {
                indent.append(moreIndent);
            }
            // flush move list
            if (moving && !(node instanceof Renderable)) {
                final Iterator<String> moveIter = moveList.iterator();
                while (moveIter.hasNext()) {
                    logWriter.println(moveIter.next());
                    moveIter.remove();
                }
                moving = false;
            }
            if (node instanceof Renderable) {
                final Object details = ((Renderable) node).getRenderingData();
                if (details instanceof DiceRoll) {
                    if (!verbose) {
                        continue;
                    }
                    final String diceMsg1 = title.substring(0, title.indexOf(':') + 1);
                    if (diceMsg1.isEmpty()) {
                        // tech roll
                        logWriter.println(indent + moreIndent + title);
                    } else {
                        // dice roll
                        // Japanese roll dice for 1 armour in Russia, round 1
                        logWriter.print(indent + moreIndent + diceMsg1);
                        final String player = diceMsg1.split(" roll ")[0];
                        final DiceRoll diceRoll = (DiceRoll) details;
                        final int hits = diceRoll.getHits();
                        int rolls = 0;
                        for (int i = 1; i <= diceSides; i++) {
                            rolls += diceRoll.getRolls(i).size();
                        }
                        final double expectedHits = diceRoll.getExpectedHits();
                        logWriter.println(" " + hits + "/" + rolls + " hits, " + String.format("%.2f", expectedHits) + " expected hits");
                        final double hitDifferential = hits - expectedHits;
                        if (hitDifferentialMap.containsKey(player)) {
                            hitDifferentialMap.put(player, hitDifferentialMap.get(player) + hitDifferential);
                        } else {
                            hitDifferentialMap.put(player, hitDifferential);
                        }
                    }
                } else if (details instanceof MoveDescription) {
                    // movement
                    final Pattern p = Pattern.compile("\\w+ undo move (\\d+).");
                    final Matcher m = p.matcher(title);
                    if (m.matches()) {
                        moveList.remove(Integer.valueOf(m.group(1)) - 1);
                    } else {
                        moveList.add(indent + title);
                        moving = true;
                    }
                } else if (details instanceof Collection) {
                    @SuppressWarnings("unchecked") final Collection<Object> objects = (Collection<Object>) details;
                    final Iterator<Object> objIter = objects.iterator();
                    if (objIter.hasNext()) {
                        final Object obj = objIter.next();
                        if (obj instanceof Unit) {
                            @SuppressWarnings("unchecked") final Collection<Unit> allUnitsInDetails = (Collection<Unit>) details;
                            // purchase/place units - don't need details
                            Unit unit = (Unit) obj;
                            if (title.matches("\\w+ buy .*") || title.matches("\\w+ attack with .*") || title.matches("\\w+ defend with .*")) {
                                logWriter.println(indent + title);
                            } else if (title.matches("\\d+ \\w+ owned by the .*? lost .*") || title.matches("\\d+ \\w+ owned by the .*? lost")) {
                                if (!verbose) {
                                    continue;
                                }
                                logWriter.println(indent + moreIndent + title);
                            } else if (title.startsWith("Battle casualty summary:")) {
                                // logWriter.println(indent+"CAS1: "+title);
                                logWriter.println(indent + conquerStr.toString() + ". Battle score " + title.substring(title.indexOf("for attacker is")));
                                conquerStr = new StringBuilder();
                                // separate units by player and show casualty summary
                                final IntegerMap<PlayerID> unitCount = new IntegerMap<>();
                                unitCount.add(unit.getOwner(), 1);
                                while (objIter.hasNext()) {
                                    unit = (Unit) objIter.next();
                                    unitCount.add(unit.getOwner(), 1);
                                }
                                for (final PlayerID player : unitCount.keySet()) {
                                    logWriter.println(indent + "Casualties for " + player.getName() + ": " + MyFormatter.unitsToTextNoOwner(allUnitsInDetails, player));
                                }
                            } else if (title.matches(".*? placed in .*") || title.matches(".* owned by the \\w+ retreated to .*")) {
                                logWriter.println(indent + title);
                            } else if (title.matches("\\w+ win")) {
                                conquerStr = new StringBuilder(title + conquerStr + " with " + MyFormatter.unitsToTextNoOwner(allUnitsInDetails) + " remaining");
                            } else {
                                logWriter.println(indent + title);
                            }
                        } else {
                            // collection of unhandled objects
                            logWriter.println(indent + title);
                        }
                    } else {
                        // empty collection of something
                        if (title.matches("\\w+ win")) {
                            conquerStr = new StringBuilder(title + conquerStr + " with no units remaining");
                        } else {
                            // empty collection of unhandled objects
                            logWriter.println(indent + title);
                        }
                    }
                } else if (details instanceof Territory) {
                    // territory details
                    logWriter.println(indent + title);
                } else if (details == null) {
                    if (title.equals("Adding original owners") || title.equals(MoveDelegate.CLEANING_UP_DURING_MOVEMENT_PHASE) || title.equals("Game Loaded") || title.contains("now being played by") || title.contains("Turn Summary") || title.contains("Move Summary") || title.contains("Setting uses for triggers used") || title.equals("Resetting and Giving Bonus Movement to Units") || title.equals("Recording Battle Statistics") || title.equals("Preparing Airbases for Possible Scrambling")) {
                    // do nothing
                    } else if (title.matches("\\w+ collect \\d+ PUs?.*")) {
                        logWriter.println(indent + title);
                    } else if (title.matches("\\w+ takes? .*? from \\w+")) {
                        // British take Libya from Germans
                        if (moving) {
                            final String str = moveList.remove(moveList.size() - 1);
                            moveList.add(str + "\n  " + indent + title.replaceAll(" takes ", " take "));
                        } else {
                            conquerStr.append(title.replaceAll("^\\w+ takes ", ", taking "));
                        }
                    } else if (title.matches("\\w+ spend \\d+ on tech rolls")) {
                        logWriter.println(indent + title);
                    } else if (title.startsWith("Rolls to resolve tech hits:")) {
                    // do nothing
                    } else {
                        logWriter.println(indent + title);
                    }
                } else {
                    // unknown details object
                    logWriter.println(indent + title);
                }
            } else if (node instanceof Step) {
                final PlayerID playerId = ((Step) node).getPlayerId();
                if (!title.equals("Initializing Delegates")) {
                    logWriter.println();
                    logWriter.print(indent + title);
                    if (playerId != null) {
                        currentPlayer = playerId;
                        players.add(currentPlayer);
                        logWriter.print(" - " + playerId.getName());
                    }
                    logWriter.println();
                }
            } else if (node instanceof Round) {
                logWriter.println();
                logWriter.println(indent + title);
            } else {
                logWriter.println(indent + title);
            }
        }
        // while (nodeEnum.hasMoreElements())
        curNode = curNode.getNextSibling();
    } while ((curNode instanceof Step) && players.contains(((Step) curNode).getPlayerId()));
    // if we are mid-phase, this might not get flushed
    if (moving && !moveList.isEmpty()) {
        final Iterator<String> moveIter = moveList.iterator();
        while (moveIter.hasNext()) {
            logWriter.println(moveIter.next());
            moveIter.remove();
        }
    }
    logWriter.println();
    if (verbose) {
        logWriter.println("Combat Hit Differential Summary :");
        logWriter.println();
        for (final String player : hitDifferentialMap.keySet()) {
            logWriter.println(moreIndent + player + " : " + String.format("%.2f", hitDifferentialMap.get(player)));
        }
    }
    logWriter.println();
    textArea.setText(stringWriter.toString());
}
Also used : DiceRoll(games.strategy.triplea.delegate.DiceRoll) PlayerID(games.strategy.engine.data.PlayerID) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode) HashMap(java.util.HashMap) Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList) MoveDescription(games.strategy.triplea.delegate.dataObjects.MoveDescription) Step(games.strategy.engine.history.Step) Unit(games.strategy.engine.data.Unit) Renderable(games.strategy.engine.history.Renderable) Round(games.strategy.engine.history.Round) PrintWriter(java.io.PrintWriter) HashSet(java.util.HashSet) IntegerMap(games.strategy.util.IntegerMap) Pattern(java.util.regex.Pattern) Territory(games.strategy.engine.data.Territory) TreePath(javax.swing.tree.TreePath) HistoryNode(games.strategy.engine.history.HistoryNode) Collection(java.util.Collection)

Aggregations

MoveDescription (games.strategy.triplea.delegate.dataObjects.MoveDescription)4 PlayerID (games.strategy.engine.data.PlayerID)2 Territory (games.strategy.engine.data.Territory)2 Unit (games.strategy.engine.data.Unit)2 Renderable (games.strategy.engine.history.Renderable)2 DiceRoll (games.strategy.triplea.delegate.DiceRoll)2 Collection (java.util.Collection)2 HistoryNode (games.strategy.engine.history.HistoryNode)1 Round (games.strategy.engine.history.Round)1 Step (games.strategy.engine.history.Step)1 PlacementDescription (games.strategy.triplea.delegate.dataObjects.PlacementDescription)1 IMoveDelegate (games.strategy.triplea.delegate.remote.IMoveDelegate)1 DicePanel (games.strategy.triplea.ui.DicePanel)1 IntegerMap (games.strategy.util.IntegerMap)1 GridBagConstraints (java.awt.GridBagConstraints)1 Insets (java.awt.Insets)1 PrintWriter (java.io.PrintWriter)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1