Расстояние до цели
Posted: 14.01.2013 13:01
Готовое решение внизу темы
Подскажите хотя бы на словах алгоритм
есть куча мобов разных типов
надо найти самого ближнего и дать мне его ID
вот моя тестовая наработка
и к да если использовать
NewMoveXY после этого и Цель находится в доме за дверями, то очень часто NewMoveXY просто не находит путь.
Бывает ситуация когда все таки зашел в дом, но выйти нельзя.
С дверями вопрос решил
добавить в
procedure Init;
moveOpenDoor := True;
но остается еще одна проблема
как мне получить массив ID монстров
т.к. FindType(monstro[ll],Ground); не дает никаких гарантий, что найдет дальнего моба или ближнего. она может сработать 20 раз и все 20 будут на дальнем мобе, и не разу не возьмет ближнего. я не знаю как это обойти.
FindType(monstro[ll],Ground);
Подскажите хотя бы на словах алгоритм
есть куча мобов разных типов
надо найти самого ближнего и дать мне его ID
вот моя тестовая наработка
и к да если использовать
NewMoveXY после этого и Цель находится в доме за дверями, то очень часто NewMoveXY просто не находит путь.
Бывает ситуация когда все таки зашел в дом, но выйти нельзя.
С дверями вопрос решил
добавить в
procedure Init;
moveOpenDoor := True;
но остается еще одна проблема
как мне получить массив ID монстров
т.к. FindType(monstro[ll],Ground); не дает никаких гарантий, что найдет дальнего моба или ближнего. она может сработать 20 раз и все 20 будут на дальнем мобе, и не разу не возьмет ближнего. я не знаю как это обойти.
FindType(monstro[ll],Ground);
Code: Select all
Program New;
var
monstro:array of word;
dlinmass:array [0..3] of Cardinal;
iskomoe:Cardinal;
l:integer;
procedure Init;
begin
monstro:=[$0032,$0099,$0038,$0003];
FindDistance:=15;
end;
function sqr(a:LongInt):LongInt;
begin
result:=a*a;
end;
function vector_length(c_1,c_2:TFoundTile):LongInt;
begin
result:=Round(sqrt(sqr(c_1.X-c_2.X)+sqr(c_1.Y-c_2.Y)));
end;
function dlinna(massive:array of Cardinal):Cardinal;
var
i:integer;
vekorB,vektorA:LongInt;
t_c:TFoundTile;
t_c2:TFoundTile;
targetVektor:Cardinal;
begin
vektorA:=999;
t_c.x:=GetX(Self);
t_c.y:=GetY(Self);
for i:=0 to (GetArrayLength(massive)-1) do
if massive[i]<>0 then
begin
t_c2.x:=GetX(massive[i]);
t_c2.y:=GetY(massive[i]);
vekorB:=vector_length(t_c,t_c2);
if vekorB < vektorA then
vektorA:=vekorB;
targetVektor:=massive[i];
end;
result:=targetVektor;
end;
function sozdmass(ll:integer):Cardinal;
var
massMobo:array [0..999] of Cardinal;
j,jj:integer;
begin
FindType(monstro[ll],Ground);
if FindCount>0 then
for j:=0 to 10 do
begin
FindType(monstro[ll],Ground);
for jj:=0 to 999 do
begin
if finditem <> massMobo[j] then
massMobo[j]:=finditem;
end;
end;
result:=dlinna (massMobo);
end;
begin
Init;
for l:=0 to (GetArrayLength(monstro)-1) do
begin
dlinmass[l]:=sozdmass(l);
AddToSystemJournal('l = '+inttostr(l));
end;
iskomoe:=dlinna(dlinmass);
AddToSystemJournal('Самый ближний моб '+GetName(iskomoe)+', ИД ='+ inttohex(iskomoe,8));
end.