コード例 #1
0
        //===============================================================================\\

        private TickData getTickData(int thingID, INano nanoObj)
        {
            TickData data = null;

            if (!this.TickTracker.TryGetValue(thingID, out data))
            {
                data = nanoObj.GenerateTickData();
                this.TickTracker.Add(thingID, data);
            }
            return(data);
        }
コード例 #2
0
        //===============================================================================\\

        public void Persist()
        {
            if (Scribe.mode == LoadSaveMode.Saving)
            {
                if (this.TickTracker != null && this.TickTracker.Keys.Count > 0)
                {
                    int keys = this.TickTracker.Keys.Count;
                    Scribe_Values.Look <int>(ref keys, "KeysCount");

                    List <KeyValuePair <int, TickData> > values = this.TickTracker
                                                                  .Select(x => x)
                                                                  .ToList();
                    for (int i = 0; i < values.Count; i++)
                    {
                        string label = "n" + i.ToString() + "_";
                        KeyValuePair <int, TickData> kvp = values[i];
                        int keyRef = kvp.Key;

                        Scribe_Values.Look <int>(ref keyRef, label + "Key");
                        Scribe_Values.Look <float>(ref kvp.Value.Accumulated, label + "Accumulated");
                        Scribe_Values.Look <float>(ref kvp.Value.TickAmount, label + "TickAmount");
                    }
                }
            }
            else
            {
                if (!_isLoaded)
                {
                    _isLoaded = true;
                    int keys = 0;
                    Scribe_Values.Look <int>(ref keys, "KeysCount", 0);
                    if (keys > 0)
                    {
                        this.TickTracker = new Dictionary <int, TickData>();
                        for (int i = 0; i < keys; i++)
                        {
                            string   label  = "n" + i.ToString() + "_";
                            int      keyRef = 0;
                            TickData data   = new TickData();

                            Scribe_Values.Look <int>(ref keyRef, label + "Key");
                            Scribe_Values.Look <float>(ref data.Accumulated, label + "Accumulated");
                            Scribe_Values.Look <float>(ref data.TickAmount, label + "TickAmount");

                            this.TickTracker.Add(keyRef, data);
                        }
                    }
                }
            }
        }
コード例 #3
0
        //===============================================================================\\

        public void ProcessTick(List <Apparel> apparel, List <Thing> weapons, INano nanoObject)
        {
            // Stat Defs for UI
            bool isAdvancedComplete = IsAdvancedResearchComplete();
            bool isWeaponsComplete  = IsWeaponResearchComplete();

            this.StatModApparel.value = isAdvancedComplete
                                ? 100
                                : (100 * LOW_TIER_APPAREL);

            if (isWeaponsComplete)
            {
                this.StatModWeapons.value = isAdvancedComplete
                                        ? 100
                                        : (100 * LOW_TIER_WEAPONS);
            }
            else
            {
                this.StatModWeapons.value = 0;
            }

            // Apparel / Weapons

            int powerApparelCount = 0;
            int powerWeaponsCount = 0;
            int tickFuel          = 0;

            if (this.CmpPowerTrader.PowerOn && this.CmpRefuelable.HasFuel)
            {
                foreach (Apparel a in apparel)
                {
                    if (a.HitPoints < a.MaxHitPoints)
                    {
                        ++powerApparelCount;
                        TickData data = this.getTickData(a.thingIDNumber, nanoObject);
                        if (data.AddHP(NanoRepair.GetIncrementApparel(a, nanoObject)))
                        {
                            a.HitPoints = a.HitPoints + 1;
                            ++tickFuel;
                            if (a.HitPoints >= a.MaxHitPoints)
                            {
                                this.TickTracker.Remove(a.thingIDNumber);
                                --powerApparelCount;
                            }
                        }
                    }

                    if (a.WornByCorpse && a.HitPoints >= (a.MaxHitPoints * 0.98))
                    {
                        FieldInfo info = a.GetType().GetField("wornByCorpseInt", BindingFlags.Instance | BindingFlags.NonPublic);
                        info.SetValue(a, false);
                    }
                }

                if (isWeaponsComplete)
                {
                    foreach (Thing w in weapons)
                    {
                        if (w != null && w.def != null && (w.def.IsRangedWeapon || w.def.IsMeleeWeapon))
                        {
                            if (w.HitPoints < w.MaxHitPoints)
                            {
                                ++powerWeaponsCount;
                                TickData wData = this.getTickData(w.thingIDNumber, nanoObject);
                                if (wData.AddHP(NanoRepair.GetIncrementWeapon(w, nanoObject)))
                                {
                                    w.HitPoints = w.HitPoints + 1;
                                    ++tickFuel;
                                    if (w.HitPoints >= w.MaxHitPoints)
                                    {
                                        this.TickTracker.Remove(w.thingIDNumber);
                                        --powerWeaponsCount;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (powerApparelCount == 0 && powerWeaponsCount == 0)
            {
                this.CmpPowerTrader.PowerOutput = -(this.CmpPowerTrader.Props.basePowerConsumption * 0.1f);
            }
            else
            {
                float factor = this.CmpPowerTrader.Props.basePowerConsumption * (isAdvancedComplete ? 1.0f : LOW_TIER_POWER);
                this.CmpPowerTrader.PowerOutput = -(factor * (powerApparelCount + (2 * powerWeaponsCount)));
            }

            if (tickFuel > 0)
            {
                this.CmpRefuelable.ConsumeFuel(FUEL_RATE * tickFuel);
            }
        }