| Доступность квестов у НПС | 
|  | 
| 
| 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 |  |  |  |  |