Страница 1 из 1
randomwalk - 1й командой движение в случайную точку на карте
Добавлено: Пт дек 21, 2007 6:10 pm
dimmka
То есть так как кора калькулирует маршрут в рандомную точку при ai auto, только нужно сделать это при ai manual один раз. Вопрос как?
[mod="piroJOKE"]ниже в теме - плагин randomwalk, вводящий команду rw - аккуратное решение сабжевого вопроса
![Cool 8)](./images/smilies/dirol.gif)
[/mod]
Добавлено: Пт дек 21, 2007 7:01 pm
piroJOKE
Конечно, можно просто от фонаря сделать move с рандомными координатами, но это неверно: можно угодить в непроходимый блок. Верно мыслишь, афтар.
Добавлено спустя 28 минут 51 секунду:
Похоже, просто вызвать функцию внутри ОК не выйдет....
Кстати. А нафига это вообще надо?
![Twisted Evil :twisted:](./images/smilies/spiteful.gif)
Добавлено: Пт дек 21, 2007 7:25 pm
dimmka
Ну, допустим надо согнать пару ботов в один город по одному макросу...
Для всех одни координаты - палево
Для каждого прописывать отдельные - геморно
короче чтоб не бросаться в глаза
![Cool 8)](./images/smilies/dirol.gif)
Добавлено: Пт дек 21, 2007 7:46 pm
piroJOKE
Пока единственное, чем могу помочь, это показать, как ОК считает случайные координаты.
\src\AI\CoreLogic.pm
Код: Выделить всё
##### RANDOM WALK #####
sub processRandomWalk {
if (AI::isIdle && (!$char->{homunculus} || AI::Homunculus::isIdle()) && $config{route_randomWalk} && !$ai_v{sitAuto_forcedBySitCommand}
&& (!$cities_lut{$field{name}.'.rsw'} || $config{route_randomWalk_inTown})
&& length($field{rawMap}) ) {
my ($randX, $randY);
my $i = 500;
do {
$randX = int(rand($field{width}) + 1);
$randX = int($config{'lockMap_x'} - $config{'lockMap_randX'} + rand(2*$config{'lockMap_randX'}+1)) if ($config{'lockMap_x'} ne '' && $config{'lockMap_randX'} ne '');
$randY = int(rand($field{height}) + 1);
$randY = int($config{'lockMap_y'} - $config{'lockMap_randY'} + rand(2*$config{'lockMap_randY'}+1)) if ($config{'lockMap_y'} ne '' && $config{'lockMap_randY'} ne '');
} while (--$i && !$field->isWalkable($randX, $randY));
if (!$i) {
error T("Invalid coordinates specified for randomWalk (coordinates are unwalkable); randomWalk disabled\n");
$config{route_randomWalk} = 0;
} else {
message TF("Calculating random route to: %s(%s): %s, %s\n", $maps_lut{$field{name}.'.rsw'}, $field{name}, $randX, $randY), "route";
ai_route($field{name}, $randX, $randY,
maxRouteTime => $config{route_randomWalk_maxRouteTime},
attackOnRoute => 2,
noMapRoute => ($config{route_randomWalk} == 2 ? 1 : 0) );
}
}
}
В общем, берутся случайные точки на карте, и ОК пытается проложить к ним маршрут. Если точка оказывается недоступной, ОК хватает другие координаты, и проверяет заново. Она пробует это сделать до 500 раз ))) и если это не выходит - объявляет, что на этой карте бегать невозможно - и обламывается.
Добавлено спустя 3 минуты 19 секунд:
Можно попытаться сделать следующее: поставить в локМап нужный город, и разрешить route_randomWalk_inTown. А по достижению нужной карты (города) дать ОК несколько секунд побегать по нему, а потом уже сделать ai off.
Добавлено: Пт дек 21, 2007 8:21 pm
dimmka
Можно попытаться сделать следующее: поставить в локМап нужный город, и разрешить route_randomWalk_inTown. А по достижению нужной карты (города) дать ОК несколько секунд побегать по нему, а потом уже сделать ai off.
Я уже так думал.. Похоже это единственный из возможных способов.
ОК, спасибо
![Smile :)](./images/smilies/smile.gif)
Добавлено: Сб дек 22, 2007 12:20 am
piroJOKE
Если получится, расскажешь, как оно.
Добавлено: Сб дек 22, 2007 5:48 am
4epT
допустим мы знаем что на неком квадрате мы тосно можем стоять, тогда пишем:
или можно создать штук 20 точек:
Код: Выделить всё
do move @random ("x1 y1", "x2 y2", ..., "x20 y20")
правда тут существует вероятнсть, что 2 бота станут в 1 точку
![Smile :)](./images/smilies/smile.gif)
Добавлено: Сб дек 22, 2007 1:12 pm
Free Goods
Почему бы не взять из AI, например так.
randomwalk.pl
rw - бежать в случайную точку.
Код: Выделить всё
package randomwalk;
use strict;
use Globals;
use Field;
use AI;
Plugins::register('randomwalk', 'walks to a random point on the map', \&Unload);
my $chooks = Commands::register(
['rw', "RW plugin", \&commandHandler]
);
sub commandHandler {
my ($randX, $randY);
my $i = 500;
do {
$randX = int(rand($field{width}) + 1);
$randY = int(rand($field{height}) + 1);
} while (--$i && !$field->isWalkable($randX, $randY));
if ($i) {
ai_route($field{name}, $randX, $randY,
maxRouteTime => $config{route_randomWalk_maxRouteTime},
attackOnRoute => 2,
noMapRoute => ($config{route_randomWalk} == 2 ? 1 : 0) );
}
}
sub Unload {
Commands::unregister($chooks);
}
Добавлено: Сб дек 22, 2007 1:19 pm
piroJOKE
Проверял ли ты работоспособность кода, Free Goods?
Добавлено: Сб дек 22, 2007 2:04 pm
Free Goods
Извиняюсь, забыл добавить ссылку на Globals. Теперь проверил, всё работает.
Добавлено: Сб дек 22, 2007 2:22 pm
piroJOKE
Отлично, это (может быть) даже мне пригодиццо.
![Yahoo! :Yahoo!:](./images/smilies/yahoo.gif)
Добавлено: Пн дек 24, 2007 3:28 pm
dimmka
Free Goods
Большое спасибо за разработку!