Ejemplo n.º 1
0
 private void TowerLossControl()
 {
     for (int i = 0; i < stationNPC.Length; i++)
     {
         if (stationNPC[i] != null)
         {
             stationNPC[i].Garrison(null);
             stationNPC[i] = null;
         }
     }
     invadeCommand = InvadeCmd.SupportNearestTower;
     CommandFollowersInvade();
     TowerFollowers.Clear();
     Followers.Clear();
     invadeCommand = InvadeCmd.DoNothing;
 }
Ejemplo n.º 2
0
    protected virtual void TowerInvadeAI()
    {
        if (type == NPCType.Neutral)
        {
            invadeCommand = InvadeCmd.DoNothing;
            return;
        }
        Tower nearestCompanionTower         = GetNearestTower(true, false);
        Tower nearestEnemyTower             = GetNearestTower(false, false);
        Tower nearestCompanionTowerInCombat = GetNearestTower(true, true);
        Tower nearestEnemyTowerInCombat     = GetNearestTower(false, false);

        if (IsCombat())
        {
            List <NPCController> npcInRange = new List <NPCController>();
            for (int i = 0; i < characterInBuffRange.Count; i++)
            {
                if (characterInBuffRange[i] is NPCController && Tags.IsCompanion(this, characterInBuffRange[i]))
                {
                    //只針對範圍內的下命令
                    npcInRange.Add(characterInBuffRange[i] as NPCController);
                }
            }
            //是塔的排前面
            npcInRange.Sort((a, b) =>
            {
                if (TowerFollowers.Contains(a) && !TowerFollowers.Contains(b))
                {
                    return(-1);
                }
                if (TowerFollowers.Contains(b) && !TowerFollowers.Contains(a))
                {
                    return(1);
                }
                return(0);
            });
            switch (invadeCommand)
            {
            case InvadeCmd.DoNothing:
                //戰鬥中將npc駐防
                for (int i = 0; i < stationNPC.Length; i++)
                {
                    if (npcInRange.Count > i && stationNPC[i] == null && TowerFollowers.Contains(npcInRange[i]))
                    {
                        stationNPC[i] = npcInRange[i];
                        npcInRange[i].Garrison(stationPosition[i]);
                    }
                }
                return;

            case InvadeCmd.OccupyNearestTower:
                invadeCommand = InvadeCmd.DoNothing;
                break;

            case InvadeCmd.DestroyNearestTower:
                invadeCommand = InvadeCmd.DoNothing;
                break;

            case InvadeCmd.SupportNearestTower:
                //外調的時候被打,開始防守
                invadeCommand = InvadeCmd.DoNothing;
                break;
            }
            for (int i = 0; i < npcInRange.Count; i++)
            {
                //只針對範圍內的下命令
                CommandFollowerInvade(npcInRange[i]);
            }
        }
        else
        {
            switch (invadeCommand)
            {
            case InvadeCmd.DoNothing:

                if (TowerFollowers.Count >= 5)
                {
                    ////滿了就解除駐守全送出去打
                    //for (int i = 0; i < stationNPC.Length; i++)
                    //{
                    //    if (stationNPC[i] != null)
                    //    {
                    //        stationNPC[i].Garrison(null);
                    //        stationNPC[i] = null;
                    //    }
                    //}
                    //鄰塔有戰事,支援林塔
                    if (nearestCompanionTowerInCombat != null)
                    {
                        invadeCommand = InvadeCmd.SupportNearestTower;
                    }
                    //或者衝最進敵塔
                    else if (nearestEnemyTower != null)
                    {
                        invadeCommand = InvadeCmd.DestroyNearestTower;
                    }
                }
                else
                {
                    //平時敵塔有戰事 增援
                    if (nearestCompanionTowerInCombat != null)
                    {
                        invadeCommand = InvadeCmd.DestroyNearestTower;
                    }
                }

                break;

            case InvadeCmd.OccupyNearestTower:
                if (nearestEnemyTower == null)
                {
                    invadeCommand = InvadeCmd.DoNothing;
                }
                break;

            case InvadeCmd.DestroyNearestTower:
                if (nearestEnemyTower == null)
                {
                    invadeCommand = InvadeCmd.DoNothing;
                }
                break;

            case InvadeCmd.SupportNearestTower:
                if (nearestCompanionTowerInCombat == null)
                {
                    invadeCommand = InvadeCmd.DoNothing;
                }
                break;
            }
            CommandFollowersInvade();
        }
    }