View Revisions: Issue #2477

Summary 0002477: Mécanisme d'achievement
Revision 2018-10-21 19:19 by Xenos
Description Il faudrait intégrer un mécanisme d'achievement.

Trois approches possibles:
1) Si l'endroit où l'achievement peut être gagné est unique, alors on fait un "CALL achievement('NOMACHIEVEMENT', idPlayer, <<condition>>)" et cet endroit d'appel doit être unique car <<condition>> ne doit pas être répété dans le code
2) Si un achievement peut être débloqué à plusieurs endroits, alors on appelle un "CALL check_achievement(idPlayer)" et cette procédure contient TOUTES les conditions de TOUS les achievements (c'est plus centralisé, mais peut-être vachement moins performant)
3) On mixe les deux: on a une seule procédure d'achievement, mais on lui passe le nom de l'achievement à checker en plus de l'ID du joueur; on peut envisager de lui passer une catégorie d'achievement ou un "tag" ou une liste d'achievements à checker

Perso, je penche pour la 2e solution, ou la 3e si la 2e est vraiment trop lente

Il faudra aussi que l'achievement apparaisse à l'écran du joueur. Pour cela, je pense que le mieux est d'ajouter un resultset au niveau du template "webgame", ou éventuellement au niveau du template JSON (si le cas est nécessaire).
Dans l'idée, le check de "ai-je déverrouillé l'achievement" se fait dans le endpoint (dans la procédure SQL du endpoint, via CALL check_achievement(...)") et la procédure au niveau du template va récupérer la liste des nouveaux achievements.
Une autre alternative encore serait de laisser la page HTML faire un appel AJAX dédié aux nouveaux achievements. L'appel renvoie alors les achievements pas encore vus (si un paramètre GET est passé, si il n'est pas passé alors ce endpoint peut renvoyer la liste de tous les achievements) et le code dans la page HTML (qui est définit au niveau du template JS) peut l'afficher.
C'est probablement bien plus simple à la maintenance et à l'exécution.

A voir même si cet appel AJAX peut checker les nouveaux achievements (AKA je n'ai plus de CALL achievement(...) dans les procédures des endpoint, mais je l'ai dans ce endpoint AJAX uniquement). => C'est la meilleure solution IMO

L'endpoint sera donc POST (car il modifie le serveur), et il va calculer les achievements du joueur, et renvoyer la liste des nouveaux achievements.
Revision 2018-10-21 19:18 by Xenos
Description Il faudrait intégrer un mécanisme d'achievement.

<s>Trois approches possibles:
1) Si l'endroit où l'achievement peut être gagné est unique, alors on fait un "CALL achievement('NOMACHIEVEMENT', idPlayer, <<condition>>)" et cet endroit d'appel doit être unique car <<condition>> ne doit pas être répété dans le code
2) Si un achievement peut être débloqué à plusieurs endroits, alors on appelle un "CALL check_achievement(idPlayer)" et cette procédure contient TOUTES les conditions de TOUS les achievements (c'est plus centralisé, mais peut-être vachement moins performant)
3) On mixe les deux: on a une seule procédure d'achievement, mais on lui passe le nom de l'achievement à checker en plus de l'ID du joueur; on peut envisager de lui passer une catégorie d'achievement ou un "tag" ou une liste d'achievements à checker

Perso, je penche pour la 2e solution, ou la 3e si la 2e est vraiment trop lente
</s>
Il faudra aussi que l'achievement apparaisse à l'écran du joueur. Pour cela, je pense que le mieux est d'ajouter un resultset au niveau du template "webgame", ou éventuellement au niveau du template JSON (si le cas est nécessaire).
Dans l'idée, le check de "ai-je déverrouillé l'achievement" se fait dans le endpoint (dans la procédure SQL du endpoint, via CALL check_achievement(...)") et la procédure au niveau du template va récupérer la liste des nouveaux achievements.
Une autre alternative encore serait de laisser la page HTML faire un appel AJAX dédié aux nouveaux achievements. L'appel renvoie alors les achievements pas encore vus (si un paramètre GET est passé, si il n'est pas passé alors ce endpoint peut renvoyer la liste de tous les achievements) et le code dans la page HTML (qui est définit au niveau du template JS) peut l'afficher.
C'est probablement bien plus simple à la maintenance et à l'exécution.

A voir même si cet appel AJAX peut checker les nouveaux achievements (AKA je n'ai plus de CALL achievement(...) dans les procédures des endpoint, mais je l'ai dans ce endpoint AJAX uniquement). => C'est la meilleure solution IMO

L'endpoint sera donc POST (car il modifie le serveur), et il va calculer les achievements du joueur, et renvoyer la liste des nouveaux achievements.