// 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; }

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

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

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

        /// <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; }

        /// <summary> 技能范围 </summary>
        public int Range { get; private set; }

        /// <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> 效果类型1：属性类型技能  属性ID，属性值，0/1（0：固定值，1：百分比）2：伤害类型技能  伤害数值百分比，0/1（0：普通伤害计算，1：真伤计算（直接跳过减伤和防御））3：BUFF类型  关联BUFF表ID4：召唤类型 召唤单位ID，召唤单位伤害，召唤单位继承的属性类型，继承比例，召唤单位继承的属性类型，继承比例，…… </summary>
        public int[] EffectTypeNum { get; private set; }

        /// <summary> 作用对象0:无1:己方 1:己方主角 2:己方所有飞剑 3:己方所有单位 4：己方单手剑同伴 5：己方双手剑同伴 6：己方单手锤同伴 7：己方双手锤同伴 8：己方单手斧同伴 9：己方双手斧同伴 10：己方匕首同伴 11：己方法杖同伴2:对方 1:对方单体目标 2:目标周围群体  需要技能伤害范围支持 3:场景内所有对方单位 </summary>
        public int[] TargetType { get; private set; }

        /// <summary> 技能特效 </summary>
        public string SkillEffect { get; private set; }

        /// <summary> 关联技能 </summary>
        public int[] RelatedSkill { get; private set; }

        /// <summary> 技能引导时长 </summary>
        public int LeadTime { get; private set; }

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

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

        /// <summary> 击中特效 </summary>
        public string HitEffect { get; private set; }

        /// <summary> 子弹特效 </summary>
        public string BulletEffect { get; private set; }

        /// <summary> [子弹数量,间隔] </summary>
        public int[] BulletArgs { get; private set; }

        void ISerializable.Deserialize(IReader reader)
        {
            Id = reader.ReadInt();
            Quality = reader.ReadInt();
            Icon = reader.ReadString();
            Name = reader.ReadString();
            Desc = reader.ReadString();
            ModalityType = reader.ReadInt();
            EffectType = reader.ReadInt();
            Type = reader.ReadInt();
            Range = reader.ReadInt();
            TriggerType = reader.ReadEnumerable<int[]>();
            EffectTypeNum = reader.ReadEnumerable<int[]>();
            TargetType = reader.ReadEnumerable<int[]>();
            SkillEffect = reader.ReadString();
            RelatedSkill = reader.ReadEnumerable<int[]>();
            LeadTime = reader.ReadInt();
            EndureTime = reader.ReadInt();
            RestTime = reader.ReadInt();
            HitEffect = reader.ReadString();
            BulletEffect = reader.ReadString();
            BulletArgs = 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(ModalityType);
            writer.Write(EffectType);
            writer.Write(Type);
            writer.Write(Range);
            writer.Write(TriggerType);
            writer.Write(EffectTypeNum);
            writer.Write(TargetType);
            writer.Write(SkillEffect);
            writer.Write(RelatedSkill);
            writer.Write(LeadTime);
            writer.Write(EndureTime);
            writer.Write(RestTime);
            writer.Write(HitEffect);
            writer.Write(BulletEffect);
            writer.Write(BulletArgs);
        }
    }
}
