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(); } }
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; } } }
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; }
public ModCore() { zoneManagerScript = new ZoneManager(); gangManagerScript = new GangManager(); menuScript = new MenuScript(); this.Aborted += OnAbort; this.KeyUp += onKeyUp; this.Tick += OnTick; }
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; } }
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); } } } } } }
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); } }