Beispiel #1
0
 public TechnologyRequirement(IResearchable container, Technology tech, Formula <int> level)
     : base("Requires level " + level + " " + tech + ".")
 {
     Container  = container;
     Technology = tech;
     Level      = level;
 }
Beispiel #2
0
        public override void OnNPCAtJob(ref NPCBase.NPCState state)
        {
            usedNPC.LookAt(position.Vector);
            ScienceManagerPlayer scienceManager;

            if (!ScienceManager.TryGetPlayerManager(owner, out scienceManager))
            {
                state.SetIndicator(new Shared.IndicatorState(6f, BuiltinBlocks.ErrorIdle));
                state.JobIsDone = false;
                return;
            }
            ResearchProgress active = scienceManager.ActiveResearch;

            if (state.Inventory.IsEmpty)
            {
                if (active.research != null && !active.IsCompleted)
                {
                    // no items, but valid research -> try to get items
                    IList <InventoryItem> requirements = active.research.GetScienceRequirements();
                    Stockpile             stockpile    = Stockpile.GetStockPile(owner);
                    if (Stockpile.GetStockPile(owner).Contains(requirements))
                    {
                        shouldTakeItems = true;
                        state.SetCooldown(0.3);
                        state.JobIsDone = true;
                    }
                    else
                    {
                        ushort missing = 0;
                        for (int i = 0; i < requirements.Count; i++)
                        {
                            if (!stockpile.Contains(requirements[i]))
                            {
                                missing = requirements[i].Type;
                                break;
                            }
                        }
                        float cooldown = Random.NextFloat(8f, 16f);
                        state.SetIndicator(new Shared.IndicatorState(cooldown, missing, true, false));
                        state.JobIsDone = false;
                    }
                }
                else
                {
                    float cooldown = Random.NextFloat(8f, 16f);
                    // no items, no research -> wait for research
                    state.SetIndicator(new Shared.IndicatorState(cooldown, BuiltinBlocks.ErrorIdle));
                    state.JobIsDone = false;
                }
            }
            else
            {
                if (active.research == null || active.IsCompleted)
                {
                    // items, but no valid research -> go dump items
                    shouldTakeItems = true;
                    state.SetCooldown(0.3);
                    state.JobIsDone = true;
                }
                else
                {
                    // items, valid research -> try progress
                    IResearchable         researchable = active.research;
                    IList <InventoryItem> requirements = researchable.GetScienceRequirements();
                    if (state.Inventory.TryRemove(requirements))
                    {
                        int recycled = 0;
                        for (int i = 0; i < requirements.Count; i++)
                        {
                            ushort type = requirements[i].Type;
                            if (type == BuiltinBlocks.ScienceBagLife ||
                                type == BuiltinBlocks.ScienceBagBasic ||
                                type == BuiltinBlocks.ScienceBagMilitary)
                            {
                                recycled += requirements[i].Amount;
                            }
                        }
                        for (int i = recycled; i > 0; i--)
                        {
                            if (Random.NextDouble() > RECYCLE_CHANCE)
                            {
                                recycled--;
                            }
                        }
                        state.Inventory.Add(BuiltinBlocks.LinenBag, recycled);
                        scienceManager.AddActiveResearchProgress(1);
                        state.SetIndicator(new Shared.IndicatorState(CraftingCooldown, NPCIndicatorType.Science));
                    }
                    else
                    {
                        state.SetCooldown(0.3);
                    }
                    shouldTakeItems = true;
                    state.JobIsDone = true;
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Loads requirements from a record.
        /// </summary>
        /// <param name="rec"></param>
        public static IEnumerable <Requirement <Empire> > LoadEmpireRequirements(Record rec, IResearchable r, RequirementType rtype)
        {
            int count = 0;
            int start = 0;

            if (rtype == RequirementType.Unlock)
            {
                while (true)
                {
                    count++;
                    var nfield = rec.FindField(new string[] { "Tech Area Req " + count, "Tech Area Req" }, ref start, false, start, true);
                    if (nfield == null)
                    {
                        break;                         // no more tech requirements
                    }
                    var lfield       = rec.FindField(new string[] { "Tech Level Req " + count, "Tech Level Req" }, ref start, false, start, true);
                    var techname     = nfield.CreateFormula <string>(r).Value;
                    var levelFormula = lfield?.CreateFormula <int>(r) ?? 1;
                    var tech         = Mod.Current.Technologies.FindByName(techname);
                    if (tech == null)
                    {
                        Mod.Errors.Add(new DataParsingException("Could not find a technology named " + techname + ".", Mod.CurrentFileName, rec));
                    }
                    else
                    {
                        yield return(new TechnologyRequirement(r, tech, levelFormula));
                    }
                }
            }
            start = 0;
            while (true)
            {
                var reqfield = rec.FindField(rtype + " Requirement", ref start, false, start);
                if (reqfield == null)
                {
                    break;
                }
                var descfield = rec.FindField(rtype + " Requirement Description", ref start, false, start);
                var desc      = descfield == null ? (Formula <string>)reqfield.Value : descfield.CreateFormula <string>(r);
                yield return(new ScriptRequirement <Empire>(reqfield.CreateFormula <bool>(r), desc));
            }
        }