Нововведения в QSP 5.8.0
Пока готовится выход нового плеера версии 5.8.0 (или выше), мы решили рассказать о грядущих нововведениях. Всё (или почти всё), что будет представлено в этой статье, вы уже можете пощупать в плеере "qSpider" от Werewolf'а.
Последние нововведения
Изменение в работе массивов
Это, пожалуй, самое основное из грядущих изменений, и о нём мы подробно писали в ста тье "Массивы уже не те". Здесь же изложим кратко.
Теперь в массиве будет нельзя под одним индексом хранить и текстовое и числовое значение. Если вы запишете в ячейку числовое значение, а потом запишете в ту же ячейку текстовое значение, текстовое значение затрёт числовое.
При этом, если вы попытаетесь получить из ячейки со строковым значением числовое значение, плеер вернёт значение по умолчанию, то есть 0. И наоборот: если попытаться из ячейки с числовым значением получить строковое, плеер вернёт пустую строку.
Примеры:
! версия 5.7.0
mass[1]=123
$mass[1]='string'
*pl mass[1] & ! выведет число 123
*pl $mass[1] & ! выведет строку 'string'
! версия 5.8.0 и выше
mass[1]=123
$mass[1]='string' & ! затирает числовое значение
*pl mass[1] & ! попытка доступа к числовому значению вернёт 0
*pl $mass[1] & ! выведет строку 'string'
Многомерные массивы
Чтобы организовать многомерный массив, в плеерах версии 5.7.0 (и более ранних) приходилось использовать текстовые индексы. Например:
! работает в плеерах любых версий:
$unit_coords["3,1"]="Пехотинец"
$unit_coords["2,7"]="Артилерист"
$unit_coords["10,0"]="Танк"
Но в новых версиях плеера (начиная с 5.8.0 и выше) можно не использовать текстовые индексы, а указывать несколько нужных значений через запятую:
! версия 5.8.0 и выше
$unit_coords[3,1]="Пехотинец"
$unit_coords[2,7]="Артилерист"
$unit_coords[10,0]="Танк"
Это намного упрощает работу с многомерными массивами.
Изменения в работе логических операторов и функций
Все мы знаем, что QSP не поддерживает булевые (логические) типы данных, а вместо них в плеерах версии 5.7.0. использовались числа 0 и -1.
Здесь 0 означало Ложь (False), а -1 означало Правду (True). Соответственно и все логические операции возвращали нам эти значения.
Например:
! версия 5.7.0
*pl (3>2 and 4>3) & ! AND вернёт -1
*pl (3>2 or 4>3) & ! OR вернёт -1
*pl no 0 & ! NO вернёт -1
*pl (3<2 and 4>3) & ! AND вернёт 0
*pl (3<2 or 4<3) & ! OR вернёт 0
*pl no -1 & ! NO вернёт 0
В новых версиях плеера все логические операции будут возвращать 1 в случае Правды (True), и 0 в случае Лжи (False):
! версия 5.8.0 и выше
*pl (3>2 and 4>3) & ! AND вернёт 1
*pl (3>2 or 4>3) & ! OR вернёт 1
*pl no 0 & ! NO вернёт 1
*pl (3<2 and 4>3) & ! AND вернёт 0
*pl (3<2 or 4<3) & ! OR вернёт 0
*pl no -1 & ! NO вернёт 0
Соответственно и различные функции, возвращавшие "логические" значения, будут возвращать либо 1 (Правда, True), либо 0 (Ложь, False):
! версия 5.7.0
addobj "Отвёртка"
*pl obj("Отвёртка") & ! OBJ вернёт -1
*pl obj("Оттка") & ! OBJ вернёт 0
*pl isnum("123") & ! ISNUM вернёт -1
*pl isnum("12d") & ! ISNUM вернёт 0
! версия 5.8.0 и выше
addobj "Отвёртка"
*pl obj("Отвёртка") & ! OBJ вернёт 1
*pl obj("Оттка") & ! OBJ вернёт 0
*pl isnum("123") & ! ISNUM вернёт 1
*pl isnum("12d") & ! ISNUM вернёт 0
Ещё одно изменение в работе логических операций заключается в том, что теперь они на самом деле будут логическими. Да, оказывается в плеерах версий 5.7.0 и старше операции AND, OR, NO не были логическими — они были побитовыми. Это означает, что данные операции могли выполнять сравнение чисел по отдельным битам и возвращать результат этого сравнения.
Например:
! версия 5.7.0
*pl (3 and 2) & ! AND вернёт 2
*pl (4 or 6) & ! OR вернёт 6
*pl no 7 & ! NO вернёт -8
Теперь же, не имеет значения, какое число мы передаём логическому оператору. Если это число отлично от нуля, логический оператор будет воспринимать его как 1, то есть Правду (True).
! версия 5.8.0 и выше
*pl (3 and 2) & ! AND вернёт 1
*pl (4 or 6) & ! OR вернёт 1
*pl no 7 & ! NO вернёт 0
И это логично, ведь именно по такому принципу и работали операторы проверки условия if и elseif. Если этим операторам передавалось значение отличное от 0, то это означало, что условие верно (Правда, True).
! одинаково для всех версий плеера:
if 0:
*pl "условие выполнено"
else
*pl "условие не выполнено"
end
if 3:
*pl "условие выполнено"
else
*pl "условие не выполнено"
end