Changeset 47a8976


Ignore:
Timestamp:
Mar 20, 2010, 4:22:18 PM (11 years ago)
Author:
Michael Seifert <mseifert@…>
Branches:
master
Children:
33f5302
Parents:
9318f55
Message:

Support for observers

Location:
src/main/java/de/erichseifert/warp
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/de/erichseifert/warp/gui/ChatRenderer.java

    r9318f55 r47a8976  
    2323
    2424import java.awt.BorderLayout;
     25import java.awt.Color;
    2526import java.util.HashMap;
    2627import java.util.List;
     
    110111                Player player = message.getPlayer();
    111112                String playerName = player.getName();
    112                 String colorHex = GUIUtil.toHTMLColor(player.getColor());
     113                Color playerColor= player.getColor();
     114                String colorHex = GUIUtil.toHTMLColor(playerColor);
    113115                String channel;
    114116                if (message.getChannel() == ChatMessage.ALL) {
  • src/main/java/de/erichseifert/warp/replays/sc2replay/ReplayMetaData.java

    r9318f55 r47a8976  
    2727import java.util.ArrayList;
    2828import java.util.Collections;
     29import java.util.Iterator;
    2930import java.util.List;
    3031
     
    4748                playerCount = src.get();
    4849                players = new ArrayList<SC2Player>();
    49                 List<String> playerNames = new ArrayList<String>();
    5050                for (int i = 0; i < playerCount; i++) {
    5151                        String playerName = ReplayUtil.getReplayString(src);
    52                         // Skip byte. Purpose unknown
    53                         src.position(src.position()+1);
    54                         // Skip int. Purpose unknown
    55                         src.position(src.position()+4);
     52                        // Skip 5 bytes. Purpose unknown. Always seem to be 0.
     53                        src.position(src.position()+5);
    5654
    5755                        if (!playerName.isEmpty()) {
    58                                 playerNames.add(playerName);
     56                                SC2Player player = new SC2Player(playerName);
     57                                // TODO: Retrieve "true" information about a player being an observer
     58                                player.setObserver(true);
     59                                players.add(player);
    5960                        }
    6061                }
    6162
    62                 /*
    63                  * Search for the name of the first player in order to jump to the position
    64                  * of the block with the extended player data.
    65                  */
    66                 int additionalInfoStartPos = ReplayUtil.searchBuffer(src, playerNames.get(0));
    67                 src.position(additionalInfoStartPos-1);
    68                 for (String playerName : playerNames) {
    69                         // Check the names
    70                         String name = ReplayUtil.getReplayString(src);
    71                         if (!playerName.equals(name)) {
    72                                 System.err.println("The player names in the meta data do not match.");
     63                // Skip 6 bytes. Purpose unknown.
     64                src.position(src.position()+6);
     65
     66                int additionalInfoStartPos = -1;
     67                for (Iterator<SC2Player> iter = players.iterator(); iter.hasNext();) {
     68                        SC2Player player = iter.next();
     69                        if (additionalInfoStartPos == -1) {
     70                                /*
     71                                 * Search for the name of the first player in order to jump to the position
     72                                 * of the block with the extended player data.
     73                                 */
     74                                additionalInfoStartPos = ReplayUtil.searchBuffer(src, player.getName());
     75                                if (additionalInfoStartPos == -1) {
     76                                        continue;
     77                                }
     78                                src.position(additionalInfoStartPos-1);
    7379                        }
    74                         String playerRace = ReplayUtil.getReplayString(src);
    75                         String colorString = ReplayUtil.getReplayString(src);
     80                        String name = new String(ReplayUtil.getReplayString(src));
     81                        // Retrieve player with the read name
     82                        player = getPlayer(name);
     83                        if (player == null) {
     84                                break;
     85                        }
     86                        /* If a player's name is contained in the player meta data at the end,
     87                         * the player does participate in the game as a player.
     88                         */
     89                        player.setObserver(false);
     90                        String playerRace = new String(ReplayUtil.getReplayString(src));
     91                        String colorString = new String(ReplayUtil.getReplayString(src));
    7692                        String[] colorValues = colorString.split(",");
    7793                        Color color = new Color(
     
    8298                        );
    8399
    84                         // Assemble player information object
    85                         // TODO: Retrieve information about a player bein an observer
    86                         SC2Player player = new SC2Player(name, playerRace, color, false);
    87                         players.add(player);
     100                        // Add player information
     101                        player.setRace(playerRace);
     102                        player.setColor(color);
    88103                }
     104        }
     105
     106        public SC2Player getPlayer(String name) {
     107                for (SC2Player player : players) {
     108                        if (player.getName().equals(name)) {
     109                                return player;
     110                        }
     111                }
     112                return null;
    89113        }
    90114
  • src/main/java/de/erichseifert/warp/replays/sc2replay/SC2ChatMessages.java

    r9318f55 r47a8976  
    7777                                continue;
    7878                        }
    79                         String messageString = ReplayUtil.getReplayString(src);
     79                        String messageString = new String(ReplayUtil.getReplayString(src));
    8080                        Player player = players.get(playerIndex-1);
    8181                        SC2ChatMessage message = new SC2ChatMessage(player, channel, messageString);
  • src/main/java/de/erichseifert/warp/replays/sc2replay/SC2Player.java

    r9318f55 r47a8976  
    3030 */
    3131public class SC2Player implements Player {
     32        private static String RACE_OBSERVER = "Observer";
     33        private static Color COLOR_OBSERVER = Color.GRAY;
     34
    3235        private final String name;
    33         private final String race;
    34         private final Color color;
    35         private final boolean observer;
     36        private String race;
     37        private Color color;
     38        private boolean observer;
    3639
    3740        /**
    38          * Creates a new <code>SC2Player</code> object with the specified name, race, color and type.
     41         * Creates a new <code>SC2Player</code> object with the specified name.
    3942         * @param name Name of the player.
    40          * @param race Race of the player.
    41          * @param color Color of the player.
    42          * @param observer <code>true</code> if the player is an observer.
    4343         */
    44         protected SC2Player(String name, String race, Color color, boolean observer) {
     44        protected SC2Player(String name) {
    4545                this.name = name;
    46                 this.race = race;
    47                 this.color = color;
    48                 this.observer = observer;
    4946        }
    5047
     
    6865                return observer;
    6966        }
     67
     68        public void setRace(String race) {
     69                this.race = race;
     70        }
     71
     72        public void setColor(Color color) {
     73                this.color = color;
     74        }
     75
     76        public void setObserver(boolean observer) {
     77                this.observer = observer;
     78                if (observer) {
     79                        color = COLOR_OBSERVER;
     80                        race = RACE_OBSERVER;
     81                }
     82        }
     83
     84        public static Color getCOLOR_OBSERVER() {
     85                return COLOR_OBSERVER;
     86        }
     87
     88        public static void setCOLOR_OBSERVER(Color cOLOROBSERVER) {
     89                COLOR_OBSERVER = cOLOROBSERVER;
     90        }
     91
     92        public static String getRACE_OBSERVER() {
     93                return RACE_OBSERVER;
     94        }
     95
     96        public static void setRACE_OBSERVER(String rACEOBSERVER) {
     97                RACE_OBSERVER = rACEOBSERVER;
     98        }
    7099}
  • src/main/java/de/erichseifert/warp/util/ReplayUtil.java

    r9318f55 r47a8976  
    2323
    2424import java.nio.ByteBuffer;
     25import java.util.LinkedList;
     26import java.util.List;
    2527
    2628/**
     
    4143         * This method uses the relative get methods of the <code>ByteBuffer</code>,
    4244         * thus incrementing its position.
    43          * @param src
     45         * @param src Buffer to read from.
    4446         * @return String.
    4547         */
     
    6163                src.mark();
    6264                int resultPos = -1;
    63                 byte[] stringBytes = string.getBytes();
    64                 StringBuffer buf = new StringBuffer(stringBytes.length+1);
     65                LinkedList<Byte> buf = new LinkedList<Byte>();
     66                byte[] strBytes = string.getBytes();
    6567                while (src.hasRemaining()) {
    66                         buf.append((char) src.get());
    67                         if (buf.length() > stringBytes.length) {
    68                                 buf.deleteCharAt(0);
     68                        buf.addLast(src.get());
     69                        if (buf.size() > strBytes.length) {
     70                                buf.removeFirst();
    6971                        }
    70                         if (new String(buf).equals(string)) {
    71                                 resultPos = src.position()-buf.length();
     72                        if (bytesEqualList(strBytes, buf)) {
     73                                resultPos = src.position()-buf.size();
    7274                                break;
    7375                        }
     
    7577                src.reset();
    7678                return resultPos;
     79        }
     80
     81        private static boolean bytesEqualList(byte[] bytes, List<Byte> list) {
     82                for (int i = 0; i < bytes.length; i++) {
     83                        if (bytes[i] != list.get(i)) {
     84                                return false;
     85                        }
     86                }
     87                return true;
    7788        }
    7889
Note: See TracChangeset for help on using the changeset viewer.