/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.petah.spring.bai.tasks.standard;
import com.springrts.ai.oo.AIFloat3;
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.delegate.AIDelegate;
import org.petah.spring.bai.group.UnitGroup;
import org.petah.spring.bai.map.target.TargetZone;
import org.petah.spring.bai.tasks.Task;
import org.petah.spring.bai.util.CommandUtil;
/**
*
* @author Petah
*/
public class DefaultFighter extends Task {
// Options
private static Option<Integer> updateTime = OptionsManager.getOption(
new Option<Integer>("DefaultFighter.updateTime", 150));
private static Option<Integer> maxDistance = OptionsManager.getOption(
new Option<Integer>("DefaultFighter.maxDistance", 5000));
private static Option<Integer> patrolDistance = OptionsManager.getOption(
new Option<Integer>("DefaultFighter.patrolDistance", 3000));
// Class properties
private float nextUpdate = 0;
public DefaultFighter(AIDelegate aiDelegate) {
super(aiDelegate);
}
@Override
public boolean update(UnitGroup group, int frame) {
if (nextUpdate <= frame) {
nextUpdate = frame + updateTime.getValue();
List<TargetZone> zones = aiDelegate.getTeamDelegate().getTargetMap().getTargetZones();
if (zones != null && zones.size() > 0) {
for (final CachedUnit unit : group) {
TargetZone targetZone = zones.get((int) (zones.size() * Math.random()));
CachedUnit enemy = DefaultDefence.getClosestEnemyUnit(targetZone, aiDelegate.getBaseCenter(), maxDistance.getValue());
if (enemy != null) {
unit.attack(enemy.getUnit());
} else {
patrolUnit(unit);
}
}
} else {
for (final CachedUnit unit : group) {
patrolUnit(unit);
}
}
}
return false;
}
private void patrolUnit(CachedUnit unit) {
float direction = (float) Math.random() * 360;
AIFloat3 patrolTo = new AIFloat3();
patrolTo.x = aiDelegate.getBaseCenter().x + GameMath.lengthDirX(patrolDistance.getValue(), direction);
patrolTo.z = aiDelegate.getBaseCenter().z + GameMath.lengthDirY(patrolDistance.getValue(), direction);
unit.patrolTo(patrolTo);
}
}