Создание реалистичной системы инвентаря игр с использованием SQL
после многих лет обучения на Stack Overflow на этот раз я не нашел ответа.
В настоящее время я студент и пытаюсь создать реалистичную систему игрового инвентаря для побочного проекта.
Мне нужны ваши знания, чтобы найти лучший способ сделать это.
Реалистичная система игрового инвентаря
Ограничения:
- Инвентарь основан на слотах (не пространственно распределен), 1 элемент = 1 слот, это проще для значков и кроссплатформенного взаимодействия с UX.
- PostgreSQL (v12) Я изучаю Supabase для этого проекта
Желаемый результат :
На мой взгляд, реалистичная игровая система инвентаря обладает этими характеристиками.
- Предметы снаряжения имеют доступные слоты, такие как жилетки (2), рюкзак (20) ...
- Для предметов, не относящихся к снаряжению, нет доступных слотов: расходные материалы, разное ...
- Доступные слоты равны сумме свободных слотов в моем снаряжении.
- Инвентарь равен сумме предметов, содержащихся в каждом снаряжении.
- Снаряжение - это предмет, который можно хранить в другом снаряжении.
- Хранение шестерни в другой шестерне должно занимать столько же слота, сколько и первое, вмещающее предметы.
- Вы можете поставить шестерню на землю (задав координаты x, y, z), она будет хранить предметы внутри.
- Если установлены x, y, z, то предмет отсутствует в инвентаре, потому что эти координаты отображают его во вселенной.
абстрактный
- ∅ = NULL
- игрок 1 случайным образом носит red_backpack (gear.id = 1) и green_vest (gear.id = 2)
- элемент 1 - это дым (misc.id = 1), хранящийся в red_backpack (gear.id = 1)
- предмет 2 - это red_backpack (gear.id = 1) с 5 ячейками, который носит игрок 1
- предмет 3 - это green_vest (gear.id = 2), в котором есть 2 слота, которые носит игрок 1
- пункт 4 - спички, лежащие на земле в координатах x =1.1, y =1.1, z =1.1
- предмет 5 - это бесполезный_сумка (gear.id = 3), у которого есть 1 слот, хранящийся в green_vest (gear.id = 2), который носит игрок 1
игрок
- рюкзак - это внешний ключ на gear.id
- body - это внешний ключ на gear.id
- рюкзак может быть NULL
- тело может быть NULL
пример запросов
-- This query is used to know worn gears ids for a player
SELECT (backpack, body) FROM player WHERE player.id = 1;
-- actually it return (1,2) in record format which is not usable with IN clause needed for further requests, if someone know how to solve this issue ;)
-- slots
SELECT SUM(slots)
FROM gear
WHERE id IN (1,2);
-- 7
-- inventory
SELECT * FROM item
FULL JOIN gear ON item.id = gear.item_id
FULL JOIN misc ON item.id = misc.item_id
WHERE item.gear_id IN (1,2);
-- | id | gear_id | x | y | z | item_id | slots | model | texture |
-- | ∅ | 2 | ∅ | ∅ | ∅ | ∅ | 1 | useless_bag | ∅ |
-- | 1 | 1 | ∅ | ∅ | ∅ | 1 | ∅ | ∅ | smokes |
Обсуждения
- Я что-то упускаю?
- Как лучше всего разработать указанные характеристики?
- Если мы найдем способ сделать это правильно, как мы сможем реализовать вес в системе?
- Улучшения запросов оценены
- Любые советы приветствуются