# Журнал изменений UrqW

(Изменения каталога игр не записываются в этот документ.)

## Версия 1.1 (в разработке)

- Интерпретатор URQL:
  - Добавлено: Поддержка кодировки UTF-8 для игр и плагинов.
  - Добавлено: Возможность добавить ссылкам в тексте выпадающее меню со списком действий и скрывать отдельные пункты меню в зависимости от значений специальных переменных с префиксом `hide_`.
  - Добавлено: Возможность выполнить код JavaScript из кода URQL и получить его результат с помощью системной переменной javascript.
  - Добавлено: Системные переменные:
    - date - получить текущую дату (только при отсутствии специальных правил urq_mode).
    - file_content - получить содержимое файла из пакета игры в виде текста по его внутреннему пути.
    - file_url - получить относительный URL-адрес файла из пакета игры по его внутреннему пути.
    - image_caption - установить или получить видимую подпись к изображению.
    - instr_leave_spc - установить или получить режим обработки пробелов для оператора instr.
    - last_btn_caption - получить название последней активированной кнопки выбора или ссылки в тексте.
    - location - получить имя текущей локации, вне зависимости от способа перехода в эту локацию (только для режима совместимости с AkURQ).
    - quest_path - всегда имеет значение в виде пустой строки (только для режима совместимости с AkURQ).
    - time - получить текущее время.
    - urq_type - всегда имеет значение 1 (только для режима совместимости с AkURQ).
    - urqw_game_ifid - получить IFID игры (или пустую строку, если он отсутствует).
    - urqw_game_lang - установить или получить язык контента игры.
    - urqw_title - установить или получить заголовок страницы UrqW.
    - urqw_version - получить версию UrqW.
  - Добавлено: Оператор clst для очистки экрана от текста.
  - Добавлено: Оператор clsl для очистки текста от ссылок.
  - Добавлено: Оператор varkill (прямой аналог perkill).
  - Добавлено: Возможность задать произвольные названия для предметов инвентаря, вариантов использования предметов инвентаря и пунктов выпадающих меню у ссылок в тексте вместо названий, основанных на именах переменных и меток (используются специальные переменные с префиксом `display_`).
  - Добавлено: Поддержка пользовательских альтернативных текстовых описаний для изображений, добавляемых с помощью системной переменной image или оператора image.
  - Добавлено: Игнорирование пробельных символов в начале любых строк.
  - Добавлено: Автоматическая нормализация внутренних путей к файлам: обратные косые черты (бэкслеши) заменяются на косые черты (слеши), а также удаляются все косые черты в начале пути.
  - Добавлено: Режим совместимости с AkURQ.
  - Добавлено: Автоматическое экранирование HTML (включено по умолчанию в режимах совместимости с RipURQ и URQ_DOS).
  - Изменено: Оператор clsb теперь только удаляет кнопки, но не очищает текст от ссылок.
  - Изменено: Инициализация переменной с помощью оператора instr без присваивания значения инициализирует переменную со значением в виде пустой строки, а не игнорируется.
  - Изменено: При присваивании строкового значения переменной с помощью оператора instr ведущие и конечные пробельные символы в строке значения удаляются. Вернуть прежнее поведение с сохранением пробелов можно с помощью системной переменной instr_leave_spc.
  - Исправлено: Если предмет в инвентаре имеет в названии символ подчёркивания (например, `inventory_item`), для него существует метка использования без уточнения действия (например, `use_inventory_item`), а переменная скрытия действия имеет положительное значение (например, `hide_use_inventory_item = 1`), то при клике на ссылку предмета в панели инвентаря всё равно происходит срабатывания действия.
  - Исправлено: Если при присвоении значения системным переменным image или music перед знаком равно есть пробел, то конструкция ошибочно интерпретируется как выполнение одноимённых операторов с некорректным путём к файлу.
  - Исправлено: Оператор not сразу после левой скобки обрабатывается некорректно.
  - Исправлено: Некорректная обработка переменной tokens_delim.
  - Исправлено: Некорректная обработка оператора goto в режиме совместимости с URQ_DOS.
- Плеер игр:
  - Добавлено: Поддержка настраиваемой интернационализации и переводы интерфейса на русский, английский, армянский, белорусский, испанский, межславянский (латиница), украинский и эсперанто языки.
  - Добавлено: Дифференцированная языковая разметка, соответствующая языку интерфейса и языку игрового контента.
  - Добавлено: Настройка кодировки игры при открытии с главной страницы.
  - Добавлено: Возможность переименовать и очистить слоты сохранения через меню дополнительных действий, а также скачать и загрузить сохранение в виде файла.
  - Добавлено: Настраиваемая загрузка игры с автоматическим сохранением прогресса между сессиями.
  - Добавлено: Настраиваемое предупреждение о возможных ошибках при загрузке сохранения для другой версии игры.
  - Добавлено: Поле даты в каталоге игр.
  - Добавлено: Возможность фильтровать игры в каталоге по языку и названию, а также сортировать по дате и алфавиту.
  - Добавлено: Меню с дополнительной информацией и настройками в панели инструментов.
  - Добавлено: RSS-канал новых игр в каталоге.
  - Добавлено: Игры, добавленные в каталог, имеют отдельные URL-адреса для идентификации и индексации поисковыми системами.
  - Добавлено: Тег с каноническим URL-адресом (отдельные URL-адреса для главной страницы с каталогом и для каждой игры, запускаемой по идентификатору).
  - Добавлено: Карта сайта для поисковых систем.
  - Добавлено: Возможность задать игру, загружаемую при любом открытии index.html.
  - Добавлено: Новые ключи объекта игры в файле games.json:
    - date - для указания даты первой публикации игры.
    - lang - для указания одного или нескольких языков игры.
  - Добавлено: Возможность задать настройки плеера с помощью get-параметров:
    - Идентификатор игры для запуска - id (значение: идентификатор).
    - Язык интерфейса - lang (значение: код локализации).
    - Режим URQ - mode (значение: “urqw”, “ripurq”, “dosurq” или “akurq”).
    - Кодировка игры - encoding (значение: “UTF-8” или “CP1251”).
    - URL для открытия игры - url (значение: строка URL-адреса).
    - Отображение раздела отладки игры в меню - debug со значением “1”.
  - Добавлено: Поддержка файла manifest.json в пакете игры, который используется для определения параметров плеера и метаданных игры, а также начальных значений некоторых системных переменных.
  - Добавлено: Поддержка записи iFiction из “Вавилонского договора” в пакете игры, которая используется для хранения расширенных метаданных игры в унифицированном формате.
  - Добавлено: Автоматическое фокусирование элементов управления при работе с диалоговыми окнами (меню, сохранение и загрузка игры).
  - Добавлено: Настройка уровня громкости для звуков игры.
  - Добавлено: Присвоение переменной music значения в виде пустой строки останавливает циклическое воспроизведение аудиофайла.
  - Добавлено: Воспроизводимые музыка и звуки игры запоминаются при сохранении игры, а также возобновляются с того же места при загрузке из сохранения.
  - Добавлено: Настраиваемое автоматическое фокусирование первого элемента управления на экране игры, а также надписи об ожидании любого нажатия и об окончании игры.
  - Добавлено: Возможность настроить запрос о подтверждении закрытия страницы.
  - Добавлено: Отключаемые горячие клавиши для активации кнопок выбора, быстрых действий и кластерной навигации по областям интерфейса (см. справку в меню).
  - Добавлено: Нумерация кнопок выбора при включённых горячих клавишах.
  - Добавлено: Возможность сворачивать и развлорачивать разделы на главной странице.
  - Добавлено: Отображение подробной информации об UrqW на главной странице.
  - Добавлено: Отображение версии UrqW в интерфейсе плеера.
  - Добавлено: Отображение информации о неподдерживаемом формате игр и о процессе распаковки загруженной игры.
  - Добавлено: Заголовки в диалоговых окнах сохранения и загрузки игры.
  - Добавлено: Поддержка открытия игр в форматах .qs1, .qs2 и .qsz.
  - Изменено: Варианты использования предмета в инвенторе отображаются, когда предмет принимает системный фокус, а не только когда на него наводится мышь.
  - Изменено: Варианты использования предмета в инвенторе, формируемые из названий меток использования, отображаются с пробелами вместо подчёркиваний.
  - Изменено: При окончании игры через оператор quit ссылки и кнопки удаляются, а не просто перестают реагировать на действия пользователя.
  - Изменено: При запуске игры по идентификатору предпочтение отдаётся идентификатору игры из get-параметра id (сохранена поддержка запуска игры по идентификатору фрагмента (хэшу), но только если get-параметр id отсутствует).
  - Изменено: При загрузке игры из архива как плагины читаются и загружаются файлы с названиями style.css и script.js (как документировано), а не все файлы .css и .js (как было фактически).
  - Изменено: При запуске игры по идентификатору из папки плеер ищет файл urqw/main.qst и, если не найден, то main.qst вместо файла quest.qst. Директория расположения main.qst считается директорией игры.
  - Изменено: При запуске игры по идентификатору из папки сначала загружаются и обрабатываются файлы manifest.json и записи iFiction, а также файлы плагинов (style.css и script.js), и только после этого файл игры main.qst.
  - Изменено: Новый звук, воспроизводимый при помощи оператора play, останавливает предыдущий (оригинальное поведение RipURQ, URQ_DOS (WCL) и AkURQ), а не воспроизводится параллельно.
  - Изменено: Звуки игры, инициированные посредством оператора play при нулевой громкости, начинают воспроизводиться с нулевой громкостью, а не игнорируются.
  - Изменено: Области интерфейса для инвентаря, текста и кнопок выбора перерисовываются только при изменении отображаемого содержимого, а не при каждом изменении состояния игры.
  - Изменено: Отслеживание нажатий клавиш не по коду символа, а по коду клавиши.
  - Изменено: Оптимизация вёрстки, в том числе для валидности HTML и поисковой оптимизации.
  - Изменено: Небольшая правка отступа информативного окна.
  - Исправлено: Ссылки исчезают из текста при загрузке сохранённой игры.
  - Исправлено: Текстовый вывод, содержащий переносы строк, всегда отображается как блочный элемент.
  - Исправлено: Абзацы, содержащие текстовый вывод с блочными элементами, не имеют отступа слева.
  - Исправлено: Воспроизведение музыки и звуков игры не останавливается при перезапуске или загрузки из сохранения.
  - Исправлено: При повторном выполнении оператора music с одним и тем же аудиофайлом повторного воспроизведения этого файла не происходит.
  - Удалено: Отдельный курсор UrqW для выбора и активации кнопок (вызывал проблемы одновременной активации двух элементов управления и был заменён на кластерную навигацию на основе стандартного системного фокуса).
  - Улучшения доступности (accessibility):
    - Добавлено: Текстовые метки для элементов управления панели инструментов.
    - Добавлено: Текстовая метка для кнопки инвентаря в интерфейсе для экранов размера XS.
    - Добавлено: Текстовый префикс для визуально выделенного слота автосохранения.
    - Добавлено: Настраиваемое объявление обновления описания с помощью вспомогательных технологий.
    - Добавлено: Настраиваемое объявление обновления кнопок выбора с помощью вспомогательных технологий.
    - Добавлено: Настраиваемое объявление описания с помощью вспомогательных технологий при нажатии горячей клавиши (см. справку в меню).
    - Добавлено: Настраиваемое объявление описания с помощью вспомогательных технологий при встряхивании устройства.
    - Добавлено: Настраиваемая фокусируемость изображений с помощью клавиатуры.
    - Добавлено: Ссылки на панели инвентаря, не выполняющие никаких действий, имеют атрибут aria-disabled, который информирует об отсутствии связанных действий, но не подавляет фокусируемость элемента.
    - Добавлено: Обозначение для вспомогательных технологий наличия выпадающего меню у элемента инвентаря.
    - Изменено: Каждая ссылка в выпадающем меню элемента инвентаря имеет роль пункта меню.
    - Изменено: Текстовые метки у графических иконок плеера.
    - Исправлено: Ссылки в тексте игры не фокусируются с клавиатуры, а также не имеют роль ссылки.
    - Исправлено: Некорректное представление абзацев в тексте игры для программ экранного доступа.
    - Исправлено: Кнопка инвентаря в интерфейсе для экранов размера XS не меняет своё семантическое состояние (свёрнуто/развёрнуто) после первой активации.
- Документация:
  - Добавлено: Начата подготовка новой документации на русском и английском языке.
  - Добавлено: Руководство для участников проекта (контрибьюторов) (см. файл CONTRIBUTING.md в репозитории).
  - Изменено: Обновление основной русскоязычной документации.
- Инфраструктура разработки и сопровождения:
  - Добавлено: Автоматизация сборки и развёртывания UrqW с каталогом игр через GitHub Actions на GitHub Pages при изменениях в master.
  - Добавлено: Скрипт check-locale для проверки полноты локализации.
  - Добавлено: Скрипт valid-json для валидации файла games.json.
  - Добавлено: Скрипт pack-games для упаковки игр из директории games для каталога.
  - Добавлено: Скрипт gen-rss для генерации RSS-канала новых игр в каталоге.
  - Добавлено: Скрипт gen-license-report для генерации отчёта о лицензиях сторонних компонентов.
  - Добавлено: Скрипт gen-docs для генерации документации в формате HTML.
  - Добавлено: Скрипт gen-sitemap для генерации карты сайта для поисковых систем.
  - Добавлено: Скрипт pack-release для упаковки релизной сборки UrqW.
  - Добавлено: Команда `npm run build` для сборки UrqW для производственных сред с каталогом игр.
  - Добавлено: Команда `npm run release` для сборки UrqW для релиза без каталога игр.
  - Изменено: Все игры в каталоге добавлены как подмодули из отдельных репозиториев и перепакованы с файлами manifest.json и записи iFiction.
  - Изменено: Поддерживаемые плагины с примерами использования (функциональными тестами) добавлены как подмодули из отдельных репозиториев и размещены в директории quests как игровые пакеты.
  - Изменено: Тесты, проверяющие корректность работы движка, перемещены в директорию quests/tests.

## Версия 1.0 (от 20.01.2017)

- Первая стабильная версия.

## 12.10.2015

- Первая публично представленная работоспособная версия.

## 21.09.2015

- Начало разработки (первый коммит).