public static SkillLevelsComponent ApplyStatModifications(StateSpaceComponents spaceComponents, Guid entity, SkillLevelsComponent originalStats) { SkillLevelsComponent newStats = originalStats; //See if the entity has an inventory to check for artifact modifications if (spaceComponents.InventoryComponents.ContainsKey(entity)) { InventoryComponent entityInventory = spaceComponents.InventoryComponents[entity]; //For each artifact in the entity' inventory, look for the statmodificationcomponent, and modify stats accordingly. foreach (Guid id in entityInventory.Artifacts) { Entity inventoryItem = spaceComponents.Entities.Where(x => x.Id == id).FirstOrDefault(); if (inventoryItem != null && (inventoryItem.ComponentFlags & ComponentMasks.Artifact) == ComponentMasks.Artifact) { StatModificationComponent statsMods = spaceComponents.StatModificationComponents[id]; newStats.Accuracy = (newStats.Accuracy + statsMods.AccuracyChange < 0) ? 0 : newStats.Accuracy + statsMods.AccuracyChange; newStats.Defense = (newStats.Defense + statsMods.DefenseChange < 0) ? 0 : newStats.Defense + statsMods.DefenseChange; newStats.DieNumber = (newStats.DieNumber + statsMods.DieNumberChange < 1) ? 1 : newStats.DieNumber + statsMods.DieNumberChange; newStats.Health = (newStats.Health + statsMods.HealthChange < 0) ? 0 : newStats.Health + statsMods.HealthChange; newStats.MaximumDamage = (newStats.MaximumDamage + statsMods.MaximumDamageChange < 1) ? 1 : newStats.MaximumDamage + statsMods.MaximumDamageChange; newStats.MinimumDamage = (newStats.MinimumDamage + statsMods.MinimumDamageChange < 1) ? 1 : newStats.MinimumDamage + statsMods.MinimumDamageChange; } } } return(newStats); }
public static void ShowInventoryMenu(StateSpaceComponents spaceComponents, SpriteBatch spriteBatch, Camera camera, SpriteFont messageFont, SpriteFont optionFont, Texture2D UI) { Entity player = spaceComponents.Entities.Where(x => (x.ComponentFlags & ComponentMasks.Player) == ComponentMasks.Player).FirstOrDefault(); if (player != null) { int messageSpacing = (int)messageFont.MeasureString("g").Y + 1; int messageNumberLeft = 0; int messageNumberMiddle = 0; int messageNumberRight = 0; int panelWidth = (int)(camera.FullViewport.Width / 3); InventoryMenuComponent menu = spaceComponents.InventoryMenuComponent; InventoryComponent playerInvo = spaceComponents.InventoryComponents[player.Id]; SkillLevelsComponent playerSkills = spaceComponents.SkillLevelsComponents[player.Id]; //Draw background spriteBatch.Draw(UI, camera.FullViewport.Bounds, Color.Black * .7f); //Draw Header Vector2 headerSize = optionFont.MeasureString(Messages.InventoryHeader); int beginningHeight = (int)headerSize.Y + messageSpacing * 2; spriteBatch.Draw(UI, new Rectangle(0, 0, camera.FullViewport.Width, beginningHeight), Color.DarkViolet * .3f); spriteBatch.DrawString(optionFont, Messages.InventoryHeader, new Vector2((int)(camera.FullViewport.Width / 2) - (int)(headerSize.X / 2), messageSpacing), Color.CornflowerBlue); beginningHeight += messageSpacing; //Draw columns //Left spriteBatch.Draw(UI, new Rectangle(0, beginningHeight, panelWidth - messageSpacing, camera.FullViewport.Height), Color.DarkBlue * .25f); //Middle spriteBatch.Draw(UI, new Rectangle(messageSpacing + panelWidth, beginningHeight, panelWidth - messageSpacing, camera.FullViewport.Height), Color.DarkBlue * .25f); //Right spriteBatch.Draw(UI, new Rectangle(messageSpacing * 2 + panelWidth * 2, beginningHeight, panelWidth - messageSpacing, camera.FullViewport.Height), Color.DarkBlue * .25f); //Draw item selection panel spriteBatch.DrawString(messageFont, string.Format("Wealth: {0}", playerSkills.Wealth), new Vector2(messageSpacing, beginningHeight), Colors.Messages.Special); messageNumberLeft += 2; spriteBatch.DrawString(messageFont, string.Format(Messages.InventoryArtifacts + " ({0}/{1})", playerInvo.Artifacts.Count, playerInvo.MaxArtifacts), new Vector2(messageSpacing, beginningHeight + (messageSpacing * messageNumberLeft)), Color.CornflowerBlue); messageNumberLeft += 1; foreach (Guid item in playerInvo.Artifacts) { Color color = (menu.SelectedItem == item) ? Colors.Messages.LootPickup : Color.NavajoWhite; string prepend = (menu.SelectedItem == item) ? "> " : string.Empty; spriteBatch.DrawString(messageFont, prepend + spaceComponents.NameComponents[item].Name, new Vector2(messageSpacing, (messageSpacing * messageNumberLeft) + beginningHeight), color); messageNumberLeft += 1; } spriteBatch.DrawString(messageFont, string.Format(Messages.InventoryConsumables + " ({0}/{1})", playerInvo.Consumables.Count, playerInvo.MaxConsumables), new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft) + beginningHeight), Color.CornflowerBlue); messageNumberLeft += 1; foreach (Guid item in playerInvo.Consumables) { Color color = (menu.SelectedItem == item) ? Colors.Messages.LootPickup : Color.NavajoWhite; string prepend = (menu.SelectedItem == item) ? "> " : string.Empty; spriteBatch.DrawString(messageFont, prepend + spaceComponents.NameComponents[item].Name, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft) + beginningHeight), color); messageNumberLeft += 1; } messageNumberLeft += 2; //Gather item information panels if (menu.SelectedItem != Guid.Empty) { PickupComponent itemInfo = spaceComponents.PickupComponents[menu.SelectedItem]; NameComponent itemName = spaceComponents.NameComponents[menu.SelectedItem]; ValueComponent itemValue = spaceComponents.ValueComponents[menu.SelectedItem]; List <Tuple <Color, string> > centerMessages = new List <Tuple <Color, string> >(); List <Tuple <Color, string> > rightMessages = new List <Tuple <Color, string> >(); //Get name, description, and value rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, itemName.Name)); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, itemName.Description)); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Special, string.Format("This item can be scrapped for {0} gold.", itemValue.Gold))); switch (itemInfo.PickupType) { case ItemType.ARTIFACT: //Collect item use stats for right panel //Artifact Stats ArtifactStatsComponent artifactStats = spaceComponents.ArtifactStatsComponents[menu.SelectedItem]; rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Special, string.Format("Upgrade Level: {0}", artifactStats.UpgradeLevel))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Special, string.Format("Depth found: {0}", artifactStats.FloorFound))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Good, "STATISTICS WHILE EQUIPPED:")); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Kills: {0}", artifactStats.KillsWith))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Maximum hit combo: {0}", artifactStats.MaximumComboWith))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Damage given: {0}", artifactStats.DamageGivenWith))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Damage taken: {0}", artifactStats.DamageTakenWith))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Times dodged: {0}", artifactStats.DodgesWith))); rightMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Times missed: {0}", artifactStats.MissesWith))); //Draw commands for artifact on the left panel spriteBatch.DrawString(messageFont, "Commands: ", new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); spriteBatch.DrawString(messageFont, Messages.Upgrade, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); spriteBatch.DrawString(messageFont, Messages.Scrap, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); spriteBatch.DrawString(messageFont, Messages.Drop, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); //Collect info for middle panel StatModificationComponent stats = spaceComponents.StatModificationComponents[menu.SelectedItem]; centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, "This artifact affects the following stats: ")); if (stats.AccuracyChange != 0) { string sign = stats.AccuracyChange > 0 ? "+" : string.Empty; Color color = stats.AccuracyChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Accuracy {0}{1}", sign, stats.AccuracyChange))); } if (stats.DefenseChange != 0) { string sign = stats.DefenseChange > 0 ? "+" : string.Empty; Color color = stats.DefenseChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Defense {0}{1}", sign, stats.DefenseChange))); } if (stats.HealthChange != 0) { string sign = stats.HealthChange > 0 ? "+" : string.Empty; Color color = stats.HealthChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Maximum Health {0}{1}", sign, stats.HealthChange))); } if (stats.DieNumberChange != 0) { string sign = stats.DieNumberChange > 0 ? "+" : string.Empty; Color color = stats.DieNumberChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Dice Number on Attack {0}{1}", sign, stats.DieNumberChange))); } if (stats.MinimumDamageChange != 0) { string sign = stats.MinimumDamageChange > 0 ? "+" : string.Empty; Color color = stats.MinimumDamageChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Minimum Damage {0}{1}", sign, stats.MinimumDamageChange))); } if (stats.MaximumDamageChange != 0) { string sign = stats.MaximumDamageChange > 0 ? "+" : string.Empty; Color color = stats.MaximumDamageChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; centerMessages.Add(new Tuple <Color, string>(color, string.Format("Maximum Damage {0}{1}", sign, stats.MaximumDamageChange))); } //PLACEHOLDER centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, "This artifact has the following effects: ")); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Good, "Passive 1: Kills with this item equipped generate 100 gold.")); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Bad, "Passive 2: Enemies will not flee (LOCKED)")); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Bad, "Passive 3: Tiles stepped on turn to lava for 5 turns (LOCKED)")); centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Bad, "Bonus: ??? (Kill 40 more enemies with this item to unlock)")); break; case ItemType.CONSUMABLE: //Draw command info on left panel spriteBatch.DrawString(messageFont, "Commands: ", new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); spriteBatch.DrawString(messageFont, Messages.Scrap, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); spriteBatch.DrawString(messageFont, Messages.Drop, new Vector2(messageSpacing, (messageSpacing * 3) + (messageSpacing * messageNumberLeft++) + beginningHeight), Colors.Messages.Normal); //Collect info for middle panel centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); ItemFunctionsComponent consumableInfo = spaceComponents.ItemFunctionsComponents[menu.SelectedItem]; centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Good, string.Format("This item has {0} uses left.", consumableInfo.Uses))); if (consumableInfo.Uses > 1) { centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Bad, string.Format("This item loses {0} value each use.", consumableInfo.CostToUse))); } if (consumableInfo.Ranged) { centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("This item is cast at a range."))); } else { centerMessages.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("This item is used where you stand."))); } break; } //Print out all the info foreach (Tuple <Color, string> message in centerMessages) { if (string.IsNullOrEmpty(message.Item2)) { continue; } string text = MessageDisplaySystem.WordWrap(messageFont, message.Item2, panelWidth - 30 - DevConstants.Grid.TileSpriteSize); float textHeight = messageFont.MeasureString(message.Item2).Y; spriteBatch.DrawString(messageFont, text, new Vector2(messageSpacing * 2 + panelWidth, (int)beginningHeight + (int)textHeight + 10 + (messageNumberMiddle * messageSpacing)), message.Item1); messageNumberMiddle += Regex.Matches(text, System.Environment.NewLine).Count; messageNumberMiddle += 1; } foreach (Tuple <Color, string> message in rightMessages) { if (string.IsNullOrEmpty(message.Item2)) { continue; } string text = MessageDisplaySystem.WordWrap(messageFont, message.Item2, panelWidth - 30 - DevConstants.Grid.TileSpriteSize); float textHeight = messageFont.MeasureString(message.Item2).Y; spriteBatch.DrawString(messageFont, text, new Vector2(messageSpacing * 3 + panelWidth * 2, (int)beginningHeight + (int)textHeight + 10 + (messageNumberRight * messageSpacing)), message.Item1); if (text != System.Environment.NewLine) { messageNumberRight += Regex.Matches(text, System.Environment.NewLine).Count; } messageNumberRight += 1; } } } }
public static void PrintObserver(StateSpaceComponents spaceComponents, SpriteFont font, SpriteBatch spriteBatch, DungeonTile[,] dungeonGrid, Camera camera, Texture2D UITexture) { ObserverComponent observer = spaceComponents.ObserverComponent; Entity observerInfo = spaceComponents.Entities.Where(x => (x.ComponentFlags & ComponentMasks.Observer) == ComponentMasks.Observer).FirstOrDefault(); if (observerInfo != null) { //Find out where the observer is PositionComponent observerPosition = spaceComponents.PositionComponents[observerInfo.Id]; //Obtain the list of entities from the observer component List <Entity> observedItems = new List <Entity>(); foreach (Guid id in observer.Observed) { Entity entity = spaceComponents.Entities.Where(x => x.Id == id).FirstOrDefault(); if (entity != null) { observedItems.Add(entity); } } //Set the initial variables int messageSpacing = (int)font.MeasureString("g").Y + 1; int messageLeft = 0; int messageRight = 0; int panelWidth = (int)((camera.DungeonViewport.Width / 2) - (DevConstants.Grid.CellSize * 2)); List <Tuple <Color, string> > leftFindings = new List <Tuple <Color, string> >(); List <Tuple <Color, string> > rightFindings = new List <Tuple <Color, string> >(); //Gather information for the left side if (!dungeonGrid[(int)observerPosition.Position.X, (int)observerPosition.Position.Y].Found) { leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, Messages.Observer.NotFound)); } else { if (dungeonGrid[(int)observerPosition.Position.X, (int)observerPosition.Position.Y].InRange) { leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Good, Messages.Observer.InRange)); } else { leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, Messages.Observer.OutOfRange)); } leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); switch (dungeonGrid[(int)observerPosition.Position.X, (int)observerPosition.Position.Y].Type) { case TileType.TILE_FLOOR: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Floor)); break; case TileType.TILE_WALL: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Wall)); break; case TileType.TILE_ROCK: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Rock)); break; case TileType.TILE_WATER: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Water)); break; case TileType.TILE_TALLGRASS: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.TallGrass)); break; case TileType.TILE_FLATTENEDGRASS: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.FlatGrass)); break; case TileType.TILE_FIRE: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Fire)); break; case TileType.TILE_ASH: leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Ash)); break; } } if (observer.SeeUnknown) { leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.Observer.Unknown)); } if (observer.Observed.Count > 0) { leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); leftFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, "From here you can see the following: ")); } //Gather observed names for the left side foreach (Entity en in observedItems) { string prepend = (en.Id == observer.SelectedItem) ? "> " : string.Empty; Color color = (en.Id == observer.SelectedItem) ? Colors.Messages.LootPickup : Colors.Messages.Normal; leftFindings.Add(new Tuple <Color, string>(color, prepend + spaceComponents.NameComponents[en.Id].Name)); } //Gather information for right side Entity selectedEntity = spaceComponents.Entities.Where(x => x.Id == observer.SelectedItem).FirstOrDefault(); if (selectedEntity != null) { if (spaceComponents.NameComponents[selectedEntity.Id].Name == "You") { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("You see yourself here."))); } else { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, spaceComponents.NameComponents[selectedEntity.Id].Name)); } rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, spaceComponents.NameComponents[selectedEntity.Id].Description)); //If the finding is an AI, gather the information for it if ((selectedEntity.ComponentFlags & ComponentMasks.ObservableAI) == ComponentMasks.ObservableAI) { AIState state = spaceComponents.AIStateComponents[selectedEntity.Id]; AIAlignment alignment = spaceComponents.AIAlignmentComponents[selectedEntity.Id]; SkillLevelsComponent skills = spaceComponents.SkillLevelsComponents[selectedEntity.Id]; switch (alignment.Alignment) { case AIAlignments.ALIGNMENT_NONE: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, "Neutral")); break; case AIAlignments.ALIGNMENT_HOSTILE: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, "Hostile")); break; case AIAlignments.ALIGNMENT_FRIENDLY: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Good, "Friendly")); break; } switch (state.State) { case AIStates.STATE_SLEEPING: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.StatusChange, "Sleeping")); break; case AIStates.STATE_ROAMING: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.StatusChange, "Roaming")); break; case AIStates.STATE_ATTACKING: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.StatusChange, "Attacking")); break; case AIStates.STATE_FLEEING: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.StatusChange, "Fleeing")); break; } //Status Effects: Statuses statuses = StatusSystem.GetStatusEffectsOfEntity(spaceComponents, selectedEntity.Id, dungeonGrid); if (statuses == Statuses.NONE) { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, Messages.StatusMessages.Normal)); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); } //If there are status effects on the player.. else { if ((statuses & Statuses.BURNING) == Statuses.BURNING) { BurningComponent burning = spaceComponents.BurningComponents[selectedEntity.Id]; rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, string.Format(Messages.StatusMessages.Burning, burning.MinDamage, burning.MaxDamage, burning.TurnsLeft))); } if ((statuses & Statuses.UNDERWATER) == Statuses.UNDERWATER) { rightFindings.Add(new Tuple <Color, string>(Colors.Caves.WaterInRange, Messages.StatusMessages.Underwater)); } if ((statuses & Statuses.HEALTHREGEN) == Statuses.HEALTHREGEN) { HealthRegenerationComponent healthRegen = spaceComponents.HealthRegenerationComponents[selectedEntity.Id]; rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Good, string.Format(Messages.StatusMessages.HealthRegen, healthRegen.HealthRegain, healthRegen.RegenerateTurnRate))); } rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); } Entity player = spaceComponents.Entities.Where(x => (x.ComponentFlags & Component.COMPONENT_PLAYER) == Component.COMPONENT_PLAYER).First(); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, string.Format("Health: {0} / {1}", skills.CurrentHealth, skills.Health))); if (alignment.Alignment != AIAlignments.ALIGNMENT_FRIENDLY) { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Good, string.Format("You have a {0}% chance to hit.", Math.Ceiling(CombatSystem.CalculateAccuracy(spaceComponents, spaceComponents.SkillLevelsComponents[player.Id], player.Id, skills, selectedEntity.Id))))); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, string.Format("It has a {0}% chance of hitting you for a maximum of {1}.", Math.Ceiling(CombatSystem.CalculateAccuracy(spaceComponents, skills, selectedEntity.Id, spaceComponents.SkillLevelsComponents[player.Id], player.Id)), skills.MaximumDamage))); } } //If the observed item is an item, gather that information instead if ((selectedEntity.ComponentFlags & ComponentMasks.ObservableItem) == ComponentMasks.ObservableItem) { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); PickupComponent pickup = spaceComponents.PickupComponents[selectedEntity.Id]; switch (pickup.PickupType) { case ItemType.GOLD: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Special, "Gold")); break; case ItemType.CONSUMABLE: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.LootPickup, "Consumable")); break; case ItemType.ARTIFACT: rightFindings.Add(new Tuple <Color, string>(Colors.Messages.LootPickup, "Artifact")); break; } if ((selectedEntity.ComponentFlags & ComponentMasks.ObservableValue) == ComponentMasks.ObservableValue && pickup.PickupType != ItemType.DOWNSTAIRS) { ValueComponent value = spaceComponents.ValueComponents[selectedEntity.Id]; rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Special, string.Format("This item is worth {0} gold.", value.Gold))); } if ((selectedEntity.ComponentFlags & ComponentMasks.ObservableSkillModifications) == ComponentMasks.ObservableSkillModifications) { StatModificationComponent stats = spaceComponents.StatModificationComponents[selectedEntity.Id]; rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, "This artifact affects the following stats: ")); if (stats.AccuracyChange != 0) { string sign = stats.AccuracyChange > 0 ? "+" : string.Empty; Color color = stats.AccuracyChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Accuracy {0}{1}", sign, stats.AccuracyChange))); } if (stats.DefenseChange != 0) { string sign = stats.DefenseChange > 0 ? "+" : string.Empty; Color color = stats.DefenseChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Defense {0}{1}", sign, stats.DefenseChange))); } if (stats.HealthChange != 0) { string sign = stats.HealthChange > 0 ? "+" : string.Empty; Color color = stats.HealthChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Maximum Health {0}{1}", sign, stats.HealthChange))); } if (stats.DieNumberChange != 0) { string sign = stats.DieNumberChange > 0 ? "+" : string.Empty; Color color = stats.DieNumberChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Dice Number on Attack {0}{1}", sign, stats.DieNumberChange))); } if (stats.MinimumDamageChange != 0) { string sign = stats.MinimumDamageChange > 0 ? "+" : string.Empty; Color color = stats.MinimumDamageChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Minimum Damage {0}{1}", sign, stats.MinimumDamageChange))); } if (stats.MaximumDamageChange != 0) { string sign = stats.MaximumDamageChange > 0 ? "+" : string.Empty; Color color = stats.MaximumDamageChange > 0 ? Colors.Messages.Good : Colors.Messages.Bad; rightFindings.Add(new Tuple <Color, string>(color, string.Format("Maximum Damage {0}{1}", sign, stats.MaximumDamageChange))); } } if ((selectedEntity.ComponentFlags & ComponentMasks.ObservableUsage) == ComponentMasks.ObservableUsage) { ItemFunctionsComponent funcs = spaceComponents.ItemFunctionsComponents[selectedEntity.Id]; rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, System.Environment.NewLine)); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Good, string.Format("This item has {0} uses left.", funcs.Uses))); rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Bad, string.Format("This item loses {0} value per use.", funcs.CostToUse))); if (funcs.Ranged) { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, "This item is cast at a range.")); } else { rightFindings.Add(new Tuple <Color, string>(Colors.Messages.Normal, "This item is used where you stand.")); } } } } //Draw sections //Left section spriteBatch.Draw(UITexture, new Rectangle(0, 0, panelWidth, (int)camera.DungeonViewport.Height), Color.Black * .5f); foreach (Tuple <Color, string> message in leftFindings) { if (string.IsNullOrEmpty(message.Item2)) { continue; } string text = MessageDisplaySystem.WordWrap(font, message.Item2, panelWidth - messageSpacing); float textHeight = font.MeasureString(message.Item2).Y; spriteBatch.DrawString(font, text, new Vector2(messageSpacing, messageSpacing + (messageLeft * messageSpacing)), message.Item1); messageLeft += Regex.Matches(text, System.Environment.NewLine).Count; messageLeft += 1; } //Right section if (observer.Observed.Count > 0) { spriteBatch.Draw(UITexture, new Rectangle((int)camera.DungeonViewport.Bounds.Right - panelWidth, 0, panelWidth, (int)camera.DungeonViewport.Height), Color.Black * .5f); foreach (Tuple <Color, string> message in rightFindings) { if (string.IsNullOrEmpty(message.Item2)) { continue; } string text = MessageDisplaySystem.WordWrap(font, message.Item2, panelWidth - messageSpacing); float textHeight = font.MeasureString(message.Item2).Y; spriteBatch.DrawString(font, text, new Vector2((int)camera.DungeonViewport.Bounds.Right - panelWidth + messageSpacing, messageSpacing + (messageRight * messageSpacing)), message.Item1); messageRight += Regex.Matches(text, System.Environment.NewLine).Count; messageRight += 1; } } } }