// Generate By EToy
// Don't Edit It!!

using XGame.Framework.Database;
using XGame.Framework.Serialization;

namespace XGame.Database
{
    /// <summary> Skill </summary>
    public sealed class SkillTable : ITable
    {
        long ITable.Key => Id;

        /// <summary> id职业技能：职业ID*10+序号飞剑技能:飞剑ID*10+序号怪物技能：怪物ID*10+序号通用技能：200000+技能品质*100+序号家族技能：300000+技能品质*100+序号车位技能：400000+技能品质*100+序号 </summary>
        public int Id { get; private set; }

        /// <summary> 品质0：无品质1：白2：绿3：蓝4：紫5：黄6：橙7：红8：粉 </summary>
        public int Quality { get; private set; }

        /// <summary> 技能图标 </summary>
        public string Icon { get; private set; } // c

        /// <summary> 技能名称 </summary>
        public string Name { get; private set; } // c

        /// <summary> 技能描述 </summary>
        public string Desc { get; private set; } // c

        /// <summary> 元素系1：火2：雷3：冰4：毒5：风0：无元素 </summary>
        public EElementType Element { get; private set; }

        /// <summary> 技能型态1：主动技能2：被动技能 </summary>
        public int ModalityType { get; private set; } // c

        /// <summary> 技能效果类型1.永久属性类(该类型的技能不走触发)2.伤害类型3.BUFF类型4：召唤类型 </summary>
        public int EffectType { get; private set; }

        /// <summary> 技能类型0：无（永久属性类适用）1：单体2：群体3：召唤 </summary>
        public int Type { get; private set; } // c

        /// <summary> 作用对象 1：主角 2：所有飞剑 3：主角+飞剑 4：所有剑 8：所有斧 16：所有锤 32：所有法杖 64：所有匕首 512：受击者(敌方单体)1024：敌方群体2048：友方群体4096：施法者 </summary>
        public int TargetType { get; private set; } // sc

        /// <summary> 技能触发类型0：无1：常规（寻找范围内的作用目标释放技能）2：普攻时概率触发（条件类型，概率）3：普攻X次时触发（ 条件类型，次数）4：普攻暴击时触发（ 条件类型）5：释放技能时触发（ 条件类型）6：释放技能后，延迟X秒触发（ 条件类型，延迟时间）7：技能暴击时触发（ 条件类型）8：连击时触发（ 条件类型）9：连击暴击时触发（ 条件类型）10：反击时触发（ 条件类型）11：击晕时触发（ 条件类型）12：闪避时触发（ 条件类型）13：被普攻命中时触发（ 条件类型）14：被技能命中时触发（ 条件类型）15：开场时触发（ 条件类型）16：战斗开启后，每隔X秒后触发（ 条件类型，间隔时间）17：生命低于%时触发（ 条件类型，血量条件）18：生命高于%时触发（ 条件类型，血量条件）19：生命每降低%时触发（每个%只能被触发一次）（ 条件类型，血量条件）20：释放主动技能后触发直接伤害21：连击X次后触发22：反击X次后触发 </summary>
        public int[] TriggerType { get; private set; }

        /// <summary> 技能持续时间 </summary>
        public int EndureTime { get; private set; }

        /// <summary> 冷却时长 </summary>
        public int RestTime { get; private set; }

        /// <summary> 技能特效类型:0:无101:普通子弹，命中目标造成伤害102:子弹，命中后分裂103:子弹，命中后弹跳104:子弹，不需要选目标，发射目标位置随机，落地找受击目标(单体伤害)并爆炸(群体伤害)201：陷阱301：AOE（虫群特效半径为1，配置宽高需要X2，该特效不适合缩放，预制按照目标尺寸重复摆放基础特效）311：近战AOE,屏幕中心，不可移动312：以选定目标为中心的AOE,不可移动401：Buff501：召唤物 </summary>
        public int SkillVfxType { get; private set; }

        /// <summary> 技能范围，结构由skillVfxType决定104:[落地伤害半径(单体)，爆炸半径]201:[触发半径，爆炸半径]AOE:[1,宽,高] OR [2,半径,度数,伤害递减半径，伤害递减系数] </summary>
        public float[] Ranges { get; private set; }

        /// <summary> 基础伤害值 </summary>
        public int Damage { get; private set; }

        /// <summary> 102：[3(数量),60(夹角，为零则找最近的目标),5000(缩放万分比)]103：[2（弹跳次数）,2000（伤害递减万分比）]104：[爆炸伤害]AOE:[次数(-1无限直至特效结束),aoe延迟，aoe间隔，1(是否重复选中，0:false)，-1:(受击次数，-1:不限，1:1次)] </summary>
        public int[] DamageArgs { get; private set; }

        /// <summary> BUFF关联【触发概率（万分比），buff关联ID】具体ID关联BUFF表 </summary>
        public int[] BuffTie { get; private set; }

        /// <summary> 效果类型(暂时不需要)1：属性类型技能  属性ID，属性值，0/1（0：固定值，1：百分比）2：伤害类型技能  伤害数值百分比，0/1（0：普通伤害计算，1：真伤计算（直接跳过减伤和防御））3：BUFF类型  关联BUFF表ID4：召唤类型 召唤单位ID，数量 </summary>
        public int[] EffectTypeNum { get; private set; }

        /// <summary> 关联技能(暂时不需要) </summary>
        public int[] RelatedSkill { get; private set; }

        void ISerializable.Deserialize(IReader reader)
        {
            Id = reader.ReadInt();
            Quality = reader.ReadInt();
            Icon = reader.ReadString();
            Name = reader.ReadString();
            Desc = reader.ReadString();
            Element = (EElementType)reader.ReadInt();
            ModalityType = reader.ReadInt();
            EffectType = reader.ReadInt();
            Type = reader.ReadInt();
            TargetType = reader.ReadInt();
            TriggerType = reader.ReadEnumerable<int[]>();
            EndureTime = reader.ReadInt();
            RestTime = reader.ReadInt();
            SkillVfxType = reader.ReadInt();
            Ranges = reader.ReadEnumerable<float[]>();
            Damage = reader.ReadInt();
            DamageArgs = reader.ReadEnumerable<int[]>();
            BuffTie = reader.ReadEnumerable<int[]>();
            EffectTypeNum = reader.ReadEnumerable<int[]>();
            RelatedSkill = reader.ReadEnumerable<int[]>();
        }

        void ISerializable.Serialize(IWriter writer)
        {
            writer.Write(Id);
            writer.Write(Quality);
            writer.Write(Icon);
            writer.Write(Name);
            writer.Write(Desc);
            writer.Write((int)Element);
            writer.Write(ModalityType);
            writer.Write(EffectType);
            writer.Write(Type);
            writer.Write(TargetType);
            writer.Write(TriggerType);
            writer.Write(EndureTime);
            writer.Write(RestTime);
            writer.Write(SkillVfxType);
            writer.Write(Ranges);
            writer.Write(Damage);
            writer.Write(DamageArgs);
            writer.Write(BuffTie);
            writer.Write(EffectTypeNum);
            writer.Write(RelatedSkill);
        }
    }
}
