Как получить координаты обратные данным? (часть 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.
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
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). Так он станет ближе к чару, а значит и опснее (так сокращается вектор на еденицу).
Шард [b]Антарес[/b]
[color=blue][b]Ururu[/b][/color]
Post Reply