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