/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.petah.spring.bai.tasks.standard;
import org.petah.spring.bai.delegate.AIDelegate;
import org.petah.spring.bai.tasks.*;
import com.springrts.ai.oo.AIFloat3;
import java.util.LinkedList;
import java.util.List;
import org.petah.common.option.Option;
import org.petah.common.option.OptionsManager;
import org.petah.common.util.GameMath;
import org.petah.spring.bai.cache.CachedUnit;
import org.petah.spring.bai.group.UnitGroup;
import org.petah.spring.bai.map.control.ControlZone;
import org.petah.spring.bai.util.CommandUtil;
import org.petah.spring.bai.util.MapUtil;
/**
*
* @author Petah
*/
public class DefaultScout extends Task {
// Scouting options
private static Option<Integer> updateTime = OptionsManager.getOption(
new Option<Integer>("DefaultScout.updateTime", 200));
private static Option<Integer> controlZoneMinAge = OptionsManager.getOption(
new Option<Integer>("DefaultScout.controlZoneMinAge", -5));
// Class properties
private float nextUpdate = 0;
public DefaultScout(AIDelegate aiDelegate) {
super(aiDelegate);
}
@Override
public boolean update(UnitGroup group, int frame) {
if (nextUpdate <= frame) {
nextUpdate = frame + updateTime.getValue();
scoutClosestZone(group);
}
return false;
}
private void scoutRandomZone(UnitGroup group) {
List<ControlZone> zones = aiDelegate.getTeamDelegate().getControlMap().getNeutralControlZones();
List<ControlZone> oldZones = new LinkedList<ControlZone>();
for (ControlZone zone : zones) {
if (zone.getAge() < controlZoneMinAge.getValue()) {
oldZones.add(zone);
}
}
for (CachedUnit unit : group) {
if (oldZones.size() > 0) {
ControlZone controlZone = oldZones.get((int) (oldZones.size() * Math.random()));
unit.moveTo(new AIFloat3(controlZone.getTerrainCenterX(), 0, controlZone.getTerrainCenterZ()));
}
}
}
private void scoutClosestZone(UnitGroup group) {
List<ControlZone> zones = aiDelegate.getNeutralControlZones();
zones.addAll(aiDelegate.getEnemyControlZones());
for (CachedUnit unit : group) {
if (unit.getCurrentCommands().size() == 0) {
ControlZone controlZone = getClosestControlZone(zones, unit.getPos(), controlZoneMinAge.getValue());
if (controlZone != null) {
AIFloat3 moveTo = new AIFloat3(controlZone.getTerrainX(), 0, controlZone.getTerrainZ());
moveTo.x += Math.random() * MapUtil.mapToTerrain(ControlZone.getSize());
moveTo.z += Math.random() * MapUtil.mapToTerrain(ControlZone.getSize());
unit.moveTo(moveTo);
}
}
}
}
public static ControlZone getClosestControlZone(List<ControlZone> zones, AIFloat3 pos, int maxAge) {
ControlZone closest = null;
float closestDistance = Float.MAX_VALUE;
for (ControlZone zone : zones) {
if (zone.getAge() < maxAge) {
float distance = GameMath.pointDistance(zone.getTerrainCenterX(), zone.getTerrainCenterZ(), pos.x, pos.z);
if (closest == null ||
distance < closestDistance) {
closestDistance = distance;
closest = zone;
}
}
}
return closest;
}
}