using CommonAI.Zone;
using CommonAI.Zone.Helper;
using CommonLang.Property;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommonAI.Data
{
    //同步玩家信息类型
    public abstract class UnitAttrMaskType : PlayerEvent
    {
        public const ulong MASK_ALL = 0xFFFFFFFFFFFFFFFF;

        public const ulong MASK_MAX_HP = 1 << 0;
        public const ulong MASK_MOVE_SPEED = 1 << 1;
        public const ulong MASK_HP_REBORN = 1 << 2;

        //同步Attribute
        public const ulong MASK_HP_PER = 1 << 3;
        public const ulong MASK_ATTACK = 1 << 4;
        public const ulong MASK_ATTACK_PER = 1 << 5;
        public const ulong MASK_DEF = 1 << 6;
        public const ulong MASK_DEF_PER = 1 << 7;
        public const ulong MASK_IGNORE_DEFENSE_PER = 1 << 8;
        public const ulong MASK_CRIT_RATE = 1 << 9;
        public const ulong MASK_CRIT_DAMAGE = 1 << 10;
        public const ulong MASK_INCALLDAMAGE = 1 << 11;
        public const ulong MASK_ALL_DAMAGE_REDUCE = 1 << 12;
        public const ulong MASK_CTRLTIME_REDUCE = 1 << 13;
        public const ulong MASK_SKILL_CD = 1 << 14;
        public const ulong MASK_HEALEFFECT = 1 << 15;
        public const ulong MASK_HEALEDEFFECT = 1 << 16;
        public const ulong MASK_SKILLDAMAGE = 1 << 17;
        public const ulong MASK_ATTACK_SPEED = 1 << 18;
        public const ulong MASK_CONTROL_UP = 1 << 19;

        public const ulong MASK_RES_CRIT_RATE = 1 << 20;			//抗暴率
        //public const ulong MASK_GODMAIN_DEFENSE = 1 << 21;
		//元素攻击 & 防御
        public const ulong MASK_GOLD_ATTACK = 1 << 22;
        public const ulong MASK_GOLD_DEFENSE = 1 << 23;
        public const ulong MASK_WOOD_ATTACK = 1 << 24;
        public const ulong MASK_WOOD_DEFENSE = 1 << 25;
        public const ulong MASK_WATER_ATTACK = 1 << 26;
        public const ulong MASK_WATER_DEFENSE = 1 << 27;
        public const ulong MASK_FIRE_ATTACK = 1 << 28;
        public const ulong MASK_FIRE_DEFENSE = 1 << 29;
        public const ulong MASK_SOIL_ATTACK = 1 << 30;
        public const ulong MASK_SOIL_DEFENSE = 1L << 31;


        public const ulong MASK_TOBOSS_CRIT_RATE = 1L << 32;
        public const ulong MASK_TOBOSS_CRIT_DAMAGE = 1L << 33;

        public const ulong MASK_GOLD_RESTRAINT = 1L << 34;
        public const ulong MASK_WOOD_RESTRAINT = 1L << 35;
        public const ulong MASK_WATER_RESTRAINT = 1L << 36;
        public const ulong MASK_FIRE_RESTRAINT = 1L << 37;
        public const ulong MASK_SOIL_RESTRAINT = 1L << 38;
        public const ulong MASK_GOLD_RESIST = 1L << 39;
        public const ulong MASK_WOOD_RESIST = 1L << 40;
        public const ulong MASK_WATER_RESIST = 1L << 41;
        public const ulong MASK_FIRE_RESIST = 1L << 42;
        public const ulong MASK_SOIL_RESIST = 1L << 43;
        public const ulong MASK_PVP_KILLVALUE = 1L << 44;
        public const ulong MASK_YAOQI_LEVEL = 1L << 45;
        public const ulong MASK_NORMAL_ATK_LEECH = 1L << 46;
        public const ulong MASK_ACTIVE_ATK_LEECH = 1L << 47;
        public const ulong MASK_ARTIFACTMAIN_PER = 1L << 48;
        public const ulong MASK_FIELD_BOSS_DAMAGEADD = 1L << 49;

        //玩家真实最大生命值(暂时仅角色面板显示)
        public const ulong MASK_MAX_HP_EXT = 1L << 50;

        public const ulong MASK_DUNGEON_MONETER_DAMAGEADD = 1L << 51;

		//移动速度加成 
		public const ulong MASK_MOVE_SPEED_ADDITION = 1L << 52;

		//命格克制
		public const ulong MASK_MONSTER_RESTRAINT_1 = 1L << 53;
		public const ulong MASK_MONSTER_RESTRAINT_2 = 1L << 54;
		public const ulong MASK_MONSTER_RESTRAINT_3 = 1L << 55;
		public const ulong MASK_MONSTER_RESTRAINT_4 = 1L << 56;
		public const ulong MASK_MONSTER_RESTRAINT_5 = 1L << 57;

		//// 猎妖属性
		public const ulong MASK_MONSTER_ATK = 1L << 58;
		public const ulong MASK_MONSTER_DEF = 1L << 59;
		public const ulong MASK_MONSTER_ATK_PER = 1L << 60;
		public const ulong MASK_MONSTER_DEF_PER = 1L << 61;

	}

    //技能释放状态
    public enum SkillCanLauchType : byte
    {
        All,            // 所有技能
        OnlyBaseSkill,  // 只能释放普攻
        None,           // 不能释放技能
    }

    //伤害类型
    public enum DamageType : byte
    {
        Damage,   //伤害.
        Heal,     //治愈.
        None,     //无伤.
        Modify,   //自定义.
    }

	//卡牌强化叠层类型
	public enum CardLayerType : byte
	{
		None,		// 默认值
		Replace,	// 所有强化只有一个,其他会被替换
		Layers,		// 所有强化只有一个,累计叠层
	}

    public enum BattleStatus : byte
    {
        None = 0,
        ReadyBattle = 1,
        PVE = 10,
        PVP = 11,        
    }


    //技能数据
    public class SkillLevelData
    {
        public XmdsSkillType skillType;
        public int SkillLevel;
        public int TalentSkillLevel1;
        public int TalentSkillLevel2;
        public int TalentSkillLevel3;
        //public int skillTime;
    }

    // 地图类型
    public enum SceneType : byte
    {
        Normal = 1,                     //野外.
        Dungeon = 2,                    //副本.
        DanTiao = 3,                    //单挑王.
        JJC = 4,                        //竞技场.
        CrossServer = 5,                //跨服.
        MengZhan = 6,                   //盟战.
        GuildDungeon = 7,               //公会副本.
        WorldBoss = 8,                  //世界BOSS.
        HUANJING = 9,                   //剧情场景
        FiveVFive = 10,                 //5v5
        GoblinTower = 11,               //镇妖塔
        SourceDungeon = 12,             //资源副本
        HaoYueJing = 13,                //皓月镜
        GuildBoss = 14,                 //工会Boss
        SecretDungeon = 15,             //秘境夺宝
        FightLevelUltra = 16,           //极限副本
        GuildFortPve = 17,              //工会据点采集地图
        GuildFortPvp = 18,              //工会据点战斗地图
        UnderGroundPlace = 19,          //boss地宫
        DIALY_RECHARGE_DUNGEON = 20,    //每日充值副本
        PickLotus = 21,                 //采莲
        AbyssDungeon = 22,              //深渊
        CrossReadyArea = 23,            //跨服备战区
        ROBBERY = 24,                   // 渡劫
        DEVIL = 25,                     // 成魔
		GuildFun=26,                    //公会功能地图
		WeekendStart = 27,              //星瀚殿
		ZhanYao_YaoYu = 28,             //斩妖-妖域
		FishBoss = 29,
		RESOURCE_DUNGEON_MINERAL = 30,        // 资源副本采矿图
		BACKRESURRECT_AREA = 31,
		NEW_HAND_SHI_LIAN_AREA = 32,     // 新手血色试炼场景
		WEEKEND_UnderGroundPlace_BOSS = 33, //周末封魔地图

		//有时间限制,并且地图需要消耗指定道具
		CONSUME_LIMITTIME_AREA = 34,   //天之涯,海之角,蓬莱岛场景

		DUJIE_DAZUO = 35,

		//挂机地图
		WIDE_HOOK = 36,
		SHI_MEN_POS = 37,
		MOUNTAINKING_PRISON = 38,			//山大王监狱

		//100+跨服场景
		CROSS_SERVER_NEW = 100,         // 新跨服野外场景
        NCS_MutilCross = 101,           // 新跨服-多无名镇
        NCS_DoubleCross = 102,          // 新跨服-双服无名镇
        NCS_FengShen = 103,             // 新跨服-封神战
		NCS_FengShenResure=104,         // 封神战-复活区
		CROSS_BOSS = 105,               // 跨服boss场景
		CROSS_WILDAREA = 106,           // 跨服野外场景,灵域
		CROSS_DEVIL = 107,              // 跨服野外场景,成魔
	}

    /// <summary>
    /// PK模式.决定玩家攻击判定.100以内保留,100+代表Server模式的特殊服务器id
    /// </summary>
    public enum PKMode : byte
    {
        Peace = 0,  //和平模式(该模式下不能攻击其他任何玩家,被攻击也不能还手).
        Justice = 1,//善恶模式(只能攻击PK值>0的玩家).
        force = 2,  //阵营模式(只能攻击和自己不同阵营的玩家).
        Guild = 3,  //公会模式(只能攻击不是自己公会/家族的玩家).
        Team = 4,   //组队模式(只能攻击对外意外的玩家).
        Server = 5, //本服模式(只能攻击其他服务器的玩家。这个模式只在连服生效).
        All = 6    //全体模式(攻击自己及队友以外的玩家等价于队友模式).
    }


    public enum JSGCustomOpType : byte
    {
        UpdateAutoBattleFlag = 0,  //更新自动战斗模式
    }

	public enum XmdsUnitPro : byte
	{
		[DescAttribute("None为默认值", "职业")]
		None = 0,           //木有.
		[DescAttribute("战士", "职业")]
		Sword = 1,          //苍狼.
							//Assassin = 2,       //御剑.
		[DescAttribute("法师", "职业")]
		Magic = 3,          //逸仙.
							//Hunter = 4,         //神箭.
		[DescAttribute("治疗", "职业")]
		Priest = 5,         //灵狐.


		[DescAttribute("上限标记", "职业")]
		Max,
	}


	// 天命类型: 金木土水火
	public enum UnitFateType : sbyte
	{
		Random=-1,
		None = 0,
		One = 1,
		Two = 2,
		Three = 3,
		Four = 4,
		Five = 5,
	}

	/// <summary>
	/// PK值,记录玩家PK行为.
	/// </summary>
	public enum PKLevel : byte
	{
		White = 0,
		Black = 1,
		Yellow = 2,
		Red = 3,
	}

	public class GlobalData
	{
		//默认攻速值
		public static readonly int DEFAULT_ATTACK_SPEED = 10000;
		//bot刷新频率
		public static readonly short BOT_UPDATE_INTERVAL = 5000;
		//ZoneUpdate慢刷新倍数
		public static readonly short ZONE_UPDATE_SLOW = 10;

		public static readonly Random gRandom = new Random();

		//游戏中概率基础
		public static readonly int RATE_BASE = 10000;

		//定力系统相关常量
		public static readonly int SHIELD_RECOVER_TIME = 10;			// 回满需要次数
		public static readonly int SHIELD_RECOVER_INTERVAL = 500;		// 恢复间隔
		public static readonly int SHIELD_BREAK_BUFF = 920000;			// 破定状态buff
		public static readonly int SHIELD_BREAK_HOLDTIME = 6000;		// 破定时间

		//测试配置
		public static bool GAME_BS_TEST = false;
	}

	public class GSCreateAreaData
	{
		public int value1;
		public int value2;
	}

	//释放法术个人数据
	public class JSGCreateSpellData
	{
		public int mMaxSpellCount;
	}

	public enum SummonType : byte
	{
		none = 0,
		guard = 1,              // 自卫
		guardMaster = 2,        // 守卫主人
		attack = 3,             // 上来就干
		MoveToMaster = 4,		// 往上冲
		AwaitMaster = 5,		// 原地等待或者增益master
	}


	//神器元素类型
	public enum ArtifactType : int
	{
		None = -1,       //无效值
		Gold,           //金
		Wood,           //木
		Soil,           //土
		Water,          //水
		Fire            //火        
	}

	//位置坐标变更类型
	public enum XYModifyType : byte
	{
		[DescAttribute("绑定施法者方向")]
		Relative = 0,
		[DescAttribute("绝对坐标更改")]
		Absolutely = 1,
	}

	// 伤害来源 - 用户特殊处理显示上的逻辑
	public enum DamageSource : byte
	{
		Def = 0,					// 2021.8.8前所有旧版伤害逻辑
		RemedyPoison = 1,			// 特殊处理,治疗毒
	}

	// 卡牌类型
	public enum CardType : byte
	{     
		QingLong	= 0,
		ZhuQue		= 1,
		BaiHu		= 2,		
		XuanWu		= 3,
		Max			= 4,                 // 无(两仪)
	}

	//
}