Четверг, 14 Ноября 2024, 11:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Доступность квестов у НПС
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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг