namespace ET.Server
{
    /// <summary>
    /// 游戏服数据结构
    /// </summary>
    public class Struct
    {
        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; }
        }

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

            /** 是否已解锁 */
            public bool isUnlock() {
                return this.unlock;
            }
        }

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