namespace ET.Server
{
    /// <summary>
    /// 游戏服数据结构
    /// </summary>
    public class Struct
    {
        /// <summary>
        /// 数据结构 int_int
        /// </summary>
        public class IntIntData
        {
            public int value1 { get; set; }
            public int value2 { get; set; }

            public IntIntData(int value1, int value2)
            {
                this.value1 = value1;
                this.value2 = value2;
            }
        }

        /// <summary>
        /// 玩家技能数据
        /// </summary>
        public class SkillInfo
        {
            /** 技能id **/
            public int id { get; set; }

            /** 技能等级 **/
            public int level { get; set; }

            /** 斩妖特殊含义: 冷却时间减少,触发几率增加,持续时间增加 **/
            public int[] talentLevel = new int[3];

            /** 技能类型 **/
            public int type { get; set; }

            /** 技能到期时间戳 **/
            public long skillTime { get; set; }

            /** 技能cd变更,万分比 **/
            public int cdTime { get; set; }

            public int flag { get; set; }

            [StaticField]
            public bool autoLaunch = false;
        }

        /// <summary>
        /// 玩家技能存储数据
        /// </summary>
        public class PlayerSkillBaseData
        {
            /** 技能id **/
            public int id { get; set; }

            /** 技能等级 **/
            public int level { get; set; }

            /** 是否已解锁 */
            public bool unlock { get; set; }

            /** 技能到期时间戳 **/
            public long skillTime { get; set; }

            public PlayerSkillBaseData(int skillId, int level, bool unlock, long skillTime)
            {
                this.id = skillId;
                this.level = level;
                this.unlock = unlock;
                this.skillTime = skillTime;
            }
        }

        /// <summary>
        /// 场景数据
        /// </summary>
        public class AreaData
        {
            public MapConfig prop { get; set; }
            public int areaId { get; set; }
            public long instanceId { get; set; }
            public float targetX { get; set; }
            public float targetY { get; set; }
            public int logicServerId { get; set; }
            public ENTER_TYPE enterType = ENTER_TYPE.NONE;

            public AreaData(int areaId)
            {
                this.prop = MapConfigCategory.Instance.Get(areaId);
                this.areaId = areaId;
            }

            public AreaData(MapConfig prop)
            {
                this.areaId = prop.Id;
                this.prop = prop;
            }

            public AreaData(int areaId, long instanceId)
            {
                this.prop = MapConfigCategory.Instance.Get(areaId);
                this.areaId = areaId;
                this.instanceId = instanceId;
            }

            public AreaData(int areaId, float targetX, float targetY)
            {
                this.prop = MapConfigCategory.Instance.Get(areaId);
                this.areaId = areaId;
                this.targetX = targetX;
                this.targetY = targetY;
            }

            public AreaData(int areaId, float targetX, float targetY, ENTER_TYPE enterType)
            {
                this.prop = MapConfigCategory.Instance.Get(areaId);
                this.areaId = areaId;
                this.targetX = targetX;
                this.targetY = targetY;
                this.enterType = enterType;
            }

            public AreaData(int areaId, long instanceId, ENTER_TYPE enterType)
            {
                this.prop = MapConfigCategory.Instance.Get(areaId);
                this.areaId = areaId;
                this.instanceId = instanceId;
                this.enterType = enterType;
            }
        }

        /// <summary>
        /// 怪物单位数据
        /// </summary>
        public class MonsterUnit
        {
            /** 怪物名字 **/
            public string name { get; set; }

            /** 怪物模板ID **/
            public int id { get; set; }

            /** 阵营信息 **/
            public int force { get; set; }

            /** 刷新点名字,为空才去读x, y **/
            public string flag { get; set; }

            public bool autoGuard { get; set; }

            /** 同一个Area是否只能同时有一个怪存在 **/
            public bool unique = false;

            /** 坐标x **/
            public int x { get; set; }

            /** 坐标y **/
            public int y { get; set; }

            /** 是否是任务 共享怪 **/
            public int shareType { get; set; }

            /** 动态怪物等级,战斗服根据此计算怪物的动态数值 **/
            public int level { get; set; }

            /** 初始朝向 **/
            public float birthDirection { get; set; }

            /** 服务器标记字段,怪物死亡时,会回传回来 **/
            public int gsFlag { get; set; }

            /** 指定血量 **/
            public int hp { get; set; }

            public int maxHP { get; set; }

            /** 指定追击玩家id(必须是无限追击怪才会联动生效) **/
            public string attackPlayer { get; set; }

            /** 创建护卫怪,主人ObjectId(主人脱战或者死亡消失) **/
            public int masterID { get; set; }

            public MonsterUnit()
            {
            }

            public MonsterUnit(int monsterID, int force, bool unique, int x, int y)
            {
                this.id = monsterID;
                this.force = force;
                this.unique = unique;
                this.x = x;
                this.y = y;
            }

            public MonsterUnit(int monsterID, string refrushEvent, bool unique, int force)
            {
                this.id = monsterID;
                this.force = force;
                this.unique = unique;
                this.flag = refrushEvent;
            }

            public MonsterUnit(int monsterID, string refrushEvent, bool unique, int force, float birthDirection)
            {
                this.id = monsterID;
                this.force = force;
                this.unique = unique;
                this.flag = refrushEvent;
                this.birthDirection = birthDirection;
            }
        }

        /// <summary>
        /// 战报数据
        /// </summary>
        public class BattleReports
        {
            public uint ID { get; set; }
            public string PlayerUUID { get; set; }

            /** 模板id **/
            public int TemplateId { get; set; }

            /** 单位名称 **/
            public string Name { get; set; }

            /** 阵营 **/
            public int Force { get; set; }

            /** 对所有单位输出的总伤害 **/
            public int TotalDamage { get; set; }

            /** 对所有单位输出的总治疗量 **/
            public int TotalHealing { get; set; }

            public BattleReports(uint id, string PlayerUUID, int templateId, string name, int force, int totalDamage)
            {
                this.ID = id;
                this.PlayerUUID = PlayerUUID;
                this.TemplateId = templateId;
                this.Name = name;
                this.Force = force;
                this.TotalDamage = totalDamage;
            }
        }

        /// <summary>
        /// 玩家单位数据
        /// </summary>
        public class UnitPlayerData
        {
            /** 玩家单位的openId **/
            public string OpenId { get; set; }

            /** 玩家单位模板id **/
            public int TemplateId { get; set; }

            /** 战斗服objId **/
            public int ObjId { get; set; }

            /** 等级 (最大为3) **/
            public int Level { get; set; }

            /** 点赞数 **/
            public long Likes { get; set; }

            /** 复活时间 **/
            public long ReliveTime { get; set; }

            /** 复活位置x **/
            public int x { get; set; }

            /** 复活位置y **/
            public int y { get; set; }

            /** 场景 **/
            public Map Map { get; set; }

            public UnitPlayerData()
            {
            }

            public UnitPlayerData(string openId, int objId, Map map)
            {
                this.OpenId = openId;
                this.ObjId = objId;
                this.Map = map;
            }

            public UnitPlayerData(string openId, int templateId, long time, int x, int y, Map map)
            {
                this.OpenId = openId;
                this.TemplateId = templateId;
                this.ReliveTime = time;
                this.x = x;
                this.y = y;
                this.Map = map;
            }
        }

        /// <summary>
        /// 通知战斗服事件
        /// </summary>
        public class TriggerEventNotify
        {
            /** 事件名称 **/
            public string message { get; set; }

            //触发的单位objectId列表
            public string TriggerUnits { get; set; }
        }
    }
}