You are not logged in.
Pages: 1
Доброго времени суток, ребята. А особо в этой теме приветствуются люди знающие и/или участвовавшие в разработке скриптовых движков, в частности CLEO/SunnyBuilder.
/* немного автобиографии
Давно пишу скрипты для SA, и последние мои разработки сводились к сплошной работе с адресами памяти напрямую.
И я подумал, раз так, то почему бы не использовать вообще отдельную программу? Тогда юзеру даже не придётся ставить клео, качать скрипт. Тем более, включение и выключение будет максимально удобным (крестик в окошечке рулит, как никак). Так я подумал, когда хотел сделать себе сохранялку координат на клео. Расставлял тачки в сампе, а когда заглянул в окно СанниБилдера, понял, что получать координаты из сампа он категорически отказывается. А с файлами через скрипты я как работать не умел, так и не умею (кстати, тема для мануала). В то время я считал, что команда сохранения координат пашет только в режиме дебага самп-сервера (а оказалось, что работает она везде, просто не отображает какой-либо результат). Так что выход был один - использовать отдельную программку. И мне пришлось много париться, т.к. знал намного меньше, нежели сейчас. Изобретал велосипед, но учился...
В данный момент я как-то редко захожу в SA и ещё реже в Билдер, т.к. игра наскучила. Разве что, когда просят, делаю людишкам скрипты. Вообще, всё, что можно, придумано и реализовано (хотя не совсем, я лично создал пару новинок). И вот пал мой взгляд на другие игры, где можно было бы весело издеваться над игровой механикой. А для этого я решил сперва поискать инфу (ничего не нашёл), а потом и взять дело "в свои руки". Я вовсе не стремлюсь к славе и распространению своих наработок, мне лишь нужен удобный инструмент, который будет самостоятельно раскапывать бездонные структуры, добираясь до того, с чем удобно будет работать непосредственно скриптеру. Весьма вероятно, что Seemann когда-то думал точно так же.
*/
Это было, так сказать, предисловие. Собственно, основное:
Возможно эти слова будут слишком громкими, но всё же.
Планирую создать нечто вроде клео, но не для гта. Значит конкурентом данному проекту я не буду никоим образом.
Но для начала мне нужна отправная точка. Имеются некоторые вопросы относительно создания скриптового движка:
* На чём удобнее создавать? С++ или Delphi? // Изначально я учил паскаль/дельфи, так что лично мне удобнее работать с ним, но слышал, что Си наиболее гибок, среди языков высокого уровня. Стоит ли полностью переходить на Си?
* Каким образом можно внедрить код отдельных скриптов в процесс игры? //Неужто через построчное считывание скрипта, проверку в каждой строчке на имя команды (в СанниБилдере - опкод) и дальнейшую работу с переданными параметрами (в соответствии с командой)?
* Чем копать EXE? // Я, например, юзал как иду, так и олли дебаг. Ещё круто ворочает ассемблерный код программка TSearch. Я даже много чего находил и записывал всё в блокнотик. Проблема в том, что этой информации много, хранится она в неудобном виде и достаётся оттуда с трудом.
* Неужели вся работа клео-опкодов постороена на прямой работе с памятью? // В смысле, как происходит работа скрипта? Внутри игры или посредством "топорных" чтения и записи в адреса памяти?
Естественно разжёвывать всё это я не прошу. Тут возможно огромное кол-во подробностей, я уверен. Прошу лишь описать что-то вкратце, на что-то дать ссылки.
Опыт показывает, что пока за дело не возьмёшься лично ты, оно не тронется ничуть, несмотря на то, касается ли оно других. И сейчас я думаю о том, насколько хорошо то, что когда-то Seemann взялся за создание CLEO. Вот я, например, многое узнал благодаря работе в Билдере. Я благодарен автору. Я, будучи начинающим программером, нашёл применение навыков в деле, полезном не одному мне. Я создал десятки скриптов, за которые мне были благодарны люди. Но самое главное: ко мне обращались за помощью. У меня спрашивали, что и как. И, чёрт возьми, я учил их и показывал. Разве это не прекрасно? Благое дело, как никак. Вот ещё одна причина, по которой я уж очень хочу создать скриптовый язык, движок.
И, что бы вы тут не написали, спасибо за внимание.
Last edited by dragonforce (05-12-2010 23:21)
Offline
По твоим комментариям не скажешь, что ты учил Паскаль
Мне больше нравится Си, хотя сильных отличий я не вижу. Не очень хорошо знаю, как работает КЛЕО, но думаю, что так, как ты описал.
Offline
мне лишь нужен удобный инструмент, который будет самостоятельно раскапывать бездонные структуры
это называется мозг.
На чём удобнее создавать? С++ или Delphi?
какой язык знаешь, на таком и пиши. мне лично знание только дельфи никак не мешало писать программы и хаки.
Каким образом можно внедрить код отдельных скриптов в процесс игры?
для этого стоит хотя бы знать, как работает обработчик скриптов в гта. пожалуй, самое простое решение (опкоды).
Чем копать EXE?
IDA. Очень удобная и мощная программа (+ встроенный отладчик).
Неужели вся работа клео-опкодов постороена на прямой работе с памятью?
Смотри исходники CLEO 1. Принципиально ничего не поменялось.
По теме. Иногда проще взять уже готовые наработки типа Lua или Pawn, чем писать собственный язык. Тот же Lua относительно легко встраивается в любую программу, позволяя управлять ей.
Как вариант, можно покопаться на sf.net и поискать готовые интерпретаторы для скриптовых языков
http://sourceforge.net/softwaremap/?&fq[]=trove%3A49
Offline
Поправлю ссылочку
http://sourceforge.net/softwaremap/?&fq … trove%3A49
Offline
По теме. Иногда проще взять уже готовые наработки типа Lua или Pawn, чем писать собственный язык. Тот же Lua относительно легко встраивается в любую программу, позволяя управлять ей.
Ну а он хочет с нуля всё переписать. Флаг в руки, мышку в зубы и вперде!
Честно говоря не думал что для этой игры можно ещё что-то придумать, так как всё что было возможно придумать, уже придумано. Вот возьмитесь лучше Source Engine ломать, благо есть исходники
Offline
Кажется тут поднимаются вопросы, с которыми я недавно имел тесное взаимодействие.=) Первым делом несколько ссылок.
1) Драконова книга Ахо, Лам, Сети, Ульмана. Это классический учебник по проектированию компиляторов и интерпретаторов.
2) cleo script compiler. Мой простенький вариант компилятора скриптов для CLEO. В открытом доступе отсутствует, но из обсуждения может кое-что проясниться в плане разработки компилятора для своих нужд.
3) C4. (Де)компилятор скриптов для GTA 4. Судя по разговорам, которые ходят по тому форуму, разрабатывается что-то, по своей сложности сравнимое с разработкой самой GTA.:D
Теперь по проектированию "языка", хотя на самом деле тут все ступорится не в "язык", а в программу, обрабатывающую этот язык - компилятор или интерпретатор. Возможны 2 варианта - компилируемый язык или интерпретируемый язык. Отсюда 2 различных варианта реализации.
[large]1 Компилируемый язык.[/large]
Используется, когда скриптовый движок основан на последовательном выполнении команд, записанных в бинарном формате - байт-коде. В частности скриптовый движок игр GTA действует именно по такому принципу. В этом случае задача программы-компилятора сводится к переводу исходного текста программы (понятного программисту) в машинный байт-код (понятный обработчику скрипта, т.е. скриптовому движку). Возможный вариант реализации такого компилятора:
1) Препроцессор. Его задача - обработка спец-инструкций программы, называемых директивами препроцессора. Сюда относятся директивы подключения внешних модулей (#include), условной компиляции (#define, #ifdef, #ifndef, #endif) и проч. Также препроцессор может выполнять удаление комментариев из текста программы.
2) Сканер. Выполняет сканирование исходного текста программы и разбивает его на последовательность отдельных значащих лексем (ключевые слова, имена переменных, константы, операторы математических выражений, знаки препинания).
3) Парсер. Самая сложная часть компилятора. Теоретически тут очень много разных вариантов - выделяют нисходящие, восходящие парсеры разных уровней - в зависимости от синтаксиса языка. Я предлагаю не заморачиваться и взять C-подобный синтаксис, потому что он спроектирован таким образом, что возможен разбор программы без предпросмотра на n-ное количество лексем вперед (я гарантирую, это возможно). То есть возможен вариант нисходящего парсера нулевого уровня.
Довольно-таки большая и неочевидная в реализации часть парсера - это разборщик математических выражений. Тут следует пользоваться проверенным алгоритмом обратной польской нотации (в википедии приведено несколько вариантов этого алгоритма).
4) Машинонезависимый оптимизатор высокоровневого представления. В общем виде тут все понятно. Этот этап может отсутствовать или неявно входить в состав парсера.
5) Кодогенератор. Формирует из высокоуровневого представления машинозависимое низкоуровневое представление.
6) Машинозависимый оптимизатор низкоуровневого представления. Аналогично этот этап может отсутствовать или неявно входить в состав кодогенератора.
7) Сборщик-компановщик. Преобразует низкоуровневое представление в последовательность байтов (байт-код) и записывает все это в исполняемый файл. Это финальный этап и после него программа готова к исполнению скриптовым движком.:cool:
[large]2 Интерпретируемый язык.[/large]
Используется, когда отсутствует как таковой скриптовый движок. В этом случае проектируется интерпретатор, который бы одновременно разбирал исходный код программы (скрипта) и исполнял его. То есть в данном случае не требуется переводить программу из высокоуровневого представления в низкоуровневое и сохранять ее в исполняемый файл, зато требуется написать функциональный аналог скриптового движка.
Этапы разработки интерпретатора:
1-4) То же самое, что и в случае с компилятором.
5) Здесь подразумевается дальнейшее исполнение того внутреннего представления программы, которое ты получил в предыдущих этапах.
Last edited by Alien (06-12-2010 15:52)
Offline
Довольно-таки большая и неочевидная в реализации часть парсера - это разборщик математических выражений. Тут следует пользоваться проверенным алгоритмом обратной польской нотации (в википедии приведено несколько вариантов этого алгоритма).
когда я писал компилятор для SB 3 (который так и не дошел до релиза), это было самой мощной и интересной его частью. Компилятор мог "разгребать" выражения любого уровня сложности (всякие приоритеты, скобки, минусы как подвид умножения на -1 (например 1@ = -(5@*2@+1) и т.д.) Польская запись тут идеальный вариант.
Offline
dragonforce
Написали всего много все по делу. Добавлю пару вещей от себя.
Исходники скриптового движка SA я выкладывал. Они полностью работающие. (Но, там подход такой, что лучше так не делать). В VCS подход более красивый, в IV почти хорошо и в RDR стало совсем хорошо.
(Но скриптовая часть IV и RDR у меня еще не в том состоянии, чтобы можно было выкладывать).
Примеров, действительно, много. Есть подробные и красивые, например: http://habrahabr.ru/blogs/programming/99162/ (там уже до 10й части дописано).
Беда в том, что общепринятая теория компиляции фундаментально не верна.
Там делается большой упор на автогенерируемый лексер и парсер, что позволяет легко и просто писать небольшие трансляторы, но не дает написать что-то сложное (т.е. транслятор K&R C сделать - элементарно, а вот C99, не говоря уже о C++ - умаешься).
Читать для начала, если уровень английского позволяет, лучше не Dragon Book, а RCT. Там краткое изложение теории компиляции дается страниц на 30. (Да, оно капитально устарело. Да, там полно концептуальных ошибок - но это единственная нормальная работа на эту тему).
Готовых инструментов для раскапывания структур - просто нет. IDA - это единственное, что есть, и то, она помогает не очень сильно (она ничего не знает ни про объекты, ни о наследовании, ни, тем более, о шаблонах). Hex-Rays скорее мешает, чем помогает. Максимум, в нем можно посмотреть, что делает какая-нибудь особо хитрая идиома. Так что, процентов 80 делается в уме.
Alien
3) C4. (Де)компилятор скриптов для GTA 4. Судя по разговорам, которые ходят по тому форуму, разрабатывается что-то, по своей сложности сравнимое с разработкой самой GTA.
Дело не сколько в сложности, сколько в отсутствии свободного времени. При рабочей неделе в ~80 часов, особо не попрограммишь. Максимум, удается выкроить часик, чтобы покопаться в коде.
Компилятор-то там работает. Проблема в том, что без полностью работающего декомпилятора, написать ничего сложнее "Нello world" не получится. Нужно полностью восстанавливать сегмент .globals (а он большой) и, желательно, библиотеки, которые инлайнятся в каждый скрипт.
Offline
должно быть, я немного зазнался, поставив перед собой настолько сложную цель.
давно же я не посещал этот форум.. впрочем, благодарю всех за ответы.
а всем безумцам, решившим создать свой скриптовый язык (или прочие подобные вещи) я хочу сказать, что ВСЁ реализуется в C++, причём довольно просто.
пожалуй, я познал это для себя, открыв возможности си ;D
прикрепляю к посту свою последнюю на сегодняшний день разработку - проигрыватель онлайн-радиостанций для gta sa. может похвастаться некоторыми полезными настройками.
выполнен в виде .asi-плагина. написал на C++ за одну ночь)
всегда мечтал о подобном плагине и скорее всего я такой не один.
подробнейший ридми аж на двух языках прилагается к архиву, настоятельно рекомендуется прочесть его перед использованием.
p.s. Админы, если можно, переименуйте меня в мой нынешний ник: BritishColonist.
p.p.s. К сожалению ничего не прикрепилось. как заливать-то?
Last edited by dragonforce (22-08-2011 06:01)
Offline
Размер аттача ограничен 300кб, и некоторые расширения файлов отклоняются (например, exe).
Offline
куда позволительно залить архив с плагином, дабы скинуть сюда линк?
Offline
народ.ру, айфолдер, мегааплоад... все, кроме летитбит.
Offline
народ.ру, айфолдер, мегааплоад... все, кроме летитбит.
Можно один вопросик ,а почему нельзя на летибит, чисто из любопытства. А по поводу онлайн радио это действительно круто!
Offline
пожалуйста:
http://www.megaupload.com/?d=ULESG7UJ
обязательно расскажите друзьям, если понравится.
и куда его тут можно положить, чтобы его заметили или нашли из поиска?)
Last edited by dragonforce (22-08-2011 19:53)
Offline
не думаю, что это особо сложно, только вот зачем? он и так работает через обычный bass.dll (в этом-то и всё удобство).
Offline
не думаю, что это особо сложно, только вот зачем? он и так работает через обычный bass.dll (в этом-то и всё удобство).
Так bass.dll без плагина WMA-поток не воспроизводит!
Offline
Вот такой вопрос: Как на PhP написать интерпритаор? Хочу попробовать создать скриптовый язык!
Пишу на PhP 2 года!
Offline
Pages: 1