예제 #1
0
        public ModCore()
        {
            curGameTime = Game.GameTime;

            zoneManagerScript = new ZoneManager();
            gangManagerScript = new GangManager();
            mindControlScript = new MindControl();
            menuScript        = new MenuScript();

            this.Aborted += OnAbort;

            this.KeyUp += OnKeyUp;
            this.Tick  += OnTick;

            Logger.Log("mod started!", 2);

            bool successfulInit = GangMemberUpdater.Initialize();

            while (successfulInit == false)
            {
                Yield();
                successfulInit = GangMemberUpdater.Initialize();
            }

            successfulInit = GangVehicleUpdater.Initialize();

            while (successfulInit == false)
            {
                Yield();
                successfulInit = GangVehicleUpdater.Initialize();
            }
        }
예제 #2
0
        void TryUpgradeZones()
        {
            //upgrade the whole gang strength if possible!
            //lets not get more upgrades here than the player. it may get too hard for the player to catch up otherwise
            if (watchedGang.moneyAvailable >= GangManager.CalculateGangValueUpgradeCost(watchedGang.baseTurfValue) &&
                watchedGang.baseTurfValue <= GangManager.instance.PlayerGang.baseTurfValue - 1)
            {
                watchedGang.moneyAvailable -= GangManager.CalculateGangValueUpgradeCost(watchedGang.baseTurfValue);
                watchedGang.baseTurfValue++;
                GangManager.instance.SaveGangData(false);
                return;
            }
            //if we have enough money to upgrade a zone,
            //try upgrading our toughest zone... or one that we can afford upgrading
            int lastCheckedValue = ModOptions.instance.maxTurfValue;

            for (int i = 0; i < myZones.Count; i++)
            {
                if (myZones[i].value == lastCheckedValue)
                {
                    continue;                                       //we already know we can't afford upgrading from this turf level
                }
                if (watchedGang.moneyAvailable >= GangManager.CalculateTurfValueUpgradeCost(myZones[i].value))
                {
                    watchedGang.moneyAvailable -= GangManager.CalculateTurfValueUpgradeCost(myZones[i].value);
                    myZones[i].value++;
                    ZoneManager.instance.SaveZoneData(false);
                    return;
                }
                else
                {
                    lastCheckedValue = myZones[i].value;
                }
            }
        }
예제 #3
0
        public GangManager()
        {
            instance = this;

            enemyGangs = new List <GangAI>();

            //classes below are all singletons, so no need to hold their ref here
            new ModOptions();
            new SpawnManager();

            gangData = PersistenceHandler.LoadFromFile <GangData>("GangData");
            if (gangData == null)
            {
                gangData = new GangData();

                //setup initial gangs... the player's and an enemy
                CreateNewPlayerGang();

                CreateNewEnemyGang();
            }
            else
            {
                PlayerGang.AdjustStatsToModOptions();
            }

            if (gangData.gangs.Count == 1 && ModOptions.instance.maxCoexistingGangs > 1)
            {
                //we're alone.. add an enemy!
                CreateNewEnemyGang();
            }

            SetUpAllGangs();

            timeLastReward = ModCore.curGameTime;
        }
예제 #4
0
        public ModCore()
        {
            zoneManagerScript = new ZoneManager();
            gangManagerScript = new GangManager();
            menuScript        = new MenuScript();

            this.Aborted += OnAbort;

            this.KeyUp += onKeyUp;
            this.Tick  += OnTick;
        }
예제 #5
0
        void TryUpgradeMembers()
        {
            //since we've got some extra cash, lets upgrade our members!
            switch (RandoMath.CachedRandom.Next(3))
            {
            case 0:     //accuracy!
                if (watchedGang.memberAccuracyLevel < ModOptions.instance.maxGangMemberAccuracy &&
                    watchedGang.moneyAvailable >= GangManager.CalculateAccuracyUpgradeCost(watchedGang.memberAccuracyLevel))
                {
                    watchedGang.moneyAvailable      -= GangManager.CalculateAccuracyUpgradeCost(watchedGang.memberAccuracyLevel);
                    watchedGang.memberAccuracyLevel += ModOptions.instance.GetAccuracyUpgradeIncrement();
                    if (watchedGang.memberAccuracyLevel > ModOptions.instance.maxGangMemberAccuracy)
                    {
                        watchedGang.memberAccuracyLevel = ModOptions.instance.maxGangMemberAccuracy;
                    }

                    GangManager.instance.SaveGangData(false);
                }
                break;

            case 1:     //armor!
                if (watchedGang.memberArmor < ModOptions.instance.maxGangMemberArmor &&
                    watchedGang.moneyAvailable >= GangManager.CalculateArmorUpgradeCost(watchedGang.memberArmor))
                {
                    watchedGang.moneyAvailable -= GangManager.CalculateArmorUpgradeCost(watchedGang.memberArmor);
                    watchedGang.memberArmor    += ModOptions.instance.GetArmorUpgradeIncrement();

                    if (watchedGang.memberArmor > ModOptions.instance.maxGangMemberArmor)
                    {
                        watchedGang.memberArmor = ModOptions.instance.maxGangMemberArmor;
                    }

                    GangManager.instance.SaveGangData(false);
                }
                break;

            default:     //health!
                if (watchedGang.memberHealth < ModOptions.instance.maxGangMemberHealth &&
                    watchedGang.moneyAvailable >= GangManager.CalculateHealthUpgradeCost(watchedGang.memberHealth))
                {
                    watchedGang.moneyAvailable -= GangManager.CalculateHealthUpgradeCost(watchedGang.memberHealth);
                    watchedGang.memberHealth   += ModOptions.instance.GetHealthUpgradeIncrement();

                    if (watchedGang.memberHealth > ModOptions.instance.maxGangMemberHealth)
                    {
                        watchedGang.memberHealth = ModOptions.instance.maxGangMemberHealth;
                    }

                    GangManager.instance.SaveGangData(false);
                }
                break;
            }
        }
예제 #6
0
        public void EndWar(bool playerVictory)
        {
            if (playerVictory)
            {
                int battleProfit = GangManager.CalculateBattleRewards(enemyGang, curWarType == warType.attackingEnemy);
                GangManager.instance.AddOrSubtractMoneyToProtagonist
                    (battleProfit);

                UI.Notify("Victory rewards: $" + battleProfit.ToString());

                if (curWarType == warType.attackingEnemy)
                {
                    GangManager.instance.PlayerGang.TakeZone(warZone);

                    UI.ShowSubtitle(warZone.zoneName + " is now ours!");
                }
                else
                {
                    UI.ShowSubtitle(warZone.zoneName + " remains ours!");
                }

                AmbientGangMemberSpawner.instance.postWarBackupsRemaining = ModOptions.instance.postWarBackupsAmount;
            }
            else
            {
                enemyGang.moneyAvailable += (int)
                                            (GangManager.CalculateBattleRewards(GangManager.instance.PlayerGang, curWarType != warType.attackingEnemy) *
                                             ModOptions.instance.extraProfitForAIGangsFactor);
                if (curWarType == warType.attackingEnemy)
                {
                    UI.ShowSubtitle("We've lost this battle. They keep the turf.");
                }
                else
                {
                    enemyGang.TakeZone(warZone);
                    UI.ShowSubtitle(warZone.zoneName + " has been taken by the " + enemyGang.name + "!");
                }
            }

            CheckIfBattleWasUnfair();
            Function.Call(Hash.PLAY_SOUND_FRONTEND, -1, "ScreenFlash", "WastedSounds");
            warBlip.Remove();
            shouldDisplayReinforcementsTexts = false;
            isOccurring = false;
            AmbientGangMemberSpawner.instance.enabled = true;
            GangManager.instance.GetGangAI(enemyGang).ticksSinceLastFightWithPlayer = 0;

            if (alliedSpawnBlip != null)
            {
                alliedSpawnBlip.Remove();
                enemySpawnBlip.Remove();
            }
        }
예제 #7
0
        void TryTakeTurf(TurfZone targetZone)
        {
            if (targetZone == null || targetZone.ownerGangName == watchedGang.name)
            {
                return;                                                                     //whoops, there just isn't any zone available for our gang
            }
            if (targetZone.ownerGangName == "none")
            {
                //this zone is neutral, lets just take it
                //we make it cheaper for the AI to get neutral zones in order to not make the world a gangless place haha
                if (watchedGang.moneyAvailable >= ModOptions.instance.baseCostToTakeTurf / 10)
                {
                    watchedGang.moneyAvailable -= ModOptions.instance.baseCostToTakeTurf / 10;
                    watchedGang.TakeZone(targetZone);
                }
            }
            else
            {
                Gang ownerGang = GangManager.instance.GetGangByName(targetZone.ownerGangName);

                if (ownerGang == null)
                {
                    ZoneManager.instance.GiveGangZonesToAnother(targetZone.ownerGangName, "none");
                    //this zone was controlled by a gang that no longer exists. it is neutral now
                    if (watchedGang.moneyAvailable >= ModOptions.instance.baseCostToTakeTurf / 10)
                    {
                        watchedGang.moneyAvailable -= ModOptions.instance.baseCostToTakeTurf / 10;
                        watchedGang.TakeZone(targetZone);
                    }
                }
                else
                {
                    if (GangWarManager.instance.isOccurring && GangWarManager.instance.warZone == targetZone)
                    {
                        //don't mess with this zone then, it's a warzone
                        return;
                    }
                    //we check how well defended this zone is,
                    //then figure out how large our attack should be.
                    //if we can afford that attack, we do it
                    int defenderStrength = GangManager.CalculateDefenderStrength(ownerGang, targetZone);
                    GangWarManager.attackStrength requiredStrength = GangManager.CalculateRequiredAttackStrength(watchedGang, defenderStrength);
                    int atkCost = GangManager.CalculateAttackCost(watchedGang, requiredStrength);
                    if (watchedGang.moneyAvailable >= atkCost)
                    {
                        if (targetZone.ownerGangName == GangManager.instance.PlayerGang.name)
                        {
                            if (ModOptions.instance.fightingEnabled &&
                                ModOptions.instance.warAgainstPlayerEnabled &&
                                ticksSinceLastFightWithPlayer > ModOptions.instance.minGangAITicksBetweenBattlesWithSameGang)
                            {
                                //the player may be in big trouble now
                                watchedGang.moneyAvailable -= atkCost;
                                GangWarManager.instance.StartWar(watchedGang, targetZone, GangWarManager.warType.defendingFromEnemy, requiredStrength);
                            }
                        }
                        else
                        {
                            watchedGang.moneyAvailable -= atkCost;
                            //roll dices... favor the defenders a little here
                            if (atkCost / ModOptions.instance.baseCostToTakeTurf * RandoMath.CachedRandom.Next(1, 20) >
                                defenderStrength / RandoMath.CachedRandom.Next(1, 15))
                            {
                                watchedGang.TakeZone(targetZone);
                                watchedGang.moneyAvailable += (int)(GangManager.CalculateBattleRewards(ownerGang, true) *
                                                                    ModOptions.instance.extraProfitForAIGangsFactor);
                            }
                            else
                            {
                                ownerGang.moneyAvailable += (int)(GangManager.CalculateBattleRewards(watchedGang, false) *
                                                                  ModOptions.instance.extraProfitForAIGangsFactor);
                            }
                        }
                    }
                    else if (myZones.Count == 0)
                    {
                        //if we're out of turf and cant afford a decent attack, lets just attack anyway
                        //we use a light attack and do it even if that means our money gets negative.
                        //this should make gangs get back in the game or be wiped out instead of just staying away
                        atkCost = GangManager.CalculateAttackCost(watchedGang, GangWarManager.attackStrength.light);
                        if (targetZone.ownerGangName == GangManager.instance.PlayerGang.name)
                        {
                            if (ModOptions.instance.fightingEnabled &&
                                ModOptions.instance.warAgainstPlayerEnabled &&
                                ticksSinceLastFightWithPlayer > ModOptions.instance.minGangAITicksBetweenBattlesWithSameGang)
                            {
                                //the player may be in big trouble now
                                watchedGang.moneyAvailable -= atkCost;
                                GangWarManager.instance.StartWar(watchedGang, targetZone, GangWarManager.warType.defendingFromEnemy, requiredStrength);
                            }
                        }
                        else
                        {
                            watchedGang.moneyAvailable -= atkCost;
                            //roll dices... favor the defenders a little here
                            if (atkCost / ModOptions.instance.baseCostToTakeTurf * RandoMath.CachedRandom.Next(1, 20) >
                                defenderStrength / RandoMath.CachedRandom.Next(1, 15))
                            {
                                watchedGang.TakeZone(targetZone);
                                watchedGang.moneyAvailable += (int)(GangManager.CalculateBattleRewards(ownerGang, true) *
                                                                    ModOptions.instance.extraProfitForAIGangsFactor);
                            }
                            else
                            {
                                ownerGang.moneyAvailable += (int)(GangManager.CalculateBattleRewards(watchedGang, false) *
                                                                  ModOptions.instance.extraProfitForAIGangsFactor);
                            }
                        }
                    }
                }
            }
        }
예제 #8
0
        public bool StartWar(Gang enemyGang, TurfZone warZone, warType theWarType, attackStrength attackStrength)
        {
            //TODO disable wars during missions
            if (!isOccurring || enemyGang == GangManager.instance.PlayerGang)
            {
                this.enemyGang  = enemyGang;
                this.warZone    = warZone;
                this.curWarType = theWarType;

                spawnPointsSet = false;

                warBlip            = World.CreateBlip(warZone.zoneBlipPosition);
                warBlip.IsFlashing = true;
                warBlip.Sprite     = BlipSprite.Deathmatch;
                warBlip.Color      = BlipColor.Red;
                warBlip.Position  += Vector3.WorldUp * 5; //an attempt to make the war blip be drawn over the zone blip

                Function.Call(Hash.BEGIN_TEXT_COMMAND_SET_BLIP_NAME, "STRING");
                Function.Call(Hash._ADD_TEXT_COMPONENT_STRING, "Gang War (versus " + enemyGang.name + ")");
                Function.Call(Hash.END_TEXT_COMMAND_SET_BLIP_NAME, warBlip);

                curTicksAwayFromBattle = 0;

                if (theWarType == warType.attackingEnemy)
                {
                    alliedReinforcements = GangManager.CalculateAttackerReinforcements(GangManager.instance.PlayerGang, attackStrength);
                    enemyReinforcements  = GangManager.CalculateDefenderReinforcements(enemyGang, warZone);
                }
                else
                {
                    alliedReinforcements = GangManager.CalculateDefenderReinforcements(GangManager.instance.PlayerGang, warZone);
                    enemyReinforcements  = GangManager.CalculateAttackerReinforcements(enemyGang, attackStrength);
                }

                float screenRatio = (float)Game.ScreenResolution.Width / Game.ScreenResolution.Height;

                int proportionalScreenWidth = (int)(1080 * screenRatio); //nativeUI UIResText works with 1080p height

                alliedNumText.Position = new Point((proportionalScreenWidth / 2) - 120, 10);
                enemyNumText.Position  = new Point((proportionalScreenWidth / 2) + 120, 10);

                alliedNumText.Caption = alliedReinforcements.ToString();
                enemyNumText.Caption  = enemyReinforcements.ToString();

                initialEnemyReinforcements = enemyReinforcements;

                reinforcementsAdvantage = alliedReinforcements / (float)enemyReinforcements;

                spawnedAllies  = GangManager.instance.GetSpawnedMembersOfGang(GangManager.instance.PlayerGang).Count;
                spawnedEnemies = GangManager.instance.GetSpawnedMembersOfGang(enemyGang).Count;

                maxSpawnedAllies  = (int)(RandoMath.Max((ModOptions.instance.spawnedMemberLimit / 2) * reinforcementsAdvantage, 5));
                maxSpawnedEnemies = RandoMath.Max(ModOptions.instance.spawnedMemberLimit - maxSpawnedAllies, 5);

                isOccurring = true;

                //try placing spawn points around the zone's blip position, which should be a good reference point
                if (World.GetZoneName(Game.Player.Character.Position) == warZone.zoneName ||
                    World.GetDistance(Game.Player.Character.Position, warZone.zoneBlipPosition) < 100)
                {
                    SetSpawnPoints(warZone.zoneBlipPosition);
                }



                //BANG-like sound
                Function.Call(Hash.PLAY_SOUND_FRONTEND, -1, "PROPERTY_PURCHASE", "HUD_AWARDS");

                if (theWarType == warType.attackingEnemy)
                {
                    UI.ShowSubtitle("The " + enemyGang.name + " are coming!");

                    //if we are attacking and failed to set the initial spawn points around the war blip,
                    //it probably means we're in a big zone, far from the zone's blip.
                    //set spawns around the player then!
                    if (!spawnPointsSet && theWarType == warType.attackingEnemy)
                    {
                        SetSpawnPoints(Game.Player.Character.Position);
                    }
                }
                else
                {
                    UI.Notify(string.Concat("The ", enemyGang.name, " are attacking ", warZone.zoneName, "! They are ",
                                            GangManager.CalculateAttackerReinforcements(enemyGang, attackStrength).ToString(),
                                            " against our ",
                                            GangManager.CalculateDefenderReinforcements(GangManager.instance.PlayerGang, warZone).ToString()));
                }

                return(true);
            }
            else
            {
                return(false);
            }
        }