Создание реалистичной системы инвентаря игр с использованием 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  |

Обсуждения

  • Я что-то упускаю?
  • Как лучше всего разработать указанные характеристики?
  • Если мы найдем способ сделать это правильно, как мы сможем реализовать вес в системе?
  • Улучшения запросов оценены
  • Любые советы приветствуются

0 ответов

Другие вопросы по тегам