Перейти к основному содержимому

Нововведения в QSP 5.9.2-5.9.4

Клуб любителей текстовых игр на QSP·3 окт 2025 в 18:12

В QSP 5.9.2 было проведено много технических улучшений, ускорена работа отдельных операций и плеера. В QSP 5.9.3 основной упор так же делался на улучшение работы движка, а вот уже в версии плеера 5.9.4 появилось много всего нового.

5.9.3

Отрицание кортежей

В плеерах версии 5.9.3 появилось отрицание кортежей. Т.е. теперь вы можете использовать унарный минус перед кортежем. Это равносильно умножению всех элементов кортежа на -1. Примеры:

%tpl = -[2] & ! [-2]
-[5,6,7] & ! [-5,-6,-7]
! a = 12
-[a, a+2, a+4] & ! [-12,-14,-16]
-[5,6,7]+3 & ! [-2,-3,-4]
-([5,6,7]+3) & ! [-8,-9,-10]
-[1,[2,-3],-4] & ! [-1,[-2,3],4]

5.9.4

Новый упрощенный синтаксис вызова локаций как операторов (замена GOSUB)

Дополняет упрощенный синтаксис вызова локаций как функций (@foo), но скобки для аргументов можно не указывать.
Синтаксис:

@@имя_локации [параметр 1], [параметр 2], [параметр 3], ...

Имя локации не может содержать символы-разделители (аналогично вызовам @foo).

Параметры локации могут отсутствовать или быть записаны со скобками (аналогично обычным операторам).

Если локация записывает что-либо в переменную RESULT, то это значение будет проигнорировано.
Примеры:

@@loc1 'text', var1, $var2
@@loc2
@@loc3('param1')
@@loc4(123, 'test')

Оператор MODOBJ

Позволяет изменять то, как будут отображаться предметы с заданным именем. Само имя предмета не изменяется.

Это может быть полезно, если сам предмет фактически остается тем же самым, но нужно изменить его отображение в инвентаре.

Синтаксис:

MODOBJ [$имя предмета], [$описание предмета], [$изображение предмета]

Изображение предмета опционально - если этот параметр не указан, то сохраняется предыдущее указанное изображение.

Данный оператор меняет свойства всех предметов с указанным именем.

Для изменения свойств предметов необходимо, чтобы в инвентаре был хотя бы один указанный предмет. Далее, при добавлении новых предметов с тем же именем, их свойства будут соответствовать указанным в MODOBJ.

Обратите внимание, что этот оператор крайне не рекомендуется использовать для замены предметов (когда нужно отобразить новый/другой предмет в той же позиции инвентаря).
Примеры:

ADDOBJ 'sword'
ADDOBJ 'sword'
ADDOBJ 'keyboard'

MODOBJ 'sword', 'Sword (sheathed)'
MODOBJ 'keyboard', 'Keyboard (black)'

ADDOBJ 'sword' &! будет отображен как 'Sword (sheathed)'
MODOBJ 'sword', 'Sword (sharp)' &! изменит отображение всех предметов 'sword'

Оператор RESETOBJ

Этот оператор отменяет все изменения, произведенные с помощью MODOBJ.
Синтаксис:

RESETOBJ [$имя предмета]

Если имя предмета не указано, то сбрасывает изменения для всех предметов инвентаря.

Функция/операция OBJ возвращает количество предметов с указанным именем

Позволяет упростить работу с инвентарем в некоторых случаях.
Следующий код добавит несколько предметов и выведет их количество:

ADDOBJ 'sword'
ADDOBJ 'sword'
ADDOBJ 'keyboard'
PL 'Swords: ' + OBJ "sword"
PL 'Keyboards: ' + OBJ "keyboard"

В то же время, при использовании OBJ в условиях, сохраняется совместимость с предыдущими версиями:

IF OBJ 'sword': PL 'you have a sword'
IF NO OBJ 'sword': PL 'you don't have a sword'

В оператор DELOBJ добавлен опциональный параметр - количество предметов для удаления

Позволяет упростить работу с инвентарем в некоторых случаях.
Синтаксис:

DELOBJ [$название предмета], [#количество для удаления]

Параметр [#количество для удаления] указывает максимальное количество предметов, которые нужно удалить. Если он не указан, то удаляется 1 предмет (как и раньше).

Поддержка переносов строк внутри скобок [ ] и ( )

Теперь можно записывать кортежи, вызовы операторов / функций, выражения для индексов массивов на нескольких строках, что, в некоторых случаях, позволяет сделать код более читаемым.
Примеры:

%test = [
[ 'key1', 'value1' ],
[ 'key2', 'value2' ],
[ 'key3', 'value3' ],
]

max(
'val1',
'val2',
'val3',
'val4'
)

pl (a +
(b * 2) -
(c + 2)
) * 2

$arr[
'key1',
'key2',
$key3
] = 'value'

pl $arr['key1',
'key2',
$key3]

if ($color = "жёлтый" or
$color = "красный" or
$color = "зелёный"): "По-прежнему однострочное условие."

Аргументы локаций сохраняются при выполнении кода ссылок

Значения в массиве ARGS, которые были актуальны для кода локации, сохраняются и для кода HTML-ссылок. Ранее ARGS сохранялись только для действий (ACTs) на локации.

Логические конвертации для разных типов данных

Добавлена конвертация в булевые значения (истина/ложь) для типов, отличных от чисел.
Это позволяет улучшить читаемость кода в некоторых случаях.
Булевые значения используются для логических операций (OR / AND / NO / IIF), а также для некоторых операторов (например, в условиях для IF / ELSEIF / LOOP).

Преобразования следующие:

  • Число является "истиной", если оно не равно 0. Если равно 0, то это ложь. Это то же самое поведение, что было ранее.
  • Строка является "истиной", если ее длина больше 0 (в строке что-то записано). Пустые строки являются "ложью".
  • Кортеж является "истиной", если в кортеже есть какие-либо элементы (в т.ч. вложенный пустой кортеж). Пустые кортежи являются "ложью".

Исправление функций LCASE / UCASE

Предыдущие версии были не совсем корректны. Новая реализация учитывает последний стандарт Unicode.

Оригинал статьи: https://qsp.org/index.php?option=com_content&view=article&id=168:qsp-594&catid=34:2009-02-19-06-10-54&Itemid=76