public static int CalcNumChildren(VonNeumannGlobalData vgd, int numSats, int numShips)
 {
     if (vgd == null || vgd.NumShipsPerChild <= 0 || vgd.NumSatelitesPerChild <= 0)
     {
         return(0);
     }
     return(numSats / vgd.NumSatelitesPerChild + numShips / vgd.NumShipsPerChild);
 }
Example #2
0
        public void SendCollector(GameSession game, ref VonNeumannInfo vi, bool forceHomeworldAttack = false)
        {
            List <FleetInfo>     list = game.GameDatabase.GetFleetInfosByPlayerID(this.PlayerId, FleetType.FL_NORMAL).ToList <FleetInfo>();
            VonNeumannGlobalData globalVonNeumannData = game.AssetDatabase.GlobalVonNeumannData;
            FleetInfo            fleetInfo            = VonNeumann.GetCollectorFleetInfo(list);

            if (fleetInfo == null)
            {
                DesignInfo designInfo = game.GameDatabase.GetDesignInfo(VonNeumann.StaticShipDesigns[VonNeumann.VonNeumannShipDesigns.CollectorMothership].DesignId);
                if ((double)vi.Resources > (double)designInfo.ProductionCost / (double)game.AssetDatabase.DefaultStratModifiers[StratModifiers.OverharvestModifier])
                {
                    vi.Resources -= (int)((double)designInfo.ProductionCost / (double)game.AssetDatabase.DefaultStratModifiers[StratModifiers.OverharvestModifier]);
                    vi.FleetId    = new int?(game.GameDatabase.InsertFleet(this.PlayerId, 0, vi.SystemId, vi.SystemId, "Von Neumann Collector", FleetType.FL_NORMAL));
                    game.GameDatabase.InsertShip(vi.FleetId.Value, VonNeumann.StaticShipDesigns[VonNeumann.VonNeumannShipDesigns.CollectorMothership].DesignId, null, (ShipParams)0, new int?(), 0);
                    fleetInfo = game.GameDatabase.GetFleetInfo(vi.FleetId.Value);
                }
                else
                {
                    vi.Resources = 0;
                    vi.FleetId   = new int?(game.GameDatabase.InsertFleet(this.PlayerId, 0, vi.SystemId, vi.SystemId, "Von Neumann Collector", FleetType.FL_NORMAL));
                    game.GameDatabase.InsertShip(vi.FleetId.Value, VonNeumann.StaticShipDesigns[VonNeumann.VonNeumannShipDesigns.CollectorMothership].DesignId, null, (ShipParams)0, new int?(), 0);
                    fleetInfo = game.GameDatabase.GetFleetInfo(vi.FleetId.Value);
                }
                int sysId = vi.LastCollectionSystem;
                if (!vi.TargetInfos.Any <VonNeumannTargetInfo>((Func <VonNeumannTargetInfo, bool>)(x => x.SystemId == sysId)) && sysId != 0)
                {
                    vi.TargetInfos.Add(new VonNeumannTargetInfo()
                    {
                        SystemId    = sysId,
                        ThreatLevel = 1
                    });
                }
            }
            else if (vi.LastCollectionSystem != 0)
            {
                foreach (int num1 in game.GameDatabase.GetStarSystemOrbitalObjectIDs(fleetInfo.SystemID).ToList <int>())
                {
                    PlanetInfo        planetInfo        = game.GameDatabase.GetPlanetInfo(num1);
                    LargeAsteroidInfo largeAsteroidInfo = game.GameDatabase.GetLargeAsteroidInfo(num1);
                    int num2 = globalVonNeumannData.SalvageCapacity - vi.ResourcesCollectedLastTurn;
                    if (planetInfo != null)
                    {
                        if (planetInfo.Resources > num2)
                        {
                            planetInfo.Resources         -= num2;
                            vi.ResourcesCollectedLastTurn = globalVonNeumannData.SalvageCapacity;
                            break;
                        }
                        vi.ResourcesCollectedLastTurn += planetInfo.Resources;
                        planetInfo.Resources           = 0;
                        game.GameDatabase.UpdatePlanet(planetInfo);
                    }
                    else if (largeAsteroidInfo != null)
                    {
                        if (largeAsteroidInfo.Resources > num2)
                        {
                            largeAsteroidInfo.Resources  -= num2;
                            vi.ResourcesCollectedLastTurn = globalVonNeumannData.SalvageCapacity;
                            break;
                        }
                        vi.ResourcesCollectedLastTurn += largeAsteroidInfo.Resources;
                        largeAsteroidInfo.Resources    = 0;
                        game.GameDatabase.UpdateLargeAsteroidInfo(largeAsteroidInfo);
                    }
                }
                vi.Resources      += vi.ResourcesCollectedLastTurn;
                fleetInfo.SystemID = vi.SystemId;
                game.GameDatabase.UpdateFleetLocation(fleetInfo.ID, fleetInfo.SystemID, new int?());
            }
            vi.LastCollectionSystem = 0;
            int turnCount = game.GameDatabase.GetTurnCount();

            if (fleetInfo == null || turnCount <= vi.LastCollectionTurn + globalVonNeumannData.SalvageCycle && !forceHomeworldAttack && !this.ForceVonNeumannAttackCycle)
            {
                return;
            }
            vi.LastCollectionTurn = turnCount;
            List <int> intList = new List <int>();

            foreach (int num in game.GameDatabase.GetStarSystemIDs().ToList <int>())
            {
                int system = num;
                if (!vi.TargetInfos.Any <VonNeumannTargetInfo>((Func <VonNeumannTargetInfo, bool>)(x => x.SystemId == system)))
                {
                    int?systemOwningPlayer = game.GameDatabase.GetSystemOwningPlayer(system);
                    if (systemOwningPlayer.HasValue)
                    {
                        Player playerObject = game.GetPlayerObject(systemOwningPlayer.Value);
                        if (playerObject == null || playerObject.IsAI())
                        {
                            continue;
                        }
                    }
                    intList.Add(system);
                }
            }
            if (intList.Count <= 0)
            {
                return;
            }
            fleetInfo.SystemID      = forceHomeworldAttack || this.ForceVonNeumannAttackCycle ? game.GameDatabase.GetOrbitalObjectInfo(game.GameDatabase.GetPlayerInfo(game.LocalPlayer.ID).Homeworld.Value).StarSystemID : intList[App.GetSafeRandom().Next(intList.Count)];
            vi.FleetId              = new int?(fleetInfo.ID);
            vi.LastCollectionSystem = fleetInfo.SystemID;
            game.GameDatabase.UpdateFleetLocation(fleetInfo.ID, fleetInfo.SystemID, new int?());
        }