public static IEnumerable <int> GetBattleriderIndexes(App app, ShipInfo ship) { List <SectionInstanceInfo> list1 = app.GameDatabase.GetShipSectionInstances(ship.ID).ToList <SectionInstanceInfo>(); List <DesignSectionInfo> sections = ((IEnumerable <DesignSectionInfo>)app.GameDatabase.GetShipInfo(ship.ID, true).DesignInfo.DesignSections).ToList <DesignSectionInfo>(); List <int> intList = new List <int>(); int num = 0; for (int j = 0; j < sections.Count; ++j) { SectionInstanceInfo sectionInstanceInfo = list1.First <SectionInstanceInfo>((Func <SectionInstanceInfo, bool>)(x => x.SectionID == sections[j].ID)); List <ModuleInstanceInfo> list2 = app.GameDatabase.GetModuleInstances(sectionInstanceInfo.ID).ToList <ModuleInstanceInfo>(); foreach (LogicalMount mount in app.AssetDatabase.GetShipSectionAsset(sections[j].FilePath).Mounts) { if (WeaponEnums.IsWeaponBattleRider(mount.Bank.TurretClass)) { ++num; } else if (WeaponEnums.IsBattleRider(mount.Bank.TurretClass)) { intList.Add(num); ++num; } } if (list2.Count > 0) { foreach (ModuleInstanceInfo moduleInstanceInfo in list2) { ModuleInstanceInfo mii = moduleInstanceInfo; DesignModuleInfo designModuleInfo = sections[j].Modules.First <DesignModuleInfo>((Func <DesignModuleInfo, bool>)(x => x.MountNodeName == mii.ModuleNodeID)); if (designModuleInfo.DesignID.HasValue) { string modAsset = app.GameDatabase.GetModuleAsset(designModuleInfo.ModuleID); foreach (LogicalMount mount in app.AssetDatabase.Modules.Where <LogicalModule>((Func <LogicalModule, bool>)(x => x.ModulePath == modAsset)).First <LogicalModule>().Mounts) { if (WeaponEnums.IsWeaponBattleRider(mount.Bank.TurretClass)) { ++num; } else if (WeaponEnums.IsBattleRider(mount.Bank.TurretClass)) { intList.Add(num); ++num; } } } } } } return((IEnumerable <int>)intList); }
private static void CompleteSimulation( GameSession game, int systemId, Dictionary <FleetInfo, List <ShipCombatInfo> > shipCombatInfo, List <PlanetCombatInfo> planets) { CombatData combatData = game.CombatData.AddCombat(GameSession.GetNextUniqueCombatID(), systemId, game.GameDatabase.GetTurnCount()); foreach (KeyValuePair <FleetInfo, List <ShipCombatInfo> > keyValuePair1 in shipCombatInfo) { PlayerCombatData orAddPlayer = combatData.GetOrAddPlayer(keyValuePair1.Key.PlayerID); orAddPlayer.VictoryStatus = GameSession.VictoryStatus.Draw; foreach (ShipCombatInfo shipCombatInfo1 in keyValuePair1.Value) { ShipCombatInfo sci = shipCombatInfo1; if ((double)sci.structureFactor == 0.0) { if (sci.shipInfo.DesignInfo.IsSuulka()) { TurnEvent turnEvent = game.GameDatabase.GetTurnEventsByTurnNumber(game.GameDatabase.GetTurnCount(), orAddPlayer.PlayerID).FirstOrDefault <TurnEvent>((Func <TurnEvent, bool>)(x => x.ShipID == sci.shipInfo.ID)); if (turnEvent != null) { game.GameDatabase.RemoveTurnEvent(turnEvent.ID); } List <int> intList1 = new List <int>(); List <int> intList2 = new List <int>(); foreach (KeyValuePair <FleetInfo, List <ShipCombatInfo> > keyValuePair2 in shipCombatInfo) { if (orAddPlayer.PlayerID != keyValuePair2.Key.PlayerID && !intList1.Contains(keyValuePair2.Key.PlayerID) && !intList2.Contains(keyValuePair2.Key.PlayerID)) { switch (game.GameDatabase.GetDiplomacyStateBetweenPlayers(orAddPlayer.PlayerID, keyValuePair2.Key.PlayerID)) { case DiplomacyState.WAR: intList1.Add(keyValuePair2.Key.PlayerID); continue; case DiplomacyState.NEUTRAL: intList2.Add(keyValuePair2.Key.PlayerID); continue; default: continue; } } } int num = 0; if (intList1.Count > 0) { num = App.GetSafeRandom().Choose <int>((IList <int>)intList1); } else if (intList2.Count > 0) { num = App.GetSafeRandom().Choose <int>((IList <int>)intList2); } game.GameDatabase.InsertTurnEvent(new TurnEvent() { EventType = TurnEventType.EV_SUULKA_DIES, EventMessage = TurnEventMessage.EM_SUULKA_DIES, PlayerID = num, SystemID = systemId, ShipID = sci.shipInfo.ID, DesignID = sci.shipInfo.DesignID, TurnNumber = game.GameDatabase.GetTurnCount(), ShowsDialog = false }); SuulkaInfo suulkaByShipId = game.GameDatabase.GetSuulkaByShipID(sci.shipInfo.ID); if (suulkaByShipId != null) { game.GameDatabase.RemoveSuulka(suulkaByShipId.ID); } } game.GameDatabase.RemoveShip(sci.shipInfo.ID); GameTrigger.PushEvent(EventType.EVNT_SHIPDIED, (object)sci.shipInfo.DesignInfo.Class, game); orAddPlayer.AddShipData(sci.shipInfo.DesignID, 0.0f, 0.0f, 0, true); if (ScriptHost.AllowConsole) { App.Log.Trace(string.Format("Ship destroyed: {0} ({1})", (object)sci.shipInfo.ID, (object)sci.shipInfo.ShipName), "combat"); } } else { if (sci.shipInfo.DesignInfo == null) { sci.shipInfo.DesignInfo = game.GameDatabase.GetDesignInfo(sci.shipInfo.DesignID); } foreach (SectionInstanceInfo sectionInstanceInfo in game.GameDatabase.GetShipSectionInstances(sci.shipInfo.ID).ToList <SectionInstanceInfo>()) { SectionInstanceInfo sii = sectionInstanceInfo; int minStructure = ((IEnumerable <DesignSectionInfo>)sci.shipInfo.DesignInfo.DesignSections).First <DesignSectionInfo>((Func <DesignSectionInfo, bool>)(x => x.ID == sii.SectionID)).GetMinStructure(game.GameDatabase, game.AssetDatabase); sii.Structure -= sii.Structure - (int)Math.Round((double)sci.structureFactor); sii.Structure = Math.Max(sii.Structure, minStructure); game.GameDatabase.UpdateSectionInstance(sii); if (sii.Structure == minStructure) { foreach (ModuleInstanceInfo module in game.GameDatabase.GetModuleInstances(sii.ID).ToList <ModuleInstanceInfo>()) { module.Structure = 0; game.GameDatabase.UpdateModuleInstance(module); } foreach (WeaponInstanceInfo weapon in game.GameDatabase.GetWeaponInstances(sii.ID).ToList <WeaponInstanceInfo>()) { weapon.Structure = 0.0f; game.GameDatabase.UpdateWeaponInstance(weapon); } } } } } if (!CombatSimulator.IsFleetAlive(keyValuePair1.Value)) { game.GameDatabase.RemoveFleet(keyValuePair1.Key.ID); GameTrigger.PushEvent(EventType.EVNT_FLEETDIED, (object)keyValuePair1.Key.Name, game); if (ScriptHost.AllowConsole) { App.Log.Trace(string.Format("Fleet destroyed: {0} ({1})", (object)keyValuePair1.Key.ID, (object)keyValuePair1.Key.Name), "combat"); } } else { CombatSimulator.CheckFleetCommandPoints(game, keyValuePair1.Key); } } bool flag = true; foreach (PlanetCombatInfo planet in planets) { game.GameDatabase.UpdatePlanet(planet.planetInfo); if (planet.colonyInfo != null) { if (planet.colonyInfo.ImperialPop <= 0.0) { game.GameDatabase.RemoveColonyOnPlanet(planet.planetInfo.ID); if (ScriptHost.AllowConsole) { App.Log.Trace(string.Format("Colony defeated: planetid={0}", (object)planet.planetInfo.ID), "combat"); } } else { flag = false; planet.colonyInfo.DamagedLastTurn = true; game.GameDatabase.UpdateColony(planet.colonyInfo); foreach (ColonyFactionInfo faction in planet.colonyInfo.Factions) { game.GameDatabase.UpdateCivilianPopulation(faction); } } } } if (flag) { foreach (StationInfo stationInfo in game.GameDatabase.GetStationForSystem(systemId).ToList <StationInfo>()) { game.GameDatabase.DestroyStation(game, stationInfo.ID, 0); } } game.GameDatabase.InsertCombatData(systemId, combatData.CombatID, combatData.Turn, combatData.ToByteArray()); }
private void SyncFleet() { FleetInfo fleetInfo = this.App.GameDatabase.GetFleetInfo(this._syncedFleet); if (fleetInfo == null) { return; } IEnumerable <ShipInfo> shipInfoByFleetId = this.App.GameDatabase.GetShipInfoByFleetID(fleetInfo.ID, true); List <object> objectList = new List <object>(); int num1 = 0; foreach (ShipInfo shipInfo1 in shipInfoByFleetId) { ShipInfo ship = shipInfo1; bool flag1 = true; ++num1; objectList.Add((object)true); objectList.Add((object)ship.DesignID); objectList.Add((object)ship.ID); objectList.Add((object)ship.DesignInfo.Name); objectList.Add((object)ship.ShipName); bool flag2 = false; string str = ""; PlatformTypes?platformType = ship.DesignInfo.GetPlatformType(); bool flag3 = false; bool flag4 = ship.IsPoliceShip(); int defenseAssetCpCost = this.App.AssetDatabase.DefenseManagerSettings.GetDefenseAssetCPCost(ship.DesignInfo); if (ship.IsMinelayer()) { flag2 = true; foreach (DesignSectionInfo designSection in ship.DesignInfo.DesignSections) { foreach (WeaponBankInfo weaponBank in designSection.WeaponBanks) { string wasset = this.App.GameDatabase.GetWeaponAsset(weaponBank.WeaponID.Value); if (wasset.Contains("Min_")) { LogicalWeapon logicalWeapon = this.App.AssetDatabase.Weapons.FirstOrDefault <LogicalWeapon>((Func <LogicalWeapon, bool>)(x => x.FileName == wasset)); if (logicalWeapon != null) { str = logicalWeapon.IconSpriteName; break; } } } } } else if (ship.IsSDB()) { flag3 = true; } else if (ship.IsPoliceShip()) { flag4 = true; } objectList.Add((object)flag2); objectList.Add((object)flag3); objectList.Add((object)str); objectList.Add(platformType.HasValue ? (object)platformType.Value.ToString() : (object)string.Empty); objectList.Add((object)flag4); if (defenseAssetCpCost == 0) { objectList.Add((object)this.App.GameDatabase.GetShipCommandPointCost(ship.ID, true)); } else { objectList.Add((object)defenseAssetCpCost); } objectList.Add((object)this.App.GameDatabase.GetDesignCommandPointQuota(this.App.AssetDatabase, ship.DesignInfo.ID)); objectList.Add((object)flag1); int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; int num7 = 0; ShipSectionAsset shipSectionAsset1 = (ShipSectionAsset)null; List <SectionInstanceInfo> list1 = this.App.GameDatabase.GetShipSectionInstances(ship.ID).ToList <SectionInstanceInfo>(); if (list1.Count != ship.DesignInfo.DesignSections.Length) { throw new InvalidDataException(string.Format("Mismatched design section vs ship section instance count for designId={0} and shipId={1}.", (object)ship.DesignInfo.ID, (object)ship.ID)); } for (int i = 0; i < ((IEnumerable <DesignSectionInfo>)ship.DesignInfo.DesignSections).Count <DesignSectionInfo>(); ++i) { if (list1.Count <= i) { App.Log.Warn("Tried syncing ship with no section", "game"); } else { ShipSectionAsset shipSectionAsset2 = this.App.AssetDatabase.GetShipSectionAsset(ship.DesignInfo.DesignSections[i].FilePath); if (shipSectionAsset2.Type == ShipSectionType.Mission) { shipSectionAsset1 = shipSectionAsset2; } SectionInstanceInfo sectionInstanceInfo = list1.First <SectionInstanceInfo>((Func <SectionInstanceInfo, bool>)(x => x.SectionID == ship.DesignInfo.DesignSections[i].ID)); num6 += shipSectionAsset2.ConstructionPoints; num7 += shipSectionAsset2.ColonizationSpace; num5 += shipSectionAsset2.Structure; num3 += shipSectionAsset2.RepairPoints; num4 += sectionInstanceInfo.Structure; num2 += sectionInstanceInfo.RepairPoints; Dictionary <ArmorSide, DamagePattern> armorInstances = this.App.GameDatabase.GetArmorInstances(sectionInstanceInfo.ID); if (armorInstances.Count > 0) { for (int index = 0; index < 4; ++index) { num5 += armorInstances[(ArmorSide)index].Width * armorInstances[(ArmorSide)index].Height * 3; for (int x = 0; x < armorInstances[(ArmorSide)index].Width; ++x) { for (int y = 0; y < armorInstances[(ArmorSide)index].Height; ++y) { if (!armorInstances[(ArmorSide)index].GetValue(x, y)) { num4 += 3; } } } } } List <ModuleInstanceInfo> list2 = this.App.GameDatabase.GetModuleInstances(sectionInstanceInfo.ID).ToList <ModuleInstanceInfo>(); List <DesignModuleInfo> module = ship.DesignInfo.DesignSections[i].Modules; for (int mod = 0; mod < module.Count; ++mod) { ModuleInstanceInfo moduleInstanceInfo = list2.First <ModuleInstanceInfo>((Func <ModuleInstanceInfo, bool>)(x => x.ModuleNodeID == module[mod].MountNodeName)); string modAsset = this.App.GameDatabase.GetModuleAsset(module[mod].ModuleID); LogicalModule logicalModule = this.App.AssetDatabase.Modules.Where <LogicalModule>((Func <LogicalModule, bool>)(x => x.ModulePath == modAsset)).First <LogicalModule>(); num5 += (int)logicalModule.Structure; num4 += moduleInstanceInfo.Structure; num3 += logicalModule.RepairPointsBonus; num2 += moduleInstanceInfo.RepairPoints; } foreach (WeaponInstanceInfo weaponInstanceInfo in this.App.GameDatabase.GetWeaponInstances(list1[i].ID).ToList <WeaponInstanceInfo>()) { num5 += (int)weaponInstanceInfo.MaxStructure; num4 += (int)weaponInstanceInfo.Structure; } } } objectList.Add((object)num4); objectList.Add((object)num5); objectList.Add((object)num2); objectList.Add((object)num3); objectList.Add((object)num6); objectList.Add((object)num7); IEnumerable <ShipInfo> ridersByParentId = this.App.GameDatabase.GetBattleRidersByParentID(ship.ID); objectList.Add((object)ridersByParentId.Count <ShipInfo>()); foreach (ShipInfo shipInfo2 in ridersByParentId) { objectList.Add((object)shipInfo2.ID); } objectList.Add((object)0); objectList.Add((object)shipSectionAsset1.RealClass); objectList.Add((object)shipSectionAsset1.BattleRiderType); Matrix?shipSystemPosition = this.App.GameDatabase.GetShipSystemPosition(ship.ID); objectList.Add((object)(shipSystemPosition.HasValue ? 1 : 0)); if (shipSystemPosition.HasValue) { objectList.Add((object)shipSystemPosition.Value); } } objectList.Insert(0, (object)num1); int systemDefensePoints = this.App.GameDatabase.GetSystemDefensePoints(fleetInfo.SystemID, this.App.LocalPlayer.ID); objectList.Insert(1, (object)systemDefensePoints); objectList.Insert(2, (object)fleetInfo.ID); this.PostSetProp("SyncShips", objectList.ToArray()); }