Массивы уже не те, или Изменение в логике работы массивов в QSP

Как ведут себя массивы сейчас

Начать следует с того, что в «классическом» плеере версии 5.7.0 и ниже, а так же в Quest Navigator 0.0.28 и AeroQSP, в одном элементе массива можно хранить как текстовое, так и числовое значение. Вот как это выглядит:
код 1
При этом мы спокойно можем получить и числовое, и текстовое значение по указанному индексу:
код 2
Правда это создаёт ряд дополнительных трудностей. Например, каков будет размер массива в нашем примере?
код 3
В обоих случаях arrsize выдаст ответ 2. И нам может показаться, что так и должно быть, ведь скорее всего мы имеем дело с двумя массивами: текстовым и числовым. Но на самом деле массив один. Ведь если мы будем добавлять только текстовые значения, размер «числовой части» массива так же увеличится.
код 4
В этом примере оба arrsize вернут 4. Это показывает, что мы имеем дело с одним и тем же массивом, который позволяет под одним индексом хранить элементы двух типов, а если мы не задали какой-то элемент явно, то его значение будет значением по умолчанию. Для числовых элементов значение по умолчанию 0, для текстовых — '' (пустая строка).

Такое поведение массива весьма просто представить в виде таблицы:
иллюстрация 1
Для удобства восприятия мы не внесли в таблицу значения элементов, которые не были явно заданы. Однако, как было сказано выше, при попытке использовать значения этих элементов, мы получим значения по умолчанию. В данном случае для числовых элементов это будут нули.

Может показаться, что такое поведение массива не только правильно, но и удобно, поскольку позволяет использовать одно имя для хранения и текстовых и числовых значений. Некоторые авторы, знающие о таком поведении, делали, например, такие вещи:
иллюстрация 2

То есть в одном массиве хранили и наименования юнитов, и их количество.

Однако данным способом Вы могли пользоваться, только когда явно указывали числовой индекс элемента массива. Если написать такой код:
код 5

— уверенность в том, какое значение вернёт arrsize пропадает.

Для тех, кто ещё не знает: пустые квадратные скобки после имени массива означают, что мы хотим работать с последним элементом массива, и нам не важен его номер.

И тут происходит интересная штука. В момент, когда мы пытаемся последнему элементу присвоить значение, плеер создаёт новый элемент указанного типа и уже ему присваивает значение. Таким образом каждая такая команда генерирует в массиве элементы обоих типов, но лишь одному присваивается значение:
иллюстрация 3

Мы снова не вписали в таблицу значения элементов, которые не задавали, однако mass[0] и mass[2] вернут нам нули, если мы попробуем их использовать, а $mass[1] и $mass[3] вернут пустые строки (это соответствует их значениям по умолчанию).

Таким образом оба arrsize вернут нам значение 4, хотя мы явно задавали только два числовых и два текстовых элемента.

Как массивы будут себя вести

Новая версия плеера ещё не вышла, но всё ниже следующее будет работать в ней так. (Уже работает в плеере qSpider)
Теперь под одним индексом можно хранить либо только текстовое, либо только числовое значение. Мы своего рода объединили столбцы нашей таблицы:
Иллюстрация 4
Это означает, что код:
код 5
будет работать так же, как и работал. Т.е. каждая операция присвоения создаёт новый элемент в массиве, которому мы присваиваем либо строку, либо текст. И в данном случае мы создадим четыре разных элемента массива, два из которых будут текстового типа, два — числового.

Немного по-другому поведёт себя наш изначальный код:
код 1

Здесь, присвоив элементу сначала текстовое, а затем числовое значение, мы «затрём» изначальное текстовое значение числовым. В результате работы этого кода мы получим массив из двух элементов, и оба элемента будут числовыми — arrsize вернёт 2 в обеих командах.

Чтобы закрепить новые знания, рассмотрим другой наш пример:
код 4

Здесь, как и в предыдущем примере, числовые значения «затрут» текстовые для элементов 0 и 1, а в элементах 2 и 3 будут текстовые значения. Соответственно обе команды arrsize вернут значение 4.

В виде таблицы мы можем представить это так:
иллюстрация 5

Если мы попытаемся использовать текстовые значения элементов 0 и 1, то получим значения по-умолчанию, то есть — '' (пустые строки). Аналогично, если мы попытаемся использовать числовые значения элементов 2 и 3, то получим числовые значения по-умолчанию — 0 (нули).

Возможно, пока Вы этого не заметили, но это очень масштабное изменение, которое потребует от некоторых авторов существенно изменить свои привычки в программировании на QSP.

Что можно и нужно сделать

Автор этой статьи уже ощутил на себе вес изменений в работе массивов.

Протестировав «Вереницу миров или выводы из закона Мёрфи» на плеере qSpider, который уже использует новую версию библиотеки, я (не без помощи Werewolf'а и Byte'а) обнаружил ошибки логики в коде, которые сглаживались в плеерах версии 5.7.0. именно благодаря тому, что под одним индексом в массиве можно было хранить и текстовое и числовое значение. К счастью, эти ошибки легко поправить.

Если Вы где-либо использовали запись в массив под одним индексом и числовых и текстовых значений, Вам так же следует исправить это. Особенно критично исправить в проектах, разработка которых затянется на ближайшие год-два.

Предложенный пример, где названия и количество юнитов хранились в одном массиве, больше работать не будет.
иллюстрация 2 (так делать нельзя!)

И наш совет таков: не используйте и текстовые, и числовые значения элементов в одном массиве. Лучше завести два массива. Отдельно для текстовых и числовых значений:
код 6

Помимо изменений в массивах нас ждёт ещё целый ряд изменений, но они менее глобальны, и о них мы поговорим в следующих статьях.

Всем успехов в написании игр, и не бойтесь кажущейся сложности!
памятка

Статья написана по мотивам:
статьи Pseudopodhttps://trello.com/c/z9AbJa8O/18-одновременное-использование-arri-и-arri
и поста Bytehttp://qsp.su/index.php?option=com_agora&task=topic&id=1290&Itemid=57

The Dark Citadel. Автор: Savrtberg. Платформа: QSP

Это основательно переработанный отзыв со страниц темы обсуждения конкурса "QSP-Compo 2020" http://qsp.su/index.php...p27842

"TDC" попала в меня. Я уже видел демки Svartberg`а, и потому откладывал эту игру напоследок, в первую очередь осваивая другие игры QSP-Compo 2020. И вот я добрался.

О, как же было здорово!

Визуальное оформление, звуковое… мне нравится всё. Краткие, лаконичные, но объёмные рельефные описания локаций. Ни разу не заблудился, не почувствовал, что чего-то не понимаю. Были небольшие грешки с опечатками и встретилось несколько речевых ошибок, но это всё ерунда. Я кликал каждый объект. Я проверял взаимодействие всех объектов друг с другом. Хотелось бы больше отыгрыша в случае, если делаешь очевидную глупость, но это тоже мелочь. Говорящий череп прописан изумительно. Один из ярчайших персонажей текстовых игр, которых я помню. Врезался в память навсегда.

Прекрасно передана атмосфера мрачной цитадели. Рядом с нашей тюремной камерой есть другие тюремные камеры, которые приоткрывают некоторые детали, из которых мы, в свою очередь, как пазл, складываем собственную картину мира. Мы пытаемся понять, где мы оказались, и что здесь произошло, и сама игра через окружение, через нарратив, преподносит нам историю и события. Без кат-сцен, без длинных разъясняющих диалогов, мы узнаём что-то новое. Прекрасная подача, такова и должна быть подача в хороших играх. И эта же подача стимулирует нас двигаться по игре, изучать всё вокруг. Мы ещё даже не в сюжете, мы только в экспозиции, где нас знакомят с механиками, логикой и темпом прохождения, а мы уже втянулись в процесс, мы уже стремимся идти всё дальше и дальше, и уже требуем активности, событий. Пусть событий, происшедших несколько лет, часов, минут назад, но событий.

Эх, я мог бы часами петь дифирамбы "Тёмной цитадели", но у игры есть один существенный недостаток: она катастрофически коротка!

Я хочу больше. Прям, вот хочу. Аж до слёз хочу. Не хочу быть тридцатислишнимлетним дядькой, хочу, чтоб Svartberg написал полную версию игры. Хочу узнать в конце концов, где я, и что здесь произошло?

Однозначно призываю всех поиграть и испытать на себе всю красоту, атмосферность и изящество игры от Svartberg`а.