using System; using System.Collections.Generic; using System.Linq; using System.Text; using VBXSE; using Microsoft.Xna.Framework; namespace ConqueringOneself { public static class Graphics { public static Main main; public static Color textColor = Color.White; public static Color selectedColor = Color.Red; //-------------- //Combat public static Sprite demonLord; public static Sprite background; public static float LETTERS_PER_SECOND = 40; public static float COOLDOWN_BETWEEN_LINES = 500; public static Sprite moveList; public static int TEXT_MOVELIST_X = 50; public static int TEXT_MOVELIST_Y = 400; public static int TEXT_MOVELIST_SPACING = 20; public static int TEXT_MOVELIST_COUNT = 10; public static List moveNames; public static int ICON_ML_X = 10; public static int ICON_ML_Y = 405; public static List moveIcons; public static Sprite textBox; public static int TEXT_MAIN_X = 70; public static int TEXT_MAIN_Y = 420; public static int TEXT_MAIN_SPACING = 20; public static int TEXT_MAIN_COUNT = 8; public static List mainText; public static int ICON_X = 30; public static int ICON_Y = 425; public static List icons; public static string nextIcon = ""; public static Sprite statBox; public static Sprite behindStat; public static Sprite hpBar; public static Sprite mpBar; public static GText hpText; public static GText mpText; public static int BAR_HP_LENGTH = 300; public static int TEXT_HP_X = 590; public static int TEXT_HP_Y = 418; public static int BAR_MP_LENGTH = 300; public static int TEXT_MP_X = 590; public static int TEXT_MP_Y = 445; public static Sprite explanationBox; public static GText explanationText; public static int TEXT_EXPLANATION_X = 370; public static int TEXT_EXPLANATION_Y = 490; public static List backlog = new List(); public static string printingLine = ""; public static float currentLetter = 0; public static float lineCooldown = 0; public static bool hurryUp = false; //---------------- //Title screen public static Sprite title_background; public static int TEXT_TITLE_MENU_X = 80; public static int TEXT_TITLE_MENU_Y = 250; public static int TEXT_TITLE_MENU_SPACING = 50; public static List title_options; public static int TEXT_TITLE_TEXT_X = 480; public static int TEXT_TITLE_TEXT_Y = 280; public static int TEXT_TITLE_TEXT_SPACING = 20; public static int ICON_TITLE_X = 440; public static int ICON_TITLE_Y = 285; public static List title_text; public static List title_icons; public static string[] TITLE_MENU_OPTIONS = new string[] { "FIGHT THE DEMON LORD", "ANALYSIS", "VIEW HIGH SCORES", "ERASE SAVED DATA", "EXIT" }; public static int scroll = 0; //-------------- //Level up public static Sprite levelup_background; public static int TEXT_LEVELUP_MENU_X = 300; public static int TEXT_LEVELUP_MENU_Y = 250; public static int TEXT_LEVELUP_MENU_SPACING = 30; public static int TEXT_LEVELUP_TEXT_X = 250; public static int TEXT_LEVELUP_TEXT_Y = 150; public static int TEXT_LUEXPLANATION_X = 250; public static int TEXT_LUEXPLANATION_Y = 380; public static GText levelup_text; public static GText levelup_explanation; public static List levelup_options; public static int ICON_LU_X = 260; public static int ICON_LU_Y = 255; public static List levelup_icons; public static void Initialize(Main main) { Graphics.main = main; //----------------- //Combat moveNames = new List(); for (int i = 0; i < TEXT_MOVELIST_COUNT; i++) { GText moveText = SpriteEngine.CreateGText("", TEXT_MOVELIST_X, TEXT_MOVELIST_Y + TEXT_MOVELIST_SPACING * i); moveText.enabled = false; moveText.depth = -10; moveNames.Add(moveText); } moveList = SpriteEngine.CreateSprite("movelist", Vector2.Zero); moveList.depth = -9; moveList.enabled = false; moveIcons = new List(); mainText = new List(); for (int i = 0; i < TEXT_MAIN_COUNT; i++) { GText text = SpriteEngine.CreateGText("", TEXT_MAIN_X, TEXT_MAIN_Y + TEXT_MAIN_SPACING * i); text.depth = -5; mainText.Add(text); } textBox = SpriteEngine.CreateSprite("textbox", Vector2.Zero); textBox.depth = -4; icons = new List(); demonLord = SpriteEngine.CreateSprite("demonlord", Vector2.Zero); demonLord.enabled = false; background = SpriteEngine.CreateSprite("castle", Vector2.Zero); background.depth = 5000; statBox = SpriteEngine.CreateSprite("statbox", Vector2.Zero); statBox.depth = -8; behindStat = SpriteEngine.CreateSprite("behindstat", Vector2.Zero); behindStat.depth = -7; hpBar = SpriteEngine.CreateSprite("hpbar", Vector2.Zero); hpBar.depth = -7.5f; hpText = SpriteEngine.CreateGText("0/0", TEXT_HP_X, TEXT_HP_Y); hpText.depth = -8.5f; mpBar = SpriteEngine.CreateSprite("mpbar", Vector2.Zero); mpBar.depth = -7.5f; mpText = SpriteEngine.CreateGText("0/0", TEXT_MP_X, TEXT_MP_Y); mpText.depth = -8.5f; explanationBox = SpriteEngine.CreateSprite("explanationbox", Vector2.Zero); explanationBox.depth = -5.5f; explanationText = SpriteEngine.CreateGText("", TEXT_EXPLANATION_X, TEXT_EXPLANATION_Y); explanationText.depth = -6; //-------- //Title screen title_background = SpriteEngine.CreateSprite("title", Vector2.Zero); title_background.depth = 5000; title_background.enabled = false; title_options = new List(); for (int i = 0; i < TITLE_MENU_OPTIONS.Length; i++) { GText text = SpriteEngine.CreateGText(TITLE_MENU_OPTIONS[i], TEXT_TITLE_MENU_X, TEXT_TITLE_MENU_Y + i * TEXT_TITLE_MENU_SPACING); text.enabled = false; text.depth = -10; title_options.Add(text); } title_text = new List(); title_icons = new List(); //---------- //Level up levelup_background = SpriteEngine.CreateSprite("levelup"); levelup_background.depth = -20; levelup_background.enabled = false; levelup_text = SpriteEngine.CreateGText("", TEXT_LEVELUP_TEXT_X, TEXT_LEVELUP_TEXT_Y); levelup_text.depth = -25; levelup_text.enabled = false; levelup_explanation = SpriteEngine.CreateGText("", TEXT_LUEXPLANATION_X, TEXT_LUEXPLANATION_Y); levelup_explanation.depth = -25; levelup_explanation.enabled = false; levelup_options = new List(); for (int i = 0; i < Main.LEVELUP_MOVE_CHOICES; i++) { GText text = SpriteEngine.CreateGText("", TEXT_LEVELUP_MENU_X, TEXT_LEVELUP_MENU_Y + i * TEXT_LEVELUP_MENU_SPACING); text.depth = -30; text.enabled = false; levelup_options.Add(text); } levelup_icons = new List(); } public static void DisplayMoves() { int offset = main.selectedItem; offset -= TEXT_MOVELIST_COUNT; if (offset < 0) offset = 0; //Display moves for (int i = 0; i < TEXT_MOVELIST_COUNT; i++) { moveNames[i].text = ""; moveNames[i].color = textColor; if (i + offset < main.player.availableAttacks.Count) //If in range { moveNames[i].text = main.player.availableAttacks[i + offset].name; if (i + offset == main.selectedItem) { moveNames[i].color = selectedColor; } } moveNames[i].enabled = true; } moveList.enabled = true; //Display icons for (int i = 0; i < main.player.availableAttacks.Count; i++) { Sprite sprite = GetIcon(main.player.availableAttacks[i].name); sprite.SetPosition(ICON_ML_X, ICON_ML_Y + TEXT_MOVELIST_SPACING * i); sprite.depth = -10; moveIcons.Add(sprite); } //Resize HP/MP boxes hpBar.SetX(BAR_HP_LENGTH - ((float)main.player.HP / (float)(main.player.maxHP)) * (float)BAR_HP_LENGTH); mpBar.SetX(BAR_MP_LENGTH - ((float)main.player.MP / (float)(main.player.maxMP)) * (float)BAR_MP_LENGTH); //Update texts hpText.text = main.player.HP + "/" + main.player.maxHP; mpText.text = main.player.MP + "/" + main.player.maxMP; explanationText.text = Attack.GetExplanation(main.player.availableAttacks[main.selectedItem].id); //Also display statbox and explanation statBox.enabled = true; behindStat.enabled = true; hpBar.enabled = true; mpBar.enabled = true; hpText.enabled = true; mpText.enabled = true; explanationBox.enabled = true; explanationText.enabled = true; } public static void HideMoves() { for (int i = 0; i < TEXT_MOVELIST_COUNT; i++) { moveNames[i].enabled = false; } moveList.enabled = false; //Erase icons for (int i = 0; i < moveIcons.Count; i++) { if (moveIcons[i] != null) { SpriteEngine.EraseGObject(moveIcons[i]); } } moveIcons.Clear(); //Also hide statbox and explanation statBox.enabled = false; behindStat.enabled = false; hpBar.enabled = false; mpBar.enabled = false; hpText.enabled = false; mpText.enabled = false; explanationBox.enabled = false; explanationText.enabled = false; } public static void DisplayCombatStuff() { for (int i = 0; i < TEXT_MAIN_COUNT; i++) { mainText[i].enabled = true; } textBox.enabled = true; } public static void HideCombatStuff() { for (int i = 0; i < TEXT_MAIN_COUNT; i++) { mainText[i].enabled = false; } textBox.enabled = false; } public static void EraseCombatLog() { for (int i = 0; i < TEXT_MAIN_COUNT; i++) { mainText[i].text = ""; } for (int i = 0; i < icons.Count; i++) { if (icons[i] != null) { SpriteEngine.EraseGObject(icons[i]); } } icons.Clear(); } public static void ShowDemonLord() { demonLord.enabled = true; } public static void HideDemonLord() { demonLord.enabled = false; } public static void ShowBackground() { background.enabled = true; } public static void HideBackground() { background.enabled = false; } public static void DisplayTitle() { title_background.enabled = true; for (int i = 0; i < title_options.Count; i++) { title_options[i].enabled = true; if (i == main.selectedItem) title_options[i].color = selectedColor; else title_options[i].color = textColor; } EraseTitleStuff(); /*"FIGHT THE DEMON LORD", "ANALYSIS", "VIEW HIGH SCORES", "ERASE SAVED DATA", "EXIT"*/ switch (TITLE_MENU_OPTIONS[main.selectedItem]) { case "FIGHT THE DEMON LORD": { GText text = SpriteEngine.CreateGText("", TEXT_TITLE_TEXT_X, TEXT_TITLE_TEXT_Y); text.depth = -20; text.text = "Press ENTER to fight the\nDemon Lord.\n\n" + main.player.name + "'s stats:\nLevel: " + main.level + "\nHP: " + main.player.maxHP + "\nMP: " + main.player.maxMP + "\n\n" + "You have defeated the\nDemon Lord " + main.victories + " times, and\nhave been defeated\n" + main.losses + " times."; title_text.Add(text); } break; case "ANALYSIS": { int yStart = TEXT_TITLE_TEXT_Y; int excess = main.enemyPattern.Count - 6; if (excess < 0) excess = 0; yStart -= (int)Math.Round((float)excess - TEXT_TITLE_TEXT_SPACING / 2); GText topText = SpriteEngine.CreateGText("Enemy attack pattern:", TEXT_TITLE_TEXT_X, yStart); title_text.Add(topText); for (int i = scroll; i < main.enemyPattern.Count; i++) { GText text = SpriteEngine.CreateGText(main.enemyPattern[i].name, TEXT_TITLE_TEXT_X, yStart + (i + 1 - scroll) * TEXT_TITLE_TEXT_SPACING); text.depth = -20; title_text.Add(text); Sprite icon = GetIcon(main.enemyPattern[i].name); icon.SetPosition(ICON_TITLE_X, yStart + 5 + (i + 1 - scroll) * TEXT_TITLE_TEXT_SPACING); icon.depth = -20; title_icons.Add(icon); } } break; case "VIEW HIGH SCORES": { int yStart = TEXT_TITLE_TEXT_Y; int excess = HighScores.scores.Count - 6; if (excess < 0) excess = 0; yStart -= (int)Math.Round((float)excess - TEXT_TITLE_TEXT_SPACING / 2); GText topText = SpriteEngine.CreateGText("Highest levels reached:", TEXT_TITLE_TEXT_X, yStart); title_text.Add(topText); for (int i = scroll; i < HighScores.scores.Count; i++) { GText text = SpriteEngine.CreateGText("[" + (i + 1) + "] " + HighScores.scores[i].level + " - " + HighScores.scores[i].name , TEXT_TITLE_TEXT_X, yStart + (i + 1 - scroll) * TEXT_TITLE_TEXT_SPACING); if (HighScores.scores[i].uid == main.userID) { text.color = selectedColor; } else { text.color = textColor; } text.depth = -20; title_text.Add(text); } } break; case "ERASE SAVED DATA": { GText text = SpriteEngine.CreateGText("", TEXT_TITLE_TEXT_X, TEXT_TITLE_TEXT_Y); text.depth = -20; text.text = "Erasing your saved data will\nreset the Demon Lord, but\nwill also reset your\nprogress.\n" + "Once deleted, your data\ncannot be recovered.\n\nType 'YES' if you are certain\nyou want to delete your\ndata."; title_text.Add(text); } break; case "EXIT": { GText text = SpriteEngine.CreateGText("", TEXT_TITLE_TEXT_X, TEXT_TITLE_TEXT_Y); text.depth = -20; text.text = "Press ENTER to abandon your\nmission and give the\nDemon Lord free reign."; title_text.Add(text); } break; } } public static void EraseTitleStuff() { for (int i = 0; i < title_text.Count; i++) { if (title_text[i] != null) SpriteEngine.EraseGObject(title_text[i]); } title_text.Clear(); for (int i = 0; i < title_icons.Count; i++) { if (title_icons[i] != null) SpriteEngine.EraseGObject(title_icons[i]); } title_icons.Clear(); } public static void HideTitle() { title_background.enabled = false; for (int i = 0; i < title_options.Count; i++) { title_options[i].enabled = false; } EraseTitleStuff(); } public static void DisplayLevelUp(int HP_increase = -1, int MP_increase = -1) { levelup_background.enabled = true; levelup_explanation.enabled = true; if (HP_increase != -1) levelup_text.text = "Your HP rose by " + HP_increase + "!\nYour MP rose by " + MP_increase + "!\n\nYou can now learn a new attack:"; levelup_text.enabled = true; for (int i = 0; i < levelup_options.Count; i++) { levelup_options[i].enabled = true; if (main.selectedItem == i) levelup_options[i].color = selectedColor; else levelup_options[i].color = textColor; } levelup_explanation.text = Attack.GetExplanation(main.levelUpAttacks[main.selectedItem].id); } public static void SetLevelUpAttacks(List attacks) { for (int i = 0; i < levelup_options.Count; i++) { levelup_options[i].text = attacks[i].name; Sprite icon = GetIcon(attacks[i].name); icon.SetPosition(ICON_LU_X, ICON_LU_Y + i * TEXT_LEVELUP_MENU_SPACING); icon.depth = -30; levelup_icons.Add(icon); } } public static void HideLevelUp() { levelup_background.enabled = false; levelup_explanation.enabled = false; levelup_text.enabled = false; for (int i = 0; i < levelup_options.Count; i++) { levelup_options[i].enabled = false; } for (int i = 0; i < levelup_icons.Count; i++) { if (levelup_icons[i] != null) SpriteEngine.EraseGObject(levelup_icons[i]); } levelup_icons.Clear(); } public static Sprite GetIcon(string name) { string validName = "icon_" + name; if (!SpriteEngine.textures.ContainsKey(validName)) validName = "icon"; return SpriteEngine.CreateSprite(validName); } public static void Msg(string line) { backlog.Add(line); } public static void Update(GameTime gameTime) { if (hurryUp) { if (currentLetter >= printingLine.Length) { lineCooldown = 999999; } else { currentLetter = printingLine.Length; } hurryUp = false; } //Grab new line from backlog if (backlog.Count > 0 && lineCooldown > COOLDOWN_BETWEEN_LINES) { string text = backlog[0]; if (text.StartsWith("!")) { switch (text) { case "!victory": Audio.PlayMusic("TheWorldIsSaved", false); HideDemonLord(); break; case "!defeat": Audio.PlayMusic("AllHopeIsLost", false); HideBackground(); HideDemonLord(); break; } if (text.StartsWith("!sound")) { Audio.PlaySound(text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)[1]); } else if (text.StartsWith("!icon")) { nextIcon = text.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)[1]; } } else { //Erase top icon if (icons.Count >= TEXT_MAIN_COUNT) { if (icons[0] != null) SpriteEngine.EraseGObject(icons[0]); icons.RemoveAt(0); } //Cascade messages and icons for (int i = 0; i < TEXT_MAIN_COUNT - 1; i++) { mainText[i].text = mainText[i + 1].text; if (icons.Count > i) icons[i].SetY(icons[i].position.Y - TEXT_MAIN_SPACING); } //Add message printingLine = text; currentLetter = 0; lineCooldown = 0; //Add icon Sprite icon = GetIcon(nextIcon); icon.SetPosition(ICON_X, ICON_Y + (TEXT_MAIN_COUNT - 1) * TEXT_MAIN_SPACING); icon.depth = -5; icons.Add(icon); nextIcon = ""; } backlog.RemoveAt(0); } if (mainText[TEXT_MAIN_COUNT - 1].text == printingLine || printingLine == "") { lineCooldown += (float)gameTime.ElapsedGameTime.TotalMilliseconds; if (backlog.Count == 0 && main.gameState == Main.GameState.HandlingText) main.gameState = Main.GameState.ClickToContinue; } currentLetter += LETTERS_PER_SECOND * (float)gameTime.ElapsedGameTime.TotalSeconds; int toPrint = (int)Math.Floor(currentLetter); if (toPrint > printingLine.Length) toPrint = printingLine.Length; mainText[TEXT_MAIN_COUNT - 1].text = printingLine.Substring(0, toPrint); } } }