Как хранить цели (например, RPG Quest) в SQL - PullRequest
1 голос
/ 09 сентября 2010

Сегодня кто-то спросил меня, как они должны хранить цели квестов в базе данных SQL.В этом контексте подумайте о RPG.Цели могут включать некоторые из следующих действий:

  • Откройте для себя [Местоположение]
  • Убейте [Тип моба]
  • Получите n из [Объект]
  • Получить [Навык] в [Набор навыков]
  • Все остальные вещи, которые вы получаете в РПГ

Лучшее, что я мог придумать, это:

Quest 1-* QuestStep
QuestStep 1-* MobsToKill
QuestStep 1-* PlacesToFind
QuestStep 1-* ThingsToAcquire
QuestStep 1-* etc.

Это кажется немного неуклюжим - должны ли они вместо этого хранить запрос некоторого описания (или формулы, или ???)

Любые предложения приветствуются

Ответы [ 2 ]

9 голосов
/ 09 сентября 2010
  • Пользователь может выполнять множество квестов.
  • Один квест принадлежит только одному пользователю (в этой модели).
  • Один квест имеет много целей, одна цель принадлежит одному квестутолько.
  • Каждая цель является одной из возможных целей.
  • Возможная цель - это допустимая комбинация действия и объекта действия.
  • PossibleGoals списки таблицвсе разрешенные комбинации действий и объектов.
  • Цели упорядочены по StepNo в рамках квеста.
  • Quantity определяет, на сколько объектов должно действовать действие (убить 5 MOB).
  • Object - это супертип для всех возможных объектов.
  • Location, MOBType и Skill - это подтипы объектов, каждый из которых имеет свои свойства (столбцы).

alt text

4 голосов
/ 09 сентября 2010

Я бы создал что-то вроде этого.

Для таблицы квестов:

| ID | Title | FirstStep (Foreign key to GuestStep table) | etc.

Таблица QuestStep

| ID | Title | Goal (Foreign key to Goal table) | NextStep (ID of next QuestStep) | etc.

Конечно, именно здесь начинается тяжелая частьКак мы опишем цели?Я бы сказал, создать одну запись для цели в таблице Goal и сохранить каждое из полей цели (т.е. сколько мобов какого типа убить, какое место для посещения и т. Д.) В таблице GoalFields, таким образом:

Таблица целей:

| ID | Type (type is one from an Enum of goal types) |

Таблица GoalFields

| ID | Goal (Foreign key to goal) | Field | Value |

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

Таблица квестов

| 0 | "Opening quest" | 0 | ...
| 1 | "Time for a Sword" | 2 | ...

Таблица QuestStep

| 0 | "Go to the castle" | 0 | 1 | ...
| 1 | "Kill two fireflies" | 1 | NULL | ...
| 2 | "Get a sword" | 2 | NULL | ...

Таблица целей

| 0 | PlacesToFind |
| 1 | MobsToKill |
| 2 | ThingsToAcquire |

Таблица GoalFields

| 0 | 0 | Place | "Castle" |
| 1 | 1 | Type | "firefly" |
| 2 | 1 | Amount | 2 |
| 3 | 2 | Type | "sword" |
| 4 | 2 | Amount | 1 | 
...