Вопросы насущные

Вопросы насущные

Давайте порассуждаем, кто-как описывает структуру локаций, объектов, персонажей, предметов?

Пробовал найти для себя наиболее удобный и функциональный вариант структурирования кода локаций, но решения рознятся.
Вариант: описание структуры локации через массивы, в которых будет содержаться список объектов/предметов принадлежащих локациям, в имени массива содержится имя локации.
Плюсы:
- удобно добавлять объекты/предметы в массив;
- удобно статически обращаться к переменной зная имя текущей локации.
Минусы:
- имя локации содержится в названии переменной, из-за чего неудобно программно формировать переменную для определения имени переменной локации через $curloc (Пример: $Локация_<<$curloc>>_Объекты[i]);
- нет учета количества объекта/предмета на локации.

Пример:
$Локация_Кухня_Объекты[]  = 'Стол'
$Локация_Кухня_Объекты[]  = 'Стул'
$Локация_Кухня_Предметы[] = 'Яблоко'

У кого есть какие предложения? Кто-как ведет описание структуры кода локаций? Давайте порассуждаем, интересно сформировать для себя хорошую практику)

Изменено: Yury8087
27.Янв.21 09:47:41
Yury8087
useravatar
Offline
12 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Вопросы насущные

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

Код:


!loc_array
$loc_name['Appartment, Kitchen'] = "Кухня"
$loc_desc['Appartment, Kitchen'] = "Это моя убогая, неубранная кухня, в которой творится чёрти знает что. Не советую тут жрать, ок?"
$loc_image['Appartment, Kitchen'] = "assets/appartments/kitchen_1.jpg"
$loc_acts['Appartment, Kitchen'] = {
  *P '<td>Уйти в свою комнату</td>'
  *P '<td>Выпрыгнуть в окно</td>'
}

Код:


!location.render
if $args[0] <> "": $level = $args[0]
if $args[1] <> "": $sub_level = $args[1]

*P '<table>'
  *P '<tr>'
    *P '<th>'+ $loc_name["<<$level>>, <<$sub_level>>"] +'</th>'
  *P '</tr>'

  *P '<tr>'
    *P '<td><img src="'+ $loc_image["<<$level>>, <<$sub_level>>"] +'"></td>'
    *P '<td>'+ $loc_desc["<<$level>>, <<$sub_level>>"] +'</td>'
  *P '</tr>'

  *P '<tr>'
    *P '<td><hr></td>'
  *P '</tr>'

  *P '<tr>'
    dynamic $loc_acts["<<$level>>, <<$sub_level>>"]
  *P '</tr>'
*P '</table>'

Oliver
Magni nominis umbra
useravatar
Offline
589 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Вопросы насущные

Интересный подход. А список объектов/предметов находящихся на локации не ведётся или прописывается в самой локации?

Yury8087
useravatar
Offline
12 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Вопросы насущные

Yury8087,
я заводил что-то типа таблицы данных, где хранил все объекты. Столбцами выступали массивы, строками — соответсвующие индексы массивов. На локацию заводил объект определённого типа:

Код:

$id_array[0]='место_дом' & $position_array[0]='' & $object_array[0]="здесь были свойства локации, освещение например" & ! и ещё несколько массивов

Чтобы добавить предмет на локацию, создаём новую строку в таблице данных и в $position_array[] вносим айди локации:

Код:

$id_array[1]='СтрМеч' & $position_array[1]='место_дом' & $object_array[1]="здесь свойства объекта: имя, вес, урон и т.д." & ! и ещё несколько массивов

Воспроизвести предмет таким образом можно просто перебирая циклом все объекты, у которых $position_array[] содержит айди локации.
На самой же локации описание и прочее я делал примерно как Оливер.

Частичное описание такого движка: http://aleksversus.narod.ru/index/magicon_fb/0-65
Недоработанный, но рабочий движок: http://aleksversus.narod.ru/arch/qsp/pr … con.fb.rar (запускать файл fb_v0.2)
Видео, где подобную систему работы с объектами пишем с нуля https://www.youtube.com/watch?v=O5mnzI7mPV4

UPD: В "Веренице миров..." я использовал такую же, но ещё более урезанную систему. Однако там приходилось вставлять предметы непосредственно в текст. Т.е. при наличии предмета на локации нужно было выводить один текст, при отсутствии - другой. Это я сделал при помощи аналога BB-кода. Типа

Код:

[obj]айди_объекта|Текст выводимый при наличии объекта|текст выводимый при отсутствии[/obj]

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

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

Aleks Versus
воздвигатель башни
useravatar
Offline
1618 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
1006
Всего опросов:
14
Всего сообщений:
16790889
Всего сообщений сегодня:
1
Пользователи форума:
 
Всего пользователей:
2585
Последним зарегистрировался:
McFly