Luсky
А есть ли какая либо литература по написанию своего языка программирования? Можете подсказать)
Можешь посмотреть на интерпретатор urq на lua. https://instead-games.ru/game.php?ID=151
Михаил
теперь она заменяет (вроде) все пути вроде ./?.lua ./?.luac на относительные к скрипту do local unpack = unpack or table.unpack; local p = {} local it = 1 while it < #package.path do local pos = package.path:find(";", it) if not pos then table.insert(p, package.path:sub(it)) break end table.insert(p, package.path:sub(it, pos - 1)) it = pos + 1 end local win = package.config:sub(1, 1) == "\\"; local sl, ls = unpack(win and {"\\", "/"} or {"/", "\\"}); local norm = function(path, parent, isdir) local sp = path:gsub(ls, sl) local is_abs = sp:sub(1, 1) == sl or (win and sp:find(":")); local last = ({sp:find(".*" .. sl)})[2]; if parent then sp = (last or is_abs) and sp:sub(1, last) or ""; end if not is_abs and sp:sub(1, 2) ~= ("." .. sl) then sp = "." .. sl .. sp; end if (parent or isdir) and sp:sub(-1, -1) ~= sl then sp = sp .. sl; end return sp end local path = norm(arg[0], true); local lookup = { [("./??.[a-zA-Z0-9]+" ):gsub(ls, sl)] = 3, [("./??/init.[a-zA-Z0-9]+"):gsub(ls, sl)] = 3 }; for k, v in pairs(p) do local n = norm(v) for lk, lv in pairs(lookup) do local b, e = n:find(lk) if b == 1 and e == #n then p[k] = path .. n:sub(lv) break end end end end
Михаил
я щас по другому сделаю, поудобнее..
Domka
Привет
Domka
Чем маетесь?
Domka
теперь она заменяет (вроде) все пути вроде ./?.lua ./?.luac на относительные к скрипту do local unpack = unpack or table.unpack; local p = {} local it = 1 while it < #package.path do local pos = package.path:find(";", it) if not pos then table.insert(p, package.path:sub(it)) break end table.insert(p, package.path:sub(it, pos - 1)) it = pos + 1 end local win = package.config:sub(1, 1) == "\\"; local sl, ls = unpack(win and {"\\", "/"} or {"/", "\\"}); local norm = function(path, parent, isdir) local sp = path:gsub(ls, sl) local is_abs = sp:sub(1, 1) == sl or (win and sp:find(":")); local last = ({sp:find(".*" .. sl)})[2]; if parent then sp = (last or is_abs) and sp:sub(1, last) or ""; end if not is_abs and sp:sub(1, 2) ~= ("." .. sl) then sp = "." .. sl .. sp; end if (parent or isdir) and sp:sub(-1, -1) ~= sl then sp = sp .. sl; end return sp end local path = norm(arg[0], true); local lookup = { [("./??.[a-zA-Z0-9]+" ):gsub(ls, sl)] = 3, [("./??/init.[a-zA-Z0-9]+"):gsub(ls, sl)] = 3 }; for k, v in pairs(p) do local n = norm(v) for lk, lv in pairs(lookup) do local b, e = n:find(lk) if b == 1 and e == #n then p[k] = path .. n:sub(lv) break end end end end
Букавки пишете, а ну ладно. . .
UtoECat
теперь она заменяет (вроде) все пути вроде ./?.lua ./?.luac на относительные к скрипту do local unpack = unpack or table.unpack; local p = {} local it = 1 while it < #package.path do local pos = package.path:find(";", it) if not pos then table.insert(p, package.path:sub(it)) break end table.insert(p, package.path:sub(it, pos - 1)) it = pos + 1 end local win = package.config:sub(1, 1) == "\\"; local sl, ls = unpack(win and {"\\", "/"} or {"/", "\\"}); local norm = function(path, parent, isdir) local sp = path:gsub(ls, sl) local is_abs = sp:sub(1, 1) == sl or (win and sp:find(":")); local last = ({sp:find(".*" .. sl)})[2]; if parent then sp = (last or is_abs) and sp:sub(1, last) or ""; end if not is_abs and sp:sub(1, 2) ~= ("." .. sl) then sp = "." .. sl .. sp; end if (parent or isdir) and sp:sub(-1, -1) ~= sl then sp = sp .. sl; end return sp end local path = norm(arg[0], true); local lookup = { [("./??.[a-zA-Z0-9]+" ):gsub(ls, sl)] = 3, [("./??/init.[a-zA-Z0-9]+"):gsub(ls, sl)] = 3 }; for k, v in pairs(p) do local n = norm(v) for lk, lv in pairs(lookup) do local b, e = n:find(lk) if b == 1 and e == #n then p[k] = path .. n:sub(lv) break end end end end
Мне кажется что это можно было сделать через кастомный лоадер. Могу ошибаться
Snusmumriken
Можно.
Михаил
когда уже Дуров завезет сворачивание спойлера, неудобно портянки кидать
UtoECat
??
http://lua-users.org/wiki/LuaModulesLoader для примера, и сделать по другому обработку path
Михаил
do local unpack = unpack or table.unpack; local p = {} local it = 1 while it < #package.path do local pos = package.path:find(";", it) if not pos then table.insert(p, package.path:sub(it)) break end table.insert(p, package.path:sub(it, pos - 1)) it = pos + 1 end local win = package.config:sub(1, 1) == "\\"; local sl, ls = unpack(win and {"\\", "/"} or {"/", "\\"}); local norm = function(path, parent) local sp = path:gsub(ls, sl) local is_abs = sp:sub(1, 1) == sl or (win and sp:find(":")); local last = ({sp:find(".*" .. sl)})[2]; if parent then sp = (last or is_abs) and sp:sub(1, last) or ""; end if not is_abs and sp:sub(1, 2) ~= ("." .. sl) then sp = "." .. sl .. sp; end if sp:sub(-1, -1) == sl then sp = sp:sub(1, -2); end return sp end local path = norm(arg[0], true); local lookup = { [("./??.[a-zA-Z0-9]+" ):gsub(ls, sl)] = 5, [("./??/init.[a-zA-Z0-9]+"):gsub(ls, sl)] = 10 }; local exts = {"lua", "luac"} -- forcibly add these extensions local exts_rev = {lua = 1, luac = 2} for k, v in pairs(p) do local n = norm(v) for lk, lv in pairs(lookup) do local b, e = n:find(lk) if b == 1 and e == #n then local ext = n:sub(lv) if not exts_rev[ext] then table.insert(exts, ext) exts_rev[ext] = #exts end p[k] = "" break end end end local ds = 1 for k, v in pairs(exts) do table.insert(p, ds, norm(path .. "/?." .. v)); table.insert(p, ds + 1, norm(path .. "/?/init." .. v)); ds = ds + 2 end for k, v in pairs(p) do if #v ~= 0 then p[k] = v .. ';' end end package.path = table.concat(p) end
Михаил
do local unpack = unpack or table.unpack; local p = {} local it = 1 while it < #package.path do local pos = package.path:find(";", it) if not pos then table.insert(p, package.path:sub(it)) break end table.insert(p, package.path:sub(it, pos - 1)) it = pos + 1 end local win = package.config:sub(1, 1) == "\\"; local sl, ls = unpack(win and {"\\", "/"} or {"/", "\\"}); local norm = function(path, parent) local sp = path:gsub(ls, sl) local is_abs = sp:sub(1, 1) == sl or (win and sp:find(":")); local last = ({sp:find(".*" .. sl)})[2]; if parent then sp = (last or is_abs) and sp:sub(1, last) or ""; end if not is_abs and sp:sub(1, 2) ~= ("." .. sl) then sp = "." .. sl .. sp; end if sp:sub(-1, -1) == sl then sp = sp:sub(1, -2); end return sp end local path = norm(arg[0], true); local lookup = { [("./??.[a-zA-Z0-9]+" ):gsub(ls, sl)] = 5, [("./??/init.[a-zA-Z0-9]+"):gsub(ls, sl)] = 10 }; local exts = {"lua", "luac"} -- forcibly add these extensions local exts_rev = {lua = 1, luac = 2} for k, v in pairs(p) do local n = norm(v) for lk, lv in pairs(lookup) do local b, e = n:find(lk) if b == 1 and e == #n then local ext = n:sub(lv) if not exts_rev[ext] then table.insert(exts, ext) exts_rev[ext] = #exts end p[k] = "" break end end end local ds = 1 for k, v in pairs(exts) do table.insert(p, ds, norm(path .. "/?." .. v)); table.insert(p, ds + 1, norm(path .. "/?/init." .. v)); ds = ds + 2 end for k, v in pairs(p) do if #v ~= 0 then p[k] = v .. ';' end end package.path = table.concat(p) end
но тут цель была удалить пути относительно CWD и добавить относительно скрипта
Михаил
мне кажется неплохо
Михаил
нет... еще cpath патчить
Snusmumriken
но тут цель была удалить пути относительно CWD и добавить относительно скрипта
К сожалению, CWD это очень относительная штука. Например, notepad++ запускает скрипты с CWD там, где собственно расположен notepad++, и если попытаться что-то записать "в текущую директорию" — откроет именно там. И подобная история с многими редакторами. Поэтому вместо CWF можно использовать путь до корневого скрипта запущенного в интерпретаторе.
Михаил
и пути к скрипту достаточно чтобы узнать, как сделать так, чтобы require грузил модули относительно этого скрипта, а не CWD
Михаил
добавил кастомный загрузчик...
Михаил
судя по всему у макоси тоже .so
Михаил
а что делает эта строчка
Михаил
module(..., package.seeall)
Михаил
у макоси dylib
я имел ввиду для модулей. в исходниках луажита только упоминание dll и so
Михаил
типа у макоси формат dylib но для луа называется so
Михаил
в винде тоже можно в .so переименовать и загрузить
Igor
Igor
но по факту для макоси стандарт .dylib
Igor
Хоть от этого расширенияи не прям многое зависит
Igor
Так что как-то фиолетово всем)
Михаил
https://pastebin.com/k5hz48sE
Михаил
кто знал, что сообщение справа - прямо от винапи? (загрузка либ из под FFI)
Snusmumriken
Я знал. У них ещё кодировка иногда весёлая, как раз потому что винапи.
Domka
Вы тут какие то мутки мутите?
Domka
Революцион в мире геймдева?
Domka
А я тут освещение добавил и рендер переписал
Domka
Так то получше
Domka
Я короче прям сделаль запеченное освещение, и патчи для текстур чтобы можно было спрайты 8х8 частями наносить, и это чем то декали напоминает
Snusmumriken
Я короче прям сделаль запеченное освещение, и патчи для текстур чтобы можно было спрайты 8х8 частями наносить, и это чем то декали напоминает
Ты же шейдерами рендеришь стены? Можно считать удалённость до источников освещения и затенять пиксели.
Snusmumriken
Пон, пон
Domka
Я могу впринципе делать освещение от удаленности, но беда тут больше в том что это именно запеченное освещение, и там карта освещения тайловая. А цветов на все про все 16
Domka
Вот и умещаюсь как могу, впринципе не жалуюсь, мне нравится, выходит гораздо лучше того по сравнению с тем откуда я начал
Domka
А так да, было бы неплохо шейдеры подключить и как в думе сделать от удаленности освещение дополнительное
Domka
Snusmumriken
Ну в думе так-то есть программный режим, там вполне себе текстурки нарезаются на полосочки и каждая полосочка дополнительно красится в зависимости от удалённости.
Snusmumriken
Там карта полигончиков, да.
Domka
Ну хотя это и у меня можно сделать
Snusmumriken
Ты с тайлами полностью рисуешь всю текстурку, без нарезания на полосочки? Чисто преобразуешь вершины квадратика?
Domka
Ты с тайлами полностью рисуешь всю текстурку, без нарезания на полосочки? Чисто преобразуешь вершины квадратика?
Нет это то присутствует само собой, просто цветов то у меня 16, всего 4 цвета. Надо же как то от источников света показать контраст
Domka
Ну да
Domka
Но нет
Domka
4 уровня яркости
Snusmumriken
Да так-то можно и два: "освещено" и "не освещено".
Domka
Я пожалуй пока не буду делать, потом еще сделаю. Чичас я текстуры создаю и чуть попозже буду врагами заниматься
Snusmumriken
Чуть попоже организую
Вообще тик вроде может 31 цвет выдавать https://tic80.com/play?cart=3361
Domka
Он 256 может выдавать
Domka
Просто тут беда в том что это с костылями
Domka
Я это пожалуй попозже реализую, когда сделаю хотя бы шутан простенький. Я дальше реализую 256 цветовой диапозон
Сергей
Вообще тик вроде может 31 цвет выдавать https://tic80.com/play?cart=3361
зашел посмотреть цвета, в итоге залип в ремейк портала
Domka
Который мы заслужили
Domka
[Шутка]
Сергей
ну неплохой между прочим
Domka
Ну тип демейком такие вещи обзывают, извините что умничаю :^)
Сергей
а ну кстати да, верно
Domka
Прост смешно тип прозвучало, потому подметил
Domka
Ну там есть пару годных вещей
Domka
Все же портал самый такой технологичный, но и лагает е богу
Сергей
У меня не лагает
Domka
На сайте проходил?
usernameak
у макоси dylib
у макоси вперемешку dylib, so и без расширения вообще :)
usernameak
Igor
у макоси вперемешку dylib, so и без расширения вообще :)
Я so библы на макоси видел только у сторонних прог вроде, хз