using System;
using System.Linq;
using System.Collections.Generic;
using Turbo.Plugins.Default;
using SharpDX;
using SharpDX.Direct2D1;
 
namespace Turbo.Plugins.User
{
    public class DAV_BossCDPlugin : BasePlugin, IInGameWorldPainter, INewAreaHandler {
        public float XPos { get; set; }
        public float YPos { get; set; }
        public float barH { get; set; }
        public float barW { get; set; }
        public string CDformat { get; set; }
        public IFont SkillFont { get; set; }
        public IBrush Brush_Ready { get; set; } // Skill ready (cool down = 0)
        public IBrush Brush_CD { get; set; } // Cooldown in progress
        public IBrush Brush_NA { get; set; } // Skill not available yet
        public IBrush Brush_BG { get; set; } // background (for skill in cool down)
        public Dictionary<DAV_KeyAnime, DAV_BossSkill> BossSkill_List { get; set; } = new Dictionary<DAV_KeyAnime, DAV_BossSkill>(new DAV_KeyAnime.EqualityComparer());
        public Dictionary<DAV_KeyActor, DAV_BossSkill> BossActor_List { get; set; } = new Dictionary<DAV_KeyActor, DAV_BossSkill>(new DAV_KeyActor.EqualityComparer());
 
        private bool showDebug { get; set; } = false;
        private bool BossFlight { get; set; } = false;
        private DAV_KeyAnime preSkill { get; set; }
        private DAV_KeyActor thisActor { get; set; }
        private Dictionary<AnimSnoEnum, double> BossSkill_This { get; set; } = new Dictionary<AnimSnoEnum, double>();
        private Dictionary<ActorSnoEnum, double> BossActor_This { get; set; } = new Dictionary<ActorSnoEnum, double>();
 
        public DAV_BossCDPlugin() {
            Enabled = true;
        }
 
        public override void Load(IController hud) {
            base.Load(hud);
 
            XPos = Hud.Window.Size.Width * 0.7f;
            YPos = Hud.Window.Size.Height * 0.5f;
            barH = Hud.Window.Size.Height * 0.015f;
            barW = Hud.Window.Size.Width * 0.1f;
            CDformat = "F0"; // F0, F1 or F2
            SkillFont = Hud.Render.CreateFont("arial", 7, 255, 255, 255, 255, false, false, 255, 0, 0, 0, true);
            Brush_Ready = Hud.Render.CreateBrush(240, 128, 255, 0, 0);
            Brush_CD = Hud.Render.CreateBrush(240, 255, 51, 51, 0);
            Brush_NA = Hud.Render.CreateBrush(240, 153, 153, 153, 0);
            Brush_BG = Hud.Render.CreateBrush(240, 255, 255, 255, 0);
 
            preSkill = new DAV_KeyAnime("", AnimSnoEnum._p7_cos_pet_azmodan_walk);
            thisActor = new DAV_KeyActor("", ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm);
 
            // Thanks to user evan6944's works
           
         /*    // 阿格尼多克斯
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Agnidox", AnimSnoEnum._demonflyer_mega_firebreath_01), new DAV_BossSkill("Agnidox", "火焰吐息", 1f, 7, "", "噴吐火焰，對 π/6 角度、 30 碼範圍內的玩家造成 4 次火焰傷害，並附加擊退。\n僅當玩家在15碼範圍內時使用\n可觸發4次荊棘傷害，100%觸發係數"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Agnidox", "火焰印記", 1f, 8, "", "釋放火焰符文陣，符文爆破對 10 碼範圍內的玩家造成火焰傷害（可觸發荊棘傷害）；然後符文地面對範圍內的玩家造成每秒火焰傷害，持續 4 秒（不觸發荊棘傷害）"));// tiered CDs, 9s at lower HP; needs further testing
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Agnidox", "火焰飛彈", 1f, 4, "", "凝聚橙紅色光斑，然後發射 3 枚火球，造成火焰傷害\n發射方向始終瞄準目標\n無法打斷"));
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._grenadier_proj_mortar_inpact), new DAV_BossSkill("Agnidox", "轟炮", 1f, 3));
            //火焰新星缺少動畫和Actor
 
            // 疫王
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_middle), new DAV_BossSkill("Blighter", "瘟疫風暴", 0.5f, 10, "適合觸發克利斯賓", "每個瘟疫池可觸發5次荊棘傷害，100%觸發係數"));
            //Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_in), new DAV_BossSkill("Blighter", "瘟疫之手", 1f, 5));
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_generic_cast), new DAV_BossSkill("Blighter", "劇毒飛彈", 1f, 5));
           
            // 血腸
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_taunt), new DAV_BossSkill("Bloodmaw", "躍擊+地震", 1f, 21, "適合觸發克利斯賓", "雙刃抬起，然後連續跳躍 3~5 次\n以棕黃色圓形標識著陸位置，對 14 碼範圍內的玩家造成物理傷害，並附加擊退\n > 落地 1.5 秒後產生地震，對 14 碼範圍內的玩家造成 4 次物理傷害\n每個地震可觸發4次荊棘傷害，100%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_b_attack_06_in), new DAV_BossSkill("Bloodmaw", "躍擊", 1f, 5, "可控制打斷", "跳躍攻擊，以棕黃色圓形標識著陸位置\n對 14 碼範圍內的玩家造成物理傷害，並附加昏迷"));
 
            // 白骨術士
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bone Warlock", AnimSnoEnum._skeletonsummoner_attack_01), new DAV_BossSkill("Bone Warlock", "奧術球", 1f, 2, "適合觸發克利斯賓")); //%thorns?
 
            // 急凍魔
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_firebreath_combo_01), new DAV_BossSkill("Cold Snap", "冰霜新星", 1f, 16, "", "釋放冰霜爆炸，對 60 碼範圍內的玩家造成冰霜傷害，附加冰凍\n必中，無法打斷。\n可觸發1次荊棘傷害，100%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_charge_01), new DAV_BossSkill("Cold Snap", "衝鋒", 1f, 6, "", "直線猛衝，對 10 碼範圍內的玩家造成物理傷害，並附加擊退。"));
            var tmpskill = new DAV_KeyActor("Cold Snap", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster);
            BossActor_List.Add(tmpskill, new DAV_BossSkill("Cold Snap", "冰脈", 0.75f, 10));
            BossActor_List[tmpskill].AddSecendCD(0.5f, 7);
            BossActor_List.Add(new DAV_KeyActor("Cold Snap", ActorSnoEnum._monsteraffix_frozen_iceclusters), new DAV_BossSkill("Cold Snap", "冰凍", 0.5f, 4, "", "釋放 6 個冰凍晶體，類似精英怪物的冰凍詞綴，但旋轉階段不會造成傷害。\n不觸發荊棘傷害"));
 
            // 聖教君王
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_whirlwind_start), new DAV_BossSkill("Crusader King", "旋風斬", 1f, 20, "適合觸發克利斯賓", "右手舉起釘錘並嘲笑，然後雙手揮舞釘錘，橫掃 4 次\n第 1 次對 15 碼範圍內的玩家造成物理傷害，並附加擊退\n第 2 ~ 4 次各對 15 碼範圍內的玩家造成物理傷害\n每次揮舞可觸發1次荊棘傷害，100%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_teleport), new DAV_BossSkill("Crusader King", "傳送", 1f, 9, "可控制打斷", ""));
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_cast_summon), new DAV_BossSkill("Crusader King", "召喚", 1f, 15, "可控制打斷，上限14", "上限為14個（2波）"));
 
            // 灰燼
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_attack_aoe_01), new DAV_BossSkill("Ember", "隕石術", 1f, 4, "", "雙手高抬，然後落下，以紅色圓形標識區域，釋放隕石撞擊（可觸發荊棘傷害）\n對 18 碼範圍內的玩家造成火焰傷害，並燒熔地面，持續造成 4 次火焰傷害（不觸發荊棘傷害）")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_generic_cast), new DAV_BossSkill("Ember", "召喚", 0.95f, 2, "上限5", "自爆狂 (95%),\n墮落薩滿 (60%),\n薩滿上限5個")); // change by DAV 1f to 0.95f > ty ^.^
 
            // 厄雷松
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._angel_corrupt_attack_dash_in), new DAV_BossSkill("Erethon", "衝撞", 1f, 2,"", "直線衝刺，對 7 碼範圍內的玩家造成物理傷害。並附加擊退\n衝刺起點到目標位置的位移小於 20 碼時，衝撞位移為 10 碼\n衝刺起點到目標位置的位移大於 20 碼時，衝撞位移為 30 碼")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._x1_lr_boss_angel_corrupt_a_cast_01), new DAV_BossSkill("Erethon", "劇毒飛彈", 1f, 3,"", "凝聚綠色光斑，然後發射 3 枚毒球，造成毒素傷害\n發射方向始終瞄準目標\n無法打斷"));  //%thorns?
 
            // 艾斯坎迪爾
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_cast), new DAV_BossSkill("Eskandiel", "靈魂波浪", 1f, 3,"", "雙手前推，釋放青色死亡浪潮，對 40 碼距離內的玩家造成冰霜傷害，並附加擊退和 50% 減速，持續 5 秒")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_attack_02), new DAV_BossSkill("Eskandiel", "靈魂抽取", 1f, 11, "", "右手前伸，以青色光弧收割目標靈魂，造成冰霜傷害，並附加拉\n只有目標不在近戰範圍內時使用。"));
 
            //哈默林
            // Hamelin
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Hamelin", ActorSnoEnum._p4_ratking_thunderdome_proxyactor), new DAV_BossSkill("Hamelin", "限制罩", 1f, 12, "", "雙手伸出並吼叫，釋放限制罩，阻止玩家和怪物通行，自身和鼠群可以通過\n虛幻長靴，毀傷之御，靈魂行走，鋼鐵之膚-疾行之膚，希望律法-天使之翼可使玩家穿過限制罩移動\n半徑：35 碼，持續時間：10 秒"));
            // headbutt has no unique animation
 
            // 煉獄侍女
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_04_aoe), new DAV_BossSkill("Infernal Maiden", "猛擊", 1f, 14, "", "雙手高舉鐮刀，然後落下猛擊，對 20 碼範圍內的玩家造成 2 次物理傷害，並附加擊退\n可觸發2次荊棘傷害，100%觸發係數"));
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_360_01), new DAV_BossSkill("Infernal Maiden", "旋風斬", 1f, 9, "", "原地旋轉攻擊，對 11 碼範圍內的玩家造成 4 次物理傷害，持續 2 秒\n70%以下血量時附加轟炮\n可觸發4次荊棘傷害，50%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_flip_01), new DAV_BossSkill("Infernal Maiden", "火焰螺旋", 0.4f, 25, "", "左手前伸，右手旋轉鐮刀，然後跳起\n落地並釋放火焰螺旋，發射 8 枚火球，以螺線擴散，造成火焰傷害\n投射物穿透目標\n旋轉鐮刀後、跳起前可以打斷。"));
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_temp_cast_01), new DAV_BossSkill("Infernal Maiden", "傳送", 1f, 7));
 
            // 狂屠
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_charge_01_in), new DAV_BossSkill("Man Carver", "怒吼衝鋒", 1f, 12,"" , "怒吼警告，對 16 碼範圍內的玩家造成物理傷害並附加擊退\n2 秒後沿標識的 50 碼直線衝鋒，對 10 碼範圍內的玩家造成物理傷害，並附加擊退\n撞擊到障礙物後停止，自身昏迷 3 秒")); //%thorns?
            BossActor_List.Add(new DAV_KeyActor("Man Carver", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Man Carver", "火焰印記", 1f, 12, "", "釋放火焰符文陣，符文爆破對 10 碼範圍內的玩家造成火焰傷害（可觸發1次荊棘傷害）\n然後符文地面對範圍內的玩家造成最大每秒火焰傷害（不可觸發荊棘傷害），持續 15 秒")); //%thorns?
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_fanofchains), new DAV_BossSkill("Man Carver", "上古之矛", 0.75f, 10, "", "只有目標不在近戰範圍內時使用\n從左手鉤鐮擲出 10 根長矛穿透攻擊，對 60 碼範圍內的玩家造成物理傷害")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_05_telegraph), new DAV_BossSkill("Man Carver", "狠砸", 1f, 8,"", "原地跺腳，然後右手切肉斧攻擊\n對 5π/18 角度、 25 碼範圍內的玩家造成物理傷害，並附加擊退"));
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_chain_01_in), new DAV_BossSkill("Man Carver", "鉤叉+猛砸", 0.5f, 5, "", "只有目標不在近戰範圍內時使用\n右手切肉斧指向目標，然後擲出左手鉤鐮，對直線上的目標造成物理傷害，將其拉回身邊並附加昏迷，然後右手切肉斧猛砸攻擊，對 π/3 角度、 30 碼範圍內的玩家造成物理傷害"));
 
            // 奧拉什
            // needs work: skills on cooldowns in a difficult pattern
 
            // 絕滅
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_energyblast), new DAV_BossSkill("Perdition", "劈斬", 1f, 1, "", "近戰劈斬，動畫有雙持劍刃同時攻擊和右手劍刃單獨攻擊2種\n對 17π/9 角度、 16 碼範圍內的玩家造成物理傷害> 可觸發1次荊棘傷害，100%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_teleport_full), new DAV_BossSkill("Perdition", "傳送劈斬", 1f, 8, "可控制打斷", "雙劍豎直，緩慢抬起，然後閃現到目標位置劈斬\n對 12 碼範圍內的玩家造成物理傷害\n傳送位置追蹤瞄準目標，絕滅亦可以使用此技能以瞬移遠離玩家\n > 可觸發1次荊棘傷害，100%觸發係數"));
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_spellcast), new DAV_BossSkill("Perdition", "劍刃齊射", 1f, 11, "", "雙劍交叉，身體懸空，然後發射 12 枚投射物，造成物理傷害\n > 僅當玩家超過5碼時使用\n可觸發1次荊棘傷害，33%觸發係數"));
 
            // 佩倫迪
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._x1_lr_boss_malletdemon_fallingrocks), new DAV_BossSkill("Perendi", "崩塌", 1f, 5, "適合觸發克利斯賓", "以棕黃色圓形標識，2 秒後釋放落石，對 20 碼範圍內的玩家造成 3 次物理傷害\n只有在有足夠的空間時才使用\n可觸發3次荊棘傷害，25%觸發係數"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._coreelitedemon_b_lr_boss), new DAV_BossSkill("Perendi", "召喚：碎石魔", 1f, 5, "", "碎石魔落地時會造成物理傷害並附加擊退\n每次釋放召喚 1 只，最大同時召喚 9 只\n達到上限依然繼續召喚，並且最早召喚的自動死亡")); // needs work: more frequent on enrage?
 
            // 雷茲爾
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_firebomb_01), new DAV_BossSkill("Raiziel", "閃電球", 1f, 2.5, "適合觸發克利斯賓", "投擲閃電球，轟擊目標區域 12 次\n每次衝擊對落點 6 碼範圍內的玩家造成閃電傷害，還會產生一道閃電箭\n閃電箭穿透目標，對路徑上的玩家造成閃電傷害\n僅當玩家超過5碼時使用")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_temp_cast_01), new DAV_BossSkill("Raiziel", "神聖新星", 0.75f, 8, "", "75%血量以下時扇形發射 7 枚神聖箭\n25%以下血量時圓形發射 13 枚神聖箭"));
 
            // 凝霜
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_10foot), new DAV_BossSkill("Rime", "霜池", 1f, 6, "", "雙手抬起，以藍白色圓形標識，以 0.15 秒的間隔連續釋放 4 ~ 6 個小型冰霜爆破\n0.5 秒後冰霜爆炸對 10 碼範圍內的玩家造成冰霜傷害（可觸發荊棘傷害）\n然後冰霜衝擊對範圍內的玩家造成每秒冰霜傷害，持續 3 秒（不觸發荊棘傷害）。\n雙手抬起時、藍白色圓形標識出現前可以打斷。\n多個冰霜爆破的傷害疊加（暴雪宣稱不會疊加）\n有時會連續釋放 2 次。"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_20foot), new DAV_BossSkill("Rime", "霜環", 1f, 6, "", "雙手抬起，以藍白色圓形標識，釋放 1 個大型冰霜爆破\n1.5 秒後冰霜爆炸對 20 碼範圍內的玩家造成冰霜傷害（可觸發荊棘傷害）\n然後冰霜衝擊對範圍內的玩家造成每秒冰霜傷害，持續 2.5 秒（不觸發荊棘傷害）。\n雙手抬起時、藍白色圓形標識出現前可以打斷。\n受到近戰攻擊時釋放。"));
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_projectile_cold), new DAV_BossSkill("Rime", "冰霜飛彈", 1f, 6, "", "凝聚藍白色光斑，然後發射 3 枚冰球，造成冰霜傷害。\n發射方向始終瞄準目標\n無法打斷。"));
 
            // 塑沙者
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_direct_cast_04), new DAV_BossSkill("Sand Shaper", "灼熱巨岩", 1f, 2.5,"", "右手前推，發射熔融巨岩，對 6 碼範圍內的玩家造成火焰傷害")); //%thorns?
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_aoe_01), new DAV_BossSkill("Sand Shaper", "崩塌", 0.65f, 9, "適合觸發克利斯賓", "左手伸向天空，然後釋放落石，對 20 碼範圍內的玩家造成 3 次物理傷害\n可觸發3次荊棘傷害，25%觸發係數")); // change by DAV 75% HP to 65% HP @DAV Cave In is locked after 40%, can you code this in? //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_taunt_01), new DAV_BossSkill("Sand Shaper", "嘲諷", 1f, 8));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_05_fadeout), new DAV_BossSkill("Sand Shaper", "傳送", 1f, 7));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_01), new DAV_BossSkill("Sand Shaper", "能量旋風", 0.75f, 4.5, "", "左手抬起，釋放奧術氣旋，每 0.25 秒對 5 碼範圍內的玩家造成奧術傷害，持續 30 秒"));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_04), new DAV_BossSkill("Sand Shaper", "時間延緩", 0.65f, 12, "", "右手揮舞，釋放扭曲時空的減速罩，令 15 碼範圍內的玩家移動速度降低 50%，投射物速度降低 50%，持續 16 秒"));
 
            // 薩克崔斯
            // Normal Skills
            //BossActor_List.Add(new DAV_KeyActor("Saxtris", ActorSnoEnum._zoltunkulle_energytwister), new DAV_BossSkill("Saxtris", "能量旋風", 1f, 6, "", "持續30秒"));
            BossSkill_List.Add(new DAV_KeyAnime("Saxtris", AnimSnoEnum._snakeman_melee_generic_cast_01), new DAV_BossSkill("Saxtris", "召喚", 0.75f, 1, "上限15", "75%血量以下解鎖飛翼幼蟲\n > 50%血量以下解鎖蛇仔\n每次釋放召喚 10 只，最大同時召喚 15 只"));
 
            // 岩石詠唱者
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonster_temp_rock_throw), new DAV_BossSkill("Stonesinger", "重擊", 1f, 2,"", "近戰打擊，動畫左右手連續揮動\n > 對 4 碼範圍內的玩家造成 2 次物理傷害\n可觸發2次荊棘傷害，50%觸發係數")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonsterblack_attack_03_sandwall), new DAV_BossSkill("Stonesinger", "召喚：裂隙", 1f, 7, "上限6", "雙手觸地，召喚裂隙，裂隙可以釋放轟炮\n > 最多同時召喚 6 個"));
 
            // 特斯瑞斯
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_adria_geyser), new DAV_BossSkill("Tethrys", "火焰風暴", 0.6f, 9, "適合觸發克利斯賓", "雙手前伸，釋放 4 個火焰風暴陣，2 秒後啟動\n火焰爆破對 6 碼範圍內的玩家造成火焰傷害\n然後風暴陣地面對並範圍內的玩家造成最大每秒 3 倍火焰傷害，持續 2.5 秒")); //%thorns?
            // Normal Skills
            //BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Tethrys", "火焰飛彈", 1f, 3));  // Unpredictable; needs further testing
            BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._succubus_bloodstar_projectile), new DAV_BossSkill("Tethrys", "血之星", 1f, 9, "", "雙手前伸，發射血之星，對擊中 3 碼範圍內的玩家造成物理傷害\n並附加血光詛咒，降低 35% 護甲，持續 5 秒。\n血之星會追蹤玩家")); // Unpredictable; needs further testing
 
            // 纏絲女魔
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_poison), new DAV_BossSkill("The Binder", "苦痛刺針", 0.65f, 3, "", "口部發出黃色亮光，然後發射 6 ~ 8 根黃色毒針，造成毒素傷害，可穿透")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_summon_webpatch), new DAV_BossSkill("The Binder", "蛛網", 1f, 8, "", "噴吐蛛網，令 10 碼範圍內玩家的移動速度降低 50%，持續 30 秒"));
 
            // 掐脖者
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_taunt_01), new DAV_BossSkill("The Choker", "劇毒爆破", 0.75f, 19, "適合觸發克利斯賓", "身體後仰並吼叫，然後雙手抬起，以綠色圓形標識\n釋放 1 個大型劇毒爆破，1.5 秒後爆炸對 20 碼範圍內的玩家造成毒素傷害\n然後再度雙手抬起，以綠色圓形標識，以 0.01 秒的間隔連續釋放 18 ~ 22 個小型劇毒爆破\n1 秒後爆炸對 10 碼範圍內的玩家造成毒素傷害，然後劇毒衝擊對範圍內的玩家造成每秒毒素傷害，持續 2 秒。多個爆破的傷害疊加。\n雙手抬起時、綠色圓形標識出現前可以打斷。大小爆破需要分別打斷")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_generic_cast), new DAV_BossSkill("The Choker", "召喚：軟泥怪", 1f, 4, "上限10", "每次釋放召喚 2 ~ 3 只，最大同時召喚 10 只"));
 
            // 威塞留斯
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_cast_02), new DAV_BossSkill("Vesalius", "冰霜飛彈", 1f, 1, "可控制打斷", "右手凝聚青色光暈，然後左手發射 4 枚冰彈，造成冰霜傷害。\n發射方向始終瞄準目標")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_teleport_start_02), new DAV_BossSkill("Vesalius", "傳送", 1f, 12, "可控制打斷", "雙手觸地，潛入一側蟲洞，1.5 秒後從另一側蟲洞鑽出。"));
            BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster), new DAV_BossSkill("Vesalius", "冰脈", 1f, 6, "", "生命值越低，釋放頻率越高"));
            BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_teleportmines), new DAV_BossSkill("Vesalius", "蟲洞", 1f, 9, "", "生命值越低，釋放頻率越高"));
 
            // 貪食魔
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_areaeffect), new DAV_BossSkill("Voracity", "毒雲", 1f, 11, "", "搖擺身體，在自身和目標位置各製造一團毒雲，對 19 碼範圍內的玩家造成最大每秒 3 倍毒素傷害，持續 75 秒\n玩家在毒雲中每停留 0.5 秒，持續傷害便會堆疊 1 層，5 秒後達到最大 10 層\n多團毒雲會同時疊加傷害層數，但最大傷害層數不會疊加\n在骷髏進入毒雲之前控制觸發克利斯賓\n每次進入毒雲時可觸發1次荊棘傷害，20%觸發係數"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_sneeze), new DAV_BossSkill("Voracity", "噴吐", 0.4f, 4, "", "身體前傾，噴吐毒物，並污染地面，對 5 碼範圍內的玩家造成毒素傷害，持續 2 秒\n可觸發3次荊棘傷害，33%觸發係數"));
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_ranged_01), new DAV_BossSkill("Voracity", "召喚：強酸黏液", 0.65f, 6, "上限4", "每次釋放召喚 2 只，最大同時召喚 4 只"));
            */
          // Agnidox
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Agnidox", AnimSnoEnum._demonflyer_mega_firebreath_01), new DAV_BossSkill("Agnidox", "Flame Breath", 1f, 7, "", "> Only used when a player is within 15 yards\n> Procs 4 ticks of thorns @ 100%/tick)"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Agnidox", "Mark of Fire", 1f, 12, "", "> 10-yard radius, lasts 5s"));// tiered CDs, 9s at lower HP; needs further testing
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Agnidox", "Fire Ball", 1f, 4, "", ""));
            BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._grenadier_proj_mortar_inpact), new DAV_BossSkill("Agnidox", "Mortar", 1f, 3, "", ""));
            //Fire Nova lacks animation and actor
 
            // Blighter
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_in), new DAV_BossSkill("Blighter", "Plagued Line", 1f, 5));
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_generic_cast), new DAV_BossSkill("Blighter", "Poison Nova", 1f, 5));
            BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_middle), new DAV_BossSkill("Blighter", "Plague Storm", 0.5f, 10));
 
            // Bloodmaw
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_taunt), new DAV_BossSkill("Bloodmaw", "Leap", 1f, 21, "Stun for Krysbins", "> Procs 5 ticks of thorns per pool @ 100%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_b_attack_06_in), new DAV_BossSkill("Bloodmaw", "Leaping Strike", 1f, 5));
 
            // Bone Warlock
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Bone Warlock", AnimSnoEnum._skeletonsummoner_attack_01), new DAV_BossSkill("Bone Warlock", "Arcane Bolt", 1f, 2, "Stun for Krysbins")); //%thorns?
 
            // Cold Snap
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_firebreath_combo_01), new DAV_BossSkill("Cold Snap", "Frozen Nova", 1f, 16, "", "> Procs 1 tick of thorns @ 100%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_charge_01), new DAV_BossSkill("Cold Snap", "Charge", 1f, 6, "", "> Only used when players are beyond 15 yards"));
            var tmpskill = new DAV_KeyActor("Cold Snap", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster);
            BossActor_List.Add(tmpskill, new DAV_BossSkill("Cold Snap", "Frozen Pulse", 0.75f, 10, "", "> Unlocks at 75% HP"));
            BossActor_List[tmpskill].AddSecendCD(0.5f, 7);
            BossActor_List.Add(new DAV_KeyActor("Cold Snap", ActorSnoEnum._monsteraffix_frozen_iceclusters), new DAV_BossSkill("Cold Snap", "Frozen Storm", 0.5f, 8, "> Unlocks at 50% HP", "> Insignificant thorns effect against this skill"));
 
            // Crusader King
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_whirlwind_start), new DAV_BossSkill("Crusader King", "Triple Swing", 1f, 20, "Stun for Krysbins", "> Swings 4 times\n> Procs 1 tick of thorns per swing, @ 100%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_teleport), new DAV_BossSkill("Crusader King", "Teleport", 1f, 9, "Stun to interrupt", ""));
            BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_cast_summon), new DAV_BossSkill("Crusader King", "Summonning", 1f, 15, "Stun to interrupt", "> Caps at 14 (2 waves)"));
 
            // Ember
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_attack_aoe_01), new DAV_BossSkill("Ember", "Meteor", 1f, 5, "Stun for Krysbins")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_generic_cast), new DAV_BossSkill("Ember", "Summoning", 0.95f, 4, "","> Fallen Lunatics (95%),\n> Fallen Shaman (60%),\n> Caps at 5 shamans")); // change by DAV 1f to 0.95f > ty ^.^
 
            // Erethon
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._angel_corrupt_attack_dash_in), new DAV_BossSkill("Erethon", "Dash", 1f, 8,"", "> Short Dash triggered when any player is beyond 5 yards\n> Long Dash triggered when any player is beyond 15 yards")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._x1_lr_boss_angel_corrupt_a_cast_01), new DAV_BossSkill("Erethon", "Poison Blast", 1f, 3));  //%thorns?
 
            // Eskandiel
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_cast), new DAV_BossSkill("Eskandiel", "Repulsion Wave", 1f, 3)); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_attack_02), new DAV_BossSkill("Eskandiel", "Vortex", 1f, 11, "", "Only used when players are beyond 25 yards"));
            BossActor_List.Add(new DAV_KeyActor("Eskandiel", ActorSnoEnum._arcaneenchanteddummy_spawn), new DAV_BossSkill("Eskandiel", "Arcane", 1f, 4, "", ""));
 
            // Hamelin
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Hamelin", ActorSnoEnum._p4_ratking_thunderdome_proxyactor), new DAV_BossSkill("Hamelin", "Plagued Arena", 1f, 12, "", "Lasts for 10s"));
            // headbutt has no unique animation
 
            // Infernal Maiden
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_04_aoe), new DAV_BossSkill("Infernal Maiden", "Overhead Smash", 1f, 14, "", "> Procs 2 tick of thorns @ 100%/tick"));
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_360_01), new DAV_BossSkill("Infernal Maiden", "Spinning Attack", 1f, 11, "", "> Procs 4 tick of thorns @ 50%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_flip_01), new DAV_BossSkill("Infernal Maiden", "Fire Nova", 0.45f, 25, "", "> Unlocks at 45% HP\n> Insignificant thorns effect against this skill"));
            BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_temp_cast_01), new DAV_BossSkill("Infernal Maiden", "Teleport", 1f, 7));
 
            // Man Carver
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_charge_01_in), new DAV_BossSkill("Man Carver", "Charge", 1f, 19)); //%thorns?
            BossActor_List.Add(new DAV_KeyActor("Man Carver", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Man Carver", "Mark of Fire", 1f, 12, "", "> 10-yard radius, lasts 15s")); //%thorns?
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_fanofchains), new DAV_BossSkill("Man Carver", "Fan of Spears", 0.75f, 12, "", "> Unlocks at 75% HP")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_05_telegraph), new DAV_BossSkill("Man Carver", "Heavy Smash", 1f, 11));
            BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_chain_01_in), new DAV_BossSkill("Man Carver", "Sickle Grab", 0.5f, 12, "", "> Unlocks at 50% HP"));
 
            // Orlash
            // needs work: skills on cooldowns in a difficult pattern
 
            // Perdition
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_energyblast), new DAV_BossSkill("Perdition", "Blade Cleave", 1f, 1, "", "> Procs 1 tick of thorns @ 100%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_teleport_full), new DAV_BossSkill("Perdition", "Blink Strike", 1f, 11, "Stun to interrupt", "> Procs 1 tick of thorns @ 100%/tick"));
            BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_spellcast), new DAV_BossSkill("Perdition", "Volley", 1f, 11, "", "> Only used when players are beyond 5 yards\n> Procs 1 tick of thorns @ 33%/tick"));
 
            // Perendi
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._x1_lr_boss_malletdemon_fallingrocks), new DAV_BossSkill("Perendi", "Cave In", 1f, 5, "Stun for Krysbins", "> Only used when there is enough space\n> Procs 3 ticks of thorns @ 25%/tick)"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._coreelitedemon_b_lr_boss), new DAV_BossSkill("Perendi", "Summoning", 1f, 6)); // needs work: more frequent on enrage?
 
            // Raiziel
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_firebomb_01), new DAV_BossSkill("Raiziel", "Lightning Orb", 1f, 3, "Stun for Krysbins", "> Only used when players are beyond 5 yards")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_temp_cast_01), new DAV_BossSkill("Raiziel", "Holy Bolt Nova", 0.75f, 8, "", "> Volley of 7 holy dmg bolts (wide arc) when below 75% HP\n> Volley of 13 holy dmg bolts (360) when below 25% HP"));
 
            // Rime
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_10foot), new DAV_BossSkill("Rime", "Frost Pools", 1f, 6, "", "> Procs 1 tick of thorns @ 100%/tick"));
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_20foot), new DAV_BossSkill("Rime", "Frost Ring", 1f, 6, "", "> Procs 1 tick of thorns @ 100%/tick"));
            BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_projectile_cold), new DAV_BossSkill("Rime", "Volley", 1f, 6, "", ""));
 
            // Sand Shaper
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_direct_cast_04), new DAV_BossSkill("Sand Shaper", "Fire Ball", 1f, 3)); //%thorns?
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_aoe_01), new DAV_BossSkill("Sand Shaper", "Cave In", 0.65f, 9, "Stun for Krysbins", "> Unlocks at 65% HP, unavailable after 40% HP")); // change by DAV 75% HP to 65% HP @DAV Cave In is locked after 40%, can you code this in? //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_taunt_01), new DAV_BossSkill("Sand Shaper", "Taunt", 1f, 8));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_05_fadeout), new DAV_BossSkill("Sand Shaper", "Teleport", 1f, 7));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_01), new DAV_BossSkill("Sand Shaper", "Twister", 0.75f, 5, "", "> Unlocks at 75% HP"));
            BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_04), new DAV_BossSkill("Sand Shaper", "Slow Time", 0.65f, 13, "", "> Unlocks at 65% HP"));
 
            // Saxtris
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Saxtris", ActorSnoEnum._zoltunkulle_energytwister), new DAV_BossSkill("Saxtris", "Twister", 1f, 8, "", "> Lasts 30s"));
            BossSkill_List.Add(new DAV_KeyAnime("Saxtris", AnimSnoEnum._snakeman_melee_generic_cast_01), new DAV_BossSkill("Saxtris", "Summoning", 0.75f, 1, "", "> Winged Larvae unlocks at 75% HP\n > Snakechild unlocks at 50% HP\n> Caps at two full sets"));
 
            // StoneSinger
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonster_temp_rock_throw), new DAV_BossSkill("Stonesinger", "Shovel", 1f, 2)); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonsterblack_attack_03_sandwall), new DAV_BossSkill("Stonesinger", "Summoning", 1f, 7));
 
            // Tethrys
            // Good Skills
            BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_adria_geyser), new DAV_BossSkill("Tethrys", "Geyser", 0.6f, 9, "Stun for Krysbins", "> Unlocks at 60% HP\n> 4 pools")); //%thorns?
            // Normal Skills
            BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Tethrys", "Fire Ball", 1f, 3));  // Unpredictable; needs further testing
            BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._succubus_bloodstar_projectile), new DAV_BossSkill("Tethrys", "Blood Star", 1f, 9)); // Unpredictable; needs further testing
 
            // The Binder
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_poison), new DAV_BossSkill("The Binder", "Poison Spit", 0.65f, 3, "", "> Unlocks at 65% HP")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_summon_webpatch), new DAV_BossSkill("The Binder", "Net Toss", 1f, 8, "", "> Insignificant thorns effect against this skill"));
 
            // The Choker
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_taunt_01), new DAV_BossSkill("The Choker", "Plagued Circle", 0.75f, 19, "Stun for Krysbins", "> Unlocks at 75% HP")); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_generic_cast), new DAV_BossSkill("The Choker", "Summoning", 1f, 4, "", "> Slimes (100%),\n> Caps at 10"));
 
            // Vesalius
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_cast_02), new DAV_BossSkill("Vesalius", "Energy Barrage", 1f, 1)); //%thorns?
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_teleport_start_02), new DAV_BossSkill("Vesalius", "Gateway", 1f, 12, "Stun to interrupt"));
            BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster), new DAV_BossSkill("Vesalius", "Frozen Pulse", 1f, 6, "", ""));
            BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_teleportmines), new DAV_BossSkill("Vesalius", "Wormhole", 1f, 9, "", ""));
 
            // Voracity
            // Good Skills
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_areaeffect), new DAV_BossSkill("Voracity", "Fart Cloud", 1f, 11, "", "> Stun just before Skeletons enter Fart Cloud for Krysbins\n> Procs 1 tick of thorns per Cloud, per entry @ 20%/tick"));
            // Normal Skills
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_sneeze), new DAV_BossSkill("Voracity", "Vile Spew", 0.4f, 4, "", "> Unlocks at 40% HP\n> Procs 1 tick of thorns @ 33%/tick"));
            BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_ranged_01), new DAV_BossSkill("Voracity", "Summoning", 0.65f, 6, "", "> Acid Slime (65%),\ncaps at 4"));
            
        }
 
        public void PaintWorld(WorldLayer layer) {
            if (Hud.Game.SpecialArea != SpecialArea.GreaterRift) return ;
            if (Hud.Game.RiftPercentage < 100) return;
 
            float bosslife = 1f;
            var bosses = Hud.Game.AliveMonsters.Where(m => m.Rarity == ActorRarity.Boss && m.SummonerAcdDynamicId == 0);
            foreach(IMonster m in bosses) {
                if (!BossFlight) {
                    BossFlight = true;
                    BossSkill_This.Clear();
                    BossActor_This.Clear();
                    preSkill.BossAnime = AnimSnoEnum._p7_cos_pet_azmodan_walk;
                    thisActor.BossActor = ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm;
 
                    preSkill.Name = m.SnoMonster.NameEnglish;
                    thisActor.Name = m.SnoMonster.NameEnglish;
                    var curTime = Hud.Game.CurrentGameTick / 60d;
                    foreach(KeyValuePair<DAV_KeyAnime, DAV_BossSkill> BossSkill in BossSkill_List)
                        if(BossSkill.Value.Name == m.SnoMonster.NameEnglish)
                            BossSkill_This.Add(BossSkill.Key.BossAnime, curTime - BossSkill.Value.CooldownTime);
 
                    foreach(KeyValuePair<DAV_KeyActor, DAV_BossSkill> BossActor in BossActor_List)
                        if(BossActor.Value.Name == m.SnoMonster.NameEnglish)
                            BossActor_This.Add(BossActor.Key.BossActor, curTime - BossActor.Value.CooldownTime);
                }
                bosslife = (float) (m.CurHealth / m.MaxHealth);
                if (bosslife < 0 || bosslife > 1)
                    bosslife = 1;
 
                if (m.Animation == preSkill.BossAnime) continue;
 
                preSkill.BossAnime = m.Animation;
                if (!BossSkill_List.ContainsKey(preSkill)) continue;
 
                var cTime = Hud.Game.CurrentGameTick / 60d;
                if (showDebug) {
                    var tmplist = BossSkill_List[preSkill];
                    var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime;
                    BossSkill_List[preSkill].CooldownDebug = cTime - BossSkill_This[preSkill.BossAnime] - curCD;
                }
                BossSkill_This[preSkill.BossAnime] = cTime;
            }
 
            if (!BossFlight) return;
 
            var yref = YPos;
            if (BossSkill_This.Count > 0) {
                var tmpanime = new DAV_KeyAnime(preSkill.Name, AnimSnoEnum._p7_cos_pet_azmodan_walk);
                foreach(KeyValuePair<AnimSnoEnum, double> BossCD in BossSkill_This) {
                    tmpanime.BossAnime = BossCD.Key;
                    BossSkillPaint(BossSkill_List[tmpanime], BossCD.Value, bosslife, ref yref);
                }
            }
 
            if (BossActor_This.Count == 0) return;
            var bossActor = Hud.Game.Actors.Where(a => a.LastSpeak == null && BossActor_This.ContainsKey(a.SnoActor.Sno));
            foreach (var actor in bossActor) {
                var cTime = Hud.Game.CurrentGameTick / 60d;
                thisActor.BossActor = actor.SnoActor.Sno;
                if (showDebug) {
                    var tmplist = BossActor_List[thisActor];
                    var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime;
                    BossActor_List[thisActor].CooldownDebug = cTime - BossActor_This[actor.SnoActor.Sno] - curCD;
                }
                actor.LastSpeak = Hud.Time.CreateWatch();
                BossActor_This[actor.SnoActor.Sno] = cTime;
            }
 
            var tmpactor = new DAV_KeyActor(thisActor.Name, ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm);
            foreach(KeyValuePair<ActorSnoEnum, double> BossCD in BossActor_This) {
                tmpactor.BossActor = BossCD.Key;
                BossSkillPaint(BossActor_List[tmpactor], BossCD.Value, bosslife, ref yref);
            }
        }
 
        public void OnNewArea(bool newGame, ISnoArea area) {
            BossFlight = false;
        }
 
        public void BossSkillPaint(DAV_BossSkill skillData, double preCDvalue, float bosslife, ref float yref) {
            if (skillData == null) return;
			var text = skillData.SkillName;
            if (skillData.HintShort != "")
                text += " (" + skillData.HintShort + ")";
            var textLayout = SkillFont.GetTextLayout(text);
            SkillFont.DrawText(text, XPos, yref);
 
            var rect = new RectangleF(XPos, yref, barW, barH + textLayout.Metrics.Height * 1.2f);
            yref += textLayout.Metrics.Height * 1.2f;
 
            if (bosslife > skillData.AvailableTime) {
                Brush_NA.DrawRectangle(XPos, yref, barW, barH);
                text = "Ready at Life " + skillData.AvailableTime.ToString("0%");
            }
            else {
                var curCD = (skillData.ChangeCD && bosslife < skillData.ChangeCD_time) ? skillData.ChangeCD_valve : skillData.CooldownTime;
                var skillCD = curCD - (Hud.Game.CurrentGameTick / 60d - preCDvalue);
                if (skillCD < 0) {
                    Brush_Ready.DrawRectangle(XPos, yref, barW, barH);
                    text = "Ready to Cast";
                }
                else {
                    Brush_BG.DrawRectangle(XPos, yref, barW, barH);
                    Brush_CD.DrawRectangle(XPos, yref, (float) (barW * skillCD / curCD), barH);
                    text = skillCD.ToString(CDformat) + "s";
                }
            }
 
            textLayout = SkillFont.GetTextLayout(text);
            SkillFont.DrawText(text, XPos + 3, yref + (barH - textLayout.Metrics.Height)/2);
            if (showDebug) SkillFont.DrawText(skillData.CooldownDebug.ToString("F1") + "s | life: " + bosslife.ToString("F2"), XPos + 3 + barW, yref + (barH - textLayout.Metrics.Height)/2);
            yref += barH * 1.3f;
 
            if (skillData.HintHided != "" && Hud.Window.CursorInsideRect(rect.X, rect.Y, rect.Width, rect.Height))
                Hud.Render.SetHint(skillData.HintHided);
        }
    }
 
    public class DAV_KeyActor {
        public string Name { get; set; }
        public ActorSnoEnum BossActor { get; set; }
 
        public DAV_KeyActor(string name, ActorSnoEnum actor) {
            Name = name;
            BossActor = actor;
        }
 
        public class EqualityComparer : IEqualityComparer<DAV_KeyActor> {
            public bool Equals(DAV_KeyActor x, DAV_KeyActor y) { return x.Name == y.Name && x.BossActor == y.BossActor; }
            public int GetHashCode(DAV_KeyActor obj) {
                string combined = obj.Name + "|" + obj.BossActor.ToString();
                return combined.GetHashCode();
            }
        }
    }
 
    public class DAV_KeyAnime {
        public string Name { get; set; }
        public AnimSnoEnum BossAnime { get; set; }
 
        public DAV_KeyAnime(string name, AnimSnoEnum anime) {
            Name = name;
            BossAnime = anime;
        }
 
        public class EqualityComparer : IEqualityComparer<DAV_KeyAnime> {
            public bool Equals(DAV_KeyAnime x, DAV_KeyAnime y) { return x.Name == y.Name && x.BossAnime == y.BossAnime; }
            public int GetHashCode(DAV_KeyAnime obj) {
                string combined = obj.Name + "|" + obj.BossAnime.ToString();
                return combined.GetHashCode();
            }
        }
    }
 
    public class DAV_BossSkill {
        public string Name { get; set; }
        public string SkillName { get; set; }
        public string HintShort { get; set; }
        public string HintHided { get; set; }
        public float AvailableTime { get; set; }
        public double CooldownTime { get; set; }
        public double CooldownDebug { get; set; }
 
        public bool ChangeCD { get; set; }
        public float ChangeCD_time { get; set; }
        public double ChangeCD_valve { get; set; }
 
        public DAV_BossSkill(string name, string skill, float life, double CD, string Desc = "", string hideMsg = "") {
            Name = name;
            SkillName = skill;
            HintShort = Desc;
            HintHided = hideMsg;
            AvailableTime = life;
            CooldownTime = CD;
            CooldownDebug = 0d;
            ChangeCD = false;
        }
 
        public void AddSecendCD(float life, double CD) {
            ChangeCD = true;
            ChangeCD_time = life;
            ChangeCD_valve = CD;
        }
    }
}