public void setGame(Game game) { this.game = game; buildFullEntityList(); // log.debug("Flattened " + flatData.size() + " data entities"); }
public void reset() { replay = new HearthstoneReplay(); currentGame = new Game(); }
public PlayerEntity getMainPlayer() { // Since patch 5.2.0.13619, the first showEntity with a cardID (and that // is not an enchantment, cf tavern brawl conditions) always comes from // the current player PlayerEntity player = extractMainPlayer(); if (player == null) { player = extractPuzzlePlayer(); } return player; }
private String getPlayerCardId(HearthstoneReplay replay, PlayerEntity player) { List<GameData> data = replay.getGames().get(0).getData(); int playerEntityId = player.getTags().stream().filter(t -> t.getName() == GameTag.HERO_ENTITY.getIntValue()) .findFirst().get().getValue(); FullEntity playerEntity = data.stream().filter(d -> (d instanceof FullEntity)).map(e -> (FullEntity) e) .filter(e -> e.getId() == playerEntityId).findFirst().get(); return playerEntity.getCardId(); }
private PlayerEntity extractMainPlayer() { List<ShowEntity> showEntities = filterGameData(ShowEntity.class); for (ShowEntity entity : showEntities) { if (StringUtils.isNotEmpty(entity.getCardId()) && getTag(entity.getTags(), GameTag.CARDTYPE) != CardType.ENCHANTMENT.getIntValue()) { int entityId = entity.getEntity(); // The full entity BaseEntity fullEntity = getEntity(entityId); // Now check the CONTROLLER tag int controllerId = getTag(fullEntity.getTags(), GameTag.CONTROLLER); for (PlayerEntity player : getPlayers()) { if (getTag(player.getTags(), GameTag.CONTROLLER) == controllerId) { return player; } } } } return null; }
private int updatePlayerEntity(ParserState state, String rawEntity, Tag tag, int entity) { if (!Utils.isInteger(rawEntity) && !rawEntity.startsWith("[") && !rawEntity.equals("GameEntity")) { if (entity != tag.getValue()) { entity = tag.getValue(); String tmpName = ((PlayerEntity) state.getCurrentGame().getData().get(1)).getName(); ((PlayerEntity) state.getCurrentGame().getData().get(1)) .setName(((PlayerEntity) state.getCurrentGame().getData().get(2)).getName()); ((PlayerEntity) state.getCurrentGame().getData().get(2)).setName(tmpName); for (Object obj : ((Game) state.getNode().getObject()).getData()) { TagChange tChange = obj instanceof TagChange ? (TagChange) obj : null; if (tChange != null) { tChange.setEntity(tChange.getEntity() == 2 ? 3 : 2); } } } } return entity; }
private PlayerEntity extractPuzzlePlayer() { List<PlayerEntity> players = getPlayers(); for (PlayerEntity player : players) { int entityId = getTag(player.getTags(), GameTag.HERO_ENTITY); FullEntity entity = (FullEntity) getEntity(entityId); if (entity == null) { continue; } int functionallyDeadTag = getTag(player.getTags(), GameTag.APPEAR_FUNCTIONALLY_DEAD); if (functionallyDeadTag != -1) { continue; } return player; } return null; }
public static void handle(String timestamp, String data, ParserState state) throws Exception { data = data.trim(); Matcher match = Regexes.SendOptionRegex.matcher(data); if (match.matches()) { String option = match.group(1); String suboption = match.group(2); String target = match.group(3); String position = match.group(4); SendOption sendOption = SendOption.builder().optionIndex(Integer.parseInt(option)) .position(Integer.parseInt(position)).subOption(Integer.parseInt(suboption)) .target(Integer.parseInt(target)).build(); if (state.getNode().getType().isAssignableFrom(Game.class)) ((Game) state.getNode().getObject()).getData().add(sendOption); else throw new Exception("Invalid node " + state.getNode().getType()); } } }
private static int getPlayerIdFromName(String data, ParserState state) throws Exception { List<GameData> gameData = state.getCurrentGame().getData(); PlayerEntity firstPlayer = null; for (GameData x : gameData) { if (x instanceof PlayerEntity && ((PlayerEntity) x).getId() == state.getFirstPlayerId()) { firstPlayer = (PlayerEntity) x; break; if (x instanceof PlayerEntity && ((PlayerEntity) x).getId() != state.getFirstPlayerId()) { secondPlayer = (PlayerEntity) x; break; if (data.equals(firstPlayer.getName())) { return firstPlayer.getId(); } if (data.equals(secondPlayer.getName())) { return secondPlayer.getId(); } if (StringUtils.isEmpty(firstPlayer.getName())) { firstPlayer.setName(data); return firstPlayer.getId(); if (StringUtils.isEmpty(secondPlayer.getName())) { secondPlayer.setName(data); return secondPlayer.getId(); if ("UNKNOWN HUMAN PLAYER".equals(firstPlayer.getName()) || "The Innkeeper".equals(firstPlayer.getName())) { firstPlayer.setName(data); return firstPlayer.getId(); if ("UNKNOWN HUMAN PLAYER".equals(secondPlayer.getName()) || "The Innkeeper".equals(secondPlayer.getName())) { secondPlayer.setName(data); return secondPlayer.getId();
private void updateCurrentPlayer(ParserState state, String rawEntity, Tag tag) throws Exception { List<GameData> data = state.getCurrentGame().getData(); if (tag.getValue() == 0) { try { Helper.parseEntity(rawEntity, state); if (x instanceof PlayerEntity && ((PlayerEntity) x).getId() == state.getCurrentPlayerId()) { ((PlayerEntity) x).setName(rawEntity); break; else if (tag.getValue() == 1) { try { Helper.parseEntity(rawEntity, state); if (x instanceof PlayerEntity && ((PlayerEntity) x).getId() != state.getCurrentPlayerId()) { ((PlayerEntity) x).setName(rawEntity); break;
public void read(HearthstoneReplay replay) { // read replay file and notify of turns/events etc. if (replay.getGames() == null || replay.getGames().isEmpty()) { return; } // For now support only a single game Game game = replay.getGames().get(0); helper.setGame(game); List<GameData> data = game.getData(); for (GameData gameData : data) { readData(gameData); } }
public void read(TagChange data) { // Start turn if (data.getEntity() == 1 && data.getName() == GameTag.TURN.getIntValue()) { events.turnStart(data.getValue()); } // PREDAMAGE is how much damage should be applied. This includes damage // taken from the armor, while DAMAGE doesn't include armor loss if (data.getName() == GameTag.PREDAMAGE.getIntValue()) { if (data.getValue() > 0 && data.getEntity() != 1) { BaseEntity entity = helper.getEntity(data.getEntity()); events.damageTaken(entity, data.getValue()); } } // Some things still happen after the PLAYSTATE change to WON/LOST/TIED, // so we need to use this // Only raise a single gameEnd event if (data.getName() == GameTag.GOLD_REWARD_STATE.getIntValue() && data.getEntity() == 2) { events.gameEnd(); } } }
public HearthstoneReplay fromString(Iterable<String> lines, int hsBuild, GameType... gameTypes) throws Exception { read(lines); state.getReplay().setVersion(VERSION); state.getReplay().setBuild(String.valueOf(hsBuild)); for (int i = 0; i < state.getReplay().getGames().size(); i++) { if (gameTypes.length == 1) { state.getReplay().getGames().get(i).setType(gameTypes[0].getIntValue()); } else { state.getReplay().getGames().get(i).setType(gameTypes.length > i ? gameTypes[i].getIntValue() : 0); } } return state.getReplay(); }
private void buildFullEntityList() { // Keep the chronological ordering for (GameData data : game.getData()) { flatData.add(data); extractData(data); } }
private void extractData(GameData data) { if (data instanceof Action) { for (GameData gameData : ((Action) data).getData()) { flatData.add(gameData); extractData(gameData); } } }
public BaseEntity getEntity(int id) { return filterGameData(FullEntity.class, PlayerEntity.class).stream() .map(data -> (BaseEntity) data) .filter(e -> e.getId() == id) .findFirst() .orElse(null); }
public List<PlayerEntity> getPlayers() { List<PlayerEntity> players = new ArrayList<>(); for (GameData x : currentGame.getData()) { if (x instanceof PlayerEntity) { players.add((PlayerEntity) x); } } return players; }
public ReplayReader(GameEvents events) { // this.events = events; helper = new GameHelper(); tagChange = new TagChangeReader(events, helper); }
private void read(Iterable<String> lines) throws Exception { state.reset(); state.getReplay().setGames(new ArrayList<Game>()); Pattern logTypeRegex = null;
private String getPlayerClass(HearthstoneReplay replay, PlayerEntity player) { List<GameData> data = replay.getGames().get(0).getData(); int playerEntityId = player.getTags().stream().filter(t -> t.getName() == GameTag.HERO_ENTITY.getIntValue()) .findFirst().get().getValue(); FullEntity playerEntity = data.stream().filter(d -> (d instanceof FullEntity)).map(e -> (FullEntity) e) .filter(e -> e.getId() == playerEntityId).findFirst().get(); return cardsList.getDbCards().stream() .filter(c -> playerEntity.getCardId().equalsIgnoreCase(c.getId())) .findFirst() .map(DbCard::getPlayerClass) .map(String::toLowerCase) .orElse("unknown"); }