Логин:
Пароль:
Настройки
http://lfforever.ru/design/black.css http://lfforever.ru/design/ds_dw.css http://lfforever.ru/design/xmas.css
Присоединяйся к каналу LFF в Discord!
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Фан Форум для LF'айтеров » Игрострой » Модострой LF2 » Руководства и База знаний » [Перевод] О движке LF2
[Перевод] О движке LF2
20.02.15 11:56 | #1

Репутация: 416
Постов: 8072
Оригинальная статья


LF2 состоит из "объектов". В оригинале их не более 400, с порядковыми номерами 0-399. Движок LF2 проходится по всем этим объектам и делает всё необходимое с ними (рассчеты физики, показателей). Чтобы получить доступ к объекту, нам для начала требуется получить доступ к объекту через его адрес памяти. Это выглядит примерно так:

Цитата
mov eax,dword ptr ds:[esi+edi*4+194h]

(В PDK движке 194h везде заменено на 3ECh, - прим. переводчика)

Сейчас постараюсь объяснить что есть что.

eax - Место, куда будет сохранен адрес объекта. Операция MOV для переноса правого значения в левое, значения разделены запятыми.

esi - Назовем это "базовым указателем" (формулировка неверная, но так проще - прим. автора), оно всегда равно 458B00h.

edi - Это номер объекта. Как я упомнял раньше, LF2 пробегается по кругу через все объекты, поэтому использование этого регистра дает возможность доступа к любому объекту.

Поэтому эту строчку можно расшифровать как:
Цитата
mov eax, dword ptr ds:[458B00h+Номер_Объекта*4+194h]

*Используемые регистры в примере лишь для самого примера, в коде они могут отличаться (прим. автора)

Идем дальше (пример ниже не особо полезен - прим. автора):
Простейший способ проверить, существует ли объект или нет
Цитата
cmp byte ptr ds:[esi+edi+4],0

Если результат 0 - объект не существует, если 1 - существует.

После получения доступа к "Объекту", Вы можете получить доступ к его свойствам. Примерно так:
Цитата
mov dword ptr ds:[eax+70h],0

Эта строка устанавливает для объекта его Frame-кадр в номер 0.
Огромный список оффсетов (смещений) доступен в таблице: https://docs.google.com/spreads....E#gid=0
(прим. переводичка - для PDK\Neora актуальна другая таблица: https://docs.google.com/spreads....4338899 )

После подключения к объекту мы имеем доступ ко всем его свойствам, они указаны на первой странице таблицы. Чтобы получить доступ ко второй странице "ID Properties" нам нужно получить на него Указатель (Pointer).
Допустим, что мы уже сделали подключение к объекту как в первой строке, и этот адрес хранится в EAX:

Цитата
mov eax, dword ptr ds:[eax+368h] ; изменяем EAX указатель с первой страницы свойств на вторую, добавив +368h
cmp dword ptr ds:[eax+6f4h],10 ; теперь мы можем сделать проверку, является ли ID объекта равным 10


Если на пальцах, первая строчка подгружает указатель на область данных, где мы можем посмотреть ID объекта, получив предварительно указатель. После того как указатель получен, мы можем получать данные со второй страницы свойств объекта (наиболее полезные там это данные об ID и Type объекта)

Последнее, что осталось разобрать, это Frame-данные:
Цитата
mov eax,dword ptr ds:[esi+edi*4+194h] ; Получаем Указатель на объект (подключаемся к нему)
mov ecx,dword ptr ds:[eax+70h] ; Узнаем какой номер Frame-кадра у объекта, сохраняем его в ECX
mov edx,dword ptr ds:[eax+368h] ; Получаем указатель к ID-странице, сохраняем его в EDX
imul ecx,ecx,178h ; умножаем номер кадра, который мы держим в ECX, на 178, сохраняем результат в ECX
cmp dword ptr ds:[ecx+edx+7ACh],0 ; Теперь используем результат умножения и указатель на дату, чтобы проверить какой там state с помощью +7ACh

(Я не знаю, почему умножение именно на 178h. Кроме того в PDK\Neora умножения отличаются, используются куда более адские числа, которым так же трудно найти логическое объяснение, но чаще всего в новом движке это равно 1B0h - прим. переводчика)

Надеюсь всё становится ясно.
В основном всё имеет такой вид: номер кадра * 178h + указатель объекта + желаемый оффсет

~Написано (Lord) Silva
~Переведено Archer-Dante

01.03.15 17:20 | #2

Репутация: 11
Постов: 63
Так LF2 на ассемблере написан?
01.03.15 17:24 | #3

Репутация: 416
Постов: 8072
Favoras, нет.
01.03.15 17:26 | #4

Репутация: 11
Постов: 63
Archer, а на чем? Википедия молчит...
01.03.15 17:28 | #5

Репутация: 416
Постов: 8072
Favoras, LF2 написан на С++
Но не имея исходников мы можем его ковырять только на ассемблере, что успешно и делаем.

01.03.15 17:58 | #6

Репутация: 11
Постов: 63
Archer, мммм, сишечка... ну да, просто нигде инфы не видел, на чем он написан, видел только структуру библиотек подключаемых, вот и подумал, что на ассемблере. Спасибо.
01.03.15 18:02 | #7

Репутация: 416
Постов: 8072
Не сишечка, а сишечка++ :)

В ЛФ2 явно присутствуют так называемые "структуры" от С++
это наборы данных типа Х, Y, Z, ХП, МП, Команда, Номер Фрейма
и так далее
всё это есть те самые смещения +70 и другие. А в целом вся эта группа смещений - единая структура, которая содержит разнотипные данные.
Верный признак С++, даже если бы язык был тайной~

01.03.15 18:12 | #8

Репутация: 11
Постов: 63
special_tan "BINGO!" special_tan
01.03.15 19:16 | #9

Репутация: 11
Постов: 63
Ммм, а CMA.png и CMA2.png не поддерживают прозрачность, чтоль? Или в экзешнике что-то прописано для них, а точнее, черный цвет, как фоновый?


Прикрепленные файлы: 8441410.png (37.6 Kb)
02.03.15 10:24 | #10

Репутация: 416
Постов: 8072
Я не знаю зачем вы это пишите здесь
Никакого отношения к данной теме.

Фан Форум для LF'айтеров » Игрострой » Модострой LF2 » Руководства и База знаний » [Перевод] О движке LF2
  • Страница 1 из 1
  • 1
Поиск: