Пример #1
0
        internal static void Tick(bool useFullSet, bool checkForSystemChange)
        {
            Globals.WarStatusTracker.PrioritySystems.Clear();
            var systemSubsetSize = Globals.WarStatusTracker.systems.Count;
            List <SystemStatus> systemStatuses;

            if (Globals.Settings.UseSubsetOfSystems && !useFullSet)
            {
                systemSubsetSize = (int)(systemSubsetSize * Globals.Settings.SubSetFraction);
                systemStatuses   = Globals.WarStatusTracker.systems
                                   .OrderBy(x => Guid.NewGuid()).Take(systemSubsetSize)
                                   .ToList();
            }
            else
            {
                systemStatuses = Globals.WarStatusTracker.systems;
            }

            if (checkForSystemChange && Globals.Settings.GaW_PoliceSupport)
            {
                CalculateComstarSupport();
            }

            if (Globals.WarStatusTracker.FirstTickInitialization)
            {
                var lowestAR = 5000f;
                var lowestDr = 5000f;
                var sequence = Globals.WarStatusTracker.warFactionTracker.Where(x =>
                                                                                Globals.IncludedFactions.Contains(x.faction)).ToList();
                foreach (var faction in sequence)
                {
                    var systemCount = Globals.WarStatusTracker.systems.Count(x => x.owner == faction.faction);
                    if (!Globals.Settings.ISMCompatibility && systemCount != 0)
                    {
                        faction.AR_PerPlanet = (float)Globals.Settings.BonusAttackResources[faction.faction] / systemCount;
                        faction.DR_PerPlanet = (float)Globals.Settings.BonusDefensiveResources[faction.faction] / systemCount;
                        if (faction.AR_PerPlanet < lowestAR)
                        {
                            lowestAR = faction.AR_PerPlanet;
                        }
                        if (faction.DR_PerPlanet < lowestDr)
                        {
                            lowestDr = faction.DR_PerPlanet;
                        }
                    }
                    else if (systemCount != 0)
                    {
                        faction.AR_PerPlanet = (float)Globals.Settings.BonusAttackResources_ISM[faction.faction] / systemCount;
                        faction.DR_PerPlanet = (float)Globals.Settings.BonusDefensiveResources_ISM[faction.faction] / systemCount;
                        if (faction.AR_PerPlanet < lowestAR)
                        {
                            lowestAR = faction.AR_PerPlanet;
                        }
                        if (faction.DR_PerPlanet < lowestDr)
                        {
                            lowestDr = faction.DR_PerPlanet;
                        }
                    }
                }

                foreach (var faction in sequence)
                {
                    faction.AR_PerPlanet = Mathf.Min(faction.AR_PerPlanet, 2 * lowestAR);
                    faction.DR_PerPlanet = Mathf.Min(faction.DR_PerPlanet, 2 * lowestDr);
                }

                foreach (var systemStatus in systemStatuses)
                {
                    //Spread out bonus resources and make them fair game for the taking.
                    var warFaction = Globals.WarStatusTracker.warFactionTracker.Find(x => x.faction == systemStatus.owner);
                    systemStatus.AttackResources  += warFaction.AR_PerPlanet;
                    systemStatus.TotalResources   += warFaction.AR_PerPlanet;
                    systemStatus.DefenseResources += warFaction.DR_PerPlanet;
                    systemStatus.TotalResources   += warFaction.DR_PerPlanet;
                }
            }

            //Distribute Pirate Influence throughout the StarSystems
            LogDebug("Processing pirates.");
            PiratesAndLocals.CorrectResources();
            PiratesAndLocals.PiratesStealResources();
            PiratesAndLocals.CurrentPAResources = Globals.WarStatusTracker.PirateResources;
            PiratesAndLocals.DistributePirateResources();
            PiratesAndLocals.DefendAgainstPirates();

            if (checkForSystemChange && Globals.Settings.HyadesRimCompatible && Globals.WarStatusTracker.InactiveTHRFactions.Count != 0 &&
                Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Count != 0)
            {
                var rand = Globals.Rng.Next(0, 100);
                if (rand < Globals.WarStatusTracker.HyadesRimsSystemsTaken)
                {
                    var hyadesSystem    = Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.GetRandomElement();
                    var flipSystem      = Globals.WarStatusTracker.systems.Find(x => x.name == hyadesSystem).starSystem;
                    var inactiveFaction = Globals.WarStatusTracker.InactiveTHRFactions.GetRandomElement();
                    ChangeSystemOwnership(flipSystem, inactiveFaction, true);
                    Globals.WarStatusTracker.InactiveTHRFactions.Remove(inactiveFaction);
                    Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Remove(hyadesSystem);
                }
            }

            LogDebug("Processing systems' influence.");
            foreach (var systemStatus in systemStatuses)
            {
                systemStatus.PriorityAttack  = false;
                systemStatus.PriorityDefense = false;
                if (Globals.WarStatusTracker.FirstTickInitialization)
                {
                    systemStatus.CurrentlyAttackedBy.Clear();
                    CalculateAttackAndDefenseTargets(systemStatus.starSystem);
                    RefreshContractsEmployersAndTargets(systemStatus);
                }

                if (systemStatus.Contended || Globals.WarStatusTracker.HotBox.Contains(systemStatus.name))
                {
                    continue;
                }

                if (!systemStatus.owner.Equals("Locals") && systemStatus.influenceTracker.Keys.Contains("Locals") &&
                    !Globals.WarStatusTracker.FlashpointSystems.Contains(systemStatus.name))
                {
                    systemStatus.influenceTracker["Locals"] *= 1.1f;
                }

                //Add resources from neighboring systems.
                if (systemStatus.neighborSystems.Count != 0)
                {
                    foreach (var neighbor in systemStatus.neighborSystems.Keys)
                    {
                        if (!Globals.Settings.ImmuneToWar.Contains(neighbor) && !Globals.Settings.DefensiveFactions.Contains(neighbor) &&
                            !Globals.WarStatusTracker.FlashpointSystems.Contains(systemStatus.name))
                        {
                            var pushFactor = Globals.Settings.APRPush * Globals.Rng.Next(1, Globals.Settings.APRPushRandomizer + 1);
                            systemStatus.influenceTracker[neighbor] += systemStatus.neighborSystems[neighbor] * pushFactor;
                        }
                    }
                }

                //Revolt on previously taken systems.
                if (systemStatus.owner != systemStatus.OriginalOwner)
                {
                    systemStatus.influenceTracker[systemStatus.OriginalOwner] *= 0.10f;
                }

                var pirateSystemFlagValue = Globals.Settings.PirateSystemFlagValue;

                if (Globals.Settings.ISMCompatibility)
                {
                    pirateSystemFlagValue = Globals.Settings.PirateSystemFlagValue_ISM;
                }

                var totalPirates = systemStatus.PirateActivity * systemStatus.TotalResources / 100;

                if (totalPirates >= pirateSystemFlagValue)
                {
                    if (!Globals.WarStatusTracker.PirateHighlight.Contains(systemStatus.name))
                    {
                        Globals.WarStatusTracker.PirateHighlight.Add(systemStatus.name);
                    }
                }
                else
                {
                    if (Globals.WarStatusTracker.PirateHighlight.Contains(systemStatus.name))
                    {
                        Globals.WarStatusTracker.PirateHighlight.Remove(systemStatus.name);
                    }
                }
            }

            Globals.WarStatusTracker.FirstTickInitialization = false;
            LogDebug("Processing resource spending.");
            foreach (var warFaction in Globals.WarStatusTracker.warFactionTracker)
            {
                DivideAttackResources(warFaction, useFullSet);
            }

            CalculateDefensiveSystems();
            foreach (var warFaction in Globals.WarStatusTracker.warFactionTracker)
            {
                AllocateDefensiveResources(warFaction, useFullSet);
                AllocateAttackResources(warFaction);
            }

            LogDebug("Processing influence changes.");
            UpdateInfluenceFromAttacks(checkForSystemChange);

            //Increase War Escalation or decay defenses.
            foreach (var warFaction in Globals.WarStatusTracker.warFactionTracker)
            {
                if (!warFaction.GainedSystem)
                {
                    warFaction.DaysSinceSystemAttacked += 1;
                }
                else
                {
                    warFaction.DaysSinceSystemAttacked = 0;
                    warFaction.GainedSystem            = false;
                }

                if (!warFaction.LostSystem)
                {
                    warFaction.DaysSinceSystemLost += 1;
                }
                else
                {
                    warFaction.DaysSinceSystemLost = 0;
                    warFaction.LostSystem          = false;
                }
            }

            LogDebug("Processing flipped systems.");
            foreach (var system in Globals.WarStatusTracker.systems.Where(x => Globals.WarStatusTracker.SystemChangedOwners.Contains(x.name)))
            {
                system.CurrentlyAttackedBy.Clear();
                CalculateAttackAndDefenseTargets(system.starSystem);
                RefreshContractsEmployersAndTargets(system);
            }

            if (Globals.WarStatusTracker.SystemChangedOwners.Count > 0)
            {
                LogDebug($"Changed on {Globals.Sim.CurrentDate.ToShortDateString()}: {Globals.WarStatusTracker.SystemChangedOwners.Count} systems:");
                Globals.WarStatusTracker.SystemChangedOwners.OrderBy(x => x).Do(x =>
                                                                                LogDebug($"  {x}"));
                Globals.WarStatusTracker.SystemChangedOwners.Clear();
                if (StarmapMod.eventPanel != null)
                {
                    StarmapMod.UpdatePanelText();
                }
            }

            //Log("===================================================");
            //Log("TESTING ZONE");
            //Log("===================================================");
            //////TESTING ZONE
            //foreach (WarFaction WF in Globals.WarStatusTracker.warFactionTracker)
            //{
            //    Log("----------------------------------------------");
            //    Log(WF.faction.ToString());
            //    try
            //    {
            //        var DLT = Globals.WarStatusTracker.DeathListTrackers.Find(x => x.faction == WF.faction);
            //        //                Log("\tAttacked By :");
            //        //                foreach (Faction fac in DLT.AttackedBy)
            //        //                    Log("\t\t" + fac.ToString());
            //        //                Log("\tOwner :" + DLT.);
            //        //                Log("\tAttack Resources :" + WF.AttackResources.ToString());
            //        //                Log("\tDefensive Resources :" + WF.DefensiveResources.ToString());
            //        Log("\tDeath List:");
            //        foreach (var faction in DLT.deathList.Keys)
            //        {
            //            Log("\t\t" + faction.ToString() + ": " + DLT.deathList[faction]);
            //        }
            //    }
            //    catch (Exception e)
            //    {
            //        Error(e);
            //    }
            //}
        }
Пример #2
0
        internal static void Tick(bool useFullSet, bool checkForSystemChange)
        {
            Globals.WarStatusTracker.PrioritySystems.Clear();
            var systemSubsetSize = Globals.WarStatusTracker.Systems.Count;
            List <SystemStatus> systemStatuses;

            if (Globals.Settings.UseSubsetOfSystems && !useFullSet)
            {
                systemSubsetSize = (int)(systemSubsetSize * Globals.Settings.SubSetFraction);
                systemStatuses   = Globals.WarStatusTracker.Systems
                                   .OrderBy(x => Guid.NewGuid()).Take(systemSubsetSize)
                                   .ToList();
            }
            else
            {
                systemStatuses = Globals.WarStatusTracker.Systems;
            }

            if (checkForSystemChange && Globals.Settings.GaW_PoliceSupport)
            {
                CalculateComstarSupport();
            }

            if (Globals.WarStatusTracker.FirstTickInitialization)
            {
                var perPlanetAR = 0f;
                var perPlanetDR = 0f;
                var sequence    = Globals.WarStatusTracker.WarFactionTracker.Where(x =>
                                                                                   Globals.IncludedFactions.Contains(x.FactionName)).ToList();
                var factionPerPlanetAR = new Dictionary <WarFaction, float>();
                var factionPerPlanetDR = new Dictionary <WarFaction, float>();
                Logger.LogDebug("Faction Bonus Resources");
                Logger.LogDebug("=============================");
                foreach (var faction in sequence)
                {
                    var systemCount = Globals.WarStatusTracker.Systems.Count(x => x.Owner == faction.FactionName);
                    if (systemCount != 0)
                    {
                        perPlanetAR = faction.TotalBonusAttackResources / systemCount;
                        perPlanetDR = faction.TotalBonusDefensiveResources / systemCount;
                        factionPerPlanetAR.Add(faction, perPlanetAR);
                        factionPerPlanetDR.Add(faction, perPlanetDR);
                        Logger.LogDebug("Faction: " + faction.FactionName + " Bonus AR: " + faction.TotalBonusAttackResources + " Bonus DR: " + faction.TotalBonusDefensiveResources);
                        Logger.LogDebug("     Systems: " + systemCount + "; perPlanetAR: " + perPlanetAR + "; perPlanetDR: " + perPlanetDR);
                    }
                }

                foreach (var systemStatus in systemStatuses)
                {
                    //Spread out bonus resources and make them fair game for the taking.
                    WarFaction faction = Globals.WarStatusTracker.WarFactionTracker.Find(x => x.FactionName == systemStatus.Owner);
                    systemStatus.AttackResourcesOriginal  = Mathf.Min(systemStatus.AttackResources + factionPerPlanetAR[faction], systemStatus.AttackResources * 2);
                    systemStatus.DefenseResourcesOriginal = Mathf.Min(systemStatus.DefenseResources + factionPerPlanetDR[faction], systemStatus.DefenseResources * 2);
                    systemStatus.AttackResources          = systemStatus.AttackResourcesOriginal;
                    systemStatus.DefenseResources         = systemStatus.DefenseResourcesOriginal;
                    systemStatus.TotalOriginalResources   = systemStatus.AttackResources + systemStatus.DefenseResources;
                    systemStatus.TotalResources           = systemStatus.TotalOriginalResources;
                }
            }

            //Distribute Pirate Influence throughout the StarSystems
            LogDebug("Processing pirates.");
            PiratesAndLocals.AdjustPirateResources();
            PiratesAndLocals.PiratesStealResources();
            PiratesAndLocals.DistributePirateResources(Globals.WarStatusTracker.PirateResources);
            PiratesAndLocals.DefendAgainstPirates();

            if (checkForSystemChange && Globals.Settings.HyadesRimCompatible && Globals.WarStatusTracker.InactiveTHRFactions.Count != 0 &&
                Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Count != 0)
            {
                var rand = Globals.Rng.Next(0, 100);
                if (rand < Globals.WarStatusTracker.HyadesRimsSystemsTaken)
                {
                    var inactiveFaction = Globals.WarStatusTracker.InactiveTHRFactions.GetRandomElement();
                    BattleTech.StarSystem flipSystem = new();
                    if (Globals.Settings.HyadesAppearingPiratesFlipSystems.ContainsKey(inactiveFaction))
                    {
                        foreach (var changeSystem in Globals.Settings.HyadesAppearingPiratesFlipSystems[inactiveFaction])
                        {
                            flipSystem = Globals.WarStatusTracker.Systems.Find(x => x.Name == changeSystem).StarSystem;
                            ChangeSystemOwnership(flipSystem, inactiveFaction, true);
                            if (Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Contains(changeSystem))
                            {
                                Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Remove(changeSystem);
                            }
                        }
                    }
                    else
                    {
                        var hyadesSystem = Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.GetRandomElement();
                        flipSystem = Globals.WarStatusTracker.Systems.Find(x => x.Name == hyadesSystem).StarSystem;
                        ChangeSystemOwnership(flipSystem, inactiveFaction, true);
                        Globals.WarStatusTracker.HyadesRimGeneralPirateSystems.Remove(hyadesSystem);
                    }
                    Globals.WarStatusTracker.InactiveTHRFactions.Remove(inactiveFaction);
                }
            }

            LogDebug("Processing systems' influence.");
            foreach (var systemStatus in systemStatuses)
            {
                systemStatus.PriorityAttack  = false;
                systemStatus.PriorityDefense = false;
                if (Globals.WarStatusTracker.FirstTickInitialization)
                {
                    systemStatus.CurrentlyAttackedBy.Clear();
                    CalculateAttackAndDefenseTargets(systemStatus.StarSystem);
                    RefreshContractsEmployersAndTargets(systemStatus);
                }

                if (systemStatus.Contested || Globals.WarStatusTracker.HotBox.IsHot(systemStatus.Name))
                {
                    continue;
                }

                if (!systemStatus.Owner.Equals("Locals") && systemStatus.InfluenceTracker.Keys.Contains("Locals") &&
                    !Globals.WarStatusTracker.FlashpointSystems.Contains(systemStatus.Name))
                {
                    systemStatus.InfluenceTracker["Locals"] = Math.Min(systemStatus.InfluenceTracker["Locals"] * 1.1f, 100);
                }

                //Add resources from neighboring systems.
                if (systemStatus.NeighborSystems.Count != 0)
                {
                    foreach (var neighbor in systemStatus.NeighborSystems.Keys)
                    {
                        if (!Globals.Settings.ImmuneToWar.Contains(neighbor) && !Globals.Settings.DefensiveFactions.Contains(neighbor) &&
                            !Globals.WarStatusTracker.FlashpointSystems.Contains(systemStatus.Name))
                        {
                            var pushFactor = Globals.Settings.APRPush * Globals.Rng.Next(1, Globals.Settings.APRPushRandomizer + 1);
                            systemStatus.InfluenceTracker[neighbor] += systemStatus.NeighborSystems[neighbor] * pushFactor;
                        }
                    }
                }

                //Revolt on previously taken systems.
                // that represents is the previous faction essentially "revolting" against the new faction.
                // So, if they have any influence in the system it gets bigger every turn. The only way to make it stop is to completely wipe them out.
                if (systemStatus.Owner != systemStatus.OriginalOwner)
                {
                    systemStatus.InfluenceTracker[systemStatus.OriginalOwner] *= 1.10f;
                }

                var pirateSystemFlagValue = Globals.Settings.PirateSystemFlagValue;

                if (Globals.Settings.ISMCompatibility)
                {
                    pirateSystemFlagValue = Globals.Settings.PirateSystemFlagValue_ISM;
                }

                // LogDebug($"{systemStatus.starSystem.Name} total resources: {systemStatus.TotalResources}.  Pirate activity {systemStatus.PirateActivity}");
                var totalPirates = systemStatus.PirateActivity * systemStatus.TotalOriginalResources / 100;
                if (totalPirates >= pirateSystemFlagValue)
                {
                    if (!Globals.WarStatusTracker.PirateHighlight.Contains(systemStatus.Name))
                    {
                        Globals.WarStatusTracker.PirateHighlight.Add(systemStatus.Name);
                    }
                }
                else
                {
                    if (Globals.WarStatusTracker.PirateHighlight.Contains(systemStatus.Name))
                    {
                        Globals.WarStatusTracker.PirateHighlight.Remove(systemStatus.Name);
                    }
                }
            }

            Globals.WarStatusTracker.FirstTickInitialization = false;
            LogDebug("Processing resource spending.");
            foreach (var warFaction in Globals.WarStatusTracker.WarFactionTracker)
            {
                DivideAttackResources(warFaction, useFullSet);
            }

            foreach (var warFaction in Globals.WarStatusTracker.WarFactionTracker)
            {
                AllocateAttackResources(warFaction);
            }

            CalculateDefensiveSystems();

            foreach (var warFaction in Globals.WarStatusTracker.WarFactionTracker)
            {
                AllocateDefensiveResources(warFaction, useFullSet);
            }

            LogDebug("Processing influence changes.");
            UpdateInfluenceFromAttacks(checkForSystemChange);

            //Increase War Escalation or decay defenses.
            foreach (var warFaction in Globals.WarStatusTracker.WarFactionTracker)
            {
                if (!warFaction.GainedSystem)
                {
                    warFaction.DaysSinceSystemAttacked += 1;
                }
                else
                {
                    warFaction.DaysSinceSystemAttacked = 0;
                    warFaction.GainedSystem            = false;
                }

                if (!warFaction.LostSystem)
                {
                    warFaction.DaysSinceSystemLost += 1;
                }
                else
                {
                    warFaction.DaysSinceSystemLost = 0;
                    warFaction.LostSystem          = false;
                }
            }

            LogDebug("Processing flipped systems.");
            foreach (var system in Globals.WarStatusTracker.Systems.Where(x => Globals.WarStatusTracker.SystemChangedOwners.Contains(x.Name)))
            {
                system.CurrentlyAttackedBy.Clear();
                CalculateAttackAndDefenseTargets(system.StarSystem);
                RefreshContractsEmployersAndTargets(system);
            }

            if (Globals.WarStatusTracker.SystemChangedOwners.Count > 0)
            {
                LogDebug($"Changed on {Globals.Sim.CurrentDate.ToShortDateString()}: {Globals.WarStatusTracker.SystemChangedOwners.Count} systems:");
                Globals.WarStatusTracker.SystemChangedOwners.OrderBy(x => x).Do(x =>
                                                                                LogDebug($"  {x}"));
                Globals.WarStatusTracker.SystemChangedOwners.Clear();
                if (StarmapMod.eventPanel != null)
                {
                    StarmapMod.UpdatePanelText();
                }
            }

            //Log("===================================================");
            //Log("TESTING ZONE");
            //Log("===================================================");
            //////TESTING ZONE
            //foreach (WarFaction WF in Globals.WarStatusTracker.warFactionTracker)
            //{
            //    Log("----------------------------------------------");
            //    Log(WF.faction.ToString());
            //    try
            //    {
            //        var DLT = Globals.WarStatusTracker.DeathListTrackers.Find(x => x.faction == WF.faction);
            //        //                Log("\tAttacked By :");
            //        //                foreach (Faction fac in DLT.AttackedBy)
            //        //                    Log("\t\t" + fac.ToString());
            //        //                Log("\tOwner :" + DLT.);
            //        //                Log("\tAttack Resources :" + WF.AttackResources.ToString());
            //        //                Log("\tDefensive Resources :" + WF.DefensiveResources.ToString());
            //        Log("\tDeath List:");
            //        foreach (var faction in DLT.deathList.Keys)
            //        {
            //            Log("\t\t" + faction.ToString() + ": " + DLT.deathList[faction]);
            //        }
            //    }
            //    catch (Exception e)
            //    {
            //        Error(e);
            //    }
            //}
        }