public void Action(MyAI _player) { if (this.HPNumber == -1) { this.HPoint = _player.GetNextHoshimiPoint(this.Location, ref this.HPNumber); } if (this.HPNumber == -10) { this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); } if (HPNumber >= 0) { if (_player.HoshimiPoints[HPNumber].Full == 1) { this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); this.StopMoving(); } } if (this.State == NanoBotState.WaitingOrders) { if (this.Location == this.APoint) { if (this.Stock == 0) { //Collect CollectFrom(Location, this.ContainerCapacity / this.CollectTransfertSpeed); } else { //Go Hoshimi point //MoveTo(this.HPoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); } } if (this.Location == this.HPoint) { foreach (NanoBot bot in _player.NanoBots) { if ((bot is Needle) && (bot.Stock == bot.ContainerCapacity) && (bot.Location == this.Location)) { if (HPNumber >= 0) { _player.HoshimiPoints[HPNumber].Full = 1; this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); //Добавить возможность "дозаправки"!!! if (Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //MoveTo(this.APoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); } else { //this.MoveTo(this.HPoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); } } } } if (Stock == 0) { //return to azn this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //MoveTo(this.APoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); } else { //transfert TransferTo(Location, this.Stock / this.CollectTransfertSpeed); } } //Добавить возможность "дозаправки"!!! if (Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //this.MoveTo(this.APoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); } else { //this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); //this.MoveTo(this.HPoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); } } }
public void Action(MyAI _player) { if (this.HPNumber == -1) { this.HPoint = _player.GetNextHoshimiPoint(this.Location, ref this.HPNumber); } if (this.HPNumber == -10) { this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); } if (HPNumber >= 0) { if (_player.HoshimiPoints[HPNumber].Full == 1) { this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); this.StopMoving(); } } if (this.State == NanoBotState.WaitingOrders) { if (this.Location == this.APoint) { if (this.Stock == 0) { //Collect CollectFrom(Location, this.ContainerCapacity / this.CollectTransfertSpeed); return; } else { //Go Hoshimi point //MoveTo(this.HPoint); //string str = "Collector[" + this.ID.ToString() + "] at AP X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); return; } } if (this.Location == this.HPoint) { foreach (NanoBot bot in _player.NanoBots) { if ((bot is Needle) && (bot.Stock == bot.ContainerCapacity) && (bot.Location == this.Location)) { if (HPNumber >= 0) { _player.HoshimiPoints[HPNumber].Full = 1; this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); //Добавить возможность "дозаправки"!!! if (Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //MoveTo(this.APoint); //string str = "Empty collector[" + this.ID.ToString() +"] at finished HP X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); return; } else { //this.MoveTo(this.HPoint); //string str = "Not empty collector[" + this.ID.ToString() +"] at finished HP X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); return; } } } } if (Stock == 0) { //return to azn this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //MoveTo(this.APoint); //string str = "Empty collector[" + this.ID.ToString() +"] at HP X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); return; } else { //transfert TransferTo(Location, this.Stock / this.CollectTransfertSpeed); return; } } //Добавить возможность "дозаправки"!!! if (Stock == 0) { //string str = "Empty collector[" + this.ID.ToString() +"] somewhere X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); //this.MoveTo(this.APoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); return; } else { //this.HPoint = _player.GetNearestUnfilledHP(this.Location, ref this.HPNumber); //this.MoveTo(this.HPoint); //string str = "Not empty collector[" + this.ID.ToString() +"] somewhere X: " + this.Location.X.ToString() + " Y: " + this.Location.Y.ToString() + "\n"; //Debugger.Log(2, "Local", str); MoveTo(_player.Pathfinder.FindPath(this.Location, this.HPoint)); return; } } }
public void Action(MyAI _player) { Fire = false; //Проверяем список противников. Если кто-то достаточно близко, останавливаемся. if (_player.OtherNanoBotsInfo != null) { foreach (NanoBotInfo botEnemy in _player.OtherNanoBotsInfo) { if (botEnemy.PlayerID == 0) { Distance = _player.GeomDist(botEnemy.Location, this.Location); if (Distance < this.DefenseDistance) { this.StopMoving(); Fire = true; } } } } //NPNumber == -1 означает, что навигатор только появился, и ему надо назначить цель if (this.NPNumber == -1) { this.NPoint = _player.GetNextUndoneHealPoint(this.Location, ref this.NPNumber); if (this.NPNumber == -10) { this.ForceAutoDestruction(); return; } } if (NPNumber >= 0) { //Если вдруг обнаруживаем, что цель, к которой идём, уже кем-то посещена, то запрашиваем новую и останавливаемся. if (_player.NavigationPoints[NPNumber].Complete == true) { this.NPoint = _player.GetNextUndoneHealPoint(this.Location, ref this.NPNumber); if (this.NPNumber == -10) { this.ForceAutoDestruction(); return; } this.StopMoving(); } } if (NPNumber >= 0) { //Если мы стоим на цели в нужное время, то помечаем её как выполненную и запрашиваем новую. if ((this.Location == this.NPoint) && (_player.CurrentTurn > _player.NavigationPoints[NPNumber].StartTurn) && (_player.CurrentTurn < _player.NavigationPoints[NPNumber].EndTurn) && (this.Stock >= _player.NavigationPoints[NPNumber].Stock)) { _player.NavigationPoints[NPNumber].Complete = true; this.NPoint = _player.GetNextUndoneHealPoint(this.Location, ref this.NPNumber); if (this.NPNumber == -10) { this.ForceAutoDestruction(); return; } } } if (this.State == NanoBotState.WaitingOrders) { if (Fire) { //Ищем ближайшую цель MinDistance = 1000; if (_player.OtherNanoBotsInfo != null) { foreach (NanoBotInfo botEnemy in _player.OtherNanoBotsInfo) { if (botEnemy.PlayerID == 0) { this.Distance = _player.GeomDist(botEnemy.Location, this.Location); //Если вражеский AI достаточно близко, то он пользуется абсолютным приоритетом! if ((botEnemy.NanoBotType == NanoBotType.NanoAI) && (Distance < this.DefenseDistance)) { MinDistance = -1; ShootAt = botEnemy.Location; } if (Distance < MinDistance) { MinDistance = Distance; ShootAt = botEnemy.Location; } } } } //Если противник близко, то стреляем в него. if (MinDistance < this.DefenseDistance) { this.DefendTo(ShootAt, 3); return; } } //Если все NP посещены, то стоим if (this.NPNumber == -10) { this.ForceAutoDestruction(); return; } //Если мы на AZNPoint и нужна дозаправка, то дозаправляемся if (this.Location == this.APoint) { if (this.Stock == 0) { CollectFrom(Location, this.ContainerCapacity / this.CollectTransfertSpeed); return; } } //Если пустые, то находим AZN и идём за ним if (Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.NPoint); MoveTo(_player.Pathfinder.FindPath(this.Location, this.APoint)); return; } else { MoveTo(_player.Pathfinder.FindPath(this.Location, this.NPoint)); return; } } }
//Основная функция. Управляет всеми движениями конвоя public void Action(MyAI _player) { double Distance; double MinDistance; Point ShootAt = new Point(); //Если конвоя ещё нет, то и делать нечего if (State == ConvoyState.UnderConstruction) { return; } //Устанавливаем все значения: State, Location, Stock, etc SetState(_player); //Если боец жив, проверяем наличие противников if (MyDefender != null) { //Если в пределах досягаемости кто-то есть, останавливаем конвой if (_player.OtherNanoBotsInfo != null) { foreach (NanoBotInfo botEnemy in _player.OtherNanoBotsInfo) { if (botEnemy.PlayerID == 0) { Distance = _player.GeomDist(botEnemy.Location, MyDefender.Location); if (Distance < MyDefender.DefenseDistance) { this.Stop(); } } } } //Если конвой стоит if (this.State == ConvoyState.Waiting) { //Ищем ближайшую цель MinDistance = 1000; if (_player.OtherNanoBotsInfo != null) { foreach (NanoBotInfo botEnemy in _player.OtherNanoBotsInfo) { if (botEnemy.PlayerID == 0) { Distance = _player.GeomDist(botEnemy.Location, MyDefender.Location); if ((botEnemy.NanoBotType == NanoBotType.NanoAI) && (Distance < MyDefender.DefenseDistance)) { MinDistance = -1; ShootAt = botEnemy.Location; } if (Distance < MinDistance) { MinDistance = Distance; ShootAt = botEnemy.Location; } } } } //Если она достаточно близко, стреляем и завершаем действия if (MinDistance < MyDefender.DefenseDistance) { MyDefender.DefendTo(ShootAt, 4); return; } } } //Если конвой стоит if (State == ConvoyState.Waiting) { //Если мы не в куче, то собираемся в неё самую if (this.NeedGathering()) { this.Gather(_player); return; } //Если мы на AZNPoint if (this.Location == this.APoint) { //Если контейнеры пустые, то заполняем их if (this.Stock == 0) { this.FillContainers(); return; } //Если не пустые, то идём к HoshimiPoint else { if (this.Location == this.HPoint) { return; } this.Path = _player.Pathfinder.FindPath(this.Location, this.HPoint); this.Move(); return; } } //Если мы на HoshimiPoint if (this.Location == this.HPoint) { //Если это валидный HP, то проверяем, наш ли он if (HPNumber >= 0) { //Если нет, то переключаемся на новый if (_player.HoshimiPoints[HPNumber].Needle == 2) { //this.HPoint = _player.GetNearestHPForConvoy(this.Location, ref this.HPNumber); this.HPoint = _player.GetNextHPForConvoy(this.Location, ref this.HPNumber); //Если пустые, то идём за AZN if (this.Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); this.Path = _player.Pathfinder.FindPath(this.Location, this.APoint); this.Move(); return; } //Иначе сразу к HP else { if (this.Location == this.HPoint) { return; } this.Path = _player.Pathfinder.FindPath(this.Location, this.HPoint); this.Move(); return; } } } //Проверяем все Needle`ы foreach (NanoBot bot in _player.NanoBots) { //Если находим Needle на этой точке и он полный if ((bot is Needle) && (bot.Stock == bot.ContainerCapacity) && (bot.Location == this.Location)) { if (HPNumber >= 0) { //То отмечаем этот факт _player.HoshimiPoints[HPNumber].Full = 1; //Запрашиваем новую HP //this.HPoint = _player.GetNearestHPForConvoy(this.Location, ref this.HPNumber); this.HPoint = _player.GetNextHPForConvoy(this.Location, ref this.HPNumber); //Если пустые, то идём за AZN if (this.Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); this.Path = _player.Pathfinder.FindPath(this.Location, this.APoint); this.Move(); return; } //Иначе сразу к HP else { if (this.Location == this.HPoint) { return; } this.Path = _player.Pathfinder.FindPath(this.Location, this.HPoint); this.Move(); return; } } } } if (HPNumber >= 0) { //Если стоит наш Needle if (_player.HoshimiPoints[HPNumber].Needle == 1) { //И Needle ещё не заполнен //Если мы уже разгрузились, то идём за AZN if (this.Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); this.Path = _player.Pathfinder.FindPath(this.Location, this.APoint); this.Move(); return; } //Иначе разгружаемся else { this.Transfert(); return; } } } } //Если мы чёрте где //Если пустые, то за AZN if (this.Stock == 0) { this.APoint = _player.GetNearestAZNPoint(this.Location, this.HPoint); this.Path = _player.Pathfinder.FindPath(this.Location, this.APoint); this.Move(); return; } //иначе на HP else { if (this.Location == this.HPoint) { return; } this.Path = _player.Pathfinder.FindPath(this.Location, this.HPoint); this.Move(); return; } } }