Пакет QSP для Sublime Text (подсветка синтаксиса и билдер)
Всем привет.
В общем, тут как-то звёзды сошлись.
Вопросы Викара и попытка редизайнить свой сайт заставили ознакомиться с git и github; перелопачивание старого QSP-кода заставило пожалеть об отсутствии системы контроля версий в Qgen; а Pseudopod показал, что оказывается можно разрабатывать игры на QSP и не в QGen. Ещё до кучи я возобновил своё знакомство с Python, ну а поскольку моим любимым текстовым редактором уже многие годы остаётся Sublime Text, всё это вылилось в попытку написать скрипт вроде того, что предлагал evp когда-то (https://qsp.org/forum/777-sovmestnaa-razrabotka).
И к моему удивлению заработал сначала скрипт, а потом мне даже удалось превратить это в почти самостоятельную Build System (ну, конечно, многое придётся прописать руками).
Получился QSP-Builder for Sublime Text и умеет он: собирать из разрозненных файлов в формате TXT2GAM файлы “.qsp” и запускать их в плеере. Таким образом осуществляется как бы прямой запуск игры (на основе только что написанных файлов) из Sublime Text.
Сейчас для установки вам достаточно:
1. Скачать архив с последним релизом со страницы релизов https://github.com/AleksVersus/JAD_for_QSP/releases
2. Распаковать архив и скопировать файл QSP.sublime-package в папку Packages в месте установки Sublime Text (Например, в C:\Program Files\Sublime Text\Packages)
3. Profit. Подсветка синтаксиса QSP и билдер установлены в Sublime Text.
Предварительно должен быть установлен по особому пути плеер, либо в файле проекта прописан путь к нужному плееру. Внимательно читайте документацию: https://github.com/AleksVersus/JAD_for_QSP#readme
https://github.com/AleksVersus/JAD_for_QSP



О проблемах, замечаниях и предложениях просьба отписываться сюда, или на aleksversus@mail.ru. За остальными ресурсами мне тяжело будет следить.
Что даёт QSP-Builder для Sublime Text:
- Контроль версий. Поскольку все части игры хранятся в виде текстовых файлов (исходного кода), они легко обрабатываются системами контроля версий, например GIT. Таким образом, вы можете проследить все этапы создания вашей игры, и быстрее находить ошибки.
- Совместная разработка. Вы можете организовать общий репозиторий, например на GitHub, и разрабатывать игру командой, при этом видя, кто и какие изменения вносит в проект.
- Удобство модульной разработки. Вы можете одновременно в одной программе работать над всеми модулями вашей игры, или открывать для каждого модуля своё окно, или пользоваться любыми иными возможностями Sublime Text, а затем собрать и запустить игру, нажав всего одну комбинацию клавиш. QBST соберёт все нужные вам файлы “.qsp” и запустит игру в плеере по нажатию пары клавиш.
- Один редактор - много плееров. В специальном файле проекта можно для каждой игры указать собственный плеер. Таким образом, одну игру вы можете разрабатывать например для qSpider, одну для Quest Navigator, а другую для классики. И вам не придётся ставить себе три Quest Generator с разными настройками для плееров.
- Sublime Text. Sublime Text умеет подсвечивать HTML, JavaScript и CSS, что очень сильно облегчает разработку игр для Quest Navigator и qSpider. Если вам сильно не хватало проверки орфографии в QGen, то здесь вы можете себе её сделать. Поиск и замена лишь по определённым файлам и папкам (а значит и локациям)? В Sublime Text есть и это. Сложно придумать, что умеет QGen и не умеет Sublime Text — гораздо проще придумать, что умеет ST и не умеет Quest Generator.
В конечном счёте всё превратилось в рекламу Sublime Text, но я и правда фанат этой программы.
Новости на сегодняшний день:
1. Билдер собирает файлы игр QSP из текстовых файлов в кодировке utf-8 и с раcширениями .qsps, .qsp-txt, .txt-qsp.
2. Написана основная часть подсветки синтаксиса QSP для Sublime Text. Неплохо справляется со всеми моими файлами:
* Мне очень нравится, как подсвечиваются комментарии, проверял на очень сложных — работает прекрасно
* Вменяемо подсвечиваются начало и конец локаций, их содержимое.
* Сейчас идёт борьба за рекурсивную подсветку во вложенных выражениях и скобках.
* Многие синтаксические ошибки уже подсвечиваются довольно адекватно.
3. Добавил скрины в шапку.
Aleks Versus,
В планах есть как-то подсвечивать html? Ибо он в строках и всё это сливается в одно сплошное месиво :(
Oliver,
На самом деле я только вчера добавил включение подсветки HTML.
(В принципе можно любую уже имеющуюся в sublime text подсветку таким же макаром встраивать. Например, сам HTML поддерживает встраивание подсветки кода JS и CSS. Единственная проблема это адекватные маркеры начала и конца таких фрагментов кода)
Что умеет подсветка синтаксиса сейчас
1. Подсветка текста между локациями, как комментариев. Так как весь этот текст игнорируется при экспорте в QSP.
2. Распознавание начала и конца локации и соответственно подсветка этих элементов.
3. Подсветка сложных многострочных комментариев.
4. Подсветка строковых констант.
5. Подсветка числовых констант, системных переменных, операторов и функций.
6. Подсветка вложенных выражений (подвыражений) в строках.
7. Подсветка основных синтаксических ошибок:
* Лишний `$` перед именами числовых системных переменных или функций.
* Отсутствие `$` перед именами текстовых системынх переменных и функций.
* Звёздочка `*` перед именем операторов, кроме `*pl`, `*p`, `*nl`, `*clr`.
* Неверное число операндов у операций типа `+`, `-`, `*`, `<`, `>` и т.д.
* Подсветка неправильных имён переменных типа `123build`.
* Разрыв строки кода внутри вложенного выражения.
* Подсветка лишнего `end`, а так же `else` и `elseif` вне конструкций условий.
* Подсветка неправильной записи `else` и `elseif` в многострочном условий.
* Незакрытый многострочный `act` или `if` вызывает подсветку элемента “конец локации”, как ошибки.
8. Подсветка HTML-кода в фигурных скобках и строках при вставке тегов `<html>`, `</html>`.




Автоматический включение подсветки QSP-кода
Подсветка автоматически включается для файлов с расширениями “.qsps”, “.qsp-txt”, или “.txt-qsp”. Если Вам нужно чтобы подсветка QSP-кода автоматически включалась для файлов с другими расширениями, пропишите в начале таких файлов строку:
QSP-Game
После слова `Game` можно поставить пробел и добавить ещё какой либо текст, например название игры или модуля.
Aleks Versus,
О, красота. Спасибо за работу!
Совершенно забыл поделиться новостями, так как отписывался в дискорде, и всё вылетело из головы. Но в соседней теме sal0mander напомнил.
Чтобы экспортировать проект из Quest Generator в текстовый вид (чтобы локации были разбиты на отдельные файлы и рассортированы по папкам), в формате TXT2GAM, был разработан скрипт на Python.
Лежит этот скрипт здесь: github/JAD_for_QSP/QBST/spliter
Разделитель для QSP-игр в формате TXT2GAM
Данный скрипт предназначен в первую очередь для того, чтобы разделять большие файлы игр, написанных в формате TXT2GAM, на локации.
Требования к файлам
Исходный файл, который будет разбиваться на различные файлы, должен быть в идеале экспортированным из Quest Generator в формате TXT2GAM.
В идеале кодировка UTF-16 с BOM-символом в начале. Либо кодировка UTF-8.
Начало локации должно записываться как:
# название_локации
Конец локации обязательно должен записываться как
--- название_локации ---------------------------------
Как использовать
Экспортируйте игру в текстовый файл формата TXT2GAM. Можно сделать это прямо из Quest Generator’а: меню “Игра - Экспорт - Текстовый файл формата TXT2GAM…”
Скопируйте получившийся текстовый файл в папку со скриптом, туда же скопируйте файл проекта с расширением .qproj. Данный файл служит опорным файлом для размещения локаций по папкам.
И экспортированный текстовый файл и файл проекта переименуйте в game.txt и game.qproj соответственно.
Запустите скрипт. На данном этапе у вас наверняка уже установлен Python, и файлы .py ассоциированы с ним. Поэтому достаточно просто попытаться открыть файл, как вы это делаете с любым другим. Если файлы скриптов не ассоциированы с Python, попробуйте щёлкнуть правой кнопкой мыши по файлу скрипта, выберите пункт “Открыть с помощью… - Выбрать другое приложение” и укажите путь к интерпретатору Python.
Может открыться окно командной строки и ненадолго зависнуть.
Результат
По завершении работы скрипта в папке со скриптом появится папка export_game, в которой будут лежать все файлы локаций, рассортированные по папкам, как это было в Quest Generator.
Имена файлов при этом будут сгенерированы автоматически из имён локаций, все запрещённые символы будут заменены на символ нижнего подчёркивания _.
Если в результате работы скрипта получатся совпадающие имена файлов, к именам файлов будут добавлены числа. То же самое касается случая, когда вы повторно запускаете скрипт в папке с уже разбитыми на файлы локациями.
Добавлены сниппеты:
Сниппеты — это стандартные фрагменты кода, которые можно вставить, набрав ключевое слово, или часть строки кода, и нажав клавишу Tab. Переключаться между полями вставленного фрагмента так же можно с помощью клавиши Tab.
Вот какие сниппеты вы можете использовать:
newloc или последовательный ввод # (диез и пробел) - добавляет новую локацию:
# название_локации
!@ Код, выполняемый при посещении локации
--- название_локации ---------------------------------
addobj - добавляет одну из строк кода:
addobj "Название предмета","путь к файлу картинки/picture.jpg",позиция
addobj "Название предмета"
act - добавляет действие:
act "Название действия":
!@ Код действия
end
if - добавляет конструкцию условия:
if условие_выполнено:
!@ Если условие выполнено
!@ Код, который выполняется, если условие выполнено
end
ifelse - добавляет условие с ветвлением:
if условие_выполнено:
!@ Если условие выполнено
!@ Код, который выполняется, если условие выполнено
else:
!@ Если условие не выполнено
!@ Код, который выполняется, если условие не выполнено
end
Внёс кое-какие изменения, но пока что только в исходники.
1. Теперь доступна вставка стандартных HTML-тегов вокруг выделенного текста по нажатию одной-дух клавиш.
2. Можно нажать Ctrl+R и это вызовет меню GOTO, которое позволит переместиться к любой локации в текущем файле (локации подтягиваются в список), или к метке (так же подтягиваются в список).
3. Можно нажать Ctrl+Shift+R и переместиться к любой локации в проекте.
4. Так же добавлена автоматическая вставка отступов, если пишешь act, loop if и т.п., а затем после двоеточия нажимаешь Enter. end напротив сокращает отступ. Таким образом автоматизируется “правильное” преформатирование.
До очередного релиза переписывать README особо не буду, но чуть-чуть поправил, так как установка теперь слегка изменилась. Горячие клавиши и система сборки теперь будут размещаться рядом со схемой подсветки, т.е. в QSP.sublime-package.
Буду думать, как автоматизировать установку.
Отличная работа, Алекс. Продолжай в том же духе, упрощай авторам жизнь!
Oliver,
спасибо. Если будут идеи, что добавить, или может о чём рассказать по Билдеру/Сниппетам/Подсветке, жду их здесь, в этой теме.
Итак, очередной релиз. В этот раз я внёс одно существенное дополнение в работу скрипта — это препроцессор. Он очень простой, примитивный, никаких макросов, только обработка спец.комментариев и самых простых команд выставления меток и проверки условий.
Тем не менее думаю данная возможность будет многим полезна.
Команды препроцессора и спец.комментарии будут выделяться при подсветке.

Так же рекомендую внимательно перечитать файл README.md, так как порядок установки теперь изменился.
Тем, у кого установлена старая версия:
1. Можно удалить файл qsp.sublime-build из Packages/User (Меню Preferences -> Browse Packages - открыть папку User). Этот файл теперь лежит в QSP.sublime-package. Именно оттуда его нужно извлечь, изменить пути к интерпретатору python, и к файлу main.py билдера, а затем упаковать обратно.
2. Можно удалить сочетания клавиш из Packages/User/Default(Windows).sublime-keymap (Меню Preferences -> Key Bindigs), так как эти сочетания теперь прописаны в файле Default.sublime-keymap в QSP.sublime-package.
3. Нужно заменить старый QSP.sublime-package на новый. Само собой файлы билдера (main.py, function.py, pp.py) так же нужно заменить на новые.
Опубликовано видео, в котором некоторым образом освещаются способы бэкапа проектов, но основная часть уделена написанию игр в Sublime Text и установке QBST и QSP-пакета в Sublime Text.
YouTube: jgAnP4Hrfvk
Новый релиз QSP-Builder. v.0.5
Изменения в поведении подсветки синтаксиса и поведении редактора Sublime Text:
- [2021.07.03] Добавлено поведение: При нажатии Ctrl+/ все выделенные строки помечаются, как однострочные комментарии. При нажатии Ctrl+Shift+/ весь выделенный текст помещается в блок комментария ! .
- [2021.07.03] Добавлен сниппет в привязке к горячим клавишам. При нажатии alt+/ вставляется строка комментария & !@ без текста.
- [2021.07.03] Багфикс подсветки. Неверно вытеснялись scope внутри локации, все подменялись на meta.diff.
- [2022.02.16] Изменён тег выделения html-кода внутри строк QSP-кода на <qhtml></qhtml>. В таких плеерах, как Quest Navigator и qSpider недопустимо в дереве DOM наличие ещё одних тегов <html></html>.
Изменения в работе Билдера:
- [2022.05.27] Добавлена возможность проводить собственную постпроцессорную обработку с помощью python-скриптов, подключаемых через project.json. При этом можно повесить неограниченное количество скриптов, при этом набор скриптов можно использовать как общий для всех собранных файлов формата txt2gam, так и для каждого отдельного такого собранного файла. В этот раз решено отказаться от лишнего вложения словарей с “path” в список, а все пути просто перечисляются элементами в списке.
- [2022.05.27] Добавлен упрощённый запуск простых файлов. Если вы написали qsps файл, который лежит не в папке проекта, вы можете запустить его без создания project.json, а точнее project.json будет создан автоматически. При этом в папке C:\Program Files\QSP\converter обязательно должен лежать свежий txt2gam.exe, а в папке C:\Program Files\QSP\qsp570 классический плеер, и в частности файл qspsgui.exe. Заменить классический плеер на иной можно, отредактировав в main.py билдера путь в переменной player_exe (12-ая строчка программы), заменив его на свой.
- [2022.05.28] Добавлен параметр “scans”, который позволяет автоматически встроить в игру локацию, содержащую список требуемых для игры файлов. Список файлов так же составляется автоматически на основе списка “исследуемых” папок и файлов. В локацию уже встроен механизм проверки, достаточно передать на неё путь, который требуется проверить, в качестве аргумента, и она вернёт 1 (если путь в списке есть) или 0 (если пути в списке нет). Все пути, добавляемые на локацию, будут относительным, и выстраиваются относительно файла .qsp, прописанного в параметре “start”. Пути, которые невозможно прописать относительно этого файла, игнорируются и не добавляются в список.
Следующим этапом планирую написание установщика, который поможет без ручного прописывания разных путей установить билдер в систему.
Aleks Versus,
Честно говоря, не хватает словарного запаса для большей выборки комплиментарных реплик в сторону твоей персоны за то, что продолжаешь работу над улучшением действительно полезного для всего комьюнити продукта. Поэтому скажу (точнее напишу) простое человеческое спасибо :)
Oliver,
спасибо за тёплые слова. =)
Я несколько выпал из комьюнити, и из изучения python. Разработка установщика поэтому несколько затянулась. Однако я переписал скрипт конвертера Вервольфа (https://codepen.io/srg-kostyrko/full/QWqdwxv) на python, в результате чего был улучшен splitter - дополнительный скрипт, который ранее разбивал на части большой qsps-файл.
Теперь в папке converter-splitter лежат три файла скриптов.
- qsp_to_qsps - скрипт конвертера. Может использоваться самостоятельно. прописываете в нём путь до QSP-файла, запускаете, появляется файл qsps-формата (TXT2GAM, но в кодировке UTF-8)
- splitter - для его запуска требуется наличие скрипта qsp_to_qsps. Это скрипт разделителя, которому можно скармливать как QSP-файл, так и qsps-файл. Разделитель разбивает исходный файл на отдельные qsps-файлы локаций.
- main_cs - скрипт простого запуска. Работает только при наличии предыдущих двух скриптов. Поместите рядом с этим скриптом файл игры и её модулей, а так же одноимённые файлы “.qproj”, и запустите скрипт. Он автоматически сконвертирует все QSP-файлы в qsps, разобьёт на отдельные файлы-локации и разместит по папкам.
Релиз пока не делаю. Думаю написать python-аналог утилиты txt2gam, чтобы её не приходилось устанавливать и прописывать в проекте. Т.е. это будет конвертер, который работает по умолчанию без дополнительных приложений. Таким образом необходимо будет указывать только путь к плееру в project.json. Вот тогда, надеюсь, и сделаю новый релиз.