Лисп в изгнании
230 subscribers
156 photos
21 videos
5 files
233 links
Авторский канал на околоайтишную тематику.

По всем вопросам @awkravchuk
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp

Наконец спустя несколько лет экспериментов появилось ощущение, что я использую редактор карт Tiled на полную катушку (есличо, вот эти чувачки на башнях — это полноценные объекты в смысле ECS с отдельным поведением, у которых можно настроить не только анимацию, но и любые другие компоненты, и всё это в самом редакторе) 🔥
🔥11👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp

Ну штош, к начавшемуся этим утром Spring Lisp Game Jam 2024 готов 😊 Накоммитил мелких фиксов в свои библиотеки с утра же и уже к ночи изобразил вот такое дерево поведения (см. вид. 1).
Мог бы быть и поготовее, если бы на позапрошлой неделе не депрессировал и сделал бы хотя бы базовую боёвку, но, как говорится, а выходные на что 😁
6👍1
#новости

Меж тем работая, не покладая рук, пропустил совершенно замечательное — проект по возрождению лисповой системы GOAL, работающей под капотом у игр Jak and Daxter и The Last of Us, под названием OpenGOAL (только зацените, какой у них клёвый лендинг!)
Прям аж сердце радуется при взгляде на большую кодовую базу игры на Common Lisp 🤩
🥰8
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp

Ну чё, пацаны, стенка на стенку? 😁
Сколько ж я с анимациями наебался, просто жуть. А ещё примерно столько же нужно потратить на отладку деревьев поведения у персонажей 😵‍💫
🔥16👍2
#лытдыбр #common_lisp

Итак, пришло время уже полюбившейся постоянным читателям рубрики "ебучий виндус наносит ответный удар". В понедельник с утра мой сотоварищ, помогающий с геймдизайном (и левел-дизайном 🤭) пишет, мол, скинь ассеты к нашей игре на геймджем. Нет проблем, говорю, я тебе сейчас прямо текущий билд скину, там и ассеты, и сразу увидишь, как они в игре будут выглядеть.

У товарища виндус, поэтому я раскочегариваю свой докер-образ с Wine, MSYS и такой-то матерью, позволяющий мне собирать билды игр на Common Lisp под windows, не касаясь этой залупной ОС даже десятиметровой палкой, творю заветное волшебное заклинание wine busybox sh package.sh windows и... сборка не работает, залипая на вызове лиспом сишного компилятора для каких-то потрохов CFFI.

err:sync:RtlpWaitForCriticalSection section 000000007B7192B0 "?" wait timed out in thread 01a8, blocked by 0000, — дружелюбно сообщает Wine. "Ёбаный рот", — думаю я, — "возможно, что-то сломалось в комбинации версии сишного тулчейна и версии Wine". Пикантности ситуации придаёт то, что я, хоть и загружаю эти докер-образа на Docker Hub, тегов к ним не проставляю, поэтому старые версии недоступны (они буквально затираются новыми), и откатиться на версию, работавшую ещё в феврале для моей предыдущей игры не получится.

На всякий случай пытаюсь триггернуть билд с этим новым докер-образом в старом проекте — ну да, залипает, и CI прибивает билд по таймауту. Я понимаю, что это катастрофа, потому что отсутствие билда игры под венду сильно понизит возможность участников джема заценить нашу игру и поставить нам положительную оценочку.

Пытаюсь собрать образ с версией Wine постарше (8.0 вместо 9.0) — SBCL вообще при запуске падает с virtual stack overflow, приехали. Пробую staging версию Wine (9.9), там опять RtlpWaitForCriticalSection timed out. Каждая попытка, кстати, занимает по 40+ минут на сборку образа и пару минут на проверку, так что я этим весельем занимался между делом весь понедельник и вторник.

Окей, дефолтный сишный тулчейн, с которым я всё собираю, — это GCC и UCRT. Пробую собрать всё вместе с самим SBCL Clang-ом — на том же этапе кланговский линкер ругается, мол, не понимаю флажок --export-dynamic. Возникает мысль сделать pull request в саму либу CFFI, отключающий этот флажок для винды, но тут же пропадает — в этом мастодонте некоторые пулл-реквесты висят по пять лет и более.

Вместо этого пробую вместо UCRT старый добрый виндусовый msvcrt.dll вместо сишной стандартной библиотеки, но и тут ждёт облом — SBCL пытается импортировать из неё функции log1p и log2, которые эта доисторическая пародия на стандартную библиотеку C не берёт на себя труд экспортировать. Что забавно, SBCL при этом компилируется и запускается, но при запуске жалуется, что missing required foreign symbol log1p, а при попытке вызова функции log ожидаемо крашится.

Попытка запуска SBCL, собранного с UCRT, в msvcrt-шном окружении, предсказуемо приводит к лисповому кондишену Unhandled memory fault. На этом заканчивается понедельник.

(1/2)
😱3
Лисп в изгнании
#лытдыбр #common_lisp Итак, пришло время уже полюбившейся постоянным читателям рубрики "ебучий виндус наносит ответный удар". В понедельник с утра мой сотоварищ, помогающий с геймдизайном (и левел-дизайном 🤭) пишет, мол, скинь ассеты к нашей игре на геймджем.…
(2/2)

Во вторник пытаюсь понять, в каком конкретно компоненте проблема, может, в какой-то из DLL, от которых зависят собранные MSYS-овским GCC бинарники? Таких несколько — libgcc_s.dll и libstdc++-6.dll из пакета gcc-libs, libwinpthread-1.dll и... и тут меня осеняет, косяки с WaitForCriticalSection и виндусовая реализация POSIX threads, ну вот оно!

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

К вечеру уже совсем детально заныриваю в проблему. SBCL запускает GCC для компиляции потрохов пакета CFFI, а тот залипает. Окей, давай я сам попробую этот файл скомпилить. Залипает. А hello world GCC вообще может скомпилить? Может. Странно, так залипает, а так нет. После получаса ковыряний понимаю, что залипает на самом деле вызываемый GCC линкер ld.exe, и только тогда, когда вызван с ключом --export-dynamic, который, кстати, поддерживается только для ELF-файлов, а для виндусовых .exe не имеет смысла, о чём ld и сообщает руганью типа warning: --export-dynamic is not supported for PE+ targets, did you mean --export-all-symbols? перед тем, как залипнуть.

Тогда я пытаюсь заменить пакет binutils, в который входит ld.exe, на более старую версию — буквально минор на единичку меньше, и, о чудо, сборка проходит нормально! Матерясь, уже на ночь глядя включаю этот хак в докер-образ, собираю его (ещё 40 минут) и уже сегодня с утра наконец готов виндусовый билд текущего кода игры.

TL;DR: в рот ебал этот ваш виндус.
💩6💯3
#лытдыбр #common_lisp

Конечно же, с игрой на джем уже проводил тесты вида "а что будет, если на карту накидать несколько сотен персонажей", и FPS как-то грустно проседает с двух тысяч до 800, а при совсем больших количествах (ближе к тысяче) и до 150 кадров в секунду.

Для анализа произволительности удалось заставить заработать замечательный cl-flamegraph Александра Артеменко (трюк в том, что сначала нужно грузить сам cl-flamegraph, и только потом своё приложеньице). По результатам его работы видно (см. рис. 1) удивительное — львиная доля времени CPU тратится на вызов функции отрисовки спрайта через CFFI!

Причём я даже догадываюсь, почему так — функция al:draw-tinted-scaled-rotated-bitmap-region, которую я вызываю, принимает на вход структуру с цветом по значению, что CFFI традиционно делает через жопу. А функции без цвета я использовать не могу, потому что мне надо одновременно вращать и масштабировать спрайт, а это в liballegro можно только в комплекте с цветом.

Короче, по крайней мере хорошо, что понятно, где проблема 😁
7🙏1
#лытдыбр #common_lisp

Обнаружил себя в том месте своей жизни, в котором моя фантазия привела меня к описанию в коде проблематики овечьего секса 😅😂
🌚7😁4👍1
#лытдыбр #common_lisp

Ну штош, с приходом уикэнда весенний Lisp-геймджем '2024 выходит на финишную прямую, а значит, самое время опубликовать мою новую библиотеку, использованную в игре для джема, а именно — парсер для формата файлов редактора пиксельарт-анимаций Aseprite под названием cl-aseprite, благо во время разработки игры вроде бы баги выловил и сегодня с утра исходники причесал. Библиотека доступна по MIT лицензии и уже есть в Quicklisp-дистрибутиве LuckyLambda. Ура 😊🎉
🔥14👍3
#лытдыбр #проекты #common_lisp

Раз, два, три, четыре, пять, завершаю кранчевать 😂 После бурной разработки с товарищем сегодня в 3 утра по центральноевропейскому времени зарелизил игру для весеннего Lisp Game Jam '24: Cycle of Evil. Наверное, сегодня-завтра даже разрожусь постом-постмортемом)

P.S. itch.io прилёг полежать, поэтому вот ссылка проекта на Github.
🔥11❤‍🔥11
#проекты #common_lisp

Ну штош, пришло время подвести итоги весеннего геймджема и голосовать за других участников, а то уже время поджимает, а их больше, чем когда-либо. Вот они (без какого бы то ни было осмысленного порядка):

✔️ По мере разработки накоммитил кучу фиксов в свои библиотеки и даже опубликовал новую.
✔️ Иметь свой Quicklisp-дистрибутив удобно, можно иметь при сборке билда чётко те версии библиотек, которые тебе нужны.
✔️ В целом начинают вырисовываться очертания универсального 2D движка, который я давно вынашиваю в планах, а названия толкового ещё не придумал.
✔️ Думать и проектировать игры в терминах ECS невероятно прикольно, быстро и гибко. Типа, определяешь какие-то базовые ортогональные элементы данных, типа "дочерний объект", "позиция", "звуковой эффект", "спрайт", а потом их по-всякому между собой креативно комбинируешь.
✔️ Хорошо также иметь работающий, отлаженный и оптимизированный алгоритм поиска пути A*, но есть проблемки с дискретностью игрового пространства, т.е. очень часто персонаж, повинуясь A*, пытался добежать из своей текущей позиции до центра текущего тайла, что не всегда выглядит естественно.
✔️ Декларативный UI — это каеф, даже если, как в моём случае, у него со всех сторон торчат уши нижележащей сишной библиотеки Nuklear.
✔️ Окончательно выяснилось слабое звено в плане производительности. Я-то комплексовал, что этим слабым звеном окажутся деревья поведения, создающие по одной ECS-системе и одному компоненту на каждый узел дерева, а они в игре были довольно развесистыми, вот, например, для крестьянина, добывающего мясо из овечек. Но оказалось, что этим слабым звеном всю дорогу была передача сишных структур в сишные же функции "по значению" (т.е. через стек), в частности, функция для отрисовки спрайтов персонажей, вызываемая по несколько раз для каждого персонажа, требует на вход структуру с цветом, поэтому когда персонажей в игре больше сотни, FPS проседает до 130 кадров в секунду, что уже довольно мало — если FPS в моей двухмерной игре упадёт ниже частоты обновления монитора, я это буду воспринимать как личное оскорбление 😅
✔️ Как уже много раз до этого, совершил ошибку откладывания разработки непосредственного контента на последний день, сконцентрировавшись изначально на коде. Пора бы уже действительно зарелизить некий универсальный движок и делать более проработанные игры 😅
✔️ Кроме того, я всё утро воскресенья пилил функционал отравления мяса крестьянами, который должен был стать одной из мета-механик, но в итоге в угаре горящего дедлайна мы с товарищем-геймдизайнером про неё забыли 😢
✔️ Билд под макось, кажется, работает 😊 Правда, кастомный курсор, в отличие от других ОС, не отображается.
✔️ В целом, получившуюся игру можно несложным образом превратить в полноценную стратежку, просто такой цели у нас с товарищем изначально не стояло, поэтому у нас снова indirect player control 🤣

Больше подробностей будет в субботнем девлоге 😊
11❤‍🔥1
#анонс

Вот уже в следующий четверг, 06.06 в 19:00 по МСК буду выступать на онлайн-митапе по функциональщине, организованном широко известными в узких кругах HealthSamurai. Буду рассказывать, как же клёво писать игры на лиспах 😊

Мероприятие онлайновое и бесплатное, но нужна регистрация, поэтому айда: Функциональное программирование для всех
🔥8
#проекты #devlog #common_lisp

А вот и девлог игрового движка на Common Lisp с чуть более подробным разбором внутрянки игры на геймджем 🔥
Как обычно, с русскими субтитрами на всякий случай.
Если бы мои ебучие соседи не праздновали сегодня в третий раз день независимости до пяти утра, оно даже могло бы быть не таким сумбурным
https://youtu.be/27B-xpgCYOQ
👏4👍1
Вот уже через час начнётся митап про функциональщину. Присоединяйтесь, буду там лечить про игры на лиспах 😊

P.S. Запись потом тоже будет на ютубе 👌
👍7🔥3
#лытдыбр #common_lisp

И вот библиотека cl-aseprite для чтения файлов пиксельного редактора анимаций Aseprite в новой версии 0.1.0 обзавелась комплектом тестов и красивой страничкой документации 😊

Хотя, пока допиливал её, подумал, что так-то анимации вроде бы можно хранить и внутри файлов также используемого мной редактора карт Tiled, так что теоретически можно вообще целиком делать контент игры, не вылезая из него, получается этакий родной редактор карт для движка. В ближайшее время займусь проверкой этого варианта.

Вот так потихоньку вырисовываются черты ресурсной системы движка 😌
👏6
#лытдыбр #common_lisp

Закоммитил функцию, с помощью которой строил демонстрационную картиночку к митапу HealthSamurai. С помощью неё можно творить, например, вот такую красоту (см. рис. 1) 😊

Зато памяти жрёт чёртову прорву, когда я строил ту картиночку, бенчмарк для бедных системный макрос time мне сообщал, что она нагенерила ~700 кб мусора 😱
7😱1
#лытдыбр #common_lisp

Вчера натолкнулся на вот такой замечательный инструмент для построения графа зависимостей Common Lisp-овых систем — это так на CL-овском жаргоне по сути называется то, что в других языках зовётся библиотекой, только, как всегда, более гибкое 😊 Причём впервые такого рода инструмент у меня заработал без проблем, плюс в нём есть крутая фича по выводу лицензий всех зависимостей. Решил из интереса натравить его на последний проект, игру Cycle of Evil, и тут я с ужасом вижу в списке лицензий, помимо крайне либеральных MIT, zlib, и вовсе Public Domain, вирусную GPLv3 у библиотеки lisp-binary, от которой зависит моя новая либа для чтения Aseprite-файлов, и с ужасом же вспоминаю, почему я 4 года назад, когда делал разбор Aseprite-файлов в своём проекте d2clone-kit, не стал брать lisp-binary — хоть она клёвая и предоставляет удобный и мощный DSL для разбора бинарных файлов, вирусная GPL накладывает серьёзные ограничения на потенциальных пользователей моего кода.

Пришлось под шумок перелицензировать и Cycle of Evil, и либу cl-aseprite под той же GPLv3, чтобы её юзерам сразу было понятно, что почём 😩
Видимо, придётся-таки, как я и думал, хранить анимации в Tiled-файлах, но там тоже есть свои ограничения — остаётся надеяться на его, Tiled, быстрое развитие, хоть уже сам сдувай пыль со своих C++/Qt навыков и лепи пуллреквесты 😅
#анонс

Коллеги организуют, надеюсь и сам попробовать поучаствовать 😅