powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Игрушка. Встраивание предмета друг в друга
7 сообщений из 7, страница 1 из 1
Игрушка. Встраивание предмета друг в друга
    #37105608
Gordeev_Andry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго. Есть онлайн-игрушка. Ходят-бродят игроки по миру, собирают предметы (оружие, одежда и прочее). Отдельно из этого инвентаря выделяются "свитки магии", которые можно использовать (полечить, в транс уйти, будущее узнать и т.п.).

Инвентарь хранится в своей таблице (inventory), возможные действия в своей(magic).

Каждый предмет имеет свой ресур использования (inventory.duration), который по ходу игры уменьшается до нуля. (оружие ломается, одежда протирается, свитки распадаются)

Свитки имеют непустую ссылку на действие (inventory.magic_id) - что и указывает, что делает данный свиток.

Пока всё логично и красиво. Но тут появляется требование "нужно магию встраивать в другие предметы" ... по типу "камень удачи в ручке меча".
Для этого заполняем поле inventory.magic_id у меча - его теперь можно использовать и как свиток. И теперь мечом можно и драться и в транс впадать(действие свитка).

Встроеный свиток имеет свой ресур использования, меч - свой и ряд других параметров точно также. А поле то inventory.duration (и другие) у нас одно!

Сейчас для этого в табл. инвентаря имеется ряд полей "для встроеных свитков".

И каждый раз приходится смотреть, если это свиток, то делай так(изменяй inventory.duration) , если встроеный свиток, то делай иначе(inventory.include_duration)

Это просто капут. Хочу это исправить, но никак не могу придумать. Как организовать БД ... даже вопрос не могу толком написать ... может натокнете на что-нить (хоть вопросами, а не ответами).

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

Спасибо тем, кто дочитал :)
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37105828
Нафаааня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gordeev_Andry,
В Вашей игрушке можно грабить корованы?
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37106888
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gordeev_Andry,

На сколько я понял проблема в том, что время жизни сложносоставного объекта разное. Разные части объекта живут разное кол-во времени.

Мысль следующая:
Хранить в таблице inventory ссылку на объект.
А уже в сам объект может состоять из нескольких объектов (каждый со своим временем жизни). Т.е. своего рода дерево.
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37108238
Фотография bootty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго. Попробуем вопросами :)

Если поле одно, а у исходных вещей (предмета и свитка) значений два, то какое из значений пишется сейчас в это поле?

И чего вообще требуется по ТЗ? Свиток можно вынуть из предмета назад и использовать его оставшийся ресурс? Можно ли в один предмет поместить несколько свитков? Если ресурс предмета закончился, свиток "сгорает"? Если ресурс свитка закончился, что происходит с предметом, в котором был свиток?

Кстати, как такой вариант: используемый свиток из инвентаря не исчезает, а помечается каким-то признаком, что его нельзя использовать отдельно, как свиток, но при этом все атрибуты сохранятся. Надо извлечь его из предмета — да пожалуйста... Поэтому я за связывание :)
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37110079
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы имеем дело с композицией или агрегацией предметов?
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37110306
ultra_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы точно делал ссылку на объект.
А вдруг потом понадобится возможность встраивать несколько свитков? Или можно будет встраивать еще что-нибудь (типа камни, которые увеличивают атаку или защиту)? Тогда я бы использовал отдельную табличку связей (один ко многим). Это обеспечивает максимальную гибкость и в то же время легко реализовать "исчезновение" предмета из инвентаря при его встраивании - просто добавляем в запрос выборки предметов инвентаря дополнительное условие, что предмет не находится в таблице связок. И все!
...
Рейтинг: 0 / 0
Игрушка. Встраивание предмета друг в друга
    #37111318
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gordeev_AndryОдно скажу, связывать свиток и меч между собой inventory.includeinventory_id не получается, ибо свиток должен исчезнуть как единица из предметов игрока.
Тем не менее, именно так и следует сделать. Просто показывать в "предметах игрока" только корневые предметы (не включённые в другие).

Имхо стоит сразу же заложить возможность строить дерево из предметов. Почему именно дерево: потому что во-первых, предметы могут обладать правилами совместимости/несовместимости, во-вторых, возможны артефакты, модифицирующие только своего непосредственного родителя, а не составной предмет в целом. Характеристики составного предмета можно вычислять заранее (во время сборки/разборки) или динамически. Последнее удобнее для учёта изменений в бою, например, если к мечу применят заклинание "сжечь все включённые свитки" или если у свитка во время боя истечёт срок действия.

В любом случае, должна быть возможность по id меча получить выборку вроде

возможное действиетип активного предметаID активного предметаудармеч1медитативный транссвиток2
Ну и соответственно по действию активизировать нужный объект и модифицировать его ресурс.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Игрушка. Встраивание предмета друг в друга
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]