/// <summary> /// This is for adding components and installations to ships and colonies. /// </summary> /// <param name="parentEntity">entity that contains an ComponentInstancesDB</param> /// <param name="componentEntity">Can be either a design or instance entity</param> internal static void AddComponentToEntity(Entity parentEntity, Entity componentEntity) { Entity instance; if (parentEntity.HasDataBlob <ComponentInstancesDB>()) { if (!componentEntity.HasDataBlob <ComponentInstanceInfoDB>()) { if (componentEntity.HasDataBlob <ComponentInfoDB>()) { Entity ownerFaction = Entity.InvalidEntity; if (parentEntity.HasDataBlob <OwnedDB>()) { ownerFaction = parentEntity.GetDataBlob <OwnedDB>().ObjectOwner; } instance = ComponentInstanceFactory.NewInstanceFromDesignEntity(componentEntity, ownerFaction); } else { throw new Exception("componentEntity does not contain either a ComponentInfoDB or a ComponentInstanceInfoDB. Entity Not a ComponentDesign or ComponentInstance"); } } else { instance = componentEntity; } AddComponentInstanceToEntity(parentEntity, instance); } else { throw new Exception("parentEntiy does not contain a ComponentInstanceDB"); } ReCalcProcessor.ReCalcAbilities(parentEntity); }
/// <summary> /// This will work for missiles, ships, asteroids, and populations at some point. /// Damage type may eventually be required. /// </summary> /// <param name="damageableEntity"></param> /// <param name="damageAmount"></param> public static void OnTakingDamage(Entity damageableEntity, int damageAmount, DateTime atDateTime) { if (damageableEntity.HasDataBlob <AsteroidDamageDB>()) { AsteroidDamageDB AstDmgDB = damageableEntity.GetDataBlob <AsteroidDamageDB>(); AstDmgDB.Health = AstDmgDB.Health - damageAmount; if (AstDmgDB.Health <= 0) { SpawnSubAsteroids(damageableEntity, atDateTime); } } else if (damageableEntity.HasDataBlob <ShipInfoDB>()) { //do shield damage //do armor damage //for components: Game game = damageableEntity.Manager.Game; PositionDB ShipPosition = damageableEntity.GetDataBlob <PositionDB>(); StarSystem mySystem; if (!game.Systems.TryGetValue(ShipPosition.SystemGuid, out mySystem)) { throw new GuidNotFoundException(ShipPosition.SystemGuid); } ComponentInstancesDB ShipInst = damageableEntity.GetDataBlob <ComponentInstancesDB>(); //These are ship components in this context int damageAttempt = 0; while (damageAmount > 0) { int randValue = mySystem.RNG.Next((int)(damageableEntity.GetDataBlob <MassVolumeDB>().VolumeM3)); //volume in m^3 foreach (KeyValuePair <Entity, double> pair in ShipInst.ComponentDictionary) { if (pair.Value > randValue) { //check if this component is destroyed //if it isn't get density MassVolumeDB mvDB = pair.Key.GetDataBlob <MassVolumeDB>(); double DensityThreshold = 1.0; //what should this be? double dmgPercent = DensityThreshold * mvDB.Density * 1000; int dmgDone = (int)(damageAmount * dmgPercent); ComponentInfoDB ciDB = pair.Key.GetDataBlob <ComponentInfoDB>(); ComponentInstanceInfoDB ciiDB = pair.Key.GetDataBlob <ComponentInstanceInfoDB>(); if (ciiDB.HTKRemaining > 0) //component is not destroyed yet { if (dmgDone >= ciiDB.HTKRemaining) //component is definitely wrecked { damageAmount = damageAmount - ciiDB.HTKRemaining; ciiDB.HTKRemaining = 0; } else { ciiDB.HTKRemaining = ciiDB.HTKRemaining - damageAmount; damageAmount = 0; } } else { damageAttempt++; if (damageAttempt == 20) // Aurora default, seems like an ok number to use for now. { break; } /// <summary> /// Need to pick a new component to try and destroy. /// Should any damage get absorbed by the wreck? /// How many of these failures should I run into before declaring the ship destroyed? /// Should ship distruction happen differently? /// </summary> continue; } //compare this density to some density value to calculate how much to modify damage by //if damage is greater than the HTK then the component is destroyed. modify damageAmount and move onto the next component. //leave this loop if damage is zero. break; } } if (damageAttempt == 20) // need to copy this to fully break out of the loop; { break; } } if (damageAttempt == 20) // the ship is destroyed. how to mark it as such? { SpawnWreck(damageableEntity); } else { ReCalcProcessor.ReCalcAbilities(damageableEntity); } } else if (damageableEntity.HasDataBlob <ColonyInfoDB>()) { //Think about how to unify this one and shipInfoDB if possible. //do Terraforming/Infra/Pop damage Game game = damageableEntity.Manager.Game; ColonyInfoDB ColIDB = damageableEntity.GetDataBlob <ColonyInfoDB>(); SystemBodyInfoDB SysInfoDB = ColIDB.PlanetEntity.GetDataBlob <SystemBodyInfoDB>(); PositionDB ColonyPosition = ColIDB.PlanetEntity.GetDataBlob <PositionDB>(); StarSystem mySystem; //I need all of this to get to the rng. if (!game.Systems.TryGetValue(ColonyPosition.SystemGuid, out mySystem)) { throw new GuidNotFoundException(ColonyPosition.SystemGuid); } //How should damage work here? //quarter million dead per strength of nuclear attack? 1 radiation/1 dust per strength? //Same chance to destroy components as ship destruction? //I need damage type for these. Missiles/bombs(missile damage but no engine basically) will be the only thing that causes this damage. //ColIDB.Population //SysInfoDB.AtmosphericDust //SysInfoDB.RadiationLevel //Installation Damage section: ComponentInstancesDB ColInst = damageableEntity.GetDataBlob <ComponentInstancesDB>(); //These are installations in this context int damageAttempt = 0; while (damageAmount > 0) { int randValue = mySystem.RNG.Next((int)damageableEntity.GetDataBlob <MassVolumeDB>().Volume); foreach (KeyValuePair <Entity, double> pair in ColInst.ComponentDictionary) { if (pair.Value > randValue) //This installation was targeted { //check if this Installation is destroyed //if it isn't get density MassVolumeDB mvDB = pair.Key.GetDataBlob <MassVolumeDB>(); double DensityThreshold = 1.0; //what should this be? double dmgPercent = DensityThreshold * mvDB.Density; int dmgDone = (int)(damageAmount * dmgPercent); ComponentInfoDB ciDB = pair.Key.GetDataBlob <ComponentInfoDB>(); ComponentInstanceInfoDB ciiDB = pair.Key.GetDataBlob <ComponentInstanceInfoDB>(); if (ciiDB.HTKRemaining > 0) //Installation is not destroyed yet { if (dmgDone >= ciiDB.HTKRemaining) //Installation is definitely wrecked { damageAmount = damageAmount - ciiDB.HTKRemaining; ciiDB.HTKRemaining = 0; } else { ciiDB.HTKRemaining = ciiDB.HTKRemaining - damageAmount; damageAmount = 0; } } else { damageAttempt++; if (damageAttempt == 20) // The planet won't blow up because of this, but no more attempts to damage installations should be made here. { break; } continue; } } } if (damageAttempt == 20) // need to copy this to fully break out of the loop; { break; } } //This will need to be updated to deal with colonies. ReCalcProcessor.ReCalcAbilities(damageableEntity); } }
public static Entity DefaultHumans(Game game, Player owner, string name) { StarSystemFactory starfac = new StarSystemFactory(game); StarSystem sol = starfac.CreateSol(game); Entity earth = sol.SystemManager.Entities[3]; //should be fourth entity created Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); Entity speciesEntity = SpeciesFactory.CreateSpeciesHuman(factionEntity, game.GlobalManager); Entity colonyEntity = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth); ComponentTemplateSD mineSD = game.StaticData.ComponentTemplates[new Guid("f7084155-04c3-49e8-bf43-c7ef4befa550")]; ComponentDesign mineDesign = GenericComponentFactory.StaticToDesign(mineSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity mineEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, mineDesign); ComponentTemplateSD RefinerySD = game.StaticData.ComponentTemplates[new Guid("90592586-0BD6-4885-8526-7181E08556B5")]; ComponentDesign RefineryDesign = GenericComponentFactory.StaticToDesign(RefinerySD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity RefineryEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, RefineryDesign); ComponentTemplateSD labSD = game.StaticData.ComponentTemplates[new Guid("c203b7cf-8b41-4664-8291-d20dfe1119ec")]; ComponentDesign labDesign = GenericComponentFactory.StaticToDesign(labSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity labEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, labDesign); ComponentTemplateSD facSD = game.StaticData.ComponentTemplates[new Guid("{07817639-E0C6-43CD-B3DC-24ED15EFB4BA}")]; ComponentDesign facDesign = GenericComponentFactory.StaticToDesign(facSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity facEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, facDesign); Entity scientistEntity = CommanderFactory.CreateScientist(game.GlobalManager, factionEntity); colonyEntity.GetDataBlob <ColonyInfoDB>().Scientists.Add(scientistEntity); FactionTechDB factionTech = factionEntity.GetDataBlob <FactionTechDB>(); //TechProcessor.ApplyTech(factionTech, game.StaticData.Techs[new Guid("35608fe6-0d65-4a5f-b452-78a3e5e6ce2c")]); //add conventional engine for testing. TechProcessor.MakeResearchable(factionTech); Entity fuelTank = DefaultFuelTank(game, factionEntity); Entity cargoInstalation = DefaultCargoInstalation(game, factionEntity); EntityManipulation.AddComponentToEntity(colonyEntity, mineEntity); EntityManipulation.AddComponentToEntity(colonyEntity, RefineryEntity); EntityManipulation.AddComponentToEntity(colonyEntity, labEntity); EntityManipulation.AddComponentToEntity(colonyEntity, facEntity); EntityManipulation.AddComponentToEntity(colonyEntity, fuelTank); EntityManipulation.AddComponentToEntity(colonyEntity, cargoInstalation); ReCalcProcessor.ReCalcAbilities(colonyEntity); colonyEntity.GetDataBlob <ColonyInfoDB>().Population[speciesEntity] = 9000000000; factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(sol.Guid); //test systems factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(starfac.CreateEccTest(game).Guid); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(starfac.CreateLongitudeTest(game).Guid); // Todo: handle this in CreateShip Entity shipClass = DefaultShipDesign(game, factionEntity); Entity gunShipClass = GunShipDesign(game, factionEntity); Vector4 position = earth.GetDataBlob <PositionDB>().AbsolutePosition; // Problem - the component instances, both the design and the instances themselves, are the same entities on each ship // IE, the fire control on ship1 is the same entity as on ship2 // Both the design and instances should be unique Entity ship1 = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Serial Peacemaker"); Entity ship2 = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Ensuing Calm"); StorageSpaceProcessor.AddItemToCargo(ship1.GetDataBlob <CargoStorageDB>(), new Guid("33e6ac88-0235-4917-a7ff-35c8886aad3a"), 200000000000); StorageSpaceProcessor.AddItemToCargo(ship2.GetDataBlob <CargoStorageDB>(), new Guid("33e6ac88-0235-4917-a7ff-35c8886aad3a"), 200000000000); // Strange bug - seems to update the ship orbit once, then never again // TODO: Fix to allow normal orbiting. //ship.SetDataBlob<OrbitDB>(new OrbitDB(earth.GetDataBlob<OrbitDB>())); Entity gunShip = ShipFactory.CreateShip(gunShipClass, sol.SystemManager, factionEntity, position, sol, "Prevailing Stillness"); StorageSpaceProcessor.AddItemToCargo(gunShipClass.GetDataBlob <CargoStorageDB>(), new Guid("33e6ac88-0235-4917-a7ff-35c8886aad3a"), 2000000000); sol.SystemManager.SetDataBlob(ship1.ID, new TransitableDB()); sol.SystemManager.SetDataBlob(ship2.ID, new TransitableDB()); sol.SystemManager.SetDataBlob(gunShip.ID, new TransitableDB()); //Entity ship = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Serial Peacemaker"); //ship.SetDataBlob(earth.GetDataBlob<PositionDB>()); //first ship reference PositionDB //Entity ship3 = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Contiual Pacifier"); //ship3.SetDataBlob((OrbitDB)earth.GetDataBlob<OrbitDB>().Clone());//second ship clone earth OrbitDB //sol.SystemManager.SetDataBlob(ship.ID, new TransitableDB()); Entity rock = AsteroidFactory.CreateAsteroid(sol, earth, game.CurrentDateTime + TimeSpan.FromDays(365)); return(factionEntity); }
public static Entity DefaultHumans(Game game, Player owner, string name) { StarSystemFactory starfac = new StarSystemFactory(game); StarSystem sol = starfac.CreateSol(game); //sol.ManagerSubpulses.Init(sol); Entity earth = sol.Entities[3]; //should be fourth entity created Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); Entity speciesEntity = SpeciesFactory.CreateSpeciesHuman(factionEntity, game.GlobalManager); Entity colonyEntity = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth); var namedEntites = sol.GetAllEntitiesWithDataBlob <NameDB>(); foreach (var entity in namedEntites) { var nameDB = entity.GetDataBlob <NameDB>(); nameDB.SetName(factionEntity, nameDB.DefaultName); } ComponentTemplateSD mineSD = game.StaticData.ComponentTemplates[new Guid("f7084155-04c3-49e8-bf43-c7ef4befa550")]; ComponentDesign mineDesign = GenericComponentFactory.StaticToDesign(mineSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity mineEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, mineDesign); ComponentTemplateSD RefinerySD = game.StaticData.ComponentTemplates[new Guid("90592586-0BD6-4885-8526-7181E08556B5")]; ComponentDesign RefineryDesign = GenericComponentFactory.StaticToDesign(RefinerySD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity RefineryEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, RefineryDesign); ComponentTemplateSD labSD = game.StaticData.ComponentTemplates[new Guid("c203b7cf-8b41-4664-8291-d20dfe1119ec")]; ComponentDesign labDesign = GenericComponentFactory.StaticToDesign(labSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity labEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, labDesign); ComponentTemplateSD facSD = game.StaticData.ComponentTemplates[new Guid("{07817639-E0C6-43CD-B3DC-24ED15EFB4BA}")]; ComponentDesign facDesign = GenericComponentFactory.StaticToDesign(facSD, factionEntity.GetDataBlob <FactionTechDB>(), game.StaticData); Entity facEntity = GenericComponentFactory.DesignToDesignEntity(game, factionEntity, facDesign); Entity scientistEntity = CommanderFactory.CreateScientist(game.GlobalManager, factionEntity); colonyEntity.GetDataBlob <ColonyInfoDB>().Scientists.Add(scientistEntity); FactionTechDB factionTech = factionEntity.GetDataBlob <FactionTechDB>(); //TechProcessor.ApplyTech(factionTech, game.StaticData.Techs[new Guid("35608fe6-0d65-4a5f-b452-78a3e5e6ce2c")]); //add conventional engine for testing. ResearchProcessor.MakeResearchable(factionTech); Entity fuelTank = DefaultFuelTank(game, factionEntity); Entity cargoInstalation = DefaultCargoInstalation(game, factionEntity); EntityManipulation.AddComponentToEntity(colonyEntity, mineEntity); EntityManipulation.AddComponentToEntity(colonyEntity, RefineryEntity); EntityManipulation.AddComponentToEntity(colonyEntity, labEntity); EntityManipulation.AddComponentToEntity(colonyEntity, facEntity); EntityManipulation.AddComponentToEntity(colonyEntity, fuelTank); EntityManipulation.AddComponentToEntity(colonyEntity, cargoInstalation); EntityManipulation.AddComponentToEntity(colonyEntity, FacPassiveSensor(game, factionEntity)); ReCalcProcessor.ReCalcAbilities(colonyEntity); colonyEntity.GetDataBlob <ColonyInfoDB>().Population[speciesEntity] = 9000000000; var rawSorium = NameLookup.TryGetMineralSD(game, "Sorium"); StorageSpaceProcessor.AddCargo(colonyEntity.GetDataBlob <CargoStorageDB>(), rawSorium, 5000); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(sol.Guid); var facSystemInfo = FactionFactory.CreateSystemFactionEntity(game, factionEntity, sol); //test systems factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(starfac.CreateEccTest(game).Guid); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(starfac.CreateLongitudeTest(game).Guid); factionEntity.GetDataBlob <NameDB>().SetName(factionEntity, "UEF"); // Todo: handle this in CreateShip Entity shipClass = DefaultShipDesign(game, factionEntity); Entity gunShipClass = GunShipDesign(game, factionEntity); Entity ship1 = ShipFactory.CreateShip(shipClass, sol, factionEntity, earth, sol, "Serial Peacemaker"); Entity ship2 = ShipFactory.CreateShip(shipClass, sol, factionEntity, earth, sol, "Ensuing Calm"); var fuel = NameLookup.TryGetMaterialSD(game, "Sorium Fuel"); StorageSpaceProcessor.AddCargo(ship1.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); StorageSpaceProcessor.AddCargo(ship2.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); Entity gunShip = ShipFactory.CreateShip(gunShipClass, sol, factionEntity, earth, sol, "Prevailing Stillness"); StorageSpaceProcessor.AddCargo(gunShipClass.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); sol.SetDataBlob(ship1.ID, new TransitableDB()); sol.SetDataBlob(ship2.ID, new TransitableDB()); sol.SetDataBlob(gunShip.ID, new TransitableDB()); //Entity ship = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Serial Peacemaker"); //ship.SetDataBlob(earth.GetDataBlob<PositionDB>()); //first ship reference PositionDB //Entity ship3 = ShipFactory.CreateShip(shipClass, sol.SystemManager, factionEntity, position, sol, "Contiual Pacifier"); //ship3.SetDataBlob((OrbitDB)earth.GetDataBlob<OrbitDB>().Clone());//second ship clone earth OrbitDB //sol.SystemManager.SetDataBlob(ship.ID, new TransitableDB()); Entity rock = AsteroidFactory.CreateAsteroid(sol, earth, game.CurrentDateTime + TimeSpan.FromDays(365)); return(factionEntity); }
public static Entity CreateShip(Entity classEntity, EntityManager systemEntityManager, Entity ownerFaction, Vector3 pos, StarSystem starsys, string shipName = null) { // @todo replace ownerFaction with formationDB later. Now ownerFaction used just to add name // @todo: make sure each component design and component instance is unique, not duplicated ProtoEntity protoShip = classEntity.Clone(); ShipInfoDB shipInfoDB = protoShip.GetDataBlob <ShipInfoDB>(); shipInfoDB.ShipClassDefinition = classEntity.Guid; if (shipName == null) { shipName = "Ship Name"; } NameDB nameDB = new NameDB(shipName); nameDB.SetName(ownerFaction.Guid, shipName); protoShip.SetDataBlob(nameDB); OrderableDB orderableDB = new OrderableDB(); protoShip.SetDataBlob(orderableDB); PositionDB position = new PositionDB(pos, starsys.Guid); protoShip.SetDataBlob(position); protoShip.SetDataBlob(new DesignInfoDB(classEntity)); //replace the ships references to the design's specific instances with shiny new specific instances ComponentInstancesDB classInstances = classEntity.GetDataBlob <ComponentInstancesDB>(); Entity shipEntity = new Entity(systemEntityManager, ownerFaction.Guid, protoShip); shipEntity.RemoveDataBlob <ComponentInstancesDB>(); shipEntity.SetDataBlob(new ComponentInstancesDB()); if (shipEntity.HasDataBlob <FireControlAbilityDB>()) { shipEntity.RemoveDataBlob <FireControlAbilityDB>(); } foreach (var designKVP in classInstances.DesignsAndComponentCount) { for (int i = 0; i < designKVP.Value; i++) { Entity newInstance = ComponentInstanceFactory.NewInstanceFromDesignEntity(designKVP.Key, ownerFaction.Guid, systemEntityManager); EntityManipulation.AddComponentToEntity(shipEntity, newInstance); } } FactionOwnerDB factionOwner = ownerFaction.GetDataBlob <FactionOwnerDB>(); factionOwner.SetOwned(shipEntity); ComponentInstancesDB shipComponentInstanceDB = shipEntity.GetDataBlob <ComponentInstancesDB>(); //TODO: do this somewhere else, recalcprocessor maybe? foreach (var design in shipComponentInstanceDB.GetDesignsByType(typeof(SensorReceverAtbDB))) { foreach (var instance in shipComponentInstanceDB.GetComponentsBySpecificDesign(design.Guid)) { var sensor = design.GetDataBlob <SensorReceverAtbDB>(); DateTime nextDatetime = shipEntity.Manager.ManagerSubpulses.StarSysDateTime + TimeSpan.FromSeconds(sensor.ScanTime); shipEntity.Manager.ManagerSubpulses.AddEntityInterupt(nextDatetime, new SensorScan().TypeName, instance.OwningEntity); } } ReCalcProcessor.ReCalcAbilities(shipEntity); return(shipEntity); }
public static Entity CreateShip(Entity classEntity, EntityManager systemEntityManager, Entity ownerFaction, Vector4 pos, StarSystem starsys, string shipName = null) { // @todo replace ownerFaction with formationDB later. Now ownerFaction used just to add name // @todo: make sure each component design and component instance is unique, not duplicated ProtoEntity protoShip = classEntity.Clone(); ShipInfoDB shipInfoDB = protoShip.GetDataBlob <ShipInfoDB>(); shipInfoDB.ShipClassDefinition = classEntity.Guid; if (shipName == null) { shipName = "Ship Name"; } NameDB nameDB = new NameDB(shipName); nameDB.SetName(ownerFaction, shipName); protoShip.SetDataBlob(nameDB); OrderableDB orderableDB = new OrderableDB(); protoShip.SetDataBlob(orderableDB); PositionDB position = new PositionDB(pos, starsys.Guid); protoShip.SetDataBlob(position); protoShip.SetDataBlob(new DesignInfoDB(classEntity)); Entity shipEntity = new Entity(systemEntityManager, protoShip); new OwnedDB(ownerFaction, shipEntity); //replace the ships references to the design's specific instances with shiny new specific instances ComponentInstancesDB componentInstances = shipEntity.GetDataBlob <ComponentInstancesDB>(); var newSpecificInstances = new PrIwObsDict <Entity, PrIwObsList <Entity> >(); foreach (var kvp in componentInstances.SpecificInstances) { newSpecificInstances.Add(kvp.Key, new PrIwObsList <Entity>()); for (int i = 0; i < kvp.Value.Count; i++) { var ownerdb = ownerFaction.GetDataBlob <FactionOwnerDB>(); newSpecificInstances[kvp.Key].Add(ComponentInstanceFactory.NewInstanceFromDesignEntity(kvp.Key, ownerFaction, ownerdb, systemEntityManager)); } } componentInstances.SpecificInstances = newSpecificInstances; foreach (var componentType in shipEntity.GetDataBlob <ComponentInstancesDB>().SpecificInstances) { int numComponents = componentType.Value.Count; componentType.Value.Clear(); for (int i = 0; i < numComponents; i++) { EntityManipulation.AddComponentToEntity(shipEntity, componentType.Key); } foreach (var componentInstance in componentType.Value) { // Set the parent/owning Entity to the shipEntity AttributeToAbilityMap.AddAbility(shipEntity, componentType.Key, componentInstance); //TODO: do this somewhere else, recalcprocessor maybe? if (componentInstance.HasDataBlob <SensorReceverAtbDB>()) { var sensor = componentInstance.GetDataBlob <SensorReceverAtbDB>(); DateTime nextDatetime = shipEntity.Manager.ManagerSubpulses.SystemLocalDateTime + TimeSpan.FromSeconds(sensor.ScanTime); shipEntity.Manager.ManagerSubpulses.AddEntityInterupt(nextDatetime, new SensorScan().TypeName, componentInstance); } } } ReCalcProcessor.ReCalcAbilities(shipEntity); return(shipEntity); }
public static void OnTakingDamage(Entity ship, int damageAmount) { //TODO do some damage to a component. ReCalcProcessor.ReCalcAbilities(ship); }
public static Entity CreateShip(Entity classEntity, EntityManager systemEntityManager, Entity ownerFaction, Vector4 pos, StarSystem starsys, string shipName = null) { // @todo replace ownerFaction with formationDB later. Now ownerFaction used just to add name // @todo: make sure each component design and component instance is unique, not duplicated ProtoEntity protoShip = classEntity.Clone(); ShipInfoDB shipInfoDB = protoShip.GetDataBlob <ShipInfoDB>(); shipInfoDB.ShipClassDefinition = classEntity.Guid; if (shipName == null) { shipName = "Ship Name"; } NameDB nameDB = new NameDB(shipName); protoShip.SetDataBlob(nameDB); var OwnedDB = new OwnedDB(ownerFaction); protoShip.SetDataBlob(OwnedDB); PositionDB position = new PositionDB(pos, starsys.Guid); protoShip.SetDataBlob(position); protoShip.SetDataBlob(new DesignInfoDB(classEntity)); Entity shipEntity = new Entity(systemEntityManager, protoShip); //replace the ships references to the design's specific instances with shiny new specific instances ComponentInstancesDB componentInstances = shipEntity.GetDataBlob <ComponentInstancesDB>(); var newSpecificInstances = new PrIwObsDict <Entity, PrIwObsList <Entity> >(); foreach (var kvp in componentInstances.SpecificInstances) { newSpecificInstances.Add(kvp.Key, new PrIwObsList <Entity>()); for (int i = 0; i < kvp.Value.Count; i++) { newSpecificInstances[kvp.Key].Add(ComponentInstanceFactory.NewInstanceFromDesignEntity(kvp.Key, ownerFaction)); } } componentInstances.SpecificInstances = newSpecificInstances; foreach (var componentType in shipEntity.GetDataBlob <ComponentInstancesDB>().SpecificInstances) { int numComponents = componentType.Value.Count; componentType.Value.Clear(); for (int i = 0; i < numComponents; i++) { EntityManipulation.AddComponentToEntity(shipEntity, componentType.Key); } foreach (var componentInstance in componentType.Value) { // Set the parent/owning Entity to the shipEntity AttributeToAbilityMap.AddAbility(shipEntity, componentType.Key, componentInstance); } } ReCalcProcessor.ReCalcAbilities(shipEntity); return(shipEntity); }