/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.petah.spring.bai.tasks.porc; import com.springrts.ai.oo.AIFloat3; 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.tasks.Task; import org.petah.spring.bai.unit.UnitInfo; import org.petah.spring.bai.util.CommandUtil; /** * * @author Petah */ public class PorcNano extends Task { // Options private static Option<Integer> updateTime = OptionsManager.getOption( new Option<Integer>("PorcNano.updateTime", 150)); // Class properties private int nextUpdate = 0; public PorcNano(AIDelegate aiDelegate) { super(aiDelegate); } public boolean update(UnitGroup group, int frame) { if (nextUpdate <= frame) { nextUpdate = frame + updateTime.getValue(); for (CachedUnit unit : group) { CachedUnit reclaim = null; if (!aiDelegate.getResourceManager().isMetalOver(0.25f)) { if (reclaim == null) { reclaim = getReclaimableEnergy(aiDelegate, unit); } } if (reclaim != null) { unit.stop(); System.err.println("Reclaiming"); unit.reclaimUnit(reclaim.getUnit()); } else if (aiDelegate.getResourceManager().isEnergyOver(500)) { unit.setMoveState(CachedUnit.MOVE_STATE_ROAM); AIFloat3 pos = unit.getPos(); pos.x += Math.random() * 500 - 250; pos.z += Math.random() * 500 - 250; System.err.println("Patroling"); unit.patrolTo(pos); } else { System.err.println("Stoping"); unit.stop(); } } // } } return false; } public static CachedUnit getReclaimableEnergy(AIDelegate aiDelegate, CachedUnit unit) { CachedUnit closest = null; float closestDistance = Float.MAX_VALUE; for (CachedUnit building : aiDelegate.getGroupManager().getGroup("energyGenerators")) { UnitInfo buildingInfo = building.getUnitInfo(); if (buildingInfo.getName().equals("Solar") || buildingInfo.getName().equals("Wind")) { AIFloat3 unitPos = unit.getPos(); AIFloat3 buildingPos = building.getPos(); float distance = GameMath.pointDistance(unitPos.x, unitPos.y, buildingPos.x, buildingPos.y); if (closest == null || distance < closestDistance) { if (unit.getDef().getBuildDistance() > distance) { closest = building; closestDistance = distance; } } } } return closest; } }