Логин        Пароль                  

Забыли пароль?        Регистрация               
 
Инвентори
Другие игры
SmartSection is developed by The SmartFactory (http://www.smartfactory.ca), a division of INBOX Solutions (http://inboxinternational.com)
Учебник > Для админов и билдеров > Подключение Lua к MUD
Подключение Lua к MUD
Опубликовал(а) Flanker 08.04.2013 (3358 прочтений)
 

Введение

Не смотря на значительный кризис в области текстовых многопользовательских игр в рунете существующие миры требуют развития своей программной составляющей. Конечно никто не оспаривает преимуществ С++ или 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, прерывание скриптов по времени Следующая статья
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

     
Рекламко
     
Поиск
Последние фото
Партнерские ссылки

Текстовые миры Рунета admin@rumud.ru

Яндекс цитирования PageRank

Карта сайта 1 Карта сайта 2 Карта сайта 3 Карта сайта 4 Карта сайта 5 Карта сайта 6 Карта сайта 7