/// <summary> /// Gets the target to render in the target panel depending on which panel is active and where the target position is. /// </summary> /// <returns></returns> private IDisplayCharacter GetTarget() { if (_defaultsHandler.IsInFormationPanel || !_combatStateHandler.IsPlayerTurn()) { IDisplayCharacter renderTarget = null; // If there is a character in the player's default target position, render that target's details if (_uiCharacterManager.Characters.Any(chr => chr.Position == _defaultsHandler.CurrentTargetPosition)) { renderTarget = _uiCharacterManager.GetCharacterFromPosition(_defaultsHandler.CurrentTargetPosition); } // Finds any character that is in the player's target list and render that target's details else { var targets = _defaultsHandler.CurrentTargetPositions; renderTarget = _uiCharacterManager.Characters.FirstOrDefault(chr => targets.Contains(chr.Position)); } // If there are no characters that occupy the positions the player is targeting, render the active character's details if (renderTarget == null) { renderTarget = _uiCharacterManager.GetCharacterFromId(_defaultsHandler.ActiveCharacterId); } return(renderTarget); } else { return(_uiCharacterManager.GetCharacterFromId(_defaultsHandler.ActiveCharacterId)); } }
/// <summary> /// Renders a character's name and all it's stats wrapped in a panel. /// </summary> /// <param name="character">The character to render in the panel.</param> /// <returns>A list of strings containing the panel render.</returns> private List <string> RenderCharacter(IDisplayCharacter character) { var characterDetails = new List <string>(); characterDetails.Add("╔" + new string('═', MaxWidth - 2) + "╗"); characterDetails.AddRange(RenderCharacterHeader(character)); characterDetails.Add(RenderResource("Health", character.CurrentHealth, character.MaxHealth)); characterDetails.Add(RenderResource("Mana", character.CurrentMana, character.MaxMana)); characterDetails.Add(RenderEmptyLine()); characterDetails.AddRange(RenderSubPanels(character)); int emptyLines = MaxHeight - 1 - characterDetails.Count(); // Fill empty spaces for (int i = 0; i < emptyLines; i++) { characterDetails.Add(RenderEmptyLine()); } characterDetails.Add("╚" + new string('═', MaxWidth - 2) + "╝"); return(characterDetails); }
/// <summary> /// Constructs and returns the sub panels given a character to pull data from. /// </summary> /// <param name="character">The character whose data is used to construct the sub panels.</param> /// <returns>An enumerable of string that contains the rendered sub panels.</returns> private IEnumerable <string> RenderSubPanels(IDisplayCharacter character) { var subPanels = new List <string>(); var offensiveRender = _offensiveSubPanel.Render(character); var statsRender = _statsSubPanel.Render(character); var armorRender = _armorSubPanel.Render(character.Armor); var resistanceRender = _resistanceSubPanel.Render(character.ArmorPercentage); var damageRender = _damageSubPanel.Render(character.DamageModifier); var damagePercentRender = _damagePercentSubPanel.Render(character.DamagePercentageModifier); int index = 1; // Render stats and offensive panels for (int i = 0; i < statsRender.Count(); i++) { if (i == 0 && IsActive) { subPanels.Add("║" + GetFocus(index) + statsRender[i] + GetFocus(++index) + offensiveRender[i] + " ║"); } else { subPanels.Add("║ " + statsRender[i] + " " + offensiveRender[i] + " ║"); } } subPanels.Add(RenderEmptyLine()); // Render damage and armor panels for (int i = 0; i < statsRender.Count(); i++) { if (i == 0 && IsActive) { subPanels.Add("║" + GetFocus(++index) + damageRender[i] + GetFocus(++index) + armorRender[i] + " ║"); } else { subPanels.Add("║ " + damageRender[i] + " " + armorRender[i] + " ║"); } } subPanels.Add(RenderEmptyLine()); // Render damage percent and resistance panels for (int i = 0; i < offensiveRender.Count(); i++) { if (i == 0 && IsActive) { subPanels.Add("║" + GetFocus(++index) + damagePercentRender[i] + GetFocus(++index) + resistanceRender[i] + " ║"); } else { subPanels.Add("║ " + damagePercentRender[i] + " " + resistanceRender[i] + " ║"); } } return(subPanels); }
/// <summary> /// Renders the stats panel, containing the amount of stats a character has for each stat. /// </summary> /// <param name="character">The character to use to retrieve the stat amounts.</param> /// <returns>A list of string containing the stats panel.</returns> public IReadOnlyList <string> Render(IDisplayCharacter character) { var render = new List <string>(); render.Add(" _Stats_" + new string(' ', MaxWidth - 8)); render.Add(GetStatDisplay("Strength", character.CurrentStats.Strength.ToString(), 1)); render.Add(GetStatDisplay("Stamina", character.CurrentStats.Stamina.ToString(), 2)); render.Add(GetStatDisplay("Intellect", character.CurrentStats.Intellect.ToString(), 3)); render.Add(GetStatDisplay("Agility", character.CurrentStats.Agility.ToString(), 4)); render.Add(GetStatDisplay("Speed", character.CurrentStats.Speed.ToString(), 5)); render.Add(new string(' ', MaxWidth)); return(render); }
/// <summary> /// Renders a character's offensive stats. /// </summary> /// <param name="character">The character to render offensive stats for.</param> /// <returns>A list of string containing the rendered stats.</returns> public IReadOnlyList <string> Render(IDisplayCharacter character) { var render = new List <string>(); render.Add(" _Offensive_" + new string(' ', MaxWidth - 12)); render.Add(RenderStatPercentage("Crit Chance", character.CritChance, 1)); render.Add(RenderStatPercentage("Crit Damage", character.CritMultiplier, 2)); render.Add(RenderStat("Extra Threat", character.Threat, 3, true)); render.Add(RenderStatPercentage("Threat %", character.ThreatMultiplier, 4, true)); render.Add(RenderStat("Spell Damage", character.SpellDamageModifier, 5, true)); render.Add(RenderStatPercentage("Spell %", character.SpellDamagePercentageModifier, 6, true)); return(render); }
/// <summary> /// Given a character, constructs a header using the name of the character. /// </summary> /// <param name="character">The character to construct the header for.</param> /// <returns>A list of string containing the header.</returns> private IEnumerable <string> RenderCharacterHeader(IDisplayCharacter character) { var header = new List <string>(); string characterLevel = $"Lv: {character.Level} "; int headerLength = character.Name.Count() + 7 + characterLevel.Length; header.Add("║ " + character.Name + " (" + character.Symbol + ")" + new string(' ', MaxWidth - headerLength) + characterLevel + "║"); header.Add("║" + new string('─', MaxWidth - 2) + "║"); return(header); }
/// <summary> /// Returns whether or not the stats of the character being passed in is the same as the cached data. /// </summary> /// <param name="character">The character to check with the cached data.</param> /// <returns>Returns whether or not the stats of the character being passed in is the same as the cached data.</returns> private bool IsCachedData(IDisplayCharacter character) { if (character.Id != _cachedCharacter.Id) { return(false); } if (character.CurrentHealth != _cachedCharacter.CurrentHealth) { return(false); } if (character.MaxHealth != _cachedCharacter.MaxHealth) { return(false); } return(true); }
/// <summary> /// Renders a character panel with a group of characters and a focused character target that will show /// more stats. /// </summary> /// <param name="characters">The list of characters to render to the character panel.</param> /// <param name="focusedTarget">The character that is focused and will show more stats.</param> /// <returns>A list of string containing the rendered character panel.</returns> private IReadOnlyList <string> Render(IReadOnlyList <IDisplayCharacter> characters, IDisplayCharacter focusedTarget) { // Prevent target from being rendered twice var modifiedList = new List <IDisplayCharacter>(characters); modifiedList.Remove(focusedTarget); var render = new List <string>(); var otherCharacters = RenderMany(modifiedList); var targetDetails = RenderCharacter(focusedTarget); // Remove extra details from the focusedTarget render depending on how much space there is left to fit the max height int removeIndex = MaxHeight - otherCharacters.Count(); targetDetails.RemoveRange(removeIndex, targetDetails.Count() - removeIndex); render.AddRange(targetDetails); render.AddRange(otherCharacters); return(render); }