private void CreateSavingThrowLabels(StatsUiParams uiParams)
    {
        void AddWidgets(Stat stat, string helpTopic, Rectangle labelRect, Rectangle valueRect)
        {
            Container.Add(new StatsLabel(stat,
                                         helpTopic,
                                         labelRect,
                                         StatsUiTexture.ButtonFORTClick,
                                         StatsUiTexture.ButtonFORTHover,
                                         uiParams
                                         ));
            var valueWidget = new StatsValue(
                obj => GetStatModifierText(obj, stat),
                valueRect,
                StatsUiTexture.ButtonFORTOutputClick,
                StatsUiTexture.ButtonFORTOutputHover,
                uiParams
                );

            valueWidget.SetClickHandler(() => ShowSavingThrowHelp(stat));
            Container.Add(valueWidget);
        }

        AddWidgets(Stat.save_fortitude, "TAG_FORTITUDE", uiParams.FortLabel, uiParams.FortValue);
        AddWidgets(Stat.save_reflexes, "TAG_REFLEX", uiParams.RefLabel, uiParams.RefValue);
        AddWidgets(Stat.save_willpower, "TAG_WILL", uiParams.WillLabel, uiParams.WillValue);
    }
    private void CreateDefensiveLabels(StatsUiParams uiParams)
    {
        Container.Add(new StatsLabel(Stat.hp_current,
                                     "TAG_HIT_POINTS",
                                     uiParams.HpLabel,
                                     StatsUiTexture.ButtonHPClick,
                                     StatsUiTexture.ButtonHPHover,
                                     uiParams
                                     ));
        var hpValue = new StatsValue(
            GetHitPointsText,
            uiParams.HpValue,
            StatsUiTexture.ButtonHPOutputClick,
            StatsUiTexture.ButtonHPOutputHover,
            uiParams
            );

        hpValue.SetClickHandler(() => GameSystems.Help.ShowTopic("TAG_HIT_POINTS"));
        hpValue.TooltipText = null;
        Container.Add(hpValue);

        Container.Add(new StatsLabel(Stat.ac,
                                     "TAG_ARMOR_CLASS",
                                     uiParams.AcLabel,
                                     StatsUiTexture.ButtonHPClick,
                                     StatsUiTexture.ButtonHPHover,
                                     uiParams
                                     ));
        var acValue = new StatsValue(
            obj => GetStatValue(obj, Stat.ac),
            uiParams.AcValue,
            StatsUiTexture.ButtonHPOutputClick,
            StatsUiTexture.ButtonHPOutputHover,
            uiParams
            );

        acValue.SetClickHandler(ShowArmorClassHelp);
        Container.Add(acValue);
    }
    private void CreateAbilityScoreLabels(StatsUiParams uiParams)
    {
        void AddLabel(Stat stat, string helpTopic, Rectangle rectangle)
        {
            Container.Add(new StatsLabel(stat,
                                         helpTopic,
                                         rectangle,
                                         StatsUiTexture.ButtonSTRClick,
                                         StatsUiTexture.ButtonSTRHover,
                                         uiParams
                                         ));
        }

        void AddScore(Stat stat, Rectangle rectangle)
        {
            var widget = new StatsValue(
                obj => GetAbilityScoreValue(obj, stat),
                rectangle,
                StatsUiTexture.ButtonLevelOutputClick,
                StatsUiTexture.ButtonLevelOutputHover,
                uiParams
                );

            widget.SetClickHandler(() => ShowAbilityScoreHelp(stat));
            Container.Add(widget);
        }

        void AddModifier(Stat stat, Rectangle rectangle)
        {
            var widget = new StatsValue(
                obj => GetStatModifierText(obj, stat),
                rectangle,
                StatsUiTexture.ButtonLevelOutputClick,
                StatsUiTexture.ButtonLevelOutputHover,
                uiParams
                );

            widget.TooltipText = null;
            widget.SetClickHandler(() => { GameSystems.Help.ShowTopic("TAG_ABILITY_MODIFIERS"); });
            Container.Add(widget);
        }

        AddLabel(Stat.strength, "TAG_STRENGTH", uiParams.StrLabel);
        AddScore(Stat.strength, uiParams.StrValue);
        AddModifier(Stat.str_mod, uiParams.StrBonusValue);

        AddLabel(Stat.dexterity, "TAG_DEXTERITY", uiParams.DexLabel);
        AddScore(Stat.dexterity, uiParams.DexValue);
        AddModifier(Stat.dex_mod, uiParams.DexBonusValue);

        AddLabel(Stat.constitution, "TAG_CONSTITUTION", uiParams.ConLabel);
        AddScore(Stat.constitution, uiParams.ConValue);
        AddModifier(Stat.con_mod, uiParams.ConBonusValue);

        AddLabel(Stat.intelligence, "TAG_INTELLIGENCE", uiParams.IntLabel);
        AddScore(Stat.intelligence, uiParams.IntValue);
        AddModifier(Stat.int_mod, uiParams.IntBonusValue);

        AddLabel(Stat.wisdom, "TAG_WISDOM", uiParams.WisLabel);
        AddScore(Stat.wisdom, uiParams.WisValue);
        AddModifier(Stat.wis_mod, uiParams.WisBonusValue);

        AddLabel(Stat.charisma, "TAG_CHARISMA", uiParams.ChaLabel);
        AddScore(Stat.charisma, uiParams.ChaValue);
        AddModifier(Stat.cha_mod, uiParams.ChaBonusValue);
    }
    private void CreateCombatLabels(StatsUiParams uiParams)
    {
        Container.Add(new StatsLabel(Stat.initiative_bonus,
                                     "TAG_INITIATIVE",
                                     uiParams.InitLabel,
                                     StatsUiTexture.ButtonInitiativeClick,
                                     StatsUiTexture.ButtonInitiativeHover,
                                     uiParams
                                     ));
        var initValue = new StatsValue(
            obj => GetStatModifierText(obj, Stat.initiative_bonus),
            uiParams.InitValue,
            StatsUiTexture.ButtonInitiativeOutputClick,
            StatsUiTexture.ButtonInitiativeOutputHover,
            uiParams
            );

        initValue.SetClickHandler(ShowInitiativeBonusHelp);
        Container.Add(initValue);

        Container.Add(new StatsLabel(Stat.movement_speed,
                                     "TAG_MOVEMENT_RATE",
                                     uiParams.SpeedLabel,
                                     StatsUiTexture.ButtonInitiativeClick,
                                     StatsUiTexture.ButtonInitiativeHover,
                                     uiParams
                                     ));
        var speedValue = new StatsValue(
            GetMovementSpeedText,
            uiParams.SpeedValue,
            StatsUiTexture.ButtonInitiativeOutputClick,
            StatsUiTexture.ButtonInitiativeOutputHover,
            uiParams
            );

        speedValue.SetClickHandler(() => GameSystems.Help.ShowTopic("TAG_MOVEMENT_RATE"));
        speedValue.TooltipText = null;
        Container.Add(speedValue);


        // Primary Weapon Attack Bonus
        Container.Add(new StatsLabel(Stat.melee_attack_bonus,
                                     "TAG_COMBAT",
                                     uiParams.PrimaryAtkLabel,
                                     StatsUiTexture.ButtonInitiativeClick,
                                     StatsUiTexture.ButtonInitiativeHover,
                                     uiParams
                                     ));
        var primaryAtkValue = new StatsValue(
            GetPrimaryWeaponAttackBonus,
            uiParams.PrimaryAtkValue,
            StatsUiTexture.ButtonInitiativeOutputClick,
            StatsUiTexture.ButtonInitiativeOutputHover,
            uiParams
            );

        primaryAtkValue.SetClickHandler(ShowPrimaryWeaponAttackBonusHelp);
        Container.Add(primaryAtkValue);

        // Secondary Weapon Attack Bonus
        Container.Add(new StatsLabel(Stat.ranged_attack_bonus,
                                     "TAG_COMBAT",
                                     uiParams.SecondaryAtkLabel,
                                     StatsUiTexture.ButtonInitiativeClick,
                                     StatsUiTexture.ButtonInitiativeHover,
                                     uiParams
                                     ));
        var secondaryAtkValue = new StatsValue(
            GetSecondaryWeaponAttackBonus,
            uiParams.SecondaryAtkValue,
            StatsUiTexture.ButtonInitiativeOutputClick,
            StatsUiTexture.ButtonInitiativeOutputHover,
            uiParams
            );

        secondaryAtkValue.SetClickHandler(ShowSecondaryWeaponAttackBonusHelp);
        Container.Add(secondaryAtkValue);
    }