Время прохождения тайлов

Author: Vladimir Chebotarev aka ex-lend

Calculation of tile passing time

Использовано сокращение: tile_id === tid

Если tile_id от 0x1C0 до 0x2FF, то клетка не проходима вообще. В этом случае дальше можно не читать

Используются два вспомогательных массива:

char a540A6[0x40] = 
{ 2, 3, 2, 4, 3, 4, 2, 2, 2, 2, 4, 4, 4, 4, ?, ?,
  3, 5, 3, 3, 1, 3, 2, 4, 2, 2, 4, 2, 4, 4, ?, ?,
  2, 3, 2, 4, 3, 4, 2, 4, 2, 2, 4, 2, 4, 4, ?, ?,
  5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 4, 4, 4, 4, ?, ? };

char a54126[0x10][2] = 
{ {2, 1}, {5, 1}, {4, 1}, {7, 1}, {6, 1}, {5, 6}, {3, 7}, {8, 6},
  {?, ?}, {?, ?}, {?, ?}, {?, ?}, {A, 1}, {?, ?}, {?, ?}, {?, ?}
};
 

Значение a54126[][] означает тип ландшафта:

1: land
2: grass
3: flowers
4: sand
5: cracked
6: stones
7: savanna
8: mountain
9: water
A: road
 

Для определения стоимости прохождения см. параметры Cost в файле map.reg
Стоимости по умолчанию (если не задана в map.reg):

CostLand 0x08
CostGrass 0x08
CostFlowers 0x09
CostSand 0x0E
CostCracked 0x06
CostStones 0x0C
CostSavanna 0x0B
CostMountain 0x10
CostWater 0x08
CostRoad 0x06

Значение a540A6[tid & 0x3F] означает соотношение разных типов ландшафта в одной клетке:

1: только a54126[(tid & 0x3C0) >> 6][1]
2: 3/4 a54126[(tid & 0x3C0) >> 6][1] и 1/4 a54126[(tid & 0x3C0) >> 6][0]
3: 1/2 a54126[(tid & 0x3C0) >> 6][1] и 1/2 a54126[(tid & 0x3C0) >> 6][0]
4: 1/4 a54126[(tid & 0x3C0) >> 6][1] и 3/4 a54126[(tid & 0x3C0) >> 6][0]
5: только a54126[(tid & 0x3C0) >> 6][0]
 

Соответственно, стоимость прохождения формируется из стоимости прохождения соответствующих типов ландшафта с соответствующими весовыми коэффициентами.

Использована информация из:

allods.exe:0055E93D(tile_id, addr) - подпрограмма вычисления стоимости прохождения
allods.exe:0055DF24 - заполнение вспомогательных массивов
allods.exe:0055E616 - инициализация alm - проставление карты стоимостей, высот и т.д.