Igor
Но gettable уносит из стека значение, насколько я помню
Snusmumriken
Ну если попится, то можно вытащить из того места, куда попнулся ))
Snusmumriken
А то указатели разными получаются.
Igor
Лайт всегда один
Igor
А вот full юзердата разная
Snusmumriken
Хм, оки.
А то я своровал функции из luasocket'а, и они чот хороши, практически полный аналог луёвой фигне. А так — я генерирую юзердату, пихаю в неё указатель и радуюсь жизни.
Igor
Я тоже хотел из сокетов скоммуниздить, но потом решил что-то своё сделать
Igor
И вышло что-то страшное, но мне в целом понравилось, как мой вариант работает
Igor
Разве что от двух пушей лайтовой даты нужно избавиться, это да
Snusmumriken
Но, кстати, с такой юзердатой есть кучка проблем. Например, я вот делаю steamworks, и там есть друганы. Но проблема в том, что вот эти вот newuserdata как раз возвращают каждый раз новый указатель, поэтому я думаю про буфер этих юзердат на луёвой стороне, типа таблички с __mode = 'v', запихивая туда ключи-значения типа [ID] = userdata.
Типа, если нашли юзердату в буфере — вернули её, если не нашли — сгенерили новую.
Igor
Я и сделал такой "буфер"
Igor
У меня это таблица в регистре
Snusmumriken
lua_ref?
Igor
В которой юзердате соответствует лайтюзердата
Igor
Лайт - это ключ, а обынчая бзердата - значение
Snusmumriken
Да, мне с этим проще потому что у меня есть строковые ID, так-то придётся делать что-то аналогичное.
Igor
У меня просто всё, что некуда запихнуть в табличке LUA_REGISTRYINDEX лежит
Snusmumriken
Ну так примерно оно и происходит. Табличка невидимая и имеет доступ только по ссылке с сишной стороны (или если сишка её вернёт), живёт пока не будет совершён lua_unref.
Igor
Ага
Snusmumriken
Меня на эту тему успело выморозить то, что если заменить таблицу, например, package — луа всё равно будет лезть в оригинал, потому что там такой же доступ по ссылке.
Igor
Есть такое
Snusmumriken
Я хотел мутить "раздельные" стейты в корутинах, типа в каждой корутине по своему набору библиотек, свои пути загрузки либ, свои переменные и т.д.
Igor
Ну мне особо не приходилось подменять стандартные таблички
Igor
Я только в них меняю/удаляю значения
Igor
Ага, убирает из стека значение ключа
Igor
Похоже не избавиться от двух пушей лайтовой даты
Igor
Если только у lua_gettable нет альтернативы без этой особенности
Igor
Можно разве что lua_gettable заменить на rawget
Igor
Чтобы не пытался метаметоды выполнить
Igor
Всё равно лишнее действие
Igor
Igor
Иногда со стороны lua и проверяю содержимое таблички этой, если лень рекомпилить библу с отображением содержимого стека
mva
как же я люблю Lua за возможность хаков с метатаблицами! :)
Igor
Хех
Igor
Я раньше любил что-то такое делать getmetatable("").__add = function(a, b) return a..b end
Igor
Мне было удобнее через плюс строки конкатить, нежели через две точки
Igor
Но потом я посмотрел, сколько же времени луи тратят на выполнение этого метаметода и отказался от этой штуки
Igor
Да и вообще такая фигня почему-то к крашу LuaJIT при определённых условиях приводила
Igor
Конкатил я, например, через .. в определённом месте и краша не было, повторял те же действия но с конкатом через + и всё падало
Илья
[4vthy7j' xY
Snusmumriken
[4vthy7j' xY
В вашем пароле присутствуют запрещённые символы, попробуйте снова.
Snusmumriken
Но потом я посмотрел, сколько же времени луи тратят на выполнение этого метаметода и отказался от этой штуки
В своё время писал либу векторов, где каждый вектор — отдельная табличка (или ffi-userdata, если возможно). Потом попробовал написать что-то более-менее сложное, типа
bla = foo:norm() * bar:rotate(3.14):alerp(foobar)
И офигел от безумного оверхеда по разметкам памяти, учитывая что каждая операция возвращает новый вектор. Потом ударился в противоположный грех. Оно всё ещё так может, но добавился миллиард методов, типа:
bla = foo:norm():svmul(bar:rotate(3.14):salerp(foobar))
Тут уже norm и rotate — создают новые векторы, методы с s — изменяют объект вместо создания нового, а vmul — умножение на вектор, пропускаются проверки аргументов, типа чаво там прислали: вектор или пару чисел или что.
В результате оно разрослось на 1000 строк ))
https://pastebin.com/xjeU0XAx
Igor
В своё время писал либу векторов, где каждый вектор — отдельная табличка (или ffi-userdata, если возможно). Потом попробовал написать что-то более-менее сложное, типа
bla = foo:norm() * bar:rotate(3.14):alerp(foobar)
И офигел от безумного оверхеда по разметкам памяти, учитывая что каждая операция возвращает новый вектор. Потом ударился в противоположный грех. Оно всё ещё так может, но добавился миллиард методов, типа:
bla = foo:norm():svmul(bar:rotate(3.14):salerp(foobar))
Тут уже norm и rotate — создают новые векторы, методы с s — изменяют объект вместо создания нового, а vmul — умножение на вектор, пропускаются проверки аргументов, типа чаво там прислали: вектор или пару чисел или что.
В результате оно разрослось на 1000 строк ))
https://pastebin.com/xjeU0XAx
Ну мне с векторами в своей реализации сервера пришлось как обычно велосипедить и костылить. Так уж получилось, что у игры протокол замудрённый стал, помле того как в него запустили руки игроки (частенько не блещащие особым умом, нужно заметить), он ощутимо так усложнился, в итоге для меня самым простым путём было навелосипедить свою библиотеку векторов. У меня их присутствует две штуки, один с short значениями, а другой float. В float хранится позиция игроков, а в short размеры мира, например. Но то, что структур векторов два, принесло мне трудности. Для луёвой апишки пришлось сделать ещё одну структуру LuaVec и хранить в ней тип вектора и юнион с двумя типами: float вектор и short вектор. В итоге накостылял простенькую библу векторов с двух сторон, с сишной и луёвой. И всё работает почти как я хотел.
Igor
В стандартном протоколе игры просто все вектора представлялись как short число
Igor
А если нужны были нецелые значения, то значение просто умножалось/делилось на 32
Igor
Можно было б конечно сделать на всё про всё один только int32 вектор и когда нужно читать его как float или же как short, но мне такой вариант не очень по душе оказался
Anonymous
@bratus привет. Хотел бы спросить. Ты когда детишкам (lua) преподавал, какой у них был примерный средний возраст?
Mikhail
средний 10.
а так с 8
Anonymous
Норм, спасибо
Mikhail
лучше всего без подготовки и с нуля понимают те кому 14 лет ))
Mikhail
но и в 8 сделали игру и даже проверку коллизий ... тядело концентрироваться
YI
Всех с наступающим Новым Годом) Больше радости в этом году и исполнения всех желаний ❄️🎄
Snusmumriken
Нам бы мотивации и кода компилящегося ))
Snusmumriken
Но таки да, с нг
Lucky
Lucky
Да здравствует мотивация, да сгинет прокастинация!
Egor
Приветы. Я уже целый час убил, но так и не смог завести, кто может мини примером кинуть, если знает, как работать с penlight.template ?
Mark ☢️
Mikhail
академия наук РФ
Mark ☢️
Да ну блин
Mark ☢️
Город какой ?
Maxim
Всех с наступающим Новым Годом, коллеги! Подскажите мануал если есть, хочется запилить игру "шахматы" на lua со своими кастомизированными фигурами на шахматной доске, может есть у кого ссылка на подобные исходники?
Snusmumriken
Чем рисовать будешь? 2d или 3d? Какая платформа? Насколько глубоко собираешься погружаться в движок/фреймворк/математику?
Lucky
Lucky
вот шахматы на lua
Lucky
Вот движок: https://github.com/soumith/sunfish.lua
Lucky
Думается, на love2d шахмат чуть меньше, чем полвагона.
Maxim
Валентин
Всем привет. Вопрос - есть ли движок похожий на instead но с выводом в html (и соответственно с js частью реакции на события выбора)
Snusmumriken
Lucky
Lucky
Lucky
С наступающим новым годом, чятик!
Lucky
instead-js
Я вспомню вот ещё один моторчик, типа RenPy, но на js. И уже не сегодня.
Валентин
renpy-js? очень странный синтаксис внутри, не зашло
Валентин