[ Новые сообщения · Участники · Правила форума · Поиск · RSS ] |
|
Фан Форум для LF'айтеров Игрострой Модострой LF2 Обучение ~ Neora School~ |
Обучение ~ Neora School~ |
Тема данная создана для сбора информации о том, каким вещам обучаются в этой некой "Школе Неоры". На примере собственного проекта Neora стараюсь показывать и объяснять принципы работы движка LF2, научить работать с ним, работе с DLL-патчами и ЕХЕ. Сюда же входит работа, разумеется, с языком программирования Assembler, но специально ради DLL - его разновидности Masm32. Работаем в основном с Cheat Engine, Immunity Debugger, RadASM 2 + Masm. Если есть какие-то вопросы, обсуждения
Или даже если есть желание записаться на всё это То милости просим, тема всегда открыта :)
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity 10% of programming skills 10% of tan levels in your blood. |
Включает в себя: * - старые адреса лф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. |
От 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. |
Кстати, для общего образования.
До изменения 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. |
Ковырял интересные вещи.
Как оказалось, например, weapon_hp подгружается для всех объектов абсолютно. Оно есть у персонажей, у снарядов, у предметов, у всего. Но именно предметы с гравитацией как-то взаимодействуют с этим. Другие объекты просто не имеют применения этому. Можно их найти вместо авторов лф2 Добавил инфу об этом в таблицу Лира. Прикрепленные файлы:
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. |
В таблице появилось немало поправок разного характера, а так же обновлено много информации из записей Картера. Приятного пользования.
Coding in Assembly requires a mix of:
80% of brain, passion, intuition, creativity 10% of programming skills 10% of tan levels in your blood. |
Просто оставлю это здесь - пример о том, как в одной из игры идет расчет использования спрайтов на 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. |
Хочу сообщить вам, что убил несколько часов на полный разбор работы % вероятности работы (и вообще принципа работы) Картеровских атрибутов внутри 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. |
Archer, Предлагаю еще вариант для тех, кому надо попроще: разобрать что надо пушить в функцию, где будет результат, какие регистры при этом портятся.
Отличная работа! Мне не хотелось детально копаться в алгоритме работы, мне хватало разборов отрисовок. дада, их ведь две. одна - сразу через BitBlt (где нужно совершать кучу телодвижений, но у меня заработать не захотела), а другая для сеток спрайтов. [ Маленький Фриз говорит: это сообщение было отредактировано!] |
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. |
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 или же некоего альфаблендера. Больше в функции я не разбирался, вобщемто. Я тупо сидел и прослеживал ход выполнения ее для отрисовки циферок хп. все значения, которые записывались, я записывал. нашел что нужно изменять для работы и стал использовать. Как понимать эту Вашу фразу, сударь? |
Цитата 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. |
Хотел бы поведать про полный цикл прогрузки новых файлов изображений (пока что только изображений. ничего. доберусь и до остальных) и их отрисовку.
Начну с хранения изображения со спрайтной сеткой на примере 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 спрайта. Нам рисует то, что нам надо. Затем возвращаем все как было. На это все. Спасибо за прочтение. [ Маленький Фриз говорит: это сообщение было отредактировано!] |
добавил картеровские 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. |
Прописываю вот так во параметр "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> [ Маленький Фриз говорит: это сообщение было отредактировано!] |
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. |
| |||
| |||