Пример #1
0
 public SkillData GetSkillInfo(SkillSlot slot)
 {
     if (slot.ClassPosition >= 0 && slot.ClassPosition < Classes.Count)
     {
         ClassData cd = Classes[slot.ClassPosition];
         if (slot.SkillPosition >= 0 && slot.SkillPosition < cd.Skills.Count)
         {
             return(cd.Skills[slot.SkillPosition]);
         }
     }
     return(null);
 }
Пример #2
0
 public override void PostUpdate()
 {
     SkillBeingUsed.ClassPosition = -1;
     SkillBeingUsed.SkillPosition = -1;
     for (int c = 0; c < Classes.Count; c++)
     {
         ClassData cd = Classes[c];
         cd.Update(player, c);
     }
     UsingPrivilegedSkill = false;
     SkillBeingCasted     = null;
     foreach (SkillData sd in GetSkillsUnderEffect)
     {
         if (sd.CastTime >= sd.GetBase.CastTime)
         {
             sd.GetBase.Update(player, sd);
         }
         bool Passive = sd.IsPassive;
         if (sd.Active || Passive)
         {
             if (!Passive && sd.GetBase.UnallowOtherSkillUsage)
             {
                 UsingPrivilegedSkill = true;
             }
             if (!Passive && sd.CastTime < sd.GetBase.CastTime)
             {
                 sd.CastTime++;
                 SkillBeingCasted = sd;
             }
             else
             {
                 sd.Time++;
             }
         }
     }
     GetDifficultyLevel();
 }
Пример #3
0
        public static bool DrawLevelInfo()
        {
            ClassData cd           = Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().GetLastClass;
            Vector2   Offset       = new Vector2(Main.screenWidth * ExpBarOffset.X, Main.screenHeight * ExpBarOffset.Y);
            Vector2   DrawPosition = new Vector2(48f, Main.screenHeight - 50 + 10) + Offset;
            string    ClassName    = cd.Name;
            bool      MaxedClass   = cd.Level >= cd.MaxLevel;

            if (MaxedClass)
            {
                ClassName += " Master";
            }
            Vector2 TextDimension = Utils.DrawBorderString(Main.spriteBatch, ClassName, DrawPosition, (MaxedClass ? Color.Yellow : Color.White) * Main.cursorAlpha);

            DrawPosition.Y -= 10;
            bool MouseOver = false;

            if (!MaxedClass)
            {
                DrawPosition.X  = 4;
                DrawPosition.Y += 25;
                float LevelDist = Utils.DrawBorderString(Main.spriteBatch, cd.Level.ToString(), DrawPosition, Color.White * Main.cursorAlpha).X;
                DrawPosition.X += 150 + LevelDist + 4;
                Utils.DrawBorderString(Main.spriteBatch, (cd.Level + 1).ToString(), DrawPosition, Color.White * Main.cursorAlpha);
                DrawPosition.X -= 150 + 2;
                DrawPosition.Y += 5;
                Main.spriteBatch.Draw(LevelArrowTexture, DrawPosition, new Rectangle(0, 0, 150, 12), Color.White);
                DrawPosition.X += 2;
                DrawPosition.Y += 2;
                MouseOver       = Main.mouseX >= DrawPosition.X && Main.mouseX < DrawPosition.X + 150 &&
                                  Main.mouseY >= DrawPosition.Y && Main.mouseY < DrawPosition.Y + 12;
                if (cd.Exp > 0)
                {
                    int BarFill = (int)(144 * ((float)cd.Exp / cd.MaxExp));
                    if (BarFill > 144)
                    {
                        BarFill = 144;
                    }
                    Main.spriteBatch.Draw(LevelArrowTexture, DrawPosition, new Rectangle(152, 2, BarFill, 8), Color.Green * Main.cursorAlpha);
                }
            }
            if (MouseOver)
            {
                string  Text         = "Exp [" + cd.Exp + "/" + cd.MaxExp + "]";
                Vector2 TextPosition = new Vector2(Main.mouseX + 18, Main.mouseY + 18);
                if (TextPosition.Y >= Main.screenHeight - 22)
                {
                    TextPosition.Y = Main.screenHeight - 22;
                }
                Utils.DrawBorderString(Main.spriteBatch, Text, TextPosition, Color.White * Main.cursorAlpha);
            }
            Vector2 SkillInfoStartPosition = new Vector2(Main.screenWidth * 0.5f - 128 * 2, Main.screenHeight - 22);

            if (ClassSelectionInterface.Active)
            {
                SkillInfoStartPosition.Y -= ClassSelectionInterface.Height;
            }
            if (Main.playerInventory)
            {
                SkillInfoStartPosition.Y -= 32;
                if (!ClassSelectionInterface.Active)
                {
                    SkillInfoStartPosition.X -= Main.screenWidth * 0.2f;
                }
            }
            PlayerMod playerMod = Main.player[Main.myPlayer].GetModPlayer <PlayerMod>();

            if (playerMod.ActiveSkillsUnlocked && ClassSelectionInterface.ShowHud)
            {
                for (int s = 0; s < 4; s++)
                {
                    Color     c        = Color.White;
                    Color     barColor = Color.Black;
                    SkillData sd       = playerMod.GetSkillInfo(playerMod.ActiveSkill[s]);
                    float     Charge   = 1f;
                    if (sd != null)
                    {
                        if (sd.Active)
                        {
                            c      = Color.Gray;
                            Charge = 1f;
                        }
                        else if (sd.Cooldown > 0)
                        {
                            c        = Color.Gray;
                            Charge   = 1f - (float)sd.Cooldown / sd.GetBase.Cooldown;
                            barColor = Color.Red;
                        }
                        else
                        {
                            barColor = Color.Green;
                        }
                    }
                    Main.spriteBatch.Draw(Main.blackTileTexture, new Rectangle((int)SkillInfoStartPosition.X - 4, (int)SkillInfoStartPosition.Y, (int)(120 * Charge), 18), barColor);
                    DrawTextBorder(SkillInfoStartPosition, 128 - 16, Color.Yellow);
                    if ((Main.playerInventory && ClassSelectionInterface.Active) || SkillChangeSlot > -1)
                    {
                        if (Main.mouseX >= SkillInfoStartPosition.X && Main.mouseX < SkillInfoStartPosition.X + 128 &&
                            Main.mouseY >= SkillInfoStartPosition.Y && Main.mouseY < SkillInfoStartPosition.Y + 24)
                        {
                            playerMod.player.mouseInterface = true;
                            c = Color.Yellow;
                            if (Main.mouseLeft && Main.mouseLeftRelease)
                            {
                                if (SkillChangeSlot == s)
                                {
                                    SkillChangeSlot = -1;
                                }
                                else
                                {
                                    SkillChangeSlot      = s;
                                    Main.playerInventory = false;
                                }
                            }
                        }
                    }
                    string Text = "Active#" + s;
                    if (playerMod.ActiveSkill[s].ClassPosition > -1)
                    {
                        Text = playerMod.Classes[playerMod.ActiveSkill[s].ClassPosition].Skills[playerMod.ActiveSkill[s].SkillPosition].Name;
                    }
                    Utils.DrawBorderString(Main.spriteBatch, Text, SkillInfoStartPosition, c);
                    SkillInfoStartPosition.X += 128;
                }
                SkillInfoStartPosition.Y -= 24;
            }
            SkillInfoStartPosition.X = Main.screenWidth * 0.5f - 128 * 0.5f;
            if (Main.playerInventory)
            {
                if (!ClassSelectionInterface.Active)
                {
                    SkillInfoStartPosition.X -= Main.screenWidth * 0.20f;
                }
            }
            if (playerMod.CombatSkillsUnlocked)
            {
                Color     c      = Color.White;
                SkillData sd     = playerMod.GetSkillInfo(playerMod.CombatSkill);
                float     Charge = 1f;
                Main.spriteBatch.Draw(Main.blackTileTexture, new Rectangle((int)SkillInfoStartPosition.X - 4, (int)SkillInfoStartPosition.Y, 120, 18), Color.Black);
                DrawTextBorder(SkillInfoStartPosition, 128 - 16, Color.Red);
                if ((Main.playerInventory && ClassSelectionInterface.Active) || SkillChangeSlot > -1)
                {
                    if (Main.mouseX >= SkillInfoStartPosition.X && Main.mouseX < SkillInfoStartPosition.X + 128 &&
                        Main.mouseY >= SkillInfoStartPosition.Y && Main.mouseY < SkillInfoStartPosition.Y + 24)
                    {
                        c = Color.Yellow;
                        playerMod.player.mouseInterface = true;
                        if (Main.mouseLeft && Main.mouseLeftRelease)
                        {
                            if (SkillChangeSlot == 4)
                            {
                                SkillChangeSlot = -1;
                            }
                            else
                            {
                                SkillChangeSlot      = 4;
                                Main.playerInventory = false;
                            }
                        }
                    }
                }
                Utils.DrawBorderString(Main.spriteBatch, (playerMod.CombatSkill.ClassPosition > -1 ? playerMod.Classes[playerMod.CombatSkill.ClassPosition].Skills[playerMod.CombatSkill.SkillPosition].Name : "Combat Skill"), SkillInfoStartPosition, c);
            }
            if (SkillChangeSlot > -1)
            {
                Enum.SkillTypes Types = Enum.SkillTypes.Active;
                if (SkillChangeSlot == 4)
                {
                    Types = Enum.SkillTypes.Attack;
                }
                List <KeyValuePair <int, int> > AbleSkills = new List <KeyValuePair <int, int> >();
                for (int c = 0; c < playerMod.Classes.Count; c++)
                {
                    Vector2 SkillStartPosition = new Vector2(Main.screenWidth * 0.5f - (128 * playerMod.Classes.Count * 0.5f) + 128 * c, Main.screenHeight - 75);
                    for (int s = 0; s < playerMod.Classes[c].Skills.Count; s++)
                    {
                        SkillData sd = playerMod.Classes[c].Skills[s];
                        if (sd.SkillTypes == Types && sd.Level > 0)
                        {
                            Color color = Color.White;
                            if (Main.mouseX >= SkillStartPosition.X && Main.mouseX < SkillStartPosition.X + 128 &&
                                Main.mouseY >= SkillStartPosition.Y && Main.mouseY < SkillStartPosition.Y + 25)
                            {
                                color = Color.Yellow;
                                playerMod.player.mouseInterface = true;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    if (SkillChangeSlot == 4)
                                    {
                                        playerMod.CombatSkill.ClassPosition = c;
                                        playerMod.CombatSkill.SkillPosition = s;
                                    }
                                    else
                                    {
                                        playerMod.ActiveSkill[SkillChangeSlot].ClassPosition = c;
                                        playerMod.ActiveSkill[SkillChangeSlot].SkillPosition = s;
                                    }
                                    SkillChangeSlot = -1;
                                }
                            }
                            MainMod.DrawTextBorder(SkillStartPosition, 128 - 16, Color.White);
                            Utils.DrawBorderString(Main.spriteBatch, sd.Name, SkillStartPosition, color);
                            SkillStartPosition.Y -= 25;
                        }
                    }
                    SkillStartPosition.Y -= 3;
                    Utils.DrawBorderString(Main.spriteBatch, playerMod.Classes[c].Name, SkillStartPosition, Color.White, 1.2f);
                }
            }
            SkillInfoStartPosition.X += 128;
            if (!Main.playerInventory)
            {
                Vector2 Position  = new Vector2(Main.screenWidth * 0.5f, Main.screenHeight * 0.15f + 25f);
                int     StarCount = (int)Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().DifficultyLevel;
                Position.X -= (14 * StarCount) * 0.5f;
                for (int i = 0; i < StarCount; i++)
                {
                    Main.spriteBatch.Draw(StarTexture, Position, Color.White);
                    Position.X += 14;
                }
                //Utils.DrawBorderString(Main.spriteBatch, "Difficulty: "+ Main.player[Main.myPlayer].GetModPlayer<PlayerMod>().DifficultyLevel, Position, Color.Yellow, 0.85f, 0.5f);
            }
            DrawClassInfoInterface();
            return(true);
        }
        public static void UpdateAndDraw()
        {
            if (!Main.playerInventory)
            {
                if (!ShowHud)
                {
                    ShowHud = true;
                }
                if (Active)
                {
                    Close();
                }
                return;
            }
            if (!ShowHud)
            {
                return;
            }
            Vector2 SkillInterfacePos = new Vector2(Main.screenWidth * 0.5f - Width * 0.5f, Main.screenHeight - Height);

            if (Active)
            {
                if (Main.mouseX >= SkillInterfacePos.X && Main.mouseX < SkillInterfacePos.X + Width &&
                    Main.mouseY >= SkillInterfacePos.Y && Main.mouseY < SkillInterfacePos.Y + Height)
                {
                    Main.player[Main.myPlayer].mouseInterface = true;
                }
                Main.spriteBatch.Draw(Main.blackTileTexture, new Rectangle((int)SkillInterfacePos.X - 2, (int)SkillInterfacePos.Y - 2, Width + 4, Height + 2), Color.Black);
                Main.spriteBatch.Draw(Main.blackTileTexture, new Rectangle((int)SkillInterfacePos.X, (int)SkillInterfacePos.Y, Width, Height), Color.OrangeRed);
                //Wiki page
                if (Active && SelectedClass > -1 && SelectedClass < Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes.Count)
                {
                    Vector2 WikiPageButtonPosition = new Vector2(Main.screenWidth * 0.5f + Width * 0.5f - 2, Main.screenHeight - Height);
                    Color   color = Color.White;
                    if (Main.mouseX >= WikiPageButtonPosition.X - 40 && Main.mouseX < WikiPageButtonPosition.X &&
                        Main.mouseY >= WikiPageButtonPosition.Y + 2 && Main.mouseY < WikiPageButtonPosition.Y + 20)
                    {
                        color = Color.Yellow;
                        if (Main.mouseLeft && Main.mouseLeftRelease)
                        {
                            string WikiLink = "";
                            if (CheckedSkillID > -1)
                            {
                                SkillBase sb = MainMod.GetSkill(CheckedSkillID, CheckedSkillModID);
                                if (sb.WikiPage != null)
                                {
                                    WikiLink = sb.WikiPage;
                                }
                                else
                                {
                                    WikiLink = sb.Name;
                                }
                            }
                            else if (CheckedClassID > -1)
                            {
                                ClassBase sb = MainMod.GetClass(CheckedClassID, CheckedClassModID);
                                if (sb.WikiPage != null)
                                {
                                    WikiLink = sb.WikiPage;
                                }
                                else
                                {
                                    WikiLink = sb.Name;
                                }
                            }
                            else if (SelectedClass > -1)
                            {
                                ClassBase c = Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes[SelectedClass].GetClass;
                                if (SelectedSkill > -1)
                                {
                                    SkillBase b = MainMod.GetSkill(c.SkillList[SelectedSkill].SkillID, c.SkillList[SelectedSkill].SkillMod);
                                    if (c.WikiPage != null)
                                    {
                                        WikiLink = b.WikiPage;
                                    }
                                    else
                                    {
                                        WikiLink = b.Name;
                                    }
                                }
                                else
                                {
                                    if (c.WikiPage != null)
                                    {
                                        WikiLink = c.WikiPage;
                                    }
                                    else
                                    {
                                        WikiLink = c.Name;
                                    }
                                }
                            }
                            if (WikiLink != "")
                            {
                                WikiLink = "https://nakano15-mods.fandom.com/wiki/" + WikiLink;
                                System.Diagnostics.Process.Start(WikiLink);
                            }
                        }
                    }
                    Utils.DrawBorderString(Main.spriteBatch, "Wiki", WikiPageButtonPosition, color, 0.75f, 1);
                }
                if (CheckedClassID > -1)
                {
                    SkillInterfacePos.X += 4;
                    SkillInterfacePos.Y += 4;
                    ClassBase cb = MainMod.GetClass(CheckedClassID, CheckedClassModID);
                    Utils.DrawBorderString(Main.spriteBatch, cb.Name, SkillInterfacePos, Color.White, 1.2f);
                    SkillInterfacePos.Y += 25;
                    Utils.DrawBorderString(Main.spriteBatch, "Type: " + cb.ClassType.ToString(), SkillInterfacePos, Color.White, 1.2f);
                    SkillInterfacePos.Y += 25;
                    Utils.DrawBorderString(Main.spriteBatch, "Max Level: " + cb.MaxLevel, SkillInterfacePos, Color.White);
                    SkillInterfacePos.Y += 22;
                    if (CheckedSkillID > -1)
                    {
                        SkillBase sb = MainMod.GetSkill(CheckedSkillID, CheckedSkillModID);
                        Utils.DrawBorderString(Main.spriteBatch, sb.Name, SkillInterfacePos, Color.White, 1.2f);
                        SkillInterfacePos.Y += 25;
                        Utils.DrawBorderString(Main.spriteBatch, "Type: " + sb.skillType.ToString(), SkillInterfacePos, Color.White, 1);
                        SkillInterfacePos.Y += 22;
                        string[] Desc = sb.Description.Split('\n');
                        foreach (string desc in Desc)
                        {
                            Utils.DrawBorderString(Main.spriteBatch, desc, SkillInterfacePos, Color.White, 0.8f);
                            SkillInterfacePos.Y += 18;
                        }
                        Vector2 ButtonPosition = new Vector2(Main.screenWidth * 0.5f - Width * 0.5f + 4 + Width - 68f, Main.screenHeight - 22);
                        Color   color          = Color.White;
                        if (Main.mouseX >= ButtonPosition.X && Main.mouseX < ButtonPosition.X + 68 && Main.mouseY >= ButtonPosition.Y && Main.mouseY < ButtonPosition.Y + 22)
                        {
                            color = Color.Yellow;
                            if (Main.mouseLeft && Main.mouseLeftRelease)
                            {
                                CheckedSkillID       = -1;
                                CheckedSkillModID    = "";
                                AskIfShouldResetThis = false;
                            }
                        }
                        Utils.DrawBorderString(Main.spriteBatch, "Return", ButtonPosition, color);
                    }
                    else
                    {
                        bool CanChangeClass = true;
                        if (cb.ClassType == ClassBase.ClassTypes.Aspect && Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes.Any(x => x.GetClass.ClassType == ClassBase.ClassTypes.Aspect))
                        {
                            CanChangeClass = false;
                            Utils.DrawBorderString(Main.spriteBatch, "You can only have one Aspect class on your character.", SkillInterfacePos, Color.White, 0.85f);
                            SkillInterfacePos.Y += 22f;
                        }
                        string[] DescriptionConcat = cb.Description.Split('\n');
                        foreach (string s in DescriptionConcat)
                        {
                            Utils.DrawBorderString(Main.spriteBatch, s, SkillInterfacePos, Color.White, 0.8f);
                            SkillInterfacePos.Y += 18;
                        }
                        const int SkillColumns = 2;
                        int       SkillRows    = (int)((Main.screenHeight - SkillInterfacePos.Y) / 20);
                        for (int row = 0; row < SkillRows; row++)
                        {
                            for (int column = 0; column < SkillColumns; column++)
                            {
                                int            SkillIndex = column + SkillColumns * (row + ScrollY);
                                string         SkillName  = "Skill#" + SkillIndex;
                                SkillBase      sb         = null;
                                ClassSkillInfo csi;
                                if (SkillIndex < cb.SkillList.Count)
                                {
                                    csi       = cb.SkillList[SkillIndex];
                                    sb        = MainMod.GetSkill(csi.SkillID, csi.SkillMod);
                                    SkillName = sb.Name;
                                }
                                else
                                {
                                    continue;
                                }
                                Vector2 SkillPosition = new Vector2(128f * column, row * 25) + SkillInterfacePos;
                                Color   c             = Color.White;
                                if (Main.mouseX >= SkillPosition.X && Main.mouseX < SkillPosition.X + 128 &&
                                    Main.mouseY >= SkillPosition.Y && Main.mouseY < SkillPosition.Y + 25)
                                {
                                    c = Color.Cyan;
                                    if (Main.mouseLeft && Main.mouseLeftRelease)
                                    {
                                        CheckedSkillID       = csi.SkillID;
                                        CheckedSkillModID    = csi.SkillMod;
                                        AskIfShouldResetThis = false;
                                    }
                                }
                                Utils.DrawBorderString(Main.spriteBatch, SkillName, SkillPosition, c);
                            }
                        }
                        //
                        Vector2 ButtonPosition = new Vector2(Main.screenWidth * 0.5f - Width * 0.5f + 4, Main.screenHeight - 22);
                        Color   color          = Color.White;
                        if (Main.mouseX >= ButtonPosition.X && Main.mouseX < ButtonPosition.X + 86 && Main.mouseY >= ButtonPosition.Y && Main.mouseY < ButtonPosition.Y + 22)
                        {
                            color = Color.Yellow;
                            if (CanChangeClass && Main.mouseLeft && Main.mouseLeftRelease)
                            {
                                Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().AddClass(CheckedClassID, CheckedClassModID);
                                Main.NewText("You changed into " + cb.Name + " class!");
                                CheckedClassID    = -1;
                                CheckedClassModID = "";
                                Close();
                                AskIfShouldResetThis = false;
                            }
                        }
                        Utils.DrawBorderString(Main.spriteBatch, "Change Class", ButtonPosition, color);
                        //
                        ButtonPosition.X += Width - 68f;
                        color             = Color.Red;
                        if (Main.mouseX >= ButtonPosition.X && Main.mouseX < ButtonPosition.X + 68 && Main.mouseY >= ButtonPosition.Y && Main.mouseY < ButtonPosition.Y + 22)
                        {
                            color = Color.Yellow;
                            if (Main.mouseLeft && Main.mouseLeftRelease)
                            {
                                CheckedClassID    = -1;
                                CheckedClassModID = "";
                                Close();
                            }
                        }
                        Utils.DrawBorderString(Main.spriteBatch, "Close", ButtonPosition, color);
                    }
                    return;
                }
                if (SelectedSkill > -1)
                {
                    if (SelectedClass == -1)
                    {
                        SelectedSkill = -1;
                        return;
                    }
                    SkillInterfacePos.X += 4;
                    SkillInterfacePos.Y += 4;
                    ClassData cd = Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes[SelectedClass];
                    SkillData sd = cd.Skills[SelectedSkill];
                    SkillBase sb = sd.GetBase;
                    Utils.DrawBorderString(Main.spriteBatch, sb.Name, SkillInterfacePos, Color.White, 1.2f);
                    SkillInterfacePos.Y += 25;
                    string t = "";
                    if (sd.Level == 0)
                    {
                        t = "Spend Skill Point to Unlock.";
                    }
                    else if (sd.Level > sb.MaxLevel)
                    {
                        t = "Overlevel " + (sd.Level - sb.MaxLevel);
                    }
                    else if (sd.Level == sb.MaxLevel)
                    {
                        t = "Mastered";
                    }
                    else
                    {
                        t = "Level [" + sd.Level + "/" + sb.MaxLevel + "]";
                    }
                    Color textColor = Color.White;
                    if (sd.Level < sb.MaxLevel && Main.mouseX >= SkillInterfacePos.X && Main.mouseX < SkillInterfacePos.X + 128 &&
                        Main.mouseY >= SkillInterfacePos.Y && Main.mouseY < SkillInterfacePos.Y + 20)
                    {
                        textColor = Color.Yellow;
                        if (Main.mouseLeft && Main.mouseLeftRelease && cd.SkillPoint > 0)
                        {
                            cd.SpendPointOnSkill(SelectedSkill);
                        }
                    }
                    Utils.DrawBorderString(Main.spriteBatch, t, SkillInterfacePos, textColor, 0.9f);
                    SkillInterfacePos.Y += 20;
                    Utils.DrawBorderString(Main.spriteBatch, sb.skillType.ToString(), SkillInterfacePos, Color.White, 0.9f);
                    SkillInterfacePos.Y += 26;
                    string[] DescriptionConcat = sb.Description.Split('\n');
                    foreach (string s in DescriptionConcat)
                    {
                        Utils.DrawBorderString(Main.spriteBatch, s, SkillInterfacePos, Color.White, 0.9f);
                        SkillInterfacePos.Y += 20;
                    }
                    SkillInterfacePos.Y += 26;
                    if (sd.Level == 0)
                    {
                        foreach (ClassSkillInfo csi in cd.GetClass.SkillList)
                        {
                            if (csi.SkillID == sd.ID && csi.SkillMod == sd.ModID)
                            {
                                for (int sqreq = 0; sqreq < 3; sqreq++)
                                {
                                    if (csi.SkillReqPosition[sqreq] == -1)
                                    {
                                        continue;
                                    }
                                    SkillData sdtwo = cd.Skills[csi.SkillReqPosition[sqreq]];
                                    if (sdtwo.Level < csi.SkillLevel[sqreq])
                                    {
                                        string T = "Requires " + MainMod.GetSkill(sdtwo.ID, sdtwo.ModID).Name + " Level " + csi.SkillLevel[sqreq];
                                        Utils.DrawBorderString(Main.spriteBatch, T, SkillInterfacePos, Color.Gray, 0.9f);
                                        SkillInterfacePos.Y += 21f;
                                    }
                                }
                            }
                        }
                    }
                    Vector2 SkillPointsPosition = new Vector2(Main.screenWidth * 0.5f - Width * 0.5f, Main.screenHeight - 22);
                    Utils.DrawBorderString(Main.spriteBatch, "Skill Points: " + cd.SkillPoint, SkillPointsPosition, Color.White);
                    SkillPointsPosition.X += Width - 56;
                    textColor              = Color.White;
                    if (Main.mouseX >= SkillPointsPosition.X && Main.mouseX < SkillPointsPosition.X + 56 && Main.mouseY >= SkillPointsPosition.Y && Main.mouseY < SkillPointsPosition.Y + 25)
                    {
                        textColor = Color.Red;
                        if (Main.mouseLeft && Main.mouseLeftRelease)
                        {
                            SelectedSkill = -1;
                        }
                    }
                    Utils.DrawBorderString(Main.spriteBatch, "Close", SkillPointsPosition, textColor);
                    //
                    if (sd.Level > 0)
                    {
                        SkillPointsPosition.X = Main.screenWidth * 0.5f;
                        if (AskIfShouldResetThis)
                        {
                            SkillPointsPosition.X -= 10;
                            textColor              = Color.White;
                            if (Main.mouseX >= SkillPointsPosition.X - 40 && Main.mouseX < SkillPointsPosition.X && Main.mouseY >= SkillPointsPosition.Y && Main.mouseY < SkillPointsPosition.Y + 22)
                            {
                                textColor = Color.Yellow;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    if (!Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().ResetSkill(SelectedClass, SelectedSkill))
                                    {
                                        Main.NewText("Something went wrong.");
                                    }
                                    AskIfShouldResetThis = false;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "Yes", SkillPointsPosition, textColor, 1f, 1f);

                            SkillPointsPosition.X = Main.screenWidth * 0.5f + 10;
                            textColor             = Color.White;
                            if (Main.mouseX >= SkillPointsPosition.X && Main.mouseX < SkillPointsPosition.X + 40 && Main.mouseY >= SkillPointsPosition.Y && Main.mouseY < SkillPointsPosition.Y + 22)
                            {
                                textColor = Color.Yellow;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    AskIfShouldResetThis = false;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "No", SkillPointsPosition, textColor, 1f, 0);
                            SkillPointsPosition.X -= 10;
                            SkillPointsPosition.Y -= 25;
                            Utils.DrawBorderString(Main.spriteBatch, "Are you sure that want to reset this skill?", SkillPointsPosition, Color.White, 1f, 0.5f);
                        }
                        else
                        {
                            textColor = Color.White;
                            if (Main.mouseX >= SkillPointsPosition.X - 30 && Main.mouseX < SkillPointsPosition.X + 30 && Main.mouseY >= SkillPointsPosition.Y && Main.mouseY < SkillPointsPosition.Y + 22)
                            {
                                textColor = Color.Yellow;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    AskIfShouldResetThis = true;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "Reset Skill", SkillPointsPosition, textColor, 1f, 0.5f);
                        }
                    }
                    return;
                }
                Main.spriteBatch.Draw(Main.blackTileTexture, new Rectangle((int)SkillInterfacePos.X + 4, (int)SkillInterfacePos.Y + 4, 128, Height - 8), Color.Goldenrod);
                bool          LastClassIsMaxed = false;
                List <string> ClassList        = new List <string>();
                bool          First            = true;
                foreach (ClassData c in Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes)
                {
                    LastClassIsMaxed = c.Level >= c.MaxLevel;
                    if (First)
                    {
                        First = false;
                        continue;
                    }
                    ClassList.Add((LastClassIsMaxed ? "*" : "") + c.Name);
                }
                if (LastClassIsMaxed && Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().ClassChangeUnlocked&& ClassList.Count < MainMod.MaxClasses + 1)
                {
                    ClassList.Add("New Class");
                }
                int MaxClasses = Height / 25;
                if (ClassList.Count < MaxClasses)
                {
                    MaxClasses = ClassList.Count;
                }
                for (int i = 0; i < MaxClasses; i++)
                {
                    int     Index             = i + 1;
                    Vector2 ClassNamePosition = SkillInterfacePos + new Vector2(4, 4 + i * 25f);
                    bool    MouseOver         = Main.mouseX >= ClassNamePosition.X && Main.mouseX < ClassNamePosition.X + 96 && Main.mouseY >= ClassNamePosition.Y && Main.mouseY < ClassNamePosition.Y + 25;
                    Color   color             = Color.White;
                    bool    IsSelected        = SelectedClass == Index;
                    if (IsSelected)
                    {
                        color = Color.Yellow;
                    }
                    if (MouseOver)
                    {
                        color = Color.Cyan;
                        if (Main.mouseLeft && Main.mouseLeftRelease)
                        {
                            SelectedSkill = -1;
                            if (IsSelected)
                            {
                                SelectedClass = -1;
                            }
                            else
                            {
                                SelectedClass = Index;
                            }
                        }
                    }
                    Utils.DrawBorderString(Main.spriteBatch, ClassList[i], ClassNamePosition, color);
                }
                SkillInterfacePos.X += 128 + 12f;
                if (SelectedClass > -1)
                {
                    List <ClassData> classes = Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().Classes;
                    if (SelectedClass >= classes.Count)
                    {
                        Utils.DrawBorderString(Main.spriteBatch, "Class Advancement Disponible.", SkillInterfacePos, Color.White);
                        SkillInterfacePos.Y += 25f;
                        int Rows = 2, Columns = (Height - 25) / 25;
                        for (int c = 0; c < Columns; c++)
                        {
                            for (int r = 0; r < Rows; r++)
                            {
                                int Index = r + c * Rows;
                                if (Index >= MainMod.UnlockedClasses.Count)
                                {
                                    continue;
                                }
                                Vector2 Position      = SkillInterfacePos + new Vector2(r * 128, 25 * c);
                                Color   color         = Color.White;
                                int     ClassID       = MainMod.UnlockedClasses[Index].Key;
                                string  ClassModID    = MainMod.UnlockedClasses[Index].Value;
                                string  ClassName     = MainMod.GetClass(ClassID, ClassModID).Name;//"Class#" + Index;
                                bool    RepeatedClass = classes.Any(x => x.ClassID == ClassID && x.ClassModID == ClassModID);
                                if (RepeatedClass)
                                {
                                    color = Color.Gray;
                                }
                                else
                                {
                                    if (Main.mouseX >= Position.X && Main.mouseX < Position.X + 128 &&
                                        Main.mouseY >= Position.Y && Main.mouseY < Position.Y + 25)
                                    {
                                        color = Color.Yellow;
                                        if (Main.mouseLeft && Main.mouseLeftRelease)
                                        {
                                            CheckedClassID    = ClassID;
                                            CheckedClassModID = ClassModID;
                                        }
                                    }
                                }
                                Utils.DrawBorderString(Main.spriteBatch, ClassName, Position, color);
                            }
                        }
                    }
                    else
                    {
                        ClassData c = classes[SelectedClass];
                        Utils.DrawBorderString(Main.spriteBatch, c.Name, SkillInterfacePos, Color.White);
                        SkillInterfacePos.Y += 25f;
                        Utils.DrawBorderString(Main.spriteBatch, (c.Level < c.MaxLevel ? "Level: " + c.Level + "  Exp [" + c.Exp + "/" + c.MaxExp + "]" : "Mastered"), SkillInterfacePos, Color.White, 0.85f);
                        SkillInterfacePos.Y += 22f;
                        const int SkillColumns = 2;
                        int       SkillRows    = (int)((Main.screenHeight - SkillInterfacePos.Y) / 25 - (AskIfShouldResetThis ? 2 : 1));
                        for (int row = 0; row < SkillRows; row++)
                        {
                            for (int column = 0; column < SkillColumns; column++)
                            {
                                int    SkillIndex = column + SkillColumns * (row + ScrollY);
                                string SkillName  = "Skill#" + SkillIndex;
                                if (SkillIndex < c.Skills.Count)
                                {
                                    SkillName = c.Skills[SkillIndex].GetBase.Name;
                                }
                                else
                                {
                                    continue;
                                }
                                Vector2 SkillPosition = new Vector2(128f * column, row * 25) + SkillInterfacePos;
                                Color   color         = Color.White;
                                if (Main.mouseX >= SkillPosition.X && Main.mouseX < SkillPosition.X + 128 &&
                                    Main.mouseY >= SkillPosition.Y && Main.mouseY < SkillPosition.Y + 25)
                                {
                                    color = Color.Cyan;
                                    if (Main.mouseLeft && Main.mouseLeftRelease)
                                    {
                                        SelectedSkill = SkillIndex;
                                    }
                                }
                                Utils.DrawBorderString(Main.spriteBatch, SkillName, SkillPosition, color);
                            }
                        }
                        //
                        Vector2 SkillResetPos = new Vector2(Main.screenWidth * 0.5f, Main.screenHeight - 22);
                        Color   textColor;
                        if (AskIfShouldResetThis)
                        {
                            SkillResetPos.X -= 10;
                            textColor        = Color.White;
                            if (Main.mouseX >= SkillResetPos.X - 40 && Main.mouseX < SkillResetPos.X && Main.mouseY >= SkillResetPos.Y && Main.mouseY < SkillResetPos.Y + 22)
                            {
                                textColor = Color.Red;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    if (!Main.player[Main.myPlayer].GetModPlayer <PlayerMod>().DeleteClass(SelectedClass))
                                    {
                                        Main.NewText("Something went wrong.");
                                    }
                                    else
                                    {
                                        SelectedClass = SelectedSkill = -1;
                                    }
                                    AskIfShouldResetThis = false;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "Yes", SkillResetPos, textColor, 1f, 1f);

                            SkillResetPos.X = Main.screenWidth * 0.5f + 10;
                            textColor       = Color.White;
                            if (Main.mouseX >= SkillResetPos.X && Main.mouseX < SkillResetPos.X + 40 && Main.mouseY >= SkillResetPos.Y && Main.mouseY < SkillResetPos.Y + 22)
                            {
                                textColor = Color.Yellow;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    AskIfShouldResetThis = false;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "No", SkillResetPos, textColor, 1f, 0);
                            SkillResetPos.X -= 10;
                            SkillResetPos.Y -= 25;
                            Utils.DrawBorderString(Main.spriteBatch, "Do you really want to delete this class?", SkillResetPos, Color.White, 1f, 0.5f);
                        }
                        else
                        {
                            textColor = Color.White;
                            if (Main.mouseX >= SkillResetPos.X - 30 && Main.mouseX < SkillResetPos.X + 30 && Main.mouseY >= SkillResetPos.Y && Main.mouseY < SkillResetPos.Y + 22)
                            {
                                textColor = Color.Red;
                                if (Main.mouseLeft && Main.mouseLeftRelease)
                                {
                                    AskIfShouldResetThis = true;
                                }
                            }
                            Utils.DrawBorderString(Main.spriteBatch, "Delete Class", SkillResetPos, textColor, 1f, 0.5f);
                        }
                    }
                }
                else
                {
                    SkillInterfacePos.X += (156 * 0.5f);
                    SkillInterfacePos.Y += (128 * 0.5f);
                    Utils.DrawBorderString(Main.spriteBatch, "No class selected.", SkillInterfacePos, Color.White, 1, 0.5f, 0.5f);
                }
            }
            {
                Vector2 ButtonPosition = new Vector2(Main.screenWidth * 0.5f - Width * 0.5f - 2, Main.screenHeight);
                if (Active)
                {
                    ButtonPosition.Y -= Height + 32;
                }
                else
                {
                    ButtonPosition.Y -= 32;
                }
                if (Main.mouseX >= ButtonPosition.X && Main.mouseX < ButtonPosition.X + 96 &&
                    Main.mouseY >= ButtonPosition.Y && Main.mouseY < ButtonPosition.Y + 32)
                {
                    Main.player[Main.myPlayer].mouseInterface = true;
                    if (Main.mouseLeft && Main.mouseLeftRelease)
                    {
                        if (Active)
                        {
                            Close();
                        }
                        else
                        {
                            Open();
                        }
                    }
                }
                Main.spriteBatch.Draw(MainMod.ClassButtonTexture, ButtonPosition, Color.White);
            }
        }