diff --git a/doc/writing_games-en.txt b/doc/writing_games-en.txt index 25acb05..f7f2294 100644 --- a/doc/writing_games-en.txt +++ b/doc/writing_games-en.txt @@ -1053,6 +1053,32 @@ main = room { }; +==== Dynamic object creation ==== +You can use ''new'' и ''delete'' functions to create and remove dynamic objects. An example follows. + + +new ("obj { nam = 'test', act = 'test' }") +put(new [[obj {nam = 'test' } ]]); +put(new('myconstructor()'); +n = new('myconstructor()'); +delete(n) + + +''new'' treats its string argument as an object constructor. The constructor must return an object. Thus, the string argument usually contains a constructor function call. For example: + +function myconstructor() + local v = {} + v.nam = 'test object', + v.act = 'test feedback', + return obj(v); +end + +The object created will be saved every time the game is saved. ''new()'' returns a real object; to get its name you can use ''deref'' function: + +o_name = deref(new('myconstructor()')); +delete(o_name); + + ==== Debugging ==== To see lua call stack during an error, launch sdl-instead with “-debug” parameter. In Windows version debugging console will be created. diff --git a/doc/writing_games.txt b/doc/writing_games.txt index 767b744..e5e7033 100644 --- a/doc/writing_games.txt +++ b/doc/writing_games.txt @@ -1035,6 +1035,32 @@ main = room { }; +==== Динамическое создание объектов ==== +Вы можете использовать функции new и delete для создания и удаления динамических объектов. Примеры: + + +new ("obj { nam = 'test', act = 'test' }") +put(new [[obj {nam = 'test' } ]]); +put(new('myconstructor()'); +n = new('myconstructor()'); +delete(n) + + +new воспринимает строку-аргумент как конструктор объекта. Результатом выполнения конструктора должен быть объект. Таким образом в аргументе обычно задан вызов функции-конструктора. Например: + +function myconstructor() + local v = {} + v.nam = 'тестовый объект', + v.act = 'Тестовая реакция', + return obj(v); +end + +Созданный объект будет попадать в файл сохранения. new() возвращает реальный объект; чтобы получить его имя, если это нужно, используйте функцию deref: + +o_name = deref(new('myconstructor()')); +delete(o_name); + + ==== Отладка ==== Для того, чтобы во время ошибки увидеть стек вызовов функций lua, вы можете запустить sdl-instead с параметром -debug. При этом в windows версии интерпретатора будет создана консоль отладки. diff --git a/stead/stead.lua b/stead/stead.lua index f814df5..f9abb3b 100644 --- a/stead/stead.lua +++ b/stead/stead.lua @@ -1660,7 +1660,7 @@ iface = { end if v == false then - return fmt(r), false; + return cat(fmt(r),'\n'), false; end ACTION_TEXT = r; -- here, life methods can redefine this