Пакет QSP для редактора Sublime Text включает в себя подсветку синтаксиса для языка QSP, встроенный билдер, собирающий и запускающий QSP-игры из файлов-исходников, а так же наборы сниппетов, инструментов работы с проектом и другие элементы, облегчающие разработку игр на QSP.
[!tips] Подсказка. Если вы не имели дела с Sublime Text, есть краткая пошаговая инструкция по первому запуску игры с нуля: Краткая инструкция по установке пакета QSP для Sublime Text
Всем новичкам в разработке игр на QSP я предлагаю начинать с Quest Generator, так как он удобен, прост и интуитивно понятен. Пишешь локации, нажатием на кнопку запускаешь игру — тестируешь.
Тем же, кому не достаёт возможностей в Quest Generator, предлагаю воспользоваться более удобным и функциональным редактором Sublime Text.
Вот какие преимущества даёт Sublime Text с установленным в него пакетом QSP:
.qsp
" и запустит игру в плеере по нажатию пары клавиш.$
перед именами числовых системных переменных или функций.$
перед именами текстовых системных переменных и функций.*
перед именем операторов, кроме *pl
, *p
, *nl
, *clr
.+
, -
, *
, <
, >
и т.д.123build
.end
, а так же else
и elseif
вне конструкций условий.else
и elseif
в многострочном условии.act
, loop
или if
вызывает подсветку элемента "конец локации" или фигурной скобки, как ошибки.local
или set
.<qhtml>
, </qhtml>
.act
, if
, else
, elseif
, loop
, end
. Правильная подсветка end loop
, end act
, end if
- такие сочетания подсвечиваются, как отдельное ключевое слово.Ещё на заре появления QSP была создана утилита TXT2GAM, которая позволяет разрабатывать игру в виде текстового файла (исходника) в любом текстовом редакторе, а потом конвертировать исходник в готовый файл игры.
Вкратце. Файлы формата TXT2GAM (исходники) — это обычные текстовые файлы, в которых код QSP записывается по определённым правилам. В данном руководстве данный формат будет называться форматом qsps по названию уже общепринятого расширения для подобных текстовых файлов ".qsps
". Однако файлы формата qsps могут иметь любое иное расширение: ".txt
", ".start
" и т.п.
В таких файлах нет возможности работать с базовым описанием и базовыми действиями локации, а только лишь с кодом поля "Выполнить при посещении", если работу в текстовом редакторе сравнивать с работой в Quest Generator.
Типичный файл формата qsps выглядит так:
# start
!^ в строчке выше записана метка начала локации.
! она состоит из символа решётки и названия локации.
! название можно отделять, а можно не отделять пробелом от решётки
*pl "Здесь вы видите код локации, соответствующий коду
из поля Выполнить при посещении Quest Generator'а."
! последняя строчка, это метка окончания локации
! она должна начинаться с символа - , за которым
! может находиться любой текст. Обычно это снова
! название локации, или сочетание доп символов и
! названия локации
- start
Весь текст между локациями не попадает в игру
# вторая локация
*pl "
В одном qsps-файле можно размещать несколько локаций,
если это необходимо
"
--- вторая локация ---------------------------------
Более подробно о том, как пишутся игры на QSP в формате TXT2GAM, вы можете узнать из уроков от ELMORTEM: "Пишем QSP-игру в текстовом редакторе".
Непосредственно сами файлы QSP (".qsp
") имеют кодировку utf-16le, тогда как билдер работает исключительно с файлами в кодировке utf-8 (без BOM-символов). Чтобы билдер собирал игру правильно, исключительно важно, чтобы все qsps-файлы вашего проекта имели кодировку utf-8. Будьте аккуратны при использовании спецсимволов, проверяйте соответствие в исходном и конечном файле.
Данная инструкция ориентирована на пользователей, которые скачают последний релиз со страницы релизов: . Установка из исходников будет немного отличаться.
install.QSP.sublime-package.XX.exe
", где XX
— номер версии.manual and examples.zip
", в котором содержится текущая инструкция и различные примеры проектов.QSP.sublime-package.src.zip
" из последнего релиза.Preferences → Browse Packages...
QSP.sublime-package.src.zip
" папку "QSP
". При необходимости замените файлы.Перезагрузите Sublime Text после установки пакета!
Preferences → Browse Packages...
unins000.exe
[!warning] Важно! Перезагрузите Sublime Text после удаления пакета!
QSP-Builder (далее QBST, билдер) — это встроенный в пакет QSP плагин, который:
.qsp
" (QSP-файл);Возникающие при сборке ошибки выводятся в консоль. Консоль открывается сочетанием клавиш Ctrl + ~
.
qsp-project.json
", который и содержит в себе инструкции по сборке проекта (см. раздел qsp-project.json)..qsps
". В качестве исключения можно указывать иные расширения, но в таком случае необходимо будет указывать пути до конкретных файлов (см. раздел "qsp-project.json")..qsp
", по умолчанию сочетание клавиш ["ctrl+alt+q"]
.qsp-project.json
", в плеере. По умолчанию сочетание клавиш ["ctrl+alt+s"]
.["ctrl+f5"]
.Для примера рассмотрим проект моей игры "fantastic battles", которую я писал в Quest Generator.
В этом проекте пришлось разбить игру на отдельные модули для удобства разработки, и всего таких модулей получилось четыре:
fb_v.0.2.qsp
" — основной файл игры, в котором подключаются все прочие файлы модулейintro.qsp
" — модуль вводных данных игрыdrive.qsp
" — основной движок игрыbases.qsp
" — различные базы исходников для игрыКаждый из этих файлов может содержать множество локаций, поэтому для самих файлов ведутся файлы ".qproj
", которые содержат псевдопапки. Например, в "fb_v.0.2.qsp
" локации разбиты на псевдопапки:
[start]
" — стартовая локация без папкисистемное меню
" — папка с локациями основного меню
[1.0_game_start]
" — локация, запускающая игру[0.1_game_info]
" — локация с информацией об игрелокации места
" — папка локаций места, и собственно локации:
[м:0]_общий_вид_локации_места
"[м:1]_дом
"[м:2]_улица
"место;стандартная_кухня
"обязательные локации
" — папка стандартных локаций для этой игры
[chest]
" — сундуки[death]
" — смерть[help]
" — помощьРаботая в редакторе типа Sublime Text, я могу не только разбить данный файл игры на отдельные файлы и разместить их по папкам, но каждую локацию писать в отдельном файле. Я могу создавать подпапки и т.д., а потом собирать те же четыре файла из разрозненных qsps-файлов.
В данном случае я бы выделил отдельную папку под каждый модуль, в том числе — под основной файл игры. Допустим так:
[game]
" — папка с основным файлом игры
start.qsps
" — файл со стартовой локациейсистемное меню
" — папка с локациями системного меню
sysmenu.qsps
" — обе локации системного меню в одном файлелокации места
" — папка для локаций мест, можно дополнить другими папками
стандартные места
" — папка для стандартных локаций мест
общий вид локации места.qsp-txt
" — файл с локацией "[м:0]_общий_вид_локации_места
"кухня.qsps
" — файл с локацией "место;стандартная_кухня
"дом.qsps
" — файл с локацией "[м:1]_дом
"улица.qsps
" — файл с локацией "[м:2]_улица
"обязательные локации
" — папка с файлами обязательных локаций
chests.qsps
" — файл с локацией "[chest]
"death and help.qsps
" — файл с локациями "[help]
" и "[death]
"Необходимо отметить, что при сборке конечного файла из таких разрозненных файлов, к конечному файлу добавляются сначала локации из файлов, которые лежат в папках верхних уровней, затем файлы из папок нижних уровней. Таким образом локация из файла "start.qsps
" окажется в самом верху списка локаций при создании файла ".qsp
". Это особенно важно учитывать, если вы пользуетесь возможностями препроцессора.
Пример с комментариями представлен в файле "[disdocs]\example.json
" (см. на гитхабе).
Как видно из расширения, проект представляет собой JSON-файл. Это значит, что вся его структура состоит из JSON-объектов (в Python - это словари) и JSON-массивов (в Python - это списки). Немного более подробно о файлах формата JSON Вы можете прочитать здесь: https://www.hostinger.ru/rukovodstva/chto-takoe-json. Пока же для краткости скажем, что JSON-объекты записываются в фигурных скобках и состоят из элементов вида ключ-значение, разделённых запятыми. Между ключом и значением обязательно ставится двоеточие, за последним элементом ни в коем случае нельзя ставить запятую. Ключ — всегда записывается с использованием кавычек, то есть это всегда строка. JSON-массивы записываются в квадратных скобках, в которых через запятую перечисляются значения. За последним значением ни в коем случае не ставится запятая. Значениями могут быть числа, строки, другие объекты и массивы.
В данном случае корневым элементом является объект, в котором присутствуют восемь элементов:
"project":[],
"start":"startgame.qsp",
"converter":"C:\\Program Files\\QSP\\txt2gam.exe",
"player":"C:\\Program Files\\QSP\\qsp580\\qspgui.exe",
"save_temp_file": true,
"preprocessor":"Off",
"assets":[],
"scans":{}
Обязательно нужно указать элементы "project" и "start". Если по пути "C:\Program Files\QSP\qsp580\qspgui.exe
" не расположен плеер, нужно так же указать элемент "player". Остальные элементы указывать не обязательно.
Значением элемента "project" является массив однотипных объектов ("билдов"), в которых присутствуют следующие элементы:
"module": "output_file.qsp",
"files": [],
"folders": [],
Элемент "module" содержит путь к конечному файлу ".qsp
", который мы хотим получить.
Элементы "files" и "folders" содержат массивы однотипных объектов. И в том и в другом случае объекты содержат элементы "path", однако для "files" каждый элемент "path" содержит путь к конкретному файлу, из которого мы должны получить локации, а для "folders" каждый элемент "path" содержит путь к папке, и уже из этих папок выбираются файлы ".qsps
".
"files": [
{"path":"D:\\my\\projects\\01_меню.qsp-txt"},
{"path":"game.qsp-txt"}
],
"folders": [
{"path": "."},
{"path": "D:\\my\\projects\\Вопросы"},
{"path": "projects\\Вопросы"}
]
Из элементов "files" или "folders" должен присутствовать хотя бы один. Элемент "build" указывать обязательно. Элемент "postprocessors" можно не указывать.
Значением элемента "start" является путь к файлу, который необходимо запускать в плеере после билда. Это не обязательно должен быть один из собранных файлов, т.е. указать можно абсолютно любой файл ".qsp
".
"start": "startgame.qsp"
Значением элемента "converter" является путь к утилите, конвертирующей файлы формата qsps в файлы ".qsp
". В QBSP уже встроен собственный конвертер, поэтому данный элемент можно не использовать.
"converter": "C:\\Program Files\\QSP\\txt2gam.exe"
Чтобы указать для конвертера дополнительные параметры, используйте подобны формат записи:
"converter": ["C:\\Program Files\\QSP\\txt2gam.exe", "-pMyPass -u"]
Значением элемента "player" является путь к плееру, в котором необходимо запустить игру (например, после сборки).
"player": "C:\\Program Files\\QSP\\Quest Navigator\\QuestNavigator.exe"
Элемент "save_temp_file" разрешает оставлять промежуточные файлы после сборки (т.е. рядом с каждым собранным файлом ".qsp
" будет лежать его исходник в формате qsps с раширением ".txt
"). Ему можно назначать значения true
и false
. Значением по умолчанию является false
.
"save_temp_file": true
Элемент "preprocessor" позволяет включать и выключать препроцессор при сборке файлов. Подробнее см. раздел Препроцессор. Ему можно назначать значения "On"
, "Off"
и "Hard-off"
. Значением по умолчанию является "Off"
.
"preprocessor": "On"
Данный элемент позволяет копировать различные ресурсы из разных источников в папку с билдом игры. Например, удобнее вести css-файлы рядом с исходниками игры, и запускать билд горячими клавишами, при этом нужно, чтобы свежие файлы css при сборке подтягивались в папку с готовой игрой. Вот для таких случаев и предназначен данный параметр.
Значением элемента "assets" является массив однотипных объектов ("ресурсов"), в которых присутствуют следующие элементы:
"output": "..\\[output]\\assets",
"files": [],
"folders": [],
Элемент "output" содержит путь к папке, в который мы хотим разместить перечисленные ресурсы.
Элементы "files" и "folders" содержат массивы однотипных объектов. И в том и в другом случае объекты содержат элементы "path", значениями которых являются пути к файлам и папкам, которые мы хотим скопировать. Пути нужно прописывать относительно файла "qsp-project.json
".
"folders": [
{"path": ".\\assets\\css"},
{"path": ".\\assets\\img"}
],
"files": [
{"path": ".\\assets\\css_1\\extras.css"}
]
При отсутствии элементов "files" и/или "folders" и элемента "output" копирование файлов производиться не будет.
[!danger] Внимание!!! Папки и файлы перезаписываются полностью! Будьте аккуратны и всегда сохраняйте резервные копии всех файлов.
[!warning] Учтите Если вы используете большое количество ресурсов в своей игре, копировать постоянно все не имеет смысла. Используйте ключ "output" при первом копировании, затем замените его на "output_" для тех папок и файлов, которые не требуется постоянно перезаписывать. Оставьте полное копирование только для тех ресурсов, с которыми работает постоянно.
Элемент "scans" должен содержать объект, состоящий из трёх элементов: "location", "files", "folders". Из элементов "files" и "folders" должен присутствовать хотя бы один элемент.
"scans": {
"location": "prv_file",
"folders": [],
"files": []
}
При наличии данного элемента в первый создаваемый "билд" будет встроена локация-функция, сгенерированная автоматически. Во время генерации в эту локацию будут прописаны пути ко всем существующим файлам, перечисленным в элементе "files", и ко всем файлам, которые находятся в папках, перечисленных в элементе "folders". Таким образом данная локация позволит проверять наличие того или иного файла прямо из кода вашей игры. Механизм, обеспечивающий проверку, уже встроен в эту локацию, и возвращает 1
, если файл существует, и 0
— если файл не существует.
"location": "prv_file"
"files": [
"..\\example_game\\res\\img\\scl\\scale-green-leo.bmp",
"..\\example_game\\res\\img\\scl\\scale-space-leo.bmp",
"..\\example_game\\res\\img\\scl\\scl.rainbow.gif"
]
"folders":[
"..\\example_game\\res\\img\\diary",
"..\\example_game\\res\\img\\drive",
"..\\example_game\\res\\img\\ico",
"..\\example_game\\res\\img\\obj"
]
[!warning] Обратите внимание, В файле "
qsp-project.json
" все пути указываются относительно его расположения, но в генерируемой локации все пути будут сгенерированы относительно файла, прописанного в элементе "start".[!warning] Так же обратите внимание, Что локация будет добавлена к первому собираемому модулю. Если это будет не модуль, прописанный в элементе "start", локация будет недоступна без подключения соответствующего модуля.
Пример проверки пути в QSP версии 5.8.0 и выше:
if @prv_file('res\img\ico\p.gif'):
"Файл существует"
else:
"Файл не существует"
end
Элементы "start","module", "path" и другие должны содержать абсолютные или относительные пути к файлам или папкам.
Относительные пути обсчитываются относительно расположения файла "qsp-project.json
" и записываются по следующим правилам:
"lib\\easy.dialog\\mod.qsp"
"lib\\easy.dialog\\mod.qsp"
"\\lib\\easy.dialog\\mod.qsp"
"."
- текущая папка".\\lib"
— вложенная в текущую папку папка "lib". Равносильно такой записи:
"lib"
".."
— папка, в которую вложена текущая"..\\.."
— на два уровня выше текущей"..\\..\\.."
— на три уровня выше текущей"..\\export"
— папка "export", размещённая в одном каталоге с текущей."..\\..\\project\\other_game\\lib"
— два уровня вверх, и от этой папки в "project\other_game\lib
".В папке "[disdocs]\example_project
" есть пример разобранного проекта. Почти все локации разнесены по отдельным файлам и разбросаны в разные папки по функционалу и тематике. Если считать "[disdocs]\example_project
" за корень, то в корне размещён, помимо остальных папок, файл "qsp-project.json
", который и определяет порядок сборки основного файла игры и файлов модулей.
Попробуйте сделать билд этого проекта, если сомневаетесь, что правильно поняли, как работает билдер. При сборке данного проекта в папке "[disdocs]\example_game
" будут созданы основной файл игры "game.sam.qsp
" и файлы различных модулей. Не забудьте прописать свой путь к плееру для правильного запуска. Если Вы используете режим Build and Run, файл "game.sam.qsp
" будет запущен в плеере.
Проект адаптирован под плеер версии 5.8.0. В более старых версиях работать не будет. В 5.8.0 могут присутствовать ошибки в логике некоторых алгоритмов. Пока что я этим проектом не занимаюсь. Возможно, в будущем переведу его на новую версию движка и это будет полноценная демка.
Для удобства определены три режима работы QBST:
["ctrl+f5"]
.["ctrl+alt+q"]
.["ctrl+alt+s"]
.У каждого из режимов есть свои особенности.
"Build and Run" отличается тем, что в этом режиме обязательно собираются заново все файлы ".qsp
", определённые инструкциями "qsp-project.json
", затем, если в инструкциях неверно указан, или не указан, файл ".qsp
", который следует запустить (элемент "start"), запускается самый первый определённый инструкциями собранный файл ".qsp
".
"Build" отличается тем, что в этом режиме происходит новая сборка всех файлов ".qsp
", определённых инструкциями "qsp-project.json
", и больше ничего.
"Run" — в этом режиме не производится новая сборка файлов ".qsp
", но запускается в плеере тот файл ".qsp
", который указан в "qsp-project.json
" в элементе "start", либо, если файл указан неверно или не указан совсем, любой выбранный файл ".qsp
" и открытый во вкладке Sublime Text.
Конвертер qsps_to_qsp является составной частью плагина, но начиная с версии 0.15 пакета QSP на Windows по умолчанию используется сторонний конвертер QGC, ускоряющий сборку проекта в несколько раз, особенно при больших объёмах исходных файлов.
Если вы хотите, чтобы ваша игра собиралась средствами встроенного конвертера qsps_to_qsp, укажите его в элементе "converter" файла "qsp-project.json
":
"converter": "qsps_to_qsp"
Если указать в этом элементе путь к другой программе конвертеру (внешний конвертер), порядок сборки будет таким же.
При сборке содержимое файлов формата qsps добавляется в результирующий файл в следующем порядке:
.qsp
" оказываются локации из самого первого файла в элементе "files".
Данной особенностью можно воспользоваться, если вам нужно строго определить первую локацию в игре, но порядок остальных вас не волнует. Просто выносите эту локацию в отдельный текстовый файл, а расширение ставите ".txt
", или например ".start
", затем указываете путь к файлу самым первым в массиве элемента "files"..qsps
", содержащиеся в папках, перечисленных в массиве элемента "folders
" по порядку, независимо от уровня вложенности. Т.е. если у нас перечислены по порядку папки "1
", "2
" и "3
", то сначала в результирующий файл добавятся локации из папки "1
" и всех её вложенных папок, затем из папки "2
" и всех её вложенных папок, затем из папки "3
" и всех её вложенных папок. При этом первыми всегда добавляются файлы самого верхнего уровня, а потом с более глубоких уровней вложенности. Это особенно важно учитывать, если Вы используете препроцессор.Начиная с версии 0.15 пакета QSP для Sublime Text на Windows по умолчанию используется сторонний конвертер QGC, ускоряющий сборку проекта в несколько раз, особенно при больших объёмах исходных файлов. При сборке проекта с помощью QGC результат будет отличаться от описанного в разделе выше.
Если для отдельного модуля перечислены файлы в элементе "files", то самой первой локацией в модуле окажется локация первейшего из перечисленных файлов.
Если файлы в элементе "files" не перечислены, однако перечислены папки в элементе "folders", самым первым станет файл (и соответствующая локация) на верхнем уровне первейшей папки, или в первейшей из вложенных папок (см. пункт 2 в разделе выше).
Все остальные локации будут отсортированы конвертером по алфавиту.
Упрощённый запуск — это запуск игры без "qsp-project.json
", а вернее "qsp-project.json
" при этом будет создан автоматически. Для такого запуска необходимо, чтобы плеер лежал по адресу "C:\Program Files\QSP\qsp580\qspgui.exe
".
Тогда, если исходник игры ".qsps
" лежит не в папке с проектом другой игры, он будет запущен, как самостоятельная игра.
Подобный запуск удобен, когда вам нужно быстро протестировать небольшой фрагмент кода, а создавать целый проект под это нет смысла: вы можете просто написать исходник, сохранить его вне любого проекта игры, и запустить одним из вышеперечисленных способов.
Начиная с версии 0.10 некритические ошибки выводятся в консоль Sublime Text.
Ошибки в консоли могут иметь следующий вид, что значит, что ошибка в работе самого плагина, или в написанном исходнике игры:
Traceback (most recent call last):
File "D:\my\GameDev\QuestSoftPlayer\projects\JAD\QBST\main.py", line 72, in <module>
qsp.constructFile(build_files,exit_txt)
File "D:\my\GameDev\QuestSoftPlayer\projects\JAD\QBST\function.py", line 44, in constructFile
file.write(text)
File "C:\Program Files\Python39\lib\encodings\cp1251.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2191' in position 29347: character maps to <undefined>
В данном случае ошибка показывает, что имеются проблемы с декодированием. Сообщайте о подобных ошибках письмом на почту aleksversus@mail.ru.
[!warning] ВНИМАНИЕ!!! Если вы столкнулись с тем, что билдер собирает вашу игру не полностью (т.е. некоторые локации не попадают в итоговую версию игры), выставьте параметр "save_temp_file" в значение "True" и посмотрите в промежуточном текстовом файле, какая локация последней попадает в итоговую версию. Где-то с 99% вероятностью следующая за ней локация написана неправильно (например, не закрыта кавычка или фигурная скобка), исправьте эту локацию в исходниках и затем снова запустите билд. Скрипт, равно как и утилита TXT2GAM, конвертирует игру любого объёма, хоть тысяча локаций, хоть тридцать тысяч, если они написаны соответственно формату qsps.
Препроцессор - это набор команд предобработки исходного текста программы перед компиляцией. В нашем случае, до того, как мы сконвертируем файлы проекта в конечные файлы ".qsp
", мы можем исключить из этих файлов некоторые строки, или рекомбинировать их.
Препроцессор написан с нуля, поэтому будут баги и логические ошибки в работе команд. Я ни разу не пользовался сторонними препроцессорами, поэтому могу изобрести велосипед там, где все гоняют на Kawasaki z900. Будьте аккуратны и делайте побольше коммитов.
При препроцессинге билдер работает в несколько раз медленнее.
Для удобства в препроцессор встроены два уровня инструкций: непосредственно команды препроцессора и специальные комментарии.
Специальные комментарии (спецкомментарии):
!@
— комментарий, начинающийся с такого сочетания символов, будет удалён при препроцессинге.!@<
— комментарий, начинающийся с такого сочетания символов, а так же строка, в которой стоит этот комментарий, будут удалены при препроцессинге.Команды препроцессора:
!@pp:on
— включает препроцессинг для текущего файла. Данная команда должна идти первой или второй строкой в файле. Препроцессинг будет происходить только в режимах "On" и "Off". См. раздел включение препроцессора.!@pp:off
— выключает препроцессинг для текущего файла. Данная команда должна идти первой или второй строкой в файле.!@pp:savecomm
- данная команда отключает обработку специальных комментариев. Действует до конца файла, либо пока не встретится нижеследующая команда.!@pp:nosavecomm
- данная команда включает обработку специальных комментариев.!@pp:var(name=123)
- данная команда объявляет метку name со значением "123". Обратите внимание: имена меток могут содержать любые символы, кроме двоеточия и пробела, поэтому допустимой может быть запись:
!@pp:var(123=123)
- эта команда объявит метку 123 со значением "123". Все объявленные значения - текстовые величины. Так же обратите внимание, что если значение и название метки совпадают, при дальнейшем препроцессинге все значения, совпадающие с названием метки, будут восприниматься препроцессором исключительно как названия метки. Более того, все значения сами по себе являются метками, содержащими одноимённые значения!!@pp:if(name==123):exclude
- данная команда проверяет, выполняется ли условие в скобках (содержит ли метка name значение 123), и если условие выполняется, исключает нижеследующие строки кода из конечного файла. Вместо слова exclude
можно использовать другие ключевые слова:
exclude
— исключить последующие строки из конечного файла при выполнении условия. Если условие не будет выполнено, строки будут обработаны препроцессором и включены в конечный файл.include
— последующие строки должны быть включены в конечный файл при выполнении условия, при этом строки будут обработаны препроцессором. Если условие не будет выполнено, строки не будут включены в конечный файл.nopp
— не обрабатывать строки препроцессором при выполнении условия.savecomm
— не обрабатывать специальные комментарии, как инструкции.
Можно комбинировать ключевые слова (например, exclude nopp
и include nopp
).
Содержимое скобок при проверке условия может содержать следующие операции:==
— проверка равны ли два значения. Верно если равны.!=
— проверка не равны ли два значения. Верно если не равны.!@pp:endif
- данная команда указывает окончание блока условия.!
.and
, or
, not
для меток запрещено.!@pp:var(layer)
— объявляет метку layer
.!@
и !@<
должны быть однострочными! Хотя и могут размещаться в строке с другими операторами.*pl "Текстовое значение, разбитое на несколько строк
!@pp:if(layer):exclude
Данные строки будут исключены из конечного файла,
если метка layer была определена.
!@pp:endif
А эта строка останется в конечном файле"
and
и not
:
!@pp:if(layer and quest_navigator):include
"Если метки layer и quest_navigator определены, данная строка останется в конечном файле"
!@pp:endif
if(build_em!=True)
или if(build_em==False)
.qsp-project.json
" значение (режим "On
"):
"preprocessor":"On",
При этом абсолютно все файлы будут подвергаться препроцессингу, в т.ч. исходники модулей. Всё, что собирается проектом, будет обработано перед сборкой. Исключение составляют файлы, для которых препроцессинг отключается командой !@pp:off
.
!@pp:on
Эту команду необходимо указать первой или второй строкой в обрабатываемом файле. Если препроцессор выключен выставлением режима "Hard-off
", данная команда работать не будет.
qsp-project.json
" (режим "Off
"):
"preprocessor":"Off",
Данное значение является значением по умолчанию, поэтому его можно не указывать. При этом файлы, поставленные в обработку командой !@pp:on
, всё равно будут обрабатываться препроцессором.
Hard-off
"):
"preprocessor":"Hard-off",
Данное значение отключает препроцесинг абсолютно для всех файлов, даже если в файлах проставлены команды !@pp:on
. В этом режиме у пользователей Windows сборка будет осуществляться с помощью конвертера "QGC.exe
", что значительно ускорит получение конечного файла игры и запуск в плеере. Строго рекомендуется выставить данное значение, если пользуетесь Windows и ваша игра находится на стадии разработки.
`On
" исключаются файлы, содержащие команду:
!@pp:off
Эту команду необходимо указать первой или второй строкой в обрабатываемом файле.
Подробный пример смотрите в файле "[disdocs]/example_project/[pp-test]/pptest.qsps
".
!@pp:on
!@pp:var(layer=1)
# start
"Текст, который мы увидим на локации."
!@pp:if(layer==1):include
"Этот текст будет включён в конечный файл" & !@ а этот комментарий будет удалён
"Этот текст будет удалён" & !@< вместе с комментарием, потому что препроцессор работает
!@pp:endif
!@pp:if(layer==1):exclude
"Этот текст будет исключён из конечного файла" & ! и комментарий тоже
!@pp:endif
- start
!@pp:on
!@pp:var(layer=0)
# start
"Текст, который мы увидим на локации."
!@pp:if(layer==1):include
"Этот текст не будет включён в конечный файл"
!@pp:endif
!@pp:if(layer==1):exclude
"Этот текст не будет исключён из конечного файла" & ! и комментарий тоже
name=123 & !@< а вот эта строка кода будет удалена
!@pp:endif
- start
Если Вы установили пакет QSP согласно инструкции, значит у вас уже установлена и работает подсветка кода QSP.
Подсветка автоматически включается для файлов с расширениями ".qsps
", ".qsp-txt
", или ".txt-qsp
". Если Вам нужно чтобы подсветка QSP-кода автоматически включалась для файлов с другими расширениями, пропишите в начале таких файлов строку:
QSP-Game
После слова Game
можно поставить пробел и добавить ещё какой либо текст, например название игры или модуля.
Сниппеты — это стандартные фрагменты кода, которые можно вставить, набрав ключевое слово, или часть строки кода, и нажав клавишу Tab
. Переключаться между полями вставленного фрагмента также можно с помощью клавиши Tab
.
Вот какие сниппеты вы можете использовать:
qspgame
вставляет заготовку файла-локации.
newloc
или последовательный ввод #
(диез и пробел) - добавляет новую локацию:
# название_локации
!@ Код, выполняемый при посещении локации
--- название_локации ---------------------------------
addobj
- добавляет одну из строк кода:
addobj "Название предмета","путь к файлу картинки/picture.jpg",позиция
addobj "Название предмета"
act
- добавляет действие:
act "Название действия":
!@ Код действия
end
if
- добавляет конструкцию условия:
if условие_выполнено:
!@ Если условие выполнено
!@ Код, который выполняется, если условие выполнено
end
ifelse
- добавляет условие с ветвлением:
if условие_выполнено:
!@ Если условие выполнено
!@ Код, который выполняется, если условие выполнено
else:
!@ Если условие не выполнено
!@ Код, который выполняется, если условие не выполнено
end
loop
— добавляет шаблон цикла.
Сниппеты с привязкой к клавишам. Выделяем текст и нажимаем клавиши:
alt+h
- Оборачивает выделенный текст в теги <qhtml>
и </qhtml>
alt+/
- вставляет в строку сочетание & !@
. Так вы можете быстрее добавлять комментарии в конце любой строки кода.От себя могу порекомендовать сначала писать разметку в HTML-файле и затем переносить её в QSP. Это будет намного удобнее, к тому же почти все плагины, не будут действовать в QSP-коде.
Ctrl+Alt+Q
— сборка файлов игры без запуска в плеере.Ctrl+Alt+S
— запуск уже собранного файла игры в плеере без повторной сборки.Ctrl+F5
— сборка файлов игры из исходников и запуск игры в плеере.Ctrl+Shift+R
— запускает GOTO по проекту, при этом открывается список локаций по всему проекту, а так же меток на текущей локации.Ctrl+R
— запускает GOTO по текущему файлу, при этом открывается список локаций и меток по текущему файлу.Alt+H
— оборачивает выделенный текст в теги <qhtml>
и </qhtml>
.Alt+/
— вставляет в строку сочетание & !@
.Ctrl+Alt+N
— открывает новое окно в редакторе с уже включённой подсветкой QSP.Ctrl+/
— все выделенные строки помечаются, как однострочные комментарии.Ctrl+Shift+/
— весь выделенный текст помещается в блок комментария ! { ... }
.Вспомогательные скрипты при установленном пакете QSP доступны из основного меню Sublime Text.
Откройте Tools → QSP tools
для доступа к вспомогательным скриптам. Здесь вам доступны:
Make New Game
— данный инструмент открывает новое окно в редакторе с уже включённой подсветкой QSP. Комбинация клавиш для быстрого вызова Ctrl+Alt+N
.Make Quick Project
— создаёт новый стандартный проект QSP.Converters (Single Files)
):
Game to QSPS
— конвертирует QSP-файл игры в файл формата QSPS. Чтобы использовать конвертер, откройте файл с расширением .qsp
в Sublime Text, и выберите данный пункт в главном меню (Tools → QSP tools → Converters (Single Files) → Game to QSPS
).QSPS to game
— конвертирует файл формата QSPS в файл игры QSP. Чтобы использовать конвертер, откройте файл с расширением .qsps
, .qsp-txt
или .txt-qsp
в Sublime Text, и выберите данный пункт в главном меню (Tools → QSP tools → Converters (Single Files) → QSPS to game
).Splitters
):
Split Current File
— разделяет файл QSP, или qsps, на несколько qsps-файлов, каждый из которых будет содержать только одну локацию. Если при этом рядом лежал файл .qproj
, локации будут разделены по папкам, соответственно информации в этом файле. Чтобы воспользоваться сплиттером, откройте файл, который хотите разбить на несколько, в Sublime Text и выберите данный пункт в главном меню (Tools → QSP tools → Splitters → Split Current File
).Split Project
— работает так же, как и предыдущий сплиттер, только отыскивает все файлы QSP и qsps в папке с открытым файлом и разбивает их на локации. Чтобы воспользоваться данным сплиттером, откройте в Sublime Text любой файл из папки, файлы в которой вы хотите обработать, а затем выберите данную команду в главном меню (Tools → QSP tools → Splitters → Split Project
).Analyse
):
Show Local Vars
— выделяет в текущей вкладке локальные переменные. Данный инструмент работает не совсем корректно. Локальные переменные подсвечиваются от объявления и до конца файла, поэтому, если в файле две и более локаций, или локальные переменные определяются для отдельных блоков кода внутри локации, их подсветка будет распространяться и на переменные вне блоков кода, но расположенные по коду ниже.Show Global Vars
— выделяет в текущей вкладке глобальные переменные. Тоже работает не всегда корректно, если переменная была переопределена во вложенном блоке кода, как локальная.Show duplicates of Locations
— выводит на экран попап со списком всех локаций, названия которых встречаются в проекте более одного раза. Работают переходы по ссылкам в файлы, в которых расположены эти локации. Переход непосредственно к названию локации пока не работает.Tab
или Enter
.@foo
) или для операторов gosub
, goto
, $func
.Для более точных сведений о совместной разработке, вам необходимо ознакомиться с системами Git, github, и иными, более подробно. Здесь приводятся лишь основные моменты, с которых могут начать новички.
Для контроля версий разрабатываемой игры необходимо установить на своём компьютере Git. Нижеследующие пункты взяты из инструкции https://htmlacademy.ru/blog/boost/frontend/git-console и ориентированы на пользователей Windows:
Для пробы можете создать новый репозиторий. Для этого:
создайте любую пустую папку. Например, я храню все проекты на диске D:
в папке "projects
", поэтому для нового репозитория я создал папку "new_rep
" ("D:\projects\new_rep
").
откройте командную строку Windows или Git CMD и перейдите в указанный каталог с помощью команды "cd
":
cd "D:\projects\new_rep"
инициализируйте создание нового репозитория (данная команда создаст репозиторий, даже если в папке уже есть содержимое):
git init
Собственно это всё, что нужно для контроля версий. В интернете есть много информации о работе с Git, и в принципе, если вам удобно вести контроль версий, используя консоль, то вам будет достаточно Git Bash. Кое-кому удобен даже Git GUI. Однако...
...если вы откроете один из файлов вашего проекта (репозитория) в Sublime Text, то в строке состояния вы увидите особую отметку, которая показывает число изменённых файлов проекта. Если вы добавите новый файл в тестовый репозиторий "new_rep
", то эта отметка будет выглядеть, как "master|1|
" — то есть 1 изменение в master-ветке проекта.
Дело в том, что Sublime Text автоматически подхватывает списки изменений из Git (условно говоря). Если вы щёлкнете по отметке об изменениях, Sublime Text предложит вам скачать Sublime Merge. Обязательно скачайте и установите, так как Sublime Merge в совокупности с Sublime Text является более удобным Git-клиентом.
По сути Git-клиент — это приложение, которое взаимодействует с системой Git, чтобы обеспечивать вам наглядное и удобное управление вашими репозиториями. Это что-то вроде внешнего GUI для Git.
Любое, или все изменения, можно закоммитить (зафиксировать в истории изменений), используя Sublime Merge. Для этого отмечаете нужные файлы и изменения в них, вводите текст коммита и нажимаете кнопку "Commit". Если вы ещё не указывали "user.name" и "user.email", Sublime Merge предложит вам сделать это.
Теперь, когда у вас есть все инструменты для контроля версий, осталось организовать совместную разработку. Я предлагаю воспользоваться системой github, как наиболее удобным для новичков хранилищем репозиториев.
Всем разработчикам придётся зарегистрировать по одному аккаунту на github. Один из разработчиков должен создать репозиторий для совместной разработки игры. При этом можно выбрать опцию "Private" (репозиторий будет доступен для просмотра вам и выбранным людям) или "Public" (репозиторий смогут просматривать все).
Разработчик, создавший репозиторий, должен выслать приглашения остальным разработчикам. Это делается в разделе GitHub "Settings" — "Manage Access"
Когда у всех разработчиков появляется доступ к репозиторию, каждому нужно зайти в Sublime Merge открыть меню "File" - "Clone Repository", откроется вкладка, в которой нужно указать URL репозитория и другие параметры доступа, например SSH-ключ.
Данное руководство будет пополняться подробностями по мере возникновения вопросов.
Если у вас есть, что спросить, пишите на aleksversus@mail.ru, помогу чем смогу, а ваши вопросы помогут улучшить текст данного руководства.
Пишите обязательно, если у вас есть советы или замечания по работе пакета, и в частности билдера, по наполнению данного руководства и иные.
Расширение Псевдопода для VS Code: QSP + VS Code QSP Game Converter от Alex (studentik), используемый как основной конвертер в пакете QSP: QGC
Канал на YouTube обучающий писать игры на QSP: https://www.youtube.com/c/aleksversus
Сайт с текстовыми играми и программами для создания игр: https://qsp.org
Наша группа в vk: https://vk.com/qsplayer
В дискорде: https://discord.gg/bbbdxhE9M2
Онлайн-версия справочника (+статьи): https://aleksversus.github.io/howdo_faq/
Новые версии плеера:
Поблагодарите отца-основателя платформы Байта: https://qsp.org/index.php?option=com_comprofiler&Itemid=20&user=66
Донаты на развитие проекта и канала на ютубе: