Exemplo n.º 1
0
    private IEnumerator Hover()
    {
        while (true)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            int interactable_layer_mask = LayerMask.GetMask("Interactable");
            int ui_layer_mask           = LayerMask.GetMask("UI");

            if (Physics.Raycast(ray, out RaycastHit hit, 150f, interactable_layer_mask, QueryTriggerInteraction.Ignore))
            {
                GameObject hover = hit.transform.gameObject;

                if (HoveredObject != null && !SelectedObjects.Contains(HoveredObject))
                {
                    HoveredObject.GetComponentInChildren <Renderer>().material = HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial;
                }

                HoveredObject = hover;
                if (HoveredObject != null && !SelectedObjects.Contains(HoveredObject))
                {
                    Item hover_item = HoveredObject.GetComponent <Item>();
                    HoveredObject.GetComponentInChildren <Renderer>().material = hover_item != null && !hover_item.IsSpotted
                        ? HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial
                        : HoveredObject.GetComponentInParent <Interactable>().highlight_material;
                }
            }
Exemplo n.º 2
0
    public Spell.Spells GetCastSpell()
    {
        Spell.Spells       splId = Spell.Spells.NoneSpell;
        Templates.TplSpell spl   = null;
        Spell itemSp             = GetOneTimeCast();

        if (itemSp != null)
        {
            splId = itemSp.SpellID;
            spl   = itemSp.Template;
        }
        else if (SpellbookVisible && Spellbook.Unit == SelectedObject && Spellbook.ActiveSpell != Spell.Spells.NoneSpell)
        {
            splId = Spellbook.ActiveSpell;
            spl   = TemplateLoader.GetSpellById((int)splId - 1);
        }

        if (spl != null &&
            (spl.IsAreaSpell ||
             (!spl.IsAreaSpell && HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Human || HoveredObject.GetObjectType() == MapObjectType.Monster))))
        {
            return(splId);
        }

        return(Spell.Spells.NoneSpell);
    }
Exemplo n.º 3
0
    Spell.Spells GetCastSpell()
    {
        if (SpellbookVisible && Spellbook.Unit == SelectedObject && Spellbook.ActiveSpell != Spell.Spells.NoneSpell)
        {
            Spell.Spells       sp  = Spellbook.ActiveSpell;
            Templates.TplSpell spl = TemplateLoader.GetSpellById((int)sp - 1);

            if (spl.SpellTarget == 2 ||
                (spl.SpellTarget == 1 && HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Human || HoveredObject.GetObjectType() == MapObjectType.Monster)))
            {
                return(Spellbook.ActiveSpell);
            }
        }
        return(Spell.Spells.NoneSpell);
    }
Exemplo n.º 4
0
    private void Update()
    {
        if (Input.GetKeyDown("escape"))
        {
            if (HoveredObject != null)
            {
                HoveredObject.GetComponentInChildren <Renderer>().material = HoveredObject.GetComponentInParent <Interactable>().OriginalMaterial;
            }

            for (int i = 0; i < SelectedObjects.Count; i++)
            {
                SelectedObjects[i].GetComponentInChildren <Renderer>().material = SelectedObjects[i].GetComponentInParent <Interactable>().OriginalMaterial;
            }
            SelectedObjects.Clear();
        }
    }
Exemplo n.º 5
0
    void UpdateInput()
    {
        if (!MapLogic.Instance.IsLoaded)
        {
            return;
        }

        // update mouse x/y
        int     oldMouseCellX = MouseCellX;
        int     oldMouseCellY = MouseCellY;
        Vector3 mPos          = Utils.GetMousePosition();

        mPos.x += ScrollX * 32;
        mPos.y += ScrollY * 32;
        float cXFrac = (mPos.x / 32) - Mathf.Floor(mPos.x / 32);

        _MouseCellX = (int)(mPos.x / 32);
        _MouseCellY = 0;
        for (int y = (int)_VisibleRect.yMin; y <= _VisibleRect.yMax; y++)
        {
            float h1 = y * 32 - GetHeightAt(_MouseCellX, y);
            float h2 = y * 32 - GetHeightAt(_MouseCellX + 1, y);
            float h  = h1 * (1f - cXFrac) + h2 * cXFrac;
            if (mPos.y < h)
            {
                _MouseCellY = y - 1;
                break;
            }
        }
        _MouseCellX = Mathf.Clamp(_MouseCellX, 0, MapLogic.Instance.Width - 1);
        _MouseCellY = Mathf.Clamp(_MouseCellY, 0, MapLogic.Instance.Height - 1);
        //Debug.Log(string.Format("mouse = {0} {1} (from {2} {3})", _MouseCellX, _MouseCellY, mPos.x, mPos.y));

        // temporary!
        if (MapLogic.Instance.ConsolePlayer == null) // mostly if we're server
        {
            if (oldMouseCellX != MouseCellX ||
                oldMouseCellY != MouseCellY)
            {
                MapLogic.Instance.SetTestingVisibility(MouseCellX, MouseCellY, 5);
            }
        }

        // PERMANENT (x2)
        // check currently hovered object
        MapNode[,] nodes = MapLogic.Instance.Nodes;
        MapObject o  = null;
        float     oZ = 0;

        for (int y = (int)_VisibleRect.yMin; y <= _VisibleRect.yMax; y++)
        {
            for (int x = (int)_VisibleRect.xMin; x <= _VisibleRect.xMax; x++)
            {
                foreach (MapObject mobj in nodes[x, y].Objects)
                {
                    if (mobj.GameObject == null || mobj.GameScript == null)
                    {
                        continue;
                    }

                    //
                    if (!(mobj.GameScript is IMapViewSelectable) || !((IMapViewSelectable)mobj.GameScript).IsSelected((int)mPos.x, (int)mPos.y))
                    {
                        continue;
                    }

                    if (mobj.GameObject.transform.position.z < oZ)
                    {
                        o  = mobj;
                        oZ = mobj.GameObject.transform.position.z;
                    }
                }
            }
        }

        MouseCursor.SetCursor(MouseCursor.CurDefault);
        bool hoveringDarkness = (nodes[MouseCellX, MouseCellY].Flags & MapNodeFlags.Visible) == 0;

        if (o != null && (o.GameScript is IMapViewSelfie))
        {
            Infowindow.Viewer = (IMapViewSelfie)o.GameScript;
        }
        else if (SelectedObject != null && (SelectedObject.GameScript is IMapViewSelfie))
        {
            Infowindow.Viewer = (IMapViewSelfie)SelectedObject.GameScript;
        }
        else
        {
            Infowindow.Viewer = null;
        }
        HoveredObject = o;

        if (GetCastSpell() != Spell.Spells.NoneSpell)
        {
            MouseCursor.SetCursor(MouseCursor.CurCast);
            return;
        }

        if (!hoveringDarkness && HoveredObject != null && (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move || Commandbar.CurrentCommand == 0))
        {
            // hovered usable buildings have different cursor picture.
            if (HoveredObject.GetObjectType() == MapObjectType.Structure &&
                ((MapStructure)HoveredObject).Class.Usable)
            {
                MouseCursor.SetCursor(MouseCursor.CurSelectStructure);
            }
            else
            {
                MouseCursor.SetCursor(MouseCursor.CurSelect);
            }
        }
        else if (SelectedObject != null && SelectedObject is IPlayerPawn)
        {
            Player sp = ((IPlayerPawn)SelectedObject).GetPlayer();
            if (sp == MapLogic.Instance.ConsolePlayer)
            {
                if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move)
                {
                    MouseCursor.SetCursor(MouseCursor.CurMove);
                }
                else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Attack)
                {
                    MouseCursor.SetCursor(MouseCursor.CurAttack);
                }
                else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.MoveAttack)
                {
                    MouseCursor.SetCursor(MouseCursor.CurMoveAttack);
                }
                else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Pickup)
                {
                    MouseCursor.SetCursor(MouseCursor.CurPickup);
                }
            }
        }
    }
Exemplo n.º 6
0
    public bool ProcessEvent(Event e)
    {
        if (!MapLogic.Instance.IsLoaded)
        {
            return(false);
        }

        if (e.type == EventType.KeyDown)
        {
            switch (e.keyCode)
            {
            case KeyCode.LeftArrow:
                if (ScrollDeltaX == 0)
                {
                    ScrollDeltaX = -1;
                }
                return(true);

            case KeyCode.RightArrow:
                if (ScrollDeltaX == 0)
                {
                    ScrollDeltaX = 1;
                }
                return(true);

            case KeyCode.UpArrow:
                if (ScrollDeltaY == 0)
                {
                    ScrollDeltaY = -1;
                }
                return(true);

            case KeyCode.DownArrow:
                if (ScrollDeltaY == 0)
                {
                    ScrollDeltaY = 1;
                }
                return(true);

            case KeyCode.Plus:
            case KeyCode.Equals:     // + = =
            case KeyCode.KeypadPlus:
            {
                int oldSpeed = MapLogic.Instance.Speed;
                if (!NetworkManager.IsClient)
                {
                    MapLogic.Instance.Speed++;
                }
                if (oldSpeed != MapLogic.Instance.Speed)
                {
                    MapViewChat.Instance.AddChatMessage(Player.AllColorsSystem, Locale.Main[108 + MapLogic.Instance.Speed]);
                }
            }
                return(true);

            case KeyCode.Minus:
            case KeyCode.KeypadMinus:
            {
                int oldSpeed = MapLogic.Instance.Speed;
                if (!NetworkManager.IsClient)
                {
                    MapLogic.Instance.Speed--;
                }
                if (oldSpeed != MapLogic.Instance.Speed)
                {
                    MapViewChat.Instance.AddChatMessage(Player.AllColorsSystem, Locale.Main[108 + MapLogic.Instance.Speed]);
                }
            }
                return(true);

            case KeyCode.F3:
                //if (NetworkManager.IsClient)
            {
                DiplomacyWindow wnd = Utils.CreateObjectWithScript <DiplomacyWindow>();
                //Debug.LogFormat("created a window!");
            }
                return(true);

            case KeyCode.Escape:
            {
                // todo: create main menu
                ExampleWindow wnd = Utils.CreateObjectWithScript <ExampleWindow>();
            }
                return(true);

            case KeyCode.Space:
                // check if local unit is dead.
                // for dead local unit, space sends respawn.
                // for alive local unit, space toggles both spellbook and inventory.
                if (MapLogic.Instance.ConsolePlayer != null &&
                    !MapLogic.Instance.ConsolePlayer.Avatar.IsAlive)
                {
                    Client.SendRespawn();
                }
                else
                {
                    bool cstate = InventoryVisible && SpellbookVisible;
                    InventoryVisible = !cstate;
                    SpellbookVisible = !cstate;
                    Spellbook.Update();
                }
                return(true);

            case KeyCode.BackQuote:
                InventoryVisible = !InventoryVisible;
                Spellbook.Update();
                return(true);

            case KeyCode.Q:
                SpellbookVisible = !SpellbookVisible;
                Spellbook.Update();
                return(true);
            }
        }
        else if (e.type == EventType.KeyUp)
        {
            switch (e.keyCode)
            {
            case KeyCode.LeftArrow:
                if (ScrollDeltaX == -1)
                {
                    ScrollDeltaX = 0;
                }
                return(true);

            case KeyCode.RightArrow:
                if (ScrollDeltaX == 1)
                {
                    ScrollDeltaX = 0;
                }
                return(true);

            case KeyCode.UpArrow:
                if (ScrollDeltaY == -1)
                {
                    ScrollDeltaY = 0;
                }
                return(true);

            case KeyCode.DownArrow:
                if (ScrollDeltaY == 1)
                {
                    ScrollDeltaY = 0;
                }
                return(true);
            }
        }
        else if (e.rawType == EventType.MouseMove)
        {
            UpdateInput();
            return(true);
        }
        else if (e.rawType == EventType.MouseDown && e.button == 0)
        {
            // select unit if not selected yet
            if (HoveredObject != null &&
                (SelectedObject == null || (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move &&
                                            !Input.GetKey(KeyCode.LeftAlt) && !Input.GetKey(KeyCode.RightAlt)) || (Commandbar.CurrentCommand == 0)))
            {
                SelectedObject = HoveredObject;
                OnObjectSelected(SelectedObject);
            }
            else if (SelectedObject != null && SelectedObject is IPlayerPawn && ((IPlayerPawn)SelectedObject).GetPlayer() == MapLogic.Instance.ConsolePlayer)
            {
                // todo: handle commands here
                // try to walk.
                if (SelectedObject.GetObjectType() == MapObjectType.Monster ||
                    SelectedObject.GetObjectType() == MapObjectType.Human)
                {
                    MapUnit unit = (MapUnit)SelectedObject;
                    if (GetCastSpell() != Spell.Spells.NoneSpell)
                    {
                        if (HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Monster ||
                                                      HoveredObject.GetObjectType() == MapObjectType.Human))
                        {
                            Client.SendCastToUnit(unit, GetCastSpell(), (MapUnit)HoveredObject);
                        }
                        else
                        {
                            Client.SendCastToArea(unit, GetCastSpell(), MouseCellX, MouseCellY);
                        }
                    }
                    else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Move)
                    {
                        Client.SendMoveUnit(unit, MouseCellX, MouseCellY);
                    }
                    else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Attack &&
                             HoveredObject != null &&
                             (HoveredObject.GetObjectType() == MapObjectType.Monster ||
                              HoveredObject.GetObjectType() == MapObjectType.Human))
                    {
                        Client.SendAttackUnit(unit, (MapUnit)HoveredObject);
                    }
                    else if (Commandbar.CurrentCommand == MapViewCommandbar.Commands.Pickup &&
                             MapLogic.Instance.GetSackAt(MouseCellX, MouseCellY) != null)
                    {
                        Client.SendPickupUnit(unit, MouseCellX, MouseCellY); // issue sack pickup command by current unit at target coordinates
                    }
                }
            }

            return(true);
        }
        else if (e.rawType == EventType.MouseDown && e.button == 1)
        {
            SelectedObject             = null; // deselect
            Commandbar.EnabledCommands = 0;
            return(true);
        }

        return(false);
    }
Exemplo n.º 7
0
    void Update()
    {
        MiniMap.gameObject.SetActive(MapLogic.Instance.IsLoaded);
        Commandbar.gameObject.SetActive(MapLogic.Instance.IsLoaded);
        Infowindow.gameObject.SetActive(MapLogic.Instance.IsLoaded);
        Inventory.gameObject.SetActive(InventoryVisible);
        Spellbook.gameObject.SetActive(SpellbookVisible);

        if (!MapLogic.Instance.IsLoaded)
        {
            return;
        }

        if (GridEnabled)
        {
            GridMeshMaterial.color = new Color(1, 0, 0, 0.5f);
        }
        else
        {
            GridMeshMaterial.color = new Color(0, 0, 0, 0);
        }

        // update lighting.
        Texture2D lightTex = MapLogic.Instance.CheckLightingTexture();

        if (lightTex != null)
        {
            UpdateLighting(lightTex);
        }
        Texture2D fowTex = MapLogic.Instance.CheckFOWTexture();

        if (fowTex != null)
        {
            UpdateFOW(fowTex);
        }

        if (HoveredObject != null && (HoveredObject.GetObjectType() == MapObjectType.Monster ||
                                      HoveredObject.GetObjectType() == MapObjectType.Human) && (!((MapUnit)HoveredObject).IsAlive || !MapLogic.Instance.Objects.Contains(HoveredObject)))
        {
            HoveredObject = null;
        }
        if (SelectedObject != null && (SelectedObject.GetObjectType() == MapObjectType.Monster ||
                                       SelectedObject.GetObjectType() == MapObjectType.Human) && (!((MapUnit)SelectedObject).IsAlive || !MapLogic.Instance.Objects.Contains(SelectedObject)))
        {
            SelectedObject = null;
        }

        UpdateLogic();

        int waterAnimFrameNew = (MapLogic.Instance.LevelTime % 20) / 5;

        if (WaterAnimFrame != waterAnimFrameNew)
        {
            WaterAnimFrame = waterAnimFrameNew;
            UpdateTiles(WaterAnimFrame);
        }

        // update scrolling
        scrollTimer += Time.unscaledDeltaTime;
        if (scrollTimer > 0.01)
        {
            SetScroll(ScrollX + ScrollDeltaX, ScrollY + ScrollDeltaY);
            scrollTimer = 0;
        }
    }
Exemplo n.º 8
0
        private void Display_RenderedWorld(object sender, RenderedWorldEventArgs e)
        {
            if (Game1.activeClickableMenu == null)
            {
                GameLocation CurrentLocation = Game1.player.currentLocation;

                bool IsHoveringPlacedObject = CurrentLocation.Objects.TryGetValue(HoveredTile, out SObject HoveredObject);
                if (IsHoveringPlacedObject)
                {
                    if (UserConfig.DrawToolTip)
                    {
                        //  Draw a tooltip that shows how many of the machine were combined, and its total combined processing power
                        //  Such as: "Quantity: 5\nPower: 465%"
                        if (HoveredObject.TryGetCombinedQuantity(out int CombinedQuantity))
                        {
                            Cask    Cask        = HoveredObject as Cask;
                            bool    IsCask      = Cask != null;
                            CrabPot CrabPot     = HoveredObject as CrabPot;
                            bool    IsCrabPot   = CrabPot != null;
                            bool    IsScarecrow = HoveredObject.IsScarecrow();

                            bool HasHeldObject = HoveredObject.heldObject?.Value != null;

                            float UIScaleFactor = Game1.options.zoomLevel / Game1.options.uiScale;

                            SpriteFont DefaultFont          = Game1.dialogueFont;
                            int        Padding              = 25;
                            int        MarginBetweenColumns = 10;
                            int        MarginBetweenRows    = 5;
                            float      LabelTextScale       = 0.75f;
                            float      ValueTextScale       = 1.0f;

                            bool ShowDurationInfo = UserConfig.ToolTipShowDuration && UserConfig.ShouldModifyProcessingSpeed(HoveredObject);
                            bool ShowQuantityInfo = UserConfig.ToolTipShowQuantity && UserConfig.ShouldModifyInputsAndOutputs(HoveredObject);

                            //  Compute row headers
                            List <string> RowHeaders = new List <string>()
                            {
                                Helper.Translation.Get("ToolTipQuantityLabel"), Helper.Translation.Get("ToolTipPowerLabel")
                            };
                            if (ShowDurationInfo)
                            {
                                if (IsCask)
                                {
                                    //RowHeaders.Add(Helper.Translation.Get("ToolTipCaskAgingRateLabel"));
                                    if (HasHeldObject)
                                    {
                                        RowHeaders.Add(Helper.Translation.Get("ToolTipCaskDaysUntilIridiumLabel"));
                                    }
                                }
                                else if (IsCrabPot)
                                {
                                    RowHeaders.Add(Helper.Translation.Get("ToolTipCrabPotProcessingIntervalLabel"));
                                }
                                else
                                {
                                    if (HasHeldObject)
                                    {
                                        RowHeaders.Add(Helper.Translation.Get("ToolTipMinutesRemainingLabel"));
                                    }
                                }
                            }
                            if (ShowQuantityInfo)
                            {
                                if (HasHeldObject && HoveredObject.HasModifiedOutput())
                                {
                                    RowHeaders.Add(Helper.Translation.Get("ToolTipProducedQuantityLabel"));
                                }
                            }
                            if (IsScarecrow)
                            {
                                RowHeaders.Add(Helper.Translation.Get("ToolTipScarecrowRadiusLabel"));
                            }
                            List <Vector2> RowHeaderSizes = RowHeaders.Select(x => DefaultFont.MeasureString(x) * LabelTextScale).ToList();

                            double ProcessingPower          = UserConfig.ComputeProcessingPower(CombinedQuantity) * 100.0;
                            string FormattedProcessingPower = string.Format("{0}%", ProcessingPower.ToString("0.#"));

                            //  Compute row values
                            List <string> RowValues = new List <string>()
                            {
                                CombinedQuantity.ToString(), FormattedProcessingPower
                            };
                            if (ShowDurationInfo)
                            {
                                if (IsCask)
                                {
                                    //RowValues.Add(Cask.agingRate.Value.ToString("0.##"));
                                    if (HasHeldObject)
                                    {
                                        RowValues.Add(Math.Ceiling(Cask.daysToMature.Value / Cask.agingRate.Value).ToString("0.##"));
                                    }
                                }
                                else if (IsCrabPot)
                                {
                                    CrabPot.TryGetProcessingInterval(out double Power, out double IntervalHours, out int IntervalMinutes);
                                    RowValues.Add(IntervalMinutes.ToString());
                                }
                                else
                                {
                                    if (HasHeldObject)
                                    {
                                        RowValues.Add(HoveredObject.MinutesUntilReady.ToString("0.##"));
                                    }
                                }
                            }
                            if (ShowQuantityInfo)
                            {
                                if (HasHeldObject && HoveredObject.HasModifiedOutput())
                                {
                                    RowValues.Add(HoveredObject.heldObject.Value.Stack.ToString());
                                }
                            }
                            if (IsScarecrow)
                            {
                                //  Subtract 1 because the game internally counts the scarecrow's occupied tile as part of its radius, but users usually would be confused by that
                                //  So a typical user expects radius=8 for a regular scarecrow, even though the game does its calculations with radius=9
                                int OriginalRadius = HoveredObject.GetScarecrowBaseRadius() - 1;
                                int AlteredRadius  = HoveredObject.GetScarecrowRadius() - 1;
                                //RowValues.Add(string.Format("{0}-->{1}", OriginalRadius, AlteredRadius));
                                RowValues.Add(AlteredRadius.ToString());
                            }
                            List <Vector2> RowValueSizes = RowValues.Select(x => DrawHelpers.MeasureStringWithSpecialNumbers(x, ValueTextScale, 0.0f)).ToList();

                            //  Measure the tooltip
                            List <int> RowHeights = new List <int>();
                            for (int i = 0; i < RowHeaders.Count; i++)
                            {
                                RowHeights.Add((int)Math.Max(RowHeaderSizes[i].Y, RowValueSizes[i].Y));
                            }

                            List <int> ColumnWidths = new List <int> {
                                (int)RowHeaderSizes.Max(x => x.X),
                                (int)RowValueSizes.Max(x => x.X)
                            };

                            int   ToolTipTopWidth = Padding + ColumnWidths.Sum() + (ColumnWidths.Count - 1) * MarginBetweenColumns + Padding;
                            int   ToolTipHeight   = Padding + RowHeights.Sum() + (RowHeights.Count - 1) * MarginBetweenRows + Padding;
                            Point ToolTipTopleft  = DrawHelpers.GetTopleftPosition(new Point(ToolTipTopWidth, ToolTipHeight),
                                                                                   new Point((int)((MouseScreenPosition.X + UserConfig.ToolTipOffset.X) / UIScaleFactor), (int)((MouseScreenPosition.Y + UserConfig.ToolTipOffset.Y) / UIScaleFactor)), 100);

                            //  Draw tooltip background
                            DrawHelpers.DrawBox(e.SpriteBatch, new Rectangle(ToolTipTopleft.X, ToolTipTopleft.Y, ToolTipTopWidth, ToolTipHeight));

                            //  Draw each row's header and value
                            int CurrentY = ToolTipTopleft.Y + Padding;
                            for (int i = 0; i < RowHeights.Count; i++)
                            {
                                int CurrentRowHeight = RowHeights[i];

                                //  Draw the row header
                                Vector2 RowHeaderPosition = new Vector2(
                                    ToolTipTopleft.X + Padding + ColumnWidths[0] - RowHeaderSizes[i].X,
                                    CurrentY + (RowHeights[i] - RowHeaderSizes[i].Y) / 2.0f
                                    );
                                e.SpriteBatch.DrawString(DefaultFont, RowHeaders[i], RowHeaderPosition, Color.Black, 0.0f, Vector2.Zero, LabelTextScale, SpriteEffects.None, 1.0f);

                                //  Draw the row value
                                Vector2 RowValuePosition = new Vector2(
                                    ToolTipTopleft.X + Padding + ColumnWidths[0] + MarginBetweenColumns,
                                    CurrentY + (RowHeights[i] - RowValueSizes[i].Y) / 2.0f
                                    );
                                DrawHelpers.DrawStringWithSpecialNumbers(e.SpriteBatch, RowValuePosition, RowValues[i], ValueTextScale, Color.White);

                                CurrentY += CurrentRowHeight + MarginBetweenRows;
                            }
                        }
                    }
                }
            }
        }