Dictionary with 4 parameters i wish to + 3 of them together into a sum or total.

hi everyone sorry for bothering you, but ive run into a problem i cant quite seem to find an answer to on the web. im making a script im planning to use for inheritance so that other scripts later on will be shorter and easier to write and stuff because it inherits from a base script.

what im making is basically a script version of the pathfinder roleplaying game character creation system just for fun and practise.

im doing this out of just scripting practice so i can get better at it and ive run into a problem. i have a working dictionary that holds 4 parameters, a key and 3 values. what i want to accomplish is to have the dictionary summarise the 3 values into one.

if possible id like to make it a step more andvance because in the pathfinder system the last parameter known as Misc is not added to the total unless the parameter known as Rank has a value of at least 1.

please ignore som of the commentary in the code as i want to figure out some of those other things myself.

here is my code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterBase : MonoBehaviour
{
#region FunctionCall

void Awake()
{
    InitializeAbilities();
}
void Start()
{
    InitializeListofSkills();
    InitializeClass();
    InitializeHP();
    InitializeNameGenerator();
    InitializeCarryingCapacity();
    InitializeStartSkillPoints();
}
void Update()
{
    CheckBleed();
    LevelUP();
}
#endregion FunctionCall

#region NameGenerator

// Random NameGenerator
public bool Male;
string[] MaleNames =
{
    "Ablabius",     "Abundanitus",  "Agnellus",     "Ammonianus",       "Anicius",          "Armenius",
    "Armentarius",  "Auxitius",     "Avienus",      "Beatus",           "Bonifatius",       "Callinicus",
    "Carinus",      "Castinus",     "Cerularius",   "Constantianus",    "Constantinianus",  "Constantinus",
    "Dalmatius",    "Decentius",    "Domianus",     "Domnicus",         "Domninus",         "Donus",
    "Dulcitius",    "Florentinus",  "Florentius",   "Florian",          "Florus",           "Francio",
    "Fructosus",    "Fulgentius",   "Gallienus",    "Germanus",         "Gratian",          "Honoratus",
    "Honorius",     "Ianuarius",    "Innocentius",  "Iovinus",          "Iovivus",          "Lactanius",
    "Latinius",     "Leontius",     "Macedonius",   "Magnentius",       "Marcian",          "Martinianus",
    "Martyrius",    "Maurentius",   "Maurianus",    "Mauricius",        "Maurinus",         "Maurus",
    "Maxentius",    "Maximianus",   "Maximin",      "Maximinus",        "Maxiplus",         "Maximax",      "Max",   "Mercurius",    "Mundus",
    "Nepotian",     "Nonnosus",     "Nonnus",       "Noldus",           "Opilio",           "Palladius",    "Paternus",
    "Patricius",    "Paulus",       "Pegarius",     "Petronas",         "Praesentinus",     "Praetextatus",
    "Principius",   "Priscian",     "Probus",       "Regino",           "Sebastianus",      "Tribonianus",
    "Tribunas",     "Urbicus",      "Venantius",    "Venerandus",       "Vetranis",         "Viator",
    "Victorinus",   "Vigilius",     "Virus",        "Vitalianus",       "Vitalius",         "Volusian",
};
string MaleCharactername()
{
    CharacterName = MaleNames[Random.Range(0, MaleNames.Length)];
    Debug.Log(CharacterName);
    return CharacterName;
}
string[] FemaleNames =
    {
    "Adeodata",     "Adula",        "Agnella",      "Argentea",     "Armentaria",   "Augustina",
    "Aureliana",    "Campana",      "Candida",      "Catella",      "Cervella",     "Cesarea",
    "Clementina",   "Columba",      "Consolantia",  "Constantia",   "Constantina",  "Dominica",
    "Domnica",      "Domnola",      "Germana",      "Gordia",       "Gordiana",     "Gregoria",
    "Honorata",     "Honoria",      "Ianuaria",     "Italica",      "Iustina",      "Labinia",
    "Leontia",      "Masticana",    "Maximina",     "Minervina",    "Minicea",      "Palatina",
    "Patricia",     "Paula",        "Paulina",      "Petronella",   "Placidia",     "Placidina",
    "Pompeiana",    "Praeiecta",    "Proba",        "Probina",      "Proseria",     "Rustica",
    "Rusticana",    "Salvianella",  "Sergia",       "Sidonia",      "Tetradia",     "Vesta",
    "Vigilantia",   "Vigilia",      "Vitula",       "Viviana",
    };
string FemaleCharactername()
{
    CharacterName = FemaleNames[Random.Range(0, FemaleNames.Length)];
    Debug.Log(CharacterName);
    return CharacterName;
}
public string CharacterName;
public string InitializeNameGenerator()
{
    if (string.IsNullOrEmpty(CharacterName) && Male == true)
    {
        return MaleCharactername();
    }
    else if (string.IsNullOrEmpty(CharacterName) && Male == false)
    {
        return FemaleCharactername();
    }
    return null;
}
#endregion NameGenerator

#region AbilityScores

//Ability Scores - non optimized
int[] Abilities;
void InitializeAbilities()
{
    //Abilities = CreateAbilityScores();
    Abilities = new int[6];
    CreateAbilityScores();
}
void CreateAbilityScores()
{
    for (int i = 0; i < Abilities.Length; i++)
    {
        Abilities *= Random.Range(1, 7) + Random.Range(1, 7) + Random.Range(1, 7);*

//Debug.Log("Generating value " + i + " = " + Abilities*);*
if (Abilities < 7)
{
//Debug.Log(“Too low!”);
CreateAbilityScores();
}
}
Debug.Log("StrengthScore: " + Abilities[0] + " DexterityScore: " + Abilities[1] + " ConstitutionScore: " + Abilities[2] + " IntelligenceScore: " + Abilities[3] + " WisdomScore: " + Abilities[4] + " CharismaScore: " + Abilities[5]);
}
// Modifiers dont update if Ability scores are rerolled?
public int StrengthScore
{
get { return Abilities[0]; }
}
public int StrengthModifier
{
get { return (Mathf.CeilToInt(Abilities[0] - 10) / 2); }
}
public int DexterityScore
{
get { return Abilities[1]; }
}
public int DexterityModifier
{
get { return (Mathf.CeilToInt(Abilities[1] - 10) / 2); }
}
public int ConstitutionScore
{
get { return Abilities[2]; }
}
public int ConstitutionModifier
{
get { return (Mathf.CeilToInt(Abilities[2] - 10) / 2); }
}
public int IntelligenceScore
{
get { return Abilities[3]; }
}
public int IntelligenceModifier
{
get { return (Mathf.CeilToInt(Abilities[3] - 10) / 2); }
}
public int WisdomScore
{
get { return Abilities[4]; }
}
public int WisdomModifier
{
get { return (Mathf.CeilToInt(Abilities[4] - 10) / 2); }
}
public int CharismaScore
{
get { return Abilities[5]; }
}
public int CharismaModifier
{
get { return (Mathf.CeilToInt(Abilities[5] - 10) / 2); }
}
#endregion AbilityScores
#region Class
enum ClassChoice { unchosen, barbarian, fighter, rogue, monk };
public void InitializeClass()
{
if (currentClass == ClassChoice.unchosen)
{
currentClass = (ClassChoice)Random.Range(1, 5);
}
switch (currentClass)
{
case (ClassChoice.barbarian):
BarbarianCollection();
break;
case (ClassChoice.fighter):
FighterCollection();
break;
case (ClassChoice.monk):
MonkCollection();
break;
case (ClassChoice.rogue):
RogueCollection();
break;
}
}
private ClassChoice currentClass = ClassChoice.unchosen;
#region Barbarian
void BarbarianCollection()
{
Barbarian();
BarbarianClassSkills();
}
void Barbarian()
{
HitDice = 12;
SkillRanks = 4 + IntelligenceModifier;
}
void BarbarianClassSkills()
{
skills[“Acrobatics”].Misc += 3;
skills[“Climb”].Misc += 3;
skills[“Handle Animal”].Misc += 3;
skills[“Intimidate”].Misc += 3;
skills[“Perception”].Misc += 3;
skills[“Ride”].Misc += 3;
skills[“Survival”].Misc += 3;
skills[“Swim”].Misc += 3;
}
#endregion Barbarian
#region Fighter
void FighterCollection()
{
Fighter();
}
void Fighter()
{
HitDice = 10;
SkillRanks = 2 + IntelligenceModifier;
}
#endregion Fighter
#region Rogue
void RogueCollection()
{
Rogue();
}
void Rogue()
{
HitDice = 8;
SkillRanks = 8 + IntelligenceModifier;
}
#endregion Rogue
#region Monk
void MonkCollection()
{
Monk();
}
void Monk()
{
HitDice = 8;
SkillRanks = 4 + IntelligenceModifier;
}
#endregion Monk
#endregion Class
#region Level&Health
//Character Level
public bool LvLup;
public int Level = 1;
void LevelUP()
{
if (LvLup == true)
{
Level = Level + 1;
UpdateTotalHP();
UpdateSkillRanks();
LvLup = false;
}
}
//Hit points - TotalHP wont update in unity?
public int HitDice = 6;
[SerializeField]
int TotalHP;
int Wounds;
void InitializeHP()
{
//set current health when game starts
Wounds = TotalHP;
// run function calculate total HP
FindTotalHP();
}
void FindTotalHP()
{
for (int i = 0; i < Level; i++)
{
TotalHP += Random.Range(1, HitDice+1) + ConstitutionModifier;
}
}
void UpdateTotalHP()
{
TotalHP += Random.Range(1, HitDice + 1) + ConstitutionModifier;
}
public void Damage(int Damage)
{
Wounds -= (DR - Damage);
DisplayWounds();
}
public string DisplayWounds()
{
return “Wounds:” + Wounds;
}
//DamageReduction
public int DamageReduction;
public int DR
{
get { return DamageReduction; }
set { DamageReduction = value; }
}
#endregion Level&Health
#region CarryingCapacity
//Carrying Capacity - non optimized
void InitializeCarryingCapacity()
{
int MaxCarryingCapacityinPounds;
int MediumCarryingCapacityinPounds;
int LightCarryingCapacityinPounds;
int MaxCarryingCapacityinKilograms;
int MediumCarryingCapacityinKilograms;
int LightCarryingCapacityinKilograms;
if (Abilities[0] > 10)
{
MaxCarryingCapacityinPounds = (Mathf.CeilToInt(100 * Mathf.Pow(4, (0.1f * (Abilities[0] - 10)))));
MediumCarryingCapacityinPounds = (Mathf.CeilToInt(MaxCarryingCapacityinPounds * 0.66f));
LightCarryingCapacityinPounds = (Mathf.CeilToInt(MaxCarryingCapacityinPounds / 3));
MaxCarryingCapacityinKilograms = (Mathf.CeilToInt(MaxCarryingCapacityinPounds * 0.45f));
MediumCarryingCapacityinKilograms = (Mathf.CeilToInt(MediumCarryingCapacityinPounds * 0.45f));
LightCarryingCapacityinKilograms = (Mathf.CeilToInt(LightCarryingCapacityinPounds * 0.45f));
}
else
{
MaxCarryingCapacityinPounds = Abilities[0] * 10;
MediumCarryingCapacityinPounds = (Mathf.CeilToInt(MaxCarryingCapacityinPounds * 0.66f));
LightCarryingCapacityinPounds = (Mathf.CeilToInt(MaxCarryingCapacityinPounds / 3));
MaxCarryingCapacityinKilograms = (Mathf.CeilToInt(MaxCarryingCapacityinPounds * 0.45f));
MediumCarryingCapacityinKilograms = (Mathf.CeilToInt(MediumCarryingCapacityinPounds * 0.45f));
LightCarryingCapacityinKilograms = (Mathf.CeilToInt(LightCarryingCapacityinPounds * 0.45f));
}
/*Debug.Log("MaxCarryCapPounds " + MaxCarryingCapacityinPounds);
Debug.Log("MediumCarryCapPounds " + MediumCarryingCapacityinPounds);
Debug.Log("LightCarryCapPounds " + LightCarryingCapacityinPounds);
Debug.Log("MaxCarryCapKilo " + MaxCarryingCapacityinKilograms);
Debug.Log("MediumCarryCapKilo " + MediumCarryingCapacityinKilograms);
Debug.Log("LightCarryCapKilo " + LightCarryingCapacityinKilograms);
*/
}
#endregion CarryingCapacity
#region Skills
public int SkillRanks = 1;
public int CurrentSkillRanks;
public int InitializeStartSkillPoints()
{
return CurrentSkillRanks = SkillRanks * Level;
}
/*
so make a set up where like if you choose to add to a skill then deduct skill points and add a rank in desired skill?
how do i do this without making a lot of uneccesary lines of code?
*/
public int UpdateSkillRanks()
{
return CurrentSkillRanks = SkillRanks;
}
public class Skills
{
public string Skill;
public int TotalBonus;
public int AbilityMod;
public int Rank;
public int Misc;
// why change the variables from its origin to a new name?

public Skills(string newSkill, int newTotalBonus, int newAbilityMod, int newRank, int newMisc)
{
Skill = newSkill;
// EXPERIMENTAL how can i make it add the parameters together to give a Total Bonus. preferably with the Misc mod rule.
TotalBonus = newTotalBonus;
AbilityMod = newAbilityMod;
Rank = newRank;
Misc = newMisc;
}
}
Dictionary<string, Skills> skills = new Dictionary<string, Skills>();

public void InitializeListofSkills()
{
skills.Add(“Acrobatics”, new Skills(“Acrobatics”, 0 , DexterityModifier, 0, 0));
skills.Add(“Appraise”, new Skills(“Appraise”,0,IntelligenceModifier,0,0));
skills.Add(“Bluff”, new Skills(“Bluff”,0,CharismaModifier,0,0));
skills.Add(“Climb”, new Skills(“Climb”,0,StrengthModifier,0,0));
skills.Add(“Diplomacy”, new Skills(“Diplomacy”,0,CharismaModifier,0,0));
skills.Add(“Disable Device”, new Skills(“Disable Device”,0,DexterityModifier,0,0));
skills.Add(“Disguise”, new Skills(“Disguise”,0,CharismaModifier,0,0));
skills.Add(“Escape Artist”, new Skills(“Escape Artist”,0,DexterityModifier,0,0));
skills.Add(“Handle Animal”, new Skills(“Handle Animal”,0,CharismaModifier,0,0));
skills.Add(“Heal”, new Skills(“Heal”,0,WisdomModifier,0,0));
skills.Add(“Intimidate”, new Skills(“Intimidate”,0,CharismaModifier,0,0));
skills.Add(“Linguistics”, new Skills(“Linguistics”,0,IntelligenceModifier,0,0));
skills.Add(“Perception”, new Skills(“Perception”,0,WisdomModifier,0,0));
skills.Add(“Ride”, new Skills(“Ride”,0,DexterityModifier,0,0));
skills.Add(“Sleight of Hand”, new Skills(“Sleight of Hand”,0,DexterityModifier,0,0));
skills.Add(“Stealth”, new Skills(“Stealth”,0,DexterityModifier,0,0));
skills.Add(“Survival”, new Skills(“Survival”,0,WisdomModifier,0,0));
skills.Add(“Swim”, new Skills(“Swim”,0,StrengthModifier,0,0));
}
#endregion Skills
#region Saving Throws
bool FortitudeSave;
bool ReflexSave;
bool WillSave;

#endregion Saving Throws

#region Bleeding
//Bleed
bool isBleeding;
public void Bleeding(int damagePerSecond, int duration)
{
isBleeding = true;
StartCoroutine(StopBleeding(duration));
}
public IEnumerator StopBleeding(int delay)
{
yield return new WaitForSeconds(delay);
isBleeding = false;
}
void CheckBleed()
{
if (isBleeding)
{
Damage(1 * Mathf.FloorToInt(Time.deltaTime));
}
}
#endregion Bleeding
}

Why not make it a property

instead of writing the method TotalBonus
you can use something like this :

public int TotalBonus { 
get {
       return (Rank > 0) ? AbilityMod + Rank + Misc : AbilityMod;
    }
}