Введение
Не смотря на значительный кризис в области текстовых многопользовательских игр в рунете существующие миры требуют развития своей программной составляющей. Конечно никто не оспаривает преимуществ С++ или Java но все эти языки требуют для внесения новшеств в игру перекомпиляции игрового движка. Естественно кодеры давно сталкиваются с этой проблемой и потому пытаются встроить внутрь своих движков некие подобия костылей в виде например MOBprogs, которые представляют собой минискрипты с крайне ограниченными возможностями, которые являются постоянной головной болью для билдеров. Последние вынуждены адски извращаться чтобы добиться в игре желаемого результата с помощью этих самых мобпрогсов. Нужно постоянно мучаться с запоминание переменных, отсутствием массивов и еще кучей элементарных вещей к которым привык любой программист. В этих прогсах отсутствуют циклы нельзя получить доступ к множеству игровых объектов и.т.д. и.т.п. В общем давно и настоятельно созрел вопрос о внедрении в муд полноценного внутреннего языка.
Почему Lua
Lua – это интерпретируемый зык программирования с открытым исходным кодом на Си. Не стоит наверное рассказывать о всех преимуществах и недостатках Lua о них можно прочитать в куче мест начиная с википедии. Попробую рассказать о преимуществах Lua для мада. Во-первых это скорость выполнения. По моим ощущениям скорость выполнения скрипта в Луа размером в 200-300 строк ни чем не отличается от скорости выполнения тех же действий написанных на Си. Исключения есть, но их крайне мало. Во-вторых это размер. Интерпретатор Lua занимается примерно150 килобайт в памяти, что согласитесь немного. Можно запустить несколько машин Lua (я кстати так и делаю), чтобы разграничить доступ например для билдеров пишущих зоны и для скриптеров пишущих новые умения и заклинания или команды. В третьих удобство использования. Это и автоматический сборщик мусора, глобальные и локальные таблицы, создание своих функций и еще куча всего. Вообщем Lua это наш выбор.
Что необходимо для подключения Lua
Под Windows:
Если ваш мад выполняется под виндами то для использования Lua вам потребуются два dll библиотечки lua5.1.dll и lua51.dll. (Здесь и далее предполгается, что вы подключаете Lua 5.1 , а не более новый 5.2) Я читал, что достаточно и одной, но не пробовал. Если вы будете подключать Lua статически нужны те же библиотеки только с расширением .lib Кроме этого необходимы заголовочные файлы lua.h, lualib.h,lauxlib.h.
Под Linux
Заголовочные файлы нам потребуются те же, а вот библиотеки зависят от того как вы будете собирать ваш Lua. Как правило для статического использования берется l uac, а для динамического lua5.1. Ну и в Makefile не забудьте указать пути к хедерам и библиотекам.
Встраивание
Для реализации Lua в маде я создал отельный файл и назвал его alua.c все танцы с бубном в дальнейшем в нем и происходят. Для начала вставляем заголовочные файлы
#include <lua.h> #include <lualib.h> #include <lauxlib.h> |
При использовании С++ необходимо задавать следующую конструкцию:
extern C { } |
Внутри которой уже и подключается наш Lua. Для каждой машины Lua выполняемой в нашем маде необходимо указать свой указатель. Я указал его глобально в одном в начале файла как
lua_State *vLm;
Чарез него собственно и происходит все общение с Lua. Дальше определяем функцию в которой у нас будет происходить инициализация и запуск Lua. Например так:
void load_alua() { vLm = lua_open(); /* Стартуем Lua */ } |
При подключении Lua у меня возникла проблема подключения библиотек. Дело в том, что для нормальной работы с луа необходимо подключить набор стандартных библиотек луа. Ну например обычно инициализуются они все сразу вызовом:
luaL_openlibs(vLM); |
(luaL означает, что функция относится к вспомогательной библиотеке). Проблема же заключается в том, что в стандартные библиотеки входят библиотека ввода-вывода, библиотека для работы с ОС, а это в моем случае было совершенно ни к чему. Билдер может при помощи этих библиотек получить полноценный доступ ко всем файлам нашего проекта. А оно нам надо? Поэтому инициализируем только нужные нам библиотеки следующим образом:
lua_pushcfunction(vLm,luaopen_base); //Загрузка базовой библиотеки lua_pushstring(vLm,""); lua_call(vLm,1,0); lua_pushcfunction(vLm,luaopen_math); //Загрузка математической lua_pushstring(vLm,""); lua_call(vLm,1,0); lua_pushcfunction(vLm,luaopen_table); //Загрузка для работы с таблицами lua_pushstring(vLm,""); lua_call(vLm,1,0); lua_pushcfunction(vLm,luaopen_string); //Загрузка для работы со строками lua_pushstring(vLm,""); lua_call(vLm,1,0); lua_pushcfunction(vLm,luaopen_package); lua_pushstring(vLm,LUA_LOADLIBNAME); //Для работы с пакетами lua_call(vLm,1,0); |
Таким образом я исключил загрузку библиотек ввода-вывода и для работы с ОС.
После инициализации библиотек можно зарегестрировать свои функции. Ну то есть функции которые у нас будут связывать Lua и наш движок. Например:
lua_register(vLm,"echo",l_echo); |
Здесь l_echo функция определенная в движке а echo это имя функции которое будет использовать внутри Lua.
То есть в скрипте или в прогсе я буду вызывать функцию lua echo. Lua будет вызывать мою функцию l_echo. Таким образом можно определить какое угодно количество функций необходимых нам для работы с мадом изнутри.
Ну и главное не забудьте поместить функцию старта Lua в начало запуска вашего движка.
Навигация по статьям | |
Игроки виртуальных миров | Портирование структур Си в Lua, прерывание скриптов по времени |
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
|