private FInt Inner_ReinforceWithFleetShipsOrTurrets(ArcenSimContext Context, Planet planet, WorldSide side, ref FInt budget, ReinforcementType reinforcementType, FInt strengthCap, ref FInt strengthPresent, List <BuildMenu> buildMenus, List <GameEntity> entitiesWeCanReinforce, bool atMostOnePerReinforceable) { if (entitiesWeCanReinforce.Count <= 0) { return(FInt.Zero); } ArcenRandomDrawBag <GameEntityTypeData> bag = new ArcenRandomDrawBag <GameEntityTypeData>(); for (int i = 0; i < buildMenus.Count; i++) { BuildMenu menu = buildMenus[i]; for (int j = 0; j < menu.List.Count; j++) { int timesToAdd = 0; GameEntityTypeData buyableType = menu.List[j]; if (buyableType.Balance_MarkLevel.Ordinal > 0 && buyableType.Balance_MarkLevel != planet.MarkLevel) { continue; } if (World_AIW2.Instance.CorruptedAIDesigns.Contains(buyableType)) { continue; } if (!buyableType.AICanUseThisWithoutUnlockingIt && !World_AIW2.Instance.UnlockedAIDesigns.Contains(buyableType)) { continue; } timesToAdd = 1; if (timesToAdd <= 0) { continue; } bag.AddItem(buyableType, timesToAdd); } } if (!bag.GetHasItems()) { return(FInt.Zero); } entitiesWeCanReinforce.Sort(delegate(GameEntity Left, GameEntity Right) { return(Left.Working_ReinforcementsOnly_ContentsStrength.CompareTo(Right.Working_ReinforcementsOnly_ContentsStrength)); }); FInt result = FInt.Zero; while (budget > FInt.Zero && strengthPresent < strengthCap && entitiesWeCanReinforce.Count > 0) { int index = 0; switch (reinforcementType) { case ReinforcementType.Turret: case ReinforcementType.Shield: index = Context.QualityRandom.Next(0, entitiesWeCanReinforce.Count); break; } GameEntity entityToReinforce = entitiesWeCanReinforce[index]; GameEntityTypeData typeToBuy = bag.PickRandomItemAndReplace(Context.QualityRandom); budget -= typeToBuy.BalanceStats.StrengthPerSquad; result += typeToBuy.BalanceStats.StrengthPerSquad; strengthPresent += typeToBuy.BalanceStats.StrengthPerSquad; switch (reinforcementType) { case ReinforcementType.Turret: case ReinforcementType.Shield: { int minDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 050)).IntValue; int maxDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 150)).IntValue; ArcenPoint point = planet.Combat.GetSafePlacementPoint(Context, typeToBuy, entityToReinforce.WorldLocation, minDistance, maxDistance); if (point == ArcenPoint.ZeroZeroPoint) { continue; } result += typeToBuy.BalanceStats.StrengthPerSquad; GameEntity newEntity = GameEntity.CreateNew(planet.Combat.GetSideForWorldSide(side), typeToBuy, point, Context); newEntity.EntitySpecificOrders.Behavior = EntityBehaviorType.Stationary; } break; case ReinforcementType.FleetShip: { entityToReinforce.ChangeContents(typeToBuy, 1); entityToReinforce.Working_ReinforcementsOnly_ContentsStrength += typeToBuy.BalanceStats.StrengthPerSquad; for (int i = 1; i < entitiesWeCanReinforce.Count; i++) { GameEntity otherReinforceable = entitiesWeCanReinforce[i]; if (entityToReinforce.Working_ReinforcementsOnly_ContentsStrength <= otherReinforceable.Working_ReinforcementsOnly_ContentsStrength) { break; } entitiesWeCanReinforce[i - 1] = otherReinforceable; entitiesWeCanReinforce[i] = entityToReinforce; } } break; } if (atMostOnePerReinforceable) { entitiesWeCanReinforce.Remove(entityToReinforce); } } return(result); }