Ejemplo n.º 1
0
        private static void OnLanguageChange(LocalizedContentManager.LanguageCode code)
        {
            if (SpriteTextHelper._characterMap != null)
            {
                SpriteTextHelper._characterMap.Clear();
            }
            else
            {
                SpriteTextHelper._characterMap = new Dictionary <char, FontChar>();
            }
            if (SpriteTextHelper.fontPages != null)
            {
                SpriteTextHelper.fontPages.Clear();
            }
            else
            {
                SpriteTextHelper.fontPages = new List <Texture2D>();
            }
            switch (code)
            {
            case LocalizedContentManager.LanguageCode.ja:
                SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Japanese");
                SpriteText.fontPixelZoom  = 1.75f;
                break;

            case LocalizedContentManager.LanguageCode.ru:
                SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Russian");
                SpriteText.fontPixelZoom  = 3f;
                break;

            case LocalizedContentManager.LanguageCode.zh:
                SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Chinese");
                SpriteText.fontPixelZoom  = 1.5f;
                break;

            case LocalizedContentManager.LanguageCode.th:
                SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Thai");
                SpriteText.fontPixelZoom  = 1.5f;
                break;

            case LocalizedContentManager.LanguageCode.ko:
                SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Korean");
                SpriteText.fontPixelZoom  = 1.5f;
                break;
            }
            foreach (FontChar fontChar in SpriteTextHelper.FontFile.Chars)
            {
                char id = (char)fontChar.ID;
                SpriteTextHelper._characterMap.Add(id, fontChar);
            }
            foreach (FontPage page in SpriteTextHelper.FontFile.Pages)
            {
                SpriteTextHelper.fontPages.Add(Game1.content.Load <Texture2D>("Fonts\\" + page.File));
            }
        }
Ejemplo n.º 2
0
        private static void SetUpCharacterMap()
        {
            if (!LocalizedContentManager.CurrentLanguageLatin && SpriteTextHelper._characterMap == null)
            {
                SpriteTextHelper._characterMap = new Dictionary <char, FontChar>();
                SpriteTextHelper.fontPages     = new List <Texture2D>();
                switch (LocalizedContentManager.CurrentLanguageCode)
                {
                case LocalizedContentManager.LanguageCode.ja:
                    SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Japanese");
                    SpriteText.fontPixelZoom  = 1.75f;
                    break;

                case LocalizedContentManager.LanguageCode.ru:
                    SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Russian");
                    SpriteText.fontPixelZoom  = 3f;
                    break;

                case LocalizedContentManager.LanguageCode.zh:
                    SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Chinese");
                    SpriteText.fontPixelZoom  = 1.5f;
                    break;

                case LocalizedContentManager.LanguageCode.th:
                    SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Thai");
                    SpriteText.fontPixelZoom  = 1.5f;
                    break;

                case LocalizedContentManager.LanguageCode.ko:
                    SpriteTextHelper.FontFile = SpriteTextHelper.LoadFont("Fonts\\Korean");
                    SpriteText.fontPixelZoom  = 1.5f;
                    break;
                }
                foreach (FontChar fontChar in SpriteTextHelper.FontFile.Chars)
                {
                    char id = (char)fontChar.ID;
                    SpriteTextHelper._characterMap.Add(id, fontChar);
                }

                foreach (FontPage page in SpriteTextHelper.FontFile.Pages)
                {
                    SpriteTextHelper.fontPages.Add(Game1.content.Load <Texture2D>("Fonts\\" + page.File));
                }
                LocalizedContentManager.OnLanguageChange += new LocalizedContentManager.LanguageChangedHandler(SpriteTextHelper.OnLanguageChange);
            }
            else
            {
                if (!LocalizedContentManager.CurrentLanguageLatin || (double)SpriteText.fontPixelZoom >= 3.0)
                {
                    return;
                }
                SpriteText.fontPixelZoom = 3f;
            }
        }
Ejemplo n.º 3
0
        public static void DrawString(
            SpriteBatch b,
            string s,
            int x,
            int y,
            Color color,
            int characterPosition                  = 999999,
            int width                              = -1,
            int height                             = 999999,
            float alpha                            = 1f,
            float layerDepth                       = 0.88f,
            int drawBGScroll                       = -1,
            string placeHolderScrollWidthText      = "",
            List <TextColorInfo> textColorMappings = null)
        {
            SpriteTextHelper.SetUpCharacterMap();

            if (width == -1)
            {
                width = Game1.graphics.GraphicsDevice.Viewport.Width - x;
                if (drawBGScroll == 1)
                {
                    width = SpriteText.getWidthOfString(s, 999999) * 2;
                }
            }

            if ((double)SpriteText.fontPixelZoom < 4.0 && LocalizedContentManager.CurrentLanguageCode != LocalizedContentManager.LanguageCode.ko)
            {
                y += (int)((4.0 - (double)SpriteText.fontPixelZoom) * 4.0);
            }

            Vector2 vector2_1 = new Vector2((float)x, (float)y);
            int     accumulatedHorizontalSpaceBetweenCharacters = 0;

            if (drawBGScroll != 1)
            {
                if ((double)vector2_1.X + (double)width > (double)(Game1.graphics.GraphicsDevice.Viewport.Width - 4))
                {
                    vector2_1.X = (float)(Game1.graphics.GraphicsDevice.Viewport.Width - width - 4);
                }
                if ((double)vector2_1.X < 0.0)
                {
                    vector2_1.X = 0.0f;
                }
            }

            if (drawBGScroll == 0 || drawBGScroll == 0)
            {
                b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(-12f, -3f) * 4f, new Rectangle?(new Rectangle(325, 318, 12, 18)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);
                b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(0.0f, -3f) * 4f, new Rectangle?(new Rectangle(337, 318, 1, 18)), Color.White * alpha, 0.0f, Vector2.Zero, new Vector2((float)SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999), 4f), SpriteEffects.None, layerDepth - 1f / 1000f);
                b.Draw(Game1.mouseCursors, vector2_1 + new Vector2((float)SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999), -12f), new Rectangle?(new Rectangle(338, 318, 12, 18)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);

                if (placeHolderScrollWidthText.Length > 0)
                {
                    if (drawBGScroll != 0)
                    {
                        x += SpriteText.getWidthOfString(placeHolderScrollWidthText, 999999) / 2 - SpriteText.getWidthOfString(s, 999999) / 2;
                    }

                    vector2_1.X = (float)x;
                }
                vector2_1.Y += (float)((4.0 - (double)SpriteText.fontPixelZoom) * 4.0);
            }
            else
            {
                switch (drawBGScroll)
                {
                case 1:
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(-7f, -3f) * 4f, new Rectangle?(new Rectangle(324, 299, 7, 17)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(0.0f, -3f) * 4f, new Rectangle?(new Rectangle(331, 299, 1, 17)), Color.White * alpha, 0.0f, Vector2.Zero, new Vector2((float)SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999), 4f), SpriteEffects.None, layerDepth - 1f / 1000f);
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2((float)SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999), -12f), new Rectangle?(new Rectangle(332, 299, 7, 17)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2((float)(SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999) / 2), 52f), new Rectangle?(new Rectangle(341, 308, 6, 5)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 0.0001f);
                    if (placeHolderScrollWidthText.Length > 0)
                    {
                        x          += SpriteText.getWidthOfString(placeHolderScrollWidthText, 999999) / 2 - SpriteText.getWidthOfString(s, 999999) / 2;
                        vector2_1.X = (float)x;
                    }
                    vector2_1.Y += (float)((4.0 - (double)SpriteText.fontPixelZoom) * 4.0);
                    break;

                case 2:
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(-3f, -3f) * 4f, new Rectangle?(new Rectangle(327, 281, 3, 17)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2(0.0f, -3f) * 4f, new Rectangle?(new Rectangle(330, 281, 1, 17)), Color.White * alpha, 0.0f, Vector2.Zero, new Vector2((float)(SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999) + 4), 4f), SpriteEffects.None, layerDepth - 1f / 1000f);
                    b.Draw(Game1.mouseCursors, vector2_1 + new Vector2((float)(SpriteText.getWidthOfString(placeHolderScrollWidthText.Length > 0 ? placeHolderScrollWidthText : s, 999999) + 4), -12f), new Rectangle?(new Rectangle(333, 281, 3, 17)), Color.White * alpha, 0.0f, Vector2.Zero, 4f, SpriteEffects.None, layerDepth - 1f / 1000f);
                    if (placeHolderScrollWidthText.Length > 0)
                    {
                        x          += SpriteText.getWidthOfString(placeHolderScrollWidthText, 999999) / 2 - SpriteText.getWidthOfString(s, 999999) / 2;
                        vector2_1.X = (float)x;
                    }
                    vector2_1.Y += (float)((4.0 - (double)SpriteText.fontPixelZoom) * 4.0);
                    break;
                }
            }

            if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ko)
            {
                vector2_1.Y -= 8f;
            }

            s = s.Replace(Environment.NewLine, "");

            if ((LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ja || LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.zh || LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.th))
            {
                vector2_1.Y -= (float)((4.0 - (double)SpriteText.fontPixelZoom) * 4.0);
            }

            s = s.Replace('♡', SPECIAL_CHAR_HEART);

            for (int index = 0; index < Math.Min(s.Length, characterPosition); ++index)
            {
                if (LocalizedContentManager.CurrentLanguageLatin || SpriteTextHelper.IsSpecialCharacter(s[index]))
                {
                    float fontPixelZoom = SpriteText.fontPixelZoom;
                    if (SpriteTextHelper.IsSpecialCharacter(s[index]))
                    {
                        SpriteText.fontPixelZoom = 3f;
                    }

                    if (s[index] == SPECIAL_CHAR_NEWLINE)
                    {
                        vector2_1.Y += 18f * SpriteText.fontPixelZoom;
                        vector2_1.X  = (float)x;
                        accumulatedHorizontalSpaceBetweenCharacters = 0;
                    }
                    else
                    {
                        if (index > 0)
                        {
                            vector2_1.X += (float)(8.0 * SpriteText.fontPixelZoom + accumulatedHorizontalSpaceBetweenCharacters
                                                   + (SpriteText.getWidthOffsetForChar(s[index]) + SpriteText.getWidthOffsetForChar(s[index - 1])) * (double)SpriteText.fontPixelZoom);
                        }

                        accumulatedHorizontalSpaceBetweenCharacters = (int)(0.0 * (double)SpriteText.fontPixelZoom);

                        if (SpriteText.positionOfNextSpace(s, index, (int)vector2_1.X, accumulatedHorizontalSpaceBetweenCharacters) >= x + width - 4)
                        {
                            vector2_1.Y += 18f * SpriteText.fontPixelZoom;
                            accumulatedHorizontalSpaceBetweenCharacters = 0;
                            vector2_1.X = (float)x;
                        }

                        bool    flag      = char.IsUpper(s[index]) || s[index] == 'ß';
                        Vector2 vector2_2 = new Vector2(0.0f, (float)((flag ? -3 : 0) - 1));

                        if (s[index] == 'Ç')
                        {
                            vector2_2.Y += 2f;
                        }

                        // Additional code compared to the original version:
                        //
                        // Retrieve if the user specified color for this character. If no such color exists,
                        // use the default text color.
                        Color charColor = color;
                        if (textColorMappings != null)
                        {
                            var clr = SpriteTextHelper.GetColorForCharacter(index, textColorMappings);
                            if (clr.HasValue)
                            {
                                charColor = clr.Value;
                            }
                        }

                        b.Draw(SpriteText.coloredTexture,
                               vector2_1 + vector2_2 * SpriteText.fontPixelZoom,
                               new Rectangle?(SpriteTextHelper.GetSourceRectForChar(s[index])),
                               (SpriteTextHelper.IsSpecialCharacter(s[index]) ? Color.White : charColor) * alpha,
                               0.0f, Vector2.Zero, SpriteText.fontPixelZoom, SpriteEffects.None, layerDepth);

                        SpriteText.fontPixelZoom = fontPixelZoom;
                    }
                }
                else if (s[index] == SPECIAL_CHAR_NEWLINE)
                {
                    vector2_1.Y += (float)(SpriteTextHelper.FontFile.Common.LineHeight + 2) * SpriteText.fontPixelZoom;
                    vector2_1.X  = (float)x;
                    accumulatedHorizontalSpaceBetweenCharacters = 0;
                }
                else
                {
                    if (index > 0 && SpriteTextHelper.IsSpecialCharacter(s[index - 1]))
                    {
                        vector2_1.X += 24f;
                    }

                    if (SpriteTextHelper._characterMap.TryGetValue(s[index], out FontChar fontChar))
                    {
                        Rectangle rectangle = new Rectangle(fontChar.X, fontChar.Y, fontChar.Width, fontChar.Height);
                        Texture2D fontPage  = SpriteTextHelper.fontPages[fontChar.Page];

                        if (SpriteText.positionOfNextSpace(s, index, (int)vector2_1.X, accumulatedHorizontalSpaceBetweenCharacters) >= x + width - 4)
                        {
                            vector2_1.Y += (float)(SpriteTextHelper.FontFile.Common.LineHeight + 2) * SpriteText.fontPixelZoom;
                            accumulatedHorizontalSpaceBetweenCharacters = 0;
                            vector2_1.X = (float)x;
                        }

                        Vector2 position = new Vector2(vector2_1.X + (float)fontChar.XOffset * SpriteText.fontPixelZoom, vector2_1.Y + (float)fontChar.YOffset * SpriteText.fontPixelZoom);
                        if (drawBGScroll != -1 && LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ko)
                        {
                            position.Y -= 8f;
                        }

                        // Additional code compared to the original version:
                        //
                        // Retrieve if the user specified color for this character. If no such color exists,
                        // use the default text color.
                        Color charColor = color;
                        if (textColorMappings != null)
                        {
                            var clr = SpriteTextHelper.GetColorForCharacter(index, textColorMappings);
                            if (clr.HasValue)
                            {
                                charColor = clr.Value;
                            }
                        }

                        if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ru)
                        {
                            Vector2 vector2_2 = new Vector2(-1f, 1f) * SpriteText.fontPixelZoom;
                            b.Draw(fontPage, position + vector2_2, new Rectangle?(rectangle), charColor * alpha * SpriteText.shadowAlpha, 0.0f, Vector2.Zero, SpriteText.fontPixelZoom, SpriteEffects.None, layerDepth);
                            b.Draw(fontPage, position + new Vector2(0.0f, vector2_2.Y), new Rectangle?(rectangle), charColor * alpha * SpriteText.shadowAlpha, 0.0f, Vector2.Zero, SpriteText.fontPixelZoom, SpriteEffects.None, layerDepth);
                            b.Draw(fontPage, position + new Vector2(vector2_2.X, 0.0f), new Rectangle?(rectangle), charColor * alpha * SpriteText.shadowAlpha, 0.0f, Vector2.Zero, SpriteText.fontPixelZoom, SpriteEffects.None, layerDepth);
                        }

                        b.Draw(fontPage, position, new Rectangle?(rectangle), charColor * alpha, 0.0f, Vector2.Zero, SpriteText.fontPixelZoom, SpriteEffects.None, layerDepth);
                        vector2_1.X += (float)fontChar.XAdvance * SpriteText.fontPixelZoom;
                    }
                }
            }
        }