/* ditch this logic, I was going to get units to submit requests to a queue, but better to just ask the requesters at the time * // less complicated, and more flexible * //public void RequestSpecificUnits( int unittypeid, int quantity, double priority ) * //{ * // Requests.Add( new Request( unitttypeid, quantity, priority ) ); * // } * * if( Requests.Count > 0 ) * { * double highestpriority = 0; * Request highestrequest = null; * foreach( object requestobject in Requests ) * { * Request request = requestobject as Request; * if( request.Priority > highestpriority ) * { * highestpriority = request.Priority; * highestrequest = request; * } * } * logfile.WriteLine( "building queued unit " + request.UnitDef.humanName ); * aicallback.GiveOrder( factoryid, new Command( - request.UnitDef.id ) ); * request.quantity --; * if( request.Quantity <= 0 ) * { * logfile.WriteLine( "All units for request " + request.ToString() + " completed" ); * Requests.Remove( request ); * } */ public void UnitAdded(int unitid, IUnitDef unitdef) { if (unitdefhelp.IsFactory(unitdef)) { FactoryUnitDefByDeployedId.Add(unitid, unitdef); logfile.WriteLine("Factory added: " + unitdef.humanName + " id " + unitid); if (!FactoriesByTypeName.Contains(unitdef.name.ToLower())) { FactoriesByTypeName.Add(unitdef.name.ToLower(), new ArrayList()); } ArrayList unitypefactories = FactoriesByTypeName[unitdef.name.ToLower()] as ArrayList; if (!unitypefactories.Contains(unitid)) { unitypefactories.Add(unitid); } // aicallback.SendTextMsg( "New factory, id " + unitid, 0 ); BuildSomething(unitid); } }
public Float3 ClosestBuildSite(IUnitDef unitdef, Float3 approximatepos, int maxposradius, int mindistancemapunits) { // ok, so plan is we work our way out in a kindof spiral // we start in centre, and increase radius, and work around in a square at each radius, until we find something int centrex = (int)(approximatepos.x / 8); int centrey = (int)(approximatepos.z / 8); //int radius = 0; int radius = mindistancemapunits; int unitsizexwithmargin = unitdef.xsize + 2 * BuildMargin; int unitsizeywithmargin = unitdef.ysize + 2 * BuildMargin; if (unitdefhelp.IsFactory(unitdef)) { unitsizeywithmargin += 8; centrey += 4; } BuildMap buildmap = BuildMap.GetInstance(); MovementMaps movementmaps = MovementMaps.GetInstance(); // while( radius < mapwidth || radius < mapheight ) // hopefully we never get quite this far... while (radius < (maxposradius / 8)) { // logfile.WriteLine( "ClosestBuildSite radius " + radius ); for (int deltax = -radius; deltax <= radius; deltax++) { for (int deltay = -radius; deltay <= radius; deltay++) { if (deltax == radius || deltax == -radius || deltay == radius || deltay == -radius) // ignore the hollow centre of square { // logfile.WriteLine( "delta " + deltax + " " + deltay ); bool positionok = true; // go through each square in proposed site, check not build on for (int buildmapy = centrey - unitsizeywithmargin / 2; positionok && buildmapy < centrey + unitsizeywithmargin / 2; buildmapy++) { //string logline = ""; for (int buildmapx = centrex - unitsizexwithmargin / 2; positionok && buildmapx < centrex + unitsizexwithmargin / 2; buildmapx++) { int thisx = buildmapx + deltax; int thisy = buildmapy + deltay; if (thisx < 0 || thisy < 0 || thisx >= mapwidth || thisy >= mapwidth || !buildmap.SquareAvailable[thisx, thisy] || !movementmaps.vehiclemap[thisx / 2, thisy / 2]) { //logfile.WriteLine( "check square " + buildmapx + " " + buildmapy + " NOK" ); positionok = false; // logline += "*"; } else { // logline += "-"; } //logfile.WriteLine( "check square " + buildmapx + " " + buildmapy + "Ok" ); } // logfile.WriteLine( logline ); } // logfile.WriteLine(""); if (positionok) { return(new Float3((centrex + deltax) * 8, 0, (centrey + deltay) * 8)); } } } } radius++; } return(null); }