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; }
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(); } }