Новые возможности версии 1.2.0
Версия INSTEAD 1.2.0, которая готовится к выпуску, содержит множество нововведений как для пользователя, так и для писателя игр. В статье рассматриваются основные нововведения будущей версии с целью их предварительной корректировки и отладки. Последнюю разрабатываемую версию вы можете скачать из svn googlecode: http://code.google.com/p/instead/source/checkout
Улучшения интерпретатора
Появилась долгожданная для Windows пользователей возможность устанавливать игры из zip архивов, а также выбирать игры, пользуясь стандартным диалогом открытия файла. Данная фича находится в диалоге ‘Выбор игры’.
Unix пользователи также могут воспользоваться нововведением, если соберут INSTEAD с gtk+.
Установить игру можно и из командной строки, с помощью параметра -install <zip файл>. Если опустить ключ -install, то можно просто запустить игру прямо из .zip архива, не устанавливая ее. Если комбинировать флаги -gamespath (должен идти раньше) и -install — можно установить игру в произвольный каталог.
Также, установленные игры можно удалять прямо из INSTEAD, щелкая по крестику напротив названия с игрой.
Нельзя удалить только те игры, которые находятся в системном каталоге (./games для Windows, /usr/share/instead/games для Unix).
Сортировка в меню выбора тем и выбора игр теперь всегда помещает игры и темы из системных каталогов на первые места.
Меню выбора тем и игр в многостраничном режиме теперь всегда разворачиваются на ширину максимального элемента.
В меню выбора слотов записи для записи и чтения рядом с названием слота теперь присутствует время записи.
Теперь instead и launcher могут хранить свои настройки и сохраненные игры локально, достаточно создать каталог appadata (Windows версия и standalone Unix версия).
Улучшения stead api
Теперь для инициализации игры можно использовать функцию init().
function init() prefs.counter = 0 put 'fork' lifeon 'dog' end
hook и inherit — позволяют удобным способом перехватывать управление стандартных функций stead и выполнять наследование.
input.key = hook(input.key, function(f, s, down, key, ...) if down and key == 'f7' then return 'look' end -- bind f7 to look cmd return f(s, down, key, unpack(arg)) end)
obj = inherit(obj, function(v) v.act = hook(v.act, function(f, s, ...) local r = f(s, unpack(arg)) s._seen = true return r end) return v end)
Добавлены обработчики entered/left — обработчики вызываются в момент окончательного входа/выхода из комнат.
Добавлены функции: takef/taketo, disable/enable/disable_all/enable_all, exist (аналог seen, но по отключенным объектам в том числе).
Теперь разрешается задавать глобальные переменные:
_global = 1 obj = test { nam = test, dsc = '{test}', act = function() if _global == 1 then _global = 2 return "Тепрерь _global == 2"; end return "_global уже равен 2"; end }
Появилась возможность определять обработчики следующим образом:
act = code [[ p "Test act handler" ]]
У данного способа следующие особенности:
- Форма записи короче, чем традиционная function;
- Во время выполнения кода определены переменные: self (объект), arg1, arg2 … — … arg9 и args[] — параметры;
- Если обработчик объявлен как vars он успешно запишется в save, что означает возможность автору определять код обработчиков на лету;
Появилась возможность использования модулей с помощью require. На данный момент существуют следующие модули:
- dbg — модуль отладки (require «dbg» — включить отладчик);
- goto — улучшенный вариант реализации переходов;
- xact — множественные ссылки;
- input — клавиатурный ввод;
- click — модуль перехвата кликов мыши по картинке сцены;
- vars — модуль определения переменных;
- prefs — модуль настроек;
- snapshots — модуль поддержки снапшотов;
- format — модуль оформления вывода;
- object — модуль улучшенных объектов;
Объект prefs (находится в модуле prefs) служит для сохранения настроек игры, например, его можно использовать для реализации системы достижений или счетчика количества прохождений…
require "prefs" ... prefs.counter = 0 ... exit = function(s) prefs.counter = prefs.counter + 1 prefs:store() end ... enter = function(s) return 'Вы прошли игру '..prefs.counter..' раз(а)'; end ... act = function(s) prefs:purge() return "Настройки обнулены" end
Модуль snapshots предоставляет экспериментальную поддержку snapshot-ов, возможность восстанавливать предварительно сохраненные состояния игры.
require "snapshots" ... make_snapshot(2) return 'Кажется, я сделал ошибку...' end ... act = function(s) -- откат restore_snapshot(2) end
Пример использования модуля xact:
require 'xact' apple = obj { nam = 'ap', act = 'Я ткнул на яблоко. Может, лучше {knife:нож}?', } knife = obj { nam = 'kn', act = 'Я ткнул на нож.', } door = obj { nam = 'do', act = function(s) return goto 'r2'; end } test = xact ("te", "Пример простой реакции.") test2 = xact ("te2", code [[ p "Пример простой реакции2."]]) main = room { nam = 'test', forcedsc = true, dsc = [[На полу лежит {apple:яблоко} и {knife:нож}. Простая {test:реакция}. Простая {test2:реакция2}. И есть {door:дверь}. Простая встроеннея {z:реакция}. Реакция с {test(1):параметром}.]], obj = { 'apple', 'knife', 'test', 'test2', 'door', xact('z', 'Встроенная реакция') } } r2 = room { nam = 'test', dsc = 'Конец!', enter = 'Я вошел в другую комнату.', }
В новом варианте goto, обработчики enter и exit всегда вызываются с here() совпадающему с текущей комнатой.
Модуль vars позволяет избежать путаницы с переменными:
global { global_var = 1, global2_var = 'text' } global { once_more_global = true } r = room { var { 'dsc', changed = false }, var { one_more_var = true }, nam = 'Имя', dsc = '{Старое} описание', act = function(s) if s.changed then global_var = 2; return 'Описание уже изменено'; end s.changed = true s.dsc = '{Новое} описание'; end }
Как видим, больше можно не задумываться о названии переменных, в save попадают те переменные, которые определена в var.
Значительно улучшен отладчик (теперь доступен как модуль и распространяется с INSTEAD). В частности он позволяет выполнять набранный с клавиатуры lua код. Для использования отладчика добавьте в начало кода:
require "dbg"
Модуль format, при своем подключении делает вывод текста игры более красивым.
Все настройки по-умолчанию выключены:
format.para = false -- отступы в начале абзаца; format.dash = false -- замена двойного - на тире; format.quotes = false -- замена " " на << >>; format.filter = nil -- пользовательская функция замены;
Вы можете пользоваться модулями para, dash, quotes для включения отдельных настроек.
Добавлена функция для определения версии api, instead_version. При этом, без потери совместимости появилась возможность развивать api в новых версиях. Так, при вызове:
instead_version "1.2.0"Автоматически подключается модуль улучшенной реализации переходов goto, модуль object и модуль переменных vars. В режиме новой версии API автор игры получает следующие улучшения:
- Для реализации переходов нет необходимости использовать return goto(), достаточно просто вызвать goto;
- Нет необходимости использовать return «текст» в обработчиках, используйте функции p,pn,pr;
- Не надо задумываться о переходе из life метода, он просто работает;
- В обработчики приходят сами объекты, а не их ссылки, нет необходимости использовать ref/deref. Вы можете просто присваивать полям объекты.
- К vobj теперь нужно указывать только 2 параметра: имя и описание, в act текущей комнаты придет не численный ключ, а имя vobj;
Исправление ошибок
Исправлено множество мелких ошибок.
Следите за новостями INSTEAD.


