Example #1
0
    public void MakeDecision()
    {
        if (gameObject != null)
        {
            if (ShouldChangeAttackTarget())
            {
                mOldAttackingObject = mAttackingObject;
                if (mOldAttackingObject != null)
                {
                    mOldAttackingObject.RemoveAttacker(this);
                }
                Utility.Log("mDetectionRange.RangeTargetList.Count = " + mDetectionRange.RangeTargetList.Count);

                if (MapManager.MMInstance.AttackableAliveBuildingNumber <= 0 && MapManager.MMInstance.NotAttackableAliveBuildingNumber <= 0)
                {
                    mAttackingObject = null;
                    return;
                }

                bool hasprefferinmap = false;
                bool hasprefferinrange = false;
                if (mPreferAttackType == PreferAttackType.E_ATTACKABLE)
                {
                    if (MapManager.MMInstance.AttackableAliveBuildingNumber > 0)
                    {
                        hasprefferinmap = true;
                        if (mDetectionRange.AttackableAliveAliveBuildingNumber > 0)
                        {
                            hasprefferinrange = true;
                        }
                    }
                }
                else if (mPreferAttackType == PreferAttackType.E_ALL)
                {
                    if (MapManager.MMInstance.AttackableAliveBuildingNumber > 0 || MapManager.MMInstance.NotAttackableAliveBuildingNumber > 0)
                    {
                        hasprefferinmap = true;
                        if (mDetectionRange.AttackableAliveAliveBuildingNumber > 0 || mDetectionRange.NotAttackableAliveBuildingNumber > 0)
                        {
                            hasprefferinrange = true;
                        }
                    }
                }

                if (hasprefferinmap && hasprefferinrange)
                {
                    mBSearchForPreffered = true;
                    mAttackingObject = ObtainAttackObjectInDetectionRange();
                }
                else if (hasprefferinmap && !hasprefferinrange)
                {
                    mBSearchForPreffered = true;
                    //Otherwise chose one as attack target in whole map
                    Utility.Log("Chose Target From Whole Map");
                    mAttackingObject = MapManager.MMInstance.ObtainAttackObject(this);
                }
                else
                {
                    //No preffer attacking building left
                    mBSearchForPreffered = false;
                    //Otherwise chose one as attack target in whole map
                    Utility.Log("Chose Target From Whole Map");
                    mAttackingObject = MapManager.MMInstance.ObtainAttackObject(this);
                }

                if (/*mAttackingObject != mOldAttackingObject &&*/ mAttackingObject != null)
                {
                    //Change the first point to gameobject location to avoid soldier move away from target
                    mAStarPath = mShortestPath.MovementPathToTarget;

                    mAStarPathIndexList = mShortestPath.PathToTarget;

                    mCurrentWayPoint = mAStarPath.Count - 1;

                    mAStarPath[mCurrentWayPoint] = transform.position;

                    //Append soldier to attackerlist for building
                    mAttackingObject.AppendAttacker(this);

                    //if the attacking object is Wall,
                    //we let soldier listenning for wall break event to make new decision once has wall breaked
                    /*
                     * Inform all soldiers that is listenning to WALL_BREAK will cause fps drop
                     * Only inform soldiers that are in valid wall notification range
                    if(mAttackingObject.mBI.getBuildingType() == BuildingType.E_WALL)
                    {
                        EventManager.mEMInstance.StartListening("WALL_BREAK",WallBreakDelegate);
                    }
                    else
                    {
                        EventManager.mEMInstance.StopListening("WALL_BREAK",WallBreakDelegate);
                    }
                    */
                }
            }
        }
    }