Введение
Twin Kingdom Valley – это текстовая приключенческая игра с анимированными изображениями (на большинстве форматов) для компьютеров BBC Micro, Acorn Electron, Commodore 64, Commodore 16 и ZX Spectrum. Она была выпущена в 1983 году компанией Bug Byte.
Геймплей
Долина Двойного Королевства – это интерактивная художественная игра, в которой игрок вводит команды, такие как "взять кувшин" в командной строке, и получает описание результата ("Теперь он у меня"). Каждая такая команда отнимает одну единицу времени, в течение которой другие неигровые персонажи также перемещаются и совершают действия. Это была одна из первых текстовых приключенческих игр с активными неигровыми персонажами. Персонажи интерактивны и обладают собственными характерами: некоторые дружелюбны и будут следовать за игроком и защищать его, а другие – враждебны. Ведьмы и короли – сложные персонажи, в то время как гориллы и тролли – более простые. В боевых сценах предусмотрены дополнительные возможности, включая оружие, которое можно уронить, сломать, бросить или которое может быть отнято врагами.
Сюжет
Главный герой этой игры, именуемый "вы" игровым движком, – охотник за сокровищами. Игрок начинает игру на южной границе лесного королевства, имея при себе немного вещей. Ранняя встреча с трактирщиком в трактире "Меч" может убедить игрока снять у него небольшую бревенчатую хижину. В хижине находится крайне скудный набор припасов, например, простой кувшин. Чтобы продвигаться по игре, игроку необходимо определить, кого считать друзьями, а кого – врагами. Некоторые персонажи, такие как горилла, нападающая на игрока деревянным дубиной, явно представлены как враги, в то время как другие вызывают неоднозначные чувства. Существуют два королевства – лесное и пустынное – разделённые глубоким каньоном. Каждым королевством правит король, и короли не ладят друг с другом. Игроку рассказывают, что ситуация недавно обострилась, и член королевской семьи из лесного королевства пропал без вести, а преступление приписывают королю пустыни. При наличии двух богатых королевств, находящихся в состоянии войны, предполагается, что игрок может воспользоваться этим и грабить сокровища с обеих сторон. По мере развития игры игроку становится всё сложнее перевозить добычу обратно в бревенчатую хижину, и ему порой приходится выбирать между тем, чтобы нести сокровище или оружие, поскольку оба типа предметов рискуют быть украденными, если их оставить без присмотра. Сюжет развивается постепенно. В оригинальной игре для BBC Micro было ограниченное количество локаций и графики. В версии для C64 появились некоторые дополнения, хотя сюжет в основном остался прежним. В современной версии для смартфонов ещё больше локаций и несколько новых сюжетных поворотов.
Концепция
Игра была вдохновлена оригинальной игрой «Adventure» Уилла Кроутера. Оригинальный игровой движок был написан на языке ассемблера 6502. Затем игра была портирована на Z80 для Spectrum. Более новые версии (для Commodore 64 и Spectrum) содержат расширенный игровой мир. Игра ставила своей целью добавить уровень реализма за счет добавления изображений и сложных персонажей. Начало разработки игры было скорее ответом на вызов, чем коммерческим предприятием. В то время доступ к «мощным машинам» (по меркам того времени), необходимым для запуска оригинальной игры, был ограничен. Возникла мысль: наверняка это можно реализовать на домашнем компьютере. Медленная работа кода языков высокого уровня (Basic) на домашних системах исключала этот вариант, а компилятора FORTRAN в то время не было доступно. Поэтому был выбран язык ассемблера. Мало кто запускал оригинал, и (после окончания учебы) те студенты, у которых был доступ к университетскому оборудованию, способному запускать игру, лишились этого преимущества. Поэтому элементы, которые вспоминались (с усмешкой), напоминали оригинал: повторяющаяся дорога, здание (содержащее полезные предметы, такие как ключи и лампа). Здание находится в лесу, рядом с родником. Однако, помимо этого намека на то, что это своего рода клон, сходство заканчивается. План изменился на «зачем копировать, если можно сделать лучше». Вместо простого моделирования пещеры, задача заключалась в создании большего мира с множеством локаций – на поверхности, под землей, внутри и снаружи. В долине Twin Kingdom Valley 175 комнат. Для игры была выбрана эпоха, близкая к средневековью, что позволило добавить элементы мистики. Все бои были разработаны как базовые рукопашные, где игрок и другие персонажи поочередно наносят удары. Ходы всегда инициируются вводом игрока, а не происходят в реальном времени. Если игрок пытается сбежать из боя, противнику разрешается одна атака, прежде чем игрок сможет переместиться. Поведение игрока моделируется так же, как и поведение персонажей. Как и в подобных играх, персонажи имеют различные ограничения, такие как максимальное здоровье, скорость восстановления и грузоподъемность.
Графика
Основным разделом программного обеспечения является пользовательский графический язык, представляющий собой ранний формат масштабируемой векторной графики. Сотни изображений объектов и локаций отрисовываются в игре с помощью этого специализированного инструмента. Ограниченная перспектива достигается за счет возможности отрисовки изображений уменьшенного размера внутри другого изображения. Например, модель замка разрабатывалась для детального просмотра, но могла также использоваться как подпрограмма для отрисовки удаленного замка в пустыне. Скорость отрисовки графики составляла около 10 полигонов в секунду, поэтому игра не могла позволить себе отрисовку фоновых полигонов и их переполнение. Изображения создаются методом заливки, при котором каждый пиксель экрана заполняется только один раз. Современный компьютер (с использованием эмулятора) может отрисовать эти изображения мгновенно, но владельцам оригинальной игры приходилось ждать три-четыре секунды для отрисовки экрана. Графические команды требовалось сильно сжимать из-за ограниченного объема доступной памяти. Рассмотрим команду отрисовки линии, которая выполняет отрисовку из текущей позиции с указанием цвета и новых координат x и y. Если использовать 6502 для загрузки в регистр x координаты x, в регистр y – координаты y, в аккумулятор – цвета, а затем вызвать подпрограмму "Нарисовать линию", потребуется 9 байт. Если во всех игровых изображениях содержится в общей сложности 1000 таких линий, это займет 9 КБ. Фактический объем памяти, используемый для команды отрисовки в игре, составляет 2 байта. Для отрисовки и заливки контура необходимы 3 базовые команды: "Переместить", "Нарисовать", "Залить". Сначала выполняется перемещение в начальную точку фигуры, затем отрисовка до каждой точки на контуре, пока фигура не будет замкнута, и, наконец, заливка внутренней области фигуры. Команды "Нарисовать" и "Залить" требуют указания цвета линии. Команды "Переместить", "Нарисовать" и "Залить" требуют координат. Для эффективного декодирования достаточно 2 бит для определения команд "Переместить", "Нарисовать", "Залить" и "любая другая инструкция" на языке ассемблера. Дополнительный бит определяет, используются ли абсолютные экранные координаты или относительная позиция. 3 бита позволяют выбрать один из 8 цветов, а 10 бит задают две 5-битные координаты x и y. Другие команды (не требующие координат) включали: вызов подпрограммы, завершение подпрограммы, отрисовку круговой дуги (с центром в последней перемещенной координате) и т.д. Сложные изображения, такие как хижина из множества бревен, используют инструкцию цикла, аналогичную циклу for в C, с постоянным пределом повторений. В языке ассемблера отсутствуют понятия переменных и инструкции ветвления.
Игровой движок
В игре есть несколько микро-баз данных информации, представляющих локации, объекты, которые можно использовать, различных существ и другие данные. Игровой движок запускает симулированный мир для этих объектов. Небольшой модуль ИИ позволяет неигровым персонажам принимать решения. Система локаций имеет некоторые особенности для экономии памяти. В большинстве локаций содержится всего несколько слов, но подробная (битово упакованная) "база данных выходов" интерпретируется для создания более развернутых описаний. Эти описания могут меняться в зависимости от установки и сброса битов для запертых и открытых дверей. Локация с описанием примерно в восемь строк текста может занимать менее 30 байт данных. Слова, используемые в базе данных локаций игры, хранятся как один байт на слово, который ссылается на список из 256 слов, в результате чего многие слова используются повторно. Например, "Вы находитесь у журчащего ручья, на севере виден ручей, на юге – дорога, на северо-западе – глубокая река". Слова "Вы находитесь" добавляются игровым движком. Фраза "у журчащего ручья" занимает всего 4 байта данных, а 5-й байт кодирует длину (4) сообщения в словах. Локация имеет 3 выхода, каждый из которых кодируется как 2 или 3 байта. Байт 1 содержит направление по компасу плюс вверх или вниз (6 бит для N, S, E, W, U, D). Дополнительный бит обозначает специальные выходы, такие как запертые двери. Дополнительный байт определяет различные биты для запертого/открытого состояния или "видно сквозь/не видно сквозь" и т.д. Наконец, байт для пункта назначения. Первое слово пункта назначения пропускается, поэтому: если направление на север ведет к "У ручья", слово "У" опускается, и добавляются слова "вы видите", в результате получается "На север вы видите ручей", используя всего 2 байта. Все эти методы сжатия были необходимы, чтобы игра поместилась в лимит 32 КБ оригинальной системы BBC Micro. 10 КБ теряется на буфер экрана, поэтому игровая память уменьшается до 22 КБ с самого начала. С учетом памяти, необходимой для переменных и стека, доступный объем кода в такой системе приближается к 20 КБ. Если бы в игре было 200 локаций по 30 байт на локацию, это заняло бы 6 КБ. Даже этого было бы недостаточно для игрового кода, особенно для графики. По этой причине в оригинальных версиях игры было менее 200 уникальных локаций. В ранних версиях (например, для BBC Micro) было около 180 локаций, а в более поздних версиях (например, для Commodore 64) – около 190. Другие игровые таблицы (например, для существ или объектов) значительно меньше. В игре есть небольшой блок сброса данных, который повторно запирает двери и другие объекты при начале новой игры. В более поздних версиях (таких как C64) дополнительная память позволяла использовать более длинные сообщения в виде обычного текста для специальных игровых событий и головоломок. Поскольку существа могут держать объекты, игровой движок рассматривает всех существ как специальные локации. Объект имеет однобайтовое местоположение, которое может быть комнатой или существом, и все локации выше 200 зарезервированы для существ или других специальных кодов локаций (например, "сломанный").
Дальнейшее развитие
В 2006 году разработка игры возобновилась благодаря появлению новых платформ. Игровой движок был портирован с оригинального 6502 на Java, а некоторые инструменты для разработки игр – на C#.