public FactionAbilitiesDB(FactionAbilitiesDB db) { AbilityBonuses = new Dictionary <AbilityType, float>(db.AbilityBonuses); BasePlanetarySensorStrength = db.BasePlanetarySensorStrength; BaseGroundUnitStrengthBonus = db.BaseGroundUnitStrengthBonus; ColonyCostMultiplier = db.ColonyCostMultiplier; }
/// <summary> /// adds research points to a scientists project. /// </summary> /// <param name="entity"></param> /// <param name="factionAbilities"></param> /// <param name="factionTechs"></param> internal void DoResearch(Entity entity) { Entity faction; entity.Manager.FindEntityByGuid(entity.FactionOwner, out faction); FactionAbilitiesDB factionAbilities = faction.GetDataBlob <FactionAbilitiesDB>(); FactionTechDB factionTechs = faction.GetDataBlob <FactionTechDB>(); Dictionary <Entity, int> labs = new Dictionary <Entity, int>(); //TODO: why am I doing this here instead of as a recalc. //foreach (var lab in entity.GetDataBlob<ComponentInstancesDB>().ComponentsByDesign.Keys.Where(inst => inst.HasDataBlob<ResearchPointsAtbDB>())) //{ // int points = lab.GetDataBlob<ResearchPointsAtbDB>().PointsPerEconTick; // labs.Add(lab, points); //} foreach (var scientist in entity.GetDataBlob <ColonyInfoDB>().Scientists) { var scientistDB = scientist.GetDataBlob <ScientistDB>(); if (scientistDB.ProjectQueue.Count == 0) { continue; } //(TechSD)scientist.GetDataBlob<TeamsDB>().TeamTask; Guid projectGuid = scientist.GetDataBlob <ScientistDB>().ProjectQueue[0]; TechSD project = Techs[projectGuid];//_staticData.Techs[projectGuid]; int numProjectLabs = scientist.GetDataBlob <TeamsDB>().TeamSize; float bonus = scientist.GetDataBlob <ScientistDB>().Bonuses[project.Category]; //bonus *= BonusesForType(factionEntity, colonyEntity, InstallationAbilityType.Research); int researchmax = CostFormula(factionTechs, project); int researchPoints = 0; foreach (var kvp in labs) { while (numProjectLabs > 0) { researchPoints += kvp.Value; numProjectLabs--; } } researchPoints = (int)(researchPoints * bonus); if (factionTechs.ResearchableTechs.ContainsKey(project)) { factionTechs.ResearchableTechs[project] += researchPoints; if (factionTechs.ResearchableTechs[project] >= researchmax) { ApplyTech(factionTechs, project); //apply effects from tech, and add it to researched techs scientist.GetDataBlob <TeamsDB>().TeamTask = null; //team task is now nothing. } } } }
/// <summary> /// adds research points to a scientists project. /// </summary> /// <param name="colonyEntity"></param> /// <param name="factionAbilities"></param> /// <param name="factionTechs"></param> internal static void DoResearch(Entity colonyEntity, Game game) { var Faction = colonyEntity.GetDataBlob <OwnedDB>().ObjectOwner; FactionAbilitiesDB factionAbilities = Faction.GetDataBlob <FactionAbilitiesDB>(); FactionTechDB factionTechs = Faction.GetDataBlob <FactionTechDB>(); Dictionary <Entity, int> labs = new Dictionary <Entity, int>(); //why am I doing this here instead of as a recalc. foreach (var lab in colonyEntity.GetDataBlob <ComponentInstancesDB>().SpecificInstances.Keys.Where(inst => inst.HasDataBlob <ResearchPointsAtbDB>())) { int points = lab.GetDataBlob <ResearchPointsAtbDB>().PointsPerEconTick; labs.Add(lab, points); } int labsused = 0; foreach (var scientist in colonyEntity.GetDataBlob <ColonyInfoDB>().Scientists) { var scientistDB = scientist.GetDataBlob <ScientistDB>(); if (scientistDB.ProjectQueue.Count == 0) { continue; } //(TechSD)scientist.GetDataBlob<TeamsDB>().TeamTask; Guid projectGuid = scientist.GetDataBlob <ScientistDB>().ProjectQueue[0]; TechSD project = game.StaticData.Techs[projectGuid]; int numProjectLabs = scientist.GetDataBlob <TeamsDB>().TeamSize; float bonus = scientist.GetDataBlob <ScientistDB>().Bonuses[project.Category]; //bonus *= BonusesForType(factionEntity, colonyEntity, InstallationAbilityType.Research); int researchmax = CostFormula(factionTechs, project); int researchPoints = 0; foreach (var kvp in labs) { while (numProjectLabs > 0) { researchPoints += kvp.Value; numProjectLabs--; } } researchPoints = (int)(researchPoints * bonus); if (factionTechs.ResearchableTechs.ContainsKey(project)) { factionTechs.ResearchableTechs[project] += researchPoints; if (factionTechs.ResearchableTechs[project] >= researchmax) { ApplyTech(factionTechs, project); //apply effects from tech, and add it to researched techs scientist.GetDataBlob <TeamsDB>().TeamTask = null; //team task is now nothing. } } } }
public static Entity CreateFaction(Game game, string factionName) { var name = new NameDB(factionName); var factionDB = new FactionInfoDB(); var factionAbilitiesDB = new FactionAbilitiesDB(); var techDB = new FactionTechDB(game.StaticData.Techs.Values.ToList()); var blobs = new List <BaseDataBlob> { name, factionDB, factionAbilitiesDB, techDB }; var factionEntity = new Entity(game.GlobalManager, blobs); // Add this faction to the SM's access list. game.SpaceMaster.SetAccess(factionEntity, AccessRole.SM); return(factionEntity); }
/// <summary> /// adds research points to a scientists project. /// </summary> /// <param name="entity"></param> /// <param name="factionAbilities"></param> /// <param name="factionTechs"></param> internal void DoResearch(Entity entity) { Entity faction; entity.Manager.FindEntityByGuid(entity.FactionOwner, out faction); FactionAbilitiesDB factionAbilities = faction.GetDataBlob <FactionAbilitiesDB>(); FactionTechDB factionTechs = faction.GetDataBlob <FactionTechDB>(); EntityResearchDB entityResearch = entity.GetDataBlob <EntityResearchDB>(); //Dictionary<ComponentInstance, int> labs = entityResearch.Labs; List <(ComponentInstance lab, int pnts)> allLabs = new List <(ComponentInstance lab, int pnts)>(); if (entity.GetDataBlob <ComponentInstancesDB>().TryGetComponentsByAttribute <ResearchPointsAtbDB>(out var labs)) { foreach (var labInstance in labs) { var points = labInstance.Design.GetAttribute <ResearchPointsAtbDB>().PointsPerEconTick; allLabs.Add((labInstance, points)); } } int labIndex = 0; int maxLabs = allLabs.Count; foreach (Scientist scientist in entity.GetDataBlob <TeamsHousedDB>().TeamsByType[TeamTypes.Science]) { if (scientist.ProjectQueue.Count == 0) { continue; } Guid projectGuid = scientist.ProjectQueue[0].techID; bool cycleProject = scientist.ProjectQueue[0].cycle; if (!factionTechs.IsResearchable(projectGuid)) { scientist.ProjectQueue.RemoveAt(0); continue; } int assignedLabs = scientist.AssignedLabs; //(TechSD)scientist.GetDataBlob<TeamsDB>().TeamTask; TechSD project = factionTechs.GetResarchableTech(projectGuid).tech;//_staticData.Techs[projectGuid]; //int numProjectLabs = scientist.TeamSize; float bonus = 1; if (scientist.Bonuses.ContainsKey(project.Category)) { bonus += scientist.Bonuses[project.Category]; } //bonus *= BonusesForType(factionEntity, colonyEntity, InstallationAbilityType.Research); int researchPoints = 0; var maxIndex = Math.Max(labIndex + assignedLabs, maxLabs); //shouldn't happen unless assigned labs is more than the labs availible. for (int i = labIndex; i < maxIndex; i++) { researchPoints += allLabs[i].pnts; } researchPoints = (int)(researchPoints * bonus); if (factionTechs.IsResearchable(project.ID)) { int currentLvl = factionTechs.GetLevelforTech(project); factionTechs.AddPoints(project.ID, researchPoints); if (factionTechs.GetLevelforTech(project) > currentLvl) { scientist.ProjectQueue.RemoveAt(0); if (cycleProject) { scientist.ProjectQueue.Add((project.ID, true)); } } } } }