/// <summary> /// This is for adding components and installations to ships and colonies. /// batch add is faster than single add as it recalcs only once. /// </summary> /// <param name="parentEntity">entity that contains an ComponentInstancesDB</param> /// <param name="componentEntitys">Can be either a design or instance entity</param> internal static void AddComponentToEntity(Entity parentEntity, List <Entity> componentEntitys, Entity faction, FactionOwnerDB owner) { Entity instance; foreach (var componentEntity in componentEntitys) { if (parentEntity.HasDataBlob <ComponentInstancesDB>()) { if (!componentEntity.HasDataBlob <ComponentInstanceInfoDB>()) { if (componentEntity.HasDataBlob <ComponentInfoDB>()) { instance = ComponentInstanceFactory.NewInstanceFromDesignEntity(componentEntity, faction, owner, parentEntity.Manager); } 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); }
private static void BatchJobItemComplete(Entity colonyEntity, CargoStorageDB storage, ConstructionJob batchJob, ComponentDesign designInfo) { var colonyConstruction = colonyEntity.GetDataBlob <ConstructionDB>(); batchJob.NumberCompleted++; batchJob.ProductionPointsLeft = designInfo.BuildPointCost; batchJob.MineralsRequired = designInfo.MineralCosts; batchJob.MineralsRequired = designInfo.MaterialCosts; batchJob.MineralsRequired = designInfo.ComponentCosts; ComponentInstance specificComponent = new ComponentInstance(designInfo); if (batchJob.InstallOn != null) { if (batchJob.InstallOn == colonyEntity || StorageSpaceProcessor.HasEntity(storage, colonyEntity.GetDataBlob <CargoAbleTypeDB>())) { EntityManipulation.AddComponentToEntity(batchJob.InstallOn, specificComponent); ReCalcProcessor.ReCalcAbilities(batchJob.InstallOn); } } else { StorageSpaceProcessor.AddCargo(storage, specificComponent, 1); } if (batchJob.NumberCompleted == batchJob.NumberOrdered) { colonyConstruction.JobBatchList.Remove(batchJob); if (batchJob.Auto) { colonyConstruction.JobBatchList.Add(batchJob); } } }
private static void BatchJobItemComplete(Entity colonyEntity, CargoStorageDB storage, ConstructionJob batchJob, ComponentInfoDB designInfo) { var colonyConstruction = colonyEntity.GetDataBlob <ColonyConstructionDB>(); batchJob.NumberCompleted++; batchJob.PointsLeft = designInfo.BuildPointCost; batchJob.MineralsRequired = designInfo.MinerialCosts; batchJob.MineralsRequired = designInfo.MaterialCosts; batchJob.MineralsRequired = designInfo.ComponentCosts; var factionInfo = colonyEntity.GetDataBlob <OwnedDB>().ObjectOwner.GetDataBlob <FactionInfoDB>(); Entity designEntity = factionInfo.ComponentDesigns[batchJob.ItemGuid]; Entity specificComponent = ComponentInstanceFactory.NewInstanceFromDesignEntity(designEntity, colonyEntity.GetDataBlob <OwnedDB>().ObjectOwner); if (batchJob.InstallOn != null) { if (batchJob.InstallOn == colonyEntity || StorageSpaceProcessor.HasEntity(storage, colonyEntity)) { EntityManipulation.AddComponentToEntity(batchJob.InstallOn, specificComponent); ReCalcProcessor.ReCalcAbilities(batchJob.InstallOn); } } else { StorageSpaceProcessor.AddItemToCargo(storage, specificComponent); } if (batchJob.NumberCompleted == batchJob.NumberOrdered) { colonyConstruction.JobBatchList.Remove(batchJob); if (batchJob.Auto) { colonyConstruction.JobBatchList.Add(batchJob); } } }
internal static void AddComponentToEntity(Entity parentEntity, List <ComponentInstance> instances) { foreach (var instance in instances) { AddComponentToEntity(parentEntity, instance); } ReCalcProcessor.ReCalcAbilities(parentEntity); }
internal static void AddComponentToEntity(Entity parentEntity, List <ComponentDesign> componentDesign) { if (parentEntity.HasDataBlob <ComponentInstancesDB>()) { foreach (var cd in componentDesign) { ComponentInstance instance = new ComponentInstance(cd); AddComponentInstanceToEntity(parentEntity, instance); } ReCalcProcessor.ReCalcAbilities(parentEntity); } else { throw new Exception("parentEntiy does not contain a ComponentInstanceDB"); } }
internal static void AddComponentToEntity(Entity parentEntity, ComponentDesign componentDesign, int count = 1) { ComponentInstance instance; if (parentEntity.HasDataBlob <ComponentInstancesDB>()) { for (int i = 0; i < count; i++) { instance = new ComponentInstance(componentDesign); AddComponentInstanceToEntity(parentEntity, instance); } } else { throw new Exception("parentEntiy does not contain a ComponentInstanceDB"); } ReCalcProcessor.ReCalcAbilities(parentEntity); }
/// <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 ownerFaction, FactionOwnerDB ownerDB) { Entity instance; if (parentEntity.HasDataBlob <ComponentInstancesDB>()) { if (!componentEntity.HasDataBlob <ComponentInstanceInfoDB>()) { if (componentEntity.HasDataBlob <ComponentInfoDB>()) { instance = ComponentInstanceFactory.NewInstanceFromDesignEntity(componentEntity, ownerFaction, ownerDB, parentEntity.Manager); } 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"); } ObjectOwnershipDB parentOwner; if (!parentEntity.HasDataBlob <ObjectOwnershipDB>()) { //StarSystem starSys = parentEntity.GetDataBlob<PositionDB>().SystemGuid parentOwner = new ObjectOwnershipDB(); parentEntity.SetDataBlob(parentOwner); } else { parentOwner = parentEntity.GetDataBlob <ObjectOwnershipDB>(); } parentOwner.Children.Add(instance); ReCalcProcessor.ReCalcAbilities(parentEntity); }
/// <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); }
// this code is a test for multiple systems, worth mentioning it utterly failed, modularity is good when you have it huh.ç //TODO: try further tests at smaller distances between systems, create own starSystemFactory function for testing. private static Entity completeTest(Game game, string name) { var log = StaticRefLib.EventLog; StarSystemFactory starfac = new StarSystemFactory(game); StarSystem solSys = starfac.CreateSol(game); //sol.ManagerSubpulses.Init(sol); Entity earth = solSys.Entities[3]; //should be fourth entity created //Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); Entity factionEntity = FactionFactory.CreateFaction(game, name); Entity speciesEntity = SpeciesFactory.CreateSpeciesHuman(factionEntity, game.GlobalManager); /* * GalaxyFactory GalaxyGen = game.GalaxyGen; * SystemBodyFactory _systemBodyFactory = new SystemBodyFactory(GalaxyGen); * * SystemBodyInfoDB halleysBodyDB = new SystemBodyInfoDB { BodyType = BodyType.Comet, SupportsPopulations = false, Albedo = 0.04f }; //Albedo = 0.04f * MassVolumeDB halleysMVDB = MassVolumeDB.NewFromMassAndRadius_AU(2.2e14, Distance.KmToAU(11)); * NameDB halleysNameDB = new NameDB("testName"); * double halleysSemiMajAxis = 17.834; //AU * double halleysEccentricity = 0.96714; * double halleysInclination = 180; //162.26° note retrograde orbit. * double halleysLoAN = 58.42; //° * double halleysAoP = 111.33;//° * double halleysMeanAnomaly = 38.38;//° * OrbitDB halleysOrbitDB = OrbitDB.FromAsteroidFormat(solSys.Entities[0], solSys.Entities[0].GetDataBlob<MassVolumeDB>().Mass, halleysMVDB.Mass, halleysSemiMajAxis, halleysEccentricity, halleysInclination, halleysLoAN, halleysAoP, halleysMeanAnomaly, new System.DateTime(1994, 2, 17)); * PositionDB halleysPositionDB = new PositionDB(0,0,0, solSys.ID, solSys.Entities[0]); // + earthPositionDB.AbsolutePosition_AU, sol.ID); * SensorProfileDB sensorProfile = new SensorProfileDB(); * Entity halleysComet = new Entity(solSys, new List<BaseDataBlob> { halleysPositionDB, halleysNameDB }); * //_systemBodyFactory.MineralGeneration(game.StaticData, solSys, halleysComet); * SensorProcessorTools.PlanetEmmisionSig(sensorProfile, halleysBodyDB, halleysMVDB);*/ var namedEntites = solSys.GetAllEntitiesWithDataBlob <NameDB>(); foreach (var entity in namedEntites) { var nameDB = entity.GetDataBlob <NameDB>(); nameDB.SetName(factionEntity.Guid, nameDB.DefaultName); } //once per game init stuff DefaultThrusterDesign(game, factionEntity); DefaultWarpDesign(game, factionEntity); DefaultFuelTank(game, factionEntity); DefaultCargoInstalation(game, factionEntity); DefaultSimpleLaser(game, factionEntity); DefaultBFC(game, factionEntity); ShipDefaultCargoHold(game, factionEntity); ShipSmallCargo(game, factionEntity); ShipPassiveSensor(game, factionEntity); FacPassiveSensor(game, factionEntity); DefaultFisionReactor(game, factionEntity); DefaultBatteryBank(game, factionEntity); DefaultFragPayload(game, factionEntity); DefaultMissileSRB(game, factionEntity); DefaultMissileSensors(game, factionEntity); Entity colonyEntity = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth); EntityManipulation.AddComponentToEntity(colonyEntity, _sensorInstalation); ReCalcProcessor.ReCalcAbilities(colonyEntity); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(solSys.Guid); factionEntity.GetDataBlob <NameDB>().SetName(factionEntity.Guid, "UEF"); var entitiesWithSensors = solSys.GetAllEntitiesWithDataBlob <SensorAbilityDB>(); foreach (var entityItem in entitiesWithSensors) { StaticRefLib.ProcessorManager.GetInstanceProcessor(nameof(SensorScan)).ProcessEntity(entityItem, StaticRefLib.CurrentDateTime); } StarSystemFactory starfac2 = new StarSystemFactory(game); StarSystem solSys2 = starfac2.CreateTestSystem(game); solSys2.NameDB = new NameDB("other system"); Entity solStar = solSys2.Entities[0]; Entity earth2 = solSys2.Entities[1]; //sol.ManagerSubpulses.Init(sol); //Entity earth2 = solSys2.Entities[3]; //should be fourth entity created //Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); var namedEntites2 = solSys2.GetAllEntitiesWithDataBlob <NameDB>(); foreach (var entity in namedEntites2) { var nameDB = entity.GetDataBlob <NameDB>(); nameDB.SetName(factionEntity.Guid, nameDB.DefaultName); } Entity colonyEntity2 = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth2); EntityManipulation.AddComponentToEntity(colonyEntity2, _sensorInstalation); ReCalcProcessor.ReCalcAbilities(colonyEntity2); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(solSys2.Guid); var entitiesWithSensors2 = solSys2.GetAllEntitiesWithDataBlob <SensorAbilityDB>(); foreach (var entityItem in entitiesWithSensors2) { StaticRefLib.ProcessorManager.GetInstanceProcessor(nameof(SensorScan)).ProcessEntity(entityItem, StaticRefLib.CurrentDateTime); } var JPSurveyPoint1 = solSys.GetAllEntitiesWithDataBlob <JPSurveyableDB>()[0]; JPSurveyPoint1.GetDataBlob <JPSurveyableDB>().SystemToGuid = solSys2.Guid; var JPSurveyPoint2 = solSys2.GetAllEntitiesWithDataBlob <JPSurveyableDB>()[0]; JPSurveyPoint2.GetDataBlob <JPSurveyableDB>().SystemToGuid = solSys.Guid; JPSurveyPoint1.GetDataBlob <JPSurveyableDB>().JumpPointTo = JPSurveyPoint2; JPSurveyPoint2.GetDataBlob <JPSurveyableDB>().JumpPointTo = JPSurveyPoint1; return(factionEntity); }
public static Entity DefaultHumans(Game game, string name) { StarSystemFactory starfac = new StarSystemFactory(game); StarSystem solSys = starfac.CreateSol(game); //sol.ManagerSubpulses.Init(sol); Entity solStar = solSys.Entities[0]; Entity earth = solSys.Entities[3]; //should be fourth entity created //Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); Entity factionEntity = FactionFactory.CreateFaction(game, name); Entity speciesEntity = SpeciesFactory.CreateSpeciesHuman(factionEntity, game.GlobalManager); var namedEntites = solSys.GetAllEntitiesWithDataBlob <NameDB>(); foreach (var entity in namedEntites) { var nameDB = entity.GetDataBlob <NameDB>(); nameDB.SetName(factionEntity.Guid, nameDB.DefaultName); } Entity colonyEntity = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth); Entity marsColony = ColonyFactory.CreateColony(factionEntity, speciesEntity, NameLookup.GetFirstEntityWithName(solSys, "Mars")); 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(marsColony, cargoInstalation); Entity colonySensor = FacPassiveSensor(game, factionEntity); EntityManipulation.AddComponentToEntity(colonyEntity, colonySensor); ReCalcProcessor.ReCalcAbilities(colonyEntity); colonyEntity.GetDataBlob <ColonyInfoDB>().Population[speciesEntity] = 9000000000; var rawSorium = NameLookup.GetMineralSD(game, "Sorium"); StorageSpaceProcessor.AddCargo(colonyEntity.GetDataBlob <CargoStorageDB>(), rawSorium, 5000); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(solSys.Guid); //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.Guid, "UEF"); // Todo: handle this in CreateShip Entity shipClass = DefaultShipDesign(game, factionEntity); Entity gunShipClass = GunShipDesign(game, factionEntity); Entity ship1 = ShipFactory.CreateShip(shipClass, solSys, factionEntity, earth, solSys, "Serial Peacemaker"); Entity ship2 = ShipFactory.CreateShip(shipClass, solSys, factionEntity, earth, solSys, "Ensuing Calm"); Entity ship3 = ShipFactory.CreateShip(shipClass, solSys, factionEntity, earth, solSys, "Touch-and-Go"); var fuel = NameLookup.GetMaterialSD(game, "Sorium Fuel"); StorageSpaceProcessor.AddCargo(ship1.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); StorageSpaceProcessor.AddCargo(ship2.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); StorageSpaceProcessor.AddCargo(ship3.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); double test_a = 0.5; //AU double test_e = 0; double test_i = 0; //° double test_loan = 0; //° double test_aop = 0; //° double test_M0 = 0; //° double test_bodyMass = ship2.GetDataBlob <MassVolumeDB>().Mass; OrbitDB testOrbtdb_ship2 = OrbitDB.FromAsteroidFormat(solStar, solStar.GetDataBlob <MassVolumeDB>().Mass, test_bodyMass, test_a, test_e, test_i, test_loan, test_aop, test_M0, StaticRefLib.CurrentDateTime); ship2.RemoveDataBlob <OrbitDB>(); ship2.SetDataBlob(testOrbtdb_ship2); ship2.GetDataBlob <PositionDB>().SetParent(solStar); StaticRefLib.ProcessorManager.RunProcessOnEntity <OrbitDB>(ship2, 0); test_a = 0.51; test_i = 180; test_aop = 0; OrbitDB testOrbtdb_ship3 = OrbitDB.FromAsteroidFormat(solStar, solStar.GetDataBlob <MassVolumeDB>().Mass, test_bodyMass, test_a, test_e, test_i, test_loan, test_aop, test_M0, StaticRefLib.CurrentDateTime); ship3.RemoveDataBlob <OrbitDB>(); ship3.SetDataBlob(testOrbtdb_ship3); ship3.GetDataBlob <PositionDB>().SetParent(solStar); StaticRefLib.ProcessorManager.RunProcessOnEntity <OrbitDB>(ship3, 0); Entity gunShip = ShipFactory.CreateShip(gunShipClass, solSys, factionEntity, earth, solSys, "Prevailing Stillness"); gunShip.GetDataBlob <PositionDB>().RelativePosition_AU = new Vector3(8.52699302490434E-05, 0, 0); StorageSpaceProcessor.AddCargo(gunShipClass.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); //give the gunship a hypobolic orbit to test: var velInAU = Distance.KmToAU(25); //var orbit = OrbitDB.FromVector(earth, gunShip, new Vector4(0, velInAU, 0, 0), game.CurrentDateTime); gunShip.RemoveDataBlob <OrbitDB>(); var nmdb = new NewtonMoveDB(earth) { CurrentVector_kms = new Vector3(0, -10.0, 0) }; gunShip.SetDataBlob <NewtonMoveDB>(nmdb); Entity courier = ShipFactory.CreateShip(CargoShipDesign(game, factionEntity), solSys, factionEntity, earth, solSys, "Planet Express Ship"); StorageSpaceProcessor.AddCargo(courier.GetDataBlob <CargoStorageDB>(), fuel, 200000000000); solSys.SetDataBlob(ship1.ID, new TransitableDB()); solSys.SetDataBlob(ship2.ID, new TransitableDB()); solSys.SetDataBlob(gunShip.ID, new TransitableDB()); solSys.SetDataBlob(courier.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.CreateAsteroid2(sol, earth, game.CurrentDateTime + TimeSpan.FromDays(365)); Entity rock = AsteroidFactory.CreateAsteroid3(solSys, earth, StaticRefLib.CurrentDateTime + TimeSpan.FromDays(365)); var entitiesWithSensors = solSys.GetAllEntitiesWithDataBlob <SensorReceverAtbDB>(); foreach (var entityItem in entitiesWithSensors) { if (entityItem.GetDataBlob <ComponentInstanceInfoDB>().ParentEntity != null) //don't do the designs, just the actual physical entity components. { StaticRefLib.ProcessorManager.GetInstanceProcessor(nameof(SensorScan)).ProcessEntity(entityItem, StaticRefLib.CurrentDateTime); } } return(factionEntity); }
public static void OnTakingDamage(Entity ship, int damageAmount) { //TODO do some damage to a component. ReCalcProcessor.ReCalcAbilities(ship); }
public static Entity DefaultHumans(Game game, string name) { //USE THIS TO TEST CODE //TESTING STUFFF //return completeTest(game, name); // while(true){ //} //TESTING STUFF var log = StaticRefLib.EventLog; StarSystemFactory starfac = new StarSystemFactory(game); StarSystem solSys = starfac.CreateSol(game); //sol.ManagerSubpulses.Init(sol); Entity solStar = solSys.Entities[0]; Entity earth = solSys.Entities[3]; //should be fourth entity created //Entity factionEntity = FactionFactory.CreatePlayerFaction(game, owner, name); Entity factionEntity = FactionFactory.CreateFaction(game, name); Entity speciesEntity = SpeciesFactory.CreateSpeciesHuman(factionEntity, game.GlobalManager); Entity targetFaction = FactionFactory.CreateFaction(game, "OpFor"); var namedEntites = solSys.GetAllEntitiesWithDataBlob <NameDB>(); foreach (var entity in namedEntites) { var nameDB = entity.GetDataBlob <NameDB>(); nameDB.SetName(factionEntity.Guid, nameDB.DefaultName); } Entity colonyEntity = ColonyFactory.CreateColony(factionEntity, speciesEntity, earth); Entity marsColony = ColonyFactory.CreateColony(factionEntity, speciesEntity, NameLookup.GetFirstEntityWithName(solSys, "Mars")); ComponentTemplateSD mineSD = game.StaticData.ComponentTemplates[new Guid("f7084155-04c3-49e8-bf43-c7ef4befa550")]; ComponentDesigner mineDesigner = new ComponentDesigner(mineSD, factionEntity.GetDataBlob <FactionTechDB>()); ComponentDesign mineDesign = mineDesigner.CreateDesign(factionEntity); ComponentTemplateSD RefinerySD = game.StaticData.ComponentTemplates[new Guid("90592586-0BD6-4885-8526-7181E08556B5")]; ComponentDesigner refineryDesigner = new ComponentDesigner(RefinerySD, factionEntity.GetDataBlob <FactionTechDB>()); ComponentDesign refinaryDesign = refineryDesigner.CreateDesign(factionEntity); ComponentTemplateSD labSD = game.StaticData.ComponentTemplates[new Guid("c203b7cf-8b41-4664-8291-d20dfe1119ec")]; ComponentDesigner labDesigner = new ComponentDesigner(labSD, factionEntity.GetDataBlob <FactionTechDB>()); ComponentDesign labEntity = labDesigner.CreateDesign(factionEntity); ComponentTemplateSD facSD = game.StaticData.ComponentTemplates[new Guid("{07817639-E0C6-43CD-B3DC-24ED15EFB4BA}")]; ComponentDesigner facDesigner = new ComponentDesigner(facSD, factionEntity.GetDataBlob <FactionTechDB>()); ComponentDesign facEntity = facDesigner.CreateDesign(factionEntity); Scientist scientistEntity = CommanderFactory.CreateScientist(factionEntity, colonyEntity); colonyEntity.GetDataBlob <TeamsHousedDB>().AddTeam(scientistEntity); FactionTechDB factionTech = factionEntity.GetDataBlob <FactionTechDB>(); //TechProcessor.ApplyTech(factionTech, game.StaticData.Techs[new ID("35608fe6-0d65-4a5f-b452-78a3e5e6ce2c")]); //add conventional engine for testing. ResearchProcessor.CheckRequrements(factionTech); DefaultThrusterDesign(game, factionEntity); F1ThrusterDesign(game, factionEntity); RaptorThrusterDesign(game, factionEntity); RS25ThrusterDesign(game, factionEntity); DefaultWarpDesign(game, factionEntity); DefaultFuelTank(game, factionEntity); LargeFuelTank(game, factionEntity); DefaultCargoInstalation(game, factionEntity); DefaultSimpleLaser(game, factionEntity); DefaultBFC(game, factionEntity); ShipDefaultCargoHold(game, factionEntity); ShipSmallCargo(game, factionEntity); ShipPassiveSensor(game, factionEntity); FacPassiveSensor(game, factionEntity); DefaultFisionReactor(game, factionEntity); DefaultBatteryBank(game, factionEntity); DefaultFragPayload(game, factionEntity); DefaultMissileSRB(game, factionEntity); DefaultMissileSensors(game, factionEntity); DefaultMissileTube(game, factionEntity); MissileDesign250(game, factionEntity); ShipSmallOrdnanceStore(game, factionEntity); EntityManipulation.AddComponentToEntity(colonyEntity, mineDesign); EntityManipulation.AddComponentToEntity(colonyEntity, refinaryDesign); EntityManipulation.AddComponentToEntity(colonyEntity, labEntity); EntityManipulation.AddComponentToEntity(colonyEntity, facEntity); EntityManipulation.AddComponentToEntity(colonyEntity, _fuelTank_1000); EntityManipulation.AddComponentToEntity(colonyEntity, _cargoInstalation); EntityManipulation.AddComponentToEntity(marsColony, _cargoInstalation); EntityManipulation.AddComponentToEntity(colonyEntity, _sensorInstalation); EntityManipulation.AddComponentToEntity(colonyEntity, ShipYard(factionEntity)); EntityManipulation.AddComponentToEntity(colonyEntity, _ordnanceStore, 10); ReCalcProcessor.ReCalcAbilities(colonyEntity); var earthCargo = colonyEntity.GetDataBlob <VolumeStorageDB>(); colonyEntity.GetDataBlob <ColonyInfoDB>().Population[speciesEntity] = 9000000000; var rawSorium = NameLookup.GetMineralSD(game, "Sorium"); var iron = NameLookup.GetMineralSD(game, "Iron"); colonyEntity.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByMass(iron, 5000); var hydrocarbon = NameLookup.GetMineralSD(game, "Hydrocarbons"); colonyEntity.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByMass(hydrocarbon, 5000); var stainless = NameLookup.GetMaterialSD(game, "Stainless Steel"); colonyEntity.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByMass(iron, 1000); colonyEntity.GetDataBlob <VolumeStorageDB>().AddCargoByUnit(_missile, 100); colonyEntity.GetDataBlob <VolumeStorageDB>().AddCargoByUnit(_merlin, 5); factionEntity.GetDataBlob <FactionInfoDB>().KnownSystems.Add(solSys.Guid); //test systems //factionEntity.GetDataBlob<FactionInfoDB>().KnownSystems.Add(starfac.CreateEccTest(game).ID); //factionEntity.GetDataBlob<FactionInfoDB>().KnownSystems.Add(starfac.CreateLongitudeTest(game).ID); factionEntity.GetDataBlob <NameDB>().SetName(factionEntity.Guid, "UEF"); // Todo: handle this in CreateShip ShipDesign shipDesign = DefaultShipDesign(game, factionEntity); ShipDesign gunShipDesign = GunShipDesign(game, factionEntity); Entity gunShip0 = ShipFactory.CreateShip(gunShipDesign, factionEntity, earth, solSys, "Serial Peacemaker"); Entity ship2 = ShipFactory.CreateShip(shipDesign, factionEntity, earth, solSys, "Ensuing Calm"); Entity ship3 = ShipFactory.CreateShip(shipDesign, factionEntity, earth, solSys, "Touch-and-Go"); Entity gunShip1 = ShipFactory.CreateShip(gunShipDesign, factionEntity, earth, solSys, "Prevailing Stillness"); Entity courier = ShipFactory.CreateShip(CargoShipDesign(game, factionEntity), factionEntity, earth, solSys, "Planet Express Ship"); Entity starship = ShipFactory.CreateShip(SpaceXStarShip(game, factionEntity), factionEntity, earth, solSys, "SN10"); var fuel = NameLookup.GetMaterialSD(game, "Sorium Fuel"); var rp1 = NameLookup.GetMaterialSD(game, "LOX/Hydrocarbon"); var methalox = NameLookup.GetMaterialSD(game, "Methalox"); var hydrolox = NameLookup.GetMaterialSD(game, "Hydrolox"); earthCargo.AddCargoByUnit(rp1, 10000); earthCargo.AddCargoByUnit(methalox, 10000); earthCargo.AddCargoByUnit(hydrolox, 10000); gunShip0.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 2000); gunShip1.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 2000); ship2.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 2000); ship3.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 2000); var count = courier.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(hydrolox, 50000); starship.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByMass(methalox, 1200000); gunShip0.GetDataBlob <VolumeStorageDB>().AddCargoByUnit(MissileDesign250(game, factionEntity), 20); gunShip1.GetDataBlob <VolumeStorageDB>().AddCargoByUnit(MissileDesign250(game, factionEntity), 20); var elec = NameLookup.GetMaterialSD(game, "Electrical Energy"); gunShip0.GetDataBlob <EnergyGenAbilityDB>().EnergyStored[elec.ID] = 2750; ship2.GetDataBlob <EnergyGenAbilityDB>().EnergyStored[elec.ID] = 2750; ship3.GetDataBlob <EnergyGenAbilityDB>().EnergyStored[elec.ID] = 2750; gunShip1.GetDataBlob <EnergyGenAbilityDB>().EnergyStored[elec.ID] = 2750; courier.GetDataBlob <EnergyGenAbilityDB>().EnergyStored[elec.ID] = 2750; Entity targetDrone0 = ShipFactory.CreateShip(TargetDrone(game, targetFaction), targetFaction, earth, (10 * Math.PI / 180), "Target Drone0"); Entity targetDrone1 = ShipFactory.CreateShip(TargetDrone(game, targetFaction), targetFaction, earth, (22.5 * Math.PI / 180), "Target Drone1"); Entity targetDrone2 = ShipFactory.CreateShip(TargetDrone(game, targetFaction), targetFaction, earth, (45 * Math.PI / 180), "Target Drone2"); targetDrone0.GetDataBlob <NameDB>().SetName(factionEntity.Guid, "TargetDrone0"); targetDrone1.GetDataBlob <NameDB>().SetName(factionEntity.Guid, "TargetDrone1"); targetDrone2.GetDataBlob <NameDB>().SetName(factionEntity.Guid, "TargetDrone2"); targetDrone1.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 1000); targetDrone2.GetDataBlob <VolumeStorageDB>().AddRemoveCargoByVolume(rp1, 1000); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(gunShip0); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(ship2); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(ship3); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(gunShip1); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(courier); NewtonionMovementProcessor.UpdateNewtonThrustAbilityDB(starship); double test_a = 0.5; //AU double test_e = 0; double test_i = 0; //° double test_loan = 0; //° double test_aop = 0; //° double test_M0 = 0; //° double test_bodyMass = ship2.GetDataBlob <MassVolumeDB>().MassDry; OrbitDB testOrbtdb_ship2 = OrbitDB.FromAsteroidFormat(solStar, solStar.GetDataBlob <MassVolumeDB>().MassDry, test_bodyMass, test_a, test_e, test_i, test_loan, test_aop, test_M0, StaticRefLib.CurrentDateTime); ship2.RemoveDataBlob <OrbitDB>(); ship2.SetDataBlob(testOrbtdb_ship2); ship2.GetDataBlob <PositionDB>().SetParent(solStar); StaticRefLib.ProcessorManager.RunProcessOnEntity <OrbitDB>(ship2, 0); test_a = 0.51; test_i = 180; test_aop = 0; OrbitDB testOrbtdb_ship3 = OrbitDB.FromAsteroidFormat(solStar, solStar.GetDataBlob <MassVolumeDB>().MassDry, test_bodyMass, test_a, test_e, test_i, test_loan, test_aop, test_M0, StaticRefLib.CurrentDateTime); ship3.RemoveDataBlob <OrbitDB>(); ship3.SetDataBlob(testOrbtdb_ship3); ship3.GetDataBlob <PositionDB>().SetParent(solStar); StaticRefLib.ProcessorManager.RunProcessOnEntity <OrbitDB>(ship3, 0); gunShip1.GetDataBlob <PositionDB>().RelativePosition_AU = new Vector3(8.52699302490434E-05, 0, 0); //give the gunship a hypobolic orbit to test: //var orbit = OrbitDB.FromVector(earth, gunShip, new Vector4(0, velInAU, 0, 0), game.CurrentDateTime); gunShip1.RemoveDataBlob <OrbitDB>(); var nmdb = new NewtonMoveDB(earth, new Vector3(0, -10000.0, 0)); gunShip1.SetDataBlob <NewtonMoveDB>(nmdb); solSys.SetDataBlob(gunShip0.ID, new TransitableDB()); solSys.SetDataBlob(ship2.ID, new TransitableDB()); solSys.SetDataBlob(gunShip1.ID, new TransitableDB()); solSys.SetDataBlob(courier.ID, new TransitableDB()); //Entity ship = ShipFactory.CreateShip(shipDesign, sol.SystemManager, factionEntity, position, sol, "Serial Peacemaker"); //ship.SetDataBlob(earth.GetDataBlob<PositionDB>()); //first ship reference PositionDB //Entity ship3 = ShipFactory.CreateShip(shipDesign, 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.CreateAsteroid2(sol, earth, game.CurrentDateTime + TimeSpan.FromDays(365)); Entity rock = AsteroidFactory.CreateAsteroid(solSys, earth, StaticRefLib.CurrentDateTime + TimeSpan.FromDays(365)); var pow = solSys.GetAllEntitiesWithDataBlob <EnergyGenAbilityDB>(); foreach (var entityItem in pow) { StaticRefLib.ProcessorManager.GetInstanceProcessor(nameof(EnergyGenProcessor)).ProcessEntity(entityItem, StaticRefLib.CurrentDateTime); } var entitiesWithSensors = solSys.GetAllEntitiesWithDataBlob <SensorAbilityDB>(); foreach (var entityItem in entitiesWithSensors) { StaticRefLib.ProcessorManager.GetInstanceProcessor(nameof(SensorScan)).ProcessEntity(entityItem, StaticRefLib.CurrentDateTime); } 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 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 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); }
internal static void AddComponentToEntity(Entity parentEntity, ComponentInstance componentInstace) { AddComponentInstanceToEntity(parentEntity, componentInstace); ReCalcProcessor.ReCalcAbilities(parentEntity); }
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); }
/// <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); } }