//internal void Process(Game game, List<StarSystem> systems, int deltaSeconds) //{ // if (game.CurrentDateTime - _lastRun < game.Settings.EconomyCycleTime) // { // return; // } // _lastRun = game.CurrentDateTime; // if (game.Settings.EnableMultiThreading ?? false) // { // Parallel.ForEach(systems, system => ProcessSystem(system)); // } // else // { // foreach (var system in systems) //TODO thread this // { // ProcessSystem(system); // } // } //} internal static void ProcessSystem(EntityManager manager) { Game game = manager.Game; //Action<StarSystem> economyMethod = ProcessSystem; //system.SystemSubpulses.AddSystemInterupt(system.Game.CurrentDateTime + system.Game.Settings.EconomyCycleTime, economyMethod); manager.ManagerSubpulses.AddSystemInterupt(manager.Game.CurrentDateTime + manager.Game.Settings.EconomyCycleTime, PulseActionEnum.EconProcessor); TechProcessor.ProcessSystem(manager, game); foreach (Entity colonyEntity in manager.GetAllEntitiesWithDataBlob <ColonyMinesDB>()) { MineProcessor.MineResources(colonyEntity); } foreach (Entity colonyEntity in manager.GetAllEntitiesWithDataBlob <ColonyRefiningDB>()) { RefiningProcessor.RefineMaterials(colonyEntity, game); } foreach (Entity colonyEntity in manager.GetAllEntitiesWithDataBlob <ColonyConstructionDB>()) { ConstructionProcessor.ConstructStuff(colonyEntity, game); } foreach (Entity colonyEntity in manager.GetAllEntitiesWithDataBlob <ColonyInfoDB>()) { PopulationProcessor.GrowPopulation(colonyEntity); } }
/// <summary> /// extra custom functinos go in here. /// </summary> /// <param name="name"></param> /// <param name="args"></param> private void NCalcPulsarFunctions(string name, FunctionArgs args) { if (name == "Ability") { int index = 0; try { index = (int)args.Parameters[0].Evaluate(); ChainedExpression result = _design.ComponentDesignAbilities[index].Formula; if (result.Result == null) { result.Evaluate(); } MakeThisDependant(result); args.Result = result.Result; } catch (InvalidCastException e) { throw new Exception("Parameter must be an intiger. " + e); } catch (IndexOutOfRangeException e) { throw new Exception("This component does not have an ComponentAbilitySD at index " + index + ". " + e); } } if (name == "SetAbilityValue") //I might remove this.. { int index = 0; try { index = (int)args.Parameters[0].Evaluate(); ChainedExpression expression = _design.ComponentDesignAbilities[index].Formula; expression.SetResult = args.Parameters[1].Evaluate(); } catch (InvalidCastException e) { throw new Exception("Parameter must be an intiger. " + e); } catch (IndexOutOfRangeException e) { throw new Exception("This component does not have an ComponentAbilitySD at index " + index + ". " + e); } } if (name == "EnumDict") { string typeAsString = (string)args.Parameters[0].Evaluate(); Type type = Type.GetType(typeAsString); Type dictType = typeof(Dictionary <,>).MakeGenericType(type, typeof(double)); dynamic dict = Activator.CreateInstance(dictType); Type enumDictType = typeof(Dictionary <,>).MakeGenericType(typeof(string), type); dynamic enumConstants = Activator.CreateInstance(enumDictType); foreach (dynamic value in Enum.GetValues(type)) { enumConstants.Add(Enum.GetName(type, value), value); } foreach (var kvp in _designAbility.GuidDictionary) { dynamic key = enumConstants[(string)kvp.Key]; dict.Add(key, kvp.Value.DResult); } args.Result = dict; } if (name == "TechData") { Guid techGuid = Guid.Parse((string)args.EvaluateParameters()[0]); TechSD techSD = _staticDataStore.Techs[techGuid]; args.Result = TechProcessor.DataFormula(_factionTechDB, techSD); } //Returns the tech level for the given guid if (name == "TechLevel") { Guid techGuid = Guid.Parse((string)args.EvaluateParameters()[0]); if (_factionTechDB.ResearchedTechs.ContainsKey(techGuid)) { args.Result = _factionTechDB.ResearchedTechs[techGuid]; } else { args.Result = 0; } } //currently not used, but an future experiment to pass the CargoTypeSD as a parameter if (name == "CargoType") { Guid typeGuid = Guid.Parse((string)args.EvaluateParameters()[0]); CargoTypeSD typeSD = _staticDataStore.CargoTypes[typeGuid]; args.Result = typeSD; } //used for datablob args for when a guid is required as a parameter if (name == "GuidString") { Guid typeGuid = Guid.Parse((string)args.EvaluateParameters()[0]); args.Result = typeGuid; } //This sets the DatablobArgs. it's up to the user to ensure the right number of args for a specific datablob //The datablob will be the one defined in designAbility.DataBlobType //TODO document blobs and what args they take!! if (name == "DataBlobArgs") { if (_designAbility.DataBlobType == null) { throw new Exception("This Ability does not have a DataBlob defined! define a datablob for this ability!"); } //_designAbility.DataBlobArgs = new List<double>(); List <object> argList = new List <object>(); foreach (var argParam in args.Parameters) { ChainedExpression argExpression = new ChainedExpression(argParam, _designAbility, _factionTechDB, _staticDataStore); _isDependant = false; argExpression.Evaluate(); argList.Add(argExpression.Result); } _designAbility.DataBlobArgs = argList.ToArray(); args.Result = argList; } }
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); }
/// <summary> /// takes a ComponentSD staticData and turns it into a DesignDB /// </summary> /// <param name="component">the componentSD</param> /// <param name="factionTech">this factions TechDB</param> /// <param name="staticData">the game staticData</param> /// <returns></returns> public static ComponentDesign StaticToDesign(ComponentTemplateSD component, FactionTechDB factionTech, StaticDataStore staticData) { ComponentDesign design = new ComponentDesign(); design.Name = component.Name; design.Description = component.Description; design.MassFormula = new ChainedExpression(component.MassFormula, design, factionTech, staticData); design.VolumeFormula = new ChainedExpression(component.VolumeFormula, design, factionTech, staticData); design.CrewFormula = new ChainedExpression(component.CrewReqFormula, design, factionTech, staticData); design.HTKFormula = new ChainedExpression(component.HTKFormula, design, factionTech, staticData); design.ResearchCostFormula = new ChainedExpression(component.ResearchCostFormula, design, factionTech, staticData); design.BuildCostFormula = new ChainedExpression(component.BuildPointCostFormula, design, factionTech, staticData); design.MineralCostFormulas = new Dictionary <Guid, ChainedExpression>(); design.CreditCostFormula = new ChainedExpression(component.CreditCostFormula, design, factionTech, staticData); design.ComponentMountType = component.MountType; design.ConstructionType = component.ConstructionType; design.CargoTypeID = component.CargoTypeID; foreach (var kvp in component.MineralCostFormula) { design.MineralCostFormulas.Add(kvp.Key, new ChainedExpression(kvp.Value, design, factionTech, staticData)); } design.ComponentDesignAbilities = new List <ComponentDesignAbility>(); foreach (var abilitySD in component.ComponentAbilitySDs) { ComponentDesignAbility designAbility = new ComponentDesignAbility(design); designAbility.Name = abilitySD.Name; designAbility.Description = abilitySD.Description; designAbility.GuiHint = abilitySD.GuiHint; if (abilitySD.AbilityFormula != null) { designAbility.Formula = new ChainedExpression(abilitySD.AbilityFormula, designAbility, factionTech, staticData); } if (abilitySD.GuidDictionary != null) { designAbility.GuidDictionary = new Dictionary <object, ChainedExpression>(); if (designAbility.GuiHint == GuiHint.GuiTechSelectionList) { foreach (var kvp in abilitySD.GuidDictionary) { if (factionTech.ResearchedTechs.ContainsKey(Guid.Parse(kvp.Key.ToString()))) { TechSD techSD = staticData.Techs[Guid.Parse(kvp.Key.ToString())]; designAbility.GuidDictionary.Add(kvp.Key, new ChainedExpression(TechProcessor.DataFormula(factionTech, techSD).ToString(), designAbility, factionTech, staticData)); } } } else { foreach (var kvp in abilitySD.GuidDictionary) { designAbility.GuidDictionary.Add(kvp.Key, new ChainedExpression(kvp.Value, designAbility, factionTech, staticData)); } } } if (designAbility.GuiHint == GuiHint.GuiSelectionMaxMin) { designAbility.MaxValueFormula = new ChainedExpression(abilitySD.MaxFormula, designAbility, factionTech, staticData); designAbility.MinValueFormula = new ChainedExpression(abilitySD.MinFormula, designAbility, factionTech, staticData); designAbility.StepValueFormula = new ChainedExpression(abilitySD.StepFormula, designAbility, factionTech, staticData); } if (abilitySD.AbilityDataBlobType != null) { designAbility.DataBlobType = Type.GetType(abilitySD.AbilityDataBlobType); } design.ComponentDesignAbilities.Add(designAbility); } design.MassFormula.Evaluate(); design.SetCrew(); design.SetHTK(); design.SetResearchCost(); design.SetBuildCost(); design.SetMineralCosts(); return(design); }