ABC Assembler Guide
- Автор:Kuroneko
- Дата: 2021-01-12 12:22:52
- Комментарии: 0
- Категория: Обучение разным программам
- Просмотры: 667157Показать
Тема в разработке
Прошлый гайд по редактированию в байт-коде от "June Something"
Теория
Есть 2 варианта редактирования - непосредственно AS3, либо промежуточный байт-код AS3 (скомпилированный AS3, благодаря нему виртуальная машина Flash работает быстро). В новых версиях JPEXS реализовали перекомпиляцию отдельных пакетов при наличии playerglobal.swc, однако редактирование и перекомпиляция AS3 может привести к ошибкам, при этом даже не в плане синтаксиса. Редактировать AS3 в отличие от промежуточного байт-кода намного легче, но вы можете получить на выходе кирпич, а при редактировании промежуточного байт-кода и полном понимании как он работает (что-то выше ASM, если кто-то кодил на нем - сразу поймет что к чему) вы точно получите то, что хотели без ошибок. По редактированию промежуточного байт-кода учебников нет, даже на английском, разработчики Flash такую книгу не выпустят. Поэтому учитесь и осмысляйте структуры сами. Может кто-то даже напишет учебник. Здесь я рассмотрю примеры редактирования только промежуточного байт-кода.
Практика
1. Открываем главный исход в JPEXS (нажми на меня), жмем кнопку поиска вверху («Инструменты» -> поиск текста), вводим следующую фразу:
"name":"BAZOOKA.NAME"
Ничего не трогаем и жмем ОК, далее ждем минут 5-10, пока идет поиск. 2. После завершения поиска, откроется окошко со списком пакетов (имена будут в виде кракозябр, ничего страшного), это конфигурации оружия. Чтобы их открыть, жмем 2 раза на имя. [не рекомендуется закрывать окно с результатами поиска, так как позже они могут нам пригодиться]
Теперь мы можем:
• Изменить урон оружия: для этого ищем блок нужного оружия, это хэш-строка (или ассоциативный массив) вида {"id":"Название оружия", "price":"Цена оружия"}, в этом хэше ищем свойство вида "damage":new §хххх§(число), перемещаем курсор на число (НЕ нажимайте на «Редактировать» в главном окне, так как с вероятностью в 75%, вы сохраните исходник с повреждениями). Далее смотрим на окно справа, находим там строку вида pushbyte число, после чего нажимаем «Редактировать» (в окне справа, а не в середине), меняем число на нам нужный урон и жмем «Сохранить».
• Изменить цену оружия/шапки/артефакта/etc: для этого аналогичным способом изменим параметры "price":число и "realprice":число, где price - фузы, а realprice - рубины.
• Изменить способности шапок: аналогичным образом ищем пакеты по фразе HAT.SOMBRERO, далее меняем параметры, например, ищем хэш-строку с нужной шапкой, к примеру мне нужна шапка Сомбреро, поэтому нахожу хэш-строку, в которой ключ ID равен значению 1029 (ID шапок вы можете посмотреть в консольных командах) и name равен HAT.SOMBRERO, то есть нашли примерно такое:
{
"id":1029,
"name":"HAT.SOMBRERO",
"infinite":true,
"price":3300,
"realprice":33,
"requiredLevel":18,
"attack":2,
"hp":20,
"speed":1,
"requiredRating":1500,
"charConfig":
[
{
"iconClassName":"WormSombrero",
"charName":"worm"
},
{
"iconClassName":"BoxerSombrero",
"charName":"default",
"hideEars":"true",
"scale":0.1
}
]
}
Внимание! Заметьте, что здесь два ассоциативных массива вложены в обычный массив, на который указывает ключ «charConfig». (обычный массив выглядит так - [1, 2, 3, 4, 5] или так ["June", Bios", "Mel"], а ассоциативный массив выглядит так - {"Bios":15, "June":0, "Mel":"loli"}), при этом они могут быть вложены друг в друга: [{"ключ":значение}, {"другой ключ":"другое значение"}]. К примеру, мне нужно изменить скорость шапки, для этого перемещаем курсор ПЕРЕД числом скорости, в данном случае "speed":1, жмем мышкой между двоеточием и числом 1, справа в окне видим такое:
pushstring "speed"
pushbyte 1
Меняю pushbyte 1 на pushbyte 100, тем самым
меняю скорость на 100, если же вы хотите увеличить
числовые параметры более, чем на 127, то вам
нужно изменить тип! Посмотрим на следующую таблицу:
pushbyte от - 128 до 127
pushshort от -32768 до 32767
pushint от -2147483648 до 2147483647
То есть если нужно изменить скорость на 250, то
необходимо сменить тип:
pushshort 250
Если же вам нужно добавить значения - перемещаем курсор прямо перед вашим ассоциативным массивом, т.е. прямо перед фигурной скобкой, не после, а именно ДО!
Перед этой скобкой:
{
"id":1029,
"name":"HAT.SOMBRERO"
}
Справа меняем размерность, например, нужно добавить 2 параметра, поэтому: newobject 16 меняем на newobject 18, далее вставляем ваши значения, например, можно добавить туда 2 ассоциации:
первая ассоциация
pushstring "duration"
convert_s
pushbyte 23
вторая ассоциация (прямо под первой)
pushstring "frostDamage"
convert_s
pushbyte 50
3. После всех проделанных операций, жмем наверху кнопку «Сохранить». 4. Готово! Вы создали свой первый "кастомный" исходник. Обновите страницу. Если приложение не грузится/крашится плагин после ваших изменений - вы сделали что-то не так и испортили исходник, поэтому рекомендуется заранее иметь запасные копии на случай восстановления.
Если вы не можете изменить по этой инструкции - скачайте соответствующую литературу, а именно книгу Колина Мука по языку программирования AS3 (нажми на меня) и читайте.
Вступление
Что же такое "ABC Assembler"? Это "ActionScript byte-code assembler".
А именно, это скомпилированный AS3, благодаря нему AVM2 (виртуальная машина Flash) работает быстро. Проще говоря: Переводит обычный AS3, то есть, язык высокого уровня, в свой ассемблер, язык низкого уровня, чтобы процессор мог быстрее обрабатывать команды и выполнять код AS3. Именно этот ассемблер и называется байт-кодом
И да, перед тем, как идти смотреть мой курс уроков, советую для начала прочитать гайд по редактированию параметров предметов от Джуна. Да, сразу скажу, он сложный просто для того чтобы осознать сходу, относительно сложный. Но просто попробуйте выполнять всё пошагово так, как описано там, а там описано довольно подробно и понятно, если вчитываться. Для чего это читать? Во-первых, ранее я начинала знакомство с отладчиком "JPEX" в "Вормикс" именно с этого гайда, который раньше был в "F.A.Q.", потому что других каких-либо туториалов, а тем более в видеоформате, просто не было, либо же по качеству они были настолько плохими, что при просмотре не научили бы чему-то, а сделали бы только хуже, потому что записаны были достаточно тупыми и неквалифицированными людьми. Во-вторых, если Вы не сможете воспринять этой информации и повторить всё, как написано в гайде Джуна, — может, не стоит и начинать пытаться и стоит задуматься о том, что языки программирования это явно не Ваше дело? Я пришла с нулевыми знаниями и смогла разобраться. Хотя по-началу текст воспринимался сложно, хоть и сейчас кажется чем-то супер-лёгким для меня. И я задумывалась о том, смогу ли я разобраться, раз никаких видео нет и есть только текст. Ну, в итоге это укололо по самомнению, я собралась с силами и повторила всё, что было написано в гайде. И получила удовольствие от того, что смогла разобраться по тексту сама, а не под копирку следуя за видео.
Слушать меня или нет — дело сугубо Ваше личное. Но я в этом посте преследую цель не только записать для себя видео, чтобы не забыть даже если не буду практиковаться, а других видео по флешевому ассемблеру нет и не будет больше, думаю (ну, в смысле не от коммюнити теста, а именно гайды на ютюбе, как курс уроков). Моя методика будет, возможно, не совсем обычной, но я крайне НЕ СОВЕТУЮ читать учебники или сразу читать документацию и пытаться там что-то понять.
Курс уроков
К каждому уроку будут дополнительные задания на усвоение и практику материала + иногда ссылки на дополнительный материал
В дополнение к видео в текстовой форме будет тоже всё довольно подробно объяснено, но основной упор курса будет на видеоматериал
Урок 1
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Изменение параметров предметов, знакомство с "JPEX"
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 2
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Знакомство с константами, переменными и локальными регистрами
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 3
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
Стек: Представьте, что при выполнении кода есть ещё такое же окно чистое, только после каждой выполненной команды в байт-коде, процессор записывает в это чистое окно результат выполнения, числа и прочее, чтобы использовать это в дальнейшем. Например: Идёт сверху вниз по коду и складывает два значения, а затем в это второе чистое окно записывает, что нужно сделать с двумя значениями.
Пример:
Вот что такое стек. Только при этом, после каждой выполненной команды он записывает результат как бы сдвигая все прошлые, то есть двигая верхушку стека. Например, в данный момент он сложил 1 и 2 и занёс 3 в верхушку стека, подвинув все остальные числа вниз, как бы под эту тройку, а тройка в самой верхушке стека в данный момент. Потом идёт ниже по коду и уже тройка двигается вниз, ближе к середине стека. Как-то так.
Немного о параметрах тела функции
Каждая функция имеет своё тело функции, оно начинается так:
body — Декларация тела модуля
maxstack — Максимальная глубина стека
localcount — Число локальных переменных
initscopedepth — Размер стека для области видимости (это второй стек, помимо просто стека для операций и прочего) до входа в функцию
maxscopedepth — initscopedepth + максимальное число записей в стек области видимости этой функции
Например:
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Функции. Вызов функций. Тело в байт-коде у функции и флаги функций. Что такое стек?
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
Стек: Представьте, что при выполнении кода есть ещё такое же окно чистое, только после каждой выполненной команды в байт-коде, процессор записывает в это чистое окно результат выполнения, числа и прочее, чтобы использовать это в дальнейшем. Например: Идёт сверху вниз по коду и складывает два значения, а затем в это второе чистое окно записывает, что нужно сделать с двумя значениями.
Пример:
Пример кода
pushbyte 1 ; в стеке: 1
pushbyte 5 ; в стеке: 5, 1
add ; в стеке: 1 + 5
setlocal 1 ; в стеке: [пусто] (1+5 теперь хранятся в регистре 1)
pushbyte 1 ; в стеке: 1
pushbyte 5 ; в стеке: 5, 1
add ; в стеке: 1 + 5
setlocal 1 ; в стеке: [пусто] (1+5 теперь хранятся в регистре 1)
Вот что такое стек. Только при этом, после каждой выполненной команды он записывает результат как бы сдвигая все прошлые, то есть двигая верхушку стека. Например, в данный момент он сложил 1 и 2 и занёс 3 в верхушку стека, подвинув все остальные числа вниз, как бы под эту тройку, а тройка в самой верхушке стека в данный момент. Потом идёт ниже по коду и уже тройка двигается вниз, ближе к середине стека. Как-то так.
Объяснения от JPEXS
It's classic stack data structure as described in
https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
You push values into it and then you call other instructions which work with stack - they
pop() needed arguments off stack and then push results.
pushbyte 1 ; stack after: 1
pushbyte 5 ; stack after: 5, 1
add ; stack after: 1 + 5
setlocal 1 ; stack after: [empty] (1+5 is now stored in register 1)
There's also scope stack in AS3 P-code for handling scope. (pushscope instruction)
https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
You push values into it and then you call other instructions which work with stack - they
pop() needed arguments off stack and then push results.
pushbyte 1 ; stack after: 1
pushbyte 5 ; stack after: 5, 1
add ; stack after: 1 + 5
setlocal 1 ; stack after: [empty] (1+5 is now stored in register 1)
There's also scope stack in AS3 P-code for handling scope. (pushscope instruction)
Немного о параметрах тела функции
Каждая функция имеет своё тело функции, оно начинается так:
Пример кода
body
maxstack 3
localcount 1
initscopedepth 1
maxscopedepth 2
body
maxstack 3
localcount 1
initscopedepth 1
maxscopedepth 2
body — Декларация тела модуля
maxstack — Максимальная глубина стека
localcount — Число локальных переменных
initscopedepth — Размер стека для области видимости (это второй стек, помимо просто стека для операций и прочего) до входа в функцию
maxscopedepth — initscopedepth + максимальное число записей в стек области видимости этой функции
Например:
Пример кода
pushbyte 1
pushstring "a"
pushint 556
setlocal 1
Параметр maxstack в данном примере будет равен 3, так как число записей в стек равно трём (я полагаю, важны типы: byte, string, int. То есть, если уже зарезервировали место под тип байт для стека (maxstack 1), то можно вставлять сколько-угодно "pushbyte", но при этом нельзя будет записывать в стек тип "pushstring", так как для этого придётся расширить "maxstack" до двух)
Число localcount для данного примера будет равным 2, так как изначально нулевой регистр уже зарезервирован для функции (обозначает обращение к самому текущему классу, заменяя тем самым полноценное обращение, например, через опкод "getlex")
Все классы (скрипты) по-умолчанию при создании наследуют класс "Object" (то есть, наследуют общий класс для всех классов (скриптов))
При заходе в функцию, стек для области видимости пуст и имеет место для "maxscopestack" значений
Потому, у паблик функций значение "initialscopedepth" равно единице, так как её можно вызвать из любого класса в файле (потому область видимости "Global"
Для статик функций область видимости такова: Global -> Object class (класс функции) -> My class (static instance)
Соответственно, параметр "initialscopedepth" для статик функции равен 3
Так как при заходе в функцию стек области видимости пуст, и так как нулевой регистр содержит в себе "this" (обращение к самому классу и всему, что внутри него, т.е. "this" это и есть текущий класс), мы должны его записать в стек области видимости, чтобы иметь доступ ко всем переменным и методам этой области (класса, где создана функция)
Так же мы имеем область видимости самой функции (с доступом к локальным переменным), из-за чего "maxscopedepth" в нашем примере равняется 4: 3 (initscopedepth) + 1 (область видимости самой функции, т.е. внутри самой функции мы можем обращаться к её локальным переменным)
pushbyte 1
pushstring "a"
pushint 556
setlocal 1
Параметр maxstack в данном примере будет равен 3, так как число записей в стек равно трём (я полагаю, важны типы: byte, string, int. То есть, если уже зарезервировали место под тип байт для стека (maxstack 1), то можно вставлять сколько-угодно "pushbyte", но при этом нельзя будет записывать в стек тип "pushstring", так как для этого придётся расширить "maxstack" до двух)
Число localcount для данного примера будет равным 2, так как изначально нулевой регистр уже зарезервирован для функции (обозначает обращение к самому текущему классу, заменяя тем самым полноценное обращение, например, через опкод "getlex")
Все классы (скрипты) по-умолчанию при создании наследуют класс "Object" (то есть, наследуют общий класс для всех классов (скриптов))
При заходе в функцию, стек для области видимости пуст и имеет место для "maxscopestack" значений
Потому, у паблик функций значение "initialscopedepth" равно единице, так как её можно вызвать из любого класса в файле (потому область видимости "Global"
Для статик функций область видимости такова: Global -> Object class (класс функции) -> My class (static instance)
Соответственно, параметр "initialscopedepth" для статик функции равен 3
Так как при заходе в функцию стек области видимости пуст, и так как нулевой регистр содержит в себе "this" (обращение к самому классу и всему, что внутри него, т.е. "this" это и есть текущий класс), мы должны его записать в стек области видимости, чтобы иметь доступ ко всем переменным и методам этой области (класса, где создана функция)
Так же мы имеем область видимости самой функции (с доступом к локальным переменным), из-за чего "maxscopedepth" в нашем примере равняется 4: 3 (initscopedepth) + 1 (область видимости самой функции, т.е. внутри самой функции мы можем обращаться к её локальным переменным)
Объяснения, взятые с разработчика "RABCDAsm + ещё кого-то
All right, I believe that I've figured out the answer after some more research and thinking. The key to the puzzle was figuring out two more things.
All classes extend the Object class by default, as explained in this book.
On method entry, the scope stack is empty and has room for max_scope_stack values, as explained in chapter 3.3.3 of AVM2 Overview.
Therefore, the initial scope depth is: global -> Object class -> MyClass class (static instance)
And thus, the initial scope depth in this case is 3. I have noticed that functions outside classes have initial scope depth of 1 (the global scope only). And methods that are not static have initial scope depth of 4 (they also have MyClass object).
Because the scope stack is empty when we enter a method, and because register 0 holds the this object (which is the static instance, in the case of static methods, or the class itself if you prefer), we must push this object onto the scope stack so that we can access all the variables and methods on its scope chain. We have of course the scope of the method itself, which makes the max scope depth to be 4.
All right, I believe that I've figured out the answer after some more research and thinking. The key to the puzzle was figuring out two more things.
All classes extend the Object class by default, as explained in this book.
On method entry, the scope stack is empty and has room for max_scope_stack values, as explained in chapter 3.3.3 of AVM2 Overview.
Therefore, the initial scope depth is: global -> Object class -> MyClass class (static instance)
And thus, the initial scope depth in this case is 3. I have noticed that functions outside classes have initial scope depth of 1 (the global scope only). And methods that are not static have initial scope depth of 4 (they also have MyClass object).
Because the scope stack is empty when we enter a method, and because register 0 holds the this object (which is the static instance, in the case of static methods, or the class itself if you prefer), we must push this object onto the scope stack so that we can access all the variables and methods on its scope chain. We have of course the scope of the method itself, which makes the max scope depth to be 4.
Объяснения от JPEXS про параметры тела функции
maxstack is maximum depth of stack:
in this code:
pushbyte 1
pushstring "a"
pushint 556
setlocal 1
maxstack is 3, because 3 subsequent pushes are done - so the maximum stack height is 3.
initscopedepth - this is size of scope stack before entering the method,
maxscopedepth - this is initscopedepth + maximum number of pushes to scopestack in this
method
maxstack is maximum depth of stack:
in this code:
pushbyte 1
pushstring "a"
pushint 556
setlocal 1
maxstack is 3, because 3 subsequent pushes are done - so the maximum stack height is 3.
initscopedepth - this is size of scope stack before entering the method,
maxscopedepth - this is initscopedepth + maximum number of pushes to scopestack in this
method
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 4
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Структура байт-кода. Разбор часто встречающихся операторов
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 5
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Реальность такова, что если в массиве текущее число "newobject'ов" (число элементов массива) N, то число "maxstack" должно быть N+1 (если до этого оно было ниже, чем число элементов в массиве)
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Работа с массивами. Массивы и их виды
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Реальность такова, что если в массиве текущее число "newobject'ов" (число элементов массива) N, то число "maxstack" должно быть N+1 (если до этого оно было ниже, чем число элементов в массиве)
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 6
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Модификаторы "public", "protected", "private" и ключевое слово "this"
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 7
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Классы и наследование, конструкторы классов
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 8
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Циклы
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 9
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Оператор "switch-case"
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 10
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Советы для поиска по коду. Немного практических лайфхаков дизассемблирования
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 11
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Привязываю разные баффы к расе/оружиям
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 12
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Модифицирую разные скрипты оружий на практике и рассказываю что за что отвечает
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 13
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Добавление собственных карт/Изменение существующих
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 14
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Изменение звуков через анимейт и ффдек
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 15
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Учу разбирать и понимать логику взаимосвязанных между собою классов (функционал классов)
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 15
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Учу отлаживать скрипты на примере скрипта аптечек. Снова работа с переменными
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 16
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Возвращаюсь к редактированию параметров предметов (или карт) и объясняю конструкцию массива в байт-коде подробнее
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 17
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Реверсим чужие читы и берём из них функционал
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 18
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Рисуем собственное меню в стороннем swf и подключаем к игре
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 19
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Связываем элементы управления в стороннем подключаемом меню с игрой
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок 20
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Патчу обфусцированный файл с нуля
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Урок n
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
а
Видео: https://www.youtube.com/watch?v=COMING_SOON
Теория
а
Практика
Материал к уроку:
Д/з: https://pastebin.com/
Основная часть
А Вы думали, что кроме курса видеоуроков больше ничего не будет? Неет, это только начало)
К слову о документации со списком и описаниями опкодов — ею пользоваться нужно без фанатизма! Не пытайтесь даже открывать какие-либо заумные учебники по "AS3", ассемблеру или "ABC", даже если Вам их сразу дают. Просто смотрите видео из курса по порядку и практикуйтесь сами, старайтесь выполнять задания после каждого урока, даже если у Вас это не сразу получится и кажется сложным
Главное — Не запоминайте таблицу опкодов, не вчитывайтесь в неё с самого начала, она Вам, как и учебники, не поможет, а только сделает хуже
Список опкодов
Опкод | Название | Описание | Использование | Stack | Пример |
pushbyte | PushByte | Push byte value on stack | pushbyte value:null | ... -> ..., byteValue | pushbyte 69 |
Заключительная часть
Репозиторий с релизами декомпилятора под Flash: https://github.com/jindrapetrik/jpexs-decompiler/releases
Документация по функциям в AS3 (и прочему об ActionScript3): https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/
Гайды по отрисовке объектов в AS3: https://sodocumentation.net/actionscript-3/topic/1628/working-with-display-objects
Документация по AVM2 (ActionScript Virtual Machine): https://www.adobe.com/content/dam/acom/en/devnet/pdf/avm2overview.pdf
Документация по оптимизации кода в AS3: https://static.packt-cdn.com/downloads/1383_Chapter15.pdf
Документация по спецификации SWF-файлов (описание устройства .swf и его байт-кода, много чего полезного): https://www.adobe.com/content/dam/acom/en/devnet/pdf/swf-file-format-spec.pdf
Документация по опкодам: https://pastebin.com/nyjXLizV
About color transformations: https://boulderappsco.postach.io/post/uint-to-6-digit-rgb-hex-tostring-16-actionscript-3-0-as3