Example #1
0
        /* 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);
            }
        }
Example #2
0
        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);
        }