Логин:
Пароль:
Настройки
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 » Обучение ~ Neora School~
Обучение ~ Neora School~
18.01.15 23:34 | #1

Репутация: 416
Постов: 8072


Тема данная создана для сбора информации о том, каким вещам обучаются в этой некой "Школе Неоры". На примере собственного проекта Neora стараюсь показывать и объяснять принципы работы движка LF2, научить работать с ним, работе с DLL-патчами и ЕХЕ.

Сюда же входит работа, разумеется, с языком программирования Assembler, но специально ради DLL - его разновидности Masm32.

Работаем в основном с Cheat Engine, Immunity Debugger, RadASM 2 + Masm.











Если есть какие-то вопросы, обсуждения
Или даже если есть желание записаться на всё это
То милости просим, тема всегда открыта :)

Прикрепленные файлы: 7280398.png (489.8 Kb) · 6062637.png (38.8 Kb) · 7964062.png (34.6 Kb)
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
24.01.15 23:02 | #2

Репутация: 416
Постов: 8072


Включает в себя:
* - старые адреса лф2
* - информацию о занятости ячеек Неорой
* - смещения PDK
* - мелкие исправления оригинальной таблицы от Сильвы&Ko













Прикрепленные файлы: 7624581.png (75.6 Kb) · 5770853.png (68.3 Kb) · 2430066.png (64.5 Kb) · 3583420.png (43.3 Kb)
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
26.01.15 09:47 | #3

Репутация: 0
Постов: 9
Как удалить кнопку в главном меню, например избавится от vs mod
26.01.15 09:59 | #4

Репутация: 416
Постов: 8072
От VS вполне просто, потому что этот режим находится выше всех остальных, у него ID 0. Каждый режим имеет свой ID.
Достаточно будет просто запретить игре торчать на 0-м ID, а с конца возвращаться сразу в 1-й (Stage Mode) (по факту там не 1, но для примера).
Сложнее будет, если нужно перемещать какой-то другой пункт из середины списка, тогда придется поправлять координаты всех остальных надписей, ведь это всё рисунки, и у каждой отдельно указаны координаты смещения вниз относительно предыдущего.

Я не делал подобных странных вещей, но частично уже находил адреса связанные с пунктами меню. И записывал в таблицу ЛИРА, можешь поискать там, чтобы меньше мучаться.

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
26.01.15 10:19 | #5

Репутация: 416
Постов: 8072
Кстати, для общего образования.
До изменения DLL Сильвой, он был вот этим патчем для Старкрафта

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
27.01.15 06:55 | #6

Репутация: 416
Постов: 8072
Ковырял интересные вещи.
Как оказалось, например, weapon_hp подгружается для всех объектов абсолютно. Оно есть у персонажей, у снарядов, у предметов, у всего. Но именно предметы с гравитацией как-то взаимодействуют с этим. Другие объекты просто не имеют применения этому.
Можно их найти вместо авторов лф2

Добавил инфу об этом в таблицу Лира.




Господа, таблица Лира очень сильно переделана.
Добавил тонну информации и почистил мусор от оригинальных авторов.
Оставил только всё самое необходимое.
И дополнил информацией от себя, алгоритмом работы считывания приемом и т.д.


box_tan

Прикрепленные файлы: 5423300.jpg (20.4 Kb)
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
20.02.15 15:40 | #7

Репутация: 416
Постов: 8072
В таблице появилось немало поправок разного характера, а так же обновлено много информации из записей Картера. Приятного пользования.
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
23.02.15 22:03 | #8

Репутация: 122
Постов: 854
Archer, Спассибо за игру. можешь удалять оттуда
05.03.15 18:57 | #9

Репутация: 416
Постов: 8072
Закрыто.
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
31.03.15 01:58 | #10

Репутация: 416
Постов: 8072
Просто оставлю это здесь - пример о том, как в одной из игры идет расчет использования спрайтов на ASM
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
01.04.15 03:46 | #11

Репутация: 416
Постов: 8072
Хочу сообщить вам, что убил несколько часов на полный разбор работы % вероятности работы (и вообще принципа работы) Картеровских атрибутов внутри ITR.
Но это ещё не всё!
Я полностью разобрал на составляющие принцип работы рандома движка LF2 и всех его разновидностей!

Теперь всё по полочкам и разжевано в обоих случаях, и настолько просто и ясно, что можно смело пользоваться всеми этими уловками для получения собственных фич для движка.

Именно для развития Неоры я желал исследовать эти функции, и теперь они как на ладони, осталось лишь пользоваться :)

Чтобы ознакомиться с этим, заходите в таблицу ЛИРА на страницу Исследований!
Приятного хакинга кодинга!

IN YOUR FACE KARTER! ><

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
01.04.15 15:25 | #12

Репутация: 122
Постов: 854
Archer, Предлагаю еще вариант для тех, кому надо попроще: разобрать что надо пушить в функцию, где будет результат, какие регистры при этом портятся.

Отличная работа! Мне не хотелось детально копаться в алгоритме работы, мне хватало разборов отрисовок. дада, их ведь две. одна - сразу через BitBlt (где нужно совершать кучу телодвижений, но у меня заработать не захотела), а другая для сеток спрайтов.

[ Маленький Фриз говорит: это сообщение было отредактировано!]
01.04.15 17:55 | #13

Репутация: 416
Постов: 8072
zapashok
Цитата
Предлагаю еще вариант для тех, кому надо попроще: разобрать что надо пушить в функцию, где будет результат, какие регистры при этом портятся.

В большинстве случаев нет чего-то обязательного что нужно сохранять и т.д., всё опционально. В 90% случаев в игре резервируется EAX только.
Но я дополню потом несколькими строчками информацию, ладно.

Цитата
Отличная работа! Мне не хотелось детально копаться в алгоритме работы, мне хватало разборов отрисовок. дада, их ведь две. одна - сразу через BitBlt (где нужно совершать кучу телодвижений, но у меня заработать не захотела), а другая для сеток спрайтов.

И где же результаты ваших исследований, ссссссударь?
Уж не собираетесь ли вы подобно остальным хоронить часом?!

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
01.04.15 19:08 | #14

Репутация: 122
Постов: 854
Archer, мои исследования более скудны. но.. для первой функции, BitBlt, инфу можно прочесть в инете. мне она в итоге не сильно помогла, т.к. большую часть сам для себя открыл.
А вот по поводу второй функции:

Текст ее (на всякий случай): МНОГА БУКАВ
Код
0043F010  /$ 53             PUSH EBX
0043F011  |. 56             PUSH ESI
0043F012  |. 57             PUSH EDI
0043F013  |. 55             PUSH EBP
0043F014  |. 89E5           MOV EBP,ESP
0043F016  |. 89CB           MOV EBX,ECX
0043F018  |. 8B45 1C        MOV EAX,DWORD PTR SS:[EBP+1C]
0043F01B  |. 85C0           TEST EAX,EAX
0043F01D  |. 7D 07          JGE SHORT Neora.0043F026
0043F01F  |. 8B7B 04        MOV EDI,DWORD PTR DS:[EBX+4]
0043F022  |. 31F6           XOR ESI,ESI
0043F024  |. EB 14          JMP SHORT Neora.0043F03A
0043F026  |> 3B43 0C        CMP EAX,DWORD PTR DS:[EBX+C]
0043F029  |. 0F8F 3C010000  JG Neora.0043F16B
0043F02F  |. 8B7483 10      MOV ESI,DWORD PTR DS:[EBX+EAX*4+10]            отступ в изображении по оси х
0043F033  |. 8BBC83 B00F000>MOV EDI,DWORD PTR DS:[EBX+EAX*4+FB0]           длина спрайта
0043F03A  |> 8B45 14        MOV EAX,DWORD PTR SS:[EBP+14]
0043F03D  |.-E9 5232BC0F    JMP neora_1.10002294                           твое шаманство с размером окна
0043F042  |. 39D0           CMP EAX,EDX
0043F044  |. 0F8D 21010000  JGE Neora.0043F16B
0043F04A  |. 8D0C07         LEA ECX,DWORD PTR DS:[EDI+EAX]
0043F04D  |. 85C9           TEST ECX,ECX
0043F04F  |. 0F8E 16010000  JLE Neora.0043F16B
0043F055  |. 85C0           TEST EAX,EAX
0043F057  |. 7D 08          JGE SHORT Neora.0043F061
0043F059  |. 29C6           SUB ESI,EAX
0043F05B  |. 01C7           ADD EDI,EAX
0043F05D  |. 31C0           XOR EAX,EAX
0043F05F  |. EB 08          JMP SHORT Neora.0043F069
0043F061  |> 39D1           CMP ECX,EDX
0043F063  |. 7E 04          JLE SHORT Neora.0043F069
0043F065  |. 29D1           SUB ECX,EDX
0043F067  |. 29CF           SUB EDI,ECX
0043F069  |> 57             PUSH EDI
0043F06A  |. 56             PUSH ESI
0043F06B  |. 50             PUSH EAX
0043F06C  |. 8B45 1C        MOV EAX,DWORD PTR SS:[EBP+1C]
0043F06F  |. 85C0           TEST EAX,EAX
0043F071  |. 7D 07          JGE SHORT Neora.0043F07A
0043F073  |. 8B7B 08        MOV EDI,DWORD PTR DS:[EBX+8]
0043F076  |. 31F6           XOR ESI,ESI
0043F078  |. EB 0E          JMP SHORT Neora.0043F088
0043F07A  |> 8BB483 E007000>MOV ESI,DWORD PTR DS:[EBX+EAX*4+7E0]       отступ в изображении по оси у
0043F081  |. 8BBC83 8017000>MOV EDI,DWORD PTR DS:[EBX+EAX*4+1780]      высота спрайта
0043F088  |> 8B45 18        MOV EAX,DWORD PTR SS:[EBP+18]
0043F08B  |.-E9 1232BC0F    JMP neora_1.100022A2                       опять шаманство
0043F090  |. 39D0           CMP EAX,EDX
0043F092  |. 0F8D D3000000  JGE Neora.0043F16B
0043F098  |. 8D0C07         LEA ECX,DWORD PTR DS:[EDI+EAX]
0043F09B  |. 85C9           TEST ECX,ECX
0043F09D  |. 0F8E C8000000  JLE Neora.0043F16B
0043F0A3  |. 85C0           TEST EAX,EAX
0043F0A5  |. 7D 08          JGE SHORT Neora.0043F0AF
0043F0A7  |. 29C6           SUB ESI,EAX
0043F0A9  |. 01C7           ADD EDI,EAX
0043F0AB  |. 31C0           XOR EAX,EAX
0043F0AD  |. EB 08          JMP SHORT Neora.0043F0B7
0043F0AF  |> 39D1           CMP ECX,EDX
0043F0B1  |. 7E 04          JLE SHORT Neora.0043F0B7
0043F0B3  |. 29D1           SUB ECX,EDX
0043F0B5  |. 29CF           SUB EDI,ECX
0043F0B7  |> 57             PUSH EDI
0043F0B8  |. 56             PUSH ESI
0043F0B9  |. 50             PUSH EAX
0043F0BA  |. 8B03           MOV EAX,DWORD PTR DS:[EBX]
0043F0BC  |. FF30           PUSH DWORD PTR DS:[EAX]
0043F0BE  |. E8 DDF8FFFF    CALL Neora.0043E9A0
0043F0C3  |. 50             PUSH EAX
0043F0C4  |. 8B4D 28        MOV ECX,DWORD PTR SS:[EBP+28]
0043F0C7  |. 51             PUSH ECX
0043F0C8  |. E8 D3F8FFFF    CALL Neora.0043E9A0
0043F0CD  |. 50             PUSH EAX
0043F0CE  |. 31D2           XOR EDX,EDX
0043F0D0  |. 837D 20 01     CMP DWORD PTR SS:[EBP+20],1
0043F0D4  |. 75 03          JNZ SHORT Neora.0043F0D9
0043F0D6  |. 80CA 01        OR DL,1
0043F0D9  |> 8B03           MOV EAX,DWORD PTR DS:[EBX]
0043F0DB  |. 8378 08 20     CMP DWORD PTR DS:[EAX+8],20
0043F0DF  |. 75 03          JNZ SHORT Neora.0043F0E4
0043F0E1  |. 80CA 02        OR DL,2
0043F0E4  |> 84D2           TEST DL,DL
0043F0E6  |. 75 29          JNZ SHORT Neora.0043F111
0043F0E8  |. 68 2000CC00    PUSH 0CC0020
0043F0ED  |. 8B75 F0        MOV ESI,DWORD PTR SS:[EBP-10]
0043F0F0  |. 8B7D FC        MOV EDI,DWORD PTR SS:[EBP-4]
0043F0F3  |. 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14]
0043F0F6  |. 8B4D F8        MOV ECX,DWORD PTR SS:[EBP-8]
0043F0F9  |. 50             PUSH EAX
0043F0FA  |. 51             PUSH ECX
0043F0FB  |. FF75 E4        PUSH DWORD PTR SS:[EBP-1C]
0043F0FE  |. 56             PUSH ESI
0043F0FF  |. 57             PUSH EDI
0043F100  |. FF75 E8        PUSH DWORD PTR SS:[EBP-18]
0043F103  |. FF75 F4        PUSH DWORD PTR SS:[EBP-C]
0043F106  |. FF75 E0        PUSH DWORD PTR SS:[EBP-20]
0043F109  |. FF15 DC754500  CALL DWORD PTR DS:[4575DC]               ;  GDI32.BitBlt
0043F10F  |. EB 4E          JMP SHORT Neora.0043F15F
0043F111  |> F6C2 01        TEST DL,1
0043F114  |. 74 08          JE SHORT Neora.0043F11E
0043F116  |. 31C9           XOR ECX,ECX
0043F118  |. 8B1D 6C764500  MOV EBX,DWORD PTR DS:[45766C]            ;  MSIMG32.TransparentBlt
0043F11E  |> F6C2 02        TEST DL,2
0043F121  |. 74 1A          JE SHORT Neora.0043F13D
0043F123  |. 8B1D 68764500  MOV EBX,DWORD PTR DS:[457668]            ;  MSIMG32.AlphaBlend
0043F129  |. 8B4D 20        MOV ECX,DWORD PTR SS:[EBP+20]
0043F12C  |. C1E1 08        SHL ECX,8
0043F12F  |. 8B45 24        MOV EAX,DWORD PTR SS:[EBP+24]
0043F132  |. 84C0           TEST AL,AL
0043F134  |. 75 02          JNZ SHORT Neora.0043F138
0043F136  |. 0C FF          OR AL,0FF
0043F138  |> 88C1           MOV CL,AL
0043F13A  |. C1E1 10        SHL ECX,10
0043F13D  |> 51             PUSH ECX
0043F13E  |. 8B75 F0        MOV ESI,DWORD PTR SS:[EBP-10]
0043F141  |. 8B7D FC        MOV EDI,DWORD PTR SS:[EBP-4]
0043F144  |. 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14]
0043F147  |. 8B4D F8        MOV ECX,DWORD PTR SS:[EBP-8]
0043F14A  |. 56             PUSH ESI
0043F14B  |. 57             PUSH EDI
0043F14C  |. 50             PUSH EAX
0043F14D  |. 51             PUSH ECX
0043F14E  |. FF75 E4        PUSH DWORD PTR SS:[EBP-1C]
0043F151  |. 56             PUSH ESI
0043F152  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
0043F155  |. 57             PUSH EDI
0043F156  |. FF75 E8        PUSH DWORD PTR SS:[EBP-18]
0043F159  |. 50             PUSH EAX
0043F15A  |. FF75 E0        PUSH DWORD PTR SS:[EBP-20]
0043F15D  |. FFD3           CALL EBX
0043F15F  |> FF15 28704400  CALL DWORD PTR DS:[<&GDI32.DeleteDC>]    ; |\DeleteDC
0043F165  |. FF15 28704400  CALL DWORD PTR DS:[<&GDI32.DeleteDC>]    ; \DeleteDC
0043F16B  |> C9             LEAVE
0043F16C  |. 5F             POP EDI
0043F16D  |. 5E             POP ESI
0043F16E  |. 5B             POP EBX
0043F16F  \. C2 1800        RETN 18

Пример вызова (из меня):
Код
    PUSH EBP                            это значение я не до конца вдуплил, поэтому тщательно стараюсь быть привязан к местам, где оно есть и используется
  PUSH 0                    что за значение я тоже не вкурил. проверять все вызовы для сверки в использовании - мне лень
  MOV DL,BYTE PTR DS:[EBX+455CB7h]             не воспринимать
  PUSH 1                    прозрачность (ты в ЛИРЕ менял прозрачность у кнопки Playback Recording)
  PUSH EDX                            номер спрайта
  PUSH EDI                            координата у
  PUSH ESI                            координата х
  MOV ECX,DWORD PTR DS:[44FD7Ch]      Сама пикча.
  CALL [CallFunc2]

В самой функции уже идет разделение на использование BitBlt или же некоего альфаблендера.

Больше в функции я не разбирался, вобщемто. Я тупо сидел и прослеживал ход выполнения ее для отрисовки циферок хп. все значения, которые записывались, я записывал. нашел что нужно изменять для работы и стал использовать.

Цитата Archer ()
Уж не собираетесь ли вы подобно остальным хоронить часом?!

Как понимать эту Вашу фразу, сударь?

02.04.15 08:59 | #15

Репутация: 416
Постов: 8072
Цитата
0043F03D |.-E9 5232BC0F JMP neora_1.10002294 твое шаманство с размером окна

не, ниче не знаю ;D

Код сам по себе хоть и относительно понятно описал, в дебагере тоже есть кучка комментов от программы, и в целом их много и хватает. Не скажу, что лучше описывает, пока не пробовал что-то дополнительное отрисовать) но это - новые горизонты.

В целом, посре разбора рандома и отрисовки, останется одно - разрабор загрузки игры, и парсинг дат-файлов в каждую ячейку памяти, чтобы потом из этого создавать нормальные теги и атрибуты свои.
Пожалуй это главные высоты~

Цитата
Как понимать эту Вашу фразу, сударь?

Уже ничего, уже поведал)

Ну что, ассемблер - всё же приятно легкий язык, нэ? :3

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
06.04.15 15:53 | #16

Репутация: 122
Постов: 854
Хотел бы поведать про полный цикл прогрузки новых файлов изображений (пока что только изображений. ничего. доберусь и до остальных) и их отрисовку.

Начну с хранения изображения со спрайтной сеткой на примере PDK'шного BARS.png
Указатель на участок памяти, выделенный под информацию о изображении, хранится по адресу 44FD7C. Через него и происходит обращение к изображению.
В нулевом смещении этого участка хранится адрес, нужный непосредственно при отрисовке.
Далее хранятся размеры изображения
Затем количество спрайтов в сетке
В смещении +10h начинается массив значений смещений слева для спрайтов. Т.е. начало отдельно взятого спрайта по горизонтали/слева/по оси х. Еще раз: для нулевого спрайта смещение будет +10h, для первого спрайта будет 14h
В смещении +7E0h массив значений ширины спрайта
В смещении +FB0h начинается массив значений смещений сверху
В смещении +1780h массив значений высоты спрайта
Я пытался задать в сетке спрайт с другими значениями высоты/ширины, но спрайт был таких же размеров, как и остальные. Потом попробую еще раз, ведь всегда есть человеческий фактор

Еще раз информация выше в виде небольшой таблички:
Код
Пусть в ECX записано указатель на участок памяти с информацией о изображении, тогда:
      [ECX]- адрес, нужный при отрисовке
[ECX+4h] - ширина изображения
[ECX+8h] - высота изображения
[ECX+0Ch] - количество спрайтов в сетке
[ECX+10h] - начало массива отступов слева
[ECX+7E0h] - начало массива ширины спрайтов
[ECX+0FB0h] - начало массива отступов сверху
[ECX+1780h] - начало массива высоты спрайтов


Теперь переходим к загрузке изображения. Для начала нам нужно 4 свободных байта для хранения указателя на адрес в памяти с информацией об изображении.
Через длл проблем с выделением не возникает. В секции .data можно просто добавить следующую строку:
File1 dd 0h
Также при загрузке файла нам потребуется путь+имя файла. Например:
File1_str db "sprite\BARS2.png",0

Теперь рассмотрим два случая загрузки файлов. Первый - при запуске игры (там еще есть меню с настройками управления и стартом игры). Второй - во время загрузки (дял оригинала - старт игры, для PDK - загрузка уровня).
Думаю, что желательно вклиниваться в один из этих процессов, дабы вероятность проблем была минимальна (очистка памяти после выхода из игры. я не уверен на 100%, что в других местах с этим не будет проблем. да и нет особого смысла извращаться помоему). Для упрощения задачи могу подсказать адрес с кучей пустого пространства во время прогрузки данных при запуске игры (запуске, не старте):
Код
004274AB   . 90             NOP

Выше этого адреса как раз завершилась запись сетки какого-то файла. Какого - дело не наше.

Перейдем к загрузке изображения. Из кучи команд выше возьмем только то что нам нужно:
Код
MOV ESI,0043EE30h            Адрес функции выделения памяти и сохранения информации, не будем вдаваться в подробности ее работы
       PUSH EBX                     EBX обнулялся (судя по коду), поэтому это эквивалентно PUSH 0. На что именно влияют эти параметры я еще не понял
       PUSH EBX                     но это так много раз повторяется, что такая запись короче на байт (а после 10 вызовов загрузок на 20 байт)
       MOV EAX, offset File1_str    Передаем в функцию строку       
       PUSH EAX                     с путем+именем файла
       CALL ESI
       POP EAX                      "Вынимаем" адрес в памяти. (EAX становится указателем. это так, к слову)
       MOV File1,EAX                Записываем этот адрес в заранее подготовленную ячейку

Ячейку для хранения адреса в памяти мы записали в блоке .data и инициализировали, записав туда 0. Поэтому можно запросто проверить произошла ли загрузка этого изображения или нет:
Код
MOV EAX,File1
TEST EAX,EAX

или       

CMP File1,0

Эти две команды идентичны.

И после всех этим мучений мы переходим.. К еще большим мучениям!
Базовая функция отрисовки - GDI32.BitBlt. В игре она используется для копирования прямоугольника из изображения на экран.
Пример ее использования а заодно и о передаваемых параметрах, ниже:

Код
0041AFE1  |> 68 2000CC00    |PUSH 0CC0020                          ; /ROP = SRCCOPY.    Режим. В данном случае это копирование прямоугольной области
0041AFE9  |. 6A 1E          |PUSH 1E                    ; |YSrc = 1E (30.)   Отступ слева
0041AFEB  |. 6A 00          |PUSH 0                    ; |XSrc = 0          Отступ справа
0041AFF0  |. 53             |PUSH EBX                    ; |hSrcDC            Дескриптор изображения
0041AFF1  |. 6A 0A          |PUSH 0A                    ; |Height = A (10.)  Высота
0041AFF3  |. 50             |PUSH EAX                    ; |Width             Ширина
0041AFF4  |. 52             |PUSH EDX                    ; |YDest             Координата Y
0041AFF5  |. 51             |PUSH ECX                    ; |XDest             Координата X
0041AFF6  |. 55             |PUSH EBP                    ; |hDestDC           Дескриптор целевого устройства
0041AFF7  |. FF15 DC754500  |CALL DWORD PTR DS:[4575DC]            ; \BitBlt

Тут мы натыкаемся на два подводных камня. Откуда нам взять дескриптор? Для его получения существует встроенная функция. Пример ее вызова для получения дескриптора BARS.png представлен ниже:

Код
0041AFA3  |. 8B0D 7CFD4400  |MOV ECX,DWORD PTR DS:[44FD7C]           
0041AFA9  |. 8B11           |MOV EDX,DWORD PTR DS:[ECX]
0041AFAB  |. FF32           |PUSH DWORD PTR DS:[EDX]
0041AFAD  |. E8 EE390200    |CALL Neora.0043E9A0
примечание: нужно не запутаться в количествах "извлечения" значения по адресу.

В результате в EAX мы получаем адрес дескриптора изображения. Осталось дескриптор целевого устройства.
Для его получения в ячейке 457BC8h хранится необходимый адрес. Полный алгоритм тогда будет:

Код
MOV EBP,DWORD PTR DS:[457BC8h]
         PUSH EBP
         CALL 0043E9A0

Опять же, результат мы получаем в EAX.

Казалось бы, этого должно быть достаточно, но все не так просто. После получения дескриптора нам нужно его освободить. Поэтому для каждого получения дескриптора нужно добавлять пару строк:

Код
PUSH EBP                      ; |/hDC         Хоть и очевидно, но все же: тут может быть и другой регистр
CALL DWORD PTR DS:[447028h]   ; |\DeleteDC


Таким образом мы можем отрисовать область типа "прямоугольник", НО без прозрачности. Для изображений с прозрачностью (целиком) и отрисовки спрайтов из сетки используется встроенная функция. Пример (рисует панельку в верхней панели, т.е. файл FRAME):

Код
0041AF37  |> 55             /PUSH EBP                       Тут то самое значение из 457BC8h, т.е. было выполнено MOV EBP,DWORD PTR DS:[457BC8h]
0041AF38  |. 6A 00          |PUSH 0                         Некоторый параметр, что именно делает - не знаю
0041AF3A  |. 6A 01          |PUSH 1                         Прозрачность. 0/1
0041AF3C  |. 6A FF          |PUSH -1                        -1 - изображение целиком, 0-x - номер спрайта
0041AF3E  |. 57             |PUSH EDI                       Координата по Y
0041AF3F  |. 56             |PUSH ESI                       Координата по X
0041AF40  |. 8B0D A8114500  |MOV ECX,DWORD PTR DS:[4511A8]  Адрес изображения в памяти
0041AF46  |. E8 C5400200    |CALL Neora.0043F010
примечание: В зависимости от типов файлов будет меняться принцип прозрачности. Для BMP это будет черный цвет, а для PNG будет использоваться альфа-канал

Тут все проще. Функция сама определяет дескрипторы и очищает. Но нельзя выбрать область отрисовки. Поэтому способ для извращенцев:
Для спрайта номером, допустим, 5 записываем необходимые значения отступов и ширины/высоты. Далее вызываем функцию для отрисовки 5 спрайта. Нам рисует то, что нам надо. Затем возвращаем все как было.

На это все. Спасибо за прочтение.

[ Маленький Фриз говорит: это сообщение было отредактировано!]
07.04.15 05:30 | #17

Репутация: 416
Постов: 8072
добавил картеровские chp и cmp, эта парочка атрибутов записывается таки в память даты, но атрибут нерабочий, с его адресом хранения нет никаких связанных операций :(
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
25.08.15 14:11 | #18

Репутация: 19
Постов: 287
Прописываю вот так во параметр "shp:", но количество хп не меняется, что не так?

<bmp_begin>
name: DeepClon
shp: 250
head: sprite\sys\deep_f.bmp
small: sprite\sys\deep_s.bmp
file(0-69): sprite\sys\deep_0.bmp  w: 79  h: 79  row: 10  col: 7
file(70-139): sprite\sys\deep_1.bmp  w: 79  h: 79  row: 10  col: 7
file(140-209): sprite\sys\deep_2.bmp  w: 79  h: 79  row: 10  col: 7
walking_frame_rate 3
walking_speed 8.000000
walking_speedz 3.900000
running_frame_rate 3
running_speed 15.500000
running_speedz 2.600000
heavy_walking_speed 4.500000
heavy_walking_speedz 2.100000
heavy_running_speed 7.500000
heavy_running_speedz 1.450000
jump_height -16.299999
jump_distance 9.000000
jump_distancez 3.750000
dash_height -10.000000
dash_distance 16.000000
dash_distancez 5.000000
rowing_height -2.000000
rowing_distance 5.000000
<bmp_end>

[ Маленький Фриз говорит: это сообщение было отредактировано!]
25.08.15 20:16 | #19

Репутация: 416
Постов: 8072
ReiVShiN, shp не существует начиная с 2.05
а вообще вам в эту тему
эта тема уже давно не актуальна, я её прикрою.

вырезка из информации об апдейте
Цитата
- "shp:" изменено в "start_hp:"

- "smp:" изменено в "start_mp:"

Но т.к. Неора 2.05-2.07 прототипная, описание особенностей этих версий ещё не были перенесены в шапку темы.
Если хочется именно shp: то следует оставаться на 2.04 , или просто не рисковать по каким-то причинам , делая на прототипе)

Прошу прощения, если какие-то сложности создаю, и если они есть - сообщайте.
Надеюсь в той теме найдете всю нужную для себя информацию.

Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity
10% of programming skills
10% of tan levels in your blood.
Фан Форум для LF'айтеров » Игрострой » Модострой LF2 » Обучение ~ Neora School~
  • Страница 1 из 1
  • 1
Поиск: