Заполнение подземелий предметами и NPC

Материал из Клуб любителей рогаликов
Перейти к: навигация, поиск

Данная статья была написана для RLNews Darren'а Hebden'а

Прежде всего, я должен сказать, что не вдавался в эти подробности (если вообще вдавался) как в других roguelike-играх решается эта задача. Итак, мои методы может не так быстры или хороши как те, которые внедрялись и тестировались в кодах таких игр как nethack + angband на протяжение прошлых N лет они использовали это ;)

Довольно часто одной из первых задач в roguelike-играх становится создание лабиринтов... Как только вы создали работоспособную программу создания лабиринта, вы должны заполнить его, всевозможными предметами, ловушками, монстрами, лестницами, и т.п.

Комплектование вашего подземелья может быть настолько трудным или же настолько легким как вы пожелаете, но много из этого зависит от того, как Вы сгенерировали ваш лабиринт.

Здесь я расскажу, как сделал это.

Сначала я расскажу как НЕ НАДО это делать, я видел такой пример лишь однажды (в совершенно обычной игре "в стадии разработки")... Подземелье было вырублено из статической 128x128 сетки и для размещения объектов, для каждого объекта устанавливаемого на карту выбиралась случайная позиция x=rnd(128), y=rnd(128), эти x,y потом проверялись по сетке, чтобы убедиться, находится ли здесь тайл пола, если да - объект устанавливался, а если нет, то повторно вызывались случайные числа для x,y и проверялись по сетке.

Не стоит и говорить, что с большим количеством объектов и небольшим подземельем, это могло бы заставить компьютер тестировать позиции сутками пока он не получил бы совпадение...

Это - как НЕ НАДО делать, основывается на человеке, бедном алгоритмами. (Но как кто-то отметил, легко делать вещи этим путем и это на самом деле работает, если ваш лабиринт заполняет большую часть вашего уровня).

Когда я создаю лабиринт, я храню в списке все созданные комнаты. Коридоры, с моей точки зрения, просто "худые" комнаты, так что все они попадают в список.

Этот список достаточно прост, это связанный список, он содержит x1,y1-x2,y2, флаг каждого объекта и ничего больше. Флаг устанавливается только когда комната шире или длиннее чем 1 (т.е. флаг установлен когда не "коридор"), если вам нужно ссылаться на список, часто проще тестировать флаг, чем проверять x2-x1+y2-y1 для каждого объекта...

Когда я хочу добавить, скажем, лестницу вверх, я просто произвольно выбираю объект из моего списка, затем в уже имеющуейся "комнате" произвольно указываю x,y в пределах этой комнаты y=rnd(y2)+y1, x=rnd(x2)+x1 и размещаю объект. Повторить при необходимости.

При желании вы можете выполнять проверку на наличие перекрытий или просто складывать предметы в список.

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

Вы также могли бы заполнять два списка, один для "комнат" другой - для "коридоров".

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

Вы _должны_ сохранять позиции x,y статичных предметов, таких как ловушки (передвигающаяся яма с медведем?) и лестницы. Перемещение монстров (главным образом), так, если они оказываются не в той же точке, вы можете сказать что они побродили ;), и предметы, ну, они там поднимались, и перемещались, и падали ;). Но в действительности это слабо оправдывает урезание кода... ^_^

Переходя от 1 уровня к другому вы можете сбрасывать список объектов по тем же причинам как и приведённые выше для загрузки/сохранения.

Это - конечно, очень просто и не принимает во внимание кого-нибудь с волшебной палочкой копания (digging wand), добавляющего новый коридор к вашему подземелью (поскольку это создано самим пользователем, это не может создаваться при помощи генератора случайных чисел). Конечно будет легко добавлять вновь созданные элементы к списку, сохраненому с помощью генератора случайных чисел подземелья, и т.п.

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

Одна вещь, о которой, я думаю, должен упомянуть, это то, что мои "комнаты" и "коридоры" не соединяются. Двери установлены между ними как "связи", но при создании они не связываются "соприкасаясь" друг с другом, и таким образом дверные проёмы не показываются в моем списке объектов. (Хорошо это или плохо - не знаю, но я очень доволен своей программой создания подземелий, также это означает только то, что ничего не будет устанавливаться поверх дверного проёма.)



Автор: Stuart George.
Источник: Populating The Dungeon Of Items & NPC's, Copyright © 03.05.1999.
Перевел: Дмитрий О. Бужинский [Bu], 20.05.2005.