Yoko

All sides of Injection
It is currently 2025-11-05 20:44:46

All times are UTC+02:00




Post new topic  Reply to topic  [ 4 posts ] 
Author Message
PostPosted: 2007-05-21 20:21:03 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Code:
#процедура тестирования
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

примерно так себе и представляю;) все самое интересное в оценке опасности моба


Top
   
 Post subject:
PostPosted: 2007-05-21 20:30:02 
Offline
User avatar

Joined: 2007-02-21 20:15:57
Posts: 479
Code:
#процедура ранжирования опасности моба (оставлено для импровизации) 
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


Top
   
 Post subject:
PostPosted: 2007-05-21 20:48:25 
Offline
Expert!
User avatar

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

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

И потом не забывай что в инжекте математика ограничена... да и длина вектора там фигурирует косвенно...


Top
   
 Post subject:
PostPosted: 2007-05-21 21:46:11 
Offline
User avatar

Joined: 2007-02-21 20:15:57
Posts: 479
Той малой доли математики что есть в инжекте, хватит. Пишутся мобы в системе координат (Х=3;У=-5). Если моб средне агрессии, то убавляем значения, оставив знак. Получится (Х=2;У=-4). Так он станет ближе к чару, а значит и опснее (так сокращается вектор на еденицу).

_________________
Шард Антарес

Ururu


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 4 posts ] 

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited