у меня есть странное желание делиться знаниями. собственно поэтому появился этот сайт) ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
статистика для меня пока неожиданная) для проголосовавших: кто хочет, чтобы я проводил на сайте уроки по lua? Начнём с вещей, никак не связанных с Worms, с помощью которых вы поймёте, что такое lua и как изучать скрипты в Worms4(типы данных, управляющие структуры, таблицы, метатаблицы, окружения, реализация объектов и наследования, разные фичи для понимания и анализа того, что делает lua код). Затем, получив достаточные знания, вы поймёте, как работает lua в worms4, а ещё самое важное - вы поймёте, как исследовать возможности, которые вам даёт lua в worms4. К тому же у вас пропадёт боязнь пробовать делать lua моды.
По второй части(lua в worms4) мне кто-нибудь(например Krash) будет помогать, ибо мне это не так интересно=) Я могу объяснить базовые принципы, конкретные хорошие примеры я привести не смогу.
--Вызывает функцию f --При возникновении ошибки при выполнении функции --на панель комментариев будет выведено описание --ошибки с указанием файла и строки, где она произошла function DebugCall(f) res,err=pcall(f) if not res then SetData("Text.TestComment",err) lib_Comment("Text.TestComment") end end
----------------------------- --Пример использования: --testedFunction - функция, в которой может быть ошибка --callerFunction - функция, из которой вызывается testedFunction(в Worms это к примеру TurnStarted) function testedFunction() --тут где-то ошибка end
function callerFunction() --Безопасный вызов DebugCall(testedFunction ) end
сначала мне надо, чтобы хотя бы 4 человека сказали, что будут участвовать в обучении, ибо я хочу его сделать в форме диалога, а не в форме справочника. То есть сделаю ветку на форуме, там буду делать темы, примерно такие: Intro: Урок 1. Что такое lua? Настройка интерпретатора. Первая программа. Базовые знания: Урок 2. Переменные. Урок 3. Управляющие структуры. Урок 4. Таблицы. Урок 5. Функции. Локальные переменные. Урок 6. Стандартные модули. Урок 7. Немного об алгоритмах Расширенные знания: Урок 8. Метатаблицы Урок 9. ООП на lua Урок 10. Модули. Урок 11. Окружения. Lua в Worms: Урок 12. Об интерпетаторе в Worms Урок 13. Анализ действий Worms Урок 14. Worms API Урок 15*. Некоторые моды.
Уроки буду проводить в форме диалога с этими 3-4 человеками. Т.е. написал основную инфу по теме, жду ответов учеников, отвечаю на вопросы, по возможности глубже всё это дело раскрываю.
Вообще уроки хочу организовать, чтобы привести и свои знания в порядок)
============================================= Оставляем заявки на обучение=) Только обязательное условие - не халявить с этим, активно участвовать и не кидать на половине процесса.
это очень нужно, но я не помогу. ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
я не твоё изучение редактора имел ввиду, а тему ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
народ, проголосовавший за "Не знаю, но хочу изучить" меня удивляет) вы чё молчите? ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
то есть начинать?? мне нужен активный просмотр того, что я буду писать, а не так, чтобы я написал, а в ответ никакой реакции ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
Раздел полностью посвящён последовательному изучению lua. Изучение разобьём на несколько уроков. Постепенно изучим всё что надо. Каждый урок будет состоять сначала из моего бреда, который надо прочитать и попробовать на практике, а потом из общих обсуждений и вопросов. План уроков примерно такой(буду менять по ходу написания уроков): Intro: Урок 1. Что такое lua? Общий трёп. Урок 2. Установка и настройка интерпретатора. Первая программа. Базовые знания: Урок 3. Переменные. Урок 4. Управляющие структуры. Урок 5. Таблицы. Урок 6. Функции. Локальные переменные. Урок 7. Стандартные модули. Урок 8. Немного об алгоритмах Расширенные знания: Урок 9. Метатаблицы Урок 10*. ООП на lua Урок 11. Модули. Урок 12. Окружения. Lua в Worms: Урок 13. Об интерпетаторе в Worms Урок 14. Анализ действий Worms Урок 15. Worms API Урок 16*. Некоторые моды.
Итак, начинаем наше обучение=) Для начала надо разобраться с тем, что такое lua, в чём его "сила", что даст его знание. Ну и как работать с lua.
Lua - это язык программирования. Его создали какие-то студенты или профессора, что-то такое. Эти студенты были португальцами, поэтому они назвали свой язык Lua, что переводится как "луна". Но это никому интересно, поэтому сразу о том, что такое lua в плане применения. Lua - язык для написания скриптов. Под скриптом понимается небольшая программка, которая исполняется другой программой. При этом скрипт расширяет функции основной программы, делает её более гибкой и динамичной.
В нашем случае основная программа - Worms. Разработчики Worms(дядьки, постоянно глотающие пиво и сидящие в Team17) захотели, чтобы каждую карту можно было описывать не в коде самой игры, а отдельно. Зачем? Много причин: 1) для того чтобы получить программу, её нужно скомпилировать. Компиляция - анализ каждой строчки файла, проверка синтаксиса и создание большого exe файла. Конечно это очень долго, поэтому разумно отделить такие мелочи, как карты от основной игры. 2) возможность описывать уровни на более удобном языке. Ведь сама игра написана на C++, а это, хотя и мощный и быстрый язык, но не оч гибкий(все переменные имеют точный тип, при любой ошибке C++ оч сильно на неё ругается). Короче нужно что-то более податливое для быстрого описания уровней.
Поэтому эти дядьки(а они умные программисты, хотя и пьют много пива) зашли на сайт lua.org взяли код lua интерпретатора(а он бесплатен, доступен и открыт) и присобачили к своей игре.
Естественно lua есть не только в Worms. Поглядите список игр на википедии, и это не полный список!
По lua есть хороши описания, есть много разработок(я нашёл на нём даже сервер-kepler называется если что).
Так вот все эти игры и программы объединяет то, что у них есть интерпретатор Lua. Это такая часть программы которая понимает lua и может его загружать и выполнять.
Мы будем пользоваться двумя интерпретаторами: 1) Стандартный интерпретатор Lua 2) Интерпрератор Worms
Стандартный интерпретатор Lua - это чёрное досовское окошко, в котором нет ничего лишнего, но есть всё что надо, поэтому он идеален для понимания lua. В нём мы будем пробовать всё, что изучаем. А поскольку язык один, то всё что мы научимся делать можно будет применять в worms(с некоторыми оговорками)
Теперь пару слов о том, что мы можем добиться от программы. Вообще, у всех часто возникают вопросы: "а можно ли?" "а это реально сделать?" - на такие вопросы сразу отвечаю - чудес не бывает. Поясню на таком маленьком диалоге(Васи и Пети): Вася:Можно ли червя во время игры с помощью скрипта переместить в любую произвольную точку?? Петя:Нет Вася:Почему??? Было бы классно! Петя:Потому что интепретатор не даёт такой возможности Вася:А если поковыряться в exe? Петя:Ковыряйся! Вася:Нууу! Примерно то же я отвечу, если вы будете приставать ко мне с такими вопросами, поэтому объясняю сразу. Интерпретатор-прослойка между игрой и скриптом. В игре можно многое. Т.е. там реально существует возможность переместить червя. НО! чтобы в скрипте была эта возможность интерпретатор должен её предоставить скрипту. Это означает, что ленивые дядьки, вовсю пьющие пиво в Team17 должны пошевелить ручками и добавить это в lua, НО! они ленивые и пьяные, поэтому: 1) чтобы сделать такую возможность надо было достаточно долго посидеть над кодом и они это не стали делать 2) если даже делать такую возможность, она может вызвать кучу ошибок, а ошибки это плохо 3) lua они добавили не для нас(людей, которые пытаются извращаться над игрой), а для себя- то есть чтобы быстро описывать карты и ничего кроме этого!
Таким образом вы должны понять, как отвечать себе на многие такие вопросы. Но не огорчайтесь, к концу обучения вы найдёте массу полезных и интересных фич, да и сами научитесь делать скрипты, и искать инфу по ним.
По тексту выше уже немного понятно, что интерпретатор даёт функции скрипту. К примеру даёт скрипту возможность узнать, сколько червей на карте, к какой команде каждый принадлежит, какое у него оружие. Но сам скрипт даёт интерпретатору кое-какую инфу, к примеру он может сказать интерпретатору "Слушай парниш, если тут червяк подохнет, ты мне об этом скажи, ага". Это называется событием. То есть если на карте что-то важное произошло, то об этом можно узнать в скрипте.
Кроме того скрипт может менять объекты в игре. К примеру он может взять и оживить червя, добавить ему здоровье, убрать у него оружие, кинуть ящик, ещё кучу всего.
Вот так.
Ну о червях достаточно, более детально поговорим ближе к концу обучения. Для того, чтобы всё это понять нам нужны базовые знания по луа, так что будем их получать!
Для того, чтобы их опробовать - надо будет установить стандартный интерпретатор, но о том, как это сделать - позже, в следующем уроке.
тут на тебе и так точно было сказано что это C++ ... НЕПОНЯТНО =)
Верный признак C++ - dll-ки, которые используются игрой. Насколько я помню в папке есть msvcrt.dll - это библиотека исполнения языка C++. Ещё сам луа написан на чистом ANSI C. Вот все доказательства.
А про позицию червя - ты пробовал проверить тип контейнера-вектора?? т.е. вывести type(worm.position)? если нет, то скорее всего на экране будет userdata - это неизвестный для lua тип данных, который может использовать только внешняя программа, но ещё его может использовать скрипт, если внешняя программа через интерпретатор даёт функции для работы с ним.
Приступим ко второму уроку. Сегодня рассмотрим, как настроить интерпретатор lua, как запускать скрипты(я вам покажу хороший текстовый редактор). Ну и в конце урока напишем первую программу=)
Quote
Кстати поздравьте меня и АлексБонда с проф.праздником - сегодня день программиста!!! 256-ой день в году! Ура!!!
Итак, первое что надо для написания программ - текстовый редактор. Это может быть блокнот, но лучше использовать какие-то другие редакторы, ибо они умеют подсвечивать текст и к примеру выполнять программы. Обычно я пользуюсь редактором SciTE(сборка от RuBoard). Она даёт возможность: 1) гибких настроек 2) подсветку синтаксиса 3) хороший поиск 4) возможность запуска компилятора/интерпретатора с выводом в окно редактора
Скачать можно тут(самая свежая версия на момент написания статьи) сам адрес проекта scite-ru.googlecode.com, а все версии проекта в разделе Downlods. При установке указываем папку, ждём распаковки, в следующем окне выбираем русский язык, и к строке txt;php;h;cpp;c дописываем txt;php;h;cpp;c;lua (ну и любые другие расширения файлов, которые вы хотите открывать этой прогой) После установки радуемся этому факту)
Теперь надо скачать интерпретатор lua. Самая новая версия луа на момент написания статьи - Lua 5.1.4. В Worms используется Lua 5.0.1, но это не так важно
Quote
На этой странице расписано, что сделано в 5-ой версии. Т.е. эти функции могут отличаться от того, как это в червях. Учтите это.
Итак, качаем lua тут. Распаковываем lua в папку в надёжном месте, к примеру C:\lua. Для удобства переименуйте все exe файлы так, чтобы убрать суффикс "5.1", т.е. lua5.1.exe переименуйте в lua.exe (dll файлы не трогайте!) Теперь попробуйте запустить файл lua.exe если не выйдет, то пишите в комментах, какими ругнулся Windows и я объясню, что надо сделать.
Настроим системные переменные(чтобы система и луа знали, где искать файлы). Щёлкаем правой мышкой на "Мой компьютер", потом в меню выбираем "Свойства". Потом в окне переходим на вкладку "Дополнительно" и щёлкаем по кнопке "Переменные среды". В этом окне во втором списке ищем Path и дважды щёлкаем по ней. К тексту во втором текстовом поле допишите ";C:\lua". Потом Ок. Теперь щёлкните "Создать" под вторым списком. В этом окне в первом текстовом поле введите LUA_DIR. Во втором поле введите C:\lua. Нажмите Ок. Аналогично создадите переменную LUA_PATH со значением "?.lua;%LUA_DIR%\?.lua;%LUA_DIR%\L_DIR\?.lua" и переменную LUA_CPATH со значением "?.dll;%LUA_DIR%\?.dll;%LUA_DIR%\C_DIR\?.dll" LUA_DIR- папка, где находится lua LUA_PATH - папки(точнее шаблоны), где ищутся lua файлы LUA_CPATH - папки(точнее шаблоны), где ищутся dll файлы(модули)
Теперь настроим SciTE для работы с lua.
Откроем SciTE. В нём в меню найдём "Настройки" -> "Открыть lua.properties". Это файл с настроками lua. Сейчас настроем запуск lua файлов. Ищем строку, начинающуюся со слов command.compile.*.lua и заменяем её содержимое на:
Так же изменяем строку, начинающуюся со слов command.go.*.lua
Code
command.go.*.lua=lua.exe "$(FilePath)"
Сохраните этот файл.
Ура, всё настроили! Теперь напишем нашу первую программу. Будет она называться Hello World! Ну и задача у ней простая - вывести эту надпись на экран.
Создаём новый файл в SciTE Hello.lua и в нём пишем:
Code
print("Hello world!")
Теперь жмём F5 или выбираем в меню "Tools" -> "Выполнить" или зелёную стрелочку в панели под меню. Внизу окна должна появиться панелька, к оторой будет примерно такой текст:
1) ты SciTE обновил, или он старый? 2) если в файле нет настройки, попробуй её добавить - ничего страшного не произойдёт 3) в какой именно момент эта ошибка вылазит?
Следующий урок будет завтра днём или вечером. Щас не хочу что-то рассказывать ________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
То админы(в частности To hitman): не бойтесь поправлять "дизайн" моих уроков=) To krash(и to все): не бойся задавать вопросы, где неясно, ибо: 1) ты поймёшь сам 2) я хочу организовать уроки именно в форме дискуссии 3) уроки станут своебразным faq
В этом уроке мы сделали вот что: для запуска lua из консоли(а также из SciTE) добавили все пути в системную переменную PATH. Сам Lua использует для поиска файлов свои пути - LUA_PATH и LUA_CPATH LUA_PATH - директории, где лежат lua файлы LUA_CPATH - где лежат dll файлы луа ищет файлы, когда он загружает не встроенный в него модуль(с помощью функции require). сначала он просматривает lua файлы, потом dll. Вы всё потом поймёте, когда я про модули расскажу
Это будет первым уроком, где мы что-то реальное будем писать.
Для начала небольшой трёп про то, что значит писать программу. Небольшой вопрос: что такое программа, ну и вообще, что, по-вашему, значит написать программу? Вот я считаю, что правильный ответ примерно такой: Написать программу - значит объяснить компу, как решать какую-то задачу. Чтобы объяснить кому-то что-то, надо сначала представлять, как бы ты сам это делал. Таким образом, чтобы писать программу нужно продумать последовательность своих действий(алгоритм), а потом уже что-то программировать.
Для описания своего алгоритма часто требуется хранить что-то во время работы. Для этого существует такое понятие как переменная. Переменная - это некоторая область памяти в компьютере, которая имеет имя и значение, которое в ней хранится.
В lua переменную объявить очень легко. Вот так:
Code
имя переменной = значение
К примеру,
Code
a=10
При этом будет создана переменная с именем a, и значением 10
Переменные были бы бесполезными, если бы нельзя было бы узнать, что в ней находится. Поэтому имя переменной может участвовать в любых выражениях, к примеру математических:
Code
a=10 b=a+40
b теперь будет равна 50.
Вы наверно щас задаётесь вопросом: "где это попробовать??". Объясняю. Любой код, который я тут привожу для примеров надо написать в SciTE, сохранить как lua файл, а потом запустить нажатием F5 или другими способами(смотри урок 2). Внизу в консольке будет написано, что выводит программа. Под "выводит программа" понимается вызов функции print:
Code
a=10 print(a) b=a+40 print(b)
print - это функция(это понятие вы поймёте позже, сейчас запомните, что в функцию в скобки можно подставлять параметры, и она что-то с ними сделает), которая выводит на экран значение того, что в неё передали. В нашем примере на экран выведено:
Code
10 50
Итак с переменными более или менее ясно. Важно сказать, что у переменных кроме имени и значения есть ещё и тип. В lua 8 типов данных: nil (неопределенный) boolean (логический) number (числовой) string (строковый) function (функция) userdata (пользовательские данные) thread (поток) table (таблица)
Пробежимся по типам данных: 1. nil - буквально означает "ничего". Это одновременно и тип данных и значение. Попробуйте следующий код:
Code
print(c)
на экран будет выведено:
Code
nil
это означает, что нету переменной c - мы её не объявили(точнее не задали) с помощью оператора = Главная задача nil значения - поиск ошибок. Если вы сделаете так:
Code
print(nil+2)
то получите, что lua на вас ругнётся(потому что нельзя прибавлять 2 к ничему!), а вы узнаете, что забыли задать переменную.
2. boolean - тип данных, который означает правду или неправду(true или false). Он используется при сравнении. К примеру выражение 1>2 вернёт false, потому что 1 меньше двойки. выражение 9==9 вернёт true, потому что 9 равно 9. Задать булеву переменную можно так:
Code
a=true b=false c=10<4 or 2==2 print(a,b,c)
Как видите, для булевых переменных можно писать операции or, а также and и not. Правила, по которым они действуют описаны ниже:
Quote
true and true = true true and false = false false and true = false false and false = false
true or true = true true or false = true false or true = true false or false = false
3. number - тип данных, который используется для хранения чисел. Числа записываются как обычно. Десятичные дроби записываются с разделителем ".". Примеры:
Code
a=20 b=42.234 c=-124.412
Для чисел определены математические операции: + сложение - вычитание * умножение / деление % деление по модулю ^ возведение в степень примеры:
Деление по модулю - это получение остатка от деления(вспомните школьное деление столбиком) При возведении в степень первое число возводится в степень второго.
4. string - строка текста. Под ней понимается какая-то последовательность букв или символов. Обычно строка задаётся в кавычках
Code
name="Вася" print(name)
На экране появится гордая надпись Вася=) Строки можно объединять с помощью оператора ..("две точки", а официально называется конкатенация или склейка).
Часто надо вставить в текст специальный символ(перенос строки, кавычки, слэш). Для этого этот символ экранируют. То есть чтобы специальный символ ничего специального не значил перед ним ставят слэш. Вот кратенький спискок самого нужного: \n - вставка переноса на новую строку \" - вставка кавычки \\ - вставка слэша. К примеру, чтобы записать текст C:\gerich\docs\ в lua надо писать так:
Code
path="C:\\gerich\\docs\\"
Чтобы вставить перенос строки:
Code
multiline="Я на первой строке\nА я на второй!" print(multiline)
Код выведет на экран:
Code
Я на первой строке А я на второй!
Надписи на разных строках. Также можно многострочный текст можно писать внутри конструкции [[длинный-длинный текст]]. Вот так:
Code
multiline=[[BOX2D
Физический движок для создания rigidbody физики в 2D играх. Движок-opensource, т.е. исходный код доступен каждому. Исходный код на C++ уже портирован на несколько языков программирования: C#, Java, ActionScript, Python, Scala. В основном применяется во флэш играх(в них используется ActionScript порт движка BOX2DFLASHAS3). Для использования требуются умение программировать и знание языка.]] print(multiline)
Этот код выведет этот текст. 5. function - особый тип данных. Он позволяет хранить в переменной не данные, а действие! Подробней на этом типе данных мы остановимся в следующих уроках. А сейчас, чтобы вы хоть чуть-чуть поняли что это скажу: print- это функция, то есть это переменная типа function, в которой хранится действие(напечатать на экране то, что в неё передали). 6. userdata - Для lua этот тип данных - чёрный ящик. Это просто какие-то данные. Вы ничего не можете сделать с ними, кроме того, как передать эти данные в функцию или получить их и сохранить в переменной. У вас возникает вопрос, зачем этот тип данных? Он нужен для внешней программы.
Quote
Мы можем попросить у Worms дать нам описание текущего червя, потом изменить его имя и попросить Worms, чтобы он запомнил, что мы переименовали червя. Но для описания червя внешней программе нужно знать ещё и его положение в пространстве(вектор). Поэтому внешняя программа передаёт нам таблицу(см. ниже) с описанием червя, в которой есть элемент "position" типа userdata. Мы ничего не можем с этим position сделать, но Worms может её использовать.
7. thread - ненужный для нас тип данных, позволяющий делать псевдо-потоки в lua
8. table - один из самых важных типов в lua. Почти всё в lua использует таблицы(даже все переменные хранятся в таблице). Таблица в lua не та, что в Excel'е - в ней всего две строчки: первая - заголовок, вторая - значения, но сколько уогдно колонок. Про таблицы мы поговорим в следующих уроках гораздо подробнее, поэтому этот урок почти подходит к концу.
Напоследок напомню, что вам из этого урока надо запомнить: 1) как объявлять переменную 2) что такое тип данных 3) как работать с числами, логическими и строковыми значениями.
Ну и совсем на последок скажу ещё что такое оператор type. С его помощью можно узнать тип переменной, к примеру: