Доступность квестов у НПС
|
|
Quieteroks | Дата: Суббота, 27 Июня 2015, 16:29 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Здравствуйте.
Пишу браузерную игру в стиле РПГ.
Разрабатываю систему Квестов и запнулся на вопросе доступности квеста у конкретного НПС. Смысл в чем, имеется таблица Квестов и таблица квестов каждого персонажа:
Код quest id | npc | next | ...
Код character_quest id | quest | status | ...
По завершению квеста, если он сюжетный / одноразовый его из базы удалять не планируется и всегда можно узнать, выполнен квест или нет в запросом типа: Код SELECT q.`id` AS `id`, q.`next` AS `next`, h.`status` AS `status`, IF(h.`entry`, 1, 0) AS `has` FROM `quest` AS q LEFT JOIN `character_quest` AS h ON q.`id` = h.`id` WHERE q.`npcid` = 1 Обрабатывая результат запроса, получаем все завершенные квесты и доступные. Но квесты только текущего НПС и без указания какое задание ему предшествовало. Подглядел у WoW, что в таблицу пишут еще предшествующий квест, т.е. мы всегда сможем узнать, первый ли он в цепочке квестов.
Основная же проблема, которую я не могу решить, как с наименьшей кровью найти соседние квесты (предыдущий и следующий) особенно если они от разных НПС, что бы решить, доступность текущий квестов. Получается, что можно множество дополнительных запросов делать на проверку квестов и соответствие каждому НПС.
Подскажите как выйти из подобной ситуации.
Если вам все равно где вы находитесь, значит вы еще не заблудились.
|
|
| |
harmoxyne | Дата: Суббота, 27 Июня 2015, 16:41 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Код quest id | npc | previous | next | ... Наименьшей кровью
|
|
| |
Quieteroks | Дата: Суббота, 27 Июня 2015, 16:53 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| harmoxyne, оч смешно, и решает решенную задачу. Что делать с получением квестов когда другой НПС начинает цепочку?
Если вам все равно где вы находитесь, значит вы еще не заблудились.
|
|
| |
harmoxyne | Дата: Суббота, 27 Июня 2015, 17:10 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Цитата Quieteroks ( ) Что делать с получением квестов когда другой НПС начинает цепочку? А у тебя id квестов собираются повторяться, или ты будешь хранить их в предыдущий/следующий по названию? Что то, что то крайне плохо. Если у каждого квеста уникальный id - проблем нет, пишешь в поле для предыдущего id квеста, и потом уже из базы таскаешь нужные данные по id.
|
|
| |
Quieteroks | Дата: Суббота, 27 Июня 2015, 17:14 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| harmoxyne, а внимательно прочитать мой вопрос? Или я плохо объяснил, так и скажите.
Я хочу все это реализовать с минимальной кровью для нагрузки. Да, можно как в серверной версии mangos (к примеру) загрузить в память все квесты и потом спокойно в них ориентироваться. НО! Я сразу указал что игра браузерная и сервер не хранит в памяти ничего, а сессия длится ровно один запрос. В результате я ищу изящный выход (кэширование не предлагать, оно будет после поиска), как найти и проанализировать доступные квесты.
Если вам все равно где вы находитесь, значит вы еще не заблудились.
|
|
| |
Эргалон | Дата: Суббота, 27 Июня 2015, 17:27 | Сообщение # 6 |
Вездесущий
Сейчас нет на сайте
| Quieteroks, Создай файл с json массивом, занеси туда нужную информацию и выгружай по необходимости.
Кубариум Rise of the dark lords
|
|
| |
Quieteroks | Дата: Вторник, 30 Июня 2015, 14:07 | Сообщение # 7 |
частый гость
Сейчас нет на сайте
| Эргалон, Кэширование... Или вместо базы данных писать квесты в файл? А что делать с определением? Как корректно обработать и какую дополнительную информацию для анализа?
Обдумываю идею с ленивой проверкой. Код 1. Получаем список квестов 2. Во время обхода проверяем: a. Имеется ли у игрока квест (has): - если квест выполнен (status > 0) запоминаем следующий за ним квест. - ??? b. Имеет ли квест требование к завершению предыдущего квеста (prev): - запоминаем в список для проверки квеста на принадлежность к данному НПС - ??? 3. Проверяем среди уже загруженных квестов наличие предыдущих и следующих квестов. 4. Запрашиваем дополнительные данные одним запросом и проверяем npc и status квеста. 5. Сохранить в кэш на N времени.
Идея пока такая, но нужно правильно сформулировать остальные условия и списки для дальнейшего анализа. Поможете развить идею?Добавлено (30 июня 2015, 14:07) --------------------------------------------- Жаль никто не делится опытом квестостроения.
В общем пришел к такому выводу (вдруг кому поможет когда-нибудь):
1. Выбираем только те квесты, что еще не завершены. Для этого в запрос можно добавить выражение выборки уникальных значений или еще какой вариант оценки завершения квеста. Допустим квест пройден, если status > 0. Код SELECT q.`id` AS `id`, q.`previous` AS `prev` FROM `quest` AS q LEFT JOIN `character_quest` AS h ON q.`id` = h.`id` AND h.`character_id` = 1 WHERE q.`npcid` = 1 AND h.`status` > 0 В итоге получаем список доступных но не отфильтрованных квестов.
2. Поскольку избавиться от второго запроса не получится, если только не расширять первый до 3-5 объединений, что плохо. То мы в процессе обработки первого запроса делим на две группы, которые уже можно показывать и те, что нужно проверить (prev > 0). Собирать можно только prev в список и одним запросом вытянуть все "СЛЕДУЮЩИЕ" квесты за ними. Код SELECT q.`next` AS `id` FROM `quest` AS q LEFT JOIN `character_quest` AS h ON q.`id` = h.`id` AND h.`character_id` = 1 WHERE q.`id` IN (1,3) AND h.`entry` IS NOT NULL AND h.`status` > 0 Результат добавляем в список отображаемых.
Если вам все равно где вы находитесь, значит вы еще не заблудились.
Сообщение отредактировал Quieteroks - Суббота, 27 Июня 2015, 22:44 |
|
| |