private void drawPartyMemberUi(PartyMember partyMember, Vector2 position, Vector2 headPadding, Vector2 barPadding, Vector2 barSize, Renderer renderer)
        {
            Vector2 screenScaleFactor = Game1.ScreenScaleFactor;
            Vector2 minScale          = new Vector2(MathHelper.Min(screenScaleFactor.X, screenScaleFactor.Y));
            Vector2 shadowOffset      = new Vector2(-5.0f, 5.0f) * minScale;
            Color   shadowColor       = Color.Black * 0.4f;

            TextureData textureData         = CharacterClassHeadTextureData[partyMember.CharacterClass];
            bool        partyMemberThinking = partyMemberIsThinking(partyMember);

            if (partyMemberThinking)
            {
                renderer.Draw(textureData, position + (shadowOffset * 2.0f), shadowColor, 0.0f, minScale, false);
            }
            renderer.Draw(textureData, position, Color.White, 0.0f, minScale, false);

            if (partyMemberIsSelected(partyMember))
            {
                renderer.Draw(arrowTextureData, position + new Vector2((textureData.Width / 2) - (arrowTextureData.Width / 2), -arrowTextureData.Height), Color.White, 0.0f, minScale, false);
            }

            position.X += (textureData.Width * screenScaleFactor.X) + headPadding.X;

            Vector2 partyMemberNameSize     = renderer.Font.MeasureString(partyMember.Name, Font.DefaultSize * minScale.Y);
            Vector2 partyMemberNamePosition = position + new Vector2(barSize.X / 2.0f, 20.0f * minScale.Y);

            if (partyMemberThinking)
            {
                renderer.DrawText(partyMember.Name, partyMemberNamePosition + shadowOffset, shadowColor, 0.0f, partyMemberNameSize / 2.0f, minScale);
            }
            renderer.DrawText(partyMember.Name, partyMemberNamePosition, Color.White, 0.0f, partyMemberNameSize / 2.0f, minScale);

            position.Y += partyMemberNameSize.Y + (20.0f * minScale.Y);
            float percentageHealth = partyMember.Health / (float)partyMember.MaxHealth;
            Color healthBarColor   = percentageHealth > 0.5f ? Color.Lerp(Color.Yellow, Color.Green, (percentageHealth - 0.5f) / 0.5f) : Color.Lerp(Color.Red, Color.Yellow, percentageHealth / 0.5f);

            if (partyMemberThinking)
            {
                drawBar(position + shadowOffset, barSize, 1.0f, shadowColor, false, renderer);
            }
            drawBar(position, barSize, percentageHealth, healthBarColor, true, renderer);
            string  barText     = "HP: " + partyMember.Health.ToString() + "/" + partyMember.MaxHealth;
            Vector2 barTextSize = renderer.Font.MeasureString(barText, Font.DefaultSize * minScale.Y);

            renderer.DrawText(barText, position + (barSize / 2.0f), Color.White, 0.0f, barTextSize / 2.0f, minScale);

            position.Y += barSize.Y * 1.5f;
            partyMember.ForEachStatusEffect((statusEffect) => {
                float widthWithPadding = barSize.Y * 1.1f;
                Vector2 scale          = new Vector2((1.0f / statusEffect.TextureData.Height) * barSize.Y);
                Vector2 nudge          = new Vector2((widthWithPadding - (statusEffect.TextureData.Width * scale.X)) / 2.0f, 0.0f);
                renderer.Draw(statusEffect.TextureData, position + (statusEffect.TextureData.Origin * scale) + nudge, Color.White, 0.0f, scale, false);
                position.X += barSize.Y * 1.1f;
            });
        }
        private void drawPartyMemberUi(PartyMember partyMember, Vector2 position, Vector2 headPadding, Vector2 barPadding, Vector2 barSize, Renderer renderer)
        {
            Vector2 screenScaleFactor = Game1.ScreenScaleFactor;
            Vector2 minScale = new Vector2(MathHelper.Min(screenScaleFactor.X, screenScaleFactor.Y));
            Vector2 shadowOffset = new Vector2(-5.0f, 5.0f) * minScale;
            Color shadowColor = Color.Black * 0.4f;

            TextureData textureData = CharacterClassHeadTextureData[partyMember.CharacterClass];
            bool partyMemberThinking = partyMemberIsThinking(partyMember);

            if (partyMemberThinking)
            {
                renderer.Draw(textureData, position + (shadowOffset * 2.0f), shadowColor, 0.0f, minScale, false);
            }
            renderer.Draw(textureData, position, Color.White, 0.0f, minScale, false);

            if (partyMemberIsSelected(partyMember))
                renderer.Draw(arrowTextureData, position + new Vector2((textureData.Width / 2) - (arrowTextureData.Width / 2), -arrowTextureData.Height), Color.White, 0.0f, minScale, false);

            position.X += (textureData.Width * screenScaleFactor.X) + headPadding.X;

            Vector2 partyMemberNameSize = renderer.Font.MeasureString(partyMember.Name, Font.DefaultSize * minScale.Y);
            Vector2 partyMemberNamePosition = position + new Vector2(barSize.X / 2.0f, 20.0f * minScale.Y);
            if (partyMemberThinking)
                renderer.DrawText(partyMember.Name, partyMemberNamePosition + shadowOffset, shadowColor, 0.0f, partyMemberNameSize / 2.0f, minScale);
            renderer.DrawText(partyMember.Name, partyMemberNamePosition, Color.White, 0.0f, partyMemberNameSize / 2.0f, minScale);

            position.Y += partyMemberNameSize.Y + (20.0f * minScale.Y);
            float percentageHealth = partyMember.Health / (float)partyMember.MaxHealth;
            Color healthBarColor = percentageHealth > 0.5f ? Color.Lerp(Color.Yellow, Color.Green, (percentageHealth - 0.5f) / 0.5f) : Color.Lerp(Color.Red, Color.Yellow, percentageHealth / 0.5f);
            if (partyMemberThinking)
                drawBar(position + shadowOffset, barSize, 1.0f, shadowColor, false, renderer);
            drawBar(position, barSize, percentageHealth, healthBarColor, true, renderer);
            string barText = "HP: " + partyMember.Health.ToString() + "/" + partyMember.MaxHealth;
            Vector2 barTextSize = renderer.Font.MeasureString(barText, Font.DefaultSize * minScale.Y);
            renderer.DrawText(barText, position + (barSize / 2.0f), Color.White, 0.0f, barTextSize / 2.0f, minScale);

            position.Y += barSize.Y * 1.5f;
            partyMember.ForEachStatusEffect((statusEffect) => {
                float widthWithPadding = barSize.Y * 1.1f;
                Vector2 scale = new Vector2((1.0f / statusEffect.TextureData.Height) * barSize.Y);
                Vector2 nudge = new Vector2((widthWithPadding - (statusEffect.TextureData.Width * scale.X)) / 2.0f, 0.0f);
                renderer.Draw(statusEffect.TextureData, position + (statusEffect.TextureData.Origin * scale) + nudge, Color.White, 0.0f, scale, false);
                position.X += barSize.Y * 1.1f;
            });
        }