#region File Description //----------------------------------------------------------------------------- // StatisticsScreen.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; using RolePlayingGameData; #endregion namespace RolePlaying { /// /// Draws the statistics for a particular Player. /// class StatisticsScreen : GameScreen { /// /// This is used ass the Player NPC to display statistics of the player /// private Player player; #region Graphics Data private Texture2D statisticsScreen; private Texture2D selectButton; private Texture2D backButton; private Texture2D dropButton; private Texture2D statisticsBorder; private Texture2D plankTexture; private Texture2D fadeTexture; private Texture2D goldIcon; private Texture2D scoreBoardTexture; private Texture2D rightTriggerButton; private Texture2D leftTriggerButton; private Texture2D borderLine; private Rectangle screenRectangle; private const int intervalBetweenEachInfo = 30; private int playerIndex = 0; private AnimatingSprite screenAnimation; #endregion #region Positions private readonly Vector2 playerTextPosition = new Vector2(515, 200); private Vector2 currentTextPosition; private readonly Vector2 scoreBoardPosition = new Vector2(1160, 354); private Vector2 placeTextMid; private Vector2 statisticsNamePosition; private readonly Vector2 shieldPosition = new Vector2(1124, 253); private readonly Vector2 idlePortraitPosition = new Vector2(300f, 380f); private readonly Vector2 dropButtonPosition = new Vector2(900, 640); private readonly Vector2 statisticsBorderPosition = new Vector2(180, 147); private readonly Vector2 borderLinePosition = new Vector2(184, 523); private readonly Vector2 characterNamePosition = new Vector2(330, 180); private readonly Vector2 classNamePosition = new Vector2(330, 465); private Vector2 plankPosition; private readonly Vector2 goldIconPosition = new Vector2(490, 640); private readonly Vector2 weaponPosition = new Vector2(790, 220); private readonly Vector2 armorPosition = new Vector2(790, 346); private readonly Vector2 weaponTextPosition = new Vector2(790, 285); private readonly Vector2 leftTriggerPosition = new Vector2(340, 50); private readonly Vector2 rightTriggerPosition = new Vector2(900, 50); private readonly Vector2 iconPosition = new Vector2(100, 200); private readonly Vector2 selectButtonPosition = new Vector2(1150, 640); private readonly Vector2 backButtonPosition = new Vector2(80, 640); private readonly Vector2 goldPosition = new Vector2(565, 648); #endregion #region Initialization /// /// Creates a new StatisticsScreen object for the first party member. /// public StatisticsScreen() : this(Session.Party.Players[0]) { } /// /// Creates a new StatisticsScreen object for the given player. /// public StatisticsScreen(Player player) : base() { this.IsPopup = true; this.player = player; screenAnimation = new AnimatingSprite(); screenAnimation.FrameDimensions = player.MapSprite.FrameDimensions; screenAnimation.FramesPerRow = player.MapSprite.FramesPerRow; screenAnimation.SourceOffset = player.MapSprite.SourceOffset; screenAnimation.Texture = player.MapSprite.Texture; screenAnimation.AddAnimation(new Animation("Idle", 43, 48, 150, true)); screenAnimation.PlayAnimation(0); } /// /// Loads graphics content from the content manager. /// public override void LoadContent() { ContentManager content = ScreenManager.Game.Content; Viewport viewport = ScreenManager.GraphicsDevice.Viewport; statisticsScreen = content.Load(@"Textures\GameScreens\GameScreenBkgd"); plankTexture = content.Load(@"Textures\MainMenu\MainMenuPlank03"); scoreBoardTexture = content.Load(@"Textures\GameScreens\CountShieldWithArrow"); leftTriggerButton = content.Load(@"Textures\Buttons\LeftTriggerButton"); rightTriggerButton = content.Load(@"Textures\Buttons\RightTriggerButton"); backButton = content.Load(@"Textures\Buttons\BButton"); selectButton = content.Load(@"Textures\Buttons\AButton"); dropButton = content.Load(@"Textures\Buttons\YButton"); statisticsBorder = content.Load(@"Textures\GameScreens\StatsBorderTable"); borderLine = content.Load(@"Textures\GameScreens\LineBorder"); goldIcon = content.Load(@"Textures\GameScreens\GoldIcon"); fadeTexture = content.Load(@"Textures\GameScreens\FadeScreen"); screenRectangle = new Rectangle(viewport.X, viewport.Y, viewport.Width, viewport.Height); statisticsNamePosition.X = (viewport.Width - Fonts.HeaderFont.MeasureString("Statistics").X) / 2; statisticsNamePosition.Y = 90f; plankPosition.X = (viewport.Width - plankTexture.Width) / 2; plankPosition.Y = 67f; } #endregion #region Updating /// /// Handle user input. /// public override void HandleInput() { // exit the screen if (InputManager.IsActionTriggered(InputManager.Action.Back)) { ExitScreen(); return; } // shows the spells for this player else if (InputManager.IsActionTriggered(InputManager.Action.Ok)) { ScreenManager.AddScreen(new SpellbookScreen(player, player.CharacterStatistics)); return; } // show the equipment for this player, allowing the user to unequip else if (InputManager.IsActionTriggered(InputManager.Action.TakeView)) { ScreenManager.AddScreen(new EquipmentScreen(player)); return; } else if (Session.Party.Players.Contains(player)) // player is in the party { // move to the previous screen if (InputManager.IsActionTriggered(InputManager.Action.PageLeft)) { ExitScreen(); ScreenManager.AddScreen(new QuestLogScreen(null)); return; } // move to the next screen else if (InputManager.IsActionTriggered(InputManager.Action.PageRight)) { ExitScreen(); ScreenManager.AddScreen(new InventoryScreen(true)); return; } // move to the previous party member else if (InputManager.IsActionTriggered(InputManager.Action.CursorUp)) { playerIndex--; if (playerIndex < 0) { playerIndex = Session.Party.Players.Count - 1; } Player newPlayer = Session.Party.Players[playerIndex]; if (newPlayer != player) { player = newPlayer; screenAnimation = new AnimatingSprite(); screenAnimation.FrameDimensions = player.MapSprite.FrameDimensions; screenAnimation.FramesPerRow = player.MapSprite.FramesPerRow; screenAnimation.SourceOffset = player.MapSprite.SourceOffset; screenAnimation.Texture = player.MapSprite.Texture; screenAnimation.AddAnimation( new Animation("Idle", 43, 48, 150, true)); screenAnimation.PlayAnimation(0); } } // move to the next party member else if (InputManager.IsActionTriggered(InputManager.Action.CursorDown)) { playerIndex++; if (playerIndex >= Session.Party.Players.Count) { playerIndex = 0; } Player newPlayer = Session.Party.Players[playerIndex]; if (newPlayer != player) { player = newPlayer; screenAnimation = new AnimatingSprite(); screenAnimation.FrameDimensions = player.MapSprite.FrameDimensions; screenAnimation.FramesPerRow = player.MapSprite.FramesPerRow; screenAnimation.SourceOffset = player.MapSprite.SourceOffset; screenAnimation.Texture = player.MapSprite.Texture; screenAnimation.AddAnimation( new Animation("Idle", 43, 48, 150, true)); screenAnimation.PlayAnimation(0); } } } } #endregion #region Drawing /// /// Draws the screen. /// public override void Draw(GameTime gameTime) { screenAnimation.UpdateAnimation( (float)gameTime.ElapsedGameTime.TotalSeconds); ScreenManager.SpriteBatch.Begin(); DrawStatistics(); ScreenManager.SpriteBatch.End(); } /// /// Draws the player statistics. /// private void DrawStatistics() { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; // Draw faded screen spriteBatch.Draw(fadeTexture, screenRectangle, Color.White); // Draw the Statistics Screen spriteBatch.Draw(statisticsScreen, screenRectangle, Color.White); spriteBatch.Draw(plankTexture, plankPosition, Color.White); spriteBatch.Draw(statisticsBorder, statisticsBorderPosition, Color.White); spriteBatch.Draw(borderLine, borderLinePosition, Color.White); spriteBatch.Draw(screenAnimation.Texture, idlePortraitPosition, screenAnimation.SourceRectangle, Color.White, 0f, new Vector2(screenAnimation.SourceOffset.X, screenAnimation.SourceOffset.Y), 1f, SpriteEffects.None, 0f); spriteBatch.DrawString(Fonts.HeaderFont, "Statistics", statisticsNamePosition, Fonts.TitleColor); DrawPlayerDetails(); DrawButtons(); } /// /// D /// private void DrawButtons() { if (!IsActive) { return; } SpriteBatch spriteBatch = ScreenManager.SpriteBatch; Vector2 position = new Vector2(); if (Session.Party.Players.Contains(player)) { // Left Trigger position = leftTriggerPosition; spriteBatch.Draw(leftTriggerButton, position, Color.White); // Draw Left Trigger Information position.Y += leftTriggerButton.Height; placeTextMid = Fonts.PlayerStatisticsFont.MeasureString("Quest"); position.X += (leftTriggerButton.Width / 2) - placeTextMid.X / 2; spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Quest", position, Color.Black); // Right Trigger position = rightTriggerPosition; spriteBatch.Draw(rightTriggerButton, position, Color.White); // Draw Right Trigger Information position.Y += rightTriggerButton.Height; placeTextMid = Fonts.PlayerStatisticsFont.MeasureString("Items"); position.X += (leftTriggerButton.Width / 2) - placeTextMid.X / 2; spriteBatch.DrawString(Fonts.PlayerStatisticsFont, "Items", position, Color.Black); } // Back Button spriteBatch.Draw(backButton, backButtonPosition, Color.White); spriteBatch.Draw(selectButton, selectButtonPosition, Color.White); position = selectButtonPosition; position.X -= Fonts.ButtonNamesFont.MeasureString("Spellbook").X + 10f; position.Y += 5; spriteBatch.DrawString(Fonts.ButtonNamesFont, "Spellbook", position, Color.White); // Draw Back position = backButtonPosition; position.X += backButton.Width + 10f; position.Y += 5; spriteBatch.DrawString(Fonts.ButtonNamesFont, "Back", position, Color.White); // Draw drop Button spriteBatch.Draw(dropButton, dropButtonPosition, Color.White); position = dropButtonPosition; position.X -= Fonts.ButtonNamesFont.MeasureString("Equipment").X + 10; position.Y += 5; spriteBatch.DrawString(Fonts.ButtonNamesFont, "Equipment", position, Color.White); // Draw Gold Icon spriteBatch.Draw(goldIcon, goldIconPosition, Color.White); } /// /// Draws player information. /// private void DrawPlayerDetails() { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; if (player != null) { currentTextPosition.X = playerTextPosition.X; currentTextPosition.Y = playerTextPosition.Y; // Current Level spriteBatch.DrawString(Fonts.DescriptionFont, "Level: " + player.CharacterLevel, currentTextPosition, Color.Black); // Health Points currentTextPosition.Y += intervalBetweenEachInfo; spriteBatch.DrawString(Fonts.DescriptionFont, "Health Points: " + player.CurrentStatistics.HealthPoints + "/" + player.CharacterStatistics.HealthPoints, currentTextPosition, Color.Black); // Magic Points currentTextPosition.Y += intervalBetweenEachInfo; spriteBatch.DrawString(Fonts.DescriptionFont, "Magic Points: " + player.CurrentStatistics.MagicPoints + "/" + player.CharacterStatistics.MagicPoints, currentTextPosition, Color.Black); // Experience Details currentTextPosition.Y += intervalBetweenEachInfo; if (player.IsMaximumCharacterLevel) { spriteBatch.DrawString(Fonts.DescriptionFont, "Experience: Maximum", currentTextPosition, Color.Black); } else { spriteBatch.DrawString(Fonts.DescriptionFont, "Experience: " + player.Experience + "/" + player.ExperienceForNextLevel, currentTextPosition, Color.Black); } DrawEquipmentInfo(player); DrawModifiers(player); DrawEquipmentStatistics(player); if (player == null) { DrawPlayerCount(); } } // Draw Gold spriteBatch.DrawString(Fonts.ButtonNamesFont, Fonts.GetGoldString(Session.Party.PartyGold), goldPosition, Color.White); } /// /// Draws Current Selected Player Count to Total Player count /// private void DrawPlayerCount() { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; Vector2 position = new Vector2(); // Draw the ScoreBoard spriteBatch.Draw(scoreBoardTexture, shieldPosition, Color.White); position = scoreBoardPosition; position.X = scoreBoardPosition.X - Fonts.GearInfoFont.MeasureString((playerIndex + 1).ToString()).X / 2; // Draw Current Selected Player Count spriteBatch.DrawString(Fonts.GearInfoFont, (playerIndex + 1).ToString(), position, Fonts.CountColor); position.X = scoreBoardPosition.X - Fonts.GearInfoFont.MeasureString( Session.Party.Players.Count.ToString()).X / 2; position.Y += 30; // Draw Total Player count spriteBatch.DrawString(Fonts.GearInfoFont, Session.Party.Players.Count.ToString(), position, Fonts.CountColor); } /// /// Draw Equipment Info of the player selected /// /// The selected player private void DrawEquipmentInfo(Player selectedPlayer) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; // Character name currentTextPosition = characterNamePosition; currentTextPosition.X -= Fonts.HeaderFont.MeasureString(selectedPlayer.Name).X / 2; spriteBatch.DrawString(Fonts.HeaderFont, selectedPlayer.Name, currentTextPosition, Fonts.TitleColor); // Class name currentTextPosition = classNamePosition; currentTextPosition.X -= Fonts.GearInfoFont.MeasureString( selectedPlayer.CharacterClass.Name).X / 2; spriteBatch.DrawString(Fonts.GearInfoFont, selectedPlayer.CharacterClass.Name, currentTextPosition, Color.Black); } /// /// Draw Base Amount Plus any Modifiers /// /// The selected player private void DrawModifiers(Player selectedPlayer) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; currentTextPosition.X = playerTextPosition.X; currentTextPosition.Y = playerTextPosition.Y + 150; // PO + Modifiers spriteBatch.DrawString(Fonts.DescriptionFont, "Physical Offense: " + selectedPlayer.CurrentStatistics.PhysicalOffense, currentTextPosition, Color.Black); // PD + Modifiers currentTextPosition.Y += intervalBetweenEachInfo; spriteBatch.DrawString(Fonts.DescriptionFont, "Physical Defense: " + selectedPlayer.CurrentStatistics.PhysicalDefense, currentTextPosition, Color.Black); // MO + Modifiers currentTextPosition.Y += intervalBetweenEachInfo; spriteBatch.DrawString(Fonts.DescriptionFont, "Magical Offense: " + selectedPlayer.CurrentStatistics.MagicalOffense, currentTextPosition, Color.Black); // MD + Modifiers currentTextPosition.Y += intervalBetweenEachInfo; spriteBatch.DrawString(Fonts.DescriptionFont, "Magical Defense: " + selectedPlayer.CurrentStatistics.MagicalDefense, currentTextPosition, Color.Black); } /// /// Draw the equipment statistics /// /// The selected Player private void DrawEquipmentStatistics(Player selectedPlayer) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; Vector2 position = weaponPosition; Int32Range healthDamageRange = new Int32Range(); healthDamageRange.Minimum = healthDamageRange.Maximum = selectedPlayer.CurrentStatistics.PhysicalOffense; Weapon weapon = selectedPlayer.GetEquippedWeapon(); if (weapon != null) { weapon.DrawIcon(ScreenManager.SpriteBatch, position); healthDamageRange += weapon.TargetDamageRange; } position = armorPosition; Int32Range healthDefenseRange = new Int32Range(); healthDefenseRange.Minimum = healthDefenseRange.Maximum = selectedPlayer.CurrentStatistics.PhysicalDefense; Int32Range magicDefenseRange = new Int32Range(); magicDefenseRange.Minimum = magicDefenseRange.Maximum = selectedPlayer.CurrentStatistics.MagicalDefense; for (int i = 0; i < (int)4; i++) { Armor armor = selectedPlayer.GetEquippedArmor((Armor.ArmorSlot)i); if (armor != null) { armor.DrawIcon(ScreenManager.SpriteBatch, position); healthDefenseRange += armor.OwnerHealthDefenseRange; magicDefenseRange += armor.OwnerMagicDefenseRange; } position.X += 68; } position = weaponTextPosition; spriteBatch.DrawString(Fonts.DescriptionFont, "Weapon Attack: " + "(" + healthDamageRange.Minimum + "," + healthDamageRange.Maximum + ")", position, Color.Black); position.Y += 130; spriteBatch.DrawString(Fonts.DescriptionFont, "Weapon Defense: " + "(" + healthDefenseRange.Minimum + "," + healthDefenseRange.Maximum + ")", position, Color.Black); position.Y += 30; spriteBatch.DrawString(Fonts.DescriptionFont, "Spell Defense: " + "(" + magicDefenseRange.Minimum + "," + magicDefenseRange.Maximum + ")", position, Color.Black); } #endregion } }