Как получить координаты обратные данным? (часть 2)
Posted: 2007-05-21 20:21:03
Code: Select all
#процедура тестирования
sub test()
dim vector[2]
dim d[9]
d[0] = 8
d[1] = 9
d[2] = 6
d[3] = 7
d[4] = 5
d[5] = 3
d[6] = 4
d[7] = 1
d[8] = 2
var dn
while not uo.dead()
vector[0] = 0 #вектор отклонения всегда надо сбрасывать в 0
vector[1] = 0
away(5, 1, vector)
dn = (vector[1]+1)*3+vector[0]+1
uo.addstep(d[dn])
wait(500)
wend
end sub
#процедура получения вектора смещения на 1 клетку, учитывая зону где искать монстров и ограничение по статусу (крим, мурд и тд) (8 направлений)
sub away(distance, notoriety, vector)
var n
dim mobs[50]
n = findmobs(mobs, distance, notoriety)
if n <> -1 then
awayvector(mobs, n, vector)
dir(vector)
endif
end sub
#процедура нормализации вектора (в пределах 8-ми направлений)
sub dir(vector)
var x = abs(vector[0])
var y = abs(vector[1])
var m = max(x, y)
if m == 0 then
return
endif
if (x/m) > 0.7 then
vector[0] = -sig(vector[0])
else
vector[0] = 0
end if
if (y/m) > 0.7 then
vector[1] = -sig(vector[1])
else
vector[1] = 0
end if
endsub
#процедура получения списка мобов в радиусе, с учетом статуса (список серийников)
sub findmobs(mobs, distance, notoriety)
var i = 0;
uo.set('finddistance', distance)
uo.findtype(-1, -1, 'ground')
while uo.findcount()
if uo.isNpc('finditem') and (uo.GetNotoriety('finditem') >= notoriety) then
mobs[i] = uo.getserial('finditem')
i = i+1
endif
uo.ignore('finditem')
uo.findtype(-1, -1, 'ground')
wend
uo.ignorereset()
return i-1
endsub
#процедура ранжирования опасности моба (оставлено для импровизации)
sub rate(mob, x, y)
var l = x*x+y*y
if l > 0 then
return int(20/l)+1
endif
return 0
endsub
#процедура расчета сумарного вектора смещения
sub awayvector(mobs, n, vector)
dim x[40]
dim y[40]
var mx = uo.GetX()
var my = uo.GetY()
var score = 0
for var i = 0 to n
x[i] = uo.GetX(mobs[i])-mx
y[i] = uo.GetY(mobs[i])-my
score = rate(mobs[i], x[i], y[i])
vector[0] = vector[0]+x[i]*score
vector[1] = vector[1]+y[i]*score
next
endsub
#процедура получение знака
sub sig(k)
if k < 0 then
return -1
else
if k == 0 then
return 0
end if
end if
return 1
endsub
#процедура получение модуля
sub abs(n)
if n < 0 then
return -n
endif
return n
endsub
#процедура получение максимального
sub max(n, m)
if n > m then
return n
endif
return m
endsub
примерно так себе и представляю;) все самое интересное в оценке опасности моба