Topic: INSTEAD и lua 5.2

Сегодня вышла Lua 5.2
Я попробовал перенести INSTEAD на нее, в основном проблем не было, однако, в новой версии lua появилось служебное слово goto, что сечется с функцией INSTEAD.

Получается, что теперь, если переходить на новую версию, теряется совместимость со всем наследием.

Я пока не решил как поступить:

1) оставаться на старой lua
2) начать делать instead 2.0, несовместимый с 1.xx (долгий путь)
3) просто перейти на новую lua со всем наследием, запинав только goto
4) поставлять с инстедом свою версию lua
5) что то еще?

P.S. кроме goto проблем пока не заметил

Вообще, goto было действительно неудачным именем для функции, лучше было ее назвать pl_move или как-то так... Но что в 2, что в 3 варианте - старые игры без конвертации перестают работать.

Все-таки конвертация всех игр?

---

По-моему ничего не остается как:
в 1.5.3 запретить goto, но оставить его для версий < 1.5.3 при условии что собран с lua 5.1
постепенно переходить на move_pl

Какое имя лучше выбрать для замены goto?

move_pl?
есть идеи?
а ведь еще есть goin/goout... если goto переименовать - то остальные функции станут выглядеть странно. мнда

Re: INSTEAD и lua 5.2

А вообще, какова необходимость в переходе на lua 5.2? Какие-то новые возможности, быстродействие, что-то ещё?

Глобально, мне кажется, надо думать именно над instead 2.0. Проект уже достаточно взрослый, сильно отличается от того, чем был в начале, оброс массой дополнительных возможностей, разных трюков... Сейчас как никогда нужен чёткий, систематизированный и хорошо продуманный базовый API, который мог бы оставаться стабильным в течение нескольких лет. И этот базовый API должен быть максимально прост, ориентирован на авторов-непрограммистов и хорошо документирован. Тогда Instead мог бы стать более популярной платформой для разработки приключенческих игр.

Re: INSTEAD и lua 5.2

К сожалению, INSTEAD 2.0 не отнимает необходимости нормальной работы 1.xx.
Для Windows проблемы нет, для остальных систем -- дистрибутивы постоянно обновляются -- рано или поздно 5.2 будет везде.

Насчет 2.0, я не питаю особых иллюзий, да - есть соблазн написать что-то принципиально иное, но 1.xx что называется, выстрадан и проверен временем и реальными играми. Написание 2.0, если оно вообще начнется - будет длительным, 1.xx -- стабильная ветка должна существовать все это время.

Так что мне сейчас кажется что просто так бросить 1.xx нельзя.

Re: INSTEAD и lua 5.2

Peter wrote:

К сожалению, INSTEAD 2.0 не отнимает необходимости нормальной работы 1.xx.
Для Windows проблемы нет, для остальных систем -- дистрибутивы постоянно обновляются -- рано или поздно 5.2 будет везде.

А нельзя встроить в дистрибутив Instead определённую версию lua?

Насчет 2.0, я не питаю особых иллюзий, да - есть соблазн написать что-то принципиально иное, но 1.xx что называется, выстрадан и проверен временем и реальными играми. Написание 2.0, если оно вообще начнется - будет длительным, 1.xx -- стабильная ветка должна существовать все это время.

Я не говорю, что это должно быть что-то принципиально новое. Возможности должны быть из тех, что уже проверены в боевых условиях, просто всё это должно быть систематизировано, отобрано действительно самое важное и самое простое, придуманы хорошие имена. Даже если взять 3 игры: Кота, Кубу и Особняк, то они написаны очень и очень по-разному. Но разобраться в коде особняка не спецу -- без шансов. Должны быть какие-то best techniques, доступные любому.

Что касается текущих имён функций, то меня (как программера, знающего что такое "наложение имен") они по-началу просто пугали!  yikes  Конечно, короткие имена типа take() have() удобны для автора, но они рано или поздно с чем-нибудь пересекутся -- и вот этот момент настал. sad

Возможные варианты решения:
1) дать всем именам короткий префикс, типа st_, xx_, zz_ (zz_goto(), zz_have(), zz_disable())
2) засунуть все имена в какой-то объект или namespace, чтобы получилось типа zz:have() или zz.have() -- не знаю, возможно ли это, т.к. не знаю, какая в lua объектная модель и какие у неё возможности.

Re: INSTEAD и lua 5.2

namespace не решит проблему goto. goto стал оператором, поэтому это слово просто нельзя использовать где бы оно ни было.

Таким нэймспейсом, где лежит API,  в 1.xx является stead (или instead). Но для часто используемых функций сделаны альясы в глоб пространство. например, создавая объект cat мы ничего не ломаем, так как cat это ссылка на stead.cat (cat -- склейка строк)

насчет API, собственно плавный переход к идеалу и происходил все это время, старое api висело только для совместимости. я не против 2.0, я просто думаю, что его написание займет/заняло бы много времени, все это время 1.xx должен жить. smile

воткнуть lua в сам инстед можно, но не очень это хорошо. затруднит попадание в дистрибутивы.

Пока я делаю следующее:

1. все goxxx функции превращаются в walkxxx функции.
2. если используется луа 5.1 остаются линки goxxx на walkxxx
3. начиная с 1.5.3 goxxx не доступны
4. со временем переносим игры на walk

1.xx продолжает жизнь не зависимо от 2.0 и собирается с новым sdl и новой lua

Re: INSTEAD и lua 5.2

Я закоммитил в svn исправления.
Логика такая.
Функции переходов называются теперь: walk, walkin, walkout, walkback

Если INSTEAD version < 1.5.3 делаются линки
goin = walkin
goout = walkout
goback = walkback
Если при этом LUA == 5.1, то и:
goto = walk 

Если INSTEAD version >= 1.5.3 то использование goxxx выводит ошибку-подсказку.

Таким образом, после выхода 1.5.3 можно будет не спеша переводить игры на использование walk.

Огромная просьба -- все, кто собирает из svn (я знаю только Oreolek и vvb smile, смотреть за изменениями и в случае проблем -- написать,

Re: INSTEAD и lua 5.2

Итого, для подготовки игр нужно:
1) заменить goto на walk,  goin -> walkin, goout -> wlakout, goback - > walkback
У меня есть lua скрипт, который делает это автоматически, потом приаттачу его сюда.

2) вписать instead_version "1.5.3" (1.5.3 еще не вышла)

ИЛИ если вы не хотите, чтобы ваша игра перестала работать на более старых версиях, и ваша игра зависит от инстед версии < 1.5.3, то впишите в начало (после instead_version):
2a)

if stead.version < "1.5.3" then
    walk = _G["goto"]
    walkin = goin
    walkout = goout
    walkback = goback
end

После выхода 1.5.3 я переведу часть игр из официального репозитория на 1.5.3. Те игры - которые заточены на старые версии INSTEAD - переведу по схеме 2a. Возможно, уже сейчас.

Уверен, lua5.2 появится в скором времени в arch linux, до этого момента нужно, чтобы основная часть игр работала на lua 5.2.

Как быть с неоф репом пока не знаю.

Re: INSTEAD и lua 5.2

Выкладываю для тестов win версию .

Post's attachments

Attachment icon instead-1.5.3.exe.zip 5.48 mb, 169 downloads since 2011-12-18 

Re: INSTEAD и lua 5.2

Выкладываю скрипт для конвертации.
Весь официальный репозиторий в svn переделан (кроме туалета, который за Вовой).

Убедительная просьба всех, кто знает что-такое svn, погонять хотя бы немного свои игры оттуда. (Можно на старом инстеде).

Post's attachments

Attachment icon conv 590 b, 178 downloads since 2011-12-18 

Attachment icon upgrade.sh 61 b, 181 downloads since 2011-12-18 

Re: INSTEAD и lua 5.2

Peter wrote:

(кроме туалета, который за Вовой).

Ё-моё. smile Иноваторы фиговы.  cool

Re: INSTEAD и lua 5.2

Надо бы новую версию назвать 1.6.0. Несмотря на небольшой объем исправлений, это кардинально новая версия, хотя бы тем, что обеспечивает поддержку lua 5.2 и требует конвертации всех старых игр.

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

Re: INSTEAD и lua 5.2

1.6.0 и будет

13

Re: INSTEAD и lua 5.2

как 1.6.0? сказал же 1.5.3...
просьба ответить однозначно
что ставить в играх? какую версию?
1.5.3? 1.6.0?

Re: INSTEAD и lua 5.2

будет 1.6.0, ничего страшного не произойдет, если оставить 1.5.3 в играх.

Re: INSTEAD и lua 5.2

Для LUA52 в убунту установленной из дебов вот такие вот пути...
/usr/local/bin/lua; /usr/local/lib/lua; /usr/include/lua5.2

Файл conv
lua ругается на строки 14 и 16

./conv:14: invalid escape sequence near '\['
./conv:16: invalid escape sequence near '\['
Qui habet aures audiendi, audiat...

Re: INSTEAD и lua 5.2

Попробуй убрать \ перед [ в этих строках. Завтра посмотрю подробнее.

Re: INSTEAD и lua 5.2

Вот этот фрагмент старого кода из «Лифтёра 2» на Lua 5.2.2:

objs('mobil_tel_in'):add('exit_tel', 20);

выдаёт ошибку: Error: /usr/share/instead/stead//stead.lua:652: bad argument #2 to 'insert' (position out of bounds)

Стек привёл к функции stead.list_add() в stead.lua. Там есть такой код:

stead.table.insert(self, tonumber(pos), nam);

Всё дело в table.insert() с pos большим чем количество элементов в таблице. А в моём контексте количество элементов было меньше 20.

Вот что пишут в интернетах по этому поводу: «The behavior of table.insert & table.remove have changed, now they can throw an error "out of bounds".» (http://lua-users.org/lists/lua-l/2013-02/msg00535.html).

Советуют либо вставлять с pos не больше общего количества, либо заранее вставить много элементов чтобы зарезервировать место, потом удалить их. И на эти пустые места вставлять уже нужные элементы. Ещё советуют какие-то хитрости. Но я-то использую функцию add (list_add) из stead.lua, в ней я не могу ничего менять.

Кто-нибудь сталкивался с этим? Что можно посоветовать?

Коты рулят! И велики!

Re: INSTEAD и lua 5.2

ага. посмотрим. думаю, пофикшу сам инстед.

Re: INSTEAD и lua 5.2

Попробуй в начале игры (после всех requre/version) переопределить функцию:

Если все заработает, будет в 1.9.1

stead.list_add = function(self, name, pos)
    local nam = name
    if stead.initialized then
        nam = stead.ref(name);
    end
    if not nam then
        error ("Add wrong object to list: "..tostring(name), 2);
    end
    if self:look(nam) then
        return nil
    end
    self.__modified__ = true;
    if isObject(stead.deref(nam)) then
        nam._dynamic_type = true
    end
    if tonumber(pos) then
        pos = tonumber(pos)
        if pos <= #self then
            stead.table.insert(self, pos, nam);
        else
            self[pos] = nam; -- for spare lists
        end
    else
        stead.table.insert(self, nam);
    end
    return true
end

Re: INSTEAD и lua 5.2

Добавление заработало.

Теперь проблема при удалении объекта. Этот код:

objs('mobil_tel_in'):del('photo');

Приводит к этому:

Error: /usr/share/instead/stead//stead.lua:801: bad argument #1 to 'remove' (position out of bounds)
stack traceback:
        [C]: in function 'remove'
        /usr/share/instead/stead//stead.lua:801: in function 'del'
        d1.lua:262: in function '?'
        /usr/share/instead/stead//stead.lua:874: in function 'call'
        /usr/share/instead/stead//stead.lua:1324: in function 'action'
        /usr/share/instead/stead//stead.lua:2330: in function </usr/share/instead/stead//stead.lua:2276>

https://github.com/jhekasoft/lifter2/bl … 1.lua#L262

До этого объект добавлялся таким кодом:

objs('mobil_tel_in'):add('photo', 10);
Коты рулят! И велики!

Re: INSTEAD и lua 5.2

Ага, продолжаем:

stead.list_del = function(self, name)
    local v,n
    v, n = self:srch(name);
    if n == nil then
        return nil;
    end
    self.__modified__ = true
    if n <= #self then
        v = stead.table.remove(self, n);
    else
        v = self[n];
        self[n] = nil -- for spare lists
    end
    return v
end

Re: INSTEAD и lua 5.2

Ага. Помогло. Потестю ещё, если что не так скажу.

Коты рулят! И велики!