/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.petah.spring.bai.tasks.plan; 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.spring.bai.GlobalOptions; import org.petah.spring.bai.cache.CachedUnit; import org.petah.spring.bai.cache.CachedUnitDef; import org.petah.spring.bai.delegate.AIDelegate; import org.petah.spring.bai.delegate.GlobalDelegate; import org.petah.spring.bai.group.UnitGroup; import org.petah.spring.bai.tasks.Task; import org.petah.spring.bai.tasks.standard.DefaultCommands; import org.petah.spring.bai.unit.Faction; import org.petah.spring.bai.util.ArrayUtil; import org.petah.spring.bai.util.BuilderUtil; import org.petah.spring.bai.util.CommandUtil; /** * * @author Petah */ public class PlanCommander extends Task { // Options private static Option<Integer> updateTime = OptionsManager.getOption( new Option<Integer>("PlanCommander.updateTime", 20)); // Class properties private int nextUpdate = 0; public PlanCommander(AIDelegate aiDelegate) { super(aiDelegate); } public void drawLine(AIFloat3 from, AIFloat3 to) { aiDelegate.getCallback().getMap().getDrawer().addLine(from, to); } public boolean update(UnitGroup group, int frame) { // If its time to update if (nextUpdate <= frame) { nextUpdate = frame + updateTime.getValue(); if (group.size() > 0) { // TODO: replace deprecated calls CachedUnit builder = group.getUnit(0); if (builder.getCurrentCommands().size() == 0) { if (aiDelegate.getGroupManager().getGroup("MetalExtractors").size() < 3) { DefaultCommands.queueClosestMetalExtractor(aiDelegate, builder); } else if (aiDelegate.getGroupManager().getGroup("EnergyGenerators").size() < 6) { CachedUnitDef building = BuilderUtil.getBestT1Energy(Faction.getFaction(builder.getDef())); AIFloat3 pos = BuilderUtil.moveTowardsMapCenter(aiDelegate.getBaseCenter(), 400); if (GlobalOptions.isDebug()) { drawLine(aiDelegate.getBaseCenter(), pos); drawLine(pos, BuilderUtil.moveAroundCenter(aiDelegate, pos, 90, 200)); } pos = BuilderUtil.moveAroundCenter(aiDelegate, pos, 90, 200); // pos = BuilderUtil.moveTowardsDirection(aiDelegate, pos, 270, 200); PlanCommands.blockQueue(aiDelegate, builder, building, pos, 3, 2); } else if (aiDelegate.getGroupManager().getGroup("Factorys").size() < 1) { CachedUnitDef building = GlobalDelegate.getUnitDef("KbotFactory", Faction.getFaction(builder.getDef())); AIFloat3 pos = BuilderUtil.moveTowardsMapCenter(aiDelegate.getBaseCenter(), 400); if (GlobalOptions.isDebug()) { drawLine(aiDelegate.getBaseCenter(), pos); drawLine(pos, BuilderUtil.moveAroundCenter(aiDelegate, pos, -90, 200)); } // pos = BuilderUtil.moveTowardsDirection(aiDelegate, pos, 90, 200); pos = BuilderUtil.moveAroundCenter(aiDelegate, pos, -90, 200); int xSize = 3; int zSize = 3; int facing = CommandUtil.getMapCenterFacing(aiDelegate, builder); List<AIFloat3> block = PlanCommands.getBlock(aiDelegate, building, pos, xSize, zSize, facing); if (block.size() == xSize * zSize) { builder.build(building.getUnitDef(), block.get(ArrayUtil.get1DIndex(xSize / 2, zSize / 2, xSize)), facing, true); } } } } } return false; } }