Ejemplo n.º 1
0
  /**
   * Converts the given XMLTag to CLUE game data.
   *
   * @param rootTag root Tag of the XML to begin parsing with
   * @return the generated CLUE game data
   * @throws XMLException
   */
  private static ClueGameData readFromXMLRootTag(XMLTag rootTag) throws XMLException {
    ClueGameData gameData = new ClueGameData();
    char passageLetter = 'A';

    XMLTag clueGameTag = rootTag.getSubTag("ClueGame");

    XMLTag roomsTag = clueGameTag.getSubTag("Rooms");
    gameData.setDisplayRoomPicturesOnBoard(
        Boolean.parseBoolean(roomsTag.getAttributeValue("displayRoomPicturesOnBoard")));
    List<Room> rooms = new ArrayList<Room>();
    for (XMLTag roomTag : roomsTag.getSubTags("Room")) {
      String roomName = roomTag.getAttributeValue("name");
      if (roomName == null)
        throw new XMLException(
            "Tag does not have a name attribute: " + XMLWriter.writeXMLToString(roomTag));
      Room room = new Room(parseAttributeAsInt(roomTag, "id"), roomName);

      String pictureName = roomTag.getAttributeValue("pictureName");
      if (pictureName != null) room.setPictureName(pictureName);

      if (roomTag.getAttributeValue("transparentPictureColor") != null)
        room.setTransparentPictureColor(
            new Color(parseAttributeAsInt(roomTag, "transparentPictureColor")));

      rooms.add(room);
    }
    gameData.setRooms(rooms);

    XMLTag suspectsTag = clueGameTag.getSubTag("Suspects");
    List<Suspect> suspects = new ArrayList<Suspect>();
    for (XMLTag suspectTag : suspectsTag.getSubTags("Suspect")) {
      String suspectName = suspectTag.getAttributeValue("name");
      if (suspectName == null)
        throw new XMLException(
            "Tag does not have a name attribute: " + XMLWriter.writeXMLToString(suspectTag));
      Color color = new Color(parseAttributeAsInt(suspectTag, "color"));
      Suspect suspect = new Suspect(parseAttributeAsInt(suspectTag, "id"), suspectName, color);

      String pictureName = suspectTag.getAttributeValue("pictureName");
      if (pictureName != null) suspect.setPictureName(pictureName);

      suspects.add(suspect);
    }
    gameData.setSuspects(suspects);

    XMLTag weaponsTag = clueGameTag.getSubTag("Weapons");
    List<Weapon> weapons = new ArrayList<Weapon>();
    for (XMLTag weaponTag : weaponsTag.getSubTags("Weapon")) {
      String weaponName = weaponTag.getAttributeValue("name");
      if (weaponName == null)
        throw new XMLException(
            "Tag does not have a name attribute: " + XMLWriter.writeXMLToString(weaponTag));
      Weapon weapon = new Weapon(parseAttributeAsInt(weaponTag, "id"), weaponName);

      String pictureName = weaponTag.getAttributeValue("pictureName");
      if (pictureName != null) weapon.setPictureName(pictureName);

      weapons.add(weapon);
    }
    gameData.setWeapons(weapons);

    XMLTag boardTag = clueGameTag.getSubTag("ClueBoard");
    Board board =
        new Board(parseAttributeAsInt(boardTag, "height"), parseAttributeAsInt(boardTag, "width"));
    gameData.setBackgroundImageFilename(boardTag.getAttributeValue("backgroundImageFilename"));
    gameData.setBackgroundColor(new Color(parseAttributeAsInt(boardTag, "backgroundColor")));
    for (XMLTag tileTag : boardTag.getSubTags("Tile")) {
      DisplayTile tile =
          board.getTile(parseAttributeAsInt(tileTag, "row"), parseAttributeAsInt(tileTag, "col"));
      if (tileTag.containsAttribute("roomId")) {
        int roomId = parseAttributeAsInt(tileTag, "roomId");
        Room room = null;
        for (Room currentRoom : rooms) {
          if (currentRoom.getId() == roomId) {
            room = currentRoom;
            break;
          }
        }
        if (room == null)
          throw new XMLException(
              "No matching room for Tile roomId: " + XMLWriter.writeXMLToString(tileTag));
        tile.setRoom(room);
      }

      for (XMLTag doorTag : tileTag.getSubTags("Door")) {
        try {
          tile.addDoor(DisplayTile.Direction.valueOf(doorTag.getContent()));
        } catch (IllegalArgumentException ex) {
          throw new XMLException(
              "Door Tag does not contain a valid direction: "
                  + XMLWriter.writeXMLToString(doorTag));
        }
      }

      if (tileTag.containsAttribute("removed")
          && tileTag.getAttributeValue("removed").equals("true")) tile.setRemoved();

      for (XMLTag passageConnectionTag : tileTag.getSubTags("PassageConnection")) {
        if (tile.isPassage()) continue;

        DisplayTile connectedTile =
            board.getTile(
                parseAttributeAsInt(passageConnectionTag, "row"),
                parseAttributeAsInt(passageConnectionTag, "col"));
        tile.setPassageConnection(connectedTile, passageLetter);
        connectedTile.setPassageConnection(tile, passageLetter);
        passageLetter++;
      }

      if (tileTag.containsAttribute("suspectId")) {
        int suspectId = parseAttributeAsInt(tileTag, "suspectId");
        Suspect suspect = null;
        for (Suspect currentSuspect : suspects) {
          if (currentSuspect.getId() == suspectId) {
            suspect = currentSuspect;
            break;
          }
        }
        if (suspect == null)
          throw new XMLException(
              "No matching suspect for Tile suspectId: " + XMLWriter.writeXMLToString(tileTag));

        DisplayTile.Direction direction =
            DisplayTile.Direction.valueOf(tileTag.getAttributeValue("suspectDirection"));
        tile.addSuspect(suspect, direction);
      }
    }
    gameData.setBoard(board);

    gameData.setStory(clueGameTag.getSubTag("Story").getContent());
    return gameData;
  }