Страница 1 из 1

randomwalk - 1й командой движение в случайную точку на карте

Добавлено: Пт дек 21, 2007 6:10 pm
dimmka
То есть так как кора калькулирует маршрут в рандомную точку при ai auto, только нужно сделать это при ai manual один раз. Вопрос как?

[mod="piroJOKE"]ниже в теме - плагин randomwalk, вводящий команду rw - аккуратное решение сабжевого вопроса 8) [/mod]

Добавлено: Пт дек 21, 2007 7:01 pm
piroJOKE
Конечно, можно просто от фонаря сделать move с рандомными координатами, но это неверно: можно угодить в непроходимый блок. Верно мыслишь, афтар. :)

Добавлено спустя 28 минут 51 секунду:

Похоже, просто вызвать функцию внутри ОК не выйдет....


Кстати. А нафига это вообще надо? :twisted:

Добавлено: Пт дек 21, 2007 7:25 pm
dimmka
Ну, допустим надо согнать пару ботов в один город по одному макросу...
Для всех одни координаты - палево
Для каждого прописывать отдельные - геморно

короче чтоб не бросаться в глаза 8)

Добавлено: Пт дек 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.
Я уже так думал.. Похоже это единственный из возможных способов.

ОК, спасибо :)

Добавлено: Сб дек 22, 2007 12:20 am
piroJOKE
Если получится, расскажешь, как оно.

Добавлено: Сб дек 22, 2007 5:48 am
4epT
допустим мы знаем что на неком квадрате мы тосно можем стоять, тогда пишем:

Код: Выделить всё

do move @rand (x, x+5) @rand (y, y+5)

или можно создать штук 20 точек:

Код: Выделить всё

do move @random ("x1 y1", "x2 y2", ..., "x20 y20")
правда тут существует вероятнсть, что 2 бота станут в 1 точку :)

Добавлено: Сб дек 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!:

Добавлено: Пн дек 24, 2007 3:28 pm
dimmka
Free Goods

Большое спасибо за разработку!