Каждое достижение — это отдельная логика обработки событий. В него приходит цепочка событий, а на выходе результат — текущее состояние (например, % завершения).
Поэтому:
1. Делаем архитектуру подписки на события. В зависимости от платформы, может понадобится отдельный диспетчер событий.
2. Инкапсулируем логику достижения как то, что зависит от цепочки пришедших в него событий.
3. Вызываем проверку по триггерам (например, у нас есть 90 достижений, обновляем статус по ним в конце каждой миссии, при условии, что в достижение пришло какое-либо событие).
4. Храним состояние в базе каким угодно образом.