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
}