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);
    }
Example #2
0
    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;
    }