Переход с QSP 5.7.0 на 5.9.x
Многие авторы, начинавшие разработку игр для плееров версии 5.7.0, боятся переводить проекты на более свежие версии из-за обилия изменений. Байт активно обновляет основную библиотеку QSP уже пять лет, и количество введённых изменений действительно может пугать.
Но на самом деле всё не так страшно.
Список по-настоящему критических изменений весьма скромен, и эта статья поможет безболезненно перевести проект на более новый и быстрый плеер.
Мы не будем подробно описывать все нововведения — они уже описаны в нескольких статьях. Сосредоточимся на практических шагах, попутно раскрывая наиболее значимые изменения в работе плеера по сравнению с версией 5.7.0.
Все нововведения уже отражены в онлайн-справке: wiki.qsp.org
Вот список статей, которые помогут более детально познакомиться со всеми изменениями:
- https://vk.com/@qsplayer-novovvedeniya-v-qsp-580,
- https://vk.com/@qsplayer-novovvedeniya-v-qsp-590,
- https://vk.com/@qsplayer-chto-novogo-v-qsp-591,
- https://vk.com/@qsplayer-novovvedeniya-v-qsp-592-594.
Инструменты
Для правки игры вам потребуются следующие инструменты:
-
Утилита TXT2GAM — конвертирует игру в формат текстового файла и обратно.
- Скачать можно с официального сайта или со страницы релизов на GitHub.
- Если не знаете, как пользоваться утилитой, прочитайте краткое руководство.
-
Анализатор QSP-кода — быстро сканирует игру в формате текстового файла и предоставляет список возможных ошибок, имена переменных, локаций, действий, предметов и прочее.
- Скачать можно по ссылке из темы на форуме, посвящённой Анализатору.
- Или из архива на меге "QSP/Программы". ← Смотрите папку "QSP-Analyser". Для первого раза лучше выбрать последнюю версию без модификаций.
- Краткая информация доступна на форуме и в архиве статей.
-
Для просмотра игры в формате текстовых файлов подойдёт любой текстовый редактор. Рекомендуем Sublime Text или VS Code — они поддерживают подсветку синтаксиса QSP.
- Для Sublime Text разработан пакет, включающий плаги н для работы с qsps-файлами и подсветку синтаксиса QSP.
- Для VS Code существует специальное расширение.
Если вы используете системы контроля версий (например, Git), рекомендуем фиксировать каждое масштабное изменение в игре.
Первый этап переноса. Критичные изменения
Версия библиотеки QSP 5.8.0 получила несколько критически значимых изменений, которые сломали обратную совместимость. Игра, написанная для плеера 5.7.0, иногда будет некорректно работать на плеерах версии 5.8.0 и выше.
Поправить такую игру достаточно легко.
Сделайте полную копию вашего проекта на тот случай, если что-то пойдёт не так.
Анализ кода игры для QSP 5.7.0
- Сначала вам нужно сконвертировать игру в формат "qsps". Это делается с помощью утилиты txt2gam, или, если утилита подключена к Quest Generator, с помощью пункта меню "Экспорт → Текстовый файл формата TXT2GAM" в QGen.
Формат "qsps" и "TXT2GAM" — это одно и то же. - Далее нужно запустить Анализатор и "скормить ему игру":
- Запускаете утилиту и нажимаете кнопку с тремя точками в правом верхнем углу.
- Находите и выбираете текстовый файл с вашей игрой.
- Утилита автоматически запустит чтение файла и на вкладке "Анализ" в самом нижнем поле вы увидите список ошибок и предупреждений.
- В той же вкладке нажмите кнопку "Переменные". В случае успешного чтения файла в трёх полях с полосами прокрутки отобразятся списки используемых в игре переменных.
Это всё, что понадобится нам от утилиты "Анализатор". Не закрывайте окно, вам понадобится информация из него.

Разнотипные значения в массивах
Одно из самых масштабных изменений в QSP: больше нельзя хранить в одном массиве под одним индексом и числовое, и текстовое значение. Подробно это изменение описано в статье "Массивы уже не те" .
Если вы использовали старое поведение массивов как фичу (например, хранили названия и здоровье юнитов под одним индексом), в плеерах версии 5.8.0 и выше это сломает работу игры.
! $unit - название, unit - здоровье
$unit[0] = "пехотинец" & unit[0] = 300
$unit[1] = "гвардеец" & unit[1] = 670
$unit[2] = "лучник" & unit[2] = 1500
$unit[3] = "артиллерист" & unit[3] = 10
В примере выше числовые значения затрут текстовые, а в плеерах версии 5.7.0 оба значения хранятся одновременно.
Решение простое. Чтобы починить игру, сломавшуюся из-за подобного использования массивов, мы конвертировали QSP-файл в текстовый формат и "скормили" его Анализатору.
Нужно сделать следующее:
-
Скопируйте списки текстовых и числовых переменных из соответствующих окошек Анализатора и сравните.
- Можно, например, вставить эти списки в Excel, отсортировать по алфавиту и сопоставить вручную.
-
Если в обоих списках присутствуют одноимённые массивы (например,
$unitиunit), переименуйте текстовые массивы во всей игре. (Для приведённого примера$unitможно переименовать в$unit_name.) -
Массивы
$args/argsи$result/resultпереименовывать не нужно — это специальные массивы. Однако во всех локациях, где используются$args/args, первой строчкой обязательно пр оводите инициализацию (например,args[9] = args[9]), если используете текстовые индексы для элементов массива$args/args. -
Будьте аккуратны с переименованием массивов, которые не используют одновременное хранения числовых и текстовых значений под одним индексом, но хранят значения обоих типов под разными индексами.
Когда не останется одноимённых текстовых и числовых массивов (за исключением выше обозначенных случаев), игра в плане хранения данных в массивах станет совместима и с плеерами версии 5.7.0, и с плеерами версий 5.8.0 и выше.
Изменения в работе функций INSTR, ARRCOMP, ARRPOS
Необязательные аргументы функций INSTR, ARRCOMP и ARRPOS в плеерах 5.8.0 и выше переставлены в конец. В плеерах версии 5.7.0 и ниже эти аргументы шли в начале.
Например, в плеере 5.7.0 поиск подстроки в строке мог выглядеть так:
instr(7, "В корзине 23 красных и 47 синих яблок.", "красн") & ! 14
Если вы полностью переходите на новые версии плеера и совместимость с версией 5.7.0 вас не волнует, найдите все вхождения instr, arrcomp и arrpos в игре и переставьте необязатель ный аргумент в конец:
instr("В корзине 23 красных и 47 синих яблок.", "красн", 7) & ! 14
Если нужно сохранить совместимость с плеерами версии 5.7.0, сделайте следующее:
- Проверьте значения необязательных аргументов. Есл и для
instrэти значения везде равны1, а дляarrposиarrcomp—0, достаточно просто опустить эти значения, и игра в плане работы этих функций станет совместима и с 5.7.0, и с 5.8.0 и выше. - Если значения необязательных аргументов отличаются от указанных выше, напишите функции-обёртки для
instr,arrcompиarrposи замените все встроенные функции QSP в игре на свои. Пример для функцииinstrниже.
# test
! будет работать во всех плеерах
func("myInstr", "В корзине 23 красных и 47 синих яблок.", "красн", 7) & ! 14
-- test
# myInstr
$args[0] = $args[0] & ! строка, по которой производим поиск
$args[1] = $args[1] & ! подстрока, которую ищем
args[2] = iif(args[2]>0, args[2], 1) & ! с какого элемента начинать поиск
if $QSPVER >= '5.8.0':
result = instr($args[0], $args[1], args[2])
else:
result = instr(args[2], $args[0], $args[1])
end
-- myInstr
Как видно из примера, в нашей функции мы всё равно изменили порядок аргументов, переставив необязательный аргумент в конец. Все строки с оригинальным instr придётся зам енить на нашу функцию. Такое решение обеспечит совместимость и с плеерами версии 5.7.0, и с более новыми плеерами.
Поиск и замену этих функций удобнее всего делать в текстовом редакторе типа Sublime Text или VS Code — там можно использовать регулярные выражения для поиска и замены. Это избавит от ручной обработки каждого вхождения, и вы сможете в полуавтоматическом режиме заменить все сомнительные функции на исправленные за считанные минуты.
DISABLESUBEX не работает
Системная переменная, которая раньше отключала распознавание подвыражений, больше не р аботает.
Если раньше вы писали такой код:
disablesubex = 1
'<<disablesubex>>'
disablesubex = 0
На экран без изменений выводилась строка "<<disablesubex>>". Подвыражение не раскрывалось.
Теперь переменная DISABLESUBEX больше не отключает раскрытие подвыражений, поэтому на экране вы увидите "1".
Чтобы вывести подвыражение на экран необработанным, используйте конкатенацию для разделения угловых скобок:
'<'+'<disablesubex>>'
Эта правка сохранит совместимость с плеерами версии 5.7.0.
