QSP 5.9.4
Автор: Byte   
23.09.2025 11:18

Здесь описаны основные изменения в QSP 5.9.4:

Основные изменения в версии QSP 5.9.4:


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

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

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

Имя локации не может содержать символы-разделители (аналогично вызовам @loc).
Параметры локации могут отсутствовать или быть записаны со скобками (аналогично обычным операторам).
Если локация записывает что-либо в переменную 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]

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

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

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

Добавлена конвертация в булевые значения (истина/ложь) для типов, отличных от чисел.

Это позволяет улучшить читаемость кода в некоторых случаях.
Булевые значения используются для логических операций (OR / AND / NO / IIF), а также для некоторых операторов (например, в условиях для IF / ELSEIF / LOOP).
Преобразования следующие:
Число является "истиной", если оно не равно 0. Если равно 0, то это ложь. Это то же самое поведение, что было ранее.
Строка является "истиной", если ее длина больше 0 (в строке что-то записано). Пустые строки являются "ложью".
Кортеж является "истиной", если в кортеже есть какие-либо элементы (в т.ч. вложенный пустой кортеж). Пустые кортежи являются "ложью".

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

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

Различные технические изменения, в т.ч. новая реализация локальных переменных