//===============================================================================\\ 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); }
//===============================================================================\\ 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); } } } } }
//===============================================================================\\ 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); } }