В игре необходимо реализовать систему достижений.
- Находился в онлайне N часов
- Заработал N денег
- Потратил N денег
- Достиг N уровня
...
Мои мысли:
1. Реализовать класс на каждую группу событий и вызывать его в определенной части. Например те достижения которые нужно проверять после каждого обновления страницы установить в какой нибудь AppController а остальные после определенного действия.
2. Встроить условия в таблицу что то вроде
проверить: Fetch | users | online | >= | 60
выполнить: users | id | points | +10000
Каждое событие исправляет значение определённого достижения в отдельной ячейке/колонке таблицы достижений.
История изменений достижений по конкретному пользователю - идёт параллельно и используется для сверки или обновления итогового рейтинга при смене формулы его подсчёта на основе достижений.
Я не понимаю как распознать это достижение. Что, где и как будет храниться? Или нужно пройтись по всей таблице достижений и перепроверить сверить все связи?
Alex, каждое достижение имеет привязанные к нему триггеры, которые "дёргаются" по событиям в игре каждый раз, когда требуется обновить рейтинг (любые "ключевые" действия игрока, влияющие на его рейтинг).
Триггеры - это условия начисления для конкретного достижения.
Например, если сыграно 10 игр без проигрыша, то +1 к достижению "везучий" и обнуляем счётчик, иначе - считаем количество игр без проигрыша (проигрыш - снова обнуляем).
Можно завести таблицу с достижениями и пользователями, которым достижение назначено.
И создать, например, триггеры, которые следят за апдейтами
Например, апдейт очков пользователя проверяет необходимость назначения ачивки по очкам. И так далее
Alex, триггеры, созданные в СУБД, автоматически выполняются по условию, указанному при создании триггера. Например, при обновлении таблицы с очками пользователей можно дернуть триггер, который сделает апдейт в таблицу ачивок