public BaseEntity getEntity(int id) { return filterGameData(FullEntity.class, PlayerEntity.class).stream() .map(data -> (BaseEntity) data) .filter(e -> e.getId() == id) .findFirst() .orElse(null); }
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 void setGame(Game game) { this.game = game; buildFullEntityList(); // log.debug("Flattened " + flatData.size() + " data entities"); }
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; }
GameHelper helper = new GameHelper(); helper.setGame(replay.getGames().get(0)); for (GameData gameData : helper.getFlatData()) { if (gameData instanceof TagChange) { orderedTags.add(HasTag.of((TagChange) gameData)); List<GameData> timestampedData = helper.getFlatData().stream() .filter(d -> !StringUtils.isEmpty(d.getTimestamp())) .collect(Collectors.toList()); PlayerEntity player = helper.getMainPlayer(); int ourEntityId = player.getId(); List<TagChange> tagChanges = helper.filterGameData(TagChange.class); Optional<TagChange> winner = tagChanges.stream().filter( t -> t.getName() == GameTag.PLAYSTATE.getIntValue() && t.getValue() == PlayState.WON.getIntValue()) List<PlayerEntity> players = helper.getPlayers(); PlayerEntity player1 = players.stream().filter(p -> p.getId() == ourEntityId).findFirst().get(); PlayerEntity player2 = players.stream().filter(p -> p.getId() != ourEntityId).findFirst().get();
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; }
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(); } } }
private void extractData(GameData data) { if (data instanceof Action) { for (GameData gameData : ((Action) data).getData()) { flatData.add(gameData); extractData(gameData); } } }
public ReplayReader(GameEvents events) { // this.events = events; helper = new GameHelper(); tagChange = new TagChangeReader(events, helper); }
private void buildFullEntityList() { // Keep the chronological ordering for (GameData data : game.getData()) { flatData.add(data); extractData(data); } }