RPG квесты - запрос данных игрока
Приведены следующие структуры таблиц, в каждой из которых содержится раздел о квестах в RPG. Я пытаюсь найти лучший способ запросить текущие данные на игрока.
Некоторая информация о структуре квестов. Она находится в 3-х уровневом порядке со многими квестами на уровень. В квесте есть много заданий для каждого NPC, которые нужно выполнить, но в хронологическом порядке. Также показано на диаграмме:
Моя текущая схема дизайна выглядит следующим образом с использованием MySQL:
CREATE TABLE NPCs (
ID int AUTO_INCREMENT,
Name varchar(50),
RoomID int,
X int(2),
Y int(2),
TypeID int,
ImageID int,
PRIMARY KEY(ID),
FOREIGN KEY (ImageID) REFERENCES Images(ID)
ON UPDATE CASCADE,
FOREIGN KEY (TypeID) REFERENCES NPCTypes(ID)
ON UPDATE CASCADE,
FOREIGN KEY (RoomID) REFERENCES Rooms(ID)
ON UPDATE CASCADE
);
CREATE TABLE Quests (
ID int AUTO_INCREMENT,
QuestNumber int,
Name varchar(50),
NPCID int,
RewardXP int(3)
RewardMoney int(3),
LevelID int,
Text varchar(100),
CompletedText varchar(100),
PRIMARY KEY(ID),
FOREIGN KEY (LevelID) REFERENCES Levels(ID)
ON UPDATE CASCADE,
FOREIGN KEY (NPCID) REFERENCES NPCs(ID)
ON UPDATE CASCADE
);
CREATE TABLE QuestStages (
ID int AUTO_INCREMENT,
UserID int,
QuestID int,
Accepted bool,
Complete bool,
PRIMARY KEY(ID),
FOREIGN KEY (UserID) REFERENCES Users(ID)
ON UPDATE CASCADE,
FOREIGN KEY (QuestID) REFERENCES Quests(ID)
ON UPDATE CASCADE
);
CREATE TABLE LinkedQuests (
ID int AUTO_INCREMENT,
QuestID int,
PreQuestID int,
PRIMARY KEY(ID),
FOREIGN KEY (QuestID) REFERENCES Quests(ID)
ON UPDATE CASCADE,
FOREIGN KEY (PreQuestID) REFERENCES Quests(ID)
ON UPDATE CASCADE
);
Каждый квест начинается с начальной задачи, и вы выполняете эти задачи в хронологическом порядке, но вам нужен простой способ запроса данных.
Поскольку игрок может запускать, приостанавливать и возобновлять выполнение задач для любого NPC в определенный момент времени, я пытаюсь найти лучший способ запроса данных в различных форматах:
Список незавершенных квестов Квесты с использованием идентификатора пользователя (Квесты.ID, Квесты.Принято, Квесты.Имя, Квесты.Текст, Квесты.RoomID, Квесты.RewardMoney, Квесты.RewardXP)
Подробная информация о выбранном квесте с использованием идентификатора (Qtests.ID, Qhest.Name, Quest.Text/Quest.CompletedText // основана на том, завершен или нет // Ques.RewardMoney, Qhest.RewardXP)
Подробная информация о квестах в комнате и NPC с привязкой к ним с использованием RoomID (квесты.ID, квесты.принято, NPCs.ID в качестве NPCID, NPCs.X, NPCs.Y)
РЕДАКТИРОВАТЬ Вот пример
Quests
ID | QuestNumber | Name | NPCID | RewardXP | RewardMoney | LevelID | Text | CompletedText
1 | 1 | "Quest1" | 1 | 10 | 10 | 1 | "do this" | "Well Done"
2 | 2 | "Quest2" | 1 | 10 | 10 | 1 | "do this" | "Well Done"
3 | 3 | "Quest3" | 2 | 10 | 10 | 1 | "do this" | "Well Done"
4 | 4 | "Quest4" | 2 | 10 | 10 | 1 | "do this" | "Well Done"
5 | 5 | "Quest5" | 2 | 10 | 10 | 1 | "do this" | "Well Done"
6 | 6 | "Quest6" | 3 | 10 | 10 | 1 | "do this" | "Well Done"
NPCs
ID | RoomID
1 | 1
2 | 1
3 | 2
QuestStages
ID| UserID | QuestID | Accepted | Complete
1 | 1 | 2 | TRUE | FALSE
2 | 1 | 3 | TRUE | TRUE
3 | 1 | 4 | FALSE | FALSE
4 | 1 | 5 | TRUE | TRUE
5 | 1 | 6 | TRUE | FALSE
LinkedQuests
QuestID | PreQuestID
2 | 1
5 | 4
4 | 3
Отображение списка квестов для User.ID 1 1
Quests.ID| Quests.Accepted| Quests.Name| Quests.Text| Quests.RoomID| Quests.RewardMoney | Quests.RewardXP
3 | TRUE | "Quest3" | "do this" | 1 | ...
// will not show Quest 2 as is completed
// will not show Quest 4 as it is dependent on quest 3 being completed
1 ответ
ДЕМО Здесь вы можете увидеть середину шага для достижения окончательного запроса.
-- Final Output, Join to get quest details
SELECT QS.`QuestID`, QS.`Accepted`, Q.`Name`, Q.`Text`, Q.`RewardMoney`
FROM QuestStages QS
LEFT JOIN LinkedQuests LQ
ON QS.`QuestID` = LQ.`QuestID`
LEFT JOIN QuestStages Pre
ON QS.`UserID` = Pre.`UserID`
AND LQ.`PreQuestID` = Pre.`QuestID`
JOIN Quests Q
ON QS.`QuestID` = Q.`QuestNumber`
WHERE QS.`UserID` = 1
AND QS.`Complete` = 'FALSE'
AND (Pre.`Complete` = 'TRUE' OR Pre.`Complete` IS NULL)
-- Prerequirement is complete or doesnt have Prerequirement
ORDER BY QS.`QuestID`
;
ВЫХОД, я сделал три шага для отладки.