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(); } }
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); } } } } } }