Comment puis-je mettre en œuvre la compétence hors ligne

13

EvE Online est un exemple de compétence hors ligne. Votre personnage (pilote) ne gagne pas de compétences en acquérant de l'expérience. Au lieu de cela, votre personnage gagne des points de compétence vers une compétence que vous entraînez, que vous soyez en jeu ou hors jeu. De plus, je suis assez certain que les compétences continuent de se développer même lorsque les serveurs de jeu sont en panne.

N'importe qui a des idées générales sur la façon dont il procède, ou mieux encore sur la façon dont je pourrais implémenter quelque chose comme ça dans un jeu que je développe. Je ne cherche pas une explication détaillée ici (ne me laissez pas vous retenir cependant), mais je cherche un panneau qui me pointe dans la bonne direction.

Merci!

Dream Lane
la source

Réponses:

17

En supposant que le développement des compétences est déterministe et assez linéaire, tout ce que vous avez à faire est de vous connecter à une sorte d'horloge en temps réel (comme l'horloge système ou l'horloge du serveur) et de calculer la durée de développement de la compétence.

En d'autres termes, lorsque le développement de la compétence commence, prenez l'horodatage et stockez-le, et chaque fois que vous voulez vérifier si la compétence s'est améliorée, comparez l'horodatage avec l'actuel, vérifiez si le delta est assez grand, et bing, le joueur a une nouvelle compétence.

Jari Komppa
la source
2
Tout à coup, il est logique pourquoi ils vous forcent à suspendre l'entraînement si vous modifiez vos attributs qui affectent la vitesse de l'entraînement! Parce qu'ils recalculent le delta nécessaire ... Génial, merci!
Dream Lane
5
@Dream Lane, pour alléger tout frais de calcul potentiel que cela aura. Ne recalculez les compétences / points gagnés que lorsque l'utilisateur se connecte. Donc, avoir des milliers de personnes déconnectées n'encourra aucun frais généraux.
AttackingHobo
2

Si la compétence n'est pas utilisée jusqu'à ce que le joueur soit de nouveau en ligne, vous pouvez simplement enregistrer le temps de déconnexion et le temps restant sur toutes les compétences dans la file d'attente, puis lorsque le joueur se connecte, faites quelque chose comme ceci:

timeRemaining = currentTime - logoutTime
while ( timeRemaining > 0 and hasQueuedSkill() ) {
     skillTime -= timeRemaining
     if ( skillTime <= 0 ) {
           popSkill()
           timeRemaining = -skillTime
     }
}
Elva
la source