Exemplo n.º 1
0
        public void Create(string name, string value)
        {
            var test = new SystemEntry(name, value);

            Assert.Equal(name, test.Name);
            Assert.Equal(value, test.Value);
        }
Exemplo n.º 2
0
 private static void DoEntityTypeDataPartOfTooltip(ArcenDoubleCharacterBuffer buffer, GameEntityTypeData relatedEntityData)
 {
     buffer.Add("\n").Add("Defense: ").Add(relatedEntityData.Balance_Defense.InternalName);
     for (int i = 0; i < relatedEntityData.SystemEntries.Count; i++)
     {
         SystemEntry entry = relatedEntityData.SystemEntries[i];
         if (entry.SubEntries.Count <= 0)
         {
             continue;
         }
         SystemEntry.SubEntry subEntry = entry.SubEntries[0];
         if (subEntry.SystemData.Category == EntitySystemCategory.Weapon)
         {
             Balance_WeaponType weaponType = subEntry.SystemData.Balance_WeaponType;
             buffer.Add("\n").Add("Weapon: ").Add(weaponType.InternalName).Add(" Range: ").Add(subEntry.BalanceStats.Range);
             if (relatedEntityData.Balance_ShipsPerSquad > 1)
             {
                 buffer.Add(" Squad");
             }
             buffer.Add(" DPS: ").Add(subEntry.GetDPS().IntValue);
             if (weaponType.CounterType.Counters.Count > 0)
             {
                 buffer.Add(" Strong Against");
                 for (int j = 0; j < weaponType.CounterType.Counters.Count; j++)
                 {
                     buffer.Add(" ").Add(weaponType.CounterType.Counters[j].InternalName);
                 }
             }
         }
     }
     if (relatedEntityData.BalanceStats.Speed > 0)
     {
         buffer.Add("\n").Add("Speed: ").Add(relatedEntityData.BalanceStats.Speed);
     }
     if (relatedEntityData.BalanceStats.SquadMetalCost > 0)
     {
         buffer.Add("\n").Add("Metal Cost: ").Add(relatedEntityData.BalanceStats.SquadMetalCost);
     }
     if (relatedEntityData.BalanceStats.SquadFuelConsumption > 0)
     {
         buffer.Add("\n").Add("Fuel Cost: ").Add(relatedEntityData.BalanceStats.SquadFuelConsumption);
     }
     if (relatedEntityData.BalanceStats.SquadPowerConsumption > 0)
     {
         buffer.Add("\n").Add("Power Cost: ").Add(relatedEntityData.BalanceStats.SquadPowerConsumption);
     }
 }
Exemplo n.º 3
0
        private static int SpendBudgetOnItemsInList(ArcenSimContext Context, CombatSide Side, ArcenPoint CenterLocation, int MinimumDistanceFromCenter, List <GameEntityTypeData> listToBuyFrom, int budget)
        {
            if (listToBuyFrom.Count <= 0)
            {
                return(0);
            }
            if (budget <= 0)
            {
                return(0);
            }

            int remainingBudget = budget;

            int budgetPerType = remainingBudget / listToBuyFrom.Count;

            ArcenPoint formationCenterPoint = CenterLocation;

            listToBuyFrom.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
            {
                int leftValue = 0;
                if (Left.SystemEntries.Count > 0)
                {
                    SystemEntry systemEntry = Left.SystemEntries[0];
                    if (systemEntry.SubEntries.Count > 0)
                    {
                        leftValue = systemEntry.SubEntries[0].BalanceStats.Range;
                    }
                }
                int rightValue = 0;
                if (Right.SystemEntries.Count > 0)
                {
                    SystemEntry systemEntry = Right.SystemEntries[0];
                    if (systemEntry.SubEntries.Count > 0)
                    {
                        rightValue = systemEntry.SubEntries[0].BalanceStats.Range;
                    }
                }
                return(rightValue.CompareTo(leftValue));
            });

            int innerRingDistance = MinimumDistanceFromCenter;
            int outerRingDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 100)).IntValue;

            int distanceBetweenRings = (outerRingDistance - innerRingDistance) / listToBuyFrom.Count;

            for (int i = 0; i < listToBuyFrom.Count; i++)
            {
                GameEntityTypeData entityType = listToBuyFrom[i];
                int numberToPlace             = budgetPerType / entityType.BalanceStats.SquadPowerConsumption;
                numberToPlace = Math.Min(Side.GetRemainingCap(entityType), numberToPlace);
                if (numberToPlace <= 0)
                {
                    continue;
                }
                int          ringDistance       = innerRingDistance + (distanceBetweenRings * i);
                AngleDegrees startingAngle      = AngleDegrees.Create((FInt)Context.QualityRandom.Next(0, AngleDegrees.MaxValue.IntValue));
                AngleDegrees angleChangePerItem = AngleDegrees.MaxAngle / numberToPlace;
                for (int j = 0; j < numberToPlace; j++)
                {
                    if (Side.GetCanBuildAnother(entityType) != ArcenRejectionReason.Unknown)
                    {
                        break;
                    }
                    AngleDegrees angle = startingAngle + (angleChangePerItem * j);
                    ArcenPoint   point = formationCenterPoint.GetPointAtAngleAndDistance(angle, ringDistance);
                    point = Side.Combat.GetSafePlacementPoint(Context, entityType, point, 0, distanceBetweenRings / 2);
                    if (point == ArcenPoint.ZeroZeroPoint)
                    {
                        continue;
                    }
                    GameEntity newEntity = GameEntity.CreateNew(Side, entityType, point, Context);
                    newEntity.SelfBuildingMetalRemaining = (FInt)entityType.BalanceStats.SquadMetalCost;
                    remainingBudget -= entityType.BalanceStats.SquadPowerConsumption;
                }
            }

            // fill in the corners of the budget
            listToBuyFrom.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
            {
                return(Right.BalanceStats.SquadPowerConsumption.CompareTo(Left.BalanceStats.SquadPowerConsumption));
            });

            bool checkAgain = true;

            while (remainingBudget > 0 && checkAgain)
            {
                checkAgain = false;
                for (int i = 0; i < listToBuyFrom.Count; i++)
                {
                    GameEntityTypeData entityType = listToBuyFrom[i];
                    if (remainingBudget < entityType.BalanceStats.SquadPowerConsumption)
                    {
                        continue;
                    }
                    if (Side.GetCanBuildAnother(entityType) != ArcenRejectionReason.Unknown)
                    {
                        continue;
                    }
                    ArcenPoint point = Side.Combat.GetSafePlacementPoint(Context, entityType, formationCenterPoint, innerRingDistance, outerRingDistance);
                    if (point == ArcenPoint.ZeroZeroPoint)
                    {
                        continue;
                    }
                    GameEntity newEntity = GameEntity.CreateNew(Side, entityType, point, Context);
                    newEntity.SelfBuildingMetalRemaining = (FInt)entityType.BalanceStats.SquadMetalCost;
                    remainingBudget -= entityType.BalanceStats.SquadPowerConsumption;
                    checkAgain       = true;
                }
            }

            return(budget - remainingBudget);
        }
            public override void UpdateContent(ArcenUIWrapperedUnityImage Image, ArcenUI_Image.SubImageGroup _SubImages, SubTextGroup _SubTexts)
            {
                this.SubImages = _SubImages;
                this.SubTexts  = _SubTexts;
                GameEntityTypeData typeData = this.TypeToBuild;

                if (typeData == null)
                {
                    return;
                }

                WorldSide localSide = World_AIW2.Instance.GetLocalPlayerSide();

                //Planet planet = Engine_AIW2.Instance.NonSim_GetPlanetBeingCurrentlyViewed();
                //CombatSide localCombatSide = planet.Combat.GetSideForWorldSide( localSide );

                if (GameEntity.CurrentlyHoveredOver != null)
                {
                    this.PanelMode = Mode.ActualUnit;
                }
                else if (Window_InGameTechTabMenu.Instance.IsOpen)
                {
                    this.PanelMode = Mode.Tech;
                }
                else if (Window_InGameBuildTabMenu.Instance.IsOpen)
                {
                    this.PanelMode = Mode.Build;
                }

                TextId.SubjectSummary.Set(typeData.Name, string.Empty);

                try
                {
                    int markLevel = typeData.Balance_MarkLevel == null ? 0 : typeData.Balance_MarkLevel.Ordinal;
                    if (markLevel <= 0)
                    {
                        ImageId.MarkLevel.Hide();
                    }
                    else
                    {
                        ImageId.MarkLevel.Set(Window_InGameOutlineSidebar.Sprite_MarkLevels[markLevel], string.Empty);
                    }

                    if (this.PanelMode == Mode.Tech && typeData.TechPrereq != null)
                    {
                        bool unlocked = localSide.GetHasResearched(typeData.TechPrereq);
                        ImageId.Locked.ChangeVisibility(!unlocked);
                        ImageId.Unlocked.ChangeVisibility(unlocked);
                        ImageId.Science.Show();
                        TextId.Science.Set(typeData.TechPrereq.ScienceCost, string.Empty);
                    }
                    else
                    {
                        ImageId.Locked.Hide();
                        ImageId.Unlocked.Hide();
                        ImageId.Science.Hide();
                        TextId.Science.Hide();
                    }

                    if (typeData.BalanceStats.SquadFuelConsumption > 0)
                    {
                        ImageId.Fuel.Show();
                        ImageId.Power.Hide();
                        TextId.FuelOrPower.Set(typeData.BalanceStats.SquadFuelConsumption, string.Empty);
                    }
                    else if (typeData.BalanceStats.SquadPowerConsumption > 0)
                    {
                        ImageId.Fuel.Hide();
                        ImageId.Power.Show();
                        TextId.FuelOrPower.Set(typeData.BalanceStats.SquadPowerConsumption, string.Empty);
                    }
                    else
                    {
                        ImageId.Fuel.Hide();
                        ImageId.Power.Hide();
                        TextId.FuelOrPower.Hide();
                    }

                    if (typeData.BalanceStats.SquadMetalCost > 0)
                    {
                        ImageId.Metal.Show();
                        TextId.Metal.Set(typeData.BalanceStats.SquadMetalCost, string.Empty);
                    }
                    else
                    {
                        ImageId.Metal.Hide();
                        TextId.Metal.Hide();
                    }

                    int cap = typeData.BalanceStats.SquadsPerCap;
                    if (cap <= 0)
                    {
                        ImageId.Cap.Hide();
                        TextId.Cap.Hide();
                    }
                    else
                    {
                        ImageId.Cap.Show();
                        TextId.Cap.Set(cap, string.Empty);
                    }

                    ImageId.Strength.Show();
                    TextId.Strength.Set(typeData.BalanceStats.StrengthPerSquad.IntValue, string.Empty);

                    SystemEntry.SubEntry mainOffensiveWeaponSystemSubEntry = null;
                    EntitySystemTypeData cloakSystem   = null;
                    EntitySystemTypeData tachyonSystem = null;
                    EntitySystemTypeData tractorSystem = null;
                    EntitySystemTypeData gravitySystem = null;
                    for (int i = 0; i < typeData.SystemEntries.Count; i++)
                    {
                        SystemEntry entry = typeData.SystemEntries[i];
                        if (entry.SubEntries.Count <= 0)
                        {
                            continue;
                        }
                        SystemEntry.SubEntry subEntry = entry.SubEntries[0];
                        if (mainOffensiveWeaponSystemSubEntry == null && subEntry.GetDPS() > 0)
                        {
                            mainOffensiveWeaponSystemSubEntry = subEntry;
                        }
                        EntitySystemTypeData systemData = subEntry.SystemData;
                        if (cloakSystem == null && subEntry.BalanceStats.SquadCloakingPoints > 0)
                        {
                            cloakSystem = systemData;
                        }
                        if (tachyonSystem == null && subEntry.BalanceStats.TachyonPoints > 0)
                        {
                            tachyonSystem = systemData;
                        }
                        if (tractorSystem == null && subEntry.BalanceStats.TractorPoints > 0)
                        {
                            tractorSystem = systemData;
                        }
                        if (gravitySystem == null && subEntry.BalanceStats.GravityPoints > 0)
                        {
                            gravitySystem = systemData;
                        }
                    }

                    if (mainOffensiveWeaponSystemSubEntry != null)
                    {
                        SystemEntry.SubEntry systemSubEntry = mainOffensiveWeaponSystemSubEntry;
                        EntitySystemTypeData systemData     = systemSubEntry.SystemData;
                        Balance_WeaponType   weaponData     = systemData.Balance_WeaponType;

                        ImageId.Attack.Set(systemData.Balance_WeaponType.CounterType);
                        TextId.Attack.Set(systemSubEntry.GetDPS().IntValue, systemData.Balance_WeaponType.CounterType.StatTooltip);
                        ImageId.Range.Set(weaponData.Range);
                        ImageId.EngineDamage.Set(weaponData.Balance_EngineDamageType);
                        ImageId.Paralysis.Set(weaponData.Balance_ParalysisClass);
                        ImageId.Ion.Set(weaponData.Balance_IonClass);
                        ImageId.Implosion.Set(weaponData.Balance_ImplosionClass);
                        ImageId.Nuclear.Set(systemData.Balance_NuclearClass);
                    }
                    else
                    {
                        ImageId.Attack.Hide();
                        TextId.Attack.Hide();
                        ImageId.Range.Hide();
                        ImageId.EngineDamage.Hide();
                        ImageId.Paralysis.Hide();
                        ImageId.Ion.Hide();
                        ImageId.Implosion.Hide();
                        ImageId.Nuclear.Hide();
                    }

                    ImageId.Defense.Set(typeData.Balance_Defense);

                    int        totalMaxHP = (typeData.BalanceStats.HullPoints + typeData.BalanceStats.ShieldPoints) * typeData.Balance_ShipsPerSquad;
                    GameEntity entity     = GameEntity.CurrentlyHoveredOver;
                    if (this.PanelMode == Mode.ActualUnit && entity != null && (entity.HullPointsLost > 0 || entity.ShieldPointsLost > 0 || entity.SquadShipsLost > 0 || entity.SelfBuildingMetalRemaining > 0))
                    {
                        float percent;
                        if (entity.SelfBuildingMetalRemaining <= 0)
                        {
                            int totalCurrentHP = (typeData.BalanceStats.HullPoints + typeData.BalanceStats.ShieldPoints) * (typeData.Balance_ShipsPerSquad - 1);
                            totalCurrentHP += (entity.GetCurrentHullPoints() + entity.GetCurrentShieldPoints());
                            percent         = ((float)totalCurrentHP / (float)totalMaxHP) * 100;
                        }
                        else
                        {
                            percent = (1f - ((float)entity.SelfBuildingMetalRemaining / (float)typeData.BalanceStats.SquadMetalCost)) * 100;
                        }
                        string percentMask;
                        if (entity.SelfBuildingMetalRemaining > 0 || entity.HasNotYetBeenFullyClaimed)
                        {
                            percentMask = "#,##0.0";
                        }
                        else
                        {
                            percentMask = "#,##0";
                        }
                        int    totalHPForDisplay        = totalMaxHP;
                        string suffix                   = ArcenExternalUIUtilities.GetRoundedNumberWithSuffix(ref totalHPForDisplay, true);
                        ArcenCharacterBuffer textBuffer = new ArcenCharacterBuffer();
                        textBuffer.Add(totalHPForDisplay.ToString("#,##0"));
                        textBuffer.Add(suffix);
                        textBuffer.Add(" (");
                        textBuffer.Add(percent.ToString(percentMask));
                        textBuffer.Add("%)");
                        string text = textBuffer.ToString();
                        TextId.Defense.Set(text, typeData.Balance_Defense.StatTooltip);
                    }
                    else
                    {
                        TextId.Defense.Set(totalMaxHP, typeData.Balance_Defense.StatTooltip);
                    }

                    ImageId.Speed.Set(typeData.Balance_Speed);
                    ImageId.EngineDamageResistance.Set(typeData.Balance_EngineHealthType);
                    ImageId.ParalysisResistance.Set(typeData.Balance_ParalysisResistance);
                    ImageId.IonResistance.Set(typeData.Balance_IonResistance);
                    ImageId.ImplosionResistance.Set(typeData.Balance_ImplosionResistance);
                    ImageId.NuclearResistance.Set(typeData.Balance_NuclearResistance);

                    ImageId.Cloak.Set(cloakSystem == null ? null : cloakSystem.Balance_CloakingType);
                    ImageId.Tachyon.Set(tachyonSystem == null ? null : tachyonSystem.Balance_TachyonType);
                    ImageId.Tractor.Set(tractorSystem == null ? null : tractorSystem.Balance_TractorType);
                    ImageId.TractorResistance.Set(typeData.Balance_TractorResistanceType);
                    ImageId.Gravity.Set(gravitySystem == null ? null : gravitySystem.Balance_GravityType);
                    ImageId.GravityResistance.Set(typeData.Balance_GravityResistanceType);

                    TextId.Description.Set(typeData.Description, string.Empty);
                }
                catch (Exception e)
                {
                    ArcenDebugging.ArcenDebugLog("Exception in UpdateContent after " + (LastWrittenWasImageInsteadOfText ? "image " + LastImageIDWritten : "text " + LastTextIDWritten) + ":" + e.ToString(), Verbosity.ShowAsError);
                }
            }
Exemplo n.º 5
0
        public void Execute(ArcenSimContext Context, GameEntity BuildingEntity)
        {
            List <GameEntityTypeData> turretTypes = new List <GameEntityTypeData>();

            for (int menuIndex = 0; menuIndex < BuildingEntity.TypeData.BuildMenus.Count; menuIndex++)
            {
                BuildMenu menu = BuildingEntity.TypeData.BuildMenus[menuIndex];
                for (int i = 0; i < menu.List.Count; i++)
                {
                    GameEntityTypeData entityData = menu.List[i];
                    if (entityData.Balance_FuelCost.FuelMultiplier > 0)
                    {
                        continue;
                    }
                    if (entityData.Balance_PowerCost.PowerMultiplier <= 0)
                    {
                        continue;
                    }
                    if (!entityData.CapIsPerPlanet)
                    {
                        continue;
                    }
                    if (!EntityRollupType.Combatants.Matches(entityData))     //&& !EntityRollupType.ProjectsShield.Matches( entityData )
                    {
                        continue;
                    }
                    if (BuildingEntity.Side.GetCanBuildAnother(entityData) != ArcenRejectionReason.Unknown)
                    {
                        continue;
                    }
                    turretTypes.Add(entityData);
                }
            }

            if (turretTypes.Count <= 0)
            {
                return;
            }

            int powerBudget = BuildingEntity.Side.NetPower;

            int budgetPerType = powerBudget / turretTypes.Count;

            ArcenPoint formationCenterPoint = BuildingEntity.WorldLocation;

            turretTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
            {
                int leftValue = 0;
                if (Left.SystemEntries.Count > 0)
                {
                    SystemEntry systemEntry = Left.SystemEntries[0];
                    if (systemEntry.SubEntries.Count > 0)
                    {
                        leftValue = systemEntry.SubEntries[0].BalanceStats.Range;
                    }
                }
                int rightValue = 0;
                if (Right.SystemEntries.Count > 0)
                {
                    SystemEntry systemEntry = Right.SystemEntries[0];
                    if (systemEntry.SubEntries.Count > 0)
                    {
                        rightValue = systemEntry.SubEntries[0].BalanceStats.Range;
                    }
                }
                return(rightValue.CompareTo(leftValue));
            });

            int innerRingDistance = BuildingEntity.TypeData.Radius * 2;
            int outerRingDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 100)).IntValue;

            int distanceBetweenRings = (outerRingDistance - innerRingDistance) / turretTypes.Count;

            for (int i = 0; i < turretTypes.Count; i++)
            {
                GameEntityTypeData turretType = turretTypes[i];
                int numberToPlace             = budgetPerType / turretType.BalanceStats.SquadPowerConsumption;
                numberToPlace = Math.Min(BuildingEntity.Side.GetRemainingCap(turretType), numberToPlace);
                if (numberToPlace <= 0)
                {
                    continue;
                }
                int          ringDistance       = innerRingDistance + (distanceBetweenRings * i);
                AngleDegrees startingAngle      = AngleDegrees.Create((FInt)Context.QualityRandom.Next(0, AngleDegrees.MaxValue.IntValue));
                AngleDegrees angleChangePerItem = AngleDegrees.MaxAngle / numberToPlace;
                for (int j = 0; j < numberToPlace; j++)
                {
                    if (BuildingEntity.Side.GetCanBuildAnother(turretType) != ArcenRejectionReason.Unknown)
                    {
                        break;
                    }
                    AngleDegrees angle = startingAngle + (angleChangePerItem * j);
                    ArcenPoint   point = formationCenterPoint.GetPointAtAngleAndDistance(angle, ringDistance);
                    point = BuildingEntity.Combat.GetSafePlacementPoint(Context, turretType, point, 0, distanceBetweenRings / 2);
                    if (point == ArcenPoint.ZeroZeroPoint)
                    {
                        continue;
                    }
                    GameEntity newEntity = GameEntity.CreateNew(BuildingEntity.Side, turretType, point, Context);
                    newEntity.SelfBuildingMetalRemaining = (FInt)turretType.BalanceStats.SquadMetalCost;
                    powerBudget -= turretType.BalanceStats.SquadPowerConsumption;
                }
            }

            // fill in the corners of the budget
            turretTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
            {
                return(Right.BalanceStats.SquadPowerConsumption.CompareTo(Left.BalanceStats.SquadPowerConsumption));
            });

            bool checkAgain = true;

            while (powerBudget > 0 && checkAgain)
            {
                checkAgain = false;
                for (int i = 0; i < turretTypes.Count; i++)
                {
                    GameEntityTypeData turretType = turretTypes[i];
                    if (powerBudget < turretType.BalanceStats.SquadPowerConsumption)
                    {
                        continue;
                    }
                    if (BuildingEntity.Side.GetCanBuildAnother(turretType) != ArcenRejectionReason.Unknown)
                    {
                        continue;
                    }
                    ArcenPoint point = BuildingEntity.Combat.GetSafePlacementPoint(Context, turretType, formationCenterPoint, innerRingDistance, outerRingDistance);
                    if (point == ArcenPoint.ZeroZeroPoint)
                    {
                        continue;
                    }
                    GameEntity newEntity = GameEntity.CreateNew(BuildingEntity.Side, turretType, point, Context);
                    newEntity.SelfBuildingMetalRemaining = (FInt)turretType.BalanceStats.SquadMetalCost;
                    powerBudget -= turretType.BalanceStats.SquadPowerConsumption;
                    checkAgain   = true;
                }
            }
        }