private Character() { Strength = new CharacterAbility(this, Enum.Ability.Strength); Endurance = new CharacterAbility(this, Enum.Ability.Endurance); Coordination = new CharacterAbility(this, Enum.Ability.Coordination); Quickness = new CharacterAbility(this, Enum.Ability.Quickness); Focus = new CharacterAbility(this, Enum.Ability.Focus); Self = new CharacterAbility(this, Enum.Ability.Self); Health = new CharacterAbility(this, Enum.Ability.Health); Stamina = new CharacterAbility(this, Enum.Ability.Stamina); Mana = new CharacterAbility(this, Enum.Ability.Mana); abilities.Add(Enum.Ability.Strength, Strength); abilities.Add(Enum.Ability.Endurance, Endurance); abilities.Add(Enum.Ability.Coordination, Coordination); abilities.Add(Enum.Ability.Quickness, Quickness); abilities.Add(Enum.Ability.Focus, Focus); abilities.Add(Enum.Ability.Self, Self); abilities.Add(Enum.Ability.Health, Health); abilities.Add(Enum.Ability.Stamina, Stamina); abilities.Add(Enum.Ability.Mana, Mana); Abilities = new ReadOnlyDictionary <Enum.Ability, CharacterAbility>(abilities); // initialize properties collections to reasonable defaults InitializeProperties(typeof(Character)); friends = new List <Friend>(); Friends = new ReadOnlyCollection <Friend>(friends); InitializeCharacterOptions(); CharacterOptions = new ReadOnlyDictionary <CharacterOption, bool>(characterOptions); }
private Character() { Strength = new CharacterAbility(this, Enum.Ability.Strength); Endurance = new CharacterAbility(this, Enum.Ability.Endurance); Coordination = new CharacterAbility(this, Enum.Ability.Coordination); Quickness = new CharacterAbility(this, Enum.Ability.Quickness); Focus = new CharacterAbility(this, Enum.Ability.Focus); Self = new CharacterAbility(this, Enum.Ability.Self); Health = new CharacterAbility(this, Enum.Ability.Health); Stamina = new CharacterAbility(this, Enum.Ability.Stamina); Mana = new CharacterAbility(this, Enum.Ability.Mana); }
/// <summary> /// spends the xp on this ability. /// </summary> /// <remarks> /// Known Issues: /// 1. +10 skill throws an exception when it would go outside the bounds of ranks list /// 2. the client doesn't increase the "next point" amount properly when using +10 /// 3. no fireworks for hitting max ranks /// </remarks> /// <returns>0 if it failed, total investment of the next rank if successful</returns> private uint SpendAbilityXp(CharacterAbility ability, uint amount) { uint result = 0; bool addToCurrentValue = false; ExperienceExpenditureChart chart; switch (ability.Ability) { case Enum.Ability.Health: case Enum.Ability.Stamina: case Enum.Ability.Mana: chart = DatabaseManager.Charts.GetVitalXpChart(); addToCurrentValue = true; break; default: chart = DatabaseManager.Charts.GetAbilityXpChart(); break; } uint rankUps = 0u; uint currentXp = chart.Ranks[Convert.ToInt32(ability.Ranks)].TotalXp; uint rank1 = chart.Ranks[Convert.ToInt32(ability.Ranks) + 1].XpFromPreviousRank; uint rank10 = chart.Ranks[Convert.ToInt32(ability.Ranks) + 10].TotalXp - chart.Ranks[Convert.ToInt32(ability.Ranks)].TotalXp; if (amount == rank1) { rankUps = 1u; } else if (amount == rank10) { rankUps = 10u; } if (rankUps > 0) { ability.Current += addToCurrentValue ? rankUps : 0u; ability.Ranks += rankUps; ability.ExperienceSpent += amount; this.character.SpendXp(amount); result = ability.ExperienceSpent; } return(result); }
/// <summary> /// spends the xp on this ability. /// </summary> /// <returns>0 if it failed, total investment of the next rank if successful</returns> private uint SpendAbilityXp(CharacterAbility ability, uint amount) { uint result = 0; bool addToCurrentValue = false; ExperienceExpenditureChart chart; switch (ability.Ability) { case Enum.Ability.Health: case Enum.Ability.Stamina: case Enum.Ability.Mana: chart = DatabaseManager.Charts.GetVitalXpChart(); addToCurrentValue = true; break; default: chart = DatabaseManager.Charts.GetAbilityXpChart(); break; } // do not advance if we cannot spend xp to rank up our skill by 1 point if (ability.Ranks >= (chart.Ranks.Count - 1)) { return(result); } uint rankUps = 0u; uint currentXp = chart.Ranks[Convert.ToInt32(ability.Ranks)].TotalXp; uint rank1 = chart.Ranks[Convert.ToInt32(ability.Ranks) + 1].XpFromPreviousRank; uint rank10 = 0u; int rank10Offset = 0; if (ability.Ranks + 10 >= (chart.Ranks.Count)) { rank10Offset = 10 - (Convert.ToInt32(ability.Ranks + 10) - (chart.Ranks.Count - 1)); rank10 = chart.Ranks[Convert.ToInt32(ability.Ranks) + rank10Offset].TotalXp - chart.Ranks[Convert.ToInt32(ability.Ranks)].TotalXp; } else { rank10 = chart.Ranks[Convert.ToInt32(ability.Ranks) + 10].TotalXp - chart.Ranks[Convert.ToInt32(ability.Ranks)].TotalXp; } if (amount == rank1) { rankUps = 1u; } else if (amount == rank10) { if (rank10Offset > 0u) { rankUps = Convert.ToUInt32(rank10Offset); } else { rankUps = 10u; } } if (rankUps > 0) { ability.Current += addToCurrentValue ? rankUps : 0u; ability.Ranks += rankUps; ability.ExperienceSpent += amount; this.character.SpendXp(amount); result = ability.ExperienceSpent; } return(result); }