Как получить координаты обратные данным? (часть 2)

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Как получить координаты обратные данным? (часть 2)

Post by Grin »

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

примерно так себе и представляю;) все самое интересное в оценке опасности моба
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Code: Select all

#процедура ранжирования опасности моба (оставлено для импровизации) 
sub rate(mob, x, y)
   
   var l = x*x+y*y
   if l > 0 then
      return int(20/l)+1
   endif
   return 0
   
endsub

А разве нельзя типы мобов вбить в VAR и по типам отличать их опасность?
Например при минимальной опасности оставить вектор неизменным. При средней, убавлять длинну вектора на 1, при высшей опасности, убавлять длинну вектора на 2.
Шард Антарес
Ururu
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Ururu wrote:А разве нельзя типы мобов вбить в VAR и по типам отличать их опасность?
Например при минимальной опасности оставить вектор неизменным. При средней, убавлять длинну вектора на 1, при высшей опасности, убавлять длинну вектора на 2.

ну так для кого написано:
1. все самое интересное в оценке опасности моба
2. #процедура ранжирования опасности моба (оставлено для импровизации)

И потом не забывай что в инжекте математика ограничена... да и длина вектора там фигурирует косвенно...
Ururu
Posts: 479
Joined: 2007-02-21 20:15:57

Post by Ururu »

Той малой доли математики что есть в инжекте, хватит. Пишутся мобы в системе координат (Х=3;У=-5). Если моб средне агрессии, то убавляем значения, оставив знак. Получится (Х=2;У=-4). Так он станет ближе к чару, а значит и опснее (так сокращается вектор на еденицу).
Шард Антарес
Ururu
Post Reply