// Returns the text formatted without any format codes in. public static LetterString FormatString(string text) { int currentCharacter = 0; Color currentColor = Letter.DefaultColor; LetterString letterString = new LetterString(); bool inCode = false; string currentCode = ""; while (currentCharacter < text.Length) { if (!inCode && text[currentCharacter] == '<') { // Start string code inCode = true; } else if (inCode) { if (text[currentCharacter] == '>') { // End string code FormatCodeType codeType = FormatCodes.GetFormatCodeType(currentCode); if (codeType == FormatCodeType.String || codeType == FormatCodeType.Variable) { string stringCode = FormatCodes.GetFormatCodeString(currentCode); letterString.AddRange(stringCode, currentColor); } else if (codeType == FormatCodeType.Color) { Color colorCode = FormatCodes.GetFormatCodeColor(currentCode); if (colorCode == currentColor) { currentColor = Letter.DefaultColor; } else { currentColor = colorCode; } } else { // Invalid code } inCode = false; currentCode = ""; } else { currentCode += text[currentCharacter]; } } else { letterString.Add(new Letter(text[currentCharacter], currentColor)); } currentCharacter++; } return(letterString); }
// Returns a substring of the letter string. public LetterString Substring(int startIndex, int length) { LetterString letterString = new LetterString(); for (int i = 0; i < length; i++) { letterString.letters.Add(letters[startIndex + i]); } return(letterString); }
// Returns a substring of the letter string. public LetterString Substring(int startIndex) { LetterString letterString = new LetterString(); for (int i = startIndex; i < letters.Count; i++) { letterString.letters.Add(letters[i]); } return(letterString); }
//----------------------------------------------------------------------------- // Constructors //----------------------------------------------------------------------------- public InventoryMenu(GameManager gameManager) : base(gameManager) { this.previousMenu = null; this.nextMenu = null; this.drawHUD = true; this.description = new LetterString(); this.textPosition = 0; this.textTimer = 0; this.textStart = 0; this.inSubMenu = false; }
// Returns true if the letter string ends with the specified letter string. public bool EndsWith(LetterString letterString) { if (letters.Count >= letterString.letters.Count) { for (int i = 0; i < letterString.letters.Count; i++) { if (letters[letters.Count - letterString.letters.Count + i] != letterString.letters[i]) { return(false); } } return(true); } return(false); }
// Returns the text formatted without any format codes in. public static LetterString FormatString(string text) { int currentCharacter = 0; Color currentColor = Letter.DefaultColor; LetterString letterString = new LetterString(); bool inCode = false; string currentCode = ""; while (currentCharacter < text.Length) { if (!inCode && text[currentCharacter] == '<') { // Start string code inCode = true; } else if (inCode) { if (text[currentCharacter] == '>') { // End string code FormatCodeType codeType = FormatCodes.GetFormatCodeType(currentCode); if (codeType == FormatCodeType.String || codeType == FormatCodeType.Variable) { string stringCode = FormatCodes.GetFormatCodeString(currentCode); letterString.AddRange(stringCode, currentColor); } else if (codeType == FormatCodeType.Color) { Color colorCode = FormatCodes.GetFormatCodeColor(currentCode); if (colorCode == currentColor) currentColor = Letter.DefaultColor; else currentColor = colorCode; } else { // Invalid code } inCode = false; currentCode = ""; } else { currentCode += text[currentCharacter]; } } else { letterString.Add(new Letter(text[currentCharacter], currentColor)); } currentCharacter++; } return letterString; }
// Returns true if the specified letter string is equal to the letter string. public override bool Equals(object obj) { if (obj is LetterString) { LetterString ls = (LetterString)obj; if (letters.Count == ls.letters.Count) { for (int i = 0; i < letters.Count; i++) { if (letters[i] != ls.letters[i]) { return(false); } } return(true); } } return(false); }
// Returns a substring of the letter string. public LetterString Substring(int startIndex) { LetterString letterString = new LetterString(); for (int i = startIndex; i < letters.Count; i++) { letterString.letters.Add(letters[i]); } return letterString; }
// Returns true if the letter string starts with the specified letter string. public bool StartsWith(LetterString letterString) { if (letters.Count >= letterString.letters.Count) { for (int i = 0; i < letterString.letters.Count; i++) { if (letters[i] != letterString.letters[i]) return false; } return true; } return false; }
// Inserts a letter string into the letter string. public void InsertRange(int index, LetterString letterString) { letters.InsertRange(index, letterString.letters); }
// Adds a letter string to the letter string. public void AddRange(LetterString letterString) { letters.AddRange(letterString.letters); }
// Constructs a copy of the letter string. public LetterString(LetterString letterString) { this.letters = new List<Letter>(); this.letters.AddRange(letterString.letters); }
//----------------------------------------------------------------------------- // Description //----------------------------------------------------------------------------- public void ResetDescription() { ISlotItem item = currentSlotGroup.CurrentSlot.SlotItem; description = FormatCodes.FormatString(item != null ? item.Name : ""); textPosition = 0; textTimer = 0; textStart = 0; if (!description.IsEmpty) { if (description.Length % 2 == 1) description.Add(' '); if (description.Length == 16) { description.Add(' '); textStart = 0; } else { for (int i = (8 - description.Length / 2); i > 0; i--) description.Add(' '); textStart = (16 - description.Length) * 8; } description.AddRange(FormatCodes.FormatString(item.Description)); } }
// Constructs a copy of the letter string. public LetterString(LetterString letterString) { this.letters = new List <Letter>(); this.letters.AddRange(letterString.letters); }
// Returns a substring of the letter string. public LetterString Substring(int startIndex, int length) { LetterString letterString = new LetterString(); for (int i = 0; i < length; i++) { letterString.letters.Add(letters[startIndex + i]); } return letterString; }
// Draws a formatted game string at the specified position public void DrawLetterString(GameFont font, LetterString letterString, Point2I position, Color color, float depth = 0.0f) { for (int i = 0; i < letterString.Length; i++) { spriteBatch.Draw( font.SpriteSheet.Image, NewRect(new Rectangle2I( position.X + i * (font.SpriteSheet.CellSize.X + font.CharacterSpacing), position.Y, font.SpriteSheet.CellSize.X, font.SpriteSheet.CellSize.Y )), (Rectangle)new Rectangle2I( font.SpriteSheet.Offset.X + ((int)letterString[i].Char % font.CharactersPerRow) * (font.SpriteSheet.CellSize.X + font.SpriteSheet.Spacing.X), font.SpriteSheet.Offset.Y + ((int)letterString[i].Char / font.CharactersPerRow) * (font.SpriteSheet.CellSize.Y + font.SpriteSheet.Spacing.Y), font.SpriteSheet.CellSize.X, font.SpriteSheet.CellSize.Y ), (letterString[i].Color == Letter.DefaultColor ? color : letterString[i].Color), 0.0f, Vector2.Zero, SpriteEffects.None, depth ); } }
//----------------------------------------------------------------------------- // Strings //----------------------------------------------------------------------------- // Returns the wrapped and formatted string of the text. public WrappedLetterString WrapString(string text, int width) { List<LetterString> lines = new List<LetterString>(); List<int> lineLengths = new List<int>(); int currentLine = 0; int currentCharacter = 0; LetterString word = new LetterString(); int wordStart = 0; int wordLength = 0; int wordLineCount = 0; bool firstChar = true; LetterString letterString = FormatCodes.FormatString(text); while (currentCharacter < letterString.Length) { lines.Add(new LetterString()); lineLengths.Add(0); // Remove starting spaces in the line. while (letterString[currentCharacter].Char == ' ') { currentCharacter++; } wordStart = currentCharacter; word.Clear(); wordLength = 0; wordLineCount = 0; firstChar = true; do { if (currentCharacter >= letterString.Length || letterString[currentCharacter].Char == ' ' || letterString[currentCharacter].Char == FormatCodes.ParagraphCharacter || letterString[currentCharacter].Char == '\n') { if (wordLineCount > 0) lines[currentLine].Add(' '); lines[currentLine].AddRange(word); lineLengths[currentLine] += (wordLineCount > 0 ? (characterSpacing + spriteSheet.CellSize.X) : 0) + wordLength; wordLineCount++; wordLength = 0; wordStart = currentCharacter + 1; word.Clear(); if (currentCharacter < letterString.Length && (letterString[currentCharacter].Char == FormatCodes.ParagraphCharacter || letterString[currentCharacter].Char == '\n')) { if (letterString[currentCharacter].Char == FormatCodes.ParagraphCharacter) lines[currentLine].Add(letterString[currentCharacter]); currentCharacter++; break; } } else { word.Add(letterString[currentCharacter]); wordLength += (firstChar ? 0 : characterSpacing) + spriteSheet.CellSize.X; firstChar = false; } currentCharacter++; } while (lineLengths[currentLine] + wordLength + characterSpacing + spriteSheet.CellSize.X <= width); currentCharacter = wordStart; currentLine++; } WrappedLetterString wrappedString = new WrappedLetterString(); wrappedString.Lines = lines.ToArray(); wrappedString.LineLengths = lineLengths.ToArray(); wrappedString.Bounds = new Rectangle2I(width, (lines.Count - 1) * lineSpacing + spriteSheet.CellSize.Y); return wrappedString; }