package ca.cosc3p91.a3.util; import ChallengeDecision.*; import ca.cosc3p91.a3.game.Map; import ca.cosc3p91.a3.gameobjects.*; import java.util.ArrayList; import java.util.List; public class ChallengeAdapter { private static class MapChallengeConverter { private final Map map; public MapChallengeConverter(Map map){ this.map = map; } public List> getAttackers(){ List> entityAttackList = new ArrayList<>(); map.inhabitants.stream() .filter(i -> i instanceof Infantry) .map(i -> (Infantry) i) .forEach(i -> { entityAttackList.add(new ChallengeAttack<>((double) i.getDamage(), (double) i.getHealth())); }); return entityAttackList; } public List> getDefenders(){ List> entityDefenseList = new ArrayList<>(); map.contains.stream() .filter(b -> b instanceof DefenseBuilding) .map(b -> (DefenseBuilding) b) .forEach(d -> { entityDefenseList.add(new ChallengeDefense<>((double) d.getDamage(), (double) d.getHealth())); }); return entityDefenseList; } public List> getResources(String type){ List> entityResourceList = new ArrayList<>(); CasaDeNarino th = map.getTownHall(); int resourceCount; int thResourceCount = type.equals(SaulGoodMine.resource) ? th.getCurrentGold() : type.equals(IronMine.resource) ? th.getCurrentIron() : th.getCurrentWood(); resourceCount = (int) map.contains.stream() .filter(b -> b instanceof ResourceBuilding).map(b -> (ResourceBuilding) b) .filter(r -> r.getResource().equals(type)) .count(); map.contains.stream() .filter(b -> b instanceof ResourceBuilding) .map(b -> (ResourceBuilding) b) .filter(r -> r.getResource().equals(type)) .forEach((r) -> { entityResourceList.add( new ChallengeResource<>( (double) thResourceCount / (double) resourceCount, (double) r.getHealth()) ); }); return entityResourceList; } } private final Map map; public ChallengeAdapter(Map map){ this.map = map; } public void attack(Map enemy){ MapChallengeConverter enemyMap = new MapChallengeConverter(enemy); MapChallengeConverter ourMap = new MapChallengeConverter(this.map); List> ourAttackers = ourMap.getAttackers(); // not needed List> ourDefenders = ourMap.getDefenders(); ChallengeEntitySet ourSet = new ChallengeEntitySet<>(); ourSet.setEntityAttackList(ourAttackers); ourSet.setEntityDefenseList(ourDefenders); List> enemyDefenders = enemyMap.getDefenders(); List> enemyGold = enemyMap.getResources(SaulGoodMine.resource); List> enemyIron = enemyMap.getResources(IronMine.resource); List> enemyWood = enemyMap.getResources(LumberMine.resource); // split is required because challengeResource lacks any resource specifier ChallengeEntitySet enemyGoldSet = new ChallengeEntitySet<>(); ChallengeEntitySet enemyIronSet = new ChallengeEntitySet<>(); ChallengeEntitySet enemyWoodSet = new ChallengeEntitySet<>(); enemyGoldSet.setEntityDefenseList(enemyDefenders); enemyIronSet.setEntityDefenseList(enemyDefenders); enemyWoodSet.setEntityDefenseList(enemyDefenders); enemyGoldSet.setEntityResourceList(enemyGold); enemyIronSet.setEntityResourceList(enemyIron); enemyWoodSet.setEntityResourceList(enemyWood); ChallengeResult goldResults = Arbitrer.challengeDecide(ourSet, enemyGoldSet); ChallengeResult ironResults = Arbitrer.challengeDecide(ourSet, enemyIronSet); ChallengeResult woodResults = Arbitrer.challengeDecide(ourSet, enemyWoodSet); // if any fail to attack we need to pretend like it was one big attack that failed if (!goldResults.getChallengeWon() || !ironResults.getChallengeWon() || !woodResults.getChallengeWon()) return; System.out.println("We won gold: "); goldResults.print(); System.out.println("We won iron: "); ironResults.print(); System.out.println("We won wood: "); woodResults.print(); CasaDeNarino th = map.getTownHall(); goldResults.getLoot().forEach(r -> { th.addGold((int)r.getProperty().doubleValue()); }); ironResults.getLoot().forEach(r -> { th.addIron((int)r.getProperty().doubleValue()); }); woodResults.getLoot().forEach(r -> { th.addWood((int)r.getProperty().doubleValue()); }); } }