Page about Rage of Mages

[ru] [en]  
[0] [1] [2]

 
  

Vision area calculation

Author: Vladimir Chebotarev aka ex-lend
Categories: RoM 2, Technical

В первую очередь формируются две вспомогательные таблицы (не зависящие от карты):
short a28000[41][41]; // вспомогательная таблица 1
char a22000[41][41][2]; // вспомогательная таблица 2 (корректировка координат)

// вспомогательные значения
int a2A004 = 7; // map.reg/Scanning/ScanShift (если не задано, то 7)
int a2A000 = 1 << a2A004;

for (int i = 0; i <= 20; ++i)
{
	for (int j = 0; j <= 20; ++j)
	{
		short d = i || j ? pow(i*i+j*j, 0.5)/max(i,j)*a2A000 : 0;

		a28000[20+i][20+j] = d;
		a28000[20+i][20-j] = d;
		a28000[20-i][20+j] = d;
		a28000[20-i][20-j] = d;

		if (j < (i / 2)) // тут мб неточно
		{
			a22000[20+i][20+j][0] = -1;
			a22000[20+i][20+j][1] = 0;
			a22000[20-i][20-j][0] = 1;
			a22000[20-i][20-j][1] = 0;
			a22000[20+i][20-j][0] = -1;
			a22000[20+i][20-j][1] = 0;
			a22000[20-i][20+j][0] = 1;
			a22000[20-i][20+j][1] = 0;
		}
		else if (j > (i * 2)) // тут мб неточно
		{
			a22000[20+i][20+j][0] = 0;
			a22000[20+i][20+j][1] = -1;
			a22000[20-i][20-j][0] = 0;
			a22000[20-i][20-j][1] = 1;
			a22000[20+i][20-j][0] = 0;
			a22000[20+i][20-j][1] = 1;
			a22000[20-i][20+j][0] = 0;
			a22000[20-i][20+j][1] = -1;
		}
		else
		{
			a22000[20+i][20+j][0] = -1;
			a22000[20+i][20+j][1] = -1;
			a22000[20-i][20-j][0] = 1;
			a22000[20-i][20-j][1] = 1;
			a22000[20+i][20-j][0] = -1;
			a22000[20+i][20-j][1] = 1;
			a22000[20-i][20+j][0] = 1;
			a22000[20-i][20+j][1] = -1;
		}
	}
}

// информация из allods2.exe:0055C324
При ScanShift == 7 таблицы выглядят так:

Таблица 1 (a28000[][]):
  012345678910111213141516171819202122232425262728293031323334353637383940
 0 181176172167163160156152149146143140137135133131130129128128128128128129130131133135137140143146149152156160163167172176181
 1 176181176171167163158155151147144141138136134132130129128128128128128129130132134136138141144147151155158163167171176181176
 2 172176181176171166162157153150146143140137134132131129128128128128128129131132134137140143146150153157162166171176181176172
 3 167171176181175170165161156152148144141138135133131129128128128128128129131133135138141144148152156161165170175181176171167
 4 163167171175181175170164160155150146143139136134131130128128128128128130131134136139143146150155160164170175181175171167163
 5 160163166170175181175169163158153149145141137134132130129128128128129130132134137141145149153158163169175181175170166163160
 6 156158162165170175181174168162157152147143139135133130129128128128129130133135139143147152157162168174181175170165162158156
 7 152155157161164169174181174167161155150145140137133131129128128128129131133137140145150155161167174181174169164161157155152
 8 149151153156160163168174181173166160153148143138134131129128128128129131134138143148153160166173181174168163160156153151149
 9 146147150152155158162167173181172165158151145140136132130128128128130132136140145151158165172181173167162158155152150147146
 10 143144146148150153157161166172181172163156149143137133130128128128130133137143149156163172181172166161157153150148146144143
 11 140141143144146149152155160165172181171162153146140134131128128128131134140146153162171181172165160155152149146144143141140
 12 137138140141143145147150153158163171181170160150143136131128128128131136143150160170181171163158153150147145143141140138137
 13 135136137138139141143145148151156162170181168157147139133129128129133139147157168181170162156151148145143141139138137136135
 14 133134134135136137139140143145149153160168181166153143134129128129134143153166181168160153149145143140139137136135134134133
 15 131132132133134134135137138140143146150157166181163149137130128130137149163181166157150146143140138137135134134133132132131
 16 130130131131131132133133134136137140143147153163181160143131128131143160181163153147143140137136134133133132131131131130130
 17 129129129129130130130131131132133134136139143149160181153134128134153181160149143139136134133132131131130130130129129129129
 18 128128128128128129129129129130130131131133134137143153181143128143181153143137134133131131130130129129129129128128128128128
 19 128128128128128128128128128128128128128129129130131134143181128181143134131130129129128128128128128128128128128128128128128
 20 1281281281281281281281281281281281281281281281281281281281280128128128128128128128128128128128128128128128128128128128128
 21 128128128128128128128128128128128128128129129130131134143181128181143134131130129129128128128128128128128128128128128128128
 22 128128128128128129129129129130130131131133134137143153181143128143181153143137134133131131130130129129129129128128128128128
 23 129129129129130130130131131132133134136139143149160181153134128134153181160149143139136134133132131131130130130129129129129
 24 130130131131131132133133134136137140143147153163181160143131128131143160181163153147143140137136134133133132131131131130130
 25 131132132133134134135137138140143146150157166181163149137130128130137149163181166157150146143140138137135134134133132132131
 26 133134134135136137139140143145149153160168181166153143134129128129134143153166181168160153149145143140139137136135134134133
 27 135136137138139141143145148151156162170181168157147139133129128129133139147157168181170162156151148145143141139138137136135
 28 137138140141143145147150153158163171181170160150143136131128128128131136143150160170181171163158153150147145143141140138137
 29 140141143144146149152155160165172181171162153146140134131128128128131134140146153162171181172165160155152149146144143141140
 30 143144146148150153157161166172181172163156149143137133130128128128130133137143149156163172181172166161157153150148146144143
 31 146147150152155158162167173181172165158151145140136132130128128128130132136140145151158165172181173167162158155152150147146
 32 149151153156160163168174181173166160153148143138134131129128128128129131134138143148153160166173181174168163160156153151149
 33 152155157161164169174181174167161155150145140137133131129128128128129131133137140145150155161167174181174169164161157155152
 34 156158162165170175181174168162157152147143139135133130129128128128129130133135139143147152157162168174181175170165162158156
 35 160163166170175181175169163158153149145141137134132130129128128128129130132134137141145149153158163169175181175170166163160
 36 163167171175181175170164160155150146143139136134131130128128128128128130131134136139143146150155160164170175181175171167163
 37 167171176181175170165161156152148144141138135133131129128128128128128129131133135138141144148152156161165170175181176171167
 38 172176181176171166162157153150146143140137134132131129128128128128128129131132134137140143146150153157162166171176181176172
 39 176181176171167163158155151147144141138136134132130129128128128128128129130132134136138141144147151155158163167171176181176
 40 181176172167163160156152149146143140137135133131130129128128128128128129130131133135137140143146149152156160163167172176181

Таблица 2 (a22000[][][]):
  012345678910111213141516171819202122232425262728293031323334353637383940
 0 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20  
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 


Далее, берем пустую таблицу размером 41x41 и записываем в центр (20; 20) число равное ((int)обзор << a2A004) + (1 << (a2A004 - 1)). Для обзора, например, 15.1 и ScanShift=7 получится 1984.
Теперь идем по всем направлениям от этой клетки.
(x0, y0) - клетка, где находится персонаж. Пусть мы находимся в клетке (x1, y1). Пусть известно значение в таблице в клетке (x2, y2),
x2 = x1 + a22000[y1][x1][0], y2 = y1 + a22000[y1][x1][1].
Иначе говоря, таблица a22000[][][] задает клетку относительно данной, из которой мы будем брать предыдущее значение видимости.
Так вот, видимость[y1][x1] = видимость[y2][x2] - высота[y1][x1] + высота[y0][x0] - a28000[y1][x1].
Если видимость больше 0, то клетка видна, иначе - нет.

Информация взята из подпрограмм:
allods2.exe:0055CC18(?, x_y) - вычисление области видимости для юнита
allods2.exe:0055CAE8(offsetX, offsetY, pointOffset, curAlt) - вычисление заданной ячейки таблицы видимости

Discussion (0)