Новые возможности версии 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" ]]

У данного способа следующие особенности:

Появилась возможность использования модулей с помощью require. На данный момент существуют следующие модули:

Объект 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 -- замена " " на &lt;&lt; &gt;&gt;;
format.filter = nil -- пользовательская функция замены;

Вы можете пользоваться модулями para, dash, quotes для включения отдельных настроек.

Добавлена функция для определения версии api, instead_version. При этом, без потери совместимости появилась возможность развивать api в новых версиях. Так, при вызове:

instead_version "1.2.0"

Автоматически подключается модуль улучшенной реализации переходов goto, модуль object и модуль переменных vars. В режиме новой версии API автор игры получает следующие улучшения:

Исправление ошибок

Исправлено множество мелких ошибок.

Следите за новостями INSTEAD. :)

Опубликовано 18.06.2010 в 15:16 · Автор peter · Ссылка
Рубрики: Новости, Статьи

Написать комментарий