/********************************************************************************
 *	文件名:	Reputation.cs
 *	全路径:	\Player\Reputation.cs
 *	创建人:	李嘉
 *	创建时间:2013-11-14
 *
 *	功能说明:Obj阵营势力相关接口
 *	修改记录:将参数改为传入一个Obj_Character 客户端只要跟主角判断敌对友好关系
*********************************************************************************/

using Games.GlobeDefine;
using GCGame.Table;

namespace Games.LogicObj
{
    public class Reputation
    {
        public static CharacterDefine.REPUTATION_TYPE GetObjReputionType(Obj_Character objChar)
        {
            var result = CharacterDefine.REPUTATION_TYPE.REPUTATION_INVALID;
            if (objChar != null)
            {
                var mainPlayer = ObjManager.Instance.MainPlayer;
                if (mainPlayer != null)
                    if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER)
                    {
                        result = CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND;
                    }
                    else if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW)
                    {
                        var fellow = (Obj_Fellow) objChar;
                        if (fellow.OwnerObjId == mainPlayer.ServerID)
                            result = CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND;
                        else
                        {
                            var owner = ObjManager.Instance.FindObjCharacterInScene(fellow.OwnerObjId);
                            // 已知问题,拥有者不在视野内时,会无法正常检查
                            result = owner != null && owner.ObjType != GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW ? GetObjReputionType(owner) : CharacterDefine.REPUTATION_TYPE.REPUTATION_DUMMY;
                        }
                    }
                    else
                    {
                        // 对其他玩家额外处理
                        if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER)
                        {
                            // 关宁只认临时队伍情况
                            switch (GameManager.gameManager.RunningScene)
                            {
                                case (int) GameDefine_Globe.SCENE_DEFINE.SCENE_GUANNING:
                                    result = objChar.BaseAttr.Force == mainPlayer.BaseAttr.Force
                                        ? CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND
                                        : CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE;
                                    break;
                                case (int) GameDefine_Globe.SCENE_DEFINE.SCENE_FACIONCHALLENGE:
                                    result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE;
                                    break;
                                default:
                                    if (IsCanPk((Obj_OtherPlayer) objChar))
                                        result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE;
                                    break;
                            }
                        }
                        else
                        {
                            var npc = objChar as Obj_NPC;
                            if (npc != null && npc.OwerGUID == (long) mainPlayer.GUID)
                                result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE;
                        }

                        // 没有特殊规则时,下落到使用关系列表
                        if (result == CharacterDefine.REPUTATION_TYPE.REPUTATION_INVALID)
                        {
                            var reputation = TableManager.GetRelationByID(mainPlayer.BaseAttr.Force, 0);
                            if (reputation != null)
                                result =
                                    (CharacterDefine.REPUTATION_TYPE) reputation.GetRelationbyIndex(objChar
                                        .BaseAttr
                                        .Force);
                        }
                    }
            }

            return result;
        }

        public static bool IsEnemy(Obj_Character character)
        {
            return IsReputation(character, CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE);
        }

        public static bool IsFriend(Obj_Character character)
        {
            return IsReputation(character, CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND);
        }
        
        public static bool CanAttack(Obj_Character character)
        {
            var reputation = GetObjReputionType(character);
            return CanAttack(reputation);
        }

        public static bool CanAttack(CharacterDefine.REPUTATION_TYPE reputation)
        {
            return reputation == CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE ||
                   reputation == CharacterDefine.REPUTATION_TYPE.REPUTATION_NEUTRAL;
        }

        public static bool IsReputation(Obj_Character character, CharacterDefine.REPUTATION_TYPE reputation)
        {
            return GetObjReputionType(character) == reputation;
        }

        //主角能否攻击玩家
        public static bool IsCanPk(Obj_OtherPlayer objChar)
        {
            var result = false;

            // 副本中和爱人关系不能攻击
            if (objChar != null &&
                GameManager.gameManager.PlayerDataPool.LoverGUID != objChar.GUID)
            {
                var mainPlayer = ObjManager.Instance.MainPlayer;
                if (mainPlayer != null)
                    if (objChar.IsInMainPlayerPKList)
                        result = true;
                    else
                    {
                        var pkModel = (CharacterDefine.PKMODLE) mainPlayer.PkModle;
                        switch (pkModel)
                        {
                            case CharacterDefine.PKMODLE.Evil:
                                result = objChar.PkValue >= 60;
                                break;
                            case CharacterDefine.PKMODLE.Camp:
                                result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) &&
                                         !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar);
                                break;
                            case CharacterDefine.PKMODLE.KILL:
                                result = true;
                                break;
                        }
                    }

            }
            if (objChar != null && GameManager.gameManager.m_RunningScene == 658)
            {
                var mainPlayer = ObjManager.Instance.MainPlayer;
                if (mainPlayer != null)
                    if (objChar.IsInMainPlayerPKList)
                        result = true;
                    else
                    {
                        var pkModel = (CharacterDefine.PKMODLE)mainPlayer.PkModle;
                        switch (pkModel)
                        {
                            case CharacterDefine.PKMODLE.Evil:
                                result = objChar.PkValue >= 60;
                                break;
                            case CharacterDefine.PKMODLE.Camp:
                                result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) &&
                                         !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar);
                                break;
                            case CharacterDefine.PKMODLE.KILL:
                                result = true;
                                break;
                        }
                    }
            }

            return result;
        }

        //玩家能否攻击主角
        public static bool IsCanBeAttack(Obj_OtherPlayer objChar)
        {
            var result = false;
            // 副本中和爱人关系不能攻击
            if (objChar != null &&
                GameManager.gameManager.PlayerDataPool.LoverGUID != objChar.GUID)
            {
                var mainPlayer = ObjManager.Instance.MainPlayer;
                if (mainPlayer != null)
                {
                    var pkModel = (CharacterDefine.PKMODLE) objChar.PkModle;
                    switch (pkModel)
                    {
                        case CharacterDefine.PKMODLE.Evil:
                            result = mainPlayer.PkValue >= 60;
                            break;
                        case CharacterDefine.PKMODLE.Camp:
                            result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) &&
                                     !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar);
                            break;
                        case CharacterDefine.PKMODLE.KILL:
                            result = true;
                            break;
                    }
                }
            }
            if (objChar != null && GameManager.gameManager.m_RunningScene == 658)
            {
                var mainPlayer = ObjManager.Instance.MainPlayer;
                if (mainPlayer != null)
                    if (objChar.IsInMainPlayerPKList)
                        result = true;
                    else
                    {
                        var pkModel = (CharacterDefine.PKMODLE)mainPlayer.PkModle;
                        switch (pkModel)
                        {
                            case CharacterDefine.PKMODLE.Evil:
                                result = objChar.PkValue >= 60;
                                break;
                            case CharacterDefine.PKMODLE.Camp:
                                result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) &&
                                         !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar);
                                break;
                            case CharacterDefine.PKMODLE.KILL:
                                result = true;
                                break;
                        }
                    }
            }

            return result;
        }
    }
}