Dictionary <string, List <float> > CalculateStats(UniqueWeaponStats _pickupStats, UniqueWeaponStats _currentStats) { Dictionary <string, List <float> > statsToReturn = new Dictionary <string, List <float> >(); // Get Array of all variable names in class var weaponVariableNames = _pickupStats.GetType() .GetFields() .Select(field => field.Name); foreach (var stat in weaponVariableNames) { // skip dictionary variable if (stat == "baseStats") { continue; } // dictionary Key string key = stat; key = AddSpacesAndCapitalize(key); // weapon stat base value (set in weapon inspector) float baseValue = _currentStats.baseStats[stat]; // FieldInfo reference to variable multipler in pickup object var multiplier_pick = _pickupStats.GetType().GetField(stat); // multiplied value float finalValue_pick = baseValue * (float)multiplier_pick.GetValue(_pickupStats); // FieldInfo reference to variable multipler in current object var multiplier_curr = _currentStats.GetType().GetField(stat); // multiplied value float finalValue_curr = baseValue * (float)multiplier_curr.GetValue(_currentStats); if (key.Contains("Max") || key.Contains("Mag")) { finalValue_curr = (float)Math.Round((double)finalValue_curr); finalValue_pick = (float)Math.Round((double)finalValue_pick); } else { finalValue_curr = (float)Math.Round((double)finalValue_curr, 2); finalValue_pick = (float)Math.Round((double)finalValue_pick, 2); } // Add values to dictionary: Key, current val, pickup val statsToReturn[key] = new List <float> { finalValue_curr, finalValue_pick }; } return(statsToReturn); }
public void ApplyUniqueWeaponStats(UniqueWeaponStats _uniqueStats) { // Get Array of all variable names in class var weaponVariableNames = this.GetType() .GetFields() .Select(field => field.Name); // Get Array of all stat multipliers in uniqueStats (paramater) var uniqueVariableNames = _uniqueStats.GetType() .GetFields() .Select(field => field.Name); _uniqueStats.baseStats.Clear(); // Match variav\ble pairs with same name foreach (var multi in uniqueVariableNames) { if (weaponVariableNames.Contains(multi)) { // Get field on weapon(as FieldInfo) var statField = this.GetType().GetField(multi); // Get matching field on UniqueWeaponStats class var statMultiplier = _uniqueStats.GetType().GetField(multi); try { // Collect weapon's base stats to reapply to it later (if weapon dropped) _uniqueStats.baseStats.Add(multi, Convert.ToSingle(statField.GetValue(this))); } catch { Debug.Log("catch: " + multi); _uniqueStats.baseStats.Add(multi, 0); } // if statfield is an int - cast it as such when applying value if (statField.GetValue(this) is int) { int newValue = Mathf.RoundToInt(((int)statField.GetValue(this) * (float)statMultiplier.GetValue(_uniqueStats))); statField.SetValue(this, newValue); } else if (statField.GetValue(this) is float)// if statfield is an float - cast it as such when applying value { float newValue = (float)statField.GetValue(this) * (float)statMultiplier.GetValue(_uniqueStats); newValue = (float)Math.Round((double)newValue, 2); statField.SetValue(this, newValue); } else { Debug.Log("SETTING ENUM"); Elements.Element newValue = (Elements.Element)statMultiplier.GetValue(this); statField.SetValue(this, newValue); } } else { //Debug.Log("UniqueWeaponStats variable: " + multi + ", does not have a counterpart to mutate in weapon script"); } } uniqueStats = _uniqueStats; }