Comment dois-je vérifier si un joueur a accompli un exploit?

13

Je fais un jeu MMO et je suis juste arrivé à un point où j'ai besoin de mettre en œuvre des réalisations ... Comment faire? La chose la plus simple à faire serait de l'exécuter toutes les 100 ms:

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

Mais cela soulève encore plus de complications. Par exemple, comment puis-je vérifier si la réalisation est effectivement terminée? Les joueurs ont-ils des propriétés personnalisées uniquement pour une réalisation spécifique? J'ai fait ce genre de chose avec les quêtes, car elles consistent principalement à "collecter 100 bois", donc les quêtes actives sur un joueur le vérifient. De plus, il doit y avoir un meilleur moment pour le vérifier, cela ralentirait périodiquement mon serveur, je pense.

jcora
la source
7
Pourquoi ne pas simplement exécuter des vérifications pertinentes pendant que les actions sont effectuées? C'est-à-dire si l'utilisateur collecte du bois, voir s'il correspond à la spécification "collect 100 wood".
Mike Cluck
1
Cela semble un peu trop compliqué ... Il y aurait des tonnes de chèques partout. Je pense que je vais m'en tenir à l'algorithme ci-dessus à cause de sa simplicité ...
jcora
10
Il existe des moyens de le rendre moins compliqué: avoir un gestionnaire d'événements "OnChange", puis y attacher des "objets" de réalisation et y gérer la logique. Comprenez également qu'avec votre configuration actuelle, vous avez un niveau de complexité O (n ^ 2), ce qui signifie que votre jeu devient beaucoup plus lent avec plus de personnages. Une sorte de problème pour un MMO
Mike Cluck

Réponses:

23

Ce que vous faites dépend de la nature de la réalisation. À moins que vos réalisations ne correspondent toutes à un modèle simple (collectez X nombre de Y), vous devrez les caser dans une certaine mesure.

À l'aide d'un système de communication basé sur les messages, vous pouvez fournir des crochets qui rendent le codage de cas particulier localisé. Vous pouvez demander à certaines actions d'envoyer des messages aux auditeurs qui s'enregistrent. Ensuite, votre code / script de réussite peut simplement s'enregistrer auprès des écouteurs appropriés et effectuer les tests nécessaires pour lancer la réussite.

Vous auriez des messages pour les événements typiques que vous pourriez souhaiter que les réalisations écoutent. Des choses comme «le joueur a acquis l'objet X» ou «l'entité Y a tué l'entité Z». De cette façon, vous pouvez suivre des choses comme le nombre de Z que le joueur a tués.

C'est probablement le mieux que vous puissiez faire pour un système de réalisations. Il centralise le code autant que possible et confie aux auditeurs la responsabilité de la détection de la réussite réelle.

Il convient également de noter que, pour les systèmes de réussite centralisés (X-Box Live, succès Steam), la progression vers les succès est généralement stockée sur le serveur. Ainsi, pour les réalisations d'accumulation ("effectuer la tâche XY nombre de fois"), le script de réussite détecte simplement quand X a été effectué et fait monter le décompte du serveur. Pour d'autres types de réalisations ("effectuer la tâche X"), la réalisation du serveur est binaire: soit vous l'avez fait, soit vous ne l'avez pas fait.

Nicol Bolas
la source
+1 Ce sont d'excellentes informations. Même utile sans que j'aie besoin de mettre en œuvre des réalisations pour le moment.
Joshua Hedges
Merci! J'ai hâte de l'implémenter, j'aurais aimé avoir cette idée avant ...
jcora
3

Selon la nature de vos réalisations, vous pouvez également introduire une sorte de "réalisations marqueurs".

Si vous avez par exemple 3 réalisations consécutives:
Bois 1 - Collectez 100 bois
Bois 2 - Collectez 500 bois
Bois 3 - Collectez 1k bois

Ensuite, il serait logique d'enregistrer simplement un événement OnChange pour la première réalisation jusqu'à ce que le joueur l'achève. Une fois terminé, vous pouvez enregistrer le prochain objet de réussite.

Cela nécessite bien sûr la conception (ou le calcul) d'un arbre de dépendance de réalisation.

Prince Charles
la source