package myai;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import rts.GameState;
import rts.units.Unit;
import rts.units.UnitAction;
public class BuildingManager {
//List<Integer> unitsGround = new ArrayList<Integer>(), unitsAir = new ArrayList<Integer>();
enum BTYPE {
STOCKPILE, AIRPORT, SOLDIER_ORPHANAGE
}
LinkedHashMap<Long, BTYPE> myBuildings = new LinkedHashMap<Long, BTYPE>();
public void init(MapModule map, final GameState state, UnitGeneral general) {
/*for (int i = 0; i < state.getBuildingList().size(); i++) {
UnitDefinition s = state.getBuildingList().get(i);
if (i == general.SOLDIER_OFFICE_BUILD_ID) {
for (Integer prod : s.produces) {
unitsGround.add(prod);
System.out.println(prod);
}
} else if (i == general.AIRPORT_BUILD_ID) {
for (Integer prod : s.produces) {
unitsAir.add(prod);
}
}
}
Comparator<Integer> sortByStrength = new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
Integer aa = state.getUnitList().get(a).attack_max;
Integer bb = state.getUnitList().get(b).attack_max;
return -1 * aa.compareTo(bb);
}
};
Collections.sort(unitsGround, sortByStrength);
Collections.sort(unitsAir, sortByStrength);*/
}
public void commandUnit(Unit unit, GameState state, MapModule map, UnitGeneral men) {
if (!myBuildings.containsKey(unit.getID())) {
BTYPE type = null;
if (unit.isStockpile()) {
type = BTYPE.STOCKPILE;
} else if (unit.isBuilding()) {
boolean flying = false;
for (int un : unit.getProduce()) {
flying |= state.getUnitList().get(un).is_flying;
}
if (flying)
type = BTYPE.AIRPORT;
else
type = BTYPE.SOLDIER_ORPHANAGE;
}
if (type != null) {
myBuildings.put(unit.getID(), type);
}
}
switch (myBuildings.get(unit.getID())) {
case AIRPORT:
case SOLDIER_ORPHANAGE:
if (Math.random() < .025) {
buildSomethingIfAble(unit);
}
break;
case STOCKPILE:
if (men.numberOfWorkers < map.resources.size()) {
buildSomethingIfAble(unit);
}
break;
default:
break;
}
}
public boolean buildSomethingIfAble(Unit unit) {
float prob = .25f/2f;
for (UnitAction a : unit.getActions()) {
if (a.getType() == UnitAction.BUILD) {
if (Math.random() < prob) {
unit.setAction(a);
return true;
}
prob *= 2;
}
}
return false;
}
private boolean canAfford(ArrayList<Integer> cost, GameState state) {
for (int i = 0; i < state.getResourceTypes(); i++) {
if (cost.get(i) + (i) > state.getResources(i)) {
return false;
}
}
return true;
}
}