public FactionAbilitiesDB(FactionAbilitiesDB db)
 {
     AbilityBonuses = new Dictionary <AbilityType, float>(db.AbilityBonuses);
     BasePlanetarySensorStrength = db.BasePlanetarySensorStrength;
     BaseGroundUnitStrengthBonus = db.BaseGroundUnitStrengthBonus;
     ColonyCostMultiplier        = db.ColonyCostMultiplier;
 }
示例#2
0
        /// <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.
                    }
                }
            }
        }
示例#3
0
        /// <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.
                    }
                }
            }
        }
示例#4
0
        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);
        }
示例#5
0
        /// <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));
                        }
                    }
                }
            }
        }