Структуры данных я алгоритмы в RPG
(С) Сергей Симонович, 1995.
(продолжение) Начало см. в ZX-РЕВЮ-94 N6.
Широкое внедрение дисковых операционных систем, таких как TR DOS, IS DOS и ряда других В практику повседневной работы
"синклеристов" открывает реальную возможность подступиться к играм ролевого жанра (Role Playing Games) . Все Вы хорошо знаете, что в отличие от игр других жанров, этих игр для компьютера "Спектрум" написано чрезвычайно мало, они всегда сдерживались недостаточной оперативной памятью компьютера .
Сегодня мы продолжаем разговор о том, как проектируются ролевые игры. В прошлом выпуске мы повели речь о том, что фактически система управления ролевой игрой мало чем отличается от системы управления базой данных, дали перечень основных необходимых баз данных и ознакомились со структурой первой из них - Географической базы.
Здесь мы пойдем дальше и рассмотрим алгоритм путешествия по этой базе - так называемый режим Adventuring Mode. Напомним, что кроме него в ролевых играх есть еще один основной режим - Воевой (Combat Mode).
В режиме Adventuring Mode осуществляется перемещение в игровом пространстве, сбор и приобретение оружия, снаряжения и других полезных предметов.
Итак, Вы находитесь в пути. Предположим для определенности, что пространство Вашей игры составляет, например, 36. квадратных зон, каждая из которых имеет 40 X 40 локаций. Это означает, что для географической базы Вам необходимы как минимум 1600 байтов оперативной памяти (по 1 байту на локацию) и 36 файлов на диске, занимающих всего около 60К дискового пространства. При таких вполне доступных размерах у Вас есть возможность сделать весьма значительную игру. Если предположить, что играющий уделит хотя бы по полминуты каждой локации, все равно общая продолжительность игры составит порядка 500 часов.
Ваше положение в игровом пространстве определяется тремя программными переменными:
NUMGEO (1 байт) - номер загруженной зоны (от 0 до 35). COORD (2 байта) - координаты Х,У (от 0 до 39) и DIREC (1 байт) - направ- I ление, в котором Вы смотрите (от I 0 до 3).
Далее алгоритм Вашего путешествия будет выглядеть так:
1. Опрос клавиатуры, джойстика или интерфейсной процедуры. Определяем, что задумал пользователь: шаг вперед, поворот, или что-то еще.
2. В зависимости от типа местности (определяется по трем младшим битам в текущей локации) увеличиваем счетчик времени. Вы можете принять следующий алгоритм:
Дорога - +1/32 дня Равнина - +1/16 дня Лес - +1/8 дня Горы, болото - +1/4 дня
Таким образом, у нас появляется еще одна программная переменная TIMS (1 байт), отсчитывающая время дня в шестнадцатых долях или в каких-либо других, удобных Вам.
3. Проверка на выход за пределы зоны. Если Вы стоите на границе зоны и делаете шаг за ее пределы, должна подгружаться новая зона. Но она не должна вставать на место старой, т.к. еще пока неизвестно, что там за местность и можно ли в нее "шагнуть".
Таким образом, в игре могут существовать моменты, когда в оперативной памяти должны присутствовать сразу 2 зоны и расход ОЗУ составит 3200 байтов.
Если у Вас достаточно оперативной памяти (а так и должно быть) и Вы можете "пожертвовать" 8К, то имеет смысл увеличить быстродействие программы, одновременно держа в памяти не одну, а пять смежных зон. Так, для зоны В2 целесообразно иметь в памяти еще и зоны В1,А2,ВЗ и С2.
А2
LiL
Тогда при переходе в зону ВЗ подгружаются соседние зоны АЗ,В4 и СЗ. Зоны В2 и ВЗ подгружать не нужно, достаточно ввести программную переменную ADR_2, которая указывает на адрес в оперативной памяти, с которого начинается "география11 загруженных зон. Бе и нужно переустанавливать. Она имеет размер 10 байтов - по два адресных байта на каждую зону.
4. Проверка на доступность локации. Определяется, что там есть. Если там, например, глухая стена, то выдается сообщение "Прохода нет". Там могут быть горы и если в Вашем отряде нет ни одного обученного альпиниста, то проход также закрыт.
5. Проверка на конец дня. Если день закончился (переменная TIME) переполнилась, то играющему сообщается, что наступила ночь. Ночью он должен отдыхать. Если он продолжит движение ночью, можете ввести штраф, например уменьшая здоровье всех членов отряда на 1 балл (CONSTITUTION). Не исключено, что Вы сделаете так, что ка-кая-то цель в какой-то локации достигается только ночью.
Если случится так, что герои попадут в режим Combat Mode с неполноценным состоянием здоровья, то Вы накажете их еще чем-то, например уменьшением параметра Сила - Strength или, увеличив им степень поражения от врага HP.
Если отряд решит отдохнуть (поспать), следует обнулить счетчик времени дня, но увеличить счетчик суток - переменную DAYS.
6. Перерисовывается экран. Сначала рисуется дальний план. Если Вы шагнули в точку Х»2, Y»4 и смотрите на север (в направлении +Y), то в верхней части экрана рисуется ландшафт, соответствующий локации Хя2, Y=6. Затем -средний план. В нижней части экрана рисуется ландшафт из локации Х«2, Y*5. И, наконец, поверх всего рисунка рисуются энкантеры ближнего плана из локации Х=2, Y»4 (если они есть, что устанавливается по старшим 4... 7 битам текущей локации). Если один из них включен, то надо посмотреть в базе энкантеров, что там есть (о ней мы будем говорить позже). Разумеется, чтобы рисовать поверх готового рисунка, надо исключить проблему "клэшинга" атрибутов, а потому вся графика должна быть одноцветной (черным по белому).
Стоит рисовать только крупные энкантеры - заики, хижины, двери, монстров, сундуки. Мелкие (ключи, деньги, оружие, книги, свитки и т.п.) можно не рисовать и ограничиться текстовым сообщением типа "Вы нашли двуручный меч".
7. Проверка на наличие противников. Если в п.б установлено, что в Вашей локации есть враг, то автоматически происходит переход в боевой режим - Combat Mode, выход из которого, если Вы остались живы, приведет Вас к началу алгоритма - п.1.
Конечно, мы не можем здесь в нескольких строках перечислить все возможные коллизии, с которыми Вы можете столкнуться по ходу игры. Поэтому более подробную блок-схему алгоритма режима Adventuring Mode мы изобразили на следующей странице. Не воспринимайте ее как "истину в последней инстанции". Для Вас это просто "Техническое предложение", которое Вы можете развивать и изменять по собственному вкусу. А мы же пока прощаемся до следующего раза, когда продолжим разговор и рассмотрим базу энкантеров.
(Продолжение в следующем выпуске)