Skip to content

Игровой мир

Важным отличием модуля от просто библиотечного файла является время жизни модуля. Игровой мир (объект game, игрок, все объекты и переменные игры) создаётся в момент запуска игры. При подгрузке частей игры с помощью gamefile, а также при загрузке сохранений игры -- игровой мир уничтожается, чтобы затем снова создаться заново. В момент уничтожения мира, все созданные объекты и переменные перестают существовать.

Когда вы включаете код с помощью include, весь этот код будет выполнятся в момент каждого создания мира. Обычно, это подразумевается автором как само собой разумеющееся поведение. Но в случае модуля, это не так!

Модуль загружается один раз, во время создания игровой сессии и существует всё то время, пока выполняется игровой код. То есть, после уничтожении игрового мира и при его новом создании, уже загруженные ранее модули не загружаются повторно.

Это означает, например, что в модуле нельзя определять глобальные переменные, объекты и комнаты так, как это делается в обычном коде игры. Например, модуль не может содержать строки вида:

-- мой неправильный модуль
global 'MYVAR' (10);
room { nam = 'комната'; };

Дело в том, что и MYVAR и комната будут уничтожены при первой же загрузки игры из файла сохранения, так как игровой мир уничтожается целиком, а переменная MYVAR и комната -- часть этого игрового мира.

Если подумать, это становится понятным с той точки зрения, что модуль не должен в общем случае создавать какие-то объекты и глобальные переменные в игровом мире игры. Ведь модуль может работать с любой игрой, и не должен учитывать особенности игрового мира конкретной игры.

Создание глобальных функций тоже не является хорошим тоном при написании модулей. Если вам нужна служебная функция в рамках самого модуля, объявляйте её с local (то же касается и переменных):

lua
local A = 10
local function myfunc(a, b)
    return (a * b) / A
end

Тогда такая функция будет доступна в рамках модуля.