/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.petah.spring.bai.delegate;
import com.springrts.ai.oo.AIFloat3;
import com.springrts.ai.oo.clb.Economy;
import com.springrts.ai.oo.clb.Map;
import com.springrts.ai.oo.clb.OOAICallback;
import com.springrts.ai.oo.clb.Resource;
import java.util.List;
import java.util.logging.Logger;
import org.petah.common.util.profiler.Profiler;
import org.petah.spring.bai.BAI;
import org.petah.spring.bai.LocalCommandHandler;
import org.petah.spring.bai.MoveFailHandler;
import org.petah.spring.bai.AIOvermind;
import org.petah.spring.bai.PositionManager;
import org.petah.spring.bai.ResourceManager;
import org.petah.spring.bai.Strategy;
import org.petah.spring.bai.cache.CachedUnit;
import org.petah.spring.bai.cache.CachedUnitDef;
import org.petah.spring.bai.cache.CachedUnitManager;
import org.petah.spring.bai.factory.TeamDelegateFactory;
import org.petah.spring.bai.group.DefaultGroupManager;
import org.petah.spring.bai.group.GroupManager;
import org.petah.spring.bai.gui.GUIManager;
import org.petah.spring.bai.log.Log;
import org.petah.spring.bai.map.control.ControlZone;
import org.petah.spring.bai.map.metal.MetalSpotManager;
import org.petah.spring.bai.util.Compass;
/**
*
* @author davnei06
*/
public class AIDelegate {
private static final int DEFAULT_ZONE = 0;
private AIOvermind aiOvermind;
// Handlers
private BAI aiEventHandler;
private LocalCommandHandler localCommandHandler;
private MoveFailHandler moveFailHandler;
// Delegates
private TeamDelegate teamDelegate;
// Managers
private GroupManager groupManager;
private ResourceManager resourceManager;
private PositionManager positionManager;
// Properties
private OOAICallback callback;
private Economy economy;
private Map map;
private int teamID;
private int allianceID;
// Constructors
public AIDelegate(int teamID, OOAICallback callback, BAI aiEventHandler) {
Log.entry(AIDelegate.class, "AIDelegate");
Profiler.start(AIDelegate.class, "AIDelegate()");
this.teamID = teamID;
this.callback = callback;
this.economy = callback.getEconomy();
this.map = callback.getMap();
this.aiEventHandler = aiEventHandler;
this.allianceID = callback.getGame().getMyAllyTeam();
// aiEventHandler.setAiDelegate(this);
teamDelegate = TeamDelegateFactory.getTeamDelegate(this);
// Add event listeners for each BAI so they are always updated while at least one BAI is alive.
// Unit events wont be duplicated because of mapping the unit ID to the map key
// aiEventHandler.addUnitEventListener(teamDelegate.getCachedUnitManager());
// aiEventHandler.addEnemyEventListener(teamDelegate.getCachedUnitManager());
// aiEventHandler.addDamageEventListener(teamDelegate.getCachedUnitManager());
// Update events wont be called twice due to the update delay timer
// aiEventHandler.addUpdateEventListener(teamDelegate.getCachedUnitManager());
// aiEventHandler.addUpdateEventListener(teamDelegate.getControlMap());
// aiEventHandler.addUpdateEventListener(teamDelegate.getTargetMap());
groupManager = new DefaultGroupManager(this);
positionManager = new PositionManager(this);
localCommandHandler = new LocalCommandHandler(this);
resourceManager = new ResourceManager(this);
moveFailHandler = new MoveFailHandler(this);
aiOvermind = new AIOvermind(this);
GUIManager.addAIDelegate(this);
Profiler.stop(AIDelegate.class, "AIDelegate()");
}
// Public methods
/**
* Not thread safe.
* @param command
* @return
*/
// public int handleCommand(Command command) {
// int result = callback.getEngine().handleCommand(CommandWrapper.COMMAND_TO_ID_ENGINE, -1, command);
// if (result != AIReturnCode.NORMAL) {
// throw new AICommandException(this, command, result);
// }
// return result;
// }
public int sendMessage(Object o) {
Logger.getLogger(AIDelegate.class.getName()).info(getPrefix() + o);
callback.getGame().sendTextMessage(getPrefix() + o, DEFAULT_ZONE);
return 0;
}
public boolean sendResource(Resource resource, float amount, int teamId) {
return economy.sendResource(resource, amount, teamId);
}
public String getPrefix() {
return "AI " + teamID + ": ";
}
// Delegate methods
public CachedUnitManager getCachedUnitManager() {
return teamDelegate.getCachedUnitManager();
}
public MetalSpotManager getMetalSpotManager() {
return teamDelegate.getMetalSpotManager();
}
public CachedUnit getCachedUnit(int unitID) {
return teamDelegate.getCachedUnitManager().getCachedUnit(unitID);
}
public boolean isPossibleToBuildAt(CachedUnitDef def, AIFloat3 pos, int facing) {
return map.isPossibleToBuildAt(def.getUnitDef(), pos, facing);
}
public AIFloat3 findClosestBuildSite(CachedUnitDef def, AIFloat3 pos, float searchRadius, int minDist, int facing) {
return map.findClosestBuildSite(def.getUnitDef(), pos, searchRadius, minDist, facing);
}
public Compass getStartSide() {
return positionManager.getStartSide();
}
public float getStartDirection() {
return positionManager.getStartDirection();
}
public AIFloat3 getBaseCenter() {
return positionManager.getBaseCenter();
}
public List<ControlZone> getEnemyControlZones() {
return teamDelegate.getControlMap().getEnemyControlZones();
}
public List<ControlZone> getFriendlyControlZones() {
return teamDelegate.getControlMap().getFriendlyControlZones();
}
public List<ControlZone> getNeutralControlZones() {
return teamDelegate.getControlMap().getNeutralControlZones();
}
public void addStrategy(Strategy strategy) {
teamDelegate.getTeamOvermind().addStrategy(this, strategy);
}
/**
* Not thread safe.
* @return the Economy for this AIDelegate
*/
public Economy getEconomy() {
return callback.getEconomy();
}
// Getters
public BAI getAIEventHandler() {
return aiEventHandler;
}
public int getAllianceID() {
return allianceID;
}
/**
* Not thread safe.
* @return the OOAICallback for this AIDelegate
*/
public OOAICallback getCallback() {
return callback;
}
public GroupManager getGroupManager() {
return groupManager;
}
public LocalCommandHandler getLocalCommandHandler() {
return localCommandHandler;
}
public ResourceManager getResourceManager() {
return resourceManager;
}
public TeamDelegate getTeamDelegate() {
return teamDelegate;
}
public int getTeamID() {
return teamID;
}
public AIOvermind getAIOvermind() {
return aiOvermind;
}
}